motion_blender-support 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +4 -0
  5. data/HACKS.md +7 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +359 -0
  8. data/Rakefile +14 -0
  9. data/app/app_delegate.rb +5 -0
  10. data/examples/Inflector/.gitignore +16 -0
  11. data/examples/Inflector/Gemfile +5 -0
  12. data/examples/Inflector/Rakefile +13 -0
  13. data/examples/Inflector/app/app_delegate.rb +8 -0
  14. data/examples/Inflector/app/inflections.rb +5 -0
  15. data/examples/Inflector/app/inflector_view_controller.rb +109 -0
  16. data/examples/Inflector/app/words_view_controller.rb +101 -0
  17. data/examples/Inflector/resources/Default-568h@2x.png +0 -0
  18. data/examples/Inflector/spec/main_spec.rb +9 -0
  19. data/lib/motion-support/callbacks.rb +8 -0
  20. data/lib/motion-support/concern.rb +4 -0
  21. data/lib/motion-support/core_ext/array.rb +10 -0
  22. data/lib/motion-support/core_ext/class.rb +5 -0
  23. data/lib/motion-support/core_ext/hash.rb +13 -0
  24. data/lib/motion-support/core_ext/integer.rb +6 -0
  25. data/lib/motion-support/core_ext/module.rb +11 -0
  26. data/lib/motion-support/core_ext/numeric.rb +6 -0
  27. data/lib/motion-support/core_ext/object.rb +12 -0
  28. data/lib/motion-support/core_ext/range.rb +5 -0
  29. data/lib/motion-support/core_ext/string.rb +13 -0
  30. data/lib/motion-support/core_ext/time.rb +16 -0
  31. data/lib/motion-support/core_ext.rb +13 -0
  32. data/lib/motion-support/inflector.rb +8 -0
  33. data/lib/motion-support.rb +81 -0
  34. data/motion/_stdlib/array.rb +13 -0
  35. data/motion/_stdlib/cgi.rb +22 -0
  36. data/motion/_stdlib/date.rb +81 -0
  37. data/motion/_stdlib/enumerable.rb +9 -0
  38. data/motion/_stdlib/time.rb +19 -0
  39. data/motion/callbacks.rb +511 -0
  40. data/motion/concern.rb +122 -0
  41. data/motion/core_ext/array/access.rb +28 -0
  42. data/motion/core_ext/array/conversions.rb +86 -0
  43. data/motion/core_ext/array/extract_options.rb +11 -0
  44. data/motion/core_ext/array/grouping.rb +99 -0
  45. data/motion/core_ext/array/prepend_and_append.rb +7 -0
  46. data/motion/core_ext/array/wrap.rb +45 -0
  47. data/motion/core_ext/array.rb +19 -0
  48. data/motion/core_ext/class/attribute.rb +119 -0
  49. data/motion/core_ext/class/attribute_accessors.rb +168 -0
  50. data/motion/core_ext/date/acts_like.rb +8 -0
  51. data/motion/core_ext/date/calculations.rb +117 -0
  52. data/motion/core_ext/date/conversions.rb +56 -0
  53. data/motion/core_ext/date_and_time/calculations.rb +232 -0
  54. data/motion/core_ext/enumerable.rb +90 -0
  55. data/motion/core_ext/hash/deep_delete_if.rb +23 -0
  56. data/motion/core_ext/hash/deep_merge.rb +27 -0
  57. data/motion/core_ext/hash/except.rb +15 -0
  58. data/motion/core_ext/hash/indifferent_access.rb +19 -0
  59. data/motion/core_ext/hash/keys.rb +150 -0
  60. data/motion/core_ext/hash/reverse_merge.rb +22 -0
  61. data/motion/core_ext/hash/slice.rb +40 -0
  62. data/motion/core_ext/integer/inflections.rb +27 -0
  63. data/motion/core_ext/integer/multiple.rb +10 -0
  64. data/motion/core_ext/integer/time.rb +41 -0
  65. data/motion/core_ext/kernel/singleton_class.rb +6 -0
  66. data/motion/core_ext/metaclass.rb +8 -0
  67. data/motion/core_ext/module/aliasing.rb +69 -0
  68. data/motion/core_ext/module/anonymous.rb +19 -0
  69. data/motion/core_ext/module/attr_internal.rb +38 -0
  70. data/motion/core_ext/module/attribute_accessors.rb +64 -0
  71. data/motion/core_ext/module/delegation.rb +175 -0
  72. data/motion/core_ext/module/introspection.rb +60 -0
  73. data/motion/core_ext/module/reachable.rb +5 -0
  74. data/motion/core_ext/module/remove_method.rb +12 -0
  75. data/motion/core_ext/ns_dictionary.rb +14 -0
  76. data/motion/core_ext/ns_string.rb +14 -0
  77. data/motion/core_ext/numeric/bytes.rb +44 -0
  78. data/motion/core_ext/numeric/conversions.rb +49 -0
  79. data/motion/core_ext/numeric/time.rb +75 -0
  80. data/motion/core_ext/object/acts_like.rb +10 -0
  81. data/motion/core_ext/object/blank.rb +105 -0
  82. data/motion/core_ext/object/deep_dup.rb +44 -0
  83. data/motion/core_ext/object/duplicable.rb +87 -0
  84. data/motion/core_ext/object/inclusion.rb +15 -0
  85. data/motion/core_ext/object/instance_variables.rb +28 -0
  86. data/motion/core_ext/object/to_param.rb +58 -0
  87. data/motion/core_ext/object/to_query.rb +26 -0
  88. data/motion/core_ext/object/try.rb +78 -0
  89. data/motion/core_ext/range/include_range.rb +23 -0
  90. data/motion/core_ext/range/overlaps.rb +8 -0
  91. data/motion/core_ext/regexp.rb +5 -0
  92. data/motion/core_ext/string/access.rb +104 -0
  93. data/motion/core_ext/string/behavior.rb +6 -0
  94. data/motion/core_ext/string/exclude.rb +11 -0
  95. data/motion/core_ext/string/filters.rb +55 -0
  96. data/motion/core_ext/string/indent.rb +43 -0
  97. data/motion/core_ext/string/inflections.rb +178 -0
  98. data/motion/core_ext/string/starts_ends_with.rb +4 -0
  99. data/motion/core_ext/string/strip.rb +24 -0
  100. data/motion/core_ext/time/acts_like.rb +8 -0
  101. data/motion/core_ext/time/calculations.rb +215 -0
  102. data/motion/core_ext/time/conversions.rb +52 -0
  103. data/motion/descendants_tracker.rb +50 -0
  104. data/motion/duration.rb +104 -0
  105. data/motion/hash_with_indifferent_access.rb +253 -0
  106. data/motion/inflections.rb +67 -0
  107. data/motion/inflector/inflections.rb +203 -0
  108. data/motion/inflector/methods.rb +321 -0
  109. data/motion/logger.rb +47 -0
  110. data/motion/number_helper.rb +54 -0
  111. data/motion/version.rb +3 -0
  112. data/motion_blender-support.gemspec +21 -0
  113. data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
  114. data/spec/motion-support/_helpers/inflector_test_cases.rb +270 -0
  115. data/spec/motion-support/callback_spec.rb +702 -0
  116. data/spec/motion-support/concern_spec.rb +93 -0
  117. data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
  118. data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
  119. data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
  120. data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
  121. data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
  122. data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
  123. data/spec/motion-support/core_ext/array_spec.rb +16 -0
  124. data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
  125. data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
  126. data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
  127. data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
  128. data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
  129. data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
  130. data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
  131. data/spec/motion-support/core_ext/hash/deep_delete_if_spec.rb +19 -0
  132. data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
  133. data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
  134. data/spec/motion-support/core_ext/hash/key_spec.rb +236 -0
  135. data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
  136. data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
  137. data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
  138. data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
  139. data/spec/motion-support/core_ext/kernel/singleton_class_spec.rb +9 -0
  140. data/spec/motion-support/core_ext/metaclass_spec.rb +9 -0
  141. data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
  142. data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
  143. data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
  144. data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
  145. data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
  146. data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
  147. data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
  148. data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
  149. data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
  150. data/spec/motion-support/core_ext/numeric/conversions_spec.rb +40 -0
  151. data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
  152. data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
  153. data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
  154. data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
  155. data/spec/motion-support/core_ext/object/inclusion_spec.rb +34 -0
  156. data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
  157. data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
  158. data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
  159. data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
  160. data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
  161. data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
  162. data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
  163. data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
  164. data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
  165. data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
  166. data/spec/motion-support/core_ext/string/filter_spec.rb +49 -0
  167. data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
  168. data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
  169. data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
  170. data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
  171. data/spec/motion-support/core_ext/string_spec.rb +88 -0
  172. data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
  173. data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
  174. data/spec/motion-support/core_ext/time/conversion_spec.rb +53 -0
  175. data/spec/motion-support/descendants_tracker_spec.rb +58 -0
  176. data/spec/motion-support/duration_spec.rb +107 -0
  177. data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
  178. data/spec/motion-support/inflector_spec.rb +504 -0
  179. data/spec/motion-support/ns_dictionary_spec.rb +89 -0
  180. data/spec/motion-support/ns_string_spec.rb +182 -0
  181. data/spec/motion-support/number_helper_spec.rb +55 -0
  182. metadata +352 -0
