class Permissify::DSL

Evaluated (via instance_eval) inside ‘Permissify.define`. Every call writes an immutable entry into a ResourceDefinition. Duplicate names and missing blocks fail loudly at boot; there is no implicit behaviour.

Public Class Methods

new(definition) click to toggle source
# File lib/permissify/dsl.rb, line 8
def initialize(definition)
  @definition = definition
end

Public Instance Methods

action(name, maps_to:) click to toggle source

Explicit, finite action aliases. There is no generated “:#{action}able” fallback — an unregistered action denies.

# File lib/permissify/dsl.rb, line 30
def action(name, maps_to:)
  key = name.to_sym
  guard_unique!(@definition.actions, key, "action alias")
  @definition.actions[key] = maps_to.to_sym
end
fact(name, &block) click to toggle source
# File lib/permissify/dsl.rb, line 12
def fact(name, &block)
  raise DefinitionError, "fact(:#{name}) requires a block" unless block

  key = name.to_sym
  guard_unique!(@definition.facts, key, "fact")
  @definition.facts[key] = block
end
permission(name, &block) click to toggle source
# File lib/permissify/dsl.rb, line 20
def permission(name, &block)
  raise DefinitionError, "permission(:#{name}) requires a block" unless block

  key = name.to_sym
  guard_unique!(@definition.permissions, key, "permission")
  @definition.permissions[key] = block
end
scope(permission_name, &block) click to toggle source

A SQL-capable scope for a permission: a block ->(actor, relation, environment) that returns a narrowed relation. authorized_scope requires one — collections are never filtered in Ruby as a security boundary.

# File lib/permissify/dsl.rb, line 39
def scope(permission_name, &block)
  raise DefinitionError, "scope(:#{permission_name}) requires a block" unless block

  key = permission_name.to_sym
  guard_unique!(@definition.scopes, key, "scope")
  @definition.scopes[key] = block
end