frank-cucumber 0.9.4 → 0.9.5.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +58 -0
- data/frank-cucumber.gemspec +1 -0
- data/frank-skeleton/features/support/env.rb +2 -2
- data/frank-skeleton/frank_static_resources.bundle/_solarized_colors.scss +16 -0
- data/frank-skeleton/frank_static_resources.bundle/coffee-script.js +8 -0
- data/frank-skeleton/frank_static_resources.bundle/images/loader.gif +0 -0
- data/frank-skeleton/frank_static_resources.bundle/images/loader.png +0 -0
- data/frank-skeleton/frank_static_resources.bundle/index.haml +61 -47
- data/frank-skeleton/frank_static_resources.bundle/index.html +82 -71
- data/frank-skeleton/frank_static_resources.bundle/jquery.min.js +4 -19
- data/frank-skeleton/frank_static_resources.bundle/jquery.treeview.css +19 -17
- data/frank-skeleton/frank_static_resources.bundle/pictos/index.html +329 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.eot +0 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.svg +114 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.ttf +0 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.woff +0 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos.css +20 -0
- data/frank-skeleton/frank_static_resources.bundle/pictos/pictos_base64.css +18 -0
- data/frank-skeleton/frank_static_resources.bundle/reset.css +32 -0
- data/frank-skeleton/frank_static_resources.bundle/symbiote.css +407 -61
- data/frank-skeleton/frank_static_resources.bundle/symbiote.js +127 -54
- data/frank-skeleton/frank_static_resources.bundle/symbiote_ui.coffee +39 -0
- data/lib/frank-cucumber/cli.rb +12 -2
- data/lib/frank-cucumber/core_frank_steps.rb +11 -1
- data/lib/frank-cucumber/frank_helper.rb +142 -27
- data/lib/frank-cucumber/version.rb +1 -1
- data/lib/frank-cucumber/wait_helper.rb +26 -27
- metadata +36 -6
- data/frank-skeleton/frank_static_resources.bundle/jquery-ui.css +0 -571
@@ -7,73 +7,128 @@ require 'frank-cucumber/bonjour'
|
|
7
7
|
|
8
8
|
module Frank module Cucumber
|
9
9
|
|
10
|
+
# FrankHelper provides a core set of helper functions for use when interacting with Frank.
|
11
|
+
#
|
12
|
+
# == Most helpful methods
|
13
|
+
# * {#touch}
|
14
|
+
# * {#wait_for_element_to_exist}
|
15
|
+
# * {#wait_for_element_to_exist_and_then_touch_it}
|
16
|
+
# * {#wait_for_nothing_to_be_animating}
|
17
|
+
# * {#app_exec}
|
18
|
+
#
|
19
|
+
# == Configuring the Frank driver
|
20
|
+
# There are some class-level facilities which configure how all Frank interactions work. For example you can specify which selector engine to use
|
21
|
+
# with {FrankHelper.selector_engine}. You can specify the base url which the native app's Frank server is listening on with {FrankHelper.server_base_url}.
|
22
|
+
#
|
23
|
+
# Two common use cases are covered more conveniently with {FrankHelper.use_shelley_from_now_on} and {FrankHelper.test_on_physical_device_via_bonjour}.
|
10
24
|
module FrankHelper
|
11
25
|
include WaitHelper
|
12
26
|
include KeyboardHelper
|
13
27
|
include HostScripting
|
14
28
|
|
29
|
+
# @!attribute [rw] selector_engine
|
15
30
|
class << self
|
16
|
-
#
|
17
|
-
attr_accessor :selector_engine
|
31
|
+
# @return [String] the selector engine we tell Frank to use when interpreting view selectors.
|
32
|
+
attr_accessor :selector_engine
|
33
|
+
# @return [String] the base url which the Frank server is running on. All Frank commands will be sent to that server.
|
34
|
+
attr_accessor :server_base_url
|
18
35
|
|
36
|
+
# After calling this method all subsequent commands will ask Frank to use the Shelley selector engine to interpret view selectors.
|
19
37
|
def use_shelley_from_now_on
|
20
38
|
@selector_engine = 'shelley_compat'
|
21
39
|
end
|
22
40
|
|
41
|
+
# Use Bonjour to search for a running Frank server. The server found will be the recipient for all subsequent Frank commands.
|
42
|
+
# @raise a generic exception if no Frank server could be found via Bonjour
|
23
43
|
def test_on_physical_device_via_bonjour
|
24
44
|
@server_base_url = Bonjour.new.lookup_frank_base_uri
|
25
45
|
raise 'could not detect running Frank server' unless @server_base_url
|
26
46
|
end
|
27
47
|
end
|
28
48
|
|
49
|
+
#@api private
|
50
|
+
#@return [:String] convient shorthand for {Frank::Cucumber::FrankHelper.selector_engine}, defaulting to 'uiquery'
|
29
51
|
def selector_engine
|
30
52
|
Frank::Cucumber::FrankHelper.selector_engine || 'uiquery' # default to UIQuery for backwards compatibility
|
31
53
|
end
|
32
54
|
|
55
|
+
#@api private
|
56
|
+
#@return [:String] convient shorthand for {Frank::Cucumber::FrankHelper.server_base_url}
|
33
57
|
def base_server_url
|
34
58
|
Frank::Cucumber::FrankHelper.server_base_url
|
35
59
|
end
|
36
60
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
61
|
+
# Ask Frank to touch all views matching the specified selector. There may be views in the view heirarchy which match the selector but
|
62
|
+
# which Frank cannot or will not touch - for example views which are outside the current viewport. You can discover which of the matching
|
63
|
+
# views were actually touched by inspecting the Array which is returned.
|
64
|
+
#
|
65
|
+
# @param [String] selector a view selector.
|
66
|
+
# @return [Array<Boolean>] an array indicating for each view which matched the selector whether it was touched or not.
|
67
|
+
# @raise an expection if no views matched the selector
|
68
|
+
# @raise an expection if no views which matched the selector could be touched
|
69
|
+
def touch( selector )
|
70
|
+
touch_successes = frankly_map( selector, 'touch' )
|
71
|
+
raise "could not find anything matching [#{selector}] to touch" if touch_successes.empty?
|
42
72
|
raise "some views could not be touched (probably because they are not within the current viewport)" if touch_successes.include?(false)
|
43
73
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
74
|
+
|
75
|
+
# Indicate whether there are any views in the current view heirarchy which match the specified selector.
|
76
|
+
# @param [String] selector a view selector.
|
77
|
+
# @return [Boolean]
|
78
|
+
# @see #check_element_exists
|
79
|
+
def element_exists( selector )
|
80
|
+
matches = frankly_map( selector, 'accessibilityLabel' )
|
47
81
|
# TODO: raise warning if matches.count > 1
|
48
82
|
!matches.empty?
|
49
83
|
end
|
50
84
|
|
51
|
-
|
52
|
-
|
53
|
-
|
85
|
+
# Assert whether there are any views in the current view heirarchy which match the specified selector.
|
86
|
+
# @param [String] selector a view selector.
|
87
|
+
# @raise an rspec exception if the assertion fails
|
88
|
+
# @see #element_exists, #check_element_does_not_exist
|
89
|
+
def check_element_exists( selector )
|
90
|
+
element_exists( selector ).should be_true
|
54
91
|
end
|
55
92
|
|
56
|
-
|
57
|
-
|
58
|
-
|
93
|
+
# Assert whether there are no views in the current view heirarchy which match the specified selector.
|
94
|
+
# @param [String] selector a view selector.
|
95
|
+
# @raise an rspec exception if the assertion fails
|
96
|
+
# @see #element_exists, #check_element_exists
|
97
|
+
def check_element_does_not_exist( selector )
|
98
|
+
element_exists( selector ).should be_false
|
59
99
|
end
|
60
100
|
|
101
|
+
# Indicate whether there are any views in the current view heirarchy which contain the specified accessibility label.
|
102
|
+
# @param [String] expected_mark the expected accessibility label
|
103
|
+
# @return [Boolean]
|
104
|
+
# @see #check_view_with_mark_exists
|
61
105
|
def view_with_mark_exists(expected_mark)
|
62
106
|
element_exists( "view marked:'#{expected_mark}'" )
|
63
107
|
end
|
64
108
|
|
109
|
+
# Assert whether there are any views in the current view heirarchy which contain the specified accessibility label.
|
110
|
+
# @param [String] expected_mark the expected accessibility label
|
111
|
+
# @raise an rspec exception if the assertion fails
|
112
|
+
# @see #view_with_mark_exists
|
65
113
|
def check_view_with_mark_exists(expected_mark)
|
66
114
|
check_element_exists( "view marked:'#{expected_mark}'" )
|
67
115
|
end
|
68
116
|
|
117
|
+
# Assert whether there are no views in the current view heirarchy which contain the specified accessibility label.
|
118
|
+
# @param [String] expected_mark the expected accessibility label
|
119
|
+
# @raise an rspec exception if the assertion fails
|
120
|
+
# @see #view_with_mark_exists, #check_view_with_mark_exists
|
69
121
|
def check_view_with_mark_does_not_exist(expected_mark)
|
70
122
|
check_element_does_not_exist( "view marked:'#{expected_mark}'" )
|
71
123
|
end
|
72
124
|
|
73
125
|
|
74
|
-
# Waits for any of the selectors
|
75
|
-
#
|
76
|
-
#
|
126
|
+
# Waits for any of the specified selectors to match a view.
|
127
|
+
#
|
128
|
+
# Checks each selector in turn within a {http://sauceio.com/index.php/2011/04/how-to-lose-races-and-win-at-selenium/ spin assert} loop and yields the first one which is found to exist in the view heirarchy.
|
129
|
+
# Raises an exception if no views could be found to match any of the provided selectors within {WaitHelper::TIMEOUT} seconds.
|
130
|
+
#
|
131
|
+
# @see WaitHelper#wait_until
|
77
132
|
def wait_for_element_to_exist(*selectors,&block)
|
78
133
|
wait_until(:message => "Waited for element matching any of #{selectors.join(', ')} to exist") do
|
79
134
|
at_least_one_exists = false
|
@@ -87,18 +142,37 @@ module FrankHelper
|
|
87
142
|
end
|
88
143
|
end
|
89
144
|
|
145
|
+
# Waits for the specified selector to not match any views.
|
146
|
+
#
|
147
|
+
# Uses {WaitHelper#wait_until} to check for any matching views within a {http://sauceio.com/index.php/2011/04/how-to-lose-races-and-win-at-selenium/ spin assert} loop.
|
148
|
+
# Returns as soon as no views match the specified selector.
|
149
|
+
# Raises an exception if there continued to be at least one view which matched the selector by the time {WaitHelper::TIMEOUT} seconds passed.
|
150
|
+
#
|
151
|
+
# @see check_element_does_not_exist
|
152
|
+
# @see wait_for_element_to_not_exist
|
90
153
|
def wait_for_element_to_not_exist(selector)
|
91
154
|
wait_until(:message => "Waited for element #{selector} to not exist") do
|
92
155
|
!element_exists(selector)
|
93
156
|
end
|
94
157
|
end
|
95
158
|
|
159
|
+
# Waits for a view to exist and then send a touch command to that view.
|
160
|
+
#
|
161
|
+
# @param selectors takes one or more selectors to use to search for a view. The first selector which is found to matches a view is the selector
|
162
|
+
# which is then used to send a touch command.
|
163
|
+
#
|
164
|
+
# Raises an exception if no views could be found to match any of the provided selectors within {WaitHelper::TIMEOUT} seconds.
|
96
165
|
def wait_for_element_to_exist_and_then_touch_it(*selectors)
|
97
166
|
wait_for_element_to_exist(*selectors) do |sel|
|
98
167
|
touch(sel)
|
99
168
|
end
|
100
169
|
end
|
101
170
|
|
171
|
+
# Waits for there to be no views which report an isAnimated property of true.
|
172
|
+
#
|
173
|
+
# @param timeout [Number] number of seconds to wait for nothing to be animating before timeout out. Defaults to {WaitHelper::TIMEOUT}
|
174
|
+
#
|
175
|
+
# Raises an exception if there were still views animating after {timeout} seconds.
|
102
176
|
def wait_for_nothing_to_be_animating( timeout = false )
|
103
177
|
wait_until :timeout => timeout do
|
104
178
|
!element_exists('view isAnimating')
|
@@ -106,15 +180,30 @@ module FrankHelper
|
|
106
180
|
end
|
107
181
|
|
108
182
|
|
109
|
-
#
|
110
|
-
|
111
|
-
|
183
|
+
# Checks that the specified selector matches at least one view, and that at least one of the matched
|
184
|
+
# views has an isHidden property set to false
|
185
|
+
#
|
186
|
+
# a better name for this method would be element_exists_and_is_not_hidden
|
187
|
+
def element_is_not_hidden(selector)
|
188
|
+
matches = frankly_map( selector, 'isHidden' )
|
112
189
|
matches.delete(true)
|
113
190
|
!matches.empty?
|
114
191
|
end
|
115
192
|
|
116
|
-
|
117
|
-
|
193
|
+
|
194
|
+
# Ask Frank to invoke the specified method on the app delegate of the iOS application under automation.
|
195
|
+
# @param method_sig [String] the method signature
|
196
|
+
# @param method_args the method arguments
|
197
|
+
#
|
198
|
+
# @example
|
199
|
+
# # the same as calling
|
200
|
+
# # [[[UIApplication sharedApplication] appDelegate] setServiceBaseUrl:@"http://example.com/my_api" withPort:8080]
|
201
|
+
# # from your native app
|
202
|
+
# app_exec( "setServiceBaseUrl:withPort:", "http://example.com/my_api", 8080 )
|
203
|
+
#
|
204
|
+
#
|
205
|
+
def app_exec(method_sig, *method_args)
|
206
|
+
operation_map = Gateway.build_operation_map(method_sig.to_s, method_args)
|
118
207
|
|
119
208
|
res = frank_server.send_post(
|
120
209
|
'app_exec',
|
@@ -124,24 +213,33 @@ module FrankHelper
|
|
124
213
|
return Gateway.evaluate_frankly_response( res, "app_exec #{method_name}" )
|
125
214
|
end
|
126
215
|
|
127
|
-
|
216
|
+
# Ask Frank to execute an arbitrary Objective-C method on each view which matches the specified selector.
|
217
|
+
#
|
218
|
+
# @return [Array] an array with an element for each view matched by the selector, each element in the array gives the return value from invoking the specified method on that view.
|
219
|
+
def frankly_map( selector, method_name, *method_args )
|
128
220
|
operation_map = Gateway.build_operation_map(method_name.to_s, method_args)
|
129
221
|
|
130
222
|
res = frank_server.send_post(
|
131
223
|
'map',
|
132
|
-
:query =>
|
224
|
+
:query => selector,
|
133
225
|
:operation => operation_map,
|
134
226
|
:selector_engine => selector_engine
|
135
227
|
)
|
136
228
|
|
137
|
-
return Gateway.evaluate_frankly_response( res, "frankly_map #{
|
229
|
+
return Gateway.evaluate_frankly_response( res, "frankly_map #{selector} #{method_name}" )
|
138
230
|
end
|
139
231
|
|
232
|
+
# print a JSON-formatted dump of the current view heirarchy to stdout
|
140
233
|
def frankly_dump
|
141
234
|
res = frank_server.send_get( 'dump' )
|
142
235
|
puts JSON.pretty_generate(JSON.parse(res)) rescue puts res #dumping a super-deep DOM causes errors
|
143
236
|
end
|
144
237
|
|
238
|
+
# grab a screenshot of the application under automation and save it to the specified file.
|
239
|
+
#
|
240
|
+
# @param filename [String] where to save the screenshot image file
|
241
|
+
# @param subframe describes which section of the screen to grab. If unspecified then the entire screen will be captured. #TODO document what format this parameter takes.
|
242
|
+
# @param allwindows [Boolean] If true then all UIWindows in the current UIScreen will be included in the screenshot. If false then only the main window will be captured.
|
145
243
|
def frankly_screenshot(filename, subframe=nil, allwindows=true)
|
146
244
|
path = 'screenshot'
|
147
245
|
path += '/allwindows' if allwindows
|
@@ -154,14 +252,20 @@ module FrankHelper
|
|
154
252
|
end
|
155
253
|
end
|
156
254
|
|
255
|
+
# @return [Boolean] true if the device running the application currently in a portrait orientation
|
256
|
+
# @note wil return false if the device is in a flat or unknown orientation. Sometimes the iOS simulator will report this state when first launched.
|
157
257
|
def frankly_oriented_portrait?
|
158
258
|
'portrait' == frankly_current_orientation
|
159
259
|
end
|
160
260
|
|
261
|
+
# @return [Boolean] true if the device running the application currently in a landscape orientation
|
262
|
+
# @note wil return false if the device is in a flat or unknown orientation. Sometimes the iOS simulator will report this state when first launched.
|
161
263
|
def frankly_oriented_landscape?
|
162
264
|
'landscape' == frankly_current_orientation
|
163
265
|
end
|
164
266
|
|
267
|
+
# @return [String] the orientation of the device running the application under automation.
|
268
|
+
# @note this is a low-level API. In most cases you should use {frankly_oriented_portrait} or {frankly_oriented_landscape} instead.
|
165
269
|
def frankly_current_orientation
|
166
270
|
res = frank_server.send_get( 'orientation' )
|
167
271
|
orientation = JSON.parse( res )['orientation']
|
@@ -169,11 +273,19 @@ module FrankHelper
|
|
169
273
|
orientation
|
170
274
|
end
|
171
275
|
|
276
|
+
# @return [Boolean] Does the device running the application have accessibility enabled.
|
277
|
+
# If accessibility is not enabled then a lot of Frank functionality will not work.
|
172
278
|
def frankly_is_accessibility_enabled
|
173
279
|
res = frank_server.send_get( 'accessibility_check' )
|
174
280
|
JSON.parse( res )['accessibility_enabled'] == 'true'
|
175
281
|
end
|
176
282
|
|
283
|
+
# wait for the application under automation to be ready to receive automation commands.
|
284
|
+
#
|
285
|
+
# Has some basic heuristics to cope with cases where the Frank server is intermittently available when first launching.
|
286
|
+
#
|
287
|
+
# @raise [Timeout::TimeoutError] if nothing is ready within 20 seconds
|
288
|
+
# @raise generic error if the device hosting the application does not appear to have accessibility enabled.
|
177
289
|
def wait_for_frank_to_come_up
|
178
290
|
num_consec_successes = 0
|
179
291
|
num_consec_failures = 0
|
@@ -211,10 +323,13 @@ module FrankHelper
|
|
211
323
|
end
|
212
324
|
end
|
213
325
|
|
326
|
+
# Check whether Frank is able to communicate with the application under automation
|
214
327
|
def frankly_ping
|
215
328
|
frank_server.ping
|
216
329
|
end
|
217
330
|
|
331
|
+
#@api private
|
332
|
+
#@return [Frank::Cucumber::Gateway] a gateway for sending Frank commands to the application under automation
|
218
333
|
def frank_server
|
219
334
|
@_frank_server ||= Frank::Cucumber::Gateway.new( base_server_url )
|
220
335
|
end
|
@@ -3,38 +3,37 @@ require 'timeout'
|
|
3
3
|
module Frank
|
4
4
|
module Cucumber
|
5
5
|
|
6
|
-
#
|
6
|
+
# This module contains a single method called wait_until which implements the {http://sauceio.com/index.php/2011/04/how-to-lose-races-and-win-at-selenium/ Spin Assert} pattern.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# Frank::Cucumber::WaitHelper.wait_until from anywhere in your code.
|
8
|
+
# When we mix this module into another class or module (such as {FrankHelper}) then that wait_until method will be available inside
|
9
|
+
# that class or module. Because we call module_function at the end of the module this method is also available as a static method on the module.
|
10
|
+
# That means you can also call {Frank::Cucumber::WaitHelper.wait_until} from anywhere in your code.
|
12
11
|
#
|
13
|
-
#
|
14
|
-
# wait_until will repeatedly execute the passed in block until either it returns true or a timeout expires. Between
|
15
|
-
# executions there is a pause of POLL_SLEEP seconds.
|
16
|
-
#
|
17
|
-
# wait_until takes two options, a timeout and a message.
|
18
|
-
# The timeout defaults to the WaitHelper::TIMEOUT constant. That constant is based off of a WAIT_TIMEOUT
|
19
|
-
# environment variable, otherwise it defaults to 240 seconds.
|
20
|
-
# If a message is passed in as an option then that message is used when reporting a timeout.
|
21
|
-
#
|
22
|
-
#
|
23
|
-
# Example usage:
|
24
|
-
#
|
25
|
-
# wait_until( :timeout => 20, :message => 'timed out waiting for splines to reticulate' ) do
|
26
|
-
# num_splines_reticulated = reticulate_splines(1,2,3)
|
27
|
-
# num_splines_reticulated > 0
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# Here we will keep calling the reticulate_splines method until either it returns a result
|
31
|
-
# greater than 0 or 20 seconds elapses. In the timeout case an exception will be raised
|
32
|
-
# saying "timed out waiting for splines to reticulate"
|
33
|
-
|
34
12
|
module WaitHelper
|
13
|
+
# Default option for how long (in seconds) to keep checking before timing out the entire wait
|
35
14
|
TIMEOUT = ENV['WAIT_TIMEOUT'].to_i || 240
|
36
|
-
|
15
|
+
# How long to pause (in seconds) inbetween each spin through the assertion block
|
16
|
+
POLL_SLEEP = 0.1
|
37
17
|
|
18
|
+
# Repeatedly evaluate the passed in block until either it returns true or a timeout expires. Between
|
19
|
+
# evaluations there is a pause of {POLL_SLEEP} seconds.
|
20
|
+
#
|
21
|
+
# wait_until takes the following options:
|
22
|
+
# :timeout - How long in seconds to keep spinning before timing out of the entire operation. Defaults to TIMEOUT
|
23
|
+
# :message - What to raise in the event of a timeout. Defaults to an empty StandardError
|
24
|
+
#
|
25
|
+
# @yield the assertion to wait for
|
26
|
+
# @yieldreturn whether the assertion was met
|
27
|
+
#
|
28
|
+
#
|
29
|
+
# Here's an example where we will keep calling the reticulate_splines method until either it returns a result
|
30
|
+
# greater than 0 or 20 seconds elapses. In the timeout case an exception will be raised
|
31
|
+
# saying "timed out waiting for splines to reticulate":
|
32
|
+
#
|
33
|
+
# wait_until( :timeout => 20, :message => 'timed out waiting for splines to reticulate' ) do
|
34
|
+
# num_splines_reticulated = reticulate_splines(1,2,3)
|
35
|
+
# num_splines_reticulated > 0
|
36
|
+
# end
|
38
37
|
def wait_until(opts = {})
|
39
38
|
timeout = opts[:timeout] || TIMEOUT
|
40
39
|
message = opts[:message]
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frank-cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.5.pre1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Pete Hodgson
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-07-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: cucumber
|
@@ -156,6 +156,22 @@ dependencies:
|
|
156
156
|
- - ! '>='
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: yard
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
type: :development
|
168
|
+
prerelease: false
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
159
175
|
description: Use cucumber to test native iOS apps via Frank
|
160
176
|
email:
|
161
177
|
- gems@thepete.net
|
@@ -167,6 +183,7 @@ extra_rdoc_files: []
|
|
167
183
|
files:
|
168
184
|
- .gitignore
|
169
185
|
- Gemfile
|
186
|
+
- Gemfile.lock
|
170
187
|
- Rakefile
|
171
188
|
- bin/frank
|
172
189
|
- bin/frank-skeleton
|
@@ -196,10 +213,14 @@ files:
|
|
196
213
|
- test/keyboard_helper_test.rb
|
197
214
|
- test/launcher_test.rb
|
198
215
|
- test/test_helper.rb
|
216
|
+
- frank-skeleton/frank_static_resources.bundle/_solarized_colors.scss
|
217
|
+
- frank-skeleton/frank_static_resources.bundle/coffee-script.js
|
199
218
|
- frank-skeleton/frank_static_resources.bundle/images/ajax-loader.gif
|
200
219
|
- frank-skeleton/frank_static_resources.bundle/images/file.gif
|
201
220
|
- frank-skeleton/frank_static_resources.bundle/images/folder-closed.gif
|
202
221
|
- frank-skeleton/frank_static_resources.bundle/images/folder.gif
|
222
|
+
- frank-skeleton/frank_static_resources.bundle/images/loader.gif
|
223
|
+
- frank-skeleton/frank_static_resources.bundle/images/loader.png
|
203
224
|
- frank-skeleton/frank_static_resources.bundle/images/minus.gif
|
204
225
|
- frank-skeleton/frank_static_resources.bundle/images/plus.gif
|
205
226
|
- frank-skeleton/frank_static_resources.bundle/images/treeview-black-line.gif
|
@@ -214,15 +235,23 @@ files:
|
|
214
235
|
- frank-skeleton/frank_static_resources.bundle/images/treeview-red.gif
|
215
236
|
- frank-skeleton/frank_static_resources.bundle/index.haml
|
216
237
|
- frank-skeleton/frank_static_resources.bundle/index.html
|
217
|
-
- frank-skeleton/frank_static_resources.bundle/jquery-ui.css
|
218
238
|
- frank-skeleton/frank_static_resources.bundle/jquery-ui.min.js
|
219
239
|
- frank-skeleton/frank_static_resources.bundle/jquery.min.js
|
220
240
|
- frank-skeleton/frank_static_resources.bundle/jquery.treeview.css
|
221
241
|
- frank-skeleton/frank_static_resources.bundle/jquery.treeview.js
|
222
242
|
- frank-skeleton/frank_static_resources.bundle/json2.js
|
243
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/index.html
|
244
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.eot
|
245
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.svg
|
246
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.ttf
|
247
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.woff
|
248
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos.css
|
249
|
+
- frank-skeleton/frank_static_resources.bundle/pictos/pictos_base64.css
|
223
250
|
- frank-skeleton/frank_static_resources.bundle/raphael-min.js
|
251
|
+
- frank-skeleton/frank_static_resources.bundle/reset.css
|
224
252
|
- frank-skeleton/frank_static_resources.bundle/symbiote.css
|
225
253
|
- frank-skeleton/frank_static_resources.bundle/symbiote.js
|
254
|
+
- frank-skeleton/frank_static_resources.bundle/symbiote_ui.coffee
|
226
255
|
- frank-skeleton/frank_static_resources.bundle/underscore.js
|
227
256
|
- frank-skeleton/frank_static_resources.bundle/ViewAttributeMapping.plist
|
228
257
|
homepage: http://rubygems.org/gems/frank-cucumber
|
@@ -240,9 +269,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
269
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
241
270
|
none: false
|
242
271
|
requirements:
|
243
|
-
- - ! '
|
272
|
+
- - ! '>'
|
244
273
|
- !ruby/object:Gem::Version
|
245
|
-
version:
|
274
|
+
version: 1.3.1
|
246
275
|
requirements: []
|
247
276
|
rubyforge_project:
|
248
277
|
rubygems_version: 1.8.24
|
@@ -253,3 +282,4 @@ test_files:
|
|
253
282
|
- test/keyboard_helper_test.rb
|
254
283
|
- test/launcher_test.rb
|
255
284
|
- test/test_helper.rb
|
285
|
+
has_rdoc:
|