以下に、make_run_report.py の解析結果に基づくSphinx(MyST)でビルド可能なMarkdownドキュメントを作成します。
# ``make_run_report.py`` ドキュメント
## 概要
``make_run_report.py`` は、指定された作業ディレクトリ (``--workdir``) で特定のコマンド (``--cmd``) を実行し、その実行結果を詳細なレポートとしてMarkdown形式で出力する簡易ツールです。このレポートには、コマンド実行前後のファイル差分、標準出力 (``stdout``)、標準エラー出力 (``stderr``)、プログラムの終了コード、実行中に生成または変更された画像ファイル、およびログファイル(``.log``, ``.out``, ``.txt``)や ``stderr`` 内で検出された警告 (``WARNING``) やエラー (``ERROR``) の情報が含まれます。
オプションで `pandoc` コマンドが利用可能な場合、MarkdownレポートをHTML形式に変換することもできます。
## インストール
本スクリプトはPythonの標準ライブラリのみを使用しており、追加のPythonライブラリのインストールは不要です。
HTMLレポートを生成する場合 (``--html 1`` オプション使用時) は、システムに `pandoc` コマンドがインストールされ、実行パスが通っている必要があります。`pandoc` のインストール方法については、公式ウェブサイトを参照してください。
URL: https://pandoc.org/installing.html
## 使い方
``make_run_report.py`` は、Pythonインタプリタを通じて実行します。
基本的な実行例:
作業ディレクトリをカレントディレクトリ (``.``) とし、``test_program.py`` を実行してレポートを生成します。
```bash
python make_run_report.py --workdir . --cmd "python test_program.py"
HTMLレポートも生成する例:
test_program.py が画像を保存する機能を持つと仮定し、--html 1 オプションでHTMLレポートも同時に生成します。
python make_run_report.py --workdir . --cmd "python test_program.py --save 1" --html 1
CLIオプション
make_run_report.py は以下のコマンドラインオプションをサポートしています。
オプション名 |
型 |
デフォルト値 |
説明 |
|---|---|---|---|
|
|
|
コマンドを実行する作業ディレクトリ |
|
|
(必須) |
|
|
|
|
生成されるMarkdownレポートのファイル名。 |
|
|
|
|
|
|
|
HTML出力のファイル名。 |
|
|
|
|
|
|
|
HTMLレポートに目次 (Table of Contents) を追加します。 ( |
|
|
|
|
|
|
|
|
|
|
|
コマンドのタイムアウト秒数。 |
|
|
|
ファイル監視から除外するファイルまたはディレクトリのパターンをカンマ区切りで指定します。 |
|
|
|
警告/エラーを走査するログファイルの拡張子をカンマ区切りで指定します。 |
|
|
``\b(error |
exception |
|
|
``\b(warning |
warn |
|
|
|
ログ走査時に無視する行に一致する正規表現パターン。例: |
|
|
|
|
|
|
|
ログファイルの読み込み最大バイト数。この値を超えるとファイルは途中で打ち切られます。 |
|
|
|
|
|
|
|
実行前ファイルツリーの最大表示ファイル数。この値を超えると省略されます。 |
|
|
|
作成・変更・削除されたファイルの表における最大表示ファイル数。この値を超えると省略されます。 |
|
|
|
生成・変更された画像ファイルの埋め込み表示最大数。この値を超えると省略されます。 |
|
|
|
警告/エラー検出結果の最大表示数。この値を超えると省略されます。 |
|
|
|
1ファイルあたりで検出する警告/エラー行の最大数。この値を超えると省略されます。 |
入出力仕様
入力
コマンドライン引数: 上記「CLIオプション」セクションで詳述された引数を入力として受け取ります。
作業ディレクトリ:
--workdirオプションで指定されたディレクトリが、コマンド実行のワーキングディレクトリとして使用されます。コマンド:
--cmdオプションで指定された文字列が、subprocess.run()を介して実行されます。既存ファイルシステム: コマンド実行前後のファイルシステムの状態をスナップショットとして取得するために、
--workdirおよびそのサブディレクトリ内のファイル情報が読み込まれます。--ignoreオプションに指定されたパターンに一致するファイルやディレクトリは読み込み対象から除外されます。ログファイル: コマンド実行後に、
--workdir内の新規または変更されたファイルの中から、--log-extsオプションで指定された拡張子を持つテキストファイルが、警告/エラーパターン (--error-regex,--warning-regex,--ignore-log-regex) に基づいてスキャンされます。ログファイルの読み込みは--max-read-bytesで指定されたバイト数に制限されます。
出力
Markdownレポートファイル:
--reportオプションで指定されたパス(--workdirからの相対パス)に、実行結果をまとめたMarkdown形式のレポートが出力されます。ファイル名の例はreport.mdです。HTMLレポートファイル (オプション):
--html 1オプションが指定され、pandocコマンドが利用可能な場合、--html-nameオプションで指定されたパス(--workdirからの相対パス)にHTML形式のレポートが出力されます。ファイル名の例はreport.htmlです。標準出力 / 標準エラー出力: スクリプト自体の実行状況や
pandocのエラーメッセージなどが、コンソールに標準出力または標準エラー出力として表示されます。実行したコマンドの
stdoutとstderrは、生成されるMarkdownレポート内にコードブロックとして埋め込まれます。これらの出力は--max-output-charsで指定された文字数に制限されます。
終了コード:
スクリプトは、実行された
--cmdの終了コードを自身の終了コードとして返します。--cmdがタイムアウトした場合は-999を返します。--cmdの実行中に予期せぬPython例外が発生した場合は-998を返します。--workdirの指定が不正な場合は1を返します。出力ファイルの作成パスが不正な場合は
1を返します。
主要なデータ構造
FileInfo
ファイルの情報を保持するデータクラスです。
属性名 |
型 |
説明 |
|---|---|---|
|
|
作業ディレクトリからの相対パス |
|
|
ファイルのサイズ (バイト) |
|
|
最終更新時刻 (ナノ秒単位のエポック時刻) |
|
|
最終更新時刻 (ISO 8601形式文字列) |
RunResult
実行されたコマンドの結果を保持するデータクラスです。
属性名 |
型 |
説明 |
|---|---|---|
|
|
実行されたコマンド文字列 |
|
|
コマンドの終了コード |
|
|
コマンドの標準出力 |
|
|
コマンドの標準エラー出力 |
|
|
コマンド開始時刻 (ISO 8601形式文字列) |
|
|
コマンド終了時刻 (ISO 8601形式文字列) |
|
|
コマンドがタイムアウトしたかどうか |
LogHit
ログファイルまたは stderr 内で検出された警告/エラーの情報を保持するデータクラスです。
属性名 |
型 |
説明 |
|---|---|---|
|
|
関連するファイルの相対パス ( |
|
|
検出された行番号 |
|
|
検出されたメッセージの種類 ( |
|
|
検出された行の内容 |
主要な関数
main()
スクリプトのエントリポイントです。 コマンドライン引数の解析、作業ディレクトリの検証、コマンド実行前後のファイルスナップショットの取得、コマンドの実行、ファイル差分の計算、ログファイルの走査、レポートの生成とファイルへの書き出し、およびオプションでのHTML変換を行います。
snapshot_files(workdir, ignore_patterns)
指定された workdir 内のファイルを走査し、各ファイルの FileInfo オブジェクトを含む辞書を返します。ignore_patterns に一致するファイルやディレクトリは除外されます。
diff_snapshots(before, after)
コマンド実行前 (before) と実行後 (after) のファイルスナップショットを比較し、新規に作成されたファイル、変更されたファイル、削除されたファイルを検出して、それぞれの FileInfo リストを返します。
run_command(command, workdir, shell, timeout_sec, encoding)
指定された command を workdir で実行します。shell オプション、timeout_sec、および encoding を考慮し、RunResult オブジェクトとして結果を返します。
scan_log_files(workdir, files, log_exts, encoding, error_regex, warning_regex, ignore_regex, max_read_bytes, max_hits_per_file)
指定された files リストの中から log_exts に一致する拡張子を持つファイルを読み込み、error_regex および warning_regex に一致する行を LogHit オブジェクトとして検出します。ignore_regex に一致する行は無視されます。
scan_text_for_hits(relpath, text, error_regex, warning_regex, ignore_regex, max_hits_per_file)
特定のテキストデータ (例: stdout や stderr) を走査し、指定された正規表現パターンに基づいて警告/エラーを検出します。
make_report(workdir, before, after, created, modified, deleted, run_result, log_hits, args)
収集されたすべての情報 (ファイルスナップショット、実行結果、ログ検出結果、CLI引数) を使用して、Markdown形式のレポート文字列を生成します。
run_pandoc(report_md, report_html, pandoc_cmd, toc, standalone, encoding)
生成されたMarkdownレポート (report_md) を入力として、pandoc コマンドを実行し、HTMLレポート (report_html) を出力します。pandoc の実行結果 (終了コード、stdout、stderr) を返します。
その他のヘルパー関数
parse_csv_list(): カンマ区切り文字列をリストに変換します。now_iso(): 現在時刻をISO 8601形式で返します。file_mtime_iso(): ファイルの最終更新時刻をISO 8601形式で返します。normalize_relpath():PathオブジェクトをPOSIX形式の相対パス文字列に変換します。is_ignored(): 指定された相対パスが無視パターンに一致するかどうかを判定します。human_size(): バイト数を人間が読める形式 (KB, MBなど) に変換します。md_escape(): Markdownの特殊文字をエスケープします。md_path_link(): Markdown形式の相対パスリンクを生成します。md_image(): Markdown形式の画像埋め込みタグを生成します。make_file_table(): ファイル情報リストからMarkdown形式の表を生成します。render_tree(): ファイルパスの辞書から簡易的なツリー構造をMarkdown形式で生成します。choose_fence(): テキスト内容に基づいてMarkdownのコードフェンス (`````) を選択します。fenced_block(): テキストを指定された言語のMarkdownコードブロックで囲みます。compile_optional_regex(): オプションの正規表現パターンをコンパイルします。positive_or_zero_float(): 引数パーサー用のカスタム型で、0以上のフロート数を返します。build_argparser(): コマンドライン引数パーサーオブジェクトを構築します。make_inside_workdir(): 指定されたパスがworkdir内にあることを確認し、絶対パスに解決されたPathオブジェクトを返します。
非標準ライブラリ
本スクリプトはPythonの標準ライブラリのみを使用しており、追加の非標準ライブラリのインストールは不要です。
ライセンス
コードからはライセンス情報は確認できません。
変更履歴
コードからは変更履歴情報は確認できません。