snfoil 1.0.1 → 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: e8fa54e4f8d1475e59b1ab6342b416ee6f65601ab31aaa6802595766cc132af3
4
- data.tar.gz: 709ccd2aacb1394f02148a168cb005342c15a3d3ccb39d497437e8194f24199a
3
+ metadata.gz: 3500d78488d532373cb7c2c92d96b088f03d63a911068bdb701ae0edf747ad4a
4
+ data.tar.gz: 7cbb265e59f7281f5d0e5f63474a66f2269bccfd9cffa6bc611c9ed0d494957b
5
5
  SHA512:
6
- metadata.gz: a7be8ed848634ed8b3525704ff27637dd3cf962d1a9ba9ad37c78e237a69242d2cd0ff405e5833be87a092cf62a59196f5740808de7a1514924b36f21ba819d1
7
- data.tar.gz: fe1118cf8c61c8ce36a7ef8419332586b40de3d52b6c5f7fe2b1d068cfc4159e8d7fcd3c6b905dee6f0dda2347a40a2f4285cbf5074a6b9dfe563967b5e91290
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)
64
- "#{policy.name}::Scope".safe_constantize.new(wrap_object(model), entity)
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.1'
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
@@ -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.1', '< 2.0'
35
- spec.add_dependency 'snfoil-policy', '>= 1.0.1', '< 2.0'
36
- spec.add_dependency 'snfoil-searcher', '>= 1.0.1', '< 2.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.33'
45
- spec.add_development_dependency 'rubocop-performance', '1.14.3'
46
- spec.add_development_dependency 'rubocop-rspec', '2.12.1'
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-08-08 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
@@ -60,7 +60,7 @@ dependencies:
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- version: 1.0.1
63
+ version: 1.1.0
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '2.0'
@@ -70,7 +70,7 @@ dependencies:
70
70
  requirements:
71
71
  - - ">="
72
72
  - !ruby/object:Gem::Version
73
- version: 1.0.1
73
+ version: 1.1.0
74
74
  - - "<"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '2.0'
@@ -80,7 +80,7 @@ dependencies:
80
80
  requirements:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: 1.0.1
83
+ version: 1.1.0
84
84
  - - "<"
85
85
  - !ruby/object:Gem::Version
86
86
  version: '2.0'
@@ -90,7 +90,7 @@ dependencies:
90
90
  requirements:
91
91
  - - ">="
92
92
  - !ruby/object:Gem::Version
93
- version: 1.0.1
93
+ version: 1.1.0
94
94
  - - "<"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.0'
@@ -100,7 +100,7 @@ dependencies:
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 1.0.1
103
+ version: 1.1.0
104
104
  - - "<"
105
105
  - !ruby/object:Gem::Version
106
106
  version: '2.0'
@@ -110,136 +110,10 @@ dependencies:
110
110
  requirements:
111
111
  - - ">="
112
112
  - !ruby/object:Gem::Version
113
- version: 1.0.1
113
+ version: 1.1.0
114
114
  - - "<"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '2.0'
117
- - !ruby/object:Gem::Dependency
118
- name: bundle-audit
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: 0.1.0
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: 0.1.0
131
- - !ruby/object:Gem::Dependency
132
- name: dry-struct
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '1.0'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: '1.0'
145
- - !ruby/object:Gem::Dependency
146
- name: fasterer
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: 0.10.0
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: 0.10.0
159
- - !ruby/object:Gem::Dependency
160
- name: pry-byebug
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: '3.9'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '3.9'
173
- - !ruby/object:Gem::Dependency
174
- name: rake
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '13.0'
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - "~>"
185
- - !ruby/object:Gem::Version
186
- version: '13.0'
187
- - !ruby/object:Gem::Dependency
188
- name: rspec
189
- requirement: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - "~>"
192
- - !ruby/object:Gem::Version
193
- version: '3.9'
194
- type: :development
195
- prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - "~>"
199
- - !ruby/object:Gem::Version
200
- version: '3.9'
201
- - !ruby/object:Gem::Dependency
202
- name: rubocop
203
- requirement: !ruby/object:Gem::Requirement
204
- requirements:
205
- - - '='
206
- - !ruby/object:Gem::Version
207
- version: '1.33'
208
- type: :development
209
- prerelease: false
210
- version_requirements: !ruby/object:Gem::Requirement
211
- requirements:
212
- - - '='
213
- - !ruby/object:Gem::Version
214
- version: '1.33'
215
- - !ruby/object:Gem::Dependency
216
- name: rubocop-performance
217
- requirement: !ruby/object:Gem::Requirement
218
- requirements:
219
- - - '='
220
- - !ruby/object:Gem::Version
221
- version: 1.14.3
222
- type: :development
223
- prerelease: false
224
- version_requirements: !ruby/object:Gem::Requirement
225
- requirements:
226
- - - '='
227
- - !ruby/object:Gem::Version
228
- version: 1.14.3
229
- - !ruby/object:Gem::Dependency
230
- name: rubocop-rspec
231
- requirement: !ruby/object:Gem::Requirement
232
- requirements:
233
- - - '='
234
- - !ruby/object:Gem::Version
235
- version: 2.12.1
236
- type: :development
237
- prerelease: false
238
- version_requirements: !ruby/object:Gem::Requirement
239
- requirements:
240
- - - '='
241
- - !ruby/object:Gem::Version
242
- version: 2.12.1
243
117
  description: A collection of SnFoil gems and additional helper classes
244
118
  email:
245
119
  - howeszy@gmail.com
@@ -298,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
298
172
  - !ruby/object:Gem::Version
299
173
  version: '0'
300
174
  requirements: []
301
- rubygems_version: 3.1.6
175
+ rubygems_version: 3.3.7
302
176
  signing_key:
303
177
  specification_version: 4
304
178
  summary: A Toolbox of Context Behaviors