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
@@ -1,65 +1,504 @@
1
- describe 'Extensions' do
2
- describe 'Pluralization' do
3
- it 'pluralizes a normal word: dog' do
4
- Inflector.inflections.pluralize('dog').should == 'dogs'
1
+ module InflectorHelper
2
+ # Dups the singleton and yields, restoring the original inflections later.
3
+ # Use this in tests what modify the state of the singleton.
4
+ #
5
+ # This helper is implemented by setting @__instance__ because in some tests
6
+ # there are module functions that access MotionSupport::Inflector.inflections,
7
+ # so we need to replace the singleton itself.
8
+ def with_dup
9
+ original = MotionSupport::Inflector::Inflections.instance_variable_get(:@__instance__)
10
+ MotionSupport::Inflector::Inflections.instance_variable_set(:@__instance__, original.dup)
11
+ yield
12
+ ensure
13
+ MotionSupport::Inflector::Inflections.instance_variable_set(:@__instance__, original)
14
+ end
15
+ end
16
+
17
+ describe "Inflector" do
18
+ describe "singularize/pluralize" do
19
+ extend InflectorHelper
20
+
21
+ it "should pluralize plurals" do
22
+ MotionSupport::Inflector.pluralize("plurals").should == "plurals"
23
+ MotionSupport::Inflector.pluralize("Plurals").should == "Plurals"
24
+ end
25
+
26
+ it "should pluralize empty string" do
27
+ MotionSupport::Inflector.pluralize("").should == ""
28
+ end
29
+
30
+ MotionSupport::Inflector.inflections.uncountable.each do |word|
31
+ it "should treat #{word} as uncountable" do
32
+ MotionSupport::Inflector.singularize(word).should == word
33
+ MotionSupport::Inflector.pluralize(word).should == word
34
+ MotionSupport::Inflector.singularize(word).should == MotionSupport::Inflector.pluralize(word)
35
+ end
36
+ end
37
+
38
+ InflectorTestCases::SingularToPlural.each do |singular, plural|
39
+ it "should pluralize singular #{singular}" do
40
+ MotionSupport::Inflector.pluralize(singular).should == plural
41
+ MotionSupport::Inflector.pluralize(singular.capitalize).should == plural.capitalize
42
+ end
43
+
44
+ it "should singularize plural #{plural}" do
45
+ MotionSupport::Inflector.singularize(plural).should == singular
46
+ MotionSupport::Inflector.singularize(plural.capitalize).should == singular.capitalize
47
+ end
48
+
49
+ it "should pluralize plural #{plural}" do
50
+ MotionSupport::Inflector.pluralize(plural).should == plural
51
+ MotionSupport::Inflector.pluralize(plural.capitalize).should == plural.capitalize
52
+ end
53
+
54
+ it "should singularize singular #{singular}" do
55
+ MotionSupport::Inflector.singularize(singular).should == singular
56
+ MotionSupport::Inflector.singularize(singular.capitalize).should == singular.capitalize
57
+ end
58
+ end
59
+
60
+ it "should handle uncountable words non-greedily" do
61
+ with_dup do
62
+ uncountable_word = "ors"
63
+ countable_word = "sponsor"
64
+
65
+ MotionSupport::Inflector.inflections.uncountable << uncountable_word
66
+
67
+ MotionSupport::Inflector.singularize(uncountable_word).should == uncountable_word
68
+ MotionSupport::Inflector.pluralize(uncountable_word).should == uncountable_word
69
+ MotionSupport::Inflector.pluralize(uncountable_word).should == MotionSupport::Inflector.singularize(uncountable_word)
70
+
71
+ MotionSupport::Inflector.singularize(countable_word).should == "sponsor"
72
+ MotionSupport::Inflector.pluralize(countable_word).should == "sponsors"
73
+ MotionSupport::Inflector.singularize(MotionSupport::Inflector.pluralize(countable_word)).should == "sponsor"
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "titleize" do
79
+ InflectorTestCases::MixtureToTitleCase.each do |before, titleized|
80
+ it "should titleize #{before}" do
81
+ MotionSupport::Inflector.titleize(before).should == titleized
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "underscore" do
87
+ InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
88
+ it "should underscore #{camel}" do
89
+ MotionSupport::Inflector.underscore(camel).should == underscore
90
+ end
91
+ end
92
+
93
+ InflectorTestCases::CamelToUnderscoreWithoutReverse.each do |camel, underscore|
94
+ it "should underscore #{camel}" do
95
+ MotionSupport::Inflector.underscore(camel).should == underscore
96
+ end
97
+ end
98
+
99
+ InflectorTestCases::CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
100
+ it "should underscore #{camel}" do
101
+ MotionSupport::Inflector.underscore(camel).should == underscore
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "camelize" do
107
+ InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
108
+ it "should camelize #{underscore}" do
109
+ MotionSupport::Inflector.camelize(underscore).should == camel
110
+ end
111
+ end
112
+
113
+ InflectorTestCases::CamelWithModuleToUnderscoreWithSlash.each do |camel, underscore|
114
+ it "should camelize #{underscore}" do
115
+ MotionSupport::Inflector.camelize(underscore).should == camel
116
+ end
117
+ end
118
+
119
+ it "should downcase first letter if called with lower" do
120
+ MotionSupport::Inflector.camelize('Capital', false).should == 'capital'
121
+ end
122
+
123
+ it "should remove underscores" do
124
+ MotionSupport::Inflector.camelize('Camel_Case').should == "CamelCase"
125
+ end
126
+
127
+ InflectorTestCases::UnderscoreToLowerCamel.each do |underscored, lower_camel|
128
+ it "should lower-camelize #{underscored}" do
129
+ MotionSupport::Inflector.camelize(underscored, false).should == lower_camel
130
+ end
131
+ end
132
+
133
+ InflectorTestCases::SymbolToLowerCamel.each do |symbol, lower_camel|
134
+ it "should lower-camelize symbol :#{symbol}" do
135
+ MotionSupport::Inflector.camelize(symbol, false).should == lower_camel
136
+ end
137
+ end
138
+ end
139
+
140
+ describe "irregularities" do
141
+ InflectorTestCases::Irregularities.each do |irregularity|
142
+ singular, plural = *irregularity
143
+ MotionSupport::Inflector.inflections do |inflect|
144
+ it "should singularize #{plural} as #{singular}" do
145
+ inflect.irregular(singular, plural)
146
+ MotionSupport::Inflector.singularize(plural).should == singular
147
+ end
148
+
149
+ it "should pluralize #{singular} as #{plural}" do
150
+ inflect.irregular(singular, plural)
151
+ MotionSupport::Inflector.pluralize(singular).should == plural
152
+ end
153
+ end
154
+
155
+ MotionSupport::Inflector.inflections do |inflect|
156
+ it "should return same string when pluralizing irregular plural #{plural}" do
157
+ inflect.irregular(singular, plural)
158
+ MotionSupport::Inflector.pluralize(plural).should == plural
159
+ end
160
+ end
161
+
162
+ MotionSupport::Inflector.inflections do |inflect|
163
+ it "should return same string when singularizing irregular singular #{singular}" do
164
+ inflect.irregular(singular, plural)
165
+ MotionSupport::Inflector.singularize(singular).should == singular
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ it "should overwrite previous inflectors" do
172
+ MotionSupport::Inflector.singularize("series").should == "series"
173
+ MotionSupport::Inflector.inflections.singular "series", "serie"
174
+ MotionSupport::Inflector.singularize("series").should == "serie"
175
+ MotionSupport::Inflector.inflections.uncountable "series" # Return to normal
176
+ end
177
+
178
+ describe "acronym" do
179
+ before do
180
+ MotionSupport::Inflector.inflections do |inflect|
181
+ inflect.acronym("API")
182
+ inflect.acronym("HTML")
183
+ inflect.acronym("HTTP")
184
+ inflect.acronym("RESTful")
185
+ inflect.acronym("W3C")
186
+ inflect.acronym("PhD")
187
+ inflect.acronym("RoR")
188
+ inflect.acronym("SSL")
189
+ end
5
190
  end
6
191
 
7
- it 'pluralizes words that end in "s": pass' do
8
- Inflector.inflections.pluralize('pass').should == 'passes'
192
+ # camelize underscore humanize titleize
193
+ [
194
+ ["API", "api", "API", "API"],
195
+ ["APIController", "api_controller", "API controller", "API Controller"],
196
+ ["Nokogiri::HTML", "nokogiri/html", "Nokogiri/HTML", "Nokogiri/HTML"],
197
+ ["HTTPAPI", "http_api", "HTTP API", "HTTP API"],
198
+ ["HTTP::Get", "http/get", "HTTP/get", "HTTP/Get"],
199
+ ["SSLError", "ssl_error", "SSL error", "SSL Error"],
200
+ ["RESTful", "restful", "RESTful", "RESTful"],
201
+ ["RESTfulController", "restful_controller", "RESTful controller", "RESTful Controller"],
202
+ ["IHeartW3C", "i_heart_w3c", "I heart W3C", "I Heart W3C"],
203
+ ["PhDRequired", "phd_required", "PhD required", "PhD Required"],
204
+ ["IRoRU", "i_ror_u", "I RoR u", "I RoR U"],
205
+ ["RESTfulHTTPAPI", "restful_http_api", "RESTful HTTP API", "RESTful HTTP API"],
206
+ ["UIImage", "ui_image", "UI image", "UI Image"],
207
+
208
+ # misdirection
209
+ ["Capistrano", "capistrano", "Capistrano", "Capistrano"],
210
+ ["CapiController", "capi_controller", "Capi controller", "Capi Controller"],
211
+ ["HttpsApis", "https_apis", "Https apis", "Https Apis"],
212
+ ["Html5", "html5", "Html5", "Html5"],
213
+ ["Restfully", "restfully", "Restfully", "Restfully"],
214
+ ["RoRails", "ro_rails", "Ro rails", "Ro Rails"]
215
+ ].each do |camel, under, human, title|
216
+ it "should camelize #{under} as #{camel}" do
217
+ MotionSupport::Inflector.camelize(under).should == camel
218
+ end
219
+
220
+ it "should keep #{camel} camelized" do
221
+ MotionSupport::Inflector.camelize(camel).should == camel
222
+ end
223
+
224
+ it "should keep #{under} underscored" do
225
+ MotionSupport::Inflector.underscore(under).should == under
226
+ end
227
+
228
+ it "should underscore #{camel} as #{under}" do
229
+ MotionSupport::Inflector.underscore(camel).should == under
230
+ end
231
+
232
+ it "should titleize #{under} as #{title}" do
233
+ MotionSupport::Inflector.titleize(under).should == title
234
+ end
235
+
236
+ it "should titleize #{camel} as #{title}" do
237
+ MotionSupport::Inflector.titleize(camel).should == title
238
+ end
239
+
240
+ it "should humanize #{under} as #{human}" do
241
+ MotionSupport::Inflector.humanize(under).should == human
242
+ end
9
243
  end
10
244
 
11
- it "pluralizes words that end in 'us'" do
12
- Inflector.inflections.pluralize('alumnus').should == 'alumni'
245
+ describe "override acronyms" do
246
+ before do
247
+ MotionSupport::Inflector.inflections do |inflect|
248
+ inflect.acronym("API")
249
+ inflect.acronym("LegacyApi")
250
+ end
251
+ end
252
+
253
+ {
254
+ "legacyapi" => "LegacyApi",
255
+ "legacy_api" => "LegacyAPI",
256
+ "some_legacyapi" => "SomeLegacyApi",
257
+ "nonlegacyapi" => "Nonlegacyapi"
258
+ }.each do |from, to|
259
+ it "should camelize #{from} as #{to}" do
260
+ MotionSupport::Inflector.camelize(from).should == to
261
+ end
262
+ end
13
263
  end
14
264
 
15
- it "pluralizes words that end in 'ee'" do
16
- Inflector.inflections.pluralize('attendee').should == 'attendees'
265
+ describe "lower-camelize with acronym parts" do
266
+ before do
267
+ MotionSupport::Inflector.inflections do |inflect|
268
+ inflect.acronym("API")
269
+ inflect.acronym("HTML")
270
+ end
271
+ end
272
+
273
+ {
274
+ "html_api" => "htmlAPI",
275
+ "htmlAPI" => "htmlAPI",
276
+ "HTMLAPI" => "htmlAPI"
277
+ }.each do |from, to|
278
+ it "should lower-camelize #{from} as #{to}" do
279
+ MotionSupport::Inflector.camelize(from, false).should == to
280
+ end
281
+ end
17
282
  end
