direct-api-v5 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rspec +2 -0
- data/.rubocop.yml +19 -0
- data/.travis.yml +17 -0
- data/Gemfile +2 -0
- data/README.md +127 -3
- data/direct-api-v5.gemspec +11 -5
- data/lib/direct/api/v5.rb +48 -3
- data/lib/direct/api/v5/client.rb +18 -0
- data/lib/direct/api/v5/default_settings.rb +42 -0
- data/lib/direct/api/v5/errors.rb +10 -0
- data/lib/direct/api/v5/params_builder.rb +46 -0
- data/lib/direct/api/v5/refinements/camelize.rb +22 -0
- data/lib/direct/api/v5/request.rb +66 -0
- data/lib/direct/api/v5/response.rb +32 -0
- data/lib/direct/api/v5/response/error.rb +21 -0
- data/lib/direct/api/v5/response/units.rb +34 -0
- data/lib/direct/api/v5/service.rb +32 -0
- data/lib/direct/api/v5/settings.rb +19 -0
- data/lib/direct/api/v5/version.rb +1 -1
- data/spec/acceptance/error_spec.rb +32 -0
- data/spec/acceptance/get_campaigns_spec.rb +72 -0
- data/spec/direct/api/v5/client_spec.rb +28 -0
- data/spec/direct/api/v5/default_settings_spec.rb +42 -0
- data/spec/direct/api/v5/params_builder_spec.rb +39 -0
- data/spec/direct/api/v5/refinements/camelize_spec.rb +21 -0
- data/spec/direct/api/v5/request_spec.rb +60 -0
- data/spec/direct/api/v5/response/error_spec.rb +30 -0
- data/spec/direct/api/v5/response/units_spec.rb +31 -0
- data/spec/direct/api/v5/response_spec.rb +66 -0
- data/spec/direct/api/v5/settings_spec.rb +42 -0
- data/spec/direct/api/v5_spec.rb +37 -0
- data/spec/fixtures/settings.yml +5 -0
- data/spec/shared/direct_api_helper.rb +66 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/webmock.rb +3 -0
- metadata +127 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0b7ada51310f1611e7cd6c4b0b1ac4e7b85d216
|
4
|
+
data.tar.gz: 0aa5fe6526f859074b69aee22679337c8e5a7f3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6713261cb4abccccc582f94b834e12cb4f95434b125b57dc4e771bd6e3553d53c47fdf750b9570888b9260f103eb0b75efc0dcc04d59d2138b5e28b1a8c7998d
|
7
|
+
data.tar.gz: c9cf7c9c34511c8ee0906affbdd5e47c0f5b2bf0e785417f350761a49f4d8fac92342e2664419b76ef671a8e859688191d264beba405123f6c14001795338811
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
AllCops:
|
2
|
+
DisplayCopNames: true
|
3
|
+
DisplayStyleGuide: true
|
4
|
+
|
5
|
+
Metrics/LineLength:
|
6
|
+
Max: 120
|
7
|
+
|
8
|
+
Metrics/MethodLength:
|
9
|
+
Max: 15
|
10
|
+
|
11
|
+
Style/BlockComments:
|
12
|
+
Exclude:
|
13
|
+
- 'spec/spec_helper.rb'
|
14
|
+
|
15
|
+
Style/Documentation:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Style/ClassAndModuleChildren:
|
19
|
+
Enabled: false
|
data/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
language: ruby
|
2
|
+
script:
|
3
|
+
- bundle exec rspec
|
4
|
+
rvm:
|
5
|
+
- 2.1.8
|
6
|
+
- 2.2.4
|
7
|
+
- 2.3.0
|
8
|
+
notifications:
|
9
|
+
webhooks:
|
10
|
+
urls:
|
11
|
+
- https://webhooks.gitter.im/e/d9db7a73fbd8f58f1432
|
12
|
+
on_success: change # options: [always|never|change] default: always
|
13
|
+
on_failure: always # options: [always|never|change] default: always
|
14
|
+
on_start: never # options: [always|never|change] default: always
|
15
|
+
addons:
|
16
|
+
code_climate:
|
17
|
+
repo_token: 69b68e6f16334696d97d7171ead60f33ab98eb50026a92bde56963f7722492f8
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Direct::API::V5
|
2
2
|
|
3
|
-
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/direct-api-v5.svg)](https://badge.fury.io/rb/direct-api-v5)
|
4
|
+
[![Travis CI](https://travis-ci.org/hrom512/direct-api-v5.svg?branch=dev)](https://travis-ci.org/hrom512/direct-api-v5)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/Hrom512/direct-api-v5/badges/gpa.svg)](https://codeclimate.com/github/Hrom512/direct-api-v5)
|
6
|
+
[![Test Coverage](https://codeclimate.com/github/Hrom512/direct-api-v5/badges/coverage.svg)](https://codeclimate.com/github/Hrom512/direct-api-v5/coverage)
|
7
|
+
[![Dependency Status](https://gemnasium.com/hrom512/direct-api-v5.svg)](https://gemnasium.com/hrom512/direct-api-v5)
|
8
|
+
|
9
|
+
Ruby wrapper for Yandex Direct API V5.
|
10
|
+
|
4
11
|
|
5
12
|
## Installation
|
6
13
|
|
@@ -16,13 +23,130 @@ Or install it yourself as:
|
|
16
23
|
|
17
24
|
$ gem install direct-api-v5
|
18
25
|
|
26
|
+
|
19
27
|
## Usage
|
20
28
|
|
21
|
-
|
29
|
+
### Settings
|
30
|
+
|
31
|
+
1. Load settings from YML file
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
Direct::API::V5.load_settings('config/yandex_direct_api.yml')
|
35
|
+
```
|
36
|
+
|
37
|
+
```yml
|
38
|
+
production:
|
39
|
+
host: api.direct.yandex.com
|
40
|
+
auth_token: token_string
|
41
|
+
client_login: login_string
|
42
|
+
|
43
|
+
development:
|
44
|
+
host: api-sandbox.direct.yandex.com
|
45
|
+
auth_token: token_string
|
46
|
+
client_login: login_string
|
47
|
+
```
|
48
|
+
|
49
|
+
2. Configure in block
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
Direct::API::V5.configure do |config|
|
53
|
+
config.host = 'api.direct.yandex.com'
|
54
|
+
config.auth_token = 'token_string'
|
55
|
+
config.client_login = 'login_string'
|
56
|
+
end
|
57
|
+
```
|
58
|
+
|
59
|
+
### Create client
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
api = Direct::API::V5.client
|
63
|
+
```
|
64
|
+
|
65
|
+
You can set client login (if advertising agency)
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
api = Direct::API::V5.client(client_login: 'login_string')
|
69
|
+
```
|
70
|
+
|
71
|
+
Also you can overwrite any default settings:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
api = Direct::API::V5.client(host: 'api.direct.yandex.com', auth_token: 'token')
|
75
|
+
```
|
76
|
+
|
77
|
+
### Call methods
|
78
|
+
|
79
|
+
Base structure:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
api.service_name.method(params)
|
83
|
+
```
|
84
|
+
|
85
|
+
For example:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
response = api.campaigns.get(
|
89
|
+
fields: [:id, :name],
|
90
|
+
criteria: { states: %(ON) },
|
91
|
+
page: { limit: 100, offset: 200 }
|
92
|
+
)
|
93
|
+
|
94
|
+
response.error?
|
95
|
+
# => false
|
96
|
+
|
97
|
+
response.result
|
98
|
+
# =>
|
99
|
+
# {
|
100
|
+
# Campaigns: [
|
101
|
+
# { Id: 1, Name: "Campaign 1" },
|
102
|
+
# ...
|
103
|
+
# ]
|
104
|
+
# }
|
105
|
+
|
106
|
+
response.request_id
|
107
|
+
# => 123456
|
108
|
+
|
109
|
+
response.units.spent
|
110
|
+
# => 10
|
111
|
+
|
112
|
+
response.units.available
|
113
|
+
# => 1000
|
114
|
+
|
115
|
+
response.units.daily_limit
|
116
|
+
# => 2000
|
117
|
+
|
118
|
+
response.units.raw
|
119
|
+
# => 10/1000/2000
|
120
|
+
```
|
121
|
+
|
122
|
+
If API return error:
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
response.error?
|
126
|
+
# => true
|
127
|
+
|
128
|
+
response.error.code
|
129
|
+
# => 54
|
130
|
+
|
131
|
+
response.error.message
|
132
|
+
# => "No rights"
|
133
|
+
|
134
|
+
response.error.details
|
135
|
+
# => "No rights to indicated client"
|
136
|
+
|
137
|
+
response.error.to_h
|
138
|
+
# =>
|
139
|
+
# {
|
140
|
+
# code: 54,
|
141
|
+
# message: "No rights",
|
142
|
+
# details: "No rights to indicated client"
|
143
|
+
# }
|
144
|
+
```
|
145
|
+
|
22
146
|
|
23
147
|
## Contributing
|
24
148
|
|
25
|
-
1. Fork it ( https://github.com/
|
149
|
+
1. Fork it ( https://github.com/hrom512/direct-api-v5/fork )
|
26
150
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
151
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
152
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/direct-api-v5.gemspec
CHANGED
@@ -6,10 +6,10 @@ require 'direct/api/v5/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'direct-api-v5'
|
8
8
|
spec.version = Direct::API::V5::VERSION
|
9
|
-
spec.author = 'Khrebtov
|
9
|
+
spec.author = 'Roman Khrebtov'
|
10
10
|
spec.email = 'roman@alltmb.ru'
|
11
11
|
spec.summary = 'Yandex Direct API V5'
|
12
|
-
spec.description = 'Ruby
|
12
|
+
spec.description = 'Ruby wrapper for Yandex Direct API V5'
|
13
13
|
spec.homepage = 'https://github.com/Hrom512/direct-api-v5'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
@@ -18,8 +18,14 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.required_ruby_version = '>= 2.
|
21
|
+
spec.required_ruby_version = '>= 2.1'
|
22
22
|
|
23
|
-
spec.
|
24
|
-
spec.
|
23
|
+
spec.add_dependency 'faraday', '~> 0.9'
|
24
|
+
spec.add_dependency 'multi_json', '~> 1.12'
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
27
|
+
spec.add_development_dependency 'rake', '~> 10.5'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.5'
|
29
|
+
spec.add_development_dependency 'webmock', '~> 2.1'
|
30
|
+
spec.add_development_dependency 'rubocop'
|
25
31
|
end
|
data/lib/direct/api/v5.rb
CHANGED
@@ -1,8 +1,53 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'multi_json'
|
3
|
+
|
1
4
|
require 'direct/api/v5/version'
|
5
|
+
require 'direct/api/v5/errors'
|
6
|
+
require 'direct/api/v5/refinements/camelize'
|
7
|
+
require 'direct/api/v5/default_settings'
|
8
|
+
require 'direct/api/v5/settings'
|
9
|
+
require 'direct/api/v5/client'
|
10
|
+
require 'direct/api/v5/service'
|
11
|
+
require 'direct/api/v5/request'
|
12
|
+
require 'direct/api/v5/params_builder'
|
13
|
+
require 'direct/api/v5/response'
|
14
|
+
require 'direct/api/v5/response/error'
|
15
|
+
require 'direct/api/v5/response/units'
|
16
|
+
|
17
|
+
module Direct::API::V5
|
18
|
+
class << self
|
19
|
+
# Create API client
|
20
|
+
# @param settings [Hash] API settings (:host, :auth_token, :client_login)
|
21
|
+
# @return [Direct::API::V5::Client] new client object
|
22
|
+
#
|
23
|
+
# @example Without settings
|
24
|
+
# client = Direct::API::V5.client
|
25
|
+
#
|
26
|
+
# @example With settings
|
27
|
+
# client = Direct::API::V5.client(host: 'api.direct.yandex.com',
|
28
|
+
# auth_token: 'token',
|
29
|
+
# client_login: 'login')
|
30
|
+
def client(settings = {})
|
31
|
+
Client.new(settings)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Set default settings from block
|
35
|
+
# @example
|
36
|
+
# Direct::API::V5.configure do |config|
|
37
|
+
# config.host = 'api.direct.yandex.com'
|
38
|
+
# config.auth_token = 'token'
|
39
|
+
# config.client_login = 'login'
|
40
|
+
# end
|
41
|
+
def configure(&block)
|
42
|
+
DefaultSettings.configure(&block)
|
43
|
+
end
|
2
44
|
|
3
|
-
|
4
|
-
|
5
|
-
|
45
|
+
# Set default settings from .yml file
|
46
|
+
# @param yml_file [String] path to .yml file
|
47
|
+
# @example
|
48
|
+
# Direct::API::V5.load_settings('config/yandex_direct_api.yml')
|
49
|
+
def load_settings(yml_file)
|
50
|
+
DefaultSettings.load_from_yml(yml_file)
|
6
51
|
end
|
7
52
|
end
|
8
53
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Direct::API::V5
|
2
|
+
class Client
|
3
|
+
attr_reader :settings
|
4
|
+
|
5
|
+
def initialize(settings = {})
|
6
|
+
@settings = Settings.new(settings)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Direct services methods
|
10
|
+
def method_missing(method, *args)
|
11
|
+
if args.empty?
|
12
|
+
Service.new(client: self, service_name: method)
|
13
|
+
else
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Direct
|
2
|
+
module API
|
3
|
+
module V5
|
4
|
+
# Default API settings store
|
5
|
+
class DefaultSettings
|
6
|
+
class << self
|
7
|
+
DEFAULT_HOST = 'api.direct.yandex.com'.freeze
|
8
|
+
DEFAULT_LANGUAGE = 'en'.freeze
|
9
|
+
|
10
|
+
attr_accessor :host
|
11
|
+
attr_accessor :language
|
12
|
+
attr_accessor :auth_token
|
13
|
+
attr_accessor :client_login
|
14
|
+
|
15
|
+
# Return configured host or default value
|
16
|
+
def host
|
17
|
+
@host || DEFAULT_HOST
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return configured language or default value
|
21
|
+
def language
|
22
|
+
@language || DEFAULT_LANGUAGE
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set default settings from .yml file
|
26
|
+
def load_from_yml(yml_file)
|
27
|
+
settings = YAML.load_file(yml_file)[ENV['RAILS_ENV']] || {}
|
28
|
+
@host = settings['host']
|
29
|
+
@language = settings['language']
|
30
|
+
@auth_token = settings['auth_token']
|
31
|
+
@client_login = settings['client_login']
|
32
|
+
end
|
33
|
+
|
34
|
+
# Set default settings from block
|
35
|
+
def configure
|
36
|
+
yield(self)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Direct::API::V5
|
2
|
+
class ParamsBuilder
|
3
|
+
using Refinements::Camelize
|
4
|
+
|
5
|
+
def initialize(params = {})
|
6
|
+
@params = params
|
7
|
+
end
|
8
|
+
|
9
|
+
def build
|
10
|
+
process_value(@params)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def process_value(value)
|
16
|
+
if value.is_a?(Hash)
|
17
|
+
process_hash(value)
|
18
|
+
elsif value.is_a?(Array)
|
19
|
+
process_array(value)
|
20
|
+
elsif value.is_a?(Symbol)
|
21
|
+
value.camelize
|
22
|
+
else
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def process_hash(hash)
|
28
|
+
result = {}
|
29
|
+
|
30
|
+
hash.each do |key, value|
|
31
|
+
key = :selection_criteria if key == :criteria
|
32
|
+
key = "#{key.to_s[0..-7]}field_names".to_sym if key.to_s.end_with?('fields')
|
33
|
+
|
34
|
+
new_key = process_value(key)
|
35
|
+
new_value = process_value(value)
|
36
|
+
result[new_key] = new_value
|
37
|
+
end
|
38
|
+
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
def process_array(array)
|
43
|
+
array.map { |item| process_value(item) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Direct::API::V5
|
2
|
+
module Refinements
|
3
|
+
# Add camelize method to String and Symbol
|
4
|
+
module Camelize
|
5
|
+
refine String do
|
6
|
+
def camelize
|
7
|
+
if self =~ /[A-Z]/
|
8
|
+
self
|
9
|
+
else
|
10
|
+
split('_').map(&:capitalize).join('')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
refine Symbol do
|
16
|
+
def camelize
|
17
|
+
to_s.camelize.to_sym
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|