apsis-on-steroids 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7222efc62bbf76dd9716343cc6ff40b9da839fea
4
- data.tar.gz: 2107858d19cd4ecbeb3815c2a1e31f584bbaa545
3
+ metadata.gz: d2c97fee6983418cf2f499e0f3f901f5d51bda48
4
+ data.tar.gz: ddd8592da71bc82976ceb05ba2ec3ebe9209d1a0
5
5
  SHA512:
6
- metadata.gz: 1a4b44a4f25ebdfdadbba1a55acdeb6b074350de838cb057c0cb411716ed6d531341fa575ddbaf29cbc5c22c716ae9cd520b2f7c00f027d02efe002b1ddf3f0f
7
- data.tar.gz: e8655a0feb8c2b51c452475cea4bf388cacf6ba5a9b1d450ca6fa86db616fcec07cce4fc19b9ef9422c5eed3c4a4cac2e95d8fcc95aa27fe1eee5a56d9f1466d
6
+ metadata.gz: 9063c474acfba9d052f8186f76827753fc9d46f8f772104175551ea453e70a4593e4fded4d169913d4511cc2973221347503483a71f19033ec2532b2b04df0d7
7
+ data.tar.gz: b0506c2a5ae64f3e7a74858deae5809c2479eb7c3d6cc6a3c5735f4c54ec2b36ffe67d9be0eb4fc054f11dbf19c3f520232f794bd1bc5c6f6f189ceb7195b601
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "http://rubygems.org"
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
 
6
- gem "http2", "~> 0.0.25"
6
+ gem "http2", "~> 0.0.31"
7
7
  gem "string-cases"
8
8
  gem "tretry", "0.0.2"
9
9
 
@@ -1,12 +1,12 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- addressable (2.3.6)
4
+ addressable (2.3.8)
5
5
  builder (3.2.2)
6
6
  diff-lcs (1.1.3)
7
7
  faraday (0.8.9)
8
8
  multipart-post (~> 1.2.0)
9
- git (1.2.8)
9
+ git (1.2.9.1)
10
10
  github_api (0.10.1)
11
11
  addressable
12
12
  faraday (~> 0.8.1)
@@ -14,10 +14,10 @@ GEM
14
14
  multi_json (~> 1.4)
15
15
  nokogiri (~> 1.5.2)
16
16
  oauth2
17
- hashie (3.2.0)
18
- highline (1.6.21)
19
- http2 (0.0.25)
20
- string-cases
17
+ hashie (3.4.1)
18
+ highline (1.7.2)
19
+ http2 (0.0.31)
20
+ string-cases (~> 0)
21
21
  jeweler (1.8.8)
22
22
  builder
23
23
  bundler (~> 1.0)
@@ -27,9 +27,9 @@ GEM
27
27
  nokogiri (= 1.5.10)
28
28
  rake
29
29
  rdoc
30
- json (1.8.1)
31
- jwt (1.0.0)
32
- multi_json (1.10.1)
30
+ json (1.8.2)
31
+ jwt (1.5.0)
32
+ multi_json (1.11.0)
33
33
  multi_xml (0.5.5)
34
34
  multipart-post (1.2.0)
35
35
  nokogiri (1.5.10)
@@ -39,8 +39,8 @@ GEM
39
39
  multi_json (~> 1.3)
40
40
  multi_xml (~> 0.5)
41
41
  rack (~> 1.2)
42
- rack (1.5.2)
43
- rake (10.3.2)
42
+ rack (1.6.1)
43
+ rake (10.4.2)
44
44
  rdoc (3.12.2)
45
45
  json (~> 1.4)
46
46
  rspec (2.8.0)
@@ -51,7 +51,7 @@ GEM
51
51
  rspec-expectations (2.8.0)
52
52
  diff-lcs (~> 1.1.2)
53
53
  rspec-mocks (2.8.0)
54
- string-cases (0.0.0)
54
+ string-cases (0.0.1)
55
55
  tretry (0.0.2)
56
56
 
57
57
  PLATFORMS
@@ -59,9 +59,12 @@ PLATFORMS
59
59
 
60
60
  DEPENDENCIES
61
61
  bundler (>= 1.0.0)
62
- http2 (~> 0.0.25)
62
+ http2 (~> 0.0.31)
63
63
  jeweler (~> 1.8.4)
64
64
  rdoc (~> 3.12)
65
65
  rspec (~> 2.8.0)
