passpartu 1.0.3 → 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: 7ff6ec8f5f35ec4a606df7c651868203f755d0d6f5b6152d23a152fa91d45126
4
- data.tar.gz: 4ed57d9ced50f0c8ab11725835be3cc2ecb37a9309433146429312d22417dd13
3
+ metadata.gz: 10de14cce11b5f7b38f3ff759c2d24b5a7044744f137b5f2e46ab65975b5b6c2
4
+ data.tar.gz: 7731b1ad92a9f96da5f54c1d2f018f0925297464c15fdfc5aa7bdc464da637a6
5
5
  SHA512:
6
- metadata.gz: c55101f249104c06a591cffa4df5126e3bf01a0f81a1bcd96d766b91d657f7997cfaebc81ae22e4da56265951ec47b751565c97a220ec17042945b9ba3e0fbb7
7
- data.tar.gz: 5618f1ecf4e1b8ad3b27f802cefd2213e65ee08125e840aa32aab603b1ca85868fc4d79464bcacf4d9be75103174cff9474c05ef8d6d3058d0fd56381cc86f69
6
+ metadata.gz: 6b5072898c8144f59252a1b74fd10c671a84b328d9920344eaf7ceca7ace5c642faea0a782cc114ec240db3552cf14549cd094a555c545566a5df5c0a46eba31
7
+ data.tar.gz: 4424887961ea98e0b405c4f0768a9c0a7a6e3280a4e131c805d0b7b5ba3aa18fa52fb826f8f0fca55e80ee10b9acdce97639b71c595a259a6b09d9486b2b8811
data/README.md CHANGED
@@ -1,11 +1,13 @@
1
- # Passpartu v1.0.3 - [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
 
5
7
  ### Tested with ruby:
6
- - 2.7.3
7
- - 3.0.0
8
8
  - 3.1.1
9
+ - 3.0.0
10
+ - 2.7.3
9
11
 
10
12
  Instead of this:
11
13
 
@@ -78,7 +80,7 @@ admin:
78
80
 
79
81
  ## Features
80
82
 
81
- #### CRUD
83
+ ### CRUD
82
84
 
83
85
  It's possible to use `crud` key to set values for `create`, `read`, `update`, `delete` at once.
84
86
  `create`, `read`, `update`, `delete` has higher priority than `crud`
@@ -86,7 +88,7 @@ It's possible to use `crud` key to set values for `create`, `read`, `update`, `d
86
88
  In case `crud: true` and `delete: false` - result `false`
87
89
 
88
90
 
89
- #### Only
91
+ ### Only
90
92
 
91
93
  It's possible to include specific roles to checks
92
94
 
@@ -109,7 +111,7 @@ Note: `only` has higher priority than `except/skip`. Do not use both.
109
111
  user_admin.can?(:orders, :edit, only: :admin, except: :admin) # returns true
110
112
  ```
111
113
 
112
- #### Skip (except)
114
+ ### Skip (except)
113
115
 
114
116
  It's possible to exclude roles from checks
115
117
 
@@ -136,7 +138,7 @@ Note: `expect` has higher priority than `skip`. Do not use both.
136
138
  user_agent.can?(:orders, :edit, skip: [:admin, :manager]) { user_agent.orders.include?(order) }
137
139
  ```
138
140
 
139
- #### Per role methods
141
+ ### Per role methods
140
142
 
141
143
  Check user roles AND policy rule
142
144
 
@@ -148,7 +150,7 @@ Check user roles AND policy rule
148
150
  user_admin.manager_can?(:orders, :edit) # false
149
151
  ```
150
152
 
151
- #### Code blocks
153
+ ### Code blocks
152
154
 
153
155
  ```ruby
154
156
  # check rules as usual AND code in the block
@@ -158,7 +160,7 @@ Check user roles AND policy rule
158
160
  user_agent.agent_can?(:orders, :edit, except: [:admin, :manager]) { user_agent.orders.include?(order) }
