motion-support 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +1 -1
  3. data/README.md +231 -2
  4. data/Rakefile +3 -3
  5. data/app/app_delegate.rb +0 -2
  6. data/examples/Inflector/.gitignore +16 -0
  7. data/examples/Inflector/Gemfile +5 -0
  8. data/examples/Inflector/Rakefile +13 -0
  9. data/examples/Inflector/app/app_delegate.rb +8 -0
  10. data/examples/Inflector/app/inflections.rb +5 -0
  11. data/examples/Inflector/app/inflector_view_controller.rb +120 -0
  12. data/examples/Inflector/app/words_view_controller.rb +101 -0
  13. data/examples/Inflector/resources/Default-568h@2x.png +0 -0
  14. data/examples/Inflector/spec/main_spec.rb +9 -0
  15. data/lib/motion-support/core_ext/array.rb +13 -0
  16. data/lib/motion-support/core_ext/class.rb +8 -0
  17. data/lib/motion-support/core_ext/hash.rb +16 -0
  18. data/lib/motion-support/core_ext/integer.rb +9 -0
  19. data/lib/motion-support/core_ext/module.rb +14 -0
  20. data/lib/motion-support/core_ext/numeric.rb +8 -0
  21. data/lib/motion-support/core_ext/object.rb +14 -0
  22. data/lib/motion-support/core_ext/range.rb +8 -0
  23. data/lib/motion-support/core_ext/string.rb +14 -0
  24. data/lib/motion-support/core_ext/time.rb +19 -0
  25. data/lib/motion-support/core_ext.rb +3 -0
  26. data/lib/motion-support/inflector.rb +12 -156
  27. data/lib/motion-support.rb +5 -5
  28. data/motion/_stdlib/cgi.rb +22 -0
  29. data/motion/_stdlib/date.rb +77 -0
  30. data/motion/_stdlib/time.rb +19 -0
  31. data/motion/core_ext/array/access.rb +28 -0
  32. data/motion/core_ext/array/conversions.rb +86 -0
  33. data/motion/core_ext/array/extract_options.rb +11 -0
  34. data/motion/core_ext/array/grouping.rb +99 -0
  35. data/motion/core_ext/array/prepend_and_append.rb +7 -0
  36. data/motion/core_ext/array/wrap.rb +45 -0
  37. data/{lib/motion-support → motion/core_ext}/array.rb +0 -4
  38. data/motion/core_ext/class/attribute.rb +119 -0
  39. data/motion/core_ext/class/attribute_accessors.rb +168 -0
  40. data/motion/core_ext/date/acts_like.rb +8 -0
  41. data/motion/core_ext/date/calculations.rb +117 -0
  42. data/motion/core_ext/date/conversions.rb +56 -0
  43. data/motion/core_ext/date_and_time/calculations.rb +232 -0
  44. data/motion/core_ext/enumerable.rb +90 -0
  45. data/motion/core_ext/hash/deep_merge.rb +27 -0
  46. data/motion/core_ext/hash/except.rb +15 -0
  47. data/motion/core_ext/hash/indifferent_access.rb +19 -0
  48. data/motion/core_ext/hash/keys.rb +138 -0
  49. data/motion/core_ext/hash/reverse_merge.rb +22 -0
  50. data/motion/core_ext/hash/slice.rb +40 -0
  51. data/motion/core_ext/integer/inflections.rb +27 -0
  52. data/motion/core_ext/integer/multiple.rb +10 -0
  53. data/motion/core_ext/integer/time.rb +41 -0
  54. data/{lib/motion-support → motion/core_ext}/metaclass.rb +0 -0
  55. data/motion/core_ext/module/aliasing.rb +69 -0
  56. data/motion/core_ext/module/anonymous.rb +19 -0
  57. data/motion/core_ext/module/attr_internal.rb +38 -0
  58. data/motion/core_ext/module/attribute_accessors.rb +64 -0
  59. data/motion/core_ext/module/delegation.rb +175 -0
  60. data/motion/core_ext/module/introspection.rb +60 -0
  61. data/motion/core_ext/module/reachable.rb +5 -0
  62. data/motion/core_ext/module/remove_method.rb +12 -0
  63. data/motion/core_ext/ns_dictionary.rb +11 -0
  64. data/motion/core_ext/numeric/bytes.rb +44 -0
  65. data/motion/core_ext/numeric/conversions.rb +7 -0
  66. data/motion/core_ext/numeric/time.rb +75 -0
  67. data/motion/core_ext/object/acts_like.rb +10 -0
  68. data/motion/core_ext/object/blank.rb +105 -0
  69. data/motion/core_ext/object/deep_dup.rb +44 -0
  70. data/motion/core_ext/object/duplicable.rb +83 -0
  71. data/motion/core_ext/object/instance_variables.rb +28 -0
  72. data/motion/core_ext/object/to_param.rb +58 -0
  73. data/motion/core_ext/object/to_query.rb +26 -0
  74. data/motion/core_ext/object/try.rb +78 -0
  75. data/motion/core_ext/range/include_range.rb +23 -0
  76. data/motion/core_ext/range/overlaps.rb +8 -0
  77. data/motion/core_ext/regexp.rb +5 -0
  78. data/motion/core_ext/string/access.rb +104 -0
  79. data/motion/core_ext/string/behavior.rb +6 -0
  80. data/motion/core_ext/string/exclude.rb +11 -0
  81. data/motion/core_ext/string/filters.rb +55 -0
  82. data/motion/core_ext/string/indent.rb +43 -0
  83. data/motion/core_ext/string/inflections.rb +195 -0
  84. data/motion/core_ext/string/starts_ends_with.rb +4 -0
  85. data/motion/core_ext/string/strip.rb +24 -0
  86. data/motion/core_ext/time/acts_like.rb +8 -0
  87. data/motion/core_ext/time/calculations.rb +215 -0
  88. data/motion/core_ext/time/conversions.rb +52 -0
  89. data/motion/duration.rb +104 -0
  90. data/motion/hash_with_indifferent_access.rb +251 -0
  91. data/motion/inflections.rb +67 -0
  92. data/motion/inflector/inflections.rb +203 -0
  93. data/motion/inflector/methods.rb +321 -0
  94. data/{lib/motion-support → motion}/logger.rb +0 -0
  95. data/{lib/motion-support → motion}/version.rb +1 -1
  96. data/motion-support.gemspec +2 -2
  97. data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
  98. data/spec/motion-support/_helpers/inflector_test_cases.rb +313 -0
  99. data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
  100. data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
  101. data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
  102. data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
  103. data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
  104. data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
  105. data/spec/motion-support/{array_spec.rb → core_ext/array_spec.rb} +0 -5
  106. data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
  107. data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
  108. data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
  109. data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
  110. data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
  111. data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
  112. data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
  113. data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
  114. data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
  115. data/spec/motion-support/core_ext/hash/key_spec.rb +230 -0
  116. data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
  117. data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
  118. data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
  119. data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
  120. data/spec/motion-support/{metaclass_spec.rb → core_ext/metaclass_spec.rb} +0 -0
  121. data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
  122. data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
  123. data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
  124. data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
  125. data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
  126. data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
  127. data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
  128. data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
  129. data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
  130. data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
  131. data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
  132. data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
  133. data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
  134. data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
  135. data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
  136. data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
  137. data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
  138. data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
  139. data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
  140. data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
  141. data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
  142. data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
  143. data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
  144. data/spec/motion-support/core_ext/string/filter_spec.rb +48 -0
  145. data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
  146. data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
  147. data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
  148. data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
  149. data/spec/motion-support/core_ext/string_spec.rb +88 -0
  150. data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
  151. data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
  152. data/spec/motion-support/core_ext/time/conversion_spec.rb +54 -0
  153. data/spec/motion-support/duration_spec.rb +107 -0
  154. data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
  155. data/spec/motion-support/inflector_spec.rb +474 -35
  156. data/spec/motion-support/ns_dictionary_spec.rb +29 -0
  157. metadata +212 -35
  158. data/lib/motion-support/cattr_accessor.rb +0 -19
  159. data/lib/motion-support/class_inheritable_accessor.rb +0 -23
  160. data/lib/motion-support/class_inheritable_array.rb +0 -29
  161. data/lib/motion-support/hash.rb +0 -31
  162. data/lib/motion-support/nilclass.rb +0 -5
  163. data/lib/motion-support/object.rb +0 -17
  164. data/lib/motion-support/string.rb +0 -71
  165. data/spec/motion-support/cattr_accessor_spec.rb +0 -49
  166. data/spec/motion-support/class_inheritable_accessor_spec.rb +0 -49
  167. data/spec/motion-support/class_inheritable_array_spec.rb +0 -61
  168. data/spec/motion-support/hash_spec.rb +0 -31
  169. data/spec/motion-support/nilclass_spec.rb +0 -5
  170. data/spec/motion-support/object_spec.rb +0 -43
  171. data/spec/motion-support/string_spec.rb +0 -145
