akephalos2 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.md +287 -0
  3. data/bin/akephalos +102 -0
  4. data/lib/akephalos/capybara.rb +343 -0
  5. data/lib/akephalos/client/cookies.rb +73 -0
  6. data/lib/akephalos/client/filter.rb +120 -0
  7. data/lib/akephalos/client.rb +192 -0
  8. data/lib/akephalos/configuration.rb +49 -0
  9. data/lib/akephalos/console.rb +32 -0
  10. data/lib/akephalos/cucumber.rb +6 -0
  11. data/lib/akephalos/htmlunit/ext/confirm_handler.rb +18 -0
  12. data/lib/akephalos/htmlunit/ext/http_method.rb +30 -0
  13. data/lib/akephalos/htmlunit.rb +36 -0
  14. data/lib/akephalos/node.rb +192 -0
  15. data/lib/akephalos/page.rb +113 -0
  16. data/lib/akephalos/remote_client.rb +93 -0
  17. data/lib/akephalos/server.rb +79 -0
  18. data/lib/akephalos/version.rb +3 -0
  19. data/lib/akephalos.rb +19 -0
  20. data/vendor/html-unit/apache-mime4j-0.6.jar +0 -0
  21. data/vendor/html-unit/commons-codec-1.4.jar +0 -0
  22. data/vendor/html-unit/commons-collections-3.2.1.jar +0 -0
  23. data/vendor/html-unit/commons-io-2.0.1.jar +0 -0
  24. data/vendor/html-unit/commons-lang-2.6.jar +0 -0
  25. data/vendor/html-unit/commons-logging-1.1.1.jar +0 -0
  26. data/vendor/html-unit/cssparser-0.9.5.jar +0 -0
  27. data/vendor/html-unit/htmlunit-2.9.jar +0 -0
  28. data/vendor/html-unit/htmlunit-core-js-2.9.jar +0 -0
  29. data/vendor/html-unit/httpclient-4.1.2.jar +0 -0
  30. data/vendor/html-unit/httpcore-4.1.2.jar +0 -0
  31. data/vendor/html-unit/httpmime-4.1.2.jar +0 -0
  32. data/vendor/html-unit/nekohtml-1.9.15.jar +0 -0
  33. data/vendor/html-unit/sac-1.3.jar +0 -0
  34. data/vendor/html-unit/serializer-2.7.1.jar +0 -0
  35. data/vendor/html-unit/xalan-2.7.1.jar +0 -0
  36. data/vendor/html-unit/xercesImpl-2.9.1.jar +0 -0
  37. data/vendor/html-unit/xml-apis-1.3.04.jar +0 -0
  38. metadata +127 -0
