watir 6.13.0 → 6.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +141 -0
  3. data/.travis.yml +6 -0
  4. data/CHANGES.md +12 -0
  5. data/Gemfile +4 -10
  6. data/README.md +64 -49
  7. data/Rakefile +28 -16
  8. data/lib/watir.rb +13 -15
  9. data/lib/watir/adjacent.rb +15 -13
  10. data/lib/watir/after_hooks.rb +8 -10
  11. data/lib/watir/alert.rb +7 -8
  12. data/lib/watir/aliases.rb +2 -2
  13. data/lib/watir/attribute_helper.rb +18 -20
  14. data/lib/watir/browser.rb +42 -75
  15. data/lib/watir/capabilities.rb +19 -10
  16. data/lib/watir/cell_container.rb +0 -2
  17. data/lib/watir/container.rb +4 -4
  18. data/lib/watir/cookies.rb +7 -8
  19. data/lib/watir/element_collection.rb +37 -22
  20. data/lib/watir/elements/area.rb +0 -2
  21. data/lib/watir/elements/button.rb +1 -3
  22. data/lib/watir/elements/cell.rb +0 -1
  23. data/lib/watir/elements/checkbox.rb +5 -7
  24. data/lib/watir/elements/date_field.rb +5 -9
  25. data/lib/watir/elements/date_time_field.rb +6 -10
  26. data/lib/watir/elements/dlist.rb +2 -4
  27. data/lib/watir/elements/element.rb +201 -99
  28. data/lib/watir/elements/file_field.rb +3 -4
  29. data/lib/watir/elements/font.rb +2 -4
  30. data/lib/watir/elements/form.rb +0 -2
  31. data/lib/watir/elements/hidden.rb +3 -4
  32. data/lib/watir/elements/html_elements.rb +24 -76
  33. data/lib/watir/elements/iframe.rb +57 -71
  34. data/lib/watir/elements/image.rb +3 -4
  35. data/lib/watir/elements/input.rb +0 -2
  36. data/lib/watir/elements/link.rb +2 -5
  37. data/lib/watir/elements/list.rb +4 -4
  38. data/lib/watir/elements/option.rb +3 -6
  39. data/lib/watir/elements/radio.rb +4 -6
  40. data/lib/watir/elements/row.rb +0 -1
  41. data/lib/watir/elements/select.rb +41 -43
  42. data/lib/watir/elements/svg_elements.rb +0 -116
  43. data/lib/watir/elements/table.rb +1 -2
  44. data/lib/watir/elements/table_cell.rb +2 -3
  45. data/lib/watir/elements/text_field.rb +4 -6
  46. data/lib/watir/exception.rb +0 -1
  47. data/lib/watir/extensions/nokogiri.rb +2 -4
  48. data/lib/watir/generator.rb +3 -3
  49. data/lib/watir/generator/base.rb +10 -10
  50. data/lib/watir/generator/base/generator.rb +26 -29
  51. data/lib/watir/generator/base/idl_sorter.rb +34 -32
  52. data/lib/watir/generator/base/spec_extractor.rb +132 -114
  53. data/lib/watir/generator/base/util.rb +1 -3
  54. data/lib/watir/generator/base/visitor.rb +140 -140
  55. data/lib/watir/generator/html.rb +4 -4
  56. data/lib/watir/generator/html/generator.rb +2 -4
  57. data/lib/watir/generator/html/spec_extractor.rb +33 -33
  58. data/lib/watir/generator/html/visitor.rb +14 -14
  59. data/lib/watir/generator/svg.rb +3 -3
  60. data/lib/watir/generator/svg/generator.rb +1 -3
  61. data/lib/watir/generator/svg/spec_extractor.rb +35 -35
  62. data/lib/watir/generator/svg/visitor.rb +14 -14
  63. data/lib/watir/has_window.rb +2 -4
  64. data/lib/watir/js_execution.rb +7 -9
  65. data/lib/watir/js_snippets.rb +3 -3
  66. data/lib/watir/js_snippets/attributeValues.js +11 -0
  67. data/lib/watir/legacy_wait.rb +7 -12
  68. data/lib/watir/locators.rb +9 -11
  69. data/lib/watir/locators/button/locator.rb +2 -3
  70. data/lib/watir/locators/button/selector_builder.rb +9 -9
  71. data/lib/watir/locators/button/selector_builder/xpath.rb +1 -1
  72. data/lib/watir/locators/button/validator.rb +2 -2
  73. data/lib/watir/locators/cell/locator.rb +0 -2
  74. data/lib/watir/locators/cell/selector_builder.rb +3 -5
  75. data/lib/watir/locators/element/locator.rb +85 -64
  76. data/lib/watir/locators/element/selector_builder.rb +40 -38
  77. data/lib/watir/locators/element/selector_builder/xpath.rb +20 -18
  78. data/lib/watir/locators/element/validator.rb +1 -1
  79. data/lib/watir/locators/row/locator.rb +0 -2
  80. data/lib/watir/locators/row/selector_builder.rb +6 -9
  81. data/lib/watir/locators/text_area/selector_builder.rb +1 -1
  82. data/lib/watir/locators/text_field/locator.rb +1 -3
  83. data/lib/watir/locators/text_field/selector_builder.rb +5 -5
  84. data/lib/watir/locators/text_field/selector_builder/xpath.rb +1 -1
  85. data/lib/watir/locators/text_field/validator.rb +3 -2
  86. data/lib/watir/logger.rb +11 -21
  87. data/lib/watir/navigation.rb +49 -0
  88. data/lib/watir/radio_set.rb +17 -18
  89. data/lib/watir/row_container.rb +3 -5
  90. data/lib/watir/screenshot.rb +2 -4
  91. data/lib/watir/user_editable.rb +13 -8
  92. data/lib/watir/version.rb +3 -0
  93. data/lib/watir/wait.rb +56 -55
  94. data/lib/watir/wait/timer.rb +1 -3
  95. data/lib/watir/window.rb +36 -45
  96. data/lib/watir/xpath_support.rb +1 -3
  97. data/lib/watirspec.rb +11 -11
  98. data/lib/watirspec/guards.rb +10 -7
  99. data/lib/watirspec/implementation.rb +3 -4
  100. data/lib/watirspec/rake_tasks.rb +30 -29
  101. data/lib/watirspec/remote_server.rb +3 -3
  102. data/lib/watirspec/runner.rb +1 -2
  103. data/lib/watirspec/server.rb +3 -0
  104. data/lib/watirspec/server/app.rb +14 -6
  105. data/spec/implementation_spec.rb +9 -9
  106. data/spec/locator_spec_helper.rb +3 -4
  107. data/spec/spec_helper.rb +3 -7
  108. data/spec/unit/container_spec.rb +9 -10
  109. data/spec/unit/element_locator_spec.rb +224 -219
  110. data/spec/unit/logger_spec.rb +4 -4
  111. data/spec/unit/unit_helper.rb +0 -2
  112. data/spec/unit/wait_spec.rb +26 -28
  113. data/spec/watirspec/adjacent_spec.rb +130 -130
  114. data/spec/watirspec/after_hooks_spec.rb +63 -63
  115. data/spec/watirspec/alert_spec.rb +6 -6
  116. data/spec/watirspec/attributes_spec.rb +6 -6
  117. data/spec/watirspec/browser_spec.rb +161 -162
  118. data/spec/watirspec/click_spec.rb +9 -9
  119. data/spec/watirspec/cookies_spec.rb +15 -14
  120. data/spec/watirspec/drag_and_drop_spec.rb +15 -16
  121. data/spec/watirspec/element_hidden_spec.rb +19 -21
  122. data/spec/watirspec/elements/area_spec.rb +18 -21
  123. data/spec/watirspec/elements/areas_spec.rb +13 -15
  124. data/spec/watirspec/elements/button_spec.rb +96 -99
  125. data/spec/watirspec/elements/buttons_spec.rb +17 -19
  126. data/spec/watirspec/elements/checkbox_spec.rb +102 -100
  127. data/spec/watirspec/elements/checkboxes_spec.rb +13 -15
  128. data/spec/watirspec/elements/collections_spec.rb +35 -37
  129. data/spec/watirspec/elements/date_field_spec.rb +46 -47
  130. data/spec/watirspec/elements/date_fields_spec.rb +13 -15
  131. data/spec/watirspec/elements/date_time_field_spec.rb +62 -57
  132. data/spec/watirspec/elements/date_time_fields_spec.rb +14 -15
  133. data/spec/watirspec/elements/dd_spec.rb +46 -48
  134. data/spec/watirspec/elements/dds_spec.rb +13 -15
  135. data/spec/watirspec/elements/del_spec.rb +27 -28
  136. data/spec/watirspec/elements/dels_spec.rb +13 -15
  137. data/spec/watirspec/elements/div_spec.rb +89 -91
  138. data/spec/watirspec/elements/divs_spec.rb +17 -19
  139. data/spec/watirspec/elements/dl_spec.rb +52 -54
  140. data/spec/watirspec/elements/dls_spec.rb +13 -15
  141. data/spec/watirspec/elements/dt_spec.rb +46 -48
  142. data/spec/watirspec/elements/dts_spec.rb +13 -15
  143. data/spec/watirspec/elements/element_spec.rb +240 -189
  144. data/spec/watirspec/elements/elements_spec.rb +16 -16
  145. data/spec/watirspec/elements/em_spec.rb +38 -40
  146. data/spec/watirspec/elements/ems_spec.rb +13 -15
  147. data/spec/watirspec/elements/filefield_spec.rb +45 -46
  148. data/spec/watirspec/elements/filefields_spec.rb +13 -15
  149. data/spec/watirspec/elements/font_spec.rb +11 -13
  150. data/spec/watirspec/elements/form_spec.rb +13 -15
  151. data/spec/watirspec/elements/forms_spec.rb +13 -15
  152. data/spec/watirspec/elements/frame_spec.rb +48 -50
  153. data/spec/watirspec/elements/frames_spec.rb +13 -15
  154. data/spec/watirspec/elements/hidden_spec.rb +23 -25
  155. data/spec/watirspec/elements/hiddens_spec.rb +13 -15
  156. data/spec/watirspec/elements/hn_spec.rb +22 -24
  157. data/spec/watirspec/elements/hns_spec.rb +13 -13
  158. data/spec/watirspec/elements/iframe_spec.rb +106 -74
  159. data/spec/watirspec/elements/iframes_spec.rb +16 -18
  160. data/spec/watirspec/elements/image_spec.rb +30 -32
  161. data/spec/watirspec/elements/images_spec.rb +13 -15
  162. data/spec/watirspec/elements/input_spec.rb +4 -5
  163. data/spec/watirspec/elements/ins_spec.rb +27 -29
  164. data/spec/watirspec/elements/inses_spec.rb +13 -15
  165. data/spec/watirspec/elements/label_spec.rb +17 -19
  166. data/spec/watirspec/elements/labels_spec.rb +13 -15
  167. data/spec/watirspec/elements/li_spec.rb +23 -25
  168. data/spec/watirspec/elements/link_spec.rb +45 -48
  169. data/spec/watirspec/elements/links_spec.rb +14 -16
  170. data/spec/watirspec/elements/lis_spec.rb +13 -15
  171. data/spec/watirspec/elements/list_spec.rb +14 -15
  172. data/spec/watirspec/elements/map_spec.rb +19 -20
  173. data/spec/watirspec/elements/maps_spec.rb +13 -15
  174. data/spec/watirspec/elements/meta_spec.rb +10 -10
  175. data/spec/watirspec/elements/metas_spec.rb +13 -15
  176. data/spec/watirspec/elements/ol_spec.rb +20 -21
  177. data/spec/watirspec/elements/ols_spec.rb +13 -15
  178. data/spec/watirspec/elements/option_spec.rb +63 -63
  179. data/spec/watirspec/elements/p_spec.rb +27 -26
  180. data/spec/watirspec/elements/pre_spec.rb +24 -25
  181. data/spec/watirspec/elements/pres_spec.rb +13 -15
  182. data/spec/watirspec/elements/ps_spec.rb +13 -15
  183. data/spec/watirspec/elements/radio_spec.rb +96 -97
  184. data/spec/watirspec/elements/radios_spec.rb +13 -15
  185. data/spec/watirspec/elements/select_list_spec.rb +244 -237
  186. data/spec/watirspec/elements/select_lists_spec.rb +15 -16
  187. data/spec/watirspec/elements/span_spec.rb +32 -31
  188. data/spec/watirspec/elements/spans_spec.rb +13 -15
  189. data/spec/watirspec/elements/strong_spec.rb +23 -24
  190. data/spec/watirspec/elements/strongs_spec.rb +13 -15
  191. data/spec/watirspec/elements/table_nesting_spec.rb +15 -14
  192. data/spec/watirspec/elements/table_spec.rb +61 -62
  193. data/spec/watirspec/elements/tables_spec.rb +15 -17
  194. data/spec/watirspec/elements/tbody_spec.rb +25 -26
  195. data/spec/watirspec/elements/tbodys_spec.rb +17 -19
  196. data/spec/watirspec/elements/td_spec.rb +20 -22
  197. data/spec/watirspec/elements/tds_spec.rb +9 -11
  198. data/spec/watirspec/elements/text_field_spec.rb +55 -56
  199. data/spec/watirspec/elements/text_fields_spec.rb +15 -16
  200. data/spec/watirspec/elements/textarea_spec.rb +2 -2
  201. data/spec/watirspec/elements/textareas_spec.rb +1 -1
  202. data/spec/watirspec/elements/tfoot_spec.rb +22 -23
  203. data/spec/watirspec/elements/tfoots_spec.rb +19 -19
  204. data/spec/watirspec/elements/thead_spec.rb +21 -23
  205. data/spec/watirspec/elements/theads_spec.rb +19 -19
  206. data/spec/watirspec/elements/tr_spec.rb +20 -22
  207. data/spec/watirspec/elements/trs_spec.rb +17 -19
  208. data/spec/watirspec/elements/ul_spec.rb +17 -19
  209. data/spec/watirspec/elements/uls_spec.rb +13 -14
  210. data/spec/watirspec/html/data_attributes.html +1 -0
  211. data/spec/watirspec/radio_set_spec.rb +100 -99
  212. data/spec/watirspec/relaxed_locate_spec.rb +19 -43
  213. data/spec/watirspec/screenshot_spec.rb +4 -4
  214. data/spec/watirspec/special_chars_spec.rb +2 -4
  215. data/spec/watirspec/support/rspec_matchers.rb +85 -22
  216. data/spec/watirspec/user_editable_spec.rb +84 -85
  217. data/spec/watirspec/wait_spec.rb +74 -95
  218. data/spec/watirspec/window_switching_spec.rb +131 -132
  219. data/spec/watirspec_helper.rb +12 -9
  220. data/support/travis.sh +4 -0
  221. data/support/version_differ.rb +12 -13
  222. data/watir.gemspec +29 -22
  223. metadata +76 -50
