snfoil 1.0.0 → 1.1.0

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: 3b50bcce10754bd9711d6daa1b2eaf92d44c07c510f27bdd4e2ee109088dda99
4
- data.tar.gz: 8b0cea1a364c57aaf106d52dd0b11b57c00cb42a8269243037086fd5c650df43
3
+ metadata.gz: 3500d78488d532373cb7c2c92d96b088f03d63a911068bdb701ae0edf747ad4a
4
+ data.tar.gz: 7cbb265e59f7281f5d0e5f63474a66f2269bccfd9cffa6bc611c9ed0d494957b
5
5
  SHA512:
6
- metadata.gz: 60c7fd860eb074eca2426175bb01c92c18489554e1cc0cf64c8772ac0f46d899ebcf8780fb5fe5cf9dc23a74cfa13309b838c9941d16c9a5fa58bc36af3a6f58
7
- data.tar.gz: ef8c4a3f103c812707470a1bd9b6e2c2b244c89fb1cc1880b0d054262331fa8ded97b66cb01b81149a5d2988899f0cb9ffa8597339c444af9db84b61ea9ffaf8
6
+ metadata.gz: 94cf8d81536f89f3dc633cf6fae71d4e73105fdee3f975d148d7c44e576da47293bc1293078bf8b92d4c684988a1ba07db0289ad5e3910dba1338ae57786cba2
7
+ data.tar.gz: 901c5055ef1c7e191e6232c11cb0371d049d688378ab3bbc3683808b1c46d7ceed3da919b9c01d736ed3890183c98983e085679aba5dd959717413cb681d65f4
data/Gemfile CHANGED
@@ -4,3 +4,15 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in snfoil.gemspec
6
6
  gemspec
7
+
8
+ group :development, :test do
9
+ gem 'bundle-audit', '~> 0.1.0'
10
+ gem 'dry-struct', '~> 1.0'
11
+ gem 'fasterer', '~> 0.10.0'
12
+ gem 'pry-byebug', '~> 3.9', platform: :mri
13
+ gem 'rake', '~> 13.0'
14
+ gem 'rspec', '~> 3.9'
15
+ gem 'rubocop', '1.33'
16
+ gem 'rubocop-performance', '1.14.3'
17
+ gem 'rubocop-rspec', '2.12.1'
18
+ end
@@ -27,12 +27,22 @@ module SnFoil
27
27
  include SetupContext
28
28
 
29
29
  interval :setup_build
30
+ interval :before_build
30
31
 
31
32
  setup_build do |**options|
32
- params = options.fetch(:params) { {} }
33
- options[:object] ||= options.fetch(:model) { model }.new
33
+ next options if options[:object]
34
34
 
35
- wrap_object(options[:object]).attributes = params
35
+ options[:object] ||= if options[:id]
36
+ options.fetch(:scope) { scope.resolve }.find(options[:id])
37
+ else
38
+ options.fetch(:model) { model }.new
39
+ end
40
+
41
+ options
42
+ end
43
+
44
+ before_build do |**options|
45
+ wrap_object(options[:object]).attributes = options.fetch(:params) { {} }
36
46
 
37
47
  options
38
48
  end
@@ -41,7 +51,7 @@ module SnFoil
41
51
  options[:action] = :build
42
52
  options = run_interval(:setup, **options)
43
53
  options = run_interval(:setup_build, **options)
44
- options[:object]
54
+ run_interval(:before_build, **options)
45
55
  end
46
56
  end
47
57
  end
@@ -27,7 +27,7 @@ module SnFoil
27
27
 
28
28
  intervals :setup_change, :before_change, :after_change, :after_change_success, :after_change_failure
29
29
 
30
- setup_change do |options|
30
+ setup_change do |**options|
31
31
  options[:pre_change_context_params] ||= options[:params]
32
32
  options[:params] = options[:params].select { |params| self.class.i_params.include?(params) } if self.class.i_params
33
33
 
@@ -28,15 +28,16 @@ module SnFoil
28
28
 
29
29
  action :create, with: :create_action
30
30
 
