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.
- 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
|
@@ -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
|
+
|