@@ -1,12 +1,11 @@
1
1
  module Watir
2
2
  module Generator
3
3
  module Util
4
-
5
4
  module_function
6
5
 
7
6
  def classify(regexp, str)
8
7
  if str =~ regexp
9
- $1
8
+ Regexp.last_match(1)
10
9
  else
11
10
  str
12
11
  end
@@ -15,7 +14,6 @@ module Watir
15
14
  def paramify(regexp, str)
16
15
  classify(regexp, str).snake_case
17
16
  end
18
-
19
17
  end # Util
20
18
  end # Generator
21
19
  end # Watir
@@ -1,162 +1,162 @@
1
1
  module Watir
2
2
  module Generator
3
- class Base::Visitor < WebIDL::RubySexpVisitor
3
+ module Base
4
+ class Visitor < WebIDL::RubySexpVisitor
5
+ STRING_TYPES = ['WindowProxy', 'ValidityState', 'TimeRanges', 'Location',
6
+ 'Any', 'TimedTrackArray', 'TimedTrack', 'TextTrackArray', 'TextTrack',
7
+ /Media.+/, 'TextTrackKind', 'Function', /.*EventHandler$/,
8
+ 'Document', 'DocumentFragment', 'DOMTokenList', 'DOMSettableTokenList',
9
+ 'DOMStringMap', 'HTMLPropertiesCollection', /HTML.*Element/, /HTML.*Collection/,
10
+ 'CSSStyleDeclaration', /.+List$/, 'Date', 'Element', /DOM.+ReadOnly/,
11
+ /SVGAnimated.+/, /SVG.*Element/, /SVG.*Collection/, 'SVGViewSpec',
12
+ 'Object', 'USVString'].freeze
13
+ def initialize
14
+ super
15
+
16
+ # When an interface has multiple IDL definitions in the spec, the inheritance is sometimes
17
+ # not repeated. So we'll keep track ourselves.
18
+ @inheritance_map = {}
19
+
20
+ @already_defined = []
21
+ end
4
22
 