31
- setup_create { |options| run_interval(:setup, **options) }
32
- setup_create { |options| run_interval(:setup_build, **options) }
33
- setup_create { |options| run_interval(:setup_change, **options) }
34
- before_create { |options| run_interval(:before_change, **options) }
35
- after_create_success { |options| run_interval(:after_change_success, **options) }
36
- after_create_failure { |options| run_interval(:after_change_failure, **options) }
37
- after_create { |options| run_interval(:after_change, **options) }
38
-
39
- def create_action(options)
31
+ setup_create { |**options| run_interval(:setup, **options) }
32
+ setup_create { |**options| run_interval(:setup_build, **options) }
33
+ setup_create { |**options| run_interval(:setup_change, **options) }
34
+ before_create { |**options| run_interval(:before_build, **options) }
35
+ before_create { |**options| run_interval(:before_change, **options) }
36
+ after_create_success { |**options| run_interval(:after_change_success, **options) }
37
+ after_create_failure { |**options| run_interval(:after_change_failure, **options) }
38
+ after_create { |**options| run_interval(:after_change, **options) }
39
+
40
+ def create_action(**options)
40
41
  wrap_object(options[:object]).save
41
42
  end
42
43
  end
@@ -29,26 +29,26 @@ module SnFoil
29
29
 
30
30
  action :destroy, with: :destroy_action
31
31
 
32
- setup_destroy { |options| run_interval(:setup, **options) }
33
- setup_destroy { |options| run_interval(:setup_change, **options) }
34
- before_destroy { |options| run_interval(:before_change, **options) }
35
- after_destroy_success { |options| run_interval(:after_change_success, **options) }
36
- after_destroy_failure { |options| run_interval(:after_change_failure, **options) }
37
- after_destroy { |options| run_interval(:after_change, **options) }
38
-
39
- setup_destroy do |options|
32
+ setup_destroy { |**options| run_interval(:setup, **options) }
33
+ setup_destroy { |**options| run_interval(:setup_change, **options) }
34
+ before_destroy { |**options| run_interval(:before_change, **options) }
35
+ after_destroy_success { |**options| run_interval(:after_change_success, **options) }
36
+ after_destroy_failure { |**options| run_interval(:after_change_failure, **options) }
37
+ after_destroy { |**options| run_interval(:after_change, **options) }
38
+
39
+ setup_destroy do |**options|
40
40
  raise ArgumentError, 'one of the following keywords is required: id, object' unless options[:id] || options[:object]
41
41
 
42
42
  options
43
43
  end
44
44
 
45
- before_destroy do |options|
46
- options[:object] ||= scope.resolve.find(options[:id])
45
+ before_change do |**options|
46
+ options[:object] ||= options.fetch(:scope) { scope.resolve }.find(options[:id])
47
47
 
48
48
  options
49
49
  end
50
50
 
51
- def destroy_action(options)
51
+ def destroy_action(**options)
52
52
  wrap_object(options[:object]).destroy
53
53
  end
54
54
  end
@@ -27,11 +27,11 @@ module SnFoil
27
27
 
28
28
  action :index, with: :index_action
29
29
 
30
- setup_index { |options| run_interval(:setup, **options) }
30
+ setup_index { |**options| run_interval(:setup, **options) }
31
31
 
32
- before_index do |options|
32
+ before_index do |**options|
33
33
  options[:object] ||= options.fetch(:searcher) { self.class.snfoil_searcher }
34
- .new(scope: scope.resolve)
34
+ .new(scope: options.fetch(:scope) { scope.resolve })
35
35
  .search(options.fetch(:params) { {} })
36
36
 
37
37
  options
@@ -29,10 +29,13 @@ module SnFoil
29
29
 
30
30
  interval :setup
31
31
 
32
- authorize do |options|
33
- options.fetch(:policy) { policy }
34
- .new(entity, options[:object], **options)
35
- .send(options.fetch(:authorize) { "#{options[:action]}?" })
32
+ authorize do |**options|
33
+ authentication_policy = options.fetch(:policy) { policy }
34
+ authentication_action = options.fetch(:authorize) { "#{options[:action]}?" }
35
+ next true if authentication_policy.new(entity, options[:object], **options).send(authentication_action)
36
+
37
+ raise SnFoil::AuthorizationError,
38
+ "#{entity ? entity&.class : 'Unknown'}: #{entity&.id} is not allowed to #{authentication_action} on #{authentication_policy}"
36
39
  end
