merb-core 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. data/LICENSE +1 -1
  2. data/README +3 -3
  3. data/Rakefile +144 -33
  4. data/bin/merb +0 -0
  5. data/bin/merb-specs +0 -0
  6. data/docs/bootloading.dox +1 -0
  7. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  8. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  9. data/docs/merb-core-call-stack-diagram.png +0 -0
  10. data/lib/merb-core.rb +159 -37
  11. data/lib/merb-core/autoload.rb +1 -0
  12. data/lib/merb-core/bootloader.rb +208 -92
  13. data/lib/merb-core/config.rb +20 -6
  14. data/lib/merb-core/controller/abstract_controller.rb +113 -61
  15. data/lib/merb-core/controller/exceptions.rb +28 -13
  16. data/lib/merb-core/controller/merb_controller.rb +73 -44
  17. data/lib/merb-core/controller/mime.rb +25 -7
  18. data/lib/merb-core/controller/mixins/authentication.rb +1 -1
  19. data/lib/merb-core/controller/mixins/controller.rb +44 -8
  20. data/lib/merb-core/controller/mixins/render.rb +191 -128
  21. data/lib/merb-core/controller/mixins/responder.rb +65 -63
  22. data/lib/merb-core/controller/template.rb +103 -54
  23. data/lib/merb-core/core_ext.rb +7 -12
  24. data/lib/merb-core/core_ext/kernel.rb +128 -136
  25. data/lib/merb-core/dispatch/cookies.rb +26 -4
  26. data/lib/merb-core/dispatch/default_exception/default_exception.rb +93 -0
  27. data/lib/merb-core/dispatch/default_exception/views/_css.html.erb +198 -0
  28. data/lib/merb-core/dispatch/default_exception/views/_javascript.html.erb +73 -0
  29. data/lib/merb-core/dispatch/default_exception/views/index.html.erb +92 -0
  30. data/lib/merb-core/dispatch/dispatcher.rb +156 -224
  31. data/lib/merb-core/dispatch/request.rb +126 -25
  32. data/lib/merb-core/dispatch/router.rb +61 -6
  33. data/lib/merb-core/dispatch/router/behavior.rb +122 -41
  34. data/lib/merb-core/dispatch/router/route.rb +147 -22
  35. data/lib/merb-core/dispatch/session.rb +52 -2
  36. data/lib/merb-core/dispatch/session/cookie.rb +4 -2
  37. data/lib/merb-core/dispatch/session/memcached.rb +38 -27
  38. data/lib/merb-core/dispatch/session/memory.rb +18 -11
  39. data/lib/merb-core/dispatch/worker.rb +28 -0
  40. data/lib/merb-core/gem_ext/erubis.rb +58 -0
  41. data/lib/merb-core/logger.rb +3 -31
  42. data/lib/merb-core/plugins.rb +25 -3
  43. data/lib/merb-core/rack.rb +18 -12
  44. data/lib/merb-core/rack/adapter.rb +10 -8
  45. data/lib/merb-core/rack/adapter/ebb.rb +2 -2
  46. data/lib/merb-core/rack/adapter/irb.rb +31 -21
  47. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +26 -0
  48. data/lib/merb-core/rack/adapter/thin.rb +19 -9
  49. data/lib/merb-core/rack/adapter/thin_turbo.rb +24 -0
  50. data/lib/merb-core/rack/application.rb +9 -84
  51. data/lib/merb-core/rack/middleware.rb +26 -0
  52. data/lib/merb-core/rack/middleware/path_prefix.rb +31 -0
  53. data/lib/merb-core/rack/middleware/profiler.rb +19 -0
  54. data/lib/merb-core/rack/middleware/static.rb +45 -0
  55. data/lib/merb-core/server.rb +27 -9
  56. data/lib/merb-core/tasks/audit.rake +68 -0
  57. data/lib/merb-core/tasks/merb.rb +1 -0
  58. data/lib/merb-core/tasks/merb_rake_helper.rb +12 -0
  59. data/lib/merb-core/tasks/stats.rake +71 -0
  60. data/lib/merb-core/test.rb +2 -1
  61. data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -3
  62. data/lib/merb-core/test/helpers/request_helper.rb +66 -24
  63. data/lib/merb-core/test/matchers/controller_matchers.rb +36 -4
  64. data/lib/merb-core/test/matchers/route_matchers.rb +12 -3
  65. data/lib/merb-core/test/matchers/view_matchers.rb +3 -3
  66. data/lib/merb-core/test/run_specs.rb +1 -0
  67. data/lib/merb-core/test/tasks/spectasks.rb +13 -5
  68. data/lib/merb-core/test/test_ext/string.rb +14 -0
  69. data/lib/merb-core/vendor/facets/dictionary.rb +3 -3
  70. data/lib/merb-core/vendor/facets/inflect.rb +82 -37
  71. data/lib/merb-core/version.rb +2 -2
  72. data/spec/private/config/config_spec.rb +39 -4
  73. data/spec/private/core_ext/kernel_spec.rb +3 -14
  74. data/spec/private/dispatch/bootloader_spec.rb +1 -1
  75. data/spec/private/dispatch/cookies_spec.rb +181 -69
  76. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +0 -2
  77. data/spec/private/dispatch/fixture/app/controllers/foo.rb +0 -2
  78. data/spec/private/dispatch/fixture/config/rack.rb +10 -0
  79. data/spec/private/dispatch/fixture/log/merb_test.log +7054 -1802
  80. data/spec/private/dispatch/route_params_spec.rb +2 -3
  81. data/spec/private/dispatch/session_mixin_spec.rb +47 -0
  82. data/spec/private/plugins/plugin_spec.rb +73 -59
  83. data/spec/private/router/behavior_spec.rb +60 -0
  84. data/spec/private/router/fixture/log/merb_test.log +1693 -0
  85. data/spec/private/router/route_spec.rb +414 -0
  86. data/spec/private/router/router_spec.rb +175 -0
  87. data/spec/private/vendor/facets/plural_spec.rb +564 -0
  88. data/spec/private/vendor/facets/singular_spec.rb +489 -0
  89. data/spec/public/abstract_controller/controllers/cousins.rb +41 -0
  90. data/spec/public/abstract_controller/controllers/helpers.rb +12 -2
  91. data/spec/public/abstract_controller/controllers/partial.rb +17 -2
  92. data/spec/public/abstract_controller/controllers/render.rb +16 -1
  93. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +1 -0
  94. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +1 -0
  95. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +1 -0
  96. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +1 -0
  97. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +1 -0
  98. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +1 -0
  99. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +1 -0
  100. data/spec/public/abstract_controller/filter_spec.rb +20 -1
  101. data/spec/public/abstract_controller/helper_spec.rb +10 -2
  102. data/spec/public/abstract_controller/partial_spec.rb +8 -0
  103. data/spec/public/abstract_controller/render_spec.rb +8 -0
  104. data/spec/public/abstract_controller/spec_helper.rb +7 -3
  105. data/spec/public/boot_loader/boot_loader_spec.rb +2 -2
  106. data/spec/public/controller/base_spec.rb +10 -2
  107. data/spec/public/controller/config/init.rb +6 -0
  108. data/spec/public/controller/controllers/authentication.rb +9 -11
  109. data/spec/public/controller/controllers/base.rb +2 -8
  110. data/spec/public/controller/controllers/cookies.rb +16 -0
  111. data/spec/public/controller/controllers/dispatcher.rb +35 -0
  112. data/spec/public/controller/controllers/display.rb +62 -14
  113. data/spec/public/controller/controllers/redirect.rb +36 -0
  114. data/spec/public/controller/controllers/responder.rb +37 -11
  115. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +1 -0
  116. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +1 -0
  117. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +1 -0
  118. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +1 -0
  119. data/spec/public/controller/cookies_spec.rb +23 -0
  120. data/spec/public/controller/dispatcher_spec.rb +411 -0
  121. data/spec/public/controller/display_spec.rb +43 -10
  122. data/spec/public/controller/redirect_spec.rb +33 -0
  123. data/spec/public/controller/responder_spec.rb +79 -11
  124. data/spec/public/controller/spec_helper.rb +3 -1
  125. data/spec/public/controller/url_spec.rb +10 -0
  126. data/spec/public/core/merb_core_spec.rb +11 -0
  127. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +2 -0
  128. data/spec/public/core_ext/kernel_spec.rb +9 -0
  129. data/spec/public/core_ext/spec_helper.rb +1 -0
  130. data/spec/public/directory_structure/directory/log/merb_test.log +3729 -272
  131. data/spec/public/directory_structure/directory_spec.rb +3 -4
  132. data/spec/public/logger/logger_spec.rb +4 -4
  133. data/spec/public/reloading/directory/log/merb_test.log +288066 -15
  134. data/spec/public/reloading/reload_spec.rb +49 -27
  135. data/spec/public/request/multipart_spec.rb +26 -0
  136. data/spec/public/request/request_spec.rb +21 -2
  137. data/spec/public/router/fixation_spec.rb +27 -0
  138. data/spec/public/router/fixture/log/merb_test.log +30050 -0
  139. data/spec/public/router/nested_matches_spec.rb +97 -0
  140. data/spec/public/router/resource_spec.rb +1 -9
  141. data/spec/public/router/resources_spec.rb +0 -20
  142. data/spec/public/router/spec_helper.rb +27 -9
  143. data/spec/public/router/special_spec.rb +21 -8
  144. data/spec/public/template/template_spec.rb +17 -5
  145. data/spec/public/test/controller_matchers_spec.rb +10 -0
  146. data/spec/public/test/request_helper_spec.rb +29 -0
  147. data/spec/public/test/route_helper_spec.rb +18 -1
  148. data/spec/public/test/route_matchers_spec.rb +28 -1
  149. data/spec/public/test/view_matchers_spec.rb +3 -3
  150. data/spec/spec_helper.rb +56 -12
  151. metadata +89 -47
  152. data/lib/merb-core/core_ext/class.rb +0 -299
  153. data/lib/merb-core/core_ext/hash.rb +0 -426
  154. data/lib/merb-core/core_ext/mash.rb +0 -154
  155. data/lib/merb-core/core_ext/object.rb +0 -147
  156. data/lib/merb-core/core_ext/object_space.rb +0 -14
  157. data/lib/merb-core/core_ext/rubygems.rb +0 -28
  158. data/lib/merb-core/core_ext/set.rb +0 -46
  159. data/lib/merb-core/core_ext/string.rb +0 -89
  160. data/lib/merb-core/core_ext/time.rb +0 -13
  161. data/lib/merb-core/dispatch/exceptions.html.erb +0 -297
  162. data/spec/private/core_ext/class_spec.rb +0 -22
  163. data/spec/private/core_ext/hash_spec.rb +0 -522
  164. data/spec/private/core_ext/object_spec.rb +0 -121
  165. data/spec/private/core_ext/set_spec.rb +0 -26
  166. data/spec/private/core_ext/string_spec.rb +0 -167
  167. data/spec/private/core_ext/time_spec.rb +0 -16
  168. data/spec/private/dispatch/dispatch_spec.rb +0 -26
  169. data/spec/private/dispatch/fixture/log/development.log +0 -1
  170. data/spec/private/dispatch/fixture/log/merb.4000.pid +0 -1
  171. data/spec/private/dispatch/fixture/log/production.log +0 -1
  172. data/spec/private/dispatch/fixture/merb.4000.pid +0 -1
  173. data/spec/private/rack/application_spec.rb +0 -43
  174. data/spec/public/controller/log/merb.4000.pid +0 -1
  175. data/spec/public/directory_structure/directory/log/merb.4000.pid +0 -1
  176. data/spec/public/directory_structure/directory/merb.4000.pid +0 -1
  177. data/spec/public/reloading/directory/log/merb.4000.pid +0 -1
  178. data/spec/public/reloading/directory/merb.4000.pid +0 -1
