clean-policy 0.2.0 → 0.3.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: 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"