attributor 4.0.0 → 4.0.1
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 +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +6 -1
- data/Rakefile +8 -0
- data/attributor.gemspec +4 -3
- data/lib/attributor.rb +4 -2
- data/lib/attributor/attribute.rb +3 -2
- data/lib/attributor/types/class.rb +56 -0
- data/lib/attributor/types/collection.rb +2 -2
- data/lib/attributor/types/hash.rb +3 -3
- data/lib/attributor/types/ids.rb +1 -1
- data/lib/attributor/types/regexp.rb +30 -0
- data/lib/attributor/types/struct.rb +3 -3
- data/lib/attributor/types/uri.rb +18 -4
- data/lib/attributor/version.rb +1 -1
- data/spec/support/models.rb +7 -0
- data/spec/types/class_spec.rb +58 -0
- data/spec/types/hash_spec.rb +2 -2
- data/spec/types/model_spec.rb +24 -0
- data/spec/types/regexp_spec.rb +28 -0
- data/spec/types/uri_spec.rb +94 -3
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcf6ceb7deb1d4db6a3370de07f1af676c4ffd27
|
4
|
+
data.tar.gz: 28e0d3d5091ab8c1663275ae4f5c2c46927cd186
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 322a5d22a2b1fcc8166c011b88fb09f4367f585e1c1fab94ef457a3132c2e0427b1a1cdf1aaeae67d5c653c813d4a11212f8f2be77250cab15e1bed711981cf4
|
7
|
+
data.tar.gz: 83e5bee88b8119a4af387a767ba8a64580cbc79feb72cd7fe3870be707c2a7fb9d78a91ddcc0227a6b05c549980851b5a863b05c47862c312e9cd35b9fb1b075
|
data/CHANGELOG.md
CHANGED
data/Rakefile
CHANGED
@@ -14,6 +14,14 @@ RSpec::Core::RakeTask.new do |spec|
|
|
14
14
|
spec.pattern = FileList['spec/**/*_spec.rb']
|
15
15
|
end
|
16
16
|
|
17
|
+
desc "console"
|
18
|
+
task :console do
|
19
|
+
require 'bundler'
|
20
|
+
Bundler.require(:default, :development, :test)
|
21
|
+
require_relative 'lib/attributor'
|
22
|
+
pry
|
23
|
+
end
|
24
|
+
|
17
25
|
task :default => :spec
|
18
26
|
|
19
27
|
require 'yard'
|
data/attributor.gemspec
CHANGED
@@ -10,17 +10,18 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ["Josep M. Blanquer","Dane Jensen"]
|
11
11
|
spec.summary = "A powerful attribute and type management library for Ruby"
|
12
12
|
spec.email = ["blanquer@gmail.com","dane.jensen@gmail.com"]
|
13
|
-
|
13
|
+
|
14
14
|
spec.homepage = "https://github.com/rightscale/attributor"
|
15
15
|
spec.license = "MIT"
|
16
16
|
spec.required_ruby_version = ">=2.1"
|
17
|
-
|
17
|
+
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
spec.files = `git ls-files -z`.split("\x0")
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
-
|
21
|
+
|
22
22
|
spec.add_runtime_dependency(%q<hashie>, ["~> 3"])
|
23
23
|
spec.add_runtime_dependency(%q<randexp>, ["~> 0"])
|
24
|
+
spec.add_runtime_dependency(%q<activesupport>, ['>= 3'])
|
24
25
|
spec.add_development_dependency(%q<rspec>, ["< 2.99"])
|
25
26
|
spec.add_development_dependency(%q<yard>, ["~> 0.8.7"])
|
26
27
|
spec.add_development_dependency(%q<backports>, ["~> 3"])
|
data/lib/attributor.rb
CHANGED
@@ -45,7 +45,7 @@ module Attributor
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def self.type_name(type)
|
48
|
-
return self.type_name(type.class) unless type.kind_of?(Class)
|
48
|
+
return self.type_name(type.class) unless type.kind_of?(::Class)
|
49
49
|
|
50
50
|
type.ancestors.find { |k| k.name && !k.name.empty? }.name
|
51
51
|
end
|
@@ -75,7 +75,7 @@ module Attributor
|
|
75
75
|
end
|
76
76
|
|
77
77
|
MODULE_PREFIX = "Attributor\:\:".freeze
|
78
|
-
MODULE_PREFIX_REGEX = Regexp.new(MODULE_PREFIX)
|
78
|
+
MODULE_PREFIX_REGEX = ::Regexp.new(MODULE_PREFIX)
|
79
79
|
|
80
80
|
require_relative 'attributor/families/numeric'
|
81
81
|
require_relative 'attributor/families/temporal'
|
@@ -91,11 +91,13 @@ module Attributor
|
|
91
91
|
require_relative 'attributor/types/time'
|
92
92
|
require_relative 'attributor/types/date'
|
93
93
|
require_relative 'attributor/types/date_time'
|
94
|
+
require_relative 'attributor/types/regexp'
|
94
95
|
require_relative 'attributor/types/float'
|
95
96
|
require_relative 'attributor/types/collection'
|
96
97
|
require_relative 'attributor/types/hash'
|
97
98
|
require_relative 'attributor/types/model'
|
98
99
|
require_relative 'attributor/types/struct'
|
100
|
+
require_relative 'attributor/types/class'
|
99
101
|
|
100
102
|
|
101
103
|
require_relative 'attributor/types/csv'
|
data/lib/attributor/attribute.rb
CHANGED
@@ -67,7 +67,7 @@ module Attributor
|
|
67
67
|
defined_val.call
|
68
68
|
end
|
69
69
|
else
|
70
|
-
|
70
|
+
defined_val
|
71
71
|
end
|
72
72
|
value = val #Need to load?
|
73
73
|
end
|
@@ -124,7 +124,7 @@ module Attributor
|
|
124
124
|
description[:type] = self.type.describe(shallow, example: example )
|
125
125
|
# Move over any example from the type, into the attribute itself
|
126
126
|
if ( ex = description[:type].delete(:example) )
|
127
|
-
description[:example] = self.dump(
|
127
|
+
description[:example] = self.dump(ex)
|
128
128
|
end
|
129
129
|
|
130
130
|
description
|
@@ -286,6 +286,7 @@ module Attributor
|
|
286
286
|
raise AttributorException.new("Allowed set of values requires an array. Got (#{definition})") unless definition.is_a? ::Array
|
287
287
|
when :default
|
288
288
|
raise AttributorException.new("Default value doesn't have the correct attribute type. Got (#{definition.inspect})") unless self.type.valid_type?(definition) || definition.kind_of?(Proc)
|
289
|
+
self.options[:default] = self.load(definition) unless definition.kind_of?(Proc)
|
289
290
|
when :description
|
290
291
|
raise AttributorException.new("Description value must be a string. Got (#{definition})") unless definition.is_a? ::String
|
291
292
|
when :required
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
require_relative '../exceptions'
|
4
|
+
|
5
|
+
|
6
|
+
module Attributor
|
7
|
+
class Class
|
8
|
+
include Type
|
9
|
+
|
10
|
+
def self.native_type
|
11
|
+
return ::Class
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.load(value, context=Attributor::DEFAULT_ROOT_CONTEXT, **options)
|
15
|
+
return @klass || nil if value.nil?
|
16
|
+
|
17
|
+
# Must be given a String object or nil
|
18
|
+
unless value.kind_of?(::String) || value.nil?
|
19
|
+
raise IncompatibleTypeError, context: context, value_type: value.class, type: self
|
20
|
+
end
|
21
|
+
|
22
|
+
value = "::" + value if value[0..1] != '::'
|
23
|
+
result = value.constantize
|
24
|
+
|
25
|
+
# Class given must match class specified when type created using .of() method
|
26
|
+
unless @klass.nil? || result == @klass
|
27
|
+
raise LoadError, "Error loading class #{value} for attribute with " +
|
28
|
+
"defined class #{@klass} while loading #{Attributor.humanize_context(context)}."
|
29
|
+
end
|
30
|
+
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.example(context=nil, options:{})
|
35
|
+
@klass.nil? ? "MyClass" : @klass.name
|
36
|
+
end
|
37
|
+
|
38
|
+
# Create a Class attribute type of a specific Class.
|
39
|
+
#
|
40
|
+
# @param klass [Class] optional, defines the class of this attribute, if constant
|
41
|
+
#
|
42
|
+
# @return anonymous class with specified type of collection members
|
43
|
+
#
|
44
|
+
# @example Class.of(Factory)
|
45
|
+
#
|
46
|
+
def self.of(klass)
|
47
|
+
::Class.new(self) do
|
48
|
+
@klass = klass
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.family
|
53
|
+
'string'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -16,7 +16,7 @@ module Attributor
|
|
16
16
|
unless resolved_type.ancestors.include?(Attributor::Type)
|
17
17
|
raise Attributor::AttributorException.new("Collections can only have members that are Attributor::Types")
|
18
18
|
end
|
19
|
-
Class.new(self) do
|
19
|
+
::Class.new(self) do
|
20
20
|
@member_type = resolved_type
|
21
21
|
end
|
22
22
|
end
|
@@ -53,7 +53,7 @@ module Attributor
|
|
53
53
|
def self.member_attribute
|
54
54
|
@member_attribute ||= begin
|
55
55
|
self.construct(nil,{})
|
56
|
-
|
56
|
+
|
57
57
|
@member_attribute
|
58
58
|
end
|
59
59
|
end
|
@@ -129,7 +129,7 @@ module Attributor
|
|
129
129
|
|
130
130
|
# @example Hash.of(key: String, value: Integer)
|
131
131
|
def self.of(key: @key_type, value: @value_type)
|
132
|
-
Class.new(self) do
|
132
|
+
::Class.new(self) do
|
133
133
|
self.key_type = key
|
134
134
|
self.value_type = value
|
135
135
|
@keys = {}
|
@@ -164,8 +164,8 @@ module Attributor
|
|
164
164
|
example_depth = context.size
|
165
165
|
|
166
166
|
self.keys.each do |sub_attribute_name, sub_attribute|
|
167
|
-
|
168
|
-
|
167
|
+
|
168
|
+
|
169
169
|
if sub_attribute.attributes
|
170
170
|
# TODO: add option to raise an exception in this case?
|
171
171
|
next if example_depth > MAX_EXAMPLE_DEPTH
|
data/lib/attributor/types/ids.rb
CHANGED
@@ -12,7 +12,7 @@ module Attributor
|
|
12
12
|
raise AttributorException, "#{type.name} does not have attribute with name '#{identity_name}'"
|
13
13
|
end
|
14
14
|
|
15
|
-
Class.new(self) do
|
15
|
+
::Class.new(self) do
|
16
16
|
@member_attribute = identity_attribute
|
17
17
|
@member_type = identity_attribute.type
|
18
18
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../exceptions'
|
2
|
+
|
3
|
+
module Attributor
|
4
|
+
class Regexp
|
5
|
+
include Type
|
6
|
+
|
7
|
+
def self.native_type
|
8
|
+
return ::Regexp
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load(value, context=Attributor::DEFAULT_ROOT_CONTEXT, **options)
|
12
|
+
unless value.kind_of?(::String) || value.nil?
|
13
|
+
raise IncompatibleTypeError, context: context, value_type: value.class, type: self
|
14
|
+
end
|
15
|
+
|
16
|
+
value && ::Regexp.new(value)
|
17
|
+
rescue
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.example(context=nil, options:{})
|
22
|
+
::Regexp.new(/^pattern\d{0,3}$/).to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.family
|
26
|
+
'string'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
module Attributor
|
3
3
|
class Struct < Attributor::Model
|
4
|
-
|
5
|
-
def self.constructable?
|
4
|
+
|
5
|
+
def self.constructable?
|
6
6
|
true
|
7
7
|
end
|
8
8
|
|
@@ -26,7 +26,7 @@ module Attributor
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
Class.new(self) do
|
29
|
+
::Class.new(self) do
|
30
30
|
attributes options, &attribute_definition
|
31
31
|
end
|
32
32
|
|
data/lib/attributor/types/uri.rb
CHANGED
@@ -39,12 +39,26 @@ module Attributor
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.validate(value,context=Attributor::DEFAULT_ROOT_CONTEXT,attribute)
|
42
|
-
[]
|
42
|
+
errors = []
|
43
|
+
|
44
|
+
if attribute && (definition = attribute.options[:path])
|
45
|
+
unless value.path =~ attribute.options[:path]
|
46
|
+
errors << "#{Attributor.humanize_context(context)} value (#{value}) does not match path (#{definition.inspect})"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
errors
|
43
50
|
end
|
44
51
|
|
45
|
-
def check_option!(name, definition)
|
46
|
-
|
47
|
-
:
|
52
|
+
def self.check_option!(name, definition)
|
53
|
+
case name
|
54
|
+
when :path
|
55
|
+
unless definition.is_a? ::Regexp
|
56
|
+
raise AttributorException.new("Value for option :path is not a Regexp object. Got (#{definition.inspect})")
|
57
|
+
end
|
58
|
+
:ok
|
59
|
+
else
|
60
|
+
:unknown
|
61
|
+
end
|
48
62
|
end
|
49
63
|
|
50
64
|
end
|
data/lib/attributor/version.rb
CHANGED
data/spec/support/models.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
2
|
+
require 'backports'
|
3
|
+
|
4
|
+
describe Attributor::Class do
|
5
|
+
|
6
|
+
subject(:type) { Attributor::Class }
|
7
|
+
|
8
|
+
its(:native_type) { should be(::Class) }
|
9
|
+
its(:family) { should == 'string' }
|
10
|
+
|
11
|
+
context '.example' do
|
12
|
+
its(:example) { should be_a(::String) }
|
13
|
+
|
14
|
+
context 'when created using .of method' do
|
15
|
+
let(:klass) { Integer }
|
16
|
+
subject(:type) { Attributor::Class.of(klass) }
|
17
|
+
|
18
|
+
its(:example) { should eq(klass.to_s) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context '.load' do
|
23
|
+
let(:value) { nil }
|
24
|
+
|
25
|
+
context 'for incoming String values' do
|
26
|
+
['Object', '::Object', '::Hash', 'Attributor::Struct'].each do |value|
|
27
|
+
it "loads '#{value}' as #{eval(value)}" do
|
28
|
+
type.load(value).should eq(value.constantize)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when created using .of method' do
|
34
|
+
let(:klass) { Integer }
|
35
|
+
subject(:type) { Attributor::Class.of(klass) }
|
36
|
+
|
37
|
+
it "loads 'Integer' as Integer" do
|
38
|
+
type.load('Integer').should eq(Integer)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns specified class for nil" do
|
42
|
+
type.load(nil).should be(klass)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises when given a class that doesn't match specified class" do
|
46
|
+
expect { type.load('Float') }.to raise_exception(Attributor::LoadError)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns nil for nil' do
|
51
|
+
type.load(nil).should be(nil)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'raises when given a non-String' do
|
55
|
+
expect {type.load(1)}.to raise_exception(Attributor::IncompatibleTypeError)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/spec/types/hash_spec.rb
CHANGED
@@ -564,8 +564,8 @@ context 'attributes' do
|
|
564
564
|
description[:attributes].keys.should =~ type.keys.keys
|
565
565
|
description[:attributes].each do |name,sub_description|
|
566
566
|
sub_description.should have_key(:example)
|
567
|
-
val = type.attributes[name].dump(
|
568
|
-
sub_description[:example].should eq
|
567
|
+
val = type.attributes[name].dump(example[name])
|
568
|
+
sub_description[:example].should eq val
|
569
569
|
end
|
570
570
|
end
|
571
571
|
end
|
data/spec/types/model_spec.rb
CHANGED
@@ -242,6 +242,30 @@ describe Attributor::Model do
|
|
242
242
|
#raise_error(Attributor::AttributorException, /Unknown attributes.*#{context.join('.')}/)
|
243
243
|
end
|
244
244
|
end
|
245
|
+
|
246
|
+
context 'loading with default values' do
|
247
|
+
let(:reference) { Post }
|
248
|
+
let(:options) { {reference: reference} }
|
249
|
+
|
250
|
+
let(:attribute_definition) do
|
251
|
+
proc do
|
252
|
+
attribute :title
|
253
|
+
attribute :tags, default: ['stuff', 'things']
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
let(:struct) { Attributor::Struct.construct(attribute_definition, options)}
|
258
|
+
|
259
|
+
let(:data) { {title: 'my post'} }
|
260
|
+
|
261
|
+
subject(:loaded) { struct.load(data) }
|
262
|
+
|
263
|
+
|
264
|
+
it 'validates' do
|
265
|
+
expect(loaded.validate).to be_empty
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
245
269
|
end
|
246
270
|
|
247
271
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
2
|
+
|
3
|
+
describe Attributor::Regexp do
|
4
|
+
|
5
|
+
subject(:type) { Attributor::Regexp }
|
6
|
+
|
7
|
+
its(:native_type) { should be(::Regexp) }
|
8
|
+
its(:example) { should be_a(::String) }
|
9
|
+
its(:family) { should == 'string' }
|
10
|
+
|
11
|
+
context '.load' do
|
12
|
+
let(:value) { nil }
|
13
|
+
|
14
|
+
it 'returns nil for nil' do
|
15
|
+
type.load(nil).should be(nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'for incoming String values' do
|
19
|
+
|
20
|
+
{ 'foo' => /foo/, '^pattern$' => /^pattern$/ }.each do |value, expected|
|
21
|
+
it "loads '#{value}' as #{expected.inspect}" do
|
22
|
+
type.load(value).should eq(expected)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/types/uri_spec.rb
CHANGED
@@ -1,12 +1,103 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
2
|
+
|
1
3
|
describe Attributor::URI do
|
2
4
|
|
3
5
|
subject(:type) { Attributor::URI }
|
4
6
|
|
5
7
|
its(:native_type) { should be ::URI::Generic }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
context '.example' do
|
10
|
+
it 'returns a valid URI' do
|
11
|
+
expect(type.example).to be_kind_of(URI)
|
12
|
+
end
|
10
13
|
end
|
11
14
|
|
15
|
+
context '.load' do
|
16
|
+
subject(:load) { type.load(value) }
|
17
|
+
|
18
|
+
context 'given a nil' do
|
19
|
+
let(:value) { nil }
|
20
|
+
it 'returns a nil' do
|
21
|
+
expect(subject).to be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'given a string' do
|
26
|
+
let(:value) { 'string' }
|
27
|
+
it 'returns a URI object' do
|
28
|
+
expect(subject).to be_kind_of(URI)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'given a URI object' do
|
33
|
+
let(:value) { URI.parse('string') }
|
34
|
+
it 'returns itself' do
|
35
|
+
expect(subject).to eq(value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'given a value not its native_type' do
|
40
|
+
let(:value) { Class.new }
|
41
|
+
it 'raises an error' do
|
42
|
+
expect { subject }.to raise_error(Attributor::CoercionError)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context '.validate' do
|
48
|
+
let(:uri) { URI.parse('http://www.example.com/something/foo') }
|
49
|
+
let(:attribute) { nil }
|
50
|
+
subject(:validate) { type.validate(uri, ['root'], attribute) }
|
51
|
+
|
52
|
+
context 'when given a valid URI' do
|
53
|
+
it 'does not return any errors' do
|
54
|
+
expect(subject).to be_empty
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when given a path option' do
|
58
|
+
let(:attribute) { Attributor::Attribute.new(type, path: /^\//) }
|
59
|
+
|
60
|
+
context 'given a URI that matches the path regex' do
|
61
|
+
it 'does not return any errors' do
|
62
|
+
expect(subject).to be_empty
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'given a URI that does not match the path regex' do
|
67
|
+
let(:uri) { URI.parse('www.example.com/something/foo') }
|
68
|
+
it 'returns an errors array' do
|
69
|
+
expect(subject).to_not be_empty
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context '.check_option!' do
|
77
|
+
let(:options) { {} }
|
78
|
+
subject(:attribute) { Attributor::Attribute.new(type, options) }
|
79
|
+
|
80
|
+
context 'for path option' do
|
81
|
+
context 'given a regex definition' do
|
82
|
+
let(:options) { {path: Regexp.new('a-z')} }
|
83
|
+
it 'checks successfully' do
|
84
|
+
expect(subject).to be_kind_of(Attributor::Attribute)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'given any definition other than regex' do
|
89
|
+
let(:options) { {path: 1} }
|
90
|
+
it 'raises an exception' do
|
91
|
+
expect { subject }.to raise_error(Attributor::AttributorException)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'for any other option' do
|
97
|
+
let(:options) { {something: 1} }
|
98
|
+
it 'raises an exception' do
|
99
|
+
expect { subject }.to raise_error(Attributor::AttributorException)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
12
103
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attributor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep M. Blanquer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hashie
|
@@ -39,6 +39,20 @@ dependencies:
|
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: activesupport
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '3'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '3'
|
42
56
|
- !ruby/object:Gem::Dependency
|
43
57
|
name: rspec
|
44
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -265,6 +279,7 @@ files:
|
|
265
279
|
- lib/attributor/type.rb
|
266
280
|
- lib/attributor/types/bigdecimal.rb
|
267
281
|
- lib/attributor/types/boolean.rb
|
282
|
+
- lib/attributor/types/class.rb
|
268
283
|
- lib/attributor/types/collection.rb
|
269
284
|
- lib/attributor/types/container.rb
|
270
285
|
- lib/attributor/types/csv.rb
|
@@ -277,6 +292,7 @@ files:
|
|
277
292
|
- lib/attributor/types/integer.rb
|
278
293
|
- lib/attributor/types/model.rb
|
279
294
|
- lib/attributor/types/object.rb
|
295
|
+
- lib/attributor/types/regexp.rb
|
280
296
|
- lib/attributor/types/string.rb
|
281
297
|
- lib/attributor/types/struct.rb
|
282
298
|
- lib/attributor/types/symbol.rb
|
@@ -295,6 +311,7 @@ files:
|
|
295
311
|
- spec/type_spec.rb
|
296
312
|
- spec/types/bigdecimal_spec.rb
|
297
313
|
- spec/types/boolean_spec.rb
|
314
|
+
- spec/types/class_spec.rb
|
298
315
|
- spec/types/collection_spec.rb
|
299
316
|
- spec/types/container_spec.rb
|
300
317
|
- spec/types/csv_spec.rb
|
@@ -306,6 +323,7 @@ files:
|
|
306
323
|
- spec/types/ids_spec.rb
|
307
324
|
- spec/types/integer_spec.rb
|
308
325
|
- spec/types/model_spec.rb
|
326
|
+
- spec/types/regexp_spec.rb
|
309
327
|
- spec/types/string_spec.rb
|
310
328
|
- spec/types/struct_spec.rb
|
311
329
|
- spec/types/tempfile_spec.rb
|
@@ -347,6 +365,7 @@ test_files:
|
|
347
365
|
- spec/type_spec.rb
|
348
366
|
- spec/types/bigdecimal_spec.rb
|
349
367
|
- spec/types/boolean_spec.rb
|
368
|
+
- spec/types/class_spec.rb
|
350
369
|
- spec/types/collection_spec.rb
|
351
370
|
- spec/types/container_spec.rb
|
352
371
|
- spec/types/csv_spec.rb
|
@@ -358,6 +377,7 @@ test_files:
|
|
358
377
|
- spec/types/ids_spec.rb
|
359
378
|
- spec/types/integer_spec.rb
|
360
379
|
- spec/types/model_spec.rb
|
380
|
+
- spec/types/regexp_spec.rb
|
361
381
|
- spec/types/string_spec.rb
|
362
382
|
- spec/types/struct_spec.rb
|
363
383
|
- spec/types/tempfile_spec.rb
|