aweber 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2012, AWeber Communications, Inc.
1
+ Copyright (c) 2010-2013, AWeber Communications, Inc.
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
@@ -143,4 +143,4 @@ h2. Note on Patches/Pull Requests
143
143
 
144
144
  h2. Copyright
145
145
 
146
- Copyright (c) 2010-2012 AWeber Communications, Inc. See LICENSE for more detail.
146
+ Copyright (c) 2010-2013 AWeber Communications, Inc. See LICENSE for more detail.
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "aweber"
4
- s.version = "1.5.0"
4
+ s.version = "1.6.0"
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.summary = "Ruby interface to AWeber's API"
7
7
  s.description = "Ruby interface to AWeber's API"
@@ -17,6 +17,7 @@ module AWeber
17
17
  :campaigns => :Campaign,
18
18
  :messages => :Message,
19
19
  :opens => :Open,
20
+ :stats => :Stat,
20
21
  :subscribers => :Subscriber,
21
22
  :tracked_events => :TrackedEvent,
22
23
  :integrations => :Integration,
@@ -9,8 +9,9 @@ require "aweber/resources/campaign"
9
9
  require "aweber/resources/message"
10
10
  require "aweber/resources/open"
11
11
  require "aweber/resources/subscriber"
12
+ require "aweber/resources/stat"
12
13
  require "aweber/resources/tracked_event"
13
14
  require "aweber/resources/integration"
14
15
  require "aweber/resources/web_form"
15
16
  require "aweber/resources/web_form_split_test"
16
- require "aweber/resources/web_form_split_test_component"
17
+ require "aweber/resources/web_form_split_test_component"
@@ -18,9 +18,11 @@ module AWeber
18
18
  api_attr :total_unsubscribes
19
19
  api_attr :twitter_account_link
20
20
 
21
+ api_attr :stats_collection_link
21
22
  api_attr :links_collection_link
22
23
  api_attr :messages_collection_link
23
24
 
25
+ has_many :stats
24
26
  has_many :links
25
27
  has_many :messages
26
28
 
@@ -28,4 +30,4 @@ module AWeber
28
30
  alias_attribute :is_click_tracking_enabled?, :click_tracking_enabled
29
31
  end
30
32
  end
31
- end
33
+ end
@@ -3,14 +3,18 @@ module AWeber
3
3
  class Campaign < Resource
4
4
  basepath "/campaigns"
5
5
 
6
+ api_attr :campaign_type
6
7
  api_attr :click_tracking_enabled
7
8
  api_attr :content_type
8
9
  api_attr :is_archived
10
+ api_attr :links_collection_link
9
11
  api_attr :message_interval
10
12
  api_attr :message_number
13
+ api_attr :messages_collection_link
11
14
  api_attr :scheduled_at
12
15
  api_attr :sent_at
13
16
  api_attr :spam_assassin_score
17
+ api_attr :stats_collection_link
14
18
  api_attr :subject
15
19
  api_attr :total_clicked
16
20
  api_attr :total_clicks
@@ -21,22 +25,21 @@ module AWeber
21
25
  api_attr :total_undelivered
22
26
  api_attr :total_unsubscribes
23
27
  api_attr :twitter_account_link
24
- api_attr :links_collection_link
25
- api_attr :messages_collection_link
26
-
28
+
27
29
  has_many :links
28
30
  has_many :messages
29
-
31
+ has_many :stats
32
+
30
33
  alias_attribute :is_archived?, :is_archived
31
34
  alias_attribute :is_click_tracking_enabled?, :click_tracking_enabled
32
35
 
33
36
  def is_followup?
34
- resource_type_link.split("#").last =~ /^followup/
37
+ campaign_type == "f"
35
38
  end
36
39
 
37
40
  def is_broadcast?
38
- resource_type_link.split("#").last =~ /^broadcast/
41
+ campaign_type == "b"
39
42
  end
40
43
  end
41
44
  end
42
- end
45
+ end
@@ -18,9 +18,11 @@ module AWeber
18
18
 
19
19
  api_attr :links_collection_link
20
20
  api_attr :messages_collection_link
21
+ api_attr :stats_collection_link
21
22
 
22
23
  has_many :links
23
24
  has_many :messages
25
+ has_many :stats
24
26
  end
25
27
  end
26
- end
28
+ end
@@ -0,0 +1,12 @@
1
+ module AWeber
2
+ module Resources
3
+ class Stat < Resource
4
+ basepath "/stats"
5
+
6
+ api_attr :description
7
+ api_attr :value
8
+
9
+ end
10
+ end
11
+ end
12
+
@@ -34,6 +34,20 @@ module AWeber
34
34
  move_to(list)