5
- def initialize
6
- super
23
+ #
24
+ # WebIDL visitor interface
25
+ #
7
26
 
8
- # When an interface has multiple IDL definitions in the spec, the inheritance is sometimes
9
- # not repeated. So we'll keep track ourselves.
10
- @inheritance_map = {}
27
+ def visit_interface(interface)
28
+ name = interface.name
29
+ parent = interface.inherits.first
11
30
 
12
- @already_defined = []
13
- end
31
+ warn name
32
+ return if name !~ interface_regexp || name =~ /(Collection|Document)$/
14
33
 
15
- #
16
- # WebIDL visitor interface
17
- #
34
+ parent = if force_inheritance.key?(name)
35
+ force_inheritance[name]
36
+ else
37
+ @inheritance_map[name] ||= parent&.name
38
+ return unless @inheritance_map[name]
18
39
 
19
- def visit_interface(interface)
20
- name = interface.name
21
- parent = interface.inherits.first
40
+ @inheritance_map[name]
41
+ end
22
42
 
23
- $stderr.puts name
24
- return if name !~ interface_regexp || name =~ /(Collection|Document)$/
43
+ [:scope,
44
+ [:block,
45
+ element_class(interface.name, extract_attributes(interface), parent),
46
+ collection_class(interface.name)]]
47
+ end
25
48
 