@@ -0,0 +1,564 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe Language::English::Inflect, "#singular" do
4
+ it "pluralizes equipment => equipment" do
5
+ "equipment".plural.should == "equipment"
6
+ end
7
+
8
+ it "pluralizes information => information" do
9
+ "information".plural.should == "information"
10
+ end
11
+
12
+ it "pluralizes money => money" do
13
+ "money".plural.should == "money"
14
+ end
15
+
16
+ it "pluralizes species => species" do
17
+ "species".plural.should == "species"
18
+ end
19
+
20
+ it "pluralizes series => series" do
21
+ "series".plural.should == "series"
22
+ end
23
+
24
+ it "pluralizes fish => fish" do
25
+ "fish".plural.should == "fish"
26
+ end
27
+
28
+ it "pluralizes sheep => sheep" do
29
+ "sheep".plural.should == "sheep"
30
+ end
31
+
32
+ it "pluralizes news => news" do
33
+ "news".plural.should == "news"
34
+ end
35
+
36
+ it "pluralizes rain => rain" do
37
+ "rain".plural.should == "rain"
38
+ end
39
+
40
+ it "pluralizes milk => milk" do
41
+ "milk".plural.should == "milk"
42
+ end
43
+
44
+ it "pluralizes moose => moose" do
45
+ "moose".plural.should == "moose"
46
+ end
47
+
48
+ it "pluralizes hovercraft => hovercraft" do
49
+ "hovercraft".plural.should == "hovercraft"
50
+ end
51
+
52
+ it "pluralizes cacti => cactus" do
53
+ "cactus".plural.should == "cacti"
54
+ end
55
+
56
+ it "pluralizes thesaurus => thesauri" do
57
+ "thesaurus".plural.should == "thesauri"
58
+ end
59
+
60
+ it "pluralizes matrix => matrices" do
61
+ "matrix".plural.should == "matrices"
62
+ end
63
+
64
+ it "pluralizes Swiss => Swiss" do
65
+ "Swiss".plural.should == "Swiss"
66
+ end
67
+
68
+ it "pluralizes life => lives" do
69
+ "life".plural.should == "lives"
70
+ end
71
+
72
+ it "pluralizes wife => wives" do
73
+ "wife".plural.should == "wives"
74
+ end
75
+
76
+ it "pluralizes goose => geese" do
77
+ "goose".plural.should == "geese"
78
+ end
79
+
80
+ it "pluralizes criterion => criteria" do
81
+ "criterion".plural.should == "criteria"
82
+ end
83
+
84
+ it "pluralizes alias => aliases" do
85
+ "alias".plural.should == "aliases"
86
+ end
87
+
88
+ it "pluralizes status => statuses" do
89
+ "status".plural.should == "statuses"
90
+ end
91
+
92
+ it "pluralizes axis => axes" do
93
+ "axis".plural.should == "axes"
94
+ end
95
+
96
+ it "pluralizes crisis => crises" do
97
+ "crisis".plural.should == "crises"
98
+ end
99
+
100
+ it "pluralizes testis => testes" do
101
+ "testis".plural.should == "testes"
102
+ end
103
+
104
+ it "pluralizes child => children" do
105
+ "child".plural.should == "children"
106
+ end
107
+
108
+ it "pluralizes person => people" do
109
+ "person".plural.should == "people"
110
+ end
111
+
112
+ it "pluralizes potato => potatoes" do
113
+ "potato".plural.should == "potatoes"
114
+ end
115
+
116
+ it "pluralizes tomato => tomatoes" do
117
+ "tomato".plural.should == "tomatoes"
118
+ end
119
+
120
+ it "pluralizes buffalo => buffaloes" do
121
+ "buffalo".plural.should == "buffaloes"
122
+ end
123
+
124
+ it "pluralizes torpedo => torpedoes" do
125
+ "torpedo".plural.should == "torpedoes"
126
+ end
127
+
128
+ it "pluralizes quiz => quizzes" do
129
+ "quiz".plural.should == "quizzes"
130
+ end
131
+
132
+ # used to be a bug exposed by this specs suite,
133
+ # this MUST pass or we've got regression
134
+ it "pluralizes vertex => vertices" do
135
+ "vertex".plural.should == "vertices"
136
+ end
137
+
138
+ it "pluralizes index => indices" do
139
+ "index".plural.should == "indices"
140
+ end
141
+
142
+ it "pluralizes ox => oxen" do
143
+ "ox".plural.should == "oxen"
144
+ end
145
+
146
+ it "pluralizes mouse => mice" do
147
+ "mouse".plural.should == "mice"
148
+ end
149
+
150
+ it "pluralizes louse => lice" do
151
+ "louse".plural.should == "lice"
152
+ end
153
+
154
+ it "pluralizes thesis => theses" do
155
+ "thesis".plural.should == "theses"
156
+ end
157
+
158
+ it "pluralizes thief => thieves" do
159
+ "thief".plural.should == "thieves"
160
+ end
161
+
162
+ it "pluralizes analysis => analyses" do
163
+ "analysis".plural.should == "analyses"
164
+ end
165
+
166
+ it "pluralizes octopus => octopi" do
167
+ "octopus".plural.should == "octopi"
168
+ end
169
+
170
+ it "pluralizes grass => grass" do
171
+ "grass".plural.should == "grass"
172
+ end
173
+
174
+ it "pluralizes phenomenon => phenomena" do
175
+ "phenomenon".plural.should == "phenomena"
176
+ end
177
+
178
+
179
+
180
+
181
+
182
+ # ==== bugs, typos and reported issues
183
+
184
+
185
+
186
+
187
+
188
+ # ==== rules and most common cases
189
+
190
+ it "pluralizes forum => forums" do
191
+ "forum".plural.should == "forums"
192
+ end
193
+
194
+ it "pluralizes hive => hives" do
195
+ "hive".plural.should == "hives"
196
+ end
197
+
198
+ it "pluralizes athlete => athletes" do
199
+ "athlete".plural.should == "athletes"
200
+ end
201
+
202
+ it "pluralizes dwarf => dwarves" do
203
+ "dwarf".plural.should == "dwarves"
204
+ end
205
+
206
+ it "pluralizes hero => heroes" do
207
+ "hero".plural.should == "heroes"
208
+ end
209
+
210
+ it "pluralizes zero => zeroes" do
211
+ "zero".plural.should == "zeroes"
212
+ end
213
+
214
+ it "pluralizes man => men" do
215
+ "man".plural.should == "men"
216
+ end
217
+
218
+ it "pluralizes woman => women" do
219
+ "woman".plural.should == "women"
220
+ end
221
+
222
+ it "pluralizes sportsman => sportsmen" do
223
+ "sportsman".plural.should == "sportsmen"
224
+ end
225
+
226
+ it "pluralizes branch => branches" do
227
+ "branch".plural.should == "branches"
228
+ end
229
+
230
+ it "pluralizes crunch => crunches" do
231
+ "crunch".plural.should == "crunches"
232
+ end
233
+
234
+ it "pluralizes trash => trashes" do
235
+ "trash".plural.should == "trashes"
236
+ end
237
+
238
+ it "pluralizes mash => mashes" do
239
+ "mash".plural.should == "mashes"
240
+ end
241
+
242
+ it "pluralizes cross => crosses" do
243
+ "cross".plural.should == "crosses"
244
+ end
245
+
246
+ it "pluralizes erratum => errata" do
247
+ "erratum".plural.should == "errata"
248
+ end
249
+
250
+ # FIXME: add -ia => -ium cases
251
+
252
+ # FIXME: add -ra => -rum cases
253
+
254
+ it "pluralizes ray => rays" do
255
+ "ray".plural.should == "rays"
256
+ end
257
+
258
+ it "pluralizes spray => sprays" do
259
+ "spray".plural.should == "sprays"
260
+ end
261
+
262
+ # Merriam-Webster dictionary says
263
+ # preys is correct, too.
264
+ it "pluralizes prey => preys" do
265
+ "prey".plural.should == "preys"
266
+ end
267
+
268
+ it "pluralizes toy => toys" do
269
+ "toy".plural.should == "toys"
270
+ end
271
+
272
+ it "pluralizes joy => joys" do
273
+ "joy".plural.should == "joys"
274
+ end
275
+
276
+ it "pluralizes buy => buys" do
277
+ "buy".plural.should == "buys"
278
+ end
279
+
280
+ it "pluralizes guy => guys" do
281
+ "guy".plural.should == "guys"
282
+ end
283
+
284
+ it "pluralizes cry => cries" do
285
+ "cry".plural.should == "cries"
286
+ end
287
+
288
+ it "pluralizes fly => flies" do
289
+ "fly".plural.should == "flies"
290
+ end
291
+
292
+ it "pluralizes fox => foxes" do
293
+ "fox".plural.should == "foxes"
294
+ end
295
+
296
+ it "pluralizes elf => elves" do
297
+ "elf".plural.should == "elves"
298
+ end
299
+
300
+ it "pluralizes shelf => shelves" do
301
+ "shelf".plural.should == "shelves"
302
+ end
303
+
304
+ it "pluralizes plus => plusses" do
305
+ "plus".plural.should == "plusses"
306
+ end
307
+
308
+ it "pluralizes cat => cats" do
309
+ "cat".plural.should == "cats"
310
+ end
311
+
312
+ it "pluralizes rat => rats" do
313
+ "rat".plural.should == "rats"
314
+ end
315
+
316
+ it "pluralizes rose => roses" do
317
+ "rose".plural.should == "roses"
318
+ end
319
+
320
+ it "pluralizes project => projects" do
321
+ "project".plural.should == "projects"
322
+ end
323
+
324
+ it "pluralizes post => posts" do
325
+ "post".plural.should == "posts"
326
+ end
327
+
328
+ it "pluralizes article => articles" do
329
+ "article".plural.should == "articles"
330
+ end
331
+
332
+ it "pluralizes location => locations" do
333
+ "location".plural.should == "locations"
334
+ end
335
+
336
+ it "pluralizes friend => friends" do
337
+ "friend".plural.should == "friends"
338
+ end
339
+
340
+ it "pluralizes link => links" do
341
+ "link".plural.should == "links"
342
+ end
343
+
344
+ it "pluralizes url => urls" do
345
+ "url".plural.should == "urls"
346
+ end
347
+
348
+ it "pluralizes account => accounts" do
349
+ "account".plural.should == "accounts"
350
+ end
351
+
352
+ it "pluralizes server => servers" do
353
+ "server".plural.should == "servers"
354
+ end
355
+
356
+ it "pluralizes fruit => fruits" do
357
+ "fruit".plural.should == "fruits"
358
+ end
359
+
360
+ it "pluralizes map => maps" do
361
+ "map".plural.should == "maps"
362
+ end
363
+
364
+ it "pluralizes income => incomes" do
365
+ "income".plural.should == "incomes"
366
+ end
367
+
368
+ it "pluralizes ping => pings" do
369
+ "ping".plural.should == "pings"
370
+ end
371
+
372
+ it "pluralizes event => events" do
373
+ "event".plural.should == "events"
374
+ end
375
+
376
+ it "pluralizes proof => proofs" do
377
+ "proof".plural.should == "proofs"
378
+ end
379
+
380
+ it "pluralizes typo => typos" do
381
+ "typo".plural.should == "typos"
382
+ end
383
+
384
+ it "pluralizes attachment => attachments" do
385
+ "attachment".plural.should == "attachments"
386
+ end
387
+
388
+ it "pluralizes download => downloads" do
389
+ "download".plural.should == "downloads"
390
+ end
391
+
392
+ it "pluralizes asset => assets" do
393
+ "asset".plural.should == "assets"
394
+ end
395
+
396
+ it "pluralizes job => jobs" do
397
+ "job".plural.should == "jobs"
398
+ end
399
+
400
+ it "pluralizes city => cities" do
401
+ "city".plural.should == "cities"
402
+ end
403
+
404
+ it "pluralizes package => packages" do
405
+ "package".plural.should == "packages"
406
+ end
407
+
408
+ it "pluralizes commit => commits" do
409
+ "commit".plural.should == "commits"
410
+ end
411
+
412
+ it "pluralizes version => versions" do
413
+ "version".plural.should == "versions"
414
+ end
415
+
416
+ it "pluralizes document => documents" do
417
+ "document".plural.should == "documents"
418
+ end
419
+
420
+ it "pluralizes edition => editions" do
421
+ "edition".plural.should == "editions"
422
+ end
423
+
424
+ it "pluralizes movie => movies" do
425
+ "movie".plural.should == "movies"
426
+ end
427
+
428
+ it "pluralizes song => songs" do
429
+ "song".plural.should == "songs"
430
+ end
431
+
432
+ it "pluralizes invoice => invoices" do
433
+ "invoice".plural.should == "invoices"
434
+ end
435
+
436
+ it "pluralizes product => products" do
437
+ "product".plural.should == "products"
438
+ end
439
+
440
+ it "pluralizes book => books" do
441
+ "book".plural.should == "books"
442
+ end
443
+
444
+ it "pluralizes ticket => tickets" do
445
+ "ticket".plural.should == "tickets"
446
+ end
447
+
448
+ it "pluralizes game => games" do
449
+ "game".plural.should == "games"
450
+ end
451
+
452
+ it "pluralizes tournament => tournaments" do
453
+ "tournament".plural.should == "tournaments"
454
+ end
455
+
456
+ it "pluralizes prize => prizes" do
457
+ "prize".plural.should == "prizes"
458
+ end
459
+
460
+ it "pluralizes price => prices" do
461
+ "price".plural.should == "prices"
462
+ end
463
+
464
+ it "pluralizes installation => installations" do
465
+ "installation".plural.should == "installations"
466
+ end
467
+
468
+ it "pluralizes date => dates" do
469
+ "date".plural.should == "dates"
470
+ end
471
+
472
+ it "pluralizes schedule => schedules" do
473
+ "schedule".plural.should == "schedules"
474
+ end
475
+
476
+ it "pluralizes arena => arenas" do
477
+ "arena".plural.should == "arenas"
478
+ end
479
+
480
+ it "pluralizes spam => spams" do
481
+ "spam".plural.should == "spams"
482
+ end
483
+
484
+ it "pluralizes bus => buses" do
485
+ "bus".plural.should == "buses"
486
+ end
487
+
488
+ it "pluralizes rice => rice" do
489
+ "rice".plural.should == "rice"
490
+ end
491
+
492
+ # Some specs from Rails
493
+ SingularToPlural = {
494
+ "search" => "searches",
495
+ "switch" => "switches",
496
+ "fix" => "fixes",
497
+ "box" => "boxes",
498
+ "process" => "processes",
499
+ "address" => "addresses",
500
+ "case" => "cases",
501
+ "stack" => "stacks",
502
+ "wish" => "wishes",
503
+
504
+ "category" => "categories",
505
+ "query" => "queries",
506
+ "ability" => "abilities",
507
+ "agency" => "agencies",
508
+
509
+ "archive" => "archives",
510
+
511
+ "safe" => "saves",
512
+ "half" => "halves",
513
+
514
+ "move" => "moves",
515
+
516
+ "salesperson" => "salespeople",
517
+
518
+ "spokesman" => "spokesmen",
519
+
520
+ "basis" => "bases",
521
+ "diagnosis" => "diagnoses",
522
+ "diagnosis_a" => "diagnosis_as",
523
+
524
+ "datum" => "data",
525
+ "medium" => "media",
526
+
527
+ "node_child" => "node_children",
528
+
529
+ "experience" => "experiences",
530
+ "day" => "days",
531
+
532
+ "comment" => "comments",
533
+ "foobar" => "foobars",
534
+ "newsletter" => "newsletters",
535
+
536
+ "old_news" => "old_news",
537
+
538
+ "perspective" => "perspectives",
539
+
540
+ "photo" => "photos",
541
+ "status_code" => "status_codes",
542
+
543
+ "house" => "houses",
544
+ "virus" => "viruses",
545
+ "portfolio" => "portfolios",
546
+
547
+ "matrix_fu" => "matrix_fus",
548
+
549
+ "axis" => "axes",
550
+
551
+ "shoe" => "shoes",
552
+
553
+ "horse" => "horses",
554
+ "edge" => "edges",
555
+
556
+ "cow" => "kine"
557
+ }
558
+
559
+ SingularToPlural.each do |single_word, plural_word|
560
+ it "pluralizes #{single_word} => #{plural_word}" do
561
+ single_word.plural.should == plural_word
562
+ end
563
+ end
564
+ end