37
40
  end
38
41
 
@@ -60,8 +63,8 @@ module SnFoil
60
63
  self.class.snfoil_policy
61
64
  end
62
65
 
63
- def scope(_object_class = nil, **options)
64
- "#{policy.name}::Scope".safe_constantize.new(wrap_object(model), entity, **options)
66
+ def scope
67
+ "#{policy.name}::Scope".safe_constantize.new(entity, wrap_object(model))
65
68
  end
66
69
 
67
70
  def wrap_object(object)
@@ -27,23 +27,23 @@ module SnFoil
27
27
 
28
28
  action :show, with: :show_action
29
29
 
30
- setup_show do |options|
30
+ setup_show do |**options|
31
31
  raise ArgumentError, 'one of the following keywords is required: id, object' unless options[:id] || options[:object]
32
32
 
33
33
  options
34
34
  end
35
35
 
36
- setup_show do |options|
36
+ setup_show do |**options|
37
37
  run_interval(:setup, **options)
38
38
  end
39
39
 
40
40
  before_show do |**options|
41
- options[:object] ||= scope.resolve.find(options[:id])
41
+ options[:object] ||= options.fetch(:scope) { scope.resolve }.find(options[:id])
42
42
 
43
43
  options
44
44
  end
45
45
 
46
- def show_action(options)
46
+ def show_action(**options)
47
47
  options[:object]
48
48
  end
49
49
  end
@@ -24,34 +24,27 @@ module SnFoil
24
24
  extend ActiveSupport::Concern
25
25
 
26
26
  included do
27
- include SetupContext
27
+ include BuildContext
28
28
  include ChangeContext
29
29
 
30
30
  action :update, with: :update_action
31
31
 
32
- setup_update { |options| run_interval(:setup, **options) }
33
- setup_update { |options| run_interval(:setup_change, **options) }
34
- before_update { |options| run_interval(:before_change, **options) }
35
- after_update_success { |options| run_interval(:after_change_success, **options) }
36
- after_update_failure { |options| run_interval(:after_change_failure, **options) }
37
- after_update { |options| run_interval(:after_change, **options) }
38
-
39
- setup_update do |options|
32
+ setup_update do |**options|
40
33
  raise ArgumentError, 'one of the following keywords is required: id, object' unless options[:id] || options[:object]
41
34
 
42
35
  options
43
36
  end
44
37
 
45
- before_update do |options|
46
- params = options.fetch(:params) { {} }
47
- options[:object] ||= scope.resolve.find(options[:id])
48
-
49
- wrap_object(options[:object]).attributes = params
50
-
51
- options
52
- end
38
+ setup_update { |**options| run_interval(:setup, **options) }
39
+ setup_update { |**options| run_interval(:setup_build, **options) }
40
+ setup_update { |**options| run_interval(:setup_change, **options) }
41
+ before_update { |**options| run_interval(:before_build, **options) }
42
+ before_update { |**options| run_interval(:before_change, **options) }
43
+ after_update_success { |**options| run_interval(:after_change_success, **options) }
44
+ after_update_failure { |**options| run_interval(:after_change_failure, **options) }
45
+ after_update { |**options| run_interval(:after_change, **options) }
53
46
 
54
- def update_action(options)
47
+ def update_action(**options)
55
48
  wrap_object(options[:object]).save
56
49
  end
57
50
  end
@@ -15,5 +15,5 @@
15
15
  # limitations under the License.
16
16
 
17
17
  module SnFoil
18
- VERSION = '1.0.0'
18
+ VERSION = '1.1.0'
19
19
  end
data/lib/snfoil.rb CHANGED
@@ -37,6 +37,7 @@ require_relative 'snfoil/adapters/orms/active_record'
37
37
 
38
38
  module SnFoil
39
39
  class Error < StandardError; end
40
+ class AuthorizationError < SnFoil::Error; end
40
41
 
41
42
  mattr_accessor :orm, default: 'active_record'
42
43
  mattr_writer :logger
data/snfoil.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'A collection of SnFoil gems and additional helper classes'
13
13
  spec.homepage = 'https://github.com/limited-effort/snfoil'
14
14
  spec.license = 'Apache-2.0'
15
- spec.required_ruby_version = '>= 2.7'
15
+ spec.required_ruby_version = '>= 2.6'
16
16
 
