metrica_api 0.0.1 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c3c643b1ea64446fe23364c2a604315c42b955d
4
- data.tar.gz: 5ba637f4d9e0f9a6cb3bfe2a6f0a033a9045e1af
3
+ metadata.gz: 470d1d2c35f69277c4ca146eecc9543079a71e10
4
+ data.tar.gz: 6e8c708f47a6e2b264e28dc4a82592dae3c48f91
5
5
  SHA512:
6
- metadata.gz: db478488dc9de228d540d06bc557068d339a52380ff2e5add8d21eaf56a9fd1b80acaf37d05b52cde0c3ca058f29bc9655df5e267c410c81af055705659e8e0f
7
- data.tar.gz: cc951ae6daa065a07fccbe0f47f7bf165e96fa6335f78b00bb5fe1656510123ec7909919223cc473748e3597d9279077a77113244a4939ea37af5c594a86d039
6
+ metadata.gz: 6ad06e718c1c6c86a11840a4f11991fa847a8f5fc6a096ebd0a99ca867942aeb8cd38e7c62d5738adb0c414eef121a2bef9514c2376805c93d41612d2a3b9326
7
+ data.tar.gz: 15c1b357d6e2f9101aae19075b0e2ae3e12d2013b03036030074be6c598bd4f0faeeb0b7f5d715c0af964b7a5cf32596a202cfff85b8691b11b65d0cfc77999f
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  # Connection error class
5
5
  class ConnectionError < StandardError
6
6
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  # Request error class
5
5
  class RequestError < StandardError
6
6
  end
@@ -1,44 +1,78 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
4
- # Yandex Metrica request module
5
- module Request
3
+ class MetricaApi
4
+ # Yandex Metrica request
5
+ class Request
6
6
 
7
- module_function
7
+ def self.call(options, params = {})
8
+ Request.new(options, params).call
9
+ end
8
10
 
9
- def make_request(options, params = {})
11
+ def initialize(options, params = {})
12
+ @options = options
13
+ @params = params
14
+ end
10
15
 
11
- params[:oauth_token] = options.fetch(:oauth_token)
12
- response = RestClient::Request.execute(build(options, params))
13
- MetricaApi.logger << response if MetricaApi.logger
14
- response
16
+ def call
17
+ execute!.tap do |response|
18
+ if logger
19
+ logger << full_url
20
+ logger << response
21
+ end
22
+ end
15
23
  rescue RestClient::Unauthorized,
16
- RestClient::Forbidden,
17
- RestClient::BadRequest,
18
- RestClient::ResourceNotFound => e
24
+ RestClient::Forbidden,
25
+ RestClient::BadRequest,
26
+ RestClient::ResourceNotFound => e
19
27
  raise MetricaApi::RequestError,
20
- "url: #{build_url(options)}?#{params.to_query}, original: #{e.message}"
28
+ "url: #{full_url}, original: #{e.message}"
21
29
  rescue SocketError => e
22
30
  raise MetricaApi::ConnectionError, e.message
31
+ end
32
+
33
+ private
23
34
 
35
+ attr_reader :options, :params
36
+
37
+ def execute!
38
+ RestClient::Request.execute(rest_client_options)
24
39
  end
25
40
 
26
- def build(options, params)
27
- params[:oauth_token] = options.fetch(:oauth_token)
41
+ def rest_client_options
28
42
  {
29
43
  method: :get,
30
- url: build_url(options),
31
- headers: { params: params },
44
+ url: base_url,
45
+ headers: { params: params_with_token },
32
46
  log: MetricaApi.logger
33
47
  }.compact
34
48
  end
35
49
 
