Class: DoRole::PermissionSet

Inherits:
Object
  • Object
show all
Defined in:
lib/do_role/permission_set.rb

Constant Summary collapse

RESERVED_OPTIONS =
[:priority, :description, :requires, :default, :conditions].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePermissionSet

Returns a new instance of PermissionSet.



10
11
12
13
# File 'lib/do_role/permission_set.rb', line 10

def initialize
  @registered_permissions = {}.with_indifferent_access
  @namespace_stack = []
end

Instance Attribute Details

#registered_permissionsObject (readonly) Also known as: permissions

Returns the value of attribute registered_permissions.



5
6
7
# File 'lib/do_role/permission_set.rb', line 5

def registered_permissions
  @registered_permissions
end

Instance Method Details

#computed_permissions(base_permissions) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/do_role/permission_set.rb', line 63

def computed_permissions(base_permissions)
  base_permissions
    .map(&:to_s)
    .select { |p| valid_permission?(p) }
    .tap { |result| result.concat(collect_required_permissions(result)) }
    .uniq
end

#draw(&block) ⇒ Object



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

def draw(&block)
  instance_eval(&block) if block_given?
end

#get(permission_name) ⇒ Object



52
53
54
55
56
# File 'lib/do_role/permission_set.rb', line 52

def get(permission_name)
  permission = registered_permissions[permission_name.to_s]
  return permission if permission&.key?(:priority)
  nil
end

#namespace(name, options = {}, &block) ⇒ Object

Raises:

  • (ArgumentError)


19
20
21
22
23
24
25
26
27
28
# File 'lib/do_role/permission_set.rb', line 19

def namespace(name, options = {}, &block)
  raise ArgumentError, "name can't be blank" if name.blank?
  
  name = name.to_s
  @namespace_stack.push(name)
  
  instance_eval(&block) if block_given?

  @namespace_stack.pop
end

#namespacesObject



71
72
73
# File 'lib/do_role/permission_set.rb', line 71

def namespaces
  collect_namespaces(registered_permissions, [], []).uniq
end

#permission(name, options = {}, &block) ⇒ Object

Raises:

  • (ArgumentError)


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/do_role/permission_set.rb', line 30

def permission(name, options = {}, &block)
  name = name.to_s
  raise ArgumentError, "name can't be blank" if name.blank?
  
  conditions = if block_given?
    ConditionsProxy.new({}).tap { |proxy| proxy.instance_eval(&block) }.conditions
  else
    non_reserved_options = options.except(*RESERVED_OPTIONS)
    options.except!(*non_reserved_options.keys)
    non_reserved_options
  end

  options.reverse_merge!(
    conditions: conditions,
    priority: 0,
    description: "",
    requires: Array.wrap(options[:requires]).map(&:to_s)
  )
  
  register_permission(name, options)
end

#permissions_in_namespace(namespace) ⇒ Object



75
76
77
78
79
80
# File 'lib/do_role/permission_set.rb', line 75

def permissions_in_namespace(namespace)
  current = registered_permissions.dig(*namespace.to_s.split('.'))
  return {} unless current.is_a?(Hash)
  
  flatten_permissions(current, namespace.to_s)
end

#valid_permission?(permission_name) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
# File 'lib/do_role/permission_set.rb', line 58

def valid_permission?(permission_name)
  permission = get(permission_name)
  !permission.nil?
end