66
66
  string-cases
67
67
  tretry (= 0.0.2)
68
+
69
+ BUNDLED WITH
70
+ 1.10.5
data/README.md CHANGED
@@ -98,6 +98,20 @@ aos.subscribers do |sub|
98
98
  end
99
99
  ```
100
100
 
101
+ ### Bundle various field names in same request (which means they are already preloaded and won't cause an extra request each time you ask for the fields)
102
+ ```ruby
103
+ aos.subscribers(field_names: ["MyData1", "MyData2"]) do |sub|
104
+ # do something
105
+ end
106
+ ```
107
+
108
+ ### Bundle all data in same request
109
+ ```ruby
110
+ aos.subscribers(all_demographics: true) do |sub|
111
+ # do something
112
+ end
113
+ ```
114
+
101
115
  ### Get sendings
102
116
  ```ruby
103
117
  date_from = Date.new(2014, 6, 17)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.0.13
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: apsis-on-steroids 0.0.12 ruby lib
5
+ # stub: apsis-on-steroids 0.0.13 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "apsis-on-steroids"
9
- s.version = "0.0.12"
9
+ s.version = "0.0.13"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["kaspernj"]
14
- s.date = "2014-11-21"
14
+ s.date = "2015-09-10"
15
15
  s.description = "A Ruby API for the Apsis mail service. "
16
16
  s.email = "k@spernj.org"
17
17
  s.extra_rdoc_files = [
@@ -50,7 +50,7 @@ Gem::Specification.new do |s|
50
50
  s.specification_version = 4
51
51
 
52
52
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
- s.add_runtime_dependency(%q<http2>, ["~> 0.0.25"])
53
+ s.add_runtime_dependency(%q<http2>, ["~> 0.0.31"])
54
54
  s.add_runtime_dependency(%q<string-cases>, [">= 0"])
55
55
  s.add_runtime_dependency(%q<tretry>, ["= 0.0.2"])
56
56
  s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
58
58
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
59
59
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
60
60
  else
61
- s.add_dependency(%q<http2>, ["~> 0.0.25"])
61
+ s.add_dependency(%q<http2>, ["~> 0.0.31"])
62
62
  s.add_dependency(%q<string-cases>, [">= 0"])
63
63
  s.add_dependency(%q<tretry>, ["= 0.0.2"])
64
64
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
@@ -67,7 +67,7 @@ Gem::Specification.new do |s|
67
67
  s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
68
68
  end
69
69
  else
70
- s.add_dependency(%q<http2>, ["~> 0.0.25"])
70
+ s.add_dependency(%q<http2>, ["~> 0.0.31"])
71
71
  s.add_dependency(%q<string-cases>, [">= 0"])
72
72
  s.add_dependency(%q<tretry>, ["= 0.0.2"])
73
73
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
@@ -28,17 +28,33 @@ class ApsisOnSteroids::MailingList < ApsisOnSteroids::SubBase
28
28
  data_subscribers
29
29
  end
30
30
 
31
+ SUBSCRIBERS_VALID_ARGS = [:all_demographics, :timeout, :field_names, :allow_paginated]
32
+
31
33
  # Returns the subscribers of the mailing list.
32
- def subscribers
34
+ def subscribers(args = {}, &blk)
35
+ args.each do |key, value|
36
+ raise "Invalid argument: '#{key}'." unless SUBSCRIBERS_VALID_ARGS.include?(key)
37
+ end
38
+
39
+ all_demographics = args.key?(:all_demographics) ? args[:all_demographics] : false
40
+ timeout = args[:timeout] || 300
41
+ field_names = args[:field_names] || []
42
+ allow_paginated = args.key?(:allow_paginated) ? args[:allow_paginated] : true
43
+
44
+ # Abort and do paginated if no reason to get everything as JSON.
45
+ if allow_paginated && !all_demographics && field_names.empty?
46
+ return subscribers_paginated(&blk)
47
+ end
48
+
33
49
  res = aos.req_json("v1/mailinglists/#{data(:id)}/subscribers/all", :post, json: {
34
- "AllDemographics" => false,
35
- "FieldNames" => []
50
+ "AllDemographics" => all_demographics,
51
+ "FieldNames" => field_names
36
52
  })
37
53
 
38
54
  url = URI.parse(res["Result"]["PollURL"])
39
55
  data_subscribers = nil
40
56
 
41
- Timeout.timeout(300) do
57
+ Timeout.timeout(timeout) do
42
58
  loop do
43
59
  sleep 1
44
60
  res = aos.req_json(url.path)
@@ -62,6 +78,31 @@ class ApsisOnSteroids::MailingList < ApsisOnSteroids::SubBase
62
78
  data: aos.parse_obj(sub_data)
63
79
  )