17
17
  spec.metadata['homepage_uri'] = spec.homepage
18
18
  spec.metadata['source_code_uri'] = spec.homepage
@@ -31,17 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency 'activesupport', '>= 5.2.6'
32
32
  spec.add_dependency 'logger', '~> 1.0'
33
33
  spec.add_dependency 'pundit', '~> 2.0'
34
- spec.add_dependency 'snfoil-context', '~> 1.0'
35
- spec.add_dependency 'snfoil-policy', '~> 1.0'
36
- spec.add_dependency 'snfoil-searcher', '~> 1.0'
37
-
38
- spec.add_development_dependency 'bundle-audit', '~> 0.1.0'
39
- spec.add_development_dependency 'dry-struct', '~> 1.0'
40
- spec.add_development_dependency 'fasterer', '~> 0.10.0'
41
- spec.add_development_dependency 'pry-byebug', '~> 3.9'
42
- spec.add_development_dependency 'rake', '~> 13.0'
43
- spec.add_development_dependency 'rspec', '~> 3.9'
44
- spec.add_development_dependency 'rubocop', '~> 1.29'
45
- spec.add_development_dependency 'rubocop-performance', '~> 1.11'
46
- spec.add_development_dependency 'rubocop-rspec', '~> 2.4'
34
+ spec.add_dependency 'snfoil-context', '>= 1.1.0', '< 2.0'
35
+ spec.add_dependency 'snfoil-policy', '>= 1.1.0', '< 2.0'
36
+ spec.add_dependency 'snfoil-searcher', '>= 1.1.0', '< 2.0'
47
37
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
8
8
  - Danny Murphy
9
9
  - Cliff Campbell
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-05-18 00:00:00.000000000 Z
13
+ date: 2022-10-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -58,170 +58,62 @@ dependencies:
58
58
  name: snfoil-context
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: '1.0'
64
- type: :runtime
65
- prerelease: false
66
- version_requirements: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - "~>"
69
- - !ruby/object:Gem::Version
70
- version: '1.0'
71
- - !ruby/object:Gem::Dependency
72
- name: snfoil-policy
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - "~>"
61
+ - - ">="
76
62
  - !ruby/object:Gem::Version
77
- version: '1.0'
78
- type: :runtime
79
- prerelease: false
80
- version_requirements: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - "~>"
63
+ version: 1.1.0
64
+ - - "<"
83
65
  - !ruby/object:Gem::Version
84
- version: '1.0'
85
- - !ruby/object:Gem::Dependency
86
- name: snfoil-searcher
87
- requirement: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - "~>"
90
- - !ruby/object:Gem::Version
91
- version: '1.0'
66
+ version: '2.0'
92
67
  type: :runtime
93
68
  prerelease: false
94
69
  version_requirements: !ruby/object:Gem::Requirement
95
70
  requirements:
96
- - - "~>"
97
- - !ruby/object:Gem::Version
98
- version: '1.0'
99
- - !ruby/object:Gem::Dependency
100
- name: bundle-audit
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - "~>"
104
- - !ruby/object:Gem::Version
105
- version: 0.1.0
106
- type: :development
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: 0.1.0
113
- - !ruby/object:Gem::Dependency
114
- name: dry-struct
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '1.0'
120
- type: :development
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - "~>"
125
- - !ruby/object:Gem::Version
126
- version: '1.0'
127
- - !ruby/object:Gem::Dependency
128
- name: fasterer
129
- requirement: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - "~>"
71
+ - - ">="
132
72
  - !ruby/object:Gem::Version
133
- version: 0.10.0
134
- type: :development
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - "~>"
73
+ version: 1.1.0
74
+ - - "<"
139
75
  - !ruby/object:Gem::Version
140
- version: 0.10.0
76
+ version: '2.0'
141
77
  - !ruby/object:Gem::Dependency
142
- name: pry-byebug
78
+ name: snfoil-policy
143
79
  requirement: !ruby/object:Gem::Requirement
144
80
  requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: '3.9'
148
- type: :development
149
- prerelease: false
150
- version_requirements: !ruby/object:Gem::Requirement
151
- requirements:
152
- - - "~>"
81
+ - - ">="
153
82
  - !ruby/object:Gem::Version