159
161
  ```
160
162
 
161
- #### Waterfall check
163
+ ### Waterfall check
162
164
 
163
165
  Allow or restrict absolutely everything for particular role or/and particular domain.
164
166
 
@@ -190,7 +192,7 @@ user_medium_loser.can?(:orders, :delete) # false
190
192
  user_medium_loser.can?(:products, :create) # true
191
193
  user_medium_loser.can?(:products, :create, :and_delete) # true
192
194
  ```
193
- ##### Real life example
195
+ #### Real life example
194
196
 
195
197
  You need to check custom rule for agent
196
198
 
@@ -232,6 +234,7 @@ Passpartu.configure do |config|
232
234
  config.policy_file = './config/passpartu.yml'
233
235
  config.raise_policy_missed_error = true
234
236
  config.check_waterfall = false
237
+ config.role_access_method = :role
235
238
  end
236
239
 
237
240
  ```
@@ -15,18 +15,34 @@ module Passpartu
15
15
  end
16
16
 
17
17
  def call
18
+ phash = respond_to?(:policy_hash) ? {} : Passpartu.policy
19
+ role_method = Passpartu.config.role_access_method
20
+
18
21
  klass.class_eval do
19
22
  define_method(:can?) do |*keys, only: nil, except: nil, skip: nil, &block|
20
- Passpartu::BlockVerify.call(role, keys, only: only, except: except, skip: skip, &block)
23
+ Passpartu::BlockVerify.call(
24
+ send(role_method),
25
+ keys,
26
+ only: only,
27
+ except: except,
28
+ skip: skip,
29
+ policy_hash: phash,
30
+ &block
31
+ )
21
32
  end
22
33
 
23
- Passpartu.policy.each_key do |policy_role|
34
+ phash.each_key do |policy_role|
24
35
  define_method("#{policy_role}_can?") do |*keys, only: nil, except: nil, skip: nil, &block|
25
- role.to_s == policy_role && Passpartu::BlockVerify.call(role, keys,
26
- only: only,
27
- except: except,
28
- skip: skip,
29
- &block)
36
+ send(role_method).to_s == policy_role &&
37
+ Passpartu::BlockVerify.call(
38
+ send(role_method),
39
+ keys,
40
+ only: only,
41
+ except: except,
42
+ skip: skip,
43
+ policy_hash: phash,
44
+ &block
45
+ )
30
46
  end
31
47
  end
32
48
  end
@@ -3,7 +3,7 @@
3
3
  # for testing only
4
4
 
5
5
  module Passpartu
6
- class User
6
+ class TestUser
7
7
  attr_reader :role
8
8
 
9
9
  def initialize(role)
@@ -11,11 +11,19 @@ module Passpartu
11
11
  end
12
12
  end
13
13
 
14
- class Person
14
+ class TestPerson
15
15
  attr_reader :role
16
16
 
17
17
  def initialize(role)
18
18
  @role = role
19
19
  end
20
20
  end
21
+
22
+ class TestUserWithOtherRoleMethod
23
+ attr_reader :other_role_method
24
+
25
+ def initialize(role)
26
+ @other_role_method = role
27
+ end
28
+ end
21
29
  end
@@ -4,9 +4,9 @@ module Passpartu
4
4
  class Verify
5
5
  CRUD_KEY = 'crud'
6
6
 
7
- attr_reader :role, :keys, :result, :only, :except, :block
7
+ attr_reader :role, :keys, :result, :only, :except, :block, :policy_hash
8
8
 
9
- def initialize(role, keys, only, except, skip, block)
9
+ def initialize(role, keys, only, except, skip, policy_hash, &block)
10
10
  exclusion = except || skip # alias
11
11
 
12
12
  @role = role.to_s
@@ -14,12 +14,13 @@ module Passpartu
14
14
  @only = Array(only).map(&:to_s) if present?(only)
15
15
  @except = Array(exclusion).map(&:to_s) if present?(exclusion) && !@only
16
16
  @block = block
17
+ @policy_hash = deep_stringify_keys(policy_hash)
17
18
 
18
19
  raise PolicyYmlNotFoundError if Passpartu.policy.nil?
19
20
  end
20
21
 
21
- def self.call(role, keys, only: nil, except: nil, skip: nil, &block)
22
- new(role, keys, only, except, skip, block).call
22
+ def self.call(role, keys, only: nil, except: nil, skip: nil, policy_hash: Passpartu.policy, &block)
23
+ new(role, keys, only, except, skip, policy_hash, &block).call
23
24
  end
24
25
 
25
26
  def call
@@ -48,9 +49,7 @@ module Passpartu
48
49
  end
49
50
 
50
51
  def default_check
51
- return unless policy_missed?
52
-
53
- @result = Passpartu.policy.dig(role, *keys)
52
+ @result = policy_hash.dig(role, *keys)
54
53
  end
55
54
 
56
55
  def check_crud_if
@@ -79,5 +78,11 @@ module Passpartu
79
78
  def present?(item)
80
79
  !blank?(item)
81
80
  end
81
+
82
+ def deep_stringify_keys(hash)
83
+ return hash.deep_stringify_keys if hash.respond_to?(:deep_stringify_keys)
84
+
85
+ JSON.parse(JSON.dump(hash))
86
+ end
82
87
  end
83
88
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Passpartu
4
- VERSION = '1.0.3'
4
+ VERSION = '1.1.1'
5
5
  end
data/lib/passpartu.rb CHANGED
@@ -6,7 +6,7 @@ require_relative 'passpartu/patcher'
6
6
  require_relative 'passpartu/verify'
7
7
  require_relative 'passpartu/block_verify'
8
8
  require_relative 'passpartu/validate_result'
9
- require_relative 'passpartu/user' # for testing only
9
+ require_relative 'passpartu/test_user' # for testing only
10
10
 
11
11
  module Passpartu
12
12
  class Error < StandardError; end
@@ -31,7 +31,7 @@ module Passpartu
31
31
  end
32
32
 
33
33
  class Config
34
- attr_accessor :raise_policy_missed_error
34
+ attr_accessor :raise_policy_missed_error, :role_access_method
35
35
  attr_reader :policy_file, :check_waterfall, :policy
36
36
 
37
37
  DEFAULT_POLICY_FILE = './config/passpartu.yml'
@@ -41,6 +41,7 @@ module Passpartu
41
41
  self.policy = load_policy_file(policy_file) if File.exist?(policy_file)
42
42
  @raise_policy_missed_error = true
43
43
  @check_waterfall = false
44
+ @role_access_method = :role
44
45
  end
45
46
 
46
47
  def policy_file=(file = nil)
data/passpartu.gemspec CHANGED
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.files = Dir['README.md', 'lib/**/*', 'lib/*', 'passpartu.gemspec']
40
40
 
41
41
  spec.add_development_dependency 'bundler', '~> 2.3'
42
+ spec.add_development_dependency 'byebug'
42
43
  spec.add_development_dependency 'rake', '~> 13.0'
43
44
  spec.add_development_dependency 'rspec', '~> 3.11'
44
45
  spec.add_development_dependency 'codecov', '~> 0.6'
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.0.3
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - OrestF
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-30 00:00:00.000000000 Z
11
+ date: 2023-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -107,7 +121,7 @@ files:
107
121
  - lib/passpartu.rb
108
122
  - lib/passpartu/block_verify.rb
109
123
  - lib/passpartu/patcher.rb
110
- - lib/passpartu/user.rb
124
+ - lib/passpartu/test_user.rb
111
125
  - lib/passpartu/validate_result.rb
112
126
  - lib/passpartu/verify.rb
113
127
  - lib/passpartu/version.rb
@@ -131,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
145
  - !ruby/object:Gem::Version
132
146
  version: '0'
133
147
  requirements: []
134
- rubygems_version: 3.1.6
148
+ rubygems_version: 3.4.6
135
149
  signing_key:
136
150
  specification_version: 4
137
151
  summary: Passpartu makes policies great again