my_target_api 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
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