snfoil-rails 0.5.2 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73e5f3f298f380d6961452b753e3d5ff22f35a4a466b99590cd2409a78ea339e
4
- data.tar.gz: 2ce8432635e0d889791954955d984d7b81d2d99888dbcbd5ab728e98019eadc6
3
+ metadata.gz: e70578dd091d98c88bb3c7fbf6868187f1549bdc4e1b7db17e4a6ec3114090ce
4
+ data.tar.gz: e0513e5ed7245a443ded275617b5d72b615e5796286e8361e4ac030e12941af8
5
5
  SHA512:
6
- metadata.gz: 8767df32da2db2772c633123436bcef81a98f9fe2c37cc1739922e8f07543e0cb593a3fb0a126bc15bfa0cb9abd4f7a419a951c925413c54951e9f4f16b01d45
7
- data.tar.gz: d2e717c282cf33e7f1a5dd7f42feffe0c1b726c472368d477837f1e64676b2f9dc933d71231c4de5d84f2eb55546c42001dc9bffdb912f26d4d029bf7e710658
6
+ metadata.gz: c51c1f966922efa1ebea92c123b0adf8893155e43bbf7e4921c73c10295e535812a66b4e1341a170f36931d662c32784b592fb9795e46ae133be598b079046ff
7
+ data.tar.gz: 30e5c4175d007e73c6d57d8116c7d6808eef9777af52eb3040303b4fc1af36550537c75c0d76033241caeaabd487da7f24d7acf6706748f2998acb441e718e3d
@@ -0,0 +1,46 @@
1
+ class SnFoil::AllGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
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
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
12
+
13
+ def add_policy
14
+ generate('sn_foil:policy', *call_args, **call_options)
15
+ end
16
+
17
+ def add_searcher
18
+ generate('sn_foil:searcher', *call_args, **call_options)
19
+ end
20
+
21
+ def add_context
22
+ generate('sn_foil:context', *call_args, **call_options)
23
+ end
24
+
25
+ def add_jsonapi_serializer
26
+ generate('sn_foil:jsonapi_serializer', *call_args, **call_options)
27
+ end
28
+
29
+ def add_jsonapi_deserializer
30
+ generate('sn_foil:jsonapi_deserializer', *call_args, **call_options)
31
+ end
32
+
33
+ def add_controller
34
+ generate('sn_foil:controller', *call_args, **call_options)
35
+ end
36
+
37
+ private
38
+
39
+ def call_args
40
+ @call_args ||= [model].concat(args)
41
+ end
42
+
43
+ def call_options
44
+ @call_options ||= options.deep_symbolize_keys
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ class SnFoil::ContextGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
6
+ class_option :path, desc: "Base path for file", type: :string, default: 'app/contexts'
7
+
8
+ def add_app_file
9
+ file_name = if modules.length.zero?
10
+ name
11
+ else
12
+ modules.join('/') + '/' + name
13
+ end
14
+
15
+ template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
16
+ end
17
+
18
+ private
19
+
20
+ def name
21
+ @name ||= model.split('/').last.underscore.singularize
22
+ end
23
+
24
+ def class_name
25
+ @class_name ||= name.camelize
26
+ end
27
+
28
+ def modules
29
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
30
+ end
31
+
32
+ def class_modules
33
+ return if modules.length.zero?
34
+
35
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Context
4
+ include SnFoil::Context
5
+
6
+ model <%= class_name %>
7
+ searcher <%= class_name.pluralize %>Searcher
8
+ policy <%= class_name %>Policy
9
+ end
@@ -0,0 +1,44 @@
1
+ class SnFoil::ControllerGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
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'
8
+
9
+ def add_app_file
10
+ file_name = if modules.length.zero?
11
+ name
12
+ else
13
+ modules.join('/') + '/' + name
14
+ end
15
+
16
+ template_name = if options[:type] == 'api'
17
+ 'api_controller.erb'
18
+ else
19
+ 'controller.erb'
20
+ end
21
+
22
+ template(template_name, "#{options[:path]}/#{file_name}_controller.rb")
23
+ end
24
+
25
+ private
26
+
27
+ def name
28
+ @name ||= model.split('/').last.underscore.pluralize
29
+ end
30
+
31
+ def class_name
32
+ @class_name ||= name.camelize
33
+ end
34
+
35
+ def modules
36
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
37
+ end
38
+
39
+ def class_modules
40
+ return if modules.length.zero?
41
+
42
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
43
+ end
44
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Controller < SnFoil::Controller::API
4
+ context <%= class_name.singularize %>Context
5
+ serializer <%= class_name.singularize %>JsonapiSerializer
6
+ deserializer <%= class_name.singularize %>JsonapiDeserializer
7
+
8
+ # SnFoil::Controller requires current_entity or current_user defined to properly scope
9
+ # all queries, otherwise data leaks could occur
10
+ #
11
+ # def current_entity
12
+ # # logic to find authenticated user
13
+ # end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Controller < SnFoil::Controller::Base
4
+ context <%= name.singularize.camelcase %>Context
5
+ serializer <%= name.singularize.camelcase %>JsonapiSerializer
6
+ deserializer <%= name.singularize.camelcase %>JsonapiDeserializer
7
+
8
+ # SnFoil::Controller requires current_entity or current_user defined to properly scope
9
+ # all queries, otherwise data leaks could occur
10
+ #
11
+ # def current_entity
12
+ # # logic to find authenticated user
13
+ # end
14
+ end
@@ -0,0 +1,37 @@
1
+ class SnFoil::JsonapiDeserializerGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
6
+ class_option :path, desc: "Base path for file", type: :string, default: 'app/jsonapi_deserializers'
7
+
8
+ def add_app_file
9
+ file_name = if modules.length.zero?
10
+ name
11
+ else
12
+ modules.join('/') + '/' + name
13
+ end
14
+
15
+ template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
16
+ end
17
+
18
+ private
19
+
20
+ def name
21
+ @name ||= model.split('/').last.underscore.singularize
22
+ end
23
+
24
+ def class_name
25
+ @class_name ||= name.camelize
26
+ end
27
+
28
+ def modules
29
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
30
+ end
31
+
32
+ def class_modules
33
+ return if modules.length.zero?
34
+
35
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>JsonapiDeserializer
4
+ include SnFoil::JsonapiDeserializer
5
+
6
+ # Add attributes of the model you want to serializer with the following syntax
7
+ attributes :id
8
+
9
+ # Add relationships with the following syntax
10
+ # belongs_to :store, serializer: Jsonapi::StoreJsonapiSerializer
11
+ # has_many :locations, serializer: Jsonapi::LocationJsonapiSerializer
12
+ end
@@ -0,0 +1,37 @@
1
+ class SnFoil::JsonapiSerializerGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
6
+ class_option :path, desc: "Base path for file", type: :string, default: 'app/jsonapi_serializers'
7
+
8
+ def add_app_file
9
+ file_name = if modules.length.zero?
10
+ name
11
+ else
12
+ modules.join('/') + '/' + name
13
+ end
14
+
15
+ template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
16
+ end
17
+
18
+ private
19
+
20
+ def name
21
+ @name ||= model.split('/').last.underscore.singularize
22
+ end
23
+
24
+ def class_name
25
+ @class_name ||= name.camelize
26
+ end
27
+
28
+ def modules
29
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
30
+ end
31
+
32
+ def class_modules
33
+ return if modules.length.zero?
34
+
35
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>JsonapiSerializer
4
+ include SnFoil::JsonapiSerializer
5
+
6
+ set_id :id
7
+ set_type :<%= name.pluralize.dasherize %>
8
+
9
+ # SnFoil::JsonapiSerializer is just a wrapper for jsonapi-serializer (https://github.com/jsonapi-serializer/jsonapi-serializer)
10
+ # with some defaults added in
11
+
12
+ # Add attributes of the model you want to serializer with the following syntax
13
+ # attributes :name
14
+ # :description
15
+ # :logo_url
16
+
17
+ # Add relationships with the following syntax
18
+ # belongs_to :store, serializer: Jsonapi::StoreJsonapiSerializer
19
+ # has_many :locations, serializer: Jsonapi::LocationJsonapiSerializer
20
+ end
@@ -0,0 +1,37 @@
1
+ class SnFoil::PolicyGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
6
+ class_option :path, desc: "Base path for file", type: :string, default: 'app/policies'
7
+
8
+ def add_app_file
9
+ file_name = if modules.length.zero?
10
+ name
11
+ else
12
+ modules.join('/') + '/' + name
13
+ end
14
+
15
+ template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
16
+ end
17
+
18
+ private
19
+
20
+ def name
21
+ @name ||= model.split('/').last.underscore.singularize
22
+ end
23
+
24
+ def class_name
25
+ @class_name ||= name.camelize
26
+ end
27
+
28
+ def modules
29
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
30
+ end
31
+
32
+ def class_modules
33
+ return if modules.length.zero?
34
+
35
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Policy
4
+ include SnFoil::Policy
5
+ # A SnFoil::Policy is just a Pundit policy (https://github.com/varvet/pundit)
6
+ # with some defaults
7
+ # Available methods: show?, create?, update?, destroy?, index?, associate?
8
+
9
+ # def show?
10
+ # true
11
+ # end
12
+
13
+ # class Scope
14
+ # # available read-only attributes
15
+ # # - scope: the default scope passed into the policy (ex: an ActiveRecord::Relation)
16
+ # # - entity: the object that the scope is build around (ex: a User)
17
+
18
+ # def resolve
19
+ # # the new default scope
20
+ # end
21
+ # end
22
+ end
@@ -0,0 +1,37 @@
1
+ class SnFoil::SearcherGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ argument :model, type: :string
5
+
6
+ class_option :path, desc: "Base path for file", type: :string, default: 'app/searchers'
7
+
8
+ def add_app_file
9
+ file_name = if modules.length.zero?
10
+ name
11
+ else
12
+ modules.join('/') + '/' + name
13
+ end
14
+
15
+ template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
16
+ end
17
+
18
+ private
19
+
20
+ def name
21
+ @name ||= model.split('/').last.underscore.pluralize
22
+ end
23
+
24
+ def class_name
25
+ @class_name ||= name.camelize
26
+ end
27
+
28
+ def modules
29
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
30
+ end
31
+
32
+ def class_modules
33
+ return if modules.length.zero?
34
+
35
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Searcher
4
+ include SnFoil::Searcher
5
+
6
+ model <%= class_name.singularize %>
7
+ end
@@ -44,7 +44,7 @@ module SnFoil
44
44
  render json: serializer(**options).new(model,
45
45
  **options,
46
46
  params: (options[:controller_params] || options[:params] || {})
47
- .merge(current_entity: current_entity)).serializable_hash
47
+ .merge(current_entity: context_entity)).serializable_hash
48
48
  else
