Skip to content

Commit e3a9036

Browse files
authored
Add Credo and Fix issues, also add test watcher
1 parent 3ebf91f commit e3a9036

10 files changed

+66
-50
lines changed

lib/event_store/appendable_event.ex

+10-9
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,22 @@ defimpl Shared.AppendableEvent, for: Any do
2828
Enum.reduce(fields_to_link, %{}, fn field, errors ->
2929
field_value = Map.get(event, field)
3030

31-
unless is_binary(field_value) do
32-
Map.put(errors, field, field_value)
33-
else
31+
if is_binary(field_value) do
3432
errors
33+
else
34+
Map.put(errors, field, field_value)
3535
end
3636
end)
3737

3838
if map_size(invalid_links) > 0 do
3939
invalid_links =
40-
invalid_links
41-
|> Map.to_list()
42-
|> Enum.map(fn {field, value} ->
43-
"#{field} -> #{inspect(value)}"
44-
end)
45-
|> Enum.join(", ")
40+
Enum.map_join(
41+
invalid_links,
42+
", ",
43+
fn {field, value} ->
44+
"#{field} -> #{inspect(value)}"
45+
end
46+
)
4647

4748
raise ArgumentError,
4849
"Streams ids to link need to be a string, got '#{invalid_links}'."

lib/event_store/event_store.ex

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
defmodule Shared.EventStore do
2+
@moduledoc false
23
defmacro __using__(opts \\ []) do
34
quote location: :keep, generated: true, bind_quoted: [opts: opts] do
45
@event_store_backend __MODULE__
@@ -136,9 +137,9 @@ defmodule Shared.EventStore do
136137
end
137138

138139
defp current_connection(nil, _), do: nil
139-
defp current_connection(_, _use_shared_connection = false), do: nil
140+
defp current_connection(_, false = _use_shared_connection), do: nil
140141

141-
defp current_connection(repo, _use_shared_connection = true) do
142+
defp current_connection(repo, true = _use_shared_connection) do
142143
%{pid: pool} = Ecto.Adapter.lookup_meta(repo)
143144

144145
Process.get({Ecto.Adapters.SQL, pool})

lib/event_store/event_store_event.ex

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
defmodule Shared.EventStoreEvent do
2+
@moduledoc false
23
@type event_with_metadata :: {event :: term, metadata :: map()}
34

45
@spec wrap_for_persistence(event :: term | events :: list(term), metadata :: Enum.t()) ::

lib/event_store/event_store_listener.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
defmodule Shared.EventStoreListener do
2+
@moduledoc false
23
use GenServer
34
require Logger
45
alias Timex.Duration
56
alias EventStore.RecordedEvent
67

78
defmodule ErrorContext do
9+
@moduledoc false
810
defstruct [:error_count, :max_retries, :base_delay_in_ms]
911

1012
@type t :: %__MODULE__{
@@ -265,9 +267,9 @@ defmodule Shared.EventStoreListener do
265267
if ErrorContext.retry?(context) do
266268
ErrorContext.delay(context)
267269

268-
Logger.warning(fn ->
270+
Logger.warning(
269271
"#{name} is retrying (#{context.error_count}/#{context.max_retries}) failed event #{inspect(event)}"
270-
end)
272+
)
271273

272274
handle_event(event, state, context)
273275
else

lib/event_store/link_appendable_events.ex

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
defmodule Shared.LinkAppendableEvents do
2+
@moduledoc false
3+
24
use GenServer
35

46
def child_spec(opts) do

lib/event_store/migration/event.ex

+35-34
Original file line numberDiff line numberDiff line change
@@ -39,50 +39,41 @@ if Code.ensure_loaded?(Ecto) && Code.ensure_loaded?(Shared.Ecto.Term) do
3939
to_string(anzahl_events) <> " Events vom Typ " <> to_string(event_type_to_migrate)
4040
)
4141

42-
Ecto.Adapters.SQL.query!(
43-
repository,
44-
"ALTER TABLE events DISABLE TRIGGER no_update_events"
45-
)
42+
disable_append_only_protection(repository)
4643

47-
Ecto.Adapters.SQL.query!(
48-
repository,
49-
"ALTER TABLE events DISABLE TRIGGER no_delete_events"
44+
repository.transaction(
45+
fn -> Enum.each(events, &do_migrate(&1, migration, repository)) end,
46+
timeout: 600_000_000
5047
)
48+
end
49+
after
50+
enable_append_only_protection(repository)
51+
end
5152

52-
repository.transaction(
53-
fn ->
54-
Enum.each(events, fn event ->
55-
case run_migration(migration, event) do
56-
{new_data, new_metadata} ->
57-
%event_module{} = new_data
58-
event_type = Atom.to_string(event_module)
53+
defp do_migrate(event, migration, repository) do
54+
case run_migration(migration, event) do
55+
{new_data, new_metadata} ->
56+
%event_module{} = new_data
57+
event_type = Atom.to_string(event_module)
5958

60-
{:ok, migrated_at} = DateTime.now("Europe/Berlin")
59+
{:ok, migrated_at} = DateTime.now("Europe/Berlin")
6160

62-
new_metadata =
63-
new_metadata
64-
|> Enum.into(%{})
65-
|> Map.merge(%{migrated_at: migrated_at, original_event: event.data})
61+
new_metadata =
62+
new_metadata
63+
|> Enum.into(%{})
64+
|> Map.merge(%{migrated_at: migrated_at, original_event: event.data})
6665

67-
changeset =
68-
change(event, event_type: event_type, data: new_data, metadata: new_metadata)
66+
changeset =
67+
change(event, event_type: event_type, data: new_data, metadata: new_metadata)
6968

70-
repository.update!(changeset)
69+
repository.update!(changeset)
7170

72-
:skip ->
73-
Logger.info("Skipping event #{event.event_id}")
71+
:skip ->
72+
Logger.info("Skipping event #{event.event_id}")
7473

75-
other ->
76-
Logger.warning("Return value of '#{inspect(other)}' is not supported.")
77-
end
78-
end)
79-
end,
80-
timeout: 600_000_000
81-
)
74+
other ->
75+
Logger.warning("Return value of '#{inspect(other)}' is not supported.")
8276
end
83-
after
84-
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events ENABLE TRIGGER no_delete_events")
85-
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events ENABLE TRIGGER no_update_events")
8677
end
8778

8879
defp run_migration(migration, event) when is_function(migration, 2) do
@@ -98,5 +89,15 @@ if Code.ensure_loaded?(Ecto) && Code.ensure_loaded?(Shared.Ecto.Term) do
9889
correlation_id: event.correlation_id
9990
})
10091
end
92+
93+
defp disable_append_only_protection(repository) do
94+
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events DISABLE TRIGGER no_update_events")
95+
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events DISABLE TRIGGER no_delete_events")
96+
end
97+
98+
defp enable_append_only_protection(repository) do
99+
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events ENABLE TRIGGER no_delete_events")
100+
Ecto.Adapters.SQL.query!(repository, "ALTER TABLE events ENABLE TRIGGER no_update_events")
101+
end
101102
end
102103
end

mix.exs

+5-3
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ defmodule Shared.MixProject do
4545
{:eventstore, ">= 1.2.1"},
4646
{:ecto, "~> 3.0", optional: true},
4747
{:ecto_sql, "~> 3.0", optional: true},
48-
{:mock, "~> 0.3.0", only: :test},
49-
{:timex, "~> 3.7", optional: true}
48+
{:timex, "~> 3.7", optional: true},
49+
{:mock, "~> 0.3.0", only: :test, optional: true},
50+
{:credo, "~> 1.5", only: [:dev, :test], runtime: false, optional: true},
51+
{:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false, optional: true}
5052
]
5153
end
5254

5355
defp description do
54-
"TODO: describe this package"
56+
"Thin wrapper around the Elixir EventStore providing a convenient interface."
5557
end
5658

5759
defp package do

mix.lock

+4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
%{
2+
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
23
"certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"},
34
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
45
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
6+
"credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"},
57
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
68
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
79
"ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"},
@@ -10,6 +12,7 @@
1012
"eventstore": {:hex, :eventstore, "1.4.4", "0b1e0f4af9f034210e24eb6a787006f52c3320baa863a7059d07e88654ef4334", [:mix], [{:fsm, "~> 0.3", [hex: :fsm, repo: "hexpm", optional: false]}, {:gen_stage, "~> 1.2", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.17", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "1cb0b76199dccff9625c2317b4500f51016c7ef6010c0de60e5f89bc6f8cb811"},
1113
"excoveralls": {:hex, :excoveralls, "0.18.0", "b92497e69465dc51bc37a6422226ee690ab437e4c06877e836f1c18daeb35da9", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b"},
1214
"expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"},
15+
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
1316
"fsm": {:hex, :fsm, "0.3.1", "087aa9b02779a84320dc7a2d8464452b5308e29877921b2bde81cdba32a12390", [:mix], [], "hexpm", "fbf0d53f89e9082b326b0b5828b94b4c549ff9d1452bbfd00b4d1ac082208e96"},
1417
"gen_stage": {:hex, :gen_stage, "1.2.1", "19d8b5e9a5996d813b8245338a28246307fd8b9c99d1237de199d21efc4c76a1", [:mix], [], "hexpm", "83e8be657fa05b992ffa6ac1e3af6d57aa50aace8f691fcf696ff02f8335b001"},
1518
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
@@ -20,6 +23,7 @@
2023
"meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"},
2124
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
2225
"mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"},
26+
"mix_test_watch": {:hex, :mix_test_watch, "1.2.0", "1f9acd9e1104f62f280e30fc2243ae5e6d8ddc2f7f4dc9bceb454b9a41c82b42", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "278dc955c20b3fb9a3168b5c2493c2e5cffad133548d307e0a50c7f2cfbf34f6"},
2327
"mock": {:hex, :mock, "0.3.8", "7046a306b71db2488ef54395eeb74df0a7f335a7caca4a3d3875d1fc81c884dd", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "7fa82364c97617d79bb7d15571193fc0c4fe5afd0c932cef09426b3ee6fe2022"},
2428
"parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"},
2529
"postgrex": {:hex, :postgrex, "0.18.0", "f34664101eaca11ff24481ed4c378492fed2ff416cd9b06c399e90f321867d7e", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"},

test/support/event_store.ex

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
defmodule JehovakelEx.EventStore do
2+
@moduledoc false
23
use Shared.EventStore, otp_app: :jehovakel_ex_event_store
34
end

test/support/fake_event.ex

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# section in the documentation for Kernel.defprotocol/2
44

55
defmodule Shared.EventTest.FakeEvent do
6+
@moduledoc false
67
defstruct some: :default
78
end
89

0 commit comments

Comments
 (0)