akephalos 0.0.3 → 0.0.4
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/TODO.txt +7 -1
- data/VERSION +1 -1
- data/akephalos.gemspec +6 -3
- data/bin/akephalos +32 -6
- data/lib/akephalos/capybara.rb +3 -1
- data/lib/akephalos/client.rb +39 -4
- data/lib/akephalos/console.rb +27 -0
- data/lib/akephalos/node.rb +2 -0
- data/lib/akephalos/remote_client.rb +2 -0
- data/lib/akephalos/server.rb +2 -12
- data/spec/slow_page_loads_spec.rb +66 -0
- data/src/{jruby-complete-1.4.0.jar → jruby-complete-1.5.0.jar} +0 -0
- metadata +7 -4
data/TODO.txt
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
2
2
|
=======================================================================================
|
3
3
|
* DRb server should never shut down prematurely -- missing methods, 500 errors,
|
4
4
|
even java errors (NPE error from bad javascript).
|
5
5
|
|
6
|
+
0.0.4
|
7
|
+
=======================================================================================
|
8
|
+
- Update to jruby 1.5
|
9
|
+
- bin/akephalos for interactive mode
|
10
|
+
- use internally managed java threading instead of capybara's own wait methods
|
11
|
+
|
6
12
|
0.0.3
|
7
13
|
=======================================================================================
|
8
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/akephalos.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{akephalos}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bernerd Schaefer"]
|
12
|
-
s.date = %q{2010-06-
|
12
|
+
s.date = %q{2010-06-15}
|
13
13
|
s.default_executable = %q{akephalos}
|
14
14
|
s.description = %q{}
|
15
15
|
s.email = %q{bj.schaefer@gmail.com}
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/akephalos.rb",
|
29
29
|
"lib/akephalos/capybara.rb",
|
30
30
|
"lib/akephalos/client.rb",
|
31
|
+
"lib/akephalos/console.rb",
|
31
32
|
"lib/akephalos/cucumber.rb",
|
32
33
|
"lib/akephalos/htmlunit.rb",
|
33
34
|
"lib/akephalos/node.rb",
|
@@ -36,6 +37,7 @@ Gem::Specification.new do |s|
|
|
36
37
|
"lib/akephalos/server.rb",
|
37
38
|
"spec/driver/akephalos_driver_spec.rb",
|
38
39
|
"spec/session/akephalos_session_spec.rb",
|
40
|
+
"spec/slow_page_loads_spec.rb",
|
39
41
|
"spec/spec.opts",
|
40
42
|
"spec/spec_helper.rb",
|
41
43
|
"src/commons-codec-1.4.jar",
|
@@ -47,7 +49,7 @@ Gem::Specification.new do |s|
|
|
47
49
|
"src/cssparser-0.9.5.jar",
|
48
50
|
"src/htmlunit-2.6.jar",
|
49
51
|
"src/htmlunit-core-js-2.6.jar",
|
50
|
-
"src/jruby-complete-1.
|
52
|
+
"src/jruby-complete-1.5.0.jar",
|
51
53
|
"src/nekohtml-1.9.13.jar",
|
52
54
|
"src/sac-1.3.jar",
|
53
55
|
"src/serializer-2.7.1.jar",
|
@@ -63,6 +65,7 @@ Gem::Specification.new do |s|
|
|
63
65
|
s.test_files = [
|
64
66
|
"spec/driver/akephalos_driver_spec.rb",
|
65
67
|
"spec/session/akephalos_session_spec.rb",
|
68
|
+
"spec/slow_page_loads_spec.rb",
|
66
69
|
"spec/spec_helper.rb"
|
67
70
|
]
|
68
71
|
|
data/bin/akephalos
CHANGED
@@ -1,13 +1,39 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# vim:set filetype=ruby:
|
3
3
|
|
4
|
-
|
5
|
-
require
|
4
|
+
require "pathname"
|
5
|
+
require "optparse"
|
6
|
+
|
7
|
+
options = { :interactive => false }
|
8
|
+
|
9
|
+
parser = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: akephalos [--interactive] | [--server] <socket_file>"
|
11
|
+
opts.on("-s", "--server", "Run in server mode (default)")
|
12
|
+
opts.on("-i", "--interactive", "Run in interactive mode") { options[:interactive] = true }
|
13
|
+
|
14
|
+
opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
|
15
|
+
end
|
16
|
+
parser.parse!
|
6
17
|
|
7
18
|
root = Pathname(__FILE__).expand_path.dirname.parent
|
8
19
|
lib = root + 'lib'
|
9
|
-
jruby = root + "src/jruby-complete-1.
|
10
|
-
|
20
|
+
jruby = root + "src/jruby-complete-1.5.0.jar"
|
21
|
+
jruby_cmd = %Q(java -Xmx2048M -jar #{jruby} -I#{lib})
|
22
|
+
|
23
|
+
if options[:interactive]
|
24
|
+
$:.unshift(lib)
|
25
|
+
require 'rubygems'
|
26
|
+
require 'akephalos'
|
27
|
+
require 'akephalos/console'
|
28
|
+
Akephalos::Console.start
|
29
|
+
else
|
30
|
+
unless socket_file = ARGV[0]
|
31
|
+
puts parser.help
|
32
|
+
exit
|
33
|
+
end
|
34
|
+
|
35
|
+
server = 'akephalos/server'
|
11
36
|
|
12
|
-
command = %Q(
|
13
|
-
exec command %
|
37
|
+
command = %Q(#{jruby_cmd} -r#{server} -e 'Akephalos::Server.start!(%s)')
|
38
|
+
exec command % socket_file.inspect
|
39
|
+
end
|
data/lib/akephalos/capybara.rb
CHANGED
data/lib/akephalos/client.rb
CHANGED
@@ -8,21 +8,56 @@ else
|
|
8
8
|
|
9
9
|
module Akephalos
|
10
10
|
class Client
|
11
|
+
attr_reader :page
|
12
|
+
|
11
13
|
def initialize
|
12
14
|
@_client = WebClient.new
|
15
|
+
|
16
|
+
@_client.setAjaxController(com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController.new)
|
17
|
+
|
18
|
+
listener = Class.new do
|
19
|
+
include com.gargoylesoftware.htmlunit.WebWindowListener
|
20
|
+
|
21
|
+
def initialize(client)
|
22
|
+
@client = client
|
23
|
+
end
|
24
|
+
|
25
|
+
def webWindowContentChanged(event)
|
26
|
+
@client.page = event.getNewPage
|
27
|
+
if latch = Thread.current[:latch]
|
28
|
+
latch.countDown
|
29
|
+
Thread.current[:latch] = nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
@_client.addWebWindowListener(listener.new(self))
|
13
35
|
@_client.setCssErrorHandler(com.gargoylesoftware.htmlunit.SilentCssErrorHandler.new)
|
14
36
|
end
|
15
37
|
|
16
38
|
def visit(url)
|
17
|
-
|
39
|
+
self.class.wait_for_result do
|
40
|
+
@_client.getPage(url)
|
41
|
+
end
|
18
42
|
end
|
19
43
|
|
20
|
-
def page
|
21
|
-
if @page !=
|
22
|
-
@page = Page.new(
|
44
|
+
def page=(_page)
|
45
|
+
if @page != _page
|
46
|
+
@page = Page.new(_page)
|
23
47
|
end
|
24
48
|
@page
|
25
49
|
end
|
50
|
+
|
51
|
+
def self.wait_for_result(timeout = 3)
|
52
|
+
latch = java.util.concurrent.CountDownLatch.new(1)
|
53
|
+
Thread.new do
|
54
|
+
Thread.current[:latch] = latch
|
55
|
+
yield
|
56
|
+
end.join
|
57
|
+
start = Time.now
|
58
|
+
latch.await(timeout, java.util.concurrent.TimeUnit::SECONDS)
|
59
|
+
end
|
60
|
+
|
26
61
|
end
|
27
62
|
end
|
28
63
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
def session
|
2
|
+
Capybara.app_host = "http://localhost:8070"
|
3
|
+
@session ||= Capybara::Session.new(:Akephalos)
|
4
|
+
end
|
5
|
+
alias page session
|
6
|
+
|
7
|
+
module Akephalos
|
8
|
+
class Console
|
9
|
+
|
10
|
+
def self.start
|
11
|
+
require 'irb'
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'irb/completion'
|
15
|
+
rescue Exception
|
16
|
+
# No readline available, proceed anyway.
|
17
|
+
end
|
18
|
+
|
19
|
+
if ::File.exists? ".irbrc"
|
20
|
+
ENV['IRBRC'] = ".irbrc"
|
21
|
+
end
|
22
|
+
|
23
|
+
IRB.start
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/lib/akephalos/node.rb
CHANGED
data/lib/akephalos/server.rb
CHANGED
@@ -9,18 +9,8 @@ class NameError::Message
|
|
9
9
|
end
|
10
10
|
|
11
11
|
[
|
12
|
-
|
13
|
-
|
14
|
-
com.gargoylesoftware.htmlunit.html.DomNode,
|
15
|
-
com.gargoylesoftware.htmlunit.html.DomElement,
|
16
|
-
com.gargoylesoftware.htmlunit.html.HtmlAnchor,
|
17
|
-
com.gargoylesoftware.htmlunit.html.HtmlElement,
|
18
|
-
com.gargoylesoftware.htmlunit.html.HtmlPage,
|
19
|
-
org.w3c.dom.Node,
|
20
|
-
org.w3c.dom.NamedNodeMap,
|
21
|
-
com.gargoylesoftware.htmlunit.WebClient,
|
22
|
-
com.gargoylesoftware.htmlunit.WebResponse,
|
23
|
-
com.gargoylesoftware.htmlunit.WebRequestSettings
|
12
|
+
Akephalos::Page,
|
13
|
+
Akephalos::Node
|
24
14
|
].each { |klass| klass.send(:include, DRbUndumped) }
|
25
15
|
|
26
16
|
module Akephalos
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class SlowApp < TestApp
|
4
|
+
get '/slow_page' do
|
5
|
+
sleep 1
|
6
|
+
"<p>Loaded!</p>"
|
7
|
+
end
|
8
|
+
|
9
|
+
get '/really_slow_page' do
|
10
|
+
sleep 5
|
11
|
+
end
|
12
|
+
|
13
|
+
get '/slow_ajax_load' do
|
14
|
+
<<-HTML
|
15
|
+
<head>
|
16
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
17
|
+
<title>with_js</title>
|
18
|
+
<script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
|
19
|
+
<script type="text/javascript">
|
20
|
+
$(function() {
|
21
|
+
$('#ajax_load').click(function() {
|
22
|
+
// $('body').html("<p>Loaded!</p>");
|
23
|
+
$('body').load('/slow_page');
|
24
|
+
return false;
|
25
|
+
});
|
26
|
+
});
|
27
|
+
</script>
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<a href="#" id="ajax_load">Click me</a>
|
31
|
+
</body>
|
32
|
+
HTML
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if $0 == __FILE__
|
37
|
+
if __FILE__ == $0
|
38
|
+
Rack::Handler::Mongrel.run SlowApp, :Port => 8070
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe Capybara::Session do
|
43
|
+
context 'with akephalos driver' do
|
44
|
+
|
45
|
+
before do
|
46
|
+
@session = Capybara::Session.new(:akephalos, SlowApp)
|
47
|
+
end
|
48
|
+
|
49
|
+
context "slow page load" do
|
50
|
+
it "should wait for the page to finish loading" do
|
51
|
+
@session.visit('/slow_page')
|
52
|
+
@session.current_url.should include('/slow_page')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "slow ajax load" do
|
57
|
+
it "should wait for ajax to load" do
|
58
|
+
@session.visit('/slow_ajax_load')
|
59
|
+
@session.click_link('Click me')
|
60
|
+
@session.should have_xpath("//p[contains(.,'Loaded!')]")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
Binary file
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Bernerd Schaefer
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-15 00:00:00 -05:00
|
18
18
|
default_executable: akephalos
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/akephalos.rb
|
77
77
|
- lib/akephalos/capybara.rb
|
78
78
|
- lib/akephalos/client.rb
|
79
|
+
- lib/akephalos/console.rb
|
79
80
|
- lib/akephalos/cucumber.rb
|
80
81
|
- lib/akephalos/htmlunit.rb
|
81
82
|
- lib/akephalos/node.rb
|
@@ -84,6 +85,7 @@ files:
|
|
84
85
|
- lib/akephalos/server.rb
|
85
86
|
- spec/driver/akephalos_driver_spec.rb
|
86
87
|
- spec/session/akephalos_session_spec.rb
|
88
|
+
- spec/slow_page_loads_spec.rb
|
87
89
|
- spec/spec.opts
|
88
90
|
- spec/spec_helper.rb
|
89
91
|
- src/commons-codec-1.4.jar
|
@@ -95,7 +97,7 @@ files:
|
|
95
97
|
- src/cssparser-0.9.5.jar
|
96
98
|
- src/htmlunit-2.6.jar
|
97
99
|
- src/htmlunit-core-js-2.6.jar
|
98
|
-
- src/jruby-complete-1.
|
100
|
+
- src/jruby-complete-1.5.0.jar
|
99
101
|
- src/nekohtml-1.9.13.jar
|
100
102
|
- src/sac-1.3.jar
|
101
103
|
- src/serializer-2.7.1.jar
|
@@ -135,4 +137,5 @@ summary: ""
|
|
135
137
|
test_files:
|
136
138
|
- spec/driver/akephalos_driver_spec.rb
|
137
139
|
- spec/session/akephalos_session_spec.rb
|
140
|
+
- spec/slow_page_loads_spec.rb
|
138
141
|
- spec/spec_helper.rb
|