snfoil-rails 0.8.0 → 0.8.5

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: bfdc322288169bedaad75e87ee5f85c7155bcdaddb1f7acb2e8d446eb518879d
4
+ data.tar.gz: f08cbf7eccf64cab8a999ee1b0c9b9c276682452de0391fd0d9ea60b08bfcd67
5
5
  SHA512:
6
- metadata.gz: 86c3cfef031f22074928729d25bc07b856f635463758b9f66a2582c540896e02312234146d784f4d5bd5bdaaec854c671dfa097372468372e1bcc46a55687def
7
- data.tar.gz: 61a52228ccc3a4dba8941a8a01a85ce939fb1885cd65ce8c1cc108dd893d1e5103da52f1aef4cabef5e7432a97e421b41eeff63b40d6242a5f4f7b519ed6eda8
6
+ metadata.gz: 42fe6f01f14697a6d5f17486ad3a0b8e43d9205557b31cffa9f52bb3d1db42749427718902b561c99c5f464cce4b0661dda55c6191d4ebe7ce4564e5226a4784
7
+ data.tar.gz: d1595ff0f2692da7e14d19187b666089afe8ebf36601baf5ab786d9bf6c4aae11688f67c6c5e4acf2c6d5371dfb0dc4aa90fc4927b049597f58cd42298c98ce1
data/README.md CHANGED
@@ -8,7 +8,7 @@ How to use my plugin.
8
8
  Add this line to your application's Gemfile:
9
9
 
10
10
  ```ruby
11
- gem 'sn-foil-rails'
11
+ gem 'snfoil-rails'
12
12
  ```
13
13
 
14
14
  And then execute:
@@ -18,7 +18,7 @@ $ bundle
18
18
 
19
19
  Or install it yourself as:
20
20
  ```bash
21
- $ gem install sn-foil-rails
21
+ $ gem install snfoil-rails
22
22
  ```
23
23
 
24
24
  ## Contributing
@@ -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
@@ -31,11 +31,13 @@ module SnFoil
31
31
  end
32
32
 
33
33
  def setup_create(**options)
34
- super(**options.merge(deserialize: true))
34
+ options[:deserialize] = options[:deserialize].nil? ? true : options[:deserialize]
35
+ super(**options)
35
36
  end
36
37
 
37
38
  def setup_update(**options)
38
- super(**options.merge(deserialize: true))
39
+ options[:deserialize] = options[:deserialize].nil? ? true : options[:deserialize]
40
+ super(**options)
39
41
  end
40
42
 
41
43
  def render_change(model, **options)
@@ -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
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
- require 'fast_jsonapi/object_serializer'
4
+ require 'jsonapi/serializer'
5
5
 
6
6
  module SnFoil
7
7
  module JsonapiSerializer
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  included do
11
- include FastJsonapi::ObjectSerializer
11
+ include JSONAPI::Serializer
12
12
 
13
13
  set_key_transform :dash
14
14
  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.5'
6
6
  end
7
7
  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
@@ -6,6 +6,8 @@ require 'sn_foil/searcher'
6
6
  module SnFoil
7
7
  module Searcher
8
8
  extend ActiveSupport::Concern
9
+ ASC = 'ASC'
10
+ DESC = 'DESC'
9
11
 
10
12
  included do
11
13
  module_eval do
@@ -17,9 +19,6 @@ module SnFoil
17
19
  additional_search(filtered_scope, params)
18
20
  end
19
21
  end
20
-
21
- ASC ||= 'ASC'
22
- DESC ||= 'DESC'
23
22
  end
24
23
 
25
24
  class_methods do
@@ -35,7 +34,7 @@ module SnFoil
35
34
  @i_order_by_direction = direction
36
35
  end
37
36
 
38
- def distinct(bool = true)
37
+ def distinct(bool = true) # rubocop:disable Style/OptionalBooleanParameter reason: class configuration looks better this way
39
38
  @i_is_distinct = bool
40
39
  end
41
40
 
@@ -86,16 +85,14 @@ module SnFoil
86
85
  end
87
86
 
88
87
  def apply_order(filtered_scope, params)
