json_api_client 1.0.0.beta → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cab5bf2208be347ffc15b03c0af11c4c21ace976
4
- data.tar.gz: 98074a5fcacd34fb0a4dc946f8968957437b8f3a
3
+ metadata.gz: 738f41ec73db3cf6cdf208abb4ad48ea7fc50e39
4
+ data.tar.gz: a0b6dfce9e509e9d7ac206ba742ce3b52e41a04e
5
5
  SHA512:
6
- metadata.gz: 5f091b91fbb8006898403e893f7c934c11b600a1d0ccdb7e22afd8cefae97edaa51a1d59c3e9a52e1cf9fb52ceb2708db23407138c2dff9837f7bfdfb165be34
7
- data.tar.gz: 286263275aebe8fb7a777c817a3b368dda97bea2aaec6208061631774f98ec92f2b5ea6f5a9ddabd3764de34a941a23fedf90b1f9587a286acb2ba0e2194a75c
6
+ metadata.gz: d20ef7885deb0589bbb6d6d7fa89d40ef7dbf192e1461ba006f4124c0986a581ce0da11d1bf5d9ce308610ef142effcc11ceb7aa4a91f78752db9f511357837e
7
+ data.tar.gz: 2dd89bd5ea1b889f71a1b62826f087ebb30078a38f20218483fdf119928a3e0f724db2f10fb2dfcef58dba7ab3f48b108d7c9ade2133f469aed8dbf4c47dbaaf
@@ -5,12 +5,13 @@ module JsonApiClient
5
5
 
6
6
  def initialize(options = {})
7
7
  site = options.fetch(:site)
8
+ adapter_options = Array(options.fetch(:adapter, Faraday.default_adapter))
8
9
  @faraday = Faraday.new(site) do |builder|
9
10
  builder.request :json
10
11
  builder.use Middleware::JsonRequest
11
12
  builder.use Middleware::Status
12
13
  builder.use Middleware::ParseJson
13
- builder.adapter Faraday.default_adapter
14
+ builder.adapter *adapter_options
14
15
  end
15
16
  yield(self) if block_given?
16
17
  end
@@ -1,28 +1,79 @@
1
1
  module JsonApiClient
2
- class ErrorCollector
2
+ class ErrorCollector < Array
3
3
  class Error
4
- include Helpers::DynamicAttributes
4
+ delegate :[], to: :attrs
5
5
 
6
6
  def initialize(attrs = {})
7
- attrs = {
8
- title: attrs
9
- } if attrs.is_a?(String)
10
- self.attributes = attrs
7
+ @attrs = (attrs || {}).with_indifferent_access
11
8
  end
12
- end
13
9
 
14
- attr_reader :errors
15
- extend Forwardable
16
- def_delegators :errors, :length, :present?
10
+ def id
11
+ attrs[:id]
12
+ end
17
13
 
18
- def initialize(error_data)
19
- @errors = Array(error_data).map do |datum|
20
- Error.new(datum)
14
+ def about
15
+ attrs.fetch(:links, {})[:about]
16
+ end
17
+
18
+ def status
19
+ attrs[:status]
20
+ end
21
+
22
+ def code
23
+ attrs[:code]
21
24
  end
25
+
26
+ def title
27
+ attrs[:title]
28
+ end
29
+
30
+ def detail
31
+ attrs[:detail]
32
+ end
33
+
34
+ def source_parameter
35
+ source.fetch(:parameter) do
36
+ source[:pointer] ?
37
+ source[:pointer].split("/").last :
38
+ nil
39
+ end
40
+ end
41
+
42
+ def source_pointer
43
+ source.fetch(:pointer) do
44
+ source[:parameter] ?
45
+ "/data/attributes/#{source[:parameter]}" :
46
+ nil
47
+ end
48
+ end
49
+
50
+ def source
51
+ attrs.fetch(:source, {})
52
+ end
53
+
54
+ def meta
55
+ MetaData.new(attrs.fetch(:meta, {}))
56
+ end
57
+
58
+ protected
59
+
60
+ attr_reader :attrs
61
+ end
62
+
63
+ def initialize(error_data)
64
+ super(error_data.map do |data|
65
+ Error.new(data)
66
+ end)
22
67
  end
