ya-api-direct 0.2.5 → 0.2.10
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 +5 -5
- data/Gemfile +3 -2
- data/README.md +2 -2
- data/lib/ya/api/direct/client.rb +4 -4
- data/lib/ya/api/direct/constants.rb +60 -13
- data/lib/ya/api/direct/exceptions.rb +33 -0
- data/lib/ya/api/direct/gateway.rb +22 -6
- data/lib/ya/api/direct/url_helper.rb +32 -12
- data/lib/ya/api/direct/version.rb +1 -1
- data/lib/ya/api/direct.rb +1 -1
- data/ya-api-direct.gemspec +5 -4
- metadata +20 -21
- data/lib/ya/api/direct/exception.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c3834e0a678f9eb91e7523dbca830f99d72660940079dfcc9340082d64ab2ec7
|
4
|
+
data.tar.gz: bf72e62469f98178a4a1ee62fe1c27849d8f23826db06c07354b87aaec6c9b47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbd2d4b2b37ef73cf0b8269de00dd00a91b289948dea5285ca43172a26e5a3570664aa78b907f985c75962e617f6c5e08dd6812492ad261506e49e53151f9e45
|
7
|
+
data.tar.gz: c56f376feb05d6b7ccdc3d5d54e78e46773ba8defa047484a6a82b860bcfd7d184672c46a34b636527b13854087ec20da0f239de0956f31c2024b8ce7bf422d6
|
data/Gemfile
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gem 'jruby-openssl', platforms: :jruby
|
4
|
-
gem 'rake'
|
4
|
+
gem 'rake', '>= 12.3.3'
|
5
5
|
gem 'yard'
|
6
|
+
#gem 'tsv'
|
6
7
|
|
7
8
|
group :development do
|
8
9
|
# reserved
|
@@ -15,4 +16,4 @@ group :test do
|
|
15
16
|
gem 'yardstick'
|
16
17
|
end
|
17
18
|
|
18
|
-
gemspec
|
19
|
+
gemspec
|
data/README.md
CHANGED
@@ -36,14 +36,14 @@ request = {
|
|
36
36
|
|
37
37
|
options = { token: Token }
|
38
38
|
@direct = Ya::API::Direct::Client.new(options)
|
39
|
-
json = direct.campaigns.get request
|
39
|
+
json = @direct.campaigns.get request
|
40
40
|
```
|
41
41
|
|
42
42
|
Call methods from versions 4 and 4 Live:
|
43
43
|
|
44
44
|
```ruby
|
45
45
|
@direct = Ya::API::Direct::Client.new({ token: Token })
|
46
|
-
json = direct.v4.GetCampaignsList
|
46
|
+
json = @direct.v4.GetCampaignsList
|
47
47
|
```
|
48
48
|
|
49
49
|
All names of controllers and methods are equal to ones from Direct API help. 4 vs 4 Live is autodetected.
|
data/lib/ya/api/direct/client.rb
CHANGED
@@ -2,7 +2,7 @@ require "ya/api/direct/constants"
|
|
2
2
|
require "ya/api/direct/gateway"
|
3
3
|
require "ya/api/direct/direct_service_v4"
|
4
4
|
require "ya/api/direct/direct_service_v5"
|
5
|
-
require "ya/api/direct/
|
5
|
+
require "ya/api/direct/exceptions"
|
6
6
|
|
7
7
|
require 'time'
|
8
8
|
|
@@ -14,7 +14,7 @@ module Ya::API::Direct
|
|
14
14
|
class Client
|
15
15
|
attr_reader :cache_timestamp, :units_data, :gateway,
|
16
16
|
:v4, :v5
|
17
|
-
|
17
|
+
|
18
18
|
# Initializes a new Client object
|
19
19
|
#
|
20
20
|
# @param config [Hash]
|
@@ -75,7 +75,7 @@ module Ya::API::Direct
|
|
75
75
|
end
|
76
76
|
|
77
77
|
private
|
78
|
-
|
78
|
+
|
79
79
|
def init_v4
|
80
80
|
@v4 = DirectServiceV4.new self, (API_V4 + API_V4_LIVE)
|
81
81
|
end
|
@@ -90,4 +90,4 @@ module Ya::API::Direct
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
93
|
-
end
|
93
|
+
end
|
@@ -2,44 +2,90 @@ module Ya
|
|
2
2
|
module API
|
3
3
|
module Direct
|
4
4
|
API_V5 = {
|
5
|
-
"Campaigns" => [
|
6
|
-
"add", "update", "delete", "suspend", "resume", "archive", "unarchive", "get"
|
7
|
-
],
|
8
5
|
"AdGroups" => [
|
9
|
-
|
6
|
+
"add", "update", "delete", "get"
|
7
|
+
],
|
8
|
+
"AgencyClients" => [
|
9
|
+
"add", "update", "get"
|
10
10
|
],
|
11
11
|
"Ads" => [
|
12
12
|
"add", "update", "delete", "suspend", "resume", "archive", "unarchive", "moderate", "get"
|
13
13
|
],
|
14
|
+
"AdExtensions" => [
|
15
|
+
"add", "delete", "get"
|
16
|
+
],
|
17
|
+
"AdImages" => [
|
18
|
+
"add", "delete", "get"
|
19
|
+
],
|
20
|
+
"AudienceTargets" => [
|
21
|
+
"add", "delete", "suspend", "resume", "get", "setBids"
|
22
|
+
],
|
14
23
|
"Bids" => [
|
15
24
|
"set", "setAuto", "get"
|
16
25
|
],
|
17
26
|
"BidModifiers" => [
|
18
|
-
|
19
|
-
|
27
|
+
"add", "delete", "get", "set", "toggle"
|
28
|
+
],
|
29
|
+
"Businesses" => [
|
30
|
+
"get"
|
31
|
+
],
|
20
32
|
"Campaigns" => [
|
21
33
|
"add", "update", "delete", "suspend", "resume", "archive", "unarchive", "get"
|
22
|
-
|
34
|
+
],
|
23
35
|
"Changes" => [
|
24
36
|
"checkDictionaries", "checkCampaigns", "check"
|
25
|
-
|
37
|
+
],
|
38
|
+
"Clients" => [
|
39
|
+
"get", "update"
|
40
|
+
],
|
41
|
+
"Creatives" => [
|
42
|
+
"get"
|
43
|
+
],
|
26
44
|
"Dictionaries" => [
|
27
|
-
|
45
|
+
"get"
|
46
|
+
],
|
47
|
+
"DynamicFeedAdTargets" => [
|
48
|
+
"add", "delete", "suspend", "resume", "get", "setBids"
|
28
49
|
],
|
29
50
|
"DynamicTextAdTargets" => [
|
30
51
|
"add", "delete", "suspend", "resume", "get", "setBids"
|
31
52
|
],
|
53
|
+
"Feeds" => [
|
54
|
+
"add", "delete", "get", "update"
|
55
|
+
],
|
32
56
|
"Keywords" => [
|
33
57
|
"add", "update", "delete", "suspend", "resume", "get"
|
34
58
|
],
|
59
|
+
"KeywordBids" => [
|
60
|
+
"set", "setAuto", "get"
|
61
|
+
],
|
62
|
+
"KeywordsResearch" => [
|
63
|
+
"hasSearchVolume", "deduplicate"
|
64
|
+
],
|
65
|
+
"Leads" => [
|
66
|
+
"get"
|
67
|
+
],
|
68
|
+
"NegativeKeywordSharedSets" => [
|
69
|
+
"add", "update", "delete", "get"
|
70
|
+
],
|
71
|
+
"RetargetingLists" => [
|
72
|
+
"add", "update", "delete", "get"
|
73
|
+
],
|
35
74
|
"Sitelinks" => [
|
36
75
|
"add", "get", "delete"
|
37
76
|
],
|
77
|
+
"SmartAdTargets" => [
|
78
|
+
"add", "update", "setBids", "delete", "suspend", "resume", "get"
|
79
|
+
],
|
80
|
+
"TurboPages" => [
|
81
|
+
"get"
|
82
|
+
],
|
38
83
|
"VCards" => [
|
39
84
|
"add", "get", "delete"
|
40
|
-
]
|
85
|
+
],
|
86
|
+
"Reports" => ["get"]
|
41
87
|
}
|
42
|
-
|
88
|
+
|
43
89
|
API_V4 = [
|
44
90
|
"GetBalance",
|
45
91
|
"GetSummaryStat",
|
@@ -68,7 +114,7 @@ module Ya
|
|
68
114
|
"GetSubClients",
|
69
115
|
"GetClientInfo",
|
70
116
|
"UpdateClientInfo",
|
71
|
-
|
117
|
+
|
72
118
|
"CreateNewSubclient",
|
73
119
|
"GetClientsList",
|
74
120
|
|
@@ -86,6 +132,7 @@ module Ya
|
|
86
132
|
API_V4_LIVE = [
|
87
133
|
"CreateOrUpdateCampaign",
|
88
134
|
"GetCampaignsList",
|
135
|
+
"GetSummaryStat",
|
89
136
|
"GetCampaignsListFilter",
|
90
137
|
"GetCampaignsParams",
|
91
138
|
"DeleteCampaign",
|
@@ -133,4 +180,4 @@ module Ya
|
|
133
180
|
]
|
134
181
|
end
|
135
182
|
end
|
136
|
-
end
|
183
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "ya/api/direct/constants"
|
2
|
+
|
3
|
+
module Ya::API::Direct
|
4
|
+
class Exception < StandardError
|
5
|
+
attr_reader :error
|
6
|
+
|
7
|
+
def initialize( error )
|
8
|
+
@error = error
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
[ @error['error_code'], @error['error_string'], @error['error_detail'], @error['request_id'] ].join(' : ')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class RequestError < StandardError
|
17
|
+
attr_reader :method, :version, :request, :response
|
18
|
+
|
19
|
+
def initialize( method: , version: , request: , response: )
|
20
|
+
@method = method
|
21
|
+
@version = version
|
22
|
+
@request = request
|
23
|
+
@response = response
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
if response.body && ['text/json', 'application/json'].include?( response["Content-Type"] ) && error = JSON.parse( response.body )['error']
|
28
|
+
err_msg = error.values_at('error_code', 'error_string', 'error_detail', 'request_id').reject(&:blank?).join(' : ')
|
29
|
+
end
|
30
|
+
[ ['HTTP ', response.code].join, err_msg ].compact.join(': ')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -4,10 +4,11 @@ require "json"
|
|
4
4
|
|
5
5
|
require "ya/api/direct/constants"
|
6
6
|
require "ya/api/direct/url_helper"
|
7
|
+
require "ya/api/direct/exceptions"
|
7
8
|
|
8
9
|
module Ya::API::Direct
|
9
10
|
class Gateway
|
10
|
-
attr_reader :config
|
11
|
+
attr_reader :config, :response
|
11
12
|
def initialize(config)
|
12
13
|
@config = config
|
13
14
|
end
|
@@ -23,11 +24,25 @@ module Ya::API::Direct
|
|
23
24
|
http = Net::HTTP.new(uri.host, uri.port)
|
24
25
|
http.use_ssl = true
|
25
26
|
http.verify_mode = @config[:ssl] ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
26
|
-
|
27
|
+
|
28
|
+
begin
|
29
|
+
response = http.request(request)
|
30
|
+
if (response.kind_of? Net::HTTPCreated) || (response.kind_of? Net::HTTPAccepted)
|
31
|
+
sleep response['retryIn'].to_i
|
32
|
+
end
|
33
|
+
end while(response.kind_of? Net::HTTPCreated) || (response.kind_of? Net::HTTPAccepted)
|
34
|
+
|
35
|
+
@response = response
|
36
|
+
|
27
37
|
if response.kind_of? Net::HTTPSuccess
|
28
38
|
UrlHelper.parse_data response, ver
|
29
39
|
else
|
30
|
-
raise
|
40
|
+
raise RequestError.new(
|
41
|
+
method: method,
|
42
|
+
version: ver,
|
43
|
+
request: request,
|
44
|
+
response: response
|
45
|
+
)
|
31
46
|
end
|
32
47
|
end
|
33
48
|
|
@@ -43,9 +58,10 @@ module Ya::API::Direct
|
|
43
58
|
end
|
44
59
|
|
45
60
|
def generate_body(method, params, ver)
|
61
|
+
params_key = [:v4, :v4live].include?(ver) ? 'param' : 'params'
|
46
62
|
body = {
|
47
|
-
|
48
|
-
|
63
|
+
'method' => method,
|
64
|
+
params_key => params
|
49
65
|
}
|
50
66
|
if [:v4, :v4live].include? ver
|
51
67
|
body.merge!({
|
@@ -56,4 +72,4 @@ module Ya::API::Direct
|
|
56
72
|
body
|
57
73
|
end
|
58
74
|
end
|
59
|
-
end
|
75
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "json"
|
2
2
|
|
3
|
-
require "ya/api/direct/
|
3
|
+
require "ya/api/direct/exceptions"
|
4
|
+
|
4
5
|
|
5
6
|
module Ya::API::Direct
|
6
7
|
RegExUnits = Regexp.new /(\d+)\/(\d+)\/(\d+)/
|
@@ -9,7 +10,7 @@ module Ya::API::Direct
|
|
9
10
|
# @author Rikki Mongoose
|
10
11
|
class UrlHelper
|
11
12
|
# Generate Yandex Direct API url for a call
|
12
|
-
#
|
13
|
+
#
|
13
14
|
# @param mode [Symbol] Direct API mode, `:sandbox` or `:production`
|
14
15
|
# @param mode [Symbol] Direct API version, `:v5` or `:v4` or `:v4live`
|
15
16
|
# @param mode [Symbol] Direct API service to use
|
@@ -45,10 +46,11 @@ module Ya::API::Direct
|
|
45
46
|
site: site,
|
46
47
|
service: service
|
47
48
|
}
|
49
|
+
|
48
50
|
end
|
49
51
|
|
50
52
|
# Extract Yandex Direct API units values from responce HTTP header
|
51
|
-
#
|
53
|
+
#
|
52
54
|
# @param responce_header [Hash] Yandex Direct API response header
|
53
55
|
# @return [Hash] Units data, extracted from header
|
54
56
|
def self.extract_response_units(response_header)
|
@@ -64,20 +66,38 @@ module Ya::API::Direct
|
|
64
66
|
private
|
65
67
|
|
66
68
|
def self.parse_data(response, ver)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
if response["Content-Type"].start_with?("application/json")
|
70
|
+
response_body = JSON.parse(response.body)
|
71
|
+
validate_response! response_body
|
72
|
+
result = { data: response_body }
|
73
|
+
if [:v5].include? ver
|
74
|
+
result.merge!({ units_data: self.extract_response_units(response) })
|
75
|
+
end
|
76
|
+
result
|
77
|
+
else
|
78
|
+
{data: from_tsv_to_json(response.body)}
|
72
79
|
end
|
73
|
-
result
|
74
80
|
end
|
75
81
|
|
76
82
|
def self.validate_response!(response_body)
|
77
83
|
if response_body.has_key? 'error'
|
78
|
-
|
79
|
-
|
84
|
+
raise Exception.new( response_body['error'] )
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.from_tsv_to_json(response_body)
|
89
|
+
report_name = response_body.slice!(/^(.+?)\n/)
|
90
|
+
keys = response_body.slice!(/^(.+?)\n/).split("\t")
|
91
|
+
rows = response_body.match(/rows:(.+?)\n/)[1].to_i
|
92
|
+
values = []
|
93
|
+
rows.times do |row|
|
94
|
+
hash_values = {}
|
95
|
+
response_body.slice!(/^(.+?)\n/).split("\t").each_with_index do |value, index|
|
96
|
+
hash_values[keys[index].gsub("\n", "")] = value.gsub("\n", "")
|
97
|
+
end
|
98
|
+
values.push(hash_values)
|
80
99
|
end
|
100
|
+
values
|
81
101
|
end
|
82
102
|
end
|
83
|
-
end
|
103
|
+
end
|
data/lib/ya/api/direct.rb
CHANGED
data/ya-api-direct.gemspec
CHANGED
@@ -6,7 +6,7 @@ require 'ya/api/direct/version'
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'ya-api-direct'
|
8
8
|
s.version = Ya::Api::Direct::VERSION
|
9
|
-
s.date = '
|
9
|
+
s.date = '2021-12-12'
|
10
10
|
s.summary = "Yandex Direct API v5, v4 and v4 Live"
|
11
11
|
s.description = "Ruby implementation for Yandex Direct API of versions 5, 4 and 4 Live"
|
12
12
|
s.authors = "Rikki Mongoose"
|
@@ -18,8 +18,9 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.bindir = "exe"
|
19
19
|
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
|
+
s.required_ruby_version = ">= 2.5.0"
|
21
22
|
|
22
|
-
s.add_development_dependency "bundler", "
|
23
|
-
s.add_development_dependency "rake", "
|
23
|
+
s.add_development_dependency "bundler", ">= 2.2.33"
|
24
|
+
s.add_development_dependency "rake", ">= 12.3.3"
|
24
25
|
s.add_development_dependency "minitest", "~> 5.0"
|
25
|
-
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ya-api-direct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rikki Mongoose
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.2.33
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.2.33
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '5.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
55
|
description: Ruby implementation for Yandex Direct API of versions 5, 4 and 4 Live
|
@@ -58,9 +58,9 @@ executables: []
|
|
58
58
|
extensions: []
|
59
59
|
extra_rdoc_files: []
|
60
60
|
files:
|
61
|
-
- .gitignore
|
62
|
-
- .rspec
|
63
|
-
- .travis.yml
|
61
|
+
- ".gitignore"
|
62
|
+
- ".rspec"
|
63
|
+
- ".travis.yml"
|
64
64
|
- CODE_OF_CONDUCT.md
|
65
65
|
- Gemfile
|
66
66
|
- LICENSE
|
@@ -74,7 +74,7 @@ files:
|
|
74
74
|
- lib/ya/api/direct/direct_service_base.rb
|
75
75
|
- lib/ya/api/direct/direct_service_v4.rb
|
76
76
|
- lib/ya/api/direct/direct_service_v5.rb
|
77
|
-
- lib/ya/api/direct/
|
77
|
+
- lib/ya/api/direct/exceptions.rb
|
78
78
|
- lib/ya/api/direct/gateway.rb
|
79
79
|
- lib/ya/api/direct/url_helper.rb
|
80
80
|
- lib/ya/api/direct/version.rb
|
@@ -89,17 +89,16 @@ require_paths:
|
|
89
89
|
- lib
|
90
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- -
|
92
|
+
- - ">="
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 2.5.0
|
95
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- -
|
97
|
+
- - ">="
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '0'
|
100
100
|
requirements: []
|
101
|
-
|
102
|
-
rubygems_version: 2.0.14.1
|
101
|
+
rubygems_version: 3.1.2
|
103
102
|
signing_key:
|
104
103
|
specification_version: 4
|
105
104
|
summary: Yandex Direct API v5, v4 and v4 Live
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require "ya/api/direct/constants"
|
2
|
-
|
3
|
-
module Ya::API::Direct
|
4
|
-
class Exception < StandardError
|
5
|
-
attr_reader :error_detail, :error_code, :error_str
|
6
|
-
|
7
|
-
def initialize(error_detail, error_str, error_code)
|
8
|
-
@error_detail = error_detail
|
9
|
-
@error_str = error_str
|
10
|
-
@error_code = error_code
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_s
|
14
|
-
"#{@error_str} : #{@error_detail} : #{@error_code}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|