dorian-arguments 1.0.1 → 1.1.1

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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/arguments +1 -1
  4. data/lib/dorian/arguments.rb +36 -20
  5. metadata +4 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31d8f3ef5198b3dc9ce418928e840ed5c82f7f3691964e4c1d34d96be9846951
4
- data.tar.gz: 7494ebf6c746f4207e21cf79846d24e59c19d3824382e70215c64aeeac8a60b7
3
+ metadata.gz: 78900d0ea10eeae177661f62aa4449052393785c8bc7a8c45581626a5d7dc594
4
+ data.tar.gz: a6964ff2d943a71b9abcd50c6975e5c07cd5fd42052f3da9ad75f2ce0c3504b8
5
5
  SHA512:
6
- metadata.gz: d32f303df1fa9814866beb211aa8ee6bd90c37d34524d9820a716d768c2230b21799fc90bb472db9c2bf810a45363891475a72d58ce2855e21eeb2d07962b727
7
- data.tar.gz: 0e12a036b21735bf712a35a9f96b328d65679f1d69185dac528de4a5eded68e1f7a3b4cbed1062c57ffd4ccf623b563a6b41a4f0bb06e7bf96798d2c78ad3112
6
+ metadata.gz: 4930286f6f79b4755900c977e038dc2bdd39fbc2bcc17f5f80c864fd09db763756bdd725ebf3ac63a974d8dcb2fd43e4b84d52b535eb5757c3715adebe255634
7
+ data.tar.gz: 25ac436b8a6cfead0a03c1e1235d755bd7fe137e4987814de909c69e0f9fb155a3726d1d4e7a955eb8914a76b3cdf80d027412d45807e23e89419033e9380863
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.1.1
data/bin/arguments CHANGED
@@ -6,7 +6,7 @@ require "dorian/arguments"
6
6
  parsed = Dorian::Arguments.parse(version: { alias: :v }, help: { alias: :h })
7
7
 
8
8
  if parsed.options.version
9
- abort File.read(File.expand_path("../../VERSION", __FILE__))
9
+ abort File.read(File.expand_path("../VERSION", __dir__))
10
10
  else
11
11
  abort parsed.help
12
12
  end
@@ -1,10 +1,7 @@
1
- require "dorian/to_struct"
1
+ # frozen_string_literal: true
2
+
2
3
  require "bigdecimal"
3
4
  require "bigdecimal/util"
4
- require "active_support"
5
- require "active_support/core_ext/string/inflections"
6
- require "active_support/core_ext/array/wrap"
7
- require "active_support/core_ext/enumerable"
8
5
 
9
6
  class Dorian
10
7
  class Arguments
@@ -17,10 +14,10 @@ class Dorian
17
14
  DECIMAL = "decimal"
18
15
 
19
16
  DEFAULT_MULTIPLE = false
20
- DEFAULT_ALIASES = []
17
+ DEFAULT_ALIASES = [].freeze
21
18
  DEFAULT_TYPE = BOOLEAN
22
19
 
23
- TYPES = [BOOLEAN, STRING, NUMBER, INTEGER, DECIMAL]
20
+ TYPES = [BOOLEAN, STRING, NUMBER, INTEGER, DECIMAL].freeze
24
21
 
25
22
  DEFAULT = nil
26
23
 
@@ -30,9 +27,9 @@ class Dorian
30
27
  NUMBER => /^[0-9.]+$/i,
31
28
  INTEGER => /^[0-9]+$/i,
32
29
  DECIMAL => /^[0-9.]+$/i
33
- }
30
+ }.freeze
34
31
 
35
- BOOLEANS = { "true" => true, "false" => false }
32
+ BOOLEANS = { "true" => true, "false" => false }.freeze
36
33
 
37
34
  def initialize(**definition)
38
35
  @definition = definition
@@ -45,12 +42,11 @@ class Dorian
45
42
  def parse
46
43
  arguments = ARGV
47
44
  options = {}
48
- files = []
49
45
 
50
46
  definition.each do |key, value|
51
47
  type, default, aliases = normalize(value)
52
48
 
53
- keys = ([key] + aliases).map(&:to_s).map(&:parameterize)
49
+ keys = ([key] + aliases).map(&:to_s).map { |key| parameterize(key) }
54
50
  keys = keys.map { |key| ["--#{key}", "-#{key}"] }.flatten
55
51
 