26
- if force_inheritance.keys.include?(name)
27
- parent = force_inheritance[name]
28
- elsif parent
29
- @inheritance_map[name] ||= parent.name
30
- parent = parent.name
31
- else
32
- parent = @inheritance_map[name] || return
49
+ def visit_module(mod)
50
+ # ignored
33
51
  end
34
52
 
35
- [ :scope,
36
- [:block,
37
- element_class(interface.name, extract_attributes(interface), parent),
38
- collection_class(interface.name)
39
- ]
40
- ]
41
- end
42
-
43
- def visit_module(mod)
44
- # ignored
45
- end
46
-
47
- def visit_implements_statement(stmt)
48
- # ignored
49
- end
50
-
51
- # TODO: do everything in the visitor somehow?
52
- # problem is we lack the tag name info while walking the interface AST
53
- # #
54
- # # Watir generator visitor interface
55
- # #
56
- #
57
- # def visit_tag(tag_name, interface_name)
58
- # tag_string = tag.inspect
59
- # singular = Util.paramify(classify_regexp, tag)
60
- # plural = singular.pluralize
61
- # element_class = Util.classify(classify_regexp, interfaces.first.name)
62
- # collection_class = "#{element_class}Collection"
63
- #
64
- # [:defn,
65
- # :a,
66
- # [:args, :"*args"],
67
- # [:scope,
68
- # [:block,
69
- # [:call,
70
- # [:const, :Anchor],
71
- # :new,
72
- # [:arglist,
73
- # [:self],
74
- # [:call,
75
- # [:call, nil, :extract_selector, [:arglist, [:lvar, :args]]],
76
- # :merge,
77
- # [:arglist, [:hash, [:lit, :tag_name], [:str, "a"]]]]]]]]]
78
- # end
79
-
80
- private
81
-
82
- def element_class(name, attributes, parent)
83
- [:class, Util.classify(classify_regexp, name), [:const, Util.classify(classify_regexp, parent)],
84
- *attribute_calls(attributes)
85
- ]
86
- end
87
-
88
- def extract_attributes(interface)
89
- members = interface.members
90
- members += interface.implements.flat_map(&:members)
91
-
92
- members.select { |e| e.kind_of?(WebIDL::Ast::Attribute) }.uniq(&:name)
93
- end
94
-
95
- def collection_class(name)
96
- return if @already_defined.include?(name)
97
- @already_defined << name
98
- name = Util.classify(classify_regexp, name)
99
-
100
- [:class, "#{name}Collection", [:const, :ElementCollection]]
101
- end
102
-
103
- def attribute_calls(attributes)
104
- attributes.map do |attribute|
105
- call(:attribute, [
106
- [:lit, ruby_type_for(attribute.type)],
107
- [:lit, ruby_method_name_for(attribute)],
108
- [:lit, attribute.name.to_sym]
109
- ])
53
+ def visit_implements_statement(stmt)
54
+ # ignored
55
+ end
56
+
57
+ # TODO: do everything in the visitor somehow?
58
+ # problem is we lack the tag name info while walking the interface AST
59
+ # #
60
+ # # Watir generator visitor interface
61
+ # #
62
+ #
63
+ # def visit_tag(tag_name, interface_name)
64
+ # tag_string = tag.inspect
65
+ # singular = Util.paramify(classify_regexp, tag)
66
+ # plural = singular.pluralize
67
+ # element_class = Util.classify(classify_regexp, interfaces.first.name)
68
+ # collection_class = "#{element_class}Collection"
69
+ #
70
+ # [:defn,
71
+ # :a,
72
+ # [:args, :"*args"],
73
+ # [:scope,
74
+ # [:block,
75
+ # [:call,
76
+ # [:const, :Anchor],
77
+ # :new,
78
+ # [:arglist,
79
+ # [:self],
80
+ # [:call,
81
+ # [:call, nil, :extract_selector, [:arglist, [:lvar, :args]]],
82
+ # :merge,
83
+ # [:arglist, [:hash, [:lit, :tag_name], [:str, "a"]]]]]]]]]
84
+ # end
85
+
86
+ private
87
+
88
+ def element_class(name, attributes, parent)
89
+ [:class, Util.classify(classify_regexp, name), [:const, Util.classify(classify_regexp, parent)],
90
+ *attribute_calls(attributes)]
91
+ end
92
+
93
+ def extract_attributes(interface)
94
+ members = interface.members
95
+ members += interface.implements.flat_map(&:members)
96
+ members += interface.includes.flat_map(&:members)
97
+
98
+ members.select { |e| e.is_a?(WebIDL::Ast::Attribute) }.uniq(&:name)
110
99
  end
