attributor 5.0.2 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +30 -0
  3. data/.travis.yml +6 -4
  4. data/CHANGELOG.md +6 -1
  5. data/Gemfile +1 -1
  6. data/Guardfile +14 -8
  7. data/Rakefile +4 -5
  8. data/attributor.gemspec +34 -29
  9. data/lib/attributor.rb +23 -29
  10. data/lib/attributor/attribute.rb +108 -127
  11. data/lib/attributor/attribute_resolver.rb +12 -26
  12. data/lib/attributor/dsl_compiler.rb +17 -21
  13. data/lib/attributor/dumpable.rb +1 -2
  14. data/lib/attributor/example_mixin.rb +5 -8
  15. data/lib/attributor/exceptions.rb +5 -6
  16. data/lib/attributor/extensions/randexp.rb +3 -5
  17. data/lib/attributor/extras/field_selector.rb +4 -4
  18. data/lib/attributor/extras/field_selector/transformer.rb +6 -7
  19. data/lib/attributor/families/numeric.rb +0 -2
  20. data/lib/attributor/families/temporal.rb +1 -4
  21. data/lib/attributor/hash_dsl_compiler.rb +22 -25
  22. data/lib/attributor/type.rb +24 -32
  23. data/lib/attributor/types/bigdecimal.rb +7 -14
  24. data/lib/attributor/types/boolean.rb +5 -8
  25. data/lib/attributor/types/class.rb +9 -10
  26. data/lib/attributor/types/collection.rb +34 -44
  27. data/lib/attributor/types/container.rb +9 -15
  28. data/lib/attributor/types/csv.rb +7 -10
  29. data/lib/attributor/types/date.rb +20 -25
  30. data/lib/attributor/types/date_time.rb +7 -14
  31. data/lib/attributor/types/float.rb +4 -6
  32. data/lib/attributor/types/hash.rb +171 -196
  33. data/lib/attributor/types/ids.rb +2 -6
  34. data/lib/attributor/types/integer.rb +12 -17
  35. data/lib/attributor/types/model.rb +39 -48
  36. data/lib/attributor/types/object.rb +2 -4
  37. data/lib/attributor/types/polymorphic.rb +118 -0
  38. data/lib/attributor/types/regexp.rb +4 -5
  39. data/lib/attributor/types/string.rb +6 -7
  40. data/lib/attributor/types/struct.rb +8 -15
  41. data/lib/attributor/types/symbol.rb +3 -6
  42. data/lib/attributor/types/tempfile.rb +5 -6
  43. data/lib/attributor/types/time.rb +11 -11
  44. data/lib/attributor/types/uri.rb +9 -10
  45. data/lib/attributor/version.rb +1 -1
  46. data/spec/attribute_resolver_spec.rb +57 -78
  47. data/spec/attribute_spec.rb +174 -216
  48. data/spec/attributor_spec.rb +11 -15
  49. data/spec/dsl_compiler_spec.rb +19 -33
  50. data/spec/dumpable_spec.rb +6 -7
  51. data/spec/extras/field_selector/field_selector_spec.rb +1 -1
  52. data/spec/families_spec.rb +1 -3
  53. data/spec/hash_dsl_compiler_spec.rb +65 -74
  54. data/spec/spec_helper.rb +9 -3
  55. data/spec/support/hashes.rb +2 -3
  56. data/spec/support/models.rb +30 -36
  57. data/spec/support/polymorphics.rb +10 -0
  58. data/spec/type_spec.rb +38 -61
  59. data/spec/types/bigdecimal_spec.rb +11 -15
  60. data/spec/types/boolean_spec.rb +12 -39
  61. data/spec/types/class_spec.rb +10 -11
  62. data/spec/types/collection_spec.rb +72 -81
  63. data/spec/types/container_spec.rb +22 -26
  64. data/spec/types/csv_spec.rb +15 -16
  65. data/spec/types/date_spec.rb +16 -33
  66. data/spec/types/date_time_spec.rb +16 -33
  67. data/spec/types/file_upload_spec.rb +1 -2
  68. data/spec/types/float_spec.rb +7 -14
  69. data/spec/types/hash_spec.rb +285 -289
  70. data/spec/types/ids_spec.rb +5 -7
  71. data/spec/types/integer_spec.rb +37 -46
  72. data/spec/types/model_spec.rb +111 -128
  73. data/spec/types/polymorphic_spec.rb +134 -0
  74. data/spec/types/regexp_spec.rb +4 -7
  75. data/spec/types/string_spec.rb +17 -21
  76. data/spec/types/struct_spec.rb +40 -47
  77. data/spec/types/tempfile_spec.rb +1 -2
  78. data/spec/types/temporal_spec.rb +9 -0
  79. data/spec/types/time_spec.rb +16 -32
  80. data/spec/types/type_spec.rb +15 -0
  81. data/spec/types/uri_spec.rb +6 -7
  82. metadata +77 -25