35
35
  end
36
36
 
37
+ def move(list, last_followup_sent=nil)
38
+ move_args = {
39
+ "ws.op" => "move",
40
+ "list_link" => list.self_link
41
+ }
42
+
43
+ if last_followup_sent
44
+ move_args['last_followup_message_number_sent'] = last_followup_sent
45
+ end
46
+
47
+ r = client.post(self_link, move_args)
48
+ move_to(list)
49
+ end
50
+
37
51
  private
38
52
 
39
53
  def move_to(list)
@@ -43,4 +57,4 @@ module AWeber
43
57
  end
44
58
  end
45
59
  end
46
- end
60
+ end
@@ -13,6 +13,7 @@
13
13
  "messages_collection_link": "http://api.apitest.lab/1.0/accounts/1/lists/1/campaigns/b2/messages",
14
14
  "send_date": "2010-22-12T22:15:00-07:00",
15
15
  "content_type": "HTML",
16
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
16
17
  "total_sent": 0,
17
18
  "self_link": "http://api.apitest.lab/1.0/accounts/1/lists/1/campaigns/b2",
18
19
  "subject": "Something about stuff.",
@@ -20,4 +21,4 @@
20
21
  "id": 2,
21
22
  "total_unsubscribes": 0,
22
23
  "total_spam_complaints": null
23
- }
24
+ }
@@ -15,6 +15,7 @@
15
15
  "id": 50000047,
16
16
  "http_etag": "\"5b89a250c79f444d5d8b0a33333569cb7ba5bf12-e3f601ab748eb9ac953ad5fe426f204f460b721e\"",
17
17
  "messages_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/f4125891/messages",
18
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
18
19
  "content_type": "Text",
19
20
  "total_unsubscribes": 0,
20
21
  "self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/f4125891",
@@ -35,6 +36,7 @@
35
36
  "id": 1967848,
36
37
  "http_etag": "\"783551829f8c707d634ffdc642c4d27a98fd40f2-731c9d0c70ef77f5919d7ad4ec7a26b1c53eef50\"",
37
38
  "messages_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f1967848/messages",
39
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
38
40
  "content_type": "Text/HTML",
39
41
  "total_unsubscribes": 0,
40
42
  "self_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f1967848",
@@ -55,6 +57,7 @@
55
57
  "id": 664656,
56
58
  "http_etag": "\"c98b377b2455745c2c2e54b7540dcabbea5b119d-90db636542d1250b74d31c9eee656f44a9ace3e0\"",
57
59
  "messages_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f664656/messages",
60
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
58
61
  "content_type": "HTML",
59
62
  "total_unsubscribes": 0,
60
63
  "self_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f664656",
@@ -76,6 +79,7 @@
76
79
  "http_etag": "\"e36ea7ee44a4b3df8eeb97168a665592ab90d1e9-8ce8a07752e3f7e39b01b646fa0309a11333b8aa\"",
77
80
  "messages_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f1967845/messages",
78
81
  "content_type": "Text",
82
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
79
83
  "total_unsubscribes": 0,
80
84
  "self_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f1967845",
81
85
  "total_undelivered": null,
@@ -98,9 +102,10 @@
98
102
  "content_type": "Text/HTML",
99
103
  "total_unsubscribes": 1,
100
104
  "self_link": "https://api.aweber.com/1.0/accounts/1/lists/406860/campaigns/f1967847",
105
+ "stats_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats",
101
106
  "total_undelivered": null,
102
107
  "resource_type_link": "https://api.aweber.com/1.0/#followup_campaign",
103
108
  "message_number": 5,
104
109
  "subject": "{!firstname_fix}, Followup Test #4"
105
110
  }]
106
- }
111
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "total_clicks",
3
+ "http_etag": "\"4ab41e60d14ea138a4522b3d2896942b7335c13c - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
4
+ "self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats/total_clicks",
5
+ "resource_type_link": "https://api.aweber.com/1.0/#integer-stat",
6
+ "description": "total clicks",
7
+ "value": 1234
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "total_size": 1,
3
+ "start": 0,
4
+ "resource_type_link": "https://api.aweber.com/1.0/#stats-page-resource",
5
+ "entries": [{
6
+ "id": "total_clicks",
7
+ "http_etag": "\"4ab41e60d14ea138a4522b3d2896942b7335c13c - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
8
+ "self_link": "https://api.aweber.com/1.0/accounts/1/lists/1/campaigns/b1234/stats/total_clicks",
9
+ "resource_type_link": "https://api.aweber.com/1.0/#integer-stat",
10
+ "description": "total clicks",
11
+ "value": 1234
12
+ }]
13
+ }
@@ -6,11 +6,21 @@ describe "AWeber::Resources::Campaign" do
6
6
 
