metry 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +376 -0
  3. data/README.txt +62 -0
  4. data/Rakefile +23 -0
  5. data/TODO +10 -0
  6. data/example/example.rb +22 -0
  7. data/features/app_tracking.feature +11 -0
  8. data/features/basic_tracking.feature +88 -0
  9. data/features/sample_application.feature +12 -0
  10. data/features/step_definitions/tracking.rb +35 -0
  11. data/features/step_definitions/web.rb +31 -0
  12. data/features/support/env.rb +22 -0
  13. data/lib/metry.rb +19 -0
  14. data/lib/metry/experiment.rb +25 -0
  15. data/lib/metry/memory.rb +27 -0
  16. data/lib/metry/rack/tracking.rb +51 -0
  17. data/lib/metry/tokyo.rb +153 -0
  18. data/radiant/example/CHANGELOG +611 -0
  19. data/radiant/example/CONTRIBUTORS +168 -0
  20. data/radiant/example/INSTALL +38 -0
  21. data/radiant/example/LICENSE +21 -0
  22. data/radiant/example/README +60 -0
  23. data/radiant/example/Rakefile +21 -0
  24. data/radiant/example/config/boot.rb +161 -0
  25. data/radiant/example/config/database.yml +20 -0
  26. data/radiant/example/config/environment.rb +83 -0
  27. data/radiant/example/config/environments/cucumber.rb +18 -0
  28. data/radiant/example/config/environments/development.rb +17 -0
  29. data/radiant/example/config/environments/production.rb +19 -0
  30. data/radiant/example/config/environments/test.rb +36 -0
  31. data/radiant/example/config/routes.rb +1 -0
  32. data/radiant/example/db/schema.rb +112 -0
  33. data/radiant/example/features/metry.feature +139 -0
  34. data/radiant/example/features/step_definitions/experiments.rb +12 -0
  35. data/radiant/example/features/step_definitions/radiant.rb +14 -0
  36. data/radiant/example/features/step_definitions/tracking.rb +35 -0
  37. data/radiant/example/features/step_definitions/web.rb +22 -0
  38. data/radiant/example/features/support/env.rb +52 -0
  39. data/radiant/example/public/.htaccess +40 -0
  40. data/radiant/example/public/404.html +8 -0
  41. data/radiant/example/public/500.html +8 -0
  42. data/radiant/example/public/dispatch.cgi +10 -0
  43. data/radiant/example/public/dispatch.fcgi +24 -0
  44. data/radiant/example/public/dispatch.rb +10 -0
  45. data/radiant/example/public/favicon.ico +0 -0
  46. data/radiant/example/public/images/admin/add-child.png +0 -0
  47. data/radiant/example/public/images/admin/brown-bottom-line.gif +0 -0
  48. data/radiant/example/public/images/admin/clear-page-cache.png +0 -0
  49. data/radiant/example/public/images/admin/collapse.png +0 -0
  50. data/radiant/example/public/images/admin/expand.png +0 -0
  51. data/radiant/example/public/images/admin/layout.png +0 -0
  52. data/radiant/example/public/images/admin/minus.png +0 -0
  53. data/radiant/example/public/images/admin/new-homepage.png +0 -0
  54. data/radiant/example/public/images/admin/new-layout.png +0 -0
  55. data/radiant/example/public/images/admin/new-snippet.png +0 -0
  56. data/radiant/example/public/images/admin/new-user.png +0 -0
  57. data/radiant/example/public/images/admin/page.png +0 -0
  58. data/radiant/example/public/images/admin/plus.png +0 -0
  59. data/radiant/example/public/images/admin/remove-disabled.png +0 -0
  60. data/radiant/example/public/images/admin/remove.png +0 -0
  61. data/radiant/example/public/images/admin/snippet.png +0 -0
  62. data/radiant/example/public/images/admin/spinner.gif +0 -0
  63. data/radiant/example/public/images/admin/view-site.gif +0 -0
  64. data/radiant/example/public/images/admin/virtual-page.png +0 -0
  65. data/radiant/example/public/javascripts/admin/admin.js +149 -0
  66. data/radiant/example/public/javascripts/admin/ruledtable.js +13 -0
  67. data/radiant/example/public/javascripts/admin/sitemap.js +132 -0
  68. data/radiant/example/public/javascripts/admin/tabcontrol.js +133 -0
  69. data/radiant/example/public/javascripts/application.js +2 -0
  70. data/radiant/example/public/javascripts/controls.js +963 -0
  71. data/radiant/example/public/javascripts/dragdrop.js +973 -0
  72. data/radiant/example/public/javascripts/effects.js +1128 -0
  73. data/radiant/example/public/javascripts/pngfix.js +39 -0
  74. data/radiant/example/public/javascripts/prototype.js +4320 -0
  75. data/radiant/example/public/javascripts/string.js +17 -0
  76. data/radiant/example/public/robots.txt +1 -0
  77. data/radiant/example/public/stylesheets/admin/main.css +640 -0
  78. data/radiant/example/script/about +3 -0
  79. data/radiant/example/script/autospec +5 -0
  80. data/radiant/example/script/breakpointer +3 -0
  81. data/radiant/example/script/console +3 -0
  82. data/radiant/example/script/cucumber +8 -0
  83. data/radiant/example/script/dbconsole +3 -0
  84. data/radiant/example/script/extension +5 -0
  85. data/radiant/example/script/generate +18 -0
  86. data/radiant/example/script/performance/benchmarker +3 -0
  87. data/radiant/example/script/performance/profiler +3 -0
  88. data/radiant/example/script/performance/request +3 -0
  89. data/radiant/example/script/process/inspector +3 -0
  90. data/radiant/example/script/process/reaper +3 -0
  91. data/radiant/example/script/process/spawner +3 -0
  92. data/radiant/example/script/process/spinner +3 -0
  93. data/radiant/example/script/runner +3 -0
  94. data/radiant/example/script/server +3 -0
  95. data/radiant/example/script/spec +5 -0
  96. data/radiant/example/script/spec_server +116 -0
  97. data/radiant/example/script/version +5 -0
  98. data/radiant/extension/README +3 -0
  99. data/radiant/extension/Rakefile +120 -0
  100. data/radiant/extension/lib/metry_tags.rb +25 -0
  101. data/radiant/extension/lib/tasks/metry_extension_tasks.rake +28 -0
  102. data/radiant/extension/metry_extension.rb +24 -0
  103. data/test/shared.rb +6 -0
  104. data/test/test_tokyo.rb +14 -0
  105. data/vendor/rufus-tokyo/CHANGELOG.txt +112 -0
  106. data/vendor/rufus-tokyo/CREDITS.txt +27 -0
  107. data/vendor/rufus-tokyo/LICENSE.txt +21 -0
  108. data/vendor/rufus-tokyo/README.txt +310 -0
  109. data/vendor/rufus-tokyo/Rakefile +118 -0
  110. data/vendor/rufus-tokyo/TODO.txt +25 -0
  111. data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
  112. data/vendor/rufus-tokyo/doc/rdoc-style.css +320 -0
  113. data/vendor/rufus-tokyo/lib/rufus-edo.rb +3 -0
  114. data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +3 -0
  115. data/vendor/rufus-tokyo/lib/rufus/edo.rb +39 -0
  116. data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +106 -0
  117. data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +333 -0
  118. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +219 -0
  119. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +159 -0
  120. data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +36 -0
  121. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +4 -0
  122. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +137 -0
  123. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +141 -0
  124. data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +567 -0
  125. data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +58 -0
  126. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +568 -0
  127. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +230 -0
  128. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +753 -0
  129. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +425 -0
  130. data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +161 -0
  131. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +43 -0
  132. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +65 -0
  133. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +71 -0
  134. data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +111 -0
  135. data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +102 -0
  136. data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +74 -0
  137. data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +59 -0
  138. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +35 -0
  139. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +146 -0
  140. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +153 -0
  141. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +162 -0
  142. data/vendor/rufus-tokyo/rufus-tokyo.gemspec +25 -0
  143. data/vendor/rufus-tokyo/spec/cabinet_spec.rb +472 -0
  144. data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +82 -0
  145. data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +447 -0
  146. data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +299 -0
  147. data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +462 -0
  148. data/vendor/rufus-tokyo/spec/edo_table_spec.rb +560 -0
  149. data/vendor/rufus-tokyo/spec/hmethods_spec.rb +44 -0
  150. data/vendor/rufus-tokyo/spec/incr.lua +20 -0
  151. data/vendor/rufus-tokyo/spec/spec.rb +9 -0
  152. data/vendor/rufus-tokyo/spec/spec_base.rb +23 -0
  153. data/vendor/rufus-tokyo/spec/start_tyrants.sh +26 -0
  154. data/vendor/rufus-tokyo/spec/stop_tyrants.sh +9 -0
  155. data/vendor/rufus-tokyo/spec/table_spec.rb +567 -0
  156. data/vendor/rufus-tokyo/spec/tyrant_spec.rb +309 -0
  157. data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +479 -0
  158. data/vendor/rufus-tokyo/spec/util_list_spec.rb +200 -0
  159. data/vendor/rufus-tokyo/spec/util_map_spec.rb +132 -0
  160. data/vendor/rufus-tokyo/tasks/dev.rb +70 -0
  161. data/vendor/rufus-tokyo/test/bm0.rb +353 -0
  162. data/vendor/rufus-tokyo/test/bm1_compression.rb +54 -0
  163. data/vendor/rufus-tokyo/test/con0.rb +30 -0
  164. data/vendor/rufus-tokyo/test/mem.rb +49 -0
  165. data/vendor/rufus-tokyo/test/mem1.rb +44 -0
  166. data/vendor/rufus-tokyo/test/readme0.rb +17 -0
  167. data/vendor/rufus-tokyo/test/readme1.rb +21 -0
  168. data/vendor/rufus-tokyo/test/readme2.rb +15 -0
  169. data/vendor/rufus-tokyo/test/readme3.rb +24 -0
  170. data/vendor/rufus-tokyo/test/readmes_test.sh +17 -0
  171. data/vendor/webrat/.document +4 -0
  172. data/vendor/webrat/History.txt +358 -0
  173. data/vendor/webrat/MIT-LICENSE.txt +19 -0
  174. data/vendor/webrat/README.rdoc +85 -0
  175. data/vendor/webrat/Rakefile +200 -0
  176. data/vendor/webrat/install.rb +1 -0
  177. data/vendor/webrat/lib/webrat.rb +31 -0
  178. data/vendor/webrat/lib/webrat/core.rb +14 -0
  179. data/vendor/webrat/lib/webrat/core/configuration.rb +102 -0
  180. data/vendor/webrat/lib/webrat/core/elements/area.rb +31 -0
  181. data/vendor/webrat/lib/webrat/core/elements/element.rb +33 -0
  182. data/vendor/webrat/lib/webrat/core/elements/field.rb +411 -0
  183. data/vendor/webrat/lib/webrat/core/elements/form.rb +103 -0
  184. data/vendor/webrat/lib/webrat/core/elements/label.rb +31 -0
  185. data/vendor/webrat/lib/webrat/core/elements/link.rb +93 -0
  186. data/vendor/webrat/lib/webrat/core/elements/select_option.rb +35 -0
  187. data/vendor/webrat/lib/webrat/core/locators.rb +20 -0
  188. data/vendor/webrat/lib/webrat/core/locators/area_locator.rb +38 -0
  189. data/vendor/webrat/lib/webrat/core/locators/button_locator.rb +54 -0
  190. data/vendor/webrat/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  191. data/vendor/webrat/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  192. data/vendor/webrat/lib/webrat/core/locators/field_locator.rb +25 -0
  193. data/vendor/webrat/lib/webrat/core/locators/field_named_locator.rb +41 -0
  194. data/vendor/webrat/lib/webrat/core/locators/form_locator.rb +19 -0
  195. data/vendor/webrat/lib/webrat/core/locators/label_locator.rb +34 -0
  196. data/vendor/webrat/lib/webrat/core/locators/link_locator.rb +74 -0
  197. data/vendor/webrat/lib/webrat/core/locators/locator.rb +20 -0
  198. data/vendor/webrat/lib/webrat/core/locators/select_option_locator.rb +59 -0
  199. data/vendor/webrat/lib/webrat/core/logging.rb +24 -0
  200. data/vendor/webrat/lib/webrat/core/matchers.rb +4 -0
  201. data/vendor/webrat/lib/webrat/core/matchers/have_content.rb +73 -0
  202. data/vendor/webrat/lib/webrat/core/matchers/have_selector.rb +74 -0
  203. data/vendor/webrat/lib/webrat/core/matchers/have_tag.rb +21 -0
  204. data/vendor/webrat/lib/webrat/core/matchers/have_xpath.rb +147 -0
  205. data/vendor/webrat/lib/webrat/core/methods.rb +63 -0
  206. data/vendor/webrat/lib/webrat/core/mime.rb +29 -0
  207. data/vendor/webrat/lib/webrat/core/save_and_open_page.rb +48 -0
  208. data/vendor/webrat/lib/webrat/core/scope.rb +350 -0
  209. data/vendor/webrat/lib/webrat/core/session.rb +290 -0
  210. data/vendor/webrat/lib/webrat/core/xml.rb +115 -0
  211. data/vendor/webrat/lib/webrat/core/xml/hpricot.rb +19 -0
  212. data/vendor/webrat/lib/webrat/core/xml/nokogiri.rb +76 -0
  213. data/vendor/webrat/lib/webrat/core/xml/rexml.rb +24 -0
  214. data/vendor/webrat/lib/webrat/core_extensions/blank.rb +58 -0
  215. data/vendor/webrat/lib/webrat/core_extensions/deprecate.rb +8 -0
  216. data/vendor/webrat/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  217. data/vendor/webrat/lib/webrat/core_extensions/meta_class.rb +6 -0
  218. data/vendor/webrat/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  219. data/vendor/webrat/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  220. data/vendor/webrat/lib/webrat/mechanize.rb +74 -0
  221. data/vendor/webrat/lib/webrat/merb.rb +9 -0
  222. data/vendor/webrat/lib/webrat/merb_multipart_support.rb +27 -0
  223. data/vendor/webrat/lib/webrat/merb_session.rb +80 -0
  224. data/vendor/webrat/lib/webrat/rack.rb +24 -0
  225. data/vendor/webrat/lib/webrat/rack_test.rb +32 -0
  226. data/vendor/webrat/lib/webrat/rails.rb +105 -0
  227. data/vendor/webrat/lib/webrat/rspec-rails.rb +10 -0
  228. data/vendor/webrat/lib/webrat/selenium.rb +81 -0
  229. data/vendor/webrat/lib/webrat/selenium/application_server_factory.rb +40 -0
  230. data/vendor/webrat/lib/webrat/selenium/application_servers.rb +5 -0
  231. data/vendor/webrat/lib/webrat/selenium/application_servers/base.rb +46 -0
  232. data/vendor/webrat/lib/webrat/selenium/application_servers/external.rb +26 -0
  233. data/vendor/webrat/lib/webrat/selenium/application_servers/merb.rb +50 -0
  234. data/vendor/webrat/lib/webrat/selenium/application_servers/rails.rb +44 -0
  235. data/vendor/webrat/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  236. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  237. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  238. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  239. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  240. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  241. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  242. data/vendor/webrat/lib/webrat/selenium/matchers.rb +4 -0
  243. data/vendor/webrat/lib/webrat/selenium/matchers/have_content.rb +66 -0
  244. data/vendor/webrat/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  245. data/vendor/webrat/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  246. data/vendor/webrat/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  247. data/vendor/webrat/lib/webrat/selenium/selenium_extensions.js +6 -0
  248. data/vendor/webrat/lib/webrat/selenium/selenium_rc_server.rb +84 -0
  249. data/vendor/webrat/lib/webrat/selenium/selenium_session.rb +248 -0
  250. data/vendor/webrat/lib/webrat/selenium/silence_stream.rb +18 -0
  251. data/vendor/webrat/lib/webrat/sinatra.rb +44 -0
  252. data/vendor/webrat/spec/fakes/test_session.rb +34 -0
  253. data/vendor/webrat/spec/integration/merb/Rakefile +35 -0
  254. data/vendor/webrat/spec/integration/merb/app/controllers/application.rb +2 -0
  255. data/vendor/webrat/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  256. data/vendor/webrat/spec/integration/merb/app/controllers/testing.rb +27 -0
  257. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  258. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  259. data/vendor/webrat/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  260. data/vendor/webrat/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  261. data/vendor/webrat/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  262. data/vendor/webrat/spec/integration/merb/config/environments/development.rb +15 -0
  263. data/vendor/webrat/spec/integration/merb/config/environments/rake.rb +11 -0
  264. data/vendor/webrat/spec/integration/merb/config/environments/test.rb +14 -0
  265. data/vendor/webrat/spec/integration/merb/config/init.rb +25 -0
  266. data/vendor/webrat/spec/integration/merb/config/rack.rb +11 -0
  267. data/vendor/webrat/spec/integration/merb/config/router.rb +34 -0
  268. data/vendor/webrat/spec/integration/merb/spec/spec.opts +1 -0
  269. data/vendor/webrat/spec/integration/merb/spec/spec_helper.rb +24 -0
  270. data/vendor/webrat/spec/integration/merb/spec/webrat_spec.rb +39 -0
  271. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  272. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  273. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  274. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  275. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  276. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  277. data/vendor/webrat/spec/integration/rack/Rakefile +5 -0
  278. data/vendor/webrat/spec/integration/rack/rack_app.rb +16 -0
  279. data/vendor/webrat/spec/integration/rack/test/test_helper.rb +20 -0
  280. data/vendor/webrat/spec/integration/rack/test/webrat_rack_test.rb +67 -0
  281. data/vendor/webrat/spec/integration/rails/Rakefile +30 -0
  282. data/vendor/webrat/spec/integration/rails/app/controllers/application.rb +15 -0
  283. data/vendor/webrat/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  284. data/vendor/webrat/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  285. data/vendor/webrat/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  286. data/vendor/webrat/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  287. data/vendor/webrat/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  288. data/vendor/webrat/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  289. data/vendor/webrat/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  290. data/vendor/webrat/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  291. data/vendor/webrat/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  292. data/vendor/webrat/spec/integration/rails/app/views/links/show.html.erb +5 -0
  293. data/vendor/webrat/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  294. data/vendor/webrat/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  295. data/vendor/webrat/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  296. data/vendor/webrat/spec/integration/rails/config/boot.rb +109 -0
  297. data/vendor/webrat/spec/integration/rails/config/environment.rb +12 -0
  298. data/vendor/webrat/spec/integration/rails/config/environments/development.rb +17 -0
  299. data/vendor/webrat/spec/integration/rails/config/environments/selenium.rb +22 -0
  300. data/vendor/webrat/spec/integration/rails/config/environments/test.rb +22 -0
  301. data/vendor/webrat/spec/integration/rails/config/initializers/inflections.rb +10 -0
  302. data/vendor/webrat/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  303. data/vendor/webrat/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  304. data/vendor/webrat/spec/integration/rails/config/locales/en.yml +5 -0
  305. data/vendor/webrat/spec/integration/rails/config/routes.rb +18 -0
  306. data/vendor/webrat/spec/integration/rails/public/404.html +30 -0
  307. data/vendor/webrat/spec/integration/rails/public/422.html +30 -0
  308. data/vendor/webrat/spec/integration/rails/public/500.html +33 -0
  309. data/vendor/webrat/spec/integration/rails/script/about +4 -0
  310. data/vendor/webrat/spec/integration/rails/script/console +3 -0
  311. data/vendor/webrat/spec/integration/rails/script/dbconsole +3 -0
  312. data/vendor/webrat/spec/integration/rails/script/destroy +3 -0
  313. data/vendor/webrat/spec/integration/rails/script/generate +3 -0
  314. data/vendor/webrat/spec/integration/rails/script/performance/benchmarker +3 -0
  315. data/vendor/webrat/spec/integration/rails/script/performance/profiler +3 -0
  316. data/vendor/webrat/spec/integration/rails/script/performance/request +3 -0
  317. data/vendor/webrat/spec/integration/rails/script/plugin +3 -0
  318. data/vendor/webrat/spec/integration/rails/script/process/inspector +3 -0
  319. data/vendor/webrat/spec/integration/rails/script/process/reaper +3 -0
  320. data/vendor/webrat/spec/integration/rails/script/process/spawner +3 -0
  321. data/vendor/webrat/spec/integration/rails/script/runner +3 -0
  322. data/vendor/webrat/spec/integration/rails/script/server +3 -0
  323. data/vendor/webrat/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  324. data/vendor/webrat/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  325. data/vendor/webrat/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  326. data/vendor/webrat/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  327. data/vendor/webrat/spec/integration/rails/test/test_helper.rb +25 -0
  328. data/vendor/webrat/spec/integration/sinatra/Rakefile +5 -0
  329. data/vendor/webrat/spec/integration/sinatra/classic_app.rb +64 -0
  330. data/vendor/webrat/spec/integration/sinatra/modular_app.rb +16 -0
  331. data/vendor/webrat/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  332. data/vendor/webrat/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  333. data/vendor/webrat/spec/integration/sinatra/test/test_helper.rb +16 -0
  334. data/vendor/webrat/spec/private/core/configuration_spec.rb +116 -0
  335. data/vendor/webrat/spec/private/core/field_spec.rb +85 -0
  336. data/vendor/webrat/spec/private/core/link_spec.rb +24 -0
  337. data/vendor/webrat/spec/private/core/logging_spec.rb +10 -0
  338. data/vendor/webrat/spec/private/core/session_spec.rb +195 -0
  339. data/vendor/webrat/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  340. data/vendor/webrat/spec/private/merb/attaches_file_spec.rb +93 -0
  341. data/vendor/webrat/spec/private/merb/merb_session_spec.rb +61 -0
  342. data/vendor/webrat/spec/private/nokogiri_spec.rb +77 -0
  343. data/vendor/webrat/spec/private/rails/attaches_file_spec.rb +81 -0
  344. data/vendor/webrat/spec/private/rails/rails_session_spec.rb +110 -0
  345. data/vendor/webrat/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  346. data/vendor/webrat/spec/public/basic_auth_spec.rb +24 -0
  347. data/vendor/webrat/spec/public/check_spec.rb +191 -0
  348. data/vendor/webrat/spec/public/choose_spec.rb +118 -0
  349. data/vendor/webrat/spec/public/click_area_spec.rb +106 -0
  350. data/vendor/webrat/spec/public/click_button_spec.rb +496 -0
  351. data/vendor/webrat/spec/public/click_link_spec.rb +511 -0
  352. data/vendor/webrat/spec/public/fill_in_spec.rb +209 -0
  353. data/vendor/webrat/spec/public/locators/field_by_xpath_spec.rb +19 -0
  354. data/vendor/webrat/spec/public/locators/field_labeled_spec.rb +172 -0
  355. data/vendor/webrat/spec/public/locators/field_with_id_spec.rb +16 -0
  356. data/vendor/webrat/spec/public/matchers/contain_spec.rb +114 -0
  357. data/vendor/webrat/spec/public/matchers/have_selector_spec.rb +142 -0
  358. data/vendor/webrat/spec/public/matchers/have_tag_spec.rb +39 -0
  359. data/vendor/webrat/spec/public/matchers/have_xpath_spec.rb +136 -0
  360. data/vendor/webrat/spec/public/reload_spec.rb +10 -0
  361. data/vendor/webrat/spec/public/save_and_open_spec.rb +70 -0
  362. data/vendor/webrat/spec/public/select_date_spec.rb +112 -0
  363. data/vendor/webrat/spec/public/select_datetime_spec.rb +137 -0
  364. data/vendor/webrat/spec/public/select_spec.rb +249 -0
  365. data/vendor/webrat/spec/public/select_time_spec.rb +100 -0
  366. data/vendor/webrat/spec/public/selenium/application_server_factory_spec.rb +49 -0
  367. data/vendor/webrat/spec/public/selenium/application_servers/external_spec.rb +12 -0
  368. data/vendor/webrat/spec/public/selenium/selenium_session_spec.rb +37 -0
  369. data/vendor/webrat/spec/public/set_hidden_field_spec.rb +5 -0
  370. data/vendor/webrat/spec/public/submit_form_spec.rb +5 -0
  371. data/vendor/webrat/spec/public/visit_spec.rb +58 -0
  372. data/vendor/webrat/spec/public/within_spec.rb +177 -0
  373. data/vendor/webrat/spec/rcov.opts +1 -0
  374. data/vendor/webrat/spec/spec.opts +2 -0
  375. data/vendor/webrat/spec/spec_helper.rb +50 -0
  376. data/vendor/webrat/vendor/selenium-server.jar +0 -0
  377. metadata +442 -0
