argvise 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96b6f0c2b58c2c978c647f988896d96377fa798b5df00eb372d8f2c13de6d479
4
- data.tar.gz: ebdd6ef0219a35ab0c585f9310be93ac6f8a22b6376289002b8c414e4ffa6b4e
3
+ metadata.gz: e698d11b5f582bd557fd6f4d1a1d2d9f9cda5512d2ba26af3e59d803016093a8
4
+ data.tar.gz: 182e7a4cad5e576575335d22413eac4868c8ab7f993c17d9f344f898d8e86291
5
5
  SHA512:
6
- metadata.gz: 6124154af43827d0b5d65d5c086ecb0941daf7f5b56a35655072ee6ba75486340d0eede11aebeb29e95cf69540cd3932e41f0d498d578e68e8ea580abef9ece2
7
- data.tar.gz: 82a72a33658ea1e190a6f16f181e2d4a9f4c6bad414aa815307e4118a45d53624685809488e276ab84609509467b9fa7e7cda4001e89cfb3a428b073de6247a4
6
+ metadata.gz: 24c9621fa200763a833f02bb019026b8a75b49f0948f88cb765ba38196bd5f1c4406313f8f5d837b70da259cf241a248bee41040615bb7ab354b7e7335ebefdd
7
+ data.tar.gz: 44e70c7e0b19e25e180e21851b0582e9e3ca1507aab3de9168abd24dff8f0d785087b5a302294046a5a366e6add6a8b3e98579d2573c7a0ed6b1146810aeaed2
data/.rubocop.yml CHANGED
@@ -1,2 +1,32 @@
1
+ # ln ~/.config/rubocop/config.yml .rubocop.yml
1
2
  AllCops:
2
3
  TargetRubyVersion: 3.1
4
+
5
+ Lint/MissingCopEnableDirective:
6
+ Enabled: false
7
+ Lint/RedundantCopDisableDirective:
8
+ Enabled: false
9
+ Lint/EmptyExpression:
10
+ # disabled => allow ()
11
+ Enabled: false
12
+
13
+ # https://docs.rubocop.org/rubocop/cops_style.html
14
+ Style/TrailingCommaInHashLiteral:
15
+ EnforcedStyle: diff_comma
16
+ Style/TrailingCommaInArrayLiteral:
17
+ EnforcedStyle: diff_comma
18
+ Style/Lambda:
19
+ EnforcedStyle: literal
20
+ Style/ModuleFunction:
21
+ EnforcedStyle: extend_self
22
+ Style/BlockDelimiters:
23
+ Enabled: false
24
+ Style/Documentation:
25
+ Enabled: false
26
+
27
+ # https://docs.rubocop.org/rubocop/cops_layout.html
28
+ Layout/CaseIndentation:
29
+ EnforcedStyle: end
30
+ IndentOneStep: true
31
+ Layout/MultilineMethodCallIndentation:
32
+ EnforcedStyle: indented_relative_to_receiver
data/bin/console.rb CHANGED
@@ -44,6 +44,7 @@ raw_cmd
44
44
  puts_division_line
45
45
  # -----------
46
46
 
47
+ using Argvise::HashRefin
47
48
  puts 'GNU-style + kebab_case_flags(true)'
48
49
  raw_cmd
49
50
  .to_argv
data/bin/irb.rb ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'irb'
5
+ load File.expand_path('../lib/argvise.rb', __dir__)
6
+
7
+ puts "Argvise: #{Argvise.constants}"
8
+ puts Argvise::VERSION
9
+
10
+ IRB.start
data/docs/Readme.md CHANGED
@@ -23,6 +23,9 @@ raw_cmd_hash = {
23
23
  cargo: (), b: (), r: true, target: "wasm32-wasip2"
24
24
  }
25
25
 
26
+ using Argvise::HashRefin
27
+ # OR: include Argvise::HashMixin
28
+
26
29
  raw_cmd_hash
27
30
  .to_argv
28
31
  # .to_argv({bsd_style: false, kebab_case_flags: true})
@@ -183,16 +186,57 @@ Argvise.build(raw_cmd_hash)
183
186
 
184
187
  ### Shortcut
185
188
 
