snfoil-rails 0.7.1 → 0.8.3

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: e70578dd091d98c88bb3c7fbf6868187f1549bdc4e1b7db17e4a6ec3114090ce
4
- data.tar.gz: e0513e5ed7245a443ded275617b5d72b615e5796286e8361e4ac030e12941af8
3
+ metadata.gz: 8317d5da3fd8d19a7ddc0c090c3065578d39ace6a431da7d3920e7dde76c92b0
4
+ data.tar.gz: ac1beda041a2d44d7e5066b3c9f39d9b8a1f28d1a8fe0f0c5cbdaf93047054d0
5
5
  SHA512:
6
- metadata.gz: c51c1f966922efa1ebea92c123b0adf8893155e43bbf7e4921c73c10295e535812a66b4e1341a170f36931d662c32784b592fb9795e46ae133be598b079046ff
7
- data.tar.gz: 30e5c4175d007e73c6d57d8116c7d6808eef9777af52eb3040303b4fc1af36550537c75c0d76033241caeaabd487da7f24d7acf6706748f2998acb441e718e3d
6
+ metadata.gz: 70da8fe5e43597103002d545e6e48362ea855ffc78bf3edd1c6e4c4fcf2de745b28bed82bd1526c8801a23395b2d9a85436c69daa01f0243669c7786f73e9a68
7
+ data.tar.gz: 0c0e11fed83253c68c9c393e96b9328cc6f4081b4aa832d4963cf4cf0402f795624dc38481dfbc4f2887f8fbf6762b1f15afb09cb82140307e1c4ca28dbc5090
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
@@ -1,46 +1,50 @@
1
- class SnFoil::AllGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class AllGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :type, desc: "Generate Base or API", type: :string, default: 'base'
7
- class_option :skip_model, desc: "Skip Model Creation", type: :boolean, default: false
7
+ argument :model, type: :string
8
8
 
9
- def add_model
10
- generate('model', *call_args, **call_options) unless File.file?("app/models/#{model.singularize.underscore}.rb") || options[:skip_model]
11
- end
9
+ class_option(:type, desc: 'Generate Base or API', type: :string, default: 'base')
10
+ class_option(:skip_model, desc: 'Skip Model Creation', type: :boolean, default: false)
12
11
 
13
- def add_policy
14
- generate('sn_foil:policy', *call_args, **call_options)
15
- end
12
+ def add_model
13
+ rails_command "generate model #{call_args.join(' ')}", call_options
14
+ end
16
15
 
17
- def add_searcher
18
- generate('sn_foil:searcher', *call_args, **call_options)
19
- end
16
+ def add_policy
17
+ rails_command "generate sn_foil:policy #{call_args.join(' ')}", call_options
18
+ end
20
19
 
21
- def add_context
22
- generate('sn_foil:context', *call_args, **call_options)
23
- end
20
+ def add_searcher
21
+ rails_command "generate sn_foil:searcher #{call_args.join(' ')}", call_options
22
+ end
24
23
 
25
- def add_jsonapi_serializer
26
- generate('sn_foil:jsonapi_serializer', *call_args, **call_options)
27
- end
24
+ def add_context
25
+ rails_command "generate sn_foil:context #{call_args.join(' ')}", call_options
26
+ end
28
27
 
29
- def add_jsonapi_deserializer
30
- generate('sn_foil:jsonapi_deserializer', *call_args, **call_options)
31
- end
28
+ def add_jsonapi_serializer
29
+ rails_command "generate sn_foil:jsonapi_serializer #{call_args.join(' ')}", call_options
30
+ end
32
31
 
33
- def add_controller
34
- generate('sn_foil:controller', *call_args, **call_options)
35
- end
32
+ def add_jsonapi_deserializer
33
+ rails_command "generate sn_foil:jsonapi_deserializer #{call_args.join(' ')}", call_options
34
+ end
36
35
 
37
- private
36
+ def add_controller
37
+ rails_command "generate sn_foil:controller #{call_args.join(' ')}", call_options
38
+ end
38
39
 
39
- def call_args
40
- @call_args ||= [model].concat(args)
41
- end
40
+ private
41
+
42
+ def call_args
43
+ @call_args ||= [model].concat(args)
44
+ end
42
45
 
43
- def call_options
44
- @call_options ||= options.deep_symbolize_keys
46
+ def call_options
47
+ @call_options ||= options.deep_symbolize_keys
48
+ end
45
49
  end
46
- end
50
+ end
@@ -1,37 +1,41 @@
1
- class SnFoil::ContextGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class ContextGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :path, desc: "Base path for file", type: :string, default: 'app/contexts'
7
+ argument :model, type: :string
7
8
 