154
- version: '3.9'
155
- - !ruby/object:Gem::Dependency
156
- name: rake
157
- requirement: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - "~>"
83
+ version: 1.1.0
84
+ - - "<"
160
85
  - !ruby/object:Gem::Version
161
- version: '13.0'
162
- type: :development
86
+ version: '2.0'
87
+ type: :runtime
163
88
  prerelease: false
164
89
  version_requirements: !ruby/object:Gem::Requirement
165
90
  requirements:
166
- - - "~>"
91
+ - - ">="
167
92
  - !ruby/object:Gem::Version
168
- version: '13.0'
169
- - !ruby/object:Gem::Dependency
170
- name: rspec
171
- requirement: !ruby/object:Gem::Requirement
172
- requirements:
173
- - - "~>"
93
+ version: 1.1.0
94
+ - - "<"
174
95
  - !ruby/object:Gem::Version
175
- version: '3.9'
176
- type: :development
177
- prerelease: false
178
- version_requirements: !ruby/object:Gem::Requirement
179
- requirements:
180
- - - "~>"
181
- - !ruby/object:Gem::Version
182
- version: '3.9'
96
+ version: '2.0'
183
97
  - !ruby/object:Gem::Dependency
184
- name: rubocop
98
+ name: snfoil-searcher
185
99
  requirement: !ruby/object:Gem::Requirement
186
100
  requirements:
187
- - - "~>"
188
- - !ruby/object:Gem::Version
189
- version: '1.29'
190
- type: :development
191
- prerelease: false
192
- version_requirements: !ruby/object:Gem::Requirement
193
- requirements:
194
- - - "~>"
101
+ - - ">="
195
102
  - !ruby/object:Gem::Version
196
- version: '1.29'
197
- - !ruby/object:Gem::Dependency
198
- name: rubocop-performance
199
- requirement: !ruby/object:Gem::Requirement
200
- requirements:
201
- - - "~>"
103
+ version: 1.1.0
104
+ - - "<"
202
105
  - !ruby/object:Gem::Version
203
- version: '1.11'
204
- type: :development
106
+ version: '2.0'
107
+ type: :runtime
205
108
  prerelease: false
206
109
  version_requirements: !ruby/object:Gem::Requirement
207
110
  requirements:
208
- - - "~>"
209
- - !ruby/object:Gem::Version
210
- version: '1.11'
211
- - !ruby/object:Gem::Dependency
212
- name: rubocop-rspec
213
- requirement: !ruby/object:Gem::Requirement
214
- requirements:
215
- - - "~>"
111
+ - - ">="
216
112
  - !ruby/object:Gem::Version
217
- version: '2.4'
218
- type: :development
219
- prerelease: false
220
- version_requirements: !ruby/object:Gem::Requirement
221
- requirements:
222
- - - "~>"
113
+ version: 1.1.0
114
+ - - "<"
223
115
  - !ruby/object:Gem::Version
224
- version: '2.4'
116
+ version: '2.0'
225
117
  description: A collection of SnFoil gems and additional helper classes
226
118
  email:
227
119
  - howeszy@gmail.com
@@ -265,7 +157,7 @@ metadata:
265
157
  source_code_uri: https://github.com/limited-effort/snfoil
266
158
  changelog_uri: https://github.com/limited-effort/snfoil/blob/main/CHANGELOG.md
267
159
  rubygems_mfa_required: 'true'
268
- post_install_message:
160
+ post_install_message:
269
161
  rdoc_options: []
270
162
  require_paths:
271
163
  - lib
@@ -273,15 +165,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
273
165
  requirements:
274
166
  - - ">="
275
167
  - !ruby/object:Gem::Version
276
- version: '2.7'
168
+ version: '2.6'
277
169
  required_rubygems_version: !ruby/object:Gem::Requirement
278
170
  requirements:
279
171
  - - ">="
280
172
  - !ruby/object:Gem::Version
281
173
  version: '0'
282
174
  requirements: []
283
- rubygems_version: 3.1.6
284
- signing_key:
175
+ rubygems_version: 3.3.7
176
+ signing_key:
285
177
  specification_version: 4
286
178
  summary: A Toolbox of Context Behaviors
287
179
  test_files: []