pew_pew 0.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.
Files changed (57) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +2 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +22 -0
  6. data/README.md +84 -0
  7. data/Rakefile +3 -0
  8. data/lib/pew_pew.rb +32 -0
  9. data/lib/pew_pew/client.rb +90 -0
  10. data/lib/pew_pew/config.rb +15 -0
  11. data/lib/pew_pew/domain.rb +9 -0
  12. data/lib/pew_pew/resource.rb +52 -0
  13. data/lib/pew_pew/resources/bounces.rb +41 -0
  14. data/lib/pew_pew/resources/campaigns.rb +141 -0
  15. data/lib/pew_pew/resources/complaints.rb +40 -0
  16. data/lib/pew_pew/resources/lists.rb +121 -0
  17. data/lib/pew_pew/resources/logs.rb +12 -0
  18. data/lib/pew_pew/resources/mailboxes.rb +41 -0
  19. data/lib/pew_pew/resources/messages.rb +37 -0
  20. data/lib/pew_pew/resources/routes.rb +57 -0
  21. data/lib/pew_pew/resources/stats.rb +12 -0
  22. data/lib/pew_pew/resources/unsubscribes.rb +43 -0
  23. data/lib/pew_pew/response.rb +11 -0
  24. data/lib/pew_pew/version.rb +3 -0
  25. data/pew_pew.gemspec +20 -0
  26. data/spec/fixtures/bounces.yml +144 -0
  27. data/spec/fixtures/campaigns.yml +368 -0
  28. data/spec/fixtures/complaints.yml +142 -0
  29. data/spec/fixtures/image.png +0 -0
  30. data/spec/fixtures/lists.yml +403 -0
  31. data/spec/fixtures/logs.yml +133 -0
  32. data/spec/fixtures/mailboxes.yml +141 -0
  33. data/spec/fixtures/messages.yml +196 -0
  34. data/spec/fixtures/mime.eml +34 -0
  35. data/spec/fixtures/routes.yml +225 -0
  36. data/spec/fixtures/stats.yml +61 -0
  37. data/spec/fixtures/unsubscribes.yml +219 -0
  38. data/spec/pew_pew/client_spec.rb +51 -0
  39. data/spec/pew_pew/config_spec.rb +38 -0
  40. data/spec/pew_pew/resource_spec.rb +46 -0
  41. data/spec/pew_pew/resources/bounces_spec.rb +78 -0
  42. data/spec/pew_pew/resources/campaigns_spec.rb +228 -0
  43. data/spec/pew_pew/resources/complaints_spec.rb +69 -0
  44. data/spec/pew_pew/resources/lists_spec.rb +283 -0
  45. data/spec/pew_pew/resources/logs_spec.rb +28 -0
  46. data/spec/pew_pew/resources/mailboxes_spec.rb +59 -0
  47. data/spec/pew_pew/resources/messages_spec.rb +53 -0
  48. data/spec/pew_pew/resources/routes_spec.rb +135 -0
  49. data/spec/pew_pew/resources/stats_spec.rb +26 -0
  50. data/spec/pew_pew/resources/unsubscribes_spec.rb +99 -0
  51. data/spec/pew_pew/response_spec.rb +21 -0
  52. data/spec/pew_pew_spec.rb +13 -0
  53. data/spec/spec_helper.rb +17 -0
  54. data/spec/support/contexts/api_requests.rb +23 -0
  55. data/spec/support/contexts/domain_resource.rb +17 -0
  56. data/spec/support/vcr.rb +6 -0
  57. metadata +211 -0
