gorillib 0.1.11 → 0.4.0pre

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.
Files changed (143) hide show
  1. data/.gitignore +1 -0
  2. data/.rspec +1 -2
  3. data/.yardopts +9 -0
  4. data/{CHANGELOG.textile → CHANGELOG.md} +35 -9
  5. data/Gemfile +21 -14
  6. data/Guardfile +19 -0
  7. data/{LICENSE.textile → LICENSE.md} +43 -29
  8. data/README.md +47 -52
  9. data/Rakefile +31 -30
  10. data/TODO.md +32 -0
  11. data/VERSION +1 -1
  12. data/examples/builder/ironfan.rb +133 -0
  13. data/examples/model/simple.rb +17 -0
  14. data/gorillib.gemspec +106 -86
  15. data/lib/alt/kernel/call_stack.rb +56 -0
  16. data/lib/gorillib/array/wrap.rb +53 -0
  17. data/lib/gorillib/base.rb +3 -3
  18. data/lib/gorillib/builder/field.rb +5 -0
  19. data/lib/gorillib/builder.rb +260 -0
  20. data/lib/gorillib/collection/has_collection.rb +31 -0
  21. data/lib/gorillib/collection.rb +129 -0
  22. data/lib/gorillib/configurable.rb +28 -0
  23. data/lib/gorillib/datetime/{flat.rb → to_flat.rb} +0 -0
  24. data/lib/gorillib/exception/confidence.rb +17 -0
  25. data/lib/gorillib/exception/raisers.rb +78 -0
  26. data/lib/gorillib/hash/mash.rb +202 -0
  27. data/lib/gorillib/hashlike/slice.rb +53 -19
  28. data/lib/gorillib/hashlike.rb +5 -3
  29. data/lib/gorillib/io/system_helpers.rb +30 -0
  30. data/lib/gorillib/logger/log.rb +18 -0
  31. data/lib/gorillib/metaprogramming/concern.rb +124 -0
  32. data/lib/gorillib/model/active_model_conversion.rb +68 -0
  33. data/lib/gorillib/model/active_model_naming.rb +87 -0
  34. data/lib/gorillib/model/active_model_shim.rb +33 -0
  35. data/lib/gorillib/model/base.rb +341 -0
  36. data/lib/gorillib/model/defaults.rb +71 -0
  37. data/lib/gorillib/model/errors.rb +14 -0
  38. data/lib/gorillib/model/factories.rb +372 -0
  39. data/lib/gorillib/model/field.rb +146 -0
  40. data/lib/gorillib/model/named_schema.rb +53 -0
  41. data/lib/gorillib/{struct/hashlike_iteration.rb → model/overlay.rb} +0 -0
  42. data/lib/gorillib/model/record_schema.rb +9 -0
  43. data/lib/gorillib/model/serialization.rb +23 -0
  44. data/lib/gorillib/model/validate.rb +22 -0
  45. data/lib/gorillib/model.rb +23 -0
  46. data/lib/gorillib/pathname.rb +78 -0
  47. data/lib/gorillib/{serialization.rb → serialization/to_wire.rb} +0 -0
  48. data/lib/gorillib/some.rb +11 -9
  49. data/lib/gorillib/string/constantize.rb +21 -14
  50. data/lib/gorillib/string/inflections.rb +6 -76
  51. data/lib/gorillib/string/inflector.rb +192 -0
  52. data/lib/gorillib/string/simple_inflector.rb +267 -0
  53. data/lib/gorillib/type/extended.rb +52 -0
  54. data/lib/gorillib/utils/capture_output.rb +28 -0
  55. data/lib/gorillib/utils/console.rb +131 -0
  56. data/lib/gorillib/utils/nuke_constants.rb +9 -0
  57. data/lib/gorillib/utils/stub_module.rb +33 -0
  58. data/spec/examples/builder/ironfan_spec.rb +37 -0
  59. data/spec/extlib/hash_spec.rb +64 -0
  60. data/spec/extlib/mash_spec.rb +312 -0
  61. data/spec/{array → gorillib/array}/compact_blank_spec.rb +2 -2
  62. data/spec/{array → gorillib/array}/extract_options_spec.rb +2 -2
  63. data/spec/gorillib/builder_spec.rb +187 -0
  64. data/spec/gorillib/collection_spec.rb +20 -0
  65. data/spec/gorillib/configurable_spec.rb +62 -0
  66. data/spec/{datetime → gorillib/datetime}/parse_spec.rb +3 -3
  67. data/spec/{datetime/flat_spec.rb → gorillib/datetime/to_flat_spec.rb} +4 -4
  68. data/spec/{enumerable → gorillib/enumerable}/sum_spec.rb +5 -5
  69. data/spec/gorillib/exception/raisers_spec.rb +60 -0
  70. data/spec/{hash → gorillib/hash}/compact_spec.rb +2 -2
  71. data/spec/{hash → gorillib/hash}/deep_compact_spec.rb +3 -3
  72. data/spec/{hash → gorillib/hash}/deep_merge_spec.rb +2 -2
  73. data/spec/{hash → gorillib/hash}/keys_spec.rb +2 -2
  74. data/spec/{hash → gorillib/hash}/reverse_merge_spec.rb +2 -2
  75. data/spec/{hash → gorillib/hash}/slice_spec.rb +2 -2
  76. data/spec/{hash → gorillib/hash}/zip_spec.rb +2 -2
  77. data/spec/{hashlike → gorillib/hashlike}/behave_same_as_hash_spec.rb +6 -3
  78. data/spec/{hashlike → gorillib/hashlike}/deep_hash_spec.rb +2 -2
  79. data/spec/{hashlike → gorillib/hashlike}/hashlike_behavior_spec.rb +32 -30
  80. data/spec/{hashlike → gorillib/hashlike}/hashlike_via_accessors_spec.rb +3 -3
  81. data/spec/{hashlike_spec.rb → gorillib/hashlike_spec.rb} +3 -3
  82. data/spec/{logger → gorillib/logger}/log_spec.rb +2 -2
  83. data/spec/{metaprogramming → gorillib/metaprogramming}/aliasing_spec.rb +3 -3
  84. data/spec/{metaprogramming → gorillib/metaprogramming}/class_attribute_spec.rb +3 -3
  85. data/spec/{metaprogramming → gorillib/metaprogramming}/delegation_spec.rb +3 -3
  86. data/spec/{metaprogramming → gorillib/metaprogramming}/singleton_class_spec.rb +3 -3
  87. data/spec/gorillib/model/record/defaults_spec.rb +108 -0
  88. data/spec/gorillib/model/record/factories_spec.rb +321 -0
  89. data/spec/gorillib/model/record/overlay_spec.rb +46 -0
  90. data/spec/gorillib/model/serialization_spec.rb +48 -0
  91. data/spec/gorillib/model_spec.rb +281 -0
  92. data/spec/{numeric → gorillib/numeric}/clamp_spec.rb +2 -2
  93. data/spec/{object → gorillib/object}/blank_spec.rb +2 -2
  94. data/spec/{object → gorillib/object}/try_dup_spec.rb +2 -2
  95. data/spec/{object → gorillib/object}/try_spec.rb +3 -2
  96. data/spec/gorillib/pathname_spec.rb +114 -0
  97. data/spec/{string → gorillib/string}/constantize_spec.rb +2 -2
  98. data/spec/{string → gorillib/string}/human_spec.rb +2 -2
  99. data/spec/{string → gorillib/string}/inflections_spec.rb +4 -3
  100. data/spec/{string → gorillib/string}/inflector_test_cases.rb +0 -0
  101. data/spec/{string → gorillib/string}/truncate_spec.rb +4 -10
  102. data/spec/gorillib/type/extended_spec.rb +120 -0
  103. data/spec/gorillib/utils/capture_output_spec.rb +71 -0
  104. data/spec/spec_helper.rb +8 -11
  105. data/spec/support/gorillib_test_helpers.rb +66 -0
  106. data/spec/support/hashlike_fuzzing_helper.rb +31 -33
  107. data/spec/support/hashlike_helper.rb +3 -3
  108. data/spec/support/model_test_helpers.rb +81 -0
  109. data/spec/support/shared_examples/included_module.rb +20 -0
  110. metadata +177 -158
  111. data/lib/gorillib/array/average.rb +0 -13
  112. data/lib/gorillib/array/sorted_median.rb +0 -11
  113. data/lib/gorillib/array/sorted_percentile.rb +0 -11
  114. data/lib/gorillib/array/sorted_sample.rb +0 -12
  115. data/lib/gorillib/dsl_object.rb +0 -64
  116. data/lib/gorillib/hash/indifferent_access.rb +0 -207
  117. data/lib/gorillib/hash/tree_merge.rb +0 -4
  118. data/lib/gorillib/hashlike/tree_merge.rb +0 -49
  119. data/lib/gorillib/metaprogramming/cattr_accessor.rb +0 -79
  120. data/lib/gorillib/metaprogramming/mattr_accessor.rb +0 -61
  121. data/lib/gorillib/receiver/active_model_shim.rb +0 -32
  122. data/lib/gorillib/receiver/acts_as_hash.rb +0 -195
  123. data/lib/gorillib/receiver/acts_as_loadable.rb +0 -42
  124. data/lib/gorillib/receiver/locale/en.yml +0 -27
  125. data/lib/gorillib/receiver/tree_diff.rb +0 -74
  126. data/lib/gorillib/receiver/validations.rb +0 -30
  127. data/lib/gorillib/receiver.rb +0 -402
  128. data/lib/gorillib/receiver_model.rb +0 -21
  129. data/lib/gorillib/struct/acts_as_hash.rb +0 -108
  130. data/notes/fancy_hashes_and_receivers.textile +0 -120
  131. data/notes/hash_rdocs.textile +0 -97
  132. data/spec/array/average_spec.rb +0 -24
  133. data/spec/array/sorted_median_spec.rb +0 -18
  134. data/spec/array/sorted_percentile_spec.rb +0 -24
  135. data/spec/array/sorted_sample_spec.rb +0 -28
  136. data/spec/dsl_object_spec.rb +0 -99
  137. data/spec/hash/indifferent_access_spec.rb +0 -391
  138. data/spec/metaprogramming/cattr_accessor_spec.rb +0 -43
  139. data/spec/metaprogramming/mattr_accessor_spec.rb +0 -45
  140. data/spec/receiver/acts_as_hash_spec.rb +0 -295
  141. data/spec/receiver_spec.rb +0 -551
  142. data/spec/struct/acts_as_hash_fuzz_spec.rb +0 -71
  143. data/spec/struct/acts_as_hash_spec.rb +0 -422
