id 0.0.12 → 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/Gemfile +0 -3
- data/Gemfile.lock +25 -10
- data/LICENSE.md +1 -1
- data/README.md +173 -35
- data/id.gemspec +8 -3
- data/lib/id.rb +21 -15
- data/lib/id/active_model.rb +30 -0
- data/lib/id/association.rb +26 -0
- data/lib/id/boolean.rb +8 -0
- data/lib/id/coercion.rb +38 -0
- data/lib/id/eta_expansion.rb +5 -0
- data/lib/id/field.rb +46 -0
- data/lib/id/field/definition.rb +44 -0
- data/lib/id/field/summary.rb +35 -0
- data/lib/id/form.rb +41 -13
- data/lib/id/form_backwards_compatibility.rb +6 -0
- data/lib/id/hashifier.rb +13 -24
- data/lib/id/model.rb +29 -25
- data/lib/id/timestamps.rb +15 -15
- data/lib/id/validations.rb +8 -0
- data/spec/examples/cat_spec.rb +37 -0
- data/spec/lib/id/active_model_spec.rb +40 -0
- data/spec/lib/id/association_spec.rb +73 -0
- data/spec/lib/id/boolean_spec.rb +38 -0
- data/spec/lib/id/coercion_spec.rb +53 -0
- data/spec/lib/id/eta_expansion_spec.rb +13 -0
- data/spec/lib/id/field/definition_spec.rb +37 -0
- data/spec/lib/id/field/summary_spec.rb +26 -0
- data/spec/lib/id/field_spec.rb +62 -0
- data/spec/lib/id/form_spec.rb +84 -0
- data/spec/lib/id/hashifier_spec.rb +19 -0
- data/spec/lib/id/model_spec.rb +30 -180
- data/spec/lib/id/timestamps_spec.rb +22 -20
- data/spec/lib/id/validations_spec.rb +18 -0
- data/spec/spec_helper.rb +11 -5
- data/spec/support/dummy_rails_form_builder.rb +9 -0
- metadata +84 -26
- data/lib/id/form/active_model_form.rb +0 -41
- data/lib/id/form/descriptor.rb +0 -27
- data/lib/id/form/field_form.rb +0 -14
- data/lib/id/form/field_with_form_support.rb +0 -12
- data/lib/id/missing_attribute_error.rb +0 -4
- data/lib/id/model/association.rb +0 -49
- data/lib/id/model/definer.rb +0 -23
- data/lib/id/model/descriptor.rb +0 -23
- data/lib/id/model/field.rb +0 -61
- data/lib/id/model/has_many.rb +0 -11
- data/lib/id/model/has_one.rb +0 -17
- data/lib/id/model/type_casts.rb +0 -96
- data/spec/lib/id/model/association_spec.rb +0 -27
- data/spec/lib/id/model/field_spec.rb +0 -0
- data/spec/lib/id/model/form_spec.rb +0 -56
- data/spec/lib/id/model/type_casts_spec.rb +0 -44
- data/spec/lib/mike_spec.rb +0 -20
data/spec/lib/id/model_spec.rb
CHANGED
@@ -1,196 +1,46 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'date'
|
3
|
-
|
4
|
-
class OptionalModel
|
5
|
-
include Id::Model
|
6
|
-
field :buzz
|
7
|
-
end
|
8
|
-
|
9
|
-
class NestedModel
|
10
|
-
include Id::Model
|
11
|
-
field :yak
|
12
|
-
end
|
13
|
-
|
14
|
-
class TestModel
|
15
|
-
include Id::Model
|
16
|
-
|
17
|
-
field :foo
|
18
|
-
field :bar, :key => 'baz'
|
19
|
-
field :baz
|
20
|
-
field :qux, :optional => true
|
21
|
-
field :quux, :default => false
|
22
|
-
field :date_of_birth, :optional => true, :type => Date
|
23
|
-
field :empty_date, :optional => true, :type => Date
|
24
|
-
field :christmas, :default => Date.new(2014,12,25), :type => Date
|
25
|
-
field :quxx, :optional => true
|
26
|
-
|
27
|
-
has_one :aliased_model, :type => NestedModel
|
28
|
-
has_one :nested_model, :key => 'aliased_model'
|
29
|
-
has_one :extra_nested_model
|
30
|
-
has_one :test_model
|
31
|
-
has_one :optional_model, :optional => true
|
32
|
-
has_many :nested_models
|
33
|
-
|
34
|
-
class ExtraNestedModel
|
35
|
-
include Id::Model
|
36
|
-
field :cats
|
37
|
-
end
|
38
|
-
end
|
39
2
|
|
40
3
|
describe Id::Model do
|
41
|
-
let (:model) { TestModel.new(:foo => 3,
|
42
|
-
:baz => 6,
|
43
|
-
:quxx => 8,
|
44
|
-
:test_model => {},
|
45
|
-
:date_of_birth => '06-06-1983',
|
46
|
-
:optional_model => { 'yak' => 11},
|
47
|
-
:aliased_model => { 'yak' => 11},
|
48
|
-
:nested_models => [{ 'yak' => 11}, { :yak => 14 }],
|
49
|
-
:extra_nested_model => { :cats => "MIAOW" }) }
|
50
|
-
|
51
|
-
|
52
|
-
describe ".new" do
|
53
|
-
it 'converts any passed id models to their hash representations' do
|
54
|
-
new_model = TestModel.new(:test_model => model)
|
55
|
-
new_model.test_model.data.should eq model.data
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe ".field" do
|
60
|
-
it 'defines an accessor on the model' do
|
61
|
-
model.foo.should eq 3
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'allows key aliases' do
|
65
|
-
model.bar.should eq 6
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'allows default values' do
|
69
|
-
model.quux.should be_false
|
70
|
-
end
|
71
4
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
expect(model.qux).to eq None
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
context 'when field is in hash' do
|
80
|
-
it 'is Some' do
|
81
|
-
expect(model.quxx).to eq Some[8]
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe "typecast option" do
|
88
|
-
it 'typecasts to the provided type if a cast exists' do
|
89
|
-
model.date_of_birth.should be_some Date
|
90
|
-
model.christmas.should be_a Date
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'should work for empty optional fields' do
|
94
|
-
model.empty_date.should be_none
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
describe ".has_one" do
|
101
|
-
it "allows nested models" do
|
102
|
-
model.aliased_model.should be_a NestedModel
|
103
|
-
end
|
104
|
-
it "allows nested models" do
|
105
|
-
model.nested_model.should be_a NestedModel
|
106
|
-
model.nested_model.yak.should eq 11
|
107
|
-
end
|
108
|
-
it "allows associations to be nested within the class" do
|
109
|
-
model.extra_nested_model.should be_a TestModel::ExtraNestedModel
|
110
|
-
model.extra_nested_model.cats.should eq 'MIAOW'
|
111
|
-
end
|
112
|
-
it "allows recursively defined models" do
|
113
|
-
model.test_model.should be_a TestModel
|
114
|
-
end
|
115
|
-
|
116
|
-
it "allows optional models" do
|
117
|
-
model.optional_model.should be_some
|
118
|
-
end
|
119
|
-
|
120
|
-
it "allows optional models with correct values" do
|
121
|
-
model.optional_model.should eq Some[OptionalModel.new(:yak => 11)]
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe ".has_many" do
|
126
|
-
it 'creates an array of nested models' do
|
127
|
-
model.nested_models.should be_a Array
|
128
|
-
model.nested_models.first.should be_a NestedModel
|
129
|
-
model.nested_models.first.yak.should eq 11
|
130
|
-
model.nested_models.last.yak.should eq 14
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
describe "#set" do
|
135
|
-
it "creates a new model with the provided values changed" do
|
136
|
-
model.set(:foo => 999).should be_a TestModel
|
137
|
-
model.set(:foo => 999).foo.should eq 999
|
138
|
-
end
|
5
|
+
it 'is used by including the module' do
|
6
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
7
|
+
expect(c.cats).to eq 3
|
139
8
|
end
|
140
9
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
expect { model.unset(:not_in_hash) }.to_not raise_error
|
148
|
-
end
|
10
|
+
it 'can have fields set on it after creation - creating a new instance' do
|
11
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
12
|
+
expect(c.cats).to eq 3
|
13
|
+
d = c.set(cats: 4)
|
14
|
+
expect(c.cats).to eq 3
|
15
|
+
expect(d.cats).to eq 4
|
149
16
|
end
|
150
17
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
end
|
18
|
+
it 'can have fields removed from it after creation - creating a new instance' do
|
19
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
20
|
+
expect(c.cats).to eq 3
|
21
|
+
d = c.unset(:cats)
|
22
|
+
expect(c.cats).to eq 3
|
23
|
+
expect { d.cats }.to raise_error Id::MissingAttributeError
|
158
24
|
end
|
159
25
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
one.should eq two
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'is not equal to two models with different data' do
|
168
|
-
one = TestModel.new(:foo => 1)
|
169
|
-
two = TestModel.new(:foo => 2)
|
170
|
-
one.should_not eq two
|
171
|
-
end
|
26
|
+
it 'is equal to models with the same data' do
|
27
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
28
|
+
d = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
29
|
+
expect(c).to eq d
|
172
30
|
end
|
173
31
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
hash = { one => :found }
|
179
|
-
hash[two].should eq :found
|
180
|
-
end
|
181
|
-
it 'they are different keys if the data is different' do
|
182
|
-
one = TestModel.new(:foo => 1)
|
183
|
-
two = TestModel.new(:foo => 2)
|
184
|
-
hash = { one => :found }
|
185
|
-
hash[two].should be_nil
|
186
|
-
hash[one].should eq :found
|
187
|
-
end
|
32
|
+
it 'is not equal to models with different data' do
|
33
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
34
|
+
d = Class.new { include Id::Model ; field :cats }.new(cats: 4)
|
35
|
+
expect(c).not_to eq d
|
188
36
|
end
|
189
37
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
38
|
+
it 'can be used as keys in a hash' do
|
39
|
+
c = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
40
|
+
d = Class.new { include Id::Model ; field :cats }.new(cats: 3)
|
41
|
+
e = Class.new { include Id::Model ; field :cats }.new(cats: 4)
|
42
|
+
hash = { c => 10, e => 12 }
|
43
|
+
expect(hash[d]).to eq 10
|
44
|
+
expect(hash[e]).to eq 12
|
194
45
|
end
|
195
|
-
|
196
46
|
end
|
@@ -1,31 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
include Id::Model
|
5
|
-
include Id::Timestamps
|
3
|
+
describe Id::Timestamps do
|
4
|
+
let (:c) { Class.new { include Id::Model; include Id::Timestamps; field :foo } }
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
end
|
6
|
+
let (:created) { Time.parse('2013-10-18 09:52:05 +0100') }
|
7
|
+
let (:updated) { Time.parse('2013-10-18 09:57:35 +0100') }
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
before do
|
10
|
+
Time.stubs(:now).returns(created, updated)
|
11
|
+
end
|
13
12
|
|
14
|
-
|
13
|
+
it 'sets the created_at at creation' do
|
14
|
+
expect(c.new.created_at).to be created
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
it 'sets the updated_at at creation' do
|
18
|
+
expect(c.new.updated_at).to be created
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
21
|
+
it 'sets the updated_at after set is called' do
|
22
|
+
expect(c.new.set(foo: 3).updated_at).to be updated
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
25
|
+
it 'sets the updated_at after unset is called' do
|
26
|
+
expect(c.new(foo: 3).unset(:foo).updated_at).to be updated
|
27
|
+
end
|
29
28
|
|
29
|
+
it 'does not re-set the created_at when the model is updated' do
|
30
|
+
expect(c.new.set(foo: 3).created_at).to be created
|
30
31
|
end
|
32
|
+
|
31
33
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Id::Validations do
|
4
|
+
|
5
|
+
class ValidationModel
|
6
|
+
include Id::Model
|
7
|
+
include Id::Form
|
8
|
+
|
9
|
+
field :cats
|
10
|
+
validates_presence_of :cats
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'delegates validations to the active model class' do
|
14
|
+
model = ValidationModel.new
|
15
|
+
expect(model).not_to be_valid
|
16
|
+
expect(model.errors.messages).to eq ({ cats: ["can't be blank"] })
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
require 'rspec'
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
4
|
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'spec/support/dummy_rails_form_builder'
|
10
|
+
require 'id'
|
5
11
|
|
6
|
-
RSpec.configure do |
|
7
|
-
|
8
|
-
|
12
|
+
RSpec.configure do |c|
|
13
|
+
c.order = :rand
|
14
|
+
c.mock_with :mocha
|
9
15
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: id
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Russell Dunphy
|
@@ -81,6 +81,20 @@ dependencies:
|
|
81
81
|
- - '>='
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: mocha
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
84
98
|
- !ruby/object:Gem::Dependency
|
85
99
|
name: simplecov
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +109,35 @@ dependencies:
|
|
95
109
|
- - '>='
|
96
110
|
- !ruby/object:Gem::Version
|
97
111
|
version: '0'
|
98
|
-
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: coveralls
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: test-unit
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
description: Easily convert hashes to Ruby objects. Originally developed at www.onthebeach.co.uk.
|
99
141
|
email:
|
100
142
|
- rssll@rsslldnphy.com
|
101
143
|
- radek.molenda@gmail.com
|
@@ -112,33 +154,40 @@ files:
|
|
112
154
|
- README.md
|
113
155
|
- id.gemspec
|
114
156
|
- lib/id.rb
|
157
|
+
- lib/id/active_model.rb
|
158
|
+
- lib/id/association.rb
|
159
|
+
- lib/id/boolean.rb
|
160
|
+
- lib/id/coercion.rb
|
161
|
+
- lib/id/eta_expansion.rb
|
162
|
+
- lib/id/field.rb
|
163
|
+
- lib/id/field/definition.rb
|
164
|
+
- lib/id/field/summary.rb
|
115
165
|
- lib/id/form.rb
|
116
|
-
- lib/id/
|
117
|
-
- lib/id/form/descriptor.rb
|
118
|
-
- lib/id/form/field_form.rb
|
119
|
-
- lib/id/form/field_with_form_support.rb
|
166
|
+
- lib/id/form_backwards_compatibility.rb
|
120
167
|
- lib/id/hashifier.rb
|
121
|
-
- lib/id/missing_attribute_error.rb
|
122
168
|
- lib/id/model.rb
|
123
|
-
- lib/id/model/association.rb
|
124
|
-
- lib/id/model/definer.rb
|
125
|
-
- lib/id/model/descriptor.rb
|
126
|
-
- lib/id/model/field.rb
|
127
|
-
- lib/id/model/has_many.rb
|
128
|
-
- lib/id/model/has_one.rb
|
129
|
-
- lib/id/model/type_casts.rb
|
130
169
|
- lib/id/timestamps.rb
|
131
|
-
-
|
132
|
-
- spec/
|
133
|
-
- spec/lib/id/
|
134
|
-
- spec/lib/id/
|
170
|
+
- lib/id/validations.rb
|
171
|
+
- spec/examples/cat_spec.rb
|
172
|
+
- spec/lib/id/active_model_spec.rb
|
173
|
+
- spec/lib/id/association_spec.rb
|
174
|
+
- spec/lib/id/boolean_spec.rb
|
175
|
+
- spec/lib/id/coercion_spec.rb
|
176
|
+
- spec/lib/id/eta_expansion_spec.rb
|
177
|
+
- spec/lib/id/field/definition_spec.rb
|
178
|
+
- spec/lib/id/field/summary_spec.rb
|
179
|
+
- spec/lib/id/field_spec.rb
|
180
|
+
- spec/lib/id/form_spec.rb
|
181
|
+
- spec/lib/id/hashifier_spec.rb
|
135
182
|
- spec/lib/id/model_spec.rb
|
136
183
|
- spec/lib/id/timestamps_spec.rb
|
137
|
-
- spec/lib/
|
184
|
+
- spec/lib/id/validations_spec.rb
|
138
185
|
- spec/spec_helper.rb
|
139
186
|
- spec/support/active_model_lint.rb
|
140
|
-
|
141
|
-
|
187
|
+
- spec/support/dummy_rails_form_builder.rb
|
188
|
+
homepage: http://github.com/rsslldnphy/id
|
189
|
+
licenses:
|
190
|
+
- MIT
|
142
191
|
metadata: {}
|
143
192
|
post_install_message:
|
144
193
|
rdoc_options: []
|
@@ -161,12 +210,21 @@ signing_key:
|
|
161
210
|
specification_version: 4
|
162
211
|
summary: Simple models based on hashes
|
163
212
|
test_files:
|
164
|
-
- spec/
|
165
|
-
- spec/lib/id/
|
166
|
-
- spec/lib/id/
|
167
|
-
- spec/lib/id/
|
213
|
+
- spec/examples/cat_spec.rb
|
214
|
+
- spec/lib/id/active_model_spec.rb
|
215
|
+
- spec/lib/id/association_spec.rb
|
216
|
+
- spec/lib/id/boolean_spec.rb
|
217
|
+
- spec/lib/id/coercion_spec.rb
|
218
|
+
- spec/lib/id/eta_expansion_spec.rb
|
219
|
+
- spec/lib/id/field/definition_spec.rb
|
220
|
+
- spec/lib/id/field/summary_spec.rb
|
221
|
+
- spec/lib/id/field_spec.rb
|
222
|
+
- spec/lib/id/form_spec.rb
|
223
|
+
- spec/lib/id/hashifier_spec.rb
|
168
224
|
- spec/lib/id/model_spec.rb
|
169
225
|
- spec/lib/id/timestamps_spec.rb
|
170
|
-
- spec/lib/
|
226
|
+
- spec/lib/id/validations_spec.rb
|
171
227
|
- spec/spec_helper.rb
|
172
228
|
- spec/support/active_model_lint.rb
|
229
|
+
- spec/support/dummy_rails_form_builder.rb
|
230
|
+
has_rdoc:
|