snfoil-rails 0.8.0 → 0.8.1

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: b91f3f4a14656e627fe9b82d091c81e1fff178536da8866993f548734dda1738
4
- data.tar.gz: cf0ffd14498657a1b8611ad71f4c0d07d1d888e72d595660734ca5cba598e169
3
+ metadata.gz: 3d00195925208a499c8ddc53cd7237ad12bf835fb2f8919e8a367d6c42ea0e51
4
+ data.tar.gz: 8589deefc725c97dd946126aba442ff0b5f0f1a20b769245ddc3c43c9b0c14df
5
5
  SHA512:
6
- metadata.gz: 86c3cfef031f22074928729d25bc07b856f635463758b9f66a2582c540896e02312234146d784f4d5bd5bdaaec854c671dfa097372468372e1bcc46a55687def
7
- data.tar.gz: 61a52228ccc3a4dba8941a8a01a85ce939fb1885cd65ce8c1cc108dd893d1e5103da52f1aef4cabef5e7432a97e421b41eeff63b40d6242a5f4f7b519ed6eda8
6
+ metadata.gz: d32a067a6eba8e506678483b3249df6b0297667edac1fe5764dac986978212d4840456d97cf44e3cefff0d6b5388bfbce88819a226b1980f0fad67532cadd004
7
+ data.tar.gz: 529206939a96babfc648c6cc88528272e8035a21283d033cc9a90565b4dde9e198dddcbcc051615ebe826afbf55c554ba396687c9250cca589ea9bc9733dee0d
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Sn::Foil::Rails
1
+ # SnFoil::Rails
2
2
  Short description and motivation.
3
3
 
4
4
  ## Usage
@@ -12,7 +12,7 @@ module SnFoil
12
12
  file_name = if modules.length.zero?
13
13
  name
14
14
  else
15
- modules.join('/') + '/' + name
15
+ "#{modules.join('/')}/#{name}"
16
16
  end
17
17
 
18
18
  template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
@@ -19,7 +19,7 @@ module SnFoil
19
19
  @file_name ||= if modules.length.zero?
20
20
  name
21
21
  else
22
- modules.join('/') + '/' + name
22
+ "#{modules.join('/')}/#{name}"
23
23
  end
24
24
  end
25
25
 
@@ -12,7 +12,7 @@ module SnFoil
12
12
  file_name = if modules.length.zero?
13
13
  name
14
14
  else
15
- modules.join('/') + '/' + name
15
+ "#{modules.join('/')}/#{name}"
16
16
  end
17
17
 
18
18
  template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
@@ -12,7 +12,7 @@ module SnFoil
12
12
  file_name = if modules.length.zero?
13
13
  name
14
14
  else
15
- modules.join('/') + '/' + name
15
+ "#{modules.join('/')}/#{name}"
16
16
  end
17
17
 
18
18
  template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
@@ -12,7 +12,7 @@ module SnFoil
12
12
  file_name = if modules.length.zero?
13
13
  name
14
14
  else
15
- modules.join('/') + '/' + name
15
+ "#{modules.join('/')}/#{name}"
16
16
  end
17
17
 
18
18
  template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
@@ -12,7 +12,7 @@ module SnFoil
12
12
  file_name = if modules.length.zero?
13
13
  name
14
14
  else
15
- modules.join('/') + '/' + name
15
+ "#{modules.join('/')}/#{name}"
16
16
  end
17
17
 
18
18
  template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ module Configuration
