snfoil-rails 0.8.0 → 0.8.1

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
  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: []