@@ -0,0 +1,93 @@
1
+ require 'socket'
2
+ require 'drb/drb'
3
+
4
+ # We need to define our own NativeException class for the cases when a native
5
+ # exception is raised by the JRuby DRb server.
6
+ class NativeException < StandardError; end
7
+
8
+ module Akephalos
9
+
10
+ # The +RemoteClient+ class provides an interface to an +Akephalos::Client+
11
+ # isntance on a remote DRb server.
12
+ #
13
+ # == Usage
14
+ # client = Akephalos::RemoteClient.new
15
+ # client.visit "http://www.oinopa.com"
16
+ # client.page.source # => "<!DOCTYPE html PUBLIC..."
17
+ class RemoteClient
18
+
19
+ # @return [DRbObject] a new instance of Akephalos::Client from the DRb
20
+ # server
21
+ def self.new(options = {})
22
+ manager.new_client(options)
23
+ end
24
+
25
+ # Starts a remove JRuby DRb server unless already running and returns an
26
+ # instance of Akephalos::ClientManager.
27
+ #
28
+ # @return [DRbObject] an instance of Akephalos::ClientManager
29
+ def self.manager
30
+ return @manager if defined?(@manager)
31
+
32
+ server_port = start!
33
+
34
+ DRb.start_service("druby://127.0.0.1:#{find_available_port}")
35
+ manager = DRbObject.new_with_uri("druby://127.0.0.1:#{server_port}")
36
+
37
+ # We want to share our local configuration with the remote server
38
+ # process, so we share an undumped version of our configuration. This
39
+ # lets us continue to make changes locally and have them reflected in the
40
+ # remote process.
41
+ manager.configuration = Akephalos.configuration.extend(DRbUndumped)
42
+
43
+ @manager = manager
44
+ end
45
+
46
+ # Start a remote server process and return when it is available for use.
47
+ def self.start!
48
+ port = find_available_port
49
+
50
+ remote_client = IO.popen("ruby #{Akephalos::BIN_DIR + 'akephalos'} #{port}")
51
+
52
+ # Set up a monitor thread to detect if the forked server exits
53
+ # prematurely.
54
+ server_monitor = Thread.new { Thread.current[:exited] = Process.wait(remote_client.pid) }
55
+
56
+ # Wait for the server to be accessible on the socket we specified.
57
+ until responsive?(port)
58
+ exit!(1) if server_monitor[:exited]
59
+ sleep 0.5
60
+ end
61
+ server_monitor.kill
62
+
63
+ # Ensure that the remote server shuts down gracefully when we are
64
+ # finished.
65
+ at_exit { Process.kill(:INT, remote_client.pid) }
66
+
67
+ port
68
+ end
69
+
70
+ private
71
+
72
+ # @api private
73
+ # @param [Integer] port the port to check for responsiveness
74
+ # @return [true, false] whether the port is responsive
75
+ def self.responsive?(port)
76
+ socket = TCPSocket.open('127.0.0.1', port)
77
+ true
78
+ rescue Errno::ECONNREFUSED
79
+ false
80
+ ensure
81
+ socket.close if socket
82
+ end
83
+
84
+ # @api private
85
+ # @return [Integer] the next available port
86
+ def self.find_available_port
87
+ server = TCPServer.new('127.0.0.1', 0)
88
+ server.addr[1]
89
+ ensure
90
+ server.close if server
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,79 @@
1
+ require "pathname"
2
+ require "drb/drb"
3
+ require "akephalos/client"
4
+
5
+ # In ruby-1.8.7 and later, the message for a NameError exception is lazily
6
+ # evaluated. There are, however, different implementations of this between ruby
7
+ # and jruby, so we realize these messages when sending over DRb.
8
+ class NameError::Message
9
+ # @note This method is called by DRb before sending the error to the remote
10
+ # connection.
11
+ # @return [String] the inner message.
12
+ def _dump
13
+ to_s
14
+ end
15
+ end
16
+
17
+ [
18
+ Akephalos::Page,
19
+ Akephalos::Node,
20
+ Akephalos::Client::Cookies,
21
+ Akephalos::Client::Cookies::Cookie
22
+ ].each { |klass| klass.send(:include, DRbUndumped) }
23
+
24
+ module Akephalos
25
+
26
+ # The ClientManager is shared over DRb with the remote process, and
27
+ # facilitates communication between the processes.
28
+ #
29
+ # @api private
30
+ class ClientManager
31
+ include DRbUndumped
32
+
33
+ # @return [Akephalos::Client] a new client instance
34
+ def self.new_client(options = {})
35
+ # Store the client to ensure it isn't prematurely garbage collected.
36
+ @client = Client.new(options)
37
+ end
38
+
39
+ # Set the global configuration settings for Akephalos.
40
+ #
41
+ # @param [Hash] config the configuration settings
42
+ # @return [Hash] the configuration
43
+ def self.configuration=(config)
44
+ Akephalos.configuration = config
45
+ end
46
+
47
+ end
48
+
49
+ # Akephalos::Server is used by `akephalos --server` to start a DRb server
50
+ # serving Akephalos::ClientManager.
51
+ class Server
52
+
53
+ # Start DRb service for Akephalos::ClientManager.
54
+ #
55
+ # @param [String] port attach server to
56
+ def self.start!(port)
57
+ abort_on_parent_exit!
58
+ DRb.start_service("druby://127.0.0.1:#{port}", ClientManager)
59
+ DRb.thread.join
60
+ end
61
+
62
+ private
63
+
64
+ # Exit if STDIN is no longer readable, which corresponds to the process
65
+ # which started the server exiting prematurely.
66
+ #
67
+ # @api private
68
+ def self.abort_on_parent_exit!
69
+ Thread.new do
70
+ begin
71
+ STDIN.read
72
+ rescue IOError
73
+ exit
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,3 @@
1
+ module Akephalos #:nodoc
2
+ VERSION = "2.0.0"
3
+ end
data/lib/akephalos.rb ADDED
@@ -0,0 +1,19 @@
1
+ # **Akephalos** is a cross-platform Ruby interface for *HtmlUnit*, a headless
2
+ # browser for the Java platform.
3
+ #
4
+ # The only requirement is that a Java runtime is available.
5
+ #
6
+ require 'java' if RUBY_PLATFORM == 'java'
7
+ require 'pathname'
8
+
9
+ module Akephalos
10
+ BIN_DIR = Pathname(__FILE__).expand_path.dirname.parent + 'bin'
11
+ end
12
+
13
+ require 'akephalos/client'
14
+ require 'capybara'
15
+ require 'akephalos/capybara'
16
+
17
+ Capybara.register_driver :akephalos do |app|
18
+ Capybara::Driver::Akephalos.new(app)
19
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: akephalos2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Bernerd Schaefer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: capybara
16
+ requirement: &70350323500100 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70350323500100
25
+ - !ruby/object:Gem::Dependency
26
+ name: jruby-jars
27
+ requirement: &70350323499320 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70350323499320
36
+ - !ruby/object:Gem::Dependency
37
+ name: sinatra
38
+ requirement: &70350323498720 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70350323498720
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70350323498120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70350323498120
58
+ description: Headless Browser for Integration Testing with Capybara
59
+ email: bj.schaefer@gmail.com
60
+ executables:
61
+ - akephalos
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - lib/akephalos/capybara.rb
66
+ - lib/akephalos/client/cookies.rb
67
+ - lib/akephalos/client/filter.rb
68
+ - lib/akephalos/client.rb
69
+ - lib/akephalos/configuration.rb
70
+ - lib/akephalos/console.rb
71
+ - lib/akephalos/cucumber.rb
72
+ - lib/akephalos/htmlunit/ext/confirm_handler.rb
73
+ - lib/akephalos/htmlunit/ext/http_method.rb
74
+ - lib/akephalos/htmlunit.rb
75
+ - lib/akephalos/node.rb
76
+ - lib/akephalos/page.rb
77
+ - lib/akephalos/remote_client.rb
78
+ - lib/akephalos/server.rb
79
+ - lib/akephalos/version.rb
80
+ - lib/akephalos.rb
81
+ - vendor/html-unit/apache-mime4j-0.6.jar
82
+ - vendor/html-unit/commons-codec-1.4.jar
83
+ - vendor/html-unit/commons-collections-3.2.1.jar
84
+ - vendor/html-unit/commons-io-2.0.1.jar
85
+ - vendor/html-unit/commons-lang-2.6.jar
86
+ - vendor/html-unit/commons-logging-1.1.1.jar
87
+ - vendor/html-unit/cssparser-0.9.5.jar
88
+ - vendor/html-unit/htmlunit-2.9.jar
89
+ - vendor/html-unit/htmlunit-core-js-2.9.jar
90
+ - vendor/html-unit/httpclient-4.1.2.jar
91
+ - vendor/html-unit/httpcore-4.1.2.jar
92
+ - vendor/html-unit/httpmime-4.1.2.jar
93
+ - vendor/html-unit/nekohtml-1.9.15.jar
94
+ - vendor/html-unit/sac-1.3.jar
95
+ - vendor/html-unit/serializer-2.7.1.jar
96
+ - vendor/html-unit/xalan-2.7.1.jar
97
+ - vendor/html-unit/xercesImpl-2.9.1.jar
98
+ - vendor/html-unit/xml-apis-1.3.04.jar
99
+ - README.md
100
+ - MIT_LICENSE
101
+ - bin/akephalos
102
+ homepage: https://github.com/Nerian/akephalos
103
+ licenses: []
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ - vendor
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: 1.3.6
121
+ requirements: []
122
+ rubyforge_project: akephalos
123
+ rubygems_version: 1.8.10
124
+ signing_key:
125
+ specification_version: 3
126
+ summary: Headless Browser for Integration Testing with Capybara
127
+ test_files: []