thorero 0.9.4.4 → 0.9.4.5

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 (298) hide show
  1. data/LICENSE +1 -1
  2. data/README +21 -0
  3. data/Rakefile +275 -108
  4. data/TODO +0 -0
  5. data/bin/merb +12 -0
  6. data/bin/merb-specs +5 -0
  7. data/docs/bootloading.dox +58 -0
  8. data/docs/documentation_standards +40 -0
  9. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  10. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  11. data/docs/merb-core-call-stack-diagram.png +0 -0
  12. data/docs/new_render_api +51 -0
  13. data/lib/merb-core.rb +603 -0
  14. data/lib/merb-core/autoload.rb +32 -0
  15. data/lib/merb-core/bootloader.rb +708 -0
  16. data/lib/merb-core/config.rb +303 -0
  17. data/lib/merb-core/constants.rb +43 -0
  18. data/lib/merb-core/controller/abstract_controller.rb +578 -0
  19. data/lib/merb-core/controller/exceptions.rb +302 -0
  20. data/lib/merb-core/controller/merb_controller.rb +256 -0
  21. data/lib/merb-core/controller/mime.rb +106 -0
  22. data/lib/merb-core/controller/mixins/authentication.rb +87 -0
  23. data/lib/merb-core/controller/mixins/controller.rb +290 -0
  24. data/lib/merb-core/controller/mixins/render.rb +481 -0
  25. data/lib/merb-core/controller/mixins/responder.rb +472 -0
  26. data/lib/merb-core/controller/template.rb +254 -0
  27. data/lib/merb-core/core_ext.rb +8 -0
  28. data/lib/merb-core/core_ext/kernel.rb +319 -0
  29. data/lib/merb-core/dispatch/cookies.rb +91 -0
  30. data/lib/merb-core/dispatch/dispatcher.rb +278 -0
  31. data/lib/merb-core/dispatch/exceptions.html.erb +303 -0
  32. data/lib/merb-core/dispatch/request.rb +603 -0
  33. data/lib/merb-core/dispatch/router.rb +179 -0
  34. data/lib/merb-core/dispatch/router/behavior.rb +867 -0
  35. data/lib/merb-core/dispatch/router/cached_proc.rb +52 -0
  36. data/lib/merb-core/dispatch/router/route.rb +321 -0
  37. data/lib/merb-core/dispatch/session.rb +78 -0
  38. data/lib/merb-core/dispatch/session/cookie.rb +168 -0
  39. data/lib/merb-core/dispatch/session/memcached.rb +184 -0
  40. data/lib/merb-core/dispatch/session/memory.rb +241 -0
  41. data/lib/merb-core/dispatch/worker.rb +28 -0
  42. data/lib/merb-core/gem_ext/erubis.rb +77 -0
  43. data/lib/{extlib → merb-core}/logger.rb +2 -2
  44. data/lib/merb-core/plugins.rb +59 -0
  45. data/lib/merb-core/rack.rb +21 -0
  46. data/lib/merb-core/rack/adapter.rb +44 -0
  47. data/lib/merb-core/rack/adapter/ebb.rb +25 -0
  48. data/lib/merb-core/rack/adapter/evented_mongrel.rb +26 -0
  49. data/lib/merb-core/rack/adapter/fcgi.rb +17 -0
  50. data/lib/merb-core/rack/adapter/irb.rb +118 -0
  51. data/lib/merb-core/rack/adapter/mongrel.rb +26 -0
  52. data/lib/merb-core/rack/adapter/runner.rb +28 -0
  53. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +26 -0
  54. data/lib/merb-core/rack/adapter/thin.rb +39 -0
  55. data/lib/merb-core/rack/adapter/thin_turbo.rb +24 -0
  56. data/lib/merb-core/rack/adapter/webrick.rb +36 -0
  57. data/lib/merb-core/rack/application.rb +18 -0
  58. data/lib/merb-core/rack/handler/mongrel.rb +97 -0
  59. data/lib/merb-core/rack/middleware.rb +26 -0
  60. data/lib/merb-core/rack/middleware/path_prefix.rb +31 -0
  61. data/lib/merb-core/rack/middleware/profiler.rb +19 -0
  62. data/lib/merb-core/rack/middleware/static.rb +45 -0
  63. data/lib/merb-core/server.rb +252 -0
  64. data/lib/merb-core/tasks/audit.rake +68 -0
  65. data/lib/merb-core/tasks/merb.rb +1 -0
  66. data/lib/merb-core/tasks/merb_rake_helper.rb +12 -0
  67. data/lib/merb-core/test.rb +11 -0
  68. data/lib/merb-core/test/helpers.rb +9 -0
  69. data/lib/merb-core/test/helpers/controller_helper.rb +8 -0
  70. data/lib/merb-core/test/helpers/multipart_request_helper.rb +175 -0
  71. data/lib/merb-core/test/helpers/request_helper.rb +344 -0
  72. data/lib/merb-core/test/helpers/route_helper.rb +33 -0
  73. data/lib/merb-core/test/helpers/view_helper.rb +121 -0
  74. data/lib/merb-core/test/matchers.rb +9 -0
  75. data/lib/merb-core/test/matchers/controller_matchers.rb +319 -0
  76. data/lib/merb-core/test/matchers/route_matchers.rb +136 -0
  77. data/lib/merb-core/test/matchers/view_matchers.rb +335 -0
  78. data/lib/merb-core/test/run_specs.rb +47 -0
  79. data/lib/merb-core/test/tasks/spectasks.rb +68 -0
  80. data/lib/merb-core/test/test_ext/hpricot.rb +32 -0
  81. data/lib/merb-core/test/test_ext/object.rb +14 -0
  82. data/lib/merb-core/test/test_ext/string.rb +14 -0
  83. data/lib/merb-core/vendor/facets.rb +2 -0
  84. data/lib/merb-core/vendor/facets/dictionary.rb +433 -0
  85. data/lib/merb-core/vendor/facets/inflect.rb +345 -0
  86. data/lib/merb-core/version.rb +11 -0
  87. data/spec/private/config/adapter_spec.rb +32 -0
  88. data/spec/private/config/config_spec.rb +202 -0
  89. data/spec/private/config/environment_spec.rb +13 -0
  90. data/spec/private/config/spec_helper.rb +1 -0
  91. data/spec/private/core_ext/kernel_spec.rb +169 -0
  92. data/spec/private/dispatch/bootloader_spec.rb +24 -0
  93. data/spec/private/dispatch/cookies_spec.rb +107 -0
  94. data/spec/private/dispatch/dispatch_spec.rb +35 -0
  95. data/spec/private/dispatch/fixture/app/controllers/application.rb +4 -0
  96. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +27 -0
  97. data/spec/private/dispatch/fixture/app/controllers/foo.rb +21 -0
  98. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +8 -0
  99. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +37 -0
  100. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +216 -0
  101. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +38 -0
  102. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +40 -0
  103. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  104. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +11 -0
  105. data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
  106. data/spec/private/dispatch/fixture/config/environments/development.rb +6 -0
  107. data/spec/private/dispatch/fixture/config/environments/production.rb +5 -0
  108. data/spec/private/dispatch/fixture/config/environments/test.rb +6 -0
  109. data/spec/private/dispatch/fixture/config/init.rb +45 -0
  110. data/spec/private/dispatch/fixture/config/rack.rb +11 -0
  111. data/spec/private/dispatch/fixture/config/router.rb +35 -0
  112. data/spec/private/dispatch/fixture/log/merb_test.log +1874 -0
  113. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  114. data/spec/private/dispatch/fixture/public/merb.fcgi +4 -0
  115. data/spec/private/dispatch/fixture/public/stylesheets/master.css +119 -0
  116. data/spec/private/dispatch/route_params_spec.rb +24 -0
  117. data/spec/private/dispatch/session_mixin_spec.rb +47 -0
  118. data/spec/private/dispatch/spec_helper.rb +1 -0
  119. data/spec/private/plugins/plugin_spec.rb +166 -0
  120. data/spec/private/rack/application_spec.rb +49 -0
  121. data/spec/private/router/behavior_spec.rb +60 -0
  122. data/spec/private/router/fixture/log/merb_test.log +139 -0
  123. data/spec/private/router/route_spec.rb +414 -0
  124. data/spec/private/router/router_spec.rb +175 -0
  125. data/spec/private/vendor/facets/plural_spec.rb +564 -0
  126. data/spec/private/vendor/facets/singular_spec.rb +489 -0
  127. data/spec/public/DEFINITIONS +11 -0
  128. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +1 -0
  129. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +1 -0
  130. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +1 -0
  131. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +1 -0
  132. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +1 -0
  133. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  134. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +1 -0
  135. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +1 -0
  136. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +1 -0
  137. data/spec/public/abstract_controller/controllers/cousins.rb +41 -0
  138. data/spec/public/abstract_controller/controllers/display.rb +54 -0
  139. data/spec/public/abstract_controller/controllers/filters.rb +193 -0
  140. data/spec/public/abstract_controller/controllers/helpers.rb +41 -0
  141. data/spec/public/abstract_controller/controllers/partial.rb +121 -0
  142. data/spec/public/abstract_controller/controllers/render.rb +113 -0
  143. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +1 -0
  144. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +1 -0
  145. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +1 -0
  146. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +1 -0
  147. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +1 -0
  148. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +1 -0
  149. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +1 -0
  150. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +1 -0
  151. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +1 -0
  152. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  153. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +1 -0
  154. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  155. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +1 -0
  156. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +1 -0
  157. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +1 -0
  158. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +1 -0
  159. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +1 -0
  160. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +1 -0
  161. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +1 -0
  162. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +1 -0
  163. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +1 -0
  164. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +1 -0
  165. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +1 -0
  166. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +1 -0
  167. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +1 -0
  168. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +1 -0
  169. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +1 -0
  170. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +1 -0
  171. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +1 -0
  172. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +1 -0
  173. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +1 -0
  174. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +1 -0
  175. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +1 -0
  176. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +1 -0
  177. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +1 -0
  178. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +1 -0
  179. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +1 -0
  180. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +1 -0
  181. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +1 -0
  182. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +1 -0
  183. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +1 -0
  184. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +1 -0
  185. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +1 -0
  186. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  187. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +1 -0
  188. data/spec/public/abstract_controller/display_spec.rb +33 -0
  189. data/spec/public/abstract_controller/filter_spec.rb +106 -0
  190. data/spec/public/abstract_controller/helper_spec.rb +21 -0
  191. data/spec/public/abstract_controller/partial_spec.rb +61 -0
  192. data/spec/public/abstract_controller/render_spec.rb +90 -0
  193. data/spec/public/abstract_controller/spec_helper.rb +31 -0
  194. data/spec/public/boot_loader/boot_loader_spec.rb +33 -0
  195. data/spec/public/boot_loader/spec_helper.rb +1 -0
  196. data/spec/public/controller/authentication_spec.rb +103 -0
  197. data/spec/public/controller/base_spec.rb +36 -0
  198. data/spec/public/controller/controllers/authentication.rb +45 -0
  199. data/spec/public/controller/controllers/base.rb +36 -0
  200. data/spec/public/controller/controllers/display.rb +118 -0
  201. data/spec/public/controller/controllers/redirect.rb +30 -0
  202. data/spec/public/controller/controllers/responder.rb +93 -0
  203. data/spec/public/controller/controllers/url.rb +7 -0
  204. data/spec/public/controller/controllers/views/layout/custom.html.erb +1 -0
  205. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
  206. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +1 -0
  207. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +1 -0
  208. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +1 -0
  209. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +1 -0
  210. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +1 -0
  211. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +1 -0
  212. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +1 -0
  213. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
  214. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +1 -0
  215. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +1 -0
  216. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +1 -0
  217. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +1 -0
  218. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +1 -0
  219. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +1 -0
  220. data/spec/public/controller/display_spec.rb +84 -0
  221. data/spec/public/controller/redirect_spec.rb +27 -0
  222. data/spec/public/controller/responder_spec.rb +163 -0
  223. data/spec/public/controller/spec_helper.rb +11 -0
  224. data/spec/public/controller/url_spec.rb +180 -0
  225. data/spec/public/core/merb_core_spec.rb +45 -0
  226. data/spec/public/core_ext/class_spec.rb +91 -0
  227. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +2 -0
  228. data/spec/public/core_ext/kernel_spec.rb +9 -0
  229. data/spec/public/core_ext/spec_helper.rb +1 -0
  230. data/spec/public/directory_structure/directory/app/controllers/application.rb +3 -0
  231. data/spec/public/directory_structure/directory/app/controllers/base.rb +13 -0
  232. data/spec/public/directory_structure/directory/app/controllers/custom.rb +19 -0
  233. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +1 -0
  234. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +1 -0
  235. data/spec/public/directory_structure/directory/config/router.rb +3 -0
  236. data/spec/public/directory_structure/directory/log/merb_test.log +562 -0
  237. data/spec/public/directory_structure/directory_spec.rb +44 -0
  238. data/spec/public/logger/logger_spec.rb +181 -0
  239. data/spec/public/logger/spec_helper.rb +1 -0
  240. data/spec/public/reloading/directory/app/controllers/application.rb +3 -0
  241. data/spec/public/reloading/directory/app/controllers/reload.rb +6 -0
  242. data/spec/public/reloading/directory/config/init.rb +2 -0
  243. data/spec/public/reloading/directory/log/merb_test.log +138 -0
  244. data/spec/public/reloading/reload_spec.rb +103 -0
  245. data/spec/public/request/multipart_spec.rb +41 -0
  246. data/spec/public/request/request_spec.rb +228 -0
  247. data/spec/public/router/default_spec.rb +21 -0
  248. data/spec/public/router/deferred_spec.rb +22 -0
  249. data/spec/public/router/fixation_spec.rb +27 -0
  250. data/spec/public/router/fixture/log/merb_test.log +1556 -0
  251. data/spec/public/router/namespace_spec.rb +113 -0
  252. data/spec/public/router/nested_matches_spec.rb +97 -0
  253. data/spec/public/router/nested_resources_spec.rb +41 -0
  254. data/spec/public/router/resource_spec.rb +37 -0
  255. data/spec/public/router/resources_spec.rb +82 -0
  256. data/spec/public/router/spec_helper.rb +90 -0
  257. data/spec/public/router/special_spec.rb +61 -0
  258. data/spec/public/router/string_spec.rb +61 -0
  259. data/spec/public/template/template_spec.rb +104 -0
  260. data/spec/public/template/templates/error.html.erb +2 -0
  261. data/spec/public/template/templates/template.html.erb +1 -0
  262. data/spec/public/template/templates/template.html.myt +1 -0
  263. data/spec/public/test/controller_matchers_spec.rb +402 -0
  264. data/spec/public/test/controllers/controller_assertion_mock.rb +7 -0
  265. data/spec/public/test/controllers/dispatch_controller.rb +11 -0
  266. data/spec/public/test/controllers/spec_helper_controller.rb +38 -0
  267. data/spec/public/test/multipart_request_helper_spec.rb +159 -0
  268. data/spec/public/test/multipart_upload_text_file.txt +1 -0
  269. data/spec/public/test/request_helper_spec.rb +221 -0
  270. data/spec/public/test/route_helper_spec.rb +71 -0
  271. data/spec/public/test/route_matchers_spec.rb +162 -0
  272. data/spec/public/test/view_helper_spec.rb +96 -0
  273. data/spec/public/test/view_matchers_spec.rb +183 -0
  274. data/spec/spec_helper.rb +68 -0
  275. metadata +493 -41
  276. data/README.txt +0 -3
  277. data/lib/extlib.rb +0 -32
  278. data/lib/extlib/assertions.rb +0 -8
  279. data/lib/extlib/blank.rb +0 -42
  280. data/lib/extlib/class.rb +0 -175
  281. data/lib/extlib/hash.rb +0 -410
  282. data/lib/extlib/hook.rb +0 -366
  283. data/lib/extlib/inflection.rb +0 -141
  284. data/lib/extlib/lazy_array.rb +0 -106
  285. data/lib/extlib/mash.rb +0 -143
  286. data/lib/extlib/module.rb +0 -37
  287. data/lib/extlib/object.rb +0 -165
  288. data/lib/extlib/object_space.rb +0 -13
  289. data/lib/extlib/pathname.rb +0 -5
  290. data/lib/extlib/pooling.rb +0 -233
  291. data/lib/extlib/rubygems.rb +0 -38
  292. data/lib/extlib/simple_set.rb +0 -39
  293. data/lib/extlib/string.rb +0 -132
  294. data/lib/extlib/struct.rb +0 -8
  295. data/lib/extlib/tasks/release.rb +0 -9
  296. data/lib/extlib/time.rb +0 -12
  297. data/lib/extlib/version.rb +0 -3
  298. data/lib/extlib/virtual_file.rb +0 -10