@@ -0,0 +1,61 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.mailgun.net/v2/<%= domain %>/stats
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - PewPew Ruby Gem 0.0.1
12
+ Authorization:
13
+ - Basic <%= basic_auth %>
14
+ response:
15
+ status:
16
+ code: 200
17
+ message:
18
+ headers:
19
+ server:
20
+ - nginx/1.0.14
21
+ date:
22
+ - Fri, 01 Jun 2012 20:01:54 GMT
23
+ content-type:
24
+ - application/json
25
+ connection:
26
+ - close
27
+ content-length:
28
+ - '1817'
29
+ content-disposition:
30
+ - inline
31
+ body:
32
+ encoding: US-ASCII
33
+ string: ! "{\n \"total_count\": 10, \n \"items\": [\n {\n \"total_count\":
34
+ 11, \n \"created_at\": \"Fri, 01 Jun 2012 00:00:00 GMT\", \n \"tags\":
35
+ {}, \n \"id\": \"4fc837558393c1618263d76c\", \n \"event\": \"sent\"\n
36
+ \ }, \n {\n \"total_count\": 11, \n \"created_at\": \"Fri,
37
+ 01 Jun 2012 00:00:00 GMT\", \n \"tags\": {}, \n \"id\": \"4fc837568393c1618263d76d\",
38
+ \n \"event\": \"delivered\"\n }, \n {\n \"total_count\": 6,
39
+ \n \"created_at\": \"Tue, 29 May 2012 00:00:00 GMT\", \n \"tags\":
40
+ {}, \n \"id\": \"4fc55a2e8393c161826132b5\", \n \"event\": \"sent\"\n
41
+ \ }, \n {\n \"total_count\": 6, \n \"created_at\": \"Tue, 29
42
+ May 2012 00:00:00 GMT\", \n \"tags\": {}, \n \"id\": \"4fc55a2f8393c161826132b7\",
43
+ \n \"event\": \"delivered\"\n }, \n {\n \"total_count\": 5,
44
+ \n \"created_at\": \"Sat, 26 May 2012 00:00:00 GMT\", \n \"tags\":
45
+ {}, \n \"id\": \"4fc01d548393c161825f53a7\", \n \"event\": \"sent\"\n
46
+ \ }, \n {\n \"total_count\": 5, \n \"created_at\": \"Sat, 26
47
+ May 2012 00:00:00 GMT\", \n \"tags\": {}, \n \"id\": \"4fc01d558393c161825f53aa\",
48
+ \n \"event\": \"delivered\"\n }, \n {\n \"total_count\": 4,
49
+ \n \"created_at\": \"Fri, 25 May 2012 00:00:00 GMT\", \n \"tags\":
50
+ {}, \n \"id\": \"4fc01c7c8393c161825f5233\", \n \"event\": \"sent\"\n
51
+ \ }, \n {\n \"total_count\": 4, \n \"created_at\": \"Fri, 25
52
+ May 2012 00:00:00 GMT\", \n \"tags\": {}, \n \"id\": \"4fc01c7d8393c161825f5235\",
53
+ \n \"event\": \"delivered\"\n }, \n {\n \"total_count\": 1,
54
+ \n \"created_at\": \"Thu, 24 May 2012 00:00:00 GMT\", \n \"tags\":
55
+ {}, \n \"id\": \"4fbdeaac8393c161825e5f99\", \n \"event\": \"sent\"\n
56
+ \ }, \n {\n \"total_count\": 1, \n \"created_at\": \"Thu, 24
57
+ May 2012 00:00:00 GMT\", \n \"tags\": {}, \n \"id\": \"4fbdeaad8393c161825e5f9a\",
58
+ \n \"event\": \"delivered\"\n }\n ]\n}"
59
+ http_version:
60
+ recorded_at: Fri, 01 Jun 2012 20:01:54 GMT
61
+ recorded_with: VCR 2.2.0
@@ -0,0 +1,219 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes
6
+ body:
7
+ encoding: US-ASCII
8
+ string: address=test%40example.com&tag=newsletter
9
+ headers:
10
+ User-Agent:
11
+ - PewPew Ruby Gem 0.0.1
12
+ Authorization:
13
+ - Basic <%= basic_auth %>
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.0.14
23
+ date:
24
+ - Sat, 02 Jun 2012 02:53:29 GMT
25
+ content-type:
26
+ - application/json
27
+ connection:
28
+ - close
29
+ content-length:
30
+ - '101'
31
+ content-disposition:
32
+ - inline
33
+ body:
34
+ encoding: US-ASCII
35
+ string: ! "{\n \"message\": \"Address has been added to the unsubscribes table\",
36
+ \n \"address\": \"test@example.com\"\n}"
37
+ http_version:
38
+ recorded_at: Sat, 02 Jun 2012 02:53:29 GMT
39
+ - request:
40
+ method: post
41
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes
42
+ body:
43
+ encoding: US-ASCII
44
+ string: address=test%40example.com&tag=%2A
45
+ headers:
46
+ User-Agent:
47
+ - PewPew Ruby Gem 0.0.1
48
+ Authorization:
49
+ - Basic <%= basic_auth %>
50
+ Content-Type:
51
+ - application/x-www-form-urlencoded
52
+ response:
53
+ status:
54
+ code: 200
55
+ message:
56
+ headers:
57
+ server:
58
+ - nginx/1.0.14
59
+ date:
60
+ - Sat, 02 Jun 2012 02:54:37 GMT
61
+ content-type:
62
+ - application/json
63
+ connection:
64
+ - close
65
+ content-length:
66
+ - '100'
67
+ content-disposition:
68
+ - inline
69
+ body:
70
+ encoding: US-ASCII
71
+ string: ! "{\n \"message\": \"Address has been added to the unsubscribes table\",\n
72
+ \ \"address\": \"test@example.com\"\n}"
73
+ http_version:
74
+ recorded_at: Sat, 02 Jun 2012 02:54:37 GMT
75
+ - request:
76
+ method: get
77
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes/test@example.com
78
+ body:
79
+ encoding: US-ASCII
80
+ string: ''
81
+ headers:
82
+ User-Agent:
83
+ - PewPew Ruby Gem 0.0.1
84
+ Authorization:
85
+ - Basic <%= basic_auth %>
86
+ response:
87
+ status:
88
+ code: 200
89
+ message:
90
+ headers:
91
+ server:
92
+ - nginx/1.0.14
93
+ date:
94
+ - Sat, 02 Jun 2012 02:55:33 GMT
95
+ content-type:
96
+ - application/json
97
+ connection:
98
+ - close
99
+ content-length:
100
+ - '368'
101
+ content-disposition:
102
+ - inline
103
+ body:
104
+ encoding: US-ASCII
105
+ string: ! "{\n \"total_count\": 2,\n \"items\": [\n {\n \"created_at\":
106
+ \"Sat, 02 Jun 2012 02:54:37 GMT\",\n \"tag\": \"*\",\n \"id\": \"4fc9806d8393c1618264c360\",\n
107
+ \ \"address\": \"test@example.com\"\n },\n {\n \"created_at\":
108
+ \"Sat, 02 Jun 2012 02:53:29 GMT\",\n \"tag\": \"newsletter\",\n \"id\":
109
+ \"4fc980298393c1618264c34d\",\n \"address\": \"test@example.com\"\n }\n
110
+ \ ]\n}"
111
+ http_version:
112
+ recorded_at: Sat, 02 Jun 2012 02:55:33 GMT
113
+ - request:
114
+ method: get
115
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes
116
+ body:
117
+ encoding: US-ASCII
118
+ string: ''
119
+ headers:
120
+ User-Agent:
121
+ - PewPew Ruby Gem 0.0.1
122
+ Authorization:
123
+ - Basic <%= basic_auth %>
124
+ response:
125
+ status:
126
+ code: 200
127
+ message:
128
+ headers:
129
+ server:
130
+ - nginx/1.0.14
131
+ date:
132
+ - Sat, 02 Jun 2012 02:58:24 GMT
133
+ content-type:
134
+ - application/json
135
+ connection:
136
+ - close
137
+ content-length:
138
+ - '376'
139
+ content-disposition:
140
+ - inline
141
+ body:
142
+ encoding: US-ASCII
143
+ string: ! "{\n \"total_count\": 2, \n \"items\": [\n {\n \"created_at\":
144
+ \"Sat, 02 Jun 2012 02:54:37 GMT\", \n \"tag\": \"*\", \n \"id\":
145
+ \"4fc9806d8393c1618264c360\", \n \"address\": \"test@example.com\"\n
146
+ \ }, \n {\n \"created_at\": \"Sat, 02 Jun 2012 02:53:29 GMT\", \n
147
+ \ \"tag\": \"newsletter\", \n \"id\": \"4fc980298393c1618264c34d\",
148
+ \n \"address\": \"test@example.com\"\n }\n ]\n}"
149
+ http_version:
150
+ recorded_at: Sat, 02 Jun 2012 02:58:24 GMT
151
+ - request:
152
+ method: delete
153
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes/4fc9806d8393c1618264c360
154
+ body:
155
+ encoding: US-ASCII
156
+ string: ''
157
+ headers:
158
+ User-Agent:
159
+ - PewPew Ruby Gem 0.0.1
160
+ Authorization:
161
+ - Basic <%= basic_auth %>
162
+ response:
163
+ status:
164
+ code: 200
165
+ message:
166
+ headers:
167
+ server:
168
+ - nginx/1.0.14
169
+ date:
170
+ - Sat, 02 Jun 2012 02:59:33 GMT
171
+ content-type:
172
+ - application/json
173
+ connection:
174
+ - close
175
+ content-length:
176
+ - '94'
177
+ content-disposition:
178
+ - inline
179
+ body:
180
+ encoding: US-ASCII
181
+ string: ! "{\n \"message\": \"Unsubscribe event has been removed\",\n \"address\":
182
+ \"4fc9806d8393c1618264c360\"\n}"
183
+ http_version:
184
+ recorded_at: Sat, 02 Jun 2012 02:59:33 GMT
185
+ - request:
186
+ method: delete
187
+ uri: https://api.mailgun.net/v2/<%= domain %>/unsubscribes/test@example.com
188
+ body:
189
+ encoding: US-ASCII
190
+ string: ''
191
+ headers:
192
+ User-Agent:
193
+ - PewPew Ruby Gem 0.0.1
194
+ Authorization:
195
+ - Basic <%= basic_auth %>
196
+ response:
197
+ status:
198
+ code: 200
199
+ message:
200
+ headers:
201
+ server:
202
+ - nginx/1.0.14
203
+ date:
204
+ - Sat, 02 Jun 2012 02:59:52 GMT
205
+ content-type:
206
+ - application/json
207
+ connection:
208
+ - close
209
+ content-length:
210
+ - '86'
211
+ content-disposition:
212
+ - inline
213
+ body:
214
+ encoding: US-ASCII
215
+ string: ! "{\n \"message\": \"Unsubscribe event has been removed\",\n \"address\":
216
+ \"test@example.com\"\n}"
217
+ http_version:
218
+ recorded_at: Sat, 02 Jun 2012 02:59:52 GMT
219
+ recorded_with: VCR 2.2.0
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe PewPew::Client do
4
+ context '#config' do
5
+ subject { described_class.new.config }
6
+
7
+ its(:adapter) { should == Faraday.default_adapter }
8
+ its(:base_uri) { should == PewPew::Config::BASE_URI }
9
+ its(:user_agent) { should == PewPew::Config::USER_AGENT }
10
+
11
+ its(:api_key) { should be_nil }
12
+ its(:domain) { should be_nil }
13
+ end
14
+
15
+ context '#configure' do
16
+ subject do
17
+ described_class.new.configure do |config|
18
+ config.adapter = :typhoeus
19
+ config.base_uri = 'https://api.mailgun.com/v2'
20
+ config.user_agent = 'A PewPew Application'
21
+
22
+ config.api_key = 'key-02n9f3ijl9sm9u97-8p7r-d7-15q-ui1'
23
+ config.domain = 'pewpew.mailgun.org'
24
+ end
25
+ end
26
+
27
+ its(:adapter) { should == :typhoeus }
28
+ its(:base_uri) { should == 'https://api.mailgun.com/v2' }
29
+ its(:user_agent) { should == 'A PewPew Application' }
30
+
31
+ its(:api_key) { should == 'key-02n9f3ijl9sm9u97-8p7r-d7-15q-ui1' }
32
+ its(:domain) { should == 'pewpew.mailgun.org' }
33
+ end
34
+
35
+ {
36
+ bounces: PewPew::Resources::Bounces,
37
+ campaigns: PewPew::Resources::Campaigns,
38
+ complaints: PewPew::Resources::Complaints,
39
+ lists: PewPew::Resources::Lists,
40
+ logs: PewPew::Resources::Logs,
41
+ mailboxes: PewPew::Resources::Mailboxes,
42
+ messages: PewPew::Resources::Messages,
43
+ routes: PewPew::Resources::Routes,
44
+ stats: PewPew::Resources::Stats,
45
+ unsubscribes: PewPew::Resources::Unsubscribes,
46
+ }.each do |method, resource_class|
47
+ context "##{method}" do
48
+ specify { subject.send(method).should be_a(resource_class) }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe PewPew::Config do
4
+ {
5
+ BASE_URI: 'https://api.mailgun.net/v2',
6
+ USER_AGENT: "PewPew Ruby Gem #{PewPew::VERSION}",
7
+ USERNAME: 'api'
8
+ }.each do |constant, value|
9
+ context constant do
10
+ subject { described_class.const_get(constant) }
11
+
12
+ it { should == value }
13
+ end
14
+ end
15
+
16
+ subject { Class.new { include PewPew::Config }.new }
17
+
18
+ context 'defaults' do
19
+ its(:api_key) { should be_nil }
20
+ its(:domain) { should be_nil }
21
+ end
22
+
23
+ context '#api_key=' do
24
+ specify do
25
+ expect {
26
+ subject.api_key = 'key-02n9f3ijl9sm9u97-8p7r-d7-15q-ui1'
27
+ }.to change(subject, :api_key).to('key-02n9f3ijl9sm9u97-8p7r-d7-15q-ui1')
28
+ end
29
+ end
30
+
31
+ context '#domain=' do
32
+ specify do
33
+ expect {
34
+ subject.domain = 'pewpew.mailgun.org'
35
+ }.to change(subject, :domain).to('pewpew.mailgun.org')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe PewPew::Resource do
4
+ let(:client) { PewPew::Client.new }
5
+ let(:resource) { Class.new { include PewPew::Resource }.new(client) }
6
+
7
+ context '#connection' do
8
+ subject { resource.send(:connection) }
9
+
10
+ context 'middleware' do
11
+ let(:handlers) { subject.builder.handlers }
12
+
13
+ [
14
+ PewPew::Resource::ResponseDecorator,
15
+ FaradayMiddleware::Mashify,
16
+ FaradayMiddleware::ParseJson,
17
+ Faraday::Request::Multipart,
18
+ Faraday::Request::UrlEncoded,
19
+ Faraday::Adapter::NetHttp
20
+ ].each.with_index do |middleware, index|
21
+ it "uses #{middleware}" do
22
+ handlers.index(middleware).should == index
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ describe PewPew::Resource::ResponseDecorator do
30
+ it { should be_a(Faraday::Response::Middleware) }
31
+
32
+ it 'converts an array response into a mash' do
33
+ env = { body: [:response] }
34
+ subject.on_complete(env)
35
+ env[:body].total_count.should == 1
36
+ env[:body].items.should == [:response]
37
+ end
38
+
39
+ it 'stores the request status on the response body' do
40
+ env = { body: PewPew::Response.new, status: 200 }
41
+
42
+ expect {
43
+ subject.on_complete(env)
44
+ }.to change(env[:body], :status).from(nil).to(200)
45
+ end
46
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe PewPew::Resources::Bounces, :resource, :domain do
4
+ let(:resource) { described_class.new(client) }
5
+
6
+ context '#all' do
7
+ let(:response) { resource.all }
8
+
9
+ subject { response }
10
+
11
+ specify { should be_success }
12
+
13
+ its(:status) { should == 200 }
14
+ its(:total_count) { should == 1 }
15
+
16
+ context 'item' do
17
+ subject { response.items.first }
18
+
19
+ its(:address) { should == 'test@example.com' }
20
+ its(:code) { should == '554' }
21
+ its(:error) { should == 'Relay access denied' }
22
+ its(:created_at) { should == 'Sat, 02 Jun 2012 07:24:08 GMT' }
23
+ end
24
+ end
25
+
26
+ context '#find' do
27
+ let(:response) { resource.find('test@example.com') }
28
+
29
+ subject { response }
30
+
31
+ specify { should be_success }
32
+
33
+ its(:status) { should == 200 }
34
+
35
+ context 'bounce' do
36
+ subject { response.bounce }
37
+
38
+ its(:address) { should == 'test@example.com' }
39
+ its(:code) { should == '554' }
40
+ its(:error) { should == 'Relay access denied' }
41
+ its(:created_at) { should == 'Sat, 02 Jun 2012 07:24:08 GMT' }
42
+ end
43
+ end
44
+
45
+ context '#create' do
46
+ let(:params) do
47
+ {
48
+ address: 'test@example.com',
49
+ code: 554,
50
+ error: 'Relay access denied',
51
+ }
52
+ end
53
+
54
+ let(:response) { resource.create(params) }
55
+
56
+ subject { response }
57
+
58
+ specify { should be_success }
59
+
60
+ its(:status) { should == 200 }
61
+ its(:message) { should == 'Address has been added to the bounces table' }
62
+
63
+ its(:address) { should == 'test@example.com' }
64
+ end
65
+
66
+ context '#remove' do
67
+ subject { response }
68
+
69
+ let(:response) { resource.remove('test@example.com') }
70
+
71
+ specify { should be_success }
72
+
73
+ its(:status) { should == 200 }
74
+ its(:message) { should == 'Bounced address has been removed' }
75
+
76
+ its(:address) { should == 'test@example.com' }
77
+ end
78
+ end