5
+ module LazyJsonapiSerializer
6
+ extend ActiveSupport::Concern
7
+
8
+ class << self
9
+ def belongs_to(relationship_name, options = {}, &block)
10
+ block = belongs_to_optimized_block(relationship_name, options, &block)
11
+ super(relationship_name, options, &block)
12
+ end
13
+
14
+ def has_one(relationship_name, options = {}, &block) # rubocop:disable Naming/PredicateName reason: method override
15
+ super(relationship_name, has_relation_optimized_options(relationship_name, options), &block)
16
+ end
17
+
18
+ def has_many(relationship_name, options = {}, &block) # rubocop:disable Naming/PredicateName reason: method override
19
+ super(relationship_name, has_relation_optimized_options(relationship_name, options), &block)
20
+ end
21
+
22
+ private
23
+
24
+ # We need to parse the include block because FastJsonAPI does not allow access to the pre-parsed includes
25
+ def parse_include(params)
26
+ return [] unless params[:include]
27
+
28
+ if params[:include].is_a?(String)
29
+ params[:include].split(',')
30
+ else
31
+ params[:include]
32
+ end.map { |r| r.to_s.dasherize }.join(',')
33
+ end
34
+
35
+ def lookup_full_object_for_belongs_to(record, relationship_name, options, params)
36
+ return unless parse_include(params).include?(relationship_name.to_s.dasherize)
37
+
38
+ record.send(options[:object_method_name] || relationship_name)
39
+ end
40
+
41
+ def create_substitute_object_for_belongs_to(record, relationship_name, options)
42
+ relationship_id = options[:id_method_name] || "#{relationship_name}_id".to_sym
43
+ OpenStruct.new(id: record.send(relationship_id))
44
+ end
45
+
46
+ def belongs_to_optimized_block(relationship_name, options = {}, &block)
47
+ return block if options[:skip_optimization] == true || block
48
+
49
+ proc do |record, params|
50
+ if params && params[:include]
51
+ lookup_full_object(record_for_belongs_to, relationship_name, options, params)
52
+ else
53
+ create_substitute_object_for_belongs_to(record, relationship_name, options)
54
+ end
55
+ end
56
+ end
57
+
58
+ def create_included_proc_for_has_relation(relationship_name)
59
+ proc do |_record, params|
60
+ if params && params[:include]
61
+ parse_include(params).include?(relationship_name.to_s.dasherize)
62
+ else
63
+ false
64
+ end
65
+ end
66
+ end
67
+
68
+ def create_if_proc_for_has_relation(if_proc, included_proc)
69
+ if if_proc.present?
70
+ proc do |record, params|
71
+ FastJsonapi.call_proc(included_proc, record, params) && FastJsonapi.call_proc(if_proc, record, params)
72
+ end
73
+ else
74
+ included_proc
75
+ end
76
+ end
77
+
78
+ def has_relation_optimized_options(relationship_name, options) # rubocop:disable Naming/PredicateName reason: method override
79
+ return options if options[:skip_optimization] == true
80
+
81
+ options[:if] = create_if_proc_for_has_relation(options[:if], create_included_proc_for_has_relation(relationship_name))
82
+ options
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -32,6 +32,7 @@ module SnFoil
32
32
  end
33
33
 
34
34
  attr_reader :object, :included, :options
35
+
35
36
  def initialize(object, included: nil, **options)
36
37
  @object = object
37
38
  @included = included || object[:included]
@@ -88,11 +89,12 @@ module SnFoil
88
89
  end
89
90
 
90
91
  def apply_attribute_transform(attributes, data, key, transform_type:, **opts)
91
- if transform_type == :attribute
92
+ case transform_type
93
+ when :attribute
92
94
  parse_attribute_transform(attributes, data, key, **opts)
93
- elsif transform_type == :has_one
95
+ when :has_one
94
96
  parse_has_one_relationship(attributes, data, key, **opts)
95
- elsif transform_type == :has_many
97
+ when :has_many
96
98
  parse_has_many_relationship(attributes, data, key, **opts)
97
99
  end
98
100
  end
@@ -100,7 +102,7 @@ module SnFoil
100
102
  def parse_attribute_transform(attributes, data, key, **opts)
101
103
  return attributes unless data.dig(:attributes, key)
102
104
 
103
- attributes.merge(Hash[opts.fetch(:key) { key }, data[:attributes][key]])
105
+ attributes.merge({ opts.fetch(:key) { key } => data[:attributes][key] })
104
106
  end
105
107
 
106
108
  def parse_relationships(attributes, data)
@@ -138,7 +140,7 @@ module SnFoil
138
140
  end
139
141
 
140
142
  def lookup_relationship(type:, id: nil, lid: nil, **_opts)
141
- raise ::ArgumentError, "missing keyword: id or lid for type: #{type}" unless id || lid
143
+ check_for_id(id, lid)
142
144
 
143
145
  included&.find do |x|
144
146
  x[:type].eql?(type) &&
@@ -149,5 +151,9 @@ module SnFoil
149
151
  end
150
152
  end
151
153
  end
154
+
155
+ def check_for_id(id, lid)
156
+ raise ::ArgumentError, "missing keyword: id or lid for type: #{type}" unless id || lid
157
+ end
152
158
  end
