snfoil-rails 0.8.0 → 0.8.5

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