jsonapi-resources 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f70ae71e6004b279c357d07b852d3be4eebc03d6
4
- data.tar.gz: bc3fc2fae00f4e4d3a5c6d602bc42659181d7a02
3
+ metadata.gz: 3e063aecb3183d3a1862dc4fd88f0f06ddc921dd
4
+ data.tar.gz: 40b0476410fe269a08f16791f8b927d2aee02156
5
5
  SHA512:
6
- metadata.gz: bfb971dee293f36ba1e4a78f6b5db0e9d7a4dbe4be1b38cd66fcb183aefb0935497472e3e1ea72a3ca41be551b96de887dd00c3a323814c8b16b1ad9b03a2e64
7
- data.tar.gz: c2c3b13c7c58ee1a7b7a4e1c029477965a927413910944fb9f8837f5faec61af765198a1da618ee493431e12a7eea402b53e8368998f68344eb5eb36b7f1c7d3
6
+ metadata.gz: f4135619c0ad660679b93ea9dcde314991134824e0d01540705b4a3055e0acccfab76d74b0e49cf94d969d949063a51c50328165265b90b2057065ec34b13eb3
7
+ data.tar.gz: 335f3f2b30251c07b2286dbdcd176d3f199fd844d99f6c9619a0b54e598b66e0fe07b1386cddb1c18106b3e1d968e6a6a1f5eaabb11e3cc72d75d08bf54581ae
data/README.md CHANGED
@@ -145,13 +145,13 @@ end
145
145
 