111
- end
112
100
 
113
- def call(name, args)
114
- [:call, nil, name.to_sym, [:arglist] + args]
115
- end
101
+ def collection_class(name)
102
+ return if @already_defined.include?(name)
103
+
104
+ @already_defined << name
105
+ name = Util.classify(classify_regexp, name)
106
+
107
+ [:class, "#{name}Collection", %i[const ElementCollection]]
108
+ end
116
109
 
117
- def ruby_method_name_for(attribute)
118
- str = if %w(httpEquiv contentEditable acceptCharset isContentEditable).include? attribute.name
119
- attribute.name.snake_case
120
- else
121
- attribute.name.downcase
110
+ def attribute_calls(attributes)
111
+ attributes.map do |attribute|
112
+ call(:attribute, [
113
+ [:lit, ruby_type_for(attribute.type)],
114
+ [:lit, ruby_method_name_for(attribute)],
115
+ [:lit, attribute.name.to_sym]
116
+ ])
117
+ end
122
118
  end
123
119
 
124
- if attribute.type.name == :Boolean
125
- str = $1 if str =~ /^is_(.+)/
126
- str << '?'
120
+ def call(name, args)
121
+ [:call, nil, name.to_sym, [:arglist] + args]
127
122
  end
128
123
 
129
- str = 'for' if str == 'htmlfor'
130
-
131
- str.to_sym
132
- end
133
-
134
- def ruby_type_for(type)
135
- case type.name.to_s
136
- when 'DOMString', 'any'
137
- String
138
- when 'UnsignedLong', 'Long', 'Integer', 'Short', 'UnsignedShort',
139
- 'SVGAnimatedLength'
140
- Integer
141
- when 'Float', /.*Double$/
142
- Float
143
- when 'Boolean'
144
- 'Boolean'
145
- when 'WindowProxy', 'ValidityState', 'TimeRanges', 'Location',
146
- 'Any', 'TimedTrackArray', 'TimedTrack', 'TextTrackArray', 'TextTrack',
147
- /Media.+/, 'TextTrackKind', 'Function', /.*EventHandler$/,
148
- 'Document', 'DocumentFragment', 'DOMTokenList', 'DOMSettableTokenList',
149
- 'DOMStringMap', 'HTMLPropertiesCollection', /HTML.*Element/, /HTML.*Collection/,
150
- 'CSSStyleDeclaration', /.+List$/, 'Date', 'Element', /DOM.+ReadOnly/,
151
- /SVGAnimated.+/, /SVG.*Element/, /SVG.*Collection/, 'SVGViewSpec',
152
- 'Object', 'USVString'
153
- # probably completely wrong.
154
- String
155
- else
156
- raise "unknown type: #{type.name}"
124
+ def ruby_method_name_for(attribute)
125
+ str = if %w[httpEquiv contentEditable acceptCharset isContentEditable].include? attribute.name
126
+ attribute.name.snake_case
127
+ else
128
+ attribute.name.downcase
129
+ end
130
+
131
+ if attribute.type.name == :Boolean
132
+ str = Regexp.last_match(1) if str =~ /^is_(.+)/
133
+ str << '?'
134
+ end
135
+
136
+ str = 'for' if str == 'htmlfor'
137
+
138
+ str.to_sym
157
139
  end