36
- def build_url(options)
37
- api_section = options[:api_section]
38
- version = options[:v] || DEFAULT_VERSION
39
- method = options[:method]
40
- format = options[:format] || DEFAULT_FORMAT
41
- "#{API_HOST}/#{api_section}/#{version}/#{method}.#{format}"
50
+ def logger
51
+ MetricaApi.logger
52
+ end
53
+
54
+ def full_url
55
+ "#{base_url}?#{query}"
56
+ end
57
+
58
+ def query
59
+ params_with_token.map do |key, value|
60
+ [CGI.escape(key.to_s), '=', CGI.escape(value.to_s)]
61
+ end.map(&:join).join('&')
62
+ end
63
+
64
+ def params_with_token
65
+ @_params_with_token ||= params.merge(oauth_token: options.fetch(:oauth_token))
66
+ end
67
+
68
+ def base_url
69
+ @_base_url ||= begin
70
+ api_section = options[:api_section]
71
+ version = options[:v] || DEFAULT_VERSION
72
+ method = options[:method]
73
+ format = options[:format] || DEFAULT_FORMAT
74
+ "#{API_HOST}/#{api_section}/#{version}/#{method}.#{format}"
75
+ end
42
76
  end
43
77
 
44
78
  end
@@ -1,12 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  # Yandex Metrica response parser
5
- module Response
5
+ class Response
6
6
 
7
- module_function
8
-
9
- def parse(response)
7
+ def self.parse(response)
10
8
  if response.is_a?(Array)
11
9
  response.map { |r| parse(r) }
12
10
  elsif response.is_a?(String)
@@ -18,9 +16,5 @@ module MetricaApi
18
16
  response
19
17
  end
20
18
 
21
- def json_parse(response)
22
- JSON.parse(response)
23
- end
24
-
25
19
  end
26
20
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  module Sections
5
5
  # Couters API
6
6
  class Counters
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  module Sections
5
5
  # Reporting API
6
6
  class Reporting
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
  # Metrica Api session object
5
5
  class Session
6
6
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module MetricaApi
3
+ class MetricaApi
4
4
 
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
6
6
 
7
7
  end
data/lib/metrica_api.rb CHANGED
@@ -6,7 +6,7 @@ require 'metrica_api/sections/reporting'
6
6
  require 'metrica_api/sections/counters'
7
7
 
8
8
  # Yandex Metrica API module
9
- module MetricaApi
9
+ class MetricaApi
10
10
 
11
11
  API_HOST = 'https://api-metrika.yandex.ru'
12
12
  DEFAULT_VERSION = 'v1'
@@ -16,37 +16,41 @@ module MetricaApi
16
16
  autoload :Request, 'metrica_api/request'
17
17
  autoload :Session, 'metrica_api/session'
18
18
 
19
- autoload :ConnectionError, 'metrica_api/errors/connection_error'
20
- autoload :RequestError, 'metrica_api/errors/request_error'
19
+ autoload :ConnectionError, 'metrica_api/errors/connection_error'
20
+ autoload :RequestError, 'metrica_api/errors/request_error'
21
21
 
22
- autoload :Counters, 'metrica_api/sections/counters'
22
+ autoload :Counters, 'metrica_api/sections/counters'
23
23
  autoload :Reporting, 'metrica_api/sections/reporting'
24
24
 
25
- mattr_accessor :logger
25
+ class << self
26
26
 
27
- module_function
27
+ attr_accessor :logger
28
28
 
29
- # @param options [Hash<:api_section, :method, :oauth_token[, :v[, :format]]>] navigation to method
30
- # @param params [Hash] params for method
31
- # @result [Hash] response as ruby plain object
32
- def call(options, params)
33
- response_parser.parse(request.make_request(options, params).to_s)
34
- end
29
+ # @param options [Hash<:api_section, :method, :oauth_token[, :v[, :format]]>] navigation to method
30
+ # @param params [Hash] params for method
31
+ # @result [Hash] response as ruby plain object
32
+ def call(options, params)
33
+ response_parser.parse(request.call(options, params).to_s)
34
+ end
35
35
 
36
- def counters(token)
37
- Sections::Counters.new(token)
38
- end
36
+ def counters(token)
37
+ Sections::Counters.new(token)
38
+ end
39
39
 