189
+ #### Mixin
190
+
186
191
  ```ruby
187
- { v: true, dir: '/path/to/dir' }.to_argv
188
- # => ["-v", "--dir", "/path/to/dir"]
192
+ require 'argvise'
193
+
194
+ module A
195
+ module_function
196
+ include Argvise::HashMixin
197
+
198
+ def demo
199
+ { path: '/path/to/dir' }.to_argv.then { p it }
200
+ #=> ["--path", "/path/to/dir"]
201
+
202
+ { path: '/path/to/dir' }.to_argv_bsd.then { p it }
203
+ #=> ["-path", "/path/to/dir"]
204
+ end
205
+ end
206
+
207
+ A.demo
208
+ Hash.method_defined?(:to_argv) # => true
209
+ {}.respond_to?(:to_argv) #=> true
210
+ ```
211
+
212
+ #### Refinement
213
+
214
+ ```ruby
215
+ require 'argvise'
216
+ class A
217
+ using Argvise::HashRefin
218
+
219
+ def self.demo
220
+ { target: "wasm32-wasip2" }.to_argv.then { p it }
221
+ # => ["--target", "wasm32-wasip2"]
222
+
223
+ { target: "wasm32-wasip2" }.to_argv_bsd.then { p it }
224
+ # => ["-target", "wasm32-wasip2"]
225
+
226
+ {}.respond_to?(:to_argv).then { p it } #=> true
227
+ end
228
+ end
229
+
230
+ A.demo
231
+ Hash.method_defined?(:to_argv) # => false
232
+ {}.respond_to?(:to_argv) #=> false
189
233
  ```
190
234
 
191
235
  ### Configurable builder
192
236
 
193
237
  > Required
194
238
  >
195
- > - argvise: >= v0.0.6
239
+ > - argvise: >= v0.0.9
196
240
  > - ruby: >= v3.1.0
197
241
 
198
242
  ```ruby
@@ -225,6 +269,10 @@ raw_cmd
225
269
  #=> ["compiler", "build", "--pack_type", "tar+zstd", "--push", "-v", "-f", "p2", "--tag", "v0.0.1", "--tag", "beta", "--platform", "wasi/wasm", "--label", "maintainer=user", "--label", "description=Demo", "/path/to/dir"]
226
270
 
227
271
  p '----------------'
272
+
273
+ # argvise: >= v0.0.9
274
+ using Argvise::HashRefin
275
+
228
276
  p 'GNU-style + kebab-case-flags=true'
229
277
  # argvise: >= v0.0.6
230
278
  raw_cmd
@@ -235,15 +283,13 @@ raw_cmd
235
283
 
236
284
  p '----------------'
237
285
  p 'BSD-style + kebab-case-flags=true'
238
- # argvise: >= v0.0.4
286
+ # argvise: >= v0.0.9
239
287
  raw_cmd
240
- .then(&Argvise.new_proc)
241
- .with_bsd_style
242
- .with_kebab_case_flags
243
- .build
288
+ .to_argv_bsd
244
289
  .display
245
290
 
246
291
  #=> ["compiler", "build", "-pack-type", "tar+zstd", "-push", "-v", "-f", "p2", "-tag", "v0.0.1", "-tag", "beta", "-platform", "wasi/wasm", "-label", "maintainer=user", "-label", "description=Demo", "/path/to/dir"]
292
+ p '----------------'
247
293
  ```
248
294
 
249
295
  ## Data Type
@@ -302,15 +348,27 @@ raw_cmd
302
348
 
303
349
  - `{ cargo: () }` => `["cargo"]`
304
350
  - `{ cargo: nil, b: nil }` => `["cargo", "b"]`
305
- - `{ "-fv": nil }` => `["-fv"]`
351
+ - `{ "-fv": () }` => `["-fv"]`
306
352
 
307
353
  ## Changelog
308
354
 
309
355
  ### v0.0.6 (2025-11-05)
310
356
 
311
- Breaking Changes:
357
+ Breaking Change:
312
358
 
313
359
  - `cmd_hash |> hash_to_argv` => `cmd_hash.to_argv(opts)`
314
- - i.e.,
315
- - old: `{a: true}.then(&hash_to_argv)`
316
- - new: `{a: true}.to_argv`
360
+ - Previous: `{a: true}.then(&hash_to_argv)`
361
+ - Current: `{a: true}.to_argv`
362
+
363
+ ### v0.0.9 (2025-11-30)
364
+
365
+ - add refinements for Hash
366
+ - add `Hash#to_argv_bsd`
367
+
368
+ Breaking Change:
369
+ - Mitigated side effects introduced by monkey patching.
370
+ - Previous:
371
+ - Simply calling `require 'argvise'` was enough to import `Hash#to_argv`;
372
+ - no explicit `include` or `using` was required.
373
+ - Current:
374
+ - We must manually `include Argvise::HashMixin` or `using Argvise::HashRefin` to import `Hash#to_argv`.
data/lib/argvise/core.rb CHANGED
@@ -216,21 +216,21 @@ class Argvise
216
216
  # Generates the corresponding argument array based on the value type
