kapellmeister 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/kapellmeister.gemspec +1 -0
- data/lib/generators/kapellmeister/add_service_generator.rb +5 -0
- data/lib/generators/kapellmeister/templates/lib/third_party/configuration.rb.tt +1 -1
- data/lib/generators/kapellmeister/templates/lib/third_party/routes.yml.tt +6 -5
- data/lib/kapellmeister/base.rb +7 -3
- data/lib/kapellmeister/dispatcher.rb +8 -15
- data/lib/kapellmeister/requests_extension.rb +44 -7
- data/lib/kapellmeister/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f6050eee5b66fbd57d701c5c4af3cd6bc1ee34089d1a0aaa7cf90c7fed12fa3
|
4
|
+
data.tar.gz: 47d525ef9f511166657c397257b8989ca02dc6637c360c39a0354c355fa1a595
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4471a0c7b78d03d30e3b61f977d81272aa434bb46c35d5f90bb310667cb2f913a2ba0797699401c8dfee6092fcec58c88643b396c0ba80ff46a9c31fa7b598fc
|
7
|
+
data.tar.gz: 200139ca7b308fe988c74a9047484b8ed95c78b62cedbba5ff1fd848e40b1d9e8c2fb3f6b6fe06bcfceadc0906bbbdfe7173ae3c652f20616811f804a9bc97aa
|
data/Gemfile
CHANGED
data/kapellmeister.gemspec
CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |gem|
|
|
27
27
|
|
28
28
|
gem.required_ruby_version = '>= 2.4.2'
|
29
29
|
|
30
|
+
gem.add_dependency 'dry-schema', '~> 1.9.1'
|
30
31
|
gem.add_dependency 'faraday', '~> 1.0'
|
31
32
|
gem.add_dependency 'faraday-cookie_jar', '~> 0.0.7'
|
32
33
|
gem.add_dependency 'faraday_middleware', '~> 1.2'
|
@@ -11,6 +11,6 @@ class <%= class_name %>::Configuration
|
|
11
11
|
|
12
12
|
https = ssl.presence || true
|
13
13
|
|
14
|
-
"URI::HTTP#{https.to_b ? 'S' : ''}".build(host:, path: [path, version].join('/'))
|
14
|
+
"URI::HTTP#{https.to_b ? 'S' : ''}".constantize.build(host:, path: [path, version].join('/'))
|
15
15
|
end
|
16
16
|
end
|
@@ -2,10 +2,11 @@
|
|
2
2
|
# foo: => Wrapper for method
|
3
3
|
# bar: => Method name
|
4
4
|
# scheme: => Scheme description
|
5
|
-
# method: POST => Request type
|
6
|
-
# use_wrapper: true => Default true
|
7
|
-
# path: buz => Real path
|
8
|
-
#
|
9
|
-
#
|
5
|
+
# method: POST => Request type (* required)
|
6
|
+
# use_wrapper: true => Default true (* required)
|
7
|
+
# path: buz => Real path (* required)
|
8
|
+
# body: => Dry schema for checking parameters. If key doesn't exist nothing happens
|
9
|
+
# query: => Query params. If key doesn't exist nothing happens
|
10
|
+
# mock: => Structure or Path to mock file for tests. If key doesn't exist nothing happens
|
10
11
|
#
|
11
12
|
# Client.foo_bar { a: 'b' } => POST http://host/foo/buz DATA: { a: 'b' }
|
data/lib/kapellmeister/base.rb
CHANGED
@@ -26,14 +26,18 @@ module Kapellmeister::Base
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.routes_scheme_parse(path)
|
29
|
-
|
29
|
+
template = ERB.new(File.read(path)).result
|
30
|
+
YAML.safe_load(template, aliases: true, permitted_classes: [Symbol, Date, Time]).deep_symbolize_keys
|
31
|
+
rescue Errno::ENOENT => e
|
32
|
+
warn "No such file or directory", path
|
33
|
+
{}
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def generate_routes(json_scheme)
|
34
|
-
json_scheme.each_with_object({}) do |(key, value), scheme|
|
38
|
+
json_scheme.dup.each_with_object({}) do |(key, value), scheme|
|
35
39
|
scheme[key] = value.delete(:scheme) if (value.is_a?(Hash) && value.key?(:scheme)) || value.is_a?(String)
|
36
|
-
next if value.length.zero?
|
40
|
+
next if value.nil? || value.length.zero?
|
37
41
|
|
38
42
|
generate_routes(value).map { |deep_key, deep_value| mapping(deep_key, deep_value, key, scheme) }
|
39
43
|
end
|
@@ -10,22 +10,15 @@ class Kapellmeister::Dispatcher
|
|
10
10
|
|
11
11
|
FailedResponse = Struct.new(:success?, :response, :payload)
|
12
12
|
|
13
|
-
def connection_by(
|
14
|
-
|
13
|
+
def connection_by(method_name, path, data = {}, query = {})
|
14
|
+
additional_headers = data.delete(:headers) || {}
|
15
15
|
requests_data = data.delete(:request) || {}
|
16
16
|
|
17
|
-
generated_connection = connection(additional_headers
|
17
|
+
generated_connection = connection(additional_headers:, requests_data:)
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
when :POST
|
23
|
-
process generated_connection.post(path, data.to_json)
|
24
|
-
when :PUT
|
25
|
-
process generated_connection.put(path, data.to_json)
|
26
|
-
else
|
27
|
-
raise "Library can't process method #{method} yet"
|
28
|
-
end
|
19
|
+
process generated_connection.run_request(method_name.downcase.to_sym, path, data.to_json, additional_headers)
|
20
|
+
rescue NoMethodError, NameError, RuntimeError
|
21
|
+
raise "Library can't process method #{method_name} yet"
|
29
22
|
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
30
23
|
failed_response(details: e.message)
|
31
24
|
end
|
@@ -44,7 +37,7 @@ class Kapellmeister::Dispatcher
|
|
44
37
|
::Faraday.new(url: configuration.url,
|
45
38
|
headers: headers_generate(**additional_headers),
|
46
39
|
request: requests_generate(**requests_data)) do |faraday|
|
47
|
-
faraday.request :json, content_type: 'application/json'
|
40
|
+
faraday.request :json, content_type: 'application/json; charset=utf-8'
|
48
41
|
faraday.request :multipart
|
49
42
|
faraday.response :logger, logger
|
50
43
|
faraday.response :json, content_type: 'application/json; charset=utf-8'
|
@@ -56,7 +49,7 @@ class Kapellmeister::Dispatcher
|
|
56
49
|
|
57
50
|
def headers_generate(**additional)
|
58
51
|
{
|
59
|
-
accept: 'application/json, text/plain,
|
52
|
+
accept: 'application/json, text/plain, */*, charset=utf-8',
|
60
53
|
**additional,
|
61
54
|
**headers
|
62
55
|
}
|
@@ -2,16 +2,15 @@ module Kapellmeister::RequestsExtension
|
|
2
2
|
def self.request_processing
|
3
3
|
proc do |name, request_data|
|
4
4
|
define_method name do |data = {}|
|
5
|
-
proc { |method:, path:,
|
6
|
-
|
5
|
+
proc { |method:, path:, body: {}, query: {}, mock: ''|
|
6
|
+
return ::Kapellmeister::Base.routes_scheme_parse(mock) if (Rails.try(:env) || ENV['APP_ENV']) == 'test'
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
valid_body?(data, body)
|
9
|
+
valid_query?(data, query)
|
10
10
|
|
11
|
-
|
12
|
-
end.join('/')
|
11
|
+
full_path = generate_full_path(path, data)
|
13
12
|
|
14
|
-
new.connection_by(method,
|
13
|
+
new.connection_by(method, full_path, data)
|
15
14
|
}.call(**request_data)
|
16
15
|
end
|
17
16
|
end
|
@@ -23,3 +22,41 @@ module Kapellmeister::RequestsExtension
|
|
23
22
|
base.module_parent.requests.each(&request_processing)
|
24
23
|
end
|
25
24
|
end
|
25
|
+
|
26
|
+
def generate_full_path(original_path, data)
|
27
|
+
path = generate_path(original_path, data)
|
28
|
+
[path, data.delete(:query)&.to_query].compact_blank!.join('?')
|
29
|
+
end
|
30
|
+
|
31
|
+
def generate_path(original_path, data)
|
32
|
+
original_path.split('/').map do |part|
|
33
|
+
next part unless part.include? '%<'
|
34
|
+
|
35
|
+
data.delete(part.match(/%<(.*)>/).to_a.last.to_sym)
|
36
|
+
end.join('/')
|
37
|
+
end
|
38
|
+
|
39
|
+
def valid_body?(data, body)
|
40
|
+
return if body.blank? || body.is_a?(Hash)
|
41
|
+
|
42
|
+
schema = Object.const_get(body).schema
|
43
|
+
result = schema.(data)
|
44
|
+
return data if result.success?
|
45
|
+
|
46
|
+
raise ArgumentError, result.errors.to_h
|
47
|
+
end
|
48
|
+
|
49
|
+
def valid_query?(data, query)
|
50
|
+
return if query.blank?
|
51
|
+
required_keys = query.keys
|
52
|
+
|
53
|
+
from_data = data.slice(*required_keys)
|
54
|
+
data.except!(*required_keys)
|
55
|
+
data[:query] ||= {}
|
56
|
+
data[:query] = data[:query].to_h.merge!(from_data)
|
57
|
+
|
58
|
+
diffirent_keys = data[:query].transform_keys(&:to_sym)
|
59
|
+
return if required_keys.all? { |key| diffirent_keys.has_key? key.to_sym }
|
60
|
+
|
61
|
+
raise ArgumentError, "query params needs keys #{required_keys}"
|
62
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kapellmeister
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarkWater
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-schema
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.9.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.9.1
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: faraday
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|