@@ -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,236 @@
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
+ @nested_array_symbols = { :a => [ { :a => 1 }, { :b => 2 } ] }
17
+ @nested_array_strings = { 'a' => [ { 'a' => 1 }, { 'b' => 2 } ] }
18
+ end
19
+
20
+ it "should have all key methods defined on literal hash" do
21
+ h = {}
22
+ h.should.respond_to :transform_keys
23
+ h.should.respond_to :transform_keys!
24
+ h.should.respond_to :deep_transform_keys
25
+ h.should.respond_to :deep_transform_keys!
26
+ h.should.respond_to :symbolize_keys
27
+ h.should.respond_to :symbolize_keys!
28
+ h.should.respond_to :deep_symbolize_keys
29
+ h.should.respond_to :deep_symbolize_keys!
30
+ h.should.respond_to :stringify_keys
31
+ h.should.respond_to :stringify_keys!
32
+ h.should.respond_to :deep_stringify_keys
33
+ h.should.respond_to :deep_stringify_keys!
34
+ h.should.respond_to :to_options
35
+ h.should.respond_to :to_options!
36
+ end
37
+
38
+ describe "transform_keys" do
39
+ it "should transform keys" do
40
+ @strings.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
41
+ @symbols.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
42
+ @mixed.transform_keys{ |key| key.to_s.upcase }.should == @upcase_strings
43
+ end
44
+
45
+ it "should not mutate" do
46
+ transformed_hash = @mixed.dup
47
+ transformed_hash.transform_keys{ |key| key.to_s.upcase }
48
+ transformed_hash.should == @mixed
49
+ end
50
+ end
51
+
52
+ describe "deep_transform_keys" do
53
+ it "should deep transform keys" do
54
+ @nested_symbols.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
55
+ @nested_strings.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
56
+ @nested_mixed.deep_transform_keys{ |key| key.to_s.upcase }.should == @nested_upcase_strings
57
+ end
58
+
59
+ it "should not mutate" do
60
+ transformed_hash = @nested_mixed.deep_dup
61
+ transformed_hash.deep_transform_keys{ |key| key.to_s.upcase }
62
+ transformed_hash.should == @nested_mixed
63
+ end
64
+ end
65
+
66
+ describe "transform_keys!" do
67
+ it "should transform keys" do
68
+ @symbols.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
69
+ @strings.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
70
+ @mixed.dup.transform_keys!{ |key| key.to_s.upcase }.should == @upcase_strings
71
+ end
72
+
73
+ it "should mutate" do
74
+ transformed_hash = @mixed.dup
75
+ transformed_hash.transform_keys!{ |key| key.to_s.upcase }
76
+ transformed_hash.should == @upcase_strings
77
+ { :a => 1, "b" => 2 }.should == @mixed
78
+ end
79
+ end
80
+
81
+ describe "deep_transform_keys!" do
82
+ it "should deep transform keys" do
83
+ @nested_symbols.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
84
+ @nested_strings.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
85
+ @nested_mixed.deep_dup.deep_transform_keys!{ |key| key.to_s.upcase }.should == @nested_upcase_strings
86
+ end
87
+
88
+ it "should mutate" do
89
+ transformed_hash = @nested_mixed.deep_dup
90
+ transformed_hash.deep_transform_keys!{ |key| key.to_s.upcase }
91
+ transformed_hash.should == @nested_upcase_strings
92
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
93
+ end
94
+ end
95
+
96
+ describe "symbolize_keys" do
97
+ it "should symbolize keys" do
98
+ @symbols.symbolize_keys.should == @symbols
99
+ @strings.symbolize_keys.should == @symbols
100
+ @mixed.symbolize_keys.should == @symbols
101
+ end
102
+
103
+ it "should not mutate" do
104
+ transformed_hash = @mixed.dup
105
+ transformed_hash.symbolize_keys
106
+ transformed_hash.should == @mixed
107
+ end
108
+
109
+ it "should preserve keys that can't be symbolized" do
110
+ @illegal_symbols.symbolize_keys.should == @illegal_symbols
111
+ @illegal_symbols.dup.symbolize_keys!.should == @illegal_symbols
112
+ end
113
+
114
+ it "should preserve fixnum keys" do
115
+ @fixnums.symbolize_keys.should == @fixnums
116
+ @fixnums.dup.symbolize_keys!.should == @fixnums
117
+ end
118
+ end
119
+
120
+ describe "deep_symbolize_keys" do
121
+ it "should deep symbolize keys" do
122
+ @nested_symbols.deep_symbolize_keys.should == @nested_symbols
123
+ @nested_strings.deep_symbolize_keys.should == @nested_symbols
124
+ @nested_mixed.deep_symbolize_keys.should == @nested_symbols
125
+ @nested_array_strings.deep_symbolize_keys.should == @nested_array_symbols
126
+ end
127
+
128
+ it "should not mutate" do
129
+ transformed_hash = @nested_mixed.deep_dup
130
+ transformed_hash.deep_symbolize_keys
131
+ transformed_hash.should == @nested_mixed
132
+ end
133
+
134
+ it "should preserve keys that can't be symbolized" do
135
+ @nested_illegal_symbols.deep_symbolize_keys.should == @nested_illegal_symbols
136
+ @nested_illegal_symbols.deep_dup.deep_symbolize_keys!.should == @nested_illegal_symbols
137
+ end
138
+
139
+ it "should preserve fixnum keys" do
140
+ @nested_fixnums.deep_symbolize_keys.should == @nested_fixnums
141
+ @nested_fixnums.deep_dup.deep_symbolize_keys!.should == @nested_fixnums
142
+ end
143
+ end
144
+
145
+ describe "symbolize_keys!" do
146
+ it "should symbolize keys" do
147
+ @symbols.dup.symbolize_keys!.should == @symbols
148
+ @strings.dup.symbolize_keys!.should == @symbols
149
+ @mixed.dup.symbolize_keys!.should == @symbols
150
+ end
151
+
152
+ it "should mutate" do
153
+ transformed_hash = @mixed.dup
154
+ transformed_hash.deep_symbolize_keys!
155
+ transformed_hash.should == @symbols
156
+ { :a => 1, "b" => 2 }.should == @mixed
157
+ end
158
+ end
159
+
160
+ describe "deep_symbolize_keys!" do
161
+ it "should deep symbolize keys" do
162
+ @nested_symbols.deep_dup.deep_symbolize_keys!.should == @nested_symbols
163
+ @nested_strings.deep_dup.deep_symbolize_keys!.should == @nested_symbols
164
+ @nested_mixed.deep_dup.deep_symbolize_keys!.should == @nested_symbols
165
+ @nested_array_strings.deep_symbolize_keys!.should == @nested_array_symbols
166
+ end
167
+
168
+ it "should mutate" do
169
+ transformed_hash = @nested_mixed.deep_dup
170
+ transformed_hash.deep_symbolize_keys!
171
+ transformed_hash.should == @nested_symbols
172
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
173
+ end
174
+ end
175
+
176
+ describe "stringify_keys" do
177
+ it "should stringify keys" do
178
+ @symbols.stringify_keys.should == @strings
179
+ @strings.stringify_keys.should == @strings
180
+ @mixed.stringify_keys.should == @strings
181
+ end
182
+
183
+ it "should not mutate" do
184
+ transformed_hash = @mixed.dup
185
+ transformed_hash.stringify_keys
186
+ transformed_hash.should == @mixed
187
+ end
188
+ end
189
+
190
+ describe "deep stringify_keys" do
191
+ it "should deep stringify keys" do
192
+ @nested_symbols.deep_stringify_keys.should == @nested_strings
193
+ @nested_strings.deep_stringify_keys.should == @nested_strings
194
+ @nested_mixed.deep_stringify_keys.should == @nested_strings
195
+ @nested_array_symbols.deep_stringify_keys.should == @nested_array_strings
196
+ end
197
+
198
+ it "should not mutate" do
199
+ transformed_hash = @nested_mixed.deep_dup
200
+ transformed_hash.deep_stringify_keys
201
+ transformed_hash.should == @nested_mixed
202
+ end
203
+ end
204
+
205
+ describe "stringify_keys!" do
206
+ it "should stringify keys" do
207
+ @symbols.dup.stringify_keys!.should == @strings
208
+ @strings.dup.stringify_keys!.should == @strings
209
+ @mixed.dup.stringify_keys!.should == @strings
210
+ end
211
+
212
+ it "should mutate" do
213
+ transformed_hash = @mixed.dup
214
+ transformed_hash.stringify_keys!
215
+ transformed_hash.should == @strings
216
+ { :a => 1, "b" => 2 }.should == @mixed
217
+ end
218
+ end
219
+
220
+ describe "deep_stringify_keys!" do
221
+ it "should deep stringify keys" do
222
+ @nested_symbols.deep_dup.deep_stringify_keys!.should == @nested_strings
223
+ @nested_strings.deep_dup.deep_stringify_keys!.should == @nested_strings
224
+ @nested_mixed.deep_dup.deep_stringify_keys!.should == @nested_strings
225
+ @nested_array_symbols.deep_stringify_keys!.should == @nested_array_strings
226
+ end
227
+
228
+ it "should mutate" do
229
+ transformed_hash = @nested_mixed.deep_dup
230
+ transformed_hash.deep_stringify_keys!
231
+ transformed_hash.should == @nested_strings
232
+ { 'a' => { :b => { 'c' => 3 } } }.should == @nested_mixed
233
+ end
234
+ end
235
+ end
236
+ 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
@@ -0,0 +1,9 @@
1
+ describe "Kernel" do
2
+ describe "class_eval" do
3
+ it "should delegate to singleton class" do
4
+ o = Object.new
5
+ class << o; @x = 1; end
6
+ o.class_eval { @x }.should == 1
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ describe "metaclass" do
2
+ it "should return the metaclass for a class" do
3
+ String.metaclass.is_a?(Class).should == true
4
+ end
5
+
6
+ it "should return the metaclass for an object" do
7
+ "string".metaclass.is_a?(Class).should == true
8
+ end
9
+ end
@@ -0,0 +1,143 @@
1
+ module Aliasing
2
+ class File
3
+ public
4
+ def open(file)
5
+ end
6
+ def open_with_internet(url)
7
+ open_without_internet(url)
8
+ end
9
+ alias_method_chain :open, :internet
10
+
11
+ protected
12
+ def exist?(file)
13
+ end
14
+ def exist_with_internet?(url)
15
+ exist_without_internet?(url)
16
+ end
17
+ alias_method_chain :exist?, :internet
18
+
19
+ private
20
+ def remove!(file)
21
+ end
22
+ def remove_with_internet!(url)
23
+ remove_without_internet!(url)
24
+ end
25
+ alias_method_chain :remove!, :internet
26
+ end
27
+
28
+ class Content
29
+ attr_accessor :title, :Data
30
+
31
+ def initialize
32
+ @title, @Data = nil, nil
33
+ end
34
+
35
+ def title?
36
+ !title.nil?
37
+ end
38
+
39
+ def Data?
40
+ !self.Data.nil?
41
+ end
42
+ end
43
+
44
+ class Email < Content
45
+ alias_attribute :subject, :title
46
+ alias_attribute :body, :Data
47
+ end
48
+ end
49
+
50
+ describe "module" do
51
+ describe "alias_method_chain" do
52
+ it "should define 'without' method" do
53
+ Aliasing::File.new.should.respond_to :open_without_internet
54
+ end
55
+
56
+ it "should respond to original method" do
57
+ Aliasing::File.new.should.respond_to :open
58
+ end
59
+
60
+ it "should respond to 'with' method" do
61
+ Aliasing::File.new.should.respond_to :open_with_internet
62
+ end
63
+
64
+ it "should preserve question punctuation" do
65
+ Aliasing::File.new.should.respond_to :exist_without_internet?
66
+ end
67
+
68
+ it "should preserve bang punctuation" do
69
+ # Ruby objects don't respond to private methods
70
+ Aliasing::File.new.should.not.respond_to :remove_without_internet!
71
+ end
72
+
73
+ it "should keep public methods public" do
74
+ Aliasing::File.new.public_methods.should.include :"open_without_internet:"
75
+ end
76
+
77
+ it "should keep protected methods protected" do
78
+ Aliasing::File.new.protected_methods.should.include :"exist_without_internet?:"
79
+ end
80
+
81
+ it "should keep private methods private" do
82
+ Aliasing::File.new.private_methods.should.include :"remove_without_internet!:"
83
+ end
84
+ end
85
+
86
+ describe "alias_attribute" do
87
+ before do
88
+ @email = Aliasing::Email.new
89
+ end
90
+
91
+ describe "getter" do
92
+ it "should exist" do
93
+ lambda { @email.subject }.should.not.raise
94
+ end
95
+
96
+ it "should read" do
97
+ @email.title = "hello"
98
+ @email.subject.should == "hello"
99
+ end
100
+
101
+ it "should read from uppercase method" do
102
+ @email.body = "world"
103
+ @email.Data.should == "world"
104
+ end
105
+ end
106
+
107
+ describe "setter" do
108
+ it "should exist" do
109
+ lambda { @email.subject = "hello" }.should.not.raise
110
+ end
111
+
112
+ it "should write" do
113
+ @email.subject = "hello"
114
+ @email.title.should == "hello"
115
+ end
116
+
117
+ it "should write to uppercase method" do
118
+ @email.Data = "world"
119
+ @email.body.should == "world"
120
+ end
121
+ end
122
+
123
+ describe "question method" do
124
+ it "should exist" do
125
+ lambda { @email.subject? }.should.not.raise
126
+ end
127
+
128
+ it "should return false for nil attribute" do
129
+ @email.subject?.should == false
130
+ end
131
+
132
+ it "should return true for non-nil attribute" do
133
+ @email.title = "hello"
134
+ @email.subject?.should == true
135
+ end
136
+
137
+ it "should return true for non-nil uppercase attribute" do
138
+ @email.body = "hello"
139
+ @email.Data?.should == true
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,29 @@
1
+ describe "module" do
2
+ describe "anonymous?" do
3
+ it "should return true for an anonymous module" do
4
+ Module.new.anonymous?.should == true
5
+ end
6
+
7
+ it "should return true for an anonymous class" do
8
+ Class.new.anonymous?.should == true
9
+ end
10
+
11
+ it "should return false for a named module" do
12
+ Kernel.anonymous?.should == false
13
+ end
14
+
15
+ it "should return false for a named class" do
16
+ Object.anonymous?.should == false
17
+ end
18
+
19
+ it "should return false for module that acquired a name" do
20
+ NamedModule = Module.new
21
+ NamedModule.anonymous?.should == false
22
+ end
23
+
24
+ it "should return false for module that acquired a name" do
25
+ NamedClass = Class.new
26
+ NamedClass.anonymous?.should == false
27
+ end
28
+ end
29
+ end