23
68
 
24
69
  def full_messages
25
- errors.map(&:title)
70
+ map(&:title)
71
+ end
72
+
73
+ def [](source)
74
+ map do |error|
75
+ error.source_parameter == source
76
+ end
26
77
  end
27
78
 
28
79
  end
@@ -58,4 +58,4 @@ module JsonApiClient
58
58
 
59
59
  end
60
60
  end
61
- end
61
+ end
@@ -25,4 +25,4 @@ module JsonApiClient
25
25
  end
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -10,9 +10,6 @@ module JsonApiClient
10
10
  # the links for this resource
11
11
  attr_accessor :links
12
12
 
13
- # reference to all of the preloaded data
14
- attr_accessor :linked_data
15
-
16
13
  initializer do |obj, params|
17
14
  links = params && params.delete("links")
18
15
  links ||= {}
@@ -20,29 +17,6 @@ module JsonApiClient
20
17
  end
21
18
  end
22
19
 
23
- def as_link
24
- {
25
- :type => self.class.table_name,
26
- primary_key => self[primary_key]
27
- }
28
- end
29
-
30
- def attributes
31
- super.tap do |attrs|
32
- attrs.merge!(links: links.attributes) if links.present?
33
- end
34
- end
35
-
36
- def method_missing(method, *args)
37
- return super unless links && links.has_attribute?(method)
38
- linked_data.data_for(method, links[method])
39
- end
40
-
41
- def respond_to_missing?(symbol, include_all = false)
42
- return true if links && links.has_attribute?(symbol)
43
- super
44
- end
45
-
46
20
  end
47
21
  end
48
- end
22
+ end
@@ -10,4 +10,5 @@ module JsonApiClient
10
10
 
11
11
  end
12
12
  end
13
- end
13
+ end
14
+
@@ -0,0 +1,45 @@
1
+ module JsonApiClient
2
+ module Helpers
3
+ module Relatable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ class_attribute :relationship_linker
8
+ self.relationship_linker = Relationships::Relations
9
+
10
+ # the relationships for this resource
11
+ attr_accessor :relationships
12
+
13
+ initializer do |obj, params|
14
+ relationships = params && params.delete("relationships")
15
+ relationships ||= {}
16
+ obj.relationships = obj.relationship_linker.new(relationships)
17
+ end
18
+ end
19
+
20
+ def as_relation
21
+ {
22
+ :type => self.class.table_name,
23
+ primary_key => self[primary_key]
24
+ }
25
+ end
26
+
27
+ def attributes
28
+ super.tap do |attrs|
29
+ attrs.merge!(relationships: relationships.attributes) if relationships.present?
30
+ end
31
+ end
32
+
33
+ def method_missing(method, *args)
34
+ return super unless relationships and relationships.has_attribute?(method) and result_set.included
35
+ result_set.included.data_for(method, relationships[method])
36
+ end
37
+
38
+ def respond_to_missing?(symbol, include_all = false)
39
+ return true if relationships && relationships.has_attribute?(symbol)
40
+ super
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -32,8 +32,8 @@ module JsonApiClient
32
32
  self.class.requestor.create(self)
33
33
  end
34
34
 
35
+ self.errors = last_result_set.errors
35
36
  if last_result_set.has_errors?
36
- self.errors = last_result_set.errors
37
37
  false
38
38
  else
39
39
  self.errors.clear if self.errors
@@ -57,4 +57,4 @@ module JsonApiClient
57
57
 
58
58
  end
59
59
  end
60
- end
60
+ end
@@ -1,13 +1,24 @@
1
1
  module JsonApiClient
2
2
  module Helpers
3
3
  module Serializable
4
- def as_json(options=nil)
5
- attributes
4
+ RESERVED = ['id', 'type', 'links', 'meta', 'relationships']
5
+
6
+ # def as_json(options=nil)
7
+ # attributes.slice(*RESERVED).tap do |h|
8
+ # h['attributes'] = serialized_attributes
9
+ # end
10
+ # end
11
+
12
+ def data
13
+ attributes.slice(*RESERVED).tap do |h|
14
+ h['attributes'] = serialized_attributes
15
+ end
6
16
  end
