kelp 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ doc
8
8
  .yardoc
9
9
  examples/sinatra_app/features/step_definitions
10
10
  pkg
11
+ Gemfile.lock
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "kelp"
3
- s.version = "0.2.1"
3
+ s.version = "0.2.2"
4
4
  s.summary = "Cucumber helper methods"
5
5
  s.description = <<-EOS
6
6
  Kelp is a collection of helper methods for Cucumber to ease the process of
@@ -0,0 +1,7 @@
1
+ Description:
2
+ Create features/step_definitions/web_steps.rb, replacing step definitions
3
+ provided by cucumber-rails with enhanced Kelp-based steps
4
+
5
+ Examples:
6
+ rails generate kelp:steps
7
+
@@ -0,0 +1,14 @@
1
+ require 'rails/generators'
2
+
3
+ module Kelp
4
+ class StepsGenerator < Rails::Generators::Base
5
+ def generate
6
+ copy_file 'web_steps.rb', 'features/step_definitions/web_steps.rb'
7
+ end
8
+
9
+ def self.source_root
10
+ File.join(File.dirname(__FILE__), 'templates')
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,498 @@
1
+ # web_steps.rb
2
+ #
3
+ # This file defines some generic step definitions that utilize the helper
4
+ # methods provided by Kelp. It is auto-generated by running:
5
+ #
6
+ # script/generate kelp
7
+ #
8
+ # from a Rails application. It's probably a good idea to avoid editing this
9
+ # file, since it may be overwritten by an upgraded kelp gem later. If you
10
+ # find any issues with these step definitions and think they can be improved,
11
+ # please create an issue on Github:
12
+ #
13
+ # http://github.com/wapcaplet/kelp/issues
14
+ #
15
+
16
+ require 'kelp'
17
+ World(Kelp::Attribute)
18
+ World(Kelp::Checkbox)
19
+ World(Kelp::Dropdown)
20
+ World(Kelp::Field)
21
+ World(Kelp::Helper)
22
+ World(Kelp::Navigation)
23
+ World(Kelp::Scoping)
24
+ World(Kelp::Visibility)
25
+
26
+
27
+ # Patterns shared by step definitions
28
+ I = /(?:|I )/
29
+ TEXT = /"([^\"]*)"/
30
+ PAGE = /"?([^\"]+)"?/
31
+ REGEX = /\/([^\/]*)\//
32
+ WITHIN = /(?: within "?([^\"]+)"?)?/
33
+ ELEMENT = /(?:field|checkbox|dropdown|button)/
34
+
35
+
36
+ # ==========================
37
+ # NAVIGATION
38
+ # ==========================
39
+
40
+ # Load a given page path directly. `page_name` may be an absolute path,
41
+ # or an expression that is translated to an absolute path by your `path_to`
42
+ # function.
43
+ #
44
+ # Examples:
45
+ #
46
+ # Given I am on the home page
47
+ # When I go to my account page
48
+ # And I go to "/logout"
49
+ #
50
+ Given /^#{I}(?:am on|go to) #{PAGE}$/ do |page_name|
51
+ go_to_page(page_name)
52
+ end
53
+
54
+
55
+ # Press a button on a webpage.
56
+ #
57
+ # Examples:
58
+ #
59
+ # When I press "Delete"
60
+ # And I press "Yes" within "#confirmation"
61
+ #
62
+ When /^#{I}press #{TEXT}#{WITHIN}$/ do |button, selector|
63
+ press(button, :within => selector)
64
+ end
65
+
66
+
67
+ # Click a link in a webpage.
68
+ #
69
+ # Examples:
70
+ #
71
+ # When I follow "List of stuff"
72
+ # And I follow "Next" within "navigation"
73
+ #
74
+ When /^#{I}follow #{TEXT}#{WITHIN}$/ do |link, selector|
75
+ follow(link, :within => selector)
76
+ end
77
+
78
+
79
+ # Click a link in a table row that contains the given text.
80
+ # This can be used to click the "Edit" link for a specific record.
81
+ #
82
+ # Examples:
83
+ #
84
+ # When I follow "Edit" next to "John"
85
+ #
86
+ When /^#{I}follow #{TEXT} next to #{TEXT}$/ do |link, next_to|
87
+ click_link_in_row(link, next_to)
88
+ end
89
+
90
+
91
+ # Verify that the current path name matches that of the given page.
92
+ #
93
+ Then /^#{I}should be on #{PAGE}$/ do |page_name|
94
+ should_be_on_page(page_name)
95
+ end
96
+
97
+
98
+ # Verify that the current URL has the given query parameters.
99
+ #
100
+ # Examples:
101
+ #
102
+ # Then I should have the following query string:
103
+ # | fruit | apple |
104
+ # | color | red |
105
+ #
106
+ Then /^#{I}should have the following query string:$/ do |expected_pairs|
107
+ should_have_query(expected_pairs.rows_hash)
108
+ end
109
+
110
+
111
+ # Save the current page as an HTML file, and open it in your preferred browser.
112
+ # Requires that you have the `launchy` gem installed.
113
+ Then /^show me the page$/ do
114
+ save_and_open_page
115
+ end
116
+
117
+
118
+ # ==========================
119
+ # VISIBILITY
120
+ # ==========================
121
+
122
+
123
+ # Verify that the given string is visible on the webpage.
124
+ #
125
+ # Examples:
126
+ #
127
+ # Then I should see "Favorite color"
128
+ # But I should not see "Least favorite color"
129
+ #
130
+ Then /^#{I}should see #{TEXT}#{WITHIN}$/ do |text, selector|
131
+ should_see(text, :within => selector)
132
+ end
133
+
134
+ Then /^#{I}should not see #{TEXT}#{WITHIN}$/ do |text, selector|
135
+ should_not_see(text, :within => selector)
136
+ end
137
+
138
+
139
+ # Verify that the given regular expression matches some part of the webpage.
140
+ #
141
+ # Examples:
142
+ #
143
+ # Then I should see /Favorite (color|food)/
144
+ #
145
+ Then /^#{I}should see #{REGEX}#{WITHIN}$/ do |regexp, selector|
146
+ should_see(Regexp.new(regexp), :within => selector)
147
+ end
148
+
149
+ Then /^#{I}should not see #{REGEX}#{WITHIN}$/ do |regexp, selector|
150
+ should_not_see(Regexp.new(regexp), :within => selector)
151
+ end
152
+
153
+
154
+ # Verify the presence or absence of multiple text strings in the page,
155
+ # or within a given context.
156
+ #
157
+ # With `should see`, fails if any of the strings are missing.
158
+ # With `should not see`, fails if any of the strings are present.
159
+ #
160
+ # `items` may be a Cucumber table, or a multi-line string. Examples:
161
+ #
162
+ # Then I should see the following:
163
+ # | Apple crumble |
164
+ # | Banana cream pie |
165
+ # | Cherry tart |
166
+ #
167
+ # Then I should see the following:
168
+ # """
169
+ # Bacon & Eggs
170
+ # Biscuits & Gravy
171
+ # Hash Browns
172
+ # """
173
+ #
174
+ Then /^#{I}should see(?: the following)?#{WITHIN}:$/ do |selector, items|
175
+ should_see listify(items), :within => selector
176
+ end
177
+
178
+ Then /^#{I}should not see(?: the following)?#{WITHIN}:$/ do |selector, items|
179
+ should_not_see listify(items), :within => selector
180
+ end
181
+
182
+
183
+ # Verify that one or more table rows containing the correct values exist (or do
184
+ # not exist). Rows do not need to match exactly, and fields do not need to be
185
+ # in the same order.
186
+ #
187
+ # Examples:
188
+ #
189
+ # Then I should see table rows containing:
190
+ # | Eric | Edit |
191
+ # | John | Edit |
192
+ # And I should not see a table row containing:
193
+ # | Eric | Delete |
194
+ #
195
+ Then /^#{I}should see (?:a table row|table rows)#{WITHIN} containing:$/ do |selector, rows|
196
+ rows.raw.each do |fields|
197
+ should_see_in_same_row(fields, :within => selector)
198
+ end
199
+ end
200
+
201
+ Then /^#{I}should not see (?:a table row|table rows)#{WITHIN} containing:$/ do |selector, rows|
202
+ rows.raw.each do |fields|
203
+ should_not_see_in_same_row(fields, :within => selector)
204
+ end
205
+ end
206
+
207
+
208
+ # Verify that expected text exists or does not exist in the same row as
209
+ # some text. This can be used to ensure the presence or absence of "Edit"
210
+ # or "Delete" links, or specific data associated with a row in a table.
211
+ #
212
+ # Examples:
213
+ #
214
+ # Then I should see "Edit" next to "John"
215
+ # And I should not see "Delete" next to "John"
216
+ #
217
+ Then /^#{I}should see #{TEXT} next to #{TEXT}#{WITHIN}$/ do |text, next_to, selector|
218
+ should_see_in_same_row([text, next_to], :within => selector)
219
+ end
220
+
221
+ Then /^#{I}should not see #{TEXT} next to #{TEXT}#{WITHIN}$/ do |text, next_to, selector|
222
+ should_not_see_in_same_row([text, next_to], :within => selector)
223
+ end
224
+
225
+
226
+ # Verify that several expected text strings exist or do not exist in the same
227
+ # row as some text. Prevents multiple "should see X next to Y" calls. Similar
228
+ # to "should see a row containing", but targeted toward a specific row.
229
+ #
230
+ # Examples:
231
+ #
232
+ # Then I should see the following next to "Terry":
233
+ # | Copy |
234
+ # | Edit |
235
+ # | Delete |
236
+ #
237
+ # Then I should see the following next to "John":
238
+ # """
239
+ # Copy
240
+ # Edit
241
+ # Delete
242
+ # """
243
+ #
244
+ Then /^#{I}should see the following next to #{TEXT}#{WITHIN}:$/ do |next_to, selector, items|
245
+ should_see_in_same_row(listify(items) + [next_to], :within => selector)
246
+ end
247
+
248
+ Then /^#{I}should not see the following next to #{TEXT}#{WITHIN}:$/ do |next_to, selector, items|
249
+ should_not_see_in_same_row(listify(items) + [next_to], :within => selector)
250
+ end
251
+
252
+
253
+ # Verify that a given button is or isn't visible on the webpage.
254
+ #
255
+ # Examples:
256
+ #
257
+ # Then I should see a "Save" button
258
+ # But I should not see a "Delete" button
259
+ #
260
+ Then /^#{I}should see an? #{TEXT} button#{WITHIN}$/ do |button, selector|
261
+ should_see_button(button, :within => selector)
262
+ end
263
+
264
+ Then /^#{I}should not see an? #{TEXT} button#{WITHIN}$/ do |button, selector|
265
+ should_not_see_button(button, :within => selector)
266
+ end
267
+
268
+
269
+ # ==========================
270
+ # FORMS
271
+ # ==========================
272
+
273
+
274
+ # Fill in a form field with a given value.
275
+ #
276
+ # Examples:
277
+ #
278
+ # When I fill in "Favorite color" with "Green"
279
+ #
280
+ When /^#{I}fill in #{TEXT} with #{TEXT}#{WITHIN}$/ do |field, value, selector|
281
+ fill_in_field(field, value, :within => selector)
282
+ end
283
+
284
+
285
+ # Fill in a form field with a given value.
286
+ #
287
+ # Examples:
288
+ #
289
+ # When I fill in "Green" for "Favorite color"
290
+ #
291
+ When /^#{I}fill in #{TEXT} for #{TEXT}#{WITHIN}$/ do |value, field, selector|
292
+ fill_in_field(field, value, :within => selector)
293
+ end
294
+
295
+
296
+ # Fill in multiple form fields from values in a table.
297
+ # The fields may be textboxes, dropdowns/listboxes, or checkboxes.
298
+ #
299
+ # Examples:
300
+ #
301
+ # When I fill in the following:
302
+ # | First name | Alton |
303
+ # | Last name | Brown |
304
+ # | Hair | blonde |
305
+ # | Has TV show | checked |
306
+ #
307
+ When /^#{I}fill in the following#{WITHIN}:$/ do |selector, fields|
308
+ fill_in_fields(fields.rows_hash, :within => selector)
309
+ end
310
+
311
+
312
+ # Select a value from a dropdown.
313
+ When /^#{I}select #{TEXT} from #{TEXT}$/ do |value, field|
314
+ select value, :from => field
315
+ end
316
+
317
+
318
+ # Check a checkbox.
319
+ When /^#{I}check #{TEXT}$/ do |field|
320
+ check field
321
+ end
322
+
323
+
324
+ # Uncheck a checkbox.
325
+ When /^#{I}uncheck #{TEXT}$/ do |field|
326
+ uncheck field
327
+ end
328
+
329
+
330
+ # Choose a given radio button.
331
+ When /^#{I}choose #{TEXT}$/ do |field|
332
+ choose field
333
+ end
334
+
335
+
336
+ # Verify that a given field is empty or nil.
337
+ #
338
+ # Examples:
339
+ #
340
+ # Then the "First name" field should be empty
341
+ #
342
+ Then /^the #{TEXT} field#{WITHIN} should be empty$/ do |field, selector|
343
+ field_should_be_empty(field, :within => selector)
344
+ end
345
+
346
+
347
+ # Verify that a text field in a form does or doesn't contain a value.
348
+ #
349
+ # Examples:
350
+ #
351
+ # Then the "Last name" field should contain "Brown"
352
+ # But the "First name" field should not contain "Leroy"
353
+ #
354
+ Then /^the #{TEXT} field#{WITHIN} should contain #{TEXT}$/ do |field, selector, value|
355
+ field_should_contain(field, value, :within => selector)
356
+ end
357
+
358
+ Then /^the #{TEXT} field#{WITHIN} should not contain #{TEXT}$/ do |field, selector, value|
359
+ field_should_not_contain(field, value, :within => selector)
360
+ end
361
+
362
+
363
+ # Verify that a dropdown has a given value selected. This verifies the visible
364
+ # value shown to the user, rather than the value attribute of the selected
365
+ # option element.
366
+ #
367
+ # Examples:
368
+ #
369
+ # Then the "Height" dropdown should equal "Average"
370
+ #
371
+ Then /^the #{TEXT} dropdown#{WITHIN} should equal #{TEXT}$/ do |dropdown, selector, value|
372
+ dropdown_should_equal(dropdown, value, :within => selector)
373
+ end
374
+
375
+
376
+ # Verify that a dropdown includes or doesn't include the given value.
377
+ #
378
+ # Examples:
379
+ #
380
+ # Then the "Height" dropdown should include "Tall"
381
+ #
382
+ Then /^the #{TEXT} dropdown#{WITHIN} should include #{TEXT}$/ do |dropdown, selector, value|
383
+ dropdown_should_include(dropdown, value, :within => selector)
384
+ end
385
+
386
+ Then /^the #{TEXT} dropdown#{WITHIN} should not include #{TEXT}$/ do |dropdown, selector, value|
387
+ dropdown_should_not_include(dropdown, value, :within => selector)
388
+ end
389
+
390
+
391
+ # Verify that a dropdown includes or doesn't include all values in the given
392
+ # table or multiline string.
393
+ #
394
+ # Examples:
395
+ #
396
+ # Then the "Height" dropdown should include:
397
+ # | Short |
398
+ # | Average |
399
+ # | Tall |
400
+ #
401
+ # Then the "Favorite Colors" dropdown should include:
402
+ # """
403
+ # Red
404
+ # Green
405
+ # Blue
406
+ # """
407
+ #
408
+ Then /^the #{TEXT} dropdown#{WITHIN} should include:$/ do |dropdown, selector, values|
409
+ dropdown_should_include(dropdown, listify(values), :within => selector)
410
+ end
411
+
412
+ Then /^the #{TEXT} dropdown#{WITHIN} should not include:$/ do |dropdown, selector, values|
413
+ dropdown_should_not_include(dropdown, listify(values), :within => selector)
414
+ end
415
+
416
+
417
+ # Verify multiple fields in a form, optionally restricted to a given selector.
418
+ # Fields may be text inputs or dropdowns.
419
+ #
420
+ # Examples:
421
+ #
422
+ # Then the fields should contain:
423
+ # | First name | Eric |
424
+ # | Last name | Pierce |
425
+ #
426
+ Then /^the fields#{WITHIN} should contain:$/ do |selector, fields|
427
+ fields_should_contain_within(selector, fields.rows_hash)
428
+ end
429
+
430
+
431
+ # Verify that a checkbox is checked or unchecked.
432
+ # "should not be checked" and "should be unchecked" are equivalent, and
433
+ # "should be checked" and "should not be unchecked" are equivalent.
434
+ #
435
+ # Examples:
436
+ #
437
+ # Then the "I like apples" checkbox should be checked
438
+ # And the "I like celery" checkbox should not be checked
439
+ #
440
+ Then /^the #{TEXT} checkbox#{WITHIN} should be (checked|unchecked)$/ do |checkbox, selector, state|
441
+ if state == 'checked'
442
+ checkbox_should_be_checked(checkbox, :within => selector)
443
+ else
444
+ checkbox_should_not_be_checked(checkbox, :within => selector)
445
+ end
446
+ end
447
+
448
+ Then /^the #{TEXT} checkbox#{WITHIN} should not be (checked|unchecked)$/ do |checkbox, selector, state|
449
+ if state == 'unchecked'
450
+ checkbox_should_be_checked(checkbox, :within => selector)
451
+ else
452
+ checkbox_should_not_be_checked(checkbox, :within => selector)
453
+ end
454
+ end
455
+
456
+
457
+ # Verify that a checkbox in a certain table row is checked or unchecked.
458
+ # "should not be checked" and "should be unchecked" are equivalent, and
459
+ # "should be checked" and "should not be unchecked" are equivalent.
460
+ #
461
+ # Examples:
462
+ #
463
+ # Then the "Like" checkbox next to "Apple" should be checked
464
+ # And the "Like" checkbox next to "Banana" should be unchecked
465
+ #
466
+ Then /^the #{TEXT} checkbox next to #{TEXT}#{WITHIN} should be (checked|unchecked)$/ do |checkbox, next_to, selector, state|
467
+
468
+ within(:xpath, xpath_row_containing(next_to)) do
469
+ if state == 'checked'
470
+ checkbox_should_be_checked(checkbox, :within => selector)
471
+ else
472
+ checkbox_should_not_be_checked(checkbox, :within => selector)
473
+ end
474
+ end
475
+ end
476
+
477
+ Then /^the #{TEXT} checkbox next to #{TEXT}#{WITHIN} should not be (checked|unchecked)$/ do |checkbox, next_to, selector, state|
478
+
479
+ within(:xpath, xpath_row_containing(next_to)) do
480
+ if state == 'unchecked'
481
+ checkbox_should_be_checked(checkbox, :within => selector)
482
+ else
483
+ checkbox_should_not_be_checked(checkbox, :within => selector)
484
+ end
485
+ end
486
+ end
487
+
488
+
489
+ # Attach the filename at the given path to the given form field.
490
+ #
491
+ # Examples:
492
+ #
493
+ # When I attach the file "tmp/my_data.csv" to "CSV file"
494
+ #
495
+ When /^#{I}attach the file #{TEXT} to #{TEXT}$/ do |path, field|
496
+ attach_file field, File.expand_path(path)
497
+ end
498
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kelp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Eric Pierce
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-12 00:00:00 -06:00
18
+ date: 2011-07-01 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -132,7 +132,6 @@ files:
132
132
  - .gitignore