49
49
  render json: model.errors, status: :unprocessable_entity
50
50
  end
@@ -62,7 +62,7 @@ module SnFoil
62
62
  render json: serializer(**options).new(paginate(results, **options),
63
63
  **options,
64
64
  params: (options[:controller_params] || options[:params] || {})
65
- .merge(current_entity: current_entity),
65
+ .merge(current_entity: context_entity),
66
66
  meta: meta(results, **options))
67
67
  .serializable_hash
68
68
  end
@@ -71,7 +71,7 @@ module SnFoil
71
71
  render json: serializer(**options).new(model,
72
72
  **options,
73
73
  params: (options[:controller_params] || options[:params] || {})
74
- .merge(current_entity: current_entity)).serializable_hash
74
+ .merge(current_entity: context_entity)).serializable_hash
75
75
  end
76
76
 
77
77
  private
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SnFoil
4
4
  module Rails
5
- VERSION = '0.5.2'
5
+ VERSION = '0.7.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-06-03 00:00:00.000000000 Z
12
+ date: 2020-09-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -17,42 +17,42 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '5.1'
20
+ version: 5.2.4.3
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '5.1'
27
+ version: 5.2.4.3
28
28
  - !ruby/object:Gem::Dependency
29
- name: fast_jsonapi
29
+ name: jsonapi-serializer
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '1.0'
34
+ version: '2.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '1.0'
41
+ version: '2.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: snfoil
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.5'
48
+ version: '0.7'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0.5'
55
+ version: '0.7'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: bundler
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -85,16 +85,16 @@ dependencies:
85
85
  name: rails
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - "~>"
88
+ - - '='
89
89
  - !ruby/object:Gem::Version
90
- version: 5.1.7
90
+ version: 5.2.4.3
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - "~>"
95
+ - - '='
96
96
  - !ruby/object:Gem::Version
97
- version: 5.1.7
97
+ version: 5.2.4.3
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rake
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -191,7 +191,20 @@ files:
191
191
  - MIT-LICENSE
192
192
  - README.md
193
193
  - Rakefile
194
- - lib/generators/sn_foil/sn_foil_generator.rb
194
+ - lib/generators/sn_foil/all/all_generator.rb
195
+ - lib/generators/sn_foil/context/context_generator.rb
196
+ - lib/generators/sn_foil/context/templates/context.erb
197
+ - lib/generators/sn_foil/controller/controller_generator.rb
198
+ - lib/generators/sn_foil/controller/templates/api_controller.erb
199
+ - lib/generators/sn_foil/controller/templates/controller.erb
200
+ - lib/generators/sn_foil/jsonapi_deserializer/jsonapi_deserializer_generator.rb
201
+ - lib/generators/sn_foil/jsonapi_deserializer/templates/jsonapi_deserializer.erb
202
+ - lib/generators/sn_foil/jsonapi_serializer/jsonapi_serializer_generator.rb
203
+ - lib/generators/sn_foil/jsonapi_serializer/templates/jsonapi_serializer.erb
204
+ - lib/generators/sn_foil/policy/policy_generator.rb
205
+ - lib/generators/sn_foil/policy/templates/policy.erb
206
+ - lib/generators/sn_foil/searcher/searcher_generator.rb
207
+ - lib/generators/sn_foil/searcher/templates/searcher.erb
195
208
  - lib/sn_foil/controller/api.rb
