motion-support 0.1.0 → 0.2.0

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 (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