Skip to content

Commit

Permalink
Merge pull request #10 from brainn-co/sl-rename-value
Browse files Browse the repository at this point in the history
Add rename_value/4
  • Loading branch information
sam-levy committed Aug 21, 2020
2 parents 153eba0 + 87cf037 commit e5c08eb
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ The package can be installed by adding `ecto_enum_migration` to your list of dep
```elixir
def deps do
[
{:ecto_enum_migration, "~> 0.2.0"}
{:ecto_enum_migration, "~> 0.3.0"}
]
end
```
Expand Down
56 changes: 56 additions & 0 deletions lib/ecto_enum_migration.ex
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,62 @@ defmodule EctoEnumMigration do
|> execute_query()
end

@doc """
Rename a value of a Postgres Type.
## Examples
```elixir
defmodule MyApp.Repo.Migrations.RenameTypeMigration do
use Ecto.Migration
import EctoEnumMigration
def change do
rename_value(:status, :finished, :done)
end
end
```
By default the type will be created in the `public` schema.
To change the schema of the type pass the `schema` option.
```elixir
rename_value(:status, :finished, :done, schema: "custom_schema")
```
"""
@spec rename_value(
type_name :: atom(),
before_value :: atom(),
after_value :: atom(),
opts :: Keyword.t()
) :: :ok | no_return()

def rename_value(type_name, before_value, after_value, opts \\ [])
when is_atom(type_name) and is_atom(before_value) and is_atom(after_value) and is_list(opts) do
type_name = type_name(type_name, opts)
before_value = to_value(before_value)
after_value = to_value(after_value)

up_sql = "
UPDATE pg_catalog.pg_enum
SET enumlabel = #{after_value}
WHERE enumtypid = '#{type_name}'::regtype::oid
AND enumlabel = #{before_value}
RETURNING enumlabel;
"

down_sql = "
UPDATE pg_catalog.pg_enum
SET enumlabel = #{before_value}
WHERE enumtypid = '#{type_name}'::regtype::oid
AND enumlabel = #{after_value}
RETURNING enumlabel;
"

execute(up_sql, down_sql)
end

defp before_after(opts) do
before_value = Keyword.get(opts, :before)
after_value = Keyword.get(opts, :after)
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule EctoEnumMigration.MixProject do
def project do
[
app: :ecto_enum_migration,
version: "0.2.0",
version: "0.3.0",
elixir: "~> 1.7",
start_permanent: Mix.env() == :prod,
deps: deps(),
Expand Down
62 changes: 62 additions & 0 deletions test/ecto_enum_migration_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,24 @@ defmodule EctoEnumMigrationTest do
end
end

defmodule RenameValueMigration do
use Ecto.Migration
import EctoEnumMigration

def change do
rename_value(:status, :registered, :filled)
end
end

defmodule RenameValueWithCustomSchemaMigration do
use Ecto.Migration
import EctoEnumMigration

def change do
rename_value(:status, :registered, :filled, schema: "custom_schema")
end
end

defmodule AddValueToTypeMigration do
use Ecto.Migration
import EctoEnumMigration
Expand Down Expand Up @@ -383,6 +401,50 @@ defmodule EctoEnumMigrationTest do
end
end

describe "rename_value/4" do
test "renames value" do
create_version = version_number()
rename_version = version_number()

:ok = up(create_version, CreateTypeMigration)
:ok = up(rename_version, RenameValueMigration)

assert current_types() == %{
"public.status" => ["filled", "active", "inactive", "archived"]
}

:ok = down(rename_version, RenameValueMigration)

assert current_types() == %{
"public.status" => ["registered", "active", "inactive", "archived"]
}

:ok = down(create_version, CreateTypeMigration)
end

test "supports custom schema" do
:ok = up(version_number(), CreateSchemaMigration)

create_version = version_number()
rename_version = version_number()

:ok = up(create_version, CreateTypeWithCustomSchemaMigration)
:ok = up(rename_version, RenameValueWithCustomSchemaMigration)

assert current_types() == %{
"custom_schema.status" => ["filled", "active", "inactive", "archived"]
}

:ok = down(rename_version, RenameValueWithCustomSchemaMigration)

assert current_types() == %{
"custom_schema.status" => ["registered", "active", "inactive", "archived"]
}

:ok = down(create_version, CreateTypeWithCustomSchemaMigration)
end
end

defp up(version, migration) do
Ecto.Migrator.up(TestRepo, version, migration, log: false)
end
Expand Down

0 comments on commit e5c08eb

Please sign in to comment.