capybara-wheel 0.0.3

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 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