yandex-dostavka 0.0.1

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 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: []