Class: Ace::Lint::Atoms::ValidatorRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/lint/atoms/validator_registry.rb

Overview

Registry mapping validator names to runner classes Provides lookup and availability checking for validators

Constant Summary collapse

VALIDATORS =

Map of validator name (symbol) to runner class

{
  standardrb: "Ace::Lint::Atoms::StandardrbRunner",
  rubocop: "Ace::Lint::Atoms::RuboCopRunner"
}.freeze
ALIASES =

Aliases for common variations

{
  standard: :standardrb,
  "standard-rb": :standardrb,
  rubocop_runner: :rubocop
}.freeze

Class Method Summary collapse

Class Method Details

.available?(name) ⇒ Boolean

Check if a validator is available (installed and runnable) Results are cached to avoid repeated subprocess calls

Parameters:

  • name (String, Symbol)

    Validator name

Returns:

  • (Boolean)

    True if validator can be used



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ace/lint/atoms/validator_registry.rb', line 49

def self.available?(name)
  @availability_cache ||= {}
  canonical = canonical_name(name)
  return false unless canonical

  return @availability_cache[canonical] if @availability_cache.key?(canonical)

  runner = runner_for(canonical)
  result = runner&.respond_to?(:available?) && runner.available?
  @availability_cache[canonical] = result
end

.available_validatorsArray<Symbol>

Get list of all available validators (installed and runnable)

Returns:

  • (Array<Symbol>)

    List of available validator names



69
70
71
# File 'lib/ace/lint/atoms/validator_registry.rb', line 69

def self.available_validators
  VALIDATORS.keys.select { |name| available?(name) }
end

.canonical_name(name) ⇒ Symbol?

Resolve canonical name from input (handles aliases)

Parameters:

  • name (String, Symbol)

    Input name

Returns:

  • (Symbol, nil)

    Canonical name or nil if not found



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ace/lint/atoms/validator_registry.rb', line 76

def self.canonical_name(name)
  return nil if name.nil?

  sym = name.to_s.downcase.tr("-", "_").to_sym

  # Check direct match
  return sym if VALIDATORS.key?(sym)

  # Check aliases
  aliased = ALIASES[sym]
  return aliased if aliased && VALIDATORS.key?(aliased)

  # Check string key aliases
  str_sym = name.to_s.downcase.tr("_", "-").to_sym
  aliased = ALIASES[str_sym]
  return aliased if aliased && VALIDATORS.key?(aliased)

  nil
end

.registered?(name) ⇒ Boolean

Check if a validator is registered

Parameters:

  • name (String, Symbol)

    Validator name

Returns:

  • (Boolean)

    True if validator exists in registry



41
42
43
# File 'lib/ace/lint/atoms/validator_registry.rb', line 41

def self.registered?(name)
  canonical_name(name) != nil
end

.registered_validatorsArray<Symbol>

Get list of all registered validator names

Returns:

  • (Array<Symbol>)

    List of validator names



63
64
65
# File 'lib/ace/lint/atoms/validator_registry.rb', line 63

def self.registered_validators
  VALIDATORS.keys
end

.reset_all_caches!void

This method returns an undefined value.

Reset all caches across the validator system Call this at CLI entry point to ensure fresh availability checks



105
106
107
108
109
# File 'lib/ace/lint/atoms/validator_registry.rb', line 105

def self.reset_all_caches!
  reset_cache!
  StandardrbRunner.reset_availability_cache!
  RuboCopRunner.reset_availability_cache!
end

.reset_cache!void

This method returns an undefined value.

Reset availability cache (for testing)



98
99
100
# File 'lib/ace/lint/atoms/validator_registry.rb', line 98

def self.reset_cache!
  @availability_cache = {}
end

.runner_for(name) ⇒ Class?

Get runner class for a validator name

Parameters:

  • name (String, Symbol)

    Validator name

Returns:

  • (Class, nil)

    Runner class or nil if not found



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/ace/lint/atoms/validator_registry.rb', line 25

def self.runner_for(name)
  canonical = canonical_name(name)
  return nil unless canonical

  class_name = VALIDATORS[canonical]
  return nil unless class_name

  # Resolve class from string
  class_name.split("::").reduce(Object) { |mod, part| mod.const_get(part) }
rescue NameError
  nil
end