class Agave::Repo
Constants
- IDENTITY_REGEXP
- METHOD_NAMES
Attributes
client[R]
schema[R]
type[R]
Public Class Methods
new(client, type, schema)
click to toggle source
# File lib/agave/repo.rb, line 17 def initialize(client, type, schema) @client = client @type = type @schema = schema schema.links.each do |link| method_name = METHOD_NAMES.fetch(link.rel, link.rel) self.define_singleton_method(method_name) do |*args| min_arguments_count = [ link.href.scan(IDENTITY_REGEXP).size, link.schema && link.method != :get ? 1 : 0 ].reduce(0, :+) args.size >= min_arguments_count or raise ArgumentError.new( "wrong number of arguments (given #{args.size}, expected #{min_arguments_count})" ) placeholders = [] url = link["href"].gsub(IDENTITY_REGEXP) do |_stuff| placeholder = args.shift.to_s placeholders << placeholder placeholder end response = if %i(post put).include?(link.method) body = if link.schema unserialized_body = args.shift JsonApiSerializer.new(type, link).serialize( unserialized_body, link.method == :post ? nil : placeholders.last ) else {} end client.request(link.method, url, body) elsif link.method == :delete client.request(:delete, url) elsif link.method == :get query_string = args.shift all_pages = (args[0] || {}). symbolize_keys. fetch(:all_pages, false) is_paginated_endpoint = link.schema && link.schema.properties.has_key?("page[limit]") if is_paginated_endpoint && all_pages Paginator.new(client, url, query_string).response else client.request(:get, url, query_string) end end options = if args.any? args.shift.symbolize_keys else {} end if options.fetch(:deserialize_response, true) JsonApiDeserializer.new.deserialize(response) else response end end end end