egoist 0.5.0 → 0.8.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: a6b402250800b2baaa5bacd32efadb63c68a3b9364fae92523b9eb3e13bd84ef
4
- data.tar.gz: 609c7e240a70f6b33e98f1ed79c183e2a29fe466f94d49289562c905b2cb827a
3
+ metadata.gz: a44e3f68f8f1f3e96d0dfff72d58978e17f4b6dddbd0abcece9e8f2120aa6e8b
4
+ data.tar.gz: 4363ca7c24aef5f39066ad0e70d060a26df5c87e5af7f848317fba87e9d2e736
5
5
  SHA512:
6
- metadata.gz: db2aea02ff0afb797b5dc3b978553191e816df2e7a81019981fb04cbcc5a1530727de6bbe725c621b6c749d72d7b46f23d37aa49121ce8ecc7698fe3efffb632
7
- data.tar.gz: 677256afb6d61ba83ee3ce1f1f2cd6aebaa43b1328b1840f03a77f226d030b32d6bcac9a36c2368177f826e88eaa4fa65a643353eb8b009c74b3c1d6e4df1019
6
+ metadata.gz: 87725d7d4b8510cd8e4193df17c782a9a2d6cd252a2a54c973f8a78adcbcd8039ed798df893b56940b01cfdf56dc413b89eec8f6823f5cbadb0bee3522cb00ad
7
+ data.tar.gz: eb395431b15ef13eab8e8f7a732334a0e8dba87f1f48344c58967aded2336f96a159f0d069ec098fa12df940baa12e71fb3033137d4ce4ecac283bd13e34b338
data/.version CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.8.0
@@ -1,42 +1,18 @@
1
1
  klass =
2
2
  if defined? Rails
3
- ActiveController::Base
3
+ ActionController::Base
4
4
  elsif defined? Lux
5
5
  Lux::Controller
6
6
  end
7
7
 
8
8
  if klass
9
9
  klass.class_eval do
10
- def authorize *args, &block
11
- opts = {}
12
-
13
- @_is_policy_authorized = true
14
-
15
- raise ArgumentErorr, 'authorize argument[s] not provided' unless args[0]
16
-
17
- # authorize true
18
- return if args[0].is_a? TrueClass
19
-
20
- if !args[1]
21
- # authorize :admin?
22
- opts[:action] = args.first
23
- elsif args[2]
24
- # authorize @model, write?, CustomClass
25
- # authorize @model, write?, class: CustomClass
26
- opts[:model] = args.first
27
- opts[:action] = args[1]
28
- opts[:class] = args[2].is_a?(Hash) ? args[2][:class] : args[2]
10
+ def authorize result=false
11
+ if (block_given? ? yield : result)
12
+ @_is_policy_authorized = true
29
13
  else
30
- # authorize @model, write?
31
- opts[:model] = args.first
32
- opts[:action] = args[1]
14
+ Policy.error('Authorize did not pass truthy value')
33
15
  end
34
-
35
- # covert all authorize actions to bang actions (fail unless true)
36
- action = opts.delete(:action).to_s.sub('?', '!')
37
-
38
- # do it
39
- Policy(opts).send(action, &block)
40
16
  end
41
17
 
42
18
  def is_authorized?
@@ -44,8 +20,11 @@ if klass
44
20
  end
45
21
 
46
22
  def is_authorized!
47
- raise ::Policy::Error.new('Request is not authorized!') unless is_authorized?
48
- true
23
+ if is_authorized?
24
+ true
25
+ else
26
+ Policy.error('Request is not authorized!')
27
+ end
49
28
  end
50
29
  end
51
30
  end
@@ -1,21 +1,14 @@
1
- class Policy
2
- module ModelAdapter
3
- def self.can user, model
4
- klass = '%sPolicy' % model.class
5
- klass = Object.const_defined?(klass) ? klass.constantize : ::ModelPolicy
6
- Policy(model: model || self, user: user, class: klass)
7
- end
8
- end
1
+ klass =
2
+ if defined? ActiveRecord
3
+ ActiveRecord::Base
4
+ elsif defined? Sequel
5
+ Sequel::Model
9
6
  end
