motion-support 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +1 -1
  3. data/README.md +231 -2
  4. data/Rakefile +3 -3
  5. data/app/app_delegate.rb +0 -2
  6. data/examples/Inflector/.gitignore +16 -0
  7. data/examples/Inflector/Gemfile +5 -0
  8. data/examples/Inflector/Rakefile +13 -0
  9. data/examples/Inflector/app/app_delegate.rb +8 -0
  10. data/examples/Inflector/app/inflections.rb +5 -0
  11. data/examples/Inflector/app/inflector_view_controller.rb +120 -0
  12. data/examples/Inflector/app/words_view_controller.rb +101 -0
  13. data/examples/Inflector/resources/Default-568h@2x.png +0 -0
  14. data/examples/Inflector/spec/main_spec.rb +9 -0
  15. data/lib/motion-support/core_ext/array.rb +13 -0
  16. data/lib/motion-support/core_ext/class.rb +8 -0
  17. data/lib/motion-support/core_ext/hash.rb +16 -0
  18. data/lib/motion-support/core_ext/integer.rb +9 -0
  19. data/lib/motion-support/core_ext/module.rb +14 -0
  20. data/lib/motion-support/core_ext/numeric.rb +8 -0
  21. data/lib/motion-support/core_ext/object.rb +14 -0
  22. data/lib/motion-support/core_ext/range.rb +8 -0
  23. data/lib/motion-support/core_ext/string.rb +14 -0
  24. data/lib/motion-support/core_ext/time.rb +19 -0
  25. data/lib/motion-support/core_ext.rb +3 -0
  26. data/lib/motion-support/inflector.rb +12 -156
  27. data/lib/motion-support.rb +5 -5
  28. data/motion/_stdlib/cgi.rb +22 -0
  29. data/motion/_stdlib/date.rb +77 -0
  30. data/motion/_stdlib/time.rb +19 -0
  31. data/motion/core_ext/array/access.rb +28 -0
  32. data/motion/core_ext/array/conversions.rb +86 -0
  33. data/motion/core_ext/array/extract_options.rb +11 -0
  34. data/motion/core_ext/array/grouping.rb +99 -0
  35. data/motion/core_ext/array/prepend_and_append.rb +7 -0
  36. data/motion/core_ext/array/wrap.rb +45 -0
  37. data/{lib/motion-support → motion/core_ext}/array.rb +0 -4
  38. data/motion/core_ext/class/attribute.rb +119 -0
  39. data/motion/core_ext/class/attribute_accessors.rb +168 -0
  40. data/motion/core_ext/date/acts_like.rb +8 -0
  41. data/motion/core_ext/date/calculations.rb +117 -0
  42. data/motion/core_ext/date/conversions.rb +56 -0
  43. data/motion/core_ext/date_and_time/calculations.rb +232 -0
  44. data/motion/core_ext/enumerable.rb +90 -0
  45. data/motion/core_ext/hash/deep_merge.rb +27 -0
  46. data/motion/core_ext/hash/except.rb +15 -0
  47. data/motion/core_ext/hash/indifferent_access.rb +19 -0
  48. data/motion/core_ext/hash/keys.rb +138 -0
  49. data/motion/core_ext/hash/reverse_merge.rb +22 -0
  50. data/motion/core_ext/hash/slice.rb +40 -0
  51. data/motion/core_ext/integer/inflections.rb +27 -0
  52. data/motion/core_ext/integer/multiple.rb +10 -0
  53. data/motion/core_ext/integer/time.rb +41 -0
  54. data/{lib/motion-support → motion/core_ext}/metaclass.rb +0 -0
  55. data/motion/core_ext/module/aliasing.rb +69 -0
  56. data/motion/core_ext/module/anonymous.rb +19 -0
  57. data/motion/core_ext/module/attr_internal.rb +38 -0
  58. data/motion/core_ext/module/attribute_accessors.rb +64 -0
  59. data/motion/core_ext/module/delegation.rb +175 -0
  60. data/motion/core_ext/module/introspection.rb +60 -0
  61. data/motion/core_ext/module/reachable.rb +5 -0
  62. data/motion/core_ext/module/remove_method.rb +12 -0
  63. data/motion/core_ext/ns_dictionary.rb +11 -0
  64. data/motion/core_ext/numeric/bytes.rb +44 -0
  65. data/motion/core_ext/numeric/conversions.rb +7 -0
  66. data/motion/core_ext/numeric/time.rb +75 -0
  67. data/motion/core_ext/object/acts_like.rb +10 -0
  68. data/motion/core_ext/object/blank.rb +105 -0
  69. data/motion/core_ext/object/deep_dup.rb +44 -0
  70. data/motion/core_ext/object/duplicable.rb +83 -0
  71. data/motion/core_ext/object/instance_variables.rb +28 -0
  72. data/motion/core_ext/object/to_param.rb +58 -0
  73. data/motion/core_ext/object/to_query.rb +26 -0
  74. data/motion/core_ext/object/try.rb +78 -0
  75. data/motion/core_ext/range/include_range.rb +23 -0
  76. data/motion/core_ext/range/overlaps.rb +8 -0
  77. data/motion/core_ext/regexp.rb +5 -0
  78. data/motion/core_ext/string/access.rb +104 -0
  79. data/motion/core_ext/string/behavior.rb +6 -0
  80. data/motion/core_ext/string/exclude.rb +11 -0
  81. data/motion/core_ext/string/filters.rb +55 -0
  82. data/motion/core_ext/string/indent.rb +43 -0
  83. data/motion/core_ext/string/inflections.rb +195 -0
  84. data/motion/core_ext/string/starts_ends_with.rb +4 -0
  85. data/motion/core_ext/string/strip.rb +24 -0
  86. data/motion/core_ext/time/acts_like.rb +8 -0
  87. data/motion/core_ext/time/calculations.rb +215 -0
  88. data/motion/core_ext/time/conversions.rb +52 -0
  89. data/motion/duration.rb +104 -0
  90. data/motion/hash_with_indifferent_access.rb +251 -0
  91. data/motion/inflections.rb +67 -0
  92. data/motion/inflector/inflections.rb +203 -0
  93. data/motion/inflector/methods.rb +321 -0
  94. data/{lib/motion-support → motion}/logger.rb +0 -0
  95. data/{lib/motion-support → motion}/version.rb +1 -1
  96. data/motion-support.gemspec +2 -2
  97. data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
  98. data/spec/motion-support/_helpers/inflector_test_cases.rb +313 -0
  99. data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
  100. data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
  101. data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
  102. data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
  103. data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
  104. data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
  105. data/spec/motion-support/{array_spec.rb → core_ext/array_spec.rb} +0 -5
  106. data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
  107. data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
  108. data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
  109. data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
  110. data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
  111. data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
  112. data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
  113. data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
  114. data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
  115. data/spec/motion-support/core_ext/hash/key_spec.rb +230 -0
  116. data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
  117. data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
  118. data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
  119. data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
  120. data/spec/motion-support/{metaclass_spec.rb → core_ext/metaclass_spec.rb} +0 -0
  121. data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
  122. data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
  123. data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
  124. data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
  125. data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
  126. data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
  127. data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
  128. data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
  129. data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
  130. data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
  131. data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
  132. data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
  133. data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
  134. data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
  135. data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
  136. data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
  137. data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
  138. data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
  139. data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
  140. data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
  141. data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
  142. data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
  143. data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
  144. data/spec/motion-support/core_ext/string/filter_spec.rb +48 -0
  145. data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
  146. data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
  147. data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
  148. data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
  149. data/spec/motion-support/core_ext/string_spec.rb +88 -0
  150. data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
  151. data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
  152. data/spec/motion-support/core_ext/time/conversion_spec.rb +54 -0
  153. data/spec/motion-support/duration_spec.rb +107 -0
  154. data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
  155. data/spec/motion-support/inflector_spec.rb +474 -35
  156. data/spec/motion-support/ns_dictionary_spec.rb +29 -0
  157. metadata +212 -35
  158. data/lib/motion-support/cattr_accessor.rb +0 -19
  159. data/lib/motion-support/class_inheritable_accessor.rb +0 -23
  160. data/lib/motion-support/class_inheritable_array.rb +0 -29
  161. data/lib/motion-support/hash.rb +0 -31
  162. data/lib/motion-support/nilclass.rb +0 -5
  163. data/lib/motion-support/object.rb +0 -17
  164. data/lib/motion-support/string.rb +0 -71
  165. data/spec/motion-support/cattr_accessor_spec.rb +0 -49
  166. data/spec/motion-support/class_inheritable_accessor_spec.rb +0 -49
  167. data/spec/motion-support/class_inheritable_array_spec.rb +0 -61
  168. data/spec/motion-support/hash_spec.rb +0 -31
  169. data/spec/motion-support/nilclass_spec.rb +0 -5
  170. data/spec/motion-support/object_spec.rb +0 -43
  171. data/spec/motion-support/string_spec.rb +0 -145
@@ -0,0 +1,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