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.
Files changed (29) hide show
  1. data/Gemfile.lock +58 -0
  2. data/frank-cucumber.gemspec +1 -0
  3. data/frank-skeleton/features/support/env.rb +2 -2
  4. data/frank-skeleton/frank_static_resources.bundle/_solarized_colors.scss +16 -0
  5. data/frank-skeleton/frank_static_resources.bundle/coffee-script.js +8 -0
  6. data/frank-skeleton/frank_static_resources.bundle/images/loader.gif +0 -0
  7. data/frank-skeleton/frank_static_resources.bundle/images/loader.png +0 -0
  8. data/frank-skeleton/frank_static_resources.bundle/index.haml +61 -47
  9. data/frank-skeleton/frank_static_resources.bundle/index.html +82 -71
  10. data/frank-skeleton/frank_static_resources.bundle/jquery.min.js +4 -19
  11. data/frank-skeleton/frank_static_resources.bundle/jquery.treeview.css +19 -17
  12. data/frank-skeleton/frank_static_resources.bundle/pictos/index.html +329 -0
  13. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.eot +0 -0
  14. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.svg +114 -0
  15. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.ttf +0 -0
  16. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos-web.woff +0 -0
  17. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos.css +20 -0
  18. data/frank-skeleton/frank_static_resources.bundle/pictos/pictos_base64.css +18 -0
  19. data/frank-skeleton/frank_static_resources.bundle/reset.css +32 -0
  20. data/frank-skeleton/frank_static_resources.bundle/symbiote.css +407 -61
  21. data/frank-skeleton/frank_static_resources.bundle/symbiote.js +127 -54
  22. data/frank-skeleton/frank_static_resources.bundle/symbiote_ui.coffee +39 -0
  23. data/lib/frank-cucumber/cli.rb +12 -2
  24. data/lib/frank-cucumber/core_frank_steps.rb +11 -1
  25. data/lib/frank-cucumber/frank_helper.rb +142 -27
  26. data/lib/frank-cucumber/version.rb +1 -1
  27. data/lib/frank-cucumber/wait_helper.rb +26 -27
  28. metadata +36 -6
  29. 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
- # TODO: adding an ivar to the module itself is a big ugyl hack. We need a FrankDriver class, or similar
17
- attr_accessor :selector_engine, :server_base_url
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
- def touch( uiquery )
40
- touch_successes = frankly_map( uiquery, 'touch' )
41
- raise "could not find anything matching [#{uiquery}] to touch" if touch_successes.empty?
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
- def element_exists( query )
46
- matches = frankly_map( query, 'accessibilityLabel' )
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
- def check_element_exists( query )
52
- #puts "checking #{query} exists..."
53
- element_exists( query ).should be_true
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
- def check_element_does_not_exist( query )
57
- #puts "checking #{query} does not exist..."
58
- element_exists( query ).should be_false
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 provided to match a view. Returns true
75
- # as soon as we find a matching view, otherwise keeps testing until timeout.
76
- # The first selector which matches is passed to a block if it was provided.
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
- # a better name would be element_exists_and_is_not_hidden
110
- def element_is_not_hidden(query)
111
- matches = frankly_map( query, 'isHidden' )
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
- def app_exec(method_name, *method_args)
117
- operation_map = Gateway.build_operation_map(method_name.to_s, method_args)
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
- def frankly_map( query, method_name, *method_args )
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 => 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 #{query} #{method_name}" )
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
@@ -1,5 +1,5 @@
1
1
  module Frank
2
2
  module Cucumber
3
- VERSION = "0.9.4"
3
+ VERSION = "0.9.5.pre1"
4
4
  end
5
5
  end
@@ -3,38 +3,37 @@ require 'timeout'
3
3
  module Frank
4
4
  module Cucumber
5
5
 
6
- # What's going on here?!
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
- # This module contains a single method called wait_until. When we mix this module into another class or module (such as
9
- # FrankHelper) then that wait_until method will be available inside that class or module. Because we call module_function
10
- # at the end of the module this method is also available as a static method on the module. That means you can also call
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
- POLL_SLEEP = 0.1 #seconds
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.4
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-06-25 00:00:00.000000000 Z
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: '0'
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: