opto 1.5.3 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9f0ef7542d31a0ad7e239c0cb806b8043fbf180
4
- data.tar.gz: 7c8f9cce7e8f4e72ab1e5e5a02e2b7db6ce1e2ad
3
+ metadata.gz: 622c74b8329576a787113264f93f0cc5c8341aac
4
+ data.tar.gz: 1d47bf107b35bb43ead69de0c351b6971ef096ed
5
5
  SHA512:
6
- metadata.gz: 9308afe78c8546a80374aa50001cb6c2db6b16844a0fbf34bc13965da43dce0348a6cec1ba8c383021ae84f4f7e99f7786c692d396c249fd661b4bbb0eeda9e9
7
- data.tar.gz: 99d48baecaea59a3d1cffad818fc3799c9d2c36eef1df0a6b311448cca96fc3d409220f3cf687b0d542f732311ce40e878590712faa5f986cd20d8087c03387b
6
+ metadata.gz: cb0e8e17ccd405b4b4804a2f94cc7f81897e5b6c73ddc5442d6c758c86f7df96abca6800e09216619668abb0f5ec0cf3a207649d425bc6956da01f7b31233f10
7
+ data.tar.gz: 0d53fca76c0ed5ff96fc3587d9cd1393dda7ed5a891a25bf1f1a399edb28a10ebba7f4f2ded8be94ddfa9fe7e8d143104252f409603c2e7f1470c343374e4194
data/README.md CHANGED
@@ -92,7 +92,7 @@ Simple so far. Now let's mix in "resolvers" which can fetch the value from a num
92
92
  # Generate random strings
93
93
  vault_iv:
94
94
  type: string
95
- from:
95
+ from:
96
96
  random_string:
97
97
  length: 64
98
98
  charset: ascii_printable # Other charsets include hex, hex_upcase, alphanumeric, etc.
@@ -116,7 +116,7 @@ Simple so far. Now let's mix in "resolvers" which can fetch the value from a num
116
116
  env: FOOFOO
117
117
  file: # if env is not set, try to read it from this file, returns nil if not readable
118
118
  path: /tmp/aws_secret.txt
119
- ignore_errors: true
119
+ ignore_errors: true
120
120
  random_string: 30 # not there either, generate a random string.
121
121
  ```
122
122
 
@@ -151,10 +151,10 @@ There's also rudimentary conditional support:
151
151
  ```
152
152
 
153
153
  ```ruby
154
- group.option('bar').skip?
154
+ group.option('bar').skip?
155
155
  => false
156
156
  group.option('foo').value = 'world'
157
- group.option('bar').skip?
157
+ group.option('bar').skip?
158
158
  => true
159
159
  ```
160
160
 
@@ -167,10 +167,10 @@ There's also rudimentary conditional support:
167
167
 
168
168
  ```ruby
169
169
  group.option('foo').value = 'world'
170
- group.option('bar').skip?
170
+ group.option('bar').skip?
171
171
  => false
172
172
  group.option('foo').value = 'hello'
173
- group.option('bar').skip?
173
+ group.option('bar').skip?
174
174
  => true
175
175
  ```
176
176
 
@@ -179,7 +179,7 @@ There's also rudimentary conditional support:
179
179
 
180
180
  - name: bar
181
181
  type: integer
182
- skip_if:
182
+ skip_if:
183
183
  - foo: hello # AND
184
184
  - baz: world
185
185
 
@@ -360,6 +360,19 @@ Global validations:
360
360
  }
