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
@@ -0,0 +1,58 @@
|
|
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 'ffi' # sudo gem install ffi
|
27
|
+
|
28
|
+
|
29
|
+
module Rufus
|
30
|
+
module Tokyo
|
31
|
+
|
32
|
+
VERSION = '0.1.14'
|
33
|
+
|
34
|
+
#
|
35
|
+
# A common error class
|
36
|
+
#
|
37
|
+
class TokyoError < RuntimeError; end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Grumpf, this is not elegant...
|
41
|
+
#
|
42
|
+
INT_MIN = -2147483648
|
43
|
+
|
44
|
+
# Returns 'bytesize' of the string (Ruby 1.9.1 for everyone).
|
45
|
+
#
|
46
|
+
def self.blen (s)
|
47
|
+
|
48
|
+
s.respond_to?(:bytesize) ? s.bytesize : s.size
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
require 'rufus/tokyo/cabinet/lib'
|
55
|
+
require 'rufus/tokyo/cabinet/util'
|
56
|
+
require 'rufus/tokyo/cabinet/abstract'
|
57
|
+
require 'rufus/tokyo/cabinet/table'
|
58
|
+
|
@@ -0,0 +1,568 @@
|
|
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/transactions'
|
27
|
+
|
28
|
+
|
29
|
+
module Rufus::Tokyo
|
30
|
+
|
31
|
+
#
|
32
|
+
# A 'cabinet', ie a Tokyo Cabinet [abstract] database.
|
33
|
+
#
|
34
|
+
# Follows the abstract API described at :
|
35
|
+
#
|
36
|
+
# http://tokyocabinet.sourceforge.net/spex-en.html#tcadbapi
|
37
|
+
#
|
38
|
+
# An usage example :
|
39
|
+
#
|
40
|
+
# db = Rufus::Tokyo::Cabinet.new('test_data.tch')
|
41
|
+
# db['pillow'] = 'Shonagon'
|
42
|
+
#
|
43
|
+
# db.size # => 1
|
44
|
+
# db['pillow'] # => 'Shonagon'
|
45
|
+
#
|
46
|
+
# db.delete('pillow') # => 'Shonagon'
|
47
|
+
# db.size # => 0
|
48
|
+
#
|
49
|
+
# db.close
|
50
|
+
#
|
51
|
+
class Cabinet
|
52
|
+
|
53
|
+
include HashMethods
|
54
|
+
include Transactions
|
55
|
+
|
56
|
+
# Creates/opens the cabinet, raises an exception in case of
|
57
|
+
# creation/opening failure.
|
58
|
+
#
|
59
|
+
# This method accepts a 'name' parameter and an optional 'params' hash
|
60
|
+
# parameter.
|
61
|
+
#
|
62
|
+
# 'name' follows the syntax described at
|
63
|
+
#
|
64
|
+
# http://tokyocabinet.sourceforge.net/spex-en.html#tcadbapi
|
65
|
+
#
|
66
|
+
# under tcadbopen(). For example :
|
67
|
+
#
|
68
|
+
# db = Rufus::Tokyo::Cabinet.new('casket.tch#bnum=100000#opts=ld')
|
69
|
+
#
|
70
|
+
# will open (eventually create) a hash database backed in the file
|
71
|
+
# 'casket.tch' with a bucket number of 100000 and the 'large' and
|
72
|
+
# 'deflate' options (opts) turned on.
|
73
|
+
#
|
74
|
+
# Note that there is an #open method similar to File#open for openening
|
75
|
+
# a db and closing it when it's no longer needed :
|
76
|
+
#
|
77
|
+
# Rufus::Tokyo::Cabinet.new('data.tch') do |db|
|
78
|
+
# db['key'] = value
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# == database name
|
82
|
+
#
|
83
|
+
# From http://tokyocabinet.sourceforge.net/spex-en.html#tcadbapi :
|
84
|
+
#
|
85
|
+
# 'If it is "*", the database will be an on-memory hash database. If it is
|
86
|
+
# "+", the database will be an on-memory tree database. If its suffix is
|
87
|
+
# ".tch", the database will be a hash database. If its suffix is ".tcb",
|
88
|
+
# the database will be a B+ tree database. If its suffix is ".tcf", the
|
89
|
+
# database will be a fixed-length database. If its suffix is ".tct", the
|
90
|
+
# database will be a table database.'
|
91
|
+
#
|
92
|
+
# You're supposed to give a path to the database file you want to use and
|
93
|
+
# Cabinet expects you to give the proper prefix.
|
94
|
+
#
|
95
|
+
# db = Rufus::Tokyo::Cabinet.new('data.tch') # hash database
|
96
|
+
# db = Rufus::Tokyo::Cabinet.new('data.tcb') # B+ tree db
|
97
|
+
# db = Rufus::Tokyo::Cabinet.new('data.tcf') # fixed-length db
|
98
|
+
#
|
99
|
+
# will result with the same file names :
|
100
|
+
#
|
101
|
+
# db = Rufus::Tokyo::Cabinet.new('data', :type => :hash) # hash database
|
102
|
+
# db = Rufus::Tokyo::Cabinet.new('data', :type => :btree) # B+ tree db
|
103
|
+
# db = Rufus::Tokyo::Cabinet.new('data', :type => :fixed) # fixed-length db
|
104
|
+
#
|
105
|
+
# You can open an in-memory hash and an in-memory B+ tree with :
|
106
|
+
#
|
107
|
+
# h = Rufus::Tokyo::Cabinet.new(:mem_hash) # or
|
108
|
+
# h = Rufus::Tokyo::Cabinet.new('*')
|
109
|
+
#
|
110
|
+
# t = Rufus::Tokyo::Cabinet.new(:mem_tree) # or
|
111
|
+
# t = Rufus::Tokyo::Cabinet.new('+')
|
112
|
+
#
|
113
|
+
# == parameters
|
114
|
+
#
|
115
|
+
# There are two ways to pass parameters at the opening of a db :
|
116
|
+
#
|
117
|
+
# db = Rufus::Tokyo::Cabinet.new('data.tch#opts=ld#mode=w') # or
|
118
|
+
# db = Rufus::Tokyo::Cabinet.new('data.tch', :opts => 'ld', :mode => 'w')
|
119
|
+
#
|
120
|
+
# most verbose :
|
121
|
+
#
|
122
|
+
# db = Rufus::Tokyo::Cabinet.new(
|
123
|
+
# 'data', :type => :hash, :opts => 'ld', :mode => 'w')
|
124
|
+
#
|
125
|
+
# === mode
|
126
|
+
#
|
127
|
+
# * :mode a set of chars ('r'ead, 'w'rite, 'c'reate, 't'runcate,
|
128
|
+
# 'e' non locking, 'f' non blocking lock), default is 'wc'
|
129
|
+
#
|
130
|
+
# === other parameters
|
131
|
+
#
|
132
|
+
# 'On-memory hash database supports "bnum", "capnum", and "capsiz".
|
133
|
+
# On-memory tree database supports "capnum" and "capsiz".
|
134
|
+
# Hash database supports "mode", "bnum", "apow", "fpow", "opts",
|
135
|
+
# "rcnum", and "xmsiz".
|
136
|
+
# B+ tree database supports "mode", "lmemb", "nmemb", "bnum", "apow",
|
137
|
+
# "fpow", "opts", "lcnum", "ncnum", and "xmsiz".
|
138
|
+
# Fixed-length database supports "mode", "width", and "limsiz"'
|
139
|
+
#
|
140
|
+
# * :opts a set of chars ('l'arge, 'd'eflate, 'b'zip2, 't'cbs)
|
141
|
+
# (usually empty or something like 'ld' or 'lb')
|
142
|
+
#
|
143
|
+
# * :bnum number of elements of the bucket array
|
144
|
+
# * :apow size of record alignment by power of 2 (defaults to 4)
|
145
|
+
# * :fpow maximum number of elements of the free block pool by
|
146
|
+
# power of 2 (defaults to 10)
|
147
|
+
# * :mutex when set to true, makes sure only 1 thread at a time
|
148
|
+
# accesses the table (well, Ruby, global thread lock, ...)
|
149
|
+
#
|
150
|
+
# * :rcnum specifies the maximum number of records to be cached.
|
151
|
+
# If it is not more than 0, the record cache is disabled.
|
152
|
+
# It is disabled by default.
|
153
|
+
# * :lcnum specifies the maximum number of leaf nodes to be cached.
|
154
|
+
# If it is not more than 0, the default value is specified.
|
155
|
+
# The default value is 2048.
|
156
|
+
# * :ncnum specifies the maximum number of non-leaf nodes to be
|
157
|
+
# cached. If it is not more than 0, the default value is
|
158
|
+
# specified. The default value is 512.
|
159
|
+
#
|
160
|
+
# * :xmsiz specifies the size of the extra mapped memory. If it is
|
161
|
+
# not more than 0, the extra mapped memory is disabled.
|
162
|
+
# The default size is 67108864.
|
163
|
+
#
|
164
|
+
# * :capnum specifies the capacity number of records.
|
165
|
+
# * :capsiz specifies the capacity size of using memory.
|
166
|
+
#
|
167
|
+
# * :dfunit unit step number. If it is not more than 0,
|
168
|
+
# the auto defragmentation is disabled. (Since TC 1.4.21)
|
169
|
+
#
|
170
|
+
#
|
171
|
+
# = NOTE :
|
172
|
+
#
|
173
|
+
# On reopening a file, Cabinet will tend to stick to the parameters as
|
174
|
+
# set when the file was opened. To change that, have a look at the
|
175
|
+
# man pages of the various command line tools coming with Tokyo Cabinet.
|
176
|
+
#
|
177
|
+
def initialize (name, params={})
|
178
|
+
|
179
|
+
@db = lib.tcadbnew
|
180
|
+
|
181
|
+
name = '*' if name == :mem_hash # in memory hash database
|
182
|
+
name = '+' if name == :mem_tree # in memory B+ tree database
|
183
|
+
|
184
|
+
if type = params.delete(:type)
|
185
|
+
name += { :hash => '.tch', :btree => '.tcb', :fixed => '.tcf' }[type]
|
186
|
+
end
|
187
|
+
|
188
|
+
@path = name
|
189
|
+
|
190
|
+
name = name + params.collect { |k, v| "##{k}=#{v}" }.join('')
|
191
|
+
|
192
|
+
(lib.tcadbopen(@db, name) == 1) ||
|
193
|
+
raise("failed to open/create db '#{name}' #{params.inspect}")
|
194
|
+
|
195
|
+
self.default = params[:default]
|
196
|
+
@default_proc ||= params[:default_proc]
|
197
|
+
end
|
198
|
+
|
199
|
+
# Same args as initialize, but can take a block form that will
|
200
|
+
# close the db when done. Similar to File.open
|
201
|
+
#
|
202
|
+
def self.open (name, params={})
|
203
|
+
|
204
|
+
db = self.new(name, params)
|
205
|
+
|
206
|
+
if block_given?
|
207
|
+
yield db
|
208
|
+
nil
|
209
|
+
else
|
210
|
+
db
|
211
|
+
end
|
212
|
+
|
213
|
+
ensure
|
214
|
+
|
215
|
+
db.close if block_given? && db
|
216
|
+
end
|
217
|
+
|
218
|
+
# Returns a new in-memory hash. Accepts the same optional params hash
|
219
|
+
# as new().
|
220
|
+
#
|
221
|
+
def self.new_hash (params={})
|
222
|
+
|
223
|
+
self.new(:hash, params)
|
224
|
+
end
|
225
|
+
|
226
|
+
# Returns a new in-memory B+ tree. Accepts the same optional params hash
|
227
|
+
# as new().
|
228
|
+
#
|
229
|
+
def self.new_tree (params={})
|
230
|
+
|
231
|
+
self.new(:tree, params)
|
232
|
+
end
|
233
|
+
|
234
|
+
# Using the cabinet lib
|
235
|
+
#
|
236
|
+
def lib
|
237
|
+
|
238
|
+
CabinetLib
|
239
|
+
end
|
240
|
+
|
241
|
+
# Returns the path to this database.
|
242
|
+
#
|
243
|
+
def path
|
244
|
+
|
245
|
+
@path
|
246
|
+
end
|
247
|
+
|
248
|
+
# No comment
|
249
|
+
#
|
250
|
+
def []= (k, v)
|
251
|
+
|
252
|
+
lib.abs_put(@db, k, Rufus::Tokyo.blen(k), v, Rufus::Tokyo.blen(v))
|
253
|
+
end
|
254
|
+
|
255
|
+
# Like #put but doesn't overwrite the value if already set. Returns true
|
256
|
+
# only if there no previous entry for k.
|
257
|
+
#
|
258
|
+
def putkeep (k, v)
|
259
|
+
|
260
|
+
(lib.abs_putkeep(
|
261
|
+
@db, k, Rufus::Tokyo.blen(k), v, Rufus::Tokyo.blen(v)) == 1)
|
262
|
+
end
|
263
|
+
|
264
|
+
# (The actual #[] method is provided by HashMethods
|
265
|
+
#
|
266
|
+
def get (k)
|
267
|
+
|
268
|
+
outlen_op(:abs_get, k, Rufus::Tokyo.blen(k))
|
269
|
+
end
|
270
|
+
protected :get
|
271
|
+
|
272
|
+
# Removes a record from the cabinet, returns the value if successful
|
273
|
+
# else nil.
|
274
|
+
#
|
275
|
+
def delete (k)
|
276
|
+
|
277
|
+
v = self[k]
|
278
|
+
|
279
|
+
(lib.abs_out(@db, k, Rufus::Tokyo.blen(k)) == 1) ? v : nil
|
280
|
+
end
|
281
|
+
|
282
|
+
# Returns the number of records in the 'cabinet'
|
283
|
+
#
|
284
|
+
def size
|
285
|
+
|
286
|
+
lib.abs_rnum(@db)
|
287
|
+
end
|
288
|
+
|
289
|
+
# Removes all the records in the cabinet (use with care)
|
290
|
+
#
|
291
|
+
# Returns self (like Ruby's Hash does).
|
292
|
+
#
|
293
|
+
def clear
|
294
|
+
|
295
|
+
lib.abs_vanish(@db)
|
296
|
+
|
297
|
+
self
|
298
|
+
end
|
299
|
+
|
300
|
+
# Returns the 'weight' of the db (in bytes)
|
301
|
+
#
|
302
|
+
def weight
|
303
|
+
|
304
|
+
lib.abs_size(@db)
|
305
|
+
end
|
306
|
+
|
307
|
+
# Closes the cabinet (and frees the datastructure allocated for it),
|
308
|
+
# returns true in case of success.
|
309
|
+
#
|
310
|
+
def close
|
311
|
+
|
312
|
+
result = lib.abs_close(@db)
|
313
|
+
lib.abs_del(@db)
|
314
|
+
|
315
|
+
(result == 1)
|
316
|
+
end
|
317
|
+
|
318
|
+
# Copies the current cabinet to a new file.
|
319
|
+
#
|
320
|
+
# Returns true if it was successful.
|
321
|
+
#
|
322
|
+
def copy (target_path)
|
323
|
+
|
324
|
+
(lib.abs_copy(@db, target_path) == 1)
|
325
|
+
end
|
326
|
+
|
327
|
+
# Copies the current cabinet to a new file.
|
328
|
+
#
|
329
|
+
# Does it by copying each entry afresh to the target file. Spares some
|
330
|
+
# space, hence the 'compact' label...
|
331
|
+
#
|
332
|
+
def compact_copy (target_path)
|
333
|
+
|
334
|
+
@other_db = Cabinet.new(target_path)
|
335
|
+
self.each { |k, v| @other_db[k] = v }
|
336
|
+
@other_db.close
|
337
|
+
end
|
338
|
+
|
339
|
+
# "synchronize updated contents of an abstract database object with
|
340
|
+
# the file and the device"
|
341
|
+
#
|
342
|
+
def sync
|
343
|
+
|
344
|
+
(lib.abs_sync(@db) == 1)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Returns an array with all the keys in the databse
|
348
|
+
#
|
349
|
+
# With no options given, this method will return all the keys (strings)
|
350
|
+
# in a Ruby array.
|
351
|
+
#
|
352
|
+
# :prefix --> returns only the keys who match a given string prefix
|
353
|
+
#
|
354
|
+
# :limit --> returns a limited number of keys
|
355
|
+
#
|
356
|
+
# :native --> returns an instance of Rufus::Tokyo::List instead of
|
357
|
+
# a Ruby Hash, you have to call #free on that List when done with it !
|
358
|
+
# Else you're exposing yourself to a memory leak.
|
359
|
+
#
|
360
|
+
def keys (options={})
|
361
|
+
|
362
|
+
outlen = nil
|
363
|
+
|
364
|
+
if pre = options[:prefix]
|
365
|
+
|
366
|
+
l = lib.abs_fwmkeys(
|
367
|
+
@db, pre, Rufus::Tokyo.blen(pre), options[:limit] || -1)
|
368
|
+
|
369
|
+
l = Rufus::Tokyo::List.new(l)
|
370
|
+
|
371
|
+
options[:native] ? l : l.release
|
372
|
+
|
373
|
+
else
|
374
|
+
|
375
|
+
limit = options[:limit] || -1
|
376
|
+
limit = nil if limit < 1
|
377
|
+
|
378
|
+
l = options[:native] ? Rufus::Tokyo::List.new : []
|
379
|
+
|
380
|
+
lib.abs_iterinit(@db)
|
381
|
+
|
382
|
+
outlen = FFI::MemoryPointer.new(:int)
|
383
|
+
|
384
|
+
loop do
|
385
|
+
break if limit and l.size >= limit
|
386
|
+
out = lib.abs_iternext(@db, outlen)
|
387
|
+
break if out.address == 0
|
388
|
+
l << out.get_bytes(0, outlen.get_int(0))
|
389
|
+
end
|
390
|
+
|
391
|
+
l
|
392
|
+
end
|
393
|
+
|
394
|
+
ensure
|
395
|
+
|
396
|
+
outlen.free if outlen
|
397
|
+
end
|
398
|
+
|
399
|
+
# Deletes all the entries whose keys begin with the given prefix
|
400
|
+
#
|
401
|
+
def delete_keys_with_prefix (prefix)
|
402
|
+
|
403
|
+
call_misc(
|
404
|
+
'outlist', lib.abs_fwmkeys(@db, prefix, Rufus::Tokyo.blen(prefix), -1))
|
405
|
+
# -1 for no limits
|
406
|
+
|
407
|
+
nil
|
408
|
+
end
|
409
|
+
|
410
|
+
# Given a list of keys, returns a Hash { key => value } of the
|
411
|
+
# matching entries (in one sweep).
|
412
|
+
#
|
413
|
+
def lget (keys)
|
414
|
+
|
415
|
+
Hash[*call_misc('getlist', Rufus::Tokyo::List.new(keys))]
|
416
|
+
end
|
417
|
+
|
418
|
+
# Merges the given hash into this Cabinet (or Tyrant) and returns self.
|
419
|
+
#
|
420
|
+
def merge! (hash)
|
421
|
+
|
422
|
+
call_misc(
|
423
|
+
'putlist',
|
424
|
+
hash.inject(Rufus::Tokyo::List.new) { |l, (k, v)| l << k; l << v; l })
|
425
|
+
self
|
426
|
+
end
|
427
|
+
alias :lput :merge!
|
428
|
+
|
429
|
+
# Given a list of keys, deletes all the matching entries (in one sweep).
|
430
|
+
#
|
431
|
+
def ldelete (keys)
|
432
|
+
|
433
|
+
call_misc('outlist', Rufus::Tokyo::List.new(keys))
|
434
|
+
end
|
435
|
+
|
436
|
+
# Increments the value stored under the given key with the given increment
|
437
|
+
# (defaults to 1 (integer)).
|
438
|
+
#
|
439
|
+
# Accepts an integer or a double value.
|
440
|
+
#
|
441
|
+
def incr (key, inc=1)
|
442
|
+
|
443
|
+
v = inc.is_a?(Fixnum) ?
|
444
|
+
lib.addint(@db, key, Rufus::Tokyo.blen(key), inc) :
|
445
|
+
lib.adddouble(@db, key, Rufus::Tokyo.blen(key), inc)
|
446
|
+
|
447
|
+
raise(TokyoError.new(
|
448
|
+
"incr failed, there is probably already a string value set " +
|
449
|
+
"for the key '#{key}'"
|
450
|
+
)) if v == Rufus::Tokyo::INT_MIN || (v.respond_to?(:nan?) && v.nan?)
|
451
|
+
|
452
|
+
v
|
453
|
+
end
|
454
|
+
alias :addint :incr
|
455
|
+
alias :adddouble :incr
|
456
|
+
alias :add_int :incr
|
457
|
+
alias :add_double :incr
|
458
|
+
|
459
|
+
# Triggers a defrag run (TC >= 1.4.21 only)
|
460
|
+
#
|
461
|
+
def defrag
|
462
|
+
|
463
|
+
raise(NotImplementedError.new(
|
464
|
+
"method defrag is supported since Tokyo Cabinet 1.4.21. " +
|
465
|
+
"your TC version doesn't support it"
|
466
|
+
)) unless lib.respond_to?(:tctdbsetdfunit)
|
467
|
+
|
468
|
+
call_misc('defrag', Rufus::Tokyo::List.new)
|
469
|
+
end
|
470
|
+
|
471
|
+
# Warning : this method is low-level, you probably only need
|
472
|
+
# to use #transaction and a block.
|
473
|
+
#
|
474
|
+
# Direct call for 'transaction begin'.
|
475
|
+
#
|
476
|
+
def tranbegin
|
477
|
+
|
478
|
+
check_transaction_support
|
479
|
+
|
480
|
+
libcall(:tcadbtranbegin)
|
481
|
+
end
|
482
|
+
|
483
|
+
# Warning : this method is low-level, you probably only need
|
484
|
+
# to use #transaction and a block.
|
485
|
+
#
|
486
|
+
# Direct call for 'transaction commit'.
|
487
|
+
#
|
488
|
+
def trancommit
|
489
|
+
|
490
|
+
check_transaction_support
|
491
|
+
|
492
|
+
libcall(:tcadbtrancommit)
|
493
|
+
end
|
494
|
+
|
495
|
+
# Warning : this method is low-level, you probably only need
|
496
|
+
# to use #transaction and a block.
|
497
|
+
#
|
498
|
+
# Direct call for 'transaction abort'.
|
499
|
+
#
|
500
|
+
def tranabort
|
501
|
+
|
502
|
+
check_transaction_support
|
503
|
+
|
504
|
+
libcall(:tcadbtranabort)
|
505
|
+
end
|
506
|
+
|
507
|
+
protected
|
508
|
+
|
509
|
+
def check_transaction_support
|
510
|
+
|
511
|
+
raise(TokyoError.new(
|
512
|
+
"The version of Tokyo Cabinet you're using doesn't support " +
|
513
|
+
"transactions for non-table structures. Upgrade to TC >= 1.4.13.")
|
514
|
+
) unless lib.respond_to?(:tcadbtranbegin)
|
515
|
+
end
|
516
|
+
|
517
|
+
# Wrapping tcadbmisc or tcrdbmisc
|
518
|
+
# (and taking care of freeing the list_pointer)
|
519
|
+
#
|
520
|
+
def call_misc (function, list_pointer)
|
521
|
+
|
522
|
+
list_pointer = list_pointer.pointer \
|
523
|
+
if list_pointer.is_a?(Rufus::Tokyo::List)
|
524
|
+
|
525
|
+
begin
|
526
|
+
l = do_call_misc(function, list_pointer)
|
527
|
+
raise "function '#{function}' failed" unless l
|
528
|
+
Rufus::Tokyo::List.new(l).release
|
529
|
+
ensure
|
530
|
+
Rufus::Tokyo::List.free(list_pointer)
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
# Calls the tcadbmisc function
|
535
|
+
#
|
536
|
+
def do_call_misc (function, list_pointer)
|
537
|
+
|
538
|
+
lib.tcadbmisc(@db, function, list_pointer)
|
539
|
+
end
|
540
|
+
|
541
|
+
def libcall (lib_method, *args)
|
542
|
+
|
543
|
+
(eval(%{ lib.#{lib_method}(@db, *args) }) == 1) or \
|
544
|
+
raise TokyoError.new("call to #{lib_method} failed")
|
545
|
+
end
|
546
|
+
|
547
|
+
# A wrapper for library returning a string (binary data potentially)
|
548
|
+
#
|
549
|
+
def outlen_op (method, *args)
|
550
|
+
|
551
|
+
args.unshift(@db)
|
552
|
+
|
553
|
+
outlen = FFI::MemoryPointer.new(:int)
|
554
|
+
args << outlen
|
555
|
+
|
556
|
+
out = lib.send(method, *args)
|
557
|
+
|
558
|
+
return nil if out.address == 0
|
559
|
+
|
560
|
+
return out.get_bytes(0, outlen.get_int(0))
|
561
|
+
|
562
|
+
ensure
|
563
|
+
|
564
|
+
outlen.free
|
565
|
+
end
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|