emarsys 0.2.1 → 0.2.2
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 +4 -4
- data/README.md +9 -0
- data/lib/emarsys/data_objects/contact.rb +13 -7
- data/lib/emarsys/data_objects/email.rb +27 -3
- data/lib/emarsys/data_objects/export.rb +15 -0
- data/lib/emarsys/params_converter.rb +20 -5
- data/lib/emarsys/response.rb +9 -4
- data/lib/emarsys/version.rb +1 -1
- data/spec/emarsys/data_objects/contact_spec.rb +12 -0
- data/spec/emarsys/data_objects/export_spec.rb +8 -0
- data/spec/emarsys/response_spec.rb +43 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc2e05dfded9bc3e85a484b0a100dd0bbee2c4c3
|
4
|
+
data.tar.gz: c6a286becd3fb612d9e379f794430e5f8fa6740c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a27a34fa7afd4d4e182dfa6e6d8948490f8d095cacca5c3fc018d1a45c699588e91ee75fe193ac395c88654f7876e23f73e9df3c0412150d2c5dce05c26556dd
|
7
|
+
data.tar.gz: c344e9354da2b659f2edb4243d9b5e8a8abce6a124b4b83886bd4ac210cfe2ae564038ef62e639d549529f38ce4988342dc5e414cd0091694d163e5f1314dd4d
|
data/README.md
CHANGED
@@ -208,6 +208,15 @@ Please refer to the code for detailed instructions of each method.
|
|
208
208
|
|
209
209
|
### HEAD (not yet released)
|
210
210
|
|
211
|
+
### v0.2.2
|
212
|
+
|
213
|
+
* Allow batch updates to create missing contacts ([#22](https://github.com/Absolventa/emarsys-rb/pull/22))
|
214
|
+
* Add support for the data export API ([#23]((https://github.com/Absolventa/emarsys-rb/pull/23))
|
215
|
+
|
216
|
+
### v0.2.1
|
217
|
+
|
218
|
+
* Added basic support for rate-limiting response from Emarsys API ([#21](https://github.com/Absolventa/emarsys-rb/pull/21))
|
219
|
+
|
211
220
|
### v0.2.0
|
212
221
|
* Added country mapping ([#17](https://github.com/Absolventa/emarsys-rb/pull/17))
|
213
222
|
* Proper encoding of GET parameters ([#11](https://github.com/Absolventa/emarsys-rb/pull/11))
|
@@ -38,13 +38,15 @@ module Emarsys
|
|
38
38
|
# @param key_id [Integer, String] internal id of key field
|
39
39
|
# @param key_value [Integer, String] value of interal id field
|
40
40
|
# @param params [Hash] Contact information to update
|
41
|
+
# @param create_if_not_exists [Boolean] Whether to create contact if it does not exist
|
41
42
|
# @return [Hash] internal id of the contact
|
42
43
|
# @example
|
43
44
|
# Emarsys::Contact.update('app_id', 23, {:firstname => "Jon", :lastname => "Doe"})
|
44
|
-
# Emarsys::Contact.update('3', 'john.doe@example.com', {'1' => "Jon", '2' => "Doe"})
|
45
|
-
def update(key_id, key_value, params = {})
|
45
|
+
# Emarsys::Contact.update('3', 'john.doe@example.com', {'1' => "Jon", '2' => "Doe"}, true)
|
46
|
+
def update(key_id, key_value, params = {}, create_if_not_exists = false)
|
47
|
+
path = "contact#{create_if_not_exists ? '/?create_if_not_exists=1' : ''}"
|
46
48
|
transformed_key_id = transform_key_id(key_id)
|
47
|
-
put
|
49
|
+
put path, params.merge!({'key_id' => transformed_key_id, transformed_key_id => key_value})
|
48
50
|
end
|
49
51
|
|
50
52
|
# Batch creation of contacts.
|
@@ -66,15 +68,19 @@ module Emarsys
|
|
66
68
|
#
|
67
69
|
# @param key_id [Integer, String] internal id of key field
|
68
70
|
# @param params [Hash] Contact information of each new contact
|
71
|
+
# @param create_if_not_exists [Boolean] Whether to create non-existing contacts
|
69
72
|
# @example
|
70
73
|
# Emarsys::Contact.update_batch(
|
71
|
-
# 'email',
|
72
|
-
#
|
74
|
+
# 'email',
|
75
|
+
# [{:email => "john@example.com", :firstname => "Jon", :lastname => "Doe"},
|
76
|
+
# {:email => "jane@example.com", :firstname => "Jane", :lastname => "Doe"}],
|
77
|
+
# true
|
73
78
|
# )
|
74
79
|
#
|
75
80
|
# TODO params should be parameterized with field mappings
|
76
|
-
def update_batch(key_id, params = [])
|
77
|
-
|
81
|
+
def update_batch(key_id, params = [], create_if_not_exists = false)
|
82
|
+
path = "contact#{create_if_not_exists ? '/?create_if_not_exists=1' : ''}"
|
83
|
+
put path, {'key_id' => transform_key_id(key_id), 'contacts' => params}
|
78
84
|
end
|
79
85
|
|
80
86
|
# Get list of emails send to a contact
|
@@ -125,9 +125,33 @@ module Emarsys
|
|
125
125
|
raise "Not implemented yet"
|
126
126
|
end
|
127
127
|
|
128
|
-
#
|
129
|
-
|
130
|
-
|
128
|
+
# Exports the selected fields of all contacts who responded to emails
|
129
|
+
# within the specified time range.
|
130
|
+
#
|
131
|
+
# @param distribution_method [String] ftp or local
|
132
|
+
# @param time_range [array] Array with two elements (start date, end date)
|
133
|
+
# @param contact_fields [array] Array of contact field IDs
|
134
|
+
# @param sources [array] Array which defines sources
|
135
|
+
# @param analysis_fields [array] Array that defines the contact behaviours to analyse
|
136
|
+
# @option params [hash]
|
137
|
+
# @return [Hash] Result data
|
138
|
+
# @example
|
139
|
+
# Emarsys::Email.export_responses(
|
140
|
+
# 'local',
|
141
|
+
# ['2012-02-09', '2014-08-13'],
|
142
|
+
# [1, 3],
|
143
|
+
# ['trackable_links'],
|
144
|
+
# [5, 8, 13]
|
145
|
+
# )
|
146
|
+
def export_responses(distribution_method, time_range, contact_fields, sources, analysis_fields, params = {})
|
147
|
+
params.merge!(
|
148
|
+
:distribution_method => distribution_method,
|
149
|
+
:time_range => time_range,
|
150
|
+
:contact_fields => Emarsys::ParamsConverter.new(contact_fields).convert_to_ids,
|
151
|
+
:sources => sources,
|
152
|
+
:analysis_fields => analysis_fields
|
153
|
+
)
|
154
|
+
post "email/getresponses", params
|
131
155
|
end
|
132
156
|
end
|
133
157
|
end
|
@@ -16,6 +16,21 @@ module Emarsys
|
|
16
16
|
def resource(id)
|
17
17
|
get "export/#{id}", {}
|
18
18
|
end
|
19
|
+
|
20
|
+
# Download export data
|
21
|
+
#
|
22
|
+
# @param id [Integer, String] The internal emarsys id
|
23
|
+
# @option offset [Integer] Defines the ID to start listing from
|
24
|
+
# @option limit [Integer] Defines how many IDs are listed
|
25
|
+
# @return [String] text/csv
|
26
|
+
# @example
|
27
|
+
# Emarsys::Export.data(2)
|
28
|
+
def data(id, offset = nil, limit = nil)
|
29
|
+
params = {}
|
30
|
+
params.merge!(:offset => offset) if offset
|
31
|
+
params.merge!(:limit => limit) if limit
|
32
|
+
get "export/#{id}/data", params
|
33
|
+
end
|
19
34
|
end
|
20
35
|
|
21
36
|
end
|
@@ -9,22 +9,37 @@ module Emarsys
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def convert_to_ids
|
12
|
+
params.is_a?(Hash) ? convert_hash_to_ids : convert_array_to_ids
|
13
|
+
end
|
14
|
+
|
15
|
+
def convert_to_identifiers
|
12
16
|
new_hash = {}
|
13
17
|
params.each do |key, value|
|
14
|
-
matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:
|
15
|
-
new_hash.merge!({ (matching_attributes.nil? ? key : matching_attributes[:
|
18
|
+
matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:id] == key.to_i && key.to_i != 0}
|
19
|
+
new_hash.merge!({ (matching_attributes.nil? ? key : matching_attributes[:identifier]) => value })
|
16
20
|
end
|
17
21
|
new_hash
|
18
22
|
end
|
19
23
|
|
20
|
-
|
24
|
+
private
|
25
|
+
|
26
|
+
def convert_hash_to_ids
|
21
27
|
new_hash = {}
|
22
28
|
params.each do |key, value|
|
23
|
-
matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:
|
24
|
-
new_hash.merge!({ (matching_attributes.nil? ? key : matching_attributes[:
|
29
|
+
matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:identifier] == key.to_s}
|
30
|
+
new_hash.merge!({ (matching_attributes.nil? ? key : matching_attributes[:id]) => value })
|
25
31
|
end
|
26
32
|
new_hash
|
27
33
|
end
|
28
34
|
|
35
|
+
def convert_array_to_ids
|
36
|
+
new_array = []
|
37
|
+
params.each do |key|
|
38
|
+
matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:identifier] == key.to_s}
|
39
|
+
new_array << (matching_attributes.nil? ? key : matching_attributes[:id])
|
40
|
+
end
|
41
|
+
new_array
|
42
|
+
end
|
43
|
+
|
29
44
|
end
|
30
45
|
end
|
data/lib/emarsys/response.rb
CHANGED
@@ -4,10 +4,15 @@ module Emarsys
|
|
4
4
|
attr_accessor :code, :text, :data, :status
|
5
5
|
|
6
6
|
def initialize(response)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
if response.headers[:content_type] == 'text/csv'
|
8
|
+
self.code = 0
|
9
|
+
self.data = response.body
|
10
|
+
else
|
11
|
+
json = JSON.parse(response)
|
12
|
+
self.code = json['replyCode']
|
13
|
+
self.text = json['replyText']
|
14
|
+
self.data = json['data']
|
15
|
+
end
|
11
16
|
self.status = response.code if response.respond_to?(:code)
|
12
17
|
end
|
13
18
|
|
data/lib/emarsys/version.rb
CHANGED
@@ -25,6 +25,12 @@ describe Emarsys::Contact do
|
|
25
25
|
Emarsys::Contact.update(3, 'jane.doe@example.com', stub_params)
|
26
26
|
expect(stub).to have_been_requested.once
|
27
27
|
end
|
28
|
+
it "may create non-existing contact" do
|
29
|
+
stub_params = {1 => 'Jane', 2 => "Doe"}
|
30
|
+
stub = stub_request(:put, "https://api.emarsys.net/api/v2/contact/?create_if_not_exists=1").with(:body => stub_params.merge!({'key_id' => 3, 3 => 'jane.doe@example.com'}).to_json).to_return(standard_return_body)
|
31
|
+
Emarsys::Contact.update(3, 'jane.doe@example.com', stub_params, true)
|
32
|
+
expect(stub).to have_been_requested.once
|
33
|
+
end
|
28
34
|
end
|
29
35
|
|
30
36
|
describe ".create_batch" do
|
@@ -43,6 +49,12 @@ describe Emarsys::Contact do
|
|
43
49
|
Emarsys::Contact.update_batch(3, stub_params)
|
44
50
|
expect(stub).to have_been_requested.once
|
45
51
|
end
|
52
|
+
it "may create non-existing contacts" do
|
53
|
+
stub_params = [{1 => 'Jane', 2 => "Doe"}, {1 => 'Paul', 2 => 'Tester'}]
|
54
|
+
stub = stub_request(:put, "https://api.emarsys.net/api/v2/contact/?create_if_not_exists=1").with(:body => {'key_id' => 3, 'contacts' => stub_params}.to_json).to_return(standard_return_body)
|
55
|
+
Emarsys::Contact.update_batch(3, stub_params, true)
|
56
|
+
expect(stub).to have_been_requested.once
|
57
|
+
end
|
46
58
|
end
|
47
59
|
|
48
60
|
describe ".contact_history" do
|
@@ -2,18 +2,54 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Emarsys::Response do
|
4
4
|
|
5
|
+
class FakeResponse
|
6
|
+
attr_accessor :body
|
7
|
+
|
8
|
+
def initialize(body)
|
9
|
+
self.body = body
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_str
|
13
|
+
body
|
14
|
+
end
|
15
|
+
|
16
|
+
module JSON
|
17
|
+
# Value taken from an actual response from Emarsys
|
18
|
+
def headers
|
19
|
+
{:content_type => 'text/html; charset=utf-8'}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module CSV
|
24
|
+
def headers
|
25
|
+
{:content_type => 'text/csv'}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
5
30
|
describe '#initialize' do
|
6
|
-
|
7
|
-
response_string
|
8
|
-
response
|
9
|
-
|
10
|
-
|
11
|
-
|
31
|
+
context "json" do
|
32
|
+
let(:response_string) { "{\"replyCode\":0,\"replyText\":\"Something\",\"data\":1}" }
|
33
|
+
let(:response) { Emarsys::Response.new(FakeResponse.new(response_string).extend(FakeResponse::JSON)) }
|
34
|
+
it 'sets code, text and data attributes on initialize' do
|
35
|
+
expect(response.code).to eq(0)
|
36
|
+
expect(response.text).to eq("Something")
|
37
|
+
expect(response.data).to eq(1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context "csv" do
|
41
|
+
let(:response_string) { "user_id,Vorname,E-Mail,Version Name,Url,Zeit\r\n" }
|
42
|
+
let(:response) { Emarsys::Response.new(FakeResponse.new(response_string).extend(FakeResponse::CSV)) }
|
43
|
+
it 'sets code and data attributes on initialize' do
|
44
|
+
expect(response.code).to eq(0)
|
45
|
+
expect(response.data).to eq("user_id,Vorname,E-Mail,Version Name,Url,Zeit\r\n")
|
46
|
+
end
|
12
47
|
end
|
13
48
|
end
|
14
49
|
|
15
50
|
describe '#result' do
|
16
|
-
let(:
|
51
|
+
let(:response_string) { "{\"replyCode\":0,\"replyText\":\"Something\",\"data\":1}" }
|
52
|
+
let(:response) { Emarsys::Response.new(FakeResponse.new(response_string).extend(FakeResponse::JSON)) }
|
17
53
|
|
18
54
|
it "returns data if code is 0" do
|
19
55
|
allow(response).to receive(:code).and_return(0)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: emarsys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schoppmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|