Class: PgSqlTriggers::Migrator::SafetyValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/pg_sql_triggers/migrator/safety_validator.rb

Overview

Validates that migrations don’t blindly DROP + CREATE objects This ensures safety by detecting unsafe patterns and blocking them

Defined Under Namespace

Classes: UnsafeOperationError

Class Method Summary collapse

Class Method Details

.detect_unsafe_patterns(migration_instance, direction) ⇒ Object

Detect unsafe patterns in migration SQL Returns array of violation hashes



53
54
55
56
# File 'lib/pg_sql_triggers/migrator/safety_validator.rb', line 53

def detect_unsafe_patterns(migration_instance, direction)
  captured_sql = capture_sql(migration_instance, direction)
  detect_unsafe_patterns_from_sql(captured_sql)
end

.validate!(migration_instance, direction: :up, allow_unsafe: false) ⇒ Object

Validate that a migration doesn’t perform unsafe DROP + CREATE operations Raises UnsafeOperationError if unsafe patterns are detected



27
28
29
30
31
32
33
34
35
# File 'lib/pg_sql_triggers/migrator/safety_validator.rb', line 27

def validate!(migration_instance, direction: :up, allow_unsafe: false)
  return if allow_unsafe

  violations = detect_unsafe_patterns(migration_instance, direction)
  return if violations.empty?

  error_message = build_error_message(violations, migration_instance.class.name)
  raise UnsafeOperationError.new(error_message, violations)
end

.validate_sql!(captured_sql, allow_unsafe: false) ⇒ Object

Validate using pre-captured SQL (avoids re-instantiating the migration class). Direction is intentionally not a parameter here – the captured SQL already reflects the direction that was executed to produce it. Raises UnsafeOperationError if unsafe patterns are detected.



41
42
43
44
45
46
47
48
49
# File 'lib/pg_sql_triggers/migrator/safety_validator.rb', line 41

def validate_sql!(captured_sql, allow_unsafe: false)
  return if allow_unsafe

  violations = detect_unsafe_patterns_from_sql(captured_sql)
  return if violations.empty?

  error_message = build_error_message(violations, "(migration)")
  raise UnsafeOperationError.new(error_message, violations)
end