jsonapi-resources 0.9.10 → 0.9.11

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
  SHA256:
3
- metadata.gz: 9816e49477b147fc42c02b35d8c1aad887e4c63eb650126348b19394b64d928c
4
- data.tar.gz: b51da82be18f62e5b2c4bfb020c868188cae095a034e2ba15ee38e3f070f6e98
3
+ metadata.gz: eb4334bc31d044c34bc94da87c16e9e3aa91b9289b18bd13690ae2f3ff179f56
4
+ data.tar.gz: 621418ce69f3d7de1d5874f0fcc85549cd80ea5d9798ed610a92571d126773da
5
5
  SHA512:
6
- metadata.gz: cc15b04b0d93c68f6dd57c60d484a1a6551b2c39e2e06ddba49a8ddf5c68ae19b7dc7a3dcb2884a8bc4e864646ebfb5e3a7c692d539be7ba6133af167e6ba136
7
- data.tar.gz: c03455abd5cf211999922f061e0483e76d12c4a7fdf097f39fdc4afdcb4f45b0e0438ba77ff9c16d462d429a6bbe407a22b84490b7a6a7eb41c81d5f308801e2
6
+ metadata.gz: 6dff4f41d1dcb5452bddb882de80519a393e0e74f09aab94f1b0afc334c609603ffe3edfab252fdfcdfb859d8a053000bda275fd98d483bab88ca58cce9441a1
7
+ data.tar.gz: 4a19057381f81e6699dc689fc34331bac63df876ff3033d33f38ddbba9cf09aeecf0eaa09eb7a762cad489b7242f94985a76175ab92399ced5f45774d43bc18a
@@ -105,16 +105,19 @@ module JSONAPI
105
105
  end
106
106
 
107
107
  def formatted_module_path_from_class(klass)
108
- scopes = if @engine
109
- module_scopes_from_class(klass)[1..-1]
110
- else
111
- module_scopes_from_class(klass)
112
- end
113
-
114
- unless scopes.empty?
115
- "/#{ scopes.map {|scope| format_route(scope.to_s.underscore)}.compact.join('/') }/"
116
- else
117
- "/"
108
+ @_module_path_cache ||= {}
109
+ @_module_path_cache[klass] ||= begin
110
+ scopes = if @engine
111
+ module_scopes_from_class(klass)[1..-1]
112
+ else
113
+ module_scopes_from_class(klass)
114
+ end
115
+
116
+ unless scopes.empty?
117
+ "/#{ scopes.map {|scope| format_route(scope.to_s.underscore)}.compact.join('/') }/"
118
+ else
119
+ "/"
120
+ end
118
121
  end
119
122
  end
120
123
 
@@ -5,6 +5,9 @@ module JSONAPI
5
5
  class Resource
6
6
  include Callbacks
7
7
 
8
+ DEFAULT_ATTRIBUTE_OPTIONS = { format: :default }.freeze
9
+ MODULE_PATH_REGEXP = /::[^:]+\Z/.freeze
10
+
8
11
  attr_reader :context
9
12
 
10
13
  define_jsonapi_resources_callbacks :create,
@@ -555,7 +558,7 @@ module JSONAPI
555
558
  end
556
559
 
557
560
  def default_attribute_options
558
- { format: :default }
561
+ DEFAULT_ATTRIBUTE_OPTIONS
559
562
  end
560
563
 
561
564
  def relationship(*attrs)
@@ -1133,7 +1136,7 @@ module JSONAPI
1133
1136
  if name == 'JSONAPI::Resource'
1134
1137
  ''
1135
1138
  else
1136
- name =~ /::[^:]+\Z/ ? ($`.freeze.gsub('::', '/') + '/').underscore : ''
1139
+ name =~ MODULE_PATH_REGEXP ? ($`.freeze.gsub('::', '/') + '/').underscore : ''
1137
1140
  end
1138
1141
  end
1139
1142
 
