clean-policy 0.2.0 → 0.3.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: faff212eed58fa49a34fc67bc82c48744e19537fb2f96c66cf0775cbba480b79
4
- data.tar.gz: 65fe3b90662328845e112e5d1d0044a476429e7301cc54edb363c35f3a892c19
3
+ metadata.gz: fb1734db9ce343c7fcb667d10be82ee205b3756f072670baf446a8fce1294286
4
+ data.tar.gz: 54c2c0038f3129351cd8208f3217c936f7b8acb7cb9db4ebdc9db9b6ee39816c
5
5
  SHA512:
6
- metadata.gz: eeea961ffae6212d2d8cf2af530cc862009b4d56976bb57d9cbe607eb91df1c1917de5e05b66e429f1ecedbe438f260bbdd286e25b2a9974a5dbc49ed56e5606
7
- data.tar.gz: 832a117414d81ab978b724f5aef199ea5c6d5c53047bfa2add622cfe3c2a2bf25deb8c8cd41bdc0dab802ebb75a5b354e2fe3e2ce14b0372bc154a405eef811e
6
+ metadata.gz: 24f6b064aac3dfbd6292e6b1116a0b209b432a5315f0f8239c2a84c4a3fa36d4bdb0c6b4fa79551ab9911acf501bf1cd459f93b2305c37dab7f920879e29895a
7
+ data.tar.gz: df71154dfe27bf6286fe9551bca352a367cbbeaecb1fcc341bd6a8cc031d2f0cb1d38c44fc971e70c5c40d1caffc4aaca2239a49835743df809745cd71d5c80a
data/.version CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -0,0 +1,16 @@
1
+ # # modify base policy
2
+ # # after first call in current scope :is_policy_authorized will be set to true
3
+ # # check with `Policy.is_authorized?`, resets on every page load
4
+ # class Policy
5
+ # def before action
6
+ # Lux.current.var[:is_policy_authorized] = true if defined?(Lux)
7
+ # end
8
+
9
+ # def self.is_authorized?
10
+ # Lux.current.var[:is_policy_authorized]
11
+ # end
12
+ # end
13
+
14
+ # Lux::Application.before do
15
+ # Lux.current.var[:is_policy_authorized] = false
16
+ # end
data/lib/clean-policy.rb CHANGED
@@ -3,3 +3,4 @@ require_relative './clean-policy/error'
3
3
  require_relative './clean-policy/proxy'
4
4
  require_relative './clean-policy/global'
5
5
 
6
+ # require_relative './adapters/lux' if defined?(Lux)
@@ -1,17 +1,9 @@
1
- # frozen_string_literal: true
2
-
3
- # base caller
4
- # Policy::User.new(model: @model, user: User.current).can?(:update) -> can current user update @model
5
-
6
- # block will capture error message and will triggered only if error are present
7
- # User.can?(:login) { |msg| http_error 401, "Err: #{msg}".red; return 'no access' }
8
-
9
1
  class Policy
10
2
  attr_reader :model, :user, :action
11
3
 
12
4
  def initialize model:, user:
13
5
  @model = model
14
- @user = user
6
+ @user = user || current_user
15
7
  end
16
8
 
17
9
  # pass block if you want to handle errors yourself
@@ -30,31 +22,32 @@ class Policy
30
22
  call *args, &block
31
23
  end
32
24
 
25
+ def can
26
+ Proxy.new self
27
+ end
28
+
29
+ private
30
+
33
31
  # call has to be isolated because specific of error handling
34
32
  def call *args, &block
35
- raise Error.new 'User is not defined' unless @user
33
+ raise Error, 'User is not defined, no access' unless @user
36
34
 
37
35
  return true if before(@action)
38
36
  return true if send(@action, *args)
39
- raise Error.new('Access disabled in policy')
40
- rescue Policy::Error => e
41
- error = e.message
42
- error += " - #{self.class}.#{@action}" if defined?(Lux) && Lux.config(:dump_errors)
37
+
38
+ raise Error, 'Access disabled in policy'
39
+ rescue Policy::Error => error
40
+ message = error.message
41
+ message += " - #{self.class}.#{@action}" if defined?(Lux) && Lux.config(:dump_errors)
43
42
 
