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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/arguments +1 -1
- data/lib/dorian/arguments.rb +36 -20
- metadata +4 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78900d0ea10eeae177661f62aa4449052393785c8bc7a8c45581626a5d7dc594
|
4
|
+
data.tar.gz: a6964ff2d943a71b9abcd50c6975e5c07cd5fd42052f3da9ad75f2ce0c3504b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4930286f6f79b4755900c977e038dc2bdd39fbc2bcc17f5f80c864fd09db763756bdd725ebf3ac63a974d8dcb2fd43e4b84d52b535eb5757c3715adebe255634
|
7
|
+
data.tar.gz: 25ac436b8a6cfead0a03c1e1235d755bd7fe137e4987814de909c69e0f9fb155a3726d1d4e7a955eb8914a76b3cdf80d027412d45807e23e89419033e9380863
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
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("
|
9
|
+
abort File.read(File.expand_path("../VERSION", __dir__))
|
10
10
|
else
|
11
11
|
abort parsed.help
|
12
12
|
end
|
data/lib/dorian/arguments.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
|
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(
|
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
|
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
|
-
.
|
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
|
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
|
-
|
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
|
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(
|
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
|
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.
|
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-
|
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:
|
51
|
+
version: 3.3.4
|
80
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
53
|
requirements:
|
82
54
|
- - ">="
|