aweber 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -0
- data/LICENSE +22 -17
- data/README.textile +1 -1
- data/aweber.gemspec +1 -1
- data/lib/aweber.rb +1 -0
- data/lib/aweber/base.rb +1 -1
- data/lib/aweber/collection.rb +13 -0
- data/lib/aweber/resource.rb +1 -1
- data/lib/aweber/resources.rb +1 -0
- data/lib/aweber/resources/list.rb +2 -0
- data/spec/collection_spec.rb +25 -3
- data/spec/fixtures/custom_field.json +8 -0
- data/spec/fixtures/custom_fields.json +23 -0
- data/spec/fixtures/list.json +2 -1
- data/spec/fixtures/lists.json +6 -3
- data/spec/resources/custom_field_spec.rb +12 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/support/spec_routing.rb +46 -0
- metadata +11 -3
data/Gemfile.lock
CHANGED
data/LICENSE
CHANGED
@@ -1,20 +1,25 @@
|
|
1
|
-
Copyright (c) 2010 AWeber Communications, Inc.
|
1
|
+
Copyright (c) 2010-2011, AWeber Communications, Inc.
|
2
|
+
All rights reserved.
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
the
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
* Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
* Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
* Neither the name of AWeber Communications, Inc. nor the
|
12
|
+
names of its contributors may be used to endorse or promote products
|
13
|
+
derived from this software without specific prior written permission.
|
10
14
|
|
11
|
-
|
12
|
-
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
16
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
17
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL AWEBER COMMUNICATIONS, INC. BE LIABLE FOR ANY
|
19
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
20
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
21
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
22
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
24
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
13
25
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
CHANGED
data/aweber.gemspec
CHANGED
data/lib/aweber.rb
CHANGED
data/lib/aweber/base.rb
CHANGED
data/lib/aweber/collection.rb
CHANGED
@@ -58,6 +58,19 @@ module AWeber
|
|
58
58
|
|
59
59
|
self.class.new(client, @klass, response)
|
60
60
|
end
|
61
|
+
|
62
|
+
def create(attrs={})
|
63
|
+
params = attrs.merge("ws.op" => "create")
|
64
|
+
response = client.post(path, params)
|
65
|
+
|
66
|
+
return false unless response.is_a? Net::HTTPCreated
|
67
|
+
|
68
|
+
response = JSON.parse(response.body)
|
69
|
+
resource = get(response["location"]).merge(:parent => self)
|
70
|
+
resource = @klass.new(client, resource)
|
71
|
+
|
72
|
+
self[resource.id] = resource
|
73
|
+
end
|
61
74
|
|
62
75
|
def [](id)
|
63
76
|
@entries[id] ||= fetch_entry(id)
|
data/lib/aweber/resource.rb
CHANGED
data/lib/aweber/resources.rb
CHANGED
@@ -4,6 +4,7 @@ require "aweber/resources/click"
|
|
4
4
|
require "aweber/resources/followup"
|
5
5
|
require "aweber/resources/link"
|
6
6
|
require "aweber/resources/list"
|
7
|
+
require "aweber/resources/custom_field"
|
7
8
|
require "aweber/resources/campaign"
|
8
9
|
require "aweber/resources/message"
|
9
10
|
require "aweber/resources/open"
|
@@ -12,8 +12,10 @@ module AWeber
|
|
12
12
|
api_attr :subscribers_collection_link
|
13
13
|
api_attr :web_forms_collection_link
|
14
14
|
api_attr :web_form_split_tests_collection_link
|
15
|
+
api_attr :custom_fields_collection_link
|
15
16
|
|
16
17
|
has_many :campaigns
|
18
|
+
has_many :custom_fields
|
17
19
|
has_many :subscribers
|
18
20
|
has_many :web_forms
|
19
21
|
has_many :web_form_split_tests
|
data/spec/collection_spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe AWeber::Collection do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@oauth = AWeber::OAuth.new("token", "secret")
|
6
6
|
@aweber = AWeber::Base.new(@oauth)
|
7
|
-
data = JSON.parse(fixture("lists.json"))
|
7
|
+
data = JSON.parse(fixture("lists.json")).merge(:parent => @aweber.account)
|
8
8
|
@lists = AWeber::Collection.new(@aweber, AWeber::Resources::List, data)
|
9
9
|
end
|
10
10
|
|
@@ -38,7 +38,7 @@ describe AWeber::Collection do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should have a path to its collection alone" do
|
41
|
-
@lists.path.should == "/lists"
|
41
|
+
@lists.path.should == "/accounts/1/lists"
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should create resource with itself as a parent" do
|
@@ -76,4 +76,26 @@ describe AWeber::Collection do
|
|
76
76
|
@collection.search(:name => "default123456").parent.should be @collection.parent
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
describe "when creating" do
|
81
|
+
let(:params) {{ "ws.op" => "create", :name => "foo" }}
|
82
|
+
|
83
|
+
it "should set the operation to 'create'" do
|
84
|
+
@aweber.should_receive(:post).with(@lists.path, params)
|
85
|
+
@lists.create(:name => "foo")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return false if the create failed" do
|
89
|
+
@oauth.should_receive(:post).and_return(nil)
|
90
|
+
@lists.create(:name => "foo").should == false
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should return the new object if the create succeeded" do
|
94
|
+
@lists.create(:name => "foo").should be_an AWeber::Resource
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should have the collection as a parent" do
|
98
|
+
@lists.create(:name => "foo").parent.should == @lists
|
99
|
+
end
|
100
|
+
end
|
79
101
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
{
|
2
|
+
"http_etag": "\"356a192b7913b04c54574d18c28d46e6395428ab-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
3
|
+
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/custom_fields/1",
|
4
|
+
"resource_type_link": "https://api.aweber.com/1.0/#custom_field",
|
5
|
+
"id": 1,
|
6
|
+
"name": "Signature",
|
7
|
+
"is_subscriber_updateable": "false"
|
8
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"total_size": 2,
|
3
|
+
"start": 0,
|
4
|
+
"resource_type_link": "https://api.aweber.com/1.0/#custom_fields",
|
5
|
+
"entries": [
|
6
|
+
{
|
7
|
+
"http_etag": "\"356a192b7913b04c54574d18c28d46e6395428ab-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
8
|
+
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/custom_fields/1",
|
9
|
+
"resource_type_link": "https://api.aweber.com/1.0/#custom_field",
|
10
|
+
"id": 1,
|
11
|
+
"name": "Signature",
|
12
|
+
"is_subscriber_updateable": "false"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"http_etag": "\"356a192b7913b04c54574d18c28d46e6395428ab-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
16
|
+
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/custom_fields/2",
|
17
|
+
"resource_type_link": "https://api.aweber.com/1.0/#custom_field",
|
18
|
+
"id": 2,
|
19
|
+
"name": "logourl",
|
20
|
+
"is_subscriber_updateable": "false"
|
21
|
+
}
|
22
|
+
]
|
23
|
+
}
|
data/spec/fixtures/list.json
CHANGED
@@ -7,5 +7,6 @@
|
|
7
7
|
"http_etag": "\"0aaa38a50287df08ccb74c7f13fca8679aab688a-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
8
8
|
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679",
|
9
9
|
"resource_type_link": "https://api.aweber.com/1.0/#list",
|
10
|
-
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/web_forms"
|
10
|
+
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/web_forms",
|
11
|
+
"custom_fields_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/custom_fields"
|
11
12
|
}
|
data/spec/fixtures/lists.json
CHANGED
@@ -11,7 +11,8 @@
|
|
11
11
|
"http_etag": "\"4ab41e60d14ea138a4522b3d2896942b7335c13c - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
12
12
|
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1553018",
|
13
13
|
"resource_type_link": "https://api.aweber.com/1.0/#list",
|
14
|
-
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1553018/web_forms"
|
14
|
+
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1553018/web_forms",
|
15
|
+
"custom_fields_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1553018/custom_fields"
|
15
16
|
},
|
16
17
|
{
|
17
18
|
"campaigns_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550685/campaigns",
|
@@ -22,7 +23,8 @@
|
|
22
23
|
"http_etag": "\"685c00e3983add5e4efb5ca3bc7294e247f6e9fe - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
23
24
|
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1550685",
|
24
25
|
"resource_type_link": "https://api.aweber.com/1.0/#list",
|
25
|
-
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550685/web_forms"
|
26
|
+
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550685/web_forms",
|
27
|
+
"custom_fields_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550685/custom_fields"
|
26
28
|
},
|
27
29
|
{
|
28
30
|
"campaigns_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/campaigns",
|
@@ -33,6 +35,7 @@
|
|
33
35
|
"http_etag": "\"0aaa38a50287df08ccb74c7f13fca8679aab688a - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
34
36
|
"self_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679",
|
35
37
|
"resource_type_link": "https://api.aweber.com/1.0/#list",
|
36
|
-
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/web_forms"
|
38
|
+
"web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/web_forms",
|
39
|
+
"custom_fields_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1550679/custom_fields"
|
37
40
|
}]
|
38
41
|
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe AWeber::Resources::CustomField do
|
4
|
+
include BaseObjects
|
5
|
+
subject { aweber.account.lists[1].custom_fields[1] }
|
6
|
+
|
7
|
+
its(:path) { should == "/accounts/1/lists/1/custom_fields/1" }
|
8
|
+
|
9
|
+
it { should respond_to :name }
|
10
|
+
it { should respond_to :is_subscriber_updateable }
|
11
|
+
it { should respond_to :is_subscriber_updateable? }
|
12
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,8 +11,8 @@ def aweber_url(url)
|
|
11
11
|
url =~ /https/ ? url : File.join(AWeber.api_endpoint, "1.0", url)
|
12
12
|
end
|
13
13
|
|
14
|
-
def route(method, uri,
|
15
|
-
FakeWeb.register_uri(method, uri, :body =>
|
14
|
+
def route(method, uri, body="", opts={})
|
15
|
+
FakeWeb.register_uri(method, uri, opts.merge(:body => body))
|
16
16
|
end
|
17
17
|
|
18
18
|
def fixture(filename)
|
@@ -40,6 +40,9 @@ route :any, "https://auth.aweber.com/1.0/access_token", "oauth_token=fake&oauth
|
|
40
40
|
|
41
41
|
route :get, %r[/accounts\?], fixture("accounts.json")
|
42
42
|
route :get, %r[/accounts/\d+/lists\?], fixture("lists.json")
|
43
|
+
route :get, %r[/accounts/\d+/lists/\d+\?], fixture("list.json")
|
44
|
+
route :get, %r[/accounts/\d+/lists/\d+/custom_fields\?], fixture("custom_fields.json")
|
45
|
+
route :get, %r[/accounts/\d+/lists/\d+/custom_fields/\d+\?], fixture("custom_field.json")
|
43
46
|
route :get, %r[/accounts/\d+/lists/\d+/subscribers\?], fixture("subscribers.json")
|
44
47
|
route :get, %r[/accounts/\d+/lists/\d+/web_forms\?], fixture("web_forms.json")
|
45
48
|
route :get, %r[/accounts/\d+/lists/\d+/web_form_split_tests\?], fixture("web_form_split_tests.json")
|
@@ -52,4 +55,5 @@ route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages\?], fixture("m
|
|
52
55
|
route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages/\d+/opens\?], fixture("opens.json")
|
53
56
|
route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages/\d+/tracked_events\?], fixture("tracked_events.json")
|
54
57
|
|
55
|
-
route :post, %r[/accounts/\d+/lists
|
58
|
+
route :post, %r[/accounts/\d+/lists\?], %[{"location":"https://api.aweber.com/1.0/accounts/1/lists/1550679"}], :status => ["201", "Created"]
|
59
|
+
route :post, %r[/accounts/\d+/lists/\d+/subscribers/\d+], "201 Created", :status => ["201", "Created"]
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SpecRouting
|
2
|
+
def self.included(base)
|
3
|
+
SpecRouting.setup_fixtures
|
4
|
+
end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def get(uri, &block)
|
8
|
+
FakeWeb.register_uri(:get, uri, :body => block.call)
|
9
|
+
end
|
10
|
+
|
11
|
+
def any(uri, &block)
|
12
|
+
FakeWeb.register_uri(:any, uri, :body => block.call)
|
13
|
+
end
|
14
|
+
|
15
|
+
def resource(name)
|
16
|
+
fixture(name, "resources")
|
17
|
+
end
|
18
|
+
|
19
|
+
def fixture(name, subdir="")
|
20
|
+
fixtures = Pathname.new(File.dirname(__FILE__) + "/fixtures/#{subdir}")
|
21
|
+
fixtures += "#{name}.json"
|
22
|
+
fixtures.read.gsub(/[\s\n]/, '')
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup_fixtures
|
26
|
+
any("https://auth.aweber.com/1.0/request_token") { "oauth_token=fake&oauth_token_secret=fake" }
|
27
|
+
any("https://auth.aweber.com/1.0/access_token") { "oauth_token=fake&oauth_token_secret=fake" }
|
28
|
+
|
29
|
+
get(%r[/cars]) { fixture(:cars) }
|
30
|
+
|
31
|
+
get(%r[/accounts\?]) { resource(:accounts) }
|
32
|
+
get(%r[/accounts/\d+/integrations\?]) { resource(:integrations) }
|
33
|
+
get(%r[/accounts/\d+/lists\?]) { resource(:lists) }
|
34
|
+
get(%r[/accounts/\d+/lists/\d+/subscribers\?]) { resource(:subscribers) }
|
35
|
+
get(%r[/accounts/\d+/lists/\d+/web_forms\?]) { resource(:web_forms) }
|
36
|
+
get(%r[/accounts/\d+/lists/\d+/web_form_split_tests\?]) { resource(:web_form_split_tests) }
|
37
|
+
get(%r[/accounts/\d+/lists/\d+/web_form_split_tests/\d+/components\?]) { resource(:web_form_split_test_components) }
|
38
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns\?]) { resource(:campaigns) }
|
39
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/links\?]) { resource(:links) }
|
40
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/links/\d+/clicks\?]) { resource(:clicks) }
|
41
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages\?]) { resource(:messages) }
|
42
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages/\d+/opens\?]) { resource(:opens) }
|
43
|
+
get(%r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages/\d+/tracked_events\?]) { resource(:tracked_events) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 1.
|
9
|
+
version: 1.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- AWeber Communications, Inc.
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-04-04 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -132,6 +132,8 @@ files:
|
|
132
132
|
- spec/fixtures/campaigns.json
|
133
133
|
- spec/fixtures/click.json
|
134
134
|
- spec/fixtures/clicks.json
|
135
|
+
- spec/fixtures/custom_field.json
|
136
|
+
- spec/fixtures/custom_fields.json
|
135
137
|
- spec/fixtures/integration.json
|
136
138
|
- spec/fixtures/integrations.json
|
137
139
|
- spec/fixtures/link.json
|
@@ -157,6 +159,7 @@ files:
|
|
157
159
|
- spec/resources/account_spec.rb
|
158
160
|
- spec/resources/campaign_spec.rb
|
159
161
|
- spec/resources/click_spec.rb
|
162
|
+
- spec/resources/custom_field_spec.rb
|
160
163
|
- spec/resources/integration_spec.rb
|
161
164
|
- spec/resources/link_spec.rb
|
162
165
|
- spec/resources/list_spec.rb
|
@@ -169,6 +172,7 @@ files:
|
|
169
172
|
- spec/resources/web_form_split_test_spec.rb
|
170
173
|
- spec/spec_helper.rb
|
171
174
|
- spec/support/fake_classes.rb
|
175
|
+
- spec/support/spec_routing.rb
|
172
176
|
has_rdoc: true
|
173
177
|
homepage: http://github.com/aweber/AWeber-API-Ruby-Library
|
174
178
|
licenses: []
|
@@ -210,6 +214,8 @@ test_files:
|
|
210
214
|
- spec/fixtures/campaigns.json
|
211
215
|
- spec/fixtures/click.json
|
212
216
|
- spec/fixtures/clicks.json
|
217
|
+
- spec/fixtures/custom_field.json
|
218
|
+
- spec/fixtures/custom_fields.json
|
213
219
|
- spec/fixtures/integration.json
|
214
220
|
- spec/fixtures/integrations.json
|
215
221
|
- spec/fixtures/link.json
|
@@ -235,6 +241,7 @@ test_files:
|
|
235
241
|
- spec/resources/account_spec.rb
|
236
242
|
- spec/resources/campaign_spec.rb
|
237
243
|
- spec/resources/click_spec.rb
|
244
|
+
- spec/resources/custom_field_spec.rb
|
238
245
|
- spec/resources/integration_spec.rb
|
239
246
|
- spec/resources/link_spec.rb
|
240
247
|
- spec/resources/list_spec.rb
|
@@ -247,3 +254,4 @@ test_files:
|
|
247
254
|
- spec/resources/web_form_split_test_spec.rb
|
248
255
|
- spec/spec_helper.rb
|
249
256
|
- spec/support/fake_classes.rb
|
257
|
+
- spec/support/spec_routing.rb
|