Skip to content

#452 を実装する(スプリント m8e) - #494

Merged
takemi-ohama merged 3 commits into
sprint/m8efrom
feat/issue-452-m8e
Oct 15, 2026
Merged

takemi-ohama merged 3 commits into
sprint/m8efrom
feat/issue-452-m8e

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

スプリント m8e のブランチへ、#452 の作業を集めました。内容はリファクタリングです。env sync の AWS の計画・ホームのパス・bash の補完で重なっていた処理と、テストの補助で重なっていた処理を、それぞれ 1 か所にまとめました。あわせて bash の補完の各分岐が出す候補を、現在の内容でテストに固定しました。

利用者向けの変化

  • 無し

移行の手順

  • 無し

変更の要点

  • env sync の AWS の計画・ホームのパス・bash の補完で重なっていた処理を 1 か所にまとめた
  • テストの補助で重なっていた処理を 1 か所にまとめた
    • コンテナのテスト向けに tests/containers/docker_images.py と tests/containers/dockerfile_parse.py を追加した
    • tests/conftest.py と tests/volume/conftest.py を整理した
  • 偽の OpenBao の do_GET を分割した
  • bash の補完の各分岐が出す候補をテストで固定した
    • 振る舞いを変えずに整理できたことを確かめるためのテスト
  • 変更の規模は 20 ファイル、634 行追加・467 行削除

テスト

  • test-limited:範囲テスト 1 本が通過(132.4 秒、戦略 local-full)
  • design-tests:設計文書 issues/issue-452-design.md に名前の出るテスト 34 件が、すべて HEAD にあることを確認
  • design-specs:変えたパス 20・シンボル 45 を含む既存の確定仕様と変更履歴 19 件を照合し、結果は ok

設計と違う点

  • 無し

15 件の扱い

設計(issues/issue-452-design.md)のとおり、直したのは 11 件(R1・R2・R3・R5・R9〜R15)、直さなかったのは 4 件(R4・R6・R7・R8)。設計から「直す / 直さない」を移した件は無い。

# 対象 扱い 理由 / 直し方
R4 check_group_option 直さない 文言(--group に使えない名前です)と終了コード 2 はコマンドの層の知識。呼ぶ先へ移すとコマンドの文言が設定の層へ入る(要求の理由 1)
R6 _mask_env_none 直さない _ENV_MASKERS の 4 つの関数の名前(_mask_env_<形>)と引数の揃いを保つ(要求の理由 2)
R7 SnapshotManager.list 直さない 27 行・認知的複雑度 14 で、long_method の基準(50 行以下・15 以下)の内(要求の理由 3)
R8 etc/_devbase の profile 直さない test_name_context_consistency.py の _zsh_branch が case の入れ子を字面で辿るため、関数へ移すとテストを変えずには通らない(設計の決定 5)

コミットの分け方(設計の決定 13)

コミット 中身 tests/
c6ac5fd bash の補完の各分岐の候補を現状固定するテストを足す(決定 12。70 件。変更の前のコードで通ることを確かめた) 足すだけ
588c56e R1・R2・R3・R5・R9・R10 変えない。このコミットで全体のテストが手を入れずに通った(4472 passed, 32 skipped)
66b83b3 R11〜R15(テストの補助の移動)と R13 補助の移動だけ

兆候が消えたかの測定

Python は対象の 4 つのファイル(lib/devbase/commands/env.py・lib/devbase/volume/manager.py・lib/devbase/volume/compose.py・tests/conftest.py)の全関数を測った。
行数は ast の lineno〜end_lineno、C901 は uvx ruff check --select C901 --config 'lint.mccabe.max-complexity=0'、認知的複雑度は uvx complexipy --plain -i。
値が変わった関数は次のとおりで、ほかの関数の値は変わっていない(上がった関数は無い)。

関数 前(行・C901・認知的) 後
env.py#cmd_env_keygen 47・5・6 46・5・6
env.py#_aws_sync_plan 18・3・4 15・3・4
env.py#_aws_plan_for_selection 20・4・4 21・4・4
env.py#_aws_plan_for_unregistered 32・6・6 31・6・6
env.py#_aws_whole_plan(新) — 6・1・0
tests/conftest.py#_Handler.do_GET 34・12・16 6・2・1
tests/conftest.py#_Handler._refuse_read(新) — 23・7・8
tests/conftest.py#_Handler._read_secret(新) — 20・6・8
snapshot/manager.py#SnapshotManager.list(R7。直さない) 27・4・14 変更なし

重なりの数(git grep -c -F、前は 588c56e~1):