153
159
  end
data/lib/sn_foil/rails.rb CHANGED
@@ -18,6 +18,8 @@ module SnFoil
18
18
  require_relative '../controller/concerns/update_controller_concern'
19
19
  require_relative '../controller/api'
20
20
  require_relative '../controller/base'
21
+
22
+ require_relative '../configuration/lazy_jsonapi_serializer'
21
23
  end
22
24
  end
23
25
  end
@@ -16,6 +16,8 @@ module SnFoil
16
16
  require_relative '../controller/concerns/update_controller_concern'
17
17
  require_relative '../controller/api'
18
18
  require_relative '../controller/base'
19
+
20
+ require_relative '../configuration/lazy_jsonapi_serializer'
19
21
  end
20
22
  end
21
23
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SnFoil
4
4
  module Rails
5
- VERSION = '0.8.0'
5
+ VERSION = '0.8.1'
6
6
  end
7
7
  end
@@ -18,8 +18,8 @@ module SnFoil
18
18
  end
19
19
  end
20
20
 
21
- ASC ||= 'ASC'
22
- DESC ||= 'DESC'
21
+ ASC = 'ASC'
22
+ DESC = 'DESC'
23
23
  end
24
24
 
25
25
  class_methods do
@@ -35,7 +35,7 @@ module SnFoil
35
35
  @i_order_by_direction = direction
36
36
  end
37
37
 
38
- def distinct(bool = true)
38
+ def distinct(bool = true) # rubocop:disable Style/OptionalBooleanParameter reason: class configuration looks better this way
39
39
  @i_is_distinct = bool
40
40
  end
41
41
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
8
8
  - Danny Murphy
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-08 00:00:00.000000000 Z
12
+ date: 2021-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -129,42 +129,42 @@ dependencies:
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: 0.76.0
132
+ version: '1.14'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: 0.76.0
139
+ version: '1.14'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: rubocop-rails
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: '2.0'
146
+ version: '2.10'
147
147
  type: :development
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: '2.0'
153
+ version: '2.10'
154
154
  - !ruby/object:Gem::Dependency
155
155
  name: rubocop-rspec
156
156
  requirement: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: 1.36.0
160
+ version: '2.3'
161
161
  type: :development
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: 1.36.0
167
+ version: '2.3'
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: sqlite3
170
170
  requirement: !ruby/object:Gem::Requirement
@@ -179,7 +179,7 @@ dependencies:
179
179
  - - ">="
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
- description:
182
+ description:
183
183
  email:
184
184
  - howeszy@gmail.com
185
185
  - dmurph24@gmail.com
@@ -205,6 +205,7 @@ files:
205
205
  - lib/generators/sn_foil/policy/templates/policy.erb
206
206
  - lib/generators/sn_foil/searcher/searcher_generator.rb
207
207
  - lib/generators/sn_foil/searcher/templates/searcher.erb
208
+ - lib/sn_foil/configuration/lazy_jsonapi_serializer.rb
208
209
  - lib/sn_foil/controller/api.rb
209
210
  - lib/sn_foil/controller/base.rb
210
211
  - lib/sn_foil/controller/concerns/change_controller_concern.rb
@@ -221,11 +222,11 @@ files:
221
222
  - lib/sn_foil/rails/version.rb
222
223
  - lib/sn_foil/searcher.rb
223
224
  - lib/snfoil-rails.rb
224
- homepage: https://github.com/howeszy/snfoil-rails
225
+ homepage: https://github.com/limited-effort/snfoil-rails
225
226
  licenses:
226
227
  - MIT
227
228
  metadata: {}
228
- post_install_message:
229
+ post_install_message:
229
230
  rdoc_options: []
230
231
  require_paths:
231
232
  - lib
@@ -233,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
233
234
  requirements:
234
235
  - - ">="
235
236
  - !ruby/object:Gem::Version
236
- version: '0'
237
+ version: 2.5.0
237
238
  required_rubygems_version: !ruby/object:Gem::Requirement
238
239
  requirements:
239
240
  - - ">="
@@ -241,7 +242,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
242
  version: '0'
242
243
  requirements: []
243
244
  rubygems_version: 3.1.4
244
- signing_key:
245
+ signing_key:
245
246
  specification_version: 4
246
247
  summary: Additional functionality gem for using SnFoil with Rails
247
248
  test_files: []