snfoil 1.0.0 → 1.1.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: 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: []