日本の法律の改正履歴・沿革を構造的なディレクトリ・ファイル実体とGitで追跡可能なコミットデータに変換する試み。
src/: バルクデータをGitのコミット・ブランチデータへ直接変換するPythonスクリプトlaws/: ファイル実体が保管されています。{law_id[:3]}/{law_id}/: e-gov 法令APIの法令IDに基づいています。先頭3文字は和暦になっています。current.json:current.xml: all_xml.zip内に存在する各法令・版のXMLをそのまま各コミットが適用しています。当ファイルの来歴を見ることで法令の差分を確認することが可能です。
- 公布
runs/<run_id>/promulgationsと施行runs/<run_id>/enforcementsはブランチを分ける - 公布ブランチでは改正法=commitの単位としたい。
- 施行ブランチでは各法令の条文の溶け込み・各法令の版をcommitの単位としている。
- 同じ改正法の同じ方に対する変更はそのまま同じ時に適用されるわけではない
- 例えば、制度上緩和措置として「この業界だけは猶予を与える」ということは多いが、法律でも同じで、同じ改正法でも〇〇法は〇月から施行、〇〇法は〇月から施行が起きる。
- またN段ロケットと呼ばれるものもあり、同じ改正規定が同じ法に対しても、段階的に改正を適用することがある。
- 公布-施行ブランチの対応の両立
- これが一番の課題で、これについては今後どのような形であれば自然か、扱いやすいかなどは考えていくつもり。
- 今のところ、版単位のcommitを最も小さい単位として、公布ブランチ側では改正法ごとに束ねるmerge commit的なcommitを生成している。
- python: uvを利用することが一番簡単です
- e-gov 法令APIから
all_xml.zipとXMLSchemaForJapanaeseLaw_v3.xsdをダウンロードし、payload/ディレクトリに配置してください--input-zipと--xsd-pathで変更が可能です。
- デフォルトでは
法律のみを対象にします。--law-type 政令のように追加でき、--all-law-typesで全種別を対象にできます。 - main.pyがエントリーポイントになっています。
plan: runs配下にapplyで適用されるcommit/branchに関する情報を構築し、jsonファイルを含むディレクトリとしてruns/<run_id>配下に出力します。- 詳細はパイプラインを確認してください。
dataset_idはzipのhash値に基づきます。run_idは日時_dataset_idです。- 既存runを明示的に上書きする場合は
--forceを利用します。
apply: planで生成されたruns/<run_id>/manifest.jsonを--run-manifestで渡し、実際にcommit/branchを生成します。- 既存refを明示的に更新する場合は
--force-refsを利用します。
- 既存refを明示的に更新する場合は
full: plan/applyの両方をまとめて行います。この場合--run-manifestは必要ありません。- 詳しくは
-hまたは--help
01_ingest: 入力Zipの識別とrun_idの決定02_validate: CSV / XSDスキーマの検証03_normalize_versions: CSV / XML からLawVersionを生成04_build_timelines: 法令ごとの版列(LawTimeline)を構築05_graph_plan:EnforcementUnit/AmendmentEventからcommit graph planを構築06_git_sink: planをそのままGit object / refsに反映