mkuklis-webrat 0.5.1
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/.document +4 -0
- data/.gitignore +15 -0
- data/History.txt +413 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +188 -0
- data/VERSION +1 -0
- data/install.rb +1 -0
- data/lib/webrat/adapters/mechanize.rb +78 -0
- data/lib/webrat/adapters/merb.rb +11 -0
- data/lib/webrat/adapters/rack.rb +25 -0
- data/lib/webrat/adapters/rails.rb +81 -0
- data/lib/webrat/adapters/sinatra.rb +9 -0
- data/lib/webrat/core/configuration.rb +92 -0
- data/lib/webrat/core/elements/area.rb +31 -0
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +487 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/elements/link.rb +93 -0
- data/lib/webrat/core/elements/select_option.rb +48 -0
- data/lib/webrat/core/locators/area_locator.rb +38 -0
- data/lib/webrat/core/locators/button_locator.rb +54 -0
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/lib/webrat/core/locators/field_locator.rb +25 -0
- data/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/lib/webrat/core/locators/form_locator.rb +19 -0
- data/lib/webrat/core/locators/label_locator.rb +34 -0
- data/lib/webrat/core/locators/link_locator.rb +74 -0
- data/lib/webrat/core/locators/locator.rb +20 -0
- data/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/lib/webrat/core/locators.rb +20 -0
- data/lib/webrat/core/logging.rb +23 -0
- data/lib/webrat/core/matchers/have_content.rb +68 -0
- data/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/lib/webrat/core/matchers/have_xpath.rb +122 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/methods.rb +64 -0
- data/lib/webrat/core/mime.rb +18 -0
- data/lib/webrat/core/save_and_open_page.rb +48 -0
- data/lib/webrat/core/scope.rb +365 -0
- data/lib/webrat/core/session.rb +306 -0
- data/lib/webrat/core/xml.rb +72 -0
- data/lib/webrat/core.rb +13 -0
- data/lib/webrat/core_extensions/blank.rb +58 -0
- data/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/integrations/merb.rb +10 -0
- data/lib/webrat/integrations/rails.rb +25 -0
- data/lib/webrat/integrations/rspec-rails.rb +10 -0
- data/lib/webrat/integrations/selenium.rb +11 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/rspec-rails.rb +2 -0
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers/base.rb +54 -0
- data/lib/webrat/selenium/application_servers/external.rb +26 -0
- data/lib/webrat/selenium/application_servers/merb.rb +50 -0
- data/lib/webrat/selenium/application_servers/rails.rb +67 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/lib/webrat/selenium/matchers.rb +4 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
- data/lib/webrat/selenium/selenium_session.rb +272 -0
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/lib/webrat/selenium.rb +70 -0
- data/lib/webrat.rb +18 -0
- data/spec/fakes/test_adapter.rb +37 -0
- data/spec/integration/mechanize/Rakefile +7 -0
- data/spec/integration/mechanize/config.ru +2 -0
- data/spec/integration/mechanize/sample_app.rb +20 -0
- data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
- data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
- data/spec/integration/merb/.gitignore +21 -0
- data/spec/integration/merb/Rakefile +35 -0
- data/spec/integration/merb/app/controllers/application.rb +2 -0
- data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
- data/spec/integration/merb/app/controllers/testing.rb +27 -0
- data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
- data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
- data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
- data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
- data/spec/integration/merb/config/environments/development.rb +15 -0
- data/spec/integration/merb/config/environments/rake.rb +11 -0
- data/spec/integration/merb/config/environments/test.rb +14 -0
- data/spec/integration/merb/config/init.rb +25 -0
- data/spec/integration/merb/config/rack.rb +11 -0
- data/spec/integration/merb/config/router.rb +34 -0
- data/spec/integration/merb/spec/spec.opts +1 -0
- data/spec/integration/merb/spec/spec_helper.rb +26 -0
- data/spec/integration/merb/spec/webrat_spec.rb +39 -0
- data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
- data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
- data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
- data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
- data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
- data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
- data/spec/integration/rack/Rakefile +5 -0
- data/spec/integration/rack/app.rb +89 -0
- data/spec/integration/rack/test/helper.rb +21 -0
- data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
- data/spec/integration/rails/.gitignore +3 -0
- data/spec/integration/rails/Rakefile +30 -0
- data/spec/integration/rails/app/controllers/application.rb +15 -0
- data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
- data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
- data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
- data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
- data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
- data/spec/integration/rails/app/views/links/show.html.erb +5 -0
- data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
- data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
- data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
- data/spec/integration/rails/config/boot.rb +109 -0
- data/spec/integration/rails/config/environment.rb +12 -0
- data/spec/integration/rails/config/environments/development.rb +17 -0
- data/spec/integration/rails/config/environments/selenium.rb +22 -0
- data/spec/integration/rails/config/environments/test.rb +22 -0
- data/spec/integration/rails/config/initializers/inflections.rb +10 -0
- data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
- data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/spec/integration/rails/config/locales/en.yml +5 -0
- data/spec/integration/rails/config/routes.rb +19 -0
- data/spec/integration/rails/public/404.html +30 -0
- data/spec/integration/rails/public/422.html +30 -0
- data/spec/integration/rails/public/500.html +33 -0
- data/spec/integration/rails/script/about +4 -0
- data/spec/integration/rails/script/console +3 -0
- data/spec/integration/rails/script/dbconsole +3 -0
- data/spec/integration/rails/script/destroy +3 -0
- data/spec/integration/rails/script/generate +3 -0
- data/spec/integration/rails/script/performance/benchmarker +3 -0
- data/spec/integration/rails/script/performance/profiler +3 -0
- data/spec/integration/rails/script/performance/request +3 -0
- data/spec/integration/rails/script/plugin +3 -0
- data/spec/integration/rails/script/process/inspector +3 -0
- data/spec/integration/rails/script/process/reaper +3 -0
- data/spec/integration/rails/script/process/spawner +3 -0
- data/spec/integration/rails/script/runner +3 -0
- data/spec/integration/rails/script/server +3 -0
- data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
- data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
- data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
- data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
- data/spec/integration/rails/test/test_helper.rb +26 -0
- data/spec/integration/sinatra/Rakefile +5 -0
- data/spec/integration/sinatra/classic_app.rb +64 -0
- data/spec/integration/sinatra/modular_app.rb +16 -0
- data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
- data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
- data/spec/integration/sinatra/test/test_helper.rb +17 -0
- data/spec/private/core/configuration_spec.rb +87 -0
- data/spec/private/core/field_spec.rb +85 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/session_spec.rb +200 -0
- data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
- data/spec/private/nokogiri_spec.rb +77 -0
- data/spec/private/rails/attaches_file_spec.rb +81 -0
- data/spec/private/rails/rails_adapter_spec.rb +86 -0
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/spec/public/basic_auth_spec.rb +24 -0
- data/spec/public/check_spec.rb +191 -0
- data/spec/public/choose_spec.rb +118 -0
- data/spec/public/click_area_spec.rb +106 -0
- data/spec/public/click_button_spec.rb +494 -0
- data/spec/public/click_link_spec.rb +511 -0
- data/spec/public/fill_in_spec.rb +224 -0
- data/spec/public/locators/field_by_xpath_spec.rb +19 -0
- data/spec/public/locators/field_labeled_spec.rb +172 -0
- data/spec/public/locators/field_with_id_spec.rb +16 -0
- data/spec/public/matchers/contain_spec.rb +114 -0
- data/spec/public/matchers/have_selector_spec.rb +146 -0
- data/spec/public/matchers/have_tag_spec.rb +39 -0
- data/spec/public/matchers/have_xpath_spec.rb +136 -0
- data/spec/public/reload_spec.rb +10 -0
- data/spec/public/save_and_open_spec.rb +70 -0
- data/spec/public/select_date_spec.rb +112 -0
- data/spec/public/select_datetime_spec.rb +137 -0
- data/spec/public/select_spec.rb +455 -0
- data/spec/public/select_time_spec.rb +100 -0
- data/spec/public/selenium/application_server_factory_spec.rb +49 -0
- data/spec/public/selenium/application_servers/external_spec.rb +12 -0
- data/spec/public/selenium/selenium_session_spec.rb +37 -0
- data/spec/public/set_hidden_field_spec.rb +5 -0
- data/spec/public/submit_form_spec.rb +5 -0
- data/spec/public/visit_spec.rb +58 -0
- data/spec/public/within_spec.rb +177 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +54 -0
- data/vendor/selenium-server.jar +0 -0
- metadata +409 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
<div id="container">
|
2
|
+
<div id="header-container">
|
3
|
+
<img src="/images/merb.jpg" />
|
4
|
+
<!-- <h1>Mongrel + Erb</h1> -->
|
5
|
+
<h2>pocket rocket web framework</h2>
|
6
|
+
<hr />
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="left-container">
|
10
|
+
<h3>Exception:</h3>
|
11
|
+
<p><%= request.exceptions.first.message %></p>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div id="main-container">
|
15
|
+
<h3>Welcome to Merb!</h3>
|
16
|
+
<p>Merb is a light-weight MVC framework written in Ruby. We hope you enjoy it.</p>
|
17
|
+
|
18
|
+
<h3>Where can I find help?</h3>
|
19
|
+
<p>If you have any questions or if you can't figure something out, please take a
|
20
|
+
look at our <a href="http://merbivore.com/"> project page</a>,
|
21
|
+
feel free to come chat at irc.freenode.net, channel #merb,
|
22
|
+
or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
|
23
|
+
on Google Groups.</p>
|
24
|
+
|
25
|
+
<h3>What if I've found a bug?</h3>
|
26
|
+
<p>If you want to file a bug or make your own contribution to Merb,
|
27
|
+
feel free to register and create a ticket at our
|
28
|
+
<a href="http://merb.lighthouseapp.com/">project development page</a>
|
29
|
+
on Lighthouse.</p>
|
30
|
+
|
31
|
+
<h3>How do I edit this page?</h3>
|
32
|
+
<p>You're seeing this page because you need to edit the following files:
|
33
|
+
<ul>
|
34
|
+
<li>config/router.rb <strong><em>(recommended)</em></strong></li>
|
35
|
+
<li>app/views/exceptions/not_found.html.erb <strong><em>(recommended)</em></strong></li>
|
36
|
+
<li>app/views/layout/application.html.erb <strong><em>(change this layout)</em></strong></li>
|
37
|
+
</ul>
|
38
|
+
</p>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div id="footer-container">
|
42
|
+
<hr />
|
43
|
+
<div class="left"></div>
|
44
|
+
<div class="right">© 2008 the merb dev team</div>
|
45
|
+
<p> </p>
|
46
|
+
</div>
|
47
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
|
3
|
+
<head>
|
4
|
+
<title>Fresh Merb App</title>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
6
|
+
<link rel="stylesheet" href="/stylesheets/master.css" type="text/css" media="screen" charset="utf-8" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<%#= message[:notice] %>
|
10
|
+
<%= catch_content :for_layout %>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<h1>Webrat Form</h1>
|
2
|
+
|
3
|
+
<form action="/testing/submit_form" method="post">
|
4
|
+
<label>
|
5
|
+
Text field
|
6
|
+
<input type="text" name="text_field" />
|
7
|
+
</label>
|
8
|
+
|
9
|
+
<label>
|
10
|
+
TOS <input type="checkbox" name="tos" />
|
11
|
+
</label>
|
12
|
+
|
13
|
+
<label>
|
14
|
+
Prefilled
|
15
|
+
<input type="text" name="prefilled" value="text" />
|
16
|
+
</label>
|
17
|
+
|
18
|
+
<label>
|
19
|
+
Month
|
20
|
+
<select name="month">
|
21
|
+
<option>None</option>
|
22
|
+
<option>January</option>
|
23
|
+
</select>
|
24
|
+
</label>
|
25
|
+
|
26
|
+
<input type="submit" value="Test">
|
27
|
+
</form>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Merb.logger.info("Loaded DEVELOPMENT Environment...")
|
2
|
+
Merb::Config.use { |c|
|
3
|
+
c[:exception_details] = true
|
4
|
+
c[:reload_templates] = true
|
5
|
+
c[:reload_classes] = true
|
6
|
+
c[:reload_time] = 0.5
|
7
|
+
c[:ignore_tampered_cookies] = true
|
8
|
+
c[:log_auto_flush ] = true
|
9
|
+
c[:log_level] = :debug
|
10
|
+
|
11
|
+
c[:log_stream] = STDOUT
|
12
|
+
c[:log_file] = nil
|
13
|
+
# Or redirect logging into a file:
|
14
|
+
# c[:log_file] = Merb.root / "log" / "development.log"
|
15
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Merb.logger.info("Loaded RAKE Environment...")
|
2
|
+
Merb::Config.use { |c|
|
3
|
+
c[:exception_details] = true
|
4
|
+
c[:reload_classes] = false
|
5
|
+
c[:log_auto_flush ] = true
|
6
|
+
|
7
|
+
c[:log_stream] = STDOUT
|
8
|
+
c[:log_file] = nil
|
9
|
+
# Or redirect logging into a file:
|
10
|
+
# c[:log_file] = Merb.root / "log" / "development.log"
|
11
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../../../../../lib/webrat"
|
2
|
+
|
3
|
+
Merb.logger.info("Loaded TEST Environment...")
|
4
|
+
Merb::Config.use { |c|
|
5
|
+
c[:testing] = true
|
6
|
+
c[:exception_details] = true
|
7
|
+
c[:log_auto_flush ] = true
|
8
|
+
# log less in testing environment
|
9
|
+
c[:log_level] = :error
|
10
|
+
|
11
|
+
#c[:log_file] = Merb.root / "log" / "test.log"
|
12
|
+
# or redirect logger using IO handle
|
13
|
+
c[:log_stream] = STDOUT
|
14
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Go to http://wiki.merbivore.com/pages/init-rb
|
2
|
+
|
3
|
+
# Specify a specific version of a dependency
|
4
|
+
# dependency "RedCloth", "> 3.0"
|
5
|
+
|
6
|
+
# use_orm :none
|
7
|
+
use_test :rspec
|
8
|
+
use_template_engine :erb
|
9
|
+
|
10
|
+
Merb::Config.use do |c|
|
11
|
+
c[:use_mutex] = false
|
12
|
+
c[:session_store] = 'cookie' # can also be 'memory', 'memcache', 'container', 'datamapper
|
13
|
+
|
14
|
+
# cookie session store configuration
|
15
|
+
c[:session_secret_key] = 'adb9ea7a0e94b5513503f58623a393c5efe18851' # required for cookie session store
|
16
|
+
c[:session_id_key] = '_merb_session_id' # cookie session id key, defaults to "_session_id"
|
17
|
+
end
|
18
|
+
|
19
|
+
Merb::BootLoader.before_app_loads do
|
20
|
+
# This will get executed after dependencies have been loaded but before your app's classes have loaded.
|
21
|
+
end
|
22
|
+
|
23
|
+
Merb::BootLoader.after_app_loads do
|
24
|
+
# This will get executed after your app's classes have been loaded.
|
25
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# use PathPrefix Middleware if :path_prefix is set in Merb::Config
|
2
|
+
if prefix = ::Merb::Config[:path_prefix]
|
3
|
+
use Merb::Rack::PathPrefix, prefix
|
4
|
+
end
|
5
|
+
|
6
|
+
# comment this out if you are running merb behind a load balancer
|
7
|
+
# that serves static files
|
8
|
+
use Merb::Rack::Static, Merb.dir_for(:public)
|
9
|
+
|
10
|
+
# this is our main merb application
|
11
|
+
run Merb::Rack::Application.new
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Merb::Router is the request routing mapper for the merb framework.
|
2
|
+
#
|
3
|
+
# You can route a specific URL to a controller / action pair:
|
4
|
+
#
|
5
|
+
# match("/contact").
|
6
|
+
# to(:controller => "info", :action => "contact")
|
7
|
+
#
|
8
|
+
# You can define placeholder parts of the url with the :symbol notation. These
|
9
|
+
# placeholders will be available in the params hash of your controllers. For example:
|
10
|
+
#
|
11
|
+
# match("/books/:book_id/:action").
|
12
|
+
# to(:controller => "books")
|
13
|
+
#
|
14
|
+
# Or, use placeholders in the "to" results for more complicated routing, e.g.:
|
15
|
+
#
|
16
|
+
# match("/admin/:module/:controller/:action/:id").
|
17
|
+
# to(:controller => ":module/:controller")
|
18
|
+
#
|
19
|
+
# You can specify conditions on the placeholder by passing a hash as the second
|
20
|
+
# argument of "match"
|
21
|
+
#
|
22
|
+
# match("/registration/:course_name", :course_name => /^[a-z]{3,5}-\d{5}$/).
|
23
|
+
# to(:controller => "registration")
|
24
|
+
#
|
25
|
+
# You can also use regular expressions, deferred routes, and many other options.
|
26
|
+
# See merb/specs/merb/router.rb for a fairly complete usage sample.
|
27
|
+
|
28
|
+
Merb.logger.info("Compiling routes...")
|
29
|
+
Merb::Router.prepare do
|
30
|
+
match("/").to(:controller => "testing", :action => "show_form")
|
31
|
+
match("/upload").to(:controller => "testing", :action => "upload")
|
32
|
+
match("/internal_redirect").to(:controller => "testing", :action => "internal_redirect")
|
33
|
+
match("/external_redirect").to(:controller => "testing", :action => "external_redirect")
|
34
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../../../../lib"
|
4
|
+
|
5
|
+
# Add the local gems dir if found within the app root; any dependencies loaded
|
6
|
+
# hereafter will try to load from the local gems before loading system gems.
|
7
|
+
if (local_gem_dir = File.join(File.dirname(__FILE__), '..', 'gems')) && $BUNDLE.nil?
|
8
|
+
$BUNDLE = true; Gem.clear_paths; Gem.path.unshift(local_gem_dir)
|
9
|
+
end
|
10
|
+
|
11
|
+
require "merb-core"
|
12
|
+
require "spec" # Satisfies Autotest and anyone else not using the Rake tasks
|
13
|
+
|
14
|
+
# this loads all plugins required in your init file so don't add them
|
15
|
+
# here again, Merb will do it for you
|
16
|
+
Merb.start_environment(:testing => true, :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'test')
|
17
|
+
|
18
|
+
Spec::Runner.configure do |config|
|
19
|
+
config.include(Merb::Test::ViewHelper)
|
20
|
+
config.include(Merb::Test::RouteHelper)
|
21
|
+
config.include(Merb::Test::ControllerHelper)
|
22
|
+
end
|
23
|
+
|
24
|
+
Webrat.configure do |config|
|
25
|
+
config.mode = :merb
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
|
+
|
3
|
+
describe "Webrat" do
|
4
|
+
it "should visit pages" do
|
5
|
+
response = visit "/"
|
6
|
+
response.should contain("Webrat Form")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should submit forms" do
|
10
|
+
visit "/"
|
11
|
+
fill_in "Text field", :with => "Hello"
|
12
|
+
check "TOS"
|
13
|
+
select "January"
|
14
|
+
click_button "Test"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should follow internal redirects" do
|
18
|
+
response = visit "/internal_redirect"
|
19
|
+
response.status.should == 200
|
20
|
+
response.should contain("Webrat Form")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should check the value of a field" do
|
24
|
+
visit "/"
|
25
|
+
field_labeled("Prefilled").value.should == "text"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not follow external redirects" do
|
29
|
+
response = visit "/external_redirect"
|
30
|
+
response.status.should == 302
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should upload files" do
|
34
|
+
visit "/upload"
|
35
|
+
attach_file "File", __FILE__
|
36
|
+
response = click_button "Upload"
|
37
|
+
response.should contain(%(["webrat_spec.rb", "Tempfile"]))
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This was added by Merb's bundler
|
4
|
+
|
5
|
+
require "rubygems"
|
6
|
+
require File.join(File.dirname(__FILE__), "common")
|
7
|
+
|
8
|
+
gems_dir = File.join(File.dirname(__FILE__), '..', 'gems')
|
9
|
+
|
10
|
+
if File.directory?(gems_dir)
|
11
|
+
$BUNDLE = true
|
12
|
+
Gem.clear_paths
|
13
|
+
Gem.path.replace([File.expand_path(gems_dir)])
|
14
|
+
ENV["PATH"] = "#{File.dirname(__FILE__)}:#{ENV["PATH"]}"
|
15
|
+
|
16
|
+
gem_file = File.join(gems_dir, "specifications", "<%= spec.name %>-*.gemspec")
|
17
|
+
|
18
|
+
if local_gem = Dir[gem_file].last
|
19
|
+
version = File.basename(local_gem)[/-([\.\d]+)\.gemspec$/, 1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
version ||= "<%= Gem::Requirement.default %>"
|
24
|
+
|
25
|
+
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
|
26
|
+
version = $1
|
27
|
+
ARGV.shift
|
28
|
+
end
|
29
|
+
|
30
|
+
gem '<%= @spec.name %>', version
|
31
|
+
load '<%= bin_file_name %>'
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# This was added via Merb's bundler
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "rubygems/source_index"
|
5
|
+
|
6
|
+
module Gem
|
7
|
+
BUNDLED_SPECS = File.join(Dir.pwd, "gems", "specifications")
|
8
|
+
MAIN_INDEX = Gem::SourceIndex.from_gems_in(BUNDLED_SPECS)
|
9
|
+
FALLBACK_INDEX = Gem::SourceIndex.from_installed_gems
|
10
|
+
|
11
|
+
def self.source_index
|
12
|
+
MultiSourceIndex.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.searcher
|
16
|
+
MultiPathSearcher.new
|
17
|
+
end
|
18
|
+
|
19
|
+
class ArbitrarySearcher < GemPathSearcher
|
20
|
+
def initialize(source_index)
|
21
|
+
@source_index = source_index
|
22
|
+
super()
|
23
|
+
end
|
24
|
+
|
25
|
+
def init_gemspecs
|
26
|
+
@source_index.map { |_, spec| spec }.sort { |a,b|
|
27
|
+
(a.name <=> b.name).nonzero? || (b.version <=> a.version)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class MultiPathSearcher
|
33
|
+
def initialize
|
34
|
+
@main_searcher = ArbitrarySearcher.new(MAIN_INDEX)
|
35
|
+
@fallback_searcher = ArbitrarySearcher.new(FALLBACK_INDEX)
|
36
|
+
end
|
37
|
+
|
38
|
+
def find(path)
|
39
|
+
try = @main_searcher.find(path)
|
40
|
+
return try if try
|
41
|
+
@fallback_searcher.find(path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_all(path)
|
45
|
+
try = @main_searcher.find_all(path)
|
46
|
+
return try unless try.empty?
|
47
|
+
@fallback_searcher.find_all(path)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class MultiSourceIndex
|
52
|
+
def search(*args)
|
53
|
+
try = MAIN_INDEX.search(*args)
|
54
|
+
return try unless try.empty?
|
55
|
+
FALLBACK_INDEX.search(*args)
|
56
|
+
end
|
57
|
+
|
58
|
+
def find_name(*args)
|
59
|
+
try = MAIN_INDEX.find_name(*args)
|
60
|
+
return try unless try.empty?
|
61
|
+
FALLBACK_INDEX.find_name(*args)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
Gem.pre_install_hooks.push(proc do |installer|
|
4
|
+
$INSTALLING << installer.spec
|
5
|
+
|
6
|
+
unless File.file?(installer.bin_dir / "common.rb")
|
7
|
+
FileUtils.mkdir_p(installer.bin_dir)
|
8
|
+
FileUtils.cp(File.dirname(__FILE__) / "common.rb", installer.bin_dir / "common.rb")
|
9
|
+
end
|
10
|
+
|
11
|
+
include ColorfulMessages
|
12
|
+
name = installer.spec.name
|
13
|
+
if $GEMS && versions = ($GEMS.assoc(name) || [])[1]
|
14
|
+
dep = Gem::Dependency.new(name, versions)
|
15
|
+
unless dep.version_requirements.satisfied_by?(installer.spec.version)
|
16
|
+
error "Cannot install #{installer.spec.full_name} " \
|
17
|
+
"for #{$INSTALLING.map {|x| x.full_name}.join(", ")}; " \
|
18
|
+
"you required #{dep}"
|
19
|
+
::Thor::Tasks::Merb::Gem.rollback_trans
|
20
|
+
exit!
|
21
|
+
end
|
22
|
+
end
|
23
|
+
success "Installing #{installer.spec.full_name}"
|
24
|
+
end)
|
25
|
+
|
26
|
+
class ::Gem::Uninstaller
|
27
|
+
def self._with_silent_ui
|
28
|
+
|
29
|
+
ui = Gem::DefaultUserInteraction.ui
|
30
|
+
def ui.say(str)
|
31
|
+
puts "- #{str}"
|
32
|
+
end
|
33
|
+
|
34
|
+
yield
|
35
|
+
|
36
|
+
class << Gem::DefaultUserInteraction.ui
|
37
|
+
remove_method :say
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self._uninstall(source_index, name, op, version)
|
42
|
+
unless source_index.find_name(name, "#{op} #{version}").empty?
|
43
|
+
uninstaller = Gem::Uninstaller.new(
|
44
|
+
name,
|
45
|
+
:version => "#{op} #{version}",
|
46
|
+
:install_dir => Dir.pwd / "gems",
|
47
|
+
:all => true,
|
48
|
+
:ignore => true
|
49
|
+
)
|
50
|
+
_with_silent_ui { uninstaller.uninstall }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self._uninstall_others(source_index, name, version)
|
55
|
+
_uninstall(source_index, name, "<", version)
|
56
|
+
_uninstall(source_index, name, ">", version)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
Gem.post_install_hooks.push(proc do |installer|
|
61
|
+
$INSTALLING.pop
|
62
|
+
source_index = installer.instance_variable_get("@source_index")
|
63
|
+
::Gem::Uninstaller._uninstall_others(
|
64
|
+
source_index, installer.spec.name, installer.spec.version
|
65
|
+
)
|
66
|
+
end)
|
67
|
+
|
68
|
+
class ::Gem::DependencyInstaller
|
69
|
+
alias old_fg find_gems_with_sources
|
70
|
+
|
71
|
+
def find_gems_with_sources(dep)
|
72
|
+
if @source_index.any? { |_, installed_spec|
|
73
|
+
installed_spec.satisfies_requirement?(dep)
|
74
|
+
}
|
75
|
+
return []
|
76
|
+
end
|
77
|
+
|
78
|
+
old_fg(dep)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class ::Gem::SpecFetcher
|
83
|
+
alias old_fetch fetch
|
84
|
+
def fetch(dependency, all = false, matching_platform = true)
|
85
|
+
idx = Gem::SourceIndex.from_installed_gems
|
86
|
+
|
87
|
+
dep = idx.search(dependency).sort.last
|
88
|
+
|
89
|
+
if dep
|
90
|
+
file = dep.loaded_from.dup
|
91
|
+
file.gsub!(/specifications/, "cache")
|
92
|
+
file.gsub!(/gemspec$/, "gem")
|
93
|
+
spec = ::Gem::Format.from_file_by_path(file).spec
|
94
|
+
[[spec, file]]
|
95
|
+
else
|
96
|
+
old_fetch(dependency, all, matching_platform)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class ::Gem::Installer
|
102
|
+
def app_script_text(bin_file_name)
|
103
|
+
template = File.read(File.dirname(__FILE__) / "app_script.rb")
|
104
|
+
erb = ERB.new(template)
|
105
|
+
erb.result(binding)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class ::Gem::Specification
|
110
|
+
def recursive_dependencies(from, index = Gem.source_index)
|
111
|
+
specs = self.runtime_dependencies.map do |dep|
|
112
|
+
spec = index.search(dep).last
|
113
|
+
unless spec
|
114
|
+
from_name = from.is_a?(::Gem::Specification) ? from.full_name : from.to_s
|
115
|
+
wider_net = index.find_name(dep.name).last
|
116
|
+
ThorUI.error "Needed #{dep} for #{from_name}, but could not find it"
|
117
|
+
ThorUI.error "Found #{wider_net.full_name}" if wider_net
|
118
|
+
::Thor::Tasks::Merb::Gem.rollback_trans
|
119
|
+
end
|
120
|
+
spec
|
121
|
+
end
|
122
|
+
specs + specs.map {|s| s.recursive_dependencies(self, index)}.flatten.uniq
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rubygems/source_index"
|
3
|
+
require "rubygems/dependency_installer"
|
4
|
+
require "rubygems/uninstaller"
|
5
|
+
require "fileutils"
|
6
|
+
require File.join(File.dirname(__FILE__), "utils")
|
7
|
+
require File.join(File.dirname(__FILE__), "gem_ext")
|
8
|
+
require File.join(File.dirname(__FILE__), "ops")
|
9
|
+
|
10
|
+
$INSTALLING = []
|
11
|
+
|
12
|
+
module Merb
|
13
|
+
|
14
|
+
class Gem < Thor
|
15
|
+
extend ColorfulMessages
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
dirs = [Dir.pwd, File.dirname(__FILE__) / ".."]
|
19
|
+
root = dirs.find {|d| File.file?(d / "config" / "dependencies.rb")}
|
20
|
+
|
21
|
+
if root
|
22
|
+
@depsrb = root / "config" / "dependencies.rb"
|
23
|
+
else
|
24
|
+
self.class.error "dependencies.rb was not found"
|
25
|
+
exit!
|
26
|
+
end
|
27
|
+
|
28
|
+
FileUtils.mkdir_p(Dir.pwd / "gems")
|
29
|
+
|
30
|
+
@list = Collector.collect(File.read(@depsrb))
|
31
|
+
@idx = ::Gem::SourceIndex.new.load_gems_in("gems/specifications")
|
32
|
+
end
|
33
|
+
|
34
|
+
def list
|
35
|
+
require "pp"
|
36
|
+
pp @list
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "redeploy", "Syncs up gems/cache with gems/gems. All gems in the cache " \
|
40
|
+
"that are not already installed will be installed from the " \
|
41
|
+
"cache. All installed gems that are not in the cache will " \
|
42
|
+
"be uninstalled."
|
43
|
+
def redeploy
|
44
|
+
gem_dir = Dir.pwd / "gems" / "gems"
|
45
|
+
cache_dir = Dir.pwd / "gems" / "cache"
|
46
|
+
|
47
|
+
gems = Dir[gem_dir / "*"].map! {|n| File.basename(n)}
|
48
|
+
cache = Dir[cache_dir / "*.gem"].map! {|n| File.basename(n, ".gem")}
|
49
|
+
new_gems = cache - gems
|
50
|
+
outdated = gems - cache
|
51
|
+
idx = ::Gem::SourceIndex.new
|
52
|
+
idx.load_gems_in(Dir.pwd / "gems" / "specifications")
|
53
|
+
|
54
|
+
new_gems.each do |g|
|
55
|
+
installer = ::Gem::Installer.new(cache_dir / "#{g}.gem",
|
56
|
+
:bin_dir => Dir.pwd / "bin",
|
57
|
+
:install_dir => Dir.pwd / "gems",
|
58
|
+
:ignore_dependencies => true,
|
59
|
+
:user_install => false,
|
60
|
+
:wrappers => true,
|
61
|
+
:source_index => idx)
|
62
|
+
|
63
|
+
installer.install
|
64
|
+
end
|
65
|
+
|
66
|
+
outdated.each do |g|
|
67
|
+
/(.*)\-(.*)/ =~ g
|
68
|
+
name, version = $1, $2
|
69
|
+
uninstaller = ::Gem::Uninstaller.new(name,
|
70
|
+
:version => version,
|
71
|
+
:bin_dir => Dir.pwd / "bin",
|
72
|
+
:install_dir => Dir.pwd / "gems",
|
73
|
+
:ignore => true,
|
74
|
+
:executables => true
|
75
|
+
)
|
76
|
+
uninstaller.uninstall
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
desc "confirm", "Confirm the current setup. merb:gem:install will " \
|
81
|
+
"automatically run this task before committing the " \
|
82
|
+
"changes it makes."
|
83
|
+
def confirm(gems = @list)
|
84
|
+
::Gem.path.replace([Dir.pwd / "gems"])
|
85
|
+
::Gem.source_index.load_gems_in(Dir.pwd / "gems" / "specifications")
|
86
|
+
|
87
|
+
self.class.info "Confirming configuration..."
|
88
|
+
|
89
|
+
::Gem.loaded_specs.clear
|
90
|
+
|
91
|
+
begin
|
92
|
+
gems.each do |name, versions|
|
93
|
+
versions ||= []
|
94
|
+
::Gem.activate name, *versions
|
95
|
+
end
|
96
|
+
rescue ::Gem::LoadError => e
|
97
|
+
self.class.error "Configuration could not be confirmed: #{e.message}"
|
98
|
+
self.class.rollback_trans
|
99
|
+
end
|
100
|
+
self.class.info "Confirmed"
|
101
|
+
end
|
102
|
+
|
103
|
+
desc 'install', 'Sync up your bundled gems with the list in config/dependencies.rb'
|
104
|
+
def install(*gems)
|
105
|
+
if gems.empty?
|
106
|
+
gems = @list
|
107
|
+
else
|
108
|
+
gems = gems.map {|desc| name, *versions = desc.split(" ") }
|
109
|
+
end
|
110
|
+
|
111
|
+
$GEMS = gems
|
112
|
+
|
113
|
+
self.class.begin_trans
|
114
|
+
|
115
|
+
gems.each do |name, versions|
|
116
|
+
dep = ::Gem::Dependency.new(name, versions || [])
|
117
|
+
unless @idx.search(dep).empty?
|
118
|
+
next
|
119
|
+
end
|
120
|
+
|
121
|
+
rescue_failures do
|
122
|
+
$INSTALLING = []
|
123
|
+
_install(dep)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
gem_dir = Dir.pwd / "gems" / "gems"
|
128
|
+
installed_gems = Dir[gem_dir / "*"].map! {|n| File.basename(n)}
|
129
|
+
|
130
|
+
list = full_list.map {|x| x.full_name}.compact
|
131
|
+
|
132
|
+
(installed_gems - list).each do |g|
|
133
|
+
/^(.*)\-(.*)$/ =~ g
|
134
|
+
name, version = $1, $2
|
135
|
+
uninstaller = ::Gem::Uninstaller.new(name,
|
136
|
+
:version => version,
|
137
|
+
:bin_dir => (Dir.pwd / "bin").to_s,
|
138
|
+
:install_dir => (Dir.pwd / "gems").to_s,
|
139
|
+
:ignore => true,
|
140
|
+
:executables => true
|
141
|
+
)
|
142
|
+
uninstaller.uninstall
|
143
|
+
end
|
144
|
+
|
145
|
+
confirm(gems)
|
146
|
+
|
147
|
+
self.class.commit_trans
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|