158
- end
159
140
 
160
- end # Visitor
141
+ def ruby_type_for(type)
142
+ case type.name.to_s
143
+ when 'DOMString', 'any'
144
+ String
145
+ when 'UnsignedLong', 'Long', 'Integer', 'Short', 'UnsignedShort',
146
+ 'SVGAnimatedLength'
147
+ Integer
148
+ when 'Float', /.*Double$/
149
+ Float
150
+ when 'Boolean'
151
+ 'Boolean'
152
+ when *STRING_TYPES
153
+ # probably completely wrong.
154
+ String
155
+ else
156
+ raise "unknown type: #{type.name}"
157
+ end
158
+ end
159
+ end # Visitor
160
+ end # Base
161
161
  end # Generator
162
162
  end # Watir
@@ -3,13 +3,13 @@ ActiveSupport::Inflector.inflections do |inflect|
3
3
  inflect.plural 'tbody', 'tbodys'
4
4
  inflect.plural 'canvas', 'canvases'
5
5
  inflect.plural 'ins', 'inses'
6
- inflect.plural /^s$/, 'ss'
6
+ inflect.plural(/^s$/, 'ss')
7
7
  inflect.plural 'meta', 'metas'
8
8
  inflect.plural 'details', 'detailses'
9
9
  inflect.plural 'data', 'datas'
