• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

danielberkompas / cloak_ecto / 9355b38e-5636-4248-94b5-6129115c3d91

12 May 2025 11:21AM UTC coverage: 91.818% (-6.1%) from 97.917%
9355b38e-5636-4248-94b5-6129115c3d91

Pull #58

semaphore

web-flow
Merge 85b0d35a6 into 9989e732c
Pull Request #58: fix: Ecto.Enum type wrapped in tuple

0 of 2 new or added lines in 1 file covered. (0.0%)

6 existing lines in 3 files now uncovered.

101 of 110 relevant lines covered (91.82%)

148.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.85
/lib/cloak_ecto/migrator.ex
1
defmodule Cloak.Ecto.Migrator do
2
  @moduledoc false
3

4
  import Ecto.Query
5

6
  alias Ecto.Changeset
7
  alias Cloak.Ecto.Migrator.CursorStream
8

9
  def migrate(repo, schema) when is_atom(repo) and is_atom(schema) do
10
    validate(repo, schema)
12✔
11

12
    [primary_key | _] = schema.__schema__(:primary_key)
8✔
13

14
    case repo.aggregate(schema, :count, primary_key) do
8✔
UNCOV
15
      0 -> :ok
×
16
      _ -> migrate_schema_with_data(repo, schema)
8✔
17
    end
18
  end
19

20
  defp migrate_schema_with_data(repo, schema) do
21
    fields = cloak_fields(schema)
8✔
22

23
    repo
24
    |> CursorStream.new(schema, 100)
25
    |> Task.async_stream(&migrate_row(&1, repo, schema, fields))
1,507✔
26
    |> Stream.run()
8✔
27
  end
28

29
  defp migrate_row(id, repo, schema, fields) do
30
    [primary_key | _] = schema.__schema__(:primary_key)
1,507✔
31

32
    repo.transaction(fn ->
1,507✔
33
      query =
1,507✔
34
        schema
35
        |> where([s], field(s, ^primary_key) == ^id)
36
        |> lock("FOR UPDATE")
1,507✔
37

38
      case repo.one(query) do
1,507✔
UNCOV
39
        nil ->
×
40
          :noop
41

42
        row ->
43
          row
44
          |> force_changes(fields)
45
          |> repo.update()
1,507✔
46
      end
47
    end)
48
  end
49

50
  defp force_changes(row, fields) do
51
    Enum.reduce(fields, Changeset.change(row), fn field, changeset ->
1,507✔
52
      Changeset.force_change(changeset, field, Map.get(row, field))
2,007✔
53
    end)
54
  end
55

56
  defp cloak_fields(schema) do
57
    :fields
58
    |> schema.__schema__()
59
    |> Enum.map(fn field ->
56✔
60
      {field, schema.__schema__(:type, field)}
61
    end)
62
    |> Enum.filter(&cloak_field?/1)
63
    |> Enum.map(fn {field, _type} ->
8✔
64
      field
9✔
65
    end)
66
  end
67

UNCOV
68
  defp cloak_field?({_field, {:embed, %Ecto.Embedded{}}}) do
×
69
    false
70
  end
71

72
  defp cloak_field?({_field, {:parameterized, Ecto.Embedded, %Ecto.Embedded{}}}) do
1✔
73
    false
74
  end
75

76
  defp cloak_field?({_field, {:parameterized, Ecto.Enum, _opts}}) do
7✔
77
    false
78
  end
79

NEW
80
  defp cloak_field?({_field, {:parameterized, {Ecto.Embedded, %Ecto.Embedded{}}}}) do
×
81
    false
82
  end
83

NEW
84
  defp cloak_field?({_field, {:parameterized, {Ecto.Enum, _opts}}}) do
×
85
    false
86
  end
87

88
  defp cloak_field?({field, {kind, inner_type}}) when kind in [:array, :map] do
89
    cloak_field?({field, inner_type})
2✔
90
  end
91

92
  defp cloak_field?({_field, type}) do
93
    Code.ensure_loaded?(type) && function_exported?(type, :__cloak__, 0)
48✔
94
  end
95

96
  defp validate(repo, schema) do
97
    unless ecto_repo?(repo) do
12✔
98
      raise ArgumentError, "#{inspect(repo)} is not an Ecto.Repo"
2✔
99
    end
100

101
    unless ecto_schema?(schema) do
10✔
102
      raise ArgumentError, "#{inspect(schema)} is not an Ecto.Schema"
2✔
103
    end
104
  end
105

106
  defp ecto_repo?(repo) do
107
    Code.ensure_loaded?(repo) && function_exported?(repo, :__adapter__, 0)
12✔
108
  end
109

110
  defp ecto_schema?(schema) do
111
    Code.ensure_loaded?(schema) && function_exported?(schema, :__schema__, 1)
10✔
112
  end
113
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc