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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 31c5a7b6d6b7d6de79c2704db6b9bc3101b0162d
4
- data.tar.gz: 9e8755caca634eba30406c48fb2045270124f7f8
3
+ metadata.gz: 0534d2ade6c5094fbd43f6564d1a9d14a3b7e19f
4
+ data.tar.gz: 76e109957b1ea31fbd6f35ce4e2323c665585a4a
5
5
  SHA512:
6
- metadata.gz: 937f7bb1e42d43d6661bacd65300f9104974ed9460665ddfd5488b9f29dccbcd4cfba3f886283190b8c186939182162cd88e916196abfb2063ebab9119a9509b
7
- data.tar.gz: 2de78c84e54ef5567f9a1eb1999e8004940d98f9876db64ace2bdab8fc0c838c5310773d7378512de03e406395cb8bc477f000fb6619cf4b28a5c9d7928fcb1e
6
+ metadata.gz: 4aafd4665a3b022f6b8ee3191432107005bfae18a75cc75b68a047964d914df16ce1014fca9d53e663273c74ce65382f8d1b9a6a887d4ae0ac23f3e90a00d683
7
+ data.tar.gz: f8e106020f78d3de052431d1b33d6f917b4298b2be46c722ed101654b250b6a427a1b2b9cde8192f756cb35f9d8ceff8026966ded5d0e606f3996ab333c26201
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- my_target_api (2.0.3)
4
+ my_target_api (2.0.5)
5
5
  json (~> 2.0, >= 2.0.0)
6
6
  rest-client (~> 2.0, >= 2.0.0)
7
7
 
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```
10
- gem 'my_target_api', '~> 2.0.4'
10
+ gem 'my_target_api', '~> 2.0.5'
11
11
  ```
12
12
 
13
13
  Or install from command line:
@@ -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
- request_options = {
49
- logger: options[:logger],
50
- access_token: access_token,
51
- headers: options[:headers]
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 './response_formatter'
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
- def initialize(origin, options = {})
10
+ CONTENT_OUTPUT_LIMIT = 1000
11
+
12
+ def initialize(origin, logger: NilLogger)
12
13
  @origin = origin
13
- @options = options
14
+ @logger = logger
14
15
  end
15
16
 
16
- def get(url, params = {})
17
- log_hash(method: 'Request#get', url: url, params: params)
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
- log_hash(method: 'Request#post', url: url, params: params)
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
- log_hash(method: 'Request#delete', url: url, params: params)
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
- log_hash(method: 'Request#upload', url: url, params: params, content: 'no logging')
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, :options
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 log_hash(hash)
45
- log(hash.map do |key, value|
46
- "#{key}: #{value.is_a?(String) ? value : value.inspect}"
47
- end.join("\n"))
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 log(message)
51
- options[:logger] << message if options[:logger]
91
+ def inspect_param(value)
92
+ value.is_a?(String) ? value : value.inspect
52
93
  end
53
94
 
54
95
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MyTargetApi
4
+ # NULL object
5
+ class NilLogger
6
+
7
+ def self.<<(_message); end
8
+
9
+ end
10
+ 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(options = {})
12
- @options = options
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, body_parameters(params), headers)
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' }.merge(headers).merge(query(params))
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 :options
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
- log("#{original_exception.class.name} #{original_exception.message}")
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
- log(ResponseFormatter.new(response).format)
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  class MyTargetApi
4
4
 
5
- VERSION = '2.0.4'
5
+ VERSION = '2.0.5'
6
6
 
7
7
  end
@@ -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::Request.new(access_token: 'my_target_token')
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), 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(have_received(:<<).with("method: Request#get\n"\
131
- "url: https://target.my.com/api/v1/request.json\n"\
132
- 'params: {}'))
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), 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("method: Request#get\n"\
163
- "url: https://target.my.com/api/v1/request.json\n"\
164
- 'params: {}'))
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
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-01 00:00:00.000000000 Z
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