10
10
  inflect.plural 'datalist', 'datalists'
11
11
  end
12
12
 
13
- require "watir/generator/html/generator"
14
- require "watir/generator/html/spec_extractor"
15
- require "watir/generator/html/visitor"
13
+ require 'watir/generator/html/generator'
14
+ require 'watir/generator/html/spec_extractor'
15
+ require 'watir/generator/html/visitor'
@@ -1,12 +1,11 @@
1
1
  module Watir
2
2
  module Generator
3
3
  class HTML < Base
4
-
5
4
  private
6
5
 
7
6
  def ignored_tags
8
7
  # ignore the link element for now
9
- %w(link)
8
+ %w[link]
10
9
  end
11
10
 
12
11
  def ignored_interfaces
@@ -16,7 +15,7 @@ module Watir
16
15
  end
17
16
 
18
17
  def ignored_attributes
19
- %w(cells elements hash rows span text size selected? style width height tHead tFoot link options)
18
+ %w[cells elements hash rows span text size selected? style width height tHead tFoot link options]
20
19
  end
21
20
 
22
21
  def generator_implementation
@@ -30,7 +29,6 @@ module Watir
30
29
  def extractor_class
31
30
  HTML::SpecExtractor
32
31
  end
33
-
34
32
  end # Generator
35
33
  end # HTML