7
17
 
8
- def read_attribute_for_serialization(name)
9
- read_attribute(name)
18
+ def serialized_attributes
19
+ attributes.except(*RESERVED)
10
20
  end
21
+
11
22
  end
12
23
  end
13
- end
24
+ end
@@ -6,6 +6,7 @@ module JsonApiClient
6
6
  autoload :DynamicAttributes, 'json_api_client/helpers/dynamic_attributes'
7
7
  autoload :Initializable, 'json_api_client/helpers/initializable'
8
8
  autoload :Linkable, 'json_api_client/helpers/linkable'
9
+ autoload :Relatable, 'json_api_client/helpers/relatable'
9
10
  autoload :Paginatable, 'json_api_client/helpers/paginatable'
10
11
  autoload :Parsable, 'json_api_client/helpers/parsable'
11
12
  autoload :Queryable, 'json_api_client/helpers/queryable'
@@ -0,0 +1,12 @@
1
+ module JsonApiClient
2
+ class Implementation
3
+ attr_reader :version, :meta
4
+
5
+ def initialize(data)
6
+ # If the version member is not present, clients should assume the server implements at least version 1.0 of the specification.
7
+ @version = data.fetch("version", "1.0")
8
+
9
+ @meta = MetaData.new(data.fetch("meta", {}))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ module JsonApiClient
2
+ class IncludedData
3
+ attr_reader :data
4
+
5
+ def initialize(result_set, data)
6
+ record_class = result_set.record_class
7
+ grouped_data = data.group_by{|datum| datum["type"]}
8
+ @data = grouped_data.inject({}) do |h, (type, records)|
9
+ klass = Utils.compute_type(record_class, type.singularize.classify)
10
+ h[type] = records.map do |datum|
11
+ params = klass.parser.parameters_from_resource(datum)
12
+ resource = klass.new(params)
13
+ resource.result_set = result_set
14
+ resource
15
+ end.index_by(&:id)
16
+ h
17
+ end
18
+ end
19
+
20
+ def data_for(method_name, definition)
21
+ # If data is defined, pull the record from the included data
22
+ if data = definition["data"]
23
+ if data.is_a?(Array)
24
+ # has_many link
25
+ data.map do |link_def|
26
+ record_for(link_def)
27
+ end
28
+ else
29
+ # has_one link
30
+ record_for(data)
31
+ end
32
+ else
33
+ # TODO: if "related" URI is defined, fetch the delated object and stuff it in data
34
+ nil
35
+ end
36
+ end
37
+
38
+ def has_link?(name)
39
+ data.has_key?(name)
40
+ end
41
+
42
+ private
43
+
44
+ # should return a resource record of some type for this linked document
45
+ def record_for(link_def)
46
+ data[link_def["type"]][link_def["id"]]
47
+ end
48
+ end
49
+ end
@@ -14,14 +14,7 @@ module JsonApiClient
14
14
  protected
15
15
 
16
16
  def set_attribute(name, value)
17
- attributes[name] = case value
18
- when JsonApiClient::Resource
19
- {linkage: value.as_link}
20
- when Array
21
- {linkage: value.map(&:as_link)}
22
- else
23
- value
24
- end
17
+ attributes[name] = value
25
18
  end
26
19
 
27
20
  end
@@ -27,4 +27,4 @@ module JsonApiClient
27
27
  end
28
28
  end
29
29
  end
30
- end
30
+ end
@@ -1,6 +1,5 @@
1
1
  module JsonApiClient
2
2
  module Linking
3
- autoload :IncludedData, "json_api_client/linking/included_data"
4
3
  autoload :Links, "json_api_client/linking/links"
5
4
  autoload :TopLevelLinks, "json_api_client/linking/top_level_links"
6
5
  end
@@ -2,10 +2,10 @@ module JsonApiClient
2
2
  module Paginating
3
3
  class Paginator
4
4
  attr_reader :params, :result_set, :links
5
- def initialize(result_set, links)
5
+ def initialize(result_set, data)
6
6
  @params = params_for_uri(result_set.uri)
7
7
  @result_set = result_set
8
- @links = links
8
+ @links = data['links']
9
9
  end
10
10
 
