aduki 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.zeiger.yml +28 -0
- data/lib/aduki.rb +9 -0
- data/lib/aduki/version.rb +1 -1
- data/lib/core_ext/hash.rb +1 -1
- data/spec/array_attribute_spec.rb +1 -1
- data/spec/custom_builder_spec.rb +1 -1
- data/spec/hash_spec.rb +4 -4
- data/spec/initializer_spec.rb +90 -90
- data/spec/merge_attributes_spec.rb +1 -1
- data/spec/nil_initializer_spec.rb +10 -1
- data/spec/number_attribute_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- data/spec/to_aduki_spec.rb +16 -16
- data/spec/to_date_spec.rb +27 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7dd0b304ba4c822ccea883c49b3436bad96c79b
|
4
|
+
data.tar.gz: 66b0f76e294f54bd0b9d5d745fbc15b12ea430e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2851f920f20bd3fd4f17f76df4e405f7ea6c471cfc966944deedb9f9297abd438cd5ef13ff272689452bee09454523d8d079224ec1ae30af12cdc5e64940cbc5
|
7
|
+
data.tar.gz: c09358df15d6efff6a9ab420ca47f0c6870a6d7b159d5f7d6f4dc313dacf738baa4189dc04011d6676203cb750f6ffb643b2b48c85a152b31f036bed0cc2ce9e
|
data/.zeiger.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
search:
|
2
|
+
- "bin/**/*"
|
3
|
+
- "lib/**/*"
|
4
|
+
- "spec/**/*"
|
5
|
+
- "*.gemspec"
|
6
|
+
- ".*.yml"
|
7
|
+
- ".git?*"
|
8
|
+
- "Gemfile*"
|
9
|
+
- README
|
10
|
+
ignore:
|
11
|
+
- .doc$
|
12
|
+
- .ods$
|
13
|
+
- .gz$
|
14
|
+
- .png$
|
15
|
+
- .gif$
|
16
|
+
- .zip$
|
17
|
+
- .jpg$
|
18
|
+
- .xcf$
|
19
|
+
- .pdf$
|
20
|
+
- /select2/.*.js$
|
21
|
+
stats:
|
22
|
+
nydp:
|
23
|
+
- ".*\\.nydp"
|
24
|
+
code:
|
25
|
+
- "lib/.*\\.(rb|rake)"
|
26
|
+
test:
|
27
|
+
- "spec/.*"
|
28
|
+
- "test/.*"
|
data/lib/aduki.rb
CHANGED
@@ -53,11 +53,19 @@ module Aduki
|
|
53
53
|
case value
|
54
54
|
when Date; value
|
55
55
|
when String; maybe_parse_date(value)
|
56
|
+
else
|
57
|
+
if value.respond_to?(:to_date)
|
58
|
+
value.to_date
|
59
|
+
end
|
56
60
|
end
|
57
61
|
elsif type == Time
|
58
62
|
case value
|
59
63
|
when Time; value
|
60
64
|
when String; Time.parse(value)
|
65
|
+
else
|
66
|
+
if value.respond_to?(:to_time)
|
67
|
+
value.to_time
|
68
|
+
end
|
61
69
|
end
|
62
70
|
elsif type && (type <= Integer)
|
63
71
|
value.to_i
|
@@ -133,6 +141,7 @@ module Aduki
|
|
133
141
|
end
|
134
142
|
|
135
143
|
def self.apply_attributes object, attrs
|
144
|
+
attrs = nil if attrs == ''
|
136
145
|
setters = split_attributes(attrs || { })
|
137
146
|
klass = object.class
|
138
147
|
|
data/lib/aduki/version.rb
CHANGED
data/lib/core_ext/hash.rb
CHANGED
@@ -37,7 +37,7 @@ class Hash
|
|
37
37
|
|
38
38
|
def recursively_replace_values &block
|
39
39
|
each_with_object({ }) { |(k, v), result|
|
40
|
-
result[k] = (v.is_a?(Hash) || v.is_a?(Array)) ? v.recursively_replace_values
|
40
|
+
result[k] = (v.is_a?(Hash) || v.is_a?(Array)) ? v.recursively_replace_values(&block) : yield(k, v)
|
41
41
|
}
|
42
42
|
end
|
43
43
|
end
|
@@ -2,7 +2,7 @@ require "aduki"
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe Aduki::Initializer do
|
5
|
-
it "
|
5
|
+
it "assigns an integer attribute of an object nested in an array attribute" do
|
6
6
|
props = {
|
7
7
|
"name" => "Foo",
|
8
8
|
"assemblies" => [{ "name" => "A0", "height" => "10" }, { "name" => "A1", "height" => "20" }, { "name" => "A2", "height" => "30" }, ],
|
data/spec/custom_builder_spec.rb
CHANGED
data/spec/hash_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Hash do
|
|
4
4
|
before { Aduki.install_monkey_patches }
|
5
5
|
|
6
6
|
describe 'recursively_delete_keys!' do
|
7
|
-
it "
|
7
|
+
it "deletes the specified keys from itself and all nested hashes, even sub-nested in arrays" do
|
8
8
|
h = {
|
9
9
|
site_id: "foo",
|
10
10
|
"site_id" => :bar,
|
@@ -22,7 +22,7 @@ describe Hash do
|
|
22
22
|
|
23
23
|
h.recursively_delete_keys! :site_id, "site_id"
|
24
24
|
|
25
|
-
h.
|
25
|
+
expect(h).to eq({
|
26
26
|
things: {
|
27
27
|
2 => [ { a: 12, b: 53 },
|
28
28
|
{ a: 13, b: 54 },
|
@@ -31,12 +31,12 @@ describe Hash do
|
|
31
31
|
toto: :titi
|
32
32
|
},
|
33
33
|
others: [ { name: "Walter" } ]
|
34
|
-
}
|
34
|
+
})
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
describe 'recursively_stringify_keys!' do
|
39
|
-
it "
|
39
|
+
it "changes all keys to strings" do
|
40
40
|
h = {
|
41
41
|
foo: "bar",
|
42
42
|
12 => 13,
|
data/spec/initializer_spec.rb
CHANGED
@@ -85,90 +85,90 @@ describe Aduki::Initializer do
|
|
85
85
|
"countries[4]" => "Spain",
|
86
86
|
}
|
87
87
|
|
88
|
-
it "
|
88
|
+
it "sets a bunch of properties from a hash of property paths" do
|
89
89
|
props = PROPS
|
90
90
|
|
91
91
|
model = Model.new props
|
92
92
|
|
93
|
-
model.name.
|
94
|
-
model.email.
|
95
|
-
model.item.
|
96
|
-
model.thing.
|
97
|
-
model.gadget.name.
|
98
|
-
model.gadget.price.
|
99
|
-
model.gadget.supplier.
|
100
|
-
model.gadget.speaker.
|
101
|
-
model.gadget.speaker.ohms.
|
102
|
-
model.machines[0].name.
|
103
|
-
model.machines[0].weight.
|
104
|
-
model.machines[0].speed.
|
105
|
-
model.machines[0].builder.name.
|
106
|
-
model.machines[0].builder.email.
|
107
|
-
model.machines[0].builder.phone.
|
108
|
-
model.machines[0].builder.office.
|
109
|
-
model.machines[0].assemblies[0].name.
|
110
|
-
model.machines[0].assemblies[0].colour.
|
111
|
-
model.machines[0].assemblies[0].size.
|
112
|
-
model.machines[0].assemblies[1].name.
|
113
|
-
model.machines[0].assemblies[1].colour.
|
114
|
-
model.machines[0].assemblies[1].size.
|
115
|
-
model.machines[0].assemblies[2].name.
|
116
|
-
model.machines[0].assemblies[2].colour.
|
117
|
-
model.machines[0].assemblies[2].size.
|
118
|
-
model.machines[0].dimensions[0].
|
119
|
-
model.machines[0].dimensions[1].
|
120
|
-
model.machines[0].dimensions[2].
|
121
|
-
model.machines[0].dimensions[3].
|
122
|
-
model.machines[0].team.
|
123
|
-
model.machines[0].helpers["jim"].
|
124
|
-
model.machines[0].helpers["jim"].name.
|
125
|
-
model.machines[0].helpers["jim"].email.
|
126
|
-
model.machines[0].helpers["jim"].phone.
|
127
|
-
model.machines[0].helpers["jim"].office.
|
128
|
-
model.machines[0].helpers["ben"].
|
129
|
-
model.machines[0].helpers["ben"].name.
|
130
|
-
model.machines[0].helpers["ben"].email.
|
131
|
-
model.machines[0].helpers["ben"].phone.
|
132
|
-
model.machines[0].helpers["ben"].office.
|
133
|
-
model.machines[0].helpers["pat"].
|
134
|
-
model.machines[0].helpers["pat"].name.
|
135
|
-
model.machines[0].helpers["pat"].email.
|
136
|
-
model.machines[0].helpers["pat"].phone.
|
137
|
-
model.machines[0].helpers["pat"].office.
|
138
|
-
model.machines[1].name.
|
139
|
-
model.machines[1].weight.
|
140
|
-
model.machines[1].speed.
|
141
|
-
model.machines[1].builder.name.
|
142
|
-
model.machines[1].builder.email.
|
143
|
-
model.machines[1].builder.phone.
|
144
|
-
model.machines[1].builder.office.
|
145
|
-
model.machines[1].assemblies[0].name.
|
146
|
-
model.machines[1].assemblies[0].colour.
|
147
|
-
model.machines[1].assemblies[0].size.
|
148
|
-
model.machines[1].assemblies[1].name.
|
149
|
-
model.machines[1].assemblies[1].colour.
|
150
|
-
model.machines[1].assemblies[1].size.
|
151
|
-
model.machines[1].assemblies[2].name.
|
152
|
-
model.machines[1].assemblies[2].colour.
|
153
|
-
model.machines[1].assemblies[2].size.
|
154
|
-
model.machines[1].dimensions[0].
|
155
|
-
model.machines[1].dimensions[1].
|
156
|
-
model.machines[1].dimensions[2].
|
157
|
-
model.machines[1].dimensions[3].
|
158
|
-
model.machines[1].team.
|
159
|
-
model.contraptions[0].x.
|
160
|
-
model.contraptions[0].y.
|
161
|
-
model.contraptions[1].x.
|
162
|
-
model.contraptions[1].y.
|
163
|
-
model.contraptions[2].x.
|
164
|
-
model.contraptions[2].y.
|
165
|
-
model.contraptions[3].x.
|
166
|
-
model.contraptions[3].y.
|
167
|
-
model.countries[0].
|
168
|
-
model.countries[1].
|
169
|
-
model.countries[2].
|
170
|
-
model.countries[3].
|
171
|
-
model.countries[4].
|
93
|
+
expect(model.name).to eq "Willy"
|
94
|
+
expect(model.email).to eq "willy@wonka.softify.com"
|
95
|
+
expect(model.item).to eq "HXB5H"
|
96
|
+
expect(model.thing).to eq "0"
|
97
|
+
expect(model.gadget.name).to eq "My Big Gadget"
|
98
|
+
expect(model.gadget.price).to eq "21"
|
99
|
+
expect(model.gadget.supplier).to eq "Apple, Inc."
|
100
|
+
expect(model.gadget.speaker).to be_a Speaker
|
101
|
+
expect(model.gadget.speaker.ohms).to eq nil
|
102
|
+
expect(model.machines[0].name).to eq "The First Machine"
|
103
|
+
expect(model.machines[0].weight).to eq "88"
|
104
|
+
expect(model.machines[0].speed).to eq "142"
|
105
|
+
expect(model.machines[0].builder.name).to eq "The First Machine Builder"
|
106
|
+
expect(model.machines[0].builder.email).to eq "wibble@bump"
|
107
|
+
expect(model.machines[0].builder.phone).to eq "4099"
|
108
|
+
expect(model.machines[0].builder.office).to eq "2nd floor room 12"
|
109
|
+
expect(model.machines[0].assemblies[0].name).to eq "first machine, first assembly"
|
110
|
+
expect(model.machines[0].assemblies[0].colour).to eq "red"
|
111
|
+
expect(model.machines[0].assemblies[0].size).to eq "pretty large"
|
112
|
+
expect(model.machines[0].assemblies[1].name).to eq "first machine, second assembly"
|
113
|
+
expect(model.machines[0].assemblies[1].colour).to eq "green"
|
114
|
+
expect(model.machines[0].assemblies[1].size).to eq "sort of medium"
|
115
|
+
expect(model.machines[0].assemblies[2].name).to eq "first machine, third assembly"
|
116
|
+
expect(model.machines[0].assemblies[2].colour).to eq "blue"
|
117
|
+
expect(model.machines[0].assemblies[2].size).to eq "miniscule"
|
118
|
+
expect(model.machines[0].dimensions[0]).to eq "2346.56"
|
119
|
+
expect(model.machines[0].dimensions[1]).to eq "6456.64"
|
120
|
+
expect(model.machines[0].dimensions[2]).to eq "3859.39"
|
121
|
+
expect(model.machines[0].dimensions[3]).to eq "2365.68"
|
122
|
+
expect(model.machines[0].team).to eq({ "lead" => "Shakespeare", "code" => "Chaucer", "design" => "Jobs"})
|
123
|
+
expect(model.machines[0].helpers["jim"]).to be_a MachineBuilder
|
124
|
+
expect(model.machines[0].helpers["jim"].name).to eq "Jim Appleby"
|
125
|
+
expect(model.machines[0].helpers["jim"].email).to eq "Jim.Appleby@example.com"
|
126
|
+
expect(model.machines[0].helpers["jim"].phone).to eq "123 456 789"
|
127
|
+
expect(model.machines[0].helpers["jim"].office).to eq "Elephant & Castle"
|
128
|
+
expect(model.machines[0].helpers["ben"]).to be_a MachineBuilder
|
129
|
+
expect(model.machines[0].helpers["ben"].name).to eq "Ben Barnes"
|
130
|
+
expect(model.machines[0].helpers["ben"].email).to eq "Ben.Barnes@example.com"
|
131
|
+
expect(model.machines[0].helpers["ben"].phone).to eq "123 456 790"
|
132
|
+
expect(model.machines[0].helpers["ben"].office).to eq "Cockney"
|
133
|
+
expect(model.machines[0].helpers["pat"]).to be_a MachineBuilder
|
134
|
+
expect(model.machines[0].helpers["pat"].name).to eq "Patrick O'Brien"
|
135
|
+
expect(model.machines[0].helpers["pat"].email).to eq "Patrick.O.Brien@example.com"
|
136
|
+
expect(model.machines[0].helpers["pat"].phone).to eq "123 456 791"
|
137
|
+
expect(model.machines[0].helpers["pat"].office).to eq "Hammersmith"
|
138
|
+
expect(model.machines[1].name).to eq "The Second Machine"
|
139
|
+
expect(model.machines[1].weight).to eq "34"
|
140
|
+
expect(model.machines[1].speed).to eq "289"
|
141
|
+
expect(model.machines[1].builder.name).to eq "The Second Machine Builder"
|
142
|
+
expect(model.machines[1].builder.email).to eq "waggie@bump"
|
143
|
+
expect(model.machines[1].builder.phone).to eq "4101"
|
144
|
+
expect(model.machines[1].builder.office).to eq "3rd floor room 23"
|
145
|
+
expect(model.machines[1].assemblies[0].name).to eq "second machine, second assembly"
|
146
|
+
expect(model.machines[1].assemblies[0].colour).to eq "turquoise"
|
147
|
+
expect(model.machines[1].assemblies[0].size).to eq "large-ish"
|
148
|
+
expect(model.machines[1].assemblies[1].name).to eq "second machine, first assembly"
|
149
|
+
expect(model.machines[1].assemblies[1].colour).to eq "purple"
|
150
|
+
expect(model.machines[1].assemblies[1].size).to eq "pretty small"
|
151
|
+
expect(model.machines[1].assemblies[2].name).to eq "second machine, third assembly"
|
152
|
+
expect(model.machines[1].assemblies[2].colour).to eq "magenta"
|
153
|
+
expect(model.machines[1].assemblies[2].size).to eq "gigantic"
|
154
|
+
expect(model.machines[1].dimensions[0]).to eq "1985.85"
|
155
|
+
expect(model.machines[1].dimensions[1]).to eq "7234.92"
|
156
|
+
expect(model.machines[1].dimensions[2]).to eq "9725.52"
|
157
|
+
expect(model.machines[1].dimensions[3]).to eq "3579.79"
|
158
|
+
expect(model.machines[1].team).to eq({ "lead" => "Joyce", "code" => "O'Brien", "design" => "Moore", "muffins" => "MacNamara"})
|
159
|
+
expect(model.contraptions[0].x).to eq "19"
|
160
|
+
expect(model.contraptions[0].y).to eq "0.003"
|
161
|
+
expect(model.contraptions[1].x).to eq "12"
|
162
|
+
expect(model.contraptions[1].y).to eq "0.0012"
|
163
|
+
expect(model.contraptions[2].x).to eq "24"
|
164
|
+
expect(model.contraptions[2].y).to eq "0.00063"
|
165
|
+
expect(model.contraptions[3].x).to eq "16"
|
166
|
+
expect(model.contraptions[3].y).to eq "0.00091"
|
167
|
+
expect(model.countries[0]).to eq "France"
|
168
|
+
expect(model.countries[1]).to eq "Sweden"
|
169
|
+
expect(model.countries[2]).to eq "Germany"
|
170
|
+
expect(model.countries[3]).to eq "Ireland"
|
171
|
+
expect(model.countries[4]).to eq "Spain"
|
172
172
|
|
173
173
|
sensibly_indexed_props = props.merge({
|
174
174
|
"machines[1].assemblies[0].name" => "second machine, second assembly",
|
@@ -199,10 +199,10 @@ describe Aduki::Initializer do
|
|
199
199
|
|
200
200
|
silly_keys.each { |k| sensibly_indexed_props.delete k }
|
201
201
|
|
202
|
-
Aduki.to_aduki(model).
|
202
|
+
expect(Aduki.to_aduki(model)).to eq sensibly_indexed_props
|
203
203
|
end
|
204
204
|
|
205
|
-
it "
|
205
|
+
it "initializes attributes of pre-initialized nested objects" do
|
206
206
|
props = {
|
207
207
|
"name" => "Brackish Water",
|
208
208
|
"gadget.name" => "The Loud Gadget",
|
@@ -214,15 +214,15 @@ describe Aduki::Initializer do
|
|
214
214
|
|
215
215
|
model = Model.new props
|
216
216
|
|
217
|
-
model.name.
|
218
|
-
model.gadget.name.
|
219
|
-
model.gadget.speaker.
|
220
|
-
model.gadget.speaker.ohms.
|
217
|
+
expect(model.name).to eq "Brackish Water"
|
218
|
+
expect(model.gadget.name).to eq "The Loud Gadget"
|
219
|
+
expect(model.gadget.speaker).to be_a Speaker
|
220
|
+
expect(model.gadget.speaker.ohms).to eq "29"
|
221
221
|
|
222
222
|
expect(model.gadget.speaker.dates).to eq [ Date.parse("2015-03-12"), Date.parse("2015-06-08"), Date.parse("2015-06-21") ]
|
223
223
|
end
|
224
224
|
|
225
|
-
it "
|
225
|
+
it "handles pre-initialized arrays without a given array type" do
|
226
226
|
props = {
|
227
227
|
"name" => "Brackish Water",
|
228
228
|
"gadget.name" => "The Loud Gadget",
|
@@ -237,7 +237,7 @@ describe Aduki::Initializer do
|
|
237
237
|
expect(model.gadget.speaker.dimensions).to eq [ "12", "8", "21" ]
|
238
238
|
end
|
239
239
|
|
240
|
-
it "
|
240
|
+
it "handles pre-initialized arrays with a previously-set array type" do
|
241
241
|
props = {
|
242
242
|
"name" => "Brackish Water",
|
243
243
|
"gadget.name" => "The Loud Gadget",
|
@@ -252,7 +252,7 @@ describe Aduki::Initializer do
|
|
252
252
|
expect(model.gadget.speaker.threads).to eq [ 12.4, 8.16, 21.42 ]
|
253
253
|
end
|
254
254
|
|
255
|
-
it "
|
255
|
+
it "handles pre-initialized hashes" do
|
256
256
|
props = {
|
257
257
|
"name" => "Brackish Water",
|
258
258
|
"gadget.name" => "The Loud Gadget",
|
@@ -266,7 +266,7 @@ describe Aduki::Initializer do
|
|
266
266
|
expect(model.gadget.variables).to eq({ "x"=> "29", "y" => "12.4", "z" => "8.16"})
|
267
267
|
end
|
268
268
|
|
269
|
-
it "
|
269
|
+
it "handles pre-initialized hashes with more complex subkeys" do
|
270
270
|
props = {
|
271
271
|
"name" => "Brackish Water",
|
272
272
|
"gadget.name" => "The Loud Gadget",
|
@@ -2,7 +2,7 @@ require "aduki"
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe Aduki::Initializer do
|
5
|
-
it "
|
5
|
+
it "initializes attributes of pre-initialized nested objects" do
|
6
6
|
props = {
|
7
7
|
"name" => "Brackish Water",
|
8
8
|
"gadget.name" => "The Loud Gadget",
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
|
4
4
|
describe Aduki::Initializer do
|
5
5
|
|
6
|
-
it "
|
6
|
+
it "silently accepts nil initializer parameter" do
|
7
7
|
contraption = Assembly.new
|
8
8
|
|
9
9
|
expect(contraption.name ).to be_nil
|
@@ -11,4 +11,13 @@ describe Aduki::Initializer do
|
|
11
11
|
expect(contraption.height).to be_nil
|
12
12
|
expect(contraption.weight).to be_nil
|
13
13
|
end
|
14
|
+
|
15
|
+
it "silently accepts empty-string initializer parameter" do
|
16
|
+
contraption = Assembly.new ""
|
17
|
+
|
18
|
+
expect(contraption.name ).to be_nil
|
19
|
+
expect(contraption.colour).to be_nil
|
20
|
+
expect(contraption.height).to be_nil
|
21
|
+
expect(contraption.weight).to be_nil
|
22
|
+
end
|
14
23
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
+
require 'aduki'
|
1
2
|
|
2
3
|
RSpec.configure do |config|
|
3
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
4
|
+
# config.treat_symbols_as_metadata_keys_with_true_values = true
|
4
5
|
config.run_all_when_everything_filtered = true
|
5
6
|
config.order = 'random'
|
6
7
|
end
|
7
8
|
|
8
|
-
|
9
9
|
class City < Struct.new(:name)
|
10
10
|
CITIES = { }
|
11
11
|
def self.aduki_find value
|
data/spec/to_aduki_spec.rb
CHANGED
@@ -2,23 +2,23 @@ require "aduki"
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe Aduki do
|
5
|
-
it "
|
5
|
+
it "returns a plain hash structure" do
|
6
6
|
hsh = { "foo" => "bar" }
|
7
7
|
props = Aduki.to_aduki hsh
|
8
|
-
props.
|
8
|
+
expect(props).to eq({ "foo" => "bar" })
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should flatten nested keys" do
|
12
12
|
hsh = { "foo" => "bar", "bing" => { "boo" => "wogga", "tingle" => "wimp" } }
|
13
13
|
props = Aduki.to_aduki hsh
|
14
|
-
props.
|
14
|
+
expect(props).to eq({
|
15
15
|
"foo" => "bar",
|
16
16
|
"bing.boo" => "wogga",
|
17
17
|
"bing.tingle" => "wimp"
|
18
|
-
}
|
18
|
+
})
|
19
19
|
end
|
20
20
|
|
21
|
-
it "
|
21
|
+
it "flattens deeply nested keys" do
|
22
22
|
hsh = {
|
23
23
|
"foo" => "bar",
|
24
24
|
"bing" => {
|
@@ -29,16 +29,16 @@ describe Aduki do
|
|
29
29
|
"scorn" => "shart"
|
30
30
|
}} }
|
31
31
|
props = Aduki.to_aduki hsh
|
32
|
-
props.
|
32
|
+
expect(props).to eq({
|
33
33
|
"foo" => "bar",
|
34
34
|
"bing.boo" => "wogga",
|
35
35
|
"bing.tingle" => "wimp",
|
36
36
|
"bing.harpoon.shonk" => "twaddle",
|
37
37
|
"bing.harpoon.scorn" => "shart",
|
38
|
-
}
|
38
|
+
})
|
39
39
|
end
|
40
40
|
|
41
|
-
it "
|
41
|
+
it "flattens array keys also " do
|
42
42
|
hsh = {
|
43
43
|
"foo" => "bar",
|
44
44
|
"bing" => {
|
@@ -50,7 +50,7 @@ describe Aduki do
|
|
50
50
|
"shart" ]
|
51
51
|
} }
|
52
52
|
props = Aduki.to_aduki hsh
|
53
|
-
props.
|
53
|
+
expect(props).to eq({
|
54
54
|
"foo" => "bar",
|
55
55
|
"bing.boo" => "wogga",
|
56
56
|
"bing.tingle" => "wimp",
|
@@ -58,10 +58,10 @@ describe Aduki do
|
|
58
58
|
"bing.harpoon[1]" => "twaddle",
|
59
59
|
"bing.harpoon[2]" => "scorn",
|
60
60
|
"bing.harpoon[3]" => "shart",
|
61
|
-
}
|
61
|
+
})
|
62
62
|
end
|
63
63
|
|
64
|
-
it "
|
64
|
+
it "flattens nested arrays " do
|
65
65
|
hsh = {
|
66
66
|
"foo" => "bar",
|
67
67
|
"bing" => {
|
@@ -73,7 +73,7 @@ describe Aduki do
|
|
73
73
|
{ :wing => :tip, :tail => :fin } ]
|
74
74
|
} }
|
75
75
|
props = Aduki.to_aduki hsh
|
76
|
-
props.
|
76
|
+
expect(props).to eq({
|
77
77
|
"foo" => "bar",
|
78
78
|
"bing.boo" => "wogga",
|
79
79
|
"bing.tingle" => "wimp",
|
@@ -84,10 +84,10 @@ describe Aduki do
|
|
84
84
|
"bing.harpoon[2][2]" => "gamma",
|
85
85
|
"bing.harpoon[3].wing" => :tip,
|
86
86
|
"bing.harpoon[3].tail" => :fin,
|
87
|
-
}
|
87
|
+
})
|
88
88
|
end
|
89
89
|
|
90
|
-
it "
|
90
|
+
it "flattens aduki objects " do
|
91
91
|
hsh = {
|
92
92
|
"foo" => "bar",
|
93
93
|
"bing" => {
|
@@ -99,7 +99,7 @@ describe Aduki do
|
|
99
99
|
{ :wing => :tip, :tail => :fin } ]
|
100
100
|
} }
|
101
101
|
props = Aduki.to_aduki hsh
|
102
|
-
props.
|
102
|
+
expect(props).to eq({
|
103
103
|
"foo" => "bar",
|
104
104
|
"bing.boo" => "wogga",
|
105
105
|
"bing.tingle" => "wimp",
|
@@ -110,6 +110,6 @@ describe Aduki do
|
|
110
110
|
"bing.harpoon[2][2]" => "gamma",
|
111
111
|
"bing.harpoon[3].wing" => :tip,
|
112
112
|
"bing.harpoon[3].tail" => :fin,
|
113
|
-
}
|
113
|
+
})
|
114
114
|
end
|
115
115
|
end
|
data/spec/to_date_spec.rb
CHANGED
@@ -3,7 +3,13 @@ require "spec_helper"
|
|
3
3
|
|
4
4
|
describe Aduki::Initializer do
|
5
5
|
|
6
|
-
|
6
|
+
class SomeTimeAgo < Aduki::Initializable
|
7
|
+
attr_accessor :days
|
8
|
+
def to_date ; Date.today - days ; end
|
9
|
+
def to_time ; Time.now - (days * 86400) ; end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "assigns a Date attribute" do
|
7
13
|
props = {
|
8
14
|
"x" => "The X",
|
9
15
|
"y" => "The Y",
|
@@ -18,7 +24,15 @@ describe Aduki::Initializer do
|
|
18
24
|
expect(contraption.planned.day).to eq 19
|
19
25
|
end
|
20
26
|
|
21
|
-
it "
|
27
|
+
it "assigns a Date attribute from something like a Date (ActiveSupport::TimeWithZone, DateTime, Time)" do
|
28
|
+
contraption = Contraption.new "planned" => SomeTimeAgo.new(days: 36)
|
29
|
+
expect(contraption.planned).to eq(Date.today - 36)
|
30
|
+
|
31
|
+
contraption = Contraption.new "planned" => (Time.now - (86400 * 64))
|
32
|
+
expect(contraption.planned).to eq(Date.today - 64)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "assigns a Time attribute" do
|
22
36
|
props = {
|
23
37
|
"x" => "The X",
|
24
38
|
"y" => "The Y",
|
@@ -35,4 +49,15 @@ describe Aduki::Initializer do
|
|
35
49
|
expect(contraption.updated.min).to eq 43
|
36
50
|
expect(contraption.updated.sec).to eq 0
|
37
51
|
end
|
52
|
+
|
53
|
+
it "assigns a Time attribute from something like a Time" do
|
54
|
+
contraption = Contraption.new updated: SomeTimeAgo.new(days: 72.5)
|
55
|
+
expect(contraption.updated).to be_a Time
|
56
|
+
expected = (Time.now - 72.5 * 86400)
|
57
|
+
expect(contraption.updated.to_i).to eq(expected.to_i)
|
58
|
+
|
59
|
+
contraption = Contraption.new updated: (Date.today - 88)
|
60
|
+
expect(contraption.updated).to be_a Time
|
61
|
+
expect(contraption.updated).to eq((Date.today - 88).to_time)
|
62
|
+
end
|
38
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aduki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Conan Dalton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- ".gitignore"
|
49
49
|
- ".rspec"
|
50
|
+
- ".zeiger.yml"
|
50
51
|
- Gemfile
|
51
52
|
- LICENSE.txt
|
52
53
|
- README.md
|
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
95
|
version: '0'
|
95
96
|
requirements: []
|
96
97
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.2.
|
98
|
+
rubygems_version: 2.5.2.3
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|
100
101
|
summary: set object attributes recursively from an attributes hash
|