snfoil-rails 0.7.1 → 0.8.3
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 +4 -4
- data/README.md +2 -2
- data/lib/generators/sn_foil/all/all_generator.rb +37 -33
- data/lib/generators/sn_foil/context/context_generator.rb +29 -25
- data/lib/generators/sn_foil/context/templates/context.erb +1 -1
- data/lib/generators/sn_foil/controller/controller_generator.rb +39 -31
- data/lib/generators/sn_foil/jsonapi_deserializer/jsonapi_deserializer_generator.rb +29 -25
- data/lib/generators/sn_foil/jsonapi_serializer/jsonapi_serializer_generator.rb +29 -25
- data/lib/generators/sn_foil/policy/policy_generator.rb +29 -25
- data/lib/generators/sn_foil/searcher/searcher_generator.rb +29 -25
- data/lib/sn_foil/configuration/lazy_jsonapi_serializer.rb +87 -0
- data/lib/sn_foil/controller/api.rb +4 -2
- data/lib/sn_foil/jsonapi_deserializer.rb +11 -5
- data/lib/sn_foil/jsonapi_serializer.rb +2 -2
- data/lib/sn_foil/rails/engine.rb +2 -0
- data/lib/sn_foil/rails/version.rb +1 -1
- data/lib/sn_foil/rails.rb +2 -0
- data/lib/sn_foil/searcher.rb +3 -4
- metadata +42 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8317d5da3fd8d19a7ddc0c090c3065578d39ace6a431da7d3920e7dde76c92b0
|
4
|
+
data.tar.gz: ac1beda041a2d44d7e5066b3c9f39d9b8a1f28d1a8fe0f0c5cbdaf93047054d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 '
|
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
|
21
|
+
$ gem install snfoil-rails
|
22
22
|
```
|
23
23
|
|
24
24
|
## Contributing
|
@@ -1,46 +1,50 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class AllGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
-
class_option :skip_model, desc: "Skip Model Creation", type: :boolean, default: false
|
7
|
+
argument :model, type: :string
|
8
8
|
|
9
|
-
|
10
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
12
|
+
def add_model
|
13
|
+
rails_command "generate model #{call_args.join(' ')}", call_options
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
def add_policy
|
17
|
+
rails_command "generate sn_foil:policy #{call_args.join(' ')}", call_options
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
def add_searcher
|
21
|
+
rails_command "generate sn_foil:searcher #{call_args.join(' ')}", call_options
|
22
|
+
end
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
def add_context
|
25
|
+
rails_command "generate sn_foil:context #{call_args.join(' ')}", call_options
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def add_jsonapi_serializer
|
29
|
+
rails_command "generate sn_foil:jsonapi_serializer #{call_args.join(' ')}", call_options
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
def add_jsonapi_deserializer
|
33
|
+
rails_command "generate sn_foil:jsonapi_deserializer #{call_args.join(' ')}", call_options
|
34
|
+
end
|
36
35
|
|
37
|
-
|
36
|
+
def add_controller
|
37
|
+
rails_command "generate sn_foil:controller #{call_args.join(' ')}", call_options
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
private
|
41
|
+
|
42
|
+
def call_args
|
43
|
+
@call_args ||= [model].concat(args)
|
44
|
+
end
|
42
45
|
|
43
|
-
|
44
|
-
|
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
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class ContextGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
+
argument :model, type: :string
|
7
8
|
|
8
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
18
|
+
template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
@name ||= model.split('/').last.underscore.singularize
|
22
|
-
end
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def name
|
24
|
+
@name ||= model.split('/').last.underscore.singularize
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
35
|
+
def class_modules
|
36
|
+
return if modules.length.zero?
|
34
37
|
|
35
|
-
|
38
|
+
@class_modules ||= "#{modules.map(&:camelize).join('::')}::"
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
@@ -1,44 +1,52 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class ControllerGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
-
class_option :path, desc: "Base path for file", type: :string, default: 'app/controllers'
|
7
|
+
argument :model, type: :string
|
8
8
|
|
9
|
-
|
10
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
23
|
-
end
|
16
|
+
private
|
24
17
|
|
25
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
+
def name
|
35
|
+
@name ||= model.split('/').last.underscore.pluralize
|
36
|
+
end
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
40
|
-
|
46
|
+
def class_modules
|
47
|
+
return if modules.length.zero?
|
41
48
|
|
42
|
-
|
49
|
+
@class_modules ||= "#{modules.map(&:camelize).join('::')}::"
|
50
|
+
end
|
43
51
|
end
|
44
52
|
end
|
@@ -1,37 +1,41 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class JsonapiDeserializerGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
+
argument :model, type: :string
|
7
8
|
|
8
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
18
|
+
template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
@name ||= model.split('/').last.underscore.singularize
|
22
|
-
end
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def name
|
24
|
+
@name ||= model.split('/').last.underscore.singularize
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
35
|
+
def class_modules
|
36
|
+
return if modules.length.zero?
|
34
37
|
|
35
|
-
|
38
|
+
@class_modules ||= "#{modules.map(&:camelize).join('::')}::"
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
@@ -1,37 +1,41 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class JsonapiSerializerGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
+
argument :model, type: :string
|
7
8
|
|
8
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
18
|
+
template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
@name ||= model.split('/').last.underscore.singularize
|
22
|
-
end
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def name
|
24
|
+
@name ||= model.split('/').last.underscore.singularize
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
35
|
+
def class_modules
|
36
|
+
return if modules.length.zero?
|
34
37
|
|
35
|
-
|
38
|
+
@class_modules ||= "#{modules.map(&:camelize).join('::')}::"
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
@@ -1,37 +1,41 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class PolicyGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
+
argument :model, type: :string
|
7
8
|
|
8
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
18
|
+
template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
@name ||= model.split('/').last.underscore.singularize
|
22
|
-
end
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def name
|
24
|
+
@name ||= model.split('/').last.underscore.singularize
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
35
|
+
def class_modules
|
36
|
+
return if modules.length.zero?
|
34
37
|
|
35
|
-
|
38
|
+
@class_modules ||= "#{modules.map(&:camelize).join('::')}::"
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
@@ -1,37 +1,41 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('templates', __dir__)
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module SnFoil
|
4
|
+
class SearcherGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
5
6
|
|
6
|
-
|
7
|
+
argument :model, type: :string
|
7
8
|
|
8
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
18
|
+
template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
@name ||= model.split('/').last.underscore.pluralize
|
22
|
-
end
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def name
|
24
|
+
@name ||= model.split('/').last.underscore.pluralize
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
35
|
+
def class_modules
|
36
|
+
return if modules.length.zero?
|
34
37
|
|
35
|
-
|
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
|
-
|
34
|
+
options[:deserialize] = options[:deserialize].nil? ? true : options[:deserialize]
|
35
|
+
super(**options)
|
35
36
|
end
|
36
37
|
|
37
38
|
def setup_update(**options)
|
38
|
-
|
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
|
-
|
92
|
+
case transform_type
|
93
|
+
when :attribute
|
92
94
|
parse_attribute_transform(attributes, data, key, **opts)
|
93
|
-
|
95
|
+
when :has_one
|
94
96
|
parse_has_one_relationship(attributes, data, key, **opts)
|
95
|
-
|
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(
|
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
|
-
|
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 '
|
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
|
11
|
+
include JSONAPI::Serializer
|
12
12
|
|
13
13
|
set_key_transform :dash
|
14
14
|
end
|
data/lib/sn_foil/rails/engine.rb
CHANGED
data/lib/sn_foil/rails.rb
CHANGED
data/lib/sn_foil/searcher.rb
CHANGED
@@ -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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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: '
|
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: '
|
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:
|
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:
|
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.
|
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.
|
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:
|
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:
|
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/
|
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:
|
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.
|
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
|