40
- def reporting(token)
41
- Sections::Reporting.new(token)
42
- end
40
+ def reporting(token)
41
+ Sections::Reporting.new(token)
42
+ end
43
43
 
44
- def response_parser
45
- Response
46
- end
44
+ def response_parser
45
+ Response
46
+ end
47
+
48
+ def request
49
+ Request
50
+ end
51
+
52
+ private
47
53
 
48
- def request
49
- Request
50
54
  end
51
55
 
52
56
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'metrica_api'
4
+
5
+ describe 'Requests' do
6
+ let(:access_token) { 'oauth_token' }
7
+
8
+ describe 'Counters' do
9
+ let(:api_object) { MetricaApi.counters(access_token) }
10
+
11
+ it 'performs GET-request' do
12
+ stub_request(
13
+ :get,
14
+ 'https://api-metrika.yandex.ru/management/v1/counters.json?' +
15
+ 'oauth_token=oauth_token&some_param=some_value'
16
+ ).to_return(body: '{"some_array": ["some", "items"], "some_number": 35}')
17
+
18
+ expect(api_object.data({ some_param: 'some_value' })).to(
19
+ eq("some_array" => ["some", "items"], "some_number" => 35)
20
+ )
21
+ end
22
+ end
23
+
24
+ describe 'Reporting' do
25
+ let(:api_object) { MetricaApi.reporting(access_token) }
26
+
27
+ it 'performs GET-request' do
28
+ stub_request(
29
+ :get,
30
+ 'https://api-metrika.yandex.ru/stat/v1/data.json?' +
31
+ 'oauth_token=oauth_token&some_param=some_value'
32
+ ).to_return(body: '{"some_array": ["some", "items"], "some_number": 35}')
33
+
34
+ expect(api_object.data({ some_param: 'some_value' })).to(
35
+ eq("some_array" => ["some", "items"], "some_number" => 35)
36
+ )
37
+ end
38
+ end
39
+
40
+ describe 'Logger' do
41
+ let(:logger) { double('Logger double', '<<': nil) }
42
+ before { MetricaApi.logger = logger }
43
+ after { MetricaApi.logger = nil }
44
+
45
+ it 'logs requests' do
46
+ stub_request(
47
+ :get,
48
+ 'https://api-metrika.yandex.ru/stat/v1/data.json?' +
49
+ 'oauth_token=oauth_token&some_param=some_value'
50
+ ).to_return(body: '{"some_array": ["some", "items"], "some_number": 35}')
51
+
52
+ expect(logger).to(
53
+ receive(:<<).with('https://api-metrika.yandex.ru/stat/v1/data.json?' +
54
+ 'some_param=some_value&oauth_token=oauth_token')
55
+ )
56
+ expect(logger).to(
57
+ receive(:<<).with('{"some_array": ["some", "items"], "some_number": 35}')
58
+ )
59
+
60
+ MetricaApi.reporting(access_token).data({ some_param: 'some_value' })
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'webmock/rspec'
4
+
5
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.shared_context_metadata_behavior = :apply_to_host_groups
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metrica_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OneRetarget.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-19 00:00:00.000000000 Z
11
+ date: 2018-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -161,6 +161,8 @@ files:
161
161
  - lib/metrica_api/session.rb
162
162
  - lib/metrica_api/version.rb
163
163
  - metrica_api.gemspec
164
+ - spec/request_spec.rb
165
+ - spec/spec_helper.rb
164
166
  homepage: https://github.com/resivalex/metrica_api
165
167
  licenses:
166
168
  - MIT
@@ -185,4 +187,6 @@ rubygems_version: 2.6.11
185
187
  signing_key:
186
188
  specification_version: 4
187
189
  summary: Ruby client for Yandex Metrica API
188
- test_files: []
190
+ test_files:
191
+ - spec/request_spec.rb
192
+ - spec/spec_helper.rb