@@ -0,0 +1,345 @@
1
+ module Language
2
+
3
+ module English
4
+
5
+ # = English Nouns Number Inflection.
6
+ #
7
+ # This module provides english singular <-> plural noun inflections.
8
+ module Inflect
9
+
10
+ @singular_of = {}
11
+ @plural_of = {}
12
+
13
+ @singular_rules = []
14
+ @plural_rules = []
15
+
16
+ class << self
17
+ # Defines a general inflection exception case.
18
+ #
19
+ # ==== Parameters
20
+ # singular<String>::
21
+ # singular form of the word
22
+ # plural<String>::
23
+ # plural form of the word
24
+ #
25
+ # ==== Examples
26
+ #
27
+ # Here we define erratum/errata exception case:
28
+ #
29
+ # Language::English::Inflector.word "erratum", "errata"
30
+ #
31
+ # In case singular and plural forms are the same omit
32
+ # second argument on call:
33
+ #
34
+ # Language::English::Inflector.word 'information'
35
+ def word(singular, plural=nil)
36
+ plural = singular unless plural
37
+ singular_word(singular, plural)
38
+ plural_word(singular, plural)
39
+ end
40
+
41
+ def clear(type = :all)
42
+ if type == :singular || type == :all
43
+ @singular_of = {}
44
+ @singular_rules = []
45
+ @singularization_rules, @singularization_regex = nil, nil
46
+ end
47
+ if type == :plural || type == :all
48
+ @singular_of = {}
49
+ @singular_rules = []
50
+ @singularization_rules, @singularization_regex = nil, nil
51
+ end
52
+ end
53
+
54
+
55
+ # Define a singularization exception.
56
+ #
57
+ # ==== Parameters
58
+ # singular<String>::
59
+ # singular form of the word
60
+ # plural<String>::
61
+ # plural form of the word
62
+ def singular_word(singular, plural)
63
+ @singular_of[plural] = singular
64
+ @singular_of[plural.capitalize] = singular.capitalize
65
+ end
66
+
67
+ # Define a pluralization exception.
68
+ #
69
+ # ==== Parameters
70
+ # singular<String>::
71
+ # singular form of the word
72
+ # plural<String>::
73
+ # plural form of the word
74
+ def plural_word(singular, plural)
75
+ @plural_of[singular] = plural
76
+ @plural_of[singular.capitalize] = plural.capitalize
77
+ end
78
+
79
+ # Define a general rule.
80
+ #
81
+ # ==== Parameters
82
+ # singular<String>::
83
+ # ending of the word in singular form
84
+ # plural<String>::
85
+ # ending of the word in plural form
86
+ # whole_word<Boolean>::
87
+ # for capitalization, since words can be
88
+ # capitalized (Man => Men) #
89
+ # ==== Examples
90
+ # Once the following rule is defined:
91
+ # Language::English::Inflector.rule 'y', 'ies'
92
+ #
93
+ # You can see the following results:
94
+ # irb> "fly".plural
95
+ # => flies
96
+ # irb> "cry".plural
97
+ # => cries
98
+ # Define a general rule.
99
+
100
+ def rule(singular, plural, whole_word = false)
101
+ singular_rule(singular, plural)
102
+ plural_rule(singular, plural)
103
+ word(singular, plural) if whole_word
104
+ end
105
+
106
+ # Define a singularization rule.
107
+ #
108
+ # ==== Parameters
109
+ # singular<String>::
110
+ # ending of the word in singular form
111
+ # plural<String>::
112
+ # ending of the word in plural form
113
+ #
114
+ # ==== Examples
115
+ # Once the following rule is defined:
116
+ # Language::English::Inflector.singular_rule 'o', 'oes'
117
+ #
118
+ # You can see the following results:
119
+ # irb> "heroes".singular
120
+ # => hero
121
+ def singular_rule(singular, plural)
122
+ @singular_rules << [singular, plural]
123
+ end
124
+
125
+ # Define a plurualization rule.
126
+ #
127
+ # ==== Parameters
128
+ # singular<String>::
129
+ # ending of the word in singular form
130
+ # plural<String>::
131
+ # ending of the word in plural form
132
+ #
133
+ # ==== Examples
134
+ # Once the following rule is defined:
135
+ # Language::English::Inflector.singular_rule 'fe', 'ves'
136
+ #
137
+ # You can see the following results:
138
+ # irb> "wife".plural
139
+ # => wives
140
+ def plural_rule(singular, plural)
141
+ @plural_rules << [singular, plural]
142
+ end
143
+
144
+ # Read prepared singularization rules.
145
+ def singularization_rules
146
+ if defined?(@singularization_regex) && @singularization_regex
147
+ return [@singularization_regex, @singularization_hash]
148
+ end
149
+ # No sorting needed: Regexen match on longest string
150
+ @singularization_regex = Regexp.new("(" + @singular_rules.map {|s,p| p}.join("|") + ")$", "i")
151
+ @singularization_hash = Hash[*@singular_rules.flatten].invert
152
+ [@singularization_regex, @singularization_hash]
153
+ end
154
+
155
+ # Read prepared pluralization rules.
156
+ def pluralization_rules
157
+ if defined?(@pluralization_regex) && @pluralization_regex
158
+ return [@pluralization_regex, @pluralization_hash]
159
+ end
160
+ @pluralization_regex = Regexp.new("(" + @plural_rules.map {|s,p| s}.join("|") + ")$", "i")
161
+ @pluralization_hash = Hash[*@plural_rules.flatten]
162
+ [@pluralization_regex, @pluralization_hash]
163
+ end
164
+
165
+ attr_reader :singular_of, :plural_of
166
+
167
+ # Convert an English word from plurel to singular.
168
+ #
169
+ # "boys".singular #=> boy
170
+ # "tomatoes".singular #=> tomato
171
+ #
172
+ # ==== Parameters
173
+ # word<String>:: word to singularize
174
+ #
175
+ # ==== Returns
176
+ # <String>:: singularized form of word
177
+ #
178
+ # ==== Notes
179
+ # Aliased as singularize (a Railism)
180
+ def singular(word)
181
+ if result = singular_of[word]
182
+ return result.dup
183
+ end
184
+ result = word.dup
185
+ regex, hash = singularization_rules
186
+ result.sub!(regex) {|m| hash[m]}
187
+ singular_of[word] = result
188
+ return result
189
+ end
190
+
191
+ # Alias for #singular (a Railism).
192
+ #
193
+ alias_method(:singularize, :singular)
194
+
195
+ # Convert an English word from singular to plurel.
196
+ #
197
+ # "boy".plural #=> boys
198
+ # "tomato".plural #=> tomatoes
199
+ #
200
+ # ==== Parameters
201
+ # word<String>:: word to pluralize
202
+ #
203
+ # ==== Returns
204
+ # <String>:: pluralized form of word
205
+ #
206
+ # ==== Notes
207
+ # Aliased as pluralize (a Railism)
208
+ def plural(word)
209
+ # special exceptions
210
+ return "" if word == ""
211
+ if result = plural_of[word]
212
+ return result.dup
213
+ end
214
+ result = word.dup
215
+ regex, hash = pluralization_rules
216
+ result.sub!(regex) {|m| hash[m]}
217
+ plural_of[word] = result
218
+ return result
219
+ end
220
+
221
+ # Alias for #plural (a Railism).
222
+ alias_method(:pluralize, :plural)
223
+ end
224
+
225
+ # One argument means singular and plural are the same.
226
+
227
+ word 'equipment'
228
+ word 'information'
229
+ word 'money'
230
+ word 'species'
231
+ word 'series'
232
+ word 'fish'
233
+ word 'sheep'
234
+ word 'moose'
235
+ word 'hovercraft'
236
+ word 'grass'
237
+ word 'rain'
238
+ word 'milk'
239
+ word 'rice'
240
+ word 'plurals'
241
+
242
+ # Two arguments defines a singular and plural exception.
243
+
244
+ word 'Swiss' , 'Swiss'
245
+ word 'life' , 'lives'
246
+ word 'wife' , 'wives'
247
+ word 'goose' , 'geese'
248
+ word 'criterion' , 'criteria'
249
+ word 'alias' , 'aliases'
250
+ word 'status' , 'statuses'
251
+ word 'axis' , 'axes'
252
+ word 'crisis' , 'crises'
253
+ word 'testis' , 'testes'
254
+ word 'potato' , 'potatoes'
255
+ word 'tomato' , 'tomatoes'
256
+ word 'buffalo' , 'buffaloes'
257
+ word 'torpedo' , 'torpedoes'
258
+ word 'quiz' , 'quizzes'
259
+ word 'matrix' , 'matrices'
260
+ word 'vertex' , 'vertices'
261
+ word 'index' , 'indices'
262
+ word 'ox' , 'oxen'
263
+ word 'mouse' , 'mice'
264
+ word 'louse' , 'lice'
265
+ word 'thesis' , 'theses'
266
+ word 'thief' , 'thieves'
267
+ word 'analysis' , 'analyses'
268
+ word 'erratum' , 'errata'
269
+ word 'phenomenon', 'phenomena'
270
+ word 'octopus' , 'octopi'
271
+ word 'thesaurus' , 'thesauri'
272
+ word 'movie' , 'movies'
273
+ word 'cactus' , 'cacti'
274
+ word 'plus' , 'plusses'
275
+ word 'cross' , 'crosses'
276
+ word 'medium' , 'media'
277
+ word 'cow' , 'kine'
278
+ word 'datum' , 'data'
279
+ word 'basis' , 'bases'
280
+ word 'diagnosis' , 'diagnoses'
281
+
282
+ # One-way singularization exception (convert plural to singular).
283
+
284
+ # General rules.
285
+ rule 'person' , 'people', true
286
+ rule 'shoe' , 'shoes', true
287
+ rule 'hive' , 'hives', true
288
+ rule 'man' , 'men', true
289
+ rule 'child' , 'children', true
290
+ rule 'news' , 'news', true
291
+ rule 'rf' , 'rves'
292
+ rule 'af' , 'aves'
293
+ rule 'ero' , 'eroes'
294
+ rule 'man' , 'men'
295
+ rule 'ch' , 'ches'
296
+ rule 'sh' , 'shes'
297
+ rule 'ss' , 'sses'
298
+ rule 'ta' , 'tum'
299
+ rule 'ia' , 'ium'
300
+ rule 'ra' , 'rum'
301
+ rule 'ay' , 'ays'
302
+ rule 'ey' , 'eys'
303
+ rule 'oy' , 'oys'
304
+ rule 'uy' , 'uys'
305
+ rule 'y' , 'ies'
306
+ rule 'x' , 'xes'
307
+ rule 'lf' , 'lves'
308
+ rule 'ffe' , 'ffes'
309
+ rule 'afe' , 'aves'
310
+ rule 'ouse' , 'ouses'
311
+ # more cases of words ending in -oses not being singularized properly
312
+ # than cases of words ending in -osis
313
+ # rule 'osis' , 'oses'
314
+ rule 'ox' , 'oxes'
315
+ rule 'us' , 'uses'
316
+ rule '' , 's'
317
+
318
+ # One-way singular rules.
319
+
320
+ singular_rule 'of' , 'ofs' # proof
321
+ singular_rule 'o' , 'oes' # hero, heroes
322
+ singular_rule 'f' , 'ves'
323
+
324
+ # One-way plural rules.
325
+
326
+ #plural_rule 'fe' , 'ves' # safe, wife
327
+ plural_rule 's' , 'ses'
328
+ plural_rule 'ive' , 'ives' # don't want to snag wife
329
+ plural_rule 'fe' , 'ves' # don't want to snag perspectives
330
+
331
+
332
+ end
333
+ end
334
+ end
335
+
336
+ class String
337
+ def singular
338
+ Language::English::Inflect.singular(self)
339
+ end
340
+ alias_method(:singularize, :singular)
341
+ def plural
342
+ Language::English::Inflect.plural(self)
343
+ end
344
+ alias_method(:pluralize, :plural)
345
+ end
@@ -0,0 +1,11 @@
1
+ module Merb
2
+ VERSION = '0.9.4' unless defined?(Merb::VERSION)
3
+
4
+ # Merb::RELEASE meanings:
5
+ # 'dev' : unreleased
6
+ # 'pre' : pre-release Gem candidates
7
+ # nil : released
8
+ # You should never check in to trunk with this changed. It should
9
+ # stay 'dev'. Change it to nil in release tags.
10
+ RELEASE = 'dev' unless defined?(Merb::RELEASE)
11
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ MERB_BIN = File.dirname(__FILE__) + "/../../../bin/merb"
4
+
5
+ describe Merb::Config do
6
+ before do
7
+ ARGV.replace([])
8
+ Merb::Server.should_receive(:start).and_return(nil)
9
+ end
10
+
11
+ it "should load the runner adapter by default" do
12
+ Merb.start
13
+ Merb::Config[:adapter].should == "runner"
14
+ end
15
+
16
+ it "should load mongrel adapter when running `merb`" do
17
+ load(MERB_BIN)
18
+ Merb::Config[:adapter].should == "mongrel"
19
+ end
20
+
21
+ it "should override adapter when running `merb -a other`" do
22
+ ARGV.push *%w[-a other]
23
+ load(MERB_BIN)
24
+ Merb::Config[:adapter].should == "other"
25
+ end
26
+
27
+ it "should load irb adapter when running `merb -i`" do
28
+ ARGV << '-i'
29
+ load(MERB_BIN)
30
+ Merb::Config[:adapter].should == "irb"
31
+ end
32
+ end
@@ -0,0 +1,202 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Merb::Config do
4
+ before do
5
+ Merb::Config.setup
6
+ end
7
+
8
+ it "should be able to yield the configuration via #use" do
9
+ res = nil
10
+ Merb::Config.use {|c| res = c}
11
+ res.should == Merb::Config.defaults
12
+ end
13
+
14
+ it "should be able to get a configuration key" do
15
+ Merb::Config[:host].should == "0.0.0.0"
16
+ end
17
+
18
+ it "should be able to set a configuration key" do
19
+ Merb::Config[:bar] = "Hello"
20
+ Merb::Config[:bar].should == "Hello"
21
+ end
22
+
23
+ it "should be able to #delete a configuration key" do
24
+ Merb::Config[:bar] = "Hello"
25
+ Merb::Config[:bar].should == "Hello"
26
+ Merb::Config.delete(:bar)
27
+ Merb::Config[:bar].should == nil
28
+ end
29
+
30
+ it "should be able to #fetch a key that does exist" do
31
+ Merb::Config.fetch(:host, "192.168.2.1").should == "0.0.0.0"
32
+ end
33
+
34
+ it "should be able to #fetch a key that does exist" do
35
+ Merb::Config.fetch(:bar, "heylo").should == "heylo"
36
+ end
37
+
38
+ it "should be able to dump to YAML" do
39
+ Merb::Config.to_yaml.should == Merb::Config.instance_variable_get("@configuration").to_yaml
40
+ end
41
+
42
+ it "should support -u to set the user to run Merb as" do
43
+ Merb::Config.parse_args(["-u", "tester"])
44
+ Merb::Config[:user].should == "tester"
45
+ end
46
+
47
+ it "should support -G to set the group to run Merb as" do
48
+ Merb::Config.parse_args(["-G", "tester"])
49
+ Merb::Config[:group].should == "tester"
50
+ end
51
+
52
+ it "should support -d to daemonize Merb" do
53
+ Merb::Config.parse_args(["-d"])
54
+ Merb::Config[:daemonize].should == true
55
+ end
56
+
57
+ it "should support -c to set the number of cluster nodes" do
58
+ Merb::Config.parse_args(["-c", "4"])
59
+ Merb::Config[:cluster].should == "4"
60
+ end
61
+
62
+ it "should support -p to set the port number" do
63
+ Merb::Config.parse_args(["-p", "6000"])
64
+ Merb::Config[:port].should == "6000"
65
+ end
66
+
67
+ it "should support -o to set the socket filename" do
68
+ Merb::Config.parse_args(["-o", "merb.2.sock"])
69
+ Merb::Config[:socket_file].should == "merb.2.sock"
70
+ end
71
+
72
+ it "should support --socket-file to set the socket filename" do
73
+ Merb::Config.parse_args(["--socket-file", "app.thin.0.sock"])
74
+ Merb::Config[:socket_file].should == "app.thin.0.sock" # 0 is default socket #
75
+ end
76
+
77
+ it "should support -s to set the socket number" do
78
+ Merb::Config.parse_args(["-s", "0"])
79
+ Merb::Config[:socket].should == "0"
80
+ end
81
+
82
+ it "should support --socket to set the socket number" do
83
+ Merb::Config.parse_args(["--socket", "3"])
84
+ Merb::Config[:socket].should == "3"
85
+ end
86
+
87
+ it "should support -P to set the PIDfile" do
88
+ Merb::Config.parse_args(["-P", "pidfile"])
89
+ Merb::Config[:pid_file].should == "pidfile"
90
+ end
91
+
92
+ it "should have server return PIDfile setting as is with no cluster nodes" do
93
+ Merb::Config.parse_args(["-P", "pidfile", "-p", "6000"])
94
+ Merb::Server.pid_file(6000).should == "pidfile"
95
+ Merb::Server.pid_files.should == ["pidfile"]
96
+ end
97
+
98
+ it "should support setting of PIDfile with cluster nodes" do
99
+ Merb::Config.parse_args(["-P", "/tmp/merb.pidfile", "-c", "2", "-p", "6000"])
100
+ Merb::Server.pid_file(6000).should == "/tmp/merb.6000.pidfile"
101
+ Merb::Server.pid_file(6001).should == "/tmp/merb.6001.pidfile"
102
+
103
+ Dir.should_receive(:[]).with("/tmp/merb.*.pidfile")
104
+ Merb::Server.pid_files
105
+ end
106
+
107
+ it "should support default PIDfile setting" do
108
+ Merb::Config.parse_args(["-p", "6000"])
109
+ Merb::Server.pid_file(6000).should == Merb.log_path / "merb.6000.pid"
110
+
111
+ Dir.should_receive(:[]).with(Merb.log_path / "merb.*.pid")
112
+ Merb::Server.pid_files
113
+ end
114
+
115
+ it "should support -h to set the hostname" do
116
+ Merb::Config.parse_args(["-h", "hostname"])
117
+ Merb::Config[:host].should == "hostname"
118
+ end
119
+
120
+ it "should support -i to specify loading IRB" do
121
+ Merb::Config.parse_args(["-i"])
122
+ Merb::Config[:adapter].should == "irb"
123
+ end
124
+
125
+ it "should support -l to specify the log level" do
126
+ Merb::Config.parse_args(["-l", "debug"])
127
+ Merb::Config[:log_level].should == :debug
128
+ end
129
+
130
+ it "should support -L to specify the location of the log file" do
131
+ Merb::Config.parse_args(["-L", "log_file"])
132
+ Merb::Config[:log_file].should == "log_file"
133
+ end
134
+
135
+ it "should support -r to specify a runner" do
136
+ Merb::Config.parse_args(["-r", "foo_runner"])
137
+ Merb::Config[:runner_code].should == "foo_runner"
138
+ Merb::Config[:adapter].should == "runner"
139
+ end
140
+
141
+ it "should support -R to specify a rackup file" do
142
+ Merb::Config.parse_args(["-R", "config.ru"])
143
+ Merb::Config[:rackup].should == "config.ru"
144
+ end
145
+
146
+ it "should support -K for a graceful kill" do
147
+ Merb::Server.should_receive(:kill).with("all", 1)
148
+ Merb.start(["-K", "all"])
149
+ end
150
+
151
+ it "should support -k for a hard kill" do
152
+ Merb::Server.should_receive(:kill).with("all", 9)
153
+ Merb.start(["-k", "all"])
154
+ end
155
+
156
+ it "should support -X off to turn off the mutex" do
157
+ Merb::Config.parse_args(["-X", "off"])
158
+ Merb::Config[:use_mutex].should == false
159
+ end
160
+
161
+ it "should support -X on to turn off the mutex" do
162
+ Merb::Config.parse_args(["-X", "on"])
163
+ Merb::Config[:use_mutex].should == true
164
+ end
165
+
166
+ it "should take Merb.disable into account" do
167
+ Merb::Config[:disabled_components].should == []
168
+ Merb::Config[:disabled_components] << :foo
169
+ Merb.disable(:bar)
170
+ Merb.disable(:buz, :fux)
171
+ Merb::Config[:disabled_components].should == [:foo, :bar, :buz, :fux]
172
+ Merb.disabled?(:foo).should == true
173
+ Merb.disabled?(:foo, :buz).should == true
174
+ end
175
+
176
+ it "should take Merb.testing? into account" do
177
+ $TESTING.should == true
178
+ Merb::Config[:testing].should be_nil
179
+ Merb.should be_testing
180
+ $TESTING = false
181
+ Merb.should_not be_testing
182
+ Merb::Config[:testing] = true
183
+ Merb.should be_testing
184
+ $TESTING = true; Merb::Config[:testing] = false # reset
185
+ end
186
+
187
+ it "supports -V to turn on verbose mode" do
188
+ Merb::Config[:verbose] = false
189
+ Merb::Config.parse_args(["-V"])
190
+ Merb::Config[:verbose].should be(true)
191
+ end
192
+
193
+ it "supports --verbose to turn on verbose mode" do
194
+ Merb::Config[:verbose] = false
195
+ Merb::Config.parse_args(["--verbose"])
196
+ Merb::Config[:verbose].should be(true)
197
+ end
198
+
199
+ it "has verbose mode turned off by default" do
200
+ Merb::Config[:verbose].should be(false)
201
+ end
202
+ end