snfoil-rails 0.7.0 → 0.8.2

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: c04a7e0dc66d406d1e758d1d4a6cc3d1626fa02b0beb0d4465ae2940f6f517cd
4
- data.tar.gz: 27ffc1f5e63c1e2211ac68c133c9b7ade926c597adfbb05b146cb743a4460d2e
3
+ metadata.gz: ea6d2a09b224a8c5db03d8e9db2fdcd9ca924d962a616a3200eda4711c45db44
4
+ data.tar.gz: 2833039ea0c326f2a413bc3336824b460ca8a68c2fa915ccb1ba9dceb1264d20
5
5
  SHA512:
6
- metadata.gz: 574a8c564a5d08240c91cc13e365d02b5b16f5c22524ac4160b1a2b4b54c8415a0d3164cf24d0a255f9af59e35df94f1cb48c53fcdb9858c88bfa545cc41b39f
7
- data.tar.gz: 8ea4ad813675320a6bf96def1797127c287976daff9aa474a7fe3dc9b30bce24cbbe9b51d3e44a32541416e26ef0d9749397b10dff968a9a80835943c1751a03
6
+ metadata.gz: 1c29a7c2ca4ee5b1aae08035cf8ca8e05a2ac4ea87ddb448e1b068d1cef75f98bc6a85d1470b9544c1b14e987574ba91d21957e35afc0abe4018f502daa245bb
7
+ data.tar.gz: 4253646b1f10c5db780d7b4c2f933fea6fb4637583886c805b2375696167be2c3b6dd6fd79d04af45e5ea5e0de385b186d07dcc7164ba4e18c8e81727bf5c184
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
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class AllGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
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)
11
+
12
+ def add_model
13
+ rails_command "generate model #{call_args.join(' ')}", call_options
14
+ end
15
+
16
+ def add_policy
17
+ rails_command "generate sn_foil:policy #{call_args.join(' ')}", call_options
18
+ end
19
+
20
+ def add_searcher
21
+ rails_command "generate sn_foil:searcher #{call_args.join(' ')}", call_options
22
+ end
23
+
24
+ def add_context
25
+ rails_command "generate sn_foil:context #{call_args.join(' ')}", call_options
26
+ end
27
+
28
+ def add_jsonapi_serializer
29
+ rails_command "generate sn_foil:jsonapi_serializer #{call_args.join(' ')}", call_options
30
+ end
31
+
32
+ def add_jsonapi_deserializer
33
+ rails_command "generate sn_foil:jsonapi_deserializer #{call_args.join(' ')}", call_options
34
+ end
35
+
36
+ def add_controller
37
+ rails_command "generate sn_foil:controller #{call_args.join(' ')}", call_options
38
+ end
39
+
40
+ private
41
+
42
+ def call_args
43
+ @call_args ||= [model].concat(args)
44
+ end
45
+
46
+ def call_options
47
+ @call_options ||= options.deep_symbolize_keys
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class ContextGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/contexts'
10
+
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
+
18
+ template('context.erb', "#{options[:path]}/#{file_name}_context.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
26
+
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
34
+
35
+ def class_modules
36
+ return if modules.length.zero?
37
+
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
40
+ end
41
+ 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,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class ControllerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
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'
11
+
12
+ def add_app_file
13
+ template(template_name, "#{options[:path]}/#{file_name}_controller.rb")
14
+ end
15
+
16
+ private
17
+
18
+ def file_name
19
+ @file_name ||= if modules.length.zero?
20
+ name
21
+ else
22
+ "#{modules.join('/')}/#{name}"
23
+ end
24
+ end
25
+
26
+ def template_name
27
+ @template_name ||= if options[:type] == 'api'
28
+ 'api_controller.erb'
29
+ else
30
+ 'controller.erb'
31
+ end
32
+ end
33
+
34
+ def name
35
+ @name ||= model.split('/').last.underscore.pluralize
36
+ end
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
45
+
46
+ def class_modules
47
+ return if modules.length.zero?
48
+
49
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
50
+ end
51
+ end
52
+ 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,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class JsonapiDeserializerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_deserializers'
10
+
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
+
18
+ template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
26
+
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
34
+
35
+ def class_modules
36
+ return if modules.length.zero?
37
+
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
40
+ end
41
+ 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,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class JsonapiSerializerGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_serializers'
10
+
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
+
18
+ template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
26
+
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
34
+
35
+ def class_modules
36
+ return if modules.length.zero?
37
+
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
40
+ end
41
+ 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,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class PolicyGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/policies'
10
+
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
+
18
+ template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def name
24
+ @name ||= model.split('/').last.underscore.singularize
25
+ end
26
+
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
34
+
35
+ def class_modules
36
+ return if modules.length.zero?
37
+
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
40
+ end
41
+ 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,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ class SearcherGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ argument :model, type: :string
8
+
9
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/searchers'
10
+
11
+ def add_app_file
12
+ file_name = if modules.length.zero?
13
+ name
14
+ else
15
+ "#{modules.join('/')}/#{name}"
16
+ end
17
+
18
+ template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def name
24
+ @name ||= model.split('/').last.underscore.pluralize
25
+ end
26
+
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
34
+
35
+ def class_modules
36
+ return if modules.length.zero?
37
+
38
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
39
+ end
40
+ end
41
+ 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
@@ -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
@@ -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
@@ -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
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
@@ -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.0'
5
+ VERSION = '0.8.2'
6
6
  end
7
7
  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.0
4
+ version: 0.8.2
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-07-27 00:00:00.000000000 Z
13
+ date: 2021-08-12 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: activesupport
@@ -17,14 +18,14 @@ 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
@@ -45,56 +46,56 @@ dependencies:
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: []
@@ -191,7 +207,21 @@ files:
191
207
  - MIT-LICENSE
192
208
  - README.md
193
209
  - Rakefile
194
- - lib/generators/sn_foil/sn_foil_generator.rb
210
+ - lib/generators/sn_foil/all/all_generator.rb
211
+ - lib/generators/sn_foil/context/context_generator.rb
212
+ - lib/generators/sn_foil/context/templates/context.erb
213
+ - lib/generators/sn_foil/controller/controller_generator.rb
214
+ - lib/generators/sn_foil/controller/templates/api_controller.erb
215
+ - lib/generators/sn_foil/controller/templates/controller.erb
216
+ - lib/generators/sn_foil/jsonapi_deserializer/jsonapi_deserializer_generator.rb
217
+ - lib/generators/sn_foil/jsonapi_deserializer/templates/jsonapi_deserializer.erb
218
+ - lib/generators/sn_foil/jsonapi_serializer/jsonapi_serializer_generator.rb
219
+ - lib/generators/sn_foil/jsonapi_serializer/templates/jsonapi_serializer.erb
220
+ - lib/generators/sn_foil/policy/policy_generator.rb
221
+ - lib/generators/sn_foil/policy/templates/policy.erb
222
+ - lib/generators/sn_foil/searcher/searcher_generator.rb
223
+ - lib/generators/sn_foil/searcher/templates/searcher.erb
224
+ - lib/sn_foil/configuration/lazy_jsonapi_serializer.rb
195
225
  - lib/sn_foil/controller/api.rb
196
226
  - lib/sn_foil/controller/base.rb
197
227
  - lib/sn_foil/controller/concerns/change_controller_concern.rb
@@ -208,7 +238,7 @@ files:
208
238
  - lib/sn_foil/rails/version.rb
209
239
  - lib/sn_foil/searcher.rb
210
240
  - lib/snfoil-rails.rb
211
- homepage: https://github.com/howeszy/snfoil-rails
241
+ homepage: https://github.com/limited-effort/snfoil-rails
212
242
  licenses:
213
243
  - MIT
214
244
  metadata: {}
@@ -220,14 +250,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
220
250
  requirements:
221
251
  - - ">="
222
252
  - !ruby/object:Gem::Version
223
- version: '0'
253
+ version: 2.5.0
224
254
  required_rubygems_version: !ruby/object:Gem::Requirement
225
255
  requirements:
226
256
  - - ">="
227
257
  - !ruby/object:Gem::Version
228
258
  version: '0'
229
259
  requirements: []
230
- rubygems_version: 3.0.3
260
+ rubygems_version: 3.1.6
231
261
  signing_key:
232
262
  specification_version: 4
233
263
  summary: Additional functionality gem for using SnFoil with Rails
@@ -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