64
80
 
81
+ if all_demographics || !field_names.empty?
82
+ sub.instance_variable_set(:@dem_data_fields, sub_data["DemographicData"])
83
+ end
84
+
85
+ if blk
86
+ blk.call(sub)
87
+ else
88
+ ret << sub
89
+ end
90
+ end
91
+
92
+ return ret
93
+ end
94
+
95
+ # Returns the subscribers of the mailing list.
96
+ def subscribers_paginated
97
+ resource_url = "v1/mailinglists/#{data(:id)}/subscribers/%{page}/%{size}"
98
+
99
+ ret = []
100
+ aos.read_paginated_response(resource_url) do |sub_data|
101
+ sub = ApsisOnSteroids::Subscriber.new(
102
+ aos: self.aos,
103
+ data: aos.parse_obj(sub_data)
104
+ )
105
+
65
106
  if block_given?
66
107
  yield sub
67
108
  else
@@ -1,3 +1,2 @@
1
1
  class ApsisOnSteroids::Open < ApsisOnSteroids::SubBase
2
-
3
2
  end
@@ -1,3 +1,2 @@
1
1
  class ApsisOnSteroids::OptOut < ApsisOnSteroids::SubBase
2
-
3
2
  end
@@ -1,17 +1,17 @@
1
1
  class ApsisOnSteroids::Sending < ApsisOnSteroids::SubBase
2
- def clicks args = {}
2
+ def clicks(args = {})
3
3
  list_for("v1/clicks/sendqueues/%{send_queue_id}/page/%{page}/size/%{size}", "v1/sendqueues/%{send_queue_id}/clicks", "Click", args)
4
4
  end
5
5
 
6
- def opens args = {}
6
+ def opens(args = {})
7
7
  list_for("v1/opens/sendqueues/%{send_queue_id}/page/%{page}/size/%{size}", "v1/sendqueues/%{send_queue_id}/opens", "Open", args)
8
8
  end
9
9
 
10
- def bounces args = {}
10
+ def bounces(args = {})
11
11
  list_for("v1/bounces/sendqueues/%{send_queue_id}/page/%{page}/size/%{size}", "v1/sendqueues/%{send_queue_id}/bounces", "Bounce", args)
12
12
  end
13
13
 
14
- def opt_outs args = {}
14
+ def opt_outs(args = {})
15
15
  list_for("v1/optouts/sendqueues/%{send_queue_id}/%{page}/%{size}", "v1/sendqueues/%{send_queue_id}/optouts", "OptOut", args)
16
16
  end
17
17
 
@@ -26,7 +26,7 @@ class ApsisOnSteroids::Sending < ApsisOnSteroids::SubBase
26
26
 
27
27
  private
28
28
 
29
- def list_for_with_dates resource_url, resource_name, args
29
+ def list_for_with_dates(resource_url, resource_name, args)
30
30
  resource_url = resource_url.gsub("%{send_queue_id}", data(:send_queue_id).to_s)
31
31
 
32
32
  ub = aos.new_url_builder
@@ -48,7 +48,7 @@ private
48
48
  end
49
49
  end
50
50
 
51
- def list_for resource_url, resource_url_with_dates, resource_name, args = {}
51
+ def list_for(resource_url, resource_url_with_dates, resource_name, args = {})
52
52
  # OptOut counting does not work :-( We will have to do the date request to fix this...
53
53
  # If date-arguments are given, we will have to use the date request.
54
54
  if args[:date_from] || args[:date_to] || resource_name == "OptOut"
@@ -1,7 +1,7 @@
1
1
  class ApsisOnSteroids::Subscriber < ApsisOnSteroids::SubBase
2
2
  # Fetches the details from the server and returns them.
3
3
  def details
4
- if !@details
4
+ unless @details
5
5
  res = aos.req_json("v1/subscribers/id/#{data(:id)}")
6
6
 
7
7
  ret = {}
@@ -19,18 +19,19 @@ class ApsisOnSteroids::Subscriber < ApsisOnSteroids::SubBase
19
19
  def dem_data(key)
20
20
  key = key.to_s.downcase
21
21
 
