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,313 @@
1
+ module InflectorTestCases
2
+ SingularToPlural = {
3
+ "search" => "searches",
4
+ "switch" => "switches",
5
+ "fix" => "fixes",
6
+ "box" => "boxes",
7
+ "process" => "processes",
8
+ "address" => "addresses",
9
+ "case" => "cases",
10
+ "stack" => "stacks",
11
+ "wish" => "wishes",
12
+ "fish" => "fish",
13
+ "jeans" => "jeans",
14
+ "funky jeans" => "funky jeans",
15
+ "my money" => "my money",
16
+
17
+ "category" => "categories",
18
+ "query" => "queries",
19
+ "ability" => "abilities",
20
+ "agency" => "agencies",
21
+ "movie" => "movies",
22
+
23
+ "archive" => "archives",
24
+
25
+ "index" => "indices",
26
+
27
+ "wife" => "wives",
28
+ "safe" => "saves",
29
+ "half" => "halves",
30
+
31
+ "move" => "moves",
32
+
33
+ "salesperson" => "salespeople",
34
+ "person" => "people",
35
+
36
+ "spokesman" => "spokesmen",
37
+ "man" => "men",
38
+ "woman" => "women",
39
+
40
+ "basis" => "bases",
41
+ "diagnosis" => "diagnoses",
42
+ "diagnosis_a" => "diagnosis_as",
43
+
44
+ "datum" => "data",
45
+ "medium" => "media",
46
+ "stadium" => "stadia",
47
+ "analysis" => "analyses",
48
+ "my_analysis" => "my_analyses",
49
+
50
+ "node_child" => "node_children",
51
+ "child" => "children",
52
+
53
+ "experience" => "experiences",
54
+ "day" => "days",
55
+
56
+ "comment" => "comments",
57
+ "foobar" => "foobars",
58
+ "newsletter" => "newsletters",
59
+
60
+ "old_news" => "old_news",
61
+ "news" => "news",
62
+
63
+ "series" => "series",
64
+ "species" => "species",
65
+
66
+ "quiz" => "quizzes",
67
+
68
+ "perspective" => "perspectives",
69
+
70
+ "ox" => "oxen",
71
+ "photo" => "photos",
72
+ "buffalo" => "buffaloes",
73
+ "tomato" => "tomatoes",
74
+ "dwarf" => "dwarves",
75
+ "elf" => "elves",
76
+ "information" => "information",
77
+ "equipment" => "equipment",
78
+ "bus" => "buses",
79
+ "status" => "statuses",
80
+ "status_code" => "status_codes",
81
+ "mouse" => "mice",
82
+
83
+ "louse" => "lice",
84
+ "house" => "houses",
85
+ "octopus" => "octopi",
86
+ "virus" => "viri",
87
+ "alias" => "aliases",
88
+ "portfolio" => "portfolios",
89
+
90
+ "vertex" => "vertices",
91
+ "matrix" => "matrices",
92
+ "matrix_fu" => "matrix_fus",
93
+
94
+ "axis" => "axes",
95
+ "taxi" => "taxis", # prevents regression
96
+ "testis" => "testes",
97
+ "crisis" => "crises",
98
+
99
+ "rice" => "rice",
100
+ "shoe" => "shoes",
101
+
102
+ "horse" => "horses",
103
+ "prize" => "prizes",
104
+ "edge" => "edges",
105
+
106
+ "cow" => "kine",
107
+ "database" => "databases",
108
+
109
+ # regression tests against improper inflection regexes
110
+ "|ice" => "|ices",
111
+ "|ouse" => "|ouses",
112
+ "slice" => "slices",
113
+ "police" => "police"
114
+ }
115
+
116
+ CamelToUnderscore = {
117
+ "Product" => "product",
118
+ "SpecialGuest" => "special_guest",
119
+ "ApplicationController" => "application_controller",
120
+ "Area51Controller" => "area51_controller"
121
+ }
122
+
123
+ UnderscoreToLowerCamel = {
124
+ "product" => "product",
125
+ "special_guest" => "specialGuest",
126
+ "application_controller" => "applicationController",
127
+ "area51_controller" => "area51Controller"
128
+ }
129
+
130
+ SymbolToLowerCamel = {
131
+ :product => 'product',
132
+ :special_guest => 'specialGuest',
133
+ :application_controller => 'applicationController',
134
+ :area51_controller => 'area51Controller'
135
+ }
136
+
137
+ CamelToUnderscoreWithoutReverse = {
138
+ "HTMLTidy" => "html_tidy",
139
+ "HTMLTidyGenerator" => "html_tidy_generator",
140
+ "FreeBSD" => "free_bsd",
141
+ "HTML" => "html",
142
+ }
143
+
144
+ CamelWithModuleToUnderscoreWithSlash = {
145
+ "Admin::Product" => "admin/product",
146
+ "Users::Commission::Department" => "users/commission/department",
147
+ "UsersSection::CommissionDepartment" => "users_section/commission_department",
148
+ }
149
+
150
+ ClassNameToForeignKeyWithUnderscore = {
151
+ "Person" => "person_id",
152
+ "MyApplication::Billing::Account" => "account_id"
153
+ }
154
+
155
+ ClassNameToForeignKeyWithoutUnderscore = {
156
+ "Person" => "personid",
157
+ "MyApplication::Billing::Account" => "accountid"
158
+ }
159
+
160
+ ClassNameToTableName = {
161
+ "PrimarySpokesman" => "primary_spokesmen",
162
+ "NodeChild" => "node_children"
163
+ }
164
+
165
+ StringToParameterized = {
166
+ "Donald E. Knuth" => "donald-e-knuth",
167
+ "Random text with *(bad)* characters" => "random-text-with-bad-characters",
168
+ "Allow_Under_Scores" => "allow_under_scores",
169
+ "Trailing bad characters!@#" => "trailing-bad-characters",
170
+ "!@#Leading bad characters" => "leading-bad-characters",
171
+ "Squeeze separators" => "squeeze-separators",
172
+ "Test with + sign" => "test-with-sign",
173
+ "Test with malformed utf8 \251" => "test-with-malformed-utf8"
174
+ }
175
+
176
+ StringToParameterizeWithNoSeparator = {
177
+ "Donald E. Knuth" => "donaldeknuth",
178
+ "With-some-dashes" => "with-some-dashes",
179
+ "Random text with *(bad)* characters" => "randomtextwithbadcharacters",
180
+ "Trailing bad characters!@#" => "trailingbadcharacters",
181
+ "!@#Leading bad characters" => "leadingbadcharacters",
182
+ "Squeeze separators" => "squeezeseparators",
183
+ "Test with + sign" => "testwithsign",
184
+ "Test with malformed utf8 \251" => "testwithmalformedutf8"
185
+ }
186
+
187
+ StringToParameterizeWithUnderscore = {
188
+ "Donald E. Knuth" => "donald_e_knuth",
189
+ "Random text with *(bad)* characters" => "random_text_with_bad_characters",
190
+ "With-some-dashes" => "with-some-dashes",
191
+ "Retain_underscore" => "retain_underscore",
192
+ "Trailing bad characters!@#" => "trailing_bad_characters",
193
+ "!@#Leading bad characters" => "leading_bad_characters",
194
+ "Squeeze separators" => "squeeze_separators",
195
+ "Test with + sign" => "test_with_sign",
196
+ "Test with malformed utf8 \251" => "test_with_malformed_utf8"
197
+ }
198
+
199
+ StringToParameterizedAndNormalized = {
200
+ "Malmö" => "malmo",
201
+ "Garçons" => "garcons",
202
+ "Ops\331" => "opsu",
203
+ "Ærøskøbing" => "aeroskobing",
204
+ "Aßlar" => "asslar",
205
+ "Japanese: 日本語" => "japanese"
206
+ }
207
+
208
+ UnderscoreToHuman = {
209
+ "employee_salary" => "Employee salary",
210
+ "employee_id" => "Employee",
211
+ "underground" => "Underground"
212
+ }
213
+
214
+ MixtureToTitleCase = {
215
+ 'active_record' => 'Active Record',
216
+ 'ActiveRecord' => 'Active Record',
217
+ 'action web service' => 'Action Web Service',
218
+ 'Action Web Service' => 'Action Web Service',
219
+ 'Action web service' => 'Action Web Service',
220
+ 'actionwebservice' => 'Actionwebservice',
221
+ 'Actionwebservice' => 'Actionwebservice',
222
+ "david's code" => "David's Code",
223
+ "David's code" => "David's Code",
224
+ "david's Code" => "David's Code",
225
+ "sgt. pepper's" => "Sgt. Pepper's",
226
+ "i've just seen a face" => "I've Just Seen A Face",
227
+ "maybe you'll be there" => "Maybe You'll Be There",
228
+ "¿por qué?" => '¿Por Qué?',
229
+ "Fred’s" => "Fred’s",
230
+ "Fred`s" => "Fred`s"
231
+ }
232
+
233
+ OrdinalNumbers = {
234
+ "-1" => "-1st",
235
+ "-2" => "-2nd",
236
+ "-3" => "-3rd",
237
+ "-4" => "-4th",
238
+ "-5" => "-5th",
239
+ "-6" => "-6th",
240
+ "-7" => "-7th",
241
+ "-8" => "-8th",
242
+ "-9" => "-9th",
243
+ "-10" => "-10th",
244
+ "-11" => "-11th",
245
+ "-12" => "-12th",
246
+ "-13" => "-13th",
247
+ "-14" => "-14th",
248
+ "-20" => "-20th",
249
+ "-21" => "-21st",
250
+ "-22" => "-22nd",
251
+ "-23" => "-23rd",
252
+ "-24" => "-24th",
253
+ "-100" => "-100th",
254
+ "-101" => "-101st",
255
+ "-102" => "-102nd",
256
+ "-103" => "-103rd",
257
+ "-104" => "-104th",
258
+ "-110" => "-110th",
259
+ "-111" => "-111th",
260
+ "-112" => "-112th",
261
+ "-113" => "-113th",
262
+ "-1000" => "-1000th",
263
+ "-1001" => "-1001st",
264
+ "0" => "0th",
265
+ "1" => "1st",
266
+ "2" => "2nd",
267
+ "3" => "3rd",
268
+ "4" => "4th",
269
+ "5" => "5th",
270
+ "6" => "6th",
271
+ "7" => "7th",
272
+ "8" => "8th",
273
+ "9" => "9th",
274
+ "10" => "10th",
275
+ "11" => "11th",
276
+ "12" => "12th",
277
+ "13" => "13th",
278
+ "14" => "14th",
279
+ "20" => "20th",
280
+ "21" => "21st",
281
+ "22" => "22nd",
282
+ "23" => "23rd",
283
+ "24" => "24th",
284
+ "100" => "100th",
285
+ "101" => "101st",
286
+ "102" => "102nd",
287
+ "103" => "103rd",
288
+ "104" => "104th",
289
+ "110" => "110th",
290
+ "111" => "111th",
291
+ "112" => "112th",
292
+ "113" => "113th",
293
+ "1000" => "1000th",
294
+ "1001" => "1001st"
295
+ }
296
+
297
+ UnderscoresToDashes = {
298
+ "street" => "street",
299
+ "street_address" => "street-address",
300
+ "person_street_address" => "person-street-address"
301
+ }
302
+
303
+ Irregularities = {
304
+ 'person' => 'people',
305
+ 'man' => 'men',
306
+ 'child' => 'children',
307
+ 'sex' => 'sexes',
308
+ 'move' => 'moves',
309
+ 'cow' => 'kine',
310
+ 'zombie' => 'zombies',
311
+ 'genus' => 'genera'
312
+ }
313
+ end
@@ -0,0 +1,29 @@
1
+ describe 'array access' do
2
+ describe "from" do
3
+ it "should return the tail of an array from position" do
4
+ ['a', 'b', 'c', 'd'].from(0).should == ["a", "b", "c", "d"]
5
+ ['a', 'b', 'c', 'd'].from(2).should == ["c", "d"]
6
+ ['a', 'b', 'c', 'd'].from(10).should == []
7
+ [].from(0).should == []
8
+ end
9
+ end
10
+
11
+ describe "to" do
12
+ it "should return the head of an array up to position" do
13
+ ['a', 'b', 'c', 'd'].to(0).should == ["a"]
14
+ ['a', 'b', 'c', 'd'].to(2).should == ["a", "b", "c"]
15
+ ['a', 'b', 'c', 'd'].to(10).should == ["a", "b", "c", "d"]
16
+ [].to(0).should == []
17
+ end
18
+ end
19
+
20
+ describe "second" do
21
+ it "should return the second element in an array" do
22
+ ['a', 'b', 'c', 'd'].second.should == 'b'
23
+ end
24
+
25
+ it "should return nil if there is no second element" do
26
+ [].second.should == nil
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,60 @@
1
+ describe 'array' do
2
+ describe "to_sentence" do
3
+ it "should convert plain array" do
4
+ [].to_sentence.should == ""
5
+ ['one'].to_sentence.should == "one"
6
+ ['one', 'two'].to_sentence.should == "one and two"
7
+ ['one', 'two', 'three'].to_sentence.should == "one, two, and three"
8
+ end
9
+
10
+ it "should convert sentence with words connector" do
11
+ ['one', 'two', 'three'].to_sentence(:words_connector => ' ').should == "one two, and three"
12
+ ['one', 'two', 'three'].to_sentence(:words_connector => ' & ').should == "one & two, and three"
13
+ ['one', 'two', 'three'].to_sentence(:words_connector => nil).should == "onetwo, and three"
14
+ end
15
+
16
+ it "should convert sentence with last word connector" do
17
+ ['one', 'two', 'three'].to_sentence(:last_word_connector => ', and also ').should == "one, two, and also three"
18
+ ['one', 'two', 'three'].to_sentence(:last_word_connector => nil).should == "one, twothree"
19
+ ['one', 'two', 'three'].to_sentence(:last_word_connector => ' ').should == "one, two three"
20
+ ['one', 'two', 'three'].to_sentence(:last_word_connector => ' and ').should == "one, two and three"
21
+ end
22
+
23
+ it "should convert two-element array" do
24
+ ['one', 'two'].to_sentence.should == "one and two"
25
+ ['one', 'two'].to_sentence(:two_words_connector => ' ').should == "one two"
26
+ end
27
+
28
+ it "should convert one-element array" do
29
+ ['one'].to_sentence.should == "one"
30
+ end
31
+
32
+ it "should create new object" do
33
+ elements = ["one"]
34
+ elements.to_sentence.object_id.should.not == elements[0].object_id
35
+ end
36
+
37
+ it "should convert non-string element" do
38
+ [1].to_sentence.should == '1'
39
+ end
40
+
41
+ it "should not modify given hash" do
42
+ options = { words_connector: ' ' }
43
+ ['one', 'two', 'three'].to_sentence(options).should == "one two, and three"
44
+ options.should == { words_connector: ' ' }
45
+ end
46
+ end
47
+
48
+ describe "to_s" do
49
+ it "should convert to database format" do
50
+ collection = [
51
+ Class.new { def id() 1 end }.new,
52
+ Class.new { def id() 2 end }.new,
53
+ Class.new { def id() 3 end }.new
54
+ ]
55
+
56
+ [].to_s(:db).should == "null"
57
+ collection.to_s(:db).should == "1,2,3"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,15 @@
1
+ describe 'array options' do
2
+ describe "extract_options!" do
3
+ it "should extract an options hash from an array" do
4
+ [1, 2, :a => :b].extract_options!.should == { :a => :b }
5
+ end
6
+
7
+ it "should return an empty hash if the last element is not a hash" do
8
+ [1, 2].extract_options!.should == {}
9
+ end
10
+
11
+ it "should return an empty hash on an empty array" do
12
+ [].extract_options!.should == {}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,85 @@
1
+ describe 'array grouping' do
2
+ describe "in_groups_of" do
3
+ it "should group array and fill rest with nil" do
4
+ %w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3).should == [
5
+ ["1", "2", "3"],
6
+ ["4", "5", "6"],
7
+ ["7", "8", "9"],
8
+ ["10", nil, nil]
9
+ ]
10
+ end
11
+
12
+ it "should group array and fill with specified filler" do
13
+ %w(1 2 3 4 5).in_groups_of(2, 'empty').should == [
14
+ ["1", "2"],
15
+ ["3", "4"],
16
+ ["5", "empty"]
17
+ ]
18
+ end
19
+
20
+ it "should not fill the last group if turned off" do
21
+ %w(1 2 3 4 5).in_groups_of(2, false).should == [
22
+ ["1", "2"],
23
+ ["3", "4"],
24
+ ["5"]
25
+ ]
26
+ end
27
+
28
+ it "should yield each slice to a block if given" do
29
+ result = []
30
+ %w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3) { |group| result << ['foo'] + group + ['bar'] }
31
+ result.should == [
32
+ ["foo", "1", "2", "3", "bar"],
33
+ ["foo", "4", "5", "6", "bar"],
34
+ ["foo", "7", "8", "9", "bar"],
35
+ ["foo", "10", nil, nil, "bar"]
36
+ ]
37
+ end
38
+ end
39
+
40
+ describe "in_groups" do
41
+ it "should group array and fill the rest with nil" do
42
+ %w(1 2 3 4 5 6 7 8 9 10).in_groups(3).should == [
43
+ ["1", "2", "3", "4"],
44
+ ["5", "6", "7", nil],
45
+ ["8", "9", "10", nil]
46
+ ]
47
+ end
48
+
49
+ it "should group array and fill the result with specified filler" do
50
+ %w(1 2 3 4 5 6 7 8 9 10).in_groups(3, 'empty').should == [
51
+ ["1", "2", "3", "4"],
52
+ ["5", "6", "7", "empty"],
53
+ ["8", "9", "10", "empty"]
54
+ ]
55
+ end
56
+
57
+ it "should not fill the last group if turned off" do
58
+ %w(1 2 3 4 5 6 7).in_groups(3, false).should == [
59
+ ["1", "2", "3"],
60
+ ["4", "5"],
61
+ ["6", "7"]
62
+ ]
63
+ end
64
+
65
+ it "should yield each slice to a block if given" do
66
+ result = []
67
+ %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) { |group| result << ['foo'] + group + ['bar'] }
68
+ result.should == [
69
+ ["foo", "1", "2", "3", "4", "bar"],
70
+ ["foo", "5", "6", "7", nil, "bar"],
71
+ ["foo", "8", "9", "10", nil, "bar"]
72
+ ]
73
+ end
74
+ end
75
+
76
+ describe "split" do
77
+ it "should split array based on delimiting value" do
78
+ [1, 2, 3, 4, 5].split(3).should == [[1, 2], [4, 5]]
79
+ end
80
+
81
+ it "should split array based on block result" do
82
+ (1..10).to_a.split { |i| i % 3 == 0 }.should == [[1, 2], [4, 5], [7, 8], [10]]
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,25 @@
1
+ describe 'array' do
2
+ describe "prepend" do
3
+ it "should add an element to the front of the array" do
4
+ [1, 2, 3].prepend(0).should == [0, 1, 2, 3]
5
+ end
6
+
7
+ it "should change the array" do
8
+ array = [1, 2, 3]
9
+ array.prepend(0)
10
+ array.should == [0, 1, 2, 3]
11
+ end
12
+ end
13
+
14
+ describe "append" do
15
+ it "should add an element to the back of the array" do
16
+ [1, 2, 3].append(4).should == [1, 2, 3, 4]
17
+ end
18
+
19
+ it "should change the array" do
20
+ array = [1, 2, 3]
21
+ array.append(4)
22
+ array.should == [1, 2, 3, 4]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ describe 'array' do
2
+ describe "wrap" do
3
+ it "should return empty array for nil" do
4
+ Array.wrap(nil).should == []
5
+ end
6
+
7
+ it "should return unchanged array for array" do
8
+ Array.wrap([1, 2, 3]).should == [1, 2, 3]
9
+ end
10
+
11
+ it "should not flatten multidimensional array" do
12
+ Array.wrap([[1], [2], [3]]).should == [[1], [2], [3]]
13
+ end
14
+
15
+ it "should turn simple object into array" do
16
+ Array.wrap(0).should == [0]
17
+ end
18
+ end
19
+ end
@@ -1,9 +1,4 @@
1
1
  describe 'array' do
