jarib-celerity 0.0.5

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 (69) hide show
  1. data/History.txt +42 -0
  2. data/License.txt +621 -0
  3. data/README.txt +64 -0
  4. data/Rakefile +12 -0
  5. data/lib/celerity.rb +59 -0
  6. data/lib/celerity/browser.rb +410 -0
  7. data/lib/celerity/clickable_element.rb +26 -0
  8. data/lib/celerity/collections.rb +148 -0
  9. data/lib/celerity/container.rb +488 -0
  10. data/lib/celerity/default_viewer.rb +10 -0
  11. data/lib/celerity/disabled_element.rb +27 -0
  12. data/lib/celerity/element.rb +241 -0
  13. data/lib/celerity/element_collections.rb +68 -0
  14. data/lib/celerity/element_locator.rb +167 -0
  15. data/lib/celerity/elements/button.rb +34 -0
  16. data/lib/celerity/elements/file_field.rb +17 -0
  17. data/lib/celerity/elements/form.rb +16 -0
  18. data/lib/celerity/elements/frame.rb +53 -0
  19. data/lib/celerity/elements/image.rb +57 -0
  20. data/lib/celerity/elements/label.rb +9 -0
  21. data/lib/celerity/elements/link.rb +12 -0
  22. data/lib/celerity/elements/meta.rb +6 -0
  23. data/lib/celerity/elements/non_control_elements.rb +93 -0
  24. data/lib/celerity/elements/option.rb +18 -0
  25. data/lib/celerity/elements/radio_check.rb +85 -0
  26. data/lib/celerity/elements/select_list.rb +81 -0
  27. data/lib/celerity/elements/table.rb +117 -0
  28. data/lib/celerity/elements/table_cell.rb +28 -0
  29. data/lib/celerity/elements/table_elements.rb +41 -0
  30. data/lib/celerity/elements/table_row.rb +36 -0
  31. data/lib/celerity/elements/text_field.rb +127 -0
  32. data/lib/celerity/exception.rb +40 -0
  33. data/lib/celerity/extra/method_generator.rb +158 -0
  34. data/lib/celerity/htmlunit.rb +41 -0
  35. data/lib/celerity/htmlunit/commons-codec-1.3.jar +0 -0
  36. data/lib/celerity/htmlunit/commons-collections-3.2.1.jar +0 -0
  37. data/lib/celerity/htmlunit/commons-httpclient-3.1.jar +0 -0
  38. data/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
  39. data/lib/celerity/htmlunit/commons-lang-2.4.jar +0 -0
  40. data/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
  41. data/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
  42. data/lib/celerity/htmlunit/htmlunit-2.4-SNAPSHOT.jar +0 -0
  43. data/lib/celerity/htmlunit/htmlunit-core-js-2.4-SNAPSHOT.jar +0 -0
  44. data/lib/celerity/htmlunit/nekohtml-1.9.10-20081209.100757-4.jar +0 -0
  45. data/lib/celerity/htmlunit/sac-1.3.jar +0 -0
  46. data/lib/celerity/htmlunit/serializer-2.7.1.jar +0 -0
  47. data/lib/celerity/htmlunit/xalan-2.7.1.jar +0 -0
  48. data/lib/celerity/htmlunit/xercesImpl-2.8.1.jar +0 -0
  49. data/lib/celerity/htmlunit/xml-apis-1.3.04.jar +0 -0
  50. data/lib/celerity/identifier.rb +11 -0
  51. data/lib/celerity/input_element.rb +25 -0
  52. data/lib/celerity/listener.rb +106 -0
  53. data/lib/celerity/resources/no_viewer.png +0 -0
  54. data/lib/celerity/util.rb +79 -0
  55. data/lib/celerity/version.rb +9 -0
  56. data/lib/celerity/watir_compatibility.rb +85 -0
  57. data/tasks/benchmark.rake +4 -0
  58. data/tasks/deployment.rake +43 -0
  59. data/tasks/environment.rake +7 -0
  60. data/tasks/fix.rake +25 -0
  61. data/tasks/jar.rake +57 -0
  62. data/tasks/rdoc.rake +4 -0
  63. data/tasks/rspec.rake +30 -0
  64. data/tasks/simple_ci.rake +94 -0
  65. data/tasks/snapshot.rake +26 -0
  66. data/tasks/specserver.rake +21 -0
  67. data/tasks/website.rake +17 -0
  68. data/tasks/yard.rake +5 -0
  69. metadata +129 -0
