swamp 1.0.0 → 1.0.1
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +107 -2
- data/features/specifications/user_scans_a_page_interactively.feature +8 -1
- data/features/specifications/user_scans_fields_in_a_page.feature +14 -4
- data/features/step_definitions/swamp_steps.rb +8 -5
- data/features/support/page_examples/field_without_name.html +1 -0
- data/features/support/page_examples/no_elements.html +0 -0
- data/lib/swamp/fields.rb +6 -4
- data/lib/swamp/interface.rb +15 -7
- data/lib/swamp/version.rb +1 -1
- data/spec/swamp/fields_spec.rb +38 -30
- data/spec/swamp/interface_spec.rb +14 -4
- metadata +6 -3
- data/Gemfile.lock +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15fa292671e998ec2b364b1893e815773df39785
|
4
|
+
data.tar.gz: 85175279ded0c63c318c152877a99e03003b9e4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53afdc9793bbf5148ee8d9da1774e59c202747d1bb8a3dc9079a12d5393d88ebcf3a6af54f1661c2f9275c1f055391ec5058e3180bf263a32c63c9e5d4aed4fa
|
7
|
+
data.tar.gz: 7e18435b353cbb5b647ea1f0c19653eca2e432ea94cc3819f7c22010ffb7db0ba7983fa47aa461db4289c42383ba61fafcc08623fec20610ad697b8cca48cda4
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,110 @@
|
|
1
|
+
# Swamp
|
2
|
+
|
1
3
|
[](https://travis-ci.org/Juraci/swamp)
|
4
|
+
|
5
|
+
Automatically generates the interfaces for the most common actions that a page can provide,
|
6
|
+
so you can use the generated methods to quickly create your page objects using [capybara](https://github.com/jnicklas/capybara) and [capybara-page-object](https://github.com/andyw8/capybara-page-object).
|
7
|
+
|
8
|
+
## How to install
|
9
|
+
|
10
|
+
It requires Ruby 1.9.3 or later and Firefox 24.0 or later. To install, type:
|
11
|
+
|
12
|
+
```bash
|
13
|
+
gem install swamp
|
14
|
+
```
|
15
|
+
|
16
|
+
## How to use
|
17
|
+
|
18
|
+
* In the terminal type:
|
19
|
+
|
20
|
+
```shell
|
2
21
|
swamp
|
3
|
-
|
22
|
+
```
|
23
|
+
* It will ask you to provide an URL:
|
24
|
+
|
25
|
+
```shell
|
26
|
+
Enter the url for the page to be scanned:
|
27
|
+
```
|
28
|
+
|
29
|
+
* Provide a valid one, beginning with `http://` or `https://` for instance:
|
30
|
+
|
31
|
+
```shell
|
32
|
+
Enter the url for the page to be scanned:
|
33
|
+
https://accounts.google.com
|
34
|
+
```
|
35
|
+
|
36
|
+
* Hit enter and wait for the code snippets, like this:
|
37
|
+
|
38
|
+
```shell
|
39
|
+
Enter the url for the page to be scanned:
|
40
|
+
https://accounts.google.com
|
41
|
+
|
42
|
+
Scanning, please wait...
|
43
|
+
|
44
|
+
def type_email(input)
|
45
|
+
source.fill_in("Email", with: input)
|
46
|
+
end
|
47
|
+
def type_passwd(input)
|
48
|
+
source.fill_in("Passwd", with: input)
|
49
|
+
end
|
50
|
+
def sign_in
|
51
|
+
source.find(:css, "#signIn").click
|
52
|
+
end
|
53
|
+
def select_lang_chooser(option)
|
54
|
+
source.select(option, :from => "lang-chooser")
|
55
|
+
end
|
56
|
+
def link_forgot_passwd
|
57
|
+
source.click_link("link-forgot-passwd")
|
58
|
+
end
|
59
|
+
def link_signup
|
60
|
+
source.click_link("link-signup")
|
61
|
+
end
|
62
|
+
```
|
63
|
+
(notice that the method names are a best guess and you are always free to change them)
|
64
|
+
|
65
|
+
* Copy the code snippets and paste inside your capybara-page-object classes like this:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
module PageObjects
|
69
|
+
class SignIn < CapybaraPageObject::Page
|
70
|
+
|
71
|
+
path ""
|
72
|
+
|
73
|
+
def type_email(input)
|
74
|
+
source.fill_in("Email", with: input)
|
75
|
+
end
|
76
|
+
|
77
|
+
def type_passwd(input)
|
78
|
+
source.fill_in("Passwd", with: input)
|
79
|
+
end
|
80
|
+
|
81
|
+
def sign_in
|
82
|
+
source.find(:css, "#signIn").click
|
83
|
+
end
|
84
|
+
|
85
|
+
def select_lang_chooser(option)
|
86
|
+
source.select(option, :from => "lang-chooser")
|
87
|
+
end
|
88
|
+
|
89
|
+
def link_forgot_passwd
|
90
|
+
source.click_link("link-forgot-passwd")
|
91
|
+
end
|
92
|
+
|
93
|
+
def link_signup
|
94
|
+
source.click_link("link-signup")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
* Then just call the methods passing the expected parameters when necessary. For instance:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
When /^I attempt to sign in with valid credentials/ do
|
104
|
+
sign_in_page = PageObjects::SignIn.visit
|
105
|
+
sign_in_page.type_email "username@email.com"
|
106
|
+
sign_in_page.type_passwd "mypassword"
|
107
|
+
sign_in_page.sign_in
|
108
|
+
end
|
109
|
+
```
|
4
110
|
|
5
|
-
automatically generates the interfaces for the most common actions that a page can provide
|
@@ -1,4 +1,4 @@
|
|
1
|
-
Feature: user scans a page interactively
|
1
|
+
Feature: user scans a page interactively
|
2
2
|
|
3
3
|
As a swamp user
|
4
4
|
I want to scan the page interactively
|
@@ -9,3 +9,10 @@ Feature: user scans a page interactively
|
|
9
9
|
When I attempt to hit enter at the terminal
|
10
10
|
Then swamp should scan the current page
|
11
11
|
And I should see "Scanning, please wait..."
|
12
|
+
|
13
|
+
Scenario: User scans the current page but it has no detectable elements
|
14
|
+
Given that swamp is already running
|
15
|
+
And I enter the url for this page: "no_elements.html"
|
16
|
+
When swamp scans that page
|
17
|
+
Then swamp should not output any snippet
|
18
|
+
And I should see "No elements were detected"
|
@@ -7,7 +7,7 @@ Feature: user scans fields in a page
|
|
7
7
|
Background: swamp is running
|
8
8
|
Given that swamp is already running
|
9
9
|
|
10
|
-
Scenario:
|
10
|
+
Scenario: An input that has id, name and whose the type is text
|
11
11
|
Given I enter the url for this page: "field.html"
|
12
12
|
When swamp scans that page
|
13
13
|
Then swamp should output the following code snippet
|
@@ -17,7 +17,17 @@ Feature: user scans fields in a page
|
|
17
17
|
end
|
18
18
|
"""
|
19
19
|
|
20
|
-
Scenario:
|
20
|
+
Scenario: An input that has no name, has id and whose the type is text
|
21
|
+
Given I enter the url for this page: "field_without_name.html"
|
22
|
+
When swamp scans that page
|
23
|
+
Then swamp should output the following code snippet
|
24
|
+
"""
|
25
|
+
def type_username(input)
|
26
|
+
source.fill_in("username", with: input)
|
27
|
+
end
|
28
|
+
"""
|
29
|
+
|
30
|
+
Scenario: An input without the id attribute that has name and the type is text
|
21
31
|
Given I enter the url for this page: "field_without_id.html"
|
22
32
|
When swamp scans that page
|
23
33
|
Then swamp should output the following code snippet
|
@@ -27,12 +37,12 @@ Feature: user scans fields in a page
|
|
27
37
|
end
|
28
38
|
"""
|
29
39
|
|
30
|
-
Scenario:
|
40
|
+
Scenario: An input whose the type is checkbox
|
31
41
|
Given I enter the url for this page: "checkbox.html"
|
32
42
|
When swamp scans that page
|
33
43
|
Then swamp should not output any snippet
|
34
44
|
|
35
|
-
Scenario:
|
45
|
+
Scenario: An input whose the type is radio
|
36
46
|
Given I enter the url for this page: "radio.html"
|
37
47
|
When swamp scans that page
|
38
48
|
Then swamp should not output any snippet
|
@@ -23,9 +23,11 @@ Then /^swamp should output the following code snippets?$/ do |string|
|
|
23
23
|
end
|
24
24
|
|
25
25
|
Then /^swamp should not output any snippet$/ do
|
26
|
-
|
27
|
-
output.
|
28
|
-
|
26
|
+
output.should have_at_most(3).messages
|
27
|
+
output.messages.each do |m|
|
28
|
+
m.should_not include("def")
|
29
|
+
m.should_not include("source.")
|
30
|
+
end
|
29
31
|
end
|
30
32
|
|
31
33
|
Given /^that swamp already have scanned a page$/ do
|
@@ -41,6 +43,7 @@ When /^I attempt to hit enter at the terminal$/ do
|
|
41
43
|
end
|
42
44
|
|
43
45
|
Then /^swamp should scan the current page$/ do
|
44
|
-
output.should
|
45
|
-
output.messages.
|
46
|
+
output.should have_at_most(5).messages
|
47
|
+
output.messages[3].should == "Scanning, please wait..."
|
48
|
+
output.messages[4].should == "def sign_up\n source.click_button(\"Sign Up\")\nend"
|
46
49
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<input id="username" placeholder="Digite" class="texto usuario" type="text" maxlength="30">
|
File without changes
|
data/lib/swamp/fields.rb
CHANGED
@@ -3,10 +3,12 @@ module Swamp
|
|
3
3
|
def get
|
4
4
|
elements = []
|
5
5
|
page.all('input').map do |element|
|
6
|
-
if element.visible? and
|
7
|
-
if has_id?(element)
|
6
|
+
if element.visible? and valid_type?(element)
|
7
|
+
if has_id?(element) and has_name?(element)
|
8
8
|
elements << Swamp::Field.new(element['name'], element['id'])
|
9
|
-
|
9
|
+
elsif has_id?(element)
|
10
|
+
elements << Swamp::Field.new(element['id'], element['id'])
|
11
|
+
elsif has_name?(element)
|
10
12
|
elements << Swamp::Field.new(element['name'], element['name'])
|
11
13
|
end
|
12
14
|
end
|
@@ -15,7 +17,7 @@ module Swamp
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def valid_type?(element)
|
18
|
-
element['type'] != "radio" and element['type'] != "checkbox" and element['type'] != "submit" ? true : false
|
20
|
+
element['type'] != "button" and element['type'] != "radio" and element['type'] != "checkbox" and element['type'] != "submit" ? true : false
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
data/lib/swamp/interface.rb
CHANGED
@@ -3,6 +3,7 @@ module Swamp
|
|
3
3
|
|
4
4
|
WELCOME_MESSAGE = ['Enter the url for the page to be scanned:']
|
5
5
|
INVALID_REQUEST_MESSAGE = ['Please enter a valid url!']
|
6
|
+
NO_ELEMENTS_MESSAGE = ['No elements were detected']
|
6
7
|
|
7
8
|
def initialize(output, wrapper)
|
8
9
|
@output = output
|
@@ -15,16 +16,10 @@ module Swamp
|
|
15
16
|
|
16
17
|
def scan(input)
|
17
18
|
@output.puts "Scanning, please wait..."
|
18
|
-
|
19
|
-
messages = (evaluator.valid_url? or evaluator.refresh_command?) ? request(input) : INVALID_REQUEST_MESSAGE
|
19
|
+
messages = valid_request?(input) ? request(input) : INVALID_REQUEST_MESSAGE
|
20
20
|
present messages
|
21
21
|
end
|
22
22
|
|
23
|
-
def request(input)
|
24
|
-
@wrapper.explore(input)
|
25
|
-
@wrapper.scan
|
26
|
-
end
|
27
|
-
|
28
23
|
private
|
29
24
|
|
30
25
|
def present(messages)
|
@@ -32,5 +27,18 @@ module Swamp
|
|
32
27
|
@output.puts(message)
|
33
28
|
end
|
34
29
|
end
|
30
|
+
|
31
|
+
def valid_request?(input)
|
32
|
+
evaluator(input).valid_url? or evaluator(input).refresh_command?
|
33
|
+
end
|
34
|
+
|
35
|
+
def evaluator(input)
|
36
|
+
Swamp::Evaluator.new(input, @wrapper)
|
37
|
+
end
|
38
|
+
|
39
|
+
def request(input)
|
40
|
+
@wrapper.explore(input)
|
41
|
+
@wrapper.scan.empty? ? NO_ELEMENTS_MESSAGE : @wrapper.scan
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
data/lib/swamp/version.rb
CHANGED
data/spec/swamp/fields_spec.rb
CHANGED
@@ -11,64 +11,72 @@ module Swamp
|
|
11
11
|
end
|
12
12
|
|
13
13
|
context "when the input element is visible" do
|
14
|
-
context "when
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
context "when it has a valid type" do
|
15
|
+
let (:type) { ["text", "email", "password"].sample }
|
16
|
+
|
17
|
+
context "when it has the id and the name attribute" do
|
18
|
+
let (:element) { {'name' => "username", 'type' => type, 'id' => "u_0_b"} }
|
19
|
+
|
20
|
+
before(:each) do
|
18
21
|
element.stub(:visible?).and_return(true)
|
19
22
|
fields.page.stub(:all).with('input').and_return([element])
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns the element in the array using the name as the method's name" do
|
20
26
|
fields.get.should have(1).field
|
21
27
|
fields.get.first.name.should == "username"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns the element in the array using the id as the selector" do
|
31
|
+
fields.get.should have(1).field
|
22
32
|
fields.get.first.selector.should == "u_0_b"
|
23
33
|
end
|
24
34
|
end
|
25
35
|
|
26
|
-
context "when
|
27
|
-
|
28
|
-
|
36
|
+
context "when it has only the id attribute" do
|
37
|
+
let (:element) { {'type' => type, 'id' => "username"} }
|
38
|
+
|
39
|
+
before(:each) do
|
29
40
|
element.stub(:visible?).and_return(true)
|
30
41
|
fields.page.stub(:all).with('input').and_return([element])
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns the element in the array using the id as the method's name" do
|
31
45
|
fields.get.should have(1).field
|
32
46
|
fields.get.first.name.should == "username"
|
33
|
-
fields.get.first.selector.should == "username"
|
34
47
|
end
|
35
|
-
end
|
36
48
|
|
37
|
-
|
38
|
-
it "returns the element in the array" do
|
39
|
-
element = {'name' => "useremail", 'type' => "email"}
|
40
|
-
element.stub(:visible?).and_return(true)
|
41
|
-
fields.page.stub(:all).with('input').and_return([element])
|
49
|
+
it "returns the element in the array using the id as the selector" do
|
42
50
|
fields.get.should have(1).field
|
43
|
-
fields.get.first.
|
44
|
-
fields.get.first.selector.should == "useremail"
|
51
|
+
fields.get.first.selector.should == "username"
|
45
52
|
end
|
46
53
|
end
|
47
54
|
|
48
|
-
context "when
|
49
|
-
|
50
|
-
|
55
|
+
context "when it has only the name attribute" do
|
56
|
+
let (:element) { {'name' => "username", 'type' => type} }
|
57
|
+
|
58
|
+
before(:each) do
|
51
59
|
element.stub(:visible?).and_return(true)
|
52
60
|
fields.page.stub(:all).with('input').and_return([element])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns the element in the array using the name as the method's name" do
|
53
64
|
fields.get.should have(1).field
|
54
|
-
fields.get.first.name.should == "
|
55
|
-
fields.get.first.selector.should == "password"
|
65
|
+
fields.get.first.name.should == "username"
|
56
66
|
end
|
57
|
-
end
|
58
67
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
element.stub(:visible?).and_return(true)
|
63
|
-
fields.page.stub(:all).with('input').and_return([element])
|
64
|
-
fields.get.should == []
|
68
|
+
it "returns the element in the array using the name as the selector" do
|
69
|
+
fields.get.should have(1).field
|
70
|
+
fields.get.first.selector.should == "username"
|
65
71
|
end
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
69
|
-
context "when the input element
|
75
|
+
context "when the input element type is invalid" do
|
76
|
+
let (:type) { ["radio", "checkbox", "submit", "button"].sample }
|
77
|
+
|
70
78
|
it "returns an empty array" do
|
71
|
-
element = {'name' => "", 'type' =>
|
79
|
+
element = {'name' => "username", 'type' => type}
|
72
80
|
element.stub(:visible?).and_return(true)
|
73
81
|
fields.page.stub(:all).with('input').and_return([element])
|
74
82
|
fields.get.should == []
|
@@ -29,10 +29,20 @@ module Swamp
|
|
29
29
|
end
|
30
30
|
|
31
31
|
context "when it scans a valid url" do
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
context "when elements were found" do
|
33
|
+
it "sends the code snippets of the scanned page to the output" do
|
34
|
+
wrapper.stub(:scan).and_return(["code_snippet"])
|
35
|
+
output.should_receive(:puts).with("code_snippet")
|
36
|
+
interface.scan("http://www.fakepage.com")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when no elements were found" do
|
41
|
+
it "sends a warning message to the output telling that no elements were found" do
|
42
|
+
wrapper.stub(:scan).and_return([])
|
43
|
+
output.should_receive(:puts).with("No elements were detected")
|
44
|
+
interface.scan("http://www.fakepage.com")
|
45
|
+
end
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swamp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juraci de Lima Vieira Neto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -149,7 +149,6 @@ files:
|
|
149
149
|
- .rspec
|
150
150
|
- .travis.yml
|
151
151
|
- Gemfile
|
152
|
-
- Gemfile.lock
|
153
152
|
- README.md
|
154
153
|
- Rakefile
|
155
154
|
- bin/swamp
|
@@ -170,11 +169,13 @@ files:
|
|
170
169
|
- features/support/page_examples/checkbox.html
|
171
170
|
- features/support/page_examples/field.html
|
172
171
|
- features/support/page_examples/field_without_id.html
|
172
|
+
- features/support/page_examples/field_without_name.html
|
173
173
|
- features/support/page_examples/input_submit.html
|
174
174
|
- features/support/page_examples/input_submit_without_id.html
|
175
175
|
- features/support/page_examples/link.html
|
176
176
|
- features/support/page_examples/link.html~
|
177
177
|
- features/support/page_examples/link_with_id.html
|
178
|
+
- features/support/page_examples/no_elements.html
|
178
179
|
- features/support/page_examples/radio.html
|
179
180
|
- features/support/page_examples/select_box_with_id.html
|
180
181
|
- features/support/page_examples/select_box_with_name_only.html
|
@@ -254,11 +255,13 @@ test_files:
|
|
254
255
|
- features/support/page_examples/checkbox.html
|
255
256
|
- features/support/page_examples/field.html
|
256
257
|
- features/support/page_examples/field_without_id.html
|
258
|
+
- features/support/page_examples/field_without_name.html
|
257
259
|
- features/support/page_examples/input_submit.html
|
258
260
|
- features/support/page_examples/input_submit_without_id.html
|
259
261
|
- features/support/page_examples/link.html
|
260
262
|
- features/support/page_examples/link.html~
|
261
263
|
- features/support/page_examples/link_with_id.html
|
264
|
+
- features/support/page_examples/no_elements.html
|
262
265
|
- features/support/page_examples/radio.html
|
263
266
|
- features/support/page_examples/select_box_with_id.html
|
264
267
|
- features/support/page_examples/select_box_with_name_only.html
|
data/Gemfile.lock
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
swamp (0.0.5)
|
5
|
-
capybara
|
6
|
-
selenium-webdriver
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
builder (3.2.2)
|
12
|
-
capybara (2.1.0)
|
13
|
-
mime-types (>= 1.16)
|
14
|
-
nokogiri (>= 1.3.3)
|
15
|
-
rack (>= 1.0.0)
|
16
|
-
rack-test (>= 0.5.4)
|
17
|
-
xpath (~> 2.0)
|
18
|
-
childprocess (0.3.9)
|
19
|
-
ffi (~> 1.0, >= 1.0.11)
|
20
|
-
coderay (1.0.9)
|
21
|
-
cucumber (1.3.8)
|
22
|
-
builder (>= 2.1.2)
|
23
|
-
diff-lcs (>= 1.1.3)
|
24
|
-
gherkin (~> 2.12.1)
|
25
|
-
multi_json (>= 1.7.5, < 2.0)
|
26
|
-
multi_test (>= 0.0.2)
|
27
|
-
diff-lcs (1.2.4)
|
28
|
-
ffi (1.9.0)
|
29
|
-
gherkin (2.12.1)
|
30
|
-
multi_json (~> 1.3)
|
31
|
-
json (1.8.0)
|
32
|
-
method_source (0.8.2)
|
33
|
-
mime-types (1.25)
|
34
|
-
mini_portile (0.5.1)
|
35
|
-
multi_json (1.8.0)
|
36
|
-
multi_test (0.0.2)
|
37
|
-
nokogiri (1.6.0)
|
38
|
-
mini_portile (~> 0.5.0)
|
39
|
-
pry (0.9.12.2)
|
40
|
-
coderay (~> 1.0.5)
|
41
|
-
method_source (~> 0.8)
|
42
|
-
slop (~> 3.4)
|
43
|
-
pry-nav (0.2.3)
|
44
|
-
pry (~> 0.9.10)
|
45
|
-
rack (1.5.2)
|
46
|
-
rack-test (0.6.2)
|
47
|
-
rack (>= 1.0)
|
48
|
-
rake (10.1.0)
|
49
|
-
rspec (2.14.1)
|
50
|
-
rspec-core (~> 2.14.0)
|
51
|
-
rspec-expectations (~> 2.14.0)
|
52
|
-
rspec-mocks (~> 2.14.0)
|
53
|
-
rspec-core (2.14.5)
|
54
|
-
rspec-expectations (2.14.3)
|
55
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
56
|
-
rspec-mocks (2.14.3)
|
57
|
-
rubyzip (0.9.9)
|
58
|
-
selenium-webdriver (2.35.1)
|
59
|
-
childprocess (>= 0.2.5)
|
60
|
-
multi_json (~> 1.0)
|
61
|
-
rubyzip (< 1.0.0)
|
62
|
-
websocket (~> 1.0.4)
|
63
|
-
slop (3.4.6)
|
64
|
-
websocket (1.0.7)
|
65
|
-
xpath (2.0.0)
|
66
|
-
nokogiri (~> 1.3)
|
67
|
-
|
68
|
-
PLATFORMS
|
69
|
-
ruby
|
70
|
-
|
71
|
-
DEPENDENCIES
|
72
|
-
bundler
|
73
|
-
cucumber
|
74
|
-
json
|
75
|
-
pry
|
76
|
-
pry-nav
|
77
|
-
rake
|
78
|
-
rspec
|
79
|
-
swamp!
|