56
52
  indexes = []
@@ -64,8 +60,8 @@ class Dorian
64
60
 
65
61
  if argument.include?("=")
66
62
  argument.split("=", 2).last
67
- elsif arguments[index + 1].to_s =~ MATCHES.fetch(type)
68
- indexes << index + 1
63
+ elsif arguments[index + 1].to_s&.match?(MATCHES.fetch(type))
64
+ indexes << (index + 1)
69
65
 
70
66
  arguments[index + 1]
71
67
  elsif type == BOOLEAN
@@ -75,13 +71,13 @@ class Dorian
75
71
  end
76
72
  end
77
73
  end
78
- .reject(&:nil?)
74
+ .compact
79
75
 
80
76
  indexes.sort.reverse.uniq.each { |index| arguments.delete_at(index) }
81
77
 
82
78
  values = [default] if values.empty?
83
79
  values = values.map { |value| cast(type, value) }
84
- values = values.first unless values.many?
80
+ values = values.first unless many?(values)
85
81
  options[key] = values
86
82
  end
87
83
 
@@ -89,7 +85,14 @@ class Dorian
89
85
 
90
86
  arguments -= files
91
87
 
92
- { arguments:, options:, files:, help: }.to_deep_struct
88
+ options = Struct.new(*options.keys).new(*options.values)
89
+
90
+ Struct.new(:arguments, :options, :files, :help).new(
91
+ arguments,
92
+ options,
93
+ files,
94
+ help
95
+ )
93
96
  end
94
97
 
95
98
  def cast(type, value)
@@ -99,7 +102,7 @@ class Dorian
99
102
  BOOLEANS.fetch(value.downcase)
100
103
  elsif type == INTEGER
101
104
  value.to_i
102
- elsif type == DECIMAL || type == NUMBER
105
+ elsif [DECIMAL, NUMBER].include?(type)
103
106
  value.to_d
104
107
  else
105
108
  value
@@ -107,7 +110,7 @@ class Dorian
107
110
  end
108
111
 
109
112
  def help
110
- message = "USAGE: #{$PROGRAM_NAME}\n"
113
+ message = "USAGE: #{File.basename($PROGRAM_NAME)}\n"
111
114
 
112
115
  message += "\n" if definition.any?
113
116
 
@@ -117,7 +120,7 @@ class Dorian
117
120
  keys_message =
118
121
  ([key] + aliases)
119
122
  .map(&:to_s)
120
- .map(&:parameterize)
123
+ .map { |key| parameterize(key) }
121
124
  .map { |key| key.size == 1 ? "-#{key}" : "--#{key}" }
122
125
  .join("|")
123
126
 
@@ -128,12 +131,25 @@ class Dorian
128
131
  message
129
132
  end
130
133
 
134
+ def many?(array)
135
+ array.size > 1
136
+ end
137
+
138
+ def parameterize(string, separator: "-")
139
+ string
140
+ .to_s
141
+ .encode("ASCII", invalid: :replace, undef: :replace, replace: "")
142
+ .downcase
143
+ .gsub(/[^a-z0-9]+/, separator)
144
+ .gsub(/^#{separator}+|#{separator}+$/, "")
145
+ end
146
+
131
147
  def normalize(value)
132
148
  if value.is_a?(Hash)
133
149
  type = value[:type]&.to_s || DEFAULT_TYPE
134
150
  default = value[:default]&.to_s || DEFAULT
135
151
  aliases =
136
- Array.wrap(
152
+ Array(
137
153
  value[:alias]&.to_s || value[:aliases]&.map(&:to_s) ||
138
154
  DEFAULT_ALIASES
139
155
  )
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dorian-arguments
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.1
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-24 00:00:00.000000000 Z
11
+ date: 2024-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bigdecimal
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +24,6 @@ dependencies:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
26
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: dorian-to_struct
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
27
  description: parses arguments
56
28
  email: dorian@dorianmarie.com
57
29
  executables:
@@ -74,9 +46,9 @@ require_paths:
74
46
  - lib
75
47
  required_ruby_version: !ruby/object:Gem::Requirement
76
48
  requirements:
77
- - - ">="
49
+ - - '='
78
50
  - !ruby/object:Gem::Version
79
- version: '0'
51
+ version: 3.3.4
80
52
  required_rubygems_version: !ruby/object:Gem::Requirement
81
53
  requirements:
82
54
  - - ">="