@@ -0,0 +1,41 @@
1
+ module Celerity
2
+ Jars = Dir[File.dirname(__FILE__) + '/htmlunit/*.jar']
3
+ end
4
+
5
+ Celerity::Jars.each { |jar| require(jar) }
6
+
7
+ module HtmlUnit
8
+ include_package 'com.gargoylesoftware.htmlunit'
9
+
10
+ module Html
11
+ include_package 'com.gargoylesoftware.htmlunit.html'
12
+ end
13
+
14
+ module Util
15
+ include_package 'com.gargoylesoftware.htmlunit.util'
16
+ end
17
+
18
+ end
19
+
20
+ module Java::OrgW3cDom::NamedNodeMap
21
+ include Enumerable
22
+
23
+ def each
24
+ 0.upto(getLength - 1) do |idx|
25
+ yield item(idx)
26
+ end
27
+ end
28
+ end
29
+
30
+ # this will be added in JRuby 1.1.6
31
+ module Java::JavaLang::Iterable
32
+ include Enumerable
33
+
34
+ def each
35
+ it = iterator
36
+ yield it.next while it.hasNext
37
+ end
38
+
39
+ end
40
+
41
+
Binary file
@@ -0,0 +1,11 @@
1
+ module Celerity
2
+
3
+ Identifier = Struct.new(:tag, :attributes) do
4
+ attr_accessor :text
5
+
6
+ def initialize(t, a={})
7
+ super(t, a)
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,25 @@
1
+ module Celerity
2
+ class InputElement < Element
3
+ include ClickableElement
4
+ include DisabledElement
5
+
6
+ ATTRIBUTES = BASE_ATTRIBUTES | [:type, :name, :value, :checked, :disabled, :readonly, :size, :maxlength,
7
+ :src, :alt, :usemap, :ismap, :tabindex, :accesskey, :onfocus, :onblur,
8
+ :onselect, :onchange, :accept, :align]
9
+
10
+ def readonly?
11
+ assert_exists
12
+ @object.isAttributeDefined('readonly')
13
+ end
14
+
15
+ private
16
+
17
+ def assert_not_readonly
18
+ if readonly?
19
+ raise ObjectReadOnlyException,
20
+ "InputElement #{identifier_string} is read only."
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,106 @@
1
+ module Celerity
2
+
3
+ # This class is used to wrap some of the various listeners available
4
+ # from HtmlUnit's WebClient.
5
+ class Listener
6
+ include com.gargoylesoftware.htmlunit.AlertHandler
7
+ include com.gargoylesoftware.htmlunit.ConfirmHandler
8
+ include com.gargoylesoftware.htmlunit.PromptHandler
9
+ include com.gargoylesoftware.htmlunit.html.HTMLParserListener
10
+ include com.gargoylesoftware.htmlunit.IncorrectnessListener
11
+ include com.gargoylesoftware.htmlunit.StatusHandler
12
+ include com.gargoylesoftware.htmlunit.WebWindowListener
13
+ include com.gargoylesoftware.htmlunit.attachment.AttachmentHandler
14
+
15
+ def initialize(webclient)
16
+ @webclient = webclient
17
+ @procs = Hash.new { |h, k| h[k] = [] }
18
+ end
19
+
20
+ # Add a listener block for one of the available types.
21
+ # @see Celerity::Browser#add_listener
22
+ def add_listener(type, &block)
23
+ case type
24
+ when :status
25
+ @webclient.setStatusHandler(self)
26
+ when :alert
27
+ @webclient.setAlertHandler(self)
28
+ when :attachment
29
+ @webclient.setAttachmentHandler(self)
30
+ when :web_window_event
31
+ @webclient.addWebWindowListener(self)
32
+ when :html_parser
33
+ @webclient.setHTMLParserListener(self)
34
+ when :incorrectness
35
+ @webclient.setIncorrectnessListener(self)
36
+ when :confirm
37
+ @webclient.setConfirmHandler(self)
38
+ when :prompt
39
+ @webclient.setPromptHandler(self)
40
+ else
41
+ raise ArgumentError, "unknown listener type #{type.inspect}"
42
+ end
43
+
44
+ @procs[type] << block
45
+ end
46
+
47
+ def remove_listener(type, proc_or_index)
48
+ unless @procs.has_key?(type)
49
+ raise ArgumentError, "unknown listener type #{type.inspect}"
50
+ end
51
+
52
+ case proc_or_index
53
+ when Fixnum
54
+ @procs[type].delete_at proc_or_index
55
+ when Proc
56
+ @procs[type].delete proc_or_index
57
+ else
58
+ raise TypeError, "must give proc or index"
59
+ end
60
+ end
61
+
62
+ # interface StatusHandler
63
+ def statusMessageChanged(page, message)
64
+ @procs[:status].each { |h| h.call(page, message) }
65
+ end
66
+
67
+ # interface AlertHandler
68
+ def handleAlert(page, message)
69
+ @procs[:alert].each { |h| h.call(page, message) }
70
+ end
71
+
72
+ # interface ConfirmHandler
73
+ def handleConfirm(page, message)
74
+ @procs[:confirm].each { |h| h.call(page, message) }
75
+ end
76
+
77
+ # interface AttachmentHandler
78
+ def handleAttachment(page)
79
+ @procs[:attachment].each { |h| h.call(page) }
80
+ end
81
+
82
+ # interface PromptHandler
83
+ def handlePrompt(page, message)
84
+ @procs[:prompt].each { |h| h.call(page, message) }
85
+ end
86
+
87
+ # interface WebWindowListener
88
+ def webWindowClosed(web_window_event)
89
+ @procs[:web_window_event].each { |h| h.call(web_window_event) }
90
+ end
91
+ alias_method :webWindowOpened, :webWindowClosed
92
+ alias_method :webWindowContentChanged, :webWindowClosed
93
+
94
+ # interface HTMLParserListener
95
+ def error(message, url, line, column, key)
96
+ @procs[:html_parser].each { |h| h.call(message, url, line, column, key) }
97
+ end
98
+ alias_method :warning, :error
99
+
100
+ # interface IncorrectnessListener
101
+ def notify(message, origin)
102
+ @procs[:incorrectness].each { |h| h.call(message, origin) }
103
+ end
104
+
105
+ end # Listener
106
+ end # Celerity
@@ -0,0 +1,79 @@
1
+ module Celerity
2
+ module Util
3
+ module_function
4
+
5
+ HtmlUnit2CelerityElement = {
6
+ HtmlUnit::Html::HtmlAnchor => Celerity::Link,
7
+ HtmlUnit::Html::HtmlArea => Celerity::Area,
8
+ HtmlUnit::Html::HtmlButton => Celerity::Button,
9
+ HtmlUnit::Html::HtmlButtonInput => Celerity::Button,
10
+ HtmlUnit::Html::HtmlCaption => Celerity::Button, # ?
11
+ HtmlUnit::Html::HtmlCheckBoxInput => Celerity::CheckBox,
12
+ HtmlUnit::Html::HtmlDivision => Celerity::Div,
13
+ HtmlUnit::Html::HtmlFileInput => Celerity::FileField,
14
+ HtmlUnit::Html::HtmlForm => Celerity::Form,
15
+ HtmlUnit::Html::HtmlFrame => Celerity::Frame,
16
+ HtmlUnit::Html::HtmlHeading1 => Celerity::H1,
17
+ HtmlUnit::Html::HtmlHeading2 => Celerity::H2,
18
+ HtmlUnit::Html::HtmlHeading3 => Celerity::H3,
19
+ HtmlUnit::Html::HtmlHeading4 => Celerity::H4,
20
+ HtmlUnit::Html::HtmlHeading5 => Celerity::H5,
21
+ HtmlUnit::Html::HtmlHeading6 => Celerity::H6,
22
+ HtmlUnit::Html::HtmlHiddenInput => Celerity::Hidden,
23
+ HtmlUnit::Html::HtmlImage => Celerity::Image,
24
+ HtmlUnit::Html::HtmlLabel => Celerity::Label,
25
+ HtmlUnit::Html::HtmlLink => Celerity::Link,
26
+ HtmlUnit::Html::HtmlListItem => Celerity::Li,
27
+ HtmlUnit::Html::HtmlMap => Celerity::Map,
28
+ HtmlUnit::Html::HtmlOption => Celerity::Option,
29
+ HtmlUnit::Html::HtmlOrderedList => Celerity::Ol,
30
+ HtmlUnit::Html::HtmlParagraph => Celerity::P,
31
+ HtmlUnit::Html::HtmlPasswordInput => Celerity::TextField,
32
+ HtmlUnit::Html::HtmlPreformattedText => Celerity::Pre,
33
+ HtmlUnit::Html::HtmlRadioButtonInput => Celerity::Radio,
34
+ HtmlUnit::Html::HtmlSelect => Celerity::SelectList,
35
+ HtmlUnit::Html::HtmlSpan => Celerity::Span,
36
+ HtmlUnit::Html::HtmlTable => Celerity::Table,
37
+ HtmlUnit::Html::HtmlTableBody => Celerity::TableBody,
38
+ HtmlUnit::Html::HtmlTableCell => Celerity::TableCell,
39
+ HtmlUnit::Html::HtmlTableFooter => Celerity::TableFooter,
40
+ HtmlUnit::Html::HtmlTableHeader => Celerity::TableHeader,
41
+ HtmlUnit::Html::HtmlTableRow => Celerity::TableRow,
42
+ HtmlUnit::Html::HtmlTextArea => Celerity::Area,
43
+ HtmlUnit::Html::HtmlTextInput => Celerity::TextField,
44
+ HtmlUnit::Html::HtmlUnorderedList => Celerity::Ul
45
+ }
46
+
47
+ def htmlunit2celerity(klass)
48
+ HtmlUnit2CelerityElement[klass]
49
+ end
50
+
51
+ # HtmlUnit will recognize most common file types, but custom ones can be added here.
52
+ # Used for FileField uploads.
53
+ ContentTypes = {
54
+ ".bmp" => "image/x-ms-bmp",
55
+ ".doc" => "application/msword",
56
+ ".odg" => "application/vnd.oasis.opendocument.graphics",
57
+ ".odp" => "application/vnd.oasis.opendocument.presentation",
58
+ ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
59
+ ".odt" => "application/vnd.oasis.opendocument.text",
60
+ ".ppt" => "application/vnd.ms-powerpoint",
61
+ ".xls" => "application/vnd.ms-excel",
62
+ }
63
+
64
+ def content_type_for(path)
65
+ if ct = java.net.URLConnection.getFileNameMap.getContentTypeFor(path)
66
+ return ct
67
+ else
68
+ ContentTypes[File.extname(path).downcase]
69
+ end
70
+ end
71
+
72
+ def normalize_text(string)
73
+ string.gsub("\302\240", ' '). # non-breaking space 00A0
74
+ gsub(/\n|\t/, '' ). # get rid of newlines/tabs ( could switch back to asText()? )
75
+ strip
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,9 @@
1
+ module Celerity #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 5
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,85 @@
1
+ module Celerity
2
+ class Browser
3
+ class << self
4
+ # Added for Watir compatability - not in use by Celerity
5
+ attr_accessor :speed, :attach_timeout, :visible
6
+ # Added for Watir compatability - not in use by Celerity
7
+ alias_method :start_window, :start
8
+ # Added for Watir compatability - not in use by Celerity
9
+ def reset_attach_timeout; @attach_timeout = 2.0; end
10
+ # Added for Watir compatability - not in use by Celerity
11
+ def each; end
12
+ # Added for Watir compatability - not in use by Celerity
13
+ def quit; end
14
+ # Added for Watir compatability - not in use by Celerity
15
+ def set_fast_speed; @speed = :fast; end
16
+ # Added for Watir compatability - not in use by Celerity
17
+ def set_slow_speed; @speed = :slow; end
18
+ end
19
+
20
+ # Added for Watir compatability - not in use by Celerity
21
+ attr_accessor :visible
22
+
23
+ # Added for Watir compatability - not in use by Celerity
24
+ def bring_to_front; true; end
25
+ # Added for Watir compatability - not in use by Celerity
26
+ def speed=(s); s end
27
+ # Added for Watir compatability - not in use by Celerity
28
+ def wait; end
29
+ # Added for Watir compatability - not in use by Celerity
30
+ def status; '' end
31
+ end
32
+
33
+
34
+ module ClickableElement
35
+ alias_method :click_no_wait, :click
36
+ end
37
+
38
+ module Container
39
+ alias_method :checkbox, :check_box
40
+ alias_method :checkBox, :check_box
41
+ alias_method :body, :tbody
42
+ alias_method :bodies, :tbodies
43
+ end
44
+
45
+ class Element
46
+ alias_method :exists, :exists?
47
+ alias_method :innerText, :text
48
+ alias_method :inner_text, :text
49
+ end
50
+
51
+ class Image
52
+ alias_method :hasLoaded?, :loaded?
53
+ alias_method :has_loaded?, :loaded?
54
+ alias_method :fileSize, :file_size
55
+ alias_method :fileCreatedDate, :file_created_date
56
+ end
57
+
58
+ class Link
59
+ alias_method :click_no_wait, :click
60
+ end
61
+
62
+ class RadioCheckCommon
63
+ alias_method :is_set?, :set?
64
+ alias_method :get_state, :set?
65
+ alias_method :isSet?, :set?
66
+ alias_method :getState, :set?
67
+ end
68
+
69
+ class SelectList
70
+ alias_method :getSelectedItems, :selected_options
71
+ alias_method :getAllContents, :options
72
+ alias_method :clearSelection, :clear
73
+ alias_method :clear_selection, :clear
74
+ alias_method :select_value, :select
75
+ alias_method :includes?, :include?
76
+ end
77
+
78
+ class TextField
79
+ alias_method :dragContentsTo, :drag_contents_to
80
+ alias_method :getContents, :value
81
+ alias_method :get_contents, :value
82
+ end
83
+ end
84
+
85
+ Celerity::IE = Celerity::Browser
@@ -0,0 +1,4 @@
1
+ desc "Run benchmark scripts"
2
+ task :benchmark do
3
+ Dir[File.dirname(__FILE__) + "/../benchmark/*.rb"].each { |f| load f }
4
+ end
@@ -0,0 +1,43 @@
1
+ #desc 'Release the website and new gem version'
2
+ #task :deploy => [:check_version, :website, :release] do
3
+ # puts "Remember to create SVN tag:"
4
+ # puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ # "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ # puts "Suggested comment:"
7
+ # puts "Tagging release #{CHANGES}"
8
+ #end
9
+
10
+ desc 'Builds and installs gem locally'
11
+ task :local_deploy => [:install_gem]
12
+
13
+ #task :check_version do
14
+ # unless ENV['VERSION']
15
+ # puts 'Must pass a VERSION=x.y.z release version'
16
+ # exit
17
+ # end
18
+ # unless ENV['VERSION'] == VERS
19
+ # puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ # exit
21
+ # end
22
+ #end
23
+
24
+ #desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ #task :install_gem_no_doc => [:clean, :package] do
26
+ # sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ #end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ desc 'Create new Manifest.txt in diff format'
35
+ task :new do
36
+ manifest = File.new('Manifest.txt', 'w+')
37
+ Dir.glob(File.join("**", "*")).each do |f|
38
+ manifest.puts f
39
+ end
40
+ manifest.flush
41
+ puts "####\n# Remember to edit Manifest.txt and remove unwanted file entries!\n####"
42
+ end
43
+ end