dorian-arguments 0.0.1 → 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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -0
  3. data/lib/dorian/arguments.rb +65 -42
  4. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 951dc350b8ef2808b4d70b61ad7febaf0ebee1cd72d86407e5546d6635178bee
4
- data.tar.gz: 19eab1e2e8aa96e4f5bc00cd416d52c7bcc17b108b05f22c2b75d09477c82c4d
3
+ metadata.gz: 3842736e3a26ecd94df067996bdc259b7538ea017c7e4779789f31e6a49adf70
4
+ data.tar.gz: c1f363f50efb215e6b209b445c178872178dc5b93aae96cf07bd0547f8c938c0
5
5
  SHA512:
6
- metadata.gz: 3a070d3878e7823609ce007d8f53e7b2efde25a4780a1665aec50b625ae1ef6bb42efa8830d7785c783e396cac5a888b72da68e71d828eee82103594bd44fb33
7
- data.tar.gz: 5df10a59d4f6ff04bcc287cbdaa28fc35f90498c4d6a817cb40ead81efa2e69ed8acd50e751be2374a4372d82f4e23c520e28c4ea3403de4c39b9fee37087e35
6
+ metadata.gz: 0bf3bf93d7445af8e4d53fc1b4d22e08fe6d9ce3d7bf57088ee367abcef21f87b305d30d13fa8dae787fe81abd4e8e3583fcdc1565d94b06ca9bcd382a6d756f
7
+ data.tar.gz: a65fb51190305fd70ccaf392c2967ce9fffc28cd6071d1d4efb709b57182351771d253aa823b9f94064862d5ee97850a39073acd91bbfd3ae221f3b5948e9961
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -2,6 +2,7 @@ require "dorian/to_struct"
2
2
  require "bigdecimal"
3
3
  require "active_support"
4
4
  require "active_support/core_ext/string/inflections"
5
+ require "active_support/core_ext/array/wrap"
5
6
 
6
7
  class Dorian
7
8
  class Arguments
@@ -17,13 +18,7 @@ class Dorian
17
18
  DEFAULT_ALIASES = []
18
19
  DEFAULT_TYPE = BOOLEAN
19
20
 
20
- TYPES = [
21
- BOOLEAN,
22
- STRING,
23
- NUMBER,
24
- INTEGER,
25
- DECIMAL
26
- ]
21
+ TYPES = [BOOLEAN, STRING, NUMBER, INTEGER, DECIMAL]
27
22
 
28
23
  DEFAULTS = {
29
24
  BOOLEAN => "false",
@@ -41,12 +36,7 @@ class Dorian
41
36
  DECIMAL => /^[0-9.]+$/i
42
37
  }
43
38
 
44
- BOOLEANS = {
45
- "0" => false,
46
- "1" => true,
47
- "true" => true,
48
- "false" => false
49
- }
39
+ BOOLEANS = { "0" => false, "1" => true, "true" => true, "false" => false }
50
40
 
51
41
  def initialize(**definition)
52
42
  @definition = definition
@@ -62,46 +52,40 @@ class Dorian
62
52
  files = []
63
53
 
64
54
  definition.each do |key, value|
65
- if value.is_a?(Hash)
66
- type = value[:type] || DEFAULT_TYPE
67
- default = value[:default] || DEFAULTS.fetch(type)
68
- aliases = value[:alias] || value[:aliases] || DEFAULT_ALIASES
69
- else
70
- type = value
71
- default = DEFAULTS.fetch(type)
72
- aliases = DEFAULT_ALIASES
73
- end
55
+ type, default, aliases = normalize(value)
74
56
 
75
57
  keys = ([key] + aliases).map(&:to_s).map(&:parameterize)
76
58
  keys = keys.map { |key| ["--#{key}", "-#{key}"] }.flatten
77
59
 
78
60
  indexes = []
79
61
 
80
- values = arguments.map.with_index do |argument, index|
81
- if keys.include?(argument.split("=").first)
82
- indexes << index
83
-
84
- if argument.include?("=")
85
- argument.split("=", 2).last
86
- elsif arguments[index + 1].to_s =~ MATCHES.fetch(type)
87
- indexes << index + 1
88
-
89
- arguments[index + 1]
90
- elsif type == BOOLEAN
91
- "true"
92
- else
93
- default
62
+ values =
63
+ arguments
64
+ .map
65
+ .with_index do |argument, index|
66
+ if keys.include?(argument.split("=").first)
67
+ indexes << index
68
+
69
+ if argument.include?("=")
70
+ argument.split("=", 2).last
71
+ elsif arguments[index + 1].to_s =~ MATCHES.fetch(type)
72
+ indexes << index + 1
73
+
74
+ arguments[index + 1]
75
+ elsif type == BOOLEAN
76
+ "true"
77
+ else
78
+ default
79
+ end
80
+ end
94
81
  end
95
- end
96
- end.reject(&:nil?)
82
+ .reject(&:nil?)
97
83
 
98
84
  if type == BOOLEAN
99
85
  values = values.map { |value| BOOLEANS.fetch(value.downcase) }
100
86
  end
101
87
 
102
- if type == INTEGER
103
- values = values.map { |value| value.to_i }
104
- end
88
+ values = values.map { |value| value.to_i } if type == INTEGER
105
89
 
106
90
  if type == DECIMAL || type == NUMBER
107
91
  values = values.map { |value| BigDecimal(value) }
@@ -119,7 +103,46 @@ class Dorian
119
103
 
120
104
  arguments -= files
121
105
 
122
- [arguments, options.to_struct, files]
106
+ {
107
+ arguments:,
108
+ options:,
109
+ files:,
110
+ help:
111
+ }.to_deep_struct
112
+ end
113
+
114
+ def help
115
+ message = "USAGE: #{$PROGRAM_NAME}\n"
116
+
117
+ message += "\n" if definition.any?
118
+
119
+ definition.each do |key, value|
120
+ type, default, aliases = normalize(value)
121
+
122
+ keys_message = ([key] + aliases).map(&:to_s).map(&:parameterize).map do |key|
123
+ key.size == 1 ? "-#{key}" : "--#{key}"
124
+ end.join("|")
125
+
126
+ message += " #{keys_message} #{type.upcase}, default: #{default}\n"
127
+ end
128
+
129
+ message
130
+ end
131
+
132
+ def normalize(value)
133
+ if value.is_a?(Hash)
134
+ type = value[:type]&.to_s || DEFAULT_TYPE
135
+ default = value[:default]&.to_s || DEFAULTS.fetch(type)
136
+ aliases = Array.wrap(
137
+ value[:alias]&.to_s || value[:aliases]&.map(&:to_s) || DEFAULT_ALIASES
138
+ )
139
+ else
140
+ type = value.to_s
141
+ default = DEFAULTS.fetch(type)
142
+ aliases = DEFAULT_ALIASES
143
+ end
144
+
145
+ [type, default, aliases]
123
146
  end
124
147
  end
125
148
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dorian-arguments
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-19 00:00:00.000000000 Z
11
+ date: 2024-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -58,6 +58,7 @@ executables: []
58
58
  extensions: []
59
59
  extra_rdoc_files: []
60
60
  files:
61
+ - VERSION
61
62
  - lib/dorian-arguments.rb
62
63
  - lib/dorian/arguments.rb
63
64
  homepage: https://github.com/dorianmariecom/dorian-arguments