rubycli 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +88 -0
- data/LICENSE +1 -1
- data/README.ja.md +357 -235
- data/README.md +386 -233
- data/examples/documentation_style_showcase.rb +110 -0
- data/examples/fallback_example.rb +14 -0
- data/examples/fallback_example_with_extra_docs.rb +13 -0
- data/examples/hello_app.rb +10 -0
- data/examples/hello_app_with_docs.rb +17 -0
- data/examples/hello_app_with_require.rb +19 -0
- data/examples/mismatched_constant_runner.rb +16 -0
- data/examples/multi_constant_runner.rb +20 -0
- data/examples/new_mode_runner.rb +46 -0
- data/examples/strict_choices_demo.rb +22 -0
- data/examples/typed_arguments_demo.rb +42 -0
- data/lib/rubycli/argument_mode_controller.rb +7 -11
- data/lib/rubycli/argument_parser.rb +338 -80
- data/lib/rubycli/cli.rb +26 -30
- data/lib/rubycli/command_line.rb +159 -72
- data/lib/rubycli/constant_capture.rb +563 -6
- data/lib/rubycli/documentation/metadata_parser.rb +114 -74
- data/lib/rubycli/documentation_registry.rb +1 -0
- data/lib/rubycli/environment.rb +17 -9
- data/lib/rubycli/eval_coercer.rb +27 -10
- data/lib/rubycli/help_renderer.rb +67 -62
- data/lib/rubycli/json_coercer.rb +2 -0
- data/lib/rubycli/result_emitter.rb +18 -8
- data/lib/rubycli/runner.rb +513 -0
- data/lib/rubycli/type_utils.rb +8 -6
- data/lib/rubycli/types.rb +2 -0
- data/lib/rubycli/version.rb +1 -1
- data/lib/rubycli.rb +7 -400
- metadata +59 -4
data/README.ja.md
CHANGED
|
@@ -1,12 +1,49 @@
|
|
|
1
1
|
# Rubycli — Python Fire 風の Ruby 向け CLI
|
|
2
2
|
|
|
3
|
-

