Class: ActiveValidation::Internal::Models::Manifest::Installer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_validation/internal/models/manifest/installer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_class:, checks: [], context:) ⇒ Installer

Returns a new instance of Installer.



12
13
14
15
16
17
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 12

def initialize(base_class:, checks: [], context:)
  @base_class = base_class
  @checks = checks
  @context = context
  @installed_callbacks = []
end

Instance Attribute Details

#base_classObject (readonly)

Returns the value of attribute base_class.



10
11
12
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 10

def base_class
  @base_class
end

#checksObject (readonly)

Returns the value of attribute checks.



10
11
12
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 10

def checks
  @checks
end

#contextObject (readonly)

Returns the value of attribute context.



10
11
12
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 10

def context
  @context
end

#installed_callbacksObject (readonly)

Returns the value of attribute installed_callbacks.



10
11
12
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 10

def installed_callbacks
  @installed_callbacks
end

Instance Method Details

#callbacks_chainObject



51
52
53
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 51

def callbacks_chain
  base_class._validate_callbacks
end

#installTrueClass

Note:

we have to use the hack with

Add all checks (validations) to base_class

‘callbacks_chain.each.to_a # => chain` since `chain` method is protected.

Returns:

  • (TrueClass)


26
27
28
29
30
31
32
33
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 26

def install
  @installed_callbacks = chain_mutex.synchronize do
    before = callbacks_chain_elements
    checks.each { |check| base_class.public_send(*check.to_validation_arguments(context: context)) }
    callbacks_chain_elements - before
  end
  true
end

#uninstallFalseClass

Remove all checks (validations) from base_class

we can not use ActiveSupport provided methods, since we already have our installed callbacks.

Returns:

  • (FalseClass)


41
42
43
44
45
46
47
48
49
# File 'lib/active_validation/internal/models/manifest/installer.rb', line 41

def uninstall
  installed_validators = installed_callbacks.map(&:filter).select { |f| f.is_a? ActiveModel::Validator }

  ([base_class] + ActiveSupport::DescendantsTracker.descendants(base_class)).reverse_each do |target|
    uninstall! target: target, installed_validators: installed_validators
  end
  installed_callbacks.clear
  false
end