44
43
  if block
45
- block.call(error)
44
+ block.call(message)
46
45
  false
47
46
  else
48
- raise Policy::Error, error
47
+ raise Policy::Error, message
49
48
  end
50
49
  end
51
50
 
52
- def can
53
- Proxy.new self
54
- end
55
-
56
- ###
57
-
58
51
  def before action
59
52
  false
60
53
  end
@@ -63,4 +56,12 @@ class Policy
63
56
  raise Policy::Error.new(message)
64
57
  end
65
58
 
59
+ # get current user from globals if globals defined
60
+ def current_user
61
+ if defined?(User) && User.respond_to?(:current)
62
+ User.current
63
+ elsif defined?(Current) && Current.respond_to?(:user)
64
+ Current.user
65
+ end
66
+ end
66
67
  end
@@ -6,8 +6,6 @@ def Policy *args
6
6
  opts.merge! args[1] if args[1]
7
7
  end
8
8
 
9
- raise ArgumentError, 'User not defined' unless opts.key?(:user)
10
-
11
9
  model = opts[:model]
12
10
 
13
11
  klass =
@@ -17,23 +15,5 @@ def Policy *args
17
15
  ApplicationPolicy
18
16
  end
19
17
 
20
- klass.new(user: opts[:user], model: model)
18
+ klass.new(user: opts[:user], model: model).can
21
19
  end
22
-
23
- # "smart" access that will fill current user if possible
24
- # fell free to overwrite this method
25
- class Object
26
- def policy *args
27
- opts = args.first.dup
28
-
29
- unless opts.is_a?(Hash)
30
- opts = { model: opts }
31
- opts.merge! args[1] if args[1]
32
- end
33
-
34
- opts[:user] ||= user_current if respond_to?(:user_current)
35
- opts[:user] ||= User.current if defined?(User) && User.respond_to?(:current)
36
-
37
- Policy opts
38
- end
39
- end
@@ -1,37 +1,26 @@
1
- # true / false
2
- # @model.can.write?
3
- #
4
- # raise error or return true
5
- # @model.can.write!
6
- #
7
- # redirect on error or return true
8
- # @model.can.write! { redirect_to '/login' }
9
-
10
1
  class Policy
11
2
  class Proxy
12
3
  def initialize policy
13
4
  @policy = policy
14
5
  end
15
6
 
16
- def method_missing name, &block
7
+ def method_missing name, *args, &block
17
8
  name = name.to_s.sub(/(.)$/, '')
18
9
  action = $1
10
+ @policy.can?(name, *args)
11
+ @policy.model || true
12
+ rescue Policy::Error => error
13
+ if block_given?
14
+ yield
15
+ return nil
16
+ end
19
17
 
20
18
  if action == '!'
21
- @policy.can?(name, &block)
22
- true
19
+ raise error
23
20
  elsif action == '?'
24
- raise "Block given, not allowed in boolean (?) policy, use bang .#{name}! { .. }" if block_given?
25
-
26
- begin
27
- @policy.can?(name)
28
- true
29
- rescue Policy::Error
30
- yield if block_given?
31
- false
32
- end
21
+ nil
33
22
  else
34
- raise ArgumentError.new('Bad policy method name')
23
+ raise ArgumentError.new('Bad policy method %s' % name)
35
24
  end
36
25
  end
37
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clean-policy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-06 00:00:00.000000000 Z
11
+ date: 2019-10-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Clean, simple explicit and strait-forward policy definitions.
14
14
  email: reic.dino@gmail.com
@@ -17,6 +17,7 @@ extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
19
  - "./.version"
20
+ - "./lib/adapters/lux.rb"
20
21
  - "./lib/clean-policy.rb"
21
22
  - "./lib/clean-policy/base.rb"
22
23
  - "./lib/clean-policy/error.rb"