Class: Tram::Policy

Inherits:
Object
  • Object
show all
Extended by:
Dry::Initializer
Defined in:
lib/tram/policy.rb,
lib/tram/policy/error.rb,
lib/tram/policy/errors.rb,
lib/tram/policy/generator.rb,
lib/tram/policy/inflector.rb,
lib/tram/policy/validator.rb,
lib/tram/policy/validation_error.rb

Overview

Base class for policy objects with composable validation errors

Defined Under Namespace

Modules: Inflector Classes: Error, Errors, Generator, ValidationError, Validator

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.[](*args) ⇒ Tram::Policy

Policy constructor/validator (alias for [.new])

Parameters:

  • *args (Object)

Returns:



34
35
36
# File 'lib/tram/policy.rb', line 34

def [](*args)
  new(*args)
end

.allArray<Proc>

List of all applicable validators from both the policy and its parent

Returns:

  • (Array<Proc>)


58
59
60
# File 'lib/tram/policy.rb', line 58

def all
  (((self == Tram::Policy) ? [] : superclass.send(:all)) + local).uniq
end

.localArray<Proc>

List of validators defined by a policy per se

Returns:

  • (Array<Proc>)


50
51
52
# File 'lib/tram/policy.rb', line 50

def local
  @local ||= []
end

.scopeArray<String>

Translation scope for a policy

Returns:

  • (Array<String>)


42
43
44
# File 'lib/tram/policy.rb', line 42

def scope
  @scope ||= ["tram-policy", *Inflector.underscore(name)]
end

.validate(name, opts) ⇒ self

Registers a validator

Parameters:

  • name (#to_sym, nil)

    (nil)

  • opts (Hash)

    a customizable set of options

Options Hash (opts):

  • :stop_on_failure (Boolean)

Returns:

  • (self)


24
25
26
27
# File 'lib/tram/policy.rb', line 24

def validate(name = nil, **opts, &block)
  local << Validator.new(scope, name, block, opts)
  self
end

Instance Method Details

#errorsTram::Policy::Errors

Collection of validation errors



78
79
80
# File 'lib/tram/policy.rb', line 78

def errors
  @errors ||= Errors.new(self)
end

#inspectString

Human-readable representation of the policy

Examples:

Displays policy name and its attributes

UserPolicy[name: "Andy"].inspect
# => #<UserPolicy["name" => "Andy"]>

Returns:

  • (String)


118
119
120
# File 'lib/tram/policy.rb', line 118

def inspect
  "#<#{self.class.name}[#{@__options__}]>"
end

#invalid?(&filter) ⇒ Boolean

Checks whether the policy is invalid

Parameters:

  • filter (Proc, nil)

    Block describing **the only errors to count**

Returns:

  • (Boolean)


96
97
98
# File 'lib/tram/policy.rb', line 96

def invalid?(&filter)
  filter ? errors.any?(&filter) : errors.any?
end

#t(message, options = {}) ⇒ String

Translates a message in the scope of current policy

Parameters:

  • message (#to_s)
  • options (Hash<Symbol, Object>) (defaults to: {})

Returns:

  • (String)


69
70
71
72
# File 'lib/tram/policy.rb', line 69

def t(message, options = {})
  return message.to_s unless message.is_a? Symbol
  I18n.t message, options.merge(scope: @__scope__)
end

#valid?(&filter) ⇒ Boolean

Checks whether the policy is valid

Parameters:

  • filter (Proc, nil)

    Block describing **errors to be skipped**

Returns:

  • (Boolean)


87
88
89
# File 'lib/tram/policy.rb', line 87

def valid?(&filter)
  filter ? errors.reject(&filter).empty? : errors.empty?
end

#validate!(&filter) ⇒ nil

Raises exception if the policy is not valid

Parameters:

  • filter (Proc, nil)

    Block describing **errors to be skipped**

Returns:

  • (nil)

    if the policy is valid

Raises:



106
107
108
# File 'lib/tram/policy.rb', line 106

def validate!(&filter)
  raise ValidationError.new(self, filter) unless valid?(&filter)
end