@@ -0,0 +1,281 @@
1
+ require 'spec_helper'
2
+ require 'model_test_helpers'
3
+
4
+ require 'gorillib/model'
5
+
6
+ describe Gorillib::Model, :model_spec => true do
7
+
8
+ let(:simple_model){ class Gorillib::Test::TestClass ; include Gorillib::Model ; field :my_field, Whatever ; self ; end }
9
+ let(:anon_class){ Class.new{ include Gorillib::Model ; field :my_field, :whatever } }
10
+ let(:example_inst){ subject.receive(:my_field => 69) }
11
+ let(:example_val){ mock('example val') }
12
+
13
+ let(:complex_class) do
14
+ class Gorillib::Test::ComplexModel
15
+ include Gorillib::Model
16
+ field :my_field, :whatever
17
+ field :str_field, String
18
+ field :sym_field, Symbol
19
+ self
20
+ end
21
+ end
22
+ let(:complex_subclass){ Gorillib::Test::TestSubclass = Class.new(complex_class){ field :zyzzyva, Integer; field :acme, Integer } }
23
+
24
+ subject{ complex_class }
25
+
26
+ context 'examples' do
27
+ let(:nested_class){ Class.new(complex_class){ field :another_model, self } }
28
+ it 'type-converts values' do
29
+ obj = complex_class.receive({
30
+ :my_field => 'accepted as-is', :str_field => :bob, :sym_field => 'converted_to_sym'
31
+ })
32
+ obj.attributes.should == { :my_field => 'accepted as-is', :str_field => 'bob', :sym_field=>:converted_to_sym }
33
+ end
34
+ it 'handles nested structures' do
35
+ obj = nested_class.receive({ :my_field => 69 })
36
+ obj.attributes.should == { :my_field => 69, :str_field => nil, :sym_field=>nil, :another_model => nil }
37
+ deep_obj = nested_class.receive(:my_field => 111, :str_field => 'deep, man',
38
+ :another_model => { :my_field => 69, :another_model => nil })
39
+ deep_obj.attributes.should == { :my_field => 111, :str_field => 'deep, man', :sym_field=>nil, :another_model => obj }
40
+ end
41
+ end
42
+
43
+ context ".field" do
44
+ subject{ simple_model }
45
+ it "describes an attribute" do
46
+ example_inst.attributes.should == { :my_field => 69 }
47
+ example_inst.write_attribute(:my_field, 3).should == 3
48
+ example_inst.attributes.should == { :my_field => 3 }
49
+ example_inst.read_attribute(:my_field).should == 3
50
+ end
51
+ it 'inherits fields from its parent class, even if they are added later' do
52
+ complex_class.field_names.should == [:my_field, :str_field, :sym_field]
53
+ complex_subclass.field_names.should == [:my_field, :str_field, :sym_field, :zyzzyva, :acme]
54
+ complex_class.field :banksy, String
55
+ complex_class.field_names.should == [:my_field, :str_field, :sym_field, :banksy ]
56
+ complex_subclass.field_names.should == [:my_field, :str_field, :sym_field, :banksy, :zyzzyva, :acme]
57
+ end
58
+
59
+ it "supplies a reader method #foo to call read_attribute(:foo)" do
60
+ example_inst.should_receive(:read_attribute).with(:my_field).and_return(example_val)
61
+ example_inst.my_field.should == example_val
62
+ end
63
+ it "supplies a writer method #foo= to call write_attribute(:foo)" do
64
+ example_inst.should_receive(:write_attribute).with(:my_field, example_val)
65
+ (example_inst.my_field = example_val).should == example_val
66
+ end
67
+ it "supplies a receiver method #receive_foo to call write_attribute(:foo) and return self" do
68
+ example_inst.should_receive(:write_attribute).with(:my_field, example_val)
69
+ (example_inst.receive_my_field(example_val)).should == example_inst
70
+ end
71
+ it "sets visibility of reader with :reader => ()" do
72
+ subject.field :test_field, Integer, :reader => :private, :writer => false
73
+ subject.public_instance_methods.should_not include(:test_field)
74
+ subject.private_instance_methods.should include(:test_field)
75
+ subject.public_instance_methods.should_not include(:test_field=)
76
+ subject.private_instance_methods.should_not include(:test_field=)
77
+ end
78
+ end
79
+
80
+ context '.field' do
81
+ subject{ complex_class.new }
82
+ let(:sample_val){ 'bob' }
83
+ let(:raw_val){ :bob }
84
+ it_behaves_like 'a model field', :str_field
85
+ end
86
+
87
+ context '#attributes' do
88
+ it "maps field names to attribute values" do
89
+ example_inst = subject.receive({:my_field=>7, :str_field=>'yo', :sym_field=>:sup})
90
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>:sup}
91
+ end
92
+ it "includes all field names, set and unset" do
93
+ example_inst.attributes.should == {:my_field=>69, :str_field=>nil, :sym_field=>nil}
94
+ example_inst.receive!(:my_field=>7, :str_field=>'yo')
95
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>nil}
96
+ end
97
+ it "goes throught the #read_attribute interface" do
98
+ example_inst.should_receive(:read_attribute).with(:my_field).and_return('int')
99
+ example_inst.should_receive(:read_attribute).with(:str_field).and_return('str')
100
+ example_inst.should_receive(:read_attribute).with(:sym_field).and_return('sym')
101
+ example_inst.attributes.should == {:my_field=>'int', :str_field=>'str', :sym_field=>'sym'}
102
+ end
103
+ it "is an empty hash if there are no fields" do
104
+ subject = Class.new{ include Gorillib::Model }
105
+ subject.new.attributes.should == {}
106
+ end
107
+ end
108
+
109
+ context '#unset_attribute' do
110
+ it "unsets the attribute" do
111
+ example_inst.attribute_set?(:my_field).should be_true
112
+ example_inst.unset_attribute(:my_field)
113
+ example_inst.attribute_set?(:my_field).should be_false
114
+ end
115
+ it "if set, returns the former value" do
116
+ example_inst.unset_attribute(:my_field ).should == 69
117
+ example_inst.unset_attribute(:str_field).should == nil
118
+ end
119
+ it "raises an error if the field does not exist" do
120
+ ->{ example_inst.unset_attribute(:fnord) }.should raise_error(Gorillib::Model::UnknownFieldError, /unknown field: fnord/)
121
+ end
122
+ end
123
+
124
+ context '#update_attributes' do
125
+ it "consumes a map from field names to new values" do
126
+ example_inst.attributes.should == {:my_field=>69, :str_field=>nil, :sym_field=>nil}
127
+ example_inst.update_attributes({:my_field=>7, :str_field=>'yo'})
128
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>nil}
129
+ example_inst.update_attributes({:str_field=>'ok', :sym_field => :bye})
130
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'ok', :sym_field=>:bye}
131
+ end
132
+ it "takes string or symbol keys" do
133
+ example_inst.update_attributes 'my_field'=>7, :str_field=>'yo'
134
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>nil}
135
+ end
136
+ it "goes throught the #write_attribute interface" do
137
+ example_inst.should_receive(:write_attribute).with(:my_field, 7)
138
+ example_inst.should_receive(:write_attribute).with(:str_field, 'yo')
139
+ example_inst.update_attributes 'my_field'=>7, :str_field=>'yo'
140
+ end
141
+ end
142
+
143
+ context '#receive!' do
144
+ it "consumes a map from field names to new values" do
145
+ example_inst.attributes.should == {:my_field=>69, :str_field=>nil, :sym_field=>nil}
146
+ example_inst.receive!({:my_field=>7, :str_field=>'yo'})
147
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>nil}
148
+ example_inst.receive!({:str_field=>'ok', :sym_field => :bye})
149
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'ok', :sym_field=>:bye}
150
+ end
151
+ it "takes string or symbol keys" do
152
+ example_inst.receive! 'my_field'=>7, :str_field=>'yo'
153
+ example_inst.attributes.should == {:my_field=>7, :str_field=>'yo', :sym_field=>nil}
154
+ end
155
+ it "goes throught the #write_attribute interface" do
156
+ example_inst.should_receive(:write_attribute).with(:my_field, 7)
157
+ example_inst.should_receive(:write_attribute).with(:str_field, 'yo')
158
+ example_inst.receive! 'my_field'=>7, :str_field=>'yo'
159
+ end
160
+ end
161
+
162
+ context '#== -- two models are equal if' do
163
+ let(:subklass){ Class.new(subject) }
164
+ let(:obj_2){ subject.receive(:my_field => 69) }
165
+ let(:obj_3){ subklass.receive(:my_field => 69) }
166
+
167
+ it 'they have the same class' do
168
+ example_inst.attributes.should == obj_2.attributes
169
+ example_inst.attributes.should == obj_3.attributes
170
+ example_inst.should == obj_2
171
+ example_inst.should_not == obj_3
172
+ end
173
+ it 'and the same attributes' do
174
+ example_inst.attributes.should == obj_2.attributes
175
+ example_inst.should == obj_2
176
+ obj_2.my_field = 100
177
+ example_inst.should_not == obj_2
178
+ end
179
+ end
180
+
181
+ context ".fields" do
182
+ it 'is a hash of Gorillib::Model::Field objects' do
183
+ subject.fields.keys.should == [:my_field, :str_field, :sym_field]
184
+ subject.fields.values.each{|f| f.should be_a(Gorillib::Model::Field) }
185
+ subject.fields.values.map(&:name).should == [:my_field, :str_field, :sym_field]
186
+ end
187
+ end
188
+
189
+ context '.has_field?' do
190
+ it 'is true if the field exists' do
191
+ complex_class.has_field?( :my_field).should be_true
192
+ complex_subclass.has_field?(:my_field).should be_true
193
+ complex_subclass.has_field?(:zyzzyva ).should be_true
194
+ end
195
+ it 'is false if it does not exist' do
196
+ complex_class.has_field?( :zyzzyva).should be_false
197
+ complex_class.has_field?( :fnord ).should be_false
198
+ complex_subclass.has_field?(:fnord ).should be_false
199
+ end
200
+ end
201
+
202
+ context '.field_names' do
203
+ it 'lists fields in order by class, then in order added' do
204
+ subject.field_names.should == [:my_field, :str_field, :sym_field]
205
+ complex_subclass.field_names.should == [:my_field, :str_field, :sym_field, :zyzzyva, :acme]
206
+ subject.field :banksy, String
207
+ subject.field_names.should == [:my_field, :str_field, :sym_field, :banksy ]
208
+ complex_subclass.field_names.should == [:my_field, :str_field, :sym_field, :banksy, :zyzzyva, :acme]
209
+ end
210
+ end
211
+
212
+ context '.typename' do
213
+ it 'has a typename that matches its underscored class name' do
214
+ subject.typename.should == 'gorillib.test.complex_model'
215
+ end
216
+ end
217
+
218
+ context '.receive' do
219
+ it 'creates a new instance' do
220
+ obj = example_inst
221
+ subject.should_receive(:new).with().and_return(obj)
222
+ result = subject.receive(:my_field => 12)
223
+ result.should equal(obj)
224
+ result.my_field.should == 12
225
+ end
226
+ it 'calls receive! to set the attributes, and returns the object' do
227
+ obj = example_inst
228
+ subject.should_receive(:new).with().and_return(obj)
229
+ obj.should_receive(:receive!).with(:my_field => 12)
230
+ subject.receive(:my_field => 12).should equal(obj)
231
+ end
232
+
233
+ it 'uses the given type if the _type attribute is a factory' do
234
+ obj = complex_class.receive(:my_field => 12, :acme => 3, :_type => complex_subclass)
235
+ obj.should be_a(complex_subclass)
236
+ end
237
+
238
+ it 'complains if the given type is not right' do
239
+ mock_factory = mock ; mock_factory.stub(:receive! => {}, :receive => mock, :new => mock_factory)
240
+ mock_factory.should_receive(:<=).and_return(false)
241
+ complex_class.should_receive(:warn).with(/doesn't match type/)
242
+ complex_class.receive(:my_field => 12, :acme => 3, :_type => mock_factory)
243
+ end
244
+
245
+ it 'uses the given type if the _type attribute is a typename' do
246
+ complex_subclass.typename.should == 'gorillib.test.test_subclass'
247
+ obj = complex_class.receive(:my_field => 12, :acme => 3, :_type => 'gorillib.test.test_subclass')
248
+ obj.should be_a(complex_subclass)
249
+ end
250
+ end
251
+
252
+ describe Gorillib::Model::NamedSchema do
253
+ subject{ simple_model }
254
+ context ".meta_module" do
255
+ it "is named for the class (if the class is named)" do
256
+ subject.send(:meta_module).should == Meta::Gorillib::Test::TestClassType
257
+ end
258
+ it "is anonymous if the class is anonymous" do
259
+ anon_class.name.should be_nil
260
+ anon_class.send(:meta_module).should be_a(Module)
261
+ anon_class.send(:meta_module).name.should be_nil
262
+ end
263
+ it "carries the field-specfic accessor and receive methods" do
264
+ subject.send(:meta_module).public_instance_methods.sort.should == [:my_field, :my_field=, :receive_my_field]
265
+ anon_class.send(:meta_module).public_instance_methods.sort.should == [:my_field, :my_field=, :receive_my_field]
266
+ end
267
+ it "is injected right after the Gorillib::Model module" do
268
+ subject.ancestors.first(4).should == [subject, Meta::Gorillib::Test::TestClassType, Gorillib::Model, Object]
269
+ subject.should < Meta::Gorillib::Test::TestClassType
270
+ end
271
+ it "retrieves an existing named module if one exists" do
272
+ Gorillib::Test.should_not be_const_defined(:TestClass)
273
+ module Meta::Gorillib::Test::TestClassType ; def kilroy_was_here() '23 skidoo' ; end ; end
274
+ subject.send(:meta_module).public_instance_methods.sort.should == [:kilroy_was_here, :my_field, :my_field=, :receive_my_field]
275
+ Gorillib::Test.should be_const_defined(:TestClass)
276
+ subject.send(:meta_module).should == Meta::Gorillib::Test::TestClassType
277
+ end
278
+ end
279
+ end
280
+
281
+ end
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/numeric/clamp'
3
3
 
4
- describe Numeric do
4
+ describe Numeric, :simple_spec => true do
5
5
  describe '#clamp' do
6
6
  it 'should return self if neither min nor max are given' do
7
7
  5.clamp().should == 5
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/object/blank'
3
3
 
4
- describe 'object/blank' do
4
+ describe 'object/blank', :simple_spec => true do
5
5
  describe Object do
6
6
  it 'should provide blank?' do
7
7
  Object.new.should respond_to(:blank?)
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/object/try_dup'
3
3
 
4
- describe "try_dup" do
4
+ describe 'try_dup', :simple_spec => true do
5
5
  it "returns a duplicate version on regular objects" do
6
6
  obj = Object.new
7
7
  oth = obj.try_dup
@@ -1,4 +1,4 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/object/try'
3
3
 
4
4
  class Foo
@@ -7,10 +7,11 @@ class Foo
7
7
  end
8
8
  end
9
9
 
10
- describe Object do
10
+ describe Object, :simple_spec => true do
11
11
  describe '#try' do
12
12
  it 'returns nil if item does not #respond_to? method' do
13
13
  Foo.new.try(:i_am_not_a_method).should be_nil
14
+ Foo.new.respond_to?(:i_am_not_a_method).should be_false
14
15
  end
15
16
  it 'calls the method (with args) if the item does #respond_to? it' do
16
17
  Foo.new.try(:i_am_a_method_hooray).should == "i was called! hooray!"
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+ require 'gorillib/pathname'
3
+
4
+ describe Pathname do
5
+ let(:mock_path){ mock(:path) } # "We mock what we don't understand"
6
+
7
+ context '.path_to' do
8
+ subject{ described_class }
9
+ before do
10
+ subject.register_path(:doctor, 'doctor/doctor')
11
+ subject.register_path(:code, 'twenty-square-digit', 'boustrophedonic')
12
+ subject.register_path(:hello, :doctor, :doctor)
13
+ subject.register_path(:oh_crap, '~/ninjas')
14
+ subject.register_path(:access, '/would/you/like/to')
15
+ end
16
+
17
+ context 'examples' do
18
+ { ['/tmp', :code] => '/tmp/twenty-square-digit/boustrophedonic',
19
+ [:oh_crap] => ENV['HOME']+'/ninjas',
20
+ [:hello, 'doctor', :doctor, :doctor] => File.expand_path('doctor/doctor/doctor/doctor/doctor/doctor/doctor/doctor/doctor'),
21
+ [:oh_crap, :doctor] => File.join(ENV['HOME'], 'ninjas', 'doctor', 'doctor'),
22
+ [".."] => File.expand_path('..'),
23
+ ["..", 'bob'] => File.expand_path(File.join('..', 'bob')),
24
+ }.each do |input, expected|
25
+ it 'expands symbols' do
26
+ subject.path_to(*input).should == Pathname.new(expected)
27
+ end
28
+ end
29
+ end
30
+
31
+ it 'delays evaluation of path segments' do
32
+ subject.register_path(:russia, '/ussr/russia')
33
+ subject.register_path(:city, 'leningrad')
34
+ subject.register_path(:ermitage, :russia, :city)
35
+ subject.path_to(:ermitage).should == Pathname.new('/ussr/russia/leningrad')
36
+ subject.register_path(:city, 'st_petersburg')
37
+ subject.path_to(:ermitage).should == Pathname.new('/ussr/russia/st_petersburg')
38
+ end
39
+
40
+ it 'expands all paths into a pathname' do
41
+ subject.should_receive(:expand_pathseg).with(:a).and_return('/a')
42
+ subject.should_receive(:expand_pathseg).with('b').and_return('b')
43
+ subject.path_to(:a, 'b').should == Pathname.new('/a/b')
44
+ end
45
+
46
+ it 'expands relative paths' do
47
+ FileUtils.cd '/' do
48
+ subject.path_to(:hello).should == Pathname.new('/doctor/doctor/doctor/doctor')
49
+ end
50
+ end
51
+
52
+ it 'collapses "//" double slashes' do
53
+ subject.path_to('/', :access, '//have', 'a//pepsi').should == Pathname.new('/would/you/like/to/have/a/pepsi')
54
+ end
55
+
56
+ it 'must have at least one segment' do
57
+ lambda{ subject.new() }.should raise_error(ArgumentError, /wrong number of arguments/)
58
+ end
59
+ end
60
+
61
+ context '.relative_path_to' do
62
+ subject{ described_class }
63
+
64
+ it 'collapses "//" double slashes and useless ".." dots, but does not use the filesystem' do
65
+ subject.relative_path_to('/', '../..', :access, '//have', 'a//pepsi').should == Pathname.new('/would/you/like/to/have/a/pepsi')
66
+ end
67
+
68
+ it 'does not expand relative paths' do
69
+ FileUtils.cd '/' do
70
+ subject.register_path(:hello, 'doctor')
71
+ subject.relative_path_to(:hello, :hello, :hello).should == Pathname.new('doctor/doctor/doctor')
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'registering paths' do
77
+ subject { described_class }
78
+ def expand_pathseg(*args) ; subject.send(:expand_pathseg, *args) ; end
79
+
80
+ context '.register_path' do
81
+ it 'stores a path so expand_pathseg can get it later' do
82
+ subject.register_path(:probe, ['skeletal', 'girth'])
83
+ expand_pathseg(:probe).should == ['skeletal', 'girth']
84
+ end
85
+ it 'stores a list of path segments to re-expand' do
86
+ subject.register_path(:ace, 'tomato', 'corporation')
87
+ expand_pathseg(:ace).should == ['tomato', 'corporation']
88
+ end
89
+ it 'replaces the stored path if called again' do
90
+ subject.register_path(:glg_20, 'boyer')
91
+ subject.register_path(:glg_20, ['milbarge', 'fitz-hume'])
92
+ expand_pathseg(:glg_20).should == ['milbarge', 'fitz-hume']
93
+ end
94
+ end
95
+
96
+ context '.register_paths' do
97
+ let(:paths) { { :foo => ['foo'], :bar => [:foo, 'bar'] } }
98
+
99
+ it 'registers multiple paths' do
100
+ subject.should_receive(:register_path).exactly(paths.size).times
101
+ subject.register_paths(paths)
102
+ end
103
+ end
104
+
105
+ context '.unregister_path' do
106
+ it 'unregisters a path' do
107
+ subject.register_path(:foo, 'foo')
108
+ expand_pathseg(:foo).should == ['foo']
109
+ subject.unregister_path(:foo)
110
+ expect{ expand_pathseg(:foo)}.to raise_error(ArgumentError, /expand path reference.*foo/)
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/string/constantize'
3
3
 
4
4
  module Ace
@@ -17,7 +17,7 @@ end
17
17
 
18
18
  module InflectorTest
19
19
 
20
- describe 'String' do
20
+ describe 'String', :string_spec => true do
21
21
  describe '#constantize' do
22
22
  it "works from within instance" do
23
23
  @obj = Ace::Base::Case.new
@@ -1,10 +1,10 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require File.expand_path('inflector_test_cases', File.dirname(__FILE__))
3
3
  require 'gorillib/string/human'
4
4
 
5
5
  include InflectorTestCases
6
6
 
7
- describe String do
7
+ describe String, :string_spec => true do
8
8
 
9
9
  describe '#titleize' do
10
10
  MixtureToTitleCase.each do |raw, titleized|
@@ -1,11 +1,12 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require File.expand_path('inflector_test_cases', File.dirname(__FILE__))
3
3
  require 'gorillib/string/inflections'
4
4
 
5
5
  include InflectorTestCases
6
6
 
7
- describe String do
8
- describe 'camelize' do
7
+ describe String, :string_spec => true do
8
+
9
+ describe '#camelize' do
9
10
  CamelToUnderscore.each do |cameled, underscored|
10
11
  it underscored do
11
12
  underscored.camelize.should == cameled
@@ -1,8 +1,9 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require GORILLIB_ROOT_DIR('spec/support/kcode_test_helper')
3
3
  require 'gorillib/string/truncate'
4
4
 
5
- describe String do
5
+ describe String, :string_spec => true do
6
+
6
7
  describe '#truncate' do
7
8
  it 'leaves a short string alone' do
8
9
  "Hello World!".truncate(12).should == "Hello World!"
@@ -25,14 +26,6 @@ describe String do
25
26
  should == "\354\225\210\353\205\225\355..."
26
27
  end
27
28
  end
28
-
29
- # # FIXME: breaks on ruby 1.8
30
- # it 'works with unicode when kcode=u' do
31
- # Gorillib::KcodeTestHelper.with_kcode('u') do
32
- # "\354\225\204\353\246\254\353\236\221 \354\225\204\353\246\254 \354\225\204\353\235\274\353\246\254\354\230\244".truncate(10).
33
- # should == "\354\225\204\353\246\254\353\236\221 \354\225\204\353\246\254 ..."
34
- # end
35
- # end
36
29
  else # ruby 1.9
37
30
  it 'works with unicode' do
38
31
  "\354\225\204\353\246\254\353\236\221 \354\225\204\353\246\254 \354\225\204\353\235\274\353\246\254\354\230\244".force_encoding('UTF-8').truncate(10).
@@ -40,4 +33,5 @@ describe String do
40
33
  end
41
34
  end
42
35
  end
36
+
43
37
  end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ require 'gorillib/type/extended'
4
+ require 'gorillib/object/blank'
5
+
6
+ describe ::Long do
7
+ it "is_a?(Integer)" do ::Long.should < ::Integer ; end
8
+ end
9
+
10
+ describe ::Double do
11
+ it "is_a?(Float)" do ::Double.should < ::Float ; end
12
+ end
13
+
14
+ describe ::Binary do
15
+ it "is_a?(String)" do ::Binary.should < ::String ; end
16
+ end
17
+
18
+ # describe ::Boolean, :model_spec => true do
19
+ # let(:true_bool ){ ::Boolean.new(true) }
20
+ # let(:false_bool){ ::Boolean.new(false) }
21
+ #
22
+ # def it_responds_same_as(test_obj, comparable, meth, *meth_args, &block)
23
+ # test_obj.send(meth, *meth_args, &block).should == comparable.send(meth, *meth_args, &block)
24
+ # end
25
+ #
26
+ # def it_responds_with_same_contents(test_obj, comparable, meth, *meth_args, &block)
27
+ # test_obj.send(meth, *meth_args, &block).sort.should == comparable.send(meth, *meth_args, &block).sort
28
+ # end
29
+ #
30
+ # it("has #class ::Boolean" ){ (true_bool.class).should == ::Boolean ; (false_bool.class).should == ::Boolean }
31
+ #
32
+ # it "#is_a?(Boolean)" do true_bool.should be_a(::Boolean) ; false_bool.should be_a(::Boolean) ; end
33
+ # it "#is_a?(True/False)" do true_bool.should be_a(::TrueClass) ; false_bool.should be_a(::FalseClass) ; end
34
+ # it "#kind_of?(Boolean)" do true_bool.should be_a_kind_of(::Boolean) ; false_bool.should be_a_kind_of(::Boolean) ; end
35
+ # it "#instance_of?(True/False)" do true_bool.should be_instance_of(::TrueClass) ; false_bool.should be_instance_of(::FalseClass) ; end
36
+ #
37
+ # describe 'mimics true/false' do
38
+ # [ :!, :to_s, :blank?, :frozen?, :nil?, :present?,
39
+ # ].each do |meth|
40
+ # it "##{meth}" do
41
+ # it_responds_same_as(true_bool, true, meth)
42
+ # it_responds_same_as(false_bool, false, meth)
43
+ # end
44
+ # end
45
+ #
46
+ # [ :private_methods, :protected_methods, :singleton_methods,
47
+ # ].each do |meth|
48
+ # it "##{meth}" do
49
+ # it_responds_with_same_contents(true_bool, true, meth)
50
+ # it_responds_with_same_contents(false_bool, false, meth)
51
+ # end
52
+ # end
53
+ # it "#methods" do ( true.methods - true_bool.methods ).should be_empty ; end
54
+ # it "#methods" do ( false.methods - false_bool.methods ).should be_empty ; end
55
+ # it "#public_methods" do ( true.public_methods - true_bool.public_methods ).should be_empty ; end
56
+ # it "#public_methods" do ( false.public_methods - false_bool.public_methods ).should be_empty ; end
57
+ #
58
+ # it ".methods" do (TrueClass.methods | [:true, :false, :new]).sort.should == Boolean.methods.sort ; end
59
+ #
60
+ # { :!= => [true, false, nil],
61
+ # :!~ => [true, false, nil],
62
+ # :& => [true, false, nil],
63
+ # :<=> => [true, false, nil],
64
+ # :== => [true, false, nil],
65
+ # :=== => [true, false, nil],
66
+ # :=~ => [true, false, nil],
67
+ # :^ => [true, false, nil],
68
+ # :| => [true, false, nil],
69
+ # :eql? => [true, false, nil],
70
+ # :equal? => [true, false, nil],
71
+ # :instance_of? => [::TrueClass, ::FalseClass, ::Object],
72
+ # :is_a? => [::TrueClass, ::FalseClass, ::Object],
73
+ # :kind_of? => [::TrueClass, ::FalseClass, ::Object],
74
+ # }.each do |meth, meth_args|
75
+ # meth_args.each do |meth_arg|
76
+ # it "##{meth}(#{meth_arg})" do
77
+ # it_responds_same_as(true_bool, true, meth, meth_arg)
78
+ # it_responds_same_as(false_bool, false, meth, meth_arg)
79
+ # end
80
+ # end
81
+ # end
82
+ #
83
+ # end
84
+ #
85
+ # [ :==, :===, :eql?, :equal?, :<=> ].each do |meth|
86
+ # it "Boolean.true #{meth} itself and true" do
87
+ # true_bool.send(meth, true_bool ).should be_true
88
+ # true_bool.send(meth, Boolean.true ).should be_true
89
+ # true_bool.send(meth, true ).should be_true
90
+ # true_bool.send(meth, false_bool ).should be_false
91
+ # true_bool.send(meth, Boolean.false ).should be_false
92
+ # true_bool.send(meth, false ).should be_false
93
+ # true_bool.send(meth, 0 ).should be_false
94
+ # end
95
+ # it "Boolean.false #{meth} itself and false" do
96
+ # false_bool.send(meth, false_bool ).should be_true
97
+ # false_bool.send(meth, Boolean.false ).should be_true
98
+ # false_bool.send(meth, false ).should be_true
99
+ # false_bool.send(meth, true_bool ).should be_false
100
+ # false_bool.send(meth, Boolean.true ).should be_false
101
+ # false_bool.send(meth, true ).should be_false
102
+ # false_bool.send(meth, 0 ).should be_false
103
+ # end
104
+ # it "!=" do
105
+ # (true_bool != true ).should be_false ; (true_bool != false ).should be_true
106
+ # (true_bool != true_bool ).should be_false ; (true_bool != false_bool ).should be_true
107
+ # (true_bool != Boolean.true ).should be_false ; (true_bool != Boolean.false).should be_true
108
+ # (true_bool != 0 ).should be_true ; (true_bool != "true" ).should be_true
109
+ # (false_bool != false ).should be_false ; (false_bool != true ).should be_true
110
+ # (false_bool != false_bool ).should be_false ; (false_bool != true_bool ).should be_true
111
+ # (false_bool != Boolean.false).should be_false ; (false_bool != Boolean.true ).should be_true
112
+ # (false_bool != 0 ).should be_true ; (false_bool != "true" ).should be_true
113
+ # end
114
+ # it "!~" do
115
+ # (true_bool !~ true ).should be_true
116
+ # (true_bool !~ true_bool ).should be_true
117
+ # (true_bool !~ Boolean.true).should be_true
118
+ # end
119
+ # end
120
+ # end