@@ -0,0 +1,130 @@
1
+ describe "enumerable" do
2
+ describe "collect_with_index" do
3
+ describe "on Array" do
4
+ it "should return an empty array on an empty array" do
5
+ [].collect_with_index { |x, i| x }.should == []
6
+ end
7
+
8
+ it "should yield an index for each element" do
9
+ [1, 2, 3].collect_with_index { |x, i| [i, x] }.should == [[0, 1], [1, 2], [2, 3]]
10
+ end
11
+
12
+ it "should apply the block to each element" do
13
+ [1, 2, 3].collect_with_index { |x, i| x * i }.should == [0, 2, 6]
14
+ end
15
+ end
16
+
17
+ describe "on Hash" do
18
+ it "should return an empty array on an empty hash" do
19
+ {}.collect_with_index { |x, i| x }.should == []
20
+ end
21
+
22
+ it "should apply the block to each element" do
23
+ result = {:foo => 1, :bar => 2, :baz => 3}.collect_with_index { |p, i| [p.first, p.last, i] }
24
+ result.should == [[:foo, 1, 0], [:bar, 2, 1], [:baz, 3, 2]]
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "sum" do
30
+ it "should return the sum of an integer array" do
31
+ [5, 15, 10].sum.should == 30
32
+ end
33
+
34
+ it "should concatenate strings in a string array" do
35
+ ['foo', 'bar'].sum.should == "foobar"
36
+ end
37
+
38
+ it "should concatenate arrays" do
39
+ [[1, 2], [3, 1, 5]].sum.should == [1, 2, 3, 1, 5]
40
+ end
41
+
42
+ it "should yield a block to each element before summing if given" do
43
+ [1, 2, 3].sum { |p| p * 2 }.should == 12
44
+ end
45
+
46
+ it "should allow a custom result for an empty list" do
47
+ [].sum("empty") { |i| i.amount }.should == "empty"
48
+ end
49
+ end
50
+
51
+ describe "index_by" do
52
+ class Person < Struct.new(:first_name, :last_name)
53
+ end
54
+
55
+ before do
56
+ @peter = Person.new('Peter', 'Griffin')
57
+ @homer = Person.new('Homer', 'Simpson')
58
+ end
59
+
60
+ it "should create hash with keys given by block result" do
61
+ [@peter, @homer].index_by { |x| x.first_name }.should == { 'Peter' => @peter, 'Homer' => @homer }
62
+ end
63
+
64
+ it "should create enumerator if no block is given" do
65
+ [@peter, @homer].index_by.should.is_a Enumerator
66
+ end
67
+ end
68
+
69
+ describe "many?" do
70
+ it "should return false for an empty enumerable" do
71
+ [].many?.should == false
72
+ {}.many?.should == false
73
+ end
74
+
75
+ it "should return false for an enumerable with only one element" do
76
+ [1].many?.should == false
77
+ {:foo => :bar}.many?.should == false
78
+ end
79
+
80
+ it "should return true for an enumerable with more than one element" do
81
+ [1, 2].many?.should == true
82
+ [1, 2, 3].many?.should == true
83
+ {:foo => :bar, :baz => :bingo}.many?.should == true
84
+ {:a => :b, :c => :d, :e => :f}.many?.should == true
85
+ end
86
+
87
+ it "should return false if there are less than two elements satisfying the block if given" do
88
+ [1].many? { |x| x * 10 > 100 }.should == false
89
+ [1, 2, 3, 4, 5].many? { |x| x >= 5 }.should == false
90
+ end
91
+
92
+ it "should return true if there is more than one element satisfying the block if given" do
93
+ [1, 2, 3, 4, 5].many? { |x| x < 4 }.should == true
94
+ end
95
+ end
96
+
97
+ describe "exclude?" do
98
+ it "should return true if the element is not in the array" do
99
+ [1, 2, 3].exclude?(4).should == true
100
+ end
101
+
102
+ it "should return false if the element is in the array" do
103
+ [1, 2, 3].exclude?(2).should == false
104
+ end
105
+
106
+ it "should always return true for an empty array" do
107
+ [].exclude?(rand).should == true
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "Range" do
113
+ describe "sum" do
114
+ it "should return the sum of integers in an inclusive range" do
115
+ (3..5).sum.should == 12
116
+ end
117
+
118
+ it "should return the sum of integers in an exclusive range" do
119
+ (3...5).sum.should == 7
120
+ end
121
+
122
+ it "should return zero for an empty range" do
123
+ (1...1).sum.should == 0
124
+ end
125
+
126
+ it "should return custom identity for an empty range if given" do
127
+ (1...1).sum("empty").should == "empty"
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,32 @@
1
+ describe "hash" do
2
+ before do
3
+ @hash_1 = { :a => "a", :b => "b", :c => { :c1 => "c1", :c2 => "c2", :c3 => { :d1 => "d1" } } }
4
+ @hash_2 = { :a => 1, :c => { :c1 => 2, :c3 => { :d2 => "d2" } } }
5
+ end
6
+
7
+ describe "deep_merge" do
8
+ it "should deep merge" do
9
+ expected = { :a => 1, :b => "b", :c => { :c1 => 2, :c2 => "c2", :c3 => { :d1 => "d1", :d2 => "d2" } } }
10
+ @hash_1.deep_merge(@hash_2).should == expected
11
+ end
12
+
13
+ it "should deep merge with block" do
14
+ expected = { :a => [:a, "a", 1], :b => "b", :c => { :c1 => [:c1, "c1", 2], :c2 => "c2", :c3 => { :d1 => "d1", :d2 => "d2" } } }
15
+ (@hash_1.deep_merge(@hash_2) { |k,o,n| [k, o, n] }).should == expected
16
+ end
17
+ end
18
+
19
+ describe "deep_merge!" do
20
+ it "should deep merge" do
21
+ expected = { :a => 1, :b => "b", :c => { :c1 => 2, :c2 => "c2", :c3 => { :d1 => "d1", :d2 => "d2" } } }
22
+ @hash_1.deep_merge!(@hash_2)
23
+ @hash_1.should == expected
24
+ end
25
+
26
+ it "should deep merge with block" do
27
+ expected = { :a => [:a, "a", 1], :b => "b", :c => { :c1 => [:c1, "c1", 2], :c2 => "c2", :c3 => { :d1 => "d1", :d2 => "d2" } } }
28
+ @hash_1.deep_merge!(@hash_2) { |k,o,n| [k, o, n] }
29
+ @hash_1.should == expected
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,43 @@
1
+ describe "hash" do
2
+ describe "except" do
3
+ it "should remove key" do
4
+ original = { :a => 'x', :b => 'y', :c => 10 }
5
+ expected = { :a => 'x', :b => 'y' }
6
+
7
+ original.except(:c).should == expected
8
+ original.should.not == expected
9
+ end
10
+
11
+ it "should remove more than one key" do
12
+ original = { :a => 'x', :b => 'y', :c => 10 }
13
+ expected = { :a => 'x' }
14
+ original.except(:b, :c).should == expected
15
+ end
16
+
17
+ it "should work on frozen hash" do
18
+ original = { :a => 'x', :b => 'y' }
19
+ original.freeze
20
+ lambda { original.except(:a) }.should.not.raise
21
+ end
22
+ end
23
+
24
+ describe "except!" do
25
+ it "should remove key in place" do
26
+ original = { :a => 'x', :b => 'y', :c => 10 }
27
+ expected = { :a => 'x', :b => 'y' }
28
+
29
+ original.should.not == expected
30
+ original.except!(:c).should == expected
31
+ original.should == expected
32
+ end
33
+
34
+ it "should remove more than one key in place" do
35
+ original = { :a => 'x', :b => 'y', :c => 10 }
36
+ expected = { :a => 'x' }
37
+
38
+ original.should.not == expected
39
+ original.except!(:b, :c).should == expected
40
+ original.should == expected
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,230 @@
1
+ describe "Hash" do
2
+ describe "keys" do
3
+ before do
4
+ @strings = { 'a' => 1, 'b' => 2 }
5
+ @nested_strings = { 'a' => { 'b' => { 'c' => 3 } } }
6
+ @symbols = { :a => 1, :b => 2 }
7
+ @nested_symbols = { :a => { :b => { :c => 3 } } }
8
+ @mixed = { :a => 1, 'b' => 2 }
9
+ @nested_mixed = { 'a' => { :b => { 'c' => 3 } } }
10
+ @fixnums = { 0 => 1, 1 => 2 }
11
+ @nested_fixnums = { 0 => { 1 => { 2 => 3} } }
12
+ @illegal_symbols = { [] => 3 }
13
+ @nested_illegal_symbols = { [] => { [] => 3} }
14
+ @upcase_strings = { 'A' => 1, 'B' => 2 }
15
+ @nested_upcase_strings = { 'A' => { 'B' => { 'C' => 3 } } }
16
+ end
17
+
18
+ it "should have all key methods defined on literal hash" do
19
+ h = {}
20
+ h.should.respond_to :transform_keys
21
+ h.should.respond_to :transform_keys!
22
+ h.should.respond_to :deep_transform_keys
23
+ h.should.respond_to :deep_transform_keys!
24
+ h.should.respond_to :symbolize_keys
25
+ h.should.respond_to :symbolize_keys!
26
+ h.should.respond_to :deep_symbolize_keys
27
+ h.should.respond_to :deep_symbolize_keys!
28
+ h.should.respond_to :stringify_keys
29
+ h.should.respond_to :stringify_keys!
30
+ h.should.respond_to :deep_stringify_keys
31
+ h.should.respond_to :deep_stringify_keys!
32
+ h.should.respond_to :to_options
33
+ h.should.respond_to :to_options!
34
+ end
35
+
36
+ describe "transform_keys" do
37
+ it "should transform keys" do
38
+ @strings.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
39
+ @symbols.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
40
+ @mixed.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
41
+ end
42
+
43
+ it "should not mutate" do
44
+ transformed_hash = @mixed.dup
45
+ transformed_hash.transform_keys{ |key| key.to_s.upcase }
46
+ transformed_hash.should == @mixed
47
+ end
48
+ end
49
+
50
+ describe "deep_transform_keys" do
51
+ it "should deep transform keys" do
52
+ @nested_symbols.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
53
+ @nested_strings.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
54
+ @nested_mixed.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
55
+ end
56
+
57
+ it "should not mutate" do
58
+ transformed_hash = @nested_mixed.deep_dup
59
+ transformed_hash.deep_transform_keys{ |key| key.to_s.upcase }
60
+ transformed_hash.should == @nested_mixed
61
+ end
62
+ end
63
+
64
+ describe "transform_keys!" do
65
+ it "should transform keys" do
66
+ @symbols.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
67
+ @strings.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
68
+ @mixed.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
69
+ end
70
+
71
+ it "should mutate" do
72
+ transformed_hash = @mixed.dup
73
+ transformed_hash.transform_keys!{ |key| key.to_s.upcase }
74
+ transformed_hash.should == @upcase_strings
75
+ { :a => 1, "b" => 2 }.should == @mixed
76
+ end
77
+ end
78
+
79
+ describe "deep_transform_keys!" do
80
+ it "should deep transform keys" do
81
+ @nested_symbols.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
82
+ @nested_strings.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
83
+ @nested_mixed.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
84
+ end
85
+
86
+ it "should mutate" do
87
+ transformed_hash = @nested_mixed.deep_dup
88
+ transformed_hash.deep_transform_keys!{ |key| key.to_s.upcase }
89
+ transformed_hash.should == @nested_upcase_strings
90
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
91
+ end
92
+ end
93
+
94
+ describe "symbolize_keys" do
95
+ it "should symbolize keys" do
96
+ @symbols.symbolize_keys.should == @symbols
97
+ @strings.symbolize_keys.should == @symbols
98
+ @mixed.symbolize_keys.should == @symbols
99
+ end
100
+
101
+ it "should not mutate" do
102
+ transformed_hash = @mixed.dup
103
+ transformed_hash.symbolize_keys
104
+ transformed_hash.should == @mixed
105
+ end
106
+
107
+ it "should preserve keys that can't be symbolized" do
108
+ @illegal_symbols.symbolize_keys.should == @illegal_symbols
109
+ @illegal_symbols.dup.symbolize_keys!.should == @illegal_symbols
110
+ end
111
+
112
+ it "should preserve fixnum keys" do
113
+ @fixnums.symbolize_keys.should == @fixnums
114
+ @fixnums.dup.symbolize_keys!.should == @fixnums
115
+ end
116
+ end
117
+
118
+ describe "deep_symbolize_keys" do
119
+ it "should deep symbolize keys" do
120
+ @nested_symbols.deep_symbolize_keys.should == @nested_symbols
121
+ @nested_strings.deep_symbolize_keys.should == @nested_symbols
122
+ @nested_mixed.deep_symbolize_keys.should == @nested_symbols
123
+ end
124
+
125
+ it "should not mutate" do
126
+ transformed_hash = @nested_mixed.deep_dup
127
+ transformed_hash.deep_symbolize_keys
128
+ transformed_hash.should == @nested_mixed
129
+ end
130
+
131
+ it "should preserve keys that can't be symbolized" do
132
+ @nested_illegal_symbols.deep_symbolize_keys.should == @nested_illegal_symbols
133
+ @nested_illegal_symbols.deep_dup.deep_symbolize_keys!.should == @nested_illegal_symbols
134
+ end
135
+
136
+ it "should preserve fixnum keys" do
137
+ @nested_fixnums.deep_symbolize_keys.should == @nested_fixnums
138
+ @nested_fixnums.deep_dup.deep_symbolize_keys!.should == @nested_fixnums
139
+ end
140
+ end
141
+
142
+ describe "symbolize_keys!" do
143
+ it "should symbolize keys" do
144
+ @symbols.dup.symbolize_keys!.should == @symbols
145
+ @strings.dup.symbolize_keys!.should == @symbols
146
+ @mixed.dup.symbolize_keys!.should == @symbols
147
+ end
148
+
149
+ it "should mutate" do
150
+ transformed_hash = @mixed.dup
151
+ transformed_hash.deep_symbolize_keys!
152
+ transformed_hash.should == @symbols
153
+ { :a => 1, "b" => 2 }.should == @mixed
154
+ end
155
+ end
156
+
157
+ describe "deep_symbolize_keys!" do
158
+ it "should deep symbolize keys" do
159
+ @nested_symbols.deep_dup.deep_symbolize_keys!.should == @nested_symbols
160
+ @nested_strings.deep_dup.deep_symbolize_keys!.should == @nested_symbols
161
+ @nested_mixed.deep_dup.deep_symbolize_keys!.should == @nested_symbols
162
+ end
163
+
164
+ it "should mutate" do
165
+ transformed_hash = @nested_mixed.deep_dup
166
+ transformed_hash.deep_symbolize_keys!
167
+ transformed_hash.should == @nested_symbols
168
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
169
+ end
170
+ end
171
+
172
+ describe "stringify_keys" do
173
+ it "should stringify keys" do
174
+ @symbols.stringify_keys.should == @strings
175
+ @strings.stringify_keys.should == @strings
176
+ @mixed.stringify_keys.should == @strings
177
+ end
178
+
179
+ it "should not mutate" do
180
+ transformed_hash = @mixed.dup
181
+ transformed_hash.stringify_keys
182
+ transformed_hash.should == @mixed
183
+ end
184
+ end
185
+
186
+ describe "deep stringify_keys" do
187
+ it "should deep stringify keys" do
188
+ @nested_symbols.deep_stringify_keys.should == @nested_strings
189
+ @nested_strings.deep_stringify_keys.should == @nested_strings
190
+ @nested_mixed.deep_stringify_keys.should == @nested_strings
191
+ end
192
+
193
+ it "should not mutate" do
194
+ transformed_hash = @nested_mixed.deep_dup
195
+ transformed_hash.deep_stringify_keys
196
+ transformed_hash.should == @nested_mixed
197
+ end
198
+ end
199
+
200
+ describe "stringify_keys!" do
201
+ it "should stringify keys" do
202
+ @symbols.dup.stringify_keys!.should == @strings
203
+ @strings.dup.stringify_keys!.should == @strings
204
+ @mixed.dup.stringify_keys!.should == @strings
205
+ end
206
+
207
+ it "should mutate" do
208
+ transformed_hash = @mixed.dup
209
+ transformed_hash.stringify_keys!
210
+ transformed_hash.should == @strings
211
+ { :a => 1, "b" => 2 }.should == @mixed
212
+ end
213
+ end
214
+
215
+ describe "deep_stringify_keys!" do
216
+ it "should deep stringify keys" do
217
+ @nested_symbols.deep_dup.deep_stringify_keys!.should == @nested_strings
218
+ @nested_strings.deep_dup.deep_stringify_keys!.should == @nested_strings
219
+ @nested_mixed.deep_dup.deep_stringify_keys!.should == @nested_strings
220
+ end
221
+
222
+ it "should mutate" do
223
+ transformed_hash = @nested_mixed.deep_dup
224
+ transformed_hash.deep_stringify_keys!
225
+ transformed_hash.should == @nested_strings
226
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,26 @@
1
+ describe "hash" do
2
+ describe "reverse_merge" do
3
+ before do
4
+ @defaults = { :a => "x", :b => "y", :c => 10 }.freeze
5
+ @options = { :a => 1, :b => 2 }
6
+ @expected = { :a => 1, :b => 2, :c => 10 }
7
+ end
8
+
9
+ it "should merge defaults into options, creating a new hash" do
10
+ @options.reverse_merge(@defaults).should == @expected
11
+ @options.should.not == @expected
12
+ end
13
+
14
+ it "should merge! defaults into options, replacing options" do
15
+ merged = @options.dup
16
+ merged.reverse_merge!(@defaults).should == @expected
17
+ merged.should == @expected
18
+ end
19
+
20
+ it "should be an alias for reverse_merge!" do
21
+ merged = @options.dup
22
+ merged.reverse_update(@defaults).should == @expected
23
+ merged.should == @expected
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,61 @@
1
+ describe "hash" do
2
+ describe "slice" do
3
+ it "should return a new hash with only the given keys" do
4
+ original = { :a => 'x', :b => 'y', :c => 10 }
5
+ expected = { :a => 'x', :b => 'y' }
6
+
7
+ original.slice(:a, :b).should == expected
8
+ original.should.not == expected
9
+ end
10
+
11
+ it "should replace the hash with only the given keys" do
12
+ original = { :a => 'x', :b => 'y', :c => 10 }
13
+ expected = { :c => 10 }
14
+
15
+ original.slice!(:a, :b).should == expected
16
+ end
17
+
18
+ it "should return a new hash with only the given keys when given an array key" do
19
+ original = { :a => 'x', :b => 'y', :c => 10, [:a, :b] => "an array key" }
20
+ expected = { [:a, :b] => "an array key", :c => 10 }
21
+
22
+ original.slice([:a, :b], :c).should == expected
23
+ original.should.not == expected
24
+ end
25
+
26
+ it "should replace the hash with only the given keys when given an array key" do
27
+ original = { :a => 'x', :b => 'y', :c => 10, [:a, :b] => "an array key" }
28
+ expected = { :a => 'x', :b => 'y' }
29
+
30
+ original.slice!([:a, :b], :c).should == expected
31
+ end
32
+
33
+ it "should grab each of the splatted keys" do
34
+ original = { :a => 'x', :b => 'y', :c => 10, [:a, :b] => "an array key" }
35
+ expected = { :a => 'x', :b => "y" }
36
+
37
+ original.slice(*[:a, :b]).should == expected
38
+ end
39
+ end
40
+
41
+ describe "extract!" do
42
+ it "should extract subhash" do
43
+ original = {:a => 1, :b => 2, :c => 3, :d => 4}
44
+ expected = {:a => 1, :b => 2}
45
+ remaining = {:c => 3, :d => 4}
46
+
47
+ original.extract!(:a, :b, :x).should == expected
48
+ original.should == remaining
49
+ end
50
+
51
+ it "should extract nils" do
52
+ original = {:a => nil, :b => nil}
53
+ expected = {:a => nil}
54
+ extracted = original.extract!(:a, :x)
55
+
56
+ extracted.should == expected
57
+ extracted[:a].should == nil
58
+ extracted[:x].should == nil
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,23 @@
1
+ # These tests are mostly just to ensure that the ordinalize method exists.
2
+ # Its results are tested comprehensively in the inflector test cases.
3
+ describe "Integer" do
4
+ describe "ordinalize" do
5
+ it "should ordinalize 1" do
6
+ 1.ordinalize.should == '1st'
7
+ end
8
+
9
+ it "should ordinalize 8" do
10
+ 8.ordinalize.should == '8th'
11
+ end
12
+ end
13
+
14
+ describe "ordinal" do
15
+ it "should get ordinal of 1" do
16
+ 1.ordinal.should == 'st'
17
+ end
18
+
19
+ it "should get ordinal of 8" do
20
+ 8.ordinal.should == 'th'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ PRIME = 22953686867719691230002707821868552601124472329079
2
+
3
+ describe "Integer" do
4
+ describe "multiple_of" do
5
+ it "should determine if an integer is a multiple of another" do
6
+ [ -7, 0, 7, 14 ].each { |i| i.should.be.multiple_of 7 }
7
+ [ -7, 7, 14 ].each { |i| i.should.not.be.multiple_of 6 }
8
+ end
9
+
10
+ it "should work with edge cases" do
11
+ 0.should.be.multiple_of 0
12
+ 5.should.not.be.multiple_of 0
13
+ end
14
+
15
+ it "should work with a prime" do
16
+ [2, 3, 5, 7].each { |i| PRIME.should.not.be.multiple_of i }
17
+ end
18
+ end
19
+ end