2
- it 'determines when an array is empty' do
3
- [1, 2, 3].should.not.be.empty
4
- [].should.be.empty
5
- end
6
-
7
2
  it 'finds hash values' do
8
3
  array_of_hashes = [
9
4
  {
@@ -0,0 +1,127 @@
1
+ class CAttrAccessorBase
2
+ cattr_accessor :empty_accessor
3
+ cattr_accessor :base_accessor, :derived_accessor
4
+ end
5
+
6
+ class CAttrAccessorDerived < CAttrAccessorBase
7
+ end
8
+
9
+ describe "class" do
10
+ describe "attribute accessors" do
11
+ before do
12
+ @class = Class.new
13
+ @class.instance_eval do
14
+ cattr_accessor :foo
15
+ cattr_accessor :bar, :instance_writer => false
16
+ cattr_reader :shaq, :instance_reader => false
17
+ cattr_accessor :camp, :instance_accessor => false
18
+ end
19
+ @object = @class.new
20
+ end
21
+
22
+ describe "reader" do
23
+ it "should return nil by default" do
24
+ @class.foo.should.be.nil
25
+ end
26
+ end
27
+
28
+ describe "writer" do
29
+ it "should set value" do
30
+ @class.foo = :test
31
+ @class.foo.should == :test
32
+ end
33
+
34
+ it "should set value through instance writer" do
35
+ @object.foo = :bar
36
+ @object.foo.should == :bar
37
+ end
38
+
39
+ it "should set instance reader's value through module's writer" do
40
+ @class.foo = :test
41
+ @object.foo.should == :test
42
+ end
43
+
44
+ it "should set module reader's value through instances's writer" do
45
+ @object.foo = :bar
46
+ @class.foo.should == :bar
47
+ end
48
+ end
49
+
50
+ describe "instance_writer => false" do
51
+ it "should not create instance writer" do
52
+ @class.should.respond_to :foo
53
+ @class.should.respond_to :foo=
54
+ @object.should.respond_to :bar
55
+ @object.should.not.respond_to :bar=
56
+ end
57
+ end
58
+
59
+ describe "instance_reader => false" do
60
+ it "should not create instance reader" do
61
+ @class.should.respond_to :shaq
62
+ @object.should.not.respond_to :shaq
63
+ end
64
+ end
65
+
66
+ describe "instance_accessor => false" do
67
+ it "should not create reader or writer" do
68
+ @class.should.respond_to :camp
69
+ @object.should.not.respond_to :camp
70
+ @object.should.not.respond_to :camp=
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "invalid attribute accessors" do
76
+ it "should raise NameError when creating an invalid reader" do
77
+ lambda do
78
+ Class.new do
79
+ cattr_reader "invalid attribute name"
80
+ end
81
+ end.should.raise NameError
82
+ end
83
+
84
+ it "should raise NameError when creating an invalid writer" do
85
+ lambda do
86
+ Class.new do
87
+ cattr_writer "invalid attribute name"
88
+ end
89
+ end.should.raise NameError
90
+ end
91
+ end
92
+
93
+ describe "inheritance" do
94
+ it "should be accessible in the base class and the derived class" do
95
+ CAttrAccessorBase.respond_to?(:empty_accessor).should == true
96
+ CAttrAccessorDerived.respond_to?(:empty_accessor).should == true
97
+ end
98
+
99
+ it "should return nil for an unset accessor in the base class" do
100
+ CAttrAccessorBase.empty_accessor.should == nil
101
+ end
102
+
103
+ it "should return nil for an unset accessor in the derived class" do
104
+ CAttrAccessorDerived.empty_accessor.should == nil
105
+ end
106
+
107
+ it "should return a value for an accessor set in the base class in the base class" do
108
+ CAttrAccessorBase.base_accessor = 10
109
+ CAttrAccessorBase.base_accessor.should == 10
110
+ end
111
+
112
+ it "should return a value for an accessor set in the base class in the derived class" do
113
+ CAttrAccessorBase.base_accessor = 10
114
+ CAttrAccessorDerived.base_accessor.should == 10
115
+ end
116
+
117
+ it "should return a value for the base class if set for the derived class" do
118
+ CAttrAccessorDerived.derived_accessor = 20
119
+ CAttrAccessorBase.derived_accessor.should == 20
120
+ end
121
+
122
+ it "should return a value for an accessor set in the derived class in the derived class" do
123
+ CAttrAccessorDerived.derived_accessor = 20
124
+ CAttrAccessorDerived.derived_accessor.should == 20
125
+ end
126
+ end
127
+ end