Class: Agave::Repo

Inherits:
Object
  • Object
show all
Defined in:
lib/agave/repo.rb

Constant Summary collapse

IDENTITY_REGEXP =
/\{\(.*?definitions%2F(.*?)%2Fdefinitions%2Fidentity\)}/
METHOD_NAMES =
{
  "instances" => :all,
  "self" => :find,
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, type, schema) ⇒ Repo

Returns a new instance of Repo.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 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

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



8
9
10
# File 'lib/agave/repo.rb', line 8

def client
  @client
end

#schemaObject (readonly)

Returns the value of attribute schema.



8
9
10
# File 'lib/agave/repo.rb', line 8

def schema
  @schema
end

#typeObject (readonly)

Returns the value of attribute type.



8
9
10
# File 'lib/agave/repo.rb', line 8

def type
  @type
end