akephalos2 2.0.7-java

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.
Files changed (38) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.md +330 -0
  3. data/bin/akephalos +102 -0
  4. data/lib/akephalos/capybara.rb +347 -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 +31 -0
  14. data/lib/akephalos/node.rb +192 -0
  15. data/lib/akephalos/page.rb +118 -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-lang3-3.0.1.jar +0 -0
  25. data/vendor/html-unit/commons-logging-1.1.1.jar +0 -0
  26. data/vendor/html-unit/cssparser-0.9.6-20110829.205617-3.jar +0 -0
  27. data/vendor/html-unit/htmlunit-2.10-SNAPSHOT.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.7"
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
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: akephalos2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.7
5
+ prerelease:
6
+ platform: java
7
+ authors:
8
+ - Bernerd Schaefer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: capybara
16
+ requirement: &70230659428980 !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: *70230659428980
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70230659426900 !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: *70230659426900
36
+ - !ruby/object:Gem::Dependency
37
+ name: sinatra
38
+ requirement: &70230659440860 !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: *70230659440860
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70230659437760 !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: *70230659437760
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-lang3-3.0.1.jar
86
+ - vendor/html-unit/commons-logging-1.1.1.jar
87
+ - vendor/html-unit/cssparser-0.9.6-20110829.205617-3.jar
88
+ - vendor/html-unit/htmlunit-2.10-SNAPSHOT.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: '0'
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: []