89
- return apply_default_order(filtered_scope, params) if params[:order_by].blank? && params[:order].blank?
90
-
91
- filtered_scope.order(order_by(params) => order(params))
92
- end
93
-
94
- def apply_default_order(filtered_scope, params)
95
88
  return order_method(filtered_scope, params) if order_method?
96
89
  return order_block(filtered_scope, params) if order_block?
97
90
 
98
- filtered_scope.order(order_by => order)
91
+ if params[:order_by].blank? && params[:order].blank?
92
+ filtered_scope.order(order_by => order)
93
+ else
94
+ filtered_scope.order(order_by(params) => order(params))
95
+ end
99
96
  end
100
97
 
101
98
  def order_method(filtered_scope, params)
metadata CHANGED
@@ -1,15 +1,16 @@
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.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
8
8
  - Danny Murphy
9
+ - Cliff Campbell
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2021-03-08 00:00:00.000000000 Z
13
+ date: 2021-09-15 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: activesupport
@@ -17,28 +18,28 @@ dependencies:
17
18
  requirements:
18
19
  - - ">="
19
20
  - !ruby/object:Gem::Version
20
- version: 5.2.4.3
21
+ version: 5.2.6
21
22
  type: :runtime
22
23
  prerelease: false
23
24
  version_requirements: !ruby/object:Gem::Requirement
24
25
  requirements:
25
26
  - - ">="
26
27
  - !ruby/object:Gem::Version
27
- version: 5.2.4.3
28
+ version: 5.2.6
28
29
  - !ruby/object:Gem::Dependency
29
30
  name: jsonapi-serializer
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
33
  - - "~>"
33
34
  - !ruby/object:Gem::Version
34
- version: '2.0'
35
+ version: '2.2'
35
36
  type: :runtime
36
37
  prerelease: false
37
38
  version_requirements: !ruby/object:Gem::Requirement
38
39
  requirements:
39
40
  - - "~>"
40
41
  - !ruby/object:Gem::Version
41
- version: '2.0'
42
+ version: '2.2'
42
43
  - !ruby/object:Gem::Dependency
43
44
  name: snfoil
44
45
  requirement: !ruby/object:Gem::Requirement
@@ -59,42 +60,42 @@ dependencies:
59
60
  requirements:
60
61
  - - "~>"
61
62
  - !ruby/object:Gem::Version
62
- version: '2.0'
63
+ version: '2.2'
63
64
  type: :development
64
65
  prerelease: false
65
66
  version_requirements: !ruby/object:Gem::Requirement
66
67
  requirements:
67
68
  - - "~>"
68
69
  - !ruby/object:Gem::Version
69
- version: '2.0'
70
+ version: '2.2'
70
71
  - !ruby/object:Gem::Dependency
71
72
  name: pry-byebug
72
73
  requirement: !ruby/object:Gem::Requirement
73
74
  requirements:
74
75
  - - "~>"
75
76
  - !ruby/object:Gem::Version
76
- version: '3.0'
77
+ version: '3.9'
77
78
  type: :development
78
79
  prerelease: false
79
80
  version_requirements: !ruby/object:Gem::Requirement
80
81
  requirements:
81
82
  - - "~>"
82
83
  - !ruby/object:Gem::Version
83
- version: '3.0'
84
+ version: '3.9'
84
85
  - !ruby/object:Gem::Dependency
85
86
  name: rails
86
87
  requirement: !ruby/object:Gem::Requirement
87
88
  requirements:
88
89
  - - '='
89
90
  - !ruby/object:Gem::Version
90
- version: 5.2.4.3
91
+ version: 5.2.6
91
92
  type: :development
92
93
  prerelease: false
93
94
  version_requirements: !ruby/object:Gem::Requirement
94
95
  requirements:
95
96
  - - '='
96
97
  - !ruby/object:Gem::Version
97
- version: 5.2.4.3
98
+ version: 5.2.6
98
99
  - !ruby/object:Gem::Dependency
99
100
  name: rake
100
101
  requirement: !ruby/object:Gem::Requirement
@@ -115,56 +116,70 @@ dependencies:
115
116
  requirements:
116
117
  - - "~>"
117
118
  - !ruby/object:Gem::Version
118
- version: '3.9'
119
+ version: '5.0'
119
120
  type: :development
120
121
  prerelease: false
