snfoil 0.5.3 → 0.8.0

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: f6aa27a0dd5398b8e3abea471b5e8d3548aa4ff5239edabe7ee229306bde4787
4
- data.tar.gz: 358b5e5b46347c30768272c5f50c08aa8f61a3fb44a016f26504a700f82c2c11
3
+ metadata.gz: 5029787f4c700bd7cd9e96bab7a1dc4e7b6b026d6ccef0da1bc180c3430b72cf
4
+ data.tar.gz: d699faeb7386a4d84f04d5df66802c08ee8f788008fa5d4c9331823417c20420
5
5
  SHA512:
6
- metadata.gz: cf0c36ee0cf32bdf2f43503aec6076f8115df1f84e9cb0b954c7d58d0ea2583236d2dd7dd9dcab14f2ccb7680b8e004ae43fdcfcfc0df627681d2c1e365b077c
7
- data.tar.gz: 613b3ce470d9c567d4fa06c915a1610e8b3ad35d26691f69455dc4e95cad874497bcbf21ca40f7f717df506730f7ecbc8b0f0a297393b6dbd166c7cdf1c76d6c
6
+ metadata.gz: f42e51e0d446fb0c6eee95dde45ea50da55e41c0a1a610fb95d3145531c2ebdd41be922485d71b5c5747a42e68814526c8a5973a41ed0604b0555e2affd7db80
7
+ data.tar.gz: 85fd3b571c33e1b48efd189b13c66654bca2e5b847250b11395e0855680150924223a209adc4b46135b18cdb13c9dd4ab62e2839975c0f95cf6f183cefea3d42
data/TODO.md ADDED
@@ -0,0 +1,5 @@
1
+ # TODO
2
+ ## Tests
3
+ ### Contexts
4
+ - Add tests for propagation of :authorize in options aggregate
5
+ - Add tests for Create now using Build
data/lib/sn_foil.rb CHANGED
@@ -10,6 +10,8 @@ require_relative 'sn_foil/contexts/destroy_context'
10
10
  require_relative 'sn_foil/context'
11
11
  require_relative 'sn_foil/policy'
12
12
  require_relative 'sn_foil/searcher'
13
+ require_relative 'sn_foil/adapters/orms/base_adapter'
14
+ require_relative 'sn_foil/adapters/orms/active_record'
13
15
  require 'active_support/core_ext/module/attribute_accessors'
14
16
  require 'logger'
15
17
 
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'base_adapter'
4
+
3
5
  module SnFoil
4
6
  module Adapters
5
7
  module ORMs
6
8
  class ActiveRecord < SnFoil::Adapters::ORMs::BaseAdapter
7
- def new(*params)
8
- self.class.new(__getobj__.new(*params))
9
+ def new(**params)
10
+ self.class.new(__getobj__.new(params))
9
11
  end
10
12
 
11
13
  def all
@@ -21,9 +23,13 @@ module SnFoil
21
23
  __getobj__.destroyed?
22
24
  end
23
25
 
24
- def attributes=(*attributes)
26
+ def attributes=(attributes)
25
27
  __getobj__.attributes = attributes
26
28
  end
29
+
30
+ def is_a?(klass)
31
+ __getobj__.class.object_id == klass.object_id
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'delegate'
4
+
3
5
  module SnFoil
4
6
  module Adapters
5
7
  module ORMs
6
8
  class BaseAdapter < SimpleDelegator
7
- def new(*_params)
9
+ def new(**_params)
8
10
  raise NotImplementedError, '#new not implemented in adapter'
9
11
  end
10
12
 
@@ -20,7 +22,7 @@ module SnFoil
20
22
  raise NotImplementedError, '#destroy not implemented in adapter'
21
23
  end
22
24
 
23
- def attributes=(**_attributes)
25
+ def attributes=(_attributes)
24
26
  raise NotImplementedError, '#attributes= not implemented in adapter'
25
27
  end
26
28
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'active_support/concern'
4
4
  require_relative './setup_context'
5
- require_relative './change_context'
6
5
 
7
6
  module SnFoil
8
7
  module Contexts
@@ -11,33 +10,58 @@ module SnFoil
11
10
 
12
11
  included do
13
12
  include SetupContext
14
- include ChangeContext
15
13
  end
16
14
 
17
15
  class_methods do
16
+ attr_reader :i_setup_build_hooks
17
+
18
18
  def build(params:, entity: nil, **options)
19
19
  new(entity).build(**options, params: params)
20
20
  end
