active_campaign 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/Gemfile +5 -10
- data/README.md +1 -0
- data/active_campaign.gemspec +1 -5
- data/lib/active_campaign/client/contacts.rb +1 -0
- data/lib/active_campaign/client.rb +43 -148
- data/lib/active_campaign/configurable.rb +12 -37
- data/lib/active_campaign/default.rb +2 -68
- data/lib/active_campaign/version.rb +1 -1
- data/lib/active_campaign.rb +2 -1
- data/spec/active_campaign_spec.rb +31 -16
- data/spec/client/contacts_spec.rb +2 -5
- data/spec/client/lists_spec.rb +1 -4
- data/spec/client_spec.rb +1 -1
- data/spec/{helper.rb → spec_helper.rb} +33 -9
- metadata +17 -80
- data/lib/active_campaign/arguments.rb +0 -14
- data/lib/active_campaign/authentication.rb +0 -68
- data/lib/active_campaign/response/debugger.rb +0 -42
- data/lib/active_campaign/response/instrumentation.rb +0 -33
- data/lib/active_campaign/response/json_normalizer.rb +0 -49
- data/lib/active_campaign/response/mashify.rb +0 -40
- data/lib/active_campaign/response/parse_json.rb +0 -83
- data/lib/active_campaign/response/raise_error.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51738f35b3fdb61fa2e068ddcca2735c3e1a24ca
|
4
|
+
data.tar.gz: 335f4331bdb56d952ea512b73c95b9ca83de8524
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 672b2039bb992045ac56ba02113b9eeb17dcc534a0dc7a88af8325e660b2b62816b6939945955e3557ec98461c40c2ef58269b9bc06c7d10ee0c9bfff51b6544
|
7
|
+
data.tar.gz: dba4079c479ee6bb751754421b5e07eed513f2b2e0791b3c2216444bea323050ba2657eeae8fe4fb3ac03655d8dc441ddfa22f8d1c488fbf92bb8ce8c1f7e6f7
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
repo_token: 9QHPyeb961SRsyxDttIHmzVNhXvP1RJKr
|
data/Gemfile
CHANGED
@@ -2,28 +2,23 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'jruby-openssl', :platforms => :jruby
|
4
4
|
gem 'rake'
|
5
|
+
gem 'activesupport'
|
5
6
|
|
6
7
|
group :development do
|
7
8
|
gem 'awesome_print', :require => 'ap'
|
8
|
-
gem 'guard-rspec', '~> 2.5.1'
|
9
|
-
gem 'hirb-unicode'
|
10
9
|
gem 'pry'
|
11
|
-
gem 'redcarpet'
|
12
|
-
gem 'wirb'
|
13
|
-
gem 'wirble'
|
14
|
-
gem 'yard'
|
15
10
|
end
|
16
11
|
|
17
12
|
group :test do
|
13
|
+
gem "codeclimate-test-reporter", :require => false
|
18
14
|
gem 'coveralls', :require => false
|
19
15
|
gem 'json', '~> 1.7', :platforms => [:ruby_18, :jruby]
|
20
|
-
gem 'netrc', '~> 0.7.7'
|
21
16
|
gem 'rb-fsevent', '~> 0.9'
|
22
|
-
gem 'rspec', '~> 2.
|
17
|
+
gem 'rspec', '~> 2.14.0'
|
23
18
|
gem 'simplecov', :require => false
|
24
19
|
gem 'test-queue', '~> 0.1.3'
|
25
|
-
gem 'vcr', '~> 2.
|
26
|
-
gem 'webmock', '~> 1.
|
20
|
+
gem 'vcr', '~> 2.6.0'
|
21
|
+
gem 'webmock', '~> 1.14.0'
|
27
22
|
end
|
28
23
|
|
29
24
|
gemspec
|
data/README.md
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
[![Circle CI](https://circleci.com/gh/RushPlay/active_campaign.png?circle-token=908def2d4311fcbe28d2caabccaa703e2835cf37)](https://circleci.com/gh/RushPlay/active_campaign/tree/master)[![Coverage Status](https://coveralls.io/repos/RushPlay/active_campaign/badge.png?branch=master)](https://coveralls.io/r/RushPlay/active_campaign?branch=master) [![Code Climate](https://codeclimate.com/repos/525d012ec7f3a335f101a3d6/badges/74d14b105bf9f769f10f/gpa.png)](https://codeclimate.com/repos/525d012ec7f3a335f101a3d6/feed)
|
1
2
|
# Active::Campaign::Ruby
|
2
3
|
|
3
4
|
A simple wrapper for the ActiveCampaign API. Since their API seems to be
|
data/active_campaign.gemspec
CHANGED
@@ -18,10 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "
|
22
|
-
spec.add_dependency "activesupport", ">= 4.0.0"
|
23
|
-
spec.add_dependency "uri_template"
|
21
|
+
spec.add_dependency "httpi"
|
24
22
|
spec.add_dependency "hashie"
|
25
|
-
spec.add_dependency "oj"
|
26
|
-
spec.add_development_dependency 'bundler', '~> 1.0'
|
27
23
|
end
|
@@ -1,30 +1,28 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'uri_template'
|
3
|
-
require 'active_campaign/arguments'
|
4
|
-
require 'active_campaign/authentication'
|
5
1
|
require 'active_campaign/configurable'
|
6
2
|
require 'active_campaign/client/contacts'
|
7
3
|
require 'active_campaign/client/lists'
|
8
4
|
require 'active_campaign/client/campaigns'
|
5
|
+
require 'httpi'
|
6
|
+
require 'hashie'
|
9
7
|
|
10
8
|
module ActiveCampaign
|
11
9
|
class Client
|
12
10
|
include ActiveCampaign::Configurable
|
13
|
-
include ActiveCampaign::Authentication
|
14
11
|
include ActiveCampaign::Client::Contacts
|
15
12
|
include ActiveCampaign::Client::Lists
|
16
13
|
include ActiveCampaign::Client::Campaigns
|
17
14
|
|
18
|
-
NO_BODY = Set.new([:get, :head])
|
19
|
-
# Header keys that can be passed in options hash to {#get},{#head}
|
20
|
-
CONVENIENCE_HEADERS = Set.new [:accept]
|
21
|
-
|
22
15
|
def initialize(options = {})
|
23
|
-
# Use options passed in, but fall back to module defaults
|
24
16
|
ActiveCampaign::Configurable.keys.each do |key|
|
25
17
|
instance_variable_set(:"@#{key}", options[key] ||
|
26
18
|
ActiveCampaign.instance_variable_get(:"@#{key}"))
|
27
19
|
end
|
20
|
+
|
21
|
+
unless debug
|
22
|
+
HTTPI.log = false
|
23
|
+
HTTPI.log_level = :info
|
24
|
+
HTTPI.logger = Rails.logger
|
25
|
+
end
|
28
26
|
end
|
29
27
|
|
30
28
|
# Compares client options to a Hash of requested options
|
@@ -35,32 +33,13 @@ module ActiveCampaign
|
|
35
33
|
opts.hash == options.hash
|
36
34
|
end
|
37
35
|
|
38
|
-
# Text representation of the client, masking tokens and passwords
|
39
|
-
#
|
40
|
-
# @return [String]
|
41
|
-
def inspect
|
42
|
-
inspected = super
|
43
|
-
|
44
|
-
# mask password
|
45
|
-
inspected = inspected.gsub! @password, "*******" if @password
|
46
|
-
# Only show last 4 of token, secret
|
47
|
-
if @access_token
|
48
|
-
inspected = inspected.gsub! @access_token, "#{'*'*36}#{@access_token[36..-1]}"
|
49
|
-
end
|
50
|
-
if @client_secret
|
51
|
-
inspected = inspected.gsub! @client_secret, "#{'*'*36}#{@client_secret[36..-1]}"
|
52
|
-
end
|
53
|
-
|
54
|
-
inspected
|
55
|
-
end
|
56
|
-
|
57
36
|
# Make a HTTP GET request
|
58
37
|
#
|
59
38
|
# @param url [String] The path, relative to {#api_endpoint}
|
60
39
|
# @param options [Hash] Query and header params for request
|
61
40
|
# @return [Sawyer::Resource]
|
62
41
|
def get(api_method, options = {})
|
63
|
-
request :get, api_method,
|
42
|
+
request :get, api_method, options
|
64
43
|
end
|
65
44
|
|
66
45
|
# Make a HTTP POST request
|
@@ -72,143 +51,59 @@ module ActiveCampaign
|
|
72
51
|
request :post, api_method, options
|
73
52
|
end
|
74
53
|
|
75
|
-
# Make a HTTP PUT request
|
76
|
-
#
|
77
|
-
# @param url [String] The path, relative to {#api_endpoint}
|
78
|
-
# @param options [Hash] Body and header params for request
|
79
|
-
# @return [Sawyer::Resource]
|
80
|
-
def put(api_method, options = {})
|
81
|
-
request :put, api_method, options
|
82
|
-
end
|
83
|
-
|
84
|
-
# Make a HTTP PATCH request
|
85
|
-
#
|
86
|
-
# @param url [String] The path, relative to {#api_endpoint}
|
87
|
-
# @param options [Hash] Body and header params for request
|
88
|
-
# @return [Sawyer::Resource]
|
89
|
-
def patch(api_method, options = {})
|
90
|
-
request :patch, api_method, options
|
91
|
-
end
|
92
|
-
|
93
|
-
# Make a HTTP DELETE request
|
94
|
-
#
|
95
|
-
# @param url [String] The path, relative to {#api_endpoint}
|
96
|
-
# @param options [Hash] Query and header params for request
|
97
|
-
# @return [Sawyer::Resource]
|
98
|
-
def delete(api_method, options = {})
|
99
|
-
request :delete, api_method, options
|
100
|
-
end
|
101
|
-
|
102
|
-
# Make a HTTP HEAD request
|
103
|
-
#
|
104
|
-
# @param url [String] The path, relative to {#api_endpoint}
|
105
|
-
# @param options [Hash] Query and header params for request
|
106
|
-
# @return [Sawyer::Resource]
|
107
|
-
def head(api_method, options = {})
|
108
|
-
request :head, api_method, parse_query_and_convenience_headers(options)
|
109
|
-
end
|
110
|
-
|
111
|
-
# Response for last HTTP request
|
112
|
-
#
|
113
|
-
# @return [Sawyer::Response]
|
114
|
-
def last_response
|
115
|
-
@last_response
|
116
|
-
end
|
117
|
-
|
118
54
|
private
|
119
55
|
|
120
56
|
def request(method, api_method, data)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
options[:query].merge!({
|
126
|
-
api_key: api_key,
|
127
|
-
api_action: api_method.to_s,
|
128
|
-
api_output: api_output
|
129
|
-
})
|
130
|
-
|
131
|
-
if accept = data.delete(:accept)
|
132
|
-
options[:headers][:accept] = accept
|
133
|
-
end
|
134
|
-
|
135
|
-
@last_response = response = process_request(
|
136
|
-
method, URI.encode(api_path), data, options
|
137
|
-
)
|
138
|
-
|
139
|
-
response
|
57
|
+
req = create_request method, api_method, data
|
58
|
+
response = HTTPI.send(method, req)
|
59
|
+
response = JSON.parse(response.body)
|
60
|
+
normalize(response)
|
140
61
|
end
|
141
62
|
|
142
|
-
def connection
|
143
|
-
@conn ||= Faraday.new do |builder|
|
144
|
-
|
145
|
-
builder.request :url_encoded
|
146
63
|
|
147
|
-
|
148
|
-
|
149
|
-
|
64
|
+
def create_request(method, api_method, options = {})
|
65
|
+
request = HTTPI::Request.new :url => File.join(api_endpoint, api_path)
|
66
|
+
request.headers = {"User-Agent" => user_agent}
|
67
|
+
request.query = {
|
68
|
+
:api_key => api_key,
|
69
|
+
:api_action => api_method.to_s,
|
70
|
+
:api_output => api_output
|
71
|
+
}.merge(options.delete(:query))
|
150
72
|
|
151
|
-
|
152
|
-
builder.use :debugger
|
153
|
-
builder.use :instrumentation
|
154
|
-
end
|
73
|
+
request.body = options.to_query if method == :post
|
155
74
|
|
156
|
-
|
157
|
-
builder.url_prefix = api_endpoint
|
158
|
-
end
|
159
|
-
# @conn.url_prefix api_endpoint
|
160
|
-
@conn
|
75
|
+
request
|
161
76
|
end
|
162
77
|
|
78
|
+
def normalize(response)
|
79
|
+
keys, values = keys_values(response)
|
163
80
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
81
|
+
if keys.all?{|key| is_numeric?(key) }
|
82
|
+
response[:results] = values
|
83
|
+
keys.each do |key|
|
84
|
+
response.delete(key)
|
85
|
+
end
|
168
86
|
end
|
169
|
-
options ||= {}
|
170
|
-
url = expand_url(url, options[:uri])
|
171
87
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
end
|
177
|
-
if headers = options[:headers]
|
178
|
-
req.headers.update headers
|
179
|
-
end
|
88
|
+
if mash
|
89
|
+
Hashie::Mash.new response
|
90
|
+
else
|
91
|
+
ActiveSupport::HashWithIndifferentAccess.new(response)
|
180
92
|
end
|
181
|
-
res.body
|
182
|
-
end
|
183
93
|
|
184
|
-
# Executes the request, checking if it was successful
|
185
|
-
#
|
186
|
-
# @return [Boolean] True on success, false otherwise
|
187
|
-
def boolean_from_response(method, path, options = {})
|
188
|
-
request(method, path, options)
|
189
|
-
@last_response.status == 204
|
190
|
-
rescue ActiveCampaign::NotFound
|
191
|
-
false
|
192
94
|
end
|
193
95
|
|
194
|
-
def
|
195
|
-
|
196
|
-
|
197
|
-
if header = options.delete(h)
|
198
|
-
headers[h] = header
|
199
|
-
end
|
200
|
-
end
|
201
|
-
query = options.delete(:query)
|
202
|
-
opts = {:query => options}
|
203
|
-
opts[:query].merge!(query) if query && query.is_a?(Hash)
|
204
|
-
opts[:headers] = headers unless headers.empty?
|
96
|
+
def is_numeric?(string)
|
97
|
+
string.to_s.match(/\A[+-]?\d+\Z/) == nil ? false : true
|
98
|
+
end
|
205
99
|
|
206
|
-
|
100
|
+
def keys_values(response)
|
101
|
+
results = results(response)
|
102
|
+
[results.keys, results.values]
|
207
103
|
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
options ? expand.call(options) : expand.call
|
104
|
+
|
105
|
+
def results(response)
|
106
|
+
response.reject{|k,v| %w(result_code result_message result_output).include?(k) }
|
212
107
|
end
|
213
108
|
end
|
214
109
|
end
|
@@ -4,49 +4,24 @@ module ActiveCampaign
|
|
4
4
|
# in {Default}
|
5
5
|
module Configurable
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# @return [String] Base URL for web URLs. default: https://github.com/
|
19
|
-
|
20
|
-
attr_accessor :api_url, :api_key, :api_output, :api_path, :api_action,
|
21
|
-
:list_id, :api_endpoint, :proxy, :user_agent,
|
22
|
-
:debug, :per_page, :connection_options,
|
23
|
-
:api_endpoint, :auto_paginate,
|
24
|
-
:default_media_type, :connection_options,
|
25
|
-
:middleware, :user_agent, :web_endpoint
|
26
|
-
|
27
|
-
attr_writer :client_secret, :password
|
7
|
+
CONFIG_KEYS = [
|
8
|
+
:api_key,
|
9
|
+
:api_path,
|
10
|
+
:api_output,
|
11
|
+
:api_endpoint,
|
12
|
+
:user_agent,
|
13
|
+
:debug,
|
14
|
+
:mash,
|
15
|
+
]
|
16
|
+
|
17
|
+
attr_accessor(*CONFIG_KEYS)
|
28
18
|
|
29
19
|
class << self
|
30
20
|
|
31
21
|
# List of configurable keys for {ActiveCampaign::Client}
|
32
22
|
# @return [Array] of option keys
|
33
23
|
def keys
|
34
|
-
@keys ||=
|
35
|
-
:api_key,
|
36
|
-
:api_path,
|
37
|
-
:api_output,
|
38
|
-
:api_endpoint,
|
39
|
-
:user_agent,
|
40
|
-
:debug,
|
41
|
-
:per_page,
|
42
|
-
:connection_options,
|
43
|
-
:auto_paginate,
|
44
|
-
:default_media_type,
|
45
|
-
:connection_options,
|
46
|
-
:middleware,
|
47
|
-
:user_agent,
|
48
|
-
:web_endpoint
|
49
|
-
]
|
24
|
+
@keys ||= CONFIG_KEYS
|
50
25
|
end
|
51
26
|
end
|
52
27
|
|
@@ -1,10 +1,4 @@
|
|
1
1
|
require 'active_campaign/version'
|
2
|
-
require 'active_campaign/response/raise_error'
|
3
|
-
require 'active_campaign/response/debugger'
|
4
|
-
require 'active_campaign/response/json_normalizer'
|
5
|
-
require 'active_campaign/response/mashify'
|
6
|
-
require 'active_campaign/response/instrumentation'
|
7
|
-
require 'active_campaign/response/parse_json'
|
8
2
|
|
9
3
|
module ActiveCampaign
|
10
4
|
|
@@ -19,26 +13,12 @@ module ActiveCampaign
|
|
19
13
|
# Default User Agent header string
|
20
14
|
USER_AGENT = "ActiveCampaign Ruby Gem #{ActiveCampaign::VERSION}".freeze
|
21
15
|
|
22
|
-
# Default media type
|
23
|
-
MEDIA_TYPE = "text/html"
|
24
|
-
|
25
16
|
# Default media type
|
26
17
|
API_OUTPUT = "json"
|
27
18
|
|
28
19
|
# Default WEB endpoint
|
29
20
|
WEB_ENDPOINT = "http://www.activecampaign.com/".freeze
|
30
21
|
|
31
|
-
# Default Faraday middleware stack
|
32
|
-
MIDDLEWARE = Faraday::Builder.new do |builder|
|
33
|
-
builder.request :url_encoded
|
34
|
-
builder.response :mashify
|
35
|
-
builder.response :json_normalizer
|
36
|
-
builder.response :parse_json
|
37
|
-
builder.use :debugger
|
38
|
-
builder.use :instrumentation
|
39
|
-
builder.adapter Faraday.default_adapter
|
40
|
-
end
|
41
|
-
|
42
22
|
class << self
|
43
23
|
|
44
24
|
# Configuration options
|
@@ -59,29 +39,6 @@ module ActiveCampaign
|
|
59
39
|
API_PATH
|
60
40
|
end
|
61
41
|
|
62
|
-
# Default pagination preference from ENV
|
63
|
-
# @return [String]
|
64
|
-
def auto_paginate
|
65
|
-
ENV['ACTIVE_CAMPAIGN_AUTO_PAGINATE']
|
66
|
-
end
|
67
|
-
|
68
|
-
# Default options for Faraday::Connection
|
69
|
-
# @return [Hash]
|
70
|
-
def connection_options
|
71
|
-
{
|
72
|
-
:headers => {
|
73
|
-
:accept => default_media_type,
|
74
|
-
:user_agent => user_agent
|
75
|
-
}
|
76
|
-
}
|
77
|
-
end
|
78
|
-
|
79
|
-
# Default media type from ENV or {MEDIA_TYPE}
|
80
|
-
# @return [String]
|
81
|
-
def default_media_type
|
82
|
-
ENV['ACTIVE_CAMPAIGN_DEFAULT_MEDIA_TYPE'] || MEDIA_TYPE
|
83
|
-
end
|
84
|
-
|
85
42
|
# Default GitHub username for Basic Auth from ENV
|
86
43
|
# @return [String]
|
87
44
|
def api_key
|
@@ -92,11 +49,8 @@ module ActiveCampaign
|
|
92
49
|
false
|
93
50
|
end
|
94
51
|
|
95
|
-
|
96
|
-
|
97
|
-
# @return [String]
|
98
|
-
def middleware
|
99
|
-
MIDDLEWARE
|
52
|
+
def mash
|
53
|
+
false
|
100
54
|
end
|
101
55
|
|
102
56
|
# Default media api_output from ENV or {API_OUTPUT}
|
@@ -105,31 +59,11 @@ module ActiveCampaign
|
|
105
59
|
ENV['ACTIVE_CAMPAIGN_API_OUTPUT'] || API_OUTPUT
|
106
60
|
end
|
107
61
|
|
108
|
-
# Default pagination page size from ENV
|
109
|
-
# @return [Fixnum] Page size
|
110
|
-
def per_page
|
111
|
-
page_size = ENV['ACTIVE_CAMPAIGN_PER_PAGE']
|
112
|
-
|
113
|
-
page_size.to_i if page_size
|
114
|
-
end
|
115
|
-
|
116
|
-
# Default proxy server URI for Faraday connection from ENV
|
117
|
-
# @return [String]
|
118
|
-
def proxy
|
119
|
-
ENV['ACTIVE_CAMPAIGN_PROXY']
|
120
|
-
end
|
121
|
-
|
122
62
|
# Default User-Agent header string from ENV or {USER_AGENT}
|
123
63
|
# @return [String]
|
124
64
|
def user_agent
|
125
65
|
ENV['ACTIVE_CAMPAIGN_USER_AGENT'] || USER_AGENT
|
126
66
|
end
|
127
|
-
|
128
|
-
# Default web endpoint from ENV or {WEB_ENDPOINT}
|
129
|
-
# @return [String]
|
130
|
-
def web_endpoint
|
131
|
-
ENV['ACTIVE_CAMPAIGN_WEB_ENDPOINT'] || WEB_ENDPOINT
|
132
|
-
end
|
133
67
|
end
|
134
68
|
end
|
135
69
|
end
|
data/lib/active_campaign.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'active_support/core_ext'
|
1
|
+
# require 'active_support/core_ext'
|
2
2
|
require 'active_campaign/client'
|
3
3
|
require 'active_campaign/default'
|
4
4
|
|
5
5
|
module ActiveCampaign
|
6
6
|
|
7
7
|
class << self
|
8
|
+
|
8
9
|
include ActiveCampaign::Configurable
|
9
10
|
|
10
11
|
# API client based on configured options {Configurable}
|
@@ -1,32 +1,47 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveCampaign do
|
4
|
+
before do
|
5
|
+
ActiveCampaign.reset!
|
6
|
+
end
|
4
7
|
|
5
8
|
after do
|
6
|
-
ActiveCampaign.
|
9
|
+
ActiveCampaign.reset!
|
7
10
|
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
expect(ActiveCampaign.
|
12
|
+
it 'sets defaults' do
|
13
|
+
ActiveCampaign::Configurable.keys.each do |key|
|
14
|
+
expect(ActiveCampaign.instance_variable_get(:"@#{key}")).to eq ActiveCampaign::Default.send(key)
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
15
|
-
describe
|
16
|
-
it
|
17
|
-
expect(ActiveCampaign.client).to
|
18
|
+
describe '.client' do
|
19
|
+
it 'creates an ActiveCampaign::Client' do
|
20
|
+
expect(ActiveCampaign.client).to be_kind_of ActiveCampaign::Client
|
18
21
|
end
|
19
|
-
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
it 'caches the client when the same options are passed' do
|
24
|
+
expect(ActiveCampaign.client).to eq ActiveCampaign.client
|
25
|
+
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
it 'returns a fresh client when options are not the same' do
|
28
|
+
client = ActiveCampaign.client
|
29
|
+
ActiveCampaign.api_key = 'somekey'
|
30
|
+
client_two = ActiveCampaign.client
|
31
|
+
client_three = ActiveCampaign.client
|
32
|
+
expect(client).to_not eq client_two
|
33
|
+
expect(client_three).to eq client_two
|
29
34
|
end
|
35
|
+
end
|
30
36
|
|
37
|
+
describe '.configure' do
|
38
|
+
ActiveCampaign::Configurable.keys.each do |key|
|
39
|
+
it "sets the #{key.to_s.gsub('_', ' ')}" do
|
40
|
+
ActiveCampaign.configure do |config|
|
41
|
+
config.send("#{key}=", key)
|
42
|
+
end
|
43
|
+
expect(ActiveCampaign.instance_variable_get(:"@#{key}")).to eq key
|
44
|
+
end
|
45
|
+
end
|
31
46
|
end
|
32
47
|
end
|
@@ -1,14 +1,11 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require '
|
2
|
+
require 'spec_helper'
|
3
3
|
|
4
|
-
# need this to filter the data
|
5
|
-
require 'json'
|
6
|
-
require 'date'
|
7
4
|
describe ActiveCampaign::Client::Contacts do
|
8
5
|
|
9
6
|
initialize_new_client
|
10
7
|
|
11
|
-
|
8
|
+
pending "syncs a contact" do
|
12
9
|
params = {
|
13
10
|
id: 1,
|
14
11
|
email: 'mhenrixon@me.com',
|
data/spec/client/lists_spec.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
require "codeclimate-test-reporter"
|
4
|
+
formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
if ENV['CODECLIMATE_REPO_TOKEN']
|
7
|
+
formatters << CodeClimate::TestReporter::Formatter
|
8
|
+
CodeClimate::TestReporter.start
|
9
|
+
end
|
10
|
+
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
|
12
|
+
SimpleCov.start
|
9
13
|
|
10
14
|
require "active_campaign"
|
11
15
|
require 'rspec'
|
12
16
|
require 'webmock/rspec'
|
13
17
|
|
14
|
-
WebMock.disable_net_connect!(:allow => 'coveralls.io')
|
18
|
+
WebMock.disable_net_connect!(:allow => ['coveralls.io', 'codeclimate.com'])
|
15
19
|
|
16
20
|
RSpec.configure do |config|
|
17
21
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
@@ -23,6 +27,25 @@ RSpec.configure do |config|
|
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
30
|
+
require 'vcr'
|
31
|
+
VCR.configure do |c|
|
32
|
+
c.configure_rspec_metadata!
|
33
|
+
c.filter_sensitive_data('<API_KEY>') do
|
34
|
+
ENV['ACTIVE_CAMPAIGN_API_KEY']
|
35
|
+
end
|
36
|
+
|
37
|
+
c.default_cassette_options = {
|
38
|
+
serialize_with: :json,
|
39
|
+
# TODO: Track down UTF-8 issue and remove
|
40
|
+
preserve_exact_body_bytes: true,
|
41
|
+
decode_compressed_response: true,
|
42
|
+
record: ENV['TRAVIS'] ? :none : :once
|
43
|
+
}
|
44
|
+
c.cassette_library_dir = 'spec/cassettes'
|
45
|
+
c.hook_into :webmock
|
46
|
+
c.ignore_hosts 'codeclimate.com'
|
47
|
+
end
|
48
|
+
|
26
49
|
def a_delete(url, options = {})
|
27
50
|
a_request(:delete, active_campaign_url(url, options))
|
28
51
|
end
|
@@ -97,7 +120,7 @@ end
|
|
97
120
|
def initialize_new_client
|
98
121
|
before do
|
99
122
|
initialize_active_campaign
|
100
|
-
@client = ActiveCampaign::Client.new
|
123
|
+
@client = ActiveCampaign::Client.new mash: true, debug: true
|
101
124
|
end
|
102
125
|
end
|
103
126
|
|
@@ -107,5 +130,6 @@ def initialize_active_campaign
|
|
107
130
|
config.api_key = "YOURAPIKEY"
|
108
131
|
config.api_output = "json"
|
109
132
|
config.debug = true
|
133
|
+
config.mash = true
|
110
134
|
end
|
111
135
|
end
|
metadata
CHANGED
@@ -1,99 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_campaign
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: httpi
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.8
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.8
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 4.0.0
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 4.0.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: uri_template
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - '>='
|
17
|
+
- - ">="
|
46
18
|
- !ruby/object:Gem::Version
|
47
19
|
version: '0'
|
48
20
|
type: :runtime
|
49
21
|
prerelease: false
|
50
22
|
version_requirements: !ruby/object:Gem::Requirement
|
51
23
|
requirements:
|
52
|
-
- -
|
24
|
+
- - ">="
|
53
25
|
- !ruby/object:Gem::Version
|
54
26
|
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: hashie
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
|
-
- -
|
31
|
+
- - ">="
|
60
32
|
- !ruby/object:Gem::Version
|
61
33
|
version: '0'
|
62
34
|
type: :runtime
|
63
35
|
prerelease: false
|
64
36
|
version_requirements: !ruby/object:Gem::Requirement
|
65
37
|
requirements:
|
66
|
-
- -
|
38
|
+
- - ">="
|
67
39
|
- !ruby/object:Gem::Version
|
68
40
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: oj
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - '>='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: bundler
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ~>
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ~>
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.0'
|
97
41
|
description: A simple ruby wrapper for the ActiveCampaign API
|
98
42
|
email:
|
99
43
|
- mikael@zoolutions.se
|
@@ -101,10 +45,11 @@ executables: []
|
|
101
45
|
extensions: []
|
102
46
|
extra_rdoc_files: []
|
103
47
|
files:
|
104
|
-
- .
|
105
|
-
- .
|
106
|
-
- .
|
107
|
-
- .
|
48
|
+
- ".coveralls.yml"
|
49
|
+
- ".gitignore"
|
50
|
+
- ".rspec"
|
51
|
+
- ".ruby-version"
|
52
|
+
- ".travis.yml"
|
108
53
|
- Gemfile
|
109
54
|
- LICENSE.txt
|
110
55
|
- README.md
|
@@ -112,8 +57,6 @@ files:
|
|
112
57
|
- active_campaign.gemspec
|
113
58
|
- lib/active_campaign.rb
|
114
59
|
- lib/active_campaign/.DS_Store
|
115
|
-
- lib/active_campaign/arguments.rb
|
116
|
-
- lib/active_campaign/authentication.rb
|
117
60
|
- lib/active_campaign/client.rb
|
118
61
|
- lib/active_campaign/client/campaigns.rb
|
119
62
|
- lib/active_campaign/client/contacts.rb
|
@@ -122,12 +65,6 @@ files:
|
|
122
65
|
- lib/active_campaign/configurable.rb
|
123
66
|
- lib/active_campaign/default.rb
|
124
67
|
- lib/active_campaign/error.rb
|
125
|
-
- lib/active_campaign/response/debugger.rb
|
126
|
-
- lib/active_campaign/response/instrumentation.rb
|
127
|
-
- lib/active_campaign/response/json_normalizer.rb
|
128
|
-
- lib/active_campaign/response/mashify.rb
|
129
|
-
- lib/active_campaign/response/parse_json.rb
|
130
|
-
- lib/active_campaign/response/raise_error.rb
|
131
68
|
- lib/active_campaign/version.rb
|
132
69
|
- spec/active_campaign_spec.rb
|
133
70
|
- spec/client/contacts_spec.rb
|
@@ -136,7 +73,7 @@ files:
|
|
136
73
|
- spec/fixtures/contact_sync.json
|
137
74
|
- spec/fixtures/contact_view.json
|
138
75
|
- spec/fixtures/list_view.json
|
139
|
-
- spec/
|
76
|
+
- spec/spec_helper.rb
|
140
77
|
homepage: ''
|
141
78
|
licenses:
|
142
79
|
- MIT
|
@@ -147,17 +84,17 @@ require_paths:
|
|
147
84
|
- lib
|
148
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
86
|
requirements:
|
150
|
-
- -
|
87
|
+
- - ">="
|
151
88
|
- !ruby/object:Gem::Version
|
152
89
|
version: '0'
|
153
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
91
|
requirements:
|
155
|
-
- -
|
92
|
+
- - ">="
|
156
93
|
- !ruby/object:Gem::Version
|
157
94
|
version: '0'
|
158
95
|
requirements: []
|
159
96
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.1.3
|
161
98
|
signing_key:
|
162
99
|
specification_version: 4
|
163
100
|
summary: See http://www.activecampaign.com/api/overview.php for more information
|
@@ -169,5 +106,5 @@ test_files:
|
|
169
106
|
- spec/fixtures/contact_sync.json
|
170
107
|
- spec/fixtures/contact_view.json
|
171
108
|
- spec/fixtures/list_view.json
|
172
|
-
- spec/
|
109
|
+
- spec/spec_helper.rb
|
173
110
|
has_rdoc:
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module ActiveCampaign
|
2
|
-
|
3
|
-
# Authentication methods for {ActiveCampaign::Client}
|
4
|
-
module Authentication
|
5
|
-
|
6
|
-
# Indicates if the client was supplied Basic Auth
|
7
|
-
# username and password
|
8
|
-
#
|
9
|
-
# @see http://developer.github.com/v3/#authentication
|
10
|
-
# @return [Boolean]
|
11
|
-
def basic_authenticated?
|
12
|
-
@login && @password
|
13
|
-
end
|
14
|
-
|
15
|
-
# Indicates if the client was supplied an OAuth
|
16
|
-
# access token
|
17
|
-
#
|
18
|
-
# @see http://developer.github.com/v3/#authentication
|
19
|
-
# @return [Boolean]
|
20
|
-
def token_authenticated?
|
21
|
-
!!@access_token
|
22
|
-
end
|
23
|
-
|
24
|
-
# Indicates if the client was supplied an OAuth
|
25
|
-
# access token or Basic Auth username and password
|
26
|
-
#
|
27
|
-
# @see http://developer.github.com/v3/#authentication
|
28
|
-
# @return [Boolean]
|
29
|
-
def user_authenticated?
|
30
|
-
basic_authenticated? || token_authenticated?
|
31
|
-
end
|
32
|
-
|
33
|
-
# Indicates if the client has OAuth Application
|
34
|
-
# client_id and secret credentials to make anonymous
|
35
|
-
# requests at a higher rate limit
|
36
|
-
#
|
37
|
-
# @see http://developer.github.com/v3/#unauthenticated-rate-limited-requests
|
38
|
-
# @return Boolean
|
39
|
-
def application_authenticated?
|
40
|
-
!!application_authentication
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def application_authentication
|
46
|
-
if @client_id && @client_secret
|
47
|
-
{
|
48
|
-
:client_id => @client_id,
|
49
|
-
:client_secret => @client_secret
|
50
|
-
}
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def login_from_netrc
|
55
|
-
return unless netrc?
|
56
|
-
|
57
|
-
require 'netrc'
|
58
|
-
info = Netrc.read netrc_file
|
59
|
-
netrc_host = URI.parse(api_endpoint).host
|
60
|
-
creds = info[netrc_host]
|
61
|
-
self.login = creds.shift
|
62
|
-
self.password = creds.shift
|
63
|
-
rescue LoadError
|
64
|
-
warn "Please install netrc gem for .netrc support"
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'forwardable'
|
3
|
-
|
4
|
-
module ActiveCampaign
|
5
|
-
module Response
|
6
|
-
class Debugger < Faraday::Response::Middleware
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def initialize(app, logger = nil)
|
10
|
-
super(app)
|
11
|
-
@logger = logger || begin
|
12
|
-
require 'logger'
|
13
|
-
::Logger.new(STDOUT)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def_delegators :@logger, :debug, :info, :warn, :error, :fatal
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
info("#{env[:method]} #{env[:url].to_s}")
|
21
|
-
debug('request') { dump_headers(env[:request_headers]) + "\nbody: #{env[:body]}" }
|
22
|
-
super
|
23
|
-
end
|
24
|
-
|
25
|
-
def on_complete(env)
|
26
|
-
info('Status') { env[:status].to_s }
|
27
|
-
debug('response-head') { dump_headers env[:response_headers] }
|
28
|
-
debug('response-body') { env[:body] }
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def dump_headers(headers)
|
34
|
-
headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
Faraday.register_middleware :middleware, debugger: lambda {
|
41
|
-
ActiveCampaign::Response::Debugger
|
42
|
-
}
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module ActiveCampaign
|
2
|
-
module Response
|
3
|
-
# Public: Instruments requests using Active Support.
|
4
|
-
#
|
5
|
-
# Measures time spent only for synchronous requests.
|
6
|
-
#
|
7
|
-
# Examples
|
8
|
-
#
|
9
|
-
# ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env|
|
10
|
-
# url = env[:url]
|
11
|
-
# http_method = env[:method].to_s.upcase
|
12
|
-
# duration = ends - starts
|
13
|
-
# $stderr.puts '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration]
|
14
|
-
# end
|
15
|
-
class Instrumentation < Faraday::Middleware
|
16
|
-
dependency 'active_support/notifications'
|
17
|
-
|
18
|
-
def initialize(app, options = {})
|
19
|
-
super(app)
|
20
|
-
@name = options.fetch(:name, 'request.faraday')
|
21
|
-
end
|
22
|
-
|
23
|
-
def call(env)
|
24
|
-
ActiveSupport::Notifications.instrument(@name, env) do
|
25
|
-
@app.call(env)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
Faraday.register_middleware :middleware, instrumentation: lambda {
|
32
|
-
ActiveCampaign::Response::Instrumentation
|
33
|
-
}
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'faraday/response'
|
3
|
-
|
4
|
-
module ActiveCampaign
|
5
|
-
module Response
|
6
|
-
class JsonNormalizer < Faraday::Response::Middleware
|
7
|
-
def initialize(app, logger = nil)
|
8
|
-
super(app)
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(environment)
|
12
|
-
@app.call(environment).on_complete do |env|
|
13
|
-
if env[:body].is_a?(Hash)
|
14
|
-
env[:body] = normalize(env[:body])
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def normalize(response)
|
22
|
-
keys, values = keys_values(response)
|
23
|
-
|
24
|
-
if keys.all?{|key| is_numeric?(key) }
|
25
|
-
response[:results] = values
|
26
|
-
keys.each do |key|
|
27
|
-
response.delete(key)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
response
|
32
|
-
end
|
33
|
-
|
34
|
-
def is_numeric?(string)
|
35
|
-
string.to_s.match(/\A[+-]?\d+\Z/) == nil ? false : true
|
36
|
-
end
|
37
|
-
|
38
|
-
def keys_values(response)
|
39
|
-
results = results(response)
|
40
|
-
[results.keys, results.values]
|
41
|
-
end
|
42
|
-
|
43
|
-
def results(response)
|
44
|
-
response.reject{|k,v| %w(result_code result_message result_output).include?(k) }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
Faraday.register_middleware :response, json_normalizer: lambda { ActiveCampaign::Response::JsonNormalizer }
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
|
-
module ActiveCampaign
|
4
|
-
module Response
|
5
|
-
|
6
|
-
# Public: Converts parsed response bodies to a Hashie::Mash if they were of
|
7
|
-
# Hash or Array type.
|
8
|
-
class Mashify < Faraday::Response::Middleware
|
9
|
-
attr_accessor :mash_class
|
10
|
-
|
11
|
-
class << self
|
12
|
-
attr_accessor :mash_class
|
13
|
-
end
|
14
|
-
|
15
|
-
dependency do
|
16
|
-
require 'hashie/mash'
|
17
|
-
self.mash_class = ::Hashie::Mash
|
18
|
-
end
|
19
|
-
|
20
|
-
def initialize(app = nil, options = {})
|
21
|
-
super(app)
|
22
|
-
self.mash_class = options[:mash_class] || self.class.mash_class
|
23
|
-
end
|
24
|
-
|
25
|
-
def parse(body)
|
26
|
-
case body
|
27
|
-
when Hash
|
28
|
-
mash_class.new(body)
|
29
|
-
when Array
|
30
|
-
body.map { |item| parse(item) }
|
31
|
-
else
|
32
|
-
body
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
Faraday.register_middleware :response, mashify: lambda {
|
39
|
-
ActiveCampaign::Response::Mashify
|
40
|
-
}
|
@@ -1,83 +0,0 @@
|
|
1
|
-
module ActiveCampaign
|
2
|
-
module Response
|
3
|
-
# Public: Parse response bodies as Oj.
|
4
|
-
class ParseJson < Faraday::Response::Middleware
|
5
|
-
CONTENT_TYPE = 'Content-Type'.freeze
|
6
|
-
MIME_TYPE = 'application/json'.freeze
|
7
|
-
BRACKETS = %w- [ { -
|
8
|
-
WHITESPACE = [ " ", "\n", "\r", "\t" ]
|
9
|
-
|
10
|
-
dependency do
|
11
|
-
require 'oj' unless defined?(::Oj)
|
12
|
-
end
|
13
|
-
|
14
|
-
def parser
|
15
|
-
lambda { |body|
|
16
|
-
::Oj.load body unless body.strip.empty?
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
def initialize(app = nil, options = {})
|
21
|
-
super(app)
|
22
|
-
@options = options
|
23
|
-
@content_types = Array(options[:content_type])
|
24
|
-
end
|
25
|
-
|
26
|
-
def call(environment)
|
27
|
-
|
28
|
-
|
29
|
-
@app.call(environment).on_complete do |env|
|
30
|
-
process_response(env)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def process_response(env)
|
35
|
-
old_type = env[:response_headers][CONTENT_TYPE].to_s
|
36
|
-
new_type = MIME_TYPE.dup
|
37
|
-
new_type << ';' << old_type.split(';', 2).last if old_type.index(';')
|
38
|
-
env[:response_headers][CONTENT_TYPE] = new_type
|
39
|
-
|
40
|
-
env[:raw_body] = env[:body] if preserve_raw?(env)
|
41
|
-
env[:body] = parse(env[:body])
|
42
|
-
end
|
43
|
-
|
44
|
-
def parse(body)
|
45
|
-
parser.call(body)
|
46
|
-
end
|
47
|
-
|
48
|
-
def response_type(env)
|
49
|
-
type = env[:response_headers][CONTENT_TYPE].to_s
|
50
|
-
type = type.split(';', 2).first if type.index(';')
|
51
|
-
type
|
52
|
-
end
|
53
|
-
|
54
|
-
def process_response_type?(type)
|
55
|
-
@content_types.empty? or @content_types.any? { |pattern|
|
56
|
-
pattern.is_a?(Regexp) ? type =~ pattern : type == pattern
|
57
|
-
}
|
58
|
-
end
|
59
|
-
|
60
|
-
def parse_response?(env)
|
61
|
-
env[:body].respond_to?(:to_str) &&
|
62
|
-
BRACKETS.include?(first_char(env[:body]))
|
63
|
-
end
|
64
|
-
|
65
|
-
def preserve_raw?(env)
|
66
|
-
env[:request].fetch(:preserve_raw, @options[:preserve_raw])
|
67
|
-
end
|
68
|
-
|
69
|
-
def first_char(body)
|
70
|
-
idx = -1
|
71
|
-
begin
|
72
|
-
char = body[idx += 1]
|
73
|
-
char = char.chr if char
|
74
|
-
end while char and WHITESPACE.include? char
|
75
|
-
char
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
Faraday.register_middleware :response, parse_json: lambda {
|
82
|
-
ActiveCampaign::Response::ParseJson
|
83
|
-
}
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'active_campaign/error'
|
3
|
-
|
4
|
-
module ActiveCampaign
|
5
|
-
# Faraday response middleware
|
6
|
-
module Response
|
7
|
-
|
8
|
-
# This class raises an ActiveCampaign-flavored exception based
|
9
|
-
# HTTP status codes returned by the API
|
10
|
-
class RaiseError < Faraday::Response::Middleware
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def on_complete(response)
|
15
|
-
if error = ActiveCampaign::Error.from_response(response)
|
16
|
-
raise error
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
Faraday.register_middleware :response, raise_error: lambda {
|
23
|
-
ActiveCampaign::Response::RaiseError
|
24
|
-
}
|