calabash-extras 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in calabash-extras.gemspec
4
+ gemspec
@@ -0,0 +1,99 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ calabash-extras (0.0.1)
5
+ PriorityQueue
6
+ calabash-android
7
+ calabash-cucumber
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ CFPropertyList (2.2.7)
13
+ PriorityQueue (0.1.2)
14
+ awesome_print (1.1.0)
15
+ blankslate (2.1.2.4)
16
+ builder (3.0.4)
17
+ calabash-android (0.4.19.pre1)
18
+ awesome_print
19
+ cucumber
20
+ escape (~> 0.0.4)
21
+ httpclient (~> 2.3.2)
22
+ json
23
+ retriable (~> 1.3.3.1)
24
+ rubyzip (~> 0.9.9)
25
+ slowhandcuke
26
+ xamarin-test-cloud (>= 0.9.23)
27
+ calabash-common (0.0.1)
28
+ cucumber (~> 1.3.0)
29
+ calabash-cucumber (0.9.167)
30
+ CFPropertyList
31
+ awesome_print
32
+ bundler (~> 1.1)
33
+ calabash-common (~> 0.0.1)
34
+ cucumber (~> 1.3.0)
35
+ edn
36
+ geocoder (~> 1.1.8)
37
+ httpclient (~> 2.3.3)
38
+ json
39
+ run_loop (~> 0.1.4)
40
+ sim_launcher (= 0.4.6)
41
+ slowhandcuke
42
+ xamarin-test-cloud (~> 0.9.27)
43
+ cucumber (1.3.10)
44
+ builder (>= 2.1.2)
45
+ diff-lcs (>= 1.1.3)
46
+ gherkin (~> 2.12)
47
+ multi_json (>= 1.7.5, < 2.0)
48
+ multi_test (>= 0.0.2)
49
+ diff-lcs (1.2.4)
50
+ edn (1.0.2)
51
+ parslet (~> 1.4.0)
52
+ escape (0.0.4)
53
+ geocoder (1.1.9)
54
+ gherkin (2.12.1)
55
+ multi_json (~> 1.3)
56
+ httpclient (2.3.4.1)
57
+ json (1.8.0)
58
+ mime-types (1.24)
59
+ multi_json (1.7.9)
60
+ multi_test (0.0.2)
61
+ parslet (1.4.0)
62
+ blankslate (~> 2.0)
63
+ rack (1.5.2)
64
+ rack-protection (1.5.2)
65
+ rack
66
+ rake (10.1.0)
67
+ rest-client (1.6.7)
68
+ mime-types (>= 1.16)
69
+ retriable (1.3.3.1)
70
+ rubyzip (0.9.9)
71
+ run_loop (0.1.4)
72
+ json
73
+ thor
74
+ sim_launcher (0.4.6)
75
+ sinatra
76
+ sinatra (1.4.4)
77
+ rack (~> 1.4)
78
+ rack-protection (~> 1.4)
79
+ tilt (~> 1.3, >= 1.3.4)
80
+ slowhandcuke (0.0.3)
81
+ cucumber
82
+ thor (0.18.1)
83
+ tilt (1.4.1)
84
+ xamarin-test-cloud (0.9.29)
85
+ bundler (>= 1.3.0, < 2.0)
86
+ json
87
+ mime-types (< 2.0)
88
+ rest-client (~> 1.6.7)
89
+ retriable (~> 1.3.3.1)
90
+ rubyzip (~> 0.9.9)
91
+ thor (>= 0.18.1)
92
+
93
+ PLATFORMS
94
+ ruby
95
+
96
+ DEPENDENCIES
97
+ bundler (~> 1.3)
98
+ calabash-extras!
99
+ rake
@@ -0,0 +1,23 @@
1
+ # Calabash::Extras
2
+
3
+ Utils for using Calabash and page object pattern with minitest framework
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'calabash-extras'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install calabash-extras
18
+
19
+ ## Usage
20
+
21
+ 1. Extend your testcases from Calabash::Extras::TestCase
22
+ 2. Add Calabash::Extras::PageObjectComparator page objects for Android and Ios (read more on https://github.com/calabash/x-platform-example)
23
+ 3. Link pages of mobile application and use Calabash::Extras::Walker to navigate
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'calabash-extras'
3
+ spec.version = '0.0.1'
4
+ spec.authors = ['Sergey Galkin']
5
+ spec.email = ['sergey@galkin.me']
6
+ spec.description = %q{TestCase and page traversal tool for writing xunit tests for Android and Ios apps}
7
+ spec.summary = %q{Utils for writing xunit tests with calabash and page objects}
8
+
9
+ spec.files = `git ls-files`.split($/)
10
+ spec.test_files = spec.files.grep(%r{^(test)/})
11
+ spec.require_paths = ['lib']
12
+
13
+ spec.add_development_dependency 'bundler', '~> 1.3'
14
+ spec.add_development_dependency 'rake'
15
+
16
+ spec.add_dependency 'calabash-android'
17
+ spec.add_dependency 'calabash-cucumber'
18
+ spec.add_dependency 'PriorityQueue'
19
+ end
@@ -0,0 +1,95 @@
1
+ require 'rubygems'
2
+ require 'net/telnet'
3
+ require 'calabash-android/operations'
4
+ require 'calabash-android/abase'
5
+
6
+ module Calabash
7
+ module Extras
8
+ class AndroidRunner
9
+
10
+ include Calabash::Android::Operations
11
+
12
+ attr_reader :default_device
13
+
14
+ def initialize(config)
15
+ @config = config
16
+ end
17
+
18
+ def start
19
+ load Gem.bin_path('calabash-android', 'calabash-android')
20
+
21
+ path = File.expand_path(@config['apk_path'])
22
+
23
+ Emulator.launch(@config['emulator']) if @config['start_emulator']
24
+
25
+ build_test_server_if_needed(path)
26
+ set_default_device(Device.new(self, @config['name'], nil, path, test_server_path(path)))
27
+ end
28
+
29
+ def reinstall_app
30
+ reinstall_apps
31
+ sleep 1
32
+ start_test_server_in_background
33
+ reinstall_hook if defined? self.reinstall_hook
34
+ end
35
+
36
+ private
37
+
38
+ def test_server_path(apk_file_path)
39
+ @config['test_server_dir'] + "test_servers/#{checksum(apk_file_path)}_#{Calabash::Android::VERSION}.apk"
40
+ end
41
+
42
+ class Emulator
43
+ def self.launch(config)
44
+ inst = self.new(config)
45
+ inst.kill_old
46
+ inst.run
47
+ end
48
+
49
+ def initialize(config)
50
+ @cfg = config
51
+ end
52
+
53
+ def run
54
+ @pid = fork { exec(@cfg['run']) }
55
+ sleep(@cfg['wait_for_emulator'])
56
+ unlock
57
+ sleep(@cfg['sleep_after_launch'])
58
+ end
59
+
60
+ def is_running?
61
+ defined? @pid && !@pid.nil? && @pid > 0
62
+ end
63
+
64
+ def unlock
65
+ emulator_cli = Net::Telnet::new('Host' => @cfg['host'], 'Port' => @cfg['port'])
66
+ emulator_cli.puts('event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0')
67
+ emulator_cli.close
68
+ end
69
+
70
+ def kill
71
+ Process.kill('QUIT', @pid) if is_running?
72
+ end
73
+
74
+ def kill_old
75
+ find_pids.each { |pid| Process.kill('QUIT', pid) }
76
+ end
77
+
78
+ protected
79
+
80
+ def find_pids
81
+ #TODO find all pids, not just one
82
+ command = 'ps ax | grep "/opt/android_sdk/tools/emulator64-x86" | grep -v grep |awk \'{print $1}\''
83
+ pid = %x(#{command})
84
+ if pid != '' && pid.to_i > 0
85
+ [pid.to_i]
86
+ else
87
+ []
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+
@@ -0,0 +1,41 @@
1
+ module Calabash
2
+ module Extras
3
+ class ApplicationHandler
4
+
5
+ def initialize(config)
6
+ @conf = config
7
+ ENV['SCREENSHOT_PATH'] = @conf['screen_shot_dir']
8
+ start_device unless defined? @@device
9
+ end
10
+
11
+ def page (clz, *args)
12
+ @@device.page(clz, *args)
13
+ end
14
+
15
+ def reinstall
16
+ @@device.reinstall_app
17
+ end
18
+
19
+ def device
20
+ @@device
21
+ end
22
+
23
+ private
24
+
25
+ def start_device
26
+ case @conf['os']
27
+ when 'android'
28
+ require 'android_runner'
29
+ @@device = Calabash::Extras::AndroidRunner.new(@conf['android'])
30
+ when 'ios'
31
+ require 'ios_runner'
32
+ @@device = Calabash::Extras::IosRunner.new(@conf['ios'])
33
+ else
34
+ raise 'Unsupported os type: "%s"' % @conf['os']
35
+ end
36
+
37
+ @@device.start
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ require 'calabash-cucumber/operations'
2
+ require 'calabash-cucumber/launcher'
3
+ require 'calabash-cucumber/launch/simulator_helper'
4
+ require 'sim_launcher'
5
+
6
+ module Calabash
7
+ module Extras
8
+ class IosRunner
9
+
10
+ include Calabash::Cucumber::Core
11
+ include Calabash::Cucumber::Operations
12
+
13
+ def initialize(config)
14
+ @config = config
15
+
16
+ ENV['DEVICE'] = @config['DEVICE']
17
+ ENV['PROJECT_DIR'] = @config['PROJECT_DIR']
18
+ ENV['DEVICE_ENDPOINT'] = @config['DEVICE_ENDPOINT']
19
+ ENV['BUNDLE_ID'] = @config['BUNDLE_ID']
20
+ end
21
+
22
+ def start
23
+ reinstall_app
24
+ end
25
+
26
+ def reinstall_app
27
+ calabash_launcher = Calabash::Cucumber::Launcher.new
28
+ calabash_launcher.reset_app_jail
29
+ start_test_server_in_background
30
+
31
+ reinstall_hook if defined? self.reinstall_hook
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ module Calabash
2
+ module Extras
3
+ module PageObjectComparator
4
+ def name
5
+ self.class.name.rpartition('::').last
6
+ end
7
+
8
+ def ==(other)
9
+ name == other.name
10
+ end
11
+
12
+ def eql?(other)
13
+ name == other.name
14
+ end
15
+
16
+ def hash
17
+ name.hash
18
+ end
19
+
20
+ def to_s
21
+ name
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ require 'yaml'
3
+ require 'application_handler'
4
+
5
+ module Calabash
6
+ module Extras
7
+ class TestCase < Test::Unit::TestCase
8
+ def initialize(name)
9
+ super name
10
+ raise 'Config location not found in ENV' unless ENV.has_key? 'config_location'
11
+ @conf = YAML.load_file ENV['config_location']
12
+ @runner = Calabash::Extras::ApplicationHandler.new(@conf)
13
+ end
14
+
15
+ def page (clz, *args)
16
+ @runner.page(clz, *args)
17
+ end
18
+
19
+ def reinstall_force #todo rename
20
+ @runner.reinstall
21
+ end
22
+
23
+ def platform
24
+ @conf['os']
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,95 @@
1
+ require 'priority_queue'
2
+
3
+ module Calabash
4
+ module Extras
5
+ class Walker
6
+
7
+ MAX_INT = (2**(0.size * 8 -2) -1)
8
+
9
+ def initialize(sleep_interval, matrix, log_callback)
10
+ @sleep_interval = sleep_interval
11
+ @matrix = matrix
12
+ @logger = log_callback
13
+ end
14
+
15
+ def go(to)
16
+ start_point = get_current_page
17
+
18
+ @end_point = to
19
+
20
+ raise 'Page "%s" does not exist' % [to] if @matrix[to].nil?
21
+
22
+ return if start_point == @end_point
23
+
24
+ path = find_path start_point, @end_point
25
+
26
+ raise 'Unable to find path from "%s" to "%s"' % [start_point, @end_point] if path.last != @end_point
27
+
28
+ resolve_path path
29
+ end
30
+
31
+ def last
32
+ @end_point
33
+ end
34
+
35
+ def get_current_page
36
+ sleep @sleep_interval
37
+ all_page_elements = @matrix.keys.first.all_elements
38
+ @matrix.keys.find { |page| page.match all_page_elements} || raise('Unable to determine current page') #todo replace with match method
39
+ end
40
+
41
+ def resolve_path(path)
42
+ raise 'Empty path given' if path.empty?
43
+
44
+ for i in 0..(path.length - 2)
45
+ @logger.call('transition from %s to %s' % [path[i], path[i+1]])
46
+ @matrix[path[i]][path[i+1]].call
47
+ end
48
+ end
49
+
50
+ def find_path(start, finish)
51
+ distances = {}
52
+ previous = {}
53
+ nodes = PriorityQueue.new
54
+
55
+ @matrix.each_key do |point|
56
+ if point == start
57
+ distances[point] = 0
58
+ nodes[point] = 0
59
+ else
60
+ distances[point] = MAX_INT
61
+ nodes[point] = MAX_INT
62
+ end
63
+ previous[point] = nil
64
+ end
65
+
66
+ while nodes
67
+ smallest = nodes.delete_min_return_key
68
+
69
+ if smallest == finish
70
+ path = []
71
+ while previous[smallest]
72
+ path.push(smallest)
73
+ smallest = previous[smallest]
74
+ end
75
+ return path.push(start).reverse
76
+ end
77
+
78
+ if smallest.nil? or distances[smallest] == MAX_INT
79
+ break
80
+ end
81
+
82
+ @matrix[smallest].each_key do |neighbor|
83
+ alt = distances[smallest] + 1
84
+ if alt < distances[neighbor]
85
+ distances[neighbor] = alt
86
+ previous[neighbor] = smallest
87
+ nodes[neighbor] = alt
88
+ end
89
+ end
90
+ end
91
+ distances.inspect
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,33 @@
1
+ require 'test/unit'
2
+ require 'page_object_comparator'
3
+
4
+ class PageObjectComparatorTest < Test::Unit::TestCase
5
+
6
+ class DummyBasePage
7
+
8
+ include Calabash::Extras::PageObjectComparator
9
+
10
+ def initialize(value)
11
+ @value = value
12
+ end
13
+ end
14
+
15
+ class Page1 < DummyBasePage; end
16
+ class Page2 < DummyBasePage; end
17
+
18
+ def test_instances_of_same_class
19
+ page1 = Page1.new 'value'
20
+ page2 = Page1.new 'other'
21
+
22
+ assert_equal page1.hash, page2.hash, 'Hash should be unique per class, not instance'
23
+ assert_equal page1, page2, 'Object should be compared by class, not instance'
24
+ end
25
+
26
+ def test_instances_of_different_classes
27
+ page1 = Page1.new 'same value'
28
+ page2 = Page2.new 'same value'
29
+
30
+ refute_equal page1.hash, page2.hash, 'Hash should be unique per class, not instance'
31
+ refute_equal page1, page2, 'Object should be compared by class, not instance'
32
+ end
33
+ end
@@ -0,0 +1,144 @@
1
+ require 'test/unit'
2
+ require 'walker'
3
+ require 'page_object_comparator'
4
+
5
+ class WalkerTest < Test::Unit::TestCase
6
+
7
+ class BaseDummyPage
8
+ include Calabash::Extras::PageObjectComparator
9
+ attr_accessor :will_match, :called, :back_called
10
+
11
+ def initialize
12
+ @called = false
13
+ @back_called = false
14
+ end
15
+
16
+ def all_elements
17
+ 'list of all elements in string'
18
+ end
19
+
20
+ def match(all_elements)
21
+ @will_match
22
+ end
23
+
24
+ def go
25
+ @called = true
26
+ end
27
+
28
+ def back
29
+ @back_called = true
30
+ end
31
+ end
32
+
33
+ class EulaDummyPage < BaseDummyPage; end
34
+ class LoginDummyPage < BaseDummyPage; end
35
+ class MainMenuDummyPage < BaseDummyPage; end
36
+ class UnreachablePage < BaseDummyPage; end
37
+ class DeadEndPage < BaseDummyPage; end
38
+ class NonExistentPage < BaseDummyPage; end
39
+ class RefundDummyPage < BaseDummyPage; end
40
+ class OrderHistoryDummyPage < BaseDummyPage; end
41
+ class OrderInfoDummyPage < BaseDummyPage; end
42
+
43
+ def setup
44
+ @eula = EulaDummyPage.new
45
+ @login = LoginDummyPage.new
46
+ @main_menu = MainMenuDummyPage.new
47
+ @unreachable = UnreachablePage.new
48
+ @not_existent = NonExistentPage.new
49
+ @order_history = OrderHistoryDummyPage.new
50
+ @order_info = OrderInfoDummyPage.new
51
+ @refund = RefundDummyPage.new
52
+
53
+ @matrix = {
54
+ @eula => {
55
+ @login => lambda { @eula.go },
56
+ },
57
+ @login => {
58
+ @main_menu => lambda { @login.go },
59
+ @eula => lambda { @main_menu.back }
60
+ },
61
+ @main_menu => {
62
+ @login => lambda { @main_menu.back },
63
+ @order_history => lambda { @main_menu.go }
64
+ },
65
+ @order_history => {
66
+ @main_menu => lambda { @order_history.back },
67
+ @order_info => lambda { @order_history.go }
68
+ },
69
+ @order_info => {
70
+ @order_history => lambda { @order_info.back },
71
+ @refund => lambda { @order_info.go }
72
+ },
73
+ @refund => {
74
+ @order_info => lambda { @refund.back }
75
+ },
76
+ @unreachable => {
77
+ # unreachable
78
+ }
79
+ }
80
+
81
+ @walker = Calabash::Extras::Walker.new(0, @matrix, lambda { |str| } )
82
+ end
83
+
84
+ def test_refund_to_main_menu
85
+ @refund.will_match = true
86
+ @walker.go @main_menu
87
+
88
+ assert_back_called @refund
89
+ assert_back_called @order_info
90
+ assert_back_called @order_history
91
+ end
92
+
93
+ def test_eula_to_refund_page
94
+ @eula.will_match = true
95
+ @walker.go @refund
96
+
97
+ assert_called @eula
98
+ assert_called @login
99
+ assert_called @main_menu
100
+ assert_called @order_history
101
+ assert_called @order_info
102
+ assert_called @order_info
103
+ end
104
+
105
+ def test_unreachable
106
+ @eula.will_match = true
107
+
108
+ err = assert_raise RuntimeError do
109
+ @walker.go @unreachable
110
+ end
111
+
112
+ assert_equal 'Unable to find path from "%s" to "%s"' % [@eula, @unreachable.name], err.message
113
+ end
114
+
115
+ def test_not_found
116
+ @eula.will_match = true
117
+
118
+ err = assert_raise RuntimeError do
119
+ @walker.go @not_existent
120
+ end
121
+
122
+ assert_equal 'Page "%s" does not exist' % [@not_existent], err.message
123
+ end
124
+
125
+ def test_unable_to_determine_current_page
126
+
127
+ end
128
+
129
+ private
130
+
131
+ def assert_called (page, method = :go)
132
+ assert page.called, 'Call to method "%s" of page %s was expected' % [method, page.name]
133
+ end
134
+
135
+ def assert_back_called (page)
136
+ assert page.back_called, 'Call to method "back" of page %s was expected' % [page.name]
137
+ end
138
+ end
139
+
140
+
141
+
142
+
143
+
144
+
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: calabash-extras
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sergey Galkin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-02-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: calabash-android
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: calabash-cucumber
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: PriorityQueue
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: TestCase and page traversal tool for writing xunit tests for Android
95
+ and Ios apps
96
+ email:
97
+ - sergey@galkin.me
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files: []
101
+ files:
102
+ - Gemfile
103
+ - Gemfile.lock
104
+ - README.md
105
+ - Rakefile
106
+ - calabash-extras.gemspec
107
+ - lib/android_runner.rb
108
+ - lib/application_handler.rb
109
+ - lib/ios_runner.rb
110
+ - lib/page_object_comparator.rb
111
+ - lib/test_case.rb
112
+ - lib/walker.rb
113
+ - test/page_object_comparator_test.rb
114
+ - test/walker_test.rb
115
+ homepage:
116
+ licenses: []
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 1.8.23
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: Utils for writing xunit tests with calabash and page objects
139
+ test_files:
140
+ - test/page_object_comparator_test.rb
141
+ - test/walker_test.rb