10
7
 
11
- if defined? Rails
12
- ActiveModel::Base.include Policy::ModelAdapter
13
- elsif defined? Sequel
14
- class Sequel::Model
15
- module InstanceMethods
16
- def can user=nil
17
- Policy::ModelAdapter.can user, self
18
- end
8
+ if klass
9
+ klass.class_eval do
10
+ def can user=nil
11
+ Policy.can self, user
19
12
  end
20
13
  end
21
14
  end
data/lib/egoist/base.rb CHANGED
@@ -1,21 +1,9 @@
1
1
  class Policy
2
- class << self
3
- def can(model=nil, user=nil)
4
- if model.is_a?(Hash)
5
- user, model = model[:user], model[:model]
6
- end
7
-
8
- new(user: user, model: model).can
9
- end
10
- end
11
-
12
- ###
13
-
14
2
  attr_reader :model, :user, :action
15
3
 
16
4
  def initialize model:, user: nil
17
5
  @model = model
18
- @user = user || current_user
6
+ @user = user || Policy.current_user
19
7
  end
20
8
 
21
9
  # pass block if you want to handle errors yourself
@@ -28,8 +16,13 @@ class Policy
28
16
  .to_sym
29
17
 
30
18
  # pre check
31
- raise RuntimeError, 'Method name not allowed' if %i(can).index(@action)
32
- raise NoMethodError, %[Policy check "#{@action}" not found in #{self.class}] unless respond_to?(@action)
19
+ if %i(can).index(@action)
20
+ raise RuntimeError.new('Method name not allowed')
21
+ end
22
+
23
+ unless respond_to?(@action)
24
+ raise NoMethodError.new(%[Policy check "#{@action}" not found in #{self.class}])
25
+ end
33
26
 
34
27
  call *args, &block
35
28
  end
@@ -40,42 +33,25 @@ class Policy
40
33
 
41
34
  private
42
35
 
43
- # call has to be isolated because specific of error handling
36
+ # call has to be isolated because of specifics in handling
44
37
  def call *args, &block
45
- raise Error, 'User is not defined, no access' unless @user
46
-
47
- return true if before(@action)
38
+ return true if before(@action) == true
48
39
  return true if send(@action, *args)
49
40
 
50
- raise Error, 'Access disabled in policy'
41
+ error 'Access disabled in policy'
51
42
  rescue Policy::Error => error
52
43
  message = error.message
53
44
  message += " - #{self.class}##{@action}"
54
45
 
55
46
  if block
56
- block.call(message)
47
+ block.call message
57
48
  false
58
49
  else
59
- raise Policy::Error, message
50
+ error message
60
51
  end
61
52
  end
62
53
 
63
54
  def before action
64
55
  false
65
56
  end
66
-
67
- def error message
68
- raise Policy::Error.new(message)
69
- end
70
-
71
- # get current user from globals if globals defined
72
- def current_user
73
- if defined?(User) && User.respond_to?(:current)
74
- User.current
75
- elsif defined?(Current) && Current.respond_to?(:user)
76
- Current.user
77
- else
78
- raise RuntimeError.new('Current user not found in Policy#current_user')
79
- end
80
- end
81
57
  end
data/lib/egoist/error.rb CHANGED
@@ -2,3 +2,18 @@ class Policy
2
2
  class Error < StandardError
3
3
  end
4
4
  end
5
+
6
+ class Policy
7
+ class << self
8
+ def error msg
9
+ raise ::Policy::Error.new(msg)
10
+ end
11
+ end
12
+
13
+ ###
14
+
15
+ def error message
16
+ raise Policy::Error.new(message)
17
+ end
18
+ end
19
+
data/lib/egoist/proxy.rb CHANGED
@@ -1,4 +1,37 @@
1
1
  class Policy
2
+ class << self
3
+ # try to load current user
4
+ def current_user
5
+ if Thread.current.key?(:current_user)
6
+ Thread.current[:current_user]
7
+ elsif defined?(User) && User.respond_to?(:current)
8
+ User.current
9
+ elsif defined?(Current) && Current.respond_to?(:user)
10
+ Current.user
11
+ else
12
+ raise RuntimeError.new('Current user not found in Policy#current_user')
13
+ end
14
+ end
15
+
16
+ def can model = nil, user = nil
17
+ if model.is_a?(Hash)
18
+ model, user = model[:model], model[:user]
19
+ end
20
+
21
+ klass = self
22
+
23
+ # if we are calling can on Policy class, figure out policy class
24
+ if self == Policy
25
+ klass = ('%s_policy' % model.class).classify
26
+ klass = Object.const_defined?('::%s' % klass) ? klass.constantize : raise('Policy class %s not defined' % klass)
27
+ end
28
+
29
+ klass.new(user: user, model: model).can
30
+ end
31
+ end
32
+
33
+ ###
34
+
2
35
  class Proxy
3
36
  def initialize policy
4
37
  @policy = policy
@@ -12,11 +45,9 @@ class Policy
12
45
  @policy.model || true
13
46
  rescue Policy::Error => error
14
47
  if block_given?
15
- yield
16
- return nil
17
- end
18
-
19
- if action == '!'
48
+ yield error
49
+ nil
50
+ elsif action == '!'
20
51
  raise error
21
52
  elsif action == '?'
22
53
  nil
@@ -25,4 +56,4 @@ class Policy
25
56
  end
26
57
  end
27
58
  end
28
- end
59
+ end
data/lib/egoist.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require_relative 'egoist/base'
2
2
  require_relative 'egoist/error'
3
3
  require_relative 'egoist/proxy'
4
- require_relative 'egoist/global'
5
4
 
6
5
  require_relative 'adapters/controller'
7
6
  require_relative 'adapters/model'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egoist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2022-06-27 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
@@ -22,13 +22,12 @@ files:
22
22
  - "./lib/egoist.rb"
23
23
  - "./lib/egoist/base.rb"
24
24
  - "./lib/egoist/error.rb"
25
- - "./lib/egoist/global.rb"
26
25
  - "./lib/egoist/proxy.rb"
27
26
  homepage: https://github.com/dux/egoist
28
27
  licenses:
29
28
  - MIT
30
29
  metadata: {}
31
- post_install_message:
30
+ post_install_message:
32
31
  rdoc_options: []
33
32
  require_paths:
34
33
  - lib
@@ -43,8 +42,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
42
  - !ruby/object:Gem::Version
44
43
  version: '0'
45
44
  requirements: []
46
- rubygems_version: 3.0.6
47
- signing_key:
45
+ rubygems_version: 3.2.3
46
+ signing_key:
48
47
  specification_version: 4
49
48
  summary: Ruby access policy library
50
49
  test_files: []
data/lib/egoist/global.rb DELETED
@@ -1,16 +0,0 @@
1
- # Policy(:application) -> ApplicationPolicy.can(model: nil, user: current_user)
2
- # Policy(@post) -> PostPolict.can(model: @post, user: current_user)
3
- # Policy(@post, @user) -> PostPolict.can(model: @post, user: @user)
4
- # Policy(model: @post, user: @user) -> PostPolict.can(model: @post, user: @user)
5
- def Policy model, user=nil
6
- if model.is_a?(Hash)
7
- user, model = model[:user], model[:model]
8
- end
9
-
10
- raise ArgumentError, 'Model not defined' unless model
11
-
12
- klass = model.is_a?(Symbol) ? model : model.class
13
- klass = ('%s_policy' % klass).classify.constantize
14
-
15
- klass.new(user: user, model: model).can
16
- end