18
283
 
19
- it "pluralizes words that end in 'e'" do
20
- Inflector.inflections.pluralize('article').should == 'articles'
284
+ it "should underscore acronym sequence" do
285
+ MotionSupport::Inflector.inflections do |inflect|
286
+ inflect.acronym("API")
287
+ inflect.acronym("JSON")
288
+ inflect.acronym("HTML")
289
+ end
290
+
291
+ MotionSupport::Inflector.underscore("JSONHTMLAPI").should == "json_html_api"
292
+ end
293
+ end
294
+
295
+ describe "demodulize" do
296
+ {
297
+ "MyApplication::Billing::Account" => "Account",
298
+ "Account" => "Account",
299
+ "" => ""
300
+ }.each do |from, to|
301
+ it "should transform #{from} to #{to}" do
302
+ MotionSupport::Inflector.demodulize(from).should == to
303
+ end
21
304
  end
22
305
  end
23
306
 
24
- describe 'Singularization' do
25
- it 'singularizes a normal word: "dogs"' do
26
- Inflector.inflections.singularize('dogs').should == 'dog'
307
+ describe "deconstantize" do
308
+ {
309
+ "MyApplication::Billing::Account" => "MyApplication::Billing",
310
+ "::MyApplication::Billing::Account" => "::MyApplication::Billing",
311
+ "MyApplication::Billing" => "MyApplication",
312
+ "::MyApplication::Billing" => "::MyApplication",
313
+ "Account" => "",
314
+ "::Account" => "",
315
+ "" => ""
316
+ }.each do |from, to|
317
+ it "should deconstantize #{from} as #{to}" do
318
+ MotionSupport::Inflector.deconstantize(from).should == to
319
+ end
320
+ end
321
+ end
322
+
323
+ describe "foreign_key" do
324
+ InflectorTestCases::ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key|
325
+ it "should create foreign key for class name #{klass}" do
326
+ MotionSupport::Inflector.foreign_key(klass).should == foreign_key
327
+ end
27
328
  end
28
329
 
29
- it "singualarizes a word that ends in 's': passes" do
30
- Inflector.inflections.singularize('passes').should == 'pass'
330
+ InflectorTestCases::ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key|
331
+ it "should create foreign key for class name #{klass} without underscore" do
332
+ MotionSupport::Inflector.foreign_key(klass, false).should == foreign_key
333
+ end
31
334
  end
335
+ end
336
+
337
+ describe "tableize" do
338
+ InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
339
+ it "should create table name from class name #{class_name}" do
340
+ MotionSupport::Inflector.tableize(class_name).should == table_name
341
+ end
342
+ end
343
+ end
32
344
 
33
- it "singualarizes a word that ends in 'ee': assignees" do
34
- Inflector.inflections.singularize('assignees').should == 'assignee'
345
+ describe "classify" do
346
+ InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
347
+ it "should classify #{table_name}" do
348
+ MotionSupport::Inflector.classify(table_name).should == class_name
349
+ end
350
+
351
+ it "should classify #{table_name} with table prefix" do
352
+ MotionSupport::Inflector.classify("table_prefix." + table_name).should == class_name
353
+ end
35
354
  end