@@ -0,0 +1,425 @@
1
+ #--
2
+ # Copyright (c) 2009, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ require 'rufus/tokyo/hmethods'
27
+
28
+
29
+ module Rufus::Tokyo
30
+
31
+ #
32
+ # :nodoc:
33
+ #
34
+ module ListMapMixin
35
+
36
+ # A shortcut
37
+ #
38
+ def clib
39
+
40
+ CabinetLib
41
+ end
42
+
43
+ # Returns the underlying 'native' (FFI) memory pointer
44
+ #
45
+ def pointer
46
+
47
+ @pointer
48
+ end
49
+
50
+ def pointer_or_raise
51
+
52
+ @pointer || raise("#{self.class} got freed, cannot use anymore")
53
+ end
54
+
55
+ def outlen_op (method, *args)
56
+
57
+ args.unshift(pointer_or_raise)
58
+
59
+ outlen = FFI::MemoryPointer.new(:int)
60
+ args << outlen
61
+
62
+ out = clib.send(method, *args)
63
+
64
+ return nil if out.address == 0
65
+
66
+ return out.get_bytes(0, outlen.get_int(0))
67
+
68
+ ensure
69
+
70
+ outlen.free
71
+ end
72
+ end
73
+
74
+ #
75
+ # A Tokyo Cabinet in-memory (tcutil.h) map
76
+ #
77
+ # http://tokyocabinet.sourceforge.net/spex-en.html#tcutilapi
78
+ #
79
+ class Map
80
+
81
+ include HashMethods
82
+ include ListMapMixin
83
+
84
+ # Creates an empty instance of a Tokyo Cabinet in-memory map
85
+ #
86
+ # (It's OK to pass the pointer of a C map directly, this is in fact
87
+ # used in rufus/tokyo/table when retrieving entries)
88
+ #
89
+ def initialize (pointer=nil)
90
+
91
+ @pointer = pointer || clib.tcmapnew
92
+ end
93
+
94
+ # Inserts key/value pair
95
+ #
96
+ def []= (k, v)
97
+
98
+ clib.tcmapput(pointer, k, Rufus::Tokyo::blen(k), v, Rufus::Tokyo::blen(v))
99
+
100
+ v
101
+ end
102
+
103
+ # Deletes an entry
104
+ #
105
+ def delete (k)
106
+
107
+ v = self[k]
108
+ return nil unless v
109
+
110
+ (clib.tcmapout(pointer_or_raise, k, Rufus::Tokyo::blen(k)) == 1) ||
111
+ raise("failed to remove key '#{k}'")
112
+
113
+ v
114
+ end
115
+
116
+ # Empties the map
117
+ #
118
+ def clear
119
+
120
+ clib.tcmapclear(pointer_or_raise)
121
+ end
122
+
123
+ # (the actual #[] method is provided by HashMethods)
124
+ #
125
+ def get (k)
126
+
127
+ outlen_op(:tcmapget, k, Rufus::Tokyo.blen(k))
128
+ end
129
+ protected :get
130
+
131
+ # Returns an array of all the keys in the map
132
+ #
133
+ def keys
134
+
135
+ clib.tcmapiterinit(pointer_or_raise)
136
+ a = []
137
+
138
+ klen = FFI::MemoryPointer.new(:int)
139
+
140
+ loop do
141
+ k = clib.tcmapiternext(@pointer, klen)
142
+ break if k.address == 0
143
+ a << k.get_bytes(0, klen.get_int(0))
144
+ end
145
+
146
+ return a
147
+
148
+ ensure
149
+
150
+ klen.free
151
+ end
152
+
153
+ # Returns the count of entries in the map
154
+ #
155
+ def size
156
+
157
+ clib.tcmaprnum(pointer_or_raise)
158
+ end
159
+
160
+ alias :length :size
161
+
162
+ # Frees the map (nukes it from memory)
163
+ #
164
+ def free
165
+
166
+ clib.tcmapdel(pointer_or_raise)
167
+ @pointer = nil
168
+ end
169
+
170
+ alias :destroy :free
171
+ alias :close :free
172
+
173
+ # Turns a given Tokyo map structure into a Ruby Hash. By default
174
+ # (free = true) will dispose of the map before replying with the Ruby
175
+ # Hash.
176
+ #
177
+ def self.to_h (map_pointer, free=true)
178
+
179
+ m = self.new(map_pointer)
180
+ h = m.to_h
181
+ m.free if free
182
+
183
+ h
184
+ end
185
+
186
+ # Turns a Ruby hash into a Tokyo Cabinet Map and returns it
187
+ # (don't forget to free the map when you're done with it !)
188
+ #
189
+ def self.from_h (h)
190
+
191
+ h.inject(Map.new) { |m, (k, v)| m[k] = v; m }
192
+ end
193
+
194
+ # Behaves much like Hash#[] but outputs a Rufus::Tokyo::Map
195
+ # (don't forget to free the map when you're done with it !)
196
+ #
197
+ def self.[] (*h_or_a)
198
+
199
+ if h_or_a.is_a?(Array) && h_or_a.size == 1 && h_or_a.first.is_a?(Array)
200
+ h_or_a = h_or_a.first
201
+ end
202
+
203
+ from_h(::Hash[*h_or_a])
204
+ end
205
+ end
206
+
207
+ #
208
+ # A Tokyo Cabinet in-memory (tcutil.h) list
209
+ #
210
+ # http://tokyocabinet.sourceforge.net/spex-en.html#tcutilapi
211
+ #
212
+ class List
213
+
214
+ include Enumerable
215
+ include ListMapMixin
216
+
217
+ # Creates a new Tokyo Cabinet list.
218
+ #
219
+ # (by passing a list pointer, one can wrap an existing list pointer
220
+ # into a handy instance of this class)
221
+ #
222
+ def initialize (list_pointer=nil)
223
+
224
+ if list_pointer.is_a?(FFI::Pointer)
225
+ @pointer = list_pointer
226
+ else
227
+ @pointer = clib.tclistnew
228
+ list_pointer.each { |e| self << e } if list_pointer
229
+ end
230
+ end
231
+
232
+ # Inserts an element in the list (note that the lib will raise an
233
+ # ArgumentError if s is not a String)
234
+ #
235
+ def << (s)
236
+
237
+ clib.tclistpush(@pointer, s, Rufus::Tokyo.blen(s))
238
+
239
+ self
240
+ end
241
+
242
+ # Pushes an argument or a list of arguments to this list
243
+ #
244
+ def push (*args)
245
+
246
+ args.each { |a| self << a }
247
+
248
+ self
249
+ end
250
+
251
+ # Pops the last element in the list
252
+ #
253
+ def pop
254
+
255
+ outlen_op(:tclistpop)
256
+ end
257
+
258
+ # Removes and returns the first element in a list
259
+ #
260
+ def shift
261
+
262
+ #clib.tclistshift2(@pointer) rescue nil
263
+ outlen_op(:tclistshift)
264
+ end
265
+
266
+ # Inserts a string at the beginning of the list
267
+ #
268
+ def unshift (s)
269
+
270
+ clib.tclistunshift(@pointer, s, Rufus::Tokyo.blen(s))
271
+
272
+ self
273
+ end
274
+
275
+ # The put operation.
276
+ #
277
+ def []= (a, b, c=nil)
278
+
279
+ i, s = c.nil? ? [ a, b ] : [ [a, b], c ]
280
+
281
+ range = if i.is_a?(Range)
282
+ i
283
+ elsif i.is_a?(Array)
284
+ start, count = i
285
+ (start..start + count - 1)
286
+ else
287
+ [ i ]
288
+ end
289
+
290
+ range = norm(range)
291
+
292
+ values = s.is_a?(Array) ? s : [ s ]
293
+ # not "values = Array(s)"
294
+
295
+ range.each_with_index do |offset, index|
296
+ val = values[index]
297
+ if val
298
+ clib.tclistover(@pointer, offset, val, Rufus::Tokyo.blen(val))
299
+ else
300
+ outlen_op(:tclistremove, values.size)
301
+ end
302
+ end
303
+
304
+ self
305
+ end
306
+
307
+ # Removes the value at a given index and returns the value
308
+ # (returns nil if no value available)
309
+ #
310
+ def delete_at (i)
311
+
312
+ outlen_op(:tclistremove, i)
313
+ end
314
+
315
+ def delete_if
316
+ # TODO
317
+ end
318
+
319
+ def slice
320
+ # TODO
321
+ end
322
+ def slice!
323
+ # TODO
324
+ end
325
+
326
+ # Returns the size of this Tokyo Cabinet list
327
+ #
328
+ def size
329
+
330
+ clib.tclistnum(@pointer)
331
+ end
332
+
333
+ alias :length :size
334
+
335
+ # The equivalent of Ruby Array#[]
336
+ #
337
+ def [] (i, count=nil)
338
+
339
+ return nil if (count != nil) && count < 1
340
+
341
+ len = self.size
342
+
343
+ range = if count.nil?
344
+ i.is_a?(Range) ? i : [i]
345
+ else
346
+ (i..i + count - 1)
347
+ end
348
+
349
+ r = norm(range).collect { |i| outlen_op(:tclistval, i) }
350
+
351
+ range.first == range.last ? r.first : r
352
+ end
353
+
354
+ # Empties the list.
355
+ #
356
+ def clear
357
+
358
+ clib.tclistclear(@pointer)
359
+ end
360
+
361
+ # The classical each.
362
+ #
363
+ def each
364
+
365
+ (0..self.size - 1).each { |i| yield self[i] }
366
+ end
367
+
368
+ # Turns this Tokyo Cabinet list into a Ruby array
369
+ #
370
+ def to_a
371
+
372
+ self.collect { |e| e }
373
+ end
374
+
375
+ # Closes (frees) this list
376
+ #
377
+ def free
378
+
379
+ self.class.free(@pointer)
380
+ @pointer = nil
381
+ end
382
+
383
+ alias :close :free
384
+ alias :destroy :free
385
+
386
+ # Frees (closes) the given 'native' (FFI) list (memory pointer)
387
+ #
388
+ def self.free (list_pointer)
389
+
390
+ CabinetLib.tclistdel(list_pointer)
391
+ end
392
+
393
+ # Closes (frees memory from it) this list and returns the ruby version
394
+ # of it
395
+ #
396
+ def release
397
+
398
+ a = self.to_a
399
+ self.close
400
+ a
401
+ end
402
+
403
+ # Turns a list pointer into a Ruby Array instance (and makes sure to
404
+ # release the pointer
405
+ #
406
+ def self.release (list_pointer)
407
+
408
+ Rufus::Tokyo::List.new(list_pointer).release
409
+ end
410
+
411
+ protected
412
+
413
+ # Makes sure this offset/range fits the size of the list
414
+ #
415
+ def norm (i)
416
+ l = self.length
417
+ case i
418
+ when Range then ((i.first % l)..(i.last % l))
419
+ when Array then [ i.first % l ]
420
+ else i % l
421
+ end
422
+ end
423
+ end
424
+ end
425
+
@@ -0,0 +1,161 @@
1
+ #--
2
+ # Copyright (c) 2009, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Rufus
27
+ module Tokyo
28
+
29
+ #
30
+ # Methods for setting up / tuning a Cabinet.
31
+ #
32
+ module CabinetConfig
33
+
34
+ protected
35
+
36
+ # Given a path, a hash of parameters and a suffix,
37
+ #
38
+ # a) makes sure that the path has the given suffix or raises an exception
39
+ # b) gathers params found in the path (#) or in params
40
+ # c) determines the config as set by the parameters
41
+ #
42
+ # Suffix is optional, if present, it will be enforced.
43
+ #
44
+ def determine_conf (path, params, required_type=nil)
45
+
46
+ if path.index('#')
47
+
48
+ ss = path.split('#')
49
+ path = ss.shift
50
+
51
+ ss.each { |p| pp = p.split('='); params[pp[0]] = pp[1] }
52
+ end
53
+
54
+ params = params.inject({}) { |h, (k, v)| h[k.to_sym] = v; h }
55
+
56
+ [
57
+ {
58
+ :params => params,
59
+ :mode => determine_open_mode(params),
60
+ :mutex => (params[:mutex].to_s == 'true'),
61
+ #:indexes => params[:idx] || params[:indexes],
62
+ :xmsiz => (params[:xmsiz] || 67108864).to_i,
63
+ },
64
+ determine_type_and_path(path, params, required_type),
65
+ determine_tuning_values(params),
66
+ determine_cache_values(params)
67
+
68
+ ].inject({}) { |h, hh| h.merge(hh) }
69
+ end
70
+
71
+ def determine_open_mode (params) #:nodoc#
72
+
73
+ mode = params[:mode].to_s
74
+ mode = 'wc' if mode.size < 1
75
+
76
+ {
77
+ 'r' => (1 << 0), # open as a reader
78
+ 'w' => (1 << 1), # open as a writer
79
+ 'c' => (1 << 2), # writer creating
80
+ 't' => (1 << 3), # writer truncating
81
+ 'e' => (1 << 4), # open without locking
82
+ 'f' => (1 << 5), # lock without blocking
83
+ 's' => (1 << 6), # synchronize every transaction (tctdb.h)
84
+
85
+ }.inject(0) { |r, (c, v)|
86
+
87
+ r = r | v if mode.index(c); r
88
+ }
89
+ end
90
+
91
+ def determine_tuning_values (params) #:nodoc#
92
+
93
+ o = params[:opts] || ''
94
+ o = {
95
+ 'l' => 1 << 0, # large
96
+ 'd' => 1 << 1, # deflate
97
+ 'b' => 1 << 2, # bzip2
98
+ 't' => 1 << 3, # tcbs
99
+ 'x' => 1 << 4
100
+ }.inject(0) { |i, (k, v)| i = i | v if o.index(k); i }
101
+
102
+ {
103
+ :bnum => (params[:bnum] || 131071).to_i,
104
+ :apow => (params[:apow] || 4).to_i,
105
+ :fpow => (params[:fpow] || 10).to_i,
106
+ :opts => o,
107
+
108
+ :lmemb => (params[:lmemb] || 128).to_i,
109
+ # number of members in each leaf page (:btree)
110
+ :nmemb => (params[:nmemb] || 256).to_i,
111
+ # number of members in each non-leaf page (:btree)
112
+
113
+ :width => (params[:width] || 255).to_i,
114
+ # width of the value of each record (:fixed)
115
+ :limsiz => (params[:limsiz] || 26_8435_456).to_i,
116
+ # limit size of the database file (:fixed)
117
+
118
+ :dfunit => (params[:dfunit] || 0).to_i
119
+ # unit step number. If it is not more than 0,
120
+ # the auto defragmentation is disabled.
121
+ }
122
+ end
123
+
124
+ def determine_cache_values (params) #:nodoc#
125
+
126
+ {
127
+ :rcnum => params[:rcnum].to_i,
128
+ :lcnum => (params[:lcnum] || 2048).to_i,
129
+ :ncnum => (params[:ncnum] || 512).to_i
130
+ }
131
+ end
132
+
133
+ CABINET_SUFFIXES = {
134
+ :hash => '.tch', :btree => '.tcb', :fixed => '.tcf', :table => '.tct'
135
+ }
136
+
137
+ CABINET_TYPES = CABINET_SUFFIXES.invert
138
+
139
+ def determine_type_and_path (path, params, required_type) #:nodoc#
140
+
141
+ type = required_type || params[:type]
142
+ ext = File.extname(path)
143
+
144
+ if ext == ''
145
+ suffix = CABINET_SUFFIXES[type]
146
+ path = path + suffix
147
+ else
148
+ suffix = ext
149
+ type ||= CABINET_TYPES[ext]
150
+ end
151
+
152
+ raise "path '#{path}' must be suffixed with #{suffix}" \
153
+ if suffix and File.extname(path) != suffix
154
+
155
+ { :path => path, :type => type }
156
+ end
157
+ end
158
+
159
+ end
160
+ end
161
+