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 +4 -4
- data/lib/metrica_api/errors/connection_error.rb +1 -1
- data/lib/metrica_api/errors/request_error.rb +1 -1
- data/lib/metrica_api/request.rb +57 -23
- data/lib/metrica_api/response.rb +3 -9
- data/lib/metrica_api/sections/counters.rb +1 -1
- data/lib/metrica_api/sections/reporting.rb +1 -1
- data/lib/metrica_api/session.rb +1 -1
- data/lib/metrica_api/version.rb +2 -2
- data/lib/metrica_api.rb +27 -23
- data/spec/request_spec.rb +63 -0
- data/spec/spec_helper.rb +16 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 470d1d2c35f69277c4ca146eecc9543079a71e10
|
4
|
+
data.tar.gz: 6e8c708f47a6e2b264e28dc4a82592dae3c48f91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ad06e718c1c6c86a11840a4f11991fa847a8f5fc6a096ebd0a99ca867942aeb8cd38e7c62d5738adb0c414eef121a2bef9514c2376805c93d41612d2a3b9326
|
7
|
+
data.tar.gz: 15c1b357d6e2f9101aae19075b0e2ae3e12d2013b03036030074be6c598bd4f0faeeb0b7f5d715c0af964b7a5cf32596a202cfff85b8691b11b65d0cfc77999f
|
data/lib/metrica_api/request.rb
CHANGED
@@ -1,44 +1,78 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
# Yandex Metrica request
|
5
|
-
|
3
|
+
class MetricaApi
|
4
|
+
# Yandex Metrica request
|
5
|
+
class Request
|
6
6
|
|
7
|
-
|
7
|
+
def self.call(options, params = {})
|
8
|
+
Request.new(options, params).call
|
9
|
+
end
|
8
10
|
|
9
|
-
def
|
11
|
+
def initialize(options, params = {})
|
12
|
+
@options = options
|
13
|
+
@params = params
|
14
|
+
end
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
24
|
+
RestClient::Forbidden,
|
25
|
+
RestClient::BadRequest,
|
26
|
+
RestClient::ResourceNotFound => e
|
19
27
|
raise MetricaApi::RequestError,
|
20
|
-
"url: #{
|
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
|
27
|
-
params[:oauth_token] = options.fetch(:oauth_token)
|
41
|
+
def rest_client_options
|
28
42
|
{
|
29
43
|
method: :get,
|
30
|
-
url:
|
31
|
-
headers: { 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
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
"#{
|
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
|
data/lib/metrica_api/response.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class MetricaApi
|
4
4
|
# Yandex Metrica response parser
|
5
|
-
|
5
|
+
class Response
|
6
6
|
|
7
|
-
|
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
|
data/lib/metrica_api/session.rb
CHANGED
data/lib/metrica_api/version.rb
CHANGED
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
|
-
|
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,
|
20
|
-
autoload :RequestError,
|
19
|
+
autoload :ConnectionError, 'metrica_api/errors/connection_error'
|
20
|
+
autoload :RequestError, 'metrica_api/errors/request_error'
|
21
21
|
|
22
|
-
autoload :Counters,
|
22
|
+
autoload :Counters, 'metrica_api/sections/counters'
|
23
23
|
autoload :Reporting, 'metrica_api/sections/reporting'
|
24
24
|
|
25
|
-
|
25
|
+
class << self
|
26
26
|
|
27
|
-
|
27
|
+
attr_accessor :logger
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
36
|
+
def counters(token)
|
37
|
+
Sections::Counters.new(token)
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
def reporting(token)
|
41
|
+
Sections::Reporting.new(token)
|
42
|
+
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
data/spec/spec_helper.rb
ADDED
@@ -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.
|
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-
|
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
|