capybara-widgets 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4486c4e504621dc18e76de0e990848aad563d821
4
- data.tar.gz: 055b95ae49d0a92266c13dc62e3cec6a444392f8
3
+ metadata.gz: e196b230cb55720ba9f662b0c2b8ee8d6a18971e
4
+ data.tar.gz: 63b356fc9d51fa05057123d99285935910d090f1
5
5
  SHA512:
6
- metadata.gz: 00fd373bc52d8be429a29602db3ba2353e6a69e5962d10e926de7abd15efda38f5ddef8fc87e3c83acf8eb5d13472c20e05fcc3a77137adae6a3488e48fa5b97
7
- data.tar.gz: 50343fac4b224bf14bb6a086ef1673e1ddcdb0d4ba5578270ebee01f1a78d917bc1d1537812f4d230a8cbb19e9b865cd153f7478ba2170f4bce23af8bc094686
6
+ metadata.gz: 42fe69573483dee2b0b15d4ed193a3dd8ae1230c5f672c453963eeef6f4cb124cd5eb1e9b8b77c67a723059d547906c2cb0aa230a5716b30892350bd7183a51e
7
+ data.tar.gz: 0a92d4cb0a543b119b0c664b9cf009137264fb187989a503d531c0f0e82fce047ec0bf355922783868ebd0d6a62b80ae96316e11ace9e3c0355421c73b27e15e
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.1.4"
4
+ script: bundle exec rspec spec/features
5
+
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Capybara::Widgets
2
2
 