196
209
  - lib/sn_foil/controller/base.rb
197
210
  - lib/sn_foil/controller/concerns/change_controller_concern.rb
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class SnFoilGenerator < Rails::Generators::Base
4
- source_root File.expand_path('templates', __dir__)
5
- argument :model, type: :string
6
-
7
- def generate_sn_foil
8
- generate_model
9
- generate_controller
10
- generate_searcher
11
- generate_serializer
12
- generate_deserializer
13
- generate_policy
14
- generate_context
15
- Rails.logger.info 'In order to expose your model, it must be added to the config/routes.rb file'
16
- end
17
-
18
- private
19
-
20
- def generate_context
21
- template 'context.erb', "app/contexts/#{model.singularize.underscore}_context.rb"
22
- end
23
-
24
- def generate_controller
25
- template 'controller.erb', "app/controllers/#{model.pluralize.underscore}_controller.rb"
26
- end
27
-
28
- def generate_deserializer
29
- template 'jsonapi_deserializer.erb', "app/deserializers/#{model.singularize.underscore}_deserializer.rb"
30
- end
31
-
32
- def generate_serializer
33
- template 'jsonapi_serializer.erb', "app/serializers/#{model.singularize.underscore}_jsonapi_serializer.rb"
34
- end
35
-
36
- def generate_model
37
- generate('model', model.underscore) unless File.file? "app/models/#{model.singularize.underscore}.rb"
38
- end
39
-
40
- def generate_searcher
41
- template 'searcher.erb', "app/searchers/#{model.pluralize.underscore}_searcher.rb"
42
- end
43
-
44
- def generate_policy
45
- template 'policy.erb', "app/policies/#{model.singularize.underscore}_policy.rb"
46
- end
47
- end