From dfe99aa38596891ea50e32b8ae03b5ff649a0c7f Mon Sep 17 00:00:00 2001 From: Donnie Tognazzini Date: Mon, 24 Dec 2012 12:31:29 -0800 Subject: [PATCH] reorganizing file structure --- lib/ae_page_objects.rb | 19 +++-- lib/ae_page_objects/concerns/load_ensuring.rb | 30 ++++++++ lib/ae_page_objects/concerns/staleable.rb | 29 ++++++++ lib/ae_page_objects/concerns/visitable.rb | 61 ++++++++++++++++ lib/ae_page_objects/document.rb | 2 +- .../{ => elements}/checkbox.rb | 0 .../{ => elements}/collection.rb | 0 lib/ae_page_objects/{ => elements}/form.rb | 0 lib/ae_page_objects/{ => elements}/has_one.rb | 0 lib/ae_page_objects/{ => elements}/select.rb | 0 lib/ae_page_objects/load_ensuring.rb | 28 -------- lib/ae_page_objects/methods/node.rb | 69 ------------------ lib/ae_page_objects/node.rb | 72 ++++++++++++++++++- lib/ae_page_objects/staleable.rb | 27 ------- lib/ae_page_objects/visitable.rb | 59 --------------- 15 files changed, 199 insertions(+), 197 deletions(-) create mode 100644 lib/ae_page_objects/concerns/load_ensuring.rb create mode 100644 lib/ae_page_objects/concerns/staleable.rb create mode 100644 lib/ae_page_objects/concerns/visitable.rb rename lib/ae_page_objects/{ => elements}/checkbox.rb (100%) rename lib/ae_page_objects/{ => elements}/collection.rb (100%) rename lib/ae_page_objects/{ => elements}/form.rb (100%) rename lib/ae_page_objects/{ => elements}/has_one.rb (100%) rename lib/ae_page_objects/{ => elements}/select.rb (100%) delete mode 100644 lib/ae_page_objects/load_ensuring.rb delete mode 100644 lib/ae_page_objects/methods/node.rb delete mode 100644 lib/ae_page_objects/staleable.rb delete mode 100644 lib/ae_page_objects/visitable.rb diff --git a/lib/ae_page_objects.rb b/lib/ae_page_objects.rb index 56af2651..83083082 100644 --- a/lib/ae_page_objects.rb +++ b/lib/ae_page_objects.rb @@ -27,23 +27,22 @@ module Dsl autoload :FormFor, 'ae_page_objects/core/dsl/form_for' end - module Methods - autoload :Node, 'ae_page_objects/methods/node' + module Concerns + autoload :LoadEnsuring, 'ae_page_objects/concerns/load_ensuring' + autoload :Staleable, 'ae_page_objects/concerns/staleable' + autoload :Visitable, 'ae_page_objects/concerns/visitable' end autoload :Node, 'ae_page_objects/node' autoload :Document, 'ae_page_objects/document' autoload :Element, 'ae_page_objects/element' autoload :ElementProxy, 'ae_page_objects/element_proxy' - autoload :HasOne, 'ae_page_objects/has_one' - autoload :Collection, 'ae_page_objects/collection' - autoload :Form, 'ae_page_objects/form' - autoload :Select, 'ae_page_objects/select' - autoload :Checkbox, 'ae_page_objects/checkbox' - autoload :LoadEnsuring, 'ae_page_objects/load_ensuring' - autoload :Staleable, 'ae_page_objects/staleable' - autoload :Visitable, 'ae_page_objects/visitable' + autoload :HasOne, 'ae_page_objects/elements/has_one' + autoload :Collection, 'ae_page_objects/elements/collection' + autoload :Form, 'ae_page_objects/elements/form' + autoload :Select, 'ae_page_objects/elements/select' + autoload :Checkbox, 'ae_page_objects/elements/checkbox' end ActiveSupport::Dependencies.extend AePageObjects::DependenciesHook diff --git a/lib/ae_page_objects/concerns/load_ensuring.rb b/lib/ae_page_objects/concerns/load_ensuring.rb new file mode 100644 index 00000000..d621749e --- /dev/null +++ b/lib/ae_page_objects/concerns/load_ensuring.rb @@ -0,0 +1,30 @@ +module AePageObjects + class LoadingFailed < StandardError + end + + module Concerns + module LoadEnsuring + extend ActiveSupport::Concern + + def initialize(*args) + super + ensure_loaded! + end + + private + + def loaded_locator + end + + def ensure_loaded! + if locator = loaded_locator + find(*eval_locator(locator)) + end + + self + rescue Capybara::ElementNotFound => e + raise LoadingFailed, e.message + end + end + end +end diff --git a/lib/ae_page_objects/concerns/staleable.rb b/lib/ae_page_objects/concerns/staleable.rb new file mode 100644 index 00000000..64d5446b --- /dev/null +++ b/lib/ae_page_objects/concerns/staleable.rb @@ -0,0 +1,29 @@ +module AePageObjects + class StalePageObject < StandardError + end + + module Concerns + module Staleable + extend ActiveSupport::Concern + + def stale? + @stale + end + + def node + if stale? + raise StalePageObject, "Can't access stale page object '#{self}'" + end + + super + end + + private + + def stale! + @stale = true + end + + end + end +end \ No newline at end of file diff --git a/lib/ae_page_objects/concerns/visitable.rb b/lib/ae_page_objects/concerns/visitable.rb new file mode 100644 index 00000000..6a552cb2 --- /dev/null +++ b/lib/ae_page_objects/concerns/visitable.rb @@ -0,0 +1,61 @@ +module AePageObjects + class PathNotResolvable < StandardError + end + + module Concerns + module Visitable + extend ActiveSupport::Concern + + private + + def ensure_loaded! + unless self.class.can_load_from_current_url? + raise LoadingFailed, "#{self.class.name} cannot be loaded with url '#{current_url_without_params}'" + end + + super + end + + module VisitMethod + def visit(*args) + raise ArgumentError, "Cannot pass block to visit()" if block_given? + + full_path = application.generate_path(paths.first, *args) + raise PathNotResolvable, "#{self.name} not visitable via #{paths.first}(#{args.inspect})" unless full_path + + Capybara.current_session.visit(full_path) + new + end + end + + module ClassMethods + + def can_load_from_current_url? + return true if paths.empty? + + Capybara.current_session.wait_until do + url = current_url_without_params + + paths.any? do |path| + application.path_recognizes_url?(path, url) + end + end + end + + private + + def paths + @paths ||= [] + end + + def path(path_method) + raise ArgumentError, "path must be a symbol or string" if ! path_method.is_a?(Symbol) && ! path_method.is_a?(String) + + paths << path_method + + extend VisitMethod + end + end + end + end +end \ No newline at end of file diff --git a/lib/ae_page_objects/document.rb b/lib/ae_page_objects/document.rb index 5f40cf3f..61ce23d6 100644 --- a/lib/ae_page_objects/document.rb +++ b/lib/ae_page_objects/document.rb @@ -1,6 +1,6 @@ module AePageObjects class Document < Node - include Visitable + include Concerns::Visitable def document self diff --git a/lib/ae_page_objects/checkbox.rb b/lib/ae_page_objects/elements/checkbox.rb similarity index 100% rename from lib/ae_page_objects/checkbox.rb rename to lib/ae_page_objects/elements/checkbox.rb diff --git a/lib/ae_page_objects/collection.rb b/lib/ae_page_objects/elements/collection.rb similarity index 100% rename from lib/ae_page_objects/collection.rb rename to lib/ae_page_objects/elements/collection.rb diff --git a/lib/ae_page_objects/form.rb b/lib/ae_page_objects/elements/form.rb similarity index 100% rename from lib/ae_page_objects/form.rb rename to lib/ae_page_objects/elements/form.rb diff --git a/lib/ae_page_objects/has_one.rb b/lib/ae_page_objects/elements/has_one.rb similarity index 100% rename from lib/ae_page_objects/has_one.rb rename to lib/ae_page_objects/elements/has_one.rb diff --git a/lib/ae_page_objects/select.rb b/lib/ae_page_objects/elements/select.rb similarity index 100% rename from lib/ae_page_objects/select.rb rename to lib/ae_page_objects/elements/select.rb diff --git a/lib/ae_page_objects/load_ensuring.rb b/lib/ae_page_objects/load_ensuring.rb deleted file mode 100644 index 0f8767ed..00000000 --- a/lib/ae_page_objects/load_ensuring.rb +++ /dev/null @@ -1,28 +0,0 @@ -module AePageObjects - class LoadingFailed < StandardError - end - - module LoadEnsuring - extend ActiveSupport::Concern - - def initialize(*args) - super - ensure_loaded! - end - - private - - def loaded_locator - end - - def ensure_loaded! - if locator = loaded_locator - find(*eval_locator(locator)) - end - - self - rescue Capybara::ElementNotFound => e - raise LoadingFailed, e.message - end - end -end diff --git a/lib/ae_page_objects/methods/node.rb b/lib/ae_page_objects/methods/node.rb deleted file mode 100644 index 553e9956..00000000 --- a/lib/ae_page_objects/methods/node.rb +++ /dev/null @@ -1,69 +0,0 @@ -module AePageObjects - module Methods - module Node - extend ActiveSupport::Concern - - include Dsl::Element - include Dsl::NestedElement - include Dsl::Collection - include Dsl::FormFor - - def initialize(capybara_node = Capybara.current_session) - @node = capybara_node - end - - def node - @node - end - - def document - raise "Must implement!" - end - - delegate :current_url, :to => 'self.class' - delegate :current_url_without_params, :to => 'self.class' - - delegate :find, :to => :node - delegate :all, :to => :node - delegate :value, :to => :node - delegate :set, :to => :node - delegate :text, :to => :node - delegate :visible?, :to => :node - - private - - def eval_locator(locator) - return unless locator - - if locator.respond_to?(:call) - locator = instance_eval(&locator) - end - - locator.is_a?(Array) ? locator : [locator.to_s] - end - - module ClassMethods - - def current_url - Capybara.current_session.current_url.sub(/^https?:\/\/[^\/]*/, '') - end - - def current_url_without_params - current_url.sub(/\?.*/, '') - end - - def new_subclass(&block) - klass = Class.new(self) - klass.class_eval(&block) if block - klass - end - - def new(*args) - super(*args).tap do |me| - yield me if block_given? - end - end - end - end - end -end diff --git a/lib/ae_page_objects/node.rb b/lib/ae_page_objects/node.rb index 9d789ece..bd23aecf 100644 --- a/lib/ae_page_objects/node.rb +++ b/lib/ae_page_objects/node.rb @@ -1,7 +1,73 @@ module AePageObjects class Node - include Methods::Node - include LoadEnsuring - include Staleable + module Methods + extend ActiveSupport::Concern + + include Dsl::Element + include Dsl::NestedElement + include Dsl::Collection + include Dsl::FormFor + + def initialize(capybara_node = Capybara.current_session) + @node = capybara_node + end + + def node + @node + end + + def document + raise "Must implement!" + end + + delegate :current_url, :to => 'self.class' + delegate :current_url_without_params, :to => 'self.class' + + delegate :find, :to => :node + delegate :all, :to => :node + delegate :value, :to => :node + delegate :set, :to => :node + delegate :text, :to => :node + delegate :visible?, :to => :node + + private + + def eval_locator(locator) + return unless locator + + if locator.respond_to?(:call) + locator = instance_eval(&locator) + end + + locator.is_a?(Array) ? locator : [locator.to_s] + end + + module ClassMethods + + def current_url + Capybara.current_session.current_url.sub(/^https?:\/\/[^\/]*/, '') + end + + def current_url_without_params + current_url.sub(/\?.*/, '') + end + + def new_subclass(&block) + klass = Class.new(self) + klass.class_eval(&block) if block + klass + end + + def new(*args) + super(*args).tap do |me| + yield me if block_given? + end + end + end + end + + include Methods + include Concerns::LoadEnsuring + include Concerns::Staleable end end diff --git a/lib/ae_page_objects/staleable.rb b/lib/ae_page_objects/staleable.rb deleted file mode 100644 index 2c64c6a7..00000000 --- a/lib/ae_page_objects/staleable.rb +++ /dev/null @@ -1,27 +0,0 @@ -module AePageObjects - class StalePageObject < StandardError - end - - module Staleable - extend ActiveSupport::Concern - - def stale? - @stale - end - - def node - if stale? - raise StalePageObject, "Can't access stale page object '#{self}'" - end - - super - end - - private - - def stale! - @stale = true - end - - end -end diff --git a/lib/ae_page_objects/visitable.rb b/lib/ae_page_objects/visitable.rb deleted file mode 100644 index 235bf744..00000000 --- a/lib/ae_page_objects/visitable.rb +++ /dev/null @@ -1,59 +0,0 @@ -module AePageObjects - class PathNotResolvable < StandardError - end - - module Visitable - extend ActiveSupport::Concern - - private - - def ensure_loaded! - unless self.class.can_load_from_current_url? - raise LoadingFailed, "#{self.class.name} cannot be loaded with url '#{current_url_without_params}'" - end - - super - end - - module VisitMethod - def visit(*args) - raise ArgumentError, "Cannot pass block to visit()" if block_given? - - full_path = application.generate_path(paths.first, *args) - raise PathNotResolvable, "#{self.name} not visitable via #{paths.first}(#{args.inspect})" unless full_path - - Capybara.current_session.visit(full_path) - new - end - end - - module ClassMethods - - def can_load_from_current_url? - return true if paths.empty? - - Capybara.current_session.wait_until do - url = current_url_without_params - - paths.any? do |path| - application.path_recognizes_url?(path, url) - end - end - end - - private - - def paths - @paths ||= [] - end - - def path(path_method) - raise ArgumentError, "path must be a symbol or string" if ! path_method.is_a?(Symbol) && ! path_method.is_a?(String) - - paths << path_method - - extend VisitMethod - end - end - end -end