146
146
  The system will lookup a value formatter named `DateWithTimezoneValueFormatter` and will use this when serializing and updating the attribute. See the [Value Formatters](#value-formatters) section for more details.
147
147
 
148
- #### Key
148
+ #### Primary Key
149
149
 
150
- The primary key of the resource defaults to `id`, which can be changed using the `key` method.
150
+ Resources are always represented using a key of `id`. If the underlying model does not use `id` as the primary key you can use the `primary_key` method to tell the resource which field on the model to use as the primary key. Note: this doesn't have to be the actual primary key of the model. For example you may wish to use integers internally and a different scheme publicly.
151
151
 
152
152
  ```ruby
153
153
  class CurrencyResource < JSONAPI::Resource
154
- key :code
154
+ primary_key :code
155
155
  attributes :code, :name
156
156
 
157
157
  has_many :expense_entries
@@ -199,8 +199,7 @@ end
199
199
 
200
200
  The association methods support the following options:
201
201
  * `class_name` - a string specifying the underlying class for the related resource
202
- * `primary_key` - the primary key to the related resource, if different than `id`
203
- * `key` - the key in the resource that identifies the related resource, if different than `<resource_name>_id`
202
+ * `foreign_key` - the method on the resource used to fetch the related resource. Defaults to `<resource_name>_id` for has_one and `<resource_name>_ids` for has_many relationships.
204
203
  * `acts_as_set` - allows the entire set of related records to be replaced in one operation. Defaults to false if not set.
205
204
 
206
205
  Examples:
@@ -1,4 +1,5 @@
1
1
  require 'jsonapi/resource'
2
2
  require 'jsonapi/resources/version'
3
3
  require 'jsonapi/configuration'
4
- require 'jsonapi/formatter'
4
+ require 'jsonapi/formatter'
5
+ require 'jsonapi/routing_ext'
@@ -1,13 +1,24 @@
1
1
  module JSONAPI
2
2
  class Association
3
- attr_reader :primary_key, :acts_as_set, :type, :key, :options, :name, :class_name
3
+ attr_reader :acts_as_set, :foreign_key, :type, :options, :name, :class_name
4
4
 
5
5
  def initialize(name, options={})
6
- @name = name.to_s
7
- @options = options
8
- @key = options[:key] ? options[:key].to_sym : nil
9
- @primary_key = options.fetch(:primary_key, 'id').to_sym
10
- @acts_as_set = options.fetch(:acts_as_set, false) == true
6
+ @name = name.to_s
7
+ @options = options
8
+ @acts_as_set = options.fetch(:acts_as_set, false) == true
9
+ @key = options[:key] ? options[:key].to_sym : nil
10
+
11
+ if @key.nil?
12
+ @foreign_key = options[:foreign_key ] ? options[:foreign_key ].to_sym : nil
13
+ else
14
+ # :nocov:
15
+ warn '[DEPRECATION] `key` is deprecated in associations. Please use `foreign_key` instead.'
16
+ # :nocov:
17
+ end
18
+ end
19
+
20
+ def primary_key
21
+ @primary_key ||= Resource.resource_for(@name)._primary_key
11
22
  end
12
23
 
13
24
  class HasOne < Association
@@ -15,7 +26,7 @@ module JSONAPI
15
26
  super
16
27
  @class_name = options.fetch(:class_name, name.to_s.capitalize)
17
28
  @type = class_name.underscore.pluralize.to_sym
18
- @key ||= "#{name}_id".to_sym
29
+ @foreign_key ||= @key.nil? ? "#{name}_id".to_sym : @key
19
30
  end
20
31
  end
21
32
 
@@ -24,7 +35,7 @@ module JSONAPI
24
35
  super
25
36
  @class_name = options.fetch(:class_name, name.to_s.capitalize.singularize)
26
37
  @type = class_name.underscore.pluralize.to_sym
27
- @key ||= "#{name.to_s.singularize}_ids".to_sym
38
+ @foreign_key ||= @key.nil? ? "#{name.to_s.singularize}_ids".to_sym : @key
28
39
  end
29
40
  end
30
41
  end
@@ -9,6 +9,7 @@ module JSONAPI
9
9
  arg
10
10
  end
11
11
 
12
+ # :nocov:
12
13
  if RUBY_VERSION >= '2.0'
13
14
  def formatter_for(format)
14
15
  formatter_class_name = "#{format.to_s.camelize}Formatter"
@@ -20,6 +21,7 @@ module JSONAPI
20
21
  formatter_class_name.safe_constantize if formatter_class_name
21
22
  end
22
23
  end
24
+ # :nocov:
23
25
  end
24
26
  end
25
27
 
@@ -298,31 +298,31 @@ module JSONAPI
298
298
  def parse_replace_operation(params)
299
299
  object_params_raw = params.require(format_key(@resource_klass._type))
300
300
 
301
- keys = params[@resource_klass._key]
301
+ keys = params[@resource_klass._primary_key]
302
302
  if object_params_raw.is_a?(Array)
303
303
  if keys.count != object_params_raw.count
304
304
  raise JSONAPI::Exceptions::CountMismatch
305
305
  end
306
306
 
307
307
  object_params_raw.each do |object_params|
308
- if object_params[@resource_klass._key].nil?
308
+ if object_params[@resource_klass._primary_key].nil?
309
309
  raise JSONAPI::Exceptions::MissingKey.new
310
310
  end
311
311
 
312
- if !keys.include?(object_params[@resource_klass._key])
313
- raise JSONAPI::Exceptions::KeyNotIncludedInURL.new(object_params[@resource_klass._key])
312
+ if !keys.include?(object_params[@resource_klass._primary_key])
313
+ raise JSONAPI::Exceptions::KeyNotIncludedInURL.new(object_params[@resource_klass._primary_key])
314
314
  end
315
315
  @operations.push JSONAPI::ReplaceFieldsOperation.new(@resource_klass,
316
- object_params[@resource_klass._key],
316
+ object_params[@resource_klass._primary_key],
317
317
  parse_params(object_params, @resource_klass.updateable_fields(@context)))
318
318
  end
319
319
  else
320
- if !object_params_raw[@resource_klass._key].nil? && keys != object_params_raw[@resource_klass._key]
321
- raise JSONAPI::Exceptions::KeyNotIncludedInURL.new(object_params_raw[@resource_klass._key])
320
+ if !object_params_raw[@resource_klass._primary_key].nil? && keys != object_params_raw[@resource_klass._primary_key]
321
+ raise JSONAPI::Exceptions::KeyNotIncludedInURL.new(object_params_raw[@resource_klass._primary_key])
322
322
  end
323
323
 
324
324
  @operations.push JSONAPI::ReplaceFieldsOperation.new(@resource_klass,
325
- params[@resource_klass._key],
325
+ params[@resource_klass._primary_key],
326
326
  parse_params(object_params_raw, @resource_klass.updateable_fields(@context)))
327
327
  end
328
328
 
@@ -333,7 +333,7 @@ module JSONAPI
333
333
  end
334
334
 
335
335
  def parse_remove_operation(params)
336
- keys = parse_key_array(params.permit(@resource_klass._key)[@resource_klass._key])
336
+ keys = parse_key_array(params.permit(@resource_klass._primary_key)[@resource_klass._primary_key])
337
337
 
338
338
  keys.each do |key|
339
339
  @operations.push JSONAPI::RemoveResourceOperation.new(@resource_klass, key)
@@ -20,6 +20,10 @@ module JSONAPI
20
20
  @model.destroy
21
21
  end
22
22
 
23
+ def id
24
+ model.send(self.class._primary_key)
25
+ end
26
+
23
27
  def create_has_many_link(association_type, association_key_value)
24
28
  association = self.class._associations[association_type]
25
29
  related_resource = self.class.resource_for(association.type).find_by_key(association_key_value, @context)
@@ -36,16 +40,16 @@ module JSONAPI
36
40
  def replace_has_many_links(association_type, association_key_values)
37
41
  association = self.class._associations[association_type]
38
42
 
39
- @model.send("#{association.key}=", association_key_values)
43
+ send("#{association.foreign_key}=", association_key_values)
40
44
  end
41
45
 
42
46
  def create_has_one_link(association_type, association_key_value)
43
47
  association = self.class._associations[association_type]
44
48
 
45
49
  # ToDo: Add option to skip relations that already exist instead of returning an error?
46
- relation = @model.send("#{association.key}")
50
+ relation = @model.send("#{association.foreign_key}")
47
51
  if relation.nil?
48
- @model.send("#{association.key}=", association_key_value)
52
+ send("#{association.foreign_key}=", association_key_value)
49
53
  else
50
54
  raise JSONAPI::Exceptions::HasOneRelationExists.new
51
55
  end
@@ -54,7 +58,7 @@ module JSONAPI
54
58
  def replace_has_one_link(association_type, association_key_value)
55
59
  association = self.class._associations[association_type]
56
60
 
57
- @model.send("#{association.key}=", association_key_value)
61
+ send("#{association.foreign_key}=", association_key_value)
58
62
  end
59
63
 
60
64
  def remove_has_many_link(association_type, key)
@@ -66,12 +70,18 @@ module JSONAPI
66
70
  def remove_has_one_link(association_type)
67
71
  association = self.class._associations[association_type]
68
72
 
69
- @model.send("#{association.key}=", nil)
73
+ send("#{association.foreign_key}=", nil)
70
74
  end
71
75
 
72
76
  def replace_fields(field_data)
73
77
  field_data[:attributes].each do |attribute, value|
74
- send "#{attribute}=", value
78
+ begin
79
+ send "#{attribute}=", value
80
+ rescue ArgumentError
81
+ # :nocov: Will be thrown if an enum value isn't allowed for an enum. Currently not tested as enums are a rails 4.1 and higher feature
82
+ raise JSONAPI::Exceptions::InvalidFieldValue.new(attribute, value)
83
+ # :nocov:
84
+ end
75
85
  end
76
86
 
77
87
  field_data[:has_one].each do |association_type, value|
@@ -184,7 +194,14 @@ module JSONAPI
184
194
  end
185
195
 
186
196
  def key(key)
187
- @_key = key.to_sym
197
+ # :nocov:
198
+ warn '[DEPRECATION] `key` is deprecated. Please use `primary_key` instead.'
199
+ @_primary_key = key.to_sym
200
+ # :nocov:
201
+ end
202
+
203
+ def primary_key(key)
204
+ @_primary_key = key.to_sym
188
205
  end
189
206
 
190
207
  # Override in your resource to filter the updateable keys
@@ -212,7 +229,7 @@ module JSONAPI
212
229
  includes.push(filter)
213
230
  where_filters["#{filter}.#{_associations[filter].primary_key}"] = value
214
231
  else
215
- where_filters["#{_associations[filter].key}"] = value
232
+ where_filters["#{_associations[filter].foreign_key}"] = value
216
233
  end
217
234
  else
218
235
  where_filters[filter] = value
@@ -228,7 +245,7 @@ module JSONAPI
228
245
  end
229
246
 
230
247
  def find_by_key(key, context = nil)
231
- model = _model_class.where({_key => key}).first
248
+ model = _model_class.where({_primary_key => key}).first
232
249
  if model.nil?
233
250
  raise JSONAPI::Exceptions::RecordNotFound.new(key)
234
251
  end
@@ -305,15 +322,22 @@ module JSONAPI
305
322
  end
306
323
 
307
324
  def _key
308
- @_key ||= :id
325
+ # :nocov:
326
+ warn '[DEPRECATION] `_key` is deprecated. Please use `_primary_key` instead.'
327
+ _primary_key
328
+ # :nocov:
329
+ end
330
+
331
+ def _primary_key
332
+ @_primary_key ||= :id
309
333
  end
310
334
 
311
335
  def _as_parent_key
312
- @_as_parent_key ||= "#{_type.to_s.singularize}_#{_key}"
336
+ @_as_parent_key ||= "#{_type.to_s.singularize}_#{_primary_key}"
313
337
  end
314
338
 
315
339
  def _allowed_filters
316
- !@_allowed_filters.nil? ? @_allowed_filters : Set.new([_key])
340
+ !@_allowed_filters.nil? ? @_allowed_filters : Set.new([_primary_key])
317
341
  end
318
342
 
319
343
  def _resource_name_from_type(type)
@@ -325,15 +349,17 @@ module JSONAPI
325
349
  return class_name
326
350
  end
327
351
 
352
+ # :nocov:
328
353
  if RUBY_VERSION >= '2.0'
329
354
  def _model_class
330
- @model ||= Object.const_get(_model_name)
355
+ @model ||= Object.const_get(_model_name.to_s)
331
356
  end
332
357
  else
333
358
  def _model_class
334
359
  @model ||= _model_name.to_s.safe_constantize
335
360
  end
336
361
  end
362
+ # :nocov:
337
363
 
338
364
  def _allowed_filter?(filter)
339
365
  _allowed_filters.include?(filter)
@@ -347,29 +373,27 @@ module JSONAPI
347
373
  attrs.each do |attr|
348
374
  @_associations[attr] = klass.new(attr, options)
349
375
 
350
- if @_associations[attr].is_a?(JSONAPI::Association::HasOne)
351
- key = @_associations[attr].key
376
+ foreign_key = @_associations[attr].foreign_key
377
+
378
+ define_method foreign_key do
379
+ @model.method(foreign_key).call
380
+ end unless method_defined?(foreign_key)
352
381
 
353
- define_method key do
354
- @model.method(key).call
355
- end unless method_defined?(key)
382
+ define_method "#{foreign_key}=" do |value|
383
+ @model.method("#{foreign_key}=").call(value)
384
+ end unless method_defined?("#{foreign_key}=")
356
385
 
357
- define_method "_#{attr}_resource" do
386
+ if @_associations[attr].is_a?(JSONAPI::Association::HasOne)
387
+ define_method attr do
358
388
  type_name = self.class._associations[attr].type
359
389
  resource_class = self.class.resource_for(type_name)
360
390
  if resource_class
361
391
  associated_model = @model.send attr
362
392
  return resource_class.new(associated_model, @context)
363
393
  end
364
- end unless method_defined?("_#{attr}_resource")
394
+ end unless method_defined?(attr)
365
395
  elsif @_associations[attr].is_a?(JSONAPI::Association::HasMany)
366
- key = @_associations[attr].key
367
-
368
- define_method key do
369
- @model.method(key).call
370
- end unless method_defined?(key)
371
-
372
- define_method "_#{attr}_resources" do
396
+ define_method attr do
373
397
  type_name = self.class._associations[attr].type
374
398
  resource_class = self.class.resource_for(type_name)
375
399
  resources = []
@@ -380,7 +404,7 @@ module JSONAPI
380
404
  end
381
405
  end
382
406
  return resources
383
- end unless method_defined?("_#{attr}_resources")
407
+ end unless method_defined?(attr)
384
408
  end
385
409
  end
386
410
  end
@@ -27,7 +27,7 @@ module JSONAPI
27
27
  end
28
28
 
29
29
  def show
30
- keys = parse_key_array(params[resource_klass._key])
30
+ keys = parse_key_array(params[resource_klass._primary_key])
31
31
 
32
32
  if keys.length > 1
33
33
  resources = []
@@ -56,9 +56,11 @@ module JSONAPI
56
56
  parent_resource = resource_klass.find_by_key(parent_key, context)
57
57
 
58
58
  association = resource_klass._association(association_type)
59
- render json: { association_type => parent_resource.send(association.key)}
59
+ render json: { association_type => parent_resource.send(association.foreign_key)}
60
60
  rescue => e
61
+ # :nocov:
61
62
  handle_exceptions(e)
63
+ # :nocov:
62
64
  end
63
65
 
64
66
  def create
@@ -91,6 +93,7 @@ module JSONAPI
91
93
  end
92
94
 
93
95
  private
96
+ # :nocov:
94
97
  if RUBY_VERSION >= '2.0'
95
98
  def resource_klass
96
99
  @resource_klass ||= Object.const_get resource_klass_name
@@ -100,6 +103,7 @@ module JSONAPI
100
103
  @resource_klass ||= resource_klass_name.safe_constantize
101
104
  end
102
105
  end
106
+ # :nocov:
103
107
 
104
108
  def resource_klass_name
105
109
  @resource_klass_name ||= "#{self.class.name.demodulize.sub(/Controller$/, '').singularize}Resource"
@@ -112,7 +116,9 @@ module JSONAPI
112
116
  })
113
117
  render_errors(@request.errors) unless @request.errors.empty?
114
118
  rescue => e
119
+ # :nocov:
115
120
  handle_exceptions(e)
121
+ # :nocov:
116
122
  end
117
123
 
118
124
  def parse_key_array(raw)
@@ -187,7 +193,9 @@ module JSONAPI
187
193
  when JSONAPI::Exceptions::Error
188
194
  render_errors(e.errors)
189
195
  else # raise all other exceptions
196
+ # :nocov:
190
197
  raise e
198
+ # :nocov:
191
199
  end
192
200
  end
193
201
  end
@@ -5,6 +5,7 @@ module JSONAPI
5
5
  end
6
6
 
7
7
  module ClassMethods
8
+ # :nocov:
8
9
  if RUBY_VERSION >= '2.0'
9
10
  def resource_for(type)
10
11
  resource_name = JSONAPI::Resource._resource_name_from_type(type)
@@ -18,6 +19,7 @@ module JSONAPI
18
19
  resource_name.safe_constantize if resource_name
19
20
  end
20
21
  end
22
+ # :nocov:
21
23
  end
22
24
  end
23
25
  end
@@ -91,16 +91,17 @@ module JSONAPI
91
91
  # The fields options controls both fields and included links references.
92
92
  def process_primary(source, requested_associations)
93
93
  if source.respond_to?(:to_ary)
94
- source.each do |object|
95
- id = object.send(object.class._key)
94
+ source.each do |resource|
95
+ id = resource.id
96
96
  if already_serialized?(@primary_class_name, id)
97
97
  set_primary(@primary_class_name, id)
98
98
  end
99
99
 
100
- add_linked_object(@primary_class_name, id, object_hash(object, requested_associations), true)
100
+ add_linked_object(@primary_class_name, id, object_hash(resource, requested_associations), true)
101
101
  end
102
102
  else
103
- id = source.send(source.class._key)
103
+ resource = source
104
+ id = resource.id
104
105
  # ToDo: See if this is actually needed
105
106
  # if already_serialized?(@primary_class_name, id)
106
107
  # set_primary(@primary_class_name, id)
@@ -151,10 +152,10 @@ module JSONAPI
151
152
  included_associations = source.fetchable_fields & associations.keys
152
153
  associations.each_with_object({}) do |(name, association), hash|
153
154
  if included_associations.include? name
154
- key = association.key
155
+ foreign_key = association.foreign_key
155
156
 
156
157
  if field_set.include?(name)
157
- hash[format_key(name)] = source.send(key)
158
+ hash[format_key(name)] = source.send(foreign_key)
158
159
  end
159
160
 
160
161
  ia = requested_associations.is_a?(Hash) ? requested_associations[name] : nil
@@ -169,9 +170,9 @@ module JSONAPI
169
170
  # through the associations.
170
171
  if include_linked_object || include_linked_children
171
172
  if association.is_a?(JSONAPI::Association::HasOne)
172
- resource = source.send("_#{name}_resource")
173
+ resource = source.send(name)
173
174
  if resource
174
- id = resource.send(association.primary_key)
175
+ id = resource.id
175
176
  associations_only = already_serialized?(type, id)
176
177
  if include_linked_object && !associations_only
177
178
  add_linked_object(type, id, object_hash(resource, ia[:include_related]))
@@ -180,9 +181,9 @@ module JSONAPI
180
181
  end
181
182
  end
182
183
  elsif association.is_a?(JSONAPI::Association::HasMany)
183
- resources = source.send("_#{name}_resources")
184
+ resources = source.send(name)
184
185
  resources.each do |resource|
185
- id = resource.send(association.primary_key)
186
+ id = resource.id
186
187
  associations_only = already_serialized?(type, id)
187
188
  if include_linked_object && !associations_only
188
189
  add_linked_object(type, id, object_hash(resource, ia[:include_related]))
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = "0.0.7"
3
+ VERSION = "0.0.8"
4
4
  end
5
5
  end
@@ -7,6 +7,7 @@ module ActionDispatch
7
7
  options = resources.extract_options!.dup
8
8
 
9
9
  res = JSONAPI::Resource.resource_for(resource_type)
10
+
10
11
  resource resource_type, options.merge(res.routing_resource_options) do
11
12
  @scope[:jsonapi_resource] = resource_type
12
13
 
@@ -29,6 +30,10 @@ module ActionDispatch
29
30
  options = resources.extract_options!.dup
30
31
 
31
32
  res = JSONAPI::Resource.resource_for(resource_type)
33
+
34
+ # Route using the primary_key. Can be overridden using routing_resource_options
35
+ options.merge!(param: res._primary_key)
36
+
32
37
  resources resource_type, options.merge(res.routing_resource_options) do
33
38
  @scope[:jsonapi_resource] = resource_type
34
39
 
@@ -1001,7 +1001,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1001
1001
 
1002
1002
  def test_expense_entries_show_fields_type_many
1003
1003
  get :show, {id: 1, include: 'isoCurrency,employee', 'fields' => {'expenseEntries' => 'transactionDate',
1004
- 'isoCurrencies' => 'code,name'}}
1004
+ 'isoCurrencies' => 'id,name'}}
1005
1005
  assert_response :success
1006
1006
  assert json_response['expenseEntries'].is_a?(Hash)
1007
1007
  assert json_response['expenseEntries'].has_key?('transactionDate')
@@ -1009,7 +1009,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1009
1009
  refute json_response['expenseEntries'].has_key?('links')
1010
1010
  assert_equal 1, json_response['linked']['isoCurrencies'].size
1011
1011
  assert_equal 1, json_response['linked']['people'].size
1012
- assert json_response['linked']['isoCurrencies'][0].has_key?('code')
1012
+ assert json_response['linked']['isoCurrencies'][0].has_key?('id')
1013
1013
  assert json_response['linked']['isoCurrencies'][0].has_key?('name')
1014
1014
  refute json_response['linked']['isoCurrencies'][0].has_key?('countryName')
1015
1015
  end
@@ -398,17 +398,15 @@ class PostResource < JSONAPI::Resource
398
398
  end
399
399
 
400
400
  class IsoCurrencyResource < JSONAPI::Resource
401
- key :code
402
- attributes :code, :name, :country_name, :minor_unit
403
-
404
- routing_options :param => :code
401
+ primary_key :code
402
+ attributes :id, :name, :country_name, :minor_unit
405
403
  end
406
404
 
407
405
  class ExpenseEntryResource < JSONAPI::Resource
408
406
  attributes :id, :cost
409
407
  attribute :transaction_date, format: :date
410
408
 
411
- has_one :iso_currency, key: 'currency_code', primary_key: 'code'
409
+ has_one :iso_currency, foreign_key: 'currency_code'
412
410
  has_one :employee, class_name: 'Person'
413
411
  end
414
412
 
@@ -416,6 +414,9 @@ class BreedResource < JSONAPI::Resource
416
414
  attribute :id, format_misspelled: :does_not_exist
417
415
  attribute :name, format: :title
418
416
 
417
+ # This is unneeded, just here for testing
418
+ routing_options :param => :id
419
+
419
420
  def self.find(attrs, context = nil)
420
421
  breeds = []
421
422
  $breed_data.breeds.values.each do |breed|
@@ -1,5 +1,6 @@
1
1
  module Helpers
2
2
  module HashHelpers
3
+ # :nocov:
3
4
  def assert_hash_contains(exp, act, msg = nil)
4
5
  msg = message(msg, '') { diff exp, act }
5
6
  assert(matches_hash?(exp, act), msg)
@@ -9,5 +10,6 @@ module Helpers
9
10
  msg = message(msg, '') { diff exp, act }
10
11
  assert(matches_hash?(exp, act, {exact: true}), msg)
11
12
  end
13
+ # :nocov:
12
14
  end
13
- end
15
+ end
@@ -111,6 +111,12 @@ class RoutesTest < ActionDispatch::IntegrationTest
111
111
  {action: 'show', controller: 'api/v3/posts', id: '1'})
112
112
  end
113
113
 
114
+ #primary_key
115
+ def test_routing_primary_key_jsonapi_resources
116
+ assert_routing({path: '/iso_currencies/USD', method: :get},
117
+ {action: 'show', controller: 'iso_currencies', code: 'USD'})
118
+ end
119
+
114
120
  # ToDo: Refute routing
115
121
  # def test_routing_v3_posts_delete
116
122
  # assert_routing({ path: '/api/v3/posts/1', method: :delete },
@@ -507,7 +507,7 @@ class SerializerTest < MiniTest::Unit::TestCase
507
507
  },
508
508
  linked: {
509
509
  isoCurrencies: [{
510
- code: 'USD',
510
+ id: 'USD',
511
511
  countryName: 'United States',
512
512
  name: 'United States Dollar',
513
513
  minorUnit: 'cent'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Gebhardt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-13 00:00:00.000000000 Z
12
+ date: 2014-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler