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,60 @@
1
+ require 'spec_helper'
2
+ require 'gorillib/exception/raisers'
3
+
4
+ describe 'raisers' do
5
+ def should_raise_my_error(msg=nil)
6
+ msg ||= error_message
7
+ expect{ yield }.to raise_error(described_class, msg)
8
+ end
9
+ def should_return_true
10
+ yield.should be_true
11
+ end
12
+ def capture_error
13
+ message = 'should have raised, did not'
14
+ begin
15
+ yield
16
+ rescue described_class => err
17
+ message = err.message
18
+ end
19
+ return message.gsub(/of arguments\(/, 'of arguments (')
20
+ end
21
+
22
+ describe ArgumentError do
23
+
24
+ context '.check_arity!' do
25
+ let(:error_message){ /wrong number of arguments/ }
26
+ it 'checks against a range' do
27
+ should_raise_my_error{ described_class.check_arity!(['a'], 2..5) }
28
+ should_raise_my_error{ described_class.check_arity!(['a'], 2..2) }
29
+ should_return_true{ described_class.check_arity!(['a'], 0..5) }
30
+ should_return_true{ described_class.check_arity!(['a'], 1..1) }
31
+ end
32
+ it 'checks against an array' do
33
+ should_raise_my_error{ described_class.check_arity!( ['a', 'b'], [1, 3, 5] ) }
34
+ should_return_true{ described_class.check_arity!( ['a', 'b'], [1, 2] ) }
35
+ end
36
+ it 'given a single number, requires exactly that many args' do
37
+ should_raise_my_error{ described_class.check_arity!( ['a', 'b'], 1 ) }
38
+ should_raise_my_error{ described_class.check_arity!( ['a', 'b'], 3 ) }
39
+ should_return_true{ described_class.check_arity!( ['a', 'b'], 2 ) }
40
+ end
41
+ it 'matches the message a native arity error would' do
42
+ should_raise_my_error(capture_error{ [].fill() }){ described_class.check_arity!([], 1..3) }
43
+ should_raise_my_error(capture_error{ [].to_s(1) }){ described_class.check_arity!([1], 0) }
44
+ end
45
+ end
46
+
47
+ context '.arity_at_least!' do
48
+ let(:error_message){ /wrong number of arguments/ }
49
+ it 'raises if there are fewer than that many args' do
50
+ should_raise_my_error{ described_class.arity_at_least!(['a'], 2) }
51
+ should_raise_my_error{ described_class.arity_at_least!([], 1) }
52
+ end
53
+ it ('returns true if there are that many args or more') do
54
+ should_return_true{ described_class.arity_at_least!([], 0) }
55
+ should_return_true{ described_class.arity_at_least!(['a'], 0) }
56
+ should_return_true{ described_class.arity_at_least!(['a'], 1) }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/compact'
3
3
 
4
- describe Hash do
4
+ describe Hash, :hashlike_spec => true do
5
5
  describe '#compact' do
6
6
  it 'scrubs nil' do
7
7
  hsh = { 1 => nil }
@@ -1,8 +1,8 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/deep_compact'
3
3
  require 'gorillib/array/deep_compact'
4
4
 
5
- describe Hash do
5
+ describe Hash, :hashlike_spec => true 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!
@@ -19,7 +19,7 @@ describe Hash do
19
19
  end
20
20
  end
21
21
 
22
- describe Array do
22
+ describe Array, :hashlike_spec => true 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,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/deep_merge'
3
3
 
4
- describe Hash do
4
+ describe Hash, :hashlike_spec => true do
5
5
  describe '#deep_merge' do
6
6
  before do
7
7
  @hash_1 =
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/keys'
3
3
 
4
- describe Hash do
4
+ describe Hash, :hashlike_spec => true do
5
5
  class SubclassingArray < Array
6
6
  end
7
7
 
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/reverse_merge'
3
3
 
4
- describe Hash do
4
+ describe Hash, :hashlike_spec => true do
5
5
  describe 'reverse_merge' do
6
6
 
7
7
  before do
@@ -1,9 +1,9 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/slice'
3
3
 
4
4
  class HashSubclass < Hash ; end
5
5
 
6
- describe Hash do
6
+ describe Hash, :hashlike_spec => true do
7
7
  describe '#slice' do
8
8
  it 'should return a new hash with only the given keys' do
9
9
  original = { :a => 'x', :b => 'y', :c => 10 }
@@ -1,7 +1,7 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hash/zip'
3
3
 
4
- describe Hash do
4
+ describe Hash, :hashlike_spec => true do
5
5
  describe '#zip' do
6
6
  it 'builds a hash from keys and values' do
7
7
  Hash.zip([:a, :b, :c], [1, 2, 3]).should == { :a => 1, :b => 2, :c => 3 }
@@ -1,8 +1,11 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'enumerator'
3
3
  require 'gorillib/hashlike'
4
4
  require 'gorillib/enumerable/sum'
5
5
 
6
+ require 'gorillib/utils/capture_output'
7
+ RSpec.configure{|c| c.include Gorillib::TestHelpers }
8
+
6
9
  require GORILLIB_ROOT_DIR('spec/support/hashlike_helper')
7
10
  require GORILLIB_ROOT_DIR('spec/support/hashlike_fuzzing_helper')
8
11
  require GORILLIB_ROOT_DIR('spec/support/hashlike_via_delegation')
@@ -13,7 +16,7 @@ class InternalHashWithEquality < InternalHash
13
16
  def ==(other_hash) @myhsh == other_hash ; end
14
17
  end
15
18
 
16
- describe Gorillib::Hashlike do
19
+ describe Gorillib::Hashlike, :hashlike_spec => true do
17
20
 
18
21
  if ENV['FULL_SPECS']
19
22
 
@@ -100,6 +103,6 @@ describe Gorillib::Hashlike do
100
103
  end
101
104
 
102
105
  else
103
- it 'skipping full specs -- set environment variable FULL_SPECS=true to run all specs'
106
+ it 'skipping lengthy example-based testing -- set environment variable FULL_SPECS=true to run all specs'
104
107
  end
105
108
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hashlike/deep_hash'
3
3
 
4
4
  class AwesomeHash < Hash
@@ -6,7 +6,7 @@ class AwesomeHash < Hash
6
6
  end
7
7
  class AwesomeHashSubclass < AwesomeHash ; end
8
8
 
9
- describe Gorillib::Hashlike::DeepHash do
9
+ describe Gorillib::Hashlike::DeepHash, :hashlike_spec => true do
10
10
 
11
11
  before(:each) do
12
12
  @deep_hash = AwesomeHash.new({ :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b' })
@@ -1,5 +1,7 @@
1
- unless defined?(HASHLIKE_BEHAVIOR_SPEC)
2
- describe '' do
1
+ require 'gorillib/utils/capture_output'
2
+ RSpec.configure{|c| c.include Gorillib::TestHelpers }
3
+
4
+ describe '', :hashlike_spec => true do
3
5
 
4
6
  # ===========================================================================
5
7
  #
@@ -14,7 +16,7 @@ describe '' do
14
16
 
15
17
  it 'returns nil on a missing (but valid) key' do
16
18
  @hshlike[:new_key].should == nil
17
- end
19
+ end
18
20
  end
19
21
 
20
22
  shared_examples_for :references_string_and_symbol_keys_equivalently do
@@ -48,7 +50,7 @@ describe '' do
48
50
  obj = Object.new
49
51
  @hshlike[obj] = :i_haz_obj ; @hshlike[obj].should == :i_haz_obj; @hshlike.delete(obj).should == :i_haz_obj
50
52
  @hshlike.should be_hash_eql(HashlikeHelper::BASE_HSH)
51
- end
53
+ end
52
54
  end
53
55
 
54
56
  shared_examples_for :accepts_arbitrary_keys do
@@ -56,7 +58,7 @@ describe '' do
56
58
  @hshlike[:fnord] = 69
57
59
  @hshlike[:fnord].should == 69
58
60
  @hshlike.delete(:fnord).should == 69
59
- @hshlike[:boink].should be_nil
61
+ @hshlike[:boink].should be_nil
60
62
  end
61
63
  end
62
64
 
@@ -100,7 +102,7 @@ describe '' do
100
102
  # ===========================================================================
101
103
  #
102
104
  # Iteration
103
-
105
+
104
106
  shared_examples_for :with_no_block_returns_enumerator do |method_to_test|
105
107
  it('returns an enumerator'){ @hshlike.send(method_to_test).should enumerate_method(@hshlike, method_to_test) }
106
108
  end
@@ -163,7 +165,7 @@ describe '' do
163
165
  end
164
166
  end
165
167
 
166
- shared_examples_for :each_key_on_stringlike_keys do
168
+ shared_examples_for :each_key_on_stringlike_keys do
167
169
  it 'calls block once for each key in hsh' do
168
170
  seen_keys = []
169
171
  @hshlike.each_key{|k| seen_keys << k }
@@ -299,7 +301,7 @@ describe '' do
299
301
  seen_args.should be_array_eql([[:a, nil, :aa], [:b, nil, nil], [:c, nil, :cc], [1, nil, 2]])
300
302
  end
301
303
  end
302
-
304
+
303
305
  # ===========================================================================
304
306
  #
305
307
  # Retrieval and Membership
@@ -307,7 +309,7 @@ describe '' do
307
309
  shared_examples_for :hashlike_values do
308
310
  it 'returns a new array populated with the values from hsh' do
309
311
  @hshlike.values.should be_array_eql([100, 200, 300, nil, false])
310
- end
312
+ end
311
313
  end
312
314
 
313
315
  shared_examples_for :hashlike_values_at_or_of do |method_to_test|
@@ -330,7 +332,7 @@ describe '' do
330
332
  end
331
333
  it 'is zero for an empty hashlike' do
332
334
  @empty_hshlike.send(method_to_test).should == 0
333
- end
335
+ end
334
336
  end
335
337
 
336
338
  shared_examples_for :hashlike_has_key? do |method_to_test|
@@ -347,7 +349,7 @@ describe '' do
347
349
  @hshlike.should evaluate_to_true(method_to_test, :nil_val)
348
350
  @hshlike.should evaluate_to_true(method_to_test, :false_val)
349
351
  end
350
- it 'something something convert_key'
352
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
351
353
  end
352
354
 
353
355
  shared_examples_for :hashlike_has_key_predefined_always_present do |method_to_test|
@@ -364,7 +366,7 @@ describe '' do
364
366
  @hshlike.should evaluate_to_true(method_to_test, :nil_val)
365
367
  @hshlike.should evaluate_to_true(method_to_test, :false_val)
366
368
  end
367
- it 'something something convert_key'
369
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
368
370
  end
369
371
 
370
372
  shared_examples_for :hashlike_has_key_string_and_symbol_equivalent do |method_to_test|
@@ -405,7 +407,7 @@ describe '' do
405
407
  @hshlike.send(method_to_test, false).should == true
406
408
  @hshlike.send(method_to_test, nil).should == true
407
409
  end
408
- it 'something something convert_key'
410
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
409
411
  end
410
412
 
411
413
  shared_examples_for :hashlike_has_value_on_complex_keys do |method_to_test|
@@ -441,13 +443,15 @@ describe '' do
441
443
  ret_val.should == :returned_as_default
442
444
  end
443
445
  it 'if block and default are both given, issues a warning and runs the block' do
444
- set_in_block = nil
445
- ret_val = @hshlike.fetch(:new_key, :spurious_default){|k| set_in_block = "got: #{k}" ; "hello!" }
446
- ret_val.should == "hello!"
447
- set_in_block.should == "got: new_key"
446
+ quiet_output do
447
+ set_in_block = nil
448
+ ret_val = @hshlike.fetch(:new_key, :spurious_default){|k| set_in_block = "got: #{k}" ; "hello!" }
449
+ ret_val.should == "hello!"
450
+ set_in_block.should == "got: new_key"
451
+ end
448
452
  end
449
453
  end
450
- it 'something something convert_key'
454
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
451
455
  end
452
456
 
453
457
  shared_examples_for :hashlike_key do
@@ -463,7 +467,7 @@ describe '' do
463
467
  if (RUBY_VERSION >= '1.9')
464
468
  @hshlike.key(999).should == :a
465
469
  end
466
- end
470
+ end
467
471
  end
468
472
 
469
473
  shared_examples_for :hashlike_assoc do
@@ -474,7 +478,7 @@ describe '' do
474
478
  it 'returns nil if missing' do
475
479
  @hshlike.assoc(:i_am_missing).should be_nil
476
480
  end
477
- it 'something something convert_key'
481
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
478
482
  end
479
483
 
480
484
  shared_examples_for :hashlike_rassoc do
@@ -485,7 +489,7 @@ describe '' do
485
489
  end
486
490
  it 'returns nil if missing' do
487
491
  @hshlike.rassoc(:i_am_missing).should be_nil
488
- end
492
+ end
489
493
  end
490
494
 
491
495
  shared_examples_for :hashlike_empty? do
@@ -496,7 +500,7 @@ describe '' do
496
500
  @empty_hshlike.empty?.should == false
497
501
  end
498
502
  end
499
-
503
+
500
504
  # ===========================================================================
501
505
  #
502
506
  # Update, merge!, merge
@@ -537,7 +541,7 @@ describe '' do
537
541
  obj = Object.new
538
542
  lambda{ @hshlike.send(method_to_test, obj) }.should raise_error(TypeError, "can't convert Object into Hash")
539
543
  end
540
- it 'something something convert_key'
544
+ it 'something something convert_key' unless ENV['QUIET_RSPEC']
541
545
  end
542
546
 
543
547
  shared_examples_for :merging_method_with_normal_keys do |method_to_test|
@@ -617,7 +621,7 @@ describe '' do
617
621
  ret_val = @hshlike.send(method_to_test, {:a => "aaa", :b => 200, :nil_val => "here", :new_key => "zzz" })
618
622
  ret_val.should equal(@hshlike)
619
623
  @hshlike.should be_hash_eql({:a=>"aaa", :b=>200, :c=>300, :nil_val=>"here", :false_val=>false, :new_key=>"zzz"})
620
- end
624
+ end
621
625
  end
622
626
 
623
627
  shared_examples_for :merging_method_returning_new do |method_to_test|
@@ -741,7 +745,7 @@ describe '' do
741
745
  ret_val.should be_hash_eql(@empty_hshlike)
742
746
  ret_val.should be_empty
743
747
  @hshlike.should be_empty
744
- end
748
+ end
745
749
  end
746
750
 
747
751
  # ===========================================================================
@@ -753,7 +757,7 @@ describe '' do
753
757
  ret_val = @hshlike.to_hash
754
758
  ret_val.should be_an_instance_of(Hash)
755
759
  ret_val.should == HashlikeHelper::BASE_HSH
756
- end
760
+ end
757
761
  end
758
762
 
759
763
  shared_examples_for :hashlike_invert do
@@ -818,7 +822,5 @@ describe '' do
818
822
  end
819
823
  end
820
824
 
821
-
822
-
823
- end
824
- end ; HASHLIKE_BEHAVIOR_SPEC = true
825
+ ::HASHLIKE_BEHAVIOR_SPEC = true
826
+ end unless defined?(::HASHLIKE_BEHAVIOR_SPEC)
@@ -1,9 +1,9 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hashlike'
3
3
  require 'gorillib/hashlike/hashlike_via_accessors'
4
4
  require GORILLIB_ROOT_DIR('spec/support/hashlike_via_delegation')
5
5
  require GORILLIB_ROOT_DIR('spec/support/hashlike_helper')
6
- require GORILLIB_ROOT_DIR('spec/hashlike/hashlike_behavior_spec')
6
+ require GORILLIB_ROOT_DIR('spec/gorillib/hashlike/hashlike_behavior_spec')
7
7
 
8
8
  class SimpleHashlikeViaAccessors
9
9
  attr_accessor :a, :b, :c, :nil_val, :false_val, :new_key
@@ -11,7 +11,7 @@ class SimpleHashlikeViaAccessors
11
11
  include Gorillib::Hashlike
12
12
  end
13
13
 
14
- describe Gorillib::Hashlike::HashlikeViaAccessors do
14
+ describe Gorillib::Hashlike::HashlikeViaAccessors, :hashlike_spec => true do
15
15
 
16
16
  before do
17
17
  @hshlike = SimpleHashlikeViaAccessors.new.merge(HashlikeHelper::HASH_TO_TEST_HL_V_A.dup)
@@ -1,8 +1,8 @@
1
- require File.expand_path('spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/hashlike'
3
3
  require GORILLIB_ROOT_DIR('spec/support/hashlike_via_delegation')
4
4
  require GORILLIB_ROOT_DIR('spec/support/hashlike_helper')
5
- require GORILLIB_ROOT_DIR('spec/hashlike/hashlike_behavior_spec')
5
+ require GORILLIB_ROOT_DIR('spec/gorillib/hashlike/hashlike_behavior_spec')
6
6
 
7
7
 
8
8
 
@@ -10,7 +10,7 @@ require GORILLIB_ROOT_DIR('spec/hashlike/hashlike_behavior_spec')
10
10
 
11
11
 
12
12
 
13
- describe Gorillib::Hashlike do
13
+ describe Gorillib::Hashlike, :hashlike_spec => true do
14
14
 
15
15
  before do
16
16
  @hshlike = InternalHash.new.merge(HashlikeHelper::BASE_HSH.dup)
@@ -1,8 +1,8 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/logger/log'
3
3
 
4
4
 
5
- describe 'Logger' do
5
+ describe 'Logger', :simple_spec => true do
6
6
  # so we can practice loading and unloading
7
7
  def logger_code_file
8
8
  GORILLIB_ROOT_DIR('lib/gorillib/logger/log.rb')
@@ -1,4 +1,4 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/metaprogramming/aliasing'
3
3
 
4
4
  module BarMethodAliaser
@@ -32,7 +32,7 @@ module BarMethods
32
32
  end
33
33
  end
34
34
 
35
- describe 'metaprogramming' do
35
+ describe 'metaprogramming', :metaprogramming_spec => true do
36
36
  before do
37
37
  Object.const_set :FooClassWithBarMethod, Class.new{ def bar() 'bar' end }
38
38
  @instance = FooClassWithBarMethod.new
@@ -44,7 +44,7 @@ describe 'metaprogramming' do
44
44
 
45
45
  describe 'alias_method_chain' do
46
46
 
47
- it 'does not have an effect if already provided by another library.'
47
+ it 'does not have an effect if already provided by another library.' unless ENV['QUIET_RSPEC']
48
48
 
49
49
  it 'creates a with_ and without_ method that chain' do
50
50
  @instance.should respond_to(:bar)
@@ -1,14 +1,14 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/metaprogramming/class_attribute'
3
3
 
4
- describe 'metaprogramming' do
4
+ describe 'metaprogramming', :metaprogramming_spec => true do
5
5
  describe 'class_attribute' do
6
6
  before do
7
7
  @klass = Class.new { class_attribute :setting }
8
8
  @sub = Class.new(@klass)
9
9
  end
10
10
 
11
- it 'does not have an effect if already provided by another lib.'
11
+ it 'does not have an effect if already provided by another lib.' unless ENV['QUIET_RSPEC']
12
12
 
13
13
  it 'defaults to nil' do
14
14
  @klass.setting.should be_nil
@@ -1,4 +1,4 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/metaprogramming/delegation'
3
3
 
4
4
  module One
@@ -63,13 +63,13 @@ end
63
63
  #
64
64
  # Tests start
65
65
 
66
- describe 'metaprogramming' do
66
+ describe 'metaprogramming', :metaprogramming_spec => true do
67
67
  describe 'delegation' do
68
68
  before do
69
69
  @david = Someone.new("David", Somewhere.new("Paulina", "Chicago"))
70
70
  end
71
71
 
72
- it 'does not have an effect if already provided by another library.'
72
+ it 'does not have an effect if already provided by another library.' unless ENV['QUIET_RSPEC']
73
73
 
74
74
  it 'delegates to methods' do
75
75
  @david.street.should == "Paulina"
@@ -1,12 +1,12 @@
1
- require File.expand_path('../spec_helper', File.dirname(__FILE__))
1
+ require 'spec_helper'
2
2
  require 'gorillib/metaprogramming/singleton_class'
3
3
 
4
- describe 'Singleton Class' do
4
+ describe 'Singleton Class', :metaprogramming_spec => true do
5
5
  it 'returns the singleton class' do
6
6
  o = Object.new
7
7
  class << o; self end.should == o.singleton_class
8
8
  end
9
9
 
10
- it 'does not have an effect if already provided by another library.'
10
+ it 'does not have an effect if already provided by another library.' unless ENV['QUIET_RSPEC']
11
11
 
12
12
  end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ require 'gorillib/model'
4
+ require 'gorillib/model/field'
5
+ require 'gorillib/model/defaults'
6
+
7
+ module Gorillib::Test ; end
8
+ module Meta::Gorillib::Test ; end
9
+
10
+ describe Gorillib::Model, :model_spec => true do
11
+ after(:each){ Gorillib::Test.nuke_constants ; Meta::Gorillib::Test.nuke_constants }
12
+
13
+ let(:car_class) do
14
+ class Gorillib::Test::Car
15
+ include Gorillib::Model
16
+ field :name, Symbol
17
+ field :make_model, String
18
+ field :year, Integer
19
+ field :style, Symbol, :default => :sedan
20
+ field :doors, Integer,
21
+ :default => ->{ [:coupe, :convertible].include?(style) ? 2 : 4 }
22
+ self
23
+ end
24
+ Gorillib::Test::Car
25
+ end
26
+ let(:wildcat) do
27
+ car_class.receive( :name => :wildcat, :make_model => 'Buick Wildcat', :year => 1968, :doors => 2 )
28
+ end
29
+ let(:ford_39) do
30
+ car_class.receive( :name => :ford_39 )
31
+ end
32
+ let(:year_field ){ car_class.fields[:year] }
33
+ let(:doors_field){ car_class.fields[:doors] }
34
+ let(:style_field){ car_class.fields[:style] }
35
+
36
+ describe 'Field#default' do
37
+ it 'is itself a field on Gorillib::Model::Field (boy that is confusing)' do
38
+ Gorillib::Model::Field.should have_field(:default)
39
+ end
40
+ context '#has_default?' do
41
+ it 'is true if the default is set' do
42
+ year_field.should_not have_default
43
+ year_field.default = '2012'
44
+ year_field.should have_default
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '#attribute_default' do
50
+ before{ car_class.class_eval{ public :attribute_default } }
51
+
52
+ it "if the default does not exist, returns nil" do
53
+ ford_39.attribute_default(year_field).should be_nil
54
+ end
55
+ it "if the default is a value, returns it, dup'd if possible" do
56
+ ford_39.attribute_default(style_field).should == :sedan
57
+ year_val = mock ; dupd_year_val = mock
58
+ year_val.should_receive(:try_dup).and_return(dupd_year_val)
59
+ year_field.default = year_val
60
+ ford_39.attribute_default(year_field).should equal(dupd_year_val)
61
+ end
62
+ it "if the default is a proc with no args, instance_exec it" do
63
+ ford_39.style = :sedan
64
+ ford_39.attribute_default(doors_field).should == 4
65
+ ford_39.style = :coupe
66
+ ford_39.attribute_default(doors_field).should == 2
67
+ end
68
+ it "if the default is a proc with no args, instance_exec it" do
69
+ year_field.default = ->{ self }
70
+ ford_39.attribute_default(year_field).should equal(ford_39)
71
+ end
72
+ it "if the default responds_to #call, call it, passing the instance and field name" do
73
+ callable = mock ; expected = mock
74
+ year_field.default = callable
75
+ callable.should_receive(:respond_to?).with(:call).and_return(true)
76
+ callable.should_receive(:call).with(ford_39, :year).and_return(expected)
77
+ ford_39.stub(:read_unset_attribute).and_return('bob')
78
+ ford_39.attribute_default(year_field).should equal(expected)
79
+ end
80
+ it "if the default is a proc with args, call it in current context with the model and field name" do
81
+ this = self ; expected = mock
82
+ year_field.default = ->(inst, field_name){ [self, inst, field_name, expected] }
83
+ ford_39.attribute_default(year_field).should == [this, ford_39, :year, expected]
84
+ end
85
+ end
86
+
87
+ describe 'reading an attribute with a default' do
88
+ it "sets the default value on the field and returns it" do
89
+ ford_39.attribute_set?(:doors).should be_false
90
+ ford_39.read_attribute(:doors).should == 4
91
+ end
92
+ it "only calls a block default if the attribute is unset" do
93
+ val = 0
94
+ year_field.default = ->{ val += 1 }
95
+ ford_39.read_attribute(:year).should == 1
96
+ year_field.default.call.should == 2 # the next call to the block will return 3
97
+ ford_39.read_attribute(:year).should == 1 # repeated calls give the same value
98
+ ford_39.unset_attribute(:year)
99
+ ford_39.read_attribute(:year).should == 3 # see! since it was unset, the block was called again.
100
+ end
101
+ it "is attribute_set? after" do
102
+ ford_39.attribute_set?(:doors).should be_false
103
+ ford_39.read_attribute(:doors)
104
+ ford_39.attribute_set?(:doors).should be_true
105
+ end
106
+ end
107
+
108
+ end