11
11
  def next
@@ -39,6 +39,7 @@ module JsonApiClient
39
39
  def total_entries
40
40
  per_page * total_pages
41
41
  end
42
+ alias_method :total_count, :total_entries
42
43
 
43
44
  def offset
44
45
  per_page * (current_page - 1)
@@ -77,4 +78,4 @@ module JsonApiClient
77
78
  end
78
79
  end
79
80
  end
80
- end
81
+ end
@@ -7,24 +7,69 @@ module JsonApiClient
7
7
  ResultSet.new.tap do |result_set|
8
8
  result_set.record_class = klass
9
9
  result_set.uri = response.env[:url]
10
+ handle_json_api(result_set, data)
10
11
  handle_data(result_set, data)
11
12
  handle_errors(result_set, data)
12
13
  handle_meta(result_set, data)
13
14
  handle_links(result_set, data)
15
+ handle_relationships(result_set, data)
14
16
  handle_pagination(result_set, data)
15
17
  handle_included(result_set, data)
16
18
  end
17
19
  end
18
20
 
21
+ #
22
+ # Given a resource hash, returns a Resource.new friendly hash
23
+ # which flattens the attributes in w/ id and type.
24
+ #
25
+ # Example:
26
+ #
27
+ # Given:
28
+ # {
29
+ # id: 1.
30
+ # type: 'person',
31
+ # attributes: {
32
+ # first_name: 'Jeff',
33
+ # last_name: 'Ching'
34
+ # },
35
+ # links: {...},
36
+ # relationships: {...}
37
+ # }
38
+ #
39
+ # Returns:
40
+ # {
41
+ # id: 1,
42
+ # type: 'person',
43
+ # first_name: 'Jeff',
44
+ # last_name: 'Ching'
45
+ # links: {...},
46
+ # relationships: {...}
47
+ # }
48
+ #
49
+ #
50
+ def parameters_from_resource(params)
51
+ attrs = params.slice('id', 'links', 'meta', 'type', 'relationships')
52
+ attrs.merge(params.fetch('attributes', {}))
53
+ end
54
+
19
55
  private
20
56
 
57
+ def handle_json_api(result_set, data)
58
+ result_set.implementation = Implementation.new(data.fetch("jsonapi", {}))
59
+ end
60
+
21
61
  def handle_data(result_set, data)
22
62
  # all data lives under the "data" attribute
23
63
  results = data.fetch("data", [])
24
64
 
25
65
  # we will treat everything as an Array
26
66
  results = [results] unless results.is_a?(Array)
27
- result_set.concat(results.map{|res| result_set.record_class.load(res)})
67
+ resources = results.map do |res|
68
+ resource = result_set.record_class.load(parameters_from_resource(res))
69
+ resource.result_set = result_set
70
+ resource
71
+ end
72
+ result_set.concat(resources)
28
73
  end
29
74
 
30
75
  def handle_errors(result_set, data)
@@ -39,17 +84,18 @@ module JsonApiClient
39
84
  result_set.links = Linking::TopLevelLinks.new(result_set.record_class, data.fetch("links", {}))
40
85
  end
41
86
 
87
+ def handle_relationships(result_set, data)
88
+ result_set.relationships = Relationships::TopLevelRelations.new(result_set.record_class, data.fetch("relationships", {}))
89
+ end
90
+
42
91
  def handle_pagination(result_set, data)
43
- result_set.pages = result_set.record_class.paginator.new(result_set, data.fetch("links", {}))
92
+ result_set.pages = result_set.record_class.paginator.new(result_set, data)
44
93
  end
45
94
 
46
95
  def handle_included(result_set, data)
47
- included = Linking::IncludedData.new(result_set.record_class, data.fetch("included", []))
48
- result_set.each do |res|
49
- res.linked_data = included
50
- end
96
+ result_set.included = IncludedData.new(result_set, data.fetch("included", []))
51
97
  end
52
98
  end
53
99
  end
54
100
  end
55
- end
101
+ end
@@ -34,12 +34,19 @@ module JsonApiClient
34
34
  end
35
35
 
36
36
  def paginate(conditions = {})
