lib/watir/generator/base/spec_extractor.rb in watir-6.10.0 vs lib/watir/generator/base/spec_extractor.rb in watir-6.10.1
- old
+ new
@@ -1,138 +1,138 @@
-module Watir
- module Generator
- class Base::SpecExtractor
-
- IDL_SELECTOR = "//pre[contains(@class, 'idl')]".freeze
-
- class InterfaceNotFound < StandardError; end
-
- def initialize(uri)
- @uri = uri
- end
-
- def process
- download_and_parse
- extract_idl_parts
- extract_interface_map
- drop_issued_interfaces
- build_result
- rescue
- p errors
- raise
- end
-
- def errors
- @errors ||= []
- end
-
- #
- # returns a topoligically sorted array of WebIDL::Ast::Interface objects
- #
-
- def sorted_interfaces
- process if @interfaces.nil?
-
- sorter.sort.map { |name|
- @interfaces.find { |i| i.name == name } or puts "ignoring interface: #{name}"
- }.compact
- end
-
- def print_hierarchy
- process if @interfaces.nil?
- sorter.print
- end
-
- def fetch_interface(interface)
- @interfaces_by_name[interface] or raise InterfaceNotFound, "#{interface} not found in IDL"
- end
-
- private
-
- def download_and_parse
- open(@uri) { |io| @doc = Nokogiri.HTML(io) }
- end
-
- def extract_idl_parts
- parsed = @doc.search(IDL_SELECTOR).map { |e| parse_idl(e.inner_text) }.compact
-
- implements = []
- @interfaces = []
-
- parsed.flatten.each do |element|
- case element
- when WebIDL::Ast::Interface
- @interfaces << element
- when WebIDL::Ast::ImplementsStatement
- implements << element
- end
- end
-
- @interfaces_by_name = @interfaces.group_by(&:name)
- apply_implements(implements)
- merge_interfaces
- end
-
- def extract_interface_map
- raise NotImplementedError
- end
-
- def drop_issued_interfaces
- @interface_map.delete_if do |_, interface|
- issued_interfaces.include?(interface)
- end
- end
-
- def build_result
- raise NotImplementedError
- end
-
- def parse_idl(str)
- result = idl_parser.parse(str)
-
- if result
- result.build
- else
- errors << idl_parser.failure_reason
- nil
- end
- end
-
- def apply_implements(implements)
- implements.each do |is|
- implementor_name = is.implementor.gsub(/^::/, '')
- implementee_name = is.implementee.gsub(/^::/, '')
-
- begin
- intf = fetch_interface(implementor_name).first
- intf.implements << fetch_interface(implementee_name).first
- rescue InterfaceNotFound => ex
- puts ex.message
- end
- end
- end
-
- def merge_interfaces
- non_duplicates = @interfaces.uniq(&:name)
- duplicates = @interfaces - non_duplicates
-
- duplicates.each do |intf|
- final = non_duplicates.find { |i| i.name == intf.name }
- final.inherits += intf.inherits
- final.members += intf.members
- final.extended_attributes += intf.extended_attributes
- end
-
- @interfaces = non_duplicates
- end
-
- def idl_parser
- @idl_parser ||= WebIDL::Parser::IDLParser.new
- end
-
- def sorter
- @idl_sorter ||= Base::IDLSorter.new(@interfaces)
- end
-
- end # SpecExtractor
- end # Generator
-end # Watir
+module Watir
+ module Generator
+ class Base::SpecExtractor
+
+ IDL_SELECTOR = "//pre[contains(@class, 'idl')]".freeze
+
+ class InterfaceNotFound < StandardError; end
+
+ def initialize(uri)
+ @uri = uri
+ end
+
+ def process
+ download_and_parse
+ extract_idl_parts
+ extract_interface_map
+ drop_issued_interfaces
+ build_result
+ rescue
+ p errors
+ raise
+ end
+
+ def errors
+ @errors ||= []
+ end
+
+ #
+ # returns a topoligically sorted array of WebIDL::Ast::Interface objects
+ #
+
+ def sorted_interfaces
+ process if @interfaces.nil?
+
+ sorter.sort.map { |name|
+ @interfaces.find { |i| i.name == name } or puts "ignoring interface: #{name}"
+ }.compact
+ end
+
+ def print_hierarchy
+ process if @interfaces.nil?
+ sorter.print
+ end
+
+ def fetch_interface(interface)
+ @interfaces_by_name[interface] or raise InterfaceNotFound, "#{interface} not found in IDL"
+ end
+
+ private
+
+ def download_and_parse
+ open(@uri) { |io| @doc = Nokogiri.HTML(io) }
+ end
+
+ def extract_idl_parts
+ parsed = @doc.search(IDL_SELECTOR).map { |e| parse_idl(e.inner_text) }.compact
+
+ implements = []
+ @interfaces = []
+
+ parsed.flatten.each do |element|
+ case element
+ when WebIDL::Ast::Interface
+ @interfaces << element
+ when WebIDL::Ast::ImplementsStatement
+ implements << element
+ end
+ end
+
+ @interfaces_by_name = @interfaces.group_by(&:name)
+ apply_implements(implements)
+ merge_interfaces
+ end
+
+ def extract_interface_map
+ raise NotImplementedError
+ end
+
+ def drop_issued_interfaces
+ @interface_map.delete_if do |_, interface|
+ issued_interfaces.include?(interface)
+ end
+ end
+
+ def build_result
+ raise NotImplementedError
+ end
+
+ def parse_idl(str)
+ result = idl_parser.parse(str)
+
+ if result
+ result.build
+ else
+ errors << idl_parser.failure_reason
+ nil
+ end
+ end
+
+ def apply_implements(implements)
+ implements.each do |is|
+ implementor_name = is.implementor.gsub(/^::/, '')
+ implementee_name = is.implementee.gsub(/^::/, '')
+
+ begin
+ intf = fetch_interface(implementor_name).first
+ intf.implements << fetch_interface(implementee_name).first
+ rescue InterfaceNotFound => ex
+ puts ex.message
+ end
+ end
+ end
+
+ def merge_interfaces
+ non_duplicates = @interfaces.uniq(&:name)
+ duplicates = @interfaces - non_duplicates
+
+ duplicates.each do |intf|
+ final = non_duplicates.find { |i| i.name == intf.name }
+ final.inherits += intf.inherits
+ final.members += intf.members
+ final.extended_attributes += intf.extended_attributes
+ end
+
+ @interfaces = non_duplicates
+ end
+
+ def idl_parser
+ @idl_parser ||= WebIDL::Parser::IDLParser.new
+ end
+
+ def sorter
+ @idl_sorter ||= Base::IDLSorter.new(@interfaces)
+ end
+
+ end # SpecExtractor
+ end # Generator
+end # Watir