36
355
 
37
- it "singualarizes words that end in 'us'" do
38
- Inflector.inflections.singularize('alumni').should == 'alumnus'
356
+ it "should classify with symbol" do
357
+ lambda do
358
+ MotionSupport::Inflector.classify(:foo_bars).should == 'FooBar'
359
+ end.should.not.raise
39
360
  end
40
361
 
41
- it "singualarizes words that end in 'es'" do
42
- Inflector.inflections.singularize('articles').should == 'article'
362
+ it "should classify with leading schema name" do
363
+ MotionSupport::Inflector.classify('schema.foo_bar').should == 'FooBar'
43
364
  end
44
365
  end
366
+
367
+ describe "humanize" do
368
+ InflectorTestCases::UnderscoreToHuman.each do |underscore, human|
369
+ it "should humanize #{underscore}" do
370
+ MotionSupport::Inflector.humanize(underscore).should == human
371
+ end
372
+ end
45
373
 
46
- describe 'Irregular Patterns' do
47
- it "handles person to people singularizing" do
48
- Inflector.inflections.singularize('people').should == 'person'
374
+ it "should humanize by rule" do
375
+ MotionSupport::Inflector.inflections do |inflect|
376
+ inflect.human(/_cnt$/i, '\1_count')
377
+ inflect.human(/^prefx_/i, '\1')
378
+ end
379
+ MotionSupport::Inflector.humanize("jargon_cnt").should == "Jargon count"
380
+ MotionSupport::Inflector.humanize("prefx_request").should == "Request"
49
381
  end
50
382
 
51
- it "handles person to people pluralizing" do
52
- Inflector.inflections.pluralize('person').should == 'people'
383
+ it "should humanize by string" do
384
+ MotionSupport::Inflector.inflections do |inflect|
385
+ inflect.human("col_rpted_bugs", "Reported bugs")
386
+ end
387
+ MotionSupport::Inflector.humanize("col_rpted_bugs").should == "Reported bugs"
388
+ MotionSupport::Inflector.humanize("COL_rpted_bugs").should == "Col rpted bugs"
53
389
  end
54
390
  end
391
+
392
+ describe "constantize" do
393
+ extend ConstantizeTestCases
394
+
395
+ it "should constantize" do
396
+ run_constantize_tests_on do |string|
397
+ MotionSupport::Inflector.constantize(string)
398
+ end
399
+ end
400
+ end
401
+
402
+ describe "safe_constantize" do
403
+ extend ConstantizeTestCases
404
+
405
+ it "should safe_constantize" do
406
+ run_safe_constantize_tests_on do |string|
407
+ MotionSupport::Inflector.safe_constantize(string)
408
+ end
409
+ end
410
+ end
411
+
412
+ describe "ordinal" do
413
+ InflectorTestCases::OrdinalNumbers.each do |number, ordinalized|
414
+ it "should return ordinal of number #{number}" do
415
+ (number + MotionSupport::Inflector.ordinal(number)).should == ordinalized
416
+ end
417
+ end
418
+ end
419
+
420
+ describe "ordinalize" do
421
+ InflectorTestCases::OrdinalNumbers.each do |number, ordinalized|
422
+ it "should ordinalize number #{number}" do
423
+ MotionSupport::Inflector.ordinalize(number).should == ordinalized
424
+ end
425
+ end
426
+ end
427
+
428
+ describe "dasherize" do
429
+ InflectorTestCases::UnderscoresToDashes.each do |underscored, dasherized|
430
+ it "should dasherize #{underscored}" do
431
+ MotionSupport::Inflector.dasherize(underscored).should == dasherized
432
+ end
433
+ end
55
434
 
