pythonでコード行数 ステップ数を計測

# はじめに

なぜないんですか。pythonで、rails statsのようにコードの統計情報を表示したかっただけなんですが。車輪の再発明かもしれません。もし同じようなものがあればコメントから教えてください。使い方は下記だけなので、コピペしたら業務にお戻りください。

```bash
$ pip install pycodestats
$ pycodestats . --by-file

File                        Lines    LOC  Classes  Methods   M/C   LOC/M
-------------------------------------------------------------------------
src/main.py                  120     100       2        10     5      13
src/utils.py                  80      50       1         5     5      18
src/models.py                100      80       3        15     5       8
-------------------------------------------------------------------------
SUM:                         300     230       6        30     5      11
```


# pycodestatsとは

Pythonプロジェクトのコード統計を出力する方法として、Pythonコード、シェルスクリプト、バッチファイル、または `cloc` などのツールを使用するさまざまなアプローチをインターネット上で見つけることができます。しかしいずれの方法でも、コメントや空行、Docstringを除外したり、.pyファイルごとに詳細な統計を出力する要件を満たすものは見つかりませんでした。そこで、これらの要件を満たすpycodestatsが生まれました。


## インストール

`pycodestats` のインストールは以下のコマンドで行います。

```bash
$ pip install pycodestats
```

## コマンド実行

プロジェクトのルートディレクトリで、次のコマンドを実行することで集計できます。
オプションは、ファイル毎の出力を指定する`[--by-file]`オプション、出力形式を指定する`[--json | --xml]` などがあります。

```bash
$ pycodestats <ディレクトリ>
```

## 出力内容

各カラムの示す情報は下記の通りです。

- **ディレクトリ/ファイル**: ディレクトリまたはファイルの名前。この列は、`--by-file` オプションが使用されている場合は各個別ファイルをリストし、そうでない場合は各ディレクトリをリストします。
- **Lines**: ファイルまたはディレクトリ内の総行数。内容に関係なく、すべての行が含まれます。
- **LOC**: コメントやドキュメンテーションストリングを除いたコード行数 (LOC)。
- **Classes**: ファイルまたはディレクトリ内で定義されているクラスの数。
- **Methods**: ファイルまたはディレクトリ内で定義されているメソッドの数。
- **M/C**: クラスあたりのメソッドの平均数。メソッドの数をクラスの数で割って計算します。クラスがない場合、この値は0になります。
- **LOC/M**: メソッドあたりのコード行数の平均。コード行数をメソッドの数で割って計算します。メソッドがない場合、この値は0になります。

これにより、プロジェクト内の異なるディレクトリ（例えば、ソースコードディレクトリ `src`、テストコードディレクトリ `tests`、ドキュメントディレクトリ `docs`）ごとに統計情報を把握しやすくなります。

# 参考: 他の計測ツールとの比較

## `cloc`

`cloc` は多くのプログラミング言語に対応した人気のコードカウントツールです。以下はその出力例です。

```bash
$ cloc gcc-5.2.0/gcc/c
      16 text files.
      15 unique files.
       3 files ignored.

https://github.com/AlDanial/cloc v 1.65  T=0.23 s (57.1 files/s, 188914.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               10           4680           6621          30812
C/C++ Header                     3             99            286            496
-------------------------------------------------------------------------------
SUM:                            13           4779           6907          31308
-------------------------------------------------------------------------------
```

`cloc` はさまざまな言語に対応しており、PythonのDocstringもうまく対処しますが、ファイル毎のコード統計情報の表示が難しいです。

## `pygount`

`pygount` は `pip` でインストールできるもう一つの計測ツールです。以下はその出力例です。

```bash
$ pygount .
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃ Language         ┃ Files ┃     % ┃ Code ┃    % ┃ Comment ┃    % ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━┩
│ Python           │    18 │  47.4 │ 2132 │ 63.6 │     418 │ 12.5 │
│ TOML             │     2 │   5.3 │ 1204 │ 82.7 │       1 │  0.1 │
│ reStructuredText │     9 │  23.7 │  566 │ 64.8 │       1 │  0.1 │
│ Markdown         │     3 │   7.9 │   53 │ 49.1 │       0 │  0.0 │
│ Batchfile        │     1 │   2.6 │   24 │ 68.6 │       1 │  2.9 │
│ Text only        │     2 │   5.3 │   24 │ 82.8 │       0 │  0.0 │
│ Bash             │     2 │   5.3 │   12 │ 80.0 │       3 │ 20.0 │
│ Makefile         │     1 │   2.6 │    9 │ 45.0 │       7 │ 35.0 │
├──────────────────┼───────┼───────┼──────┼──────┼─────────┼──────┤
│ Sum              │    38 │ 100.0 │ 4024 │ 68.4 │     431 │  7.3 │
└──────────────────┴───────┴───────┴──────┴──────┴─────────┴──────┘
```

`pygount` はコード行数やコメント行数を表示します。cloc同様Docstringもうまく対処しますが、ファイル毎のコード統計情報の表示が難しいです。