@@ -1351,7 +1354,8 @@ module JSONAPI
1351
1354
  rel_id = row[index+1]
1352
1355
  assoc_rels = res.preloaded_fragments[rel_name]
1353
1356
  if index == path.length - 1
1354
- assoc_rels[rel_id] = target_resources[klass.name].fetch(rel_id)
1357
+ association_res = target_resources[klass.name].fetch(rel_id, nil)
1358
+ assoc_rels[rel_id] = association_res if association_res
1355
1359
  else
1356
1360
  res = assoc_rels[rel_id]
1357
1361
  end
@@ -287,7 +287,6 @@ module JSONAPI
287
287
  include_linkage = ia && ia[:include]
288
288
  include_linked_children = ia && !ia[:include_related].empty?
289
289
 
290
- options = { filters: ia && ia[:include_filters] || {} }
291
290
  if field_set.include?(name)
292
291
  ro = relationship_object(source, relationship, include_linkage)
293
292
  hash[format_key(name)] = ro unless ro.blank?
@@ -300,6 +299,7 @@ module JSONAPI
300
299
  resources = if source.preloaded_fragments.has_key?(format_key(name))
301
300
  source.preloaded_fragments[format_key(name)].values
302
301
  else
302
+ options = { filters: ia && ia[:include_filters] || {} }
303
303
  [source.public_send(name, options)].flatten(1).compact
304
304
  end
305
305
  resources.each do |resource|
@@ -468,16 +468,20 @@ module JSONAPI
468
468
 
469
469
  # Extracts the foreign key value for a to_one relationship.
470
470
  def foreign_key_value(source, relationship)
471
- related_resource_id = if source.preloaded_fragments.has_key?(format_key(relationship.name))
472
- source.preloaded_fragments[format_key(relationship.name)].values.first.try(:id)
473
- elsif source.respond_to?("#{relationship.name}_id")
474
- # If you have direct access to the underlying id, you don't have to load the relationship
475
- # which can save quite a lot of time when loading a lot of data.
476
- # This does not apply to e.g. has_one :through relationships.
477
- source.public_send("#{relationship.name}_id")
478
- else
479
- source.public_send(relationship.name).try(:id)
480
- end
471
+ # If you have changed the key_name, don't even try to look at `"#{relationship.name}_id"`
472
+ # just load the association and call the custom key_name
473
+ foreign_key_type_changed = relationship.options[:foreign_key_type_changed] || false
474
+ related_resource_id =
475
+ if source.preloaded_fragments.has_key?(format_key(relationship.name))
476
+ source.preloaded_fragments[format_key(relationship.name)].values.first.try(:id)
477
+ elsif !foreign_key_type_changed && source.respond_to?("#{relationship.name}_id")
478
+ # If you have direct access to the underlying id, you don't have to load the relationship
479
+ # which can save quite a lot of time when loading a lot of data.
480
+ # This does not apply to e.g. has_one :through relationships.
481
+ source.public_send("#{relationship.name}_id")
482
+ else
483
+ source.public_send(relationship.name).try(:id)
484
+ end
481
485
  return nil unless related_resource_id
482
486
  @id_formatter.format(related_resource_id)
483
487
  end
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = '0.9.10'
3
+ VERSION = '0.9.11'
4
4
  end
5
5
  end
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.9.10
4
+ version: 0.9.11
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: 2019-07-09 00:00:00.000000000 Z
12
+ date: 2019-12-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.5'
20
+ version: 1.17.3
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.5'
27
+ version: 1.17.3
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +123,20 @@ dependencies:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: memory_profiler
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: activerecord
128
142
  requirement: !ruby/object:Gem::Requirement
@@ -230,8 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
244
  - !ruby/object:Gem::Version
231
245
  version: '0'
232
246
  requirements: []
233
- rubyforge_project:
234
- rubygems_version: 2.7.6
247
+ rubygems_version: 3.0.3
235
248
  signing_key:
236
249
  specification_version: 4
237
250
  summary: Easily support JSON API in Rails.