opto 1.5.3 → 1.6.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.
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