my_target_api 2.0.4 → 2.0.5
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/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/my_target_api.rb +15 -10
- data/lib/my_target_api/add_access_token_to_request_decorator.rb +43 -0
- data/lib/my_target_api/log_request_parameters_decorator.rb +64 -23
- data/lib/my_target_api/nil_logger.rb +10 -0
- data/lib/my_target_api/prepare_post_params_decorator.rb +56 -0
- data/lib/my_target_api/request.rb +14 -53
- data/lib/my_target_api/version.rb +1 -1
- data/spec/request_spec.rb +21 -10
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0534d2ade6c5094fbd43f6564d1a9d14a3b7e19f
|
4
|
+
data.tar.gz: 76e109957b1ea31fbd6f35ce4e2323c665585a4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4aafd4665a3b022f6b8ee3191432107005bfae18a75cc75b68a047964d914df16ce1014fca9d53e663273c74ce65382f8d1b9a6a887d4ae0ac23f3e90a00d683
|
7
|
+
data.tar.gz: f8e106020f78d3de052431d1b33d6f917b4298b2be46c722ed101654b250b6a427a1b2b9cde8192f756cb35f9d8ceff8026966ded5d0e606f3996ab333c26201
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/lib/my_target_api.rb
CHANGED
@@ -10,6 +10,8 @@ class MyTargetApi
|
|
10
10
|
autoload :RequestError, 'my_target_api/request_error'
|
11
11
|
autoload :NetClient, 'my_target_api/net_client'
|
12
12
|
autoload :LogRequestParametersDecorator, 'my_target_api/log_request_parameters_decorator'
|
13
|
+
autoload :AddAccessTokenToRequestDecorator, 'my_target_api/add_access_token_to_request_decorator'
|
14
|
+
autoload :PreparePostParamsDecorator, 'my_target_api/prepare_post_params_decorator'
|
13
15
|
|
14
16
|
def initialize(access_token, options = {})
|
15
17
|
@access_token = access_token
|
@@ -24,19 +26,19 @@ class MyTargetApi
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def get_request(url, params)
|
27
|
-
request_object.get(url, params)
|
29
|
+
request_object.get(url, params, headers)
|
28
30
|
end
|
29
31
|
|
30
32
|
def post_request(url, params)
|
31
|
-
request_object.post(url, params)
|
33
|
+
request_object.post(url, params, headers)
|
32
34
|
end
|
33
35
|
|
34
36
|
def delete_request(url, params)
|
35
|
-
request_object.delete(url, params)
|
37
|
+
request_object.delete(url, params, headers)
|
36
38
|
end
|
37
39
|
|
38
40
|
def upload_request(url, content, params)
|
39
|
-
request_object.upload(url, content, params)
|
41
|
+
request_object.upload(url, content, params, headers)
|
40
42
|
end
|
41
43
|
|
42
44
|
private
|
@@ -45,13 +47,16 @@ class MyTargetApi
|
|
45
47
|
|
46
48
|
def request_object
|
47
49
|
@_request_object ||= begin
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
LogRequestParametersDecorator.new(Request.new(request_options), request_options)
|
50
|
+
logger = options[:logger]
|
51
|
+
request = Request.new(logger: logger)
|
52
|
+
request = LogRequestParametersDecorator.new(request, { logger: logger }.compact)
|
53
|
+
request = AddAccessTokenToRequestDecorator.new(request, { access_token: access_token })
|
54
|
+
PreparePostParamsDecorator.new(request)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
58
|
+
def headers
|
59
|
+
options[:headers] || {}
|
60
|
+
end
|
61
|
+
|
57
62
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class MyTargetApi
|
4
|
+
# Add Authorization header
|
5
|
+
class AddAccessTokenToRequestDecorator
|
6
|
+
|
7
|
+
CONTENT_OUTPUT_LIMIT = 1000
|
8
|
+
|
9
|
+
def initialize(origin, access_token: nil)
|
10
|
+
@origin = origin
|
11
|
+
@access_token = access_token
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(url, params = {}, headers = {})
|
15
|
+
origin.get(url, params, add_authorization_header(headers))
|
16
|
+
end
|
17
|
+
|
18
|
+
def post(url, params = {}, headers = {})
|
19
|
+
origin.post(url, params, add_authorization_header(headers))
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete(url, params = {}, headers = {})
|
23
|
+
origin.delete(url, params, add_authorization_header(headers))
|
24
|
+
end
|
25
|
+
|
26
|
+
def upload(url, content, params = {}, headers = {})
|
27
|
+
origin.upload(url, content, params, add_authorization_header(headers))
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :origin, :access_token
|
33
|
+
|
34
|
+
def add_authorization_header(headers)
|
35
|
+
if access_token
|
36
|
+
{ 'Authorization' => "Bearer #{access_token}" }.merge(headers)
|
37
|
+
else
|
38
|
+
headers
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -1,54 +1,95 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'json'
|
4
|
-
require_relative './
|
5
|
-
require_relative './net_client'
|
4
|
+
require_relative './nil_logger'
|
6
5
|
|
7
6
|
class MyTargetApi
|
8
7
|
# Requests
|
9
8
|
class LogRequestParametersDecorator
|
10
9
|
|
11
|
-
|
10
|
+
CONTENT_OUTPUT_LIMIT = 1000
|
11
|
+
|
12
|
+
def initialize(origin, logger: NilLogger)
|
12
13
|
@origin = origin
|
13
|
-
@
|
14
|
+
@logger = logger
|
14
15
|
end
|
15
16
|
|
16
|
-
def get(url, params = {})
|
17
|
-
|
17
|
+
def get(url, params = {}, headers = {})
|
18
|
+
log_request(method: 'GET', url: url, params: params, headers: headers)
|
18
19
|
|
19
|
-
origin.get(url, params)
|
20
|
+
origin.get(url, params, headers)
|
20
21
|
end
|
21
22
|
|
22
|
-
def post(url, params = {})
|
23
|
-
|
23
|
+
def post(url, params = {}, headers = {})
|
24
|
+
log_request(method: 'POST', url: url, params: params, headers: headers)
|
24
25
|
|
25
|
-
origin.post(url, params)
|
26
|
+
origin.post(url, params, headers)
|
26
27
|
end
|
27
28
|
|
28
|
-
def delete(url, params = {})
|
29
|
-
|
29
|
+
def delete(url, params = {}, headers = {})
|
30
|
+
log_request(method: 'DELETE', url: url, params: params, headers: headers)
|
30
31
|
|
31
|
-
origin.delete(url, params)
|
32
|
+
origin.delete(url, params, headers)
|
32
33
|
end
|
33
34
|
|
34
|
-
def upload(url, content, params = {})
|
35
|
-
|
35
|
+
def upload(url, content, params = {}, headers = {})
|
36
|
+
log_request(method: 'POST', url: url, params: params, headers: headers, content: content)
|
36
37
|
|
37
|
-
origin.upload(url, content, params)
|
38
|
+
origin.upload(url, content, params, headers)
|
38
39
|
end
|
39
40
|
|
40
41
|
private
|
41
42
|
|
42
|
-
attr_reader :origin, :
|
43
|
+
attr_reader :origin, :logger
|
44
|
+
|
45
|
+
def log_request(method:, url:, params:, headers:, content: nil)
|
46
|
+
logger <<
|
47
|
+
"#{inspect_request(method: method, url: url, params: params, headers: headers)}"\
|
48
|
+
"#{inspect_content(content)}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def inspect_request(method:, url:, params:, headers:)
|
52
|
+
<<~LOG
|
53
|
+
#{method} #{url}
|
54
|
+
#{inspect_headers(headers)}
|
55
|
+
#{inspect_params(params)}
|
56
|
+
LOG
|
57
|
+
end
|
58
|
+
|
59
|
+
def inspect_content(content)
|
60
|
+
return '' unless content
|
61
|
+
|
62
|
+
result = "Body content:\n"
|
63
|
+
result +=
|
64
|
+
if content.size > CONTENT_OUTPUT_LIMIT
|
65
|
+
<<~LOG
|
66
|
+
<< first #{CONTENT_OUTPUT_LIMIT} symbols >>
|
67
|
+
#{content[0...CONTENT_OUTPUT_LIMIT]}
|
68
|
+
LOG
|
69
|
+
else
|
70
|
+
"#{content}"
|
71
|
+
end
|
72
|
+
result
|
73
|
+
end
|
74
|
+
|
75
|
+
def inspect_headers(params)
|
76
|
+
if params.empty?
|
77
|
+
'Headers: No headers'
|
78
|
+
else
|
79
|
+
"Headers:\n#{params.map { |name, value| "#{name}: #{value}" }.join("\n")}"
|
80
|
+
end
|
81
|
+
end
|
43
82
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
83
|
+
def inspect_params(params)
|
84
|
+
if params.empty?
|
85
|
+
'Params: No params'
|
86
|
+
else
|
87
|
+
"Params:\n#{params.map { |name, value| "#{name}: #{inspect_param(value)}" }.join("\n")}"
|
88
|
+
end
|
48
89
|
end
|
49
90
|
|
50
|
-
def
|
51
|
-
|
91
|
+
def inspect_param(value)
|
92
|
+
value.is_a?(String) ? value : value.inspect
|
52
93
|
end
|
53
94
|
|
54
95
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class MyTargetApi
|
6
|
+
# Prepare post params
|
7
|
+
class PreparePostParamsDecorator
|
8
|
+
|
9
|
+
def initialize(origin)
|
10
|
+
@origin = origin
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(url, params = {}, headers = {})
|
14
|
+
origin.get(url, params, headers)
|
15
|
+
end
|
16
|
+
|
17
|
+
def post(url, params = {}, headers = {})
|
18
|
+
prepared = body_parameters(params)
|
19
|
+
|
20
|
+
if prepared.is_a?(String)
|
21
|
+
origin.upload(url, prepared, {}, { 'Content-Type' => 'application/json' }.merge(headers))
|
22
|
+
else
|
23
|
+
origin.post(url, prepared, headers)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete(url, params = {}, headers = {})
|
28
|
+
origin.delete(url, params, headers)
|
29
|
+
end
|
30
|
+
|
31
|
+
def upload(url, content, params = {}, headers = {})
|
32
|
+
origin.upload(url, content, params, headers)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :origin
|
38
|
+
|
39
|
+
def body_parameters(params)
|
40
|
+
result_params = params.dup
|
41
|
+
|
42
|
+
if result_params.values.any? { |param| param.is_a? IO } || result_params[:grant_type]
|
43
|
+
individual_body_parameters(result_params)
|
44
|
+
else
|
45
|
+
result_params.to_json
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def individual_body_parameters(params)
|
50
|
+
params.transform_values do |value|
|
51
|
+
value.is_a?(Array) || value.is_a?(Hash) ? value.to_json : value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -3,16 +3,17 @@
|
|
3
3
|
require 'json'
|
4
4
|
require_relative './response_formatter'
|
5
5
|
require_relative './net_client'
|
6
|
+
require_relative './nil_logger'
|
6
7
|
|
7
8
|
class MyTargetApi
|
8
9
|
# Requests
|
9
10
|
class Request
|
10
11
|
|
11
|
-
def initialize(
|
12
|
-
@
|
12
|
+
def initialize(logger: NilLogger)
|
13
|
+
@logger = logger
|
13
14
|
end
|
14
15
|
|
15
|
-
def get(url, params = {})
|
16
|
+
def get(url, params = {}, headers = {})
|
16
17
|
response = with_exception_handling(params) do
|
17
18
|
NetClient.get(url, headers.merge(query(params)))
|
18
19
|
end
|
@@ -20,15 +21,15 @@ class MyTargetApi
|
|
20
21
|
process_response(response)
|
21
22
|
end
|
22
23
|
|
23
|
-
def post(url, params = {})
|
24
|
+
def post(url, params = {}, headers = {})
|
24
25
|
response = with_exception_handling(params) do
|
25
|
-
NetClient.post(url,
|
26
|
+
NetClient.post(url, params, headers)
|
26
27
|
end
|
27
28
|
|
28
29
|
process_response(response)
|
29
30
|
end
|
30
31
|
|
31
|
-
def delete(url, params = {})
|
32
|
+
def delete(url, params = {}, headers = {})
|
32
33
|
response = with_exception_handling(params) do
|
33
34
|
NetClient.delete(url, headers.merge(query(params)))
|
34
35
|
end
|
@@ -36,12 +37,14 @@ class MyTargetApi
|
|
36
37
|
process_response(response)
|
37
38
|
end
|
38
39
|
|
39
|
-
def upload(url, content, params = {})
|
40
|
+
def upload(url, content, params = {}, headers = {})
|
40
41
|
response = with_exception_handling(params) do
|
41
42
|
NetClient.post(
|
42
43
|
url,
|
43
44
|
content,
|
44
|
-
{ 'Content-Type' => 'application/octet-stream' }
|
45
|
+
{ 'Content-Type' => 'application/octet-stream' }
|
46
|
+
.merge(headers)
|
47
|
+
.merge(query(params))
|
45
48
|
)
|
46
49
|
end
|
47
50
|
|
@@ -50,36 +53,12 @@ class MyTargetApi
|
|
50
53
|
|
51
54
|
private
|
52
55
|
|
53
|
-
attr_reader :
|
54
|
-
|
55
|
-
def body_parameters(params)
|
56
|
-
result_params = params.dup
|
57
|
-
|
58
|
-
if result_params.values.any? { |param| param.is_a? IO } || result_params[:grant_type]
|
59
|
-
individual_body_parameters(result_params)
|
60
|
-
else
|
61
|
-
result_params.to_json
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def individual_body_parameters(params)
|
66
|
-
params.transform_values do |value|
|
67
|
-
value.is_a?(Array) || value.is_a?(Hash) ? value.to_json : value
|
68
|
-
end
|
69
|
-
end
|
56
|
+
attr_reader :logger
|
70
57
|
|
71
58
|
def query(params)
|
72
59
|
{ params: params }
|
73
60
|
end
|
74
61
|
|
75
|
-
def headers
|
76
|
-
if access_token
|
77
|
-
optional_headers.merge('Authorization' => "Bearer #{access_token}")
|
78
|
-
else
|
79
|
-
optional_headers
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
62
|
def process_response(response)
|
84
63
|
JSON.parse(response.body)
|
85
64
|
rescue JSON::ParserError
|
@@ -93,18 +72,12 @@ class MyTargetApi
|
|
93
72
|
response
|
94
73
|
rescue NetClient::Exception => e
|
95
74
|
original_exception = e.original_exception
|
96
|
-
|
75
|
+
logger << "#{original_exception.class.name} #{original_exception.message}"
|
97
76
|
raise_with_params(params: params, original_exception: original_exception)
|
98
77
|
end
|
99
78
|
|
100
79
|
def log_response(response)
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
def headers_to_string(headers)
|
105
|
-
headers.map do |name, value|
|
106
|
-
"#{name}: #{value}"
|
107
|
-
end.join("\n")
|
80
|
+
logger << ResponseFormatter.new(response).format
|
108
81
|
end
|
109
82
|
|
110
83
|
def raise_with_params(params:, response: nil, original_exception: nil)
|
@@ -115,17 +88,5 @@ class MyTargetApi
|
|
115
88
|
raise result
|
116
89
|
end
|
117
90
|
|
118
|
-
def log(message)
|
119
|
-
options[:logger] << message if options[:logger]
|
120
|
-
end
|
121
|
-
|
122
|
-
def access_token
|
123
|
-
options[:access_token]
|
124
|
-
end
|
125
|
-
|
126
|
-
def optional_headers
|
127
|
-
options[:headers] || {}
|
128
|
-
end
|
129
|
-
|
130
91
|
end
|
131
92
|
end
|
data/spec/request_spec.rb
CHANGED
@@ -21,7 +21,7 @@ describe MyTargetApi::Request do
|
|
21
21
|
result = subject.post('https://target.my.com/api/v1/campaigns.json')
|
22
22
|
|
23
23
|
expect(MyTargetApi::NetClient).to(
|
24
|
-
have_received(:post).with('https://target.my.com/api/v1/campaigns.json',
|
24
|
+
have_received(:post).with('https://target.my.com/api/v1/campaigns.json', {}, {})
|
25
25
|
)
|
26
26
|
|
27
27
|
expect(result).to eq('name' => 'Campaign 1')
|
@@ -96,7 +96,10 @@ describe MyTargetApi::Request do
|
|
96
96
|
headers: {}))
|
97
97
|
)
|
98
98
|
|
99
|
-
request = MyTargetApi::
|
99
|
+
request = MyTargetApi::AddAccessTokenToRequestDecorator.new(
|
100
|
+
MyTargetApi::Request.new,
|
101
|
+
access_token: 'my_target_token'
|
102
|
+
)
|
100
103
|
request.get('https://target.my.com/api/v1/some_path.json')
|
101
104
|
|
102
105
|
expect(MyTargetApi::NetClient).to(
|
@@ -117,7 +120,7 @@ describe MyTargetApi::Request do
|
|
117
120
|
logger = double('Logger double', '<<': nil)
|
118
121
|
options = { logger: logger }
|
119
122
|
request = MyTargetApi::LogRequestParametersDecorator.new(
|
120
|
-
MyTargetApi::Request.new(options),
|
123
|
+
MyTargetApi::Request.new(options), logger: logger
|
121
124
|
)
|
122
125
|
allow(MyTargetApi::NetClient).to(
|
123
126
|
receive(:get).and_return(double(code: 200,
|
@@ -127,9 +130,14 @@ describe MyTargetApi::Request do
|
|
127
130
|
|
128
131
|
request.get('https://target.my.com/api/v1/request.json')
|
129
132
|
|
130
|
-
expect(logger).to(
|
131
|
-
|
132
|
-
|
133
|
+
expect(logger).to(
|
134
|
+
have_received(:<<)
|
135
|
+
.with(<<~LOG)
|
136
|
+
GET https://target.my.com/api/v1/request.json
|
137
|
+
Headers: No headers
|
138
|
+
Params: No params
|
139
|
+
LOG
|
140
|
+
)
|
133
141
|
expect(logger).to(have_received(:<<).with(<<~LOG))
|
134
142
|
HTTP Code: 200
|
135
143
|
HTTP Body:
|
@@ -142,7 +150,7 @@ describe MyTargetApi::Request do
|
|
142
150
|
logger = double('Logger double', '<<': nil)
|
143
151
|
options = { logger: logger }
|
144
152
|
request = MyTargetApi::LogRequestParametersDecorator.new(
|
145
|
-
MyTargetApi::Request.new(options),
|
153
|
+
MyTargetApi::Request.new(options), logger: logger
|
146
154
|
)
|
147
155
|
allow(MyTargetApi::NetClient).to(
|
148
156
|
receive(:get).and_return(
|
@@ -159,9 +167,12 @@ describe MyTargetApi::Request do
|
|
159
167
|
'404: Unknown resource. Inspect #params, #response and #original_exception'\
|
160
168
|
' for more details')
|
161
169
|
|
162
|
-
expect(logger).to(have_received(:<<).with(
|
163
|
-
|
164
|
-
|
170
|
+
expect(logger).to(have_received(:<<).with(<<~LOG))
|
171
|
+
GET https://target.my.com/api/v1/request.json
|
172
|
+
Headers: No headers
|
173
|
+
Params: No params
|
174
|
+
LOG
|
175
|
+
|
165
176
|
expect(logger).to(have_received(:<<).with(<<~LOG))
|
166
177
|
HTTP Code: 404
|
167
178
|
HTTP Body:
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_target_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OneRetarget.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -153,8 +153,11 @@ files:
|
|
153
153
|
- LICENSE.txt
|
154
154
|
- README.md
|
155
155
|
- lib/my_target_api.rb
|
156
|
+
- lib/my_target_api/add_access_token_to_request_decorator.rb
|
156
157
|
- lib/my_target_api/log_request_parameters_decorator.rb
|
157
158
|
- lib/my_target_api/net_client.rb
|
159
|
+
- lib/my_target_api/nil_logger.rb
|
160
|
+
- lib/my_target_api/prepare_post_params_decorator.rb
|
158
161
|
- lib/my_target_api/request.rb
|
159
162
|
- lib/my_target_api/request_error.rb
|
160
163
|
- lib/my_target_api/resource.rb
|