mack 0.8.1 → 0.8.2

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 (477) hide show
  1. data/CHANGELOG +22 -1
  2. data/bin/mack +3 -0
  3. data/bin/mackery-console +4 -0
  4. data/bin/mackery-server +21 -4
  5. data/lib/gems.rb +15 -0
  6. data/lib/gems/abstract-1.0.0/lib/abstract.rb +75 -0
  7. data/lib/gems/builder-2.1.2/lib/blankslate.rb +113 -0
  8. data/lib/gems/builder-2.1.2/lib/builder.rb +13 -0
  9. data/lib/gems/builder-2.1.2/lib/builder/blankslate.rb +20 -0
  10. data/lib/gems/builder-2.1.2/lib/builder/css.rb +250 -0
  11. data/lib/gems/builder-2.1.2/lib/builder/xchar.rb +115 -0
  12. data/lib/gems/builder-2.1.2/lib/builder/xmlbase.rb +139 -0
  13. data/lib/gems/builder-2.1.2/lib/builder/xmlevents.rb +63 -0
  14. data/lib/gems/builder-2.1.2/lib/builder/xmlmarkup.rb +328 -0
  15. data/lib/gems/configatron-2.1.5/lib/configatron.rb +6 -0
  16. data/lib/gems/configatron-2.1.5/lib/configatron/configatron.rb +52 -0
  17. data/lib/gems/configatron-2.1.5/lib/configatron/errors.rb +7 -0
  18. data/lib/gems/configatron-2.1.5/lib/configatron/kernel.rb +8 -0
  19. data/lib/gems/configatron-2.1.5/lib/configatron/store.rb +224 -0
  20. data/lib/gems/daemons-1.0.10/lib/daemons.rb +283 -0
  21. data/lib/gems/daemons-1.0.10/lib/daemons/application.rb +372 -0
  22. data/lib/gems/daemons-1.0.10/lib/daemons/application_group.rb +152 -0
  23. data/lib/gems/daemons-1.0.10/lib/daemons/cmdline.rb +117 -0
  24. data/lib/gems/daemons-1.0.10/lib/daemons/controller.rb +134 -0
  25. data/lib/gems/daemons-1.0.10/lib/daemons/daemonize.rb +263 -0
  26. data/lib/gems/daemons-1.0.10/lib/daemons/exceptions.rb +28 -0
  27. data/lib/gems/daemons-1.0.10/lib/daemons/monitor.rb +127 -0
  28. data/lib/gems/daemons-1.0.10/lib/daemons/pid.rb +101 -0
  29. data/lib/gems/daemons-1.0.10/lib/daemons/pidfile.rb +111 -0
  30. data/lib/gems/daemons-1.0.10/lib/daemons/pidmem.rb +10 -0
  31. data/lib/gems/flexmock-0.8.3/lib/flexmock.rb +13 -0
  32. data/lib/gems/flexmock-0.8.3/lib/flexmock/argument_matchers.rb +57 -0
  33. data/lib/gems/flexmock-0.8.3/lib/flexmock/argument_types.rb +42 -0
  34. data/lib/gems/flexmock-0.8.3/lib/flexmock/base.rb +24 -0
  35. data/lib/gems/flexmock-0.8.3/lib/flexmock/composite.rb +10 -0
  36. data/lib/gems/flexmock-0.8.3/lib/flexmock/core.rb +218 -0
  37. data/lib/gems/flexmock-0.8.3/lib/flexmock/core_class_methods.rb +83 -0
  38. data/lib/gems/flexmock-0.8.3/lib/flexmock/default_framework_adapter.rb +31 -0
  39. data/lib/gems/flexmock-0.8.3/lib/flexmock/deprecated_methods.rb +62 -0
  40. data/lib/gems/flexmock-0.8.3/lib/flexmock/errors.rb +23 -0
  41. data/lib/gems/flexmock-0.8.3/lib/flexmock/expectation.rb +476 -0
  42. data/lib/gems/flexmock-0.8.3/lib/flexmock/expectation_director.rb +87 -0
  43. data/lib/gems/flexmock-0.8.3/lib/flexmock/mock_container.rb +321 -0
  44. data/lib/gems/flexmock-0.8.3/lib/flexmock/noop.rb +13 -0
  45. data/lib/gems/flexmock-0.8.3/lib/flexmock/ordering.rb +51 -0
  46. data/lib/gems/flexmock-0.8.3/lib/flexmock/partial_mock.rb +291 -0
  47. data/lib/gems/flexmock-0.8.3/lib/flexmock/rails.rb +15 -0
  48. data/lib/gems/flexmock-0.8.3/lib/flexmock/rails/view_mocking.rb +102 -0
  49. data/lib/gems/flexmock-0.8.3/lib/flexmock/recorder.rb +71 -0
  50. data/lib/gems/flexmock-0.8.3/lib/flexmock/rspec.rb +34 -0
  51. data/lib/gems/flexmock-0.8.3/lib/flexmock/test_unit.rb +32 -0
  52. data/lib/gems/flexmock-0.8.3/lib/flexmock/test_unit_integration.rb +53 -0
  53. data/lib/gems/flexmock-0.8.3/lib/flexmock/undefined.rb +50 -0
  54. data/lib/gems/flexmock-0.8.3/lib/flexmock/validators.rb +77 -0
  55. data/lib/gems/genosaurus-1.2.4/lib/genosaurus.rb +233 -0
  56. data/lib/gems/lockfile-1.4.3/bin/rlock +360 -0
  57. data/lib/gems/lockfile-1.4.3/bin/rlock-1.4.3 +360 -0
  58. data/lib/gems/lockfile-1.4.3/lib/lockfile-1.4.3.rb +564 -0
  59. data/lib/gems/lockfile-1.4.3/lib/lockfile.rb +564 -0
  60. data/lib/gems/logging-0.9.4/data/bad_logging_1.rb +13 -0
  61. data/lib/gems/logging-0.9.4/data/bad_logging_2.rb +21 -0
  62. data/lib/gems/logging-0.9.4/data/logging.rb +42 -0
  63. data/lib/gems/logging-0.9.4/data/logging.yaml +63 -0
  64. data/lib/gems/logging-0.9.4/data/simple_logging.rb +13 -0
  65. data/lib/gems/logging-0.9.4/lib/logging.rb +404 -0
  66. data/lib/gems/logging-0.9.4/lib/logging/appender.rb +300 -0
  67. data/lib/gems/logging-0.9.4/lib/logging/appenders/console.rb +62 -0
  68. data/lib/gems/logging-0.9.4/lib/logging/appenders/email.rb +130 -0
  69. data/lib/gems/logging-0.9.4/lib/logging/appenders/file.rb +54 -0
  70. data/lib/gems/logging-0.9.4/lib/logging/appenders/growl.rb +197 -0
  71. data/lib/gems/logging-0.9.4/lib/logging/appenders/io.rb +80 -0
  72. data/lib/gems/logging-0.9.4/lib/logging/appenders/rolling_file.rb +291 -0
  73. data/lib/gems/logging-0.9.4/lib/logging/appenders/syslog.rb +201 -0
  74. data/lib/gems/logging-0.9.4/lib/logging/config/configurator.rb +190 -0
  75. data/lib/gems/logging-0.9.4/lib/logging/config/yaml_configurator.rb +195 -0
  76. data/lib/gems/logging-0.9.4/lib/logging/layout.rb +110 -0
  77. data/lib/gems/logging-0.9.4/lib/logging/layouts/basic.rb +34 -0
  78. data/lib/gems/logging-0.9.4/lib/logging/layouts/pattern.rb +291 -0
  79. data/lib/gems/logging-0.9.4/lib/logging/log_event.rb +49 -0
  80. data/lib/gems/logging-0.9.4/lib/logging/logger.rb +490 -0
  81. data/lib/gems/logging-0.9.4/lib/logging/repository.rb +172 -0
  82. data/lib/gems/logging-0.9.4/lib/logging/root_logger.rb +61 -0
  83. data/lib/gems/logging-0.9.4/lib/logging/stats.rb +278 -0
  84. data/lib/gems/logging-0.9.4/lib/logging/utils.rb +130 -0
  85. data/lib/gems/rack-0.4.0/bin/rackup +172 -0
  86. data/lib/gems/rack-0.4.0/lib/rack.rb +81 -0
  87. data/lib/gems/rack-0.4.0/lib/rack/adapter/camping.rb +22 -0
  88. data/lib/gems/rack-0.4.0/lib/rack/auth/abstract/handler.rb +28 -0
  89. data/lib/gems/rack-0.4.0/lib/rack/auth/abstract/request.rb +37 -0
  90. data/lib/gems/rack-0.4.0/lib/rack/auth/basic.rb +58 -0
  91. data/lib/gems/rack-0.4.0/lib/rack/auth/digest/md5.rb +124 -0
  92. data/lib/gems/rack-0.4.0/lib/rack/auth/digest/nonce.rb +51 -0
  93. data/lib/gems/rack-0.4.0/lib/rack/auth/digest/params.rb +55 -0
  94. data/lib/gems/rack-0.4.0/lib/rack/auth/digest/request.rb +40 -0
  95. data/lib/gems/rack-0.4.0/lib/rack/auth/openid.rb +437 -0
  96. data/lib/gems/rack-0.4.0/lib/rack/builder.rb +56 -0
  97. data/lib/gems/rack-0.4.0/lib/rack/cascade.rb +36 -0
  98. data/lib/gems/rack-0.4.0/lib/rack/commonlogger.rb +61 -0
  99. data/lib/gems/rack-0.4.0/lib/rack/deflater.rb +63 -0
  100. data/lib/gems/rack-0.4.0/lib/rack/directory.rb +158 -0
  101. data/lib/gems/rack-0.4.0/lib/rack/file.rb +116 -0
  102. data/lib/gems/rack-0.4.0/lib/rack/handler.rb +44 -0
  103. data/lib/gems/rack-0.4.0/lib/rack/handler/cgi.rb +57 -0
  104. data/lib/gems/rack-0.4.0/lib/rack/handler/evented_mongrel.rb +8 -0
  105. data/lib/gems/rack-0.4.0/lib/rack/handler/fastcgi.rb +84 -0
  106. data/lib/gems/rack-0.4.0/lib/rack/handler/lsws.rb +52 -0
  107. data/lib/gems/rack-0.4.0/lib/rack/handler/mongrel.rb +78 -0
  108. data/lib/gems/rack-0.4.0/lib/rack/handler/scgi.rb +57 -0
  109. data/lib/gems/rack-0.4.0/lib/rack/handler/webrick.rb +57 -0
  110. data/lib/gems/rack-0.4.0/lib/rack/lint.rb +401 -0
  111. data/lib/gems/rack-0.4.0/lib/rack/lobster.rb +65 -0
  112. data/lib/gems/rack-0.4.0/lib/rack/mock.rb +160 -0
  113. data/lib/gems/rack-0.4.0/lib/rack/recursive.rb +57 -0
  114. data/lib/gems/rack-0.4.0/lib/rack/reloader.rb +64 -0
  115. data/lib/gems/rack-0.4.0/lib/rack/request.rb +209 -0
  116. data/lib/gems/rack-0.4.0/lib/rack/response.rb +166 -0
  117. data/lib/gems/rack-0.4.0/lib/rack/session/abstract/id.rb +140 -0
  118. data/lib/gems/rack-0.4.0/lib/rack/session/cookie.rb +71 -0
  119. data/lib/gems/rack-0.4.0/lib/rack/session/memcache.rb +97 -0
  120. data/lib/gems/rack-0.4.0/lib/rack/session/pool.rb +73 -0
  121. data/lib/gems/rack-0.4.0/lib/rack/showexceptions.rb +344 -0
  122. data/lib/gems/rack-0.4.0/lib/rack/showstatus.rb +105 -0
  123. data/lib/gems/rack-0.4.0/lib/rack/static.rb +38 -0
  124. data/lib/gems/rack-0.4.0/lib/rack/urlmap.rb +48 -0
  125. data/lib/gems/rack-0.4.0/lib/rack/utils.rb +318 -0
  126. data/lib/gems/rcov-0.8.1.2.0/bin/rcov +1327 -0
  127. data/lib/gems/rcov-0.8.1.2.0/ext/rcovrt/callsite.c +242 -0
  128. data/lib/gems/rcov-0.8.1.2.0/ext/rcovrt/extconf.rb +11 -0
  129. data/lib/gems/rcov-0.8.1.2.0/ext/rcovrt/rcovrt.c +329 -0
  130. data/lib/gems/rcov-0.8.1.2.0/lib/rcov.rb +988 -0
  131. data/lib/gems/rcov-0.8.1.2.0/lib/rcov/lowlevel.rb +147 -0
  132. data/lib/gems/rcov-0.8.1.2.0/lib/rcov/rant.rb +87 -0
  133. data/lib/gems/rcov-0.8.1.2.0/lib/rcov/rcovtask.rb +156 -0
  134. data/lib/gems/rcov-0.8.1.2.0/lib/rcov/report.rb +1236 -0
  135. data/lib/gems/rcov-0.8.1.2.0/lib/rcov/version.rb +13 -0
  136. data/lib/gems/rspec-1.1.11/bin/autospec +4 -0
  137. data/lib/gems/rspec-1.1.11/bin/spec +4 -0
  138. data/lib/gems/rspec-1.1.11/lib/autotest/discover.rb +3 -0
  139. data/lib/gems/rspec-1.1.11/lib/autotest/rspec.rb +46 -0
  140. data/lib/gems/rspec-1.1.11/lib/spec.rb +32 -0
  141. data/lib/gems/rspec-1.1.11/lib/spec/adapters.rb +1 -0
  142. data/lib/gems/rspec-1.1.11/lib/spec/adapters/ruby_engine.rb +26 -0
  143. data/lib/gems/rspec-1.1.11/lib/spec/adapters/ruby_engine/mri.rb +8 -0
  144. data/lib/gems/rspec-1.1.11/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
  145. data/lib/gems/rspec-1.1.11/lib/spec/example.rb +12 -0
  146. data/lib/gems/rspec-1.1.11/lib/spec/example/before_and_after_hooks.rb +93 -0
  147. data/lib/gems/rspec-1.1.11/lib/spec/example/configuration.rb +167 -0
  148. data/lib/gems/rspec-1.1.11/lib/spec/example/errors.rb +30 -0
  149. data/lib/gems/rspec-1.1.11/lib/spec/example/example_group.rb +25 -0
  150. data/lib/gems/rspec-1.1.11/lib/spec/example/example_group_factory.rb +81 -0
  151. data/lib/gems/rspec-1.1.11/lib/spec/example/example_group_methods.rb +368 -0
  152. data/lib/gems/rspec-1.1.11/lib/spec/example/example_matcher.rb +44 -0
  153. data/lib/gems/rspec-1.1.11/lib/spec/example/example_methods.rb +105 -0
  154. data/lib/gems/rspec-1.1.11/lib/spec/example/module_reopening_fix.rb +21 -0
  155. data/lib/gems/rspec-1.1.11/lib/spec/example/pending.rb +18 -0
  156. data/lib/gems/rspec-1.1.11/lib/spec/example/shared_example_group.rb +52 -0
  157. data/lib/gems/rspec-1.1.11/lib/spec/expectations.rb +56 -0
  158. data/lib/gems/rspec-1.1.11/lib/spec/expectations/differs/default.rb +66 -0
  159. data/lib/gems/rspec-1.1.11/lib/spec/expectations/errors.rb +12 -0
  160. data/lib/gems/rspec-1.1.11/lib/spec/expectations/extensions.rb +2 -0
  161. data/lib/gems/rspec-1.1.11/lib/spec/expectations/extensions/object.rb +63 -0
  162. data/lib/gems/rspec-1.1.11/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  163. data/lib/gems/rspec-1.1.11/lib/spec/expectations/handler.rb +52 -0
  164. data/lib/gems/rspec-1.1.11/lib/spec/extensions.rb +4 -0
  165. data/lib/gems/rspec-1.1.11/lib/spec/extensions/class.rb +24 -0
  166. data/lib/gems/rspec-1.1.11/lib/spec/extensions/main.rb +87 -0
  167. data/lib/gems/rspec-1.1.11/lib/spec/extensions/metaclass.rb +7 -0
  168. data/lib/gems/rspec-1.1.11/lib/spec/extensions/object.rb +6 -0
  169. data/lib/gems/rspec-1.1.11/lib/spec/interop/test.rb +12 -0
  170. data/lib/gems/rspec-1.1.11/lib/spec/interop/test/unit/autorunner.rb +6 -0
  171. data/lib/gems/rspec-1.1.11/lib/spec/interop/test/unit/testcase.rb +71 -0
  172. data/lib/gems/rspec-1.1.11/lib/spec/interop/test/unit/testresult.rb +6 -0
  173. data/lib/gems/rspec-1.1.11/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  174. data/lib/gems/rspec-1.1.11/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  175. data/lib/gems/rspec-1.1.11/lib/spec/matchers.rb +162 -0
  176. data/lib/gems/rspec-1.1.11/lib/spec/matchers/be.rb +221 -0
  177. data/lib/gems/rspec-1.1.11/lib/spec/matchers/be_close.rb +37 -0
  178. data/lib/gems/rspec-1.1.11/lib/spec/matchers/change.rb +148 -0
  179. data/lib/gems/rspec-1.1.11/lib/spec/matchers/eql.rb +43 -0
  180. data/lib/gems/rspec-1.1.11/lib/spec/matchers/equal.rb +43 -0
  181. data/lib/gems/rspec-1.1.11/lib/spec/matchers/exist.rb +22 -0
  182. data/lib/gems/rspec-1.1.11/lib/spec/matchers/has.rb +34 -0
  183. data/lib/gems/rspec-1.1.11/lib/spec/matchers/have.rb +150 -0
  184. data/lib/gems/rspec-1.1.11/lib/spec/matchers/include.rb +77 -0
  185. data/lib/gems/rspec-1.1.11/lib/spec/matchers/match.rb +41 -0
  186. data/lib/gems/rspec-1.1.11/lib/spec/matchers/operator_matcher.rb +79 -0
  187. data/lib/gems/rspec-1.1.11/lib/spec/matchers/raise_error.rb +132 -0
  188. data/lib/gems/rspec-1.1.11/lib/spec/matchers/respond_to.rb +46 -0
  189. data/lib/gems/rspec-1.1.11/lib/spec/matchers/satisfy.rb +47 -0
  190. data/lib/gems/rspec-1.1.11/lib/spec/matchers/simple_matcher.rb +132 -0
  191. data/lib/gems/rspec-1.1.11/lib/spec/matchers/throw_symbol.rb +74 -0
  192. data/lib/gems/rspec-1.1.11/lib/spec/mocks.rb +200 -0
  193. data/lib/gems/rspec-1.1.11/lib/spec/mocks/argument_constraints.rb +165 -0
  194. data/lib/gems/rspec-1.1.11/lib/spec/mocks/argument_expectation.rb +49 -0
  195. data/lib/gems/rspec-1.1.11/lib/spec/mocks/error_generator.rb +84 -0
  196. data/lib/gems/rspec-1.1.11/lib/spec/mocks/errors.rb +10 -0
  197. data/lib/gems/rspec-1.1.11/lib/spec/mocks/extensions.rb +1 -0
  198. data/lib/gems/rspec-1.1.11/lib/spec/mocks/extensions/object.rb +3 -0
  199. data/lib/gems/rspec-1.1.11/lib/spec/mocks/framework.rb +15 -0
  200. data/lib/gems/rspec-1.1.11/lib/spec/mocks/message_expectation.rb +331 -0
  201. data/lib/gems/rspec-1.1.11/lib/spec/mocks/methods.rb +51 -0
  202. data/lib/gems/rspec-1.1.11/lib/spec/mocks/mock.rb +56 -0
  203. data/lib/gems/rspec-1.1.11/lib/spec/mocks/order_group.rb +29 -0
  204. data/lib/gems/rspec-1.1.11/lib/spec/mocks/proxy.rb +224 -0
  205. data/lib/gems/rspec-1.1.11/lib/spec/mocks/space.rb +28 -0
  206. data/lib/gems/rspec-1.1.11/lib/spec/mocks/spec_methods.rb +46 -0
  207. data/lib/gems/rspec-1.1.11/lib/spec/rake/spectask.rb +227 -0
  208. data/lib/gems/rspec-1.1.11/lib/spec/rake/verify_rcov.rb +52 -0
  209. data/lib/gems/rspec-1.1.11/lib/spec/runner.rb +213 -0
  210. data/lib/gems/rspec-1.1.11/lib/spec/runner/backtrace_tweaker.rb +56 -0
  211. data/lib/gems/rspec-1.1.11/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  212. data/lib/gems/rspec-1.1.11/lib/spec/runner/command_line.rb +17 -0
  213. data/lib/gems/rspec-1.1.11/lib/spec/runner/drb_command_line.rb +20 -0
  214. data/lib/gems/rspec-1.1.11/lib/spec/runner/example_group_runner.rb +59 -0
  215. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/base_formatter.rb +79 -0
  216. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/base_text_formatter.rb +126 -0
  217. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  218. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  219. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/html_formatter.rb +337 -0
  220. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  221. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  222. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  223. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  224. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  225. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/story/html_formatter.rb +174 -0
  226. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/story/plain_text_formatter.rb +194 -0
  227. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
  228. data/lib/gems/rspec-1.1.11/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  229. data/lib/gems/rspec-1.1.11/lib/spec/runner/heckle_runner.rb +72 -0
  230. data/lib/gems/rspec-1.1.11/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  231. data/lib/gems/rspec-1.1.11/lib/spec/runner/option_parser.rb +205 -0
  232. data/lib/gems/rspec-1.1.11/lib/spec/runner/options.rb +320 -0
  233. data/lib/gems/rspec-1.1.11/lib/spec/runner/reporter.rb +167 -0
  234. data/lib/gems/rspec-1.1.11/lib/spec/runner/spec_parser.rb +71 -0
  235. data/lib/gems/rspec-1.1.11/lib/spec/story.rb +10 -0
  236. data/lib/gems/rspec-1.1.11/lib/spec/story/extensions.rb +3 -0
  237. data/lib/gems/rspec-1.1.11/lib/spec/story/extensions/main.rb +86 -0
  238. data/lib/gems/rspec-1.1.11/lib/spec/story/extensions/regexp.rb +9 -0
  239. data/lib/gems/rspec-1.1.11/lib/spec/story/extensions/string.rb +9 -0
  240. data/lib/gems/rspec-1.1.11/lib/spec/story/given_scenario.rb +14 -0
  241. data/lib/gems/rspec-1.1.11/lib/spec/story/runner.rb +59 -0
  242. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  243. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/scenario_collector.rb +18 -0
  244. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/scenario_runner.rb +54 -0
  245. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/story_mediator.rb +137 -0
  246. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/story_parser.rb +247 -0
  247. data/lib/gems/rspec-1.1.11/lib/spec/story/runner/story_runner.rb +70 -0
  248. data/lib/gems/rspec-1.1.11/lib/spec/story/scenario.rb +14 -0
  249. data/lib/gems/rspec-1.1.11/lib/spec/story/step.rb +70 -0
  250. data/lib/gems/rspec-1.1.11/lib/spec/story/step_group.rb +89 -0
  251. data/lib/gems/rspec-1.1.11/lib/spec/story/step_mother.rb +38 -0
  252. data/lib/gems/rspec-1.1.11/lib/spec/story/story.rb +39 -0
  253. data/lib/gems/rspec-1.1.11/lib/spec/story/world.rb +128 -0
  254. data/lib/gems/rspec-1.1.11/lib/spec/version.rb +13 -0
  255. data/lib/gems/rspec-1.1.11/plugins/mock_frameworks/flexmock.rb +23 -0
  256. data/lib/gems/rspec-1.1.11/plugins/mock_frameworks/mocha.rb +19 -0
  257. data/lib/gems/rspec-1.1.11/plugins/mock_frameworks/rr.rb +21 -0
  258. data/lib/gems/rspec-1.1.11/plugins/mock_frameworks/rspec.rb +20 -0
  259. data/lib/gems/rspec-1.1.11/rake_tasks/examples.rake +7 -0
  260. data/lib/gems/rspec-1.1.11/rake_tasks/examples_with_rcov.rake +9 -0
  261. data/lib/gems/rspec-1.1.11/rake_tasks/failing_examples_with_html.rake +9 -0
  262. data/lib/gems/rspec-1.1.11/rake_tasks/verify_rcov.rake +7 -0
  263. data/lib/gems/rspec-1.1.11/spec/README.jruby +15 -0
  264. data/lib/gems/rspec-1.1.11/spec/autotest/autotest_helper.rb +6 -0
  265. data/lib/gems/rspec-1.1.11/spec/autotest/autotest_matchers.rb +47 -0
  266. data/lib/gems/rspec-1.1.11/spec/autotest/discover_spec.rb +19 -0
  267. data/lib/gems/rspec-1.1.11/spec/autotest/rspec_spec.rb +150 -0
  268. data/lib/gems/rspec-1.1.11/spec/rspec_suite.rb +6 -0
  269. data/lib/gems/rspec-1.1.11/spec/ruby_forker.rb +13 -0
  270. data/lib/gems/rspec-1.1.11/spec/spec.opts +6 -0
  271. data/lib/gems/rspec-1.1.11/spec/spec/adapters/ruby_engine_spec.rb +16 -0
  272. data/lib/gems/rspec-1.1.11/spec/spec/example/configuration_spec.rb +296 -0
  273. data/lib/gems/rspec-1.1.11/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  274. data/lib/gems/rspec-1.1.11/spec/spec/example/example_group_factory_spec.rb +165 -0
  275. data/lib/gems/rspec-1.1.11/spec/spec/example/example_group_methods_spec.rb +584 -0
  276. data/lib/gems/rspec-1.1.11/spec/spec/example/example_group_spec.rb +683 -0
  277. data/lib/gems/rspec-1.1.11/spec/spec/example/example_matcher_spec.rb +96 -0
  278. data/lib/gems/rspec-1.1.11/spec/spec/example/example_methods_spec.rb +169 -0
  279. data/lib/gems/rspec-1.1.11/spec/spec/example/example_runner_spec.rb +194 -0
  280. data/lib/gems/rspec-1.1.11/spec/spec/example/nested_example_group_spec.rb +71 -0
  281. data/lib/gems/rspec-1.1.11/spec/spec/example/pending_module_spec.rb +145 -0
  282. data/lib/gems/rspec-1.1.11/spec/spec/example/predicate_matcher_spec.rb +21 -0
  283. data/lib/gems/rspec-1.1.11/spec/spec/example/shared_example_group_spec.rb +281 -0
  284. data/lib/gems/rspec-1.1.11/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  285. data/lib/gems/rspec-1.1.11/spec/spec/expectations/differs/default_spec.rb +127 -0
  286. data/lib/gems/rspec-1.1.11/spec/spec/expectations/extensions/object_spec.rb +95 -0
  287. data/lib/gems/rspec-1.1.11/spec/spec/expectations/fail_with_spec.rb +71 -0
  288. data/lib/gems/rspec-1.1.11/spec/spec/extensions/main_spec.rb +71 -0
  289. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  290. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  291. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  292. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  293. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  294. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  295. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  296. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  297. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/spec_spec.rb +52 -0
  298. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  299. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  300. data/lib/gems/rspec-1.1.11/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  301. data/lib/gems/rspec-1.1.11/spec/spec/matchers/be_close_spec.rb +39 -0
  302. data/lib/gems/rspec-1.1.11/spec/spec/matchers/be_spec.rb +248 -0
  303. data/lib/gems/rspec-1.1.11/spec/spec/matchers/change_spec.rb +329 -0
  304. data/lib/gems/rspec-1.1.11/spec/spec/matchers/description_generation_spec.rb +153 -0
  305. data/lib/gems/rspec-1.1.11/spec/spec/matchers/eql_spec.rb +28 -0
  306. data/lib/gems/rspec-1.1.11/spec/spec/matchers/equal_spec.rb +28 -0
  307. data/lib/gems/rspec-1.1.11/spec/spec/matchers/exist_spec.rb +57 -0
  308. data/lib/gems/rspec-1.1.11/spec/spec/matchers/handler_spec.rb +150 -0
  309. data/lib/gems/rspec-1.1.11/spec/spec/matchers/has_spec.rb +63 -0
  310. data/lib/gems/rspec-1.1.11/spec/spec/matchers/have_spec.rb +394 -0
  311. data/lib/gems/rspec-1.1.11/spec/spec/matchers/include_spec.rb +64 -0
  312. data/lib/gems/rspec-1.1.11/spec/spec/matchers/match_spec.rb +37 -0
  313. data/lib/gems/rspec-1.1.11/spec/spec/matchers/matcher_methods_spec.rb +78 -0
  314. data/lib/gems/rspec-1.1.11/spec/spec/matchers/mock_constraint_matchers_spec.rb +24 -0
  315. data/lib/gems/rspec-1.1.11/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  316. data/lib/gems/rspec-1.1.11/spec/spec/matchers/raise_error_spec.rb +315 -0
  317. data/lib/gems/rspec-1.1.11/spec/spec/matchers/respond_to_spec.rb +54 -0
  318. data/lib/gems/rspec-1.1.11/spec/spec/matchers/satisfy_spec.rb +36 -0
  319. data/lib/gems/rspec-1.1.11/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  320. data/lib/gems/rspec-1.1.11/spec/spec/matchers/throw_symbol_spec.rb +54 -0
  321. data/lib/gems/rspec-1.1.11/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  322. data/lib/gems/rspec-1.1.11/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  323. data/lib/gems/rspec-1.1.11/spec/spec/mocks/at_least_spec.rb +97 -0
  324. data/lib/gems/rspec-1.1.11/spec/spec/mocks/at_most_spec.rb +93 -0
  325. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  326. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  327. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_11545_spec.rb +33 -0
  328. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  329. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_496.rb +17 -0
  330. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  331. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  332. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  333. data/lib/gems/rspec-1.1.11/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  334. data/lib/gems/rspec-1.1.11/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +95 -0
  335. data/lib/gems/rspec-1.1.11/spec/spec/mocks/hash_including_matcher_spec.rb +53 -0
  336. data/lib/gems/rspec-1.1.11/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  337. data/lib/gems/rspec-1.1.11/spec/spec/mocks/mock_space_spec.rb +54 -0
  338. data/lib/gems/rspec-1.1.11/spec/spec/mocks/mock_spec.rb +555 -0
  339. data/lib/gems/rspec-1.1.11/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  340. data/lib/gems/rspec-1.1.11/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  341. data/lib/gems/rspec-1.1.11/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  342. data/lib/gems/rspec-1.1.11/spec/spec/mocks/once_counts_spec.rb +53 -0
  343. data/lib/gems/rspec-1.1.11/spec/spec/mocks/options_hash_spec.rb +35 -0
  344. data/lib/gems/rspec-1.1.11/spec/spec/mocks/partial_mock_spec.rb +149 -0
  345. data/lib/gems/rspec-1.1.11/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  346. data/lib/gems/rspec-1.1.11/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +130 -0
  347. data/lib/gems/rspec-1.1.11/spec/spec/mocks/precise_counts_spec.rb +52 -0
  348. data/lib/gems/rspec-1.1.11/spec/spec/mocks/record_messages_spec.rb +26 -0
  349. data/lib/gems/rspec-1.1.11/spec/spec/mocks/stub_spec.rb +188 -0
  350. data/lib/gems/rspec-1.1.11/spec/spec/mocks/twice_counts_spec.rb +67 -0
  351. data/lib/gems/rspec-1.1.11/spec/spec/package/bin_spec_spec.rb +22 -0
  352. data/lib/gems/rspec-1.1.11/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  353. data/lib/gems/rspec-1.1.11/spec/spec/runner/command_line_spec.rb +141 -0
  354. data/lib/gems/rspec-1.1.11/spec/spec/runner/drb_command_line_spec.rb +97 -0
  355. data/lib/gems/rspec-1.1.11/spec/spec/runner/empty_file.txt +0 -0
  356. data/lib/gems/rspec-1.1.11/spec/spec/runner/examples.txt +2 -0
  357. data/lib/gems/rspec-1.1.11/spec/spec/runner/failed.txt +3 -0
  358. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/base_formatter_spec.rb +112 -0
  359. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  360. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  361. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  362. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  363. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  364. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  365. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatted-1.8.6.html +370 -0
  366. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/html_formatter_spec.rb +61 -0
  367. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  368. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  369. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +155 -0
  370. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  371. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  372. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  373. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/story/html_formatter_spec.rb +135 -0
  374. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +600 -0
  375. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
  376. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  377. data/lib/gems/rspec-1.1.11/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +370 -0
  378. data/lib/gems/rspec-1.1.11/spec/spec/runner/heckle_runner_spec.rb +78 -0
  379. data/lib/gems/rspec-1.1.11/spec/spec/runner/heckler_spec.rb +13 -0
  380. data/lib/gems/rspec-1.1.11/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  381. data/lib/gems/rspec-1.1.11/spec/spec/runner/option_parser_spec.rb +421 -0
  382. data/lib/gems/rspec-1.1.11/spec/spec/runner/options_spec.rb +450 -0
  383. data/lib/gems/rspec-1.1.11/spec/spec/runner/output_one_time_fixture.rb +7 -0
  384. data/lib/gems/rspec-1.1.11/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  385. data/lib/gems/rspec-1.1.11/spec/spec/runner/output_one_time_spec.rb +16 -0
  386. data/lib/gems/rspec-1.1.11/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  387. data/lib/gems/rspec-1.1.11/spec/spec/runner/reporter_spec.rb +238 -0
  388. data/lib/gems/rspec-1.1.11/spec/spec/runner/resources/a_bar.rb +0 -0
  389. data/lib/gems/rspec-1.1.11/spec/spec/runner/resources/a_foo.rb +0 -0
  390. data/lib/gems/rspec-1.1.11/spec/spec/runner/resources/a_spec.rb +1 -0
  391. data/lib/gems/rspec-1.1.11/spec/spec/runner/spec.opts +2 -0
  392. data/lib/gems/rspec-1.1.11/spec/spec/runner/spec_drb.opts +1 -0
  393. data/lib/gems/rspec-1.1.11/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  394. data/lib/gems/rspec-1.1.11/spec/spec/runner/spec_parser_spec.rb +85 -0
  395. data/lib/gems/rspec-1.1.11/spec/spec/runner/spec_spaced.opts +2 -0
  396. data/lib/gems/rspec-1.1.11/spec/spec/runner_spec.rb +11 -0
  397. data/lib/gems/rspec-1.1.11/spec/spec/spec_classes.rb +133 -0
  398. data/lib/gems/rspec-1.1.11/spec/spec/story/builders.rb +46 -0
  399. data/lib/gems/rspec-1.1.11/spec/spec/story/extensions/main_spec.rb +161 -0
  400. data/lib/gems/rspec-1.1.11/spec/spec/story/extensions_spec.rb +14 -0
  401. data/lib/gems/rspec-1.1.11/spec/spec/story/given_scenario_spec.rb +27 -0
  402. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/plain_text_story_runner_spec.rb +90 -0
  403. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  404. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/scenario_runner_spec.rb +214 -0
  405. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/story_mediator_spec.rb +143 -0
  406. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/story_parser_spec.rb +401 -0
  407. data/lib/gems/rspec-1.1.11/spec/spec/story/runner/story_runner_spec.rb +294 -0
  408. data/lib/gems/rspec-1.1.11/spec/spec/story/runner_spec.rb +93 -0
  409. data/lib/gems/rspec-1.1.11/spec/spec/story/scenario_spec.rb +18 -0
  410. data/lib/gems/rspec-1.1.11/spec/spec/story/step_group_spec.rb +157 -0
  411. data/lib/gems/rspec-1.1.11/spec/spec/story/step_mother_spec.rb +84 -0
  412. data/lib/gems/rspec-1.1.11/spec/spec/story/step_spec.rb +272 -0
  413. data/lib/gems/rspec-1.1.11/spec/spec/story/story_helper.rb +2 -0
  414. data/lib/gems/rspec-1.1.11/spec/spec/story/story_spec.rb +84 -0
  415. data/lib/gems/rspec-1.1.11/spec/spec/story/world_spec.rb +423 -0
  416. data/lib/gems/rspec-1.1.11/spec/spec_helper.rb +77 -0
  417. data/lib/gems/rspec-1.1.11/stories/all.rb +5 -0
  418. data/lib/gems/rspec-1.1.11/stories/configuration/before_blocks.story +21 -0
  419. data/lib/gems/rspec-1.1.11/stories/configuration/stories.rb +7 -0
  420. data/lib/gems/rspec-1.1.11/stories/example_groups/autogenerated_docstrings +45 -0
  421. data/lib/gems/rspec-1.1.11/stories/example_groups/example_group_with_should_methods +17 -0
  422. data/lib/gems/rspec-1.1.11/stories/example_groups/nested_groups +17 -0
  423. data/lib/gems/rspec-1.1.11/stories/example_groups/output +25 -0
  424. data/lib/gems/rspec-1.1.11/stories/example_groups/stories.rb +7 -0
  425. data/lib/gems/rspec-1.1.11/stories/helper.rb +6 -0
  426. data/lib/gems/rspec-1.1.11/stories/interop/examples_and_tests_together +30 -0
  427. data/lib/gems/rspec-1.1.11/stories/interop/stories.rb +7 -0
  428. data/lib/gems/rspec-1.1.11/stories/interop/test_case_with_should_methods +17 -0
  429. data/lib/gems/rspec-1.1.11/stories/mock_framework_integration/stories.rb +7 -0
  430. data/lib/gems/rspec-1.1.11/stories/mock_framework_integration/use_flexmock.story +9 -0
  431. data/lib/gems/rspec-1.1.11/stories/pending_stories/README +3 -0
  432. data/lib/gems/rspec-1.1.11/stories/resources/helpers/cmdline.rb +9 -0
  433. data/lib/gems/rspec-1.1.11/stories/resources/helpers/story_helper.rb +16 -0
  434. data/lib/gems/rspec-1.1.11/stories/resources/matchers/smart_match.rb +37 -0
  435. data/lib/gems/rspec-1.1.11/stories/resources/spec/before_blocks_example.rb +32 -0
  436. data/lib/gems/rspec-1.1.11/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  437. data/lib/gems/rspec-1.1.11/stories/resources/spec/simple_spec.rb +8 -0
  438. data/lib/gems/rspec-1.1.11/stories/resources/spec/spec_with_flexmock.rb +18 -0
  439. data/lib/gems/rspec-1.1.11/stories/resources/steps/running_rspec.rb +50 -0
  440. data/lib/gems/rspec-1.1.11/stories/resources/stories/failing_story.rb +15 -0
  441. data/lib/gems/rspec-1.1.11/stories/resources/test/spec_and_test_together.rb +57 -0
  442. data/lib/gems/rspec-1.1.11/stories/resources/test/test_case_with_should_methods.rb +30 -0
  443. data/lib/gems/rspec-1.1.11/stories/stories/multiline_steps.story +23 -0
  444. data/lib/gems/rspec-1.1.11/stories/stories/steps/multiline_steps.rb +13 -0
  445. data/lib/gems/rspec-1.1.11/stories/stories/stories.rb +6 -0
  446. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/builder.js +136 -0
  447. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/controls.js +972 -0
  448. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/dragdrop.js +976 -0
  449. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/effects.js +1117 -0
  450. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/prototype.js +4140 -0
  451. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/rspec.js +149 -0
  452. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/scriptaculous.js +58 -0
  453. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/slider.js +276 -0
  454. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/sound.js +55 -0
  455. data/lib/gems/rspec-1.1.11/story_server/prototype/javascripts/unittest.js +568 -0
  456. data/lib/gems/rspec-1.1.11/story_server/prototype/lib/server.rb +24 -0
  457. data/lib/gems/rspec-1.1.11/story_server/prototype/stories.html +176 -0
  458. data/lib/gems/rspec-1.1.11/story_server/prototype/stylesheets/rspec.css +136 -0
  459. data/lib/gems/rspec-1.1.11/story_server/prototype/stylesheets/test.css +90 -0
  460. data/lib/mack/boot/configuration.rb +2 -0
  461. data/lib/mack/boot/console.rb +2 -0
  462. data/lib/mack/boot/gems.rb +6 -1
  463. data/lib/mack/boot/logging.rb +1 -1
  464. data/lib/mack/controller/request.rb +2 -55
  465. data/lib/mack/controller/request/date_time_parameter.rb +37 -0
  466. data/lib/mack/controller/request/parameters.rb +31 -0
  467. data/lib/mack/core_extensions/gem_kernel.rb +30 -0
  468. data/lib/mack/core_extensions/kernel.rb +31 -14
  469. data/lib/mack/routing/route_map.rb +19 -18
  470. data/lib/mack/routing/route_object.rb +14 -3
  471. data/lib/mack/routing/routes.rb +4 -0
  472. data/lib/mack/runner.rb +11 -0
  473. data/lib/mack/version.rb +1 -1
  474. data/lib/mack_app.rb +1 -26
  475. data/lib/mack_core.rb +2 -50
  476. data/lib/mack_tasks.rb +1 -32
  477. metadata +669 -90