@@ -1,6 +1,5 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
2
2
 
3
-
4
3
  describe Attributor::Tempfile do
5
4
  it 'has specs'
6
- end
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Attributor::Temporal do
4
+ subject(:type) { Attributor::Temporal }
5
+
6
+ it 'raises an exception for native_type' do
7
+ expect { type.native_type }.to raise_error(NotImplementedError)
8
+ end
9
+ end
@@ -1,11 +1,10 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
2
2
 
3
3
  describe Attributor::Time do
4
-
5
4
  subject(:type) { Attributor::Time }
6
5
 
7
6
  it 'it is not Dumpable' do
8
- type.new.is_a?(Attributor::Dumpable).should_not be(true)
7
+ expect(type.new.is_a?(Attributor::Dumpable)).not_to be(true)
9
8
  end
10
9
 
11
10
  context '.native_type' do
@@ -17,45 +16,40 @@ describe Attributor::Time do
17
16
  end
18
17
 
19
18
  context '.dump' do
20
- let(:example) { type.example}
19
+ let(:example) { type.example }
21
20
  subject(:value) { type.dump(example) }
22
21
  it 'is formatted correctly' do
23
- value.should match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[\+-]\d{2}:\d{2}/)
22
+ expect(value).to match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[\+-]\d{2}:\d{2}/)
24
23
  end
25
24
  context 'nil values' do
26
25
  it 'should be nil' do
27
- type.dump(nil).should be_nil
26
+ expect(type.dump(nil)).to be_nil
28
27
  end
29
28
  end
30
29
  end
31
30
 
32
-
33
31
  context '.load' do
34
-
35
32
  it 'returns nil for nil' do
36
- type.load(nil).should be(nil)
33
+ expect(type.load(nil)).to be(nil)
37
34
  end
38
35
 
39
36
  context 'for incoming objects' do
40
-
41
- it "returns correct Time for DateTime objects" do
37
+ it 'returns correct Time for DateTime objects' do
42
38
  object = Time.now
43
39
  loaded = type.load(object)
44
- loaded.should be_a(::Time)
45
- loaded.to_time.should == object
40
+ expect(loaded).to be_a(::Time)
41
+ expect(loaded.to_time).to eq object
46
42
  end
47
43
 
48
- it "returns correct Time for DateTime objects" do
44
+ it 'returns correct Time for DateTime objects' do
49
45
  object = DateTime.now
50
46
  loaded = type.load(object)
51
- loaded.should be_a(::Time)
52
- loaded.should eq(object.to_time)
47
+ expect(loaded).to be_a(::Time)
48
+ expect(loaded).to eq(object.to_time)
53
49
  end
54
-
55
50
  end
56
51
 
57
52
  context 'for incoming strings' do
58
-
59
53
  [
60
54
  '2001-02-03T04:05:06+07:00',
61
55
  'Sat, 03 Feb 2001 04:05:06 GMT',
@@ -67,11 +61,9 @@ describe Attributor::Time do
67
61
  '2007-10-19T04:11:33Z',
68
62
  '2001-02-03T04:05:06+07:00.123456', # custom format with microseconds
69
63
  ].each do |value|
70
-
71
64
  it "returns correct Time for #{value.inspect}" do
72
- type.load(value).should == Time.parse(value)
65
+ expect(type.load(value)).to eq Time.parse(value)
73
66
  end
74
-
75
67
  end
76
68
 
77
69
  [
@@ -79,31 +71,23 @@ describe Attributor::Time do
79
71
  '2007-10-33T04:11:33Z',
80
72
  '2001-02-33T04:05:06+07:00.123456', # custom format with microseconds
81
73
  ].each do |value|
82
-
83
74
  it "raises Attributor::AttributorException for #{value.inspect}" do
84
- expect {
75
+ expect do
85
76
  type.load(value)
86
- }.to raise_error(Attributor::DeserializationError, /Error deserializing a String using Time/)
77
+ end.to raise_error(Attributor::DeserializationError, /Error deserializing a String using Time/)
87
78
  end
88
-
89
79
  end
90
80
 
91
81
  [
92
82
  '',
93
83
  'foobar'
94
84
  ].each do |value|
95
-
96
85
  it "raises Attributor::AttributorException for #{value.inspect}" do
97
- expect {
86
+ expect do
98
87
  type.load(value)
99
- }.to raise_error(Attributor::DeserializationError, /Error deserializing a String using Time/)
88
+ end.to raise_error(Attributor::DeserializationError, /Error deserializing a String using Time/)
100
89
  end
101
-
102
90
  end
103
-
104
91
  end
105
-
106
92
  end
107
-
108
93
  end