21
+
22
+ def setup_build(method = nil, **options, &block)
23
+ raise ArgumentError, '#setup_build requires either a method name or a block' if method.nil? && block.nil?
24
+
25
+ (@i_setup_build_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
26
+ end
21
27
  end
22
28
 
23
29
  def setup_build_object(params: {}, object: nil, **options)
24
- SnFoil.logger.info 'Warning: Using build bypasses authorize. It is safer to interact with models through create' unless ENV['ISTEST']
25
- return wrap_object(object) if object
30
+ object = if object
31
+ wrap_object(object)
32
+ else
33
+ klass = options.fetch(:model) { model }
34
+ wrap_object(klass).new
35
+ end
26
36
 
27
- klass = options.fetch(:model) { model }
28
- options.merge! object: wrap_object(klass).new(**params)
37
+ object.attributes = params
38
+ options.merge! object: object
29
39
  end
30
40
 
31
41
  def build(**options)
32
42
  options[:action] = :build
33
- options = setup_build(setup_change(**options))
43
+ options = before_setup_build_object(**options)
34
44
  options = setup_build_object(**options)
45
+ authorize(options[:object], options[:authorize], **options) if options[:authorize]
35
46
  unwrap_object(options[:object])
36
47
  end
37
48
 
38
49
  def setup_build(**options)
39
50
  options
40
51
  end
52
+
53
+ def setup_build_hooks
54
+ self.class.i_setup_build_hooks || []
55
+ end
56
+
57
+ private
58
+
59
+ def before_setup_build_object(**options)
60
+ options = setup(**options)
61
+ options = setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
62
+ options = setup_build(**options)
63
+ setup_build_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
64
+ end
41
65
  end
42
66
  end
43
67
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
- require_relative './setup_context'
5
4
  require_relative './change_context'
6
5
 
7
6
  module SnFoil
@@ -10,8 +9,10 @@ module SnFoil
10
9
  extend ActiveSupport::Concern
11
10
 
12
11
  included do
13
- include SetupContext
12
+ include BuildContext
14
13
  include ChangeContext
14
+
15
+ alias_method :setup_create_object, :setup_build_object
15
16
  end
16
17
 
17
18
  class_methods do
@@ -52,25 +53,14 @@ module SnFoil
52
53
  end
53
54
  end
54
55
 
55
- def setup_create_object(params: {}, object: nil, **options)
56
- object = if object
57
- wrap_object(object)
58
- else
59
- klass = options.fetch(:model) { model }
60
- wrap_object(klass).new
61
- end
62
-
63
- object.attributes = params
64
- options.merge! object: object
65
- end
66
-
67
56
  def create(**options)
68
57
  options[:action] = :create
58
+ options = before_setup_build_object(**options)
69
59
  options = before_setup_create_object(**options)
70
60
  options = setup_create_object(**options)
71
- authorize(options[:object], :create?, **options)
61
+ authorize(options[:object], options.fetch(:authorize) { :create? }, **options)
72
62
  options = create_hooks(**options)
73
- unwrap_object(options[:object])
63
+ options[:object]
74
64
  end
75
65
 
76
66
  def setup_create(**options)
@@ -116,18 +106,18 @@ module SnFoil
116
106
  private
117
107
 
118
108
  def before_setup_create_object(**options)
119
- options = setup_create(**options)
120
- options = setup_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
121
109
  options = setup_change(**options)
122
110
  options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
123
- options = setup(**options)
124
- setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
111
+ options = setup_create(**options)
112
+ setup_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
125
113
  end
126
114
 
127
115
  # This method is private to help protect the order of execution of hooks
128
116
  def create_hooks(options)
129
117
  options = before_create_save(**options)
130
- options = if options[:object].save
118
+ save_successful = options[:object].save
119
+ options.merge!(object: unwrap_object(options[:object]))
120
+ options = if save_successful
131
121
  after_create_save_success(**options)
132
122
  else
133
123
  after_create_save_failure(**options)
@@ -136,31 +126,31 @@ module SnFoil
136
126
  end
137
127
 
138
128
  def before_create_save(**options)
139
- options = before_create(**options)
140
- options = before_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
141
129
  options = before_change(**options)
142
- before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
130
+ options = before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
131
+ options = before_create(**options)
132
+ before_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
143
133
  end
144
134
 
145
135
  def after_create_save(**options)
146
- options = after_create(**options)
147
- options = after_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
148
136
  options = after_change(**options)
149
- after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
137
+ options = after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
138
+ options = after_create(**options)
139
+ after_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
150
140
  end
151
141
 
152
142
  def after_create_save_success(**options)
153
- options = after_create_success(**options)
154
- options = after_create_success_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
155
143
  options = after_change_success(**options)
156
- after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
144
+ options = after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
145
+ options = after_create_success(**options)
146
+ after_create_success_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
157
147
  end
158
148
 
159
149
  def after_create_save_failure(**options)
160
- options = after_create_failure(**options)
161
- options = after_create_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
162
150
  options = after_change_failure(**options)
163
- after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
151
+ options = after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
152
+ options = after_create_failure(**options)
153
+ after_create_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
164
154
  end
165
155
  end
166
156
  end
@@ -62,9 +62,9 @@ module SnFoil
62
62
  options[:action] = :destroy
63
63
  options = before_setup_destroy_object(**options)
64
64
  options = setup_destroy_object(**options)
65
- authorize(options[:object], :destroy?, **options)
65
+ authorize(options[:object], options.fetch(:authorize) { :destroy? }, **options)
66
66
  options = destroy_hooks(**options)
67
- unwrap_object(options[:object])
67
+ options[:object]
68
68
  end
69
69
 
70
70
  def setup_destroy(**options)
@@ -110,18 +110,20 @@ module SnFoil
110
110
  private
111
111
 
112
112
  def before_setup_destroy_object(**options)
113
- options = setup_destroy(**options)
114
- options = setup_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
113
+ options = setup(**options)
114
+ options = setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
115
115
  options = setup_change(**options)
116
116
  options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
117
- options = setup(**options)
118
- setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
117
+ options = setup_destroy(**options)
118
+ setup_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
119
119
  end
120
120
 
121
121
  # This method is private to help protect the order of execution of hooks
122
122
  def destroy_hooks(options)
123
123
  options = before_destroy_save(options)
124
- options = if options[:object].destroy
124
+ destroy_successful = options[:object].destroy
125
+ options.merge!(object: unwrap_object(options[:object]))
126
+ options = if destroy_successful
125
127
  after_destroy_save_success(options)
126
128
  else
127
129
  after_destroy_save_failure(options)
@@ -130,31 +132,31 @@ module SnFoil
130
132
  end
131
133
 
132
134
  def before_destroy_save(options)
133
- options = before_destroy(**options)
134
- options = before_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
135
135
  options = before_change(**options)
136
- before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
136
+ options = before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
137
+ options = before_destroy(**options)
138
+ before_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
137
139
  end
138
140
 
139
141
  def after_destroy_save(options)
140
- options = after_destroy(**options)
141
- options = after_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
142
142
  options = after_change(**options)
143
- after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
143
+ options = after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
144
+ options = after_destroy(**options)
145
+ after_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
144
146
  end
145
147
 
146
148
  def after_destroy_save_success(options)
147
- options = after_destroy_success(**options)
148
- options = after_destroy_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
149
149
  options = after_change_success(**options)
150
- after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
150
+ options = after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
151
+ options = after_destroy_success(**options)
152
+ after_destroy_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
151
153
  end
152
154
 
153
155
  def after_destroy_save_failure(options)
154
- options = after_destroy_failure(**options)
155
- options = after_destroy_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
156
156
  options = after_change_failure(**options)
157
- after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
157
+ options = after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
158
+ options = after_destroy_failure(**options)
159
+ after_destroy_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
158
160
  end
159
161
  end
160
162
  end
@@ -54,10 +54,10 @@ module SnFoil
54
54
  private
55
55
 
56
56
  def before_setup_index(**options)
57
- options = setup_index(**options)
58
- options = setup_index_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
59
57
  options = setup(**options)
60
- setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
58
+ options = setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
59
+ options = setup_index(**options)
60
+ setup_index_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
61
61
  end
62
62
  end
63
63
  end
@@ -51,10 +51,10 @@ module SnFoil
51
51
  private
52
52
 
53
53
  def before_setup_show(**options)
54
- options = setup_show(**options)
55
- options = setup_show_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
56
54
  options = setup(**options)
57
- setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
55
+ options = setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
56
+ options = setup_show(**options)
57
+ setup_show_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
58
58
  end
59
59
  end
60
60
  end
@@ -56,7 +56,8 @@ module SnFoil
56
56
  raise ArgumentError, 'one of the following keywords is required: id, object' unless id || object
57
57
 
58
58
  object = wrap_object(object || scope.resolve.find(id))
59
- authorize(object, :update?, **options)
59
+ authorize(object, options.fetch(:authorize) { :update? }, **options)
60
+
60
61
  object.attributes = params
61
62
  options.merge! object: object
62
63
  end
@@ -65,9 +66,9 @@ module SnFoil
65
66
  options[:action] = :update
66
67
  options = before_setup_update_object(**options)
67
68
  options = setup_update_object(**options)
68
- authorize(options[:object], :update?, **options)
69
+ authorize(options[:object], options.fetch(:authorize) { :update? }, **options)
69
70
  options = update_hooks(**options)
70
- unwrap_object(options[:object])
71
+ options[:object]
71
72
  end
72
73
 
73
74
  def setup_update(**options)
@@ -113,18 +114,20 @@ module SnFoil
113
114
  private
114
115
 
115
116
  def before_setup_update_object(**options)
116
- options = setup_update(**options)
117
- options = setup_update_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
117
+ options = setup(**options)
118
+ options = setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
118
119
  options = setup_change(**options)
119
120
  options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
120
- options = setup(**options)
121
- setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
121
+ options = setup_update(**options)
122
+ setup_update_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
122
123
  end
123
124
 
124
125
  # This method is private to help protect the order of execution of hooks
125
126
  def update_hooks(options)
126
127
  options = before_update_save(options)
127
- options = if options[:object].save
128
+ update_successful = options[:object].save
129
+ options.merge!(object: unwrap_object(options[:object]))
130
+ options = if update_successful
128
131
  after_update_save_success(options)
129
132
  else
130
133
  after_update_save_failure(options)
@@ -133,31 +136,31 @@ module SnFoil
133
136
  end
134
137
 
135
138
  def before_update_save(options)
136
- options = before_update(**options)
137
- options = before_update_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
138
139
  options = before_change(**options)
139
- before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
140
+ options = before_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
141
+ options = before_update(**options)
142
+ before_update_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
140
143
  end
141
144
 
142
145
  def after_update_save(options)
143
- options = after_update(**options)
144
- options = after_update_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
145
146
  options = after_change(**options)
146
- after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
147
+ options = after_change_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
148
+ options = after_update(**options)
149
+ after_update_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
147
150
  end
148
151
 
149
152
  def after_update_save_success(options)
150
- options = after_update_success(**options)
151
- options = after_update_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
152
153
  options = after_change_success(**options)
153
- after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
154
+ options = after_change_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
155
+ options = after_update_success(**options)
156
+ after_update_success_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
154
157
  end
155
158
 
156
159
  def after_update_save_failure(options)
157
- options = after_update_failure(**options)
158
- options = after_update_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
159
160
  options = after_change_failure(**options)
160
- after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
161
+ options = after_change_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
162
+ options = after_update_failure(**options)
163
+ after_update_failure_hooks.reduce(options) { |opts, hook| run_hook(hook, **opts) }
161
164
  end
162
165
  end
163
166
  end
@@ -7,7 +7,7 @@ module SnFoil
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  class_methods do
10
- attr_reader :i_model, :i_setup, :i_filters, :i_search_step
10
+ attr_reader :i_model, :i_setup, :i_filters, :i_search_step, :i_booleans
11
11
 
12
12
  def model(klass = nil)
13
13
  @i_model = klass
@@ -27,6 +27,11 @@ module SnFoil
27
27
  unless: options[:unless]
28
28
  }
