Sha256: 70dff12f5216527522304ff16393ec8c9bb41b16fa22a6226a82312b7230405d

Contents?: true

Size: 1.85 KB

Versions: 23

Compression:

Stored size: 1.85 KB

Contents

module RAutomation
  # @private
  module ElementCollections
    class UnsupportedLocatorException < RuntimeError
    end

    # Creates collection classes and methods for elements.
    # @param [Array<Symbol>] elements for which to create collection classes
    #   and methods.
    def has_many(*elements)
      elements.each do |element|
        class_name_plural = element.to_s.split("_").map {|e| e.capitalize}.join
        class_name = class_name_plural.chop
        adapter_class = self.to_s.scan(/(.*)::/).flatten.first
        clazz = RAutomation.constants.include?(class_name) ? RAutomation : class_eval(adapter_class)
        clazz.class_eval %Q{
            class #{class_name_plural}
              include Enumerable

              def initialize(window, locators)
               if locators[:hwnd] || locators[:pid]
                raise UnsupportedLocatorException, 
                  ":hwnd or :pid in " + locators.inspect + " are not supported for #{adapter_class}::#{class_name_plural}"
                end

                @window = window
                @locators = locators
              end

              def each
                i = -1 
                while true
                  args = [@window, @locators.merge(:index => i += 1)].compact
                  object = #{clazz}::#{class_name}.new(*args)
                  break unless object.exists?
                  yield object
                end
              end

              def method_missing(name, *args)
                ary = self.to_a
                ary.respond_to?(name) ? ary.send(name, *args) : super
              end
            end
        }

        class_eval %Q{
            def #{element}(locators = {})
              #{adapter_class}::#{class_name_plural}.new(@window || self, locators)
            end
        }
      end
    end
  end
end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
rautomation-2.0.1-x86-mingw32 lib/rautomation/element_collections.rb
rautomation-2.0.1-x64-mingw32 lib/rautomation/element_collections.rb
rautomation-1.1.0 lib/rautomation/element_collections.rb
rautomation-1.0.0 lib/rautomation/element_collections.rb
rautomation-0.17.0 lib/rautomation/element_collections.rb
rautomation-0.16.0 lib/rautomation/element_collections.rb
rautomation-0.15.0 lib/rautomation/element_collections.rb
rautomation-0.14.1 lib/rautomation/element_collections.rb
rautomation-0.14.0 lib/rautomation/element_collections.rb
rautomation-0.13.0 lib/rautomation/element_collections.rb
rautomation-0.12.0 lib/rautomation/element_collections.rb
rautomation-0.11.0 lib/rautomation/element_collections.rb
rautomation-0.10.0 lib/rautomation/element_collections.rb
rautomation-0.9.4 lib/rautomation/element_collections.rb
rautomation-0.9.3 lib/rautomation/element_collections.rb
rautomation-0.9.2 lib/rautomation/element_collections.rb
rautomation-0.9.1 lib/rautomation/element_collections.rb
rautomation-0.9.0 lib/rautomation/element_collections.rb
rautomation-0.8.0 lib/rautomation/element_collections.rb
rautomation-0.7.3 lib/rautomation/element_collections.rb