109
-
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Attributor::Type do
4
+ subject(:type) do
5
+ Class.new { include Attributor::Type }
6
+ end
7
+
8
+ it 'raises an error for unimplemented example' do
9
+ expect { type.example }.to raise_error(Attributor::AttributorException)
10
+ end
11
+
12
+ it 'raises an error for unimplemented valid_type?' do
13
+ expect { type.valid_type?('foo') }.to raise_error(Attributor::AttributorException)
14
+ end
15
+ end
@@ -1,11 +1,10 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
2
2
 
3
3
  describe Attributor::URI do
4
-
5
4
  subject(:type) { Attributor::URI }
6
5
 
7
6
  it 'it is not Dumpable' do
8
- type.new.is_a?(Attributor::Dumpable).should_not be(true)
7
+ expect(type.new.is_a?(Attributor::Dumpable)).not_to be(true)
9
8
  end
10
9
 
11
10
  its(:native_type) { should be ::URI::Generic }
@@ -17,7 +16,7 @@ describe Attributor::URI do
17
16
  end
18
17
 
19
18
  context '.dump' do
20
- let(:example){ type.example }
19
+ let(:example) { type.example }
21
20
  it 'uses the underlying URI to_s' do
22
21
  expect(type.dump(example)).to eq(example.to_s)
23
22
  end
@@ -65,7 +64,7 @@ describe Attributor::URI do
65
64
  end
66
65
 
67
66
  context 'when given a path option' do