29
29
  end
30
+
31
+ def booleans(*fields)
32
+ @i_booleans ||= []
33
+ @i_booleans |= fields.map(&:to_sym)
34
+ end
30
35
  end
31
36
 
32
37
  def model
@@ -55,6 +60,10 @@ module SnFoil
55
60
  self.class.i_filters || []
56
61
  end
57
62
 
63
+ def booleans
64
+ self.class.i_booleans || []
65
+ end
66
+
58
67
  private
59
68
 
60
69
  def apply_setup(filtered_scope, params)
@@ -90,15 +99,24 @@ module SnFoil
90
99
 
91
100
  def transform_params_booleans(params)
92
101
  params.map do |key, value|
93
- value = if value == 'true'
94
- true
95
- elsif value == 'false'
96
- false
102
+ value = if booleans.include?(key.to_sym)
103
+ value_to_boolean(value)
97
104
  else
98
105
  value
99
106
  end
100
107
  [key, value]
101
108
  end.to_h
102
109
  end
110
+
111
+ def value_to_boolean(value)
112
+ string_val = value.to_s
113
+ if value == true || %w[true 1].include?(string_val)
114
+ true
115
+ elsif value == false || %w[false 0].include?(string_val)
116
+ false
117
+ else
118
+ value
119
+ end
120
+ end
103
121
  end
104
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SnFoil
4
- VERSION = '0.5.3'
4
+ VERSION = '0.8.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.8.0
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-30 00:00:00.000000000 Z
12
+ date: 2021-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -162,6 +162,7 @@ files:
162
162
  - CODE_OF_CONDUCT.md
163
163
  - README.md
164
164
  - Rakefile
165
+ - TODO.md
165
166
  - lib/sn_foil.rb
166
167
  - lib/sn_foil/adapters/orms/active_record.rb
167
168
  - lib/sn_foil/adapters/orms/base_adapter.rb
@@ -196,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
197
  - !ruby/object:Gem::Version
197
198
  version: '0'
198
199
  requirements: []
199
- rubygems_version: 3.0.3
200
+ rubygems_version: 3.1.4
200
201
  signing_key:
201
202
  specification_version: 4
202
203
  summary: A boilerplate gem for providing basic contexts