217
217
  def generate_args(flag, value)
218
218
  case value
219
- when true
220
- [flag]
221
- when Array
222
- expand_array(flag, value)
223
- when Hash
224
- expand_hash(flag, value)
225
- else
226
- # e.g., {tag: 'uuu'} => ["--tag", "uuu"]
227
- [flag, value.to_s]
219
+ when true
220
+ [flag]
221
+ when Array
222
+ expand_array(flag, value)
223
+ when Hash
224
+ expand_hash(flag, value)
225
+ else
226
+ # e.g., {tag: 'uuu'} => ["--tag", "uuu"]
227
+ [flag, value.to_s]
228
228
  end
229
229
  end
230
230
 
231
- # {tag: ["v1", "v2"]}
232
- # => (flag: "--tag", array: ['v1', 'v2'])
233
- # => ["--tag", "v1", "--tag", "v2"]
231
+ # {tag: ["v1", "v2"]}
232
+ # => (flag: "--tag", array: ['v1', 'v2'])
233
+ # => ["--tag", "v1", "--tag", "v2"]
234
234
  def expand_array(flag, array)
235
235
  # FP style: array.flat_map { |v| [flag, v.to_s] }
236
236
  array.each_with_object([]) do |v, memo|
@@ -241,9 +241,9 @@ class Argvise
241
241
 
242
242
  # Processes hash values (generates key=value format)
243
243
  #
244
- # {label: { env: "test", key: "value" }}
245
- # => (flag: "--label", hash)
246
- # => ["--label", "env=test", "--label", "key=value"]
244
+ # {label: { env: "test", key: "value" }}
245
+ # => (flag: "--label", hash)
246
+ # => ["--label", "env=test", "--label", "key=value"]
247
247
  def expand_hash(flag, hash)
248
248
  # hash.flat_map { |k, v| [flag, "#{k}=#{v}"] }
249
249
  hash.each_with_object([]) do |(k, v), memo|
@@ -253,30 +253,80 @@ class Argvise
253
253
  end
254
254
  end
255
255
 
256
- class ::Hash # rubocop:disable Style/Documentation
257
- # Converts a hash into command-line arguments
256
+ class Argvise
257
+ module HashExt # rubocop:disable Style/Documentation
258
+ # Converts a hash map into GNU-style command-line arguments.
259
+ #
260
+ # == Example:
261
+ #
262
+ # require 'argvise'
263
+ # using Argvise::HashRefin
264
+ #
265
+ # { v: true, path: '/path/to/dir' }.to_argv
266
+ # #=> ["-v", "--path", "/path/to/dir"]
267
+ #
268
+ # == params:
269
+ #
270
+ # - opts: See also [Argvise::new]
271
+ #
272
+ # == raw_cmd_hash.to_argv is equivalent to:
273
+ #
274
+ # raw_cmd_hash
275
+ # .then(&Argvise.new_proc)
276
+ # .with_bsd_style(false)
277
+ # .with_kebab_case_flags(true)
278
+ # .build
279
+ #
280
+ # ---
281
+ # sig { params(opts: T.nilable(Hash)).returns(T::Array[String]) }
282
+ def to_argv(opts = nil)
283
+ Argvise.build(self, opts:)
284
+ end
285
+
286
+ # Converts a hash map into BSD-style command-line arguments.
287
+ #
288
+ # == Example:
289
+ #
290
+ # require 'argvise'
291
+ # using Argvise::HashRefin
292
+ #
293
+ # { path: '/path/to/dir' }.to_argv_bsd
294
+ # #=> ["-path", "/path/to/dir"]
295
+ #
296
+ def to_argv_bsd(options = {})
297
+ # if options is not Hash Type => {}
298
+ options = {} unless options.is_a?(::Hash)
299
+
300
+ opts = options.merge({ bsd_style: true })
301
+ Argvise.build(self, opts:)
302
+ end
303
+ end
304
+
305
+ # Converts a hash map into command-line arguments.
258
306
  #
259
307
  # == Example:
260
308
  #
261
- # { v: true, path: '/path/to/dir' }.to_argv
262
- # #=> ["-v", "--path", "/path/to/dir"]
263
- #
264
- # == params:
309
+ # require 'argvise'
265
310
  #