37
- @pagination_params.merge!(conditions.slice(:page, :per_page))
38
- self
37
+ scope = self
38
+ scope = scope.page(conditions[:page]) if conditions[:page]
39
+ scope = scope.per(conditions[:per_page]) if conditions[:per_page]
40
+ scope
39
41
  end
40
42
 
41
43
  def page(number)
42
- @pagination_params[:page] = number
44
+ @pagination_params[:number] = number
45
+ self
46
+ end
47
+
48
+ def per(size)
49
+ @pagination_params[:size] = size
43
50
  self
44
51
  end
45
52
 
@@ -70,7 +77,9 @@ module JsonApiClient
70
77
 
71
78
  private
72
79
 
73
- attr_reader :pagination_params
80
+ def pagination_params
81
+ @pagination_params.empty? ? {} : {page: @pagination_params}
82
+ end
74
83
 
75
84
  def includes_params
76
85
  @includes.empty? ? {} : {include: @includes.join(",")}
@@ -10,13 +10,13 @@ module JsonApiClient
10
10
  # expects a record
11
11
  def create(record)
12
12
  request(:post, klass.path(record.attributes), {
13
- data: record.attributes
13
+ data: record.data
14
14
  })
15
15
  end
16
16
 
17
17
  def update(record)
18
18
  request(:patch, resource_path(record.attributes), {
19
- data: record.attributes
19
+ data: record.data
20
20
  })
21
21
  end
22
22
 
@@ -74,4 +74,4 @@ module JsonApiClient
74
74
 
75
75
  end
76
76
  end
77
- end
77
+ end
@@ -0,0 +1,29 @@
1
+ module JsonApiClient
2
+ module Relationships
3
+ class Relations
4
+ include Helpers::DynamicAttributes
5
+
6
+ def initialize(relations)
7
+ self.attributes = relations
8
+ end
9
+
10
+ def present?
11
+ attributes.present?
12
+ end
13
+
14
+ protected
15
+
16
+ def set_attribute(name, value)
17
+ attributes[name] = case value
18
+ when JsonApiClient::Resource
19
+ {data: value.as_relation}
20
+ when Array
21
+ {data: value.map(&:as_relation)}
22
+ else
23
+ value
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ module JsonApiClient
2
+ module Relationships
3
+ class TopLevelRelations
4
+
5
+ attr_reader :relations, :record_class
6
+
7
+ def initialize(record_class, relations)
8
+ @relations = relations
9
+ @record_class = record_class
10
+ end
11
+
12
+ def respond_to_missing?(method, include_private = false)
13
+ relations.has_key?(method.to_s) || super
14
+ end
15
+
16
+ def method_missing(method, *args)
17
+ if respond_to_missing?(method)
18
+ fetch_relation(method)
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ def fetch_relation(relation_name)
25
+ link_definition = relations.fetch(relation_name.to_s)
26
+ record_class.requestor.linked(link_definition)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ module JsonApiClient
2
+ module Relationships
3
+ autoload :Relations, "json_api_client/relationships/relations"
4
+ autoload :TopLevelRelations, "json_api_client/relationships/top_level_relations"
5
+ end
6
+ end
@@ -1,13 +1,9 @@
1
1
  require 'forwardable'
2
- require 'active_support/concern'
3
- require 'active_support/inflector'
4
- require 'active_support/core_ext/hash'
5
- require 'active_support/core_ext/module'
6
- require 'active_support/core_ext/class/attribute'
7
- require 'active_support/core_ext/enumerable'
2
+ require 'active_support/all'
8
3
 
9
4
  module JsonApiClient
10
5
  class Resource
6
+ attr_accessor :result_set
11
7
  class_attribute :site, :primary_key
12
8
  self.primary_key = :id
13
9
 
@@ -33,6 +29,7 @@ module JsonApiClient
33
29
  include Helpers::Queryable
34
30
  include Helpers::Serializable
35
31
  include Helpers::Linkable
32
+ include Helpers::Relatable
36
33
  include Helpers::CustomEndpoints
37
34
  include Helpers::Schemable
38
35
  include Helpers::Paginatable
@@ -9,10 +9,13 @@ module JsonApiClient
9
9
  :meta,
10
10
  :pages,
11
11
  :uri,
