structural 0.1.0 → 0.2.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.
- data/lib/structural.rb +1 -0
- data/lib/structural/invalid_default_type_error.rb +4 -0
- data/lib/structural/model/has_one.rb +14 -1
- data/lib/structural/version.rb +1 -1
- data/spec/lib/structural/model_spec.rb +63 -5
- metadata +127 -104
- checksums.yaml +0 -7
data/lib/structural.rb
CHANGED
@@ -2,9 +2,22 @@ module Structural
|
|
2
2
|
module Model
|
3
3
|
class HasOne < Association
|
4
4
|
def value_of(data)
|
5
|
-
child = data.fetch(key
|
5
|
+
child = data.fetch(key, &default_value)
|
6
6
|
type.new(child) unless child.nil?
|
7
7
|
end
|
8
|
+
|
9
|
+
def default
|
10
|
+
valid_type_check(super)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def valid_type_check(v)
|
16
|
+
case v
|
17
|
+
when Hash then v
|
18
|
+
when Proc then valid_type_check(v.call)
|
19
|
+
else raise Structural::InvalidDefaultTypeError end
|
20
|
+
end
|
8
21
|
end
|
9
22
|
end
|
10
23
|
end
|
data/lib/structural/version.rb
CHANGED
@@ -3,6 +3,14 @@ require 'spec_helper'
|
|
3
3
|
class NestedModel
|
4
4
|
include Structural::Model
|
5
5
|
field :yak
|
6
|
+
field :name, :default => nil
|
7
|
+
field :surname, :default => nil
|
8
|
+
end
|
9
|
+
|
10
|
+
class SeparateClass
|
11
|
+
def self.as_hash
|
12
|
+
{ :name => 'Michael' }
|
13
|
+
end
|
6
14
|
end
|
7
15
|
|
8
16
|
class TestModel
|
@@ -15,10 +23,16 @@ class TestModel
|
|
15
23
|
field :date_of_birth, :type => Date
|
16
24
|
field :empty_date, :type => Date
|
17
25
|
field :christmas, :default => Date.new(2014,12,25), :type => Date
|
26
|
+
field :time_stamp, :type => Time
|
18
27
|
|
19
28
|
has_one :aliased_model, :type => NestedModel
|
20
29
|
has_one :nested_model, :key => 'aliased_model'
|
21
30
|
has_one :extra_nested_model
|
31
|
+
has_one :nested_with_invalid_default, :default => nil
|
32
|
+
has_one :nested_with_hash_default, :default => { name: 'Michael' }, :type => NestedModel
|
33
|
+
has_one :nested_with_hash_proc_default, :default => Proc.new { SeparateClass.as_hash }, :type => NestedModel
|
34
|
+
has_one :nested_with_invalid_proc_default, :default => Proc.new { SeparateClass.new }, :type => NestedModel
|
35
|
+
has_one :missing_nested_without_default
|
22
36
|
has_one :test_model
|
23
37
|
has_many :nested_models
|
24
38
|
|
@@ -39,7 +53,8 @@ describe Structural::Model do
|
|
39
53
|
:date_of_birth => '06-06-1983',
|
40
54
|
:aliased_model => {'yak' => 11},
|
41
55
|
:nested_models => [{'yak' => 11}, {:yak => 14}],
|
42
|
-
:extra_nested_model => { :cats => "MIAOW" }
|
56
|
+
:extra_nested_model => { :cats => "MIAOW" },
|
57
|
+
:time_stamp => '2015-01-27T13:13:13+00:00'
|
43
58
|
)
|
44
59
|
end
|
45
60
|
|
@@ -73,24 +88,67 @@ describe Structural::Model do
|
|
73
88
|
model.date_of_birth.should be_a Date
|
74
89
|
model.christmas.should be_a Date
|
75
90
|
end
|
91
|
+
|
92
|
+
it 'parses the date correctly' do
|
93
|
+
model.date_of_birth.should eql Date.new(1983, 6, 6)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'parses the time correctly' do
|
97
|
+
model.time_stamp.should eql Time.new(2015, 1, 27, 13, 13, 13, '+00:00')
|
98
|
+
end
|
76
99
|
end
|
77
100
|
end
|
78
101
|
|
79
102
|
describe ".has_one" do
|
80
|
-
it
|
103
|
+
it 'allows nested models' do
|
81
104
|
model.aliased_model.should be_a NestedModel
|
82
105
|
end
|
83
|
-
|
106
|
+
|
107
|
+
it 'allows nested models' do
|
84
108
|
model.nested_model.should be_a NestedModel
|
85
109
|
model.nested_model.yak.should eq 11
|
86
110
|
end
|
87
|
-
|
111
|
+
|
112
|
+
it 'allows associations to be nested within the class' do
|
88
113
|
model.extra_nested_model.should be_a TestModel::ExtraNestedModel
|
89
114
|
model.extra_nested_model.cats.should eq 'MIAOW'
|
90
115
|
end
|
91
|
-
|
116
|
+
|
117
|
+
it 'allows recursively defined models' do
|
92
118
|
model.test_model.should be_a TestModel
|
93
119
|
end
|
120
|
+
|
121
|
+
it 'allows default values as a hash' do
|
122
|
+
model.nested_with_hash_default.name.should eq 'Michael'
|
123
|
+
model.nested_with_hash_default.surname.should be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'when passing a Proc as a default' do
|
127
|
+
it 'allows the default' do
|
128
|
+
model.nested_with_hash_proc_default.name.should eq 'Michael'
|
129
|
+
model.nested_with_hash_default.surname.should be_nil
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'when the Proc does not return a Hash' do
|
133
|
+
it 'raises an error' do
|
134
|
+
expect {
|
135
|
+
model.nested_with_invalid_proc_default
|
136
|
+
}.to raise_error(Structural::InvalidDefaultTypeError)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'fails if passed a non-hash as default' do
|
142
|
+
expect {
|
143
|
+
model.nested_with_invalid_default
|
144
|
+
}.to raise_error(Structural::InvalidDefaultTypeError)
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'fails for missing associations without defaults' do
|
148
|
+
expect {
|
149
|
+
model.missing_nested_without_default
|
150
|
+
}.to raise_error(Structural::MissingAttributeError)
|
151
|
+
end
|
94
152
|
end
|
95
153
|
|
96
154
|
describe ".has_many" do
|
metadata
CHANGED
@@ -1,125 +1,137 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: structural
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- Russell Dunphy
|
8
14
|
- Radek Molenda
|
9
15
|
- Jon Doveston
|
10
16
|
autorequire:
|
11
17
|
bindir: bin
|
12
18
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
19
|
+
|
20
|
+
date: 2017-02-20 00:00:00 Z
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
16
23
|
name: money
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - ">="
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
|
25
|
-
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
26
28
|
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
requirements:
|
33
|
-
- - ">="
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: '0'
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
36
34
|
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activesupport
|
37
38
|
prerelease: false
|
38
|
-
|
39
|
-
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
40
42
|
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
44
51
|
name: rspec
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '3.0'
|
50
|
-
type: :development
|
51
52
|
prerelease: false
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '0'
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 7
|
59
|
+
segments:
|
60
|
+
- 3
|
61
|
+
- 0
|
62
|
+
version: "3.0"
|
64
63
|
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: yard
|
65
67
|
prerelease: false
|
66
|
-
|
67
|
-
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
68
71
|
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
78
77
|
type: :development
|
78
|
+
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: redcarpet
|
79
81
|
prerelease: false
|
80
|
-
|
81
|
-
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
82
85
|
- - ">="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
requirements:
|
89
|
-
- - "~>"
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: '1.6'
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
92
91
|
type: :development
|
92
|
+
version_requirements: *id005
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: bundler
|
93
95
|
prerelease: false
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '0'
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 1
|
104
|
+
- 6
|
105
|
+
version: "1.6"
|
106
106
|
type: :development
|
107
|
+
version_requirements: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
name: rake
|
107
110
|
prerelease: false
|
108
|
-
|
109
|
-
|
111
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
110
114
|
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 3
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
version: "0"
|
120
|
+
type: :development
|
121
|
+
version_requirements: *id007
|
113
122
|
description: A cut down fork of the Id gem developed at On The Beach Ltd.
|
114
|
-
email:
|
123
|
+
email:
|
115
124
|
- jon.doveston@onthebeach.co.uk
|
116
125
|
executables: []
|
126
|
+
|
117
127
|
extensions: []
|
128
|
+
|
118
129
|
extra_rdoc_files: []
|
119
|
-
|
120
|
-
|
121
|
-
-
|
122
|
-
-
|
130
|
+
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- .ruby-version
|
134
|
+
- .travis.yml
|
123
135
|
- CONTRIBUTING.md
|
124
136
|
- Gemfile
|
125
137
|
- LICENSE.md
|
@@ -127,6 +139,7 @@ files:
|
|
127
139
|
- Rakefile
|
128
140
|
- lib/structural.rb
|
129
141
|
- lib/structural/hashifier.rb
|
142
|
+
- lib/structural/invalid_default_type_error.rb
|
130
143
|
- lib/structural/missing_attribute_error.rb
|
131
144
|
- lib/structural/model.rb
|
132
145
|
- lib/structural/model/association.rb
|
@@ -146,33 +159,43 @@ files:
|
|
146
159
|
- spec/spec_helper.rb
|
147
160
|
- structural.gemspec
|
148
161
|
homepage: https://github.com/onthebeach/structural
|
149
|
-
licenses:
|
162
|
+
licenses:
|
150
163
|
- MIT
|
151
|
-
metadata: {}
|
152
164
|
post_install_message:
|
153
165
|
rdoc_options: []
|
154
|
-
|
166
|
+
|
167
|
+
require_paths:
|
155
168
|
- lib
|
156
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
-
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
158
172
|
- - ">="
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
|
161
|
-
|
162
|
-
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
hash: 3
|
175
|
+
segments:
|
176
|
+
- 0
|
177
|
+
version: "0"
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
163
181
|
- - ">="
|
164
|
-
- !ruby/object:Gem::Version
|
165
|
-
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
hash: 3
|
184
|
+
segments:
|
185
|
+
- 0
|
186
|
+
version: "0"
|
166
187
|
requirements: []
|
188
|
+
|
167
189
|
rubyforge_project:
|
168
|
-
rubygems_version:
|
190
|
+
rubygems_version: 1.8.25
|
169
191
|
signing_key:
|
170
|
-
specification_version:
|
192
|
+
specification_version: 3
|
171
193
|
summary: Simple models based on hashes
|
172
|
-
test_files:
|
194
|
+
test_files:
|
173
195
|
- spec/lib/structural/model/association_spec.rb
|
174
196
|
- spec/lib/structural/model/field_spec.rb
|
175
197
|
- spec/lib/structural/model/type_casts_spec.rb
|
176
198
|
- spec/lib/structural/model_spec.rb
|
177
199
|
- spec/lib/structural/timestamps_spec.rb
|
178
200
|
- spec/spec_helper.rb
|
201
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: d2e683ae4dc0a1839b52352576db3fc726201321
|
4
|
-
data.tar.gz: 947df1932b578c7c5e786b2e6baf4463f2d10312
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: c4da802d16a95c7d4b5516697fb9c6c76687032686e693830c6c3f8b44a3aa47c3f9adb3ca9341ccf378afafb0e75b118ac186ed612d9ab7fa274efefffcd4a7
|
7
|
-
data.tar.gz: a1f58451da825b7bc071958150407011f743d2ab4411692095b6197a0a3377a749ca6de810170b1098dfa525457e00ff83e398ece251d3d2d7b1088e9dbc5e26
|