266
- # - opts: See also [Argvise::new]
311
+ # module A
312
+ # module_function
313
+ # include Argvise::HashMixin
267
314
  #
268
- # == raw_cmd_hash.to_argv is equivalent to:
315
+ # def demo
316
+ # puts({ path: '/path/to/dir' }.to_argv)
317
+ # #=> ["--path", "/path/to/dir"]
269
318
  #
270
- # raw_cmd_hash
271
- # .then(&Argvise.new_proc)
272
- # .with_bsd_style(false)
273
- # .with_kebab_case_flags(true)
274
- # .build
319
+ # puts({ path: '/path/to/dir' }.to_argv_bsd)
320
+ # #=> ["-path", "/path/to/dir"]
321
+ # end
322
+ # end
275
323
  #
276
- # ---
277
- #
278
- # sig { params(opts: T.nilable(Hash)).returns(T::Array[String]) }
279
- def to_argv(opts = nil)
280
- Argvise.build(self, opts:)
324
+ # A.demo
325
+ # Hash.method_defined?(:to_argv) # => true
326
+ # {}.respond_to?(:to_argv) #=> true
327
+ module HashMixin
328
+ def self.included(_host)
329
+ ::Hash.include(HashExt)
330
+ end
281
331
  end
282
332
  end
@@ -0,0 +1,37 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ # To maintain `mruby` compatibility, define `private_constant` and
5
+ # `refinements` in this file rather than in **core.rb**.
6
+
7
+ class Argvise
8
+ private_constant :HashExt
9
+
10
+ # Refinements: Hash#to_argv, Hash#to_argv_bsd
11
+ #
12
+ # = Example
13
+ #
14
+ # require 'argvise'
15
+ # class A
16
+ # using Argvise::HashRefin
17
+ # def self.demo
18
+ # puts({ target: "wasm32-wasip2" }.to_argv)
19
+ # # => ["--target", "wasm32-wasip2"]
20
+ #
21
+ # puts({ target: "wasm32-wasip2" }.to_argv_bsd)
22
+ # # => ["-target", "wasm32-wasip2"]
23
+ #
24
+ # {}.respond_to?(:to_argv) #=> true
25
+ # end
26
+ # end
27
+ #
28
+ # A.demo
29
+ # Hash.method_defined?(:to_argv) # => false
30
+ # {}.respond_to?(:to_argv) #=> false
31
+ #
32
+ module HashRefin
33
+ refine ::Hash do
34
+ import_methods HashExt
35
+ end
36
+ end
37
+ end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Argvise
5
- VERSION = '0.0.8'
5
+ VERSION = '0.0.9'
6
6
  end
data/lib/argvise.rb CHANGED
@@ -3,3 +3,4 @@
3
3
 
4
4
  require_relative 'argvise/version'
5
5
  require_relative 'argvise/core'
6
+ require_relative 'argvise/refinement'
data/rbi/lib/argvise.rbi CHANGED
@@ -6,7 +6,7 @@ class Argvise
6
6
  class << self
7
7
  sig do
8
8
  params(
9
- raw_cmd_hash: Hash,
9
+ raw_cmd_hash: T.any(Hash, HashExt),
10
10
  opts: T.nilable(T::Hash[Symbol, T::Boolean])
11
11
  ).returns(T::Array[String])
12
12
  end
@@ -15,7 +15,7 @@ class Argvise
15
15
 
16
16
  sig do
17
17
  params(
18
- raw_cmd_hash: Hash,
18
+ raw_cmd_hash: T.any(Hash, HashExt),
19
19
  opts: T.nilable(T::Hash[Symbol, T::Boolean])
20
20
  ).void
21
21
  end
@@ -34,4 +34,7 @@ end
34
34
  class ::Hash
35
35
  sig { params(opts: T.nilable(Hash)).returns(T::Array[String]) }
36
36
  def to_argv(opts = nil); end
37
+
38
+ sig { params(options: Hash).returns(T::Array[String]) }
39
+ def to_argv_bsd(options = {}); end
37
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: argvise
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - 2moe
@@ -21,9 +21,11 @@ files:
21
21
  - License
22
22
  - bin/build.rb
23
23
  - bin/console.rb
24
+ - bin/irb.rb
24
25
  - docs/Readme.md
25
26
  - lib/argvise.rb
26
27
  - lib/argvise/core.rb
28
+ - lib/argvise/refinement.rb
27
29
  - lib/argvise/version.rb
28
30
  - rbi/lib/argvise.rbi
29
31
  homepage: https://github.com/2moe/argvise-gem