kelp 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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