56
- describe 'Adding Rules to Inflector' do
57
- it 'accepts new rules' do
58
- Inflector.inflections.irregular /^foot$/, 'feet'
59
- Inflector.inflections.irregular /^feet$/, 'foot'
60
- Inflector.inflections.pluralize('foot').should == 'feet'
61
- Inflector.inflections.singularize('feet').should == 'foot'
435
+ InflectorTestCases::UnderscoresToDashes.each_key do |underscored|
436
+ it "should dasherize and then underscore #{underscored}, returning #{underscored}" do
437
+ MotionSupport::Inflector.underscore(MotionSupport::Inflector.dasherize(underscored)).should == underscored
438
+ end
62
439
  end
63
440
  end
64
- end
441
+
442
+ describe "clear" do
443
+ extend InflectorHelper
444
+
445
+ %w{plurals singulars uncountables humans acronyms}.each do |inflection_type|
446
+ it "should clear #{inflection_type}" do
447
+ with_dup do
448
+ MotionSupport::Inflector.inflections.clear inflection_type.to_sym
449
+ MotionSupport::Inflector.inflections.send(inflection_type).should.be.empty
450
+ end
451
+ end
452
+ end
65
453
 
454
+ it "should clear all" do
455
+ with_dup do
456
+ MotionSupport::Inflector.inflections do |inflect|
457
+ # ensure any data is present
458
+ inflect.plural(/(quiz)$/i, '\1zes')
459
+ inflect.singular(/(database)s$/i, '\1')
460
+ inflect.uncountable('series')
461
+ inflect.human("col_rpted_bugs", "Reported bugs")
462
+
463
+ inflect.clear :all
464
+
465
+ inflect.plurals.should.be.empty
466
+ inflect.singulars.should.be.empty
467
+ inflect.uncountables.should.be.empty
468
+ inflect.humans.should.be.empty
469
+ end
470
+ end
471
+ end
472
+
473
+ it "should clear with default" do
474
+ with_dup do
475
+ MotionSupport::Inflector.inflections do |inflect|
476
+ # ensure any data is present
477
+ inflect.plural(/(quiz)$/i, '\1zes')
478
+ inflect.singular(/(database)s$/i, '\1')
479
+ inflect.uncountable('series')
480
+ inflect.human("col_rpted_bugs", "Reported bugs")
481
+
482
+ inflect.clear
483
+
484
+ inflect.plurals.should.be.empty
485
+ inflect.singulars.should.be.empty
486
+ inflect.uncountables.should.be.empty
487
+ inflect.humans.should.be.empty
488
+ end
489
+ end
490
+ end
491
+
492
+ %w(plurals singulars uncountables humans acronyms).each do |scope|
493
+ MotionSupport::Inflector.inflections do |inflect|
494
+ it "should clear inflections with #{scope}" do
495
+ with_dup do
496
+ # clear the inflections
497
+ inflect.clear(scope)
498
+ inflect.send(scope).should == []
499
+ end
500
+ end
501
+ end
502
+ end
503
+ end
504
+ end
@@ -0,0 +1,29 @@
1
+ describe "NSDictionary" do
2
+ describe "to_hash" do
3
+ before do
4
+ dict = NSMutableDictionary.alloc.init
5
+ dict.setValue('bar', forKey:'foo')
6
+ @hash = dict.to_hash
7
+ end
8
+
9
+ it "should convert NSDictionary to Hash" do
10
+ @hash.class.should == Hash
11
+ end
12
+
13
+ it "should preserve all keys" do
14
+ @hash.keys.should == ['foo']
15
+ end
16
+
17
+ it "should preserve all values" do
18
+ @hash.values.should == ['bar']
19
+ end
20
+ end
21
+
22
+ describe "symbolize_keys" do
23
+ it "should work for NSDictionary instances" do
24
+ dict = NSMutableDictionary.alloc.init
25
+ dict.setValue('bar', forKey:'foo')
26
+ dict.symbolize_keys.should == { :foo => 'bar' }
27
+ end
28
+ end
29
+ end