36
34
  end # Watir
@@ -1,50 +1,50 @@
1
1
  module Watir
2
2
  module Generator
3
- class HTML::SpecExtractor < Base::SpecExtractor
3
+ module HTML
4
+ class SpecExtractor < Base::SpecExtractor
5
+ private
4
6
 
5
- private
7
+ def extract_interface_map
8
+ # http://www.whatwg.org/specs/web-apps/current-work/#elements-1
9
+ table = @doc.search("//h3[@id='index-elements']/following-sibling::table[1]").first
10
+ table || raise('could not find index-elements table')
6
11
 
7
- def extract_interface_map
8
- # http://www.whatwg.org/specs/web-apps/current-work/#elements-1
9
- table = @doc.search("//h3[@id='index-elements']/following-sibling::table[1]").first
10
- table or raise "could not find index-elements table"
12
+ @interface_map = {}
11
13
 
12
- @interface_map = {}
13
-
14
- parse_table(table).each do |row|
15
- row['Element'].split(", ").each { |tag| @interface_map[tag] = row['Interface'] }
14
+ parse_table(table).each do |row|
15
+ row['Element'].split(', ').each { |tag| @interface_map[tag] = row['Interface'] }
16
+ end
16
17
  end
17
- end
18
18
 
19
- def build_result
20
- {}.tap do |result|
21
- @interface_map.each do |tag, interface|
22
- result[tag] = fetch_interface(interface)
23
- end
19
+ def build_result
20
+ {}.tap do |result|
21
+ @interface_map.each do |tag, interface|
22
+ result[tag] = fetch_interface(interface)
23
+ end
24
24
 
25
- # missing from the elements-1 table
26
- result['frameset'] = fetch_interface('HTMLFrameSetElement')
25
+ # missing from the elements-1 table
26
+ result['frameset'] = fetch_interface('HTMLFrameSetElement')
27
+ end
27
28
  end
28
- end
29
29
 
30
- def parse_table(table)
31
- headers = table.css("thead th").map { |e| e.inner_text.strip }
30
+ def parse_table(table)
31
+ headers = table.css('thead th').map { |e| e.inner_text.strip }
32
32
 
33
- table.css("tbody tr").map do |row|
34
- result = {}
33
+ table.css('tbody tr').map do |row|
34
+ result = {}
35
35
 
36
- row.css("th, td").each_with_index do |node, idx|
37
- result[headers[idx]] = node.inner_text.strip
38
- end
36
+ row.css('th, td').each_with_index do |node, idx|
37
+ result[headers[idx]] = node.inner_text.strip
38
+ end
39
39
 
40
- result
40
+ result
41
+ end
41
42
  end
42
- end
43
43
 
44
- def issued_interfaces
45
- []
46
- end
47
-
48
- end # HTML:;SpecExtractor
44
+ def issued_interfaces
45
+ []
46
+ end
47
+ end # SpecExtractor
48
+ end # HTML
49
49
  end # Generator
50
50
  end # Watir