attributor 5.6 → 5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -1
- data/lib/attributor/attribute.rb +30 -0
- data/lib/attributor/version.rb +1 -1
- data/spec/attribute_spec.rb +44 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72e523c77927ca8972951fa08ca3d9171f7601053d2a6d2ead46da6a9a1e2c4b
|
4
|
+
data.tar.gz: d6e008f822dfd90cb035dfdf66fd52d9fbea8bba35f02073dd2363aa4714ec64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3404afef9afcc264b5394357c292155faa8ccf231e2f266b8e986d4234a16336a9d85b9e457d2bd16515bd01c95523460f1842dcdbde721d888dd3d80560c2b2
|
7
|
+
data.tar.gz: 65bc2b01956e42002e0b4a2e6fa54e93edd033dac3dae883225595f186b4f460823ffc82d32d5a6c9eba1a2ee7116325ca3d4af31e27f536462e6fd14fdc68fb
|
data/CHANGELOG.md
CHANGED
data/lib/attributor/attribute.rb
CHANGED
@@ -17,11 +17,25 @@ module Attributor
|
|
17
17
|
FakeParent
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
20
21
|
# It is the abstract base class to hold an attribute, both a leaf and a container (hash/Array...)
|
21
22
|
# TODO: should this be a mixin since it is an abstract class?
|
22
23
|
class Attribute
|
23
24
|
attr_reader :type, :options
|
24
25
|
|
26
|
+
@custom_options = {}
|
27
|
+
|
28
|
+
class << self
|
29
|
+
attr_accessor :custom_options
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.custom_option(name, attr_type, options = {}, &block)
|
33
|
+
if TOP_LEVEL_OPTIONS.include?(name) || INTERNAL_OPTIONS.include?(name)
|
34
|
+
raise ArgumentError, "can not define custom_option with name #{name.inspect}, it is reserved by Attributor"
|
35
|
+
end
|
36
|
+
self.custom_options[name] = Attributor::Attribute.new(attr_type, options, &block)
|
37
|
+
end
|
38
|
+
|
25
39
|
# @options: metadata about the attribute
|
26
40
|
# @block: code definition for struct attributes (nil for predefined types or leaf/simple types)
|
27
41
|
def initialize(type, options = {}, &block)
|
@@ -175,6 +189,11 @@ module Attributor
|
|
175
189
|
# TODO: not sure if that's correct (we used to get it from the described hash...
|
176
190
|
description[:example] = self.dump(example) if example
|
177
191
|
|
192
|
+
# add custom options as x-optionname
|
193
|
+
self.class.custom_options.each do |name, _|
|
194
|
+
description["x-#{name}".to_sym] = self.options[name] if self.options.key?(name)
|
195
|
+
end
|
196
|
+
|
178
197
|
description
|
179
198
|
end
|
180
199
|
|
@@ -296,6 +315,8 @@ module Attributor
|
|
296
315
|
|
297
316
|
# TODO: override in type subclass
|
298
317
|
def check_option!(name, definition)
|
318
|
+
return check_custom_option(name, definition) if self.class.custom_options.include? name
|
319
|
+
|
299
320
|
case name
|
300
321
|
when :values
|
301
322
|
raise AttributorException, "Allowed set of values requires an array. Got (#{definition})" unless definition.is_a? ::Array
|
@@ -322,5 +343,14 @@ module Attributor
|
|
322
343
|
|
323
344
|
:ok # passes
|
324
345
|
end
|
346
|
+
|
347
|
+
def check_custom_option(name, definition)
|
348
|
+
attribute = self.class.custom_options.fetch(name)
|
349
|
+
|
350
|
+
errors = attribute.validate(definition)
|
351
|
+
raise AttributorException, "Custom option #{name.inspect} is invalid: #{errors.inspect}" if errors.any?
|
352
|
+
|
353
|
+
:ok
|
354
|
+
end
|
325
355
|
end
|
326
356
|
end
|
data/lib/attributor/version.rb
CHANGED
data/spec/attribute_spec.rb
CHANGED
@@ -62,6 +62,7 @@ describe Attributor::Attribute do
|
|
62
62
|
it 'as well as the type-specific ones' do
|
63
63
|
expect(js[:type]).to eq(:integer)
|
64
64
|
end
|
65
|
+
|
65
66
|
end
|
66
67
|
|
67
68
|
end
|
@@ -194,6 +195,49 @@ describe Attributor::Attribute do
|
|
194
195
|
end.not_to raise_error
|
195
196
|
end
|
196
197
|
end
|
198
|
+
|
199
|
+
context 'custom_options' do
|
200
|
+
let(:option_name) { :foo }
|
201
|
+
let(:custom_option_args) { [option_name, String] }
|
202
|
+
|
203
|
+
around do |example|
|
204
|
+
Attributor::Attribute.custom_option *custom_option_args
|
205
|
+
example.run
|
206
|
+
Attributor::Attribute.custom_options.delete option_name
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'raises ArgumentError if given an existing option' do
|
210
|
+
expect {
|
211
|
+
Attributor::Attribute.custom_option :default, Object
|
212
|
+
}.to raise_error(ArgumentError)
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'accepts custom options' do
|
216
|
+
expect do
|
217
|
+
Attributor::Attribute.new(Integer, foo: 'unvalidated')
|
218
|
+
end.not_to raise_error
|
219
|
+
end
|
220
|
+
|
221
|
+
context 'can validate the custom option value' do
|
222
|
+
let(:custom_option_args) { [option_name, String, values: ['valid']] }
|
223
|
+
it 'does not raise with a valid option value' do
|
224
|
+
expect do
|
225
|
+
Attributor::Attribute.new(Integer, foo: 'valid')
|
226
|
+
end.not_to raise_error
|
227
|
+
end
|
228
|
+
it 'raises with an invalid option value' do
|
229
|
+
expect do
|
230
|
+
Attributor::Attribute.new(Integer, foo: 'invalid')
|
231
|
+
end.to raise_error(Attributor::AttributorException)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'appear in as_json_schema' do
|
236
|
+
attribute = Attributor::Attribute.new(Integer, foo: 'valid')
|
237
|
+
json_schema = attribute.as_json_schema
|
238
|
+
expect(json_schema[:'x-foo']).to eq 'valid'
|
239
|
+
end
|
240
|
+
end
|
197
241
|
end
|
198
242
|
|
199
243
|
context 'example' do
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attributor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '5.
|
4
|
+
version: '5.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep M. Blanquer
|
8
8
|
- Dane Jensen
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-01-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hashie
|
@@ -291,7 +291,7 @@ dependencies:
|
|
291
291
|
- - ">="
|
292
292
|
- !ruby/object:Gem::Version
|
293
293
|
version: '0'
|
294
|
-
description:
|
294
|
+
description:
|
295
295
|
email:
|
296
296
|
- blanquer@gmail.com
|
297
297
|
- dane.jensen@gmail.com
|
@@ -392,7 +392,7 @@ homepage: https://github.com/rightscale/attributor
|
|
392
392
|
licenses:
|
393
393
|
- MIT
|
394
394
|
metadata: {}
|
395
|
-
post_install_message:
|
395
|
+
post_install_message:
|
396
396
|
rdoc_options: []
|
397
397
|
require_paths:
|
398
398
|
- lib
|
@@ -408,7 +408,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
408
408
|
version: '0'
|
409
409
|
requirements: []
|
410
410
|
rubygems_version: 3.0.3
|
411
|
-
signing_key:
|
411
|
+
signing_key:
|
412
412
|
specification_version: 4
|
413
413
|
summary: A powerful attribute and type management library for Ruby
|
414
414
|
test_files:
|