dorian-arguments 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="