From f9c21ea601742897cfa50083579056fee4f0662e Mon Sep 17 00:00:00 2001 From: tomoaki Date: Wed, 24 Dec 2025 09:14:33 +0900 Subject: [PATCH] test(env): Phase 286A - Deprecated env warning regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Goal: Prevent regression where deprecated env vars warn even when unset Changes: - tools/smokes/v2/profiles/quick/env/phase286_deprecated_env_warnings.sh * Test Case 1: Unset env → No warnings (防止: 未設定で警告) * Test Case 2: NYASH_MACRO_TOPLEVEL_ALLOW=1 → Warning expected * Test Case 3: NYASH_MACRO_BOX_CHILD_RUNNER=1 → Warning expected * Uses env -u to truly unset variables (empty string counts as "set") - docs/reference/environment-variables.md * Added "Deprecated 警告動作 (Phase 286A)" section * Clarified: warnings only appear when env var is explicitly set * Warning format: [macro][compat] <変数名> is deprecated; <推奨アクション> Test Results: ✅ All 3 test cases pass ✅ Quick smoke: 45/46 tests pass (1 known failure unrelated) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- docs/reference/environment-variables.md | 105 ++++++++++++++++++ .../env/phase286_deprecated_env_warnings.sh | 98 ++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 tools/smokes/v2/profiles/quick/env/phase286_deprecated_env_warnings.sh diff --git a/docs/reference/environment-variables.md b/docs/reference/environment-variables.md index d4ac5054..d8aafd05 100644 --- a/docs/reference/environment-variables.md +++ b/docs/reference/environment-variables.md @@ -362,4 +362,109 @@ env NYASH_FEATURES=stage3 NYASH_LLVM_USE_HARNESS=1 \ --- +## Macro システム (Phase 286A 集約版) + +**Phase 286A** で Macro 系環境変数を `src/config/env/macro_flags.rs` に集約しました。 + +### Core(本線化対象) + +| 変数 | デフォルト | 適用経路 | 説明 | +| --- | --- | --- | --- | +| `NYASH_MACRO_PATHS=comma,separated,paths` | unset | Any | MacroBox パス(カンマ区切り)。推奨経路。 | +| `NYASH_MACRO_ENABLE={0\|1}` | `1` | Any | Macro システム全体の有効化。`0` で完全無効化(lite プロファイル用)。 | +| `NYASH_MACRO_STRICT={0\|1\|true\|false}` | `true` | Any | Strict モード。エラー時に即失敗(未設定時は ON)。 | +| `NYASH_MACRO_TRACE={0\|1}` | `0` | Any | Macro トレース出力。 | +| `NYASH_MACRO_BOX={0\|1}` | `0` | Any | MacroBox システムの有効化。 | +| `NYASH_MACRO_BOX_ENABLE=list` | unset | Any | 有効化する MacroBox 名(カンマ区切り)。 | + +### Legacy / Backward compat + +| 変数 | デフォルト | 適用経路 | 説明 | +| --- | --- | --- | --- | +| `NYASH_MACRO_BOX_NY={0\|1}` | `0` | Any | Legacy: Nyash MacroBox ロード有効化。非推奨:`NYASH_MACRO_PATHS` を使用してね。 | +| `NYASH_MACRO_BOX_NY_PATHS=comma,separated,paths` | unset | Any | Legacy: Nyash MacroBox パス(カンマ区切り)。非推奨:`NYASH_MACRO_PATHS` を使用してね。 | +| `NYASH_MACRO_TOPLEVEL_ALLOW={0\|1\|true\|false}` | `false` | Any | Legacy: トップレベル `static function MacroBoxSpec.expand(json)` を許可。非推奨:BoxDeclaration を使用してね。 | +| `NYASH_MACRO_BOX_CHILD={0\|1\|true\|false}` | `true` | Any | 子プロセス MacroBox を使用。 | +| `NYASH_MACRO_BOX_CHILD_RUNNER={0\|1\|true\|false}` | `false` | Any | Legacy: Runner モードを強制。非推奨:自動管理されるから手動設定不要だよ。 | +| `NYASH_MACRO_BOX_NY_IDENTITY_ROUNDTRIP={0\|1}` | `0` | Any | Identity MacroBox の JSON ラウンドトリップ検証。 | + +### Deprecated 警告動作 (Phase 286A) + +**Phase 286A** で deprecated 環境変数の警告動作を明確化しました: + +- **警告タイミング**: deprecated 変数が**明示的に設定されている場合のみ**警告を出力します。未設定時は警告なし。 +- **警告フォーマット**: `[macro][compat] <変数名> is deprecated; <推奨アクション>` +- **対象変数**: + - `NYASH_MACRO_TOPLEVEL_ALLOW` - BoxDeclaration を使用推奨 + - `NYASH_MACRO_BOX_CHILD_RUNNER` - 自動管理されるため設定不要 + - `NYASH_MACRO_BOX_NY*` - `NYASH_MACRO_PATHS` を使用推奨 + +**例**: +```bash +# 未設定 - 警告なし +./target/release/hakorune program.hako + +# 設定あり - 警告あり +NYASH_MACRO_TOPLEVEL_ALLOW=1 ./target/release/hakorune program.hako +# stderr: [macro][compat] NYASH_MACRO_TOPLEVEL_ALLOW is deprecated; ... +``` + +### Capabilities(Capability ガード) + +| 変数 | デフォルト | 適用経路 | 説明 | +| --- | --- | --- | --- | +| `NYASH_MACRO_CAP_IO={0\|1\|true\|false}` | `false` | Any | Macro から IO (File/Path/Dir) を許可。 | +| `NYASH_MACRO_CAP_NET={0\|1\|true\|false}` | `false` | Any | Macro から NET (HTTP/Socket) を許可。 | +| `NYASH_MACRO_CAP_ENV={0\|1\|true\|false}` | `false` | Any | Macro から環境変数読み取りを許可。 | + +### Advanced / Dev-only + +| 変数 | デフォルト | 適用経路 | 説明 | +| --- | --- | --- | --- | +| `NYASH_MACRO_MAX_PASSES=N` | unset | Any | Macro パス最大回数。 | +| `NYASH_MACRO_CYCLE_WINDOW=N` | unset | Any | Macro 検出ウィンドウ。 | +| `NYASH_MACRO_DERIVE_ALL={0\|1}` | `0` | Any | すべての MacroBox で派生マクロを有効化。 | +| `NYASH_MACRO_DERIVE=target` | unset | Any | 派生マクロのターゲット。 | +| `NYASH_MACRO_TRACE_JSONL=path` | unset | Any | Macro トレースを JSONL 形式で出力。 | +| `NYASH_MACRO_DISABLE={0\|1\|true\|false}` | `false` | Any | Macro システム全体の無効化(`NYASH_MACRO_ENABLE=0` と同等)。 | +| `NYASH_MACRO_BOX_EXAMPLE={0\|1}` | `0` | Any | Example MacroBox を有効化。 | + +### Syntax Sugar + +| 変数 | デフォルト | 適用経路 | 説明 | +| --- | --- | --- | --- | +| `NYASH_SYNTAX_SUGAR_LEVEL={none\|basic\|full}` | `none` | Any | 構文糖衣レベル。Macro スキャン中は一時的に `basic` に設定される。 | + +### 使用例 + +```bash +# 基本使用(推奨) +NYASH_MACRO_PATHS=macros/my_macro.ny \ +./target/release/hakorune --backend vm program.hako + +# Strict モード +NYASH_MACRO_STRICT=1 \ +./target/release/hakorune --backend vm program.hako + +# Trace 出力 +NYASH_MACRO_TRACE=1 \ +./target/release/hakorune --backend vm program.hako + +# MacroBox 有効化 +NYASH_MACRO_BOX=1 NYASH_MACRO_BOX_ENABLE=MyMacroBox,AnotherBox \ +./target/release/hakorune --backend vm program.hako + +# Capability ガード +NYASH_MACRO_CAP_IO=1 NYASH_MACRO_CAP_NET=0 \ +./target/release/hakorune --backend vm program.hako + +# Legacy(非推奨) +NYASH_MACRO_BOX_NY=1 NYASH_MACRO_BOX_NY_PATHS=legacy_macros.ny \ +./target/release/hakorune --backend vm program.hako +``` + +参考: [docs/guides/macro-profiles.md](../guides/macro-profiles.md) / [docs/guides/macro-box.md](../guides/macro-box.md) / [docs/guides/macro-box-nyash.md](../guides/macro-box-nyash.md) + +--- + 参考: [docs/development/architecture/mir-logs-observability.md](../development/architecture/mir-logs-observability.md) / [src/mir/verification/](../../src/mir/verification/) diff --git a/tools/smokes/v2/profiles/quick/env/phase286_deprecated_env_warnings.sh b/tools/smokes/v2/profiles/quick/env/phase286_deprecated_env_warnings.sh new file mode 100644 index 00000000..ec7a7b4c --- /dev/null +++ b/tools/smokes/v2/profiles/quick/env/phase286_deprecated_env_warnings.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# Phase 286A: Deprecated environment variable warning behavior +# Goal: Verify deprecated env vars only warn when explicitly set + +set -euo pipefail + +# Resolve PROJECT_ROOT +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../../../.." && pwd)" +HAKORUNE="$PROJECT_ROOT/target/release/hakorune" +TEST_FILE="$PROJECT_ROOT/apps/tests/phase285_weak_basic.hako" + +# Check hakorune binary exists +if [[ ! -f "$HAKORUNE" ]]; then + echo "❌ FAIL: hakorune binary not found at $HAKORUNE" + exit 1 +fi + +# Check test file exists +if [[ ! -f "$TEST_FILE" ]]; then + echo "❌ FAIL: Test file not found at $TEST_FILE" + exit 1 +fi + +# ======================================== +# Case 1: Unset env - No warnings expected +# ======================================== +set +e +# Use env -u to truly unset variables (empty string counts as "set") +OUTPUT_UNSET=$(env -u NYASH_MACRO_TOPLEVEL_ALLOW -u NYASH_MACRO_BOX_CHILD_RUNNER "$HAKORUNE" "$TEST_FILE" 2>&1) +EXIT_CODE_UNSET=$? +set -e + +# Should succeed (exit code 0) +if [[ $EXIT_CODE_UNSET -ne 0 ]]; then + echo "❌ FAIL: Test file should run successfully (got exit code $EXIT_CODE_UNSET)" + echo "Output: $OUTPUT_UNSET" + exit 1 +fi + +# Should NOT contain deprecated warnings +if echo "$OUTPUT_UNSET" | grep -q "\[macro\]\[compat\]"; then + echo "❌ FAIL: Unset env should not produce [macro][compat] warnings" + echo "Got: $OUTPUT_UNSET" + exit 1 +fi + +echo "✅ Case 1 PASS: Unset env produces no deprecated warnings" + +# ======================================== +# Case 2: Set env - Warnings expected +# ======================================== +set +e +OUTPUT_SET=$(NYASH_MACRO_TOPLEVEL_ALLOW=1 "$HAKORUNE" "$TEST_FILE" 2>&1) +EXIT_CODE_SET=$? +set -e + +# Should succeed (exit code 0) +if [[ $EXIT_CODE_SET -ne 0 ]]; then + echo "❌ FAIL: Test file should run successfully with deprecated env (got exit code $EXIT_CODE_SET)" + echo "Output: $OUTPUT_SET" + exit 1 +fi + +# Should contain specific deprecated warning +if ! echo "$OUTPUT_SET" | grep -q "\[macro\]\[compat\] NYASH_MACRO_TOPLEVEL_ALLOW"; then + echo "❌ FAIL: Set env should produce [macro][compat] NYASH_MACRO_TOPLEVEL_ALLOW warning" + echo "Got: $OUTPUT_SET" + exit 1 +fi + +echo "✅ Case 2 PASS: Set env produces correct deprecated warning" + +# ======================================== +# Case 3: Second deprecated env test +# ======================================== +set +e +OUTPUT_SET2=$(NYASH_MACRO_BOX_CHILD_RUNNER=1 "$HAKORUNE" "$TEST_FILE" 2>&1) +EXIT_CODE_SET2=$? +set -e + +# Should succeed (exit code 0) +if [[ $EXIT_CODE_SET2 -ne 0 ]]; then + echo "❌ FAIL: Test file should run successfully with deprecated env (got exit code $EXIT_CODE_SET2)" + echo "Output: $OUTPUT_SET2" + exit 1 +fi + +# Should contain specific deprecated warning +if ! echo "$OUTPUT_SET2" | grep -q "\[macro\]\[compat\] NYASH_MACRO_BOX_CHILD_RUNNER"; then + echo "❌ FAIL: Set env should produce [macro][compat] NYASH_MACRO_BOX_CHILD_RUNNER warning" + echo "Got: $OUTPUT_SET2" + exit 1 +fi + +echo "✅ Case 3 PASS: Second deprecated env produces correct warning" + +echo "✅ PASS: All deprecated env warning tests passed"