yandex-dostavka 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cbb5ab099b6984b9856405b5c43a7116d47495b7c88f08bd22d7adf493dc6996
4
+ data.tar.gz: 42ea3078f2cb52aaa2e7eacf8a47480d7f7cd3f60e85ec5f56cfbc4e885c3a16
5
+ SHA512:
6
+ metadata.gz: 459ccb9da2c1e49de500eddbf6ae57a4e10c8c8185425f8e82f6f57ebd7b8b3c9d3e65008a163c2b7d7a52ce20fa4ff0ffe0890895cfa1dad80af2af84128a09
7
+ data.tar.gz: d94127db0ade19647fbf9f0b4b6bd13997dd2f507579d48e5574380a5c45346802a18bb870964c46f498b124e518f5b193464dfdc0d0e8e9e4a2ddad209a904d
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Pavel Osetrov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,82 @@
1
+ # Yandex Dostavka API
2
+
3
+ API wrapper для Yandex Dostavka API
4
+
5
+ # Оглавление
6
+ 0. [Установка](#install)
7
+ 1. [Использование Rails](#using_rails)
8
+ 2. [Использование Ruby](#using_ruby)
9
+ 3. [Debug Logging](#debug_logging)
10
+ 4. [Custom logger](#custom_logger)
11
+
12
+ # <a name="install"></a> Установка
13
+
14
+ ### Получение OAuth-токена:
15
+
16
+ 1. Войдите в [Кабинет Корпоративного Клиента Яндекс Доставки](https://dostavka.yandex.ru/change/) с помощью выданного вам логина и пароля.
17
+ Перейдите на вкладку Профиль компании.
18
+ 2. В разделе Токен для API нажмите Получить.
19
+ 3. На странице https://oauth.yandex.ru нажмите Разрешить.
20
+ 4. В Кабинете Корпоративного Клиента Яндекс Доставки на вкладке Профиль компании в разделе Токен для API будет отображен ваш OAuth-токен.
21
+
22
+ ## Ruby
23
+ $ gem install yandex-dostavka
24
+ ## Rails
25
+ добавьте в Gemfile:
26
+
27
+ gem 'yandex-dostavka'
28
+
29
+ и запустите `bundle install`.
30
+
31
+ Затем:
32
+
33
+ rails g yandex_dostavka:install
34
+
35
+ ## <a name="using_rails"></a> Использование Rails
36
+
37
+ В файл `config/yandex_dostavka.yml` вставьте ваши данные
38
+
39
+ ## <a name="using_ruby"></a> Использование Ruby
40
+
41
+ Сначала создайте экземпляр объекта `YandexDostavka::Request`:
42
+
43
+ ```ruby
44
+ dostavka = YandexDostavka::Request.new(api_key: "***")
45
+ ```
46
+
47
+ Вы можете изменять `api_key`, `timeout`, `open_timeout`, `faraday_adapter`, `proxy`, `symbolize_keys`, `logger`, и `debug`:
48
+
49
+ ```ruby
50
+ YandexDostavka::Request.timeout = 15
51
+ YandexDostavka::Request.open_timeout = 15
52
+ YandexDostavka::Request.symbolize_keys = true
53
+ YandexDostavka::Request.debug = false
54
+
55
+ YandexDostavka::Request.api_key = "your_api_key"
56
+ ```
57
+
58
+ Либо в файле `config/initializers/yandex_dostavka.rb` для Rails.
59
+
60
+ ## <a name="debug_logging"></a> Debug Logging
61
+
62
+ Измените `debug: true` чтобы включить логирование в STDOUT.
63
+
64
+ ```ruby
65
+ dostavka = YandexDostavka::Request.new(api_key: "***", debug: true)
66
+ ```
67
+
68
+ ### <a name="custom_logger"></a> Custom logger
69
+
70
+ `Logger.new` используется по умолчанию, но вы можете изменить на свой:
71
+
72
+ ```ruby
73
+ dostavka = YandexDostavka::Request.new(api_key: "***", debug: true, logger: MyLogger.new)
74
+ ```
75
+
76
+ Или:
77
+
78
+ ```ruby
79
+ YandexDostavka::Request.logger = MyLogger.new
80
+ ```
81
+
82
+ # <a name="examples"></a> Примеры
@@ -0,0 +1,2 @@
1
+ Description:
2
+ yandex_dostavka:install
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YandexDostavka
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def generate_install
8
+ copy_file 'yandex_dostavka.yml', 'config/yandex_dostavka.yml'
9
+ copy_file 'yandex_dostavka.rb', 'config/initializers/yandex_dostavka.rb'
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,18 @@
1
+ require 'yandex-dostavka'
2
+
3
+ YandexDostavka.setup do |config|
4
+ if File.exist?('config/yandex_dostavka.yml')
5
+ processed = YAML.load_file('config/yandex_dostavka.yml')[Rails.env]
6
+
7
+ processed.each do |k, v|
8
+ config::register k.underscore.to_sym, v
9
+ end
10
+
11
+ config::Request.token ||= ENV['YANDEX_DOSTAVKA_TOKEN']
12
+
13
+ config::Request.timeout = 60
14
+ config::Request.open_timeout = 60
15
+ config::Request.symbolize_keys = true
16
+ config::Request.debug = false
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ defaults: &defaults
2
+ API_ENDPOINT: "https://b2b.taxi.tst.yandex.net/"
3
+ YANDEX_DOSTAVKA_TOKEN: "***"
4
+ production:
5
+ <<: *defaults
6
+ API_ENDPOINT: "https://b2b-authproxy.taxi.yandex.net"
7
+ YANDEX_DOSTAVKA_TOKEN: "***"
8
+ development:
9
+ <<: *defaults
10
+ API_ENDPOINT: "https://b2b.taxi.tst.yandex.net/"
11
+ test:
12
+ <<: *defaults
@@ -0,0 +1,158 @@
1
+ module YandexDostavka
2
+ class APIRequest
3
+
4
+ def initialize(builder: nil)
5
+ @request_builder = builder
6
+ end
7
+
8
+ def post(params: nil, headers: nil, suffix: nil, body: {})
9
+ validate_api_key
10
+ begin
11
+ response = self.rest_client(suffix).post do |request|
12
+ configure_request(request: request, params: params, headers: headers, body: body)
13
+ end
14
+ parse_response(response)
15
+ rescue => e
16
+ handle_error(e)
17
+ end
18
+ end
19
+
20
+ def get(params: nil, headers: nil, body: {})
21
+ validate_api_key
22
+
23
+ begin
24
+ response = self.rest_client.get do |request|
25
+ configure_request(request: request, params: params, headers: headers, body: body)
26
+ end
27
+ parse_response(response)
28
+ rescue => e
29
+ handle_error(e)
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ # Convenience accessors
36
+
37
+ def token
38
+ @request_builder.token
39
+ end
40
+
41
+ def api_endpoint
42
+ @request_builder.api_endpoint
43
+ end
44
+
45
+ def timeout
46
+ @request_builder.timeout
47
+ end
48
+
49
+ def open_timeout
50
+ @request_builder.open_timeout
51
+ end
52
+
53
+ def proxy
54
+ @request_builder.proxy
55
+ end
56
+
57
+ def ssl_options
58
+ @request_builder.ssl_options
59
+ end
60
+
61
+ def adapter
62
+ @request_builder.faraday_adapter
63
+ end
64
+
65
+ def symbolize_keys
66
+ @request_builder.symbolize_keys
67
+ end
68
+
69
+ # Helpers
70
+
71
+ def handle_error(error)
72
+ error_params = {}
73
+
74
+ begin
75
+ if error.is_a?(Faraday::ClientError) && error.response
76
+ error_params[:status_code] = error.response[:status]
77
+ error_params[:raw_body] = error.response[:body]
78
+
79
+ parsed_response = MultiJson.load(error.response[:body], symbolize_keys: symbolize_keys)
80
+
81
+ if parsed_response
82
+ error_params[:body] = parsed_response
83
+
84
+ title_key = symbolize_keys ? :title : "title"
85
+ detail_key = symbolize_keys ? :detail : "detail"
86
+
87
+ error_params[:title] = parsed_response[title_key] if parsed_response[title_key]
88
+ error_params[:detail] = parsed_response[detail_key] if parsed_response[detail_key]
89
+ end
90
+
91
+ end
92
+ rescue MultiJson::ParseError
93
+ end
94
+
95
+ error_to_raise = Error.new(error.message, error_params)
96
+
97
+ raise error_to_raise
98
+ end
99
+
100
+ def configure_request(request: nil, params: nil, headers: nil, body: nil)
101
+ if request
102
+ request.params.merge!(params) if params
103
+ request.headers['Content-Type'] = 'application/json'
104
+ request.headers['Authorization'] = "Bearer #{YandexDostavka::Request.token}"
105
+ request.headers['User-Agent'] = "YandexDostavka/#{YandexDostavka::VERSION} Ruby gem"
106
+ request.headers.merge!(headers) if headers
107
+ request.body = MultiJson.dump(body) if body
108
+ request.options.timeout = self.timeout
109
+ request.options.open_timeout = self.open_timeout
110
+ end
111
+ end
112
+
113
+ def rest_client(suffix=nil)
114
+ client = Faraday.new("#{self.api_url}#{suffix.present? ? "/#{suffix}": ""}", proxy: self.proxy,
115
+ ssl: self.ssl_options) do |faraday|
116
+ faraday.request :gzip
117
+ faraday.response :raise_error
118
+ faraday.adapter adapter
119
+ if @request_builder.debug
120
+ faraday.response :logger, @request_builder.logger, bodies: true
121
+ end
122
+ end
123
+ client
124
+ end
125
+
126
+ def parse_response(response)
127
+ parsed_response = nil
128
+
129
+ if response.body && !response.body.empty?
130
+ begin
131
+ headers = response.headers
132
+ body = MultiJson.load(response.body, symbolize_keys: symbolize_keys)
133
+ parsed_response = Response.new(headers: headers, body: body)
134
+ rescue MultiJson::ParseError
135
+ error_params = { title: "UNPARSEABLE_RESPONSE", status_code: 500 }
136
+ error = Error.new("Unparseable response: #{response.body}", error_params)
137
+ raise error
138
+ end
139
+ end
140
+
141
+ parsed_response
142
+ end
143
+
144
+ def validate_api_key
145
+ unless self.token && self.api_endpoint
146
+ raise YandexDostavka::Error, "You must set an token prior to making a call #{self.token} #{self.api_endpoint}"
147
+ end
148
+ end
149
+
150
+ def api_url
151
+ base_api_url + @request_builder.path
152
+ end
153
+
154
+ def base_api_url
155
+ "#{YandexDostavka.api_endpoint}/api/b2b/platform/"
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,29 @@
1
+ module YandexDostavka
2
+ class Error < StandardError
3
+ attr_reader :title, :detail, :body, :raw_body, :status_code
4
+
5
+ def initialize(message = "", params = {})
6
+ @title = params[:title]
7
+ @detail = params[:detail]
8
+ @body = params[:body]
9
+ @raw_body = params[:raw_body]
10
+ @status_code = params[:status_code]
11
+
12
+ super(message)
13
+ end
14
+
15
+ def to_s
16
+ super + " " + instance_variables_to_s
17
+ end
18
+
19
+ private
20
+
21
+ def instance_variables_to_s
22
+ [:title, :detail, :body, :raw_body, :status_code].map do |attr|
23
+ attr_value = send(attr)
24
+
25
+ "@#{attr}=#{attr_value.inspect}"
26
+ end.join(", ")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,102 @@
1
+ module YandexDostavka
2
+ class Request
3
+ attr_accessor :token, :api_endpoint,
4
+ :timeout, :open_timeout, :proxy, :ssl_options, :faraday_adapter, :symbolize_keys, :debug,
5
+ :logger, :test
6
+
7
+ DEFAULT_TIMEOUT = 60
8
+ DEFAULT_OPEN_TIMEOUT = 60
9
+
10
+ def initialize(token: nil,
11
+ api_endpoint: nil, api_auth_method: nil, timeout: nil, open_timeout: nil, proxy: nil, ssl_options: nil,
12
+ faraday_adapter: nil, symbolize_keys: false, debug: false,
13
+ logger: nil, test: false)
14
+
15
+ @path_parts = []
16
+ @token = token || self.class.token || ENV['YANDEX_DOSTAVKA_TOKEN']
17
+ @api_endpoint = api_endpoint || self.class.api_endpoint
18
+ @api_endpoint = YandexDostavka::api_endpoint if @api_endpoint.nil?
19
+ @timeout = timeout || self.class.timeout || DEFAULT_TIMEOUT
20
+ @open_timeout = open_timeout || self.class.open_timeout || DEFAULT_OPEN_TIMEOUT
21
+ @proxy = proxy || self.class.proxy || ENV['API_PROXY']
22
+ @ssl_options = ssl_options || self.class.ssl_options || { version: "TLSv1_2" }
23
+ @faraday_adapter = faraday_adapter || self.class.faraday_adapter || Faraday.default_adapter
24
+ @symbolize_keys = symbolize_keys || self.class.symbolize_keys || false
25
+ @debug = debug || self.class.debug || false
26
+ @test = test || self.class.test || false
27
+ @logger = logger || self.class.logger || ::Logger.new(STDOUT)
28
+ end
29
+
30
+ def method_missing(method, *args)
31
+ @path_parts << method.to_s.downcase.gsub("_", "-")
32
+ @path_parts << args if args.length > 0
33
+ @path_parts.flatten!
34
+ self
35
+ end
36
+
37
+ def respond_to_missing?(method_name, include_private = false)
38
+ true
39
+ end
40
+
41
+ def send(*args)
42
+ if args.length == 0
43
+ method_missing(:send, args)
44
+ else
45
+ __send__(*args)
46
+ end
47
+ end
48
+
49
+ def path
50
+ @path_parts.join('/')
51
+ end
52
+
53
+ def create(params: nil, headers: nil, body: {})
54
+ APIRequest.new(builder: self).post(params: params, headers: headers, body: body)
55
+ ensure
56
+ reset
57
+ end
58
+
59
+ def update(params: nil, headers: nil, body: {})
60
+ APIRequest.new(builder: self).post(params: params, headers: headers, body: body)
61
+ ensure
62
+ reset
63
+ end
64
+
65
+ def retrieve(params: nil, headers: nil, body: {})
66
+ APIRequest.new(builder: self).get(params: params, headers: headers, body: body)
67
+ ensure
68
+ reset
69
+ end
70
+
71
+ def delete(params: nil, headers: nil, body: {})
72
+ APIRequest.new(builder: self).post(params: params, headers: headers, body: {})
73
+ ensure
74
+ reset
75
+ end
76
+
77
+ protected
78
+
79
+ def reset
80
+ @path_parts = []
81
+ end
82
+
83
+ class << self
84
+ attr_accessor :token,
85
+ :timeout, :open_timeout, :api_endpoint, :proxy, :ssl_options, :faraday_adapter, :symbolize_keys,
86
+ :debug, :logger, :test
87
+
88
+ def method_missing(sym, *args, &block)
89
+ new(token: self.token,
90
+ api_endpoint: self.api_endpoint,
91
+ timeout: self.timeout, open_timeout: self.open_timeout, faraday_adapter: self.faraday_adapter,
92
+ symbolize_keys: self.symbolize_keys, debug: self.debug,
93
+ proxy: self.proxy, ssl_options: self.ssl_options, logger: self.logger,
94
+ test: self.test).send(sym, *args, &block)
95
+ end
96
+
97
+ def respond_to_missing?(method_name, include_private = false)
98
+ true
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,10 @@
1
+ module YandexDostavka
2
+ class Response
3
+ attr_accessor :body, :headers
4
+
5
+ def initialize(body: {}, headers: {})
6
+ @body = body
7
+ @headers = headers
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module YandexDostavka
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,56 @@
1
+ require 'faraday'
2
+ require 'faraday/gzip'
3
+ require 'multi_json'
4
+ require 'yandex-dostavka/version'
5
+ require 'yandex-dostavka/error'
6
+ require 'yandex-dostavka/request'
7
+ require 'yandex-dostavka/api_request'
8
+ require 'yandex-dostavka/response'
9
+
10
+ module YandexDostavka
11
+ class << self
12
+ def setup
13
+ yield self
14
+ end
15
+
16
+ def register(name, value, type = nil)
17
+ cattr_accessor "#{name}_setting".to_sym
18
+
19
+ add_reader(name)
20
+ add_writer(name, type)
21
+ send "#{name}=", value
22
+ end
23
+
24
+ def add_reader(name)
25
+ define_singleton_method(name) do |*args|
26
+ send("#{name}_setting").value(*args)
27
+ end
28
+ end
29
+
30
+ def add_writer(name, type)
31
+ define_singleton_method("#{name}=") do |value|
32
+ send("#{name}_setting=", DynamicSetting.build(value, type))
33
+ end
34
+ end
35
+ end
36
+
37
+ class DynamicSetting
38
+ def self.build(setting, type)
39
+ (type ? klass(type) : self).new(setting)
40
+ end
41
+
42
+ def self.klass(type)
43
+ klass = "#{type.to_s.camelcase}Setting"
44
+ raise ArgumentError, "Unknown type: #{type}" unless YandexDostavka.const_defined?(klass)
45
+ YandexDostavka.const_get(klass)
46
+ end
47
+
48
+ def initialize(setting)
49
+ @setting = setting
50
+ end
51
+
52
+ def value(*_args)
53
+ @setting
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yandex-dostavka
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Osetrov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday-gzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.11.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.11.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: irb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.6
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.6
69
+ description: ''
70
+ email: pavel.osetrov@me.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - LICENSE
76
+ - README.markdown
77
+ - lib/generators/yandex-dostavka/install/USAGE
78
+ - lib/generators/yandex-dostavka/install/install_generator.rb
79
+ - lib/generators/yandex-dostavka/install/templates/yandex_dostavka.rb
80
+ - lib/generators/yandex-dostavka/install/templates/yandex_dostavka.yml
81
+ - lib/yandex-dostavka.rb
82
+ - lib/yandex-dostavka/api_request.rb
83
+ - lib/yandex-dostavka/error.rb
84
+ - lib/yandex-dostavka/request.rb
85
+ - lib/yandex-dostavka/response.rb
86
+ - lib/yandex-dostavka/version.rb
87
+ homepage: https://github.com/osetrov/yandex-dostavka
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '2.5'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.2.32
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: YandexDostavka API
110
+ test_files: []