7
7
  its(:path) { should == "/accounts/1/lists/1/campaigns/50000047" }
8
8
 
9
+ it { should respond_to :campaign_type }
9
10
  it { should respond_to :click_tracking_enabled }
10
11
  it { should respond_to :content_type }
12
+ it { should respond_to :links }
13
+ it { should respond_to :messages }
11
14
  it { should respond_to :spam_assassin_score }
15
+ it { should respond_to :stats }
12
16
  it { should respond_to :subject }
13
17
  it { should respond_to :total_spam_complaints }
14
18
  it { should respond_to :total_undelivered }
15
19
  it { should respond_to :total_unsubscribes }
20
+
21
+ it "should should have a collection of stats" do
22
+ subject.stats.should be_an AWeber::Collection
23
+ subject.stats['total_clicks'].should be_an AWeber::Resources::Stat
24
+ end
25
+
16
26
  end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe AWeber::Resources::Link do
4
+ include BaseObjects
5
+ subject { aweber.account.lists[1].campaigns[50000047].stats['total_clicks'] }
6
+
7
+ its(:path) { should == "/accounts/1/lists/1/campaigns/50000047/stats/total_clicks" }
8
+
9
+ it { should respond_to :description }
10
+ it { should respond_to :http_etag }
11
+ it { should respond_to :id }
12
+ it { should respond_to :resource_type_link }
13
+ it { should respond_to :self_link }
14
+ it { should respond_to :value }
15
+ end
@@ -42,6 +42,16 @@ describe AWeber::Resources::Subscriber do
42
42
  subject.list = aweber.account.lists[1550685]
43
43
  end
44
44
 
45
+
46
+ it "should move lists with followup" do
47
+ list = "http://api.aweber.com/1.0/accounts/1/lists/987654"
48
+ json = { "ws.op" => "move", "list_link" => list, "last_followup_message_number_sent" => 1}
49
+
50
+ aweber.account.lists[1550685].stub(:self_link).and_return(list)
51
+ oauth.should_receive(:post).with(subject.self_link, json)
52
+ subject.move(aweber.account.lists[1550685], 1)
53
+ end
54
+
45
55
  it "should update list when moving" do
46
56
  new_list = aweber.account.lists[1550685]
47
57
  subject.list = new_list
@@ -50,6 +50,8 @@ route :get, %r[/accounts/\d+/lists/\d+/web_form_split_tests/\d+/components\?], f
50
50
  route :get, %r[/accounts/\d+/integrations\?], fixture("integrations.json")
51
51
  route :get, %r[/accounts/\d+/lists/\d+/campaigns\?], fixture("campaigns.json")
52
52
  route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/links\?], fixture("links.json")
53
+ route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/stats\?], fixture("stats.json")
54
+ route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/stats/\d+/total_clicks\?], fixture("stat.json")
53
55
  route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/links/\d+/clicks\?], fixture("clicks.json")
54
56
  route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages\?], fixture("messages.json")
55
57
  route :get, %r[/accounts/\d+/lists/\d+/campaigns/[\d\w]+/messages/\d+/opens\?], fixture("opens.json")
metadata CHANGED
@@ -1,108 +1,120 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: aweber
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 5
8
- - 0
9
- version: 1.5.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.6.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - AWeber Communications, Inc.
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-10-09 00:00:00 -04:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-01-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: oauth
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
30
22
  type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: json
34
23
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- version: "0"
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
42
38
  type: :runtime
43
- version_requirements: *id002
44
- - !ruby/object:Gem::Dependency
45
- name: fakeweb
46
39
  prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- segments:
52
- - 0
53
- version: "0"
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: fakeweb
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
54
  type: :development
55
- version_requirements: *id003
56
- - !ruby/object:Gem::Dependency
57
- name: rake
58
55
  prerelease: false
59
- requirement: &id004 !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- segments:
64
- - 0
65
- version: "0"
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
66
70
  type: :development
67
- version_requirements: *id004
68
- - !ruby/object:Gem::Dependency
69
- name: rspec
70
71
  prerelease: false
71
- requirement: &id005 !ruby/object:Gem::Requirement
72
- requirements:
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
73
83
  - - ~>
74
- - !ruby/object:Gem::Version
75
- segments:
76
- - 2
77
- - 11
78
- - 0
84
+ - !ruby/object:Gem::Version
79
85
  version: 2.11.0
80
86
  type: :development
