ExcellentMigrations.DangersDetector (excellent_migrations v0.1.3) View Source

This module finds potentially dangerous or destructive database operations in a given migration AST.

Link to this section Summary

Functions

Traverses ast and finds potentially dangerous database operations. Returns keyword list containing danger types and lines where they were detected.

Link to this section Types

Specs

ast() :: list() | tuple() | atom() | String.t()

Specs

danger_type() ::
  :column_added_with_default
  | :column_removed
  | :column_renamed
  | :column_type_changed
  | :index_not_concurrently
  | :many_columns_index
  | :not_null_added
  | :operation_delete
  | :operation_insert
  | :operation_update
  | :raw_sql_executed
  | :table_dropped
  | :table_renamed

Specs

line() :: integer()

Link to this section Functions

Link to this function

detect_dangers(ast, source_code)

View Source

Specs

detect_dangers(ast(), String.t()) :: [{danger_type(), line()}]

Traverses ast and finds potentially dangerous database operations. Returns keyword list containing danger types and lines where they were detected.

Parameters

  • ast is a structure that represents AST of database migration. It can be obtained e.g. via Code.string_to_quoted!/1.

    Examples

    iex> source_code = """
    ...>   alter table("dumplings") do
    ...>     remove(:taste, :string)
    ...>     remove(:stuffing, :string)
    ...>   end
    ...> """
    iex> ast = Code.string_to_quoted!(source_code)
    {:ok,
    {:alter, [line: 1],
    [
      {:table, [line: 1], ["dumplings"]},
      [
        do: {:__block__, [],
         [
           {:remove, [line: 2], [:taste, :string]},
           {:remove, [line: 3], [:stuffing, :string]}
         ]}
      ]
    ]}}
    
    iex> ExcellentMigrations.DangersDetector.detect_dangers(ast, source_code)
    [column_removed: 2, column_removed: 3]