8
- def add_app_file
9
- file_name = if modules.length.zero?
10
- name
11
- else
12
- modules.join('/') + '/' + name
13
- end
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/contexts'
14
10
 
15
- template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
16
- end
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
17
 
18
- private
18
+ template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
19
+ end
19
20
 
20
- def name
21
- @name ||= model.split('/').last.underscore.singularize
22
- end
21
+ private
23
22
 
24
- def class_name
25
- @class_name ||= name.camelize
26
- end
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
27
26
 
28
- def modules
29
- @modules ||= model.split('/')[0..-2].map(&:underscore)
30
- end
27
+ def class_name
28
+ @class_name ||= name.camelize
29
+ end
30
+
31
+ def modules
32
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
33
+ end
31
34
 
32
- def class_modules
33
- return if modules.length.zero?
35
+ def class_modules
36
+ return if modules.length.zero?
34
37
 
35
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
36
40
  end
37
41
  end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  class <%= class_modules %><%= class_name %>Context
4
4
  include SnFoil::Context
@@ -1,44 +1,52 @@
1
- class SnFoil::ControllerGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class ControllerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :type, desc: "Generate Base or API", type: :string, default: 'base'
7
- class_option :path, desc: "Base path for file", type: :string, default: 'app/controllers'
7
+ argument :model, type: :string
8
8
 
9
- def add_app_file
10
- file_name = if modules.length.zero?
11
- name
12
- else
13
- modules.join('/') + '/' + name
14
- end
9
+ class_option :type, desc: 'Generate Base or API', type: :string, default: 'base'
10
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/controllers'
15
11
 
16
- template_name = if options[:type] == 'api'
17
- 'api_controller.erb'
18
- else
19
- 'controller.erb'
20
- end
12
+ def add_app_file
13
+ template(template_name, "#{options[:path]}/#{file_name}_controller.rb")
14
+ end
21
15
 
22
- template(template_name, "#{options[:path]}/#{file_name}_controller.rb")
23
- end
16
+ private
24
17
 
25
- private
18
+ def file_name
19
+ @file_name ||= if modules.length.zero?
20
+ name
21
+ else
22
+ "#{modules.join('/')}/#{name}"
23
+ end
24
+ end
26
25
 
27
- def name
28
- @name ||= model.split('/').last.underscore.pluralize
29
- end
26
+ def template_name
27
+ @template_name ||= if options[:type] == 'api'
28
+ 'api_controller.erb'
29
+ else
30
+ 'controller.erb'
31
+ end
32
+ end
30
33
 
31
- def class_name
32
- @class_name ||= name.camelize
33
- end
34
+ def name
35
+ @name ||= model.split('/').last.underscore.pluralize
36
+ end
34
37
 
35
- def modules
36
- @modules ||= model.split('/')[0..-2].map(&:underscore)
37
- end
38
+ def class_name
39
+ @class_name ||= name.camelize
40
+ end
41
+
42
+ def modules
43
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
44
+ end
38
45
 
39
- def class_modules
40
- return if modules.length.zero?
46
+ def class_modules
47
+ return if modules.length.zero?
41
48
 
42
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
49
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
50
+ end
43
51
  end
44
52
  end
@@ -1,37 +1,41 @@
1
- class SnFoil::JsonapiDeserializerGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class JsonapiDeserializerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :path, desc: "Base path for file", type: :string, default: 'app/jsonapi_deserializers'
7
+ argument :model, type: :string
7
8
 
8
- def add_app_file
9
- file_name = if modules.length.zero?
10
- name
11
- else
12
- modules.join('/') + '/' + name
13
- end
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_deserializers'
14
10
 
15
- template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
16
- end
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
17
 
18
- private
18
+ template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
19
+ end
19
20
 
20
- def name
21
- @name ||= model.split('/').last.underscore.singularize
22
- end
21
+ private
23
22
 
24
- def class_name
25
- @class_name ||= name.camelize
26
- end
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
27
26
 
28
- def modules
29
- @modules ||= model.split('/')[0..-2].map(&:underscore)
30
- end
27
+ def class_name
28
+ @class_name ||= name.camelize
29
+ end
30
+
31
+ def modules
32
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
33
+ end
31
34
 
32
- def class_modules
33
- return if modules.length.zero?
35
+ def class_modules
36
+ return if modules.length.zero?
34
37
 
35
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
36
40
  end
37
41
  end
@@ -1,37 +1,41 @@
1
- class SnFoil::JsonapiSerializerGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class JsonapiSerializerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :path, desc: "Base path for file", type: :string, default: 'app/jsonapi_serializers'
7
+ argument :model, type: :string
7
8
 
