capybara-wheel 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fd80ae9d800e4bff8293c3c6a913e0817915ee8e
4
+ data.tar.gz: 83f9bafd3a783f3c5503704e7b0f16988c4073db
5
+ SHA512:
6
+ metadata.gz: 65aed3f76018833406c291d04acea02753f5541d672c0de57311eb1c6f1a406aa4caba3957dc2e463a70c93279f52df612fb8296e741ad77f3ff531673beba6e
7
+ data.tar.gz: a793890e6f6ae8f8ffbcb361c7bd68f5acf502cd1ba9b3c098601bc18558fa98001a04db98bb96f41d9f6b493c8f4e236cc0d2093e3fb7659b6a53a0550e6f4a
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capybara-wheel.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Gabriel Rotbart
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # Capybara::Wheel
2
+ > Keeping the rodent on track
3
+
4
+ Capybara wheel is a page model framework which natively and (hopefully) easily enforces stability coventions:
5
+
6
+ - No memoization. Every action or query relating to the page should make a new find callback to the actual page.
7
+ - Enforces native Capybara wait time when interacting with the page if the element is not there (yet) or changed.
8
+
9
+ - No access to capybara directly from the specs.
10
+ - Enforces single point of reference to selectors / elements.
11
+ - Also helps reducing memoizations.
12
+
13
+ - Subelements structure to scope finds to a specific section of the page.
14
+ - Reduces ambiguity.
15
+
16
+ *A special thank you to @woollyams for the initial concept*
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ gem 'capybara-wheel'
23
+
24
+ And then execute:
25
+
26
+ $ bundle
27
+
28
+ Or install it yourself as:
29
+
30
+ $ gem install capybara-wheel
31
+
32
+ ## Usage
33
+
34
+ In spec_helper.rb:
35
+
36
+ $ require 'capybara/wheel'
37
+
38
+ **Important: Capybara Wheel overrides Capybara native `feature` method to inject new behavior. This means it should be required instead or Capybara**
39
+
40
+ ## Modeling
41
+
42
+ ### Page Model
43
+
44
+
45
+ To model a new page:
46
+
47
+ class NewPage < Capybara::Wheel::Page
48
+
49
+ A page needs to implament two methods:
50
+
51
+ def path
52
+ # implament to support visiting the page directly
53
+ # Rails apps can include Rails.application.routes.url_helpers to access the url helpers
54
+ # Other applications should implament a relative url
55
+ end
56
+
57
+ and
58
+
59
+ def on_page?
60
+ # Capybara Wheel calls this method before excuting the page block (see Specs section below below)
61
+ # Recommended: Use Wheel native Page method has_title?('Title')
62
+ # e.g. has_title?('Login')
63
+
64
+ # Or: Use Capybara.find(any selector you expect would be on a loaded page)
65
+ # e.g. Capybara.find('h1', text: 'Login Page')
66
+ end
67
+
68
+ > Example:
69
+ >
70
+ > class SuperVillanConsole << Capybara::Wheel::Page
71
+ >
72
+ > def path
73
+ > super_villan_console_path
74
+ > end
75
+ >
76
+ > def on_page?
77
+ > has_title?('Destroy all humans')
78
+ > end
79
+ > end
80
+
81
+ ***
82
+
83
+ ### Element and Subelement model
84
+
85
+ #### Element
86
+
87
+ Once inside a Page model, it has access to the `element` method.
88
+
89
+ element 'ElementName', 'selector' *optional block*
90
+
91
+ # Wheel recommends using a name that follows the class constant name convention (i.e CamelCase)
92
+ # as an object will be created and assigned this name (see below)
93
+
94
+ The `element` method does several important things:
95
+
96
+ 1. It defines a Page method element_name which allows access and initializes...
97
+ 2. an Element model
98
+
99
+ Out of the box, Element accepts all the old familar Capybara Element actions / queries (e.g. click, set, text, visible?).Once an action or query is sent to a Wheel element it then finds the native Capybara element and passes it on. This ensures that each method call is executed on the newset version of the element.
100
+
101
+ Passing a block to element gives access to the Element object for the purpose of implamenting SubElements (see below) or rolling your own methods:
102
+
103
+ **The `capybara_element` method is the direct accessor to the native Capybara element callback.**
104
+
105
+ > Example
106
+ >
107
+ > element 'ButtonOfDoom', '#doom-button' do
108
+ >
109
+ > def armed?
110
+ > capybara_element.text == 'Armed'
111
+ > end
112
+ >
113
+ > end
114
+ >
115
+ > element 'MissleTracker', '.missle-tracker'
116
+ >
117
+ >
118
+ > #=> SuperVillanConsole.new.button_of_doom.armed?
119
+ >
120
+ > #=> SuperVillanConsole.new.missle_tracker.visible?
121
+ >
122
+
123
+
124
+ #### Subelement
125
+
126
+ An element block also accepts the `subelement` method.
127
+
128
+ subelement 'SubElementName', 'selector' *optional block*
129
+
130
+ A subelement behaves exactly like element with one difference, the find is scoped to the containing (or parent) element which reduces ambiguity.
131
+
132
+ > Example
133
+ >
134
+ > element 'ButtonOfDoom', '#doom-button' do
135
+ >
136
+ > subelement 'ArmingKey', '#key' do
137
+ >
138
+ > def turn
139
+ > capybara_element.click
140
+ > end
141
+ >
142
+ > end
143
+ > end
144
+ >
145
+ > #=> SuperVillanConsole.new.button_of_doom.turn
146
+
147
+ ***
148
+ ***
149
+ ***
150
+
151
+
152
+
153
+ ## Contributing
154
+
155
+ 1. Fork it
156
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
157
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
158
+ 4. Push to the branch (`git push origin my-new-feature`)
159
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capybara/wheel/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "capybara-wheel"
8
+ spec.version = Capybara::Wheel::VERSION
9
+ spec.authors = ["@gabrielrotbart"]
10
+ spec.email = ["gabe@hooroo.com"]
11
+ spec.description = %q{Keeping the rodent on track}
12
+ spec.summary = %q{Creating (yet another) page model gem based around making capybara tests more stable with no need for waits}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "selenium-webdriver", "~> 2.0"
25
+ spec.add_development_dependency "sinatra", "~> 1.0"
26
+ spec.add_development_dependency "pry"
27
+
28
+ spec.add_dependency "capybara", "~> 2.1"
29
+ spec.add_dependency "rspec"
30
+ end
@@ -0,0 +1,34 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'wheel', '*.rb')).each {|file| require file}
2
+ require "capybara"
3
+ require 'capybara/dsl'
4
+ require 'rspec'
5
+
6
+ module Capybara
7
+ module Wheel
8
+ # main mixin to access wheel
9
+
10
+ def self.included(base)
11
+ base.instance_eval do
12
+ alias :background :before
13
+ alias :scenario :it
14
+ alias :given :let
15
+ alias :given! :let!
16
+ end
17
+ end
18
+
19
+ module FeatureOverride
20
+ def feature(*args, &block)
21
+ options = {
22
+ type: :wheel_feature,
23
+ caller: caller
24
+ }
25
+ options.merge!(args.pop) if args.last.is_a?(Hash)
26
+ describe(*args, options, &block)
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+
33
+ extend Capybara::Wheel::FeatureOverride
34
+ RSpec.configuration.include Capybara::Wheel, wheel_feature: true
@@ -0,0 +1,75 @@
1
+ require 'capybara/wheel/includes'
2
+ require 'forwardable'
3
+
4
+ module Capybara
5
+ module Wheel
6
+ class Element
7
+
8
+ extend Forwardable
9
+ include Capybara::Wheel::Includes
10
+ extend Capybara::Wheel::Includes::ClassIncludes
11
+
12
+ def initialize(selector = nil)
13
+ @selector = selector if selector
14
+ end
15
+
16
+ def_delegators :capybara_element,
17
+ :click,
18
+ :has_content?,
19
+ :checked?,
20
+ :text,
21
+ :visible?,
22
+ :present?,
23
+ :selected?,
24
+ :disabled?,
25
+ :tag_name,
26
+ :value,
27
+ :set,
28
+ :select_option,
29
+ :unselect_option,
30
+ :hover,
31
+ :[]
32
+
33
+
34
+
35
+ def present?
36
+ capybara_element.visible?
37
+ rescue Capybara::ElementNotFound => e
38
+ puts "#{e} on #{Time.now.strftime("%H:%I:%S:%L")}"
39
+ false
40
+ end
41
+
42
+ def visible?
43
+ capybara_element.visible?
44
+ rescue Capybara::ElementNotFound => e
45
+ puts "#{e} on #{Time.now.strftime("%H:%I:%S:%L")}"
46
+ false
47
+ end
48
+
49
+ def self.subelement(name, selector, block = nil)
50
+ subelement_factory = lambda do |parent_element|
51
+ Capybara::Wheel::ElementFactory.create_subelement(selector, parent_element, block)
52
+ end
53
+
54
+ define_method(underscore(name).to_sym) { subelement_factory.call(self) }
55
+ self
56
+ end
57
+
58
+ def subelement(name, selector, &block)
59
+ self.class.subelement(name, selector, block)
60
+ end
61
+
62
+ def selector
63
+ @selector
64
+ end
65
+
66
+ protected
67
+
68
+ # Finds a capybara element representing this thing
69
+ def capybara_element
70
+ capybara.find(selector)
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,31 @@
1
+ require 'capybara/wheel'
2
+
3
+ module Capybara
4
+ module Wheel
5
+ class ElementFactory
6
+
7
+ def self.create_element_klass(selector, block = nil)
8
+ subclass = Class.new(Capybara::Wheel::Element)
9
+
10
+ _selector = selector
11
+
12
+ subclass.class_exec do
13
+ define_method(:selector) { @selector = _selector}
14
+ end
15
+
16
+ subclass.class_eval(&block) if block
17
+
18
+ subclass
19
+ end
20
+
21
+ #TODO: Pass object not an instance
22
+ def self.create_subelement(selector, parent_element, block = nil)
23
+ subelement = Capybara::Wheel::SubElement.new(selector, parent_element)
24
+ subelement.instance_eval(&block) if block
25
+
26
+ subelement
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ require 'capybara/wheel'
2
+ require 'capybara'
3
+ require 'capybara/dsl'
4
+ require 'rspec'
5
+
6
+ module Capybara
7
+ module Wheel
8
+ module Includes
9
+
10
+ include Capybara::DSL
11
+
12
+ def capybara
13
+ Capybara.current_session
14
+ end
15
+
16
+ module ClassIncludes
17
+ def underscore(string)
18
+ string.gsub(/::/, '/').
19
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
20
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
21
+ tr("-", "_").
22
+ downcase
23
+ end
24
+
25
+ def make_const(string)
26
+
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,60 @@
1
+ require 'capybara/wheel/includes'
2
+
3
+ module Capybara
4
+ module Wheel
5
+ class Page
6
+
7
+ include Capybara::Wheel::Includes
8
+ extend Capybara::Wheel::Includes::ClassIncludes
9
+
10
+ # actively visits page and executes block in context
11
+ def visit(&block)
12
+ capybara.visit(path)
13
+ if block_given?
14
+ on(&block)
15
+ else
16
+ on_page?
17
+ end
18
+ return self
19
+ end
20
+
21
+ # execute a block in the context of this page
22
+ def on
23
+ unless on_page?
24
+ raise "We don't appear to be on #{description}"
25
+ end
26
+ yield self if block_given?
27
+ self
28
+ end
29
+
30
+ # Returns the path (relative URI) of this page
31
+ def path
32
+ raise NotImplementedError, "implement to support page.visit"
33
+ end
34
+
35
+ # Return true if the browser is on this page
36
+ def on_page?
37
+ raise NotImplementedError, "implement me, e.g. using #has_title?"
38
+ end
39
+
40
+ # callback commonly used for on_page?
41
+ def has_title?(expected_title)
42
+ capybara.has_css?("head title", :text => expected_title)
43
+ end
44
+
45
+ def self.element(name, selector, &block)
46
+ begin
47
+ element_klass = const_set("#{name}", Capybara::Wheel::ElementFactory.create_element_klass(selector, block))
48
+ rescue NameError
49
+ puts "We recommend using capitalized element and subelement names"
50
+ name = name.capitalize!
51
+ retry
52
+ end
53
+
54
+ define_method(underscore(name).to_sym) { element_klass.new(selector) }
55
+ self
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,24 @@
1
+ require 'capybara/wheel/includes'
2
+
3
+ module Capybara
4
+ module Wheel
5
+ class SubElement < Capybara::Wheel::Element
6
+ attr_reader :parent
7
+
8
+ def initialize(selector, parent)
9
+ @parent = parent
10
+ @selector = selector
11
+ end
12
+
13
+ private
14
+ def capybara_element
15
+ parent_element.find(selector)
16
+ end
17
+
18
+ def parent_element
19
+ parent.send(:capybara_element)
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ module Capybara
2
+ module Wheel
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ require 'rspec'
2
+ require 'pry'
3
+
4
+ RSpec.configure do |config|
5
+ config.treat_symbols_as_metadata_keys_with_true_values = true
6
+ end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+ require 'capybara/wheel'
3
+
4
+ RSpec.configure do |config|
5
+ config.before(:each, :some_hook) do
6
+ @hook_passed_on = true
7
+ end
8
+ end
9
+
10
+ feature 'runs as a wheel feature', :some_hook do
11
+
12
+ it 'should pass' do
13
+ end
14
+
15
+ it 'should be set as a wheel feature' do
16
+ example.metadata[:type].should == :wheel_feature
17
+ end
18
+
19
+ it 'should pass the right hook' do
20
+ @hook_passed_on.should be_true
21
+ end
22
+ end
23
+
24
+ feature 'Page' do
25
+ let(:page) { Capybara::Wheel::Page }
26
+
27
+ it 'has access to capybara' do
28
+ page.new.methods.include?(:capybara).should be_true
29
+ end
30
+
31
+ context 'can create an element instance' do
32
+ it 'and create a method for it' do
33
+ page.element('RadElement', '#rad-selector').new.should respond_to(:rad_element)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ feature 'Element' do
40
+ let(:element) { Capybara::Wheel::Element }
41
+
42
+ it 'has access to capybara' do
43
+ element.new('#some-selector').methods.include?(:capybara).should be_true
44
+ end
45
+
46
+ context 'can create a subelement instance' do
47
+ let(:subelement_name) { 'RadSubElement' }
48
+ let(:subelement_selector) { '#rad-sub-selector' }
49
+ let(:element_instance) { element.new.subelement(subelement_name, subelement_selector).new('#rad-selector') }
50
+
51
+ it 'and create a method for it' do
52
+ element_instance.should respond_to(:rad_sub_element)
53
+ end
54
+
55
+ it 'create a subelement with parent element context' do
56
+ element_instance.send(:rad_sub_element).parent.should == element_instance
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ feature 'SubElement' do
63
+ let(:parent_selector) { '#parent-selector'}
64
+ let(:sub_selector) { '#sub-selector'}
65
+ let!(:parent_element) { Capybara::Wheel::Element.new(parent_selector) }
66
+ let!(:subelement) { class ASubElement < Capybara::Wheel::SubElement
67
+ def my_element
68
+ capybara_element
69
+ end
70
+ end }
71
+
72
+ before :each do
73
+ parent_element.instance_eval do
74
+ def a_sub_element
75
+ ASubElement.new('#sub-selector', self)
76
+ end
77
+ end
78
+ end
79
+
80
+ it 'calls parent element capybara_element' do
81
+ pending
82
+ end
83
+
84
+ end
85
+
86
+ feature 'ElementFactory' do
87
+ let(:subject) { Capybara::Wheel::ElementFactory }
88
+ let(:selector) { '#rad-selector'}
89
+ let(:created_element_klass) { subject.create_element_klass(selector) }
90
+
91
+
92
+ it 'creates an element' do
93
+ created_element_klass.superclass.should == Capybara::Wheel::Element
94
+ end
95
+
96
+ it 'allows access to the selector' do
97
+ created_element_klass.new.selector.should == selector
98
+ end
99
+
100
+ it 'generated instance evalutes block' do
101
+ test_block = Proc.new do
102
+ def evaled_method
103
+ end
104
+ end
105
+
106
+ subject.create_element_klass(selector, test_block).new.should respond_to(:evaled_method)
107
+ end
108
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capybara-wheel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - '@gabrielrotbart'
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: selenium-webdriver
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: capybara
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Keeping the rodent on track
126
+ email:
127
+ - gabe@hooroo.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - .gitignore
133
+ - Gemfile
134
+ - LICENSE.txt
135
+ - README.md
136
+ - Rakefile
137
+ - capybara-wheel.gemspec
138
+ - lib/capybara/wheel.rb
139
+ - lib/capybara/wheel/element.rb
140
+ - lib/capybara/wheel/element_factory.rb
141
+ - lib/capybara/wheel/includes.rb
142
+ - lib/capybara/wheel/page.rb
143
+ - lib/capybara/wheel/subelement.rb
144
+ - lib/capybara/wheel/version.rb
145
+ - spec/spec_helper.rb
146
+ - spec/wheel_spec.rb
147
+ homepage: ''
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.0.3
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: Creating (yet another) page model gem based around making capybara tests
171
+ more stable with no need for waits
172
+ test_files:
173
+ - spec/spec_helper.rb
174
+ - spec/wheel_spec.rb