yandex-delivery 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 91748eda3052b17b15c0ce0e8516329bd1b87e9d533ac9d14bbbb1c6ba81f636
4
+ data.tar.gz: f31f190ec14dc44f6fbfd34bfa3ec5cc48c99fc18eb9eb8d1e2d439da68ef97b
5
+ SHA512:
6
+ metadata.gz: ee08aee6c2591bec0a92e7be892a2c3ea8a29a1d7979d1164a556f1e50ecb7ed91ca733d07792d8e26d57b5e7314be504df7a26034cc1cd5d54bb98bb4cb2b73
7
+ data.tar.gz: 4b88e75219b26960b6ef886b1f79392e4750b726169622250e817960b49fa069efbd4cceaca6a1dd0f212fee1fcb711174c4a8d65fd57e2e0bdb47aa32c1a7f6
@@ -0,0 +1,2 @@
1
+ Description:
2
+ yandex_delivery:install
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ module YandexDelivery
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def generate_install
8
+ copy_file 'yandex_delivery.yml', 'config/yandex_delivery2.yml'
9
+ copy_file 'yandex_delivery.rb', 'config/initializers/yandex_delivery2.rb'
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,23 @@
1
+ require 'yandex_delivery'
2
+
3
+ YandexDelivery.setup do |config|
4
+ if File.exist?('config/yandex_delivery.yml')
5
+ template = ERB.new(File.new('config/yandex_delivery2.yml').read)
6
+ processed = YAML.safe_load(template.result(binding))
7
+
8
+ config::Request.api_key = processed['YANDEX_DELIVERY_ACCESS_TOKEN']
9
+ config::Request.timeout = 15
10
+ config::Request.open_timeout = 15
11
+ config::Request.symbolize_keys = true
12
+ config::Request.debug = false
13
+
14
+ # processed['YANDEX_DELIVERY_API_KEY'].each do |k, v|
15
+ # config::create_method k.underscore.to_sym
16
+ # config::register "#{k.underscore}_key".to_sym, v
17
+ # end
18
+
19
+ processed['YANDEX_DELIVERY'].each do |k, v|
20
+ config::register k.underscore.to_sym, v
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ YANDEX_DELIVERY_ACCESS_TOKEN: ''
2
+
3
+ YANDEX_DELIVERY: {
4
+ "client": {
5
+ "id": 0
6
+ },
7
+ "warehouses": [
8
+ {
9
+ "id": 0,
10
+ "name": "Склад"
11
+ }
12
+ ],
13
+ "senders": [
14
+ {
15
+ "id": 0,
16
+ "name": "Магазин"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,53 @@
1
+ require 'yandex-delivery/yandex_delivery_error'
2
+ require 'yandex-delivery/yandex_error'
3
+ require 'yandex-delivery/request'
4
+ require 'yandex-delivery/api_request'
5
+ require 'yandex-delivery/response'
6
+
7
+ module YandexDelivery
8
+ class << self
9
+ def setup
10
+ yield self
11
+ end
12
+
13
+ def register(name, value, type = nil)
14
+ cattr_accessor "#{name}_setting".to_sym
15
+
16
+ add_reader(name)
17
+ add_writer(name, type)
18
+ send "#{name}=", value
19
+ end
20
+
21
+ def add_reader(name)
22
+ define_singleton_method(name) do |*args|
23
+ send("#{name}_setting").value(*args)
24
+ end
25
+ end
26
+
27
+ def add_writer(name, type)
28
+ define_singleton_method("#{name}=") do |value|
29
+ send("#{name}_setting=", DynamicSetting.build(value, type))
30
+ end
31
+ end
32
+ end
33
+
34
+ class DynamicSetting
35
+ def self.build(setting, type)
36
+ (type ? klass(type) : self).new(setting)
37
+ end
38
+
39
+ def self.klass(type)
40
+ klass = "#{type.to_s.camelcase}Setting"
41
+ raise ArgumentError, "Unknown type: #{type}" unless YandexDelivery.const_defined?(klass)
42
+ YandexDelivery.const_get(klass)
43
+ end
44
+
45
+ def initialize(setting)
46
+ @setting = setting
47
+ end
48
+
49
+ def value(*_args)
50
+ @setting
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,196 @@
1
+ module YandexDelivery
2
+ class APIRequest
3
+
4
+ def initialize(builder: nil)
5
+ @request_builder = builder
6
+ end
7
+
8
+ def post(params: nil, headers: nil, body: {})
9
+ validate_api_key
10
+
11
+ begin
12
+ response = self.rest_client.post do |request|
13
+ body[:senderId] = YandexDelivery.senders.first["id"] if body[:senderId].nil?
14
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
15
+ end
16
+ parse_response(response)
17
+ rescue => e
18
+ handle_error(e)
19
+ end
20
+ end
21
+
22
+ def patch(params: nil, headers: nil, body: {})
23
+ validate_api_key
24
+
25
+ begin
26
+ response = self.rest_client.patch do |request|
27
+ body[:senderId] = YandexDelivery.senders.first["id"] if body[:senderId].nil?
28
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
29
+ end
30
+ parse_response(response)
31
+ rescue => e
32
+ handle_error(e)
33
+ end
34
+ end
35
+
36
+ def put(params: nil, headers: nil, body: {})
37
+ validate_api_key
38
+
39
+ begin
40
+ response = self.rest_client.put do |request|
41
+ body[:senderId] = YandexDelivery.senders.first["id"] if body[:senderId].nil?
42
+ configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
43
+ end
44
+ parse_response(response)
45
+ rescue => e
46
+ handle_error(e)
47
+ end
48
+ end
49
+
50
+ def get(params: nil, headers: nil)
51
+ validate_api_key
52
+
53
+ begin
54
+ response = self.rest_client.get do |request|
55
+ configure_request(request: request, params: params, headers: headers)
56
+ end
57
+ parse_response(response)
58
+ rescue => e
59
+ handle_error(e)
60
+ end
61
+ end
62
+
63
+ def delete(params: nil, headers: nil)
64
+ validate_api_key
65
+
66
+ begin
67
+ response = self.rest_client.delete do |request|
68
+ configure_request(request: request, params: params, headers: headers)
69
+ end
70
+ parse_response(response)
71
+ rescue => e
72
+ handle_error(e)
73
+ end
74
+ end
75
+
76
+ protected
77
+
78
+ # Convenience accessors
79
+
80
+ def api_key
81
+ @request_builder.api_key
82
+ end
83
+
84
+ def api_endpoint
85
+ @request_builder.api_endpoint
86
+ end
87
+
88
+ def timeout
89
+ @request_builder.timeout
90
+ end
91
+
92
+ def open_timeout
93
+ @request_builder.open_timeout
94
+ end
95
+
96
+ def proxy
97
+ @request_builder.proxy
98
+ end
99
+
100
+ def adapter
101
+ @request_builder.faraday_adapter
102
+ end
103
+
104
+ def symbolize_keys
105
+ @request_builder.symbolize_keys
106
+ end
107
+
108
+ # Helpers
109
+
110
+ def handle_error(error)
111
+ error_params = {}
112
+
113
+ begin
114
+ if error.is_a?(Faraday::ClientError) && error.response
115
+ error_params[:status_code] = error.response[:status]
116
+ error_params[:raw_body] = error.response[:body]
117
+
118
+ parsed_response = MultiJson.load(error.response[:body], symbolize_keys: symbolize_keys)
119
+
120
+ if parsed_response
121
+ error_params[:body] = parsed_response
122
+
123
+ title_key = symbolize_keys ? :title : "title"
124
+ detail_key = symbolize_keys ? :detail : "detail"
125
+
126
+ error_params[:title] = parsed_response[title_key] if parsed_response[title_key]
127
+ error_params[:detail] = parsed_response[detail_key] if parsed_response[detail_key]
128
+ end
129
+
130
+ end
131
+ rescue MultiJson::ParseError
132
+ end
133
+
134
+ error_to_raise = YandexError.new(error.message, error_params)
135
+
136
+ raise error_to_raise
137
+ end
138
+
139
+ def configure_request(request: nil, params: nil, headers: nil, body: nil)
140
+ if request
141
+ request.params.merge!(params) if params
142
+ request.headers['Content-Type'] = 'application/json'
143
+ request.headers['Authorization: OAuth'] = self.api_key
144
+ request.headers.merge!(headers) if headers
145
+ request.body = body if body
146
+ request.options.timeout = self.timeout
147
+ request.options.open_timeout = self.open_timeout
148
+ p request
149
+ end
150
+ end
151
+
152
+ def rest_client
153
+ client = Faraday.new(self.api_url, proxy: self.proxy, ssl: { version: "TLSv1_2" }) do |faraday|
154
+ faraday.response :raise_error
155
+ faraday.adapter adapter
156
+ if @request_builder.debug
157
+ faraday.response :logger, @request_builder.logger, bodies: true
158
+ end
159
+ end
160
+ client
161
+ end
162
+
163
+ def parse_response(response)
164
+ parsed_response = nil
165
+
166
+ if response.body && !response.body.empty?
167
+ begin
168
+ headers = response.headers
169
+ body = MultiJson.load(response.body, symbolize_keys: symbolize_keys)
170
+ parsed_response = Response.new(headers: headers, body: body)
171
+ rescue MultiJson::ParseError
172
+ error_params = { title: "UNPARSEABLE_RESPONSE", status_code: 500 }
173
+ error = YandexError.new("Unparseable response: #{response.body}", error_params)
174
+ raise error
175
+ end
176
+ end
177
+
178
+ parsed_response
179
+ end
180
+
181
+ def validate_api_key
182
+ api_key = self.api_key
183
+ unless api_key && (api_key["-"] || self.api_endpoint)
184
+ raise YandexDelivery::YandexDeliveryError, "You must set an api_key prior to making a call"
185
+ end
186
+ end
187
+
188
+ def api_url
189
+ base_api_url + @request_builder.path
190
+ end
191
+
192
+ def base_api_url
193
+ "https://api.delivery.yandex.ru/"
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,94 @@
1
+ module YandexDelivery
2
+ class Request
3
+ attr_accessor :api_key, :api_endpoint, :timeout, :open_timeout, :proxy, :faraday_adapter, :symbolize_keys, :debug, :logger
4
+
5
+ DEFAULT_TIMEOUT = 60
6
+ DEFAULT_OPEN_TIMEOUT = 60
7
+
8
+ def initialize(api_key: nil, api_endpoint: nil, timeout: nil, open_timeout: nil, proxy: nil, faraday_adapter: nil, symbolize_keys: false, debug: false, logger: nil)
9
+ @path_parts = []
10
+ @api_key = api_key || self.class.api_key || ENV['YANDEX_DELIVERY_API_KEY']
11
+ @api_key = @api_key.strip if @api_key
12
+ @api_endpoint = api_endpoint || self.class.api_endpoint
13
+ @timeout = timeout || self.class.timeout || DEFAULT_TIMEOUT
14
+ @open_timeout = open_timeout || self.class.open_timeout || DEFAULT_OPEN_TIMEOUT
15
+ @proxy = proxy || self.class.proxy || ENV['YANDEX_PROXY']
16
+ @faraday_adapter = faraday_adapter || self.class.faraday_adapter || Faraday.default_adapter
17
+ @symbolize_keys = symbolize_keys || self.class.symbolize_keys || false
18
+ @debug = debug || self.class.debug || false
19
+ @logger = logger || self.class.logger || ::Logger.new(STDOUT)
20
+ end
21
+
22
+ def method_missing(method, *args)
23
+ # To support underscores, we replace them with hyphens when calling the API
24
+ @path_parts << method.to_s.gsub("_", "-").downcase
25
+ @path_parts << args if args.length > 0
26
+ @path_parts.flatten!
27
+ self
28
+ end
29
+
30
+ def respond_to_missing?(method_name, include_private = false)
31
+ true
32
+ end
33
+
34
+ def send(*args)
35
+ if args.length == 0
36
+ method_missing(:send, args)
37
+ else
38
+ __send__(*args)
39
+ end
40
+ end
41
+
42
+ def path
43
+ @path_parts.join('/')
44
+ end
45
+
46
+ def create(params: nil, headers: nil, body: {})
47
+ APIRequest.new(builder: self).post(params: params, headers: headers, body: body)
48
+ ensure
49
+ reset
50
+ end
51
+
52
+ def update(params: nil, headers: nil, body: {})
53
+ APIRequest.new(builder: self).patch(params: params, headers: headers, body: body)
54
+ ensure
55
+ reset
56
+ end
57
+
58
+ def upsert(params: nil, headers: nil, body: {})
59
+ APIRequest.new(builder: self).put(params: params, headers: headers, body: body)
60
+ ensure
61
+ reset
62
+ end
63
+
64
+ def retrieve(params: nil, headers: nil)
65
+ APIRequest.new(builder: self).get(params: params, headers: headers)
66
+ ensure
67
+ reset
68
+ end
69
+
70
+ def delete(params: nil, headers: nil)
71
+ APIRequest.new(builder: self).delete(params: params, headers: headers)
72
+ ensure
73
+ reset
74
+ end
75
+
76
+ protected
77
+
78
+ def reset
79
+ @path_parts = []
80
+ end
81
+
82
+ class << self
83
+ attr_accessor :api_key, :timeout, :open_timeout, :api_endpoint, :proxy, :faraday_adapter, :symbolize_keys, :debug, :logger
84
+
85
+ def method_missing(sym, *args, &block)
86
+ new(api_key: self.api_key, api_endpoint: self.api_endpoint, timeout: self.timeout, open_timeout: self.open_timeout, faraday_adapter: self.faraday_adapter, symbolize_keys: self.symbolize_keys, debug: self.debug, proxy: self.proxy, logger: self.logger).send(sym, *args, &block)
87
+ end
88
+
89
+ def respond_to_missing?(method_name, include_private = false)
90
+ true
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,10 @@
1
+ module YandexDelivery
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 YandexDelivery
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,3 @@
1
+ module YandexDelivery
2
+ class YandexDeliveryError < StandardError; end
3
+ end
@@ -0,0 +1,29 @@
1
+ module YandexDelivery
2
+ class YandexError < 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
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yandex-delivery
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: 2020-08-11 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: 0.16.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.16.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.11.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.11.0
41
+ description: ''
42
+ email: pavel.osetrov@me.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/generators/yandex_delivery/install/USAGE
48
+ - lib/generators/yandex_delivery/install/install_generator.rb
49
+ - lib/generators/yandex_delivery/install/templates/yandex_delivery.rb
50
+ - lib/generators/yandex_delivery/install/templates/yandex_delivery.yml
51
+ - lib/yandex-delivery.rb
52
+ - lib/yandex-delivery/api_request.rb
53
+ - lib/yandex-delivery/request.rb
54
+ - lib/yandex-delivery/response.rb
55
+ - lib/yandex-delivery/version.rb
56
+ - lib/yandex-delivery/yandex_delivery_error.rb
57
+ - lib/yandex-delivery/yandex_error.rb
58
+ homepage: https://github.com/osetrov/yandex-delivery
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 2.3.8
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.1.4
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Yandex delivery
81
+ test_files: []