121
122
  version_requirements: !ruby/object:Gem::Requirement
122
123
  requirements:
123
124
  - - "~>"
124
125
  - !ruby/object:Gem::Version
125
- version: '3.9'
126
+ version: '5.0'
126
127
  - !ruby/object:Gem::Dependency
127
128
  name: rubocop
128
129
  requirement: !ruby/object:Gem::Requirement
129
130
  requirements:
130
131
  - - "~>"
131
132
  - !ruby/object:Gem::Version
132
- version: 0.76.0
133
+ version: '1.18'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '1.18'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rubocop-performance
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.11'
133
148
  type: :development
134
149
  prerelease: false
135
150
  version_requirements: !ruby/object:Gem::Requirement
136
151
  requirements:
137
152
  - - "~>"
138
153
  - !ruby/object:Gem::Version
139
- version: 0.76.0
154
+ version: '1.11'
140
155
  - !ruby/object:Gem::Dependency
141
156
  name: rubocop-rails
142
157
  requirement: !ruby/object:Gem::Requirement
143
158
  requirements:
144
159
  - - "~>"
145
160
  - !ruby/object:Gem::Version
146
- version: '2.0'
161
+ version: '2.11'
147
162
  type: :development
148
163
  prerelease: false
149
164
  version_requirements: !ruby/object:Gem::Requirement
150
165
  requirements:
151
166
  - - "~>"
152
167
  - !ruby/object:Gem::Version
153
- version: '2.0'
168
+ version: '2.11'
154
169
  - !ruby/object:Gem::Dependency
155
170
  name: rubocop-rspec
156
171
  requirement: !ruby/object:Gem::Requirement
157
172
  requirements:
158
173
  - - "~>"
159
174
  - !ruby/object:Gem::Version
160
- version: 1.36.0
175
+ version: '2.4'
161
176
  type: :development
162
177
  prerelease: false
163
178
  version_requirements: !ruby/object:Gem::Requirement
164
179
  requirements:
165
180
  - - "~>"
166
181
  - !ruby/object:Gem::Version
167
- version: 1.36.0
182
+ version: '2.4'
168
183
  - !ruby/object:Gem::Dependency
169
184
  name: sqlite3
170
185
  requirement: !ruby/object:Gem::Requirement
@@ -183,6 +198,7 @@ description:
183
198
  email:
184
199
  - howeszy@gmail.com
185
200
  - dmurph24@gmail.com
201
+ - cliffcampbell@hey.com
186
202
  executables: []
187
203
  extensions: []
188
204
  extra_rdoc_files: []
@@ -205,6 +221,7 @@ files:
205
221
  - lib/generators/sn_foil/policy/templates/policy.erb
206
222
  - lib/generators/sn_foil/searcher/searcher_generator.rb
207
223
  - lib/generators/sn_foil/searcher/templates/searcher.erb
224
+ - lib/sn_foil/configuration/lazy_jsonapi_serializer.rb
208
225
  - lib/sn_foil/controller/api.rb
209
226
  - lib/sn_foil/controller/base.rb
210
227
  - lib/sn_foil/controller/concerns/change_controller_concern.rb
@@ -221,7 +238,7 @@ files:
221
238
  - lib/sn_foil/rails/version.rb
222
239
  - lib/sn_foil/searcher.rb
223
240
  - lib/snfoil-rails.rb
224
- homepage: https://github.com/howeszy/snfoil-rails
241
+ homepage: https://github.com/limited-effort/snfoil-rails
225
242
  licenses:
226
243
  - MIT
227
244
  metadata: {}
@@ -233,14 +250,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
233
250
  requirements:
234
251
  - - ">="
235
252
  - !ruby/object:Gem::Version
236
- version: '0'
253
+ version: 2.5.0
237
254
  required_rubygems_version: !ruby/object:Gem::Requirement
238
255
  requirements:
239
256
  - - ">="
240
257
  - !ruby/object:Gem::Version
241
258
  version: '0'
242
259
  requirements: []
243
- rubygems_version: 3.1.4
260
+ rubygems_version: 3.1.6
244
261
  signing_key:
245
262
  specification_version: 4
246
263
  summary: Additional functionality gem for using SnFoil with Rails