3
+ [![Build Status](https://travis-ci.org/vgrigoruk/capybara-widgets.svg?branch=master)](https://travis-ci.org/vgrigoruk/capybara-widgets)
4
+
3
5
  TODO: Write a gem description
4
6
 
5
7
  ## Installation
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Capybara::Widgets::VERSION
9
9
  spec.authors = ["Vitalii Grygoruk"]
10
10
  spec.email = ["vitalii[dot]grygoruk[at]gmail[dot]com"]
11
- spec.summary = %q{Page object implementation for Capybara}
12
- spec.description = %q{Another implementation of page object pattern for Capybara}
11
+ spec.summary = %q{Page objects and page components for Capybara}
12
+ spec.description = %q{Easily create well-structured page and ui component classes in your Capybara + Cucumber or Rspec tests}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "rspec", "~> 3.2"
24
24
  spec.add_development_dependency "cucumber"
25
25
 
26
26
  spec.add_dependency "capybara", "~> 2.0"
@@ -0,0 +1,10 @@
1
+ module Capybara
2
+ module Widgets
3
+ module DSL
4
+ def within_widget(klass)
5
+ raise "#{klass.name} is not a subclass of Widget" unless klass < Capybara::Widgets::Widget
6
+ yield klass.new
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,4 +1,5 @@
1
1
  require_relative 'widget'
2
+ require_relative 'page_collection'
2
3
  require 'active_support/core_ext/class/attribute'
3
4
 
4
5
  module Capybara
@@ -6,13 +7,26 @@ module Capybara
6
7
  class Page < Widget
7
8
 
8
9
  class_attribute :path
10
+ class_attribute :path_matcher
11
+
12
+ def self.inherited(subclass)
13
+ PageCollection.instance.registry << subclass
14
+ end
9
15
 
10
16
  def initialize
11
17
  super(page)
12
18
  end
13
19
 
14
20
  def loaded?
15
- true
21
+ result = opened?
22
+ if self.respond_to?(:elements_loaded?)
23
+ result = result && elements_loaded?
24
+ end
25
+ result
26
+ end
27
+
28
+ def opened?
29
+ current_path =~ %r{#{Regexp.quote(self.path)}}
16
30
  end
17
31
 
18
32
  def reload!
@@ -0,0 +1,47 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'singleton'
3
+
4
+ module Capybara
5
+ module Widgets
6
+ class PageCollection
7
+ include Singleton
8
+
9
+ attr_accessor :registry
10
+
11
+ class_attribute :load_path
12
+
13
+ def initialize
14
+ self.registry = Array.new
15
+ @loaded = false
16
+ end
17
+
18
+ def current_page_class
19
+ load_classes unless @loaded
20
+ klass = registry.detect do |page_class|
21
+ if page_class.path_matcher
22
+ if page_class.path_matcher.is_a?(Regexp)
23
+ Capybara.current_path =~ page_class.path_matcher
24
+ elsif page_class.path_matcher.is_a?(String)
25
+ Capybara.current_path.include?(page_class.path_matcher)
26
+ end
27
+ else
28
+ Capybara.current_path.include?(page_class.path)
29
+ end
30
+ end
31
+ raise "Not found" if klass.nil?
32
+ klass
33
+ end
34
+
35
+ private
36
+
37
+ def load_classes
38
+ Dir[File.join(load_path, "**/*.rb")].each{|f| require f}
39
+ @loaded = true
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ def current_page
46
+ Capybara::Widgets::PageCollection.instance.current_page_class.new
47
+ end
@@ -53,6 +53,12 @@ module Capybara
53
53
  define_method("#{name}=") { |arg| root.find(*query).set(arg) }
54
54
  define_method("has_#{name}?") { root.has_selector?(*query) }
55
55
  end
56
+
57
+ def required_element(*element_names)
58
+ define_method(:elements_loaded?) { element_names.each {|name| self.send("has_#{name}?")} }
59
+ end
60
+
61
+ alias_method :required_elements, :required_element
56
62
  end
57
63
 
58
64
  # delegate missing methods to the @root node
@@ -1,22 +1,35 @@
1
1
  require 'cucumber'
2
2
  require_relative '../helpers/string_helpers'
3
+ require_relative '../helpers/async_helper'
4
+ require_relative '../core/dsl'
3
5
 
4
- World Capybara::Widgets::StringHelpers
6
+ World Capybara::Widgets::StringHelpers
7
+ World Capybara::Widgets::AsyncHelper
8
+ World Capybara::Widgets::DSL
5
9
 
6
- Given(/^I am on a (.* page)/) do |page_name|
7
- within_widget(to_widget_class(page_name)) do |page|
8
- page.open!
9
- end
10
+ Given(/^I am on a (.* page)/) do |page_name|
11
+ within_widget(to_widget_class(page_name)) do |page|
12
+ page.open!
10
13
  end
14
+ end
11
15
 
12
- When(/^I navigate to a (.* page)/) do |page_name|
13
- within_widget(to_widget_class(page_name)) do |page|
14
- page.open!
15
- end
16
+ When(/^I navigate to a (.* page)/) do |page_name|
17
+ within_widget(to_widget_class(page_name)) do |page|
18
+ page.open!
16
19
  end
20
+ end
17
21
 
18
- Then(/^I should be on a (.* page)/) do |page_name|
19
- within_widget(to_widget_class(page_name)) do |page|
20
- expect(page).to be_opened
21
- end
22
+ Then(/^I should be on a (.* page)/) do |page_name|
23
+ within_widget(to_widget_class(page_name)) do |page|
24
+ eventually { expect(page).to be_loaded }
22
25
  end
26
+ end
27
+
28
+ When(/^I click "([^"]*)"$/) do |action|
29
+ current_page.send(to_widget_action(action, '!'))
30
+ end
31
+
32
+ When(/^I set "([^"]*)" to "([^"]*)"$/) do |field_name, value|
33
+ current_page.send(to_widget_action(field_name, '='), value)
34
+ end
35
+
@@ -1,12 +1,9 @@
1
1
  require 'cucumber'
2
2
  require_relative '../helpers/string_helpers'
3
+ require_relative '../core/dsl'
3
4
 
4
5
  World Capybara::Widgets::StringHelpers
5
-
6
- def within_widget(klass)
7
- raise "#{klass.name} is not a subclass of Widget" unless klass < Capybara::Widgets::Widget
8
- yield klass.new
9
- end
6
+ World Capybara::Widgets::DSL
10
7
 
11
8
  def resolve_widget(widget_chain)
12
9
  elements = widget_chain.split('->')
@@ -17,7 +14,7 @@ def resolve_widget(widget_chain)
17
14
  apply_action_chain(top_widget, action_chain)
18
15
  end
19
16
 
20
- When(/^I click "([^"]*)" in a "([^"]*)"$/) do |action, widget_path|
17
+ When(/^I click "([^"]*)" [o|i]n a "([^"]*)"$/) do |action, widget_path|
21
18
  target_widget = resolve_widget(widget_path)
22
19
  target_widget.send(to_widget_action(action, '!'))
23
20
  end
@@ -0,0 +1,20 @@
1
+ module Capybara
2
+ module Widgets
3
+ module AsyncHelper
4
+ def eventually(options = {})
5
+ timeout = options[:timeout] || 10
6
+ interval = options[:interval] || 0.1
7
+ time_limit = Time.now + timeout
8
+ loop do
9
+ begin
10
+ result = yield
11
+ rescue => error
12
+ end
13
+ return result if error.nil?
14
+ raise error if Time.now >= time_limit
15
+ sleep interval
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ require_relative 'core/dsl'
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Widgets
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -4,5 +4,6 @@ module Capybara
4
4
  module Widgets
5
5
  autoload :Widget, 'capybara/widgets/core/widget'
6
6
  autoload :Page, 'capybara/widgets/core/page'
7
+ autoload :PageCollection, 'capybara/widgets/core/page_collection'
7
8
  end
8
9
  end
@@ -33,8 +33,8 @@ describe Capybara::Widgets::Widget do
33
33
  end
34
34
  # Act and Assert
35
35
  widget = MyWidget.new
36
- expect(widget.loaded).to be_false
36
+ expect(widget.loaded).to be false
37
37
  widget.root
38
- expect(widget.loaded).to be_true
38
+ expect(widget.loaded).to be true
39
39
  end
40
40
  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.0.2
4
+ version: 0.1.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-06-24 00:00:00.000000000 Z
11
+ date: 2015-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '3.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '3.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: cucumber
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,7 +94,8 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- description: Another implementation of page object pattern for Capybara
97
+ description: Easily create well-structured page and ui component classes in your Capybara
98
+ + Cucumber or Rspec tests
98
99
  email:
99
100
  - vitalii[dot]grygoruk[at]gmail[dot]com
100
101
  executables: []
@@ -102,18 +103,23 @@ extensions: []
102
103
  extra_rdoc_files: []
103
104
  files:
104
105
  - ".gitignore"
106
+ - ".travis.yml"
105
107
  - Gemfile
106
108
  - LICENSE.txt
107
109
  - README.md
108
110
  - Rakefile
109
111
  - capybara-widgets.gemspec
110
112
  - lib/capybara/widgets.rb
113
+ - lib/capybara/widgets/core/dsl.rb
111
114
  - lib/capybara/widgets/core/page.rb
115
+ - lib/capybara/widgets/core/page_collection.rb
112
116
  - lib/capybara/widgets/core/widget.rb
113
117
  - lib/capybara/widgets/cucumber.rb
114
118
  - lib/capybara/widgets/cucumber/page_steps.rb
115
119
  - lib/capybara/widgets/cucumber/widget_steps.rb
120
+ - lib/capybara/widgets/helpers/async_helper.rb
116
121
  - lib/capybara/widgets/helpers/string_helpers.rb
122
+ - lib/capybara/widgets/rspec.rb
117
123
  - lib/capybara/widgets/version.rb
118
124
  - spec/features/page_spec.rb
119
125
  - spec/features/widget_spec.rb
@@ -141,7 +147,7 @@ rubyforge_project:
141
147
  rubygems_version: 2.2.2
142
148
  signing_key:
143
149
  specification_version: 4
144
- summary: Page object implementation for Capybara
150
+ summary: Page objects and page components for Capybara
145
151
  test_files:
146
152
  - spec/features/page_spec.rb
147
153
  - spec/features/widget_spec.rb