capybara-widgets 0.4.0 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc8ba6872d65c984e482da032b16bc77918c6847
4
- data.tar.gz: e7f0e2119a36f16bbbca1c2e35b05ba6375f5229
3
+ metadata.gz: 021a642e1232afc2aab0834d80b3aae72c3d353c
4
+ data.tar.gz: 6ba634d5670248068aebf111885c325366fb3ad9
5
5
  SHA512:
6
- metadata.gz: 5552b63d66512fa9fe7f621c482094c2c94d4df939d3020bc38ade8775a16d1dc86f6ae191f86355b41a381e82b8d1f116ec621c3b510396448190354ca21f78
7
- data.tar.gz: 12f25e3b3c24ed0e4935ff9a60ed3cd034aa7b6398676a6be1c68d082d271574b7242cd9c74efd38adb4dd9bd577cb68395bdab48b6e5a96a5e4b3cc5cf9f433
6
+ metadata.gz: 41fc9fa61acf8649785b65dcfb95507f82c0ff738f31e68d801582bf00a4bb036272449b27e76f1fab4cbf4e2083f66205d6212f799ab942fa60016209acb93c
7
+ data.tar.gz: dbe2892d04280e780d174180de57f3dd37325f99ddac1d1af36c263b748f1d6880d9c1243cda17a882ea64013e70c00c8beefe89a2caaf8075258a7f35a3224e
data/README.md CHANGED
@@ -2,23 +2,19 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/vgrigoruk/capybara-widgets.svg?branch=master)](https://travis-ci.org/vgrigoruk/capybara-widgets)
4
4
 
5
- TODO: Write a gem description
5
+ Page objects / fragments implementation for Capybara.
6
+ - Support lambda element selectors.
7
+ - RSpec & Cucumber integration.
8
+ - Work for web & mobile (appium driver).
6
9
 
7
10
  ## Installation
8
11
 
9
- Add this line to your application's Gemfile:
12
+ Add this line to your application's Gemfile and run `bundle`:
10
13
 
11
14
  ```ruby
12
15
  gem 'capybara-widgets'
13
16
  ```
14
17
 
15
- And then execute:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
20
-
21
- $ gem install capybara-widgets
22
18
 
23
19
  ## Usage
24
20
 
@@ -0,0 +1,66 @@
1
+ module ExecutionHooks
2
+ def self.included(base)
3
+ base.send :extend, ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ # this method is invoked whenever a new instance method is added to a class
8
+ def method_added(method_name)
9
+ # do nothing if the method that was added was an actual hook method, or
10
+ # if it already had hooks added to it
11
+ return if hooks.include?(method_name) || ignored_methods.include?(method_name) || hooked_methods.include?(method_name)
12
+ add_hooks_to(method_name)
13
+ end
14
+
15
+ # this is the DSL method that classes use to add before hooks
16
+ def before_hook(method_name, opts={})
17
+ hooks << method_name
18
+ ignored_methods.concat Array(opts[:ignore])
19
+ end
20
+
21
+ # keeps track of all before hooks
22
+ def hooks
23
+ @hooks ||= []
24
+ end
25
+
26
+ # keeps track of all before hooks
27
+ def ignored_methods
28
+ @ignored_methods ||= []
29
+ end
30
+
31
+ private
32
+
33
+ # keeps track of all currently hooked methods
34
+ def hooked_methods
35
+ @hooked_methods ||= []
36
+ end
37
+
38
+ def add_hooks_to(method_name)
39
+ # add this method to known hook mappings to avoid infinite
40
+ # recursion when we redefine the method below
41
+ hooked_methods << method_name
42
+
43
+ # grab the original method definition
44
+ original_method = instance_method(method_name)
45
+
46
+ # re-define the method, but notice how we reference the original
47
+ # method definition
48
+ define_method(method_name) do |*args, &block|
49
+ # invoke the hook methods
50
+ hooks_to_run = []
51
+ klass = self.class
52
+ while klass != BasicObject do
53
+ hooks_to_run.concat(klass.hooks) if klass.respond_to? :hooks
54
+ klass = klass.superclass
55
+ end
56
+ hooks_to_run.each do |h|
57
+ # LOGGER.debug "calling hook #{h} for method: #{method_name}"
58
+ method(h).call
59
+ end
60
+
61
+ # now invoke the original method
62
+ original_method.bind(self).call(*args, &block)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -53,6 +53,17 @@ module Capybara
53
53
  loaded?
54
54
  self
55
55
  end
56
+
57
+ class << self
58
+ def iframe(name, page_class, selector)
59
+ define_method name do |&block|
60
+ raise "No iframe found: #{selector}" unless page.has_selector?(selector)
61
+ within_frame page.find(selector) do
62
+ block.call page_class.new
63
+ end
64
+ end
65
+ end
66
+ end
56
67
  end
57
68
  end
58
69
  end
@@ -1,5 +1,8 @@
1
1
  require 'capybara/dsl'
2
+ require 'active_support/core_ext/class/attribute'
2
3
  require_relative '../helpers/async_helper'
4
+ require_relative 'execution_hooks'
5
+
3
6
 
4
7
  module Capybara
5
8
  module Widgets
@@ -7,6 +10,21 @@ module Capybara
7
10
  include Capybara::DSL
8
11
  include Capybara::Widgets::AsyncHelper
9
12
 
13
+ include ExecutionHooks
14
+
15
+ before_hook :set_target_app,
16
+ ignore: [
17
+ :driver, :driver=, :driver?,
18
+ :session_name, :session_name=, :session_name?,
19
+ :default_selector, :default_selector=, :default_selector?
20
+ ]
21
+
22
+ class_attribute :driver, :session_name, :default_selector
23
+
24
+ self.driver = Capybara.current_driver
25
+ self.session_name = Capybara.session_name
26
+ self.default_selector = Capybara.default_selector
27
+
10
28
  def initialize(*search_scope)
11
29
  case search_scope.length
12
30
  when 0
@@ -106,6 +124,17 @@ module Capybara
106
124
  super
107
125
  end
108
126
  end
127
+
128
+ private
129
+
130
+ def set_target_app
131
+ if Capybara.current_driver != driver || Capybara.session_name != session_name || Capybara.default_selector != default_selector
132
+ puts "Switching target: #{driver}:#{session_name}:#{default_selector}"
133
+ Capybara.current_driver = self.driver
134
+ Capybara.session_name = self.session_name
135
+ Capybara.default_selector = self.default_selector
136
+ end
137
+ end
109
138
  end
110
139
  end
111
140
  end
@@ -39,6 +39,45 @@ module Capybara
39
39
  "Expected that '#{widget.class.name}' not to be visible"
40
40
  end
41
41
  end
42
+ #
43
+ # RSpec::Matchers.define :be_loaded do
44
+ # match do |page|
45
+ # page_opened = page.opened?
46
+ # if page.respond_to?(:components_loaded?)
47
+ # components_loaded = page.components_loaded?
48
+ # end
49
+ # if page.respond_to?(:elements_loaded?)
50
+ # elements_loaded = page.elements_loaded?
51
+ # end
52
+ # page_opened && components_loaded && elements_loaded
53
+ # end
54
+ #
55
+ # match_when_negated do |_|
56
+ # raise "Unsupported negated matcher"
57
+ # end
58
+ #
59
+ # failure_message do |page|
60
+ # page_opened = page.opened?
61
+ # components_loaded = page.respond_to?(:components_loaded?) ? page.components_loaded? : true
62
+ # elements_loaded = page.respond_to?(:elements_loaded?) ? page.elements_loaded? : true
63
+ # message = "Failed: "
64
+ # unless page_opened
65
+ # message = "#{page.class} is not opened.\n Actual: #{page.current_path}\nExpected: #{page.path_matcher || page.url_matcher || page.path }"
66
+ # end
67
+ # unless components_loaded
68
+ # message = "Some components are not loaded on #{page.class}"
69
+ # end
70
+ # unless elements_loaded
71
+ # message = "Some elements are not loaded on #{page.class}"
72
+ # end
73
+ # message
74
+ # end
75
+ #
76
+ # failure_message_when_negated do |_|
77
+ # raise "Unsupported negated matcher"
78
+ # end
79
+ # end
80
+ #
42
81
  end
43
82
  end
44
83
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Widgets
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-widgets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitalii Grygoruk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-24 00:00:00.000000000 Z
11
+ date: 2016-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -125,6 +125,7 @@ files:
125
125
  - capybara-widgets.gemspec
126
126
  - lib/capybara/widgets.rb
127
127
  - lib/capybara/widgets/core/dsl.rb
128
+ - lib/capybara/widgets/core/execution_hooks.rb
128
129
  - lib/capybara/widgets/core/page.rb
129
130
  - lib/capybara/widgets/core/page_collection.rb
130
131
  - lib/capybara/widgets/core/widget.rb