aweber 1.5.0 → 1.6.0

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/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