|
|
3
|
+

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://rubygems.org/gems/rubycli)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Rubycli は、既存の Ruby クラス/モジュールをそのままコマンドラインインターフェースにするツールです。
|
|
8
|
+
公開メソッドの定義と、メソッドに付けたドキュメントコメントを読み取って CLI を組み立てるため、
|
|
9
|
+
最小構成ではスクリプト側の変更が一切不要です(`require "rubycli"` すら要りません)。
|
|
10
|
+
コメント内の型アノテーションは単なる説明ではなく、CLI 引数の解釈そのものを制御します
|
|
11
|
+
(例: `TAG... [String[]]` と書くと配列としてパースされます)。
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
[Python Fire](https://github.com/google/python-fire) にインスパイアされていますが、
|
|
14
|
+
移植や公式プロジェクトではなく、Ruby のコメント記法と型アノテーションに焦点を当てた独自実装です。
|
|
15
|
+
|
|
16
|
+
> English documentation: [README.md](README.md)
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+
|
|
20
|
+
## プロジェクトの状態
|
|
21
|
+
|
|
22
|
+
Rubycli は**メンテナンスを終了しました。** 0.2.0 が最終リリースで、公開済み gem の挙動を
|
|
23
|
+
全面監査して見つかった 8 件の不具合を修正し、区切りとしています
|
|
24
|
+
([CHANGELOG.md](CHANGELOG.md) 参照)。Issue・Pull Request の対応は行わず、
|
|
25
|
+
今後のリリース予定もありません。
|
|
26
|
+
|
|
27
|
+
コードは参考のため公開したまま残しています。実務で CLI ライブラリを選ぶのであれば、
|
|
28
|
+
[Thor](https://github.com/rails/thor)、[dry-cli](https://dry-rb.org/gems/dry-cli/)、
|
|
29
|
+
または Ruby 標準の `OptionParser` をご利用ください。
|
|
30
|
+
|
|
31
|
+
## インストール
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
gem install rubycli
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
# Gemfile
|
|
39
|
+
gem "rubycli"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Ruby 3.0 以上が必要です。ライセンスは [MIT](LICENSE) です。
|
|
43
|
+
|
|
44
|
+
## クイックスタート
|
|
45
|
+
|
|
46
|
+
### 1. 既存スクリプトをそのまま実行する
|
|
10
47
|
|
|
11
48
|
```ruby
|
|
12
49
|
# hello_app.rb
|
|
@@ -19,7 +56,8 @@ module HelloApp
|
|
|
19
56
|
end
|
|
20
57
|
```
|
|
21
58
|
|
|
22
|
-
|
|
59
|
+
同じ内容を `examples/hello_app.rb` として同梱しているので、以下のコマンドは
|
|
60
|
+
プロジェクト直下でそのまま試せます。
|
|
23
61
|
|
|
24
62
|
```bash
|
|
25
63
|
rubycli examples/hello_app.rb
|
|
@@ -30,11 +68,13 @@ Usage: hello_app.rb COMMAND [arguments]
|
|
|
30
68
|
|
|
31
69
|
Available commands:
|
|
32
70
|
Class methods:
|
|
33
|
-
greet
|
|
71
|
+
greet NAME
|
|
34
72
|
|
|
35
73
|
Detailed command help: hello_app.rb COMMAND help
|
|
36
74
|
```
|
|
37
75
|
|
|
76
|
+
引数が足りない場合はスタックトレースではなく使い方が表示されます。
|
|
77
|
+
|
|
38
78
|
```bash
|
|
39
79
|
rubycli examples/hello_app.rb greet
|
|
40
80
|
```
|
|
@@ -52,16 +92,15 @@ rubycli examples/hello_app.rb greet Hanako
|
|
|
52
92
|
#=> Hello, Hanako!
|
|
53
93
|
```
|
|
54
94
|
|
|
55
|
-
`rubycli examples/hello_app.rb --help`
|
|
95
|
+
`rubycli examples/hello_app.rb --help` でも、コマンド未指定時と同じ一覧が表示されます。
|
|
56
96
|
|
|
57
|
-
### 2.
|
|
97
|
+
### 2. コメントを足して型付きオプションを有効にする
|
|
58
98
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
**簡潔なプレースホルダ記法**
|
|
99
|
+
この段階でも `require "rubycli"` は不要です。コメントだけでオプション解析とヘルプが変わります。
|
|
100
|
+
簡潔なプレースホルダ記法と YARD タグのどちらでも書けます。
|
|
62
101
|
|
|
63
102
|
```ruby
|
|
64
|
-
#
|
|
103
|
+
# 簡潔なプレースホルダ記法
|
|
65
104
|
module HelloApp
|
|
66
105
|
module_function
|
|
67
106
|
|
|
@@ -75,10 +114,8 @@ module HelloApp
|
|
|
75
114
|
end
|
|
76
115
|
```
|
|
77
116
|
|
|
78
|
-
**YARD タグでも同様に動作**
|
|
79
|
-
|
|
80
117
|
```ruby
|
|
81
|
-
#
|
|
118
|
+
# YARD タグ
|
|
82
119
|
module HelloApp
|
|
83
120
|
module_function
|
|
84
121
|
|
|
@@ -92,21 +129,13 @@ module HelloApp
|
|
|
92
129
|
end
|
|
93
130
|
```
|
|
94
131
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
Usage: hello_app_with_docs.rb COMMAND [arguments]
|
|
103
|
-
|
|
104
|
-
Available commands:
|
|
105
|
-
Class methods:
|
|
106
|
-
greet <NAME> [--shout]
|
|
107
|
-
|
|
108
|
-
Detailed command help: hello_app_with_docs.rb COMMAND help
|
|
109
|
-
```
|
|
132
|
+
ドキュメント付きの版は `examples/hello_app_with_docs.rb` として同梱しています。
|
|
133
|
+
モジュール名は `HelloApp` のままなので、ファイル末尾に
|
|
134
|
+
`HelloAppWithDocs = HelloApp` を置いてファイル名と一致する定数を用意しています。
|
|
135
|
+
そのため追加のフラグなしで実行できます。一致する定数がないファイルの扱いは
|
|
136
|
+
後述の[対象定数の解決](#対象定数の解決)を参照してください。
|
|
137
|
+
(この別名の検出は Rubycli 0.1.7 以前では未対応です。それらのバージョンでは
|
|
138
|
+
`--auto-target` / `-a` を付けてください。)
|
|
110
139
|
|
|
111
140
|
```bash
|
|
112
141
|
rubycli examples/hello_app_with_docs.rb greet --help
|
|
@@ -116,10 +145,10 @@ rubycli examples/hello_app_with_docs.rb greet --help
|
|
|
116
145
|
Usage: hello_app_with_docs.rb greet NAME [--shout]
|
|
117
146
|
|
|
118
147
|
Positional arguments:
|
|
119
|
-
NAME [String] required
|
|
148
|
+
NAME [String] required Name to greet
|
|
120
149
|
|
|
121
150
|
Options:
|
|
122
|
-
--shout [Boolean] optional
|
|
151
|
+
--shout [Boolean] optional Print in uppercase (default: false)
|
|
123
152
|
```
|
|
124
153
|
|
|
125
154
|
```bash
|
|
@@ -127,7 +156,11 @@ rubycli examples/hello_app_with_docs.rb greet --shout Hanako
|
|
|
127
156
|
#=> HELLO, HANAKO!
|
|
128
157
|
```
|
|
129
158
|
|
|
130
|
-
CLI
|
|
159
|
+
CLI コマンドになるのは、対象のクラス/モジュール自身に定義された public メソッドだけです。
|
|
160
|
+
親クラスから継承したメソッド、`include` で取り込んだメソッド、`attr_accessor` が生成する
|
|
161
|
+
メソッドは公開されないため、CLI から呼びたい場合は対象側にラッパーを定義してください。
|
|
162
|
+
|
|
163
|
+
CLI に公開したくないヘルパーは、特異クラス側で `private` として定義します。
|
|
131
164
|
|
|
132
165
|
```ruby
|
|
133
166
|
module HelloApp
|
|
@@ -135,82 +168,19 @@ module HelloApp
|
|
|
135
168
|
private
|
|
136
169
|
|
|
137
170
|
def internal_ping(url)
|
|
138
|
-
# CLI
|
|
171
|
+
# CLI コマンドとしては公開されない
|
|
139
172
|
end
|
|
140
173
|
end
|
|
141
174
|
end
|
|
142
175
|
```
|
|
143
176
|
|
|
144
|
-
### 3.
|
|
145
|
-
|
|
146
|
-
`ruby hello_app.rb ...` の形で呼び出したい場合だけ `require "rubycli"` を追加し、`Rubycli.run` に制御を渡します(後述のクイックスタート参照)。
|
|
147
|
-
|
|
148
|
-
## 定数解決モード
|
|
149
|
-
|
|
150
|
-
Rubycli は「ファイル名を CamelCase にした定数」を公開対象だと想定しています。ファイル名とクラス/モジュール名が一致しない場合は、次のモードで挙動を切り替えられます。
|
|
151
|
-
|
|
152
|
-
| モード | 有効化方法 | 挙動 |
|
|
153
|
-
| --- | --- | --- |
|
|
154
|
-
| `strict`(デフォルト) | 何もしない / `RUBYCLI_AUTO_TARGET=strict` | CamelCase が一致しないとエラーになります。検出した定数一覧と再実行コマンド例を表示します。 |
|
|
155
|
-
| `auto` | `--auto-target`(短縮 `-a`) または `RUBYCLI_AUTO_TARGET=auto` | ファイル内で CLI として実行できる定数が 1 つだけなら自動選択します。複数あれば従来通りエラーで案内します。 |
|
|
156
|
-
|
|
157
|
-
大規模なコードベースでも安全側を保ちながら、どうしても自動選択したいときだけ 1 フラグで切り替えられます。
|
|
158
|
-
|
|
159
|
-
> **インスタンスメソッド専用のクラスについて** – 公開メソッドがインスタンス側(`def greet` など)にしか無い場合は、`--new` を付けて事前にインスタンス化しないと CLI から呼び出せません。クラスメソッドを 1 つ用意するか、`--new` を明示して実行してください。`--new` を付ければ `rubycli --help` でもインスタンスメソッドが一覧に現れ、`rubycli --check --new` でコメントの lint も実行できます。
|
|
160
|
-
|
|
161
|
-
## 開発方針
|
|
162
|
-
|
|
163
|
-
- **便利さが最優先** – 既存の Ruby スクリプトを最小の手間で CLI 化できることを目的にしており、Python Fire の完全移植は目指していません。
|
|
164
|
-
- **インスパイアであってポートではない** – アイデアの出自は Fire ですが、同等機能を揃える予定は基本的にありません。Fire 由来の未実装機能は仕様です。
|
|
165
|
-
- **メソッド定義が土台、コメントが挙動を補強** – 公開メソッドのシグネチャが CLI に露出する範囲と必須/任意を決めますが、コメントに `TAG...` や `[Integer]` を書くと同じ引数でも配列化や型変換が行われます。さらに Rubycli は `--names='["Alice","Bob"]'` のような JSON/YAML らしい入力を自動的に安全なリテラルとして評価します。`rubycli --check パス/対象.rb` でコメントと実装のズレ(未定義の型ラベルや列挙値の誤記を含む)を DidYouMean の候補付きで検査し、通常実行時に `--strict` を付ければドキュメント通りでない入力をその場でエラーにできます。
|
|
166
|
-
- **軽量メンテナンス** – 実装の多くは AI 支援で作られており、深い Ruby メタプログラミングを伴う大規模拡張は想定外です。Fire 互換を求める PR は事前相談をお願いします。
|
|
167
|
-
|
|
168
|
-
## 特徴
|
|
169
|
-
|
|
170
|
-
- コメントベースで CLI オプションやヘルプを自動生成
|
|
171
|
-
- YARD 形式と `NAME [Type] 説明…` の簡潔記法を同時サポート
|
|
172
|
-
- 引数はデフォルトで安全なリテラルとして解釈し、必要に応じて厳格 JSON モードや Ruby eval モードを切り替え可能
|
|
173
|
-
- `--pre-script`(エイリアス: `--init`)で任意の Ruby コードを評価し、その結果オブジェクトを公開
|
|
174
|
-
- `--check` でコメント整合性を lint、`--strict` で入力値をドキュメント通りに強制する二段構えのガード
|
|
175
|
-
|
|
176
|
-
> 補足: `--strict` はコメントに書かれた型/許可値をそのまま信頼して検証するため、コメントが誤記だと実行時には検出できません。CI では必ず `rubycli --check` を走らせ、`--strict` は「 lint を通過したドキュメントを本番で厳密に守る」用途に使ってください。
|
|
177
|
-
|
|
178
|
-
## Python Fire との違い
|
|
179
|
-
|
|
180
|
-
- **コメント対応のヘルプ生成**: コメントがあればヘルプに反映しつつ、最終的な判断は常にライブなメソッド定義に基づきます。
|
|
181
|
-
- **型に基づく解析**: `NAME [String]` や YARD タグから型を推論し、真偽値・配列・数値などを自動変換します。
|
|
182
|
-
- **厳密な整合性チェック**: `rubycli --check` でコメントと実装のズレ(未定義の型ラベルや列挙値の誤記など)をコード実行前に検査し、通常実行時に `--strict` を付ければドキュメントで宣言した型・許可値以外の入力を拒否できます。
|
|
183
|
-
- **Ruby 向け拡張**: キーワード引数やブロック (`@yield*`) といった Ruby 固有の構文に合わせたパーサや `RUBYCLI_*` 環境変数を用意しています。
|
|
184
|
-
|
|
185
|
-
| 機能 | Python Fire | Rubycli |
|
|
186
|
-
| ---- | ----------- | -------- |
|
|
187
|
-
| 属性の辿り方 | オブジェクトを辿ってプロパティ/属性を自動公開 | 対象オブジェクトの公開メソッドをそのまま公開(暗黙の辿りは無し) |
|
|
188
|
-
| クラス初期化 | `__init__` 引数を CLI で自動受け取りインスタンス化 | `--new` 指定時だけ引数なしで明示的に初期化(初期化引数の CLI 受け渡しは未対応なので、必要なら pre-script や自前ファクトリで注入) |
|
|
189
|
-
| インタラクティブシェル | コマンド未指定時に Fire REPL を提供 | インタラクティブモード無し。コマンド実行専用 |
|
|
190
|
-
| 情報源 | 反射で引数・プロパティを解析 | ライブなメソッド定義を基点にしつつコメントをヘルプへ反映 |
|
|
191
|
-
| 辞書/配列 | dict/list を自動でサブコマンド化 | クラス/モジュールのメソッドに特化(辞書自動展開なし) |
|
|
192
|
-
|
|
193
|
-
## インストール
|
|
194
|
-
|
|
195
|
-
Rubycli は RubyGems からインストールできます。
|
|
196
|
-
|
|
197
|
-
```bash
|
|
198
|
-
gem install rubycli
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Bundler 例:
|
|
202
|
-
|
|
203
|
-
```ruby
|
|
204
|
-
# Gemfile
|
|
205
|
-
gem "rubycli"
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## クイックスタート(Rubycli をスクリプトに組み込む)
|
|
177
|
+
### 3. (任意)スクリプトにランナーを組み込む
|
|
209
178
|
|
|
210
|
-
|
|
179
|
+
`ruby スクリプト.rb ...` の形で起動したい場合は、gem を require して
|
|
180
|
+
`Rubycli.run` に委譲します(`examples/hello_app_with_require.rb` として同梱)。
|
|
211
181
|
|
|
212
182
|
```ruby
|
|
213
|
-
#
|
|
183
|
+
# hello_app_with_require.rb
|
|
214
184
|
require "rubycli"
|
|
215
185
|
|
|
216
186
|
module HelloApp
|
|
@@ -230,133 +200,206 @@ end
|
|
|
230
200
|
Rubycli.run(HelloApp)
|
|
231
201
|
```
|
|
232
202
|
|
|
233
|
-
実行例:
|
|
234
|
-
|
|
235
203
|
```bash
|
|
236
|
-
ruby
|
|
237
|
-
#=> Hello, Taro!
|
|
238
|
-
|
|
239
|
-
ruby hello_app.rb greet Taro --shout
|
|
204
|
+
ruby examples/hello_app_with_require.rb greet Taro --shout
|
|
240
205
|
#=> HELLO, TARO!
|
|
241
206
|
```
|
|
242
207
|
|
|
243
|
-
`
|
|
208
|
+
付属の `rubycli` コマンド経由で実行した場合は、メソッドの戻り値が自動で標準出力に表示されます。
|
|
209
|
+
|
|
210
|
+
戻り値は標準出力、警告・エラー・失敗時に表示される usage は標準エラー出力へ送られます。
|
|
211
|
+
そのため `rubycli app.rb command > result.json` としても診断メッセージが結果へ混ざらず、
|
|
212
|
+
失敗時は終了コードが 0 以外になります。
|
|
213
|
+
|
|
214
|
+
## 対象定数の解決
|
|
215
|
+
|
|
216
|
+
Rubycli は「ファイル名を CamelCase にした定数」を公開対象と想定します。
|
|
217
|
+
一致しない場合の挙動はモードで切り替えられます。
|
|
218
|
+
|
|
219
|
+
| モード | 有効化方法 | 挙動 |
|
|
220
|
+
| --- | --- | --- |
|
|
221
|
+
| `strict`(既定) | 何もしない / `RUBYCLI_AUTO_TARGET=strict` | CamelCase 名が一致しないとエラー。検出した定数一覧と再実行方法を表示します。 |
|
|
222
|
+
| `auto` | `--auto-target` / `-a` / `RUBYCLI_AUTO_TARGET=auto` | CLI として実行できる定数がファイル内に 1 つだけなら自動選択します。 |
|
|
223
|
+
|
|
224
|
+
ファイルパスの後ろに定数名を明示することもできます。1 ファイルに候補が複数ある場合や、
|
|
225
|
+
ネストした定数を選びたい場合に便利です。同梱サンプルでは
|
|
226
|
+
`examples/multi_constant_runner.rb` が `MultiConstantRunner` と `HelperRunner` を、
|
|
227
|
+
`examples/mismatched_constant_runner.rb` が `FriendlyGreeter` だけを定義しています。
|
|
244
228
|
|
|
245
229
|
```bash
|
|
246
|
-
|
|
230
|
+
# ファイル名と一致しない定数を明示(既定の strict モードでも動く)
|
|
231
|
+
rubycli examples/multi_constant_runner.rb HelperRunner inspect
|
|
232
|
+
#=> Helper invoked # メソッド自身が出力した行
|
|
233
|
+
#=> :helper # 戻り値を rubycli が出力した行
|
|
234
|
+
|
|
235
|
+
# auto モードなら候補が 1 つだけのファイルを自動選択
|
|
236
|
+
rubycli -a examples/mismatched_constant_runner.rb greet Hanako --message Hi
|
|
237
|
+
#=> Hi, Hanako! # メソッド自身が出力した行
|
|
238
|
+
#=> Hi, Hanako! # 同じ文字列が戻り値として出力される(--quiet を付けると 1 行になる)
|
|
247
239
|
```
|
|
248
240
|
|
|
249
|
-
|
|
241
|
+
`Outer::Inner::Runner` のようなネストした定数も、完全修飾名を渡せば検出できます。
|
|
242
|
+
|
|
243
|
+
## インスタンスメソッド専用クラスと `--new`
|
|
244
|
+
|
|
245
|
+
公開メソッドがインスタンス側にしかないクラスは、`--new` を付けて事前にインスタンス化しないと
|
|
246
|
+
CLI から呼び出せません(Rubycli から見えるコマンドが 1 つもない状態になります)。
|
|
250
247
|
|
|
251
|
-
|
|
248
|
+
- `--new` を付けると `--help` の一覧にインスタンスメソッドが現れ、
|
|
249
|
+
`rubycli --check --new` でコメントの lint も実行できます。
|
|
250
|
+
- コンストラクタに引数が必要な場合は、**ファイルパスより前に** `--new=VALUE` の形で渡します。
|
|
251
|
+
値は安全な YAML/JSON ライクなリテラルとして解釈され、`initialize` に付けたコメントも
|
|
252
|
+
通常の CLI メソッドと同様に型変換へ反映されます。
|
|
253
|
+
- `--new=VALUE` が渡せるのは **値 1 つだけ** で、コンストラクタの第 1 引数に束縛されます。
|
|
254
|
+
`--new='["a","b","c"]'` はこの配列を 1 個の引数として渡します。配列が複数の引数へ
|
|
255
|
+
展開されたり、ハッシュがキーワード引数になったりはしません。引数が 2 つ以上必要な場合や
|
|
256
|
+
キーワード引数を渡したい場合は `--pre-script` を使ってください。
|
|
257
|
+
- スペース区切りの `--new VALUE` は値がファイルパスと誤認されやすいため、
|
|
258
|
+
`--new=VALUE` の形を推奨します。
|
|
259
|
+
- インスタンスを返す `--pre-script` はそれ自体でインスタンスメソッドを公開できるため、
|
|
260
|
+
`--new` と併用しなくても単独で使えます。
|
|
261
|
+
|
|
262
|
+
実行例(`examples/new_mode_runner.rb`):
|
|
252
263
|
|
|
253
264
|
```bash
|
|
254
|
-
rubycli
|
|
265
|
+
rubycli --new='["a","b","c"]' examples/new_mode_runner.rb run --mode reverse
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
[
|
|
270
|
+
"c",
|
|
271
|
+
"b",
|
|
272
|
+
"a"
|
|
273
|
+
]
|
|
255
274
|
```
|
|
256
275
|
|
|
257
|
-
|
|
276
|
+
コマンドが構造を返した場合、戻り値は整形済み JSON として出力されます。
|
|
258
277
|
|
|
259
278
|
## コメント記法
|
|
260
279
|
|
|
280
|
+
YARD タグと短縮形のどちらでも書けます。
|
|
281
|
+
|
|
261
282
|
| 用途 | YARD 互換 | Rubycli 標準 |
|
|
262
283
|
| ---- | --------- | ----------- |
|
|
263
284
|
| 位置引数 | `@param name [Type] 説明` | `NAME [Type] 説明` |
|
|
264
285
|
| キーワード引数 | 同上 | `--flag -f VALUE [Type] 説明` |
|
|
265
286
|
| 戻り値 | `@return [Type] 説明` | `=> [Type] 説明` |
|
|
266
287
|
|
|
267
|
-
短いオプション(`-f`
|
|
288
|
+
短いオプション(`-f` など)は任意で、順序も自由です。次の 3 つは同義です。
|
|
268
289
|
|
|
269
290
|
- `--flag -f VALUE [Type] 説明`
|
|
270
291
|
- `--flag VALUE [Type] 説明`
|
|
271
292
|
- `-f --flag VALUE [Type] 説明`
|
|
272
293
|
|
|
273
|
-
|
|
294
|
+
型は `[String]` でも `(String)` でも指定でき、`(String, nil)` のように複数型も書けます。
|
|
274
295
|
|
|
275
296
|
### 互換プレースホルダ表記
|
|
276
297
|
|
|
277
|
-
|
|
298
|
+
コメントの解析とヘルプ出力の両方で、次の表記も同じ意味として扱われます。
|
|
278
299
|
|
|
279
|
-
-
|
|
280
|
-
-
|
|
300
|
+
- 山括弧: `--flag <value>`, `NAME [<value>]`
|
|
301
|
+
- `=` 付きロングオプション: `--flag=<value>`
|
|
281
302
|
- 繰り返し指定: `VALUE...`, `<value>...`
|
|
282
303
|
|
|
283
|
-
実行時には `--flag VALUE`, `--flag <value>`, `--flag=<value>`
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
型ヒントは `[String]` や `(String)` のように角括弧/丸括弧で指定できます。複数型は `(String, nil)` のように列挙してください。
|
|
288
|
-
|
|
289
|
-
`VALUE...` のような繰り返し指定(`TAG...` など)や、`[String[]]` / `Array<String>` といった配列型の注釈が付いたオプションは配列として扱われます。JSON/YAML 形式のリスト(例: `--tags '["build","test"]'`)を渡すか、カンマ区切り文字列(`--tags "build,test"`)を渡すことで配列に変換されます。スペース区切りの複数値入力(`--tags build test`)にはまだ対応しておらず、繰り返し注記のないオプションは従来どおりスカラーとして扱われます。`--strict` 実行時は各要素の型も検証されるため、`[String[]]` と書かれているのに `--tags [1,2]` のような数値配列を渡すと即エラーになります。
|
|
304
|
+
実行時には `--flag VALUE`, `--flag <value>`, `--flag=<value>` のどれも同じ扱いなので、
|
|
305
|
+
プロジェクトで読みやすいスタイルを選んでください。任意引数を自分で角括弧に包む必要は
|
|
306
|
+
ありません。必須/任意は Ruby のメソッドシグネチャから自動判定され、ヘルプ出力では
|
|
307
|
+
Rubycli が角括弧を補います。
|
|
290
308
|
|
|
291
|
-
|
|
309
|
+
注釈が部分的な場合の推論規則:
|
|
292
310
|
|
|
293
|
-
|
|
311
|
+
- `ARG1` のように型を省略したプレースホルダは `String` として扱われます。
|
|
312
|
+
- 値プレースホルダのないオプション(`--verbose`)は Boolean フラグになります。
|
|
313
|
+
- 位置引数を Boolean にするには `[Boolean]` の明示が必要です。`NAME 説明` のように
|
|
314
|
+
型を省略すると、Ruby 側のデフォルト値に関わらず `String` とみなされます。
|
|
294
315
|
|
|
295
|
-
|
|
296
|
-
- `--name ARG1` のようにオプションへプレースホルダだけを指定しても同じく `String` が推論されます。
|
|
297
|
-
- `--verbose` のように値プレースホルダを省略したオプションは Boolean フラグとして扱われます。
|
|
298
|
-
- 位置引数を Boolean にしたい場合は必ず `[Boolean]` を明示してください。`NAME 説明` や `@param name 説明` のように型を省略すると、Ruby 側のデフォルト値に関わらず `String` とみなされます。
|
|
316
|
+
### 配列と繰り返し値
|
|
299
317
|
|
|
300
|
-
|
|
318
|
+
`TAG...` のような繰り返し指定、または `[String[]]` / `Array<String>` のような配列型注釈が
|
|
319
|
+
付いたオプションは配列としてパースされます。JSON/YAML 形式のリスト
|
|
320
|
+
(`--tags '["build","test"]'`)とカンマ区切り文字列(`--tags "build,test"`)の両方を
|
|
321
|
+
受け付けます。スペース区切りの複数値(`--tags build test`)には対応しておらず、
|
|
322
|
+
繰り返し注記のないオプションはスカラーのままです。`--strict` 実行時は各要素の型も
|
|
323
|
+
検証されるため、`[String[]]` と書かれた注釈に対して `--tags [1,2]` を渡すとエラーになります。
|
|
324
|
+
`--tags '["true","null"]'` のように引用された要素は、別のリテラルに見える内容でも文字列の
|
|
325
|
+
まま保持されます。
|
|
301
326
|
|
|
302
|
-
|
|
327
|
+
### リテラル列挙(enum)
|
|
303
328
|
|
|
304
|
-
|
|
329
|
+
許容値の集合を型注釈の中に直接書けます: `--format MODE [:json, :yaml, :auto]`、
|
|
330
|
+
`LEVEL [:info, :warn]` など。シンボル・文字列(裸の単語も可)・真偽値・数値・`nil` に対応し、
|
|
331
|
+
`--channel TARGET [:stdout, :stderr, Boolean]` のように通常の型とも混在できます。
|
|
332
|
+
`%i[info warn]` / `%w[debug info]` の短縮記法も展開されます。選択肢は常にヘルプへ表示され、
|
|
333
|
+
許可外の値は `--strict` なしなら警告のみで続行、`--strict` 付きなら中断します。
|
|
305
334
|
|
|
306
|
-
|
|
335
|
+
シンボルと文字列は厳密に区別されます。`[:info, :warn]` にはコロン付きの `:info` を、
|
|
336
|
+
`["info", "warn"]` にはプレーンな文字列を入力してください。
|
|
307
337
|
|
|
308
338
|
```bash
|
|
309
|
-
#
|
|
310
|
-
|
|
311
|
-
#=> [WARN] format=json
|
|
339
|
+
# examples/strict_choices_demo.rb — LEVEL の注釈は [:info, :warn, :error]
|
|
340
|
+
rubycli examples/strict_choices_demo.rb report :warn --format json
|
|
341
|
+
#=> [WARN] format=json (続けて戻り値のハッシュが表示される)
|
|
312
342
|
|
|
313
|
-
#
|
|
314
|
-
|
|
315
|
-
#=>
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
```bash
|
|
319
|
-
# シンボル入力はコロンを付ける
|
|
320
|
-
ruby -Ilib exe/rubycli --strict examples/strict_choices_demo.rb report :warn
|
|
321
|
-
#=> [WARN] format=text
|
|
343
|
+
# 裸の文字列はシンボルと一致しない: 警告して続行
|
|
344
|
+
rubycli examples/strict_choices_demo.rb report warn
|
|
345
|
+
#=> [WARN] LEVEL must be one of :info, :warn, :error (received "warn") (use --strict to abort on invalid input)
|
|
322
346
|
|
|
323
|
-
|
|
324
|
-
|
|
347
|
+
# --strict を付けると許可外の入力で中断
|
|
348
|
+
rubycli --strict examples/strict_choices_demo.rb report debug
|
|
349
|
+
#=> [ERROR] LEVEL must be one of :info, :warn, :error (received "debug")
|
|
325
350
|
```
|
|
326
351
|
|
|
327
|
-
|
|
352
|
+
列挙は各スカラー引数に適用されます。`[%i[foo bar][]]` のような「配列の許容組み合わせ」を
|
|
353
|
+
リテラルで書く構文は未サポートです。
|
|
328
354
|
|
|
329
|
-
|
|
355
|
+
### 標準ライブラリの型ヒント
|
|
356
|
+
|
|
357
|
+
コメントに `Date`、`Time`、`BigDecimal`、`Pathname` などの標準クラスを書くと、
|
|
358
|
+
Rubycli が必要な stdlib を読み込んだ上で CLI 入力をその型へ変換します。
|
|
359
|
+
ハンドラには実際のオブジェクトが渡るため、追加のパース処理は不要です。
|
|
330
360
|
|
|
331
361
|
```bash
|
|
332
|
-
# examples/typed_arguments_demo.rb
|
|
333
|
-
|
|
362
|
+
# examples/typed_arguments_demo.rb を参照
|
|
363
|
+
rubycli examples/typed_arguments_demo.rb ingest \
|
|
334
364
|
--date 2024-12-25 \
|
|
335
365
|
--moment 2024-12-25T10:00:00Z \
|
|
336
366
|
--budget 123.45 \
|
|
337
367
|
--input ./data/input.csv
|
|
338
368
|
```
|
|
339
369
|
|
|
340
|
-
|
|
370
|
+
各オプションには既定値があるため、`... ingest --budget 999.99` のように
|
|
371
|
+
1 つずつ試すこともできます。
|
|
341
372
|
|
|
342
|
-
|
|
373
|
+
`@example`、`@raise`、`@see`、`@deprecated` などその他の YARD タグは、
|
|
374
|
+
現状ヘルプ出力には反映されません。
|
|
343
375
|
|
|
344
|
-
|
|
376
|
+
> すべての記法をまとめて試すには
|
|
377
|
+
> `rubycli examples/documentation_style_showcase.rb canonical --help` などの
|
|
378
|
+
> showcase コマンドを実行してください。
|
|
345
379
|
|
|
346
|
-
|
|
380
|
+
### YARD 互換コメントを併用する際の注意
|
|
347
381
|
|
|
348
|
-
|
|
382
|
+
- `**kwargs` を受け取るメソッドでも、キーは自動では公開されません。CLI で使わせたいキーは
|
|
383
|
+
すべて `--long-name PLACEHOLDER [Type] 説明` の行として明示してください。
|
|
384
|
+
- `@param` 行に続く箇条書きや補足行は CLI 生成には使われません。補足情報は
|
|
385
|
+
オプションの説明文に含めてください。
|
|
386
|
+
- 簡潔なプレースホルダ記法へ移行したい場合は `RUBYCLI_ALLOW_PARAM_COMMENT=OFF` を設定して
|
|
387
|
+
`rubycli --check` を実行します。`@param` 行がドキュメント不整合として報告され(その lint
|
|
388
|
+
実行中は無視され)、書き換えが必要な箇所を洗い出せます。これは lint 用のスイッチであり
|
|
389
|
+
実行時の制限ではありません。通常実行では `@param` は従来どおり有効で、`@return` は
|
|
390
|
+
この設定の対象外です。
|
|
349
391
|
|
|
350
|
-
###
|
|
392
|
+
### コメントが不足している場合
|
|
351
393
|
|
|
352
|
-
Rubycli
|
|
394
|
+
Rubycli は常に実装のメソッドシグネチャを信頼します。コメントに書かれていない引数も、
|
|
395
|
+
定義から名前・既定値・型を推論して CLI に公開されます。
|
|
353
396
|
|
|
354
397
|
```ruby
|
|
355
|
-
# fallback_example.rb
|
|
398
|
+
# examples/fallback_example.rb
|
|
356
399
|
module FallbackExample
|
|
357
400
|
module_function
|
|
358
401
|
|
|
359
|
-
# AMOUNT [Integer]
|
|
402
|
+
# AMOUNT [Integer] Base amount to process
|
|
360
403
|
def scale(amount, factor = 2, clamp: nil, notify: false)
|
|
361
404
|
result = amount * factor
|
|
362
405
|
result = [result, clamp].min if clamp
|
|
@@ -366,20 +409,6 @@ module FallbackExample
|
|
|
366
409
|
end
|
|
367
410
|
```
|
|
368
411
|
|
|
369
|
-
```bash
|
|
370
|
-
rubycli examples/fallback_example.rb
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
```text
|
|
374
|
-
Usage: fallback_example.rb COMMAND [arguments]
|
|
375
|
-
|
|
376
|
-
Available commands:
|
|
377
|
-
Class methods:
|
|
378
|
-
scale AMOUNT [<FACTOR>] [--clamp=<value>] [--notify]
|
|
379
|
-
|
|
380
|
-
Detailed command help: fallback_example.rb COMMAND help
|
|
381
|
-
```
|
|
382
|
-
|
|
383
412
|
```bash
|
|
384
413
|
rubycli examples/fallback_example.rb scale --help
|
|
385
414
|
```
|
|
@@ -388,109 +417,202 @@ rubycli examples/fallback_example.rb scale --help
|
|
|
388
417
|
Usage: fallback_example.rb scale AMOUNT [FACTOR] [--clamp=<CLAMP>] [--notify]
|
|
389
418
|
|
|
390
419
|
Positional arguments:
|
|
391
|
-
AMOUNT [Integer] required
|
|
392
|
-
FACTOR
|
|
420
|
+
AMOUNT [Integer] required Base amount to process
|
|
421
|
+
FACTOR [String] optional (default: 2)
|
|
393
422
|
|
|
394
423
|
Options:
|
|
395
424
|
--clamp=<CLAMP> [String] optional (default: nil)
|
|
396
425
|
--notify [Boolean] optional (default: false)
|
|
397
426
|
```
|
|
398
427
|
|
|
399
|
-
`AMOUNT`
|
|
428
|
+
ドキュメント化されているのは `AMOUNT` だけですが、`factor`・`clamp`・`notify` も
|
|
429
|
+
推論された既定値・型付きで表示されます。
|
|
400
430
|
|
|
401
|
-
|
|
431
|
+
コメントだけで実引数が増えることはありません。実装に存在しないオプション(例: `--ghost`)や
|
|
432
|
+
位置引数をコメントに書いた場合、その行はヘルプ末尾の詳細セクションに素のテキストとして
|
|
433
|
+
表示されるだけで、strict モードでは位置引数のズレに対する警告も出ます。動作するデモ:
|
|
434
|
+
`rubycli examples/fallback_example_with_extra_docs.rb scale --help`
|
|
402
435
|
|
|
403
|
-
|
|
436
|
+
開発中は `rubycli --check 対象.rb` でコメントと実装のズレ(未定義の型ラベルや列挙値の
|
|
437
|
+
誤記を含む。DidYouMean の候補付き)を検出し、実行時に `--strict` を付ければ仕様外の
|
|
438
|
+
入力を警告ではなくエラーにできます。なお `--check` も実際のシグネチャを読むために対象
|
|
439
|
+
ファイルを load するため、トップレベルのコードは実行されます(例えば
|
|
440
|
+
`examples/hello_app_with_require.rb` は load 時に `Rubycli.run` を呼びます)。
|
|
441
|
+
`--check` が行わないのは、選択したコマンドの実行です。
|
|
404
442
|
|
|
405
|
-
>
|
|
443
|
+
> `--strict` はコメントに書かれた型・許容値をそのまま信頼します。コメント自体の誤記は
|
|
444
|
+
> 実行時には検出できないため、CI で `rubycli --check` を回した上で `--strict` を
|
|
445
|
+
> 使ってください。
|
|
406
446
|
|
|
407
|
-
|
|
447
|
+
## 引数解析モード
|
|
408
448
|
|
|
409
|
-
###
|
|
449
|
+
### 既定のリテラル解析
|
|
410
450
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
451
|
+
`{`、`[`、クォート、YAML 記号で始まる「構造化リテラルらしい」引数は `Psych.safe_load` で
|
|
452
|
+
解釈され、`--names='["Alice","Bob"]'` や `--config='{foo: 1}'` は追加フラグなしで
|
|
453
|
+
ネイティブな配列・ハッシュとして届きます。`1,2,3` のようなプレーンな文字列はこの段階では
|
|
454
|
+
そのまま維持され(コメントで `String[]` や `TAG...` と宣言されていれば後段で配列化)、
|
|
455
|
+
解釈できない形式は元の文字列にフォールバックします。`"2024-01-01"` は文字列のまま届き、
|
|
456
|
+
構文が崩れた入力でも実行全体は落ちません。
|
|
415
457
|
|
|
416
|
-
|
|
458
|
+
引数が素の `[String]` としてドキュメント化されている場合は、リテラル解析よりコメント由来の
|
|
459
|
+
変換が優先され、入力トークンがそのまま渡ります(引用符も含む)。そのため
|
|
460
|
+
`--prefix '"quoted"'` は引用符付きの `"quoted"` として届き、注釈のない引数なら
|
|
461
|
+
`quoted` として届きます。
|
|
417
462
|
|
|
418
|
-
###
|
|
463
|
+
### JSON モード(`--json-args` / `-j`)
|
|
419
464
|
|
|
420
|
-
|
|
465
|
+
後続の引数を厳格に JSON として解釈します。YAML 固有の記法は拒否され、無効な JSON は
|
|
466
|
+
`JSON::ParserError` になるため、silent fallback ではなく明示的な失敗が欲しい場合に
|
|
467
|
+
便利です。プログラムからは `Rubycli.with_json_mode(true) { ... }` で切り替えられます。
|
|
421
468
|
|
|
422
|
-
###
|
|
469
|
+
### Eval モード(`--eval-args` / `-e`、`--eval-lax` / `-E`)
|
|
423
470
|
|
|
424
|
-
|
|
471
|
+
各引数を Ruby 式として評価してから渡します。シンボル配列・Range・インライン計算など、
|
|
472
|
+
JSON では書きにくい値に便利です。
|
|
425
473
|
|
|
426
474
|
```bash
|
|
427
|
-
|
|
428
|
-
|
|
475
|
+
# シンボルや %w リテラルがそのままオブジェクトとして届く
|
|
476
|
+
rubycli -e --new='%w[x y]' examples/new_mode_runner.rb run --mode ':reverse'
|
|
477
|
+
#=> ["y", "x"]
|
|
429
478
|
|
|
430
|
-
|
|
479
|
+
# インライン計算は、コメント由来の型変換より先に評価される
|
|
480
|
+
rubycli -e examples/documentation_style_showcase.rb canonical '"Foo"' '2*3'
|
|
481
|
+
#=> {"style": "canonical", "subject": "Foo", "count": 6, ...}
|
|
482
|
+
```
|
|
431
483
|
|
|
432
|
-
|
|
484
|
+
`--eval-args` では **すべての引数** が有効な Ruby でなければならないため、
|
|
485
|
+
`--mode summary` のような裸の単語はエラーになります。`':summary'`(または
|
|
486
|
+
`'"summary"'`)と書くか、後述の `--eval-lax` を使ってください。
|
|
433
487
|
|
|
434
|
-
|
|
488
|
+
評価は隔離された binding(`Object.new.instance_eval { binding }`)内で行われます。
|
|
489
|
+
1回の Runner 実行では、`--new=VALUE` のコンストラクタ引数と選択したコマンドの引数を含む
|
|
490
|
+
すべての eval 引数が同じ binding を共有し、実行終了時に破棄されます。入力そのものは
|
|
491
|
+
信頼できる呼び出し元に限定してください。プログラムからは
|
|
492
|
+
`Rubycli.with_eval_mode(true) { ... }` で切り替えられます。
|
|
435
493
|
|
|
436
|
-
Ruby
|
|
494
|
+
`--eval-lax` / `-E` は `--eval-args` と同様に eval モードを有効にしつつ、Ruby として
|
|
495
|
+
解釈できなかったトークン(例: 素の `https://example.com`)は警告を出して元の文字列の
|
|
496
|
+
まま渡します。`60*60*24*14` のような式と通常の文字列を混在させたいときに便利です。
|
|
437
497
|
|
|
438
498
|
```bash
|
|
439
|
-
rubycli -E
|
|
440
|
-
|
|
441
|
-
|
|
499
|
+
rubycli -E examples/hello_app.rb greet https://example.com
|
|
500
|
+
#=> [WARN] Failed to evaluate argument as Ruby (...). Passing it through because --eval-lax is enabled.
|
|
501
|
+
#=> Hello, https://example.com!
|
|
442
502
|
```
|
|
443
503
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
`--json-args`/`-j` は `--eval-args`/`-e` および `--eval-lax`/`-E` と同時指定できません。どのモードも既定のリテラル解析を拡張する位置づけなので、用途に応じて厳格な JSON か Ruby eval(通常/lax)のいずれかを選択してください。
|
|
504
|
+
`--json-args` と eval 系フラグは同時指定できません(両方あるとエラーになります)。
|
|
447
505
|
|
|
448
506
|
## Pre-script ブートストラップ
|
|
449
507
|
|
|
450
|
-
|
|
508
|
+
`--pre-script SRC`(別名: `--init`)を付けると、コマンド解決の前に任意の Ruby コードを
|
|
509
|
+
評価できます。評価は隔離された binding 内で行われ、次のローカル変数が用意されています。
|
|
451
510
|
|
|
452
|
-
- `target`
|
|
453
|
-
- `current` / `instance`
|
|
511
|
+
- `target` — 元のクラス/モジュール(`--new` 適用前)
|
|
512
|
+
- `current` / `instance` — そのまま公開される予定のオブジェクト
|
|
454
513
|
|
|
455
|
-
|
|
514
|
+
最後に評価された値が新しい公開対象になります(`nil` を返すと直前のオブジェクトを維持)。
|
|
515
|
+
`SRC` にはインラインの Ruby コードとファイルパスのどちらも指定できます。
|
|
456
516
|
|
|
457
|
-
|
|
517
|
+
実行例 — `--new` で作られるインスタンスを、自分で組み立てたものに差し替える:
|
|
458
518
|
|
|
459
519
|
```bash
|
|
460
|
-
rubycli --pre-script '
|
|
461
|
-
|
|
520
|
+
rubycli --pre-script 'NewModeRunner.new(%w[a b c], options: {from: :pre})' \
|
|
521
|
+
examples/new_mode_runner.rb run --mode summary
|
|
462
522
|
```
|
|
463
523
|
|
|
464
|
-
|
|
524
|
+
## フラグと環境変数
|
|
465
525
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
526
|
+
| フラグ / 環境変数 | 説明 | 既定値 |
|
|
527
|
+
| ---------------- | ---- | ------ |
|
|
528
|
+
| `--auto-target` / `-a`, `RUBYCLI_AUTO_TARGET=auto` | ファイル名と定数名が一致しないときに自動選択 | `strict` |
|
|
529
|
+
| `--new[=VALUE]` / `-n[=VALUE]` | コマンド解決前にインスタンス化。`VALUE` はコンストラクタの第 1 引数 | off |
|
|
530
|
+
| `--pre-script SRC` / `--init SRC` | 公開対象オブジェクトを Ruby コードで構築・差し替え | off |
|
|
531
|
+
| `--check` / `-c` | コメントと実装のズレを検査(コマンドは実行しない) | off |
|
|
532
|
+
| `--strict` | ドキュメントの型・許容値を強制。仕様外入力はエラー | off |
|
|
533
|
+
| `--json-args` / `-j` | 引数を厳格に JSON として解釈 | off |
|
|
534
|
+
| `--eval-args` / `-e`, `--eval-lax` / `-E` | 引数を Ruby として評価(lax は失敗時に素の文字列へフォールバック) | off |
|
|
535
|
+
| `--help` / `-h` / `help` | `rubycli` の使い方を表示 | — |
|
|
536
|
+
| `--print-result`, `RUBYCLI_PRINT_RESULT=true` | 戻り値を標準出力へ表示。同梱の `rubycli` コマンドでは既定で有効なので、`Rubycli.run` を自分のスクリプトへ組み込む場合に効く | `rubycli` は on、`Rubycli.run` は off |
|
|
537
|
+
| `RUBYCLI_DEBUG=true` | デバッグログを表示 | `false` |
|
|
538
|
+
| `RUBYCLI_ALLOW_PARAM_COMMENT=OFF` | `rubycli --check` 実行時に YARD `@param` 行を不整合として報告(通常実行には影響しない) | `ON` |
|
|
539
|
+
|
|
540
|
+
## ライブラリ API
|
|
541
|
+
|
|
542
|
+
- `Rubycli.parse_arguments(argv, method)` — コメント情報を考慮した引数解析
|
|
543
|
+
- `Rubycli.available_commands(target)` — 公開 CLI コマンド一覧
|
|
544
|
+
- `Rubycli.usage_for_method(name, method)` — 指定メソッドのヘルプ生成
|
|
545
|
+
- `Rubycli.method_description(method)` — 構造化されたドキュメント取得
|
|
546
|
+
|
|
547
|
+
## Python Fire との違い
|
|
548
|
+
|
|
549
|
+
- **コメント対応のヘルプ生成** — コメントはヘルプを豊かにしますが、最終的な判断は常に
|
|
550
|
+
ライブなメソッド定義に基づきます。
|
|
551
|
+
- **型に基づく解析** — プレースホルダ記法と YARD タグから、真偽値・配列・数値などへ
|
|
552
|
+
追加コードなしで変換します。
|
|
553
|
+
- **二段構えの検証** — `--check` はコマンドを実行せずにドキュメントのズレを lint し、
|
|
554
|
+
`--strict` はドキュメントの型・許容値を実行時の契約として強制します。
|
|
555
|
+
- **Ruby 中心の設計** — キーワード引数、ブロックドキュメント(`@yield*` タグ)、
|
|
556
|
+
`RUBYCLI_*` 環境変数に対応します。
|
|
557
|
+
|
|
558
|
+
| 機能 | Python Fire | Rubycli |
|
|
559
|
+
| ---- | ----------- | ------- |
|
|
560
|
+
| 属性の辿り方 | プロパティ/属性を再帰的に自動公開 | 対象の公開メソッドのみ公開(暗黙の辿りなし) |
|
|
561
|
+
| クラス初期化 | `__init__` 引数を自動で受け取る | `--new` 指定時のみ初期化。引数は `--new=VALUE`、複雑な構築は pre-script |
|
|
562
|
+
| インタラクティブシェル | コマンド未指定時に Fire REPL | なし。コマンド実行専用 |
|
|
563
|
+
| 情報源 | 純粋なリフレクション | ライブなメソッド定義 + コメントをヘルプへ反映 |
|
|
564
|
+
| 辞書/配列 | dict/list を自動でサブコマンド化 | クラス/モジュールのメソッドに特化(自動展開なし) |
|
|
565
|
+
|
|
566
|
+
## 開発方針
|
|
567
|
+
|
|
568
|
+
- **便利さを最優先** — 既存の Ruby スクリプトを最小の手間で CLI 化することが目的です。
|
|
569
|
+
Python Fire との機能一致は目標ではなく、Fire 由来の未実装機能は基本的に仕様です。
|
|
570
|
+
- **メソッド定義が土台、コメントが補強** — 公開範囲と必須/任意はシグネチャが決め、
|
|
571
|
+
コメントは型・ヘルプ・検証を補強します。
|
|
572
|
+
- **メンテナンス** — 実装の多くは AI 支援で作られています。現在はメンテナンスを終了して
|
|
573
|
+
います([プロジェクトの状態](#プロジェクトの状態)を参照)。
|
|
574
|
+
|
|
575
|
+
## 同梱サンプル
|
|
576
|
+
|
|
577
|
+
- `examples/hello_app.rb` / `examples/hello_app_with_docs.rb` — 最小のモジュール関数、
|
|
578
|
+
ドキュメントなし/あり
|
|
579
|
+
- `examples/hello_app_with_require.rb` — `Rubycli.run` の組み込み
|
|
580
|
+
- `examples/typed_arguments_demo.rb` — 標準ライブラリ型の変換
|
|
581
|
+
(Date/Time/BigDecimal/Pathname)
|
|
582
|
+
- `examples/strict_choices_demo.rb` — リテラル列挙と `--strict`
|
|
583
|
+
- `examples/new_mode_runner.rb` — `--new=VALUE` で初期化するインスタンス専用クラス
|
|
584
|
+
- `examples/documentation_style_showcase.rb` — 全コメント記法のショーケース
|
|
585
|
+
- `examples/fallback_example.rb` / `examples/fallback_example_with_extra_docs.rb`
|
|
586
|
+
— シグネチャからの補完とコメント不一致のデモ(この 2 つは意図的に
|
|
587
|
+
`rubycli --check` に落ちます)
|
|
588
|
+
- `examples/multi_constant_runner.rb` / `examples/mismatched_constant_runner.rb`
|
|
589
|
+
— 定数選択のデモ(1 ファイルに複数候補がある場合と、ファイル名と定数名が
|
|
590
|
+
一致しない場合)
|
|
591
|
+
|
|
592
|
+
本 README のコマンドはリポジトリ直下での実行を前提にしています。同じファイルは gem にも
|
|
593
|
+
同梱されているため、`gem install rubycli` 後は `gem contents rubycli` で場所を確認できます。
|
|
594
|
+
|
|
595
|
+
## 開発
|
|
472
596
|
|
|
473
597
|
```bash
|
|
474
|
-
|
|
475
|
-
|
|
598
|
+
bundle install # minitest / rake / rubocop(Rubycli 本体に実行時依存はありません)
|
|
599
|
+
bundle exec rake # テスト + RuboCop
|
|
476
600
|
```
|
|
477
601
|
|
|
478
|
-
|
|
602
|
+
個別のタスク:
|
|
479
603
|
|
|
480
|
-
|
|
604
|
+
- `bundle exec rake test` — Minitest 一式(実際の `exe/rubycli` を子プロセスで起動する
|
|
605
|
+
E2E テストを含む)
|
|
606
|
+
- `bundle exec rake lint` — RuboCop。未修正の指摘は `.rubocop_todo.yml` で管理しています
|
|
607
|
+
(大半はパーサ側のメソッド長メトリクス)
|
|
608
|
+
- `bundle exec rake coverage` — テストに加えてリポジトリのカバレッジ基準
|
|
609
|
+
(全体 line 90%、branch 70%、`origin/main` から変更した実行可能行 90%)を検査
|
|
481
610
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
| `RUBYCLI_DEBUG=true` | デバッグログ表示 | `false` |
|
|
485
|
-
| `--check` | コメント/実装のズレを検査し、コマンドは実行しない | `off` |
|
|
486
|
-
| `--strict` | ドキュメントで許可した型・値以外をエラーとして拒否 | `off` |
|
|
487
|
-
| `RUBYCLI_ALLOW_PARAM_COMMENT=OFF` | レガシーな `@param` 記法を無効化(互換性のため既定では ON) | `ON` |
|
|
611
|
+
カバレッジゲートは外部依存なしで動くため、Bundler なしの
|
|
612
|
+
`ruby -Ilib:test test/coverage_runner.rb` でも実行できます。
|
|
488
613
|
|
|
489
|
-
##
|
|
614
|
+
## ライセンス
|
|
490
615
|
|
|
491
|
-
|
|
492
|
-
- `Rubycli.available_commands(target)` – 公開 CLI コマンド一覧
|
|
493
|
-
- `Rubycli.usage_for_method(name, method)` – 指定メソッドのヘルプ生成
|
|
494
|
-
- `Rubycli.method_description(method)` – 構造化されたドキュメント取得
|
|
616
|
+
MIT。[LICENSE](LICENSE) を参照してください。
|
|
495
617
|
|
|
496
|
-
|
|
618
|
+
ご意見・不具合報告は Issue や Pull Request でお寄せください。
|