68
- let(:attribute) { Attributor::Attribute.new(type, path: /^\//) }
67
+ let(:attribute) { Attributor::Attribute.new(type, path: %r{^/}) }
69
68
 
70
69
  context 'given a URI that matches the path regex' do
71
70
  it 'does not return any errors' do
@@ -89,14 +88,14 @@ describe Attributor::URI do
89
88
 
90
89
  context 'for path option' do
91
90
  context 'given a regex definition' do
92
- let(:options) { {path: Regexp.new('a-z')} }
91
+ let(:options) { { path: Regexp.new('a-z') } }
93
92
  it 'checks successfully' do
94
93
  expect(subject).to be_kind_of(Attributor::Attribute)
95
94
  end
96
95
  end
97
96
 
98
97
  context 'given any definition other than regex' do
99
- let(:options) { {path: 1} }
98
+ let(:options) { { path: 1 } }
100
99
  it 'raises an exception' do
101
100
  expect { subject }.to raise_error(Attributor::AttributorException)
102
101
  end
@@ -104,7 +103,7 @@ describe Attributor::URI do
104
103
  end
105
104
 
106
105
  context 'for any other option' do
107
- let(:options) { {something: 1} }
106
+ let(:options) { { something: 1 } }
108
107
  it 'raises an exception' do
109
108
  expect { subject }.to raise_error(Attributor::AttributorException)
110
109
  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: 5.0.2
4
+ version: 5.1.0
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: 2016-02-18 00:00:00.000000000 Z
12
+ date: 2016-08-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hashie
@@ -57,72 +57,86 @@ dependencies:
57
57
  name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "<"
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '2.99'
62
+ version: '3'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "<"
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '2.99'
69
+ version: '3'
70
70
  - !ruby/object:Gem::Dependency
71
- name: yard
71
+ name: rspec-its
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec-collection_matchers
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: 0.8.7
90
+ version: '1'
77
91
  type: :development
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: 0.8.7
97
+ version: '1'
84
98
  - !ruby/object:Gem::Dependency
85
- name: backports
99
+ name: yard
86
100
  requirement: !ruby/object:Gem::Requirement
87
101
  requirements:
88
102
  - - "~>"
89
103
  - !ruby/object:Gem::Version
90
- version: '3'
104
+ version: 0.8.7
91
105
  type: :development
92
106
  prerelease: false
93
107
  version_requirements: !ruby/object:Gem::Requirement
94
108
  requirements:
95
109
  - - "~>"
96
110
  - !ruby/object:Gem::Version
97
- version: '3'
111
+ version: 0.8.7
98
112
  - !ruby/object:Gem::Dependency
99
- name: yardstick
113
+ name: backports
100
114
  requirement: !ruby/object:Gem::Requirement
101
115
  requirements:
102
116
  - - "~>"
103
117
  - !ruby/object:Gem::Version
104
- version: '0'
118
+ version: '3'
105
119
  type: :development
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
108
122
  requirements:
109
123
  - - "~>"
110
124
  - !ruby/object:Gem::Version
111
- version: '0'
125
+ version: '3'
112
126
  - !ruby/object:Gem::Dependency
113
- name: redcarpet
127
+ name: yardstick
114
128
  requirement: !ruby/object:Gem::Requirement
115
129
  requirements:
116
- - - "<"
130
+ - - "~>"
117
131
  - !ruby/object:Gem::Version
118
- version: '3.0'
132
+ version: '0'
119
133
  type: :development
120
134
  prerelease: false
121
135
  version_requirements: !ruby/object:Gem::Requirement
122
136
  requirements:
123
- - - "<"
137
+ - - "~>"
124
138
  - !ruby/object:Gem::Version
125
- version: '3.0'
139
+ version: '0'
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: bundler
128
142
  requirement: !ruby/object:Gem::Requirement
@@ -239,16 +253,44 @@ dependencies:
239
253
  name: fuubar
240
254
  requirement: !ruby/object:Gem::Requirement
241
255
  requirements:
242
- - - "~>"
256
+ - - ">="
243
257
  - !ruby/object:Gem::Version
244
- version: '1'
258
+ version: '0'
245
259
  type: :development
246
260
  prerelease: false
247
261
  version_requirements: !ruby/object:Gem::Requirement
248
262
  requirements:
249
- - - "~>"
263
+ - - ">="
250
264
  - !ruby/object:Gem::Version
251
- version: '1'
265
+ version: '0'
266
+ - !ruby/object:Gem::Dependency
267
+ name: rubocop
268
+ requirement: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: '0'
273
+ type: :development
274
+ prerelease: false
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ - !ruby/object:Gem::Dependency
281
+ name: guard-rubocop
282
+ requirement: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ type: :development
288
+ prerelease: false
289
+ version_requirements: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
252
294
  - !ruby/object:Gem::Dependency
253
295
  name: parslet
254
296
  requirement: !ruby/object:Gem::Requirement
@@ -273,6 +315,7 @@ extra_rdoc_files: []
273
315
  files:
274
316
  - ".gitignore"
275
317
  - ".rspec"
318
+ - ".rubocop.yml"
276
319
  - ".travis.yml"
277
320
  - CHANGELOG.md
278
321
  - Gemfile
@@ -311,6 +354,7 @@ files:
311
354
  - lib/attributor/types/integer.rb
312
355
  - lib/attributor/types/model.rb
313
356
  - lib/attributor/types/object.rb
357
+ - lib/attributor/types/polymorphic.rb
314
358
  - lib/attributor/types/regexp.rb
315
359
  - lib/attributor/types/string.rb
316
360
  - lib/attributor/types/struct.rb
@@ -330,6 +374,7 @@ files:
330
374
  - spec/spec_helper.rb
331
375
  - spec/support/hashes.rb
332
376
  - spec/support/models.rb
377
+ - spec/support/polymorphics.rb
333
378
  - spec/type_spec.rb
334
379
  - spec/types/bigdecimal_spec.rb
335
380
  - spec/types/boolean_spec.rb
@@ -345,11 +390,14 @@ files:
345
390
  - spec/types/ids_spec.rb
346
391
  - spec/types/integer_spec.rb
347
392
  - spec/types/model_spec.rb
393
+ - spec/types/polymorphic_spec.rb
348
394
  - spec/types/regexp_spec.rb
349
395
  - spec/types/string_spec.rb
350
396
  - spec/types/struct_spec.rb
351
397
  - spec/types/tempfile_spec.rb
398
+ - spec/types/temporal_spec.rb
352
399
  - spec/types/time_spec.rb
400
+ - spec/types/type_spec.rb
353
401
  - spec/types/uri_spec.rb
354
402
  homepage: https://github.com/rightscale/attributor
355
403
  licenses:
@@ -371,7 +419,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
371
419
  version: '0'
372
420
  requirements: []
373
421
  rubyforge_project:
374
- rubygems_version: 2.4.5
422
+ rubygems_version: 2.5.1
375
423
  signing_key:
376
424
  specification_version: 4
377
425
  summary: A powerful attribute and type management library for Ruby
@@ -387,6 +435,7 @@ test_files:
387
435
  - spec/spec_helper.rb
388
436
  - spec/support/hashes.rb
389
437
  - spec/support/models.rb
438
+ - spec/support/polymorphics.rb
390
439
  - spec/type_spec.rb
391
440
  - spec/types/bigdecimal_spec.rb
392
441
  - spec/types/boolean_spec.rb
@@ -402,10 +451,13 @@ test_files:
402
451
  - spec/types/ids_spec.rb
403
452
  - spec/types/integer_spec.rb
404
453
  - spec/types/model_spec.rb
454
+ - spec/types/polymorphic_spec.rb
405
455
  - spec/types/regexp_spec.rb
406
456
  - spec/types/string_spec.rb
407
457
  - spec/types/struct_spec.rb
408
458
  - spec/types/tempfile_spec.rb
459
+ - spec/types/temporal_spec.rb
409
460
  - spec/types/time_spec.rb
461
+ - spec/types/type_spec.rb
410
462
  - spec/types/uri_spec.rb
411
463
  has_rdoc: