gorillib 0.4.1pre → 0.4.2pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -10
- data/.rspec +1 -1
- data/.yardopts +1 -0
- data/CHANGELOG.md +47 -0
- data/Gemfile +22 -19
- data/Guardfile +23 -9
- data/README.md +12 -12
- data/Rakefile +29 -40
- data/VERSION +1 -1
- data/examples/benchmark/factories_benchmark.rb +87 -0
- data/examples/builder/ironfan.rb +1 -19
- data/examples/hash/slicing_methods.rb +101 -0
- data/gorillib.gemspec +36 -35
- data/lib/gorillib/array/deep_compact.rb +4 -3
- data/lib/gorillib/array/simple_statistics.rb +76 -0
- data/lib/gorillib/base.rb +0 -1
- data/lib/gorillib/builder.rb +15 -30
- data/lib/gorillib/collection.rb +159 -57
- data/lib/gorillib/collection/model_collection.rb +136 -43
- data/lib/gorillib/datetime/parse.rb +4 -2
- data/lib/gorillib/{array → deprecated/array}/average.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/random.rb +2 -1
- data/lib/gorillib/{array → deprecated/array}/sorted_median.rb +0 -0
- data/lib/gorillib/{array → deprecated/array}/sorted_percentile.rb +0 -0
- data/lib/gorillib/deprecated/array/sorted_sample.rb +13 -0
- data/lib/gorillib/{metaprogramming → deprecated/metaprogramming}/aliasing.rb +0 -0
- data/lib/gorillib/enumerable/sum.rb +3 -3
- data/lib/gorillib/exception/raisers.rb +92 -22
- data/lib/gorillib/factories.rb +550 -0
- data/lib/gorillib/hash/mash.rb +15 -58
- data/lib/gorillib/hashlike/deep_compact.rb +2 -2
- data/lib/gorillib/hashlike/slice.rb +55 -40
- data/lib/gorillib/model.rb +5 -3
- data/lib/gorillib/model/base.rb +33 -119
- data/lib/gorillib/model/defaults.rb +58 -14
- data/lib/gorillib/model/errors.rb +10 -0
- data/lib/gorillib/model/factories.rb +1 -367
- data/lib/gorillib/model/field.rb +40 -18
- data/lib/gorillib/model/fixup.rb +16 -0
- data/lib/gorillib/model/positional_fields.rb +35 -0
- data/lib/gorillib/model/schema_magic.rb +162 -0
- data/lib/gorillib/model/serialization.rb +1 -2
- data/lib/gorillib/model/serialization/csv.rb +59 -0
- data/lib/gorillib/pathname.rb +19 -8
- data/lib/gorillib/some.rb +2 -0
- data/lib/gorillib/string/constantize.rb +17 -10
- data/lib/gorillib/string/inflector.rb +11 -7
- data/lib/gorillib/type/boolean.rb +40 -0
- data/lib/gorillib/type/extended.rb +76 -40
- data/lib/gorillib/type/url.rb +6 -4
- data/lib/gorillib/utils/console.rb +1 -18
- data/lib/gorillib/utils/edge_cases.rb +18 -0
- data/spec/examples/builder/ironfan_spec.rb +5 -10
- data/spec/gorillib/array/compact_blank_spec.rb +36 -21
- data/spec/gorillib/array/simple_statistics_spec.rb +143 -0
- data/spec/gorillib/builder_spec.rb +16 -20
- data/spec/gorillib/collection_spec.rb +131 -35
- data/spec/gorillib/exception/raisers_spec.rb +39 -0
- data/spec/gorillib/hash/deep_compact_spec.rb +3 -3
- data/spec/gorillib/model/{record/defaults_spec.rb → defaults_spec.rb} +5 -1
- data/spec/gorillib/model/factories_spec.rb +335 -0
- data/spec/gorillib/model/{record/overlay_spec.rb → overlay_spec.rb} +0 -0
- data/spec/gorillib/model/serialization_spec.rb +2 -2
- data/spec/gorillib/model_spec.rb +19 -18
- data/spec/gorillib/pathname_spec.rb +7 -7
- data/spec/gorillib/string/truncate_spec.rb +3 -13
- data/spec/gorillib/type/extended_spec.rb +50 -2
- data/spec/gorillib/utils/capture_output_spec.rb +1 -1
- data/spec/spec_helper.rb +10 -7
- data/spec/support/factory_test_helpers.rb +76 -0
- data/spec/support/gorillib_test_helpers.rb +36 -24
- data/spec/support/model_test_helpers.rb +39 -2
- metadata +86 -51
- data/lib/alt/kernel/call_stack.rb +0 -56
- data/lib/gorillib/array/sorted_sample.rb +0 -12
- data/lib/gorillib/builder/field.rb +0 -5
- data/lib/gorillib/collection/has_collection.rb +0 -31
- data/lib/gorillib/collection/list_collection.rb +0 -58
- data/lib/gorillib/exception/confidence.rb +0 -17
- data/lib/gorillib/io/system_helpers.rb +0 -30
- data/lib/gorillib/model/record_schema.rb +0 -9
- data/lib/gorillib/utils/stub_module.rb +0 -33
- data/spec/array/average_spec.rb +0 -24
- data/spec/array/sorted_median_spec.rb +0 -18
- data/spec/array/sorted_percentile_spec.rb +0 -24
- data/spec/array/sorted_sample_spec.rb +0 -28
- data/spec/gorillib/metaprogramming/aliasing_spec.rb +0 -180
- data/spec/gorillib/model/record/factories_spec.rb +0 -335
- data/spec/support/kcode_test_helper.rb +0 -16
@@ -1,27 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'support/model_test_helpers'
|
3
|
+
require 'gorillib/hash/compact'
|
2
4
|
|
3
5
|
# libs under test
|
4
6
|
require 'gorillib/builder'
|
5
|
-
require 'gorillib/builder/field'
|
6
7
|
require 'gorillib/collection/model_collection'
|
7
8
|
|
8
|
-
# testing helpers
|
9
|
-
require 'gorillib/hash/compact'
|
10
|
-
require 'model_test_helpers'
|
11
|
-
|
12
9
|
describe Gorillib::Builder, :model_spec => true, :builder_spec => true do
|
13
10
|
|
14
|
-
let(:smurf_class) do
|
15
|
-
class Gorillib::Test::Smurf
|
16
|
-
include Gorillib::Builder
|
17
|
-
magic :smurfiness, Integer
|
18
|
-
magic :weapon, Symbol
|
19
|
-
end
|
20
|
-
Gorillib::Test::Smurf
|
21
|
-
end
|
22
|
-
let(:poppa_smurf ){ smurf_class.receive(:name => 'Poppa Smurf', :smurfiness => 9, :weapon => 'staff') }
|
23
|
-
let(:smurfette ){ smurf_class.receive(:name => 'Smurfette', :smurfiness => 11, :weapon => 'charm') }
|
24
|
-
|
25
11
|
#
|
26
12
|
# IT BEHAVES LIKE A MODEL
|
27
13
|
# (maybe you wouldn't notice if it was just one little line)
|
@@ -67,6 +53,14 @@ describe Gorillib::Builder, :model_spec => true, :builder_spec => true do
|
|
67
53
|
wildcat.receive!({}){|c| expect_7 = 7 ; expect_obj = c }
|
68
54
|
expect_7.should == 7 ; expect_obj.should == wildcat
|
69
55
|
end
|
56
|
+
it 'with a block, returns its return value' do
|
57
|
+
val = mock_val
|
58
|
+
wildcat.receive!{ val }.should == val
|
59
|
+
wildcat.receive!{|obj| val }.should == val
|
60
|
+
end
|
61
|
+
it 'with no block, returns nil' do
|
62
|
+
wildcat.receive!.should be_nil
|
63
|
+
end
|
70
64
|
end
|
71
65
|
|
72
66
|
context ".magic" do
|
@@ -129,14 +123,16 @@ describe Gorillib::Builder, :model_spec => true, :builder_spec => true do
|
|
129
123
|
wildcat.should respond_to(:doors)
|
130
124
|
wildcat.should_not respond_to(:doors=)
|
131
125
|
end
|
126
|
+
|
127
|
+
|
132
128
|
end
|
133
129
|
|
134
130
|
context 'collections' do
|
135
131
|
subject{ garage }
|
136
|
-
let(:sample_val){ Gorillib::ModelCollection.receive([wildcat], :name, car_class) }
|
132
|
+
let(:sample_val){ Gorillib::ModelCollection.receive([wildcat], key_method: :name, item_type: car_class) }
|
137
133
|
let(:raw_val ){ [ wildcat.attributes ] }
|
138
134
|
it_behaves_like "a model field", :cars
|
139
|
-
it("#read_attribute is an empty collection if never set"){ subject.read_attribute(:cars).should == Gorillib::ModelCollection.new }
|
135
|
+
it("#read_attribute is an empty collection if never set"){ subject.read_attribute(:cars).should == Gorillib::ModelCollection.new(key_method: :to_key) }
|
140
136
|
|
141
137
|
it 'a collection holds named objects' do
|
142
138
|
garage.cars.should be_empty
|
@@ -157,13 +153,13 @@ describe Gorillib::Builder, :model_spec => true, :builder_spec => true do
|
|
157
153
|
|
158
154
|
# examine the whole collection
|
159
155
|
garage.cars.keys.should == [:cadzilla, :wildcat, :ford_39]
|
160
|
-
garage.cars.should == Gorillib::ModelCollection.receive([cadzilla, wildcat, ford_39], :name, car_class)
|
156
|
+
garage.cars.should == Gorillib::ModelCollection.receive([cadzilla, wildcat, ford_39], key_method: :name, item_type: car_class)
|
161
157
|
end
|
162
158
|
|
163
159
|
it 'lazily autovivifies collection items' do
|
164
160
|
garage.cars.should be_empty
|
165
161
|
garage.car(:chimera).should be_a(car_class)
|
166
|
-
garage.cars.should == Gorillib::ModelCollection.receive([{:name => :chimera}], :name, car_class)
|
162
|
+
garage.cars.should == Gorillib::ModelCollection.receive([{:name => :chimera}], key_method: :name, item_type: car_class)
|
167
163
|
end
|
168
164
|
|
169
165
|
context 'collection getset method' do
|
@@ -2,8 +2,7 @@ require 'spec_helper'
|
|
2
2
|
#
|
3
3
|
require 'gorillib/model'
|
4
4
|
require 'gorillib/collection/model_collection'
|
5
|
-
require '
|
6
|
-
require 'model_test_helpers'
|
5
|
+
require 'support/model_test_helpers'
|
7
6
|
|
8
7
|
shared_context :collection_spec do
|
9
8
|
# a collection with the internal :clxn mocked out, and a method 'innards' to
|
@@ -15,17 +14,17 @@ shared_context :collection_spec do
|
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
18
|
-
shared_examples_for 'a collection' do
|
17
|
+
shared_examples_for 'a collection' do |options={}|
|
19
18
|
subject{ string_collection }
|
20
19
|
|
21
20
|
context '.receive' do
|
22
21
|
it 'makes a new collection, has it #receive! the cargo, returns it' do
|
23
22
|
mock_collection = mock('collection')
|
24
23
|
mock_cargo = mock('cargo')
|
25
|
-
mock_args =
|
26
|
-
described_class.should_receive(:new).with(
|
24
|
+
mock_args = {key_method: mock, item_type: mock}
|
25
|
+
described_class.should_receive(:new).with(mock_args).and_return(mock_collection)
|
27
26
|
mock_collection.should_receive(:receive!).with(mock_cargo)
|
28
|
-
described_class.receive(mock_cargo,
|
27
|
+
described_class.receive(mock_cargo, mock_args).should == mock_collection
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
@@ -61,16 +60,19 @@ shared_examples_for 'a collection' do
|
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
63
|
+
unless (options[:receiving_arrays] == :skip)
|
64
|
+
context '#receive (array)', :if => :receives_arrays do
|
65
|
+
it 'adopts the contents of an array' do
|
66
|
+
string_collection.receive!(%w[horton hears a who])
|
67
|
+
string_collection.values.should == %w[wocket in my pocket horton hears a who]
|
68
|
+
end
|
69
|
+
it 'does not adopt duplicates' do
|
70
|
+
string_collection.receive!(%w[red fish blue fish])
|
71
|
+
string_collection.values.should == %w[wocket in my pocket red fish blue]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
74
76
|
context '#receive (hash)' do
|
75
77
|
it 'adopts the values of a hash' do
|
76
78
|
string_collection.receive!({horton: "horton", hears: "hears", a: "a", who: "who" })
|
@@ -96,6 +98,7 @@ shared_examples_for 'a keyed collection' do
|
|
96
98
|
end
|
97
99
|
|
98
100
|
context '#fetch' do
|
101
|
+
ABSENT_KEY_ERROR_RE = /(key not found: 69|index 69 outside)/
|
99
102
|
it 'retrieves an object if present' do
|
100
103
|
subject[1] = mock_val
|
101
104
|
subject.fetch(1).should equal(mock_val)
|
@@ -106,7 +109,7 @@ shared_examples_for 'a keyed collection' do
|
|
106
109
|
got_here.should == 'yup'
|
107
110
|
end
|
108
111
|
it 'if absent and no block given: raises an error' do
|
109
|
-
->{ subject.fetch(69) }.should raise_error IndexError,
|
112
|
+
->{ subject.fetch(69) }.should raise_error IndexError, ABSENT_KEY_ERROR_RE
|
110
113
|
end
|
111
114
|
end
|
112
115
|
|
@@ -176,30 +179,123 @@ shared_examples_for 'an auto-keyed collection' do
|
|
176
179
|
end
|
177
180
|
|
178
181
|
describe 'collections:', :model_spec, :collection_spec do
|
182
|
+
let(:symbolized_test_items){ {:wocket => 'wocket', :in => 'in', :my => 'my', :pocket => 'pocket'} }
|
183
|
+
let(:capitalized_test_items){ {'WOCKET' => 'wocket', 'IN' => 'in', 'MY' => 'my', 'POCKET' => 'pocket'} }
|
184
|
+
|
185
|
+
describe Gorillib::Collection do
|
186
|
+
context 'with no key_method (only explicit labels can be stored)' do
|
187
|
+
let(:string_collection){ described_class.receive(symbolized_test_items) }
|
188
|
+
let(:shouty_collection){ described_class.receive(capitalized_test_items) }
|
189
|
+
it_behaves_like 'a collection', :receiving_arrays => :skip
|
190
|
+
it_behaves_like 'a keyed collection'
|
191
|
+
end
|
179
192
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
193
|
+
context 'with no key_method (only explicit labels can be stored)' do
|
194
|
+
let(:string_collection){ described_class.receive(symbolized_test_items, key_method: :to_sym) }
|
195
|
+
let(:shouty_collection){ described_class.receive(capitalized_test_items, key_method: :upcase) }
|
196
|
+
it_behaves_like 'a collection', :receiving_arrays => true
|
197
|
+
it_behaves_like 'an auto-keyed collection'
|
198
|
+
end
|
184
199
|
end
|
185
200
|
|
186
|
-
describe Gorillib::
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
201
|
+
describe Gorillib::ModelCollection, :model_spec do
|
202
|
+
context do
|
203
|
+
let(:string_collection){ described_class.receive(%w[wocket in my pocket], key_method: :to_sym, item_type: String) }
|
204
|
+
let(:shouty_collection){ described_class.receive(%w[wocket in my pocket], key_method: :upcase, item_type: String) }
|
205
|
+
it_behaves_like 'a collection'
|
206
|
+
it_behaves_like 'a keyed collection'
|
207
|
+
it_behaves_like 'an auto-keyed collection'
|
208
|
+
end
|
209
|
+
|
210
|
+
subject{ smurf_collection }
|
211
|
+
let(:smurf_collection){ described_class.receive([], key_method: :name, item_type: smurf_class) }
|
212
|
+
let(:test_item){ papa_smurf }
|
213
|
+
let(:test_attrs){ test_item.attributes }
|
214
|
+
let(:mock_factory){ mf = mock('factory'); mf.stub!(:native? => true) ; mf }
|
191
215
|
|
192
|
-
|
193
|
-
|
194
|
-
|
216
|
+
context '#receive_item' do
|
217
|
+
before do
|
218
|
+
@test_proc = ->{ 'test' };
|
219
|
+
subject.stub(item_type: mock_factory)
|
220
|
+
end
|
195
221
|
|
222
|
+
it 'sends it to item_type for receive, then adds it' do
|
223
|
+
mock_factory.should_receive(:receive).with(mock_val, &@test_proc).and_return(mock_val)
|
224
|
+
subject.should_receive(:add).with(mock_val, nil)
|
225
|
+
subject.receive_item(nil, mock_val, &@test_proc)
|
226
|
+
end
|
227
|
+
it 'accepts an explicit label' do
|
228
|
+
mock_factory.should_receive(:receive).with(mock_val, &@test_proc).and_return(mock_val)
|
229
|
+
subject.should_receive(:add).with(mock_val, 'truffula')
|
230
|
+
subject.receive_item('truffula', mock_val, &@test_proc)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context '#update_or_add' do
|
235
|
+
it "if absent, creates item with given attrs" do
|
236
|
+
test_proc = ->{ 'test' };
|
237
|
+
subject.should_receive(:receive_item).with('truffula', test_attrs.merge(name: 'truffula'), &test_proc).and_return(test_item)
|
238
|
+
#
|
239
|
+
subject.update_or_add('truffula', test_attrs, &test_proc)
|
240
|
+
end
|
241
|
+
it "if there's no key_method, does not it as an attr to create" do
|
242
|
+
subject.send(:remove_instance_variable, '@key_method')
|
243
|
+
subject.should_receive(:receive_item).with('truffula', test_attrs)
|
244
|
+
#
|
245
|
+
subject.update_or_add('truffula', test_attrs)
|
246
|
+
end
|
247
|
+
it "if present, updates item with attrs" do
|
248
|
+
test_proc = ->{ 'test' };
|
249
|
+
hsh = { :smurfiness => 99 }
|
250
|
+
subject['truffula'] = test_item
|
251
|
+
test_item.should_receive(:receive!).with(hsh, &test_proc)
|
252
|
+
#
|
253
|
+
subject.update_or_add('truffula', hsh, &test_proc)
|
254
|
+
end
|
255
|
+
it "returns item" do
|
256
|
+
updated_item = test_item.dup ; updated_item.name = 'truffula'
|
257
|
+
subject.update_or_add('truffula', test_attrs).should == updated_item
|
258
|
+
subject.update_or_add('truffula', test_item ).should == test_item
|
259
|
+
end
|
260
|
+
it 'FIXME: does not behave right on existing bojects' do
|
261
|
+
updated_item = test_item.dup ; updated_item.name = 'truffula'
|
262
|
+
subject.update_or_add('truffula', test_item ).should == updated_item
|
263
|
+
end
|
264
|
+
it "adds item to collection" do
|
265
|
+
updated_item = test_item.dup ; updated_item.name = 'truffula'
|
266
|
+
subject.update_or_add('truffula', test_attrs)
|
267
|
+
subject['truffula'].should == updated_item
|
268
|
+
end
|
269
|
+
end
|
196
270
|
end
|
197
271
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
272
|
+
|
273
|
+
describe Gorillib::Model do
|
274
|
+
describe '.collection' do
|
275
|
+
let(:described_class){ smurf_village_class }
|
276
|
+
subject{ described_class.new(name: :smurf_town) }
|
277
|
+
before do
|
278
|
+
smurf_collection_class ; smurf_village_class
|
279
|
+
smurf_class.field :village, smurf_village_class
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'adds an eponymous field' do
|
283
|
+
described_class.should have_field(:smurfs)
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'sets a default that auto-vivifies the collection field' do
|
287
|
+
subject.smurfs.should be_a(Gorillib::ModelCollection)
|
288
|
+
subject.smurfs.belongs_to.should == subject
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'receives' do
|
292
|
+
subject = smurf_village_class.receive({name: :smurf_town,
|
293
|
+
smurfs: [
|
294
|
+
{ name: 'whatever_smurf', smurfiness: 20},
|
295
|
+
]})
|
296
|
+
subject.smurfs['whatever_smurf'].village.should == subject
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
204
300
|
end
|
205
301
|
end
|
@@ -9,6 +9,7 @@ describe 'raisers' do
|
|
9
9
|
def should_return_true
|
10
10
|
yield.should be_true
|
11
11
|
end
|
12
|
+
# different rubies have different error messages ARRGH.
|
12
13
|
def capture_error
|
13
14
|
message = 'should have raised, did not'
|
14
15
|
begin
|
@@ -42,6 +43,11 @@ describe 'raisers' do
|
|
42
43
|
should_raise_my_error(capture_error{ [].fill() }){ described_class.check_arity!([], 1..3) }
|
43
44
|
should_raise_my_error(capture_error{ [].to_s(1) }){ described_class.check_arity!([1], 0) }
|
44
45
|
end
|
46
|
+
it 'appends result of block (if given) to message' do
|
47
|
+
str = "esiar no delave ylno"
|
48
|
+
->{ described_class.check_arity!([], 1..3){ str.reverse! } }.should raise_error(/only evaled on raise/)
|
49
|
+
str.should == "only evaled on raise"
|
50
|
+
end
|
45
51
|
end
|
46
52
|
|
47
53
|
context '.arity_at_least!' do
|
@@ -57,4 +63,37 @@ describe 'raisers' do
|
|
57
63
|
end
|
58
64
|
end
|
59
65
|
end
|
66
|
+
|
67
|
+
describe TypeMismatchError do
|
68
|
+
context '.mismatched!' do
|
69
|
+
let(:error_message){ /.+ has mismatched type/ }
|
70
|
+
it 'raises an error' do
|
71
|
+
should_raise_my_error{ described_class.mismatched!("string", Integer) }
|
72
|
+
should_raise_my_error{ described_class.mismatched!(Object.new) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context '.check_type!' do
|
77
|
+
let(:error_message){ /.+ has mismatched type; expected .+/ }
|
78
|
+
it 'raises true if any type matches' do
|
79
|
+
should_return_true{ described_class.check_type!("string", [Integer, String]) }
|
80
|
+
end
|
81
|
+
it 'raises an error if nothing matches' do
|
82
|
+
should_raise_my_error{ described_class.check_type!("string", [Integer, Float]) }
|
83
|
+
should_raise_my_error{ described_class.check_type!("string", [Integer]) }
|
84
|
+
should_raise_my_error{ described_class.check_type!("string", Integer) }
|
85
|
+
end
|
86
|
+
it 'checks is_a? given a class' do
|
87
|
+
should_return_true{ described_class.check_type!("string", [Integer, String]) }
|
88
|
+
should_return_true{ described_class.check_type!(7, [Integer, String]) }
|
89
|
+
should_raise_my_error{ described_class.check_type!(:symbol, [Integer, String]) }
|
90
|
+
end
|
91
|
+
it 'checks responds_to? given a symbol' do
|
92
|
+
should_return_true{ described_class.check_type!("string", [:to_str, :to_int]) }
|
93
|
+
should_return_true{ described_class.check_type!(7, [:to_str, :to_int]) }
|
94
|
+
should_raise_my_error{ described_class.check_type!(:symbol, [:to_str, :to_int]) }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
60
99
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'gorillib/hash/deep_compact'
|
3
3
|
require 'gorillib/array/deep_compact'
|
4
4
|
|
5
|
-
describe Hash, :hashlike_spec
|
5
|
+
describe Hash, :hashlike_spec do
|
6
6
|
describe 'array/deep_compact and hash/deep_compact' do
|
7
7
|
it "should respond to the method deep_compact!" do
|
8
8
|
{ }.should respond_to :deep_compact!
|
@@ -13,13 +13,13 @@ describe Hash, :hashlike_spec => true do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should return a hash with all blank values removed recursively" do
|
16
|
-
@test_hash = {:e=>["", nil, [], {}, "foo", { :a=> [nil, {}, { :c=> ["","",[]] } ], :b => nil }]}
|
16
|
+
@test_hash = {:e => ["", nil, [], {}, "foo", { :a => [nil, {}, { :c => ["","",[]] } ], :b => nil }]}
|
17
17
|
@test_hash.deep_compact!.should == {:e=>["foo"]}
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe Array, :hashlike_spec
|
22
|
+
describe Array, :hashlike_spec do
|
23
23
|
describe 'array/deep_compact and hash/deep_compact' do
|
24
24
|
it "should respond to the method deep_compact!" do
|
25
25
|
[ ].should respond_to :deep_compact!
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
require 'gorillib/
|
3
|
+
require 'gorillib/metaprogramming/concern'
|
4
|
+
require 'gorillib/metaprogramming/class_attribute'
|
5
|
+
require 'gorillib/model/named_schema'
|
6
|
+
require 'gorillib/model/base'
|
7
|
+
require 'gorillib/model/schema_magic'
|
4
8
|
require 'gorillib/model/field'
|
5
9
|
require 'gorillib/model/defaults'
|
6
10
|
|
@@ -0,0 +1,335 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
# require 'support/factory_test_helpers'
|
3
|
+
|
4
|
+
require 'gorillib/object/blank'
|
5
|
+
require 'gorillib/object/try_dup'
|
6
|
+
require 'gorillib/hash/slice'
|
7
|
+
require 'gorillib/metaprogramming/class_attribute'
|
8
|
+
require 'gorillib/string/inflector'
|
9
|
+
|
10
|
+
require 'gorillib/collection'
|
11
|
+
require 'gorillib/model/factories'
|
12
|
+
|
13
|
+
require 'factory_test_helpers'
|
14
|
+
|
15
|
+
describe '', :model_spec, :factory_spec, :only do
|
16
|
+
|
17
|
+
describe Gorillib::Factory do
|
18
|
+
describe 'Factory()' do
|
19
|
+
it 'turns a proc into an ApplyProcFactory' do
|
20
|
+
ff = Gorillib::Factory( ->(obj){ "bob says #{obj}" } )
|
21
|
+
ff.receive(3).should == "bob says 3"
|
22
|
+
end
|
23
|
+
it 'returns anything that responds to #receive directly' do
|
24
|
+
ff = Object.new ; ff.define_singleton_method(:receive){}
|
25
|
+
Gorillib::Factory(ff).should equal(ff)
|
26
|
+
end
|
27
|
+
it 'returns a factory directly' do
|
28
|
+
ff = Gorillib::Factory::SymbolFactory.new
|
29
|
+
Gorillib::Factory(ff).should equal(ff)
|
30
|
+
end
|
31
|
+
it 'does not look up factory **classes**' do
|
32
|
+
->{ Gorillib::Factory(Gorillib::Factory::SymbolFactory) }.should raise_error(ArgumentError, /Don\'t know which factory makes/)
|
33
|
+
end
|
34
|
+
it 'looks up factories by typename' do
|
35
|
+
Gorillib::Factory(:symbol ).should be_a(Gorillib::Factory::SymbolFactory)
|
36
|
+
Gorillib::Factory(:identical).should == (::Whatever)
|
37
|
+
end
|
38
|
+
it 'looks up factories by class' do
|
39
|
+
Gorillib::Factory(Symbol).should be_a(Gorillib::Factory::SymbolFactory)
|
40
|
+
Gorillib::Factory(String).should be_a(Gorillib::Factory::StringFactory)
|
41
|
+
end
|
42
|
+
it 'calls Gorillib::Factory.lookup' do
|
43
|
+
x = mock
|
44
|
+
Gorillib::Factory.should_receive(:find).with(x)
|
45
|
+
Gorillib::Factory(x)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# __________________________________________________________________________
|
51
|
+
#
|
52
|
+
#
|
53
|
+
#
|
54
|
+
describe Gorillib::Factory::StringFactory do
|
55
|
+
it_behaves_like :it_considers_native, 'foo', ''
|
56
|
+
it_behaves_like :it_converts, :foo => 'foo', 3 => '3', false => "false", [] => "[]"
|
57
|
+
it_behaves_like :it_considers_blankish, nil
|
58
|
+
it_behaves_like :it_is_registered_as, :string, String
|
59
|
+
its(:typename){ should == :string }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe Gorillib::Factory::SymbolFactory do
|
63
|
+
it_behaves_like :it_considers_native, :foo, :"symbol :with weird chars"
|
64
|
+
it_behaves_like :it_converts, 'foo' => :foo
|
65
|
+
it_behaves_like :it_considers_blankish, nil, ""
|
66
|
+
it_behaves_like :it_is_a_mismatch_for, 3, false, []
|
67
|
+
it_behaves_like :it_is_registered_as, :symbol, Symbol
|
68
|
+
its(:typename){ should == :symbol }
|
69
|
+
end
|
70
|
+
|
71
|
+
describe Gorillib::Factory::RegexpFactory do
|
72
|
+
it_behaves_like :it_considers_native, /foo/, //
|
73
|
+
it_behaves_like :it_converts, 'foo' => /foo/, ".*" => /.*/
|
74
|
+
it_behaves_like :it_considers_blankish, nil, ""
|
75
|
+
it_behaves_like :it_is_a_mismatch_for, :foo, 3, false, []
|
76
|
+
it_behaves_like :it_is_registered_as, :regexp, Regexp
|
77
|
+
its(:typename){ should == :regexp }
|
78
|
+
end
|
79
|
+
|
80
|
+
describe Gorillib::Factory::IntegerFactory do
|
81
|
+
it_behaves_like :it_considers_native, 1, -1, 123_456_789_123_456_789_123_456_789_123_456_789
|
82
|
+
#
|
83
|
+
it_behaves_like :it_converts, '1' => 1, '0' => 0, '1234567' => 1234567
|
84
|
+
it_behaves_like :it_converts, '123456789123456789123456789123456789' => 123_456_789_123_456_789_123_456_789_123_456_789
|
85
|
+
it_behaves_like :it_converts, '1_234_567' => 1234567
|
86
|
+
it_behaves_like :it_converts, 1.0 => 1, 1.99 => 1, -0.9 => 0
|
87
|
+
it_behaves_like :it_converts, Complex(1,0) => 1, Complex(1.0,0) => 1, Rational(5,2) => 2
|
88
|
+
#
|
89
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
90
|
+
it_behaves_like :it_is_a_mismatch_for, Complex(1,0.0), Complex(0,3), :foo, false, []
|
91
|
+
it_behaves_like :it_is_a_mismatch_for, '8_', 'one', '3blindmice', '_8_'
|
92
|
+
it_behaves_like :it_is_a_mismatch_for, Float::INFINITY, Float::NAN
|
93
|
+
# Does not accept floating-point-ish
|
94
|
+
it_behaves_like :it_is_a_mismatch_for, '1.0', '0.0', '1234567.0'
|
95
|
+
it_behaves_like :it_is_a_mismatch_for, '1e5', '1_234_567e-3', '1_234_567.0', '+11.123E+12'
|
96
|
+
# Handles hex
|
97
|
+
it_behaves_like :it_converts, '011' => 9, '0x10' => 16
|
98
|
+
# Intolerant of cruft, unlike GraciousIntegerFactory
|
99
|
+
it_behaves_like :it_is_a_mismatch_for, '0L', '1_234_567L', '1_234_567e-3f', '1,234,567'
|
100
|
+
#
|
101
|
+
it_behaves_like :it_is_registered_as, :int, :integer, Integer
|
102
|
+
its(:typename){ should == :integer }
|
103
|
+
end
|
104
|
+
|
105
|
+
describe Gorillib::Factory::GraciousIntegerFactory do
|
106
|
+
it_behaves_like :it_considers_native, 1, -1, 123_456_789_123_456_789_123_456_789_123_456_789
|
107
|
+
#
|
108
|
+
it_behaves_like :it_converts, '1' => 1, '0' => 0, '1234567' => 1234567
|
109
|
+
it_behaves_like :it_converts, '123456789123456789123456789123456789' => 123_456_789_123_456_789_123_456_789_123_456_789
|
110
|
+
it_behaves_like :it_converts, '1_234_567' => 1234567
|
111
|
+
it_behaves_like :it_converts, 1.0 => 1, 1.99 => 1, -0.9 => 0
|
112
|
+
it_behaves_like :it_converts, Complex(1,0) => 1, Complex(1.0,0) => 1, Rational(5,2) => 2
|
113
|
+
#
|
114
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
115
|
+
it_behaves_like :it_is_a_mismatch_for, Complex(1,0.0), Complex(0,3), :foo, false, []
|
116
|
+
it_behaves_like :it_is_a_mismatch_for, '8_', 'one', '3blindmice', '_8_'
|
117
|
+
it_behaves_like :it_is_a_mismatch_for, Float::INFINITY, Float::NAN
|
118
|
+
# Handles floating-point well
|
119
|
+
it_behaves_like :it_converts, '1.0' => 1, '0.0' => 0, '1234567.0' => 1234567
|
120
|
+
it_behaves_like :it_converts, '1e5' => 100000, '1_234_567e-3' => 1234, '1_234.5e3' => 1_234_500, '+11.123E+12' => 11_123_000_000_000
|
121
|
+
# Silently confuses hex and octal
|
122
|
+
it_behaves_like :it_converts, '011' => 9, '0x10' => 16, '0x1.999999999999ap4' => 25
|
123
|
+
# Tolerates some cruft, unlike IntegerFactory
|
124
|
+
it_behaves_like :it_converts, '0L' => 0, '1_234_567L' => 1234567, '1234.5e3f' => 1_234_500, '1234567e-3f' => 1_234
|
125
|
+
it_behaves_like :it_converts, '1,234,567' => 1234567, ',,,,1,23,45.67e,-1,' => 1234
|
126
|
+
#
|
127
|
+
it_behaves_like :it_is_registered_as, :gracious_int
|
128
|
+
its(:typename){ should == :integer }
|
129
|
+
end
|
130
|
+
|
131
|
+
describe Gorillib::Factory::FloatFactory do
|
132
|
+
it_behaves_like :it_considers_native, 1.0, 1.234567e6, 123_456_789_123_456_789_123_456_789_123_456_789.0
|
133
|
+
it_behaves_like :it_considers_native, Float::INFINITY, Float::NAN
|
134
|
+
it_behaves_like :it_converts, '1' => 1.0, '0' => 0.0, '1234567' => 1234567.0
|
135
|
+
it_behaves_like :it_converts, '1.0' => 1.0, '0.0' => 0.0, '1234567.0' => 1234567.0
|
136
|
+
it_behaves_like :it_converts, '123456789123456789123456789123456789' => 123_456_789_123_456_789_123_456_789_123_456_789.0
|
137
|
+
it_behaves_like :it_converts, '1_234_567' => 1234567.0
|
138
|
+
it_behaves_like :it_converts, 1 => 1.0
|
139
|
+
it_behaves_like :it_converts, Complex(1,0) => 1.0, Complex(1.0,0) => 1.0, Rational(5,2) => 2.5
|
140
|
+
it_behaves_like :it_converts, '1e5' => 1e5, '1_234_567e-3' => 1234.567, '1_234_567.0' => 1234567.0, '+11.123E+700' => 11.123e700
|
141
|
+
#
|
142
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
143
|
+
it_behaves_like :it_is_a_mismatch_for, Complex(1,0.0), Complex(0,3), :foo, false, []
|
144
|
+
#
|
145
|
+
# Different from #to_f
|
146
|
+
it_behaves_like :it_converts, '011' => 11.0, '0x10' => 16.0, '0x1.999999999999ap4' => 25.6
|
147
|
+
it_behaves_like :it_is_a_mismatch_for, '0L', '1_234_567L', '1_234_567e-3f'
|
148
|
+
it_behaves_like :it_is_a_mismatch_for, '_8_', 'one', '3blindmice', '8_'
|
149
|
+
#
|
150
|
+
it_behaves_like :it_is_registered_as, :float, Float
|
151
|
+
its(:typename){ should == :float }
|
152
|
+
end
|
153
|
+
|
154
|
+
describe Gorillib::Factory::GraciousFloatFactory do
|
155
|
+
it_behaves_like :it_considers_native, 1.0, 1.234567e6, 123_456_789_123_456_789_123_456_789_123_456_789.0
|
156
|
+
it_behaves_like :it_converts, '1' => 1.0, '0' => 0.0, '1234567' => 1234567.0
|
157
|
+
it_behaves_like :it_converts, '1.0' => 1.0, '0.0' => 0.0, '1234567.0' => 1234567.0
|
158
|
+
it_behaves_like :it_converts, '123456789123456789123456789123456789' => 123_456_789_123_456_789_123_456_789_123_456_789.0
|
159
|
+
it_behaves_like :it_converts, '1_234_567' => 1234567.0
|
160
|
+
it_behaves_like :it_converts, 1 => 1.0
|
161
|
+
it_behaves_like :it_converts, Complex(1,0) => 1.0, Complex(1.0,0) => 1.0, Rational(5,2) => 2.5
|
162
|
+
it_behaves_like :it_converts, '1e5' => 1e5, '1_234_567e-3' => 1234.567, '1_234_567.0' => 1234567.0, '+11.123E+700' => 11.123e700
|
163
|
+
#
|
164
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
165
|
+
it_behaves_like :it_is_a_mismatch_for, Complex(1,0.0), Complex(0,3), :foo, false, []
|
166
|
+
#
|
167
|
+
# Different from stricter FloatFactory or laxer #to_f
|
168
|
+
it_behaves_like :it_converts, '011' => 11.0, '0x10' => 16.0, '0x1.999999999999ap4' => 25.6
|
169
|
+
it_behaves_like :it_converts, '0L' => 0.0, '1_234_567L' => 1234567.0, '1_234_567e-3f' => 1234.567
|
170
|
+
it_behaves_like :it_is_a_mismatch_for, '_8_', 'one', '3blindmice', '8_'
|
171
|
+
it_behaves_like :it_converts, '1,234,567e-3' => 1234.567, ',,,,1,23,45.67e,-1,' => 1234.567, '+11.123E+700' => 11.123e700
|
172
|
+
#
|
173
|
+
it_behaves_like :it_is_registered_as, :gracious_float
|
174
|
+
its(:typename){ should == :float }
|
175
|
+
end
|
176
|
+
|
177
|
+
describe Gorillib::Factory::ComplexFactory do
|
178
|
+
cplx0 = Complex(0) ; cplx1 = Complex(1) ; cplx1234500 = Complex(1_234_500,0) ; cplx1234500f = Complex(1_234_500.0,0) ;
|
179
|
+
it_behaves_like :it_considers_native, Complex(1,3), Complex(1,0)
|
180
|
+
it_behaves_like :it_converts, '1234.5e3' => cplx1234500f, '1234500' => cplx1234500, '0' => cplx0
|
181
|
+
it_behaves_like :it_converts, 1234.5e3 => cplx1234500f, 1 => cplx1, -1 => Complex(-1), Rational(3,2) => Complex(Rational(3,2),0)
|
182
|
+
it_behaves_like :it_converts, [1,0] => Complex(1), [1,2] => Complex(1,2)
|
183
|
+
it_behaves_like :it_converts, ['1234.5e3','98.6'] => Complex(1234.5e3, 98.6)
|
184
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
185
|
+
it_behaves_like :it_is_a_mismatch_for, 'one', '3blindmice', '0x10', '1234.5e3f', '1234L', :foo, false, []
|
186
|
+
it_behaves_like :it_is_registered_as, :complex, Complex
|
187
|
+
its(:typename){ should == :complex }
|
188
|
+
end
|
189
|
+
|
190
|
+
describe Gorillib::Factory::RationalFactory do
|
191
|
+
rat_0 = Rational(0) ; rat1 = Rational(1) ; rat3_2 = Rational(3, 2) ;
|
192
|
+
it_behaves_like :it_considers_native, Rational(1, 3), Rational(1, 7)
|
193
|
+
it_behaves_like :it_converts, '1.5' => rat3_2, '1' => rat1, '0' => rat_0, '1_234_567' => Rational(1234567), '1_234_567.0' => Rational(1234567)
|
194
|
+
it_behaves_like :it_converts, 1.5 => rat3_2, 1 => rat1, -1 => Rational(-1), Complex(1.5) => rat3_2
|
195
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
196
|
+
it_behaves_like :it_is_a_mismatch_for, 'one', '3blindmice', '0x10', '1234.5e3f', '1234L', :foo, false, [], Complex(1.5,3)
|
197
|
+
it_behaves_like :it_is_registered_as, :rational, Rational
|
198
|
+
its(:typename){ should == :rational }
|
199
|
+
end
|
200
|
+
|
201
|
+
describe Gorillib::Factory::TimeFactory do
|
202
|
+
fuck_wit_dre_day = Time.new(1993, 2, 18, 8, 8, 0, '-08:00') # and Everybody's Celebratin'
|
203
|
+
ice_cubes_good_day = Time.utc(1992, 1, 20, 0, 0, 0)
|
204
|
+
it_behaves_like :it_considers_native, Time.now.utc, ice_cubes_good_day
|
205
|
+
it_behaves_like :it_converts, fuck_wit_dre_day => fuck_wit_dre_day.getutc
|
206
|
+
it_behaves_like :it_converts, '19930218160800' => fuck_wit_dre_day.getutc, '19920120000000Z' => ice_cubes_good_day
|
207
|
+
it_behaves_like :it_converts, Date.new(1992, 1, 20) => ice_cubes_good_day
|
208
|
+
before('behaves like it_converts "an unparseable time" to nil'){ subject.stub(:warn) }
|
209
|
+
it_behaves_like :it_converts, "an unparseable time" => nil, :non_native_ok => true
|
210
|
+
it_behaves_like :it_considers_blankish, nil, ''
|
211
|
+
it_behaves_like :it_is_a_mismatch_for, :foo, false, []
|
212
|
+
it_behaves_like :it_is_registered_as, :time, Time
|
213
|
+
it('always returns a UTC timezoned time') do
|
214
|
+
subject.convert(fuck_wit_dre_day).utc_offset.should == 0
|
215
|
+
fuck_wit_dre_day.utc_offset.should == (-8 * 3600)
|
216
|
+
end
|
217
|
+
its(:typename){ should == :time }
|
218
|
+
end
|
219
|
+
|
220
|
+
describe Gorillib::Factory::BooleanFactory do
|
221
|
+
it_behaves_like :it_considers_native, true, false
|
222
|
+
it_behaves_like :it_considers_blankish, nil
|
223
|
+
it_behaves_like :it_converts, 'false' => false, :false => false
|
224
|
+
it_behaves_like :it_converts, 'true' => true, :true => true, '0' => true, 0 => true, [] => true, :foo => true, [] => true, Complex(1.5,3) => true, Object.new => true
|
225
|
+
it_behaves_like :it_is_registered_as, :boolean
|
226
|
+
its(:typename){ should == :boolean }
|
227
|
+
end
|
228
|
+
|
229
|
+
describe ::Whatever do
|
230
|
+
it_behaves_like :it_considers_native, true, false, nil, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
231
|
+
it 'it is itself the factory for :identical and :whatever' do
|
232
|
+
keys = [Whatever, :identical, :whatever]
|
233
|
+
keys.each do |key|
|
234
|
+
Gorillib::Factory(key).should equal(described_class)
|
235
|
+
end
|
236
|
+
its_factory = ::Whatever
|
237
|
+
Gorillib::Factory.send(:factories).to_hash.select{|key,val| val.equal?(its_factory) }.keys.should == keys
|
238
|
+
end
|
239
|
+
end
|
240
|
+
describe Gorillib::Factory::IdenticalFactory do
|
241
|
+
it{ described_class.should equal(Whatever) }
|
242
|
+
end
|
243
|
+
|
244
|
+
describe Gorillib::Factory::ModuleFactory do
|
245
|
+
it_behaves_like :it_considers_blankish, nil
|
246
|
+
it_behaves_like :it_considers_native, Module, Module.new, Class, Class.new, Object, String, BasicObject
|
247
|
+
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Complex(1,3), Object.new
|
248
|
+
it_behaves_like :it_is_registered_as, :module, Module
|
249
|
+
its(:typename){ should == :module }
|
250
|
+
end
|
251
|
+
|
252
|
+
describe Gorillib::Factory::ClassFactory do
|
253
|
+
it_behaves_like :it_considers_blankish, nil
|
254
|
+
it_behaves_like :it_considers_native, Module, Class, Class.new, Object, String, BasicObject
|
255
|
+
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
256
|
+
it_behaves_like :it_is_registered_as, :class, Class
|
257
|
+
its(:typename){ should == :class }
|
258
|
+
end
|
259
|
+
|
260
|
+
describe Gorillib::Factory::NilFactory do
|
261
|
+
it_behaves_like :it_considers_native, nil
|
262
|
+
it_behaves_like :it_is_a_mismatch_for, true, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
263
|
+
it_behaves_like :it_is_registered_as, :nil, NilClass
|
264
|
+
its(:typename){ should == :nil_class }
|
265
|
+
end
|
266
|
+
|
267
|
+
describe Gorillib::Factory::TrueFactory do
|
268
|
+
it_behaves_like :it_considers_native, true
|
269
|
+
it_behaves_like :it_is_a_mismatch_for, false, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
270
|
+
it_behaves_like :it_is_registered_as, :true, TrueClass
|
271
|
+
end
|
272
|
+
|
273
|
+
describe Gorillib::Factory::FalseFactory do
|
274
|
+
it_behaves_like :it_considers_native, false
|
275
|
+
it_behaves_like :it_is_a_mismatch_for, true, 3, '', 'a string', :a_symbol, [], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
276
|
+
it_behaves_like :it_is_registered_as, :false, FalseClass
|
277
|
+
end
|
278
|
+
|
279
|
+
describe Gorillib::Factory::RangeFactory do
|
280
|
+
it_behaves_like :it_considers_blankish, nil, []
|
281
|
+
it_behaves_like :it_considers_native, (1..2), ('a'..'z')
|
282
|
+
it_behaves_like :it_is_a_mismatch_for, true, 3, '', 'a string', :a_symbol, [1,2], {}, ->(){ 'a proc' }, Module.new, Complex(1,3), Object.new
|
283
|
+
it_behaves_like :it_is_registered_as, :range, Range
|
284
|
+
its(:typename){ should == :range }
|
285
|
+
end
|
286
|
+
|
287
|
+
# __________________________________________________________________________
|
288
|
+
|
289
|
+
describe Gorillib::Factory::HashFactory do
|
290
|
+
let(:collection_123){ { 'a' => 1, :b => 2, 'c' => 3 } }
|
291
|
+
let(:empty_collection){ {} }
|
292
|
+
|
293
|
+
it_behaves_like :it_considers_blankish, nil
|
294
|
+
it_behaves_like :it_converts, { {} => {}, { "a" => 2 } => { 'a' => 2 }, { :a => 2 } => { :a => 2 }, :non_native_ok => true }
|
295
|
+
it_behaves_like :it_is_a_mismatch_for, [1,2,3]
|
296
|
+
it_behaves_like :an_enumerable_factory
|
297
|
+
|
298
|
+
it 'follows examples' do
|
299
|
+
described_class.new.receive(collection_123).should == { 'a' => 1, :b => 2, 'c' => 3}
|
300
|
+
described_class.new(:keys => :symbol).receive({'a' => 'x', :b => 'y', 'c' => :z}).should == {:a => 'x', :b => 'y', :c => :z}
|
301
|
+
described_class.new(:items => :symbol).receive({'a' => 'x', :b => 'y', 'c' => :z}).should == {'a' => :x, :b => :y, 'c' => :z}
|
302
|
+
autov_factory = described_class.new(:empty_product => Hash.new{|h,k| h[k] = {} })
|
303
|
+
result = autov_factory.receive({:a => :b}) ; result.should == { :a => :b }
|
304
|
+
result[:flanger][:modacity] = 11 ; result.should == { :a => :b, :flanger => { :modacity => 11 }}
|
305
|
+
result2 = autov_factory.receive({:x => :y}) ; result2.should == { :x => :y } ; result.should == { :a => :b, :flanger => { :modacity => 11 }}
|
306
|
+
end
|
307
|
+
|
308
|
+
it "accepts a factory for the keys" do
|
309
|
+
mock_factory = mock('factory')
|
310
|
+
mock_factory.should_receive(:receive).with(3).and_return("converted!")
|
311
|
+
factory = described_class.new(:keys => mock_factory)
|
312
|
+
factory.receive( { 3 => 4 } ).should == { 'converted!' => 4 }
|
313
|
+
end
|
314
|
+
it_behaves_like :it_is_registered_as, :hash, Hash
|
315
|
+
its(:typename){ should == :hash }
|
316
|
+
end
|
317
|
+
|
318
|
+
describe Gorillib::Factory::ArrayFactory do
|
319
|
+
let(:collection_123){ [1,2,3] }
|
320
|
+
let(:empty_collection){ [] }
|
321
|
+
|
322
|
+
it 'follows examples' do
|
323
|
+
described_class.new.receive([1,2,3]).should == [1,2,3]
|
324
|
+
described_class.new(:items => :symbol).receive(['a', 'b', :c]).should == [:a, :b, :c]
|
325
|
+
described_class.new(:empty_product => [1,2,3]).receive([:a, :b, :c]).should == [1, 2, 3, :a, :b, :c]
|
326
|
+
end
|
327
|
+
|
328
|
+
it_behaves_like :it_considers_blankish, nil
|
329
|
+
it_behaves_like :it_converts, { [] => [], {} => [], [1,2,3] => [1,2,3], {:a => :b} => [[:a, :b]], [:a] => [:a], [[]] => [[]], :non_native_ok => true }
|
330
|
+
it_behaves_like :an_enumerable_factory
|
331
|
+
it_behaves_like :it_is_registered_as, :array, Array
|
332
|
+
its(:typename){ should == :array }
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|