Sha256: 44dd1e4b2beac34edf4031a02072803710118f4824137fded79d5312c552ef06
Contents?: true
Size: 1.72 KB
Versions: 1
Compression:
Stored size: 1.72 KB
Contents
module Kapellmeister::RequestsExtension def self.request_processing proc do |name, request_data| define_method name do |data = {}| proc { |method:, path:, body: {}, query: {}, mock: ''| return ::Kapellmeister::Base.routes_scheme_parse(mock) if (Rails.try(:env) || ENV['APP_ENV']) == 'test' valid_body?(data, body) valid_query?(data, query) full_path = generate_full_path(path, data) new.connection_by(method, full_path, data) }.call(**request_data) end end rescue NoMethodError raise "You need to define #{self} class with connection_by method" end def self.extended(base) base.module_parent.requests.each(&request_processing) end end def generate_full_path(original_path, data) path = generate_path(original_path, data) [path, data.delete(:query)&.to_query].compact_blank!.join('?') end def generate_path(original_path, data) original_path.split('/').map do |part| next part unless part.include? '%<' data.delete(part.match(/%<(.*)>/).to_a.last.to_sym) end.join('/') end def valid_body?(data, body) return if body.blank? || body.is_a?(Hash) schema = Object.const_get(body).schema result = schema.(data) return data if result.success? raise ArgumentError, result.errors.to_h end def valid_query?(data, query) return if query.blank? required_keys = query.keys from_data = data.slice(*required_keys) data.except!(*required_keys) data[:query] ||= {} data[:query] = data[:query].to_h.merge!(from_data) diffirent_keys = data[:query].transform_keys(&:to_sym) return if required_keys.all? { |key| diffirent_keys.has_key? key.to_sym } raise ArgumentError, "query params needs keys #{required_keys}" end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
kapellmeister-0.5.0 | lib/kapellmeister/requests_extension.rb |