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
data/TODO ADDED
@@ -0,0 +1,10 @@
1
+ More unit tests
2
+
3
+ Add support for non-pageview event tracking
4
+ Via in-process call
5
+ Via web request
6
+
7
+ Add support for MongoDB
8
+ Add support for Tokyo Tyrant
9
+
10
+ Metry visitors can be spoofed - fix it
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+
4
+ require File.dirname(__FILE__) + '/../lib/metry'
5
+
6
+ configure do
7
+ Metry.init Metry::Tokyo.new("tracking")
8
+ #Metry.init Metry::Memory.new
9
+ use Metry::Rack::Tracking
10
+ end
11
+
12
+ get '/' do
13
+ "Root"
14
+ end
15
+
16
+ get '/subpage' do
17
+ "Sub page"
18
+ end
19
+
20
+ get '/extra' do
21
+ request.env["metry.event"]["extra"] = params[:track]
22
+ end
@@ -0,0 +1,11 @@
1
+ Feature: Application Tracking
2
+ In order to tie my tracking in with interesting application-level stats
3
+ As an application developer
4
+ I want to track additional facets of data from my application
5
+
6
+ Scenario: Track an additional facet
7
+ Given an empty tracking database
8
+ When I view "/extra?track=stuff"
9
+ Then there should be a tracking event "1":
10
+ | key | value |
11
+ | extra | stuff |
@@ -0,0 +1,88 @@
1
+ Feature: Access Tracking
2
+ In order to how users are using my site
3
+ As an web application creator
4
+ I want to have all accesses to my application tracked
5
+
6
+ Background:
7
+ Given an empty tracking database
8
+ And I am a new visitor
9
+
10
+ Scenario: Single gets are tracked
11
+ When I view "/"
12
+ Then there should be 1 tracking event
13
+
14
+ Scenario: Multiple gets are tracked
15
+ When I view "/"
16
+ And I view "/"
17
+ And I view "/"
18
+ Then there should be 3 tracking events
19
+
20
+ Scenario: Basic request data is tracked
21
+ When I view "/"
22
+ And I view "/subpage"
23
+ Then there should be a tracking event "1":
24
+ | key | value |
25
+ | path | / |
26
+ | time | _exists_ |
27
+ And there should be a tracking event "2":
28
+ | key | value |
29
+ | path | /subpage |
30
+ | time | _exists_ |
31
+
32
+ Scenario: New visitor is tracked
33
+ When I view "/"
34
+ And I view "/subpage"
35
+ Then there should be a tracking event "1":
36
+ | key | value |
37
+ | visitor | 1 |
38
+ And there should be a tracking event "2":
39
+ | key | value |
40
+ | visitor | 1 |
41
+
42
+ Scenario: Two visitors are tracked
43
+ Given I view "/"
44
+ When I am a new visitor
45
+ Given I view "/"
46
+ Then there should be a tracking event "1":
47
+ | key | value |
48
+ | visitor | 1 |
49
+ And there should be a tracking event "2":
50
+ | key | value |
51
+ | visitor | 2 |
52
+
53
+ Scenario: All facets should be tracked
54
+ When I view "/"
55
+ Then there should be a tracking event "1":
56
+ | key | value |
57
+ | path | / |
58
+ | time | _exists_ |
59
+ | ip | 127.0.0.1 |
60
+ | host | example.org |
61
+
62
+ Scenario: path should include query string
63
+ When I view "/?here=there"
64
+ Then there should be a tracking event "1":
65
+ | key | value |
66
+ | path | /?here=there |
67
+
68
+ Scenario: Should track status codes
69
+ When I view "/"
70
+ And I view "/missing"
71
+ Then there should be a tracking event "1":
72
+ | key | value |
73
+ | status | 200 |
74
+ Then there should be a tracking event "2":
75
+ | key | value |
76
+ | status | 404 |
77
+
78
+ Scenario: Should track method
79
+ When I view "/"
80
+ And I post to "/post":
81
+ | key | value |
82
+ | bogus | bogus |
83
+ Then there should be a tracking event "1":
84
+ | key | value |
85
+ | method | GET |
86
+ Then there should be a tracking event "2":
87
+ | key | value |
88
+ | method | POST |
@@ -0,0 +1,12 @@
1
+ Feature: Basic Sinatra application works
2
+ In order to test rack middleware
3
+ As a middleware creator
4
+ I want an example application that I can test against
5
+
6
+ Scenario: Get root
7
+ When I view "/"
8
+ Then I should see "Root"
9
+
10
+ Scenario: Get subpage
11
+ When I view "/subpage"
12
+ Then I should see "Sub page"
@@ -0,0 +1,35 @@
1
+ Given /^an empty tracking database$/ do
2
+ Metry.current.clear
3
+ end
4
+
5
+ Then /^there should be (\d+) tracking events?$/ do |event_count|
6
+ assert_equal(event_count.to_i, Metry.current.event_count)
7
+ end
8
+
9
+ When /^there should be a tracking event "(\d+)":$/ do |id, table|
10
+ event = Metry.current[id]
11
+ assert event, "Unable to lookup event #{id}."
12
+ table.hashes.each do |hash|
13
+ expected = hash["value"]
14
+ case expected
15
+ when "_exists_"
16
+ assert event[hash["key"]], "Key #{hash["key"]} does not exist."
17
+ else
18
+ assert_equal expected, event[hash["key"]], "Key #{hash["key"]} does not match."
19
+ end
20
+ end
21
+ end
22
+
23
+ Then /^there should be a visitor "([^\"]*)":$/ do |id, table|
24
+ visitor = Metry.current.visitor(id)
25
+ assert visitor, "Unable to lookup visitor #{id}."
26
+ table.hashes.each do |hash|
27
+ expected = hash["value"]
28
+ case expected
29
+ when "_exists_"
30
+ assert visitor[hash["key"]], "Key #{hash["key"]} does not exist."
31
+ else
32
+ assert_equal expected, visitor[hash["key"]], "Key #{hash["key"]} does not match."
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ Given /^I am a new visitor$/ do
2
+ clear_cookies
3
+ end
4
+
5
+ When /^I view "([^\"]*)"$/ do |path|
6
+ visit(path)
7
+ end
8
+
9
+ When /^I (post|put) to "([^\"]*)":$/ do |meth, path, params|
10
+ send(meth, path, params.hashes.inject({}){|h,e| h[e["key"]] = e["value"]; h})
11
+ end
12
+
13
+ Then /^I should see "([^\"]*)"$/ do |string|
14
+ assert_match(string, last_response.body)
15
+ end
16
+
17
+ When /^I follow "([^\"]*)"$/ do |link|
18
+ click_link(link)
19
+ end
20
+
21
+ When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
22
+ fill_in(field, :with => value)
23
+ end
24
+
25
+ When /^I press "([^\"]*)"$/ do |button|
26
+ click_button(button)
27
+ end
28
+
29
+ Then /^I should be on "([^\"]*)"$/ do |path|
30
+ assert_equal path, last_response.path
31
+ end
@@ -0,0 +1,22 @@
1
+ require 'test/unit/assertions'
2
+ World(Test::Unit::Assertions)
3
+
4
+ require 'rack/test'
5
+
6
+ $: << File.dirname(__FILE__) + "/../../vendor/webrat/lib"
7
+ require 'webrat'
8
+ require 'logger'
9
+ Webrat.configure do |config|
10
+ config.mode = :rack_test
11
+ end
12
+
13
+ World(Rack::Test::Methods)
14
+ World(Webrat::Methods)
15
+ World(Webrat::Matchers)
16
+
17
+ require File.dirname(__FILE__) + '/../../example/example.rb'
18
+ def app
19
+ Rack::Builder.new do
20
+ run Sinatra::Application
21
+ end
22
+ end
data/lib/metry.rb ADDED
@@ -0,0 +1,19 @@
1
+ $: << File.dirname(__FILE__)
2
+ $: << File.dirname(__FILE__) + '/../vendor/rufus-tokyo/lib'
3
+
4
+ require 'metry/rack/tracking'
5
+ require 'metry/memory'
6
+ require 'metry/tokyo'
7
+ require 'metry/experiment'
8
+
9
+ module Metry
10
+ VERSION = '1.0.0'
11
+
12
+ def self.init(storage)
13
+ @storage = storage
14
+ end
15
+
16
+ def self.current
17
+ @storage
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module Metry
2
+ class Experiment
3
+ METHODS = {
4
+ "rand" => proc{|list, visitor| list.sort_by{rand}.first},
5
+ "mod_visitor" => proc{|list, visitor| list[(visitor.to_i-1)%list.size]},
6
+ }
7
+
8
+ def initialize(name, event)
9
+ @key = "experiment.#{name}"
10
+ @event = event
11
+ @visitor = event["visitor"]
12
+ @storage = Metry.current
13
+ end
14
+
15
+ def choose(options, method=nil)
16
+ visitor_hash = @storage.visitor(@visitor)
17
+ unless choice = visitor_hash[@key]
18
+ choice = METHODS[method || "rand"][options.keys, @visitor]
19
+ @storage.save_visitor(@visitor, visitor_hash.merge(@key => choice))
20
+ end
21
+ @event[@key] = choice
22
+ options[choice]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Metry
2
+ class Memory
3
+ def initialize
4
+ clear
5
+ end
6
+
7
+ def <<(event)
8
+ @hash[:events][(@hash[:event] += 1).to_s] = event
9
+ end
10
+
11
+ def size
12
+ @hash[:events].size
13
+ end
14
+
15
+ def [](id)
16
+ @hash[:events][id]
17
+ end
18
+
19
+ def next_visitor
20
+ @hash[:visitor] += 1
21
+ end
22
+
23
+ def clear
24
+ @hash = {:events => {}, :visitor => 0, :event => 0}
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,51 @@
1
+ module Metry
2
+ module Rack
3
+ class Tracking
4
+ COOKIE = "_metry"
5
+
6
+ def initialize(app)
7
+ @app = app
8
+ @storage = Metry.current
9
+ end
10
+
11
+ def call(env)
12
+ request = ::Rack::Request.new(env)
13
+ visitor = find_visitor(request)
14
+ env["metry.event"] = event = build_event(visitor, request, env)
15
+
16
+ status, headers, body = @app.call(env)
17
+
18
+ event["status"] = status.to_s
19
+ @storage << event
20
+
21
+ response = ::Rack::Response.new(body, status, headers)
22
+ save_visitor(response, visitor)
23
+
24
+ response.to_a
25
+ end
26
+
27
+ def build_event(visitor, request, env)
28
+ { "event" => "pageview",
29
+ "path" => request.fullpath,
30
+ "time" => Time.now.to_f.to_s.sub(/\.(\d+)/){|m| [$1[0...5].ljust(5, "0")]},
31
+ "visitor" => visitor,
32
+ "ip" => request.ip,
33
+ "host" => request.host,
34
+ "method" => request.request_method,
35
+ "referrer" => env["HTTP_REFERER"],
36
+ "user_agent" => env["HTTP_USER_AGENT"] }
37
+ end
38
+
39
+ def find_visitor(request)
40
+ (request.cookies[COOKIE] || @storage.next_visitor.to_s)
41
+ end
42
+
43
+ def save_visitor(response, visitor)
44
+ response.set_cookie(COOKIE,
45
+ :value => visitor,
46
+ :expires => (Time.now+(60*60*24*365*20)),
47
+ :path => '/')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,153 @@
1
+ require 'rubygems'
2
+ require 'rufus/tokyo'
3
+ require 'rufus/edo'
4
+
5
+ require 'fileutils'
6
+
7
+ module Metry
8
+ class Tokyo
9
+ EVENT_PREFIX = "event_"
10
+ VISITOR_PREFIX = "visitor_"
11
+ META_PREFIX = "meta_"
12
+
13
+ def initialize(file, interface="Edo")
14
+ FileUtils.mkdir_p(::File.dirname(file))
15
+ @file = "#{file}.tdb"
16
+ @store = Rufus.const_get(interface)::Table
17
+ end
18
+
19
+ def next_visitor
20
+ write do |storage|
21
+ storage.incr("#{META_PREFIX}visitor")
22
+ end
23
+ end
24
+
25
+ def visitor(id)
26
+ read do |storage|
27
+ (storage[visitor_id(id)] || {})
28
+ end
29
+ end
30
+
31
+ def save_visitor(id, hash)
32
+ write do |storage|
33
+ storage[visitor_id(id)] = hash
34
+ end
35
+ end
36
+
37
+ def <<(event)
38
+ write do |storage|
39
+ storage[next_event_id(storage)] = event.inject({}){|a,(k,v)| a[k] = v.to_s; a}
40
+ end
41
+ end
42
+
43
+ def [](id)
44
+ read do |storage|
45
+ storage[event_id(id)]
46
+ end
47
+ end
48
+
49
+ def event_count
50
+ read do |storage|
51
+ storage.keys(:prefix => EVENT_PREFIX).size
52
+ end
53
+ end
54
+
55
+ def last_events(count=1)
56
+ read do |storage|
57
+ storage.query do |q|
58
+ q.add '', :starts_with, EVENT_PREFIX
59
+ q.order_by "time", :numdesc
60
+ q.limit count
61
+ end.to_a
62
+ end
63
+ end
64
+
65
+ def all_events
66
+ read do |storage|
67
+ storage.query do |q|
68
+ q.add '', :starts_with, EVENT_PREFIX
69
+ end.to_a
70
+ end
71
+ end
72
+
73
+ def clear
74
+ write do |storage|
75
+ storage.clear
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def next_event_id(storage)
82
+ event_id(storage.incr("#{META_PREFIX}event"))
83
+ end
84
+
85
+ def access(mode)
86
+ storage = @store.new(@file, :mode => mode)
87
+ begin
88
+ result = yield(storage)
89
+ ensure
90
+ storage.close
91
+ end
92
+ result
93
+ end
94
+
95
+ def read(&block)
96
+ access("rc", &block)
97
+ end
98
+
99
+ def write(&block)
100
+ access("wc", &block)
101
+ end
102
+
103
+ def visitor_id(id)
104
+ "#{VISITOR_PREFIX}#{id}"
105
+ end
106
+
107
+ def event_id(id)
108
+ "#{EVENT_PREFIX}#{id}"
109
+ end
110
+ end
111
+ end
112
+
113
+ module Rufus::Tokyo
114
+ class Table
115
+ # Increments the value stored under the given key with the given increment
116
+ # (defaults to 1 (integer)).
117
+ #
118
+ # Accepts an integer or a double value.
119
+ #
120
+ def incr (key, inc=1)
121
+
122
+ v = inc.is_a?(Fixnum) ?
123
+ lib.addint(@db, key, Rufus::Tokyo.blen(key), inc) :
124
+ lib.adddouble(@db, key, Rufus::Tokyo.blen(key), inc)
125
+
126
+ raise(TokyoError.new(
127
+ "incr failed, there is probably already a string value set " +
128
+ "for the key '#{key}'"
129
+ )) if v == Rufus::Tokyo::INT_MIN || (v.respond_to?(:nan?) && v.nan?)
130
+
131
+ v
132
+ end
133
+ end
134
+ end
135
+
136
+ module Rufus::Edo
137
+ class Table
138
+ # Increments the value stored under the given key with the given increment
139
+ # (defaults to 1 (integer)).
140
+ #
141
+ def incr (key, val=1)
142
+
143
+ v = val.is_a?(Fixnum) ? @db.addint(key, val) : @db.adddouble(key, val)
144
+
145
+ raise(EdoError.new(
146
+ "incr failed, there is probably already a string value set " +
147
+ "for the key '#{key}'"
148
+ )) unless v
149
+
150
+ v
151
+ end
152
+ end
153
+ end