passpartu 1.1.0 → 1.2.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: 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