133
133
  - .yardopts
134
134
  - Gemfile
135
- - Gemfile.lock
136
135
  - History.md
137
136
  - MIT-LICENSE
138
137
  - README.md
@@ -161,6 +160,9 @@ files:
161
160
  - features/step_definitions/app_steps.rb
162
161
  - features/support/env.rb
163
162
  - kelp.gemspec
163
+ - lib/generators/kelp/steps/USAGE
164
+ - lib/generators/kelp/steps/steps_generator.rb
165
+ - lib/generators/kelp/steps/templates/web_steps.rb
164
166
  - lib/kelp.rb
165
167
  - lib/kelp/attribute.rb
166
168
  - lib/kelp/checkbox.rb
@@ -1,115 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- kelp (0.2.1)
5
- capybara (>= 0.4.0)
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- abstract (1.0.0)
11
- actionpack (3.0.3)
12
- activemodel (= 3.0.3)
13
- activesupport (= 3.0.3)
14
- builder (~> 2.1.2)
15
- erubis (~> 2.6.6)
16
- i18n (~> 0.4)
17
- rack (~> 1.2.1)
18
- rack-mount (~> 0.6.13)
19
- rack-test (~> 0.5.6)
20
- tzinfo (~> 0.3.23)
21
- activemodel (3.0.3)
22
- activesupport (= 3.0.3)
23
- builder (~> 2.1.2)
24
- i18n (~> 0.4)
25
- activesupport (3.0.3)
26
- builder (2.1.2)
27
- capybara (0.4.0)
28
- celerity (>= 0.7.9)
29
- culerity (>= 0.2.4)
30
- mime-types (>= 1.16)
31
- nokogiri (>= 1.3.3)
32
- rack (>= 1.0.0)
33
- rack-test (>= 0.5.4)
34
- selenium-webdriver (>= 0.0.27)
35
- xpath (~> 0.1.2)
36
- celerity (0.8.5)
37
- childprocess (0.1.4)
38
- ffi (~> 0.6.3)
39
- cucumber (0.10.2)
40
- builder (>= 2.1.2)
41
- diff-lcs (>= 1.1.2)
42
- gherkin (>= 2.3.5)
43
- json (>= 1.4.6)
44
- term-ansicolor (>= 1.0.5)
45
- culerity (0.2.12)
46
- diff-lcs (1.1.2)
47
- erubis (2.6.6)
48
- abstract (>= 1.0.0)
49
- ffi (0.6.3)
50
- rake (>= 0.8.7)
51
- gherkin (2.3.5)
52
- json (>= 1.4.6)
53
- i18n (0.5.0)
54
- json (1.5.1)
55
- json_pure (1.4.6)
56
- mime-types (1.16)
57
- nokogiri (1.4.4)
58
- rack (1.2.1)
59
- rack-mount (0.6.13)
60
- rack (>= 1.0.0)
61
- rack-test (0.5.6)
62
- rack (>= 1.0)
63
- railties (3.0.3)
64
- actionpack (= 3.0.3)
65
- activesupport (= 3.0.3)
66
- rake (>= 0.8.7)
67
- thor (~> 0.14.4)
68
- rake (0.8.7)
69
- rcov (0.9.9)
70
- rspec (2.2.0)
71
- rspec-core (~> 2.2)
72
- rspec-expectations (~> 2.2)
73
- rspec-mocks (~> 2.2)
74
- rspec-core (2.2.1)
75
- rspec-expectations (2.2.0)
76
- diff-lcs (~> 1.1.2)
77
- rspec-mocks (2.2.0)
78
- rspec-rails (2.2.1)
79
- actionpack (~> 3.0)
80
- activesupport (~> 3.0)
81
- railties (~> 3.0)
82
- rspec (~> 2.2.0)
83
- rubyzip (0.9.4)
84
- selenium-webdriver (0.1.1)
85
- childprocess (= 0.1.4)
86
- ffi (~> 0.6.3)
87
- json_pure
88
- rubyzip
89
- sinatra (1.1.0)
90
- rack (~> 1.1)
91
- tilt (~> 1.1)
92
- term-ansicolor (1.0.5)
93
- thor (0.14.6)
94
- tilt (1.1)
95
- tzinfo (0.3.23)
96
- webrat (0.7.3)
97
- nokogiri (>= 1.2.0)
98
- rack (>= 1.0)
99
- rack-test (>= 0.5.3)
100
- xpath (0.1.2)
101
- nokogiri (~> 1.3)
102
-
103
- PLATFORMS
104
- ruby
105
-
106
- DEPENDENCIES
107
- bundler (~> 1.0)
108
- capybara (>= 0.4.0)
109
- cucumber
110
- kelp!
111
- rcov
112
- rspec (>= 2.2.0)
113
- rspec-rails
114
- sinatra
115
- webrat