Class: Woods::Console::ModelValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/woods/console/model_validator.rb

Overview

Validates model names and column names against the Rails schema.

In production, validates against AR::Base.descendants and model.column_names. Accepts an injectable registry for testing without Rails.

Examples:

validator = ModelValidator.new(registry: { 'User' => %w[id email name] })
validator.validate_model!('User')      # => true
validator.validate_model!('Hacker')    # => raises ValidationError
validator.validate_column!('User', 'email')  # => true

Instance Method Summary collapse

Constructor Details

#initialize(registry:) ⇒ ModelValidator

Returns a new instance of ModelValidator.

Parameters:

  • registry (Hash<String, Array<String>>)

    Model name => column names mapping



23
24
25
# File 'lib/woods/console/model_validator.rb', line 23

def initialize(registry:)
  @registry = registry
end

Instance Method Details

#columns_for(model_name) ⇒ Array<String>

List columns for a model.

Parameters:

  • model_name (String)

Returns:

  • (Array<String>)


73
74
75
76
# File 'lib/woods/console/model_validator.rb', line 73

def columns_for(model_name)
  validate_model!(model_name)
  @registry[model_name].sort
end

#model_namesArray<String>

List all known model names.

Returns:

  • (Array<String>)


65
66
67
# File 'lib/woods/console/model_validator.rb', line 65

def model_names
  @registry.keys.sort
end

#validate_column!(model_name, column_name) ⇒ true

Validate that a column exists on a model.

Parameters:

  • model_name (String)
  • column_name (String)

Returns:

  • (true)

Raises:



44
45
46
47
48
49
50
51
# File 'lib/woods/console/model_validator.rb', line 44

def validate_column!(model_name, column_name)
  validate_model!(model_name)
  columns = @registry[model_name]
  return true if columns.include?(column_name)

  raise ValidationError,
        "Unknown column '#{column_name}' on #{model_name}. Available: #{columns.sort.join(', ')}"
end

#validate_columns!(model_name, column_names) ⇒ Object

Validate multiple columns at once.

Parameters:

  • model_name (String)
  • column_names (Array<String>)

Raises:



58
59
60
# File 'lib/woods/console/model_validator.rb', line 58

def validate_columns!(model_name, column_names)
  column_names.each { |col| validate_column!(model_name, col) }
end

#validate_model!(model_name) ⇒ true

Validate that a model name is known.

Parameters:

  • model_name (String)

Returns:

  • (true)

Raises:



32
33
34
35
36
# File 'lib/woods/console/model_validator.rb', line 32

def validate_model!(model_name)
  return true if @registry.key?(model_name)

  raise ValidationError, "Unknown model: #{model_name}. Available: #{@registry.keys.sort.join(', ')}"
end