LoginSignup
20
11

GitHub Copilotによって遂にPythonコードのドキュメントの完全自動生成を成し遂げた話

Last updated at Posted at 2023-12-04

Summary

  • GitHub Copilot $\times$ Sphinx $\times$ GitHub Pages で遂にPythonプログラムのドキュメント完全自動生成を成し遂げた
  • GitHub Copilot で /doc コマンドを実行してdocstringを生成してあげるだけで本格的なHTMLドキュメントが勝手に生成される
  • これからはドキュメント作成に悩まされることはなくなった!

これまで何に困っていたか

プログラムのドキュメント作成といえば,プログラミングに何かとついてまわってくる作業です.

Figure1.png

他人が書いたコードを正確に読み取るというのはそこそこ研鑽が必要な技術なので,それを補うためにドキュメントが存在します.実際,今のプログラミングスタイルでは必要な機能を自分でゼロから実装することはほぼなく,複数のライブラリを複雑に組み合わせてやりたいことを実現するスタイルが主流です.

したがって,自分が実装したライブラリなどを使ってもらう場合でも最低限のドキュメント整備は必須と言ってよいと思われます.

下図はPython3.12.0のドキュメントの一部ですが,これくらい品質の良いドキュメントを整備するのはコードを書くことと同等かそれ以上に労力がかかるのではないかと思います.
ドキュメントを作成するのは非常に手間がかかるのです.
image.png

ドキュメント自動生成における偉大な先人たちの足跡

Quick Startなどどうしても人が書かなければいけないドキュメントもありますが,APIリファレンスやプログラムの構造的なドキュメントなどはこれまでも自動生成する仕組みがあれこれ考えられてきました.

Sphinx

Pythonのドキュメント自動生成で最も有名なのは,おそらくSphinxではないかと思います.
多少ややこしい設定はありますが,Pythonのdocstringから半自動的にHTMLのドキュメントを生成してくれるライブラリです.

ここまでは,かなり前からできるようになっていました.

image.png

しかし,筆者はプログラマというものは思った以上に面倒くさがりな人々のようで,
Pythonプログラムを書く → docstringを書く → SphinxコマンドでHTML化 → Webサーバにデプロイ
という短いサイクルすら回すことができませんでした...

GitHub Pages

そこで,最近はGitHub Pagesというものが出てきて,リポジトリごとにHTMLのドキュメントを自動でホストしてくれるようになりました.

image.png

これで,
SphinxコマンドでHTML化 → Webサーバにデプロイ
という後工程をほぼ完全に自動化することができるようになりました.

なので,現在のところプログラムドキュメントを作成作業は,
Pythonプログラムを書く → docstringを書く → GitHubにPushする
という3工程にまで圧縮されています.

最後のパーツ GitHub Copilot

Pythonプログラムを書く → docstringを書く → GitHubにPushする

さて,この3工程を見ていただければわかるように,GitHub Copilotが遂に最後の最も面倒な部分を埋めてくれました!

image.png

コードを書き終わったら,/doc とするだけで全てのモジュールに大体のdocstringをつけてくれます!

image.png

これによってプログラムドキュメントを作成する作業は
Pythonプログラムを書く (ついでに/docする) → GitHubにPushする
という,普通にコードを書くだけの作業に収束しました!

遂にドキュメント生成が完全自動化する時代がやってきた!

具体的にどうやったか

では実際にどうやってドキュメント作成を完全自動化したか,具体的な手順の説明です.

まずは今回のプログラムのディレクトリ構造

my_code
├── README.md
├── docs
├── src
├── requirements.txt
├── setup.py
└── tests

1. Sphinxの導入

ライブラリのインストール

pip install sphinx sphinx sphinx-rtd-theme myst-parser
  • sphinx-rtd-theme → ドキュメントの見た目をいい感じにする
  • myst-parser → Sphinxはrstが標準なので,mdファイルでもドキュメントをかけるようにする

requirements.txtにも追記しておきます.

Sphinxの設定もろもろ

cd docs
sphinx-quickstart
> Separate source and build directories (y/n) [n]: y
> Project name: hoge
> Author name(s): fuga
> Project version []: 1.0.0


docs配下にドキュメントの雛形が生成されます.

my_code
├── README.md
├── docs
│   ├── Makefile
│   ├── build
│   ├── make.bat
│   └── source
│       ├── _templates
│       ├── conf.py
│       └── index.md
├── src
├── requirements.txt
├── setup.py
└── tests

conf.pyを編集

+ import sys
+ from pathlib import Path
+ 
+ root_path = Path(__file__).parent.parent.parent
+ sys.path.insert(0, str(root_path.absolute()))     # Sphinxがライブラリを探索できるようにパスを追加

# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

# extensionsを追加
+ extensions = [
+     "sphinx.ext.autodoc",
+     "sphinx.ext.viewcode",
+     "sphinx.ext.todo",
+     "sphinx.ext.napoleon",
+     "sphinx_rtd_theme",
+     "myst_parser",
+ ]


# テーマを変更
- html_theme = "alabaster"
+ html_theme = "sphinx_rtd_theme"


# Sphinxで扱うファイル形式を定義
+ source_suffix = {
+     ".rst": "restructuredtext",
+     ".txt": "markdown",
+     ".md": "markdown",
+ }

以上でSphinxの設定完了 $\ldots$!
ローカルでドキュメントを生成したい場合は,以下のようにすればOK.

sphinx-apidoc -f -o docs/source/ src
sphinx-build docs/source/ docs/build/ -a

2. GitHub Pagesの準備

基本的に公式に従っていけばOK → GitHub Pages

この後の手順でGitHub Actionsのワークフローを設定しますが,そこではGitHub Pages用のブランチをgh-pagesとしています.
なので,事前にブランチを作ってプッシュしておきます.

git branch gh-pages
git push origin gh-pages

これでGitHub Pagesでgh-pagesブランチを使ってドキュメントを公開できるので,GitHubから設定します.

3. GitHub Actionsの設定

GitHubにPushしたら,自動的にSphinxのビルドとGitHub Pagesへのドキュメント公開が実行されるようにワークフローを定義します.

まずはファイル作成

mkdir -p .github/workflows
touch .github/workflows/sphinx.yml

sphinx.ymlの中身です.コピペでOK

name: Sphinx

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      ACTIONS_ALLOW_UNSECURE_COMMANDS: true
    steps:
      - uses: actions/checkout@v1
      - run: pip install -r requirements.txt
      - name: Sphinx build
        run: sphinx-apidoc -f -o docs/source/ src/
      - name: Make HTML
        run: sphinx-build docs/source/ docs/build/ -a
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: docs/build/

編集が終わったらGitHubにPushします.

これで,コードをGitHubにPushしたら,docstringに基づいてSphinxが自動でドキュメントを作成→GitHub Pagesで公開までしてくれるようになりました.

4. Waiting for GitHub Copilot!

ここまででほぼ終わったようなものですが,あとはコードを書いてひと段落するたびに /doc でdocstringを自動生成するだけです!
あとは何もせずともGitHubのリポジトリにPushした時点で自動的にプログラムのドキュメントが生成されます!
もちろん,Get Startedのような独自のドキュメントを含めることも可能!

GitHub Copilotが最後のピースを埋めてくれることによって,コードを書く作業とドキュメントを書く作業が完全に一体化しました.
これでもうドキュメントに悩まずに済む...
イノベーションというものの有難みを改めて実感した瞬間でした...

参考までに.こんなドキュメントができます.

image.png

20
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
11