snfoil 1.0.1 → 1.1.1

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: e8fa54e4f8d1475e59b1ab6342b416ee6f65601ab31aaa6802595766cc132af3
4
- data.tar.gz: 709ccd2aacb1394f02148a168cb005342c15a3d3ccb39d497437e8194f24199a
3
+ metadata.gz: 2d1a94d92d33cdf444925ed6ee9c17698756e0de24cee72d7a51f92af4d7f3bd
4
+ data.tar.gz: 3dc778d067ffc17d9637743ce1d5ad10031816447318c6803967b14b5a1d973b
5
5
  SHA512:
6
- metadata.gz: a7be8ed848634ed8b3525704ff27637dd3cf962d1a9ba9ad37c78e237a69242d2cd0ff405e5833be87a092cf62a59196f5740808de7a1514924b36f21ba819d1
7
- data.tar.gz: fe1118cf8c61c8ce36a7ef8419332586b40de3d52b6c5f7fe2b1d068cfc4159e8d7fcd3c6b905dee6f0dda2347a40a2f4285cbf5074a6b9dfe563967b5e91290
6
+ metadata.gz: 1361d4a0b1cf7b5f4e74717726dab27b02653b9a0aeea2d57f73add5e35557bd83c3009b908f8857e8a47df96bde821bd12e722e8a0447428c2cdd0e30569ef1
7
+ data.tar.gz: 1e2149d6577ab3f4d8e0dcdba6185d55530a0bc833895edf533f1ede8dba59f02c153503f3e36041416074fb06afaf00c832d698d0e9651be79cfdf5554193f7
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
+ setup_destroy 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
- before_show do |**options|
41
- options[:object] ||= scope.resolve.find(options[:id])
40
+ setup_show do |**options|
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.1'
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.1
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-11-15 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