@@ -0,0 +1,44 @@
1
+ module Rack
2
+ # *Handlers* connect web servers with Rack.
3
+ #
4
+ # Rack includes Handlers for Mongrel, WEBrick, FastCGI, CGI, SCGI
5
+ # and LiteSpeed.
6
+ #
7
+ # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
8
+ # A second optional hash can be passed to include server-specific
9
+ # configuration.
10
+ module Handler
11
+ def self.get(server)
12
+ return unless server
13
+
14
+ if klass = @handlers[server]
15
+ obj = Object
16
+ klass.split("::").each { |x| obj = obj.const_get(x) }
17
+ obj
18
+ else
19
+ Rack::Handler.const_get(server.capitalize)
20
+ end
21
+ end
22
+
23
+ def self.register(server, klass)
24
+ @handlers ||= {}
25
+ @handlers[server] = klass
26
+ end
27
+
28
+ autoload :CGI, "rack/handler/cgi"
29
+ autoload :FastCGI, "rack/handler/fastcgi"
30
+ autoload :Mongrel, "rack/handler/mongrel"
31
+ autoload :EventedMongrel, "rack/handler/evented_mongrel"
32
+ autoload :WEBrick, "rack/handler/webrick"
33
+ autoload :LSWS, "rack/handler/lsws"
34
+ autoload :SCGI, "rack/handler/scgi"
35
+
36
+ register 'cgi', 'Rack::Handler::CGI'
37
+ register 'fastcgi', 'Rack::Handler::FastCGI'
38
+ register 'mongrel', 'Rack::Handler::Mongrel'
39
+ register 'emongrel', 'Rack::Handler::EventedMongrel'
40
+ register 'webrick', 'Rack::Handler::WEBrick'
41
+ register 'lsws', 'Rack::Handler::LSWS'
42
+ register 'scgi', 'Rack::Handler::SCGI'
43
+ end
44
+ end
@@ -0,0 +1,57 @@
1
+ module Rack
2
+ module Handler
3
+ class CGI
4
+ def self.run(app, options=nil)
5
+ serve app
6
+ end
7
+
8
+ def self.serve(app)
9
+ env = ENV.to_hash
10
+ env.delete "HTTP_CONTENT_LENGTH"
11
+
12
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
13
+
14
+ env.update({"rack.version" => [0,1],
15
+ "rack.input" => STDIN,
16
+ "rack.errors" => STDERR,
17
+
18
+ "rack.multithread" => false,
19
+ "rack.multiprocess" => true,
20
+ "rack.run_once" => true,
21
+
22
+ "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
23
+ })
24
+
25
+ env["QUERY_STRING"] ||= ""
26
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
27
+ env["REQUEST_PATH"] ||= "/"
28
+
29
+ status, headers, body = app.call(env)
30
+ begin
31
+ send_headers status, headers
32
+ send_body body
33
+ ensure
34
+ body.close if body.respond_to? :close
35
+ end
36
+ end
37
+
38
+ def self.send_headers(status, headers)
39
+ STDOUT.print "Status: #{status}\r\n"
40
+ headers.each { |k, vs|
41
+ vs.each { |v|
42
+ STDOUT.print "#{k}: #{v}\r\n"
43
+ }
44
+ }
45
+ STDOUT.print "\r\n"
46
+ STDOUT.flush
47
+ end
48
+
49
+ def self.send_body(body)
50
+ body.each { |part|
51
+ STDOUT.print part
52
+ STDOUT.flush
53
+ }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,8 @@
1
+ require 'swiftcore/evented_mongrel'
2
+
3
+ module Rack
4
+ module Handler
5
+ class EventedMongrel < Mongrel
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,84 @@
1
+ require 'fcgi'
2
+ require 'socket'
3
+
4
+ module Rack
5
+ module Handler
6
+ class FastCGI
7
+ def self.run(app, options={})
8
+ file = options[:File] and STDIN.reopen(UNIXServer.new(file))
9
+ port = options[:Port] and STDIN.reopen(TCPServer.new(port))
10
+ FCGI.each { |request|
11
+ serve request, app
12
+ }
13
+ end
14
+
15
+ module ProperStream # :nodoc:
16
+ def each # This is missing by default.
17
+ while line = gets
18
+ yield line
19
+ end
20
+ end
21
+
22
+ def read(*args)
23
+ if args.empty?
24
+ super || "" # Empty string on EOF.
25
+ else
26
+ super
27
+ end
28
+ end
29
+ end
30
+
31
+ def self.serve(request, app)
32
+ env = request.env
33
+ env.delete "HTTP_CONTENT_LENGTH"
34
+
35
+ request.in.extend ProperStream
36
+
37
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
38
+
39
+ env.update({"rack.version" => [0,1],
40
+ "rack.input" => request.in,
41
+ "rack.errors" => request.err,
42
+
43
+ "rack.multithread" => false,
44
+ "rack.multiprocess" => true,
45
+ "rack.run_once" => false,
46
+
47
+ "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
48
+ })
49
+
50
+ env["QUERY_STRING"] ||= ""
51
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
52
+ env["REQUEST_PATH"] ||= "/"
53
+ env.delete "PATH_INFO" if env["PATH_INFO"] == ""
54
+
55
+ status, headers, body = app.call(env)
56
+ begin
57
+ send_headers request.out, status, headers
58
+ send_body request.out, body
59
+ ensure
60
+ body.close if body.respond_to? :close
61
+ request.finish
62
+ end
63
+ end
64
+
65
+ def self.send_headers(out, status, headers)
66
+ out.print "Status: #{status}\r\n"
67
+ headers.each { |k, vs|
68
+ vs.each { |v|
69
+ out.print "#{k}: #{v}\r\n"
70
+ }
71
+ }
72
+ out.print "\r\n"
73
+ out.flush
74
+ end
75
+
76
+ def self.send_body(out, body)
77
+ body.each { |part|
78
+ out.print part
79
+ out.flush
80
+ }
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,52 @@
1
+ require 'lsapi'
2
+ #require 'cgi'
3
+ module Rack
4
+ module Handler
5
+ class LSWS
6
+ def self.run(app, options=nil)
7
+ while LSAPI.accept != nil
8
+ serve app
9
+ end
10
+ end
11
+ def self.serve(app)
12
+ env = ENV.to_hash
13
+ env.delete "HTTP_CONTENT_LENGTH"
14
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
15
+ env.update({"rack.version" => [0,1],
16
+ "rack.input" => STDIN,
17
+ "rack.errors" => STDERR,
18
+ "rack.multithread" => false,
19
+ "rack.multiprocess" => true,
20
+ "rack.run_once" => false,
21
+ "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
22
+ })
23
+ env["QUERY_STRING"] ||= ""
24
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
25
+ env["REQUEST_PATH"] ||= "/"
26
+ status, headers, body = app.call(env)
27
+ begin
28
+ send_headers status, headers
29
+ send_body body
30
+ ensure
31
+ body.close if body.respond_to? :close
32
+ end
33
+ end
34
+ def self.send_headers(status, headers)
35
+ print "Status: #{status}\r\n"
36
+ headers.each { |k, vs|
37
+ vs.each { |v|
38
+ print "#{k}: #{v}\r\n"
39
+ }
40
+ }
41
+ print "\r\n"
42
+ STDOUT.flush
43
+ end
44
+ def self.send_body(body)
45
+ body.each { |part|
46
+ print part
47
+ STDOUT.flush
48
+ }
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,78 @@
1
+ require 'mongrel'
2
+ require 'stringio'
3
+
4
+ module Rack
5
+ module Handler
6
+ class Mongrel < ::Mongrel::HttpHandler
7
+ def self.run(app, options={})
8
+ server = ::Mongrel::HttpServer.new(options[:Host] || '0.0.0.0',
9
+ options[:Port] || 8080)
10
+ # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods.
11
+ # Use is similar to #run, replacing the app argument with a hash of
12
+ # { path=>app, ... } or an instance of Rack::URLMap.
13
+ if options[:map]
14
+ if app.is_a? Hash
15
+ app.each do |path, appl|
16
+ path = '/'+path unless path[0] == ?/
17
+ server.register(path, Rack::Handler::Mongrel.new(appl))
18
+ end
19
+ elsif app.is_a? URLMap
20
+ app.instance_variable_get(:@mapping).each do |(host, path, appl)|
21
+ next if !host.nil? && !options[:Host].nil? && options[:Host] != host
22
+ path = '/'+path unless path[0] == ?/
23
+ server.register(path, Rack::Handler::Mongrel.new(appl))
24
+ end
25
+ else
26
+ raise ArgumentError, "first argument should be a Hash or URLMap"
27
+ end
28
+ else
29
+ server.register('/', Rack::Handler::Mongrel.new(app))
30
+ end
31
+ yield server if block_given?
32
+ server.run.join
33
+ end
34
+
35
+ def initialize(app)
36
+ @app = app
37
+ end
38
+
39
+ def process(request, response)
40
+ env = {}.replace(request.params)
41
+ env.delete "HTTP_CONTENT_TYPE"
42
+ env.delete "HTTP_CONTENT_LENGTH"
43
+
44
+ env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
45
+
46
+ env.update({"rack.version" => [0,1],
47
+ "rack.input" => request.body || StringIO.new(""),
48
+ "rack.errors" => STDERR,
49
+
50
+ "rack.multithread" => true,
51
+ "rack.multiprocess" => false, # ???
52
+ "rack.run_once" => false,
53
+
54
+ "rack.url_scheme" => "http",
55
+ })
56
+ env["QUERY_STRING"] ||= ""
57
+ env.delete "PATH_INFO" if env["PATH_INFO"] == ""
58
+
59
+ status, headers, body = @app.call(env)
60
+
61
+ begin
62
+ response.status = status.to_i
63
+ headers.each { |k, vs|
64
+ vs.each { |v|
65
+ response.header[k] = v
66
+ }
67
+ }
68
+ body.each { |part|
69
+ response.body << part
70
+ }
71
+ response.finished
72
+ ensure
73
+ body.close if body.respond_to? :close
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,57 @@
1
+ require 'scgi'
2
+ require 'stringio'
3
+
4
+ module Rack
5
+ module Handler
6
+ class SCGI < ::SCGI::Processor
7
+ attr_accessor :app
8
+
9
+ def self.run(app, options=nil)
10
+ new(options.merge(:app=>app,
11
+ :host=>options[:Host],
12
+ :port=>options[:Port],
13
+ :socket=>options[:Socket])).listen
14
+ end
15
+
16
+ def initialize(settings = {})
17
+ @app = settings[:app]
18
+ @log = Object.new
19
+ def @log.info(*args); end
20
+ def @log.error(*args); end
21
+ super(settings)
22
+ end
23
+
24
+ def process_request(request, input_body, socket)
25
+ env = {}.replace(request)
26
+ env.delete "HTTP_CONTENT_TYPE"
27
+ env.delete "HTTP_CONTENT_LENGTH"
28
+ env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2)
29
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
30
+ env["PATH_INFO"] = env["REQUEST_PATH"]
31
+ env["QUERY_STRING"] ||= ""
32
+ env["SCRIPT_NAME"] = ""
33
+ env.update({"rack.version" => [0,1],
34
+ "rack.input" => StringIO.new(input_body),
35
+ "rack.errors" => STDERR,
36
+
37
+ "rack.multithread" => true,
38
+ "rack.multiprocess" => true,
39
+ "rack.run_once" => false,
40
+
41
+ "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
42
+ })
43
+ status, headers, body = app.call(env)
44
+ begin
45
+ socket.write("Status: #{status}\r\n")
46
+ headers.each do |k, vs|
47
+ vs.each {|v| socket.write("#{k}: #{v}\r\n")}
48
+ end
49
+ socket.write("\r\n")
50
+ body.each {|s| socket.write(s)}
51
+ ensure
52
+ body.close if body.respond_to? :close
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ require 'webrick'
2
+ require 'stringio'
3
+
4
+ module Rack
5
+ module Handler
6
+ class WEBrick < WEBrick::HTTPServlet::AbstractServlet
7
+ def self.run(app, options={})
8
+ server = ::WEBrick::HTTPServer.new(options)
9
+ server.mount "/", Rack::Handler::WEBrick, app
10
+ trap(:INT) { server.shutdown }
11
+ yield server if block_given?
12
+ server.start
13
+ end
14
+
15
+ def initialize(server, app)
16
+ super server
17
+ @app = app
18
+ end
19
+
20
+ def service(req, res)
21
+ env = req.meta_vars
22
+ env.delete_if { |k, v| v.nil? }
23
+
24
+ env.update({"rack.version" => [0,1],
25
+ "rack.input" => StringIO.new(req.body.to_s),
26
+ "rack.errors" => STDERR,
27
+
28
+ "rack.multithread" => true,
29
+ "rack.multiprocess" => false,
30
+ "rack.run_once" => false,
31
+
32
+ "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
33
+ })
34
+
35
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
36
+ env["QUERY_STRING"] ||= ""
37
+ env["REQUEST_PATH"] ||= "/"
38
+ env.delete "PATH_INFO" if env["PATH_INFO"] == ""
39
+
40
+ status, headers, body = @app.call(env)
41
+ begin
42
+ res.status = status.to_i
43
+ headers.each { |k, vs|
44
+ vs.each { |v|
45
+ res[k] = v
46
+ }
47
+ }
48
+ body.each { |part|
49
+ res.body << part
50
+ }
51
+ ensure
52
+ body.close if body.respond_to? :close
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,401 @@
1
+ module Rack
2
+ # Rack::Lint validates your application and the requests and
3
+ # responses according to the Rack spec.
4
+
5
+ class Lint
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ # :stopdoc:
11
+
12
+ class LintError < RuntimeError; end
13
+ module Assertion
14
+ def assert(message, &block)
15
+ unless block.call
16
+ raise LintError, message
17
+ end
18
+ end
19
+ end
20
+ include Assertion
21
+
22
+ ## This specification aims to formalize the Rack protocol. You
23
+ ## can (and should) use Rack::Lint to enforce it.
24
+ ##
25
+ ## When you develop middleware, be sure to add a Lint before and
26
+ ## after to catch all mistakes.
27
+
28
+ ## = Rack applications
29
+
30
+ ## A Rack application is an Ruby object (not a class) that
31
+ ## responds to +call+.
32
+ def call(env=nil)
33
+ dup._call(env)
34
+ end
35
+
36
+ def _call(env)
37
+ ## It takes exactly one argument, the *environment*
38
+ assert("No env given") { env }
39
+ check_env env
40
+
41
+ env['rack.input'] = InputWrapper.new(env['rack.input'])
42
+ env['rack.errors'] = ErrorWrapper.new(env['rack.errors'])
43
+
44
+ ## and returns an Array of exactly three values:
45
+ status, headers, @body = @app.call(env)
46
+ ## The *status*,
47
+ check_status status
48
+ ## the *headers*,
49
+ check_headers headers
50
+ ## and the *body*.
51
+ check_content_type status, headers
52
+ [status, headers, self]
53
+ end
54
+
55
+ ## == The Environment
56
+ def check_env(env)
57
+ ## The environment must be an true instance of Hash (no
58
+ ## subclassing allowed) that includes CGI-like headers.
59
+ ## The application is free to modify the environment.
60
+ assert("env #{env.inspect} is not a Hash, but #{env.class}") {
61
+ env.instance_of? Hash
62
+ }
63
+
64
+ ##
65
+ ## The environment is required to include these variables
66
+ ## (adopted from PEP333), except when they'd be empty, but see
67
+ ## below.
68
+
69
+ ## <tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
70
+ ## "GET" or "POST". This cannot ever
71
+ ## be an empty string, and so is
72
+ ## always required.
73
+
74
+ ## <tt>SCRIPT_NAME</tt>:: The initial portion of the request
75
+ ## URL's "path" that corresponds to the
76
+ ## application object, so that the
77
+ ## application knows its virtual
78
+ ## "location". This may be an empty
79
+ ## string, if the application corresponds
80
+ ## to the "root" of the server.
81
+
82
+ ## <tt>PATH_INFO</tt>:: The remainder of the request URL's
83
+ ## "path", designating the virtual
84
+ ## "location" of the request's target
85
+ ## within the application. This may be an
86
+ ## empty string, if the request URL targets
87
+ ## the application root and does not have a
88
+ ## trailing slash.
89
+
90
+ ## <tt>QUERY_STRING</tt>:: The portion of the request URL that
91
+ ## follows the <tt>?</tt>, if any. May be
92
+ ## empty, but is always required!
93
+
94
+ ## <tt>SERVER_NAME</tt>, <tt>SERVER_PORT</tt>:: When combined with <tt>SCRIPT_NAME</tt> and <tt>PATH_INFO</tt>, these variables can be used to complete the URL. Note, however, that <tt>HTTP_HOST</tt>, if present, should be used in preference to <tt>SERVER_NAME</tt> for reconstructing the request URL. <tt>SERVER_NAME</tt> and <tt>SERVER_PORT</tt> can never be empty strings, and so are always required.
95
+
96
+ ## <tt>HTTP_</tt> Variables:: Variables corresponding to the
97
+ ## client-supplied HTTP request
98
+ ## headers (i.e., variables whose
99
+ ## names begin with <tt>HTTP_</tt>). The
100
+ ## presence or absence of these
101
+ ## variables should correspond with
102
+ ## the presence or absence of the
103
+ ## appropriate HTTP header in the
104
+ ## request.
105
+
106
+ ## In addition to this, the Rack environment must include these
107
+ ## Rack-specific variables:
108
+
109
+ ## <tt>rack.version</tt>:: The Array [0,1], representing this version of Rack.
110
+ ## <tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the request URL.
111
+ ## <tt>rack.input</tt>:: See below, the input stream.
112
+ ## <tt>rack.errors</tt>:: See below, the error stream.
113
+ ## <tt>rack.multithread</tt>:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise.
114
+ ## <tt>rack.multiprocess</tt>:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise.
115
+ ## <tt>rack.run_once</tt>:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar).
116
+
117
+ ## The server or the application can store their own data in the
118
+ ## environment, too. The keys must contain at least one dot,
119
+ ## and should be prefixed uniquely. The prefix <tt>rack.</tt>
120
+ ## is reserved for use with the Rack core distribution and must
121
+ ## not be used otherwise.
122
+ ##
123
+
124
+ %w[REQUEST_METHOD SERVER_NAME SERVER_PORT
125
+ QUERY_STRING
126
+ rack.version rack.input rack.errors
127
+ rack.multithread rack.multiprocess rack.run_once].each { |header|
128
+ assert("env missing required key #{header}") { env.include? header }
129
+ }
130
+
131
+ ## The environment must not contain the keys
132
+ ## <tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
133
+ ## (use the versions without <tt>HTTP_</tt>).
134
+ %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each { |header|
135
+ assert("env contains #{header}, must use #{header[5,-1]}") {
136
+ not env.include? header
137
+ }
138
+ }
139
+
140
+ ## The CGI keys (named without a period) must have String values.
141
+ env.each { |key, value|
142
+ next if key.include? "." # Skip extensions
143
+ assert("env variable #{key} has non-string value #{value.inspect}") {
144
+ value.instance_of? String
145
+ }
146
+ }
147
+
148
+ ##
149
+ ## There are the following restrictions:
150
+
151
+ ## * <tt>rack.version</tt> must be an array of Integers.
152
+ assert("rack.version must be an Array, was #{env["rack.version"].class}") {
153
+ env["rack.version"].instance_of? Array
154
+ }
155
+ ## * <tt>rack.url_scheme</tt> must either be +http+ or +https+.
156
+ assert("rack.url_scheme unknown: #{env["rack.url_scheme"].inspect}") {
157
+ %w[http https].include? env["rack.url_scheme"]
158
+ }
159
+
160
+ ## * There must be a valid input stream in <tt>rack.input</tt>.
161
+ check_input env["rack.input"]
162
+ ## * There must be a valid error stream in <tt>rack.errors</tt>.
163
+ check_error env["rack.errors"]
164
+
165
+ ## * The <tt>REQUEST_METHOD</tt> must be one of +GET+, +POST+, +PUT+,
166
+ ## +DELETE+, +HEAD+, +OPTIONS+, +TRACE+.
167
+ assert("REQUEST_METHOD unknown: #{env["REQUEST_METHOD"]}") {
168
+ %w[GET POST PUT DELETE
169
+ HEAD OPTIONS TRACE].include?(env["REQUEST_METHOD"])
170
+ }
171
+
172
+ ## * The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
173
+ assert("SCRIPT_NAME must start with /") {
174
+ !env.include?("SCRIPT_NAME") ||
175
+ env["SCRIPT_NAME"] == "" ||
176
+ env["SCRIPT_NAME"] =~ /\A\//
177
+ }
178
+ ## * The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
179
+ assert("PATH_INFO must start with /") {
180
+ !env.include?("PATH_INFO") ||
181
+ env["PATH_INFO"] == "" ||
182
+ env["PATH_INFO"] =~ /\A\//
183
+ }
184
+ ## * The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
185
+ assert("Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}") {
186
+ !env.include?("CONTENT_LENGTH") || env["CONTENT_LENGTH"] =~ /\A\d+\z/
187
+ }
188
+
189
+ ## * One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
190
+ ## set. <tt>PATH_INFO</tt> should be <tt>/</tt> if
191
+ ## <tt>SCRIPT_NAME</tt> is empty.
192
+ assert("One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)") {
193
+ env["SCRIPT_NAME"] || env["PATH_INFO"]
194
+ }
195
+ ## <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
196
+ assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") {
197
+ env["SCRIPT_NAME"] != "/"
198
+ }
199
+ end
200
+
201
+ ## === The Input Stream
202
+ def check_input(input)
203
+ ## The input stream must respond to +gets+, +each+ and +read+.
204
+ [:gets, :each, :read].each { |method|
205
+ assert("rack.input #{input} does not respond to ##{method}") {
206
+ input.respond_to? method
207
+ }
208
+ }
209
+ end
210
+
211
+ class InputWrapper
212
+ include Assertion
213
+
214
+ def initialize(input)
215
+ @input = input
216
+ end
217
+
218
+ ## * +gets+ must be called without arguments and return a string,
219
+ ## or +nil+ on EOF.
220
+ def gets(*args)
221
+ assert("rack.input#gets called with arguments") { args.size == 0 }
222
+ v = @input.gets
223
+ assert("rack.input#gets didn't return a String") {
224
+ v.nil? or v.instance_of? String
225
+ }
226
+ v
227
+ end
228
+
229
+ ## * +read+ must be called without or with one integer argument
230
+ ## and return a string, or +nil+ on EOF.
231
+ def read(*args)
232
+ assert("rack.input#read called with too many arguments") {
233
+ args.size <= 1
234
+ }
235
+ if args.size == 1
236
+ assert("rack.input#read called with non-integer argument") {
237
+ args.first.kind_of? Integer
238
+ }
239
+ end
240
+ v = @input.read(*args)
241
+ assert("rack.input#read didn't return a String") {
242
+ v.nil? or v.instance_of? String
243
+ }
244
+ v
245
+ end
246
+
247
+ ## * +each+ must be called without arguments and only yield Strings.
248
+ def each(*args)
249
+ assert("rack.input#each called with arguments") { args.size == 0 }
250
+ @input.each { |line|
251
+ assert("rack.input#each didn't yield a String") {
252
+ line.instance_of? String
253
+ }
254
+ yield line
255
+ }
256
+ end
257
+
258
+ ## * +close+ must never be called on the input stream.
259
+ def close(*args)
260
+ assert("rack.input#close must not be called") { false }
261
+ end
262
+ end
263
+
264
+ ## === The Error Stream
265
+ def check_error(error)
266
+ ## The error stream must respond to +puts+, +write+ and +flush+.
267
+ [:puts, :write, :flush].each { |method|
268
+ assert("rack.error #{error} does not respond to ##{method}") {
269
+ error.respond_to? method
270
+ }
271
+ }
272
+ end
273
+
274
+ class ErrorWrapper
275
+ include Assertion
276
+
277
+ def initialize(error)
278
+ @error = error
279
+ end
280
+
281
+ ## * +puts+ must be called with a single argument that responds to +to_s+.
282
+ def puts(str)
283
+ @error.puts str
284
+ end
285
+
286
+ ## * +write+ must be called with a single argument that is a String.
287
+ def write(str)
288
+ assert("rack.errors#write not called with a String") { str.instance_of? String }
289
+ @error.write str
290
+ end
291
+
292
+ ## * +flush+ must be called without arguments and must be called
293
+ ## in order to make the error appear for sure.
294
+ def flush
295
+ @error.flush
296
+ end
297
+
298
+ ## * +close+ must never be called on the error stream.
299
+ def close(*args)
300
+ assert("rack.errors#close must not be called") { false }
301
+ end
302
+ end
303
+
304
+ ## == The Response
305
+
306
+ ## === The Status
307
+ def check_status(status)
308
+ ## The status, if parsed as integer (+to_i+), must be greater than or equal to 100.
309
+ assert("Status must be >=100 seen as integer") { status.to_i >= 100 }
310
+ end
311
+
312
+ ## === The Headers
313
+ def check_headers(header)
314
+ ## The header must respond to each, and yield values of key and value.
315
+ assert("headers object should respond to #each, but doesn't (got #{header.class} as headers)") {
316
+ header.respond_to? :each
317
+ }
318
+ header.each { |key, value|
319
+ ## The header keys must be Strings.
320
+ assert("header key must be a string, was #{key.class}") {
321
+ key.instance_of? String
322
+ }
323
+ ## The header must not contain a +Status+ key,
324
+ assert("header must not contain Status") { key.downcase != "status" }
325
+ ## contain keys with <tt>:</tt> or newlines in their name,
326
+ assert("header names must not contain : or \\n") { key !~ /[:\n]/ }
327
+ ## contain keys names that end in <tt>-</tt> or <tt>_</tt>,
328
+ assert("header names must not end in - or _") { key !~ /[-_]\z/ }
329
+ ## but only contain keys that consist of
330
+ ## letters, digits, <tt>_</tt> or <tt>-</tt> and start with a letter.
331
+ assert("invalid header name: #{key}") { key =~ /\A[a-zA-Z][a-zA-Z0-9_-]*\z/ }
332
+ ##
333
+ ## The values of the header must respond to #each.
334
+ assert("header values must respond to #each, but the value of " +
335
+ "'#{key}' doesn't (is #{value.class})") { value.respond_to? :each }
336
+ value.each { |item|
337
+ ## The values passed on #each must be Strings
338
+ assert("header values must consist of Strings, but '#{key}' also contains a #{item.class}") {
339
+ item.instance_of?(String)
340
+ }
341
+ ## and not contain characters below 037.
342
+ assert("invalid header value #{key}: #{item.inspect}") {
343
+ item !~ /[\000-\037]/
344
+ }
345
+ }
346
+ }
347
+ end
348
+
349
+ ## === The Content-Type
350
+ def check_content_type(status, headers)
351
+ headers.each { |key, value|
352
+ ## There must be a <tt>Content-Type</tt>, except when the
353
+ ## +Status+ is 204 or 304, in which case there must be none
354
+ ## given.
355
+ if key.downcase == "content-type"
356
+ assert("Content-Type header found in #{status} response, not allowed"){
357
+ not [204, 304].include? status.to_i
358
+ }
359
+ return
360
+ end
361
+ }
362
+ assert("No Content-Type header found") {
363
+ [204, 304].include? status.to_i
364
+ }
365
+ end
366
+
367
+ ## === The Body
368
+ def each
369
+ @closed = false
370
+ ## The Body must respond to #each
371
+ @body.each { |part|
372
+ ## and must only yield String values.
373
+ assert("Body yielded non-string value #{part.inspect}") {
374
+ part.instance_of? String
375
+ }
376
+ yield part
377
+ }
378
+ ##
379
+ ## If the Body responds to #close, it will be called after iteration.
380
+ # XXX howto: assert("Body has not been closed") { @closed }
381
+
382
+ ##
383
+ ## The Body commonly is an Array of Strings, the application
384
+ ## instance itself, or a File-like object.
385
+ end
386
+
387
+ def close
388
+ @closed = true
389
+ @body.close if @body.respond_to?(:close)
390
+ end
391
+
392
+ # :startdoc:
393
+
394
+ end
395
+ end
396
+
397
+ ## == Thanks
398
+ ## Some parts of this specification are adopted from PEP333: Python
399
+ ## Web Server Gateway Interface
400
+ ## v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank
401
+ ## everyone involved in that effort.