passpartu 1.1.0 → 1.2.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: f9a34533883b1c070612ecd73c34299a9c05f899e31256b8f51f0b9edf50c6e4
4
- data.tar.gz: 625c359af9f1d4560f28d63fe47b426351f1cf7f5e0f68da3e7aaafb2bfec08f
3
+ metadata.gz: 1a282e26dea8142a8ad36151367612a9bfbc3ad0e4c116d87343e93f7e8301a9
4
+ data.tar.gz: 0dc7b495c6b574a3ca83328e1014e948cbf2993b9fe97cbed192cfb0756b91a6
5
5
  SHA512:
6
- metadata.gz: bb08f025f855506ea084cf9010dddb38d6f9f499d12e837fb015bf061163b48b86312da2e20e3a223559ebf1800b1fd332adfecb7769e52e6fcd3cbbd503f717
7
- data.tar.gz: b10e9806c7eb0dee1e0332b5f651a4ab82da93a52cf1c955681f3d3c5be9cb32fd4346dd18da26f5d7af78c0a6876b289ce075a01a1ba2049a5becd0f5d25afe
6
+ metadata.gz: 73f3c5177366551d7101dd0873e17c6f13dd76b5fb682c0b6b55f07514c9329c728f4e1c5f83c136c7875f5b59968278ad86707010a8b5874b5f4ffdcc386071
7
+ data.tar.gz: 43ac9dcdc2d90c3db00e781277abdd544a748cab17a2548de57a6d206d1605302cf93e7a9ab90ddb390f90a2bd8878d92663fd363c99017f4bbe3bc4444f90c8
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Passpartu v1.1.0 - [changelog](https://github.com/coaxsoft/passpartu/blob/master/CHANGELOG.md)
1
+ # Passpartu - [changelog](https://github.com/coaxsoft/passpartu/blob/master/CHANGELOG.md)
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/passpartu.png)](https://badge.fury.io/rb/passpartu)
2
4
 
3
5
  Passpartu makes policies great again (works awesome with [Pundit](https://rubygems.org/gems/pundit)).
4
6
 
@@ -85,7 +87,6 @@ It's possible to use `crud` key to set values for `create`, `read`, `update`, `d
85
87
 
86
88
  In case `crud: true` and `delete: false` - result `false`
87
89
 
88
-
89
90
  ### Only
90
91
 
91
92
  It's possible to include specific roles to checks
@@ -158,6 +159,25 @@ Check user roles AND policy rule
158
159
  user_agent.agent_can?(:orders, :edit, except: [:admin, :manager]) { user_agent.orders.include?(order) }
159
160
  ```
160
161
 
162
+ ### 'Maybe' option
163
+
164
+ Option 'maybe' means that user can do something if the block returns true. In this case block is required
165
+ and error is raised when option is maybe and no block given.
166
+
167
+ ```yml
168
+ manager:
169
+ products:
170
+ create: true
171
+ delete: false
172
+ bookings:
173
+ update: maybe
174
+ ```
175
+
176
+ ```ruby
177
+ manager.can?(:bookings, :update) # raises error
178
+ manager.can?(:bookings, :update) { user.bookings.include?(booking) } # returns true or false
179
+ ```
180
+
161
181
  ### Waterfall check
162
182
 
163
183
  Allow or restrict absolutely everything for particular role or/and particular domain.
@@ -2,11 +2,21 @@
2
2
 
3
3
  module Passpartu
4
4
  class BlockVerify < ::Passpartu::Verify
5
+ class BlockMissedError < StandardError; end
6
+ MAYBE_VALUE = 'maybe'
7
+
5
8
  def call
6
9
  policy_result = super
10
+ raise BlockMissedError, "Block is required for 'maybe' allowed resource" if maybe? && block.nil?
7
11
  return policy_result if block.nil?
8
12
 
9
13
  policy_result && block.call
10
14
  end
15
+
16
+ private
17
+
18
+ def maybe?
19
+ result == MAYBE_VALUE
20
+ end
11
21
  end
12
22
  end
@@ -3,6 +3,7 @@
3
3
  module Passpartu
4
4
  class ValidateResult
5
5
  class PolicyMissedError < StandardError; end
6
+ class InvalidResultError < StandardError; end
6
7
 
7
8
  attr_reader :result
8
9
 
@@ -15,20 +16,20 @@ module Passpartu
15
16
  end
16
17
 
17
18
  def call
18
- raise PolicyMissedError if raise_error?
19
- return false unless boolean?
19
+ raise PolicyMissedError if raise_policy_missed_error?
20
+ return false if result_not_defined?
20
21
 
21
22
  result
22
23
  end
23
24
 
24
25
  private
25
26
 
26
- def boolean?
27
- [true, false].include?(result)
27
+ def raise_policy_missed_error?
28
+ result_not_defined? && Passpartu.config.raise_policy_missed_error
28
29
  end
29
30
 
30
- def raise_error?
31
- !boolean? && Passpartu.config.raise_policy_missed_error
31
+ def result_not_defined?
32
+ result.nil? || result.is_a?(Hash)
32
33
  end
33
34
  end
34
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'byebug'
2
+
3
3
  module Passpartu
4
4
  class Verify
5
5
  CRUD_KEY = 'crud'
@@ -31,12 +31,10 @@ module Passpartu
31
31
 
32
32
  validate_result
33
33
  rescue StandardError => e
34
- if ['TrueClass does not have #dig method', 'FalseClass does not have #dig method'].include?(e.message)
35
- raise WaterfallError,
36
- "Looks like you want to use check_waterfall feature, but it's set to 'false'. Otherwise check your #{Passpartu.config.policy_file} for validness"
37
- else
38
- raise e
39
- end
34
+ raise e unless ['TrueClass does not have #dig method', 'FalseClass does not have #dig method'].include?(e.message)
35
+
36
+ raise WaterfallError,
37
+ "Looks like you want to use check_waterfall feature, but it's set to 'false'. Otherwise check your #{Passpartu.config.policy_file} for validness"
40
38
  end
41
39
 
42
40
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Passpartu
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
data/lib/passpartu.rb CHANGED
@@ -83,6 +83,8 @@ module Passpartu
83
83
  value.define_singleton_method(:dig) { |*_keys| true }
84
84
  when false
85
85
  value.define_singleton_method(:dig) { |*_keys| false }
86
+ when 'maybe'
87
+ value.define_singleton_method(:dig) { |*_keys| 'maybe' }
86
88
  else
87
89
  patch_policy_booleans_if(value)
88
90
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passpartu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OrestF
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-28 00:00:00.000000000 Z
11
+ date: 2023-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -145,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  requirements: []
148
- rubygems_version: 3.3.7
148
+ rubygems_version: 3.4.6
149
149
  signing_key:
150
150
  specification_version: 4
151
151
  summary: Passpartu makes policies great again