bronto 0.1.4 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c681496d7016c12c58c845bb6ab4015023cadb5e
4
- data.tar.gz: a8fcc747ccf3adb5be9eca0b9702c4cfeedf9e3c
3
+ metadata.gz: b01f64270c336075cec3e434fd8a71380e5bc112
4
+ data.tar.gz: d5d1df226d643bb5f584656ef7dd07e6db02243e
5
5
  SHA512:
6
- metadata.gz: 3463350ab61e037b53800d411241fa52613729381a5d69ad4e4858aa296fd9d237765120fe7436d05febb80ba1a440f87e640c6cfbb2bc01e035fe474d3436dd
7
- data.tar.gz: cbdb62c5c2374f8fee881c15e834515afa5ce15f64c88eac6189b6ce4ccc907f925370af7b3487fe701fa8598510f3691d06bdd298af966fbcfdc1e2828130b0
6
+ metadata.gz: 435c05d68a57d9373f7f508bba5cb89a48fe955642c2b333ba3b5f4ee22a882fd3e96dcc04949a88c8f49e27b6c3c51ded734dc3ef50ec414863ccbabef7a9e2
7
+ data.tar.gz: f2101130f91052286675ba0003180a18f7f55f0861b693dc1d3e595eeb1ff173128e356d355667b05f1174a68ad8b64eb501c05a4192af43fb16560d17c6bac3
data/README.md CHANGED
@@ -61,17 +61,21 @@ Let's setup some contacts, add them to a list, and then send them a message.
61
61
 
62
62
  4. Create a new message and add content:
63
63
 
64
+ ```
64
65
  message = Bronto::Message.new(name: "Test Message")
65
66
  message.add_content("html", "HTML Subject", "HTML Content")
66
67
  message.add_content("text", "Text Subject", "Text Content")
67
68
  message.save
69
+ ```
68
70
 
69
71
  5. Create a new delivery with a message and recipients and send it ASAP:
70
72
 
73
+ ```
71
74
  delivery = Bronto::Delivery.new(start: Time.now, type: "normal", from_name: "Test", from_email: "test@example.com")
72
75
  delivery.message_id = message.id
73
76
  delivery.add_recipient(list)
74
77
  delivery.save
78
+ ```
75
79
 
76
80
  ## Contributing
77
81
 
@@ -15,9 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Bronto::VERSION
17
17
 
18
- gem.add_dependency "savon", '1.2.0'
18
+ gem.add_dependency "savon"
19
19
 
20
- gem.add_development_dependency "debugger"
20
+ gem.add_development_dependency "byebug"
21
21
  gem.add_development_dependency "turn"
22
22
  gem.add_development_dependency "shoulda"
23
23
 
@@ -1,17 +1,17 @@
1
1
  require "savon"
2
2
 
3
- require "bronto/base"
4
- require "bronto/contact"
5
- require "bronto/delivery"
6
- require "bronto/field"
7
- require "bronto/filter"
8
- require "bronto/list"
9
- require "bronto/message"
10
- require "bronto/version"
11
-
12
- require "core_ext/array"
13
- require "core_ext/object"
14
- require "core_ext/string"
3
+ require_relative "bronto/base"
4
+ require_relative "bronto/contact"
5
+ require_relative "bronto/delivery"
6
+ require_relative "bronto/field"
7
+ require_relative "bronto/filter"
8
+ require_relative "bronto/list"
9
+ require_relative "bronto/message"
10
+ require_relative "bronto/version"
11
+
12
+ require_relative "core_ext/array"
13
+ require_relative "core_ext/object"
14
+ require_relative "core_ext/string"
15
15
 
16
16
  module Bronto
17
17
  class Error < StandardError
@@ -2,7 +2,7 @@ module Bronto
2
2
 
3
3
  # According to Bronto's API documentation, the session credential returned by the
4
4
  # login() API call remains active for 20 minutes. In addition, the expiration time
5
- # is reset after each successful use. We will trigger a refresh before 20 minutes
5
+ # is reset after each successful use. We will trigger a refresh before 20 minutes
6
6
  # to be on the safe side
7
7
  SESSION_REUSE_SECONDS = 120
8
8
 
@@ -26,60 +26,39 @@ module Bronto
26
26
  end
27
27
 
28
28
  # The primary method used to interface with the SOAP API.
29
- # This method automatically adds the required session header and returns the actual response section of the SOAP response body.
30
29
  #
31
30
  # If a symbol is passed in, it is converted to "method_plural_class_name" (e.g., :read => read_lists). A string
32
31
  # method is used as-is.
33
- # Pass in a block and assign a hash to soap.body with a structure appropriate to the method call.
34
- def self.request(method, api_key = nil, refresh_header = false, &_block)
35
- _soap_header = self.soap_header(api_key, refresh_header)
32
+ # The message is a hash and becomes the body of the SOAP request
33
+ def self.request(method, message = {})
36
34
  api_key = api_key || self.api_key
37
35
 
38
36
  method = "#{method}_#{plural_class_name}" if method.is_a? Symbol
39
37
 
40
- resp = api.request(:v4, method.to_sym) do
41
- soap.header = _soap_header
42
- instance_eval(&_block) if _block # See Savon::Client#evaluate; necessary to preserve scope.
43
- end
38
+ resp = api(api_key).call(method.to_sym, message: message)
44
39
 
45
40
  @last_used = Time.now
46
41
 
47
42
  resp.body["#{method}_response".to_sym]
48
43
  end
49
44
 
50
- # Sets up the Savon SOAP client object (if necessary) and returns it.
51
- def self.api
52
- return @api unless @api.nil?
53
-
54
- @api = Savon::Client.new do
55
- wsdl.endpoint = "https://api.bronto.com/v4"
56
- wsdl.namespace = "http://api.bronto.com/v4"
57
- end
58
-
59
- # Give Bronto up to 10 minutes to reply
60
- @api.http.read_timeout = 600
61
-
62
- @api
63
- end
64
-
65
- # Helper method to retrieve the session ID and return a SOAP header.
66
- # Will return a header with the same initial session ID unless the `refresh`
67
- # argument is `true`.
68
- def self.soap_header(api_key, refresh = false)
69
- return @soap_header if !refresh and @soap_header.present? and !session_expired
45
+ # Sets up the Savon SOAP client object, including sessionHeaders and returns the client.
46
+ def self.api(api_key, refresh = false)
47
+ return @api unless refresh || session_expired || @api.nil?
70
48
 
71
- resp = api.request(:v4, :login) do
72
- soap.body = { api_token: api_key }
73
- end
49
+ client = Savon.client(wsdl: 'https://api.bronto.com/v4?wsdl')
50
+ resp = client.call(:login, message: { api_token: api_key })
74
51
 
75
- @last_used = Time.now
76
- @soap_header = { "v4:sessionHeader" => { session_id: resp.body[:login_response][:return] } }
52
+ @api = Savon.client(wsdl: 'https://api.bronto.com/v4?wsdl', soap_header: {
53
+ "tns:sessionHeader" => { session_id: resp.body[:login_response][:return] }
54
+ },
55
+ read_timeout: 600) # Give Bronto up to 10 minutes to reply
77
56
  end
78
57
 
79
58
  # returns true if a cached session identifier is missing or is too old
80
59
  def self.session_expired
81
60
  return true if (@last_used == nil)
82
- return true if (Time.now.tv_sec - @last_used.tv_sec > SESSION_REUSE_SECONDS)
61
+ return true if (Time.now.tv_sec - @last_used.tv_sec > SESSION_REUSE_SECONDS)
83
62
 
84
63
  false
85
64
  end
@@ -104,9 +83,7 @@ module Bronto
104
83
  def self.find(filter = Bronto::Filter.new, page_number = 1, api_key = nil)
105
84
  api_key = api_key || self.api_key
106
85
 
107
- resp = request(:read, api_key) do
108
- soap.body = { filter: filter.to_hash, page_number: page_number }
109
- end
86
+ resp = request(:read, { filter: filter.to_hash, page_number: page_number })
110
87
 
111
88
  Array.wrap(resp[:return]).map { |hash| new(hash) }
112
89
  end
@@ -121,11 +98,7 @@ module Bronto
121
98
  objs = objs.flatten
122
99
  api_key = objs.first.is_a?(String) ? objs.shift : self.api_key
123
100
 
124
- resp = request(:add, api_key) do
125
- soap.body = {
126
- plural_class_name => objs.map(&:to_hash)
127
- }
128
- end
101
+ resp = request(:add, {plural_class_name => objs.map(&:to_hash)})
129
102
 
130
103
  objs.each { |o| o.errors.clear }
131
104
 
@@ -147,11 +120,7 @@ module Bronto
147
120
  objs = objs.flatten
148
121
  api_key = objs.first.is_a?(String) ? objs.shift : self.api_key
149
122
 
150
- resp = request(:update, api_key) do
151
- soap.body = {
152
- plural_class_name => objs.map(&:to_hash)
153
- }
154
- end
123
+ resp = request(:update, {plural_class_name => objs.map(&:to_hash)})
155
124
 
156
125
  objs.each { |o| o.errors.clear }
157
126
  objs
@@ -167,11 +136,7 @@ module Bronto
167
136
  objs = objs.flatten
168
137
  api_key = objs.first.is_a?(String) ? objs.shift : self.api_key
169
138
 
170
- resp = request(:delete, api_key) do
171
- soap.body = {
172
- plural_class_name => objs.map { |o| { id: o.id }}
173
- }
174
- end
139
+ resp = request(:delete, {plural_class_name => objs.map { |o| { id: o.id }}})
175
140
 
176
141
  Array.wrap(resp[:return][:results]).each_with_index do |result, i|
177
142
  if result[:is_error]
@@ -197,8 +162,8 @@ module Bronto
197
162
  end
198
163
 
199
164
  # Convenience instance method that calls the class `request` method.
200
- def request(method, &block)
201
- self.class.request(method, self.api_key, false, &block)
165
+ def request(method, message = {})
166
+ self.class.request(method, message)
202
167
  end
203
168
 
204
169
  def reload
@@ -207,9 +172,7 @@ module Bronto
207
172
  # The block below is evaluated in a weird scope so we need to capture self as _self for use inside the block.
208
173
  _self = self
209
174
 
210
- resp = request(:read) do
211
- soap.body = { filter: { id: _self.id } }
212
- end
175
+ resp = request(:read, { filter: { id: _self.id } })
213
176
 
214
177
  resp[:return].each do |k, v|
215
178
  self.send("#{k}=", v) if self.respond_to? "#{k}="
@@ -13,9 +13,7 @@ module Bronto
13
13
  body[:fields] = Array.wrap(fields).map { |f| f.is_a?(Bronto::Field) ? f.id : f } if Array(fields).length > 0
14
14
  body[:include_lists] = include_lists
15
15
 
16
- resp = request(:read, api_key) do
17
- soap.body = body
18
- end
16
+ resp = request(:read, body)
19
17
 
20
18
  Array.wrap(resp[:return]).map { |hash| new(hash) }
21
19
  end
@@ -24,11 +22,7 @@ module Bronto
24
22
  objs = objs.flatten
25
23
  api_key = objs.first.is_a?(String) ? objs.shift : self.api_key
26
24
 
27
- resp = request(:add_or_update, api_key) do
28
- soap.body = {
29
- plural_class_name => objs.map(&:to_hash)
30
- }
31
- end
25
+ resp = request(:add_or_update, {plural_class_name => objs.map(&:to_hash)})
32
26
 
33
27
  objs.each { |o| o.errors.clear }
34
28
 
@@ -13,9 +13,7 @@ module Bronto
13
13
  include_content: include_content }
14
14
  api_key = api_key || self.api_key
15
15
 
16
- resp = request(:read, api_key) do
17
- soap.body = body
18
- end
16
+ resp = request(:read, body)
19
17
 
20
18
  Array.wrap(resp[:return]).map { |hash| new(hash) }
21
19
  end
@@ -27,7 +25,7 @@ module Bronto
27
25
 
28
26
  def to_hash
29
27
  hash = {
30
- id: id, start: start, message_id: message_id, type: type, from_email: from_email, from_name: from_name,
28
+ id: id, start: start, message_id: message_id, from_email: from_email, from_name: from_name,
31
29
  reply_email: reply_email, recipients: recipients, fields: fields, authentication: authentication,
32
30
  reply_tracking: reply_tracking
33
31
  }
@@ -44,7 +42,7 @@ module Bronto
44
42
  [args.first.class.to_s.split("::").last.downcase, args.first.id]
45
43
  end
46
44
 
47
- self.recipients << { type: type, id: id }
45
+ self.recipients << { id: id, type: type }
48
46
  end
49
47
  end
50
48
  end
@@ -7,11 +7,7 @@ module Bronto
7
7
  lists = lists.flatten
8
8
  api_key = lists.first.is_a?(String) ? lists.shift : self.api_key
9
9
 
10
- resp = request(:clear, api_key) do
11
- soap.body = {
12
- list: lists.map { |l| { id: l.id } }
13
- }
14
- end
10
+ resp = request(:clear, {list: lists.map { |l| { id: l.id } }})
15
11
 
16
12
  lists.each { |l| l.reload }
17
13
 
@@ -39,12 +35,7 @@ module Bronto
39
35
  # The block below is evaluated in a weird scope so we need to capture self as _self for use inside the block.
40
36
  _self = self
41
37
 
42
- resp = request("add_to_list") do
43
- soap.body = {
44
- list: { id: _self.id },
45
- contacts: contacts.map { |c| { id: c.id } }
46
- }
47
- end
38
+ resp = request("add_to_list", {list: { id: _self.id }, contacts: contacts.map { |c| { id: c.id } }})
48
39
 
49
40
  errors = Array.wrap(resp[:return][:results]).select { |r| r[:is_error] }
50
41
  errors.each do |error|
@@ -59,15 +50,7 @@ module Bronto
59
50
  return false if !self.id.present?
60
51
  contacts = contacts.flatten
61
52
 
62
- # The block below is evaluated in a weird scope so we need to capture self as _self for use inside the block.
63
- _self = self
64
-
65
- resp = request("remove_from_list") do
66
- soap.body = {
67
- list: _self.to_hash,
68
- contacts: contacts.map(&:to_hash)
69
- }
70
- end
53
+ resp = request("remove_from_list", {list: self.to_hash, contacts: contacts.map(&:to_hash)})
71
54
 
72
55
  Array.wrap(resp[:return][:results]).select { |r| r[:is_error] }.count == 0
73
56
  end
@@ -1,3 +1,3 @@
1
1
  module Bronto
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class ContactTest < Test::Unit::TestCase
4
4
  context "" do
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class DeliveryTest < Test::Unit::TestCase
4
4
  context "" do
@@ -11,9 +11,8 @@ class DeliveryTest < Test::Unit::TestCase
11
11
  @contact = Bronto::Contact.new(email: "#{Time.now.to_i}-#{rand(1000)}@example.com", status: "active")
12
12
  @contact.save
13
13
 
14
- @delivery = Bronto::Delivery.new(start: Time.now, type: "normal", from_name: "Hello", from_email: "test@example.com")
15
- @delivery_2 = Bronto::Delivery.new(start: Time.now + (60 * 60 * 24 * 5), type: "normal", from_name: "Hello",
16
- from_email: "test2@example.com")
14
+ @delivery = Bronto::Delivery.new(start: Time.now.strftime("%Y-%m-%dT%H:%M:%S.%6N%:z"), from_name: "Hello", from_email: "test@example.com")
15
+ @delivery_2 = Bronto::Delivery.new(start: (Time.now + (60 * 60 * 24 * 5)).strftime("%Y-%m-%dT%H:%M:%S.%6N%:z"), from_name: "Hello", from_email: "test2@example.com")
17
16
  end
18
17
 
19
18
  teardown do
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class FieldTest < Test::Unit::TestCase
4
4
  context "" do
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class ListTest < Test::Unit::TestCase
4
4
  context "" do
@@ -88,6 +88,9 @@ class ListTest < Test::Unit::TestCase
88
88
  assert_equal 0, @list.active_count
89
89
 
90
90
  assert @list.add_to_list(contact)
91
+
92
+ sleep(5)
93
+
91
94
  @list.reload
92
95
  assert_equal 1, @list.active_count
93
96
  end
@@ -105,10 +108,14 @@ class ListTest < Test::Unit::TestCase
105
108
  assert_equal 0, contact2.errors.count
106
109
 
107
110
  assert @list.add_to_list(contact, contact2)
111
+
112
+ sleep(5)
113
+
108
114
  @list.reload
109
115
  assert_equal 2, @list.active_count
110
116
 
111
117
  assert @list.remove_from_list(contact)
118
+
112
119
  @list.reload
113
120
  assert_equal 1, @list.active_count
114
121
  end
@@ -125,10 +132,16 @@ class ListTest < Test::Unit::TestCase
125
132
  assert_equal 0, contact2.errors.count
126
133
 
127
134
  assert @list.add_to_list(contact, contact2)
135
+
136
+ sleep(5)
137
+
128
138
  @list.reload
129
139
  assert_equal 2, @list.active_count
130
140
 
131
141
  assert Bronto::List.clear_lists(@list)
142
+
143
+ sleep(5)
144
+
132
145
  @list.reload
133
146
  assert_equal 0, @list.active_count
134
147
  end
@@ -1,4 +1,4 @@
1
- require 'test_helper'
1
+ require_relative 'test_helper'
2
2
 
3
3
  class MessageTest < Test::Unit::TestCase
4
4
  context "" do
@@ -1,20 +1,12 @@
1
- require 'test/unit'
2
1
  require 'turn'
2
+ require 'minitest/autorun'
3
3
  require 'shoulda'
4
4
 
5
- require 'bronto'
5
+ require_relative '../lib/bronto'
6
6
  Bronto::Base.api_key = ""
7
7
 
8
- Savon.configure { |config| config.log = false }
9
-
10
8
  HTTPI.log = false
11
9
 
12
- def log_savon(&block)
13
- Savon.configure { |config| config.log = true }
14
- block.call()
15
- Savon.configure { |config| config.log = false }
16
- end
17
-
18
10
  def reset_all
19
11
  types = [Bronto::Contact, Bronto::Field, Bronto::List, Bronto::Message]
20
12
 
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bronto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Gordon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-01 00:00:00.000000000 Z
11
+ date: 2014-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.2.0
19
+ version: '0'
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: 1.2.0
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: debugger
28
+ name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  version: '0'
118
118
  requirements: []
119
119
  rubyforge_project:
120
- rubygems_version: 2.2.1
120
+ rubygems_version: 2.2.2
121
121
  signing_key:
122
122
  specification_version: 4
123
123
  summary: A Ruby wrapper for the Bronto SOAP API