8
- def add_app_file
9
- file_name = if modules.length.zero?
10
- name
11
- else
12
- modules.join('/') + '/' + name
13
- end
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_serializers'
14
10
 
15
- template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
16
- end
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
17
 
18
- private
18
+ template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
19
+ end
19
20
 
20
- def name
21
- @name ||= model.split('/').last.underscore.singularize
22
- end
21
+ private
23
22
 
24
- def class_name
25
- @class_name ||= name.camelize
26
- end
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
27
26
 
28
- def modules
29
- @modules ||= model.split('/')[0..-2].map(&:underscore)
30
- end
27
+ def class_name
28
+ @class_name ||= name.camelize
29
+ end
30
+
31
+ def modules
32
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
33
+ end
31
34
 
32
- def class_modules
33
- return if modules.length.zero?
35
+ def class_modules
36
+ return if modules.length.zero?
34
37
 
35
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
36
40
  end
37
41
  end
@@ -1,37 +1,41 @@
1
- class SnFoil::PolicyGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class PolicyGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :path, desc: "Base path for file", type: :string, default: 'app/policies'
7
+ argument :model, type: :string
7
8
 
8
- def add_app_file
9
- file_name = if modules.length.zero?
10
- name
11
- else
12
- modules.join('/') + '/' + name
13
- end
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/policies'
14
10
 
15
- template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
16
- end
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
17
 
18
- private
18
+ template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
19
+ end
19
20
 
20
- def name
21
- @name ||= model.split('/').last.underscore.singularize
22
- end
21
+ private
23
22
 
24
- def class_name
25
- @class_name ||= name.camelize
26
- end
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
27
26
 
28
- def modules
29
- @modules ||= model.split('/')[0..-2].map(&:underscore)
30
- end
27
+ def class_name
28
+ @class_name ||= name.camelize
29
+ end
30
+
31
+ def modules
32
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
33
+ end
31
34
 
32
- def class_modules
33
- return if modules.length.zero?
35
+ def class_modules
36
+ return if modules.length.zero?
34
37
 
35
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
36
40
  end
37
41
  end
@@ -1,37 +1,41 @@
1
- class SnFoil::SearcherGenerator < Rails::Generators::Base
2
- source_root File.expand_path('templates', __dir__)
1
+ # frozen_string_literal: true
3
2
 
4
- argument :model, type: :string
3
+ module SnFoil
4
+ class SearcherGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
5
6
 
6
- class_option :path, desc: "Base path for file", type: :string, default: 'app/searchers'
7
+ argument :model, type: :string
7
8
 
8
- def add_app_file
9
- file_name = if modules.length.zero?
10
- name
11
- else
12
- modules.join('/') + '/' + name
13
- end
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/searchers'
14
10
 
15
- template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
16
- end
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
17
 
18
- private
18
+ template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
19
+ end
19
20
 
20
- def name
21
- @name ||= model.split('/').last.underscore.pluralize
22
- end
21
+ private
23
22
 
24
- def class_name
25
- @class_name ||= name.camelize
26
- end
23
+ def name
24
+ @name ||= model.split('/').last.underscore.pluralize
25
+ end
27
26
 
28
- def modules
29
- @modules ||= model.split('/')[0..-2].map(&:underscore)
30
- end
27
+ def class_name
28
+ @class_name ||= name.camelize
29
+ end
30
+
31
+ def modules
32
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
33
+ end
31
34
 
32
- def class_modules
33
- return if modules.length.zero?
35
+ def class_modules
36
+ return if modules.length.zero?
34
37
 
35
- @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
36
40
  end
37
41
  end
@@ -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.7.1'
5
+ VERSION = '0.8.3'
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
 
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.7.1
4
+ version: 0.8.3
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: 2020-09-14 00:00:00.000000000 Z
13
+ date: 2021-09-14 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: activesupport
@@ -17,84 +18,84 @@ 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
45
46
  requirements:
46
47
  - - "~>"
47
48
  - !ruby/object:Gem::Version
48
- version: '0.7'
49
+ version: '0.8'
49
50
  type: :runtime
50
51
  prerelease: false
51
52
  version_requirements: !ruby/object:Gem::Requirement
52
53
  requirements:
53
54
  - - "~>"
54
55
  - !ruby/object:Gem::Version
55
- version: '0.7'
56
+ version: '0.8'
56
57
  - !ruby/object:Gem::Dependency
57
58
  name: bundler
58
59
  requirement: !ruby/object:Gem::Requirement
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.0.3
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