81
- version_requirements: *id005
82
- - !ruby/object:Gem::Dependency
83
- name: yard
84
87
  prerelease: false
85
- requirement: &id006 !ruby/object:Gem::Requirement
86
- requirements:
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 2.11.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
87
99
  - - ~>
88
- - !ruby/object:Gem::Version
89
- segments:
90
- - 0
91
- - 6
92
- - 0
100
+ - !ruby/object:Gem::Version
93
101
  version: 0.6.0
94
102
  type: :development
95
- version_requirements: *id006
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.6.0
96
110
  description: Ruby interface to AWeber's API
97
111
  email: help@aweber.com
98
112
  executables: []
99
-
100
113
  extensions: []
101
-
102
- extra_rdoc_files:
114
+ extra_rdoc_files:
103
115
  - LICENSE
104
116
  - README.textile
105
- files:
117
+ files:
106
118
  - .document
107
119
  - .gitignore
108
120
  - .travis.yml
@@ -130,6 +142,7 @@ files:
130
142
  - lib/aweber/resources/list.rb
131
143
  - lib/aweber/resources/message.rb
132
144
  - lib/aweber/resources/open.rb
145
+ - lib/aweber/resources/stat.rb
133
146
  - lib/aweber/resources/subscriber.rb
134
147
  - lib/aweber/resources/tracked_event.rb
135
148
  - lib/aweber/resources/web_form.rb
@@ -158,6 +171,8 @@ files:
158
171
  - spec/fixtures/messages.json
159
172
  - spec/fixtures/open.json
160
173
  - spec/fixtures/opens.json
174
+ - spec/fixtures/stat.json
175
+ - spec/fixtures/stats.json
161
176
  - spec/fixtures/subscriber.json
162
177
  - spec/fixtures/subscribers.json
163
178
  - spec/fixtures/tracked_event.json
@@ -179,6 +194,7 @@ files:
179
194
  - spec/resources/list_spec.rb
180
195
  - spec/resources/message_spec.rb
181
196
  - spec/resources/open_spec.rb
197
+ - spec/resources/stat_spec.rb
182
198
  - spec/resources/subscriber_spec.rb
183
199
  - spec/resources/tracked_event_spec.rb
184
200
  - spec/resources/web_form_spec.rb
@@ -186,37 +202,31 @@ files:
186
202
  - spec/resources/web_form_split_test_spec.rb
187
203
  - spec/spec_helper.rb
188
204
  - spec/support/fake_classes.rb
189
- has_rdoc: true
190
205
  homepage: http://github.com/aweber/AWeber-API-Ruby-Library
191
206
  licenses: []
192
-
193
207
  post_install_message:
194
208
  rdoc_options: []
195
-
196
- require_paths:
209
+ require_paths:
197
210
  - lib
198
- required_ruby_version: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - ">="
201
- - !ruby/object:Gem::Version
202
- segments:
203
- - 0
204
- version: "0"
205
- required_rubygems_version: !ruby/object:Gem::Requirement
206
- requirements:
207
- - - ">="
208
- - !ruby/object:Gem::Version
209
- segments:
210
- - 0
211
- version: "0"
211
+ required_ruby_version: !ruby/object:Gem::Requirement
212
+ none: false
213
+ requirements:
214
+ - - ! '>='
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
212
223
  requirements: []
213
-
214
224
  rubyforge_project:
215
- rubygems_version: 1.3.6
225
+ rubygems_version: 1.8.23
216
226
  signing_key:
217
227
  specification_version: 3
218
228
  summary: Ruby interface to AWeber's API
219
- test_files:
229
+ test_files:
220
230
  - spec/base_spec.rb
221
231
  - spec/collection_spec.rb
222
232
  - spec/fixtures/account.json
@@ -240,6 +250,8 @@ test_files:
240
250
  - spec/fixtures/messages.json
241
251
  - spec/fixtures/open.json
242
252
  - spec/fixtures/opens.json
253
+ - spec/fixtures/stat.json
254
+ - spec/fixtures/stats.json
243
255
  - spec/fixtures/subscriber.json
244
256
  - spec/fixtures/subscribers.json
245
257
  - spec/fixtures/tracked_event.json
@@ -261,6 +273,7 @@ test_files:
261
273
  - spec/resources/list_spec.rb
262
274
  - spec/resources/message_spec.rb
263
275
  - spec/resources/open_spec.rb
276
+ - spec/resources/stat_spec.rb
264
277
  - spec/resources/subscriber_spec.rb
265
278
  - spec/resources/tracked_event_spec.rb
266
279
  - spec/resources/web_form_spec.rb