Sha256: bfa1669785ec2183bcee617c59410a73321154480f60ac23b0a71a27e6089f38
Contents?: true
Size: 1.85 KB
Versions: 1
Compression:
Stored size: 1.85 KB
Contents
module Kapellmeister::RequestsExtension def self.request_processing proc do |name, request_data| define_method name do |data = {}| proc { |method:, path: nil, body: {}, query_params: {}, mock: ''| if (Rails.try(:env) || ENV.fetch('APP_ENV', nil)) == 'test' return ::Kapellmeister::Base.routes_scheme_parse(mock) end data = query_params.compact_blank.merge(data) valid_body?(data, body) valid_query?(data, query_params) full_path = generate_full_path(path, data) 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 end def generate_full_path(original_path, data) path = generate_path(original_path, data) query = data.delete(:query_params)&.to_query return "?#{query}" unless path [path, query].compact_blank!.join('?') end def generate_path(original_path, data) return nil unless original_path 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.call(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_params] ||= {} data[:query_params] = data[:query_params].to_h.merge!(from_data) different_keys = data[:query_params].transform_keys(&:to_sym) return if required_keys.all? { |key| different_keys.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.8.0 | lib/kapellmeister/requests_extension.rb |