12
- :links
12
+ :links,
13
+ :implementation,
14
+ :relationships,
15
+ :included
13
16
 
14
17
  # pagination methods are handled by the paginator
15
- def_delegators :pages, :total_pages, :total_entries, :offset, :per_page, :current_page, :limit_value, :next_page, :previous_page, :out_of_bounds?
18
+ def_delegators :pages, :total_pages, :total_entries, :total_count, :offset, :per_page, :current_page, :limit_value, :next_page, :previous_page, :out_of_bounds?
16
19
 
17
20
  def has_errors?
18
21
  errors.present?
@@ -1,3 +1,3 @@
1
1
  module JsonApiClient
2
- VERSION = "1.0.0.beta"
2
+ VERSION = "1.0.0.beta2"
3
3
  end
@@ -10,8 +10,10 @@ module JsonApiClient
10
10
  autoload :Errors, 'json_api_client/errors'
11
11
  autoload :ErrorCollector, 'json_api_client/error_collector'
12
12
  autoload :Helpers, 'json_api_client/helpers'
13
+ autoload :Implementation, 'json_api_client/implementation'
13
14
  autoload :IncludedData, 'json_api_client/included_data'
14
15
  autoload :Linking, 'json_api_client/linking'
16
+ autoload :Relationships, 'json_api_client/relationships'
15
17
  autoload :LinkDefinition, 'json_api_client/link_definition'
16
18
  autoload :MetaData, 'json_api_client/meta_data'
17
19
  autoload :Middleware, 'json_api_client/middleware'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta
4
+ version: 1.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Ching
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -122,11 +122,13 @@ files:
122
122
  - lib/json_api_client/helpers/paginatable.rb
123
123
  - lib/json_api_client/helpers/parsable.rb
124
124
  - lib/json_api_client/helpers/queryable.rb
125
+ - lib/json_api_client/helpers/relatable.rb
125
126
  - lib/json_api_client/helpers/requestable.rb
126
127
  - lib/json_api_client/helpers/schemable.rb
127
128
  - lib/json_api_client/helpers/serializable.rb
129
+ - lib/json_api_client/implementation.rb
130
+ - lib/json_api_client/included_data.rb
128
131
  - lib/json_api_client/linking.rb
129
- - lib/json_api_client/linking/included_data.rb
130
132
  - lib/json_api_client/linking/links.rb
131
133
  - lib/json_api_client/linking/top_level_links.rb
132
134
  - lib/json_api_client/meta_data.rb
@@ -141,6 +143,9 @@ files:
141
143
  - lib/json_api_client/query.rb
142
144
  - lib/json_api_client/query/builder.rb
143
145
  - lib/json_api_client/query/requestor.rb
146
+ - lib/json_api_client/relationships.rb
147
+ - lib/json_api_client/relationships/relations.rb
148
+ - lib/json_api_client/relationships/top_level_relations.rb
144
149
  - lib/json_api_client/resource.rb
145
150
  - lib/json_api_client/result_set.rb
146
151
  - lib/json_api_client/schema.rb
@@ -1,40 +0,0 @@
1
- module JsonApiClient
2
- module Linking
3
- class IncludedData
4
- attr_reader :data
5
-
6
- def initialize(record_class, data)
7
- grouped_data = data.group_by{|datum| datum["type"]}
8
- @data = grouped_data.inject({}) do |h, (type, records)|
9
- klass = Utils.compute_type(record_class, type.singularize.classify)
10
- h[type] = records.map{|datum| klass.new(datum)}.index_by(&:id)
11
- h
12
- end
13
- end
14
-
15
- def data_for(method_name, definition)
16
- linkage = definition["linkage"]
17
- if linkage.is_a?(Array)
18
- # has_many link
19
- linkage.map do |link_def|
20
- record_for(link_def)
21
- end
22
- else
23
- # has_one link
24
- record_for(linkage)
25
- end
26
- end
27
-
28
- def has_link?(name)
29
- data.has_key?(name)
30
- end
31
-
32
- private
33
-
34
- # should return a resource record of some type for this linked document
35
- def record_for(link_def)
36
- data[link_def["type"]][link_def["id"]]
37
- end
38
- end
39
- end
40
- end