snfoil-rails 0.7.0 → 0.8.2

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