# 数えたもの 前 後
R1 env.py の from devbase.errors import DevbaseError(先頭+関数の中) 4 3(cmd_env_keygen の中の 1 つを消した。残る 2 つは前提 6 で扱わない)
R2 build_from_home(profiles).encode() 2 1
R3 _encode_aws_config_files, ALL 2 1
R5 lib/devbase/volume/ の '/home/ubuntu…' の文字列の定義 3 1(manager.CONTAINER_HOME)。3 つの定数の値は前と同じ
R9 etc/devbase-completion.bash の command -v devbase 2>/dev/null 3 1(_devbase_resolve_root)
R11 tests/cli/ の COMP_CWORD= を組むスクリプト 3 1(tests/cli/conftest.py#run_bash_completion)
R12 tests/volume/ の DEVBASE_MANAGED = { 2 1(tests/volume/conftest.py)
R14 tests/containers/ の RUN ブロックへ分ける手順 2 1(dockerfile_parse.run_blocks)
R15 tests/containers/ の docker とイメージを調べる手順 4 1(docker_images.image_unavailable)

bash の補完の関数の行数(関数名の行から } の行まで、awk で数えた): 前は _devbase_completions が 309 行。後は最大が _devbase_complete_subcommands の 50 行で、どの関数も 60 行以下。

関数 行
_devbase_completions 39
_devbase_complete_subcommands 50
_devbase_complete_args 30
_devbase_complete_project_args 39
_devbase_complete_container_args 25
_devbase_complete_env_args 33
_devbase_complete_plugin_args 26
_devbase_complete_snapshot_args 19
_devbase_complete_after_args 14
_devbase_complete_project_flags 16
_devbase_complete_profile_flags 9
_devbase_complete_plugin_after_args 35
_devbase_resolve_root(新) 3
_devbase_project_names・_devbase_complete_flags(変更なし) 17・10

手で確かめたこと

  • bash の補完: 位置 2〜4 の 71 の語の並び(プラグイン名とリポジトリ名を含む)で、変更の前後の候補と終了コードが同じ。Homebrew の bash に加えて macOS の /bin/bash(3.2.57)でも前後で同じ
  • bash -n etc/devbase-completion.bash・zsh -n etc/_devbase が通る。etc/_devbase は変えていない
  • shellcheck(手元の devbase-base:latest、建て直していない。--entrypoint shellcheck -s bash)の etc/devbase-completion.bash への指摘: 前 29 件(SC2207 28・SC2038 1)→ 後 29 件(同じ内訳)
  • R15 の飛ばす理由: docker を PATH から外した実行、docker info だけ通りイメージの調べで失敗する偽の docker を置いた実行(既定のイメージ名と、DEVBASE_TEST_BROWSER_IMAGE・DEVBASE_TEST_BASE_IMAGE で渡した名前)で、4 つのファイルの pytest -rs の理由の文が変更の前後で同じ。docker info が失敗する偽の docker では「docker daemon へ繋がらない」で飛ばされる
  • テスト関数の assert は変えていない(git diff の assert の行は、補助へ移した assert proc.returncode == 0, proc.stderr と assert blocks, "RUN が 1 つも見つからない" だけで、文字列は同じ)
  • lib/devbase/volume/manager.py の変更は先頭の定数の 2 つの hunk(CONTAINER_HOME を足す・VSCODE_SERVER_TARGET/VSCODE_BIN_TARGET を作り直す)だけで、VolumeManager.__init__・ensure_volumes は触っていない
  • 全体のテスト env -u DEVBASE_ROOT uv run --locked pytest tests/ -q: 4472 passed, 32 skipped(コミット 2 の時点と最後の時点の両方)
  • uvx ruff check --select=E9,F63,F7,F82 lib: 通った
  • 固有の語の検査(python3 .github/scripts/proper_term_check.py)は「語の一覧が無いため飛ばした」と出た(~/.config/devbase/proper-terms.txt が無い)。検査したとは数えていない
  • devbase up は打っていない。base と派生のイメージは建て直していない

設計と違えたところ

  • R11: test_post_start_command.py・test_name_context_consistency.py で、使わなくなった BASH_COMPLETION の定数と os・subprocess の取り込みを消した。R15 の 4 つのファイルでも使わなくなった shutil の取り込みを消した
  • R12: 2 つのファイルにあった DEVBASE_MANAGED の説明の注記は、それを使う関数(user_env・_without_managed)の直上へ寄せた
  • 現状固定のテスト(決定 12)は test_completion.py の test_bash_completion_branches(68 件)と test_bash_completion_plugin_repo_names(2 件。端末の python3 に yaml が無いときは飛ばす)として足した

モード: standard / 通した工程: 実装 → 完了判定 → Pull Request

🤖 Generated with Claude Code

takemi-ohama and others added 3 commits October 15, 2026 18:08
R9・R10 で _devbase_completions の分岐を関数へ移す前に、既存のテストが
見ていない分岐(env のフラグ・plugin と snapshot の引数・container scale・
プラグイン名とリポジトリ名など)の候補を、変更の前のコードで通る形で縛る。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- R1: cmd_env_keygen の中の DevbaseError の取り込み直しを消す
- R2: _aws_plan_for_selection の選んだプロファイルの計画を先頭で 1 回だけ組む
- R3: 丸ごとの計画を _aws_whole_plan に置き、_aws_sync_plan と
  _aws_plan_for_unregistered が呼ぶ
- R5: manager.py に CONTAINER_HOME を置き、VS Code Server の 2 つの定数と
  compose.py の _DEPRECATED_TARGET をそれから作る(値は同じ)
- R9: devbase_root の解決を _devbase_resolve_root に置く
- R10: _devbase_completions を語の位置の振り分けにし、位置 2〜4 の分岐を
  グループごとの関数へ移す(候補は同じ)

tests/ は変えていない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- R11: 補完を実行する補助を tests/cli/conftest.py の run_bash_completion・
  bash_complete に置き、3 つのファイルが使う
- R12: DEVBASE_MANAGED を tests/volume/conftest.py へ移す(値は同じ)
- R13: _Handler.do_GET を拒否と注入の _refuse_read と、応答の組み立ての
  _read_secret に分ける(段の順は同じ)
- R14: RUN ブロックへ分ける手順を dockerfile_parse.run_blocks に置く
- R15: Docker とイメージの有無を調べる手順を docker_images.image_unavailable
  に置き、4 つのファイルが接尾(建て方の案内)だけを渡す(飛ばす理由の文は同じ)

テスト関数の assert は変えていない。補助の中の assert は文字列のまま移した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@takemi-ohama
takemi-ohama marked this pull request as ready for review October 15, 2026 09:26
@takemi-ohama
takemi-ohama merged commit 51c4ac9 into sprint/m8e Oct 15, 2026
10 checks passed
@takemi-ohama takemi-ohama mentioned this pull request Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant