exact_target_rest 0.1.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 +39 -4
- data/exact_target_rest.gemspec +2 -0
- data/lib/exact_target_rest/authorization.rb +7 -13
- data/lib/exact_target_rest/data_extension.rb +1 -1
- data/lib/exact_target_rest/triggered_send.rb +62 -9
- data/lib/exact_target_rest/version.rb +1 -1
- data/spec/lib/exact_target_rest/authorization_spec.rb +73 -0
- data/spec/lib/exact_target_rest/triggered_send_spec.rb +119 -0
- data/spec/spec_helper.rb +2 -0
- metadata +35 -4
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c619daa30b70dc6807b0e57e95de854633bc4328
|
4
|
+
data.tar.gz: 70f5940d63176afbc6550e3fef3983f081af6913
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9b75e3fa94e08c19ce0f7d673e35fb9ada526ab47069e7286345a68ecaeada3d7ccdc27956855f047e7bbdaf6b78897efa189de35f614cb301cba9f0c3c2864
|
7
|
+
data.tar.gz: a6a468e7313dc448b20888e8f15250fff7a9936947b45a10f2db1b9921d61af277112b827b4219f0551e4d0fbba99d51ece0854b99f606e166d89fbec2928881
|
data/README.md
CHANGED
@@ -34,22 +34,57 @@ auth = ExactTargetRest::Authorization.new(client_id, client_secret)
|
|
34
34
|
|
35
35
|
### TriggeredSend Activation
|
36
36
|
|
37
|
+
There are two ways to use.
|
38
|
+
|
39
|
+
The first calls `send_one` and receives DataExtensions as parameters:
|
40
|
+
|
37
41
|
```ruby
|
38
42
|
external_key = 'My TriggeredSend External Key'
|
39
43
|
ts = ExactTargetRest::TriggeredSend.new(auth, external_key)
|
40
44
|
ts.send_one(email_address: 'uga@kabuga.com', an_attribute: 'XXX', another_attribute: 'YYY')
|
41
45
|
```
|
42
46
|
|
43
|
-
**email_address** is mandatory, any other field will be put in the DataExtension (or List) associated with the TriggeredSend. You can also pass
|
44
|
-
|
45
|
-
All other attributes will be converted to CamelCase (ExactTarget convention) before send. So, "an_attribute" and "another_attribute" would become "AnAttribute" and "AnotherAttribute".
|
47
|
+
**email_address** is mandatory, any other field will be put in the DataExtension (or List) associated with the TriggeredSend. You can also pass **subscriber_key** as parameter, if absent, it will use the value in **email_address** as default value.
|
46
48
|
|
47
|
-
If you don't want this behavior, pass the flag "snake\_to\_camel: false" in the constructor:
|
49
|
+
In first example, with method `send_one`, all other attributes will be converted to CamelCase (ExactTarget convention) before send. So, **an_attribute** and **another_attribute** would become "AnAttribute" and "AnotherAttribute". If you don't want this behavior, pass the flag "snake\_to\_camel: false" in the constructor:
|
48
50
|
|
49
51
|
```ruby
|
50
52
|
ts = ExactTargetRest::TriggeredSend.new(auth, external_key, snake_to_camel: false)
|
51
53
|
```
|
52
54
|
|
55
|
+
The second way helps in two situations:
|
56
|
+
|
57
|
+
- If you have DataExtension's keys with spaces or any unusual pattern
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
external_key = 'My TriggeredSend External Key'
|
61
|
+
ts = ExactTargetRest::TriggeredSend.new(auth, external_key)
|
62
|
+
ts.with_options(email_address: 'uga@kabuga.com', subscriber_attributes: { 'An Attribute' => 'XXX', 'Another_Attribute' => 'YYY' }).deliver
|
63
|
+
```
|
64
|
+
|
65
|
+
- if you have to call the api asynchronously
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
def deliver
|
69
|
+
external_key = 'My TriggeredSend External Key'
|
70
|
+
triggered_send = ExactTargetRest::TriggeredSend.new(auth, external_key)
|
71
|
+
triggered_send.with_options(email_address: 'uga@kabuga.com')
|
72
|
+
|
73
|
+
Worker.perform_async(triggered_send.to_yaml)
|
74
|
+
end
|
75
|
+
|
76
|
+
class Worker
|
77
|
+
include Sidekiq::Worker
|
78
|
+
|
79
|
+
sidekiq_options queue: :exact_target_mailer
|
80
|
+
|
81
|
+
def perform(triggered_send)
|
82
|
+
YAML::load(triggered_send).deliver
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
```
|
87
|
+
|
53
88
|
### DataExtension Upsert
|
54
89
|
|
55
90
|
```ruby
|
data/exact_target_rest.gemspec
CHANGED
@@ -25,4 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
26
26
|
spec.add_development_dependency 'guard-rspec', '~> 4.5'
|
27
27
|
spec.add_development_dependency 'pry', '~> 0.10'
|
28
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.4.0'
|
29
|
+
spec.add_development_dependency 'webmock', '~> 2.1.0'
|
28
30
|
end
|
@@ -21,20 +21,13 @@ module ExactTargetRest
|
|
21
21
|
#
|
22
22
|
# @yield [access_token] Block to be executed
|
23
23
|
# @yieldparam access_token [String] Access token used to authorize a request
|
24
|
+
# @yieldparam expires_in [String] Time to token's expire
|
24
25
|
def with_authorization
|
25
26
|
authorize! unless authorized?
|
26
|
-
|
27
|
-
begin
|
28
|
-
yield @access_token
|
29
|
-
rescue NotAuthorizedError
|
30
|
-
authorize!
|
31
|
-
tries -= 1
|
32
|
-
retry if tries >= 0
|
33
|
-
end
|
34
|
-
|
27
|
+
yield @access_token
|
35
28
|
end
|
36
29
|
|
37
|
-
# Execute authorization
|
30
|
+
# Execute authorization, keeps an access token and returns the result
|
38
31
|
def authorize!
|
39
32
|
resp = endpoint.post do |p|
|
40
33
|
p.body = {clientId: @client_id,
|
@@ -43,14 +36,15 @@ module ExactTargetRest
|
|
43
36
|
if resp.success?
|
44
37
|
@access_token = resp.body['accessToken']
|
45
38
|
@expires_in = Time.now + resp.body['expiresIn']
|
39
|
+
{ access_token: @access_token, expires_in: @expires_in }
|
46
40
|
else
|
47
|
-
fail
|
41
|
+
fail NotAuthorizedError
|
48
42
|
end
|
49
43
|
end
|
50
44
|
|
51
45
|
# Already authorized and NOT expired?
|
52
46
|
def authorized?
|
53
|
-
@access_token && @expires_in
|
47
|
+
@access_token && @expires_in > Time.now
|
54
48
|
end
|
55
49
|
|
56
50
|
protected
|
@@ -63,4 +57,4 @@ module ExactTargetRest
|
|
63
57
|
end
|
64
58
|
end
|
65
59
|
end
|
66
|
-
end
|
60
|
+
end
|
@@ -12,28 +12,81 @@ module ExactTargetRest
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# TriggeredSend for just one subscriber.
|
15
|
-
#
|
16
|
-
# @param email_address [String] Email to send.
|
15
|
+
# @param to_address [String] Email to send.
|
17
16
|
# @param subscriber_key [String] SubscriberKey (it uses Email if not set).
|
18
17
|
# @param data_extension_attributes [{Symbol => Object}] List of attributes (in snake_case)
|
19
18
|
# that will be used in TriggeredSend and will be saved in related DataExtension
|
20
19
|
# (in CamelCase).
|
21
|
-
def send_one(
|
20
|
+
def send_one(
|
21
|
+
email_address:,
|
22
|
+
subscriber_key: email_address,
|
23
|
+
** data_extension_attributes
|
24
|
+
)
|
25
|
+
with_options(
|
26
|
+
email_address: email_address,
|
27
|
+
subscriber_key: subscriber_key,
|
28
|
+
subscriber_attributes: prepare_attributes(data_extension_attributes)
|
29
|
+
).deliver
|
30
|
+
end
|
31
|
+
|
32
|
+
# Load attributes and return "self". To send using async methods.
|
33
|
+
# @param request_type [String] ASYNC or SYNC.
|
34
|
+
# @param to_address [String] Email to send.
|
35
|
+
# @param subscriber_key [String] SubscriberKey.
|
36
|
+
# => it uses Email if not set
|
37
|
+
# @param from_address [String] Sender email address.
|
38
|
+
# @param from_name [String] Sender name.
|
39
|
+
# @param subscriber_attributes [{String => String, ...}] List of attributes
|
40
|
+
# => Keys as Strings (when your ExactTarget's fields doesn't have a pattern)
|
41
|
+
def with_options(
|
42
|
+
request_type: "ASYNC",
|
43
|
+
email_address:,
|
44
|
+
subscriber_key: email_address,
|
45
|
+
from_address: "",
|
46
|
+
from_name: "",
|
47
|
+
subscriber_attributes: {}
|
48
|
+
)
|
49
|
+
@request_type = request_type
|
50
|
+
@email_address = email_address
|
51
|
+
@subscriber_key = subscriber_key
|
52
|
+
@from_address = from_address
|
53
|
+
@from_name = from_name
|
54
|
+
@subscriber_attributes = subscriber_attributes
|
55
|
+
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
# TriggeredSend with loaded attributes.
|
60
|
+
def deliver
|
61
|
+
tries ||= 1
|
22
62
|
@authorization.with_authorization do |access_token|
|
23
63
|
resp = endpoint.post do |p|
|
24
64
|
p.url(format(TRIGGERED_SEND_PATH, URI.encode(@external_key)))
|
25
65
|
p.headers['Authorization'] = "Bearer #{access_token}"
|
26
|
-
p.body = {
|
27
|
-
|
28
|
-
|
66
|
+
p.body = {
|
67
|
+
From: {
|
68
|
+
Address: @from_address,
|
69
|
+
Name: @from_name
|
70
|
+
},
|
71
|
+
To: {
|
72
|
+
Address: @email_address,
|
73
|
+
SubscriberKey: @subscriber_key,
|
29
74
|
ContactAttributes: {
|
30
|
-
SubscriberAttributes:
|
75
|
+
SubscriberAttributes: @subscriber_attributes
|
31
76
|
}
|
32
|
-
|
77
|
+
},
|
78
|
+
OPTIONS: {
|
79
|
+
RequestType: @request_type
|
80
|
+
}
|
81
|
+
}
|
33
82
|
end
|
34
83
|
raise NotAuthorizedError if resp.status == 401
|
35
84
|
resp
|
36
85
|
end
|
86
|
+
rescue NotAuthorizedError
|
87
|
+
tries -= 1
|
88
|
+
retry if tries >= 0
|
89
|
+
raise NotAuthorizedError
|
37
90
|
end
|
38
91
|
|
39
92
|
protected
|
@@ -50,4 +103,4 @@ module ExactTargetRest
|
|
50
103
|
@snake_to_camel ? attributes.snake_to_camel : attributes
|
51
104
|
end
|
52
105
|
end
|
53
|
-
end
|
106
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Authorization do
|
4
|
+
|
5
|
+
let(:client_id) { "12345" }
|
6
|
+
let(:client_secret) { "Y9axRxR9bcvSW2cc0IwoWeq7" }
|
7
|
+
let(:expires_in) { 3600 }
|
8
|
+
|
9
|
+
let(:access_token) { "75sf4WWbwfr6HYd5URpC6KBk" }
|
10
|
+
|
11
|
+
subject do
|
12
|
+
described_class
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
stub_requests
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#with_authorization' do
|
20
|
+
it "returns a valid authorization" do
|
21
|
+
subject.new(client_id, client_secret).with_authorization do |access_token|
|
22
|
+
expect(access_token).to eq access_token
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns Unauthorized" do
|
27
|
+
expect {
|
28
|
+
subject.new("invalid", client_secret).with_authorization
|
29
|
+
}.to raise_error NotAuthorizedError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#authorize!' do
|
34
|
+
it "returns a valid authorization" do
|
35
|
+
auth = subject.new(client_id, client_secret).authorize!
|
36
|
+
|
37
|
+
expect(auth[:access_token]).to eq access_token
|
38
|
+
expect(auth[:expires_in]).not_to be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns Unauthorized" do
|
42
|
+
expect {
|
43
|
+
subject.new("invalid", client_secret).authorize!
|
44
|
+
}.to raise_error NotAuthorizedError
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def stub_requests
|
51
|
+
stub_request(:post, "https://auth.exacttargetapis.com/v1/requestToken").
|
52
|
+
with(
|
53
|
+
:body => "{\"clientId\":\"12345\",\"clientSecret\":\"Y9axRxR9bcvSW2cc0IwoWeq7\"}",
|
54
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}
|
55
|
+
).
|
56
|
+
to_return(
|
57
|
+
headers: {"Content-Type"=> "application/json"},
|
58
|
+
body: %({"accessToken": "#{access_token}", "expiresIn": 3600}),
|
59
|
+
status: 200
|
60
|
+
)
|
61
|
+
|
62
|
+
stub_request(:any, ExactTargetRest::AUTH_URL).
|
63
|
+
with(
|
64
|
+
:body => "{\"clientId\":\"invalid\",\"clientSecret\":\"Y9axRxR9bcvSW2cc0IwoWeq7\"}",
|
65
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}
|
66
|
+
).
|
67
|
+
to_return(
|
68
|
+
headers: {"Content-Type"=> "application/json"},
|
69
|
+
body: %({"message": "Unauthorized","errorcode": 1,"documentation": ""}),
|
70
|
+
status: 401
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TriggeredSend do
|
4
|
+
|
5
|
+
let(:external_key) { "12345" }
|
6
|
+
let(:access_token) { "Y9axRxR9bcvSW2cc0IwoWeq7" }
|
7
|
+
let(:expires_in) { 3600 }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
authorization = instance_double("ExactTargetRest::Authorization")
|
11
|
+
allow(authorization).to receive(:with_authorization).and_yield(access_token)
|
12
|
+
described_class.new(authorization,external_key)
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
stub_requests
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#send_one' do
|
20
|
+
it "sends a simple TriggeredSend" do
|
21
|
+
response = subject.send_one(email_address: "jake@oo.com")
|
22
|
+
expect(response.body["requestId"]).to eq "simple-response-id"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "sends a TriggeredSend with DataExtension" do
|
26
|
+
response = subject.send_one(
|
27
|
+
email_address: "jake@oo.com",
|
28
|
+
city: "São Paulo",
|
29
|
+
zip: "04063-040"
|
30
|
+
)
|
31
|
+
expect(response.body["requestId"]).to eq "data-extension-response-id"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#deliver' do
|
36
|
+
it "sends a simple TriggeredSend" do
|
37
|
+
response = subject.with_options(email_address: "jake@oo.com").deliver
|
38
|
+
expect(response.body["requestId"]).to eq "simple-response-id"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sends a TriggeredSend with DataExtension" do
|
42
|
+
response = subject.with_options(
|
43
|
+
email_address: "jake@oo.com",
|
44
|
+
subscriber_attributes: { City: "São Paulo", Zip: "04063-040" }
|
45
|
+
).deliver
|
46
|
+
expect(response.body["requestId"]).to eq "data-extension-response-id"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "sends a TriggeredSend with a DataExtension's key with spaces" do
|
50
|
+
response = subject.with_options(
|
51
|
+
email_address: "jake@oo.com",
|
52
|
+
subscriber_attributes: { "City" => "São Paulo", "Profile ID" => "42" }
|
53
|
+
).deliver
|
54
|
+
expect(response.body["requestId"]).to eq "uncommon-key-response-id"
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def stub_requests
|
62
|
+
stub_request(:any, ExactTargetRest::AUTH_URL).
|
63
|
+
to_return(
|
64
|
+
headers: {"Content-Type"=> "application/json"},
|
65
|
+
body: %({"accessToken": "75sf4WWbwfr6HYd5URpC6KBk", "expiresIn": 3600}),
|
66
|
+
status: 200
|
67
|
+
)
|
68
|
+
|
69
|
+
stub_request(:post, triggered_send_url).
|
70
|
+
with(
|
71
|
+
:body => "{\"From\":{\"Address\":\"\",\"Name\":\"\"},\"To\":{\"Address\":\"jake@oo.com\",\"SubscriberKey\":\"jake@oo.com\",\"ContactAttributes\":{\"SubscriberAttributes\":{\"City\":\"São Paulo\",\"Zip\":\"04063-040\"}}},\"OPTIONS\":{\"RequestType\":\"ASYNC\"}}",
|
72
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>"Bearer #{access_token}", 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}
|
73
|
+
).
|
74
|
+
to_return(
|
75
|
+
headers: {"Content-Type"=> "application/json"},
|
76
|
+
body: stub_response("data-extension-response-id"),
|
77
|
+
status: 202
|
78
|
+
)
|
79
|
+
|
80
|
+
stub_request(:post, triggered_send_url).
|
81
|
+
with(
|
82
|
+
:body => "{\"From\":{\"Address\":\"\",\"Name\":\"\"},\"To\":{\"Address\":\"jake@oo.com\",\"SubscriberKey\":\"jake@oo.com\",\"ContactAttributes\":{\"SubscriberAttributes\":{\"City\":\"São Paulo\",\"Profile ID\":\"42\"}}},\"OPTIONS\":{\"RequestType\":\"ASYNC\"}}",
|
83
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>"Bearer #{access_token}", 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}
|
84
|
+
).
|
85
|
+
to_return(
|
86
|
+
headers: {"Content-Type"=> "application/json"},
|
87
|
+
body: stub_response("uncommon-key-response-id"),
|
88
|
+
status: 202
|
89
|
+
)
|
90
|
+
|
91
|
+
stub_request(:post, triggered_send_url).
|
92
|
+
with(
|
93
|
+
:body => "{\"From\":{\"Address\":\"\",\"Name\":\"\"},\"To\":{\"Address\":\"jake@oo.com\",\"SubscriberKey\":\"jake@oo.com\",\"ContactAttributes\":{\"SubscriberAttributes\":{}}},\"OPTIONS\":{\"RequestType\":\"ASYNC\"}}",
|
94
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>"Bearer #{access_token}", 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.2'}
|
95
|
+
).
|
96
|
+
to_return(
|
97
|
+
headers: {"Content-Type"=> "application/json"},
|
98
|
+
body: stub_response("simple-response-id"),
|
99
|
+
status: 202
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
def triggered_send_url
|
104
|
+
"#{TRIGGERED_SEND_URL}#{TRIGGERED_SEND_PATH}" % external_key
|
105
|
+
end
|
106
|
+
|
107
|
+
def stub_response(mockId)
|
108
|
+
%({
|
109
|
+
"requestId": "#{mockId}",
|
110
|
+
"responses": [ {
|
111
|
+
"recipientSendId": "#{mockId}",
|
112
|
+
"hasErrors": false,
|
113
|
+
"messages": ["Queued"]
|
114
|
+
}]
|
115
|
+
})
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exact_target_rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ronie Uliana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.10'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.4.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.4.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.1.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.1.0
|
97
125
|
description: Simple wrapper around ExactTarget REST API. It deals with authorization
|
98
126
|
and with coding conventions (CamelCase vs snake_case)
|
99
127
|
email:
|
@@ -104,7 +132,6 @@ extra_rdoc_files: []
|
|
104
132
|
files:
|
105
133
|
- ".gitignore"
|
106
134
|
- ".ruby-gemset"
|
107
|
-
- ".ruby-version"
|
108
135
|
- Gemfile
|
109
136
|
- Guardfile
|
110
137
|
- LICENSE.txt
|
@@ -119,9 +146,11 @@ files:
|
|
119
146
|
- lib/exact_target_rest/support/string_extension.rb
|
120
147
|
- lib/exact_target_rest/triggered_send.rb
|
121
148
|
- lib/exact_target_rest/version.rb
|
149
|
+
- spec/lib/exact_target_rest/authorization_spec.rb
|
122
150
|
- spec/lib/exact_target_rest/support/data_ext_params_spec.rb
|
123
151
|
- spec/lib/exact_target_rest/support/hash_extension_spec.rb
|
124
152
|
- spec/lib/exact_target_rest/support/string_extension_spec.rb
|
153
|
+
- spec/lib/exact_target_rest/triggered_send_spec.rb
|
125
154
|
- spec/spec_helper.rb
|
126
155
|
homepage: ''
|
127
156
|
licenses:
|
@@ -143,12 +172,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
172
|
version: '0'
|
144
173
|
requirements: []
|
145
174
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.
|
175
|
+
rubygems_version: 2.5.1
|
147
176
|
signing_key:
|
148
177
|
specification_version: 4
|
149
178
|
summary: Simple wrapper around ExactTarget REST API
|
150
179
|
test_files:
|
180
|
+
- spec/lib/exact_target_rest/authorization_spec.rb
|
151
181
|
- spec/lib/exact_target_rest/support/data_ext_params_spec.rb
|
152
182
|
- spec/lib/exact_target_rest/support/hash_extension_spec.rb
|
153
183
|
- spec/lib/exact_target_rest/support/string_extension_spec.rb
|
184
|
+
- spec/lib/exact_target_rest/triggered_send_spec.rb
|
154
185
|
- spec/spec_helper.rb
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby-2.2
|