361
361
  ```
362
362
 
363
+ ### array
364
+ ```ruby
365
+ {
366
+ split: ',', # Use this pattern to split an incoming string into an array
367
+ join: false, # Set to a pattern such as ',' to output a comma separated string
368
+ empty_is_nil: false, # When true, an empty array will become nil
369
+ sort: false, # Sort the array before output
370
+ uniq: false, # Remove duplicates before output
371
+ count: false, # Instead of outputting the array, output the array size
372
+ compact: false # Remove nils before output
373
+ }
374
+ ```
375
+
363
376
  ## Default resolvers
364
377
  Hint is the value that gets passed to the resolver when doing for example: `env: FOO` (FOO is the hint)
365
378
 
data/lib/opto.rb CHANGED
@@ -24,7 +24,7 @@ module Opto
24
24
  else
25
25
  Group.new(opts)
26
26
  end
27
- when Array
27
+ when ::Array
28
28
  if opts.all? {|o| o.kind_of?(Hash) }
29
29
  Group.new(opts)
30
30
  else
data/lib/opto/group.rb CHANGED
@@ -34,7 +34,7 @@ module Opto
34
34
  []
35
35
  when Hash
36
36
  options.first.map {|k,v| Option.new({name: k.to_s, group: self}.merge(v))}
37
- when Array
37
+ when ::Array
38
38
  options.first.map {|opt| opt.kind_of?(Opto::Option) ? opt : Option.new(opt.merge(group: self)) }
39
39
  else
40
40
  raise TypeError, "Invalid type #{options.first.class} for Opto::Group.new"
@@ -107,6 +107,34 @@ module Opto
107
107
  opt.nil? ? nil : opt.value
108
108
  end
109
109
 
110
- def_delegators :@options, *(Array.instance_methods - [:__send__, :object_id, :to_h, :to_a, :is_a?, :kind_of?, :instance_of?])
110
+ def any_true?(conditions)
111
+ normalize_ifs(conditions).any? { |s| s.call(self) == true }
112
+ end
113
+
114
+ def all_true?(conditions)
115
+ normalize_ifs(conditions).all? { |s| s.call(self) == true }
116
+ end
117
+
118
+ def normalize_ifs(ifs)
119
+ case ifs
120
+ when NilClass
121
+ []
122
+ when ::Array
123
+ ifs.map do |iff|
124
+ lambda { |grp| !grp.value_of(iff).nil? }
125
+ end
126
+ when Hash
127
+ ifs.each_with_object([]) do |(k, v), arr|
128
+ arr << lambda { |grp| grp.value_of(k.to_s) == v }
129
+ end
130
+ when String, Symbol
131
+ [lambda { |grp| !grp.value_of(ifs.to_s).nil? }]
132
+ else
133
+ raise TypeError, "Invalid syntax for conditional"
134
+ end
135
+ end
136
+
137
+
138
+ def_delegators :@options, *(::Array.instance_methods - [:__send__, :object_id, :to_h, :to_a, :is_a?, :kind_of?, :instance_of?])
111
139
  end
112
140
  end
data/lib/opto/option.rb CHANGED
@@ -10,7 +10,7 @@ if RUBY_VERSION < '2.1'
10
10
  end
11
11
 
12
12
  module Opto
13
- # What is an option? It's like a variable that has a value, which can be validated or
13
+ # What is an option? It's like a variable that has a value, which can be validated or
14
14
  # manipulated on creation. The value can be resolved from a number of origins, such as
15
15
  # an environment variable or random string generator.
16
16
  class Option
@@ -57,7 +57,7 @@ module Opto
57
57
  # description: 'Enter a name for your cat',
58
58
  # from:
59
59
  # env: 'CAT_NAME'
60
- # only_if:
60
+ # only_if:
61
61
  # pet: 'cat'
62
62
  # min_length: 2
63
63
  # max_length: 20
@@ -91,8 +91,6 @@ module Opto
91
91
  val = opts.delete(:value)
92
92
  @skip_if = opts.delete(:skip_if)
93
93
  @only_if = opts.delete(:only_if)
94
- @skip_lambdas = normalize_ifs(@skip_if)
95
- @only_lambdas = normalize_ifs(@only_if)
96
94
  @from = normalize_from_to(opts.delete(:from))
97
95
  @to = normalize_from_to(opts.delete(:to))
98
96
  @type_options = opts
@@ -149,8 +147,9 @@ module Opto
149
147
  # Returns true if this field should not be processed because of the conditionals
150
148
  # @return [Boolean]
151
149
  def skip?
152
- return true if @skip_lambdas.any? { |s| s.call(self) }
153
- return true unless @only_lambdas.all? { |s| s.call(self) }
150
+ return false if group.nil?
151
+ return true if group.any_true?(skip_if)
152
+ return true unless group.all_true?(only_if)
154
153
  false
155
154
  end
156
155
 
@@ -247,28 +246,9 @@ module Opto
247
246
  handler.errors
248
247
  end
249
248
 
250
- def normalize_ifs(ifs)
251
- case ifs
252
- when NilClass
253
- []
254
- when Array
255
- ifs.map do |iff|
256
- lambda { |opt| !opt.value_of(iff).nil? }
257
- end
258
- when Hash
259
- ifs.each_with_object([]) do |(k, v), arr|
260
- arr << lambda { |opt| opt.value_of(k.to_s) == v }
261
- end
262
- when String, Symbol
263
- [lambda { |opt| !opt.value_of(ifs.to_s).nil? }]
264
- else
265
- raise TypeError, "Invalid syntax for if"
266
- end
267
- end
268
-
269
249
  def normalize_from_to(inputs)
270
250
  case inputs
271
- when Array
251
+ when ::Array
272
252
  case inputs.first
273
253
  when String, Symbol
274
254
  inputs.each_with_object({}) { |o, hash| hash[o.to_s.snakecase.to_sym] = name }
@@ -0,0 +1,74 @@
1
+ require_relative '../type'
2
+ if RUBY_VERSION < '2.1'
3
+ using Opto::Extension::SnakeCase
4
+ using Opto::Extension::HashStringOrSymbolKey
5
+ end
6
+
7
+ module Opto
8
+ module Types
9
+ # An array
10
+ #
11
+ # Options:
12
+ # - split: an incoming string will be split using this pattern
13
+ # - join: when outputting, join the array using this pattern into a string
14
+ # - empty_is_nil: an empty array will be replaced with nil
15
+ # - sort: when true, sorts the array before output
16
+ # - uniq: when true, removes duplicates
17
+ # - compact: when true, removes nils and blanks
18
+ # - count: when true, the output is the count of items in the array
19
+ class Array < Opto::Type
20
+ using Opto::Extension::HashStringOrSymbolKey unless RUBY_VERSION < '2.1'
21
+
22
+
23
+ OPTIONS = {
24
+ split: ',',
25
+ join: false,
26
+ empty_is_nil: false,
27
+ sort: false,
28
+ uniq: false,
29
+ count: false,
30
+ compact: false
31
+ }
32
+
33
+ sanitizer :split do |value|
34
+ if value.kind_of?(::Array)
35
+ value
36
+ elsif value.kind_of?(::String)
37
+ value.split(options[:split])
38
+ else
39
+ [value]
40
+ end
41
+ end
42
+
43
+ sanitizer :sort do |value|
44
+ (value && options[:sort]) ? value.sort : value
45
+ end
46
+
47
+ sanitizer :uniq do |value|
48
+ (value && options[:uniq]) ? value.uniq : value
49
+ end
50
+
51
+ sanitizer :compact do |value|
52
+ (value && options[:compact]) ? value.compact : value
53
+ end
54
+
55
+ sanitizer :empty_is_nil do |value|
56
+ (options[:empty_is_nil] && value.empty?) ? nil : value
57
+ end
58
+
59
+ sanitizer :output do |value|
60
+ if value
61
+ if options[:join]
62
+ value.join(options[:join])
63
+ elsif options[:count]
64
+ value.size
65
+ else
66
+ value
67
+ end
68
+ else
69
+ nil
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -19,7 +19,7 @@ module Opto
19
19
  # Opto::Option.new(
20
20
  # name: 'foo',
21
21
  # type: 'enum',
22
- # options:
22
+ # options:
23
23
  # - foo
24
24
  # - bar
25
25
  # - cat
@@ -76,12 +76,12 @@ module Opto
76
76
  options.each_with_object([]) do |(key, value), array|
77
77
  array << { value: key, label: key, description: value }
78
78
  end
79
- when Array
79
+ when ::Array
80
80
  case options.first
81
81
  when Hash
82
82
  options.each do |opt|
83
83
  if opt[:value].nil? || opt[:description].nil?
84
- raise TypeError, "Option definition requires value and description and can have label when using hash syntax"
84
+ raise TypeError, "Option definition requires value and description and can have label when using hash syntax"
85
85
  end
86
86
  end
87
87
  options
data/lib/opto/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Opto
2
- VERSION = "1.5.3"
2
+ VERSION = "1.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opto
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kimmo Lehto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-09 00:00:00.000000000 Z
11
+ date: 2016-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,6 +83,7 @@ files:
83
83
  - lib/opto/setter.rb
84
84
  - lib/opto/setters/environment_variable.rb
85
85
  - lib/opto/type.rb
86
+ - lib/opto/types/array.rb
86
87
  - lib/opto/types/boolean.rb
87
88
  - lib/opto/types/enum.rb
88
89
  - lib/opto/types/integer.rb