metry 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +376 -0
- data/README.txt +62 -0
- data/Rakefile +23 -0
- data/TODO +10 -0
- data/example/example.rb +22 -0
- data/features/app_tracking.feature +11 -0
- data/features/basic_tracking.feature +88 -0
- data/features/sample_application.feature +12 -0
- data/features/step_definitions/tracking.rb +35 -0
- data/features/step_definitions/web.rb +31 -0
- data/features/support/env.rb +22 -0
- data/lib/metry.rb +19 -0
- data/lib/metry/experiment.rb +25 -0
- data/lib/metry/memory.rb +27 -0
- data/lib/metry/rack/tracking.rb +51 -0
- data/lib/metry/tokyo.rb +153 -0
- data/radiant/example/CHANGELOG +611 -0
- data/radiant/example/CONTRIBUTORS +168 -0
- data/radiant/example/INSTALL +38 -0
- data/radiant/example/LICENSE +21 -0
- data/radiant/example/README +60 -0
- data/radiant/example/Rakefile +21 -0
- data/radiant/example/config/boot.rb +161 -0
- data/radiant/example/config/database.yml +20 -0
- data/radiant/example/config/environment.rb +83 -0
- data/radiant/example/config/environments/cucumber.rb +18 -0
- data/radiant/example/config/environments/development.rb +17 -0
- data/radiant/example/config/environments/production.rb +19 -0
- data/radiant/example/config/environments/test.rb +36 -0
- data/radiant/example/config/routes.rb +1 -0
- data/radiant/example/db/schema.rb +112 -0
- data/radiant/example/features/metry.feature +139 -0
- data/radiant/example/features/step_definitions/experiments.rb +12 -0
- data/radiant/example/features/step_definitions/radiant.rb +14 -0
- data/radiant/example/features/step_definitions/tracking.rb +35 -0
- data/radiant/example/features/step_definitions/web.rb +22 -0
- data/radiant/example/features/support/env.rb +52 -0
- data/radiant/example/public/.htaccess +40 -0
- data/radiant/example/public/404.html +8 -0
- data/radiant/example/public/500.html +8 -0
- data/radiant/example/public/dispatch.cgi +10 -0
- data/radiant/example/public/dispatch.fcgi +24 -0
- data/radiant/example/public/dispatch.rb +10 -0
- data/radiant/example/public/favicon.ico +0 -0
- data/radiant/example/public/images/admin/add-child.png +0 -0
- data/radiant/example/public/images/admin/brown-bottom-line.gif +0 -0
- data/radiant/example/public/images/admin/clear-page-cache.png +0 -0
- data/radiant/example/public/images/admin/collapse.png +0 -0
- data/radiant/example/public/images/admin/expand.png +0 -0
- data/radiant/example/public/images/admin/layout.png +0 -0
- data/radiant/example/public/images/admin/minus.png +0 -0
- data/radiant/example/public/images/admin/new-homepage.png +0 -0
- data/radiant/example/public/images/admin/new-layout.png +0 -0
- data/radiant/example/public/images/admin/new-snippet.png +0 -0
- data/radiant/example/public/images/admin/new-user.png +0 -0
- data/radiant/example/public/images/admin/page.png +0 -0
- data/radiant/example/public/images/admin/plus.png +0 -0
- data/radiant/example/public/images/admin/remove-disabled.png +0 -0
- data/radiant/example/public/images/admin/remove.png +0 -0
- data/radiant/example/public/images/admin/snippet.png +0 -0
- data/radiant/example/public/images/admin/spinner.gif +0 -0
- data/radiant/example/public/images/admin/view-site.gif +0 -0
- data/radiant/example/public/images/admin/virtual-page.png +0 -0
- data/radiant/example/public/javascripts/admin/admin.js +149 -0
- data/radiant/example/public/javascripts/admin/ruledtable.js +13 -0
- data/radiant/example/public/javascripts/admin/sitemap.js +132 -0
- data/radiant/example/public/javascripts/admin/tabcontrol.js +133 -0
- data/radiant/example/public/javascripts/application.js +2 -0
- data/radiant/example/public/javascripts/controls.js +963 -0
- data/radiant/example/public/javascripts/dragdrop.js +973 -0
- data/radiant/example/public/javascripts/effects.js +1128 -0
- data/radiant/example/public/javascripts/pngfix.js +39 -0
- data/radiant/example/public/javascripts/prototype.js +4320 -0
- data/radiant/example/public/javascripts/string.js +17 -0
- data/radiant/example/public/robots.txt +1 -0
- data/radiant/example/public/stylesheets/admin/main.css +640 -0
- data/radiant/example/script/about +3 -0
- data/radiant/example/script/autospec +5 -0
- data/radiant/example/script/breakpointer +3 -0
- data/radiant/example/script/console +3 -0
- data/radiant/example/script/cucumber +8 -0
- data/radiant/example/script/dbconsole +3 -0
- data/radiant/example/script/extension +5 -0
- data/radiant/example/script/generate +18 -0
- data/radiant/example/script/performance/benchmarker +3 -0
- data/radiant/example/script/performance/profiler +3 -0
- data/radiant/example/script/performance/request +3 -0
- data/radiant/example/script/process/inspector +3 -0
- data/radiant/example/script/process/reaper +3 -0
- data/radiant/example/script/process/spawner +3 -0
- data/radiant/example/script/process/spinner +3 -0
- data/radiant/example/script/runner +3 -0
- data/radiant/example/script/server +3 -0
- data/radiant/example/script/spec +5 -0
- data/radiant/example/script/spec_server +116 -0
- data/radiant/example/script/version +5 -0
- data/radiant/extension/README +3 -0
- data/radiant/extension/Rakefile +120 -0
- data/radiant/extension/lib/metry_tags.rb +25 -0
- data/radiant/extension/lib/tasks/metry_extension_tasks.rake +28 -0
- data/radiant/extension/metry_extension.rb +24 -0
- data/test/shared.rb +6 -0
- data/test/test_tokyo.rb +14 -0
- data/vendor/rufus-tokyo/CHANGELOG.txt +112 -0
- data/vendor/rufus-tokyo/CREDITS.txt +27 -0
- data/vendor/rufus-tokyo/LICENSE.txt +21 -0
- data/vendor/rufus-tokyo/README.txt +310 -0
- data/vendor/rufus-tokyo/Rakefile +118 -0
- data/vendor/rufus-tokyo/TODO.txt +25 -0
- data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
- data/vendor/rufus-tokyo/doc/rdoc-style.css +320 -0
- data/vendor/rufus-tokyo/lib/rufus-edo.rb +3 -0
- data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +3 -0
- data/vendor/rufus-tokyo/lib/rufus/edo.rb +39 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +106 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +333 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +219 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +159 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +36 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +4 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +137 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +141 -0
- data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +567 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +58 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +568 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +230 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +753 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +425 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +161 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +43 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +65 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +71 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +111 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +102 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +74 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +59 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +35 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +146 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +153 -0
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +162 -0
- data/vendor/rufus-tokyo/rufus-tokyo.gemspec +25 -0
- data/vendor/rufus-tokyo/spec/cabinet_spec.rb +472 -0
- data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +82 -0
- data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +447 -0
- data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +299 -0
- data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +462 -0
- data/vendor/rufus-tokyo/spec/edo_table_spec.rb +560 -0
- data/vendor/rufus-tokyo/spec/hmethods_spec.rb +44 -0
- data/vendor/rufus-tokyo/spec/incr.lua +20 -0
- data/vendor/rufus-tokyo/spec/spec.rb +9 -0
- data/vendor/rufus-tokyo/spec/spec_base.rb +23 -0
- data/vendor/rufus-tokyo/spec/start_tyrants.sh +26 -0
- data/vendor/rufus-tokyo/spec/stop_tyrants.sh +9 -0
- data/vendor/rufus-tokyo/spec/table_spec.rb +567 -0
- data/vendor/rufus-tokyo/spec/tyrant_spec.rb +309 -0
- data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +479 -0
- data/vendor/rufus-tokyo/spec/util_list_spec.rb +200 -0
- data/vendor/rufus-tokyo/spec/util_map_spec.rb +132 -0
- data/vendor/rufus-tokyo/tasks/dev.rb +70 -0
- data/vendor/rufus-tokyo/test/bm0.rb +353 -0
- data/vendor/rufus-tokyo/test/bm1_compression.rb +54 -0
- data/vendor/rufus-tokyo/test/con0.rb +30 -0
- data/vendor/rufus-tokyo/test/mem.rb +49 -0
- data/vendor/rufus-tokyo/test/mem1.rb +44 -0
- data/vendor/rufus-tokyo/test/readme0.rb +17 -0
- data/vendor/rufus-tokyo/test/readme1.rb +21 -0
- data/vendor/rufus-tokyo/test/readme2.rb +15 -0
- data/vendor/rufus-tokyo/test/readme3.rb +24 -0
- data/vendor/rufus-tokyo/test/readmes_test.sh +17 -0
- data/vendor/webrat/.document +4 -0
- data/vendor/webrat/History.txt +358 -0
- data/vendor/webrat/MIT-LICENSE.txt +19 -0
- data/vendor/webrat/README.rdoc +85 -0
- data/vendor/webrat/Rakefile +200 -0
- data/vendor/webrat/install.rb +1 -0
- data/vendor/webrat/lib/webrat.rb +31 -0
- data/vendor/webrat/lib/webrat/core.rb +14 -0
- data/vendor/webrat/lib/webrat/core/configuration.rb +102 -0
- data/vendor/webrat/lib/webrat/core/elements/area.rb +31 -0
- data/vendor/webrat/lib/webrat/core/elements/element.rb +33 -0
- data/vendor/webrat/lib/webrat/core/elements/field.rb +411 -0
- data/vendor/webrat/lib/webrat/core/elements/form.rb +103 -0
- data/vendor/webrat/lib/webrat/core/elements/label.rb +31 -0
- data/vendor/webrat/lib/webrat/core/elements/link.rb +93 -0
- data/vendor/webrat/lib/webrat/core/elements/select_option.rb +35 -0
- data/vendor/webrat/lib/webrat/core/locators.rb +20 -0
- data/vendor/webrat/lib/webrat/core/locators/area_locator.rb +38 -0
- data/vendor/webrat/lib/webrat/core/locators/button_locator.rb +54 -0
- data/vendor/webrat/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/vendor/webrat/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/vendor/webrat/lib/webrat/core/locators/field_locator.rb +25 -0
- data/vendor/webrat/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/vendor/webrat/lib/webrat/core/locators/form_locator.rb +19 -0
- data/vendor/webrat/lib/webrat/core/locators/label_locator.rb +34 -0
- data/vendor/webrat/lib/webrat/core/locators/link_locator.rb +74 -0
- data/vendor/webrat/lib/webrat/core/locators/locator.rb +20 -0
- data/vendor/webrat/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/vendor/webrat/lib/webrat/core/logging.rb +24 -0
- data/vendor/webrat/lib/webrat/core/matchers.rb +4 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_content.rb +73 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/vendor/webrat/lib/webrat/core/matchers/have_xpath.rb +147 -0
- data/vendor/webrat/lib/webrat/core/methods.rb +63 -0
- data/vendor/webrat/lib/webrat/core/mime.rb +29 -0
- data/vendor/webrat/lib/webrat/core/save_and_open_page.rb +48 -0
- data/vendor/webrat/lib/webrat/core/scope.rb +350 -0
- data/vendor/webrat/lib/webrat/core/session.rb +290 -0
- data/vendor/webrat/lib/webrat/core/xml.rb +115 -0
- data/vendor/webrat/lib/webrat/core/xml/hpricot.rb +19 -0
- data/vendor/webrat/lib/webrat/core/xml/nokogiri.rb +76 -0
- data/vendor/webrat/lib/webrat/core/xml/rexml.rb +24 -0
- data/vendor/webrat/lib/webrat/core_extensions/blank.rb +58 -0
- data/vendor/webrat/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/vendor/webrat/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/vendor/webrat/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/vendor/webrat/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/vendor/webrat/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/vendor/webrat/lib/webrat/mechanize.rb +74 -0
- data/vendor/webrat/lib/webrat/merb.rb +9 -0
- data/vendor/webrat/lib/webrat/merb_multipart_support.rb +27 -0
- data/vendor/webrat/lib/webrat/merb_session.rb +80 -0
- data/vendor/webrat/lib/webrat/rack.rb +24 -0
- data/vendor/webrat/lib/webrat/rack_test.rb +32 -0
- data/vendor/webrat/lib/webrat/rails.rb +105 -0
- data/vendor/webrat/lib/webrat/rspec-rails.rb +10 -0
- data/vendor/webrat/lib/webrat/selenium.rb +81 -0
- data/vendor/webrat/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers.rb +5 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/base.rb +46 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/external.rb +26 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/merb.rb +50 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/rails.rb +44 -0
- data/vendor/webrat/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/vendor/webrat/lib/webrat/selenium/matchers.rb +4 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/vendor/webrat/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_rc_server.rb +84 -0
- data/vendor/webrat/lib/webrat/selenium/selenium_session.rb +248 -0
- data/vendor/webrat/lib/webrat/selenium/silence_stream.rb +18 -0
- data/vendor/webrat/lib/webrat/sinatra.rb +44 -0
- data/vendor/webrat/spec/fakes/test_session.rb +34 -0
- data/vendor/webrat/spec/integration/merb/Rakefile +35 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/application.rb +2 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/exceptions.rb +13 -0
- data/vendor/webrat/spec/integration/merb/app/controllers/testing.rb +27 -0
- data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
- data/vendor/webrat/spec/integration/merb/app/views/layout/application.html.erb +12 -0
- data/vendor/webrat/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
- data/vendor/webrat/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
- data/vendor/webrat/spec/integration/merb/config/environments/development.rb +15 -0
- data/vendor/webrat/spec/integration/merb/config/environments/rake.rb +11 -0
- data/vendor/webrat/spec/integration/merb/config/environments/test.rb +14 -0
- data/vendor/webrat/spec/integration/merb/config/init.rb +25 -0
- data/vendor/webrat/spec/integration/merb/config/rack.rb +11 -0
- data/vendor/webrat/spec/integration/merb/config/router.rb +34 -0
- data/vendor/webrat/spec/integration/merb/spec/spec.opts +1 -0
- data/vendor/webrat/spec/integration/merb/spec/spec_helper.rb +24 -0
- data/vendor/webrat/spec/integration/merb/spec/webrat_spec.rb +39 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
- data/vendor/webrat/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
- data/vendor/webrat/spec/integration/rack/Rakefile +5 -0
- data/vendor/webrat/spec/integration/rack/rack_app.rb +16 -0
- data/vendor/webrat/spec/integration/rack/test/test_helper.rb +20 -0
- data/vendor/webrat/spec/integration/rack/test/webrat_rack_test.rb +67 -0
- data/vendor/webrat/spec/integration/rails/Rakefile +30 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/application.rb +15 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/links_controller.rb +7 -0
- data/vendor/webrat/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/helpers/links_helper.rb +2 -0
- data/vendor/webrat/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
- data/vendor/webrat/spec/integration/rails/app/views/fields/show.html.erb +9 -0
- data/vendor/webrat/spec/integration/rails/app/views/links/show.html.erb +5 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
- data/vendor/webrat/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
- data/vendor/webrat/spec/integration/rails/config/boot.rb +109 -0
- data/vendor/webrat/spec/integration/rails/config/environment.rb +12 -0
- data/vendor/webrat/spec/integration/rails/config/environments/development.rb +17 -0
- data/vendor/webrat/spec/integration/rails/config/environments/selenium.rb +22 -0
- data/vendor/webrat/spec/integration/rails/config/environments/test.rb +22 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/inflections.rb +10 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/mime_types.rb +5 -0
- data/vendor/webrat/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/vendor/webrat/spec/integration/rails/config/locales/en.yml +5 -0
- data/vendor/webrat/spec/integration/rails/config/routes.rb +18 -0
- data/vendor/webrat/spec/integration/rails/public/404.html +30 -0
- data/vendor/webrat/spec/integration/rails/public/422.html +30 -0
- data/vendor/webrat/spec/integration/rails/public/500.html +33 -0
- data/vendor/webrat/spec/integration/rails/script/about +4 -0
- data/vendor/webrat/spec/integration/rails/script/console +3 -0
- data/vendor/webrat/spec/integration/rails/script/dbconsole +3 -0
- data/vendor/webrat/spec/integration/rails/script/destroy +3 -0
- data/vendor/webrat/spec/integration/rails/script/generate +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/benchmarker +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/profiler +3 -0
- data/vendor/webrat/spec/integration/rails/script/performance/request +3 -0
- data/vendor/webrat/spec/integration/rails/script/plugin +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/inspector +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/reaper +3 -0
- data/vendor/webrat/spec/integration/rails/script/process/spawner +3 -0
- data/vendor/webrat/spec/integration/rails/script/runner +3 -0
- data/vendor/webrat/spec/integration/rails/script/server +3 -0
- data/vendor/webrat/spec/integration/rails/test/integration/button_click_test.rb +80 -0
- data/vendor/webrat/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
- data/vendor/webrat/spec/integration/rails/test/integration/link_click_test.rb +27 -0
- data/vendor/webrat/spec/integration/rails/test/integration/webrat_test.rb +97 -0
- data/vendor/webrat/spec/integration/rails/test/test_helper.rb +25 -0
- data/vendor/webrat/spec/integration/sinatra/Rakefile +5 -0
- data/vendor/webrat/spec/integration/sinatra/classic_app.rb +64 -0
- data/vendor/webrat/spec/integration/sinatra/modular_app.rb +16 -0
- data/vendor/webrat/spec/integration/sinatra/test/classic_app_test.rb +37 -0
- data/vendor/webrat/spec/integration/sinatra/test/modular_app_test.rb +18 -0
- data/vendor/webrat/spec/integration/sinatra/test/test_helper.rb +16 -0
- data/vendor/webrat/spec/private/core/configuration_spec.rb +116 -0
- data/vendor/webrat/spec/private/core/field_spec.rb +85 -0
- data/vendor/webrat/spec/private/core/link_spec.rb +24 -0
- data/vendor/webrat/spec/private/core/logging_spec.rb +10 -0
- data/vendor/webrat/spec/private/core/session_spec.rb +195 -0
- data/vendor/webrat/spec/private/mechanize/mechanize_session_spec.rb +81 -0
- data/vendor/webrat/spec/private/merb/attaches_file_spec.rb +93 -0
- data/vendor/webrat/spec/private/merb/merb_session_spec.rb +61 -0
- data/vendor/webrat/spec/private/nokogiri_spec.rb +77 -0
- data/vendor/webrat/spec/private/rails/attaches_file_spec.rb +81 -0
- data/vendor/webrat/spec/private/rails/rails_session_spec.rb +110 -0
- data/vendor/webrat/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/vendor/webrat/spec/public/basic_auth_spec.rb +24 -0
- data/vendor/webrat/spec/public/check_spec.rb +191 -0
- data/vendor/webrat/spec/public/choose_spec.rb +118 -0
- data/vendor/webrat/spec/public/click_area_spec.rb +106 -0
- data/vendor/webrat/spec/public/click_button_spec.rb +496 -0
- data/vendor/webrat/spec/public/click_link_spec.rb +511 -0
- data/vendor/webrat/spec/public/fill_in_spec.rb +209 -0
- data/vendor/webrat/spec/public/locators/field_by_xpath_spec.rb +19 -0
- data/vendor/webrat/spec/public/locators/field_labeled_spec.rb +172 -0
- data/vendor/webrat/spec/public/locators/field_with_id_spec.rb +16 -0
- data/vendor/webrat/spec/public/matchers/contain_spec.rb +114 -0
- data/vendor/webrat/spec/public/matchers/have_selector_spec.rb +142 -0
- data/vendor/webrat/spec/public/matchers/have_tag_spec.rb +39 -0
- data/vendor/webrat/spec/public/matchers/have_xpath_spec.rb +136 -0
- data/vendor/webrat/spec/public/reload_spec.rb +10 -0
- data/vendor/webrat/spec/public/save_and_open_spec.rb +70 -0
- data/vendor/webrat/spec/public/select_date_spec.rb +112 -0
- data/vendor/webrat/spec/public/select_datetime_spec.rb +137 -0
- data/vendor/webrat/spec/public/select_spec.rb +249 -0
- data/vendor/webrat/spec/public/select_time_spec.rb +100 -0
- data/vendor/webrat/spec/public/selenium/application_server_factory_spec.rb +49 -0
- data/vendor/webrat/spec/public/selenium/application_servers/external_spec.rb +12 -0
- data/vendor/webrat/spec/public/selenium/selenium_session_spec.rb +37 -0
- data/vendor/webrat/spec/public/set_hidden_field_spec.rb +5 -0
- data/vendor/webrat/spec/public/submit_form_spec.rb +5 -0
- data/vendor/webrat/spec/public/visit_spec.rb +58 -0
- data/vendor/webrat/spec/public/within_spec.rb +177 -0
- data/vendor/webrat/spec/rcov.opts +1 -0
- data/vendor/webrat/spec/spec.opts +2 -0
- data/vendor/webrat/spec/spec_helper.rb +50 -0
- data/vendor/webrat/vendor/selenium-server.jar +0 -0
- metadata +442 -0
data/TODO
ADDED
data/example/example.rb
ADDED
@@ -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
|
data/lib/metry/memory.rb
ADDED
@@ -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
|
data/lib/metry/tokyo.rb
ADDED
@@ -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
|