22
- self.details[:DemDataFields].each do |dem_data|
23
- if dem_data["Key"].to_s.downcase == key
24
- return dem_data["Value"]
25
- end
22
+ dem_data_fields.each do |dem_data|
23
+ return dem_data["Value"] if dem_data["Key"].to_s.downcase == key
26
24
  end
27
25
 
28
26
  return nil
29
27
  end
30
28
 
29
+ def dem_data_fields
30
+ @dem_data_fields ||= details[:DemDataFields]
31
+ end
32
+
31
33
  # Returns true if the subscriber is active.
32
34
  def active?
33
- details = self.details
34
35
  return false if details[:pending]
35
36
  return true
36
37
  end
@@ -191,6 +191,27 @@ class ApsisOnSteroids
191
191
  end
192
192
  end
193
193
 
194
+ def read_paginated_response(resource_url)
195
+ page = 1
196
+ resource_url = resource_url.gsub("%{size}", "1000")
197
+
198
+ loop do
199
+ resource_url_to_use = resource_url.gsub("%{page}", page.to_s)
200
+ result = req_json(resource_url_to_use)
201
+
202
+ result["Result"]["Items"].each do |resource_data|
203
+ yield resource_data
204
+ end
205
+
206
+ size_no = result["Result"]["TotalPages"]
207
+ if page >= size_no
208
+ break
209
+ else
210
+ page += 1
211
+ end
212
+ end
213
+ end
214
+
194
215
  def parse_obj(obj)
195
216
  if obj.is_a?(Array)
196
217
  ret = []
@@ -231,6 +252,7 @@ private
231
252
  host: "se.api.anpdm.com",
232
253
  port: 8443,
233
254
  ssl: true,
255
+ ssl_skip_verify: true,
234
256
  follow_redirects: false,
235
257
  debug: @args[:debug],
236
258
  extra_headers: {
@@ -240,7 +262,8 @@ private
240
262
  user: @args[:api_key],
241
263
  passwd: ""
242
264
  },
243
- skip_port_in_host_header: true
265
+ skip_port_in_host_header: true,
266
+ raise_errors: false
244
267
  )
245
268
  end
246
269
  end
@@ -33,6 +33,8 @@ describe "ApsisOnSteroids" do
33
33
  end
34
34
 
35
35
  it "#sendings_by_date_interval" do
36
+ require 'date'
37
+
36
38
  date_from = Date.new(2013, 4, 1)
37
39
  date_to = Date.new(2013, 6, 2)
38
40
 
@@ -110,12 +112,47 @@ describe "ApsisOnSteroids" do
110
112
  original_sub = sub
111
113
 
112
114
  count = 0
113
- mlist.subscribers do |sub_i|
115
+ mlist.subscribers(allow_paginated: false) do |sub_i|
114
116
  count += 1
115
117
  #puts "Subscriber: #{sub_i}"
116
118
  end
117
119
 
118
- raise "Expected more than one." if count < 1
120
+ count.should > 0
121
+ end
122
+
123
+ it "should include demographics data when set" do
124
+ original_sub = sub
125
+
126
+ count = 0
127
+ mlist.subscribers(all_demographics: true) do |sub_i|
128
+ count += 1
129
+ sub_i.instance_variable_get(:@dem_data_fields).should_not eq nil
130
+ end
131
+
132
+ count.should > 0
133
+ end
134
+
135
+ it "should include optional fields as demographic data when set" do
136
+ original_sub = sub
137
+
138
+ count = 0
139
+ mlist.subscribers(field_names: ["NaoshiID"]) do |sub_i|
140
+ count += 1
141
+ sub_i.instance_variable_get(:@dem_data_fields).should eq [{"Key" => "NaoshiID", "Value" => ""}]
142
+ end
143
+
144
+ count.should > 0
145
+ end
146
+
147
+ it "should get subscribers paginated" do
148
+ original_sub = sub
149
+
150
+ count = 0
151
+ mlist.subscribers_paginated do |sub_i|
152
+ count += 1
153
+ end
154
+
155
+ count.should > 0
119
156
  end
120
157
 
121
158
  it "can remove subscribers from lists" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apsis-on-steroids
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaspernj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-21 00:00:00.000000000 Z
11
+ date: 2015-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http2
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.25
19
+ version: 0.0.31
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.0.25
26
+ version: 0.0.31
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: string-cases
29
29
  requirement: !ruby/object:Gem::Requirement