Class: Grabli

Inherits:
Object
  • Object
show all
Defined in:
lib/grabli.rb,
lib/grabli/version.rb

Defined Under Namespace

Classes: Intruder

Constant Summary collapse

PolicyNotFound =
Class.new(StandardError)
VERSION =
"0.2.0"

Instance Method Summary collapse

Constructor Details

#initialize(namespace: nil) ⇒ Grabli

You can configure grabli by passing options to initializer

Examples:

# will search policies under specified namespace, e.g. User::SomePolicy
Grabli.new(namespace: User)

Parameters:

  • namespace: (defaults to: nil)

    nil [module] set the namespace for your policies



15
16
17
# File 'lib/grabli.rb', line 15

def initialize(namespace: nil)
  @namespace = namespace
end

Instance Method Details

#allowed?(policy, permission) ⇒ Boolen, Object

Check whether certain permission is allowed.

Examples:

policy = Pundit.policy(@user, @company)
Grabli.new.allowed?(policy, :create?)
#=> true

Parameters:

  • policy (ApplicationPolicy)

    instantiated policy

  • permission (Symbol)

    permission name

Returns:

  • (Boolen, Object)

    true or false in case subject intruded or whatever you policy permission returns



59
60
61
62
63
# File 'lib/grabli.rb', line 59

def allowed?(policy, permission)
  result = policy.public_send(permission)
  return !policy.record.intruded if policy.record.is_a?(Intruder)
  result
end

#collect(user, subject) ⇒ Array<Symbol>

Collect allowed policy permissions for the given user.

Examples:

Grabli.new.collect(@user, @company)
#=> [:create?, :update?, :manage_occupied?]

Grabli.new.collect(@user, :company)
#=> [:create?]

Parameters:

  • user (Object)

    user object your policy work with

  • subject (Symbol, Object)

    subject object your policy work with

Returns:

  • (Array<Symbol>)

    array of allowed policy permission



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/grabli.rb', line 33

def collect(user, subject)
  policy_class(subject)
    .tap { |policy| raise PolicyNotFound if policy.nil? }
    .public_instance_methods(false)
    .reject { |n| n =~ /permitted_attributes/ }
    .each_with_object([]) do |permission, collection|
      # allows to collect permissions without subject, for more see Intruder
      isubject = subject.is_a?(Symbol) ? Intruder.new(false) : subject
      policy = policy_class(subject).new(user, isubject)

      collection << permission if allowed? policy, permission
    end
end