From a34385db5a7c5ab6cef356199241cea5ce096dbf Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Thu, 28 Apr 2022 00:09:29 +0300 Subject: [PATCH 01/61] Support `:stacktrace` metadata introduced in Ecto 3.8.0 --- README.md | 2 +- assets/screenshot.png | Bin 265308 -> 348258 bytes lib/ecto/dev_logger.ex | 42 ++++++++++++++++++++++++++++++---- mix.exs | 2 +- mix.lock | 14 ++++++------ test/ecto/dev_logger_test.exs | 1 + 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9cf1b76..b7f96aa 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.1"} + {:ecto_dev_logger, "~> 0.2"} ] end ``` diff --git a/assets/screenshot.png b/assets/screenshot.png index 8e25bb44ef58e44d184d899dc15ec1b8ba1e91f8..cdc85e70629b058f990ec0c8f4337fc4fe1765ef 100644 GIT binary patch literal 348258 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

QxosjmJxYAfk|JaZ&MjpYJ|D#CJl#U%zHE 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 z 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≀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

M{iwr*EZ!w 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 z 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"d~M*|fAA$)6cx42TJ9}NV2gZMW`}*5waG}Y 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

|hC30iz|GUraFQ&3w+sRN0#&z+hZ+2cSE|a@ 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 diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 439d7ae..f950820 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -69,16 +69,17 @@ defmodule Ecto.DevLogger do :ok end - defp log_sql_iodata(query, measurements, %{result: result, source: source}, color) do + defp log_sql_iodata(query, measurements, metadata, color) do [ "QUERY", ?\s, - log_ok_error(result), - log_ok_source(source, color), + log_ok_error(metadata.result), + log_ok_source(metadata.source, color), log_time("db", measurements, :query_time, true, color), log_time("decode", measurements, :decode_time, false, color), ?\n, - query + query, + log_stacktrace(metadata[:stacktrace], metadata.repo, color) ] end @@ -228,4 +229,37 @@ defmodule Ecto.DevLogger do defp in_quotes(string) do "'#{String.replace(string, "'", "''")}'" end + + defp log_stacktrace(stacktrace, repo, color) do + with [_ | _] <- stacktrace, + {module, function, arity, info} <- last_non_ecto(Enum.reverse(stacktrace), repo, nil) do + [ + IO.ANSI.light_black(), + ?\n, + "↳ ", + Exception.format_mfa(module, function, arity), + log_stacktrace_info(info), + apply(IO.ANSI, color, []) + ] + else + _ -> [] + end + end + + defp log_stacktrace_info([file: file, line: line] ++ _) do + [", at: ", file, ?:, Integer.to_string(line)] + end + + defp log_stacktrace_info(_) do + [] + end + + @repo_modules [Ecto.Repo.Queryable, Ecto.Repo.Schema, Ecto.Repo.Transaction] + + defp last_non_ecto([{mod, _, _, _} | _stacktrace], repo, last) + when mod == repo or mod in @repo_modules, + do: last + + defp last_non_ecto([last | stacktrace], repo, _last), do: last_non_ecto(stacktrace, repo, last) + defp last_non_ecto([], _repo, last), do: last end diff --git a/mix.exs b/mix.exs index 45100fd..fd71381 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.1.4" + @version "0.2.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do diff --git a/mix.lock b/mix.lock index c28c75f..89128bc 100644 --- a/mix.lock +++ b/mix.lock @@ -2,15 +2,15 @@ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.20", "89970db71b11b6b89759ce16807e857df154f8df3e807b2920a8c39834a9e5cf", [:mix], [], "hexpm", "1eb0d2dabeeeff200e0d17dc3048a6045aab271f73ebb82e416464832eb57bdd"}, - "ecto": {:hex, :ecto, "3.7.1", "a20598862351b29f80f285b21ec5297da1181c0442687f9b8329f0445d228892", [:mix], [{:decimal, "~> 1.6 or ~> 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", "d36e5b39fc479e654cffd4dbe1865d9716e4a9b6311faff799b6f90ab81b8638"}, - "ecto_sql": {:hex, :ecto_sql, "3.7.2", "55c60aa3a06168912abf145c6df38b0295c34118c3624cf7a6977cd6ce043081", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0 or ~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c218ea62f305dcaef0b915fb56583195e7b91c91dcfb006ba1f669bfacbff2a"}, - "ex_doc": {:hex, :ex_doc, "0.28.2", "e031c7d1a9fc40959da7bf89e2dc269ddc5de631f9bd0e326cbddf7d8085a9da", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "51ee866993ffbd0e41c084a7677c570d0fc50cb85c6b5e76f8d936d9587fa719"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"}, + "ecto": {:hex, :ecto, "3.8.1", "35e0bd8c8eb772e14a5191a538cd079706ecb45164ea08a7523b4fc69ab70f56", [:mix], [{:decimal, "~> 1.6 or ~> 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", "f1b68f8d5fe3ab89e24f57c03db5b5d0aed3602077972098b3a6006a1be4b69b"}, + "ecto_sql": {:hex, :ecto_sql, "3.8.0", "b00d2080e523f2aff6100f22305c1c748016570b9cebf5b29cc61d4924b038c2", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8a273619e05c4924b225d526810641e0bae8b0aa114b9cbe3cc5c70cf9e5d607"}, + "ex_doc": {:hex, :ex_doc, "0.28.3", "6eea2f69995f5fba94cd6dd398df369fe4e777a47cd887714a0976930615c9e6", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "05387a6a2655b5f9820f3f627450ed20b4325c25977b2ee69bed90af6688e718"}, "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "postgrex": {:hex, :postgrex, "0.16.2", "0f83198d0e73a36e8d716b90f45f3bde75b5eebf4ade4f43fa1f88c90a812f74", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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]}], "hexpm", "a9ea589754d9d4d076121090662b7afe155b374897a6550eb288f11d755acfa0"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, + "postgrex": {:hex, :postgrex, "0.16.3", "fac79a81a9a234b11c44235a4494d8565303fa4b9147acf57e48978a074971db", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "aeaae1d2d1322da4e5fe90d241b0a564ce03a3add09d7270fb85362166194590"}, + "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, } diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 3e1c0ce..d0dac07 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -129,6 +129,7 @@ defmodule Ecto.DevLoggerTest do password: "postgres", port: 5432, log: false, + stacktrace: true, pool_size: 10 ] end From 7d846c4fb3dd7236cbb86d1492b5a4c0be12dc3b Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 1 May 2022 16:05:37 +0300 Subject: [PATCH 02/61] Handle `nil` as `NULL` --- lib/ecto/dev_logger.ex | 1 + mix.exs | 2 +- test/ecto/dev_logger_test.exs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index f950820..4bc862f 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -135,6 +135,7 @@ defmodule Ecto.DevLogger do defp sql_color("commit" <> _), do: :magenta defp sql_color(_), do: :default_color + defp stringify_ecto_params(nil, _level), do: "NULL" defp stringify_ecto_params(binding, _level) when is_float(binding) or is_integer(binding) or is_atom(binding), do: to_string(binding) diff --git a/mix.exs b/mix.exs index fd71381..4750f9e 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.2.0" + @version "0.2.1" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index d0dac07..5c58ef7 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -109,7 +109,7 @@ defmodule Ecto.DevLoggerTest do }) post = Repo.get!(Post, post_id) - post = post |> Ecto.Changeset.change(string: "Post '2'") |> Repo.update!() + post = post |> Ecto.Changeset.change(string: nil) |> Repo.update!() Repo.delete!(post) Enum.each([0.02, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15], fn duration -> From a8fe155ac44b81b6009821cfc554305175cb65d3 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 31 May 2022 19:16:52 +0300 Subject: [PATCH 03/61] Don't return to original color when log stacktrace it is the last item in the log --- lib/ecto/dev_logger.ex | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 4bc862f..5b3d4a4 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -79,7 +79,7 @@ defmodule Ecto.DevLogger do log_time("decode", measurements, :decode_time, false, color), ?\n, query, - log_stacktrace(metadata[:stacktrace], metadata.repo, color) + log_stacktrace(metadata[:stacktrace], metadata.repo) ] end @@ -231,7 +231,7 @@ defmodule Ecto.DevLogger do "'#{String.replace(string, "'", "''")}'" end - defp log_stacktrace(stacktrace, repo, color) do + defp log_stacktrace(stacktrace, repo) do with [_ | _] <- stacktrace, {module, function, arity, info} <- last_non_ecto(Enum.reverse(stacktrace), repo, nil) do [ @@ -239,8 +239,7 @@ defmodule Ecto.DevLogger do ?\n, "↳ ", Exception.format_mfa(module, function, arity), - log_stacktrace_info(info), - apply(IO.ANSI, color, []) + log_stacktrace_info(info) ] else _ -> [] From f7629f387bd9a887e726b0b22a8cee10ddec1a11 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 31 May 2022 20:01:06 +0300 Subject: [PATCH 04/61] Ignore content of the previously inlined parameters Now bindings are replaced in a single pass --- lib/ecto/dev_logger.ex | 57 ++++++++++++++++++++--------------- mix.exs | 2 +- test/ecto/dev_logger_test.exs | 5 ++- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 5b3d4a4..55c863a 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -41,27 +41,14 @@ defmodule Ecto.DevLogger do ) :: :ok def telemetry_handler(_event_name, measurements, metadata, _config) do unless oban_query?(metadata) do - query_string = String.Chars.to_string(metadata.query) - color = sql_color(query_string) + query = String.Chars.to_string(metadata.query) + color = sql_color(query) repo_adapter = metadata[:repo].__adapter__() - query_string = - metadata.params - |> Enum.with_index(1) - |> Enum.reverse() - |> Enum.reduce(query_string, fn {binding, index}, query -> - replacement = - to_string([ - IO.ANSI.color(0, 2, 3), - stringify_ecto_params(binding, :root), - apply(IO.ANSI, color, []) - ]) - - replace_params(repo_adapter, query, index, replacement) - end) + query = inline_params(query, metadata.params, color, repo_adapter) Logger.debug( - fn -> log_sql_iodata(query_string, measurements, metadata, color) end, + fn -> log_sql_iodata(query, measurements, metadata, color) end, ansi_color: color ) end @@ -69,6 +56,33 @@ defmodule Ecto.DevLogger do :ok end + def inline_params(query, params, return_to_color, repo_adapter) do + params_by_index = + params + |> Enum.with_index(1) + |> Map.new(fn {value, index} -> {index, value} end) + + prefix_symbol = prefix_symbol(repo_adapter) + + String.replace(query, ~r/#{Regex.escape(prefix_symbol)}\d+/, fn + <<_prefix::utf8, index::binary>> = replacement -> + case Map.fetch(params_by_index, String.to_integer(index)) do + {:ok, value} -> + [ + IO.ANSI.color(0, 2, 3), + stringify_ecto_params(value, :root), + apply(IO.ANSI, return_to_color, []) + ] + + :error -> + replacement + end + end) + end + + defp prefix_symbol(Ecto.Adapters.Tds), do: "@" + defp prefix_symbol(_), do: "$" + defp log_sql_iodata(query, measurements, metadata, color) do [ "QUERY", @@ -136,6 +150,7 @@ defmodule Ecto.DevLogger do defp sql_color(_), do: :default_color defp stringify_ecto_params(nil, _level), do: "NULL" + defp stringify_ecto_params(binding, _level) when is_float(binding) or is_integer(binding) or is_atom(binding), do: to_string(binding) @@ -219,14 +234,6 @@ defmodule Ecto.DevLogger do Jason.encode!(map) end - defp replace_params(Ecto.Adapters.Tds, query, index, replacement) do - String.replace(query, "@#{index}", replacement) - end - - defp replace_params(_adapter, query, index, replacement) do - String.replace(query, "$#{index}", replacement) - end - defp in_quotes(string) do "'#{String.replace(string, "'", "''")}'" end diff --git a/mix.exs b/mix.exs index 4750f9e..80342c6 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.2.1" + @version "0.2.2" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 5c58ef7..d0848fa 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -47,6 +47,7 @@ defmodule Ecto.DevLoggerTest do field(:multi_money, {:array, Money.Ecto.Type}) field(:datetime, :utc_datetime_usec) field(:naive_datetime, :naive_datetime_usec) + field(:password_digest, :string) end end @@ -73,6 +74,7 @@ defmodule Ecto.DevLoggerTest do array_of_strings text[], money money_type, multi_money money_type[], + password_digest text, datetime timestamp without time zone NOT NULL, naive_datetime timestamp without time zone NOT NULL ) @@ -105,7 +107,8 @@ defmodule Ecto.DevLoggerTest do money: %Money{currency: "USD", value: 390}, multi_money: [%Money{currency: "USD", value: 230}, %Money{currency: "USD", value: 180}], datetime: DateTime.utc_now(), - naive_datetime: NaiveDateTime.utc_now() + naive_datetime: NaiveDateTime.utc_now(), + password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd" }) post = Repo.get!(Post, post_id) From 3924d55ce4a75556fd3e2bd7ecc793039f57da72 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 31 May 2022 20:12:34 +0300 Subject: [PATCH 05/61] Make inline_params private --- lib/ecto/dev_logger.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 55c863a..1e83161 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -56,7 +56,7 @@ defmodule Ecto.DevLogger do :ok end - def inline_params(query, params, return_to_color, repo_adapter) do + defp inline_params(query, params, return_to_color, repo_adapter) do params_by_index = params |> Enum.with_index(1) From 78bf24704bc5b9e457be8112bf5fb327a481f86d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 24 Jun 2022 00:58:12 +0300 Subject: [PATCH 06/61] Support `Ecto.Adapters.MyXQL` adapter --- lib/ecto/dev_logger.ex | 51 +++++++++++++++++++++++++++++------ test/ecto/dev_logger_test.exs | 39 +++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 1e83161..a3906c5 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -45,10 +45,12 @@ defmodule Ecto.DevLogger do color = sql_color(query) repo_adapter = metadata[:repo].__adapter__() - query = inline_params(query, metadata.params, color, repo_adapter) - Logger.debug( - fn -> log_sql_iodata(query, measurements, metadata, color) end, + fn -> + query + |> inline_params(metadata.params, color, repo_adapter) + |> log_sql_iodata(measurements, metadata, color) + end, ansi_color: color ) end @@ -56,15 +58,21 @@ defmodule Ecto.DevLogger do :ok end - defp inline_params(query, params, return_to_color, repo_adapter) do + @doc false + def inline_params(query, params, _return_to_color, _repo_adapter) when map_size(params) == 0 do + query + end + + def inline_params(query, params, return_to_color, repo_adapter) + when repo_adapter in [Ecto.Adapters.Postgres, Ecto.Adapters.Tds] do params_by_index = params |> Enum.with_index(1) |> Map.new(fn {value, index} -> {index, value} end) - prefix_symbol = prefix_symbol(repo_adapter) + placeholder_with_number_regex = placeholder_with_number_regex(repo_adapter) - String.replace(query, ~r/#{Regex.escape(prefix_symbol)}\d+/, fn + String.replace(query, placeholder_with_number_regex, fn <<_prefix::utf8, index::binary>> = replacement -> case Map.fetch(params_by_index, String.to_integer(index)) do {:ok, value} -> @@ -80,8 +88,35 @@ defmodule Ecto.DevLogger do end) end - defp prefix_symbol(Ecto.Adapters.Tds), do: "@" - defp prefix_symbol(_), do: "$" + def inline_params(query, params, return_to_color, Ecto.Adapters.MyXQL) do + params_by_index = + params + |> Enum.with_index() + |> Map.new(fn {value, index} -> {index, value} end) + + query + |> String.split("?") + |> Enum.map_reduce(0, fn elem, index -> + formatted_value = + case Map.fetch(params_by_index, index) do + {:ok, value} -> + [ + IO.ANSI.color(0, 2, 3), + stringify_ecto_params(value, :root), + apply(IO.ANSI, return_to_color, []) + ] + + :error -> + [] + end + + {[elem, formatted_value], index + 1} + end) + |> elem(0) + end + + defp placeholder_with_number_regex(Ecto.Adapters.Postgres), do: ~r/\$\d+/ + defp placeholder_with_number_regex(Ecto.Adapters.Tds), do: ~r/@\d+/ defp log_sql_iodata(query, measurements, metadata, color) do [ diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index d0848fa..b46c246 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -120,6 +120,45 @@ defmodule Ecto.DevLoggerTest do end) end + describe "inline_params/4" do + @params [ + nil, + <<95, 131, 49, 101, 176, 212, 77, 86, 178, 31, 80, 13, 41, 189, 148, 174>> + ] + @return_to_color :yellow + test "Postgres" do + assert Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.Postgres + ) == + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + end + + test "Tds" do + assert Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.Tds + ) == + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + end + + test "MySQL" do + assert to_string( + Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.MyXQL + ) + ) == + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + end + end + defp config do [ telemetry_prefix: [:my_test_app, :repo], From 57b4e98d6f04a443af479d746672b4079c3d0fa6 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 24 Jun 2022 10:06:43 +0300 Subject: [PATCH 07/61] Bump version to 0.3.0 --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7f96aa..bf3d51e 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.2"} + {:ecto_dev_logger, "~> 0.3"} ] end ``` diff --git a/mix.exs b/mix.exs index 80342c6..488d2bd 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.2.2" + @version "0.3.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 68284feb6d1c61629837bf958c5560d6d6909933 Mon Sep 17 00:00:00 2001 From: Steve Hall Date: Sun, 26 Jun 2022 11:57:03 +0100 Subject: [PATCH 08/61] Multiple Repo support (#11) * Multiple Repo support * Ensure that each call to `telemetry.attach/4` receives a unique handler_id based on the telemetry prefix of the repo. * `Ecto.DevLogger.install/2` now returns the result from `telemetry.attach/4` allowing users to confirm successful setup. * Add public `Ecto.DevLogger.uninstall/1` to support calling `telemetry.detach/1` with the correct handler_id. * Add public `Ecto.DevLogger.handler_id/1` to support introspection of telemetry handler ids. * Add configuration to allow users to add the repo name into the log to enable distinguishing between queries on different repos. * Refactor test setup & teardown to support setting up multiple repos. * Tests for the above * Update specs and add documentation for new options and functions. Co-authored-by: Steve Hall --- lib/ecto/dev_logger.ex | 54 +++++-- test/ecto/dev_logger_test.exs | 278 +++++++++++++++++++++++++++------- 2 files changed, 272 insertions(+), 60 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index a3906c5..5c118b5 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -11,24 +11,49 @@ defmodule Ecto.DevLogger do @doc """ Attaches `telemetry_handler/4` to application. + + Returns the result from the call to `:telemetry.attach/4` or `:ok` if the repo has default logging enabled. + + ## Options + + * `:log_repo_name` - When truthy will add the repo name into the log """ - @spec install(repo_module :: module()) :: :ok - def install(repo_module) when is_atom(repo_module) do + @spec install(repo_module :: module(), opts :: Keyword.t()) :: :ok | {:error, :already_exists} + def install(repo_module, opts \\ []) when is_atom(repo_module) do config = repo_module.config() if config[:log] == false do :telemetry.attach( - "ecto.dev_logger", + handler_id(repo_module), config[:telemetry_prefix] ++ [:query], &__MODULE__.telemetry_handler/4, - nil + opts ) + else + :ok end + end - :ok + @doc """ + Detaches a previously attached handler for a given Repo. + + Returns the result from the call to `:telemetry.detach/1` + """ + @spec uninstall(repo_module :: module()) :: :ok | {:error, :not_found} + def uninstall(repo_module) when is_atom(repo_module) do + :telemetry.detach(handler_id(repo_module)) end - defp oban_query?(metadata) do + @doc """ + Gets the handler_id for a given Repo. + """ + @spec handler_id(repo_module :: module()) :: list() + def handler_id(repo_module) do + config = repo_module.config() + [:ecto_dev_logger] ++ config[:telemetry_prefix] + end + + def oban_query?(metadata) do not is_nil(metadata[:options][:oban_conf]) end @@ -39,7 +64,7 @@ defmodule Ecto.DevLogger do :telemetry.event_metadata(), :telemetry.handler_config() ) :: :ok - def telemetry_handler(_event_name, measurements, metadata, _config) do + def telemetry_handler(_event_name, measurements, metadata, config) do unless oban_query?(metadata) do query = String.Chars.to_string(metadata.query) color = sql_color(query) @@ -49,7 +74,7 @@ defmodule Ecto.DevLogger do fn -> query |> inline_params(metadata.params, color, repo_adapter) - |> log_sql_iodata(measurements, metadata, color) + |> log_sql_iodata(measurements, metadata, color, config) end, ansi_color: color ) @@ -118,12 +143,13 @@ defmodule Ecto.DevLogger do defp placeholder_with_number_regex(Ecto.Adapters.Postgres), do: ~r/\$\d+/ defp placeholder_with_number_regex(Ecto.Adapters.Tds), do: ~r/@\d+/ - defp log_sql_iodata(query, measurements, metadata, color) do + defp log_sql_iodata(query, measurements, metadata, color, config) do [ "QUERY", ?\s, log_ok_error(metadata.result), log_ok_source(metadata.source, color), + log_repo(metadata.repo, color, config), log_time("db", measurements, :query_time, true, color), log_time("decode", measurements, :decode_time, false, color), ?\n, @@ -135,6 +161,16 @@ defmodule Ecto.DevLogger do defp log_ok_error({:ok, _res}), do: "OK" defp log_ok_error({:error, _err}), do: "ERROR" + defp log_repo(nil, _color, _config), do: "" + + defp log_repo(repo, color, config) do + Keyword.get(config, :log_repo_name, false) + |> case do + true -> [" repo=", IO.ANSI.blue(), inspect(repo), apply(IO.ANSI, color, [])] + _ -> "" + end + end + defp log_ok_source(nil, _color), do: "" defp log_ok_source(source, color), diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index b46c246..835cc86 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -2,7 +2,45 @@ defmodule Ecto.DevLoggerTest do use ExUnit.Case defmodule Repo do - use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :does_not_matter + use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :my_test_app + + def get_config() do + [ + telemetry_prefix: [:my_test_app, :repo], + otp_app: :my_test_app, + timeout: 15_000, + migration_timestamps: [type: :naive_datetime_usec], + database: "ecto_dev_logger_test", + hostname: "localhost", + username: "postgres", + password: "postgres", + port: 5432, + log: false, + stacktrace: true, + pool_size: 10 + ] + end + end + + defmodule Repo2 do + use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :my_test_app + + def get_config() do + [ + telemetry_prefix: [:my_test_app, :repo2], + otp_app: :my_test_app, + timeout: 15_000, + migration_timestamps: [type: :naive_datetime_usec], + database: "ecto_dev_logger_test2", + hostname: "localhost", + username: "postgres", + password: "postgres", + port: 5432, + log: false, + stacktrace: true, + pool_size: 10 + ] + end end defmodule Money do @@ -52,43 +90,11 @@ defmodule Ecto.DevLoggerTest do end setup do - Repo.__adapter__().storage_down(config()) - Repo.__adapter__().storage_up(config()) - {:ok, _} = Repo.start_link(config()) - - Repo.query!("CREATE EXTENSION \"pgcrypto\";") - - Repo.query!(""" - CREATE TYPE money_type AS (currency char(3), value integer); - """) - - Repo.query!(""" - CREATE TABLE posts ( - id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), - string text, - "binary" bytea, - map jsonb, - integer integer, - decimal numeric, - date date, - array_of_strings text[], - money money_type, - multi_money money_type[], - password_digest text, - datetime timestamp without time zone NOT NULL, - naive_datetime timestamp without time zone NOT NULL - ) - """) - - :telemetry.attach( - "ecto.dev_logger", - [:my_test_app, :repo, :query], - &Ecto.DevLogger.telemetry_handler/4, - nil - ) + setup_repo(Repo) + Ecto.DevLogger.install(Repo) on_exit(fn -> - Repo.__adapter__().storage_down(config()) + teardown_repo(Repo) end) end @@ -159,20 +165,190 @@ defmodule Ecto.DevLoggerTest do end end - defp config do - [ - telemetry_prefix: [:my_test_app, :repo], - otp_app: :my_test_app, - timeout: 15000, - migration_timestamps: [type: :naive_datetime_usec], - database: "ecto_dev_logger_test", - hostname: "localhost", - username: "postgres", - password: "postgres", - port: 5432, - log: false, - stacktrace: true, - pool_size: 10 - ] + test "install returns error from failure to attach " do + assert {:error, :already_exists} = Ecto.DevLogger.install(Repo) + end + + test "handler_id\1" do + assert [:ecto_dev_logger, :my_test_app, :repo] = Ecto.DevLogger.handler_id(Repo) + end + + describe "multiple repos" do + setup do + setup_repo(Repo2) + + on_exit(fn -> + teardown_repo(Repo2) + end) + end + + test "install of second repo works" do + assert :ok = Ecto.DevLogger.install(Repo2) + repo1_prefix = Repo.config()[:telemetry_prefix] + [repo1_handler] = :telemetry.list_handlers(repo1_prefix) + repo2_prefix = Repo2.config()[:telemetry_prefix] + [repo2_handler] = :telemetry.list_handlers(repo2_prefix) + # Confirm that there is a distinct handler ID for each repo + assert repo1_handler.id != repo2_handler.id + end + + test "logging for two repos, with repo name" do + ## Use options to enable logging of repo name on second repo + assert :ok = Ecto.DevLogger.install(Repo2, log_repo_name: true) + + # Log some basic queries + repo1_log = + ExUnit.CaptureLog.capture_log(fn -> + %{id: post_id} = + Repo.insert!(%Post{ + datetime: ~U[2022-06-25T14:30:16.639767Z], + naive_datetime: ~N[2022-06-25T14:30:16.643949] + }) + + Repo.get!(Post, post_id) + :ok + end) + + [ + repo1_insert_start, + repo1_insert_status, + repo1_insert_query, + repo1_insert_location, + repo1_select_start, + repo1_select_status, + repo1_select_query, + repo1_select_location, + _close + ] = String.split(repo1_log, "\n") + + ## Confirm that the original repo's logging is not changed by the addition of a second repo + assert repo1_insert_start == "\e[32m" + assert repo1_insert_status =~ ~r/\[debug\] QUERY OK db=\d+\.\d+ms/ + + assert repo1_insert_query == + "INSERT INTO \"posts\" (\"datetime\",\"naive_datetime\") VALUES (\e[38;5;31m'2022-06-25T14:30:16.639767Z'\e[32m,\e[38;5;31m'2022-06-25T14:30:16.643949'\e[32m) RETURNING \"id\"\e[90m" + + assert repo1_insert_location =~ + ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ + + assert repo1_select_start == "\e[0m\e[36m" + + assert repo1_select_status =~ + ~r/\[debug\] QUERY OK source=\e\[34m\"posts\"\e\[36m db=\d+\.\d+ms/ + + select_query_regex = + (Regex.escape( + "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" + ) <> + "[-0-9a-fA-F]+" <> + Regex.escape("'\e[36m)\e[90m")) + |> Regex.compile!() + + assert repo1_select_query =~ select_query_regex + + assert repo1_select_location =~ + ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ + + repo2_log = + ExUnit.CaptureLog.capture_log(fn -> + %{id: post_id} = + Repo2.insert!(%Post{ + datetime: ~U[2022-06-25T14:30:16.639767Z], + naive_datetime: ~N[2022-06-25T14:30:16.643949] + }) + + Repo2.get!(Post, post_id) + :ok + end) + + [ + repo2_insert_start, + repo2_insert_status, + repo2_insert_query, + repo2_insert_location, + repo2_select_start, + repo2_select_status, + repo2_select_query, + repo2_select_location, + _close + ] = String.split(repo2_log, "\n") + + ## Confirm that the logging remains the same apart from the addition of the repo name in the status line. + assert repo2_insert_start == repo1_insert_start + + assert repo2_insert_status =~ + ~r/\[debug\] QUERY OK repo=\e\[34mEcto.DevLoggerTest.Repo2\e\[\d+m db=\d+\.\d+ms/ + + assert repo2_insert_query == repo1_insert_query + + assert repo2_insert_location =~ + ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ + + assert repo2_select_start == repo1_select_start + + assert repo2_select_status =~ + ~r/\[debug\] QUERY OK source=\e\[34m\"posts\"\e\[36m repo=\e\[34mEcto.DevLoggerTest.Repo2\e\[\d+m db=\d+\.\d+ms/ + + assert repo2_select_query =~ select_query_regex + + assert repo2_select_location =~ + ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ + end + end + + defp setup_repo(repo_module, log_sql_statements \\ false) do + config = repo_module.get_config() + + Application.put_env(:my_test_app, repo_module, config) + repo_module.__adapter__().storage_down(config) + repo_module.__adapter__().storage_up(config) + repo_pid = start_supervised!(repo_module) + + repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], log: log_sql_statements) + + repo_module.query!( + """ + CREATE TYPE money_type AS (currency char(3), value integer); + """, + [], + log: log_sql_statements + ) + + repo_module.query!( + """ + CREATE TABLE posts ( + id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), + string text, + "binary" bytea, + map jsonb, + integer integer, + decimal numeric, + date date, + array_of_strings text[], + money money_type, + multi_money money_type[], + password_digest text, + datetime timestamp without time zone NOT NULL, + naive_datetime timestamp without time zone NOT NULL + ) + """, + [], + log: log_sql_statements + ) + + ## Swallow the reload warning after changing DB structure. + assert ExUnit.CaptureLog.capture_log(fn -> + repo_module.query!("SELECT * FROM posts") + end) =~ + "forcing us to reload type information from the database. This is expected behaviour whenever you migrate your database." + + repo_pid + end + + defp teardown_repo(repo_module) do + Ecto.DevLogger.uninstall(repo_module) + + config = repo_module.get_config() + repo_module.__adapter__().storage_down(config) end end From 4ed6e6ff769c7e3d28105c831a956dfe29a582a6 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 26 Jun 2022 13:58:35 +0300 Subject: [PATCH 09/61] Bump version to 0.4.0 --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bf3d51e..8a96ff7 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.3"} + {:ecto_dev_logger, "~> 0.4"} ] end ``` diff --git a/mix.exs b/mix.exs index 488d2bd..dc377d9 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.3.0" + @version "0.4.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 56f3114c28e0bd3b3863e069a35507e7cce268a0 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Thu, 14 Jul 2022 19:37:19 +0300 Subject: [PATCH 10/61] Don't log migration checks https://github.com/phoenixframework/phoenix_ecto/issues/152 --- lib/ecto/dev_logger.ex | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 5c118b5..1b1c9c7 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -53,10 +53,14 @@ defmodule Ecto.DevLogger do [:ecto_dev_logger] ++ config[:telemetry_prefix] end - def oban_query?(metadata) do + defp oban_query?(metadata) do not is_nil(metadata[:options][:oban_conf]) end + defp schema_migration?(metadata) do + metadata[:options][:schema_migration] == true + end + @doc "Telemetry handler which logs queries." @spec telemetry_handler( :telemetry.event_name(), @@ -65,7 +69,9 @@ defmodule Ecto.DevLogger do :telemetry.handler_config() ) :: :ok def telemetry_handler(_event_name, measurements, metadata, config) do - unless oban_query?(metadata) do + if oban_query?(metadata) or schema_migration?(metadata) do + :ok + else query = String.Chars.to_string(metadata.query) color = sql_color(query) repo_adapter = metadata[:repo].__adapter__() @@ -79,8 +85,6 @@ defmodule Ecto.DevLogger do ansi_color: color ) end - - :ok end @doc false From c984bc14d238db6fe264912039698e62455c3cb6 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Thu, 14 Jul 2022 19:38:25 +0300 Subject: [PATCH 11/61] Bump version to 0.4.1 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index dc377d9..6e2cde5 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.4.0" + @version "0.4.1" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 317a470211980873b7fbdd3e824313b5f10350ff Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Mon, 1 Aug 2022 19:54:12 +0300 Subject: [PATCH 12/61] Use `:ansi_enabled` configuration value --- lib/ecto/dev_logger.ex | 48 ++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 1b1c9c7..773c5e4 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -105,11 +105,9 @@ defmodule Ecto.DevLogger do <<_prefix::utf8, index::binary>> = replacement -> case Map.fetch(params_by_index, String.to_integer(index)) do {:ok, value} -> - [ - IO.ANSI.color(0, 2, 3), - stringify_ecto_params(value, :root), - apply(IO.ANSI, return_to_color, []) - ] + value + |> stringify_ecto_params(:root) + |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) :error -> replacement @@ -129,11 +127,9 @@ defmodule Ecto.DevLogger do formatted_value = case Map.fetch(params_by_index, index) do {:ok, value} -> - [ - IO.ANSI.color(0, 2, 3), - stringify_ecto_params(value, :root), - apply(IO.ANSI, return_to_color, []) - ] + value + |> stringify_ecto_params(:root) + |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) :error -> [] @@ -170,7 +166,7 @@ defmodule Ecto.DevLogger do defp log_repo(repo, color, config) do Keyword.get(config, :log_repo_name, false) |> case do - true -> [" repo=", IO.ANSI.blue(), inspect(repo), apply(IO.ANSI, color, [])] + true -> [" repo=", colorize(inspect(repo), IO.ANSI.blue(), apply(IO.ANSI, color, []))] _ -> "" end end @@ -178,7 +174,7 @@ defmodule Ecto.DevLogger do defp log_ok_source(nil, _color), do: "" defp log_ok_source(source, color), - do: [" source=", IO.ANSI.blue(), inspect(source), apply(IO.ANSI, color, [])] + do: [" source=", colorize(inspect(source), IO.ANSI.blue(), apply(IO.ANSI, color, []))] defp log_time(label, measurements, key, force, color) do case measurements do @@ -191,7 +187,7 @@ defmodule Ecto.DevLogger do case duration_color(ms) do nil -> line - duration_color -> [duration_color, line, apply(IO.ANSI, color, [])] + duration_color -> colorize(line, duration_color, apply(IO.ANSI, color, [])) end else [] @@ -204,13 +200,15 @@ defmodule Ecto.DevLogger do @colorize_step 25 defp duration_color(duration) do - # don't colorize if duration < @colorize_step - duration = duration - @colorize_step - - if duration > 0 do - # then every @colorize_step ms apply color from RGB(5, 5, 0) to RGB(5, 0, 0) (simple gradient from yellow to red) - green = 5 - min(div(floor(duration), @colorize_step), 5) - IO.ANSI.color(5, green, 0) + if IO.ANSI.enabled?() do + # don't colorize if duration < @colorize_step + duration = duration - @colorize_step + + if duration > 0 do + # then every @colorize_step ms apply color from RGB(5, 5, 0) to RGB(5, 0, 0) (simple gradient from yellow to red) + green = 5 - min(div(floor(duration), @colorize_step), 5) + IO.ANSI.color(5, green, 0) + end end end @@ -224,6 +222,14 @@ defmodule Ecto.DevLogger do defp sql_color("commit" <> _), do: :magenta defp sql_color(_), do: :default_color + defp colorize(term, color, return_to_color) do + if IO.ANSI.enabled?() do + [color, term, return_to_color] + else + term + end + end + defp stringify_ecto_params(nil, _level), do: "NULL" defp stringify_ecto_params(binding, _level) @@ -317,7 +323,7 @@ defmodule Ecto.DevLogger do with [_ | _] <- stacktrace, {module, function, arity, info} <- last_non_ecto(Enum.reverse(stacktrace), repo, nil) do [ - IO.ANSI.light_black(), + if(IO.ANSI.enabled?(), do: IO.ANSI.light_black(), else: ""), ?\n, "↳ ", Exception.format_mfa(module, function, arity), From cca2b36fc2f9bf516308bdb668b9dfb4a8ea866f Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Mon, 1 Aug 2022 19:55:07 +0300 Subject: [PATCH 13/61] Bump version to 0.4.2 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 6e2cde5..fecc7cf 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.4.1" + @version "0.4.2" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 2c8dd175de7aa4531ae831995a881030ac1d7405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Pr=C3=A9vost?= Date: Tue, 30 Aug 2022 04:09:15 -0400 Subject: [PATCH 14/61] Fix support of child list as inline params serialize (#13) --- lib/ecto/dev_logger.ex | 4 ++++ test/ecto/dev_logger_test.exs | 17 +++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 773c5e4..50aee11 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -315,6 +315,10 @@ defmodule Ecto.DevLogger do Jason.encode!(map) end + defp stringify_ecto_params(list, :child) when is_list(list) do + Jason.encode!(Enum.map(list, &stringify_ecto_params(&1, :child))) + end + defp in_quotes(string) do "'#{String.replace(string, "'", "''")}'" end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 835cc86..f334a09 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -129,39 +129,40 @@ defmodule Ecto.DevLoggerTest do describe "inline_params/4" do @params [ nil, - <<95, 131, 49, 101, 176, 212, 77, 86, 178, 31, 80, 13, 41, 189, 148, 174>> + <<95, 131, 49, 101, 176, 212, 77, 86, 178, 31, 80, 13, 41, 189, 148, 174>>, + [["test"]] ] @return_to_color :yellow test "Postgres" do assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 AND \"array_of_array_of_string\" = $3 RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.Postgres ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" end test "Tds" do assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 AND \"array_of_array_of_string\" = @3 RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.Tds ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" end test "MySQL" do assert to_string( Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? AND \"array_of_array_of_string\" = ? RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.MyXQL ) ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" end end @@ -273,7 +274,7 @@ defmodule Ecto.DevLoggerTest do _close ] = String.split(repo2_log, "\n") - ## Confirm that the logging remains the same apart from the addition of the repo name in the status line. + ## Confirm that the logging remains the same apart from the addition of the repo name in the status line. assert repo2_insert_start == repo1_insert_start assert repo2_insert_status =~ From fc27ad781bf2ca0017f24b2e9477c4711dabf76d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 30 Aug 2022 11:10:17 +0300 Subject: [PATCH 15/61] Bump version to 0.4.3 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index fecc7cf..7c355b8 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.4.2" + @version "0.4.3" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From c15488d280ad1acf821ec0928c978d11418d68e4 Mon Sep 17 00:00:00 2001 From: Trond A Ekseth Date: Thu, 13 Oct 2022 13:32:55 +0200 Subject: [PATCH 16/61] Support Time struct (#15) --- lib/ecto/dev_logger.ex | 6 +++++- test/ecto/dev_logger_test.exs | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 50aee11..7f30013 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -279,7 +279,7 @@ defmodule Ecto.DevLogger do end defp stringify_ecto_params(%module{} = date, :root) - when module in [Date, DateTime, NaiveDateTime] do + when module in [Date, Time, DateTime, NaiveDateTime] do date |> stringify_ecto_params(:child) |> in_quotes() end @@ -303,6 +303,10 @@ defmodule Ecto.DevLogger do to_string(date) end + defp stringify_ecto_params(%Time{} = time, :child) do + to_string(time) + end + defp stringify_ecto_params(%NaiveDateTime{} = datetime, :child) do NaiveDateTime.to_iso8601(datetime) end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index f334a09..0c881b5 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -80,6 +80,7 @@ defmodule Ecto.DevLoggerTest do field(:integer, :integer) field(:decimal, :decimal) field(:date, :date) + field(:time, :time) field(:array_of_strings, {:array, :string}) field(:money, Money.Ecto.Type) field(:multi_money, {:array, Money.Ecto.Type}) @@ -109,6 +110,7 @@ defmodule Ecto.DevLoggerTest do integer: 0, decimal: Decimal.from_float(0.12), date: Date.utc_today(), + time: Time.truncate(Time.utc_now(), :second), array_of_strings: ["single_word", "hello, comma", "hey 'quotes'", "hey \"quotes\""], money: %Money{currency: "USD", value: 390}, multi_money: [%Money{currency: "USD", value: 230}, %Money{currency: "USD", value: 180}], @@ -239,7 +241,7 @@ defmodule Ecto.DevLoggerTest do select_query_regex = (Regex.escape( - "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" + "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" ) <> "[-0-9a-fA-F]+" <> Regex.escape("'\e[36m)\e[90m")) @@ -325,6 +327,7 @@ defmodule Ecto.DevLoggerTest do integer integer, decimal numeric, date date, + time time(0) without time zone, array_of_strings text[], money money_type, multi_money money_type[], From c34372dc40af33f1bd9c64193663ee0afc30bd9f Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Thu, 13 Oct 2022 14:34:29 +0300 Subject: [PATCH 17/61] Bump version to 0.5.0 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 7c355b8..31f9503 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.4.3" + @version "0.5.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From bef1be8b3cb2a91a4b8b04bd3c1ef466caed2d09 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 28 Oct 2022 20:50:53 +0300 Subject: [PATCH 18/61] Support Postgrex network types --- lib/ecto/dev_logger.ex | 22 +++++++++++++++++++++- test/ecto/dev_logger_test.exs | 30 +++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 7f30013..879d0be 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -279,7 +279,7 @@ defmodule Ecto.DevLogger do end defp stringify_ecto_params(%module{} = date, :root) - when module in [Date, Time, DateTime, NaiveDateTime] do + when module in [Date, Time, DateTime, NaiveDateTime, Postgrex.INET, Postgrex.MACADDR] do date |> stringify_ecto_params(:child) |> in_quotes() end @@ -323,6 +323,26 @@ defmodule Ecto.DevLogger do Jason.encode!(Enum.map(list, &stringify_ecto_params(&1, :child))) end + defp stringify_ecto_params(macaddr, :child) when is_struct(macaddr, Postgrex.MACADDR) do + macaddr.address + |> Tuple.to_list() + |> Enum.map_join(":", fn value -> + value + |> Integer.to_string(16) + |> String.pad_leading(2, "0") + end) + end + + defp stringify_ecto_params(inet, :child) when is_struct(inet, Postgrex.INET) do + netmask = + case inet.netmask do + nil -> "" + netmask -> "/#{netmask}" + end + + "#{:inet.ntoa(inet.address)}#{netmask}" + end + defp in_quotes(string) do "'#{String.replace(string, "'", "''")}'" end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 0c881b5..d651c98 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -69,6 +69,24 @@ defmodule Ecto.DevLoggerTest do end end + defmodule MACADDRType do + use Ecto.Type + + def type, do: :inet + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule InetType do + use Ecto.Type + + def type, do: :inet + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + defmodule Post do use Ecto.Schema @@ -87,6 +105,8 @@ defmodule Ecto.DevLoggerTest do field(:datetime, :utc_datetime_usec) field(:naive_datetime, :naive_datetime_usec) field(:password_digest, :string) + field(:ip, InetType) + field(:macaddr, MACADDRType) end end @@ -116,7 +136,9 @@ defmodule Ecto.DevLoggerTest do multi_money: [%Money{currency: "USD", value: 230}, %Money{currency: "USD", value: 180}], datetime: DateTime.utc_now(), naive_datetime: NaiveDateTime.utc_now(), - password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd" + password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd", + ip: %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}, + macaddr: %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}} }) post = Repo.get!(Post, post_id) @@ -241,7 +263,7 @@ defmodule Ecto.DevLoggerTest do select_query_regex = (Regex.escape( - "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" + "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" ) <> "[-0-9a-fA-F]+" <> Regex.escape("'\e[36m)\e[90m")) @@ -333,7 +355,9 @@ defmodule Ecto.DevLoggerTest do multi_money money_type[], password_digest text, datetime timestamp without time zone NOT NULL, - naive_datetime timestamp without time zone NOT NULL + naive_datetime timestamp without time zone NOT NULL, + ip INET, + macaddr MACADDR ) """, [], From 6c0d3065ace6cf14ed7bdb20dd5a0a565eec8ee6 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Wed, 2 Nov 2022 19:07:04 +0200 Subject: [PATCH 19/61] Bump version to 0.6.0 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 31f9503..cb7f9af 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.5.0" + @version "0.6.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 543b6c517952361a29e90e0815eca115c5ca0dfb Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Thu, 3 Nov 2022 18:59:38 +0200 Subject: [PATCH 20/61] Update deps --- mix.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mix.lock b/mix.lock index 89128bc..38a9852 100644 --- a/mix.lock +++ b/mix.lock @@ -2,15 +2,15 @@ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"}, - "ecto": {:hex, :ecto, "3.8.1", "35e0bd8c8eb772e14a5191a538cd079706ecb45164ea08a7523b4fc69ab70f56", [:mix], [{:decimal, "~> 1.6 or ~> 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", "f1b68f8d5fe3ab89e24f57c03db5b5d0aed3602077972098b3a6006a1be4b69b"}, - "ecto_sql": {:hex, :ecto_sql, "3.8.0", "b00d2080e523f2aff6100f22305c1c748016570b9cebf5b29cc61d4924b038c2", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8a273619e05c4924b225d526810641e0bae8b0aa114b9cbe3cc5c70cf9e5d607"}, - "ex_doc": {:hex, :ex_doc, "0.28.3", "6eea2f69995f5fba94cd6dd398df369fe4e777a47cd887714a0976930615c9e6", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "05387a6a2655b5f9820f3f627450ed20b4325c25977b2ee69bed90af6688e718"}, - "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, + "ecto": {:hex, :ecto, "3.9.1", "67173b1687afeb68ce805ee7420b4261649d5e2deed8fe5550df23bab0bc4396", [:mix], [{:decimal, "~> 1.6 or ~> 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", "c80bb3d736648df790f7f92f81b36c922d9dd3203ca65be4ff01d067f54eb304"}, + "ecto_sql": {:hex, :ecto_sql, "3.9.0", "2bb21210a2a13317e098a420a8c1cc58b0c3421ab8e3acfa96417dab7817918c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a8f3f720073b8b1ac4c978be25fa7960ed7fd44997420c304a4a2e200b596453"}, + "ex_doc": {:hex, :ex_doc, "0.29.0", "4a1cb903ce746aceef9c1f9ae8a6c12b742a5461e6959b9d3b24d813ffbea146", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "f096adb8bbca677d35d278223361c7792d496b3fc0d0224c9d4bc2f651af5db1"}, + "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "postgrex": {:hex, :postgrex, "0.16.3", "fac79a81a9a234b11c44235a4494d8565303fa4b9147acf57e48978a074971db", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "aeaae1d2d1322da4e5fe90d241b0a564ce03a3add09d7270fb85362166194590"}, + "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"}, "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, } From 549dedc9f4743f765a32f2a9f81368930e121900 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 4 Nov 2022 19:16:18 +0200 Subject: [PATCH 21/61] Add Ecto.DevLogger.PrintableParameter protocol, closes #16 --- lib/ecto/dev_logger.ex | 121 +------- lib/ecto/dev_logger/printable_parameter.ex | 285 ++++++++++++++++++ .../dev_logger/printable_parameter_test.exs | 103 +++++++ test/ecto/dev_logger_test.exs | 8 +- 4 files changed, 394 insertions(+), 123 deletions(-) create mode 100644 lib/ecto/dev_logger/printable_parameter.ex create mode 100644 test/ecto/dev_logger/printable_parameter_test.exs diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 879d0be..24ad294 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -106,7 +106,7 @@ defmodule Ecto.DevLogger do case Map.fetch(params_by_index, String.to_integer(index)) do {:ok, value} -> value - |> stringify_ecto_params(:root) + |> Ecto.DevLogger.PrintableParameter.to_expression() |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) :error -> @@ -128,7 +128,7 @@ defmodule Ecto.DevLogger do case Map.fetch(params_by_index, index) do {:ok, value} -> value - |> stringify_ecto_params(:root) + |> Ecto.DevLogger.PrintableParameter.to_expression() |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) :error -> @@ -230,123 +230,6 @@ defmodule Ecto.DevLogger do end end - defp stringify_ecto_params(nil, _level), do: "NULL" - - defp stringify_ecto_params(binding, _level) - when is_float(binding) or is_integer(binding) or is_atom(binding), - do: to_string(binding) - - defp stringify_ecto_params(%Decimal{} = binding, _level), do: to_string(binding) - - defp stringify_ecto_params(binding, level) when is_binary(binding) do - string = - with <<_::128>> <- binding, - {:ok, string} <- Ecto.UUID.load(binding) do - string - else - _ -> binding - end - - case level do - :root -> - if String.valid?(string) do - in_quotes(string) - else - "DECODE('#{Base.encode64(string)}', 'BASE64')" - end - - :child -> - string - end - end - - defp stringify_ecto_params(binding, :root) when is_list(binding) do - in_quotes( - "{" <> - Enum.map_join(binding, ",", fn item -> - string = - item - |> stringify_ecto_params(:child) - |> String.replace("\"", "\\\"") - - if Enum.any?([",", "{", "}"], fn symbol -> String.contains?(string, symbol) end) do - "\"#{string}\"" - else - string - end - end) <> "}" - ) - end - - defp stringify_ecto_params(%module{} = date, :root) - when module in [Date, Time, DateTime, NaiveDateTime, Postgrex.INET, Postgrex.MACADDR] do - date |> stringify_ecto_params(:child) |> in_quotes() - end - - defp stringify_ecto_params(%{} = map, :root) when not is_struct(map) do - map |> stringify_ecto_params(:child) |> in_quotes() - end - - defp stringify_ecto_params(composite, level) when is_tuple(composite) do - values = - composite - |> Tuple.to_list() - |> Enum.map_join(",", &stringify_ecto_params(&1, :child)) - - case level do - :root -> in_quotes("(#{values})") - :child -> "(#{values})" - end - end - - defp stringify_ecto_params(%Date{} = date, :child) do - to_string(date) - end - - defp stringify_ecto_params(%Time{} = time, :child) do - to_string(time) - end - - defp stringify_ecto_params(%NaiveDateTime{} = datetime, :child) do - NaiveDateTime.to_iso8601(datetime) - end - - defp stringify_ecto_params(%DateTime{} = datetime, :child) do - DateTime.to_iso8601(datetime) - end - - defp stringify_ecto_params(%{} = map, :child) when not is_struct(map) do - Jason.encode!(map) - end - - defp stringify_ecto_params(list, :child) when is_list(list) do - Jason.encode!(Enum.map(list, &stringify_ecto_params(&1, :child))) - end - - defp stringify_ecto_params(macaddr, :child) when is_struct(macaddr, Postgrex.MACADDR) do - macaddr.address - |> Tuple.to_list() - |> Enum.map_join(":", fn value -> - value - |> Integer.to_string(16) - |> String.pad_leading(2, "0") - end) - end - - defp stringify_ecto_params(inet, :child) when is_struct(inet, Postgrex.INET) do - netmask = - case inet.netmask do - nil -> "" - netmask -> "/#{netmask}" - end - - "#{:inet.ntoa(inet.address)}#{netmask}" - end - - defp in_quotes(string) do - "'#{String.replace(string, "'", "''")}'" - end - defp log_stacktrace(stacktrace, repo) do with [_ | _] <- stacktrace, {module, function, arity, info} <- last_non_ecto(Enum.reverse(stacktrace), repo, nil) do diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex new file mode 100644 index 0000000..cc4d033 --- /dev/null +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -0,0 +1,285 @@ +defprotocol Ecto.DevLogger.PrintableParameter do + @moduledoc """ + A protocol to print various data structures as valid SQL expressions. + + `to_expression/1` is the main function and `to_string_literal/1` is an optional helper for it. + + `Ecto.DevLogger` tries to represent complex terms, like arrays (lists) and composite types (tuples) + as string literal first. Not all terms are easy/efficient/whatever to represent as strings, so if + for all elemements inside the array `to_string_literal/1` returns a string, + then array will be represented as string as well. Otherwise, array will be represented using `ARRAY` constructor: + + iex> Ecto.DevLogger.PrintableParameter.to_expression(["Elixir", "Ecto"]) + "'{Elixir,Ecto}'" + + iex> Ecto.DevLogger.PrintableParameter.to_expression(["Elixir", "Ecto", <<153>>]) + "ARRAY['Elixir','Ecto',DECODE('mQ==','BASE64')]" + + The same is true for composite types (tuples): + + iex> Ecto.DevLogger.PrintableParameter.to_expression({"Elixir", "Ecto"}) + "'(Elixir,Ecto)'" + + iex> Ecto.DevLogger.PrintableParameter.to_expression({"Elixir", "Ecto", <<153>>}) + "ROW('Elixir','Ecto',DECODE('mQ==','BASE64'))" + """ + + @doc """ + Converts term to a valid SQL expression. + """ + @spec to_expression(any()) :: String.t() + def to_expression(term) + + @doc """ + Converts term to a string literal. + """ + @spec to_string_literal(any()) :: String.t() | nil + def to_string_literal(term) +end + +defmodule Ecto.DevLogger.Utils do + @moduledoc false + def in_string_quotes(string) do + "'#{String.replace(string, "'", "''")}'" + end + + def all_to_string_literal(list) do + result = + Enum.reduce_while(list, {:ok, []}, fn element, {:ok, acc} -> + case Ecto.DevLogger.PrintableParameter.to_string_literal(element) do + nil -> {:halt, :error} + string_literal -> {:cont, {:ok, [{element, string_literal} | acc]}} + end + end) + + with {:ok, list} <- result do + {:ok, Enum.reverse(list)} + end + end +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Atom do + def to_expression(atom), do: to_string_literal(atom) + def to_string_literal(nil), do: "NULL" + def to_string_literal(true), do: "true" + def to_string_literal(false), do: "false" +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Map do + def to_expression(map), do: to_string_literal(map) + def to_string_literal(map), do: Jason.encode!(map) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Tuple do + def to_expression(tuple) do + case to_string_literal(tuple) do + nil -> + "ROW(" <> + Enum.map_join( + Tuple.to_list(tuple), + ",", + &Ecto.DevLogger.PrintableParameter.to_expression/1 + ) <> ")" + + value -> + Ecto.DevLogger.Utils.in_string_quotes(value) + end + end + + def to_string_literal(tuple) do + case Ecto.DevLogger.Utils.all_to_string_literal(Tuple.to_list(tuple)) do + :error -> + nil + + {:ok, list} -> + body = + Enum.map_join(list, ",", fn {element, string_literal} -> + case element do + nil -> + "" + + "" -> + ~s|""| + + _ -> + string = String.replace(string_literal, "\"", "\\\"") + + if String.contains?(string, [",", "(", ")"]) do + ~s|"#{string}"| + else + string + end + end + end) + + "(" <> body <> ")" + end + end +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Decimal do + def to_expression(decimal), do: to_string_literal(decimal) + def to_string_literal(decimal), do: Decimal.to_string(decimal) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Integer do + def to_expression(integer), do: to_string_literal(integer) + def to_string_literal(integer), do: Integer.to_string(integer) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Float do + def to_expression(float), do: to_string_literal(float) + def to_string_literal(float), do: Float.to_string(float) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Date do + def to_expression(date) do + date + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(date), do: Date.to_string(date) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: DateTime do + def to_expression(date_time) do + date_time + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(date_time), do: DateTime.to_string(date_time) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: NaiveDateTime do + def to_expression(naive_date_time) do + naive_date_time + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(naive_date_time), do: NaiveDateTime.to_string(naive_date_time) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: Time do + def to_expression(time) do + time + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(time), do: Time.to_string(time) +end + +defimpl Ecto.DevLogger.PrintableParameter, for: BitString do + def to_expression(binary) do + binary = maybe_convert_binary_uuid_to_string(binary) + + if String.valid?(binary) do + Ecto.DevLogger.Utils.in_string_quotes(binary) + else + "DECODE('#{Base.encode64(binary)}','BASE64')" + end + end + + def to_string_literal(binary) do + binary = maybe_convert_binary_uuid_to_string(binary) + + if String.valid?(binary) do + binary + end + end + + defp maybe_convert_binary_uuid_to_string(binary) do + with <<_::128>> <- binary, + {:ok, string} <- Ecto.UUID.load(binary) do + string + else + _ -> binary + end + end +end + +defimpl Ecto.DevLogger.PrintableParameter, for: List do + def to_expression(list) do + case to_string_literal(list) do + nil -> + "ARRAY[" <> + Enum.map_join(list, ",", &Ecto.DevLogger.PrintableParameter.to_expression/1) <> "]" + + value -> + Ecto.DevLogger.Utils.in_string_quotes(value) + end + end + + def to_string_literal(list) do + case Ecto.DevLogger.Utils.all_to_string_literal(list) do + :error -> + nil + + {:ok, list} -> + body = + Enum.map_join(list, ",", fn {element, string_literal} -> + cond do + is_list(element) or is_nil(element) -> + string_literal + + element == "" -> + ~s|""| + + true -> + string = String.replace(string_literal, "\"", "\\\"") + + if String.downcase(string) == "null" or String.contains?(string, [",", "{", "}"]) do + ~s|"#{string}"| + else + string + end + end + end) + + "{" <> body <> "}" + end + end +end + +if Code.ensure_loaded?(Postgrex.MACADDR) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.MACADDR do + def to_expression(macaddr) do + macaddr + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(macaddr) do + macaddr.address + |> Tuple.to_list() + |> Enum.map_join(":", fn value -> + value + |> Integer.to_string(16) + |> String.pad_leading(2, "0") + end) + end + end +end + +if Code.ensure_loaded?(Postgrex.INET) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.INET do + def to_expression(inet) do + inet + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(inet) do + netmask = + case inet.netmask do + nil -> "" + netmask -> "/#{netmask}" + end + + "#{:inet.ntoa(inet.address)}#{netmask}" + end + end +end diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs new file mode 100644 index 0000000..c9c6232 --- /dev/null +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -0,0 +1,103 @@ +defmodule Ecto.DevLogger.PrintableParameterTest do + use ExUnit.Case + doctest Ecto.DevLogger.PrintableParameter + import Ecto.DevLogger.PrintableParameter + + test "to_expression/1" do + # NULL + assert to_expression(nil) == "NULL" + + # Boolean + assert to_expression(true) == "true" + assert to_expression(false) == "false" + + # Integer + assert to_expression(-123) == "-123" + assert to_expression(123) == "123" + + # Float + assert to_expression(123.12) == "123.12" + assert to_expression(-123.12) == "-123.12" + + # Decimal + assert to_expression(Decimal.from_float(-123.12)) == "-123.12" + assert to_expression(Decimal.from_float(123.12)) == "123.12" + + # String + assert to_expression("string with single quote: '") == ~s|'string with single quote: '''| + assert to_expression("string with double quote: \"") == ~s|'string with double quote: "'| + assert to_expression("") == ~s|''| + + # Binary + assert to_expression(<<95, 131, 49, 101, 176, 212, 77, 86>>) == + "DECODE('X4MxZbDUTVY=','BASE64')" + + # Map + assert to_expression(%{ + "string" => "string", + "boolean" => true, + "integer" => 1, + "array" => [1, 2, 3] + }) == ~s|{"array":[1,2,3],"boolean":true,"integer":1,"string":"string"}| + + # UUID-like binary + assert to_expression( + <<220, 46, 200, 4, 110, 226, 70, 137, 168, 241, 190, 89, 170, 128, 119, 31>> + ) == "'dc2ec804-6ee2-4689-a8f1-be59aa80771f'" + + # Date and Time + assert to_expression(~D[2022-11-04]) == "'2022-11-04'" + assert to_expression(~U[2022-11-04 10:40:11.362181Z]) == "'2022-11-04 10:40:11.362181Z'" + assert to_expression(~N[2022-11-04 10:40:01.256931]) == "'2022-11-04 10:40:01.256931'" + assert to_expression(~T[10:40:17.657300]) == "'10:40:17.657300'" + + # Postgrex types + assert to_expression(%Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}) == "'127.0.0.1/24'" + assert to_expression(%Postgrex.INET{address: {127, 0, 0, 1}, netmask: nil}) == "'127.0.0.1'" + assert to_expression(%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}) == "'08:01:2B:05:07:09'" + + # List + assert to_expression([1, 2, 3]) == "'{1,2,3}'" + assert to_expression([1, 2, 3, nil]) == ~s|'{1,2,3,NULL}'| + assert to_expression([1.2, 2.3, 3.4]) == "'{1.2,2.3,3.4}'" + assert to_expression(["abc", "DFG", "NULL", ""]) == ~s|'{abc,DFG,"NULL",""}'| + assert to_expression(["single quote:'"]) == "'{single quote:''}'" + assert to_expression(["double quote:\""]) == ~s|'{double quote:\\"}'| + assert to_expression(["{", "}", ","]) == ~s|'{"{","}",","}'| + assert to_expression([[1, 2, 3], [3, 4, 5]]) == "'{{1,2,3},{3,4,5}}'" + assert to_expression([["a", "b", "c"], ["d", "f", "e"]]) == "'{{a,b,c},{d,f,e}}'" + assert to_expression([~D[2022-11-04], ~D[2022-11-03]]) == "'{2022-11-04,2022-11-03}'" + + assert to_expression([~U[2022-11-04 10:40:11.362181Z], ~U[2022-11-03 10:40:11.362181Z]]) == + "'{2022-11-04 10:40:11.362181Z,2022-11-03 10:40:11.362181Z}'" + + assert to_expression([~N[2022-11-04 10:40:01.256931], ~N[2022-11-03 10:40:01.256931]]) == + "'{2022-11-04 10:40:01.256931,2022-11-03 10:40:01.256931}'" + + assert to_expression([~T[10:40:17.657300], ~T[09:40:17.657300]]) == + "'{10:40:17.657300,09:40:17.657300}'" + + assert to_expression([ + %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}, + %Postgrex.INET{address: {127, 0, 0, 1}, netmask: nil} + ]) == "'{127.0.0.1/24,127.0.0.1}'" + + assert to_expression([%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}]) == + "'{08:01:2B:05:07:09}'" + + assert to_expression([%{}, %{}]) == ~s|'{"{}","{}"}'| + assert to_expression([{1, "USD"}, {2, "USD"}]) == ~s|'{"(1,USD)","(2,USD)"}'| + + assert to_expression([[<<95, 131, 49, 101>>, <<101, 176, 212, 77, 86>>, nil]]) == + "ARRAY[ARRAY[DECODE('X4MxZQ==','BASE64'),DECODE('ZbDUTVY=','BASE64'),NULL]]" + + # Tuple (composite types) + assert to_expression({1, 1.2, "string", "", nil}) == ~s|'(1,1.2,string,"",)'| + + assert to_expression({"'", ~s|"|, ")", "(", ",", "multiple words"}) == + ~s|'('',\\",")","(",",",multiple words)'| + + assert to_expression({{<<101, 49, 95, 131>>, "hello", nil}, {nil, [1, 2, 3]}}) == + ~s|ROW(ROW(DECODE('ZTFfgw==','BASE64'),'hello',NULL),'(,"{1,2,3}")')| + end +end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index d651c98..c11cc9c 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -164,7 +164,7 @@ defmodule Ecto.DevLoggerTest do @return_to_color, Ecto.Adapters.Postgres ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" end test "Tds" do @@ -174,7 +174,7 @@ defmodule Ecto.DevLoggerTest do @return_to_color, Ecto.Adapters.Tds ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" end test "MySQL" do @@ -186,7 +186,7 @@ defmodule Ecto.DevLoggerTest do Ecto.Adapters.MyXQL ) ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{[\\\"test\\\"]}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" end end @@ -251,7 +251,7 @@ defmodule Ecto.DevLoggerTest do assert repo1_insert_status =~ ~r/\[debug\] QUERY OK db=\d+\.\d+ms/ assert repo1_insert_query == - "INSERT INTO \"posts\" (\"datetime\",\"naive_datetime\") VALUES (\e[38;5;31m'2022-06-25T14:30:16.639767Z'\e[32m,\e[38;5;31m'2022-06-25T14:30:16.643949'\e[32m) RETURNING \"id\"\e[90m" + "INSERT INTO \"posts\" (\"datetime\",\"naive_datetime\") VALUES (\e[38;5;31m'2022-06-25 14:30:16.639767Z'\e[32m,\e[38;5;31m'2022-06-25 14:30:16.643949'\e[32m) RETURNING \"id\"\e[90m" assert repo1_insert_location =~ ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ From 9cc85796d03d45e1e7b61ac2b7a34cba9e8f79ea Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 6 Nov 2022 15:05:46 +0200 Subject: [PATCH 22/61] Add hex badge to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8a96ff7..f237084 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Ecto.DevLogger +[![Hex.pm](https://img.shields.io/hexpm/v/ecto_dev_logger.svg)](https://hex.pm/packages/ecto_dev_logger) + An alternative logger for Ecto queries. It inlines bindings into the query, so it is easy to copy-paste logged SQL and run it in any IDE for debugging without From 815c7b01e4b175da26656cdc8fc8fb5e8c1ffed1 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 6 Nov 2022 15:07:00 +0200 Subject: [PATCH 23/61] Bump version to 0.7.0 --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f237084..690f19f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.4"} + {:ecto_dev_logger, "~> 0.7"} ] end ``` diff --git a/mix.exs b/mix.exs index cb7f9af..79eb05f 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.6.0" + @version "0.7.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From d6baa6c79253d831d01281a1051d0e1284fbb5d8 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 6 Nov 2022 19:24:33 +0200 Subject: [PATCH 24/61] Fix typo --- lib/ecto/dev_logger/printable_parameter.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index cc4d033..194d258 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -6,7 +6,7 @@ defprotocol Ecto.DevLogger.PrintableParameter do `Ecto.DevLogger` tries to represent complex terms, like arrays (lists) and composite types (tuples) as string literal first. Not all terms are easy/efficient/whatever to represent as strings, so if - for all elemements inside the array `to_string_literal/1` returns a string, + `to_string_literal/1` returns a string for all elements inside the array, then array will be represented as string as well. Otherwise, array will be represented using `ARRAY` constructor: iex> Ecto.DevLogger.PrintableParameter.to_expression(["Elixir", "Ecto"]) From 1c7f3d045fd0d121686329e74c68fe58b87813e2 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Mon, 28 Nov 2022 16:15:11 +0200 Subject: [PATCH 25/61] Convert rest of the atoms to strings --- lib/ecto/dev_logger/printable_parameter.ex | 7 ++++++- mix.exs | 2 +- mix.lock | 8 ++++---- test/ecto/dev_logger/printable_parameter_test.exs | 5 +++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 194d258..728f685 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -59,10 +59,15 @@ defmodule Ecto.DevLogger.Utils do end defimpl Ecto.DevLogger.PrintableParameter, for: Atom do - def to_expression(atom), do: to_string_literal(atom) + def to_expression(nil), do: "NULL" + def to_expression(true), do: "true" + def to_expression(false), do: "false" + def to_expression(atom), do: atom |> Atom.to_string() |> Ecto.DevLogger.Utils.in_string_quotes() + def to_string_literal(nil), do: "NULL" def to_string_literal(true), do: "true" def to_string_literal(false), do: "false" + def to_string_literal(atom), do: Atom.to_string(atom) end defimpl Ecto.DevLogger.PrintableParameter, for: Map do diff --git a/mix.exs b/mix.exs index 79eb05f..6486131 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.7.0" + @version "0.7.1" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do diff --git a/mix.lock b/mix.lock index 38a9852..13270ac 100644 --- a/mix.lock +++ b/mix.lock @@ -1,11 +1,11 @@ %{ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, + "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, - "ecto": {:hex, :ecto, "3.9.1", "67173b1687afeb68ce805ee7420b4261649d5e2deed8fe5550df23bab0bc4396", [:mix], [{:decimal, "~> 1.6 or ~> 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", "c80bb3d736648df790f7f92f81b36c922d9dd3203ca65be4ff01d067f54eb304"}, - "ecto_sql": {:hex, :ecto_sql, "3.9.0", "2bb21210a2a13317e098a420a8c1cc58b0c3421ab8e3acfa96417dab7817918c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a8f3f720073b8b1ac4c978be25fa7960ed7fd44997420c304a4a2e200b596453"}, - "ex_doc": {:hex, :ex_doc, "0.29.0", "4a1cb903ce746aceef9c1f9ae8a6c12b742a5461e6959b9d3b24d813ffbea146", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "f096adb8bbca677d35d278223361c7792d496b3fc0d0224c9d4bc2f651af5db1"}, + "ecto": {:hex, :ecto, "3.9.2", "017db3bc786ff64271108522c01a5d3f6ba0aea5c84912cfb0dd73bf13684108", [:mix], [{:decimal, "~> 1.6 or ~> 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", "21466d5177e09e55289ac7eade579a642578242c7a3a9f91ad5c6583337a9d15"}, + "ecto_sql": {:hex, :ecto_sql, "3.9.1", "9bd5894eecc53d5b39d0c95180d4466aff00e10679e13a5cfa725f6f85c03c22", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fd470a4fff2e829bbf9dcceb7f3f9f6d1e49b4241e802f614de6b8b67c51118"}, + "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index c9c6232..ee3177d 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -11,6 +11,10 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression(true) == "true" assert to_expression(false) == "false" + # Atom + assert to_expression(:hey) == "'hey'" + assert to_expression(:hey@hey) == "'hey@hey'" + # Integer assert to_expression(-123) == "-123" assert to_expression(123) == "123" @@ -61,6 +65,7 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression([1, 2, 3, nil]) == ~s|'{1,2,3,NULL}'| assert to_expression([1.2, 2.3, 3.4]) == "'{1.2,2.3,3.4}'" assert to_expression(["abc", "DFG", "NULL", ""]) == ~s|'{abc,DFG,"NULL",""}'| + assert to_expression([:hello, :world]) == ~s|'{hello,world}'| assert to_expression(["single quote:'"]) == "'{single quote:''}'" assert to_expression(["double quote:\""]) == ~s|'{double quote:\\"}'| assert to_expression(["{", "}", ","]) == ~s|'{"{","}",","}'| From 486c2bba192524049f09b9a4794c04be224bbde9 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 9 Dec 2022 12:40:07 +0200 Subject: [PATCH 26/61] Wrap JSON using string quotes --- lib/ecto/dev_logger/printable_parameter.ex | 2 +- mix.exs | 2 +- test/ecto/dev_logger/printable_parameter_test.exs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 728f685..a80bf02 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -71,7 +71,7 @@ defimpl Ecto.DevLogger.PrintableParameter, for: Atom do end defimpl Ecto.DevLogger.PrintableParameter, for: Map do - def to_expression(map), do: to_string_literal(map) + def to_expression(map), do: map |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() def to_string_literal(map), do: Jason.encode!(map) end diff --git a/mix.exs b/mix.exs index 6486131..5cedac9 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.7.1" + @version "0.7.2" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index ee3177d..5b629ba 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -1,5 +1,5 @@ defmodule Ecto.DevLogger.PrintableParameterTest do - use ExUnit.Case + use ExUnit.Case, async: true doctest Ecto.DevLogger.PrintableParameter import Ecto.DevLogger.PrintableParameter @@ -42,7 +42,7 @@ defmodule Ecto.DevLogger.PrintableParameterTest do "boolean" => true, "integer" => 1, "array" => [1, 2, 3] - }) == ~s|{"array":[1,2,3],"boolean":true,"integer":1,"string":"string"}| + }) == ~s|'{"array":[1,2,3],"boolean":true,"integer":1,"string":"string"}'| # UUID-like binary assert to_expression( From f27e57a6ea0fbee27add8629e82b158d1c5a8429 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 6 Jan 2023 15:56:06 +0200 Subject: [PATCH 27/61] Add option to specify callback to silence logs, closes #18 --- lib/ecto/dev_logger.ex | 20 ++++++++++++++++---- lib/ecto/dev_logger/printable_parameter.ex | 5 ++++- mix.exs | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 24ad294..dae1e43 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -9,6 +9,8 @@ defmodule Ecto.DevLogger do require Logger + @type option :: {:log_repo_name, boolean()} | {:ignore_event, (metadata :: map() -> boolean())} + @doc """ Attaches `telemetry_handler/4` to application. @@ -16,9 +18,12 @@ defmodule Ecto.DevLogger do ## Options - * `:log_repo_name` - When truthy will add the repo name into the log + * `:log_repo_name` - when truthy will add the repo name into the log. + * `:ignore_event` - a callback which allows to skip some telemetry events thus skip printing logs. + By default, the library ignores events from `Oban` and events related to migration queries. + These checks are not overridable by `:ignore_event` callback and have priority over it. """ - @spec install(repo_module :: module(), opts :: Keyword.t()) :: :ok | {:error, :already_exists} + @spec install(repo_module :: module(), opts :: [option()]) :: :ok | {:error, :already_exists} def install(repo_module, opts \\ []) when is_atom(repo_module) do config = repo_module.config() @@ -61,15 +66,22 @@ defmodule Ecto.DevLogger do metadata[:options][:schema_migration] == true end + defp ignore_event?(config, metadata) do + oban_query?(metadata) or schema_migration?(metadata) or + (config[:ignore_event] || (&always_false/1)).(metadata) + end + + defp always_false(_), do: false + @doc "Telemetry handler which logs queries." @spec telemetry_handler( :telemetry.event_name(), :telemetry.event_measurements(), :telemetry.event_metadata(), - :telemetry.handler_config() + [option()] ) :: :ok def telemetry_handler(_event_name, measurements, metadata, config) do - if oban_query?(metadata) or schema_migration?(metadata) do + if ignore_event?(config, metadata) do :ok else query = String.Chars.to_string(metadata.query) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index a80bf02..3b09237 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -71,7 +71,10 @@ defimpl Ecto.DevLogger.PrintableParameter, for: Atom do end defimpl Ecto.DevLogger.PrintableParameter, for: Map do - def to_expression(map), do: map |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + def to_expression(map) do + map |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + end + def to_string_literal(map), do: Jason.encode!(map) end diff --git a/mix.exs b/mix.exs index 5cedac9..2e007fb 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.7.2" + @version "0.8.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 8f30a6dba38651b2bfc5122d8851a621bf518a63 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 11 Feb 2023 21:01:06 +0200 Subject: [PATCH 28/61] Support tsvector --- lib/ecto/dev_logger/printable_parameter.ex | 93 ++++++++++++++----- mix.lock | 8 +- .../dev_logger/printable_parameter_test.exs | 8 ++ 3 files changed, 84 insertions(+), 25 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 3b09237..845dc64 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -226,30 +226,47 @@ defimpl Ecto.DevLogger.PrintableParameter, for: List do :error -> nil - {:ok, list} -> - body = - Enum.map_join(list, ",", fn {element, string_literal} -> - cond do - is_list(element) or is_nil(element) -> - string_literal - - element == "" -> - ~s|""| - - true -> - string = String.replace(string_literal, "\"", "\\\"") - - if String.downcase(string) == "null" or String.contains?(string, [",", "{", "}"]) do - ~s|"#{string}"| - else - string - end - end + {:ok, elements_with_string_literals} -> + if tsvector?(list) do + Enum.map_join(elements_with_string_literals, " ", fn {_element, string_literal} -> + string_literal end) - - "{" <> body <> "}" + else + body = + Enum.map_join(elements_with_string_literals, ",", fn {element, string_literal} -> + cond do + is_list(element) or is_nil(element) -> + string_literal + + element == "" -> + ~s|""| + + true -> + string = String.replace(string_literal, "\"", "\\\"") + + if String.downcase(string) == "null" or + String.contains?(string, [",", "{", "}"]) do + ~s|"#{string}"| + else + string + end + end + end) + + "{" <> body <> "}" + end end end + + # tsvector is a list of lexemes. + # By checking only the first element we assume that the others are also lexemes. + defp tsvector?([%{__struct__: Postgrex.Lexeme} | _]) do + true + end + + defp tsvector?(_list) do + false + end end if Code.ensure_loaded?(Postgrex.MACADDR) do @@ -291,3 +308,37 @@ if Code.ensure_loaded?(Postgrex.INET) do end end end + +if Code.ensure_loaded?(Postgrex.Lexeme) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Lexeme do + def to_expression(lexeme) do + raise "Invalid parameter: #{lexeme} must be inside a list" + end + + def to_string_literal(lexeme) do + word = + if String.contains?(lexeme.word, [",", "'", " ", ":"]) do + Ecto.DevLogger.Utils.in_string_quotes(lexeme.word) + else + lexeme.word + end + + case lexeme.positions do + [] -> + word + + positions -> + positions = + Enum.map_join(positions, ",", fn {position, weight} -> + if weight in [nil, :D] do + Integer.to_string(position) + else + [Integer.to_string(position), Atom.to_string(weight)] + end + end) + + "#{word}:#{positions}" + end + end + end +end diff --git a/mix.lock b/mix.lock index 13270ac..3b041f5 100644 --- a/mix.lock +++ b/mix.lock @@ -2,9 +2,9 @@ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, - "ecto": {:hex, :ecto, "3.9.2", "017db3bc786ff64271108522c01a5d3f6ba0aea5c84912cfb0dd73bf13684108", [:mix], [{:decimal, "~> 1.6 or ~> 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", "21466d5177e09e55289ac7eade579a642578242c7a3a9f91ad5c6583337a9d15"}, - "ecto_sql": {:hex, :ecto_sql, "3.9.1", "9bd5894eecc53d5b39d0c95180d4466aff00e10679e13a5cfa725f6f85c03c22", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fd470a4fff2e829bbf9dcceb7f3f9f6d1e49b4241e802f614de6b8b67c51118"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.30", "0b938aa5b9bafd455056440cdaa2a79197ca5e693830b4a982beada840513c5f", [:mix], [], "hexpm", "3b5385c2d36b0473d0b206927b841343d25adb14f95f0110062506b300cd5a1b"}, + "ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 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", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"}, + "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"}, "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, @@ -12,5 +12,5 @@ "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"}, - "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, + "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, } diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index 5b629ba..d1f088a 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -61,6 +61,7 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression(%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}) == "'08:01:2B:05:07:09'" # List + assert to_expression([]) == "'{}'" assert to_expression([1, 2, 3]) == "'{1,2,3}'" assert to_expression([1, 2, 3, nil]) == ~s|'{1,2,3,NULL}'| assert to_expression([1.2, 2.3, 3.4]) == "'{1.2,2.3,3.4}'" @@ -90,6 +91,13 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression([%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}]) == "'{08:01:2B:05:07:09}'" + # List of lexemes is considered as tsvector + assert to_expression([ + %Postgrex.Lexeme{word: "Joe's", positions: [{5, :D}]}, + %Postgrex.Lexeme{word: "foo", positions: [{1, :A}, {3, :B}, {2, nil}]}, + %Postgrex.Lexeme{word: "bar", positions: []} + ]) == "'''Joe''''s'':5 foo:1A,3B,2 bar'" + assert to_expression([%{}, %{}]) == ~s|'{"{}","{}"}'| assert to_expression([{1, "USD"}, {2, "USD"}]) == ~s|'{"(1,USD)","(2,USD)"}'| From 2f11ca81a4325bc603ba813057f77ec49459e87d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 12 Feb 2023 11:03:31 +0200 Subject: [PATCH 29/61] Bump version to 0.9.0 --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 690f19f..874d886 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.7"} + {:ecto_dev_logger, "~> 0.9"} ] end ``` diff --git a/mix.exs b/mix.exs index 2e007fb..8dbef59 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.8.0" + @version "0.9.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 53b42ba6a9fb9f8ef7f3e5fd7ac524af5e50a632 Mon Sep 17 00:00:00 2001 From: Travis Vander Hoop Date: Tue, 12 Dec 2023 01:03:25 -0700 Subject: [PATCH 30/61] Support Postgrex.Interval (#27) --- lib/ecto/dev_logger/printable_parameter.ex | 10 ++++++++++ test/ecto/dev_logger/printable_parameter_test.exs | 3 +++ 2 files changed, 13 insertions(+) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 845dc64..4a02903 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -289,6 +289,16 @@ if Code.ensure_loaded?(Postgrex.MACADDR) do end end +if Code.ensure_loaded?(Postgrex.Interval) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Interval do + def to_expression(struct), + do: Postgrex.Interval.to_string(struct) |> Ecto.DevLogger.Utils.in_string_quotes() + + def to_string_literal(struct), + do: Postgrex.Interval.to_string(struct) + end +end + if Code.ensure_loaded?(Postgrex.INET) do defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.INET do def to_expression(inet) do diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index d1f088a..a6ddd5f 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -60,6 +60,9 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression(%Postgrex.INET{address: {127, 0, 0, 1}, netmask: nil}) == "'127.0.0.1'" assert to_expression(%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}) == "'08:01:2B:05:07:09'" + assert to_expression(%Postgrex.Interval{months: 1, days: 2, secs: 34}) == + "'1 month, 2 days, 34 seconds'" + # List assert to_expression([]) == "'{}'" assert to_expression([1, 2, 3]) == "'{1,2,3}'" From d5b4884113bf4dca2201b2a51f1221e8322715c1 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 12 Dec 2023 10:33:44 +0200 Subject: [PATCH 31/61] Don't fail if there is no protocol implementation --- lib/ecto/dev_logger.ex | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index dae1e43..11c9694 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -117,9 +117,16 @@ defmodule Ecto.DevLogger do <<_prefix::utf8, index::binary>> = replacement -> case Map.fetch(params_by_index, String.to_integer(index)) do {:ok, value} -> - value - |> Ecto.DevLogger.PrintableParameter.to_expression() - |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) + try do + value + |> Ecto.DevLogger.PrintableParameter.to_expression() + |> colorize(IO.ANSI.color(0, 2, 3), apply(IO.ANSI, return_to_color, [])) + rescue + Protocol.UndefinedError -> + value + |> inspect() + |> colorize(IO.ANSI.color(5, 0, 0), apply(IO.ANSI, return_to_color, [])) + end :error -> replacement From 0c3a0174aaf8d6ed9f5cc52e6aa8c07ce3fa417e Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 12 Dec 2023 10:35:01 +0200 Subject: [PATCH 32/61] Bump version to `0.10.0` --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 874d886..52aef5b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.9"} + {:ecto_dev_logger, "~> 0.10"} ] end ``` diff --git a/mix.exs b/mix.exs index 8dbef59..f585d9a 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.9.0" + @version "0.10.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From da2131a7339db71b9c4c5d16e0ea50b675d988aa Mon Sep 17 00:00:00 2001 From: Austin Ziegler Date: Fri, 15 Dec 2023 02:13:37 -0500 Subject: [PATCH 33/61] Restricted Installation Instructions (#29) Closes #28. --- README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/README.md b/README.md index 52aef5b..3ba15a2 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,37 @@ That's it. The docs can be found at [https://hexdocs.pm/ecto_dev_logger](https://hexdocs.pm/ecto_dev_logger). +### Development Only Installation + +If you turn off repo logging for any reason in production, you can configure `ecto_dev_logger` to *only* be available +in development. In your `mix.exs`, restrict the installation to `:dev`: + +```elixir +def deps do + [ + {:ecto_dev_logger, "~> 0.10", only: :dev} + ] +end +``` + +In `MyApp.Application`, an additional function is required: + +```elixir +defmodule MyApp.Application + @moduledoc "..." + + def start(_type, _args) do + maybe_install_ecto_dev_logger() + + # ... + end + + if Code.ensure_loaded?(Ecto.DevLogger) do + defp maybe_install_ecto_dev_logger, do: Ecto.DevLogger.install(MyApp.Repo) + else + defp maybe_install_ecto_dev_logger, do: :ok + end + + # ... +end +``` From d8bbda8204dd779d2f019ae1d4c5bad01c3e75f2 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 21 Jun 2024 20:44:53 +0300 Subject: [PATCH 34/61] Update deps --- mix.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mix.lock b/mix.lock index 3b041f5..486adbd 100644 --- a/mix.lock +++ b/mix.lock @@ -1,16 +1,16 @@ %{ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"}, - "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.30", "0b938aa5b9bafd455056440cdaa2a79197ca5e693830b4a982beada840513c5f", [:mix], [], "hexpm", "3b5385c2d36b0473d0b206927b841343d25adb14f95f0110062506b300cd5a1b"}, - "ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 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", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"}, - "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"}, - "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, - "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {: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", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"}, + "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, + "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"}, + "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, + "ex_doc": {:hex, :ex_doc, "0.34.1", "9751a0419bc15bc7580c73fde506b17b07f6402a1e5243be9e0f05a68c723368", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "d441f1a86a235f59088978eff870de2e815e290e44a8bd976fe5d64470a4c9d2"}, + "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, + "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"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, } From 61a688b4713d8ca956ae3077997ee4ecf2ccc628 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 21 Jun 2024 20:45:11 +0300 Subject: [PATCH 35/61] Add test for list of numeric enums --- test/ecto/dev_logger_test.exs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index c11cc9c..73ffdb9 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -107,6 +107,7 @@ defmodule Ecto.DevLoggerTest do field(:password_digest, :string) field(:ip, InetType) field(:macaddr, MACADDRType) + field(:enum, {:array, Ecto.Enum}, values: [foo: 1, bar: 2, baz: 5]) end end @@ -138,7 +139,8 @@ defmodule Ecto.DevLoggerTest do naive_datetime: NaiveDateTime.utc_now(), password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd", ip: %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}, - macaddr: %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}} + macaddr: %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}, + enum: [:foo, :baz] }) post = Repo.get!(Post, post_id) @@ -263,7 +265,7 @@ defmodule Ecto.DevLoggerTest do select_query_regex = (Regex.escape( - "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" + "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\", p0.\"enum\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" ) <> "[-0-9a-fA-F]+" <> Regex.escape("'\e[36m)\e[90m")) @@ -357,7 +359,8 @@ defmodule Ecto.DevLoggerTest do datetime timestamp without time zone NOT NULL, naive_datetime timestamp without time zone NOT NULL, ip INET, - macaddr MACADDR + macaddr MACADDR, + enum integer[] ) """, [], From 40c5d165b4d0c2e4d87ebe4abaaa865b242094d3 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 21 Jun 2024 23:14:36 +0300 Subject: [PATCH 36/61] Add `:before_inline_callback` option for queries formatting --- README.md | 23 +++++++++++++++++++++-- lib/ecto/dev_logger.ex | 4 ++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ba15a2..d0e4172 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ And install telemetry handler in `MyApp.Application`: ```elixir Ecto.DevLogger.install(MyApp.Repo) ``` -Telemetry handler will be installed only if `log` configuration value is set to `false`. +Telemetry handler will be installed *only* if `log` configuration value is set to `false`. That's it. @@ -55,7 +55,7 @@ end In `MyApp.Application`, an additional function is required: ```elixir -defmodule MyApp.Application +defmodule MyApp.Application do @moduledoc "..." def start(_type, _args) do @@ -73,3 +73,22 @@ defmodule MyApp.Application # ... end ``` + +### Format queries + +It is possible to format queries using a `:before_inline_callback` option. +Here is an example of setup using [pgFormatter](https://github.com/darold/pgFormatter) as an external utility: +```elixir +defmodule MyApp.Application do + def start(_type, _args) do + Ecto.DevLogger.install(MyApp.Repo, before_inline_callback: &__MODULE__.format_sql_query/1) + end + + def format_sql_query(query) do + case System.shell("echo $SQL_QUERY | pg_format -", env: [{"SQL_QUERY", query}], stderr_to_stdout: true) do + {formatted_query, 0} -> String.trim_trailing(formatted_query) + _ -> query + end + end +end +``` diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 11c9694..bf150e4 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -22,6 +22,8 @@ defmodule Ecto.DevLogger do * `:ignore_event` - a callback which allows to skip some telemetry events thus skip printing logs. By default, the library ignores events from `Oban` and events related to migration queries. These checks are not overridable by `:ignore_event` callback and have priority over it. + * `:before_inline_callback` - a callback which allows to modify the query before inlining of bindings. + You can use this option to format the query using external utility, like `pgformatter`, etc. """ @spec install(repo_module :: module(), opts :: [option()]) :: :ok | {:error, :already_exists} def install(repo_module, opts \\ []) when is_atom(repo_module) do @@ -87,10 +89,12 @@ defmodule Ecto.DevLogger do query = String.Chars.to_string(metadata.query) color = sql_color(query) repo_adapter = metadata[:repo].__adapter__() + before_inline_callback = config[:before_inline_callback] || (&Function.identity/1) Logger.debug( fn -> query + |> before_inline_callback.() |> inline_params(metadata.params, color, repo_adapter) |> log_sql_iodata(measurements, metadata, color, config) end, From f73ea061abbffec8530685de72089cb17b074cbe Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 21 Jun 2024 23:16:49 +0300 Subject: [PATCH 37/61] Bump version to `0.11.0` --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0e4172..51ae482 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.10"} + {:ecto_dev_logger, "~> 0.11"} ] end ``` diff --git a/mix.exs b/mix.exs index f585d9a..f920bba 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.10.0" + @version "0.11.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 9e38519dfbc5aba433007c6a7765129918da6182 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 21 Jun 2024 23:38:23 +0300 Subject: [PATCH 38/61] Fix ex_doc deprecation warning --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index f920bba..9d331e3 100644 --- a/mix.exs +++ b/mix.exs @@ -18,7 +18,7 @@ defmodule Ecto.DevLogger.MixProject do extras: ["README.md": [title: "README"]], source_url: @source_url, source_ref: "v#{@version}", - assets: "assets" + assets: %{"assets" => "assets"} ] ] end From 096905ef56c311e713281f168202a279dcebc9ee Mon Sep 17 00:00:00 2001 From: Jechol Lee Date: Fri, 26 Jul 2024 16:23:50 +0900 Subject: [PATCH 39/61] Fix broken tests (#31) --- test/ecto/dev_logger_test.exs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 73ffdb9..74f438c 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -250,7 +250,9 @@ defmodule Ecto.DevLoggerTest do ## Confirm that the original repo's logging is not changed by the addition of a second repo assert repo1_insert_start == "\e[32m" - assert repo1_insert_status =~ ~r/\[debug\] QUERY OK db=\d+\.\d+ms/ + + assert repo1_insert_status =~ + ~r/\[debug\] QUERY OK source=\e\[34m\"posts\"\e\[32m db=\d+\.\d+ms/ assert repo1_insert_query == "INSERT INTO \"posts\" (\"datetime\",\"naive_datetime\") VALUES (\e[38;5;31m'2022-06-25 14:30:16.639767Z'\e[32m,\e[38;5;31m'2022-06-25 14:30:16.643949'\e[32m) RETURNING \"id\"\e[90m" @@ -304,7 +306,7 @@ defmodule Ecto.DevLoggerTest do assert repo2_insert_start == repo1_insert_start assert repo2_insert_status =~ - ~r/\[debug\] QUERY OK repo=\e\[34mEcto.DevLoggerTest.Repo2\e\[\d+m db=\d+\.\d+ms/ + ~r/\[debug\] QUERY OK source=\e\[34m\"posts\"\e\[32m repo=\e\[34mEcto.DevLoggerTest.Repo2\e\[32m db=\d+\.\d+ms/ assert repo2_insert_query == repo1_insert_query @@ -331,7 +333,9 @@ defmodule Ecto.DevLoggerTest do repo_module.__adapter__().storage_up(config) repo_pid = start_supervised!(repo_module) - repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], log: log_sql_statements) + repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], + log: log_sql_statements + ) repo_module.query!( """ From ef2ff81a56ae4de366d4eeb752915aec790d45ff Mon Sep 17 00:00:00 2001 From: Javier Cuevas Date: Tue, 30 Jul 2024 22:57:12 +0200 Subject: [PATCH 40/61] Add geo point and geo polygon (#32) * feat: add geo.point support related to #22 * adding optional deps * tests and slight formatting tweak * Add support for Geo.Polygon and fix Geo.Point * make :geo optional --------- Co-authored-by: Michael Bianco --- lib/ecto/dev_logger/printable_parameter.ex | 20 +++++++++++++++++++ mix.exs | 7 +++++-- mix.lock | 1 + .../dev_logger/printable_parameter_test.exs | 6 ++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 4a02903..6abf4a1 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -78,6 +78,26 @@ defimpl Ecto.DevLogger.PrintableParameter, for: Map do def to_string_literal(map), do: Jason.encode!(map) end +if Code.ensure_loaded?(Geo.Point) do + defimpl Ecto.DevLogger.PrintableParameter, for: Geo.Point do + def to_expression(point) do + point |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(point), do: Jason.encode!(point) + end +end + +if Code.ensure_loaded?(Geo.Polygon) do + defimpl Ecto.DevLogger.PrintableParameter, for: Geo.Polygon do + def to_expression(point) do + point |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(point), do: Jason.encode!(point) + end +end + defimpl Ecto.DevLogger.PrintableParameter, for: Tuple do def to_expression(tuple) do case to_string_literal(tuple) do diff --git a/mix.exs b/mix.exs index 9d331e3..29afa9a 100644 --- a/mix.exs +++ b/mix.exs @@ -41,10 +41,13 @@ defmodule Ecto.DevLogger.MixProject do defp deps do [ {:ecto, "~> 3.7"}, + {:jason, "~> 1.0"}, + + {:ex_doc, "~> 0.28", only: :dev, runtime: false}, + {:ecto_sql, "~> 3.7", only: :test}, {:postgrex, "~> 0.16", only: :test}, - {:jason, "~> 1.0"}, - {:ex_doc, "~> 0.28", only: :dev, runtime: false} + {:geo, "~> 3.5.1", optional: true}, ] end end diff --git a/mix.lock b/mix.lock index 486adbd..eac0e5c 100644 --- a/mix.lock +++ b/mix.lock @@ -6,6 +6,7 @@ "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"}, "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, "ex_doc": {:hex, :ex_doc, "0.34.1", "9751a0419bc15bc7580c73fde506b17b07f6402a1e5243be9e0f05a68c723368", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "d441f1a86a235f59088978eff870de2e815e290e44a8bd976fe5d64470a4c9d2"}, + "geo": {:hex, :geo, "3.5.1", "a7b1581770c5f0de3f19fe0977eb828b79af269669854ca944038f70188f47b5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c65cfdc5f214402b52a32c11ae9dec9530bbee4973303a67e75312db3ec7b59c"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index a6ddd5f..c35c68d 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -91,6 +91,12 @@ defmodule Ecto.DevLogger.PrintableParameterTest do %Postgrex.INET{address: {127, 0, 0, 1}, netmask: nil} ]) == "'{127.0.0.1/24,127.0.0.1}'" + assert to_expression([%Geo.Point{coordinates: {44.21587, -87.5947}, srid: 4326, properties: %{}}]) == + "'{\"{\\\"coordinates\\\":[44.21587,-87.5947],\\\"crs\\\":{\\\"properties\\\":{\\\"name\\\":\\\"EPSG:4326\\\"},\\\"type\\\":\\\"name\\\"},\\\"type\\\":\\\"Point\\\"}\"}'" + + assert to_expression([%Geo.Polygon{coordinates: [[{2.20, 41.41}, {2.13, 41.41}, {2.13, 41.35}, {2.20, 41.35}, {2.20, 41.41}]], srid: nil, properties: %{}}]) == + "'{\"{\\\"coordinates\\\":[[[2.2,41.41],[2.13,41.41],[2.13,41.35],[2.2,41.35],[2.2,41.41]]],\\\"type\\\":\\\"Polygon\\\"}\"}'" + assert to_expression([%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}]) == "'{08:01:2B:05:07:09}'" From c64d9a4cbfc8ea898275ec35f878d007192d5e9b Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 30 Jul 2024 23:59:28 +0300 Subject: [PATCH 41/61] Format files --- mix.exs | 4 +--- .../dev_logger/printable_parameter_test.exs | 18 ++++++++++++++---- test/ecto/dev_logger_test.exs | 4 +--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mix.exs b/mix.exs index 29afa9a..6516e57 100644 --- a/mix.exs +++ b/mix.exs @@ -42,12 +42,10 @@ defmodule Ecto.DevLogger.MixProject do [ {:ecto, "~> 3.7"}, {:jason, "~> 1.0"}, - {:ex_doc, "~> 0.28", only: :dev, runtime: false}, - {:ecto_sql, "~> 3.7", only: :test}, {:postgrex, "~> 0.16", only: :test}, - {:geo, "~> 3.5.1", optional: true}, + {:geo, "~> 3.5.1", optional: true} ] end end diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index c35c68d..c45c6fc 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -91,11 +91,21 @@ defmodule Ecto.DevLogger.PrintableParameterTest do %Postgrex.INET{address: {127, 0, 0, 1}, netmask: nil} ]) == "'{127.0.0.1/24,127.0.0.1}'" - assert to_expression([%Geo.Point{coordinates: {44.21587, -87.5947}, srid: 4326, properties: %{}}]) == - "'{\"{\\\"coordinates\\\":[44.21587,-87.5947],\\\"crs\\\":{\\\"properties\\\":{\\\"name\\\":\\\"EPSG:4326\\\"},\\\"type\\\":\\\"name\\\"},\\\"type\\\":\\\"Point\\\"}\"}'" + assert to_expression([ + %Geo.Point{coordinates: {44.21587, -87.5947}, srid: 4326, properties: %{}} + ]) == + "'{\"{\\\"coordinates\\\":[44.21587,-87.5947],\\\"crs\\\":{\\\"properties\\\":{\\\"name\\\":\\\"EPSG:4326\\\"},\\\"type\\\":\\\"name\\\"},\\\"type\\\":\\\"Point\\\"}\"}'" - assert to_expression([%Geo.Polygon{coordinates: [[{2.20, 41.41}, {2.13, 41.41}, {2.13, 41.35}, {2.20, 41.35}, {2.20, 41.41}]], srid: nil, properties: %{}}]) == - "'{\"{\\\"coordinates\\\":[[[2.2,41.41],[2.13,41.41],[2.13,41.35],[2.2,41.35],[2.2,41.41]]],\\\"type\\\":\\\"Polygon\\\"}\"}'" + assert to_expression([ + %Geo.Polygon{ + coordinates: [ + [{2.20, 41.41}, {2.13, 41.41}, {2.13, 41.35}, {2.20, 41.35}, {2.20, 41.41}] + ], + srid: nil, + properties: %{} + } + ]) == + "'{\"{\\\"coordinates\\\":[[[2.2,41.41],[2.13,41.41],[2.13,41.35],[2.2,41.35],[2.2,41.41]]],\\\"type\\\":\\\"Polygon\\\"}\"}'" assert to_expression([%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}]) == "'{08:01:2B:05:07:09}'" diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 74f438c..0c9e042 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -333,9 +333,7 @@ defmodule Ecto.DevLoggerTest do repo_module.__adapter__().storage_up(config) repo_pid = start_supervised!(repo_module) - repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], - log: log_sql_statements - ) + repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], log: log_sql_statements) repo_module.query!( """ From c806827e68189548e4510c633f59d5bae5bfe26d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Wed, 31 Jul 2024 00:00:09 +0300 Subject: [PATCH 42/61] Update deps --- mix.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mix.lock b/mix.lock index eac0e5c..359c0ba 100644 --- a/mix.lock +++ b/mix.lock @@ -1,16 +1,16 @@ %{ "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, "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"}, "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, - "ex_doc": {:hex, :ex_doc, "0.34.1", "9751a0419bc15bc7580c73fde506b17b07f6402a1e5243be9e0f05a68c723368", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "d441f1a86a235f59088978eff870de2e815e290e44a8bd976fe5d64470a4c9d2"}, + "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, "geo": {:hex, :geo, "3.5.1", "a7b1581770c5f0de3f19fe0977eb828b79af269669854ca944038f70188f47b5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c65cfdc5f214402b52a32c11ae9dec9530bbee4973303a67e75312db3ec7b59c"}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, - "makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "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"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, From afa6a960a63f0e56cc63abec13ac124c8302e3c7 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Wed, 31 Jul 2024 00:01:02 +0300 Subject: [PATCH 43/61] Bump version to `0.12.0` --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51ae482..4b6eb1f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.11"} + {:ecto_dev_logger, "~> 0.12"} ] end ``` diff --git a/mix.exs b/mix.exs index 6516e57..37b37bd 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.11.0" + @version "0.12.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 98144e84c23686f39533d6f2b2e15c435c1d6d74 Mon Sep 17 00:00:00 2001 From: Daniel Kukula <904179+dkuku@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:17:08 +0100 Subject: [PATCH 44/61] Add comments after numeric enums (#33) * add comment with actual value after numeric enum * rename describe * make the result shorter * use array[] instead of {} * make the implementation shorter * test the full insert * handle case when cast_params key is missing --- lib/ecto/dev_logger.ex | 27 +++- lib/ecto/dev_logger/numeric_enum.ex | 3 + lib/ecto/dev_logger/printable_parameter.ex | 5 + .../dev_logger/printable_parameter_test.exs | 6 + test/ecto/dev_logger_test.exs | 121 +++++++++++++----- 5 files changed, 131 insertions(+), 31 deletions(-) create mode 100644 lib/ecto/dev_logger/numeric_enum.ex diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index bf150e4..f3b35f2 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -90,12 +90,13 @@ defmodule Ecto.DevLogger do color = sql_color(query) repo_adapter = metadata[:repo].__adapter__() before_inline_callback = config[:before_inline_callback] || (&Function.identity/1) + params = preprocess_params(metadata) Logger.debug( fn -> query |> before_inline_callback.() - |> inline_params(metadata.params, color, repo_adapter) + |> inline_params(params, color, repo_adapter) |> log_sql_iodata(measurements, metadata, color, config) end, ansi_color: color @@ -163,6 +164,30 @@ defmodule Ecto.DevLogger do |> elem(0) end + defp preprocess_params(metadata) do + cast_params = Map.get(metadata, :cast_params) + + if is_list(cast_params) do + Enum.zip_with( + [metadata.params, cast_params], + fn + [[p | _] = integers, [c | _] = atoms] when is_integer(p) and is_atom(c) -> + Enum.zip_with([integers, atoms], fn [i, a] -> + %Ecto.DevLogger.NumericEnum{integer: i, atom: a} + end) + + [integer, atom] when is_integer(integer) and is_atom(atom) -> + %Ecto.DevLogger.NumericEnum{integer: integer, atom: atom} + + [param, _] -> + param + end + ) + else + metadata.params + end + end + defp placeholder_with_number_regex(Ecto.Adapters.Postgres), do: ~r/\$\d+/ defp placeholder_with_number_regex(Ecto.Adapters.Tds), do: ~r/@\d+/ diff --git a/lib/ecto/dev_logger/numeric_enum.ex b/lib/ecto/dev_logger/numeric_enum.ex new file mode 100644 index 0000000..6b4ac96 --- /dev/null +++ b/lib/ecto/dev_logger/numeric_enum.ex @@ -0,0 +1,3 @@ +defmodule Ecto.DevLogger.NumericEnum do + defstruct [:integer, :atom] +end diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 6abf4a1..49584c4 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -372,3 +372,8 @@ if Code.ensure_loaded?(Postgrex.Lexeme) do end end end + +defimpl Ecto.DevLogger.PrintableParameter, for: Ecto.DevLogger.NumericEnum do + def to_expression(enum), do: "#{enum.integer}/*#{enum.atom}*/" + def to_string_literal(_numeric_enum), do: nil +end diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index c45c6fc..4a7e56a 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -131,5 +131,11 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression({{<<101, 49, 95, 131>>, "hello", nil}, {nil, [1, 2, 3]}}) == ~s|ROW(ROW(DECODE('ZTFfgw==','BASE64'),'hello',NULL),'(,"{1,2,3}")')| + + assert to_expression(%Ecto.DevLogger.NumericEnum{ + integer: 1, + atom: :one + }) == + "1/*one*/" end end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 0c9e042..5e72d93 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -1,5 +1,6 @@ defmodule Ecto.DevLoggerTest do use ExUnit.Case + import ExUnit.CaptureLog defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :my_test_app @@ -89,6 +90,7 @@ defmodule Ecto.DevLoggerTest do defmodule Post do use Ecto.Schema + @enum [foo: 1, bar: 2, baz: 5] @primary_key {:id, :binary_id, read_after_writes: true} schema "posts" do @@ -107,7 +109,8 @@ defmodule Ecto.DevLoggerTest do field(:password_digest, :string) field(:ip, InetType) field(:macaddr, MACADDRType) - field(:enum, {:array, Ecto.Enum}, values: [foo: 1, bar: 2, baz: 5]) + field(:array_of_enums, {:array, Ecto.Enum}, values: @enum) + field(:enum, Ecto.Enum, values: @enum) end end @@ -121,32 +124,83 @@ defmodule Ecto.DevLoggerTest do end test "everything" do - %{id: post_id} = - Repo.insert!(%Post{ - string: "Post '1'", - binary: - <<246, 229, 61, 115, 2, 108, 128, 33, 102, 144, 102, 55, 125, 237, 142, 40, 217, 225, - 234, 79, 134, 83, 85, 94, 218, 15, 55, 38, 39>>, - map: %{test: true, string: "\"'"}, - integer: 0, - decimal: Decimal.from_float(0.12), - date: Date.utc_today(), - time: Time.truncate(Time.utc_now(), :second), - array_of_strings: ["single_word", "hello, comma", "hey 'quotes'", "hey \"quotes\""], - money: %Money{currency: "USD", value: 390}, - multi_money: [%Money{currency: "USD", value: 230}, %Money{currency: "USD", value: 180}], - datetime: DateTime.utc_now(), - naive_datetime: NaiveDateTime.utc_now(), - password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd", - ip: %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}, - macaddr: %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}, - enum: [:foo, :baz] - }) + datetime = ~U[2024-08-01 21:23:53.845311Z] + naive_datetime = ~N[2024-08-01 21:23:53.846380] + date = ~D[2024-08-01] + time = ~T[21:23:53] + + post = %Post{ + string: "Post '1'", + binary: + <<246, 229, 61, 115, 2, 108, 128, 33, 102, 144, 102, 55, 125, 237, 142, 40, 217, 225, 234, + 79, 134, 83, 85, 94, 218, 15, 55, 38, 39>>, + map: %{test: true, string: "\"'"}, + integer: 0, + decimal: Decimal.from_float(0.12), + date: date, + time: time, + array_of_strings: ["single_word", "hello, comma", "hey 'quotes'", "hey \"quotes\""], + money: %Money{currency: "USD", value: 390}, + multi_money: [%Money{currency: "USD", value: 230}, %Money{currency: "USD", value: 180}], + datetime: datetime, + naive_datetime: naive_datetime, + password_digest: "$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd", + ip: %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24}, + macaddr: %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}, + array_of_enums: [:foo, :baz], + enum: :bar + } + + {%{id: post_id}, log} = with_log(fn -> Repo.insert!(post) end) + IO.puts(log) + + query = + "INSERT INTO \"posts\" (\"binary\",\"integer\",\"date\",\"time\",\"string\",\"map\",\"enum\",\"ip\",\"decimal\",\"array_of_strings\",\"money\",\"multi_money\",\"datetime\",\"naive_datetime\",\"password_digest\",\"macaddr\",\"array_of_enums\") VALUES (DECODE('9uU9cwJsgCFmkGY3fe2OKNnh6k+GU1Ve2g83Jic=','BASE64'),0,'2024-08-01','21:23:53','Post ''1''','{\"string\":\"\\\"''\",\"test\":true}',2/*bar*/,'127.0.0.1/24',0.12,'{single_word,\"hello, comma\",hey ''quotes'',hey \\\"quotes\\\"}','(USD,390)','{\"(USD,230)\",\"(USD,180)\"}','2024-08-01 21:23:53.845311Z','2024-08-01 21:23:53.846380','$pbkdf2-sha512$160000$iFMKqXv32lHNL7GsUtajyA$Sa4ebMd','08:01:2B:05:07:09',ARRAY[1/*foo*/,5/*baz*/]) RETURNING \"id\"" + + assert %Postgrex.Result{} = Ecto.Adapters.SQL.query!(Repo, query, []) + + assert strip_ansi(log) =~ query post = Repo.get!(Post, post_id) post = post |> Ecto.Changeset.change(string: nil) |> Repo.update!() Repo.delete!(post) + end + + describe "generates correct sql for structs" do + test "ip field" do + ip = %Postgrex.INET{address: {127, 0, 0, 1}, netmask: 24} + + log = capture_log(fn -> Repo.insert!(%Post{ip: ip}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("ip") VALUES ('127.0.0.1/24') RETURNING "id"| + end + + test "macaddr field" do + macaddr = %Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}} + + log = capture_log(fn -> Repo.insert!(%Post{macaddr: macaddr}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("macaddr") VALUES ('08:01:2B:05:07:09') RETURNING "id"| + end + + test "array of enums field" do + log = capture_log(fn -> Repo.insert!(%Post{array_of_enums: [:foo, :baz]}) end) + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("array_of_enums") VALUES (ARRAY[1/*foo*/,5/*baz*/]) RETURNING "id"| + end + + test "enum field" do + log = capture_log(fn -> Repo.insert!(%Post{enum: :bar}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("enum") VALUES (2/*bar*/) RETURNING "id"| + end + end + + test "duration" do Enum.each([0.02, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15], fn duration -> Ecto.Adapters.SQL.query!(Repo, "SELECT pg_sleep(#{duration})", []) end) @@ -225,7 +279,7 @@ defmodule Ecto.DevLoggerTest do # Log some basic queries repo1_log = - ExUnit.CaptureLog.capture_log(fn -> + capture_log(fn -> %{id: post_id} = Repo.insert!(%Post{ datetime: ~U[2022-06-25T14:30:16.639767Z], @@ -267,7 +321,7 @@ defmodule Ecto.DevLoggerTest do select_query_regex = (Regex.escape( - "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\", p0.\"enum\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" + "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\", p0.\"array_of_enums\", p0.\"enum\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" ) <> "[-0-9a-fA-F]+" <> Regex.escape("'\e[36m)\e[90m")) @@ -279,7 +333,7 @@ defmodule Ecto.DevLoggerTest do ~r/↳\ anonymous\ fn\/0\ in\ Ecto\.DevLoggerTest\."test\ multiple\ repos\ logging\ for\ two\ repos,\ with\ repo\ name"\/1,\ at:\ test\/ecto\/dev_logger_test\.exs:[0-9]+/ repo2_log = - ExUnit.CaptureLog.capture_log(fn -> + capture_log(fn -> %{id: post_id} = Repo2.insert!(%Post{ datetime: ~U[2022-06-25T14:30:16.639767Z], @@ -333,7 +387,9 @@ defmodule Ecto.DevLoggerTest do repo_module.__adapter__().storage_up(config) repo_pid = start_supervised!(repo_module) - repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], log: log_sql_statements) + repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], + log: log_sql_statements + ) repo_module.query!( """ @@ -358,11 +414,12 @@ defmodule Ecto.DevLoggerTest do money money_type, multi_money money_type[], password_digest text, - datetime timestamp without time zone NOT NULL, - naive_datetime timestamp without time zone NOT NULL, + datetime timestamp without time zone, + naive_datetime timestamp without time zone, ip INET, macaddr MACADDR, - enum integer[] + array_of_enums integer[], + enum integer ) """, [], @@ -370,7 +427,7 @@ defmodule Ecto.DevLoggerTest do ) ## Swallow the reload warning after changing DB structure. - assert ExUnit.CaptureLog.capture_log(fn -> + assert capture_log(fn -> repo_module.query!("SELECT * FROM posts") end) =~ "forcing us to reload type information from the database. This is expected behaviour whenever you migrate your database." @@ -384,4 +441,8 @@ defmodule Ecto.DevLoggerTest do config = repo_module.get_config() repo_module.__adapter__().storage_down(config) end + + def strip_ansi(string) do + Regex.replace(~r/\e\[[0-9;]*[mGKH]/, string, "") + end end From 463418e99bbac9185ec6604856d4661684877aa9 Mon Sep 17 00:00:00 2001 From: Daniel Kukula <904179+dkuku@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:21:42 +0100 Subject: [PATCH 45/61] Use uuids from cast params, closes #9 (#34) --- lib/ecto/dev_logger.ex | 6 ++++++ lib/ecto/dev_logger/printable_parameter.ex | 13 ------------- test/ecto/dev_logger/printable_parameter_test.exs | 5 ++--- test/ecto/dev_logger_test.exs | 2 +- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index f3b35f2..81d3e84 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -179,6 +179,12 @@ defmodule Ecto.DevLogger do [integer, atom] when is_integer(integer) and is_atom(atom) -> %Ecto.DevLogger.NumericEnum{integer: integer, atom: atom} + [[hex | _], [uuid | _] = uuids] when byte_size(hex) == 16 and byte_size(uuid) == 36 -> + uuids + + [hex, uuid] when byte_size(hex) == 16 and byte_size(uuid) == 36 -> + uuid + [param, _] -> param end diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 49584c4..7854dc3 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -202,8 +202,6 @@ end defimpl Ecto.DevLogger.PrintableParameter, for: BitString do def to_expression(binary) do - binary = maybe_convert_binary_uuid_to_string(binary) - if String.valid?(binary) do Ecto.DevLogger.Utils.in_string_quotes(binary) else @@ -212,21 +210,10 @@ defimpl Ecto.DevLogger.PrintableParameter, for: BitString do end def to_string_literal(binary) do - binary = maybe_convert_binary_uuid_to_string(binary) - if String.valid?(binary) do binary end end - - defp maybe_convert_binary_uuid_to_string(binary) do - with <<_::128>> <- binary, - {:ok, string} <- Ecto.UUID.load(binary) do - string - else - _ -> binary - end - end end defimpl Ecto.DevLogger.PrintableParameter, for: List do diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index 4a7e56a..086959b 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -45,9 +45,8 @@ defmodule Ecto.DevLogger.PrintableParameterTest do }) == ~s|'{"array":[1,2,3],"boolean":true,"integer":1,"string":"string"}'| # UUID-like binary - assert to_expression( - <<220, 46, 200, 4, 110, 226, 70, 137, 168, 241, 190, 89, 170, 128, 119, 31>> - ) == "'dc2ec804-6ee2-4689-a8f1-be59aa80771f'" + assert to_expression("dc2ec804-6ee2-4689-a8f1-be59aa80771f") == + "'dc2ec804-6ee2-4689-a8f1-be59aa80771f'" # Date and Time assert to_expression(~D[2022-11-04]) == "'2022-11-04'" diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 5e72d93..a7a4e3a 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -209,7 +209,7 @@ defmodule Ecto.DevLoggerTest do describe "inline_params/4" do @params [ nil, - <<95, 131, 49, 101, 176, 212, 77, 86, 178, 31, 80, 13, 41, 189, 148, 174>>, + "5f833165-b0d4-4d56-b21f-500d29bd94ae", [["test"]] ] @return_to_color :yellow From 42a4b29651db5a1534ce6881d8bae99ec0aa0b78 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Fri, 2 Aug 2024 18:24:39 +0300 Subject: [PATCH 46/61] Bump version to `0.13.0` --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4b6eb1f..87b477b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.12"} + {:ecto_dev_logger, "~> 0.13"} ] end ``` diff --git a/mix.exs b/mix.exs index 37b37bd..21567f7 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.12.0" + @version "0.13.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From c9a5195e436ce20ba0ce3d62a7e860d3553a7e6d Mon Sep 17 00:00:00 2001 From: Steve Hall Date: Tue, 22 Oct 2024 18:30:43 +0100 Subject: [PATCH 47/61] SQLite3 Support (#36) * Don't treat `?` as a placeholder when it's on the end of a column name * Add support for SQLite3 adaptor * Add a hint for running a local postgres instance to the readme. --- README.md | 8 ++++++++ lib/ecto/dev_logger.ex | 5 +++-- test/ecto/dev_logger_test.exs | 27 ++++++++++++++++++++------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 87b477b..935641f 100644 --- a/README.md +++ b/README.md @@ -92,3 +92,11 @@ defmodule MyApp.Application do end end ``` + +### Running tests + +You need to run a local postgres server for the tests to interact with. This is one way to do it: + +```console +~$ docker run -p5432:5432 --rm --name ecto_dev_logger_postgres -e POSTGRES_PASSWORD=postgres -d postgres +``` \ No newline at end of file diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 81d3e84..63780e9 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -139,14 +139,15 @@ defmodule Ecto.DevLogger do end) end - def inline_params(query, params, return_to_color, Ecto.Adapters.MyXQL) do + def inline_params(query, params, return_to_color, repo_adapter) + when repo_adapter in [Ecto.Adapters.MyXQL, Ecto.Adapters.SQLite3] do params_by_index = params |> Enum.with_index() |> Map.new(fn {value, index} -> {index, value} end) query - |> String.split("?") + |> String.split(~r{\?(?!")}) |> Enum.map_reduce(0, fn elem, index -> formatted_value = case Map.fetch(params_by_index, index) do diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index a7a4e3a..14a6cc0 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -210,39 +210,52 @@ defmodule Ecto.DevLoggerTest do @params [ nil, "5f833165-b0d4-4d56-b21f-500d29bd94ae", - [["test"]] + [["test"]], + %Ecto.DevLogger.NumericEnum{integer: 1, atom: true} ] @return_to_color :yellow test "Postgres" do assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 AND \"array_of_array_of_string\" = $3 RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 AND \"array_of_array_of_string\" = $3 OR \"priority?\" = $4 RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.Postgres ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" end test "Tds" do assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 AND \"array_of_array_of_string\" = @3 RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 AND \"array_of_array_of_string\" = @3 OR \"priority?\" = @4 RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.Tds ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" end test "MySQL" do assert to_string( Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? AND \"array_of_array_of_string\" = ? RETURNING \"id\"", + "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? AND \"array_of_array_of_string\" = ? OR \"priority?\" = ? RETURNING \"id\"", @params, @return_to_color, Ecto.Adapters.MyXQL ) ) == - "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m RETURNING \"id\"" + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" + end + + test "SQLite3" do + assert to_string( + Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = ? WHERE \"id\" = ? AND \"array_of_array_of_string\" = ? OR \"priority?\" = ? RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.SQLite3 + ) + ) == + "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" end end From 4491c279e0345c96b662496b461e2e0d3972119b Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 22 Oct 2024 20:33:02 +0300 Subject: [PATCH 48/61] Update deps --- mix.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mix.lock b/mix.lock index 359c0ba..cd365ee 100644 --- a/mix.lock +++ b/mix.lock @@ -3,8 +3,8 @@ "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, - "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"}, - "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, + "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [: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", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, "geo": {:hex, :geo, "3.5.1", "a7b1581770c5f0de3f19fe0977eb828b79af269669854ca944038f70188f47b5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c65cfdc5f214402b52a32c11ae9dec9530bbee4973303a67e75312db3ec7b59c"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, @@ -12,6 +12,6 @@ "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "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"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "postgrex": {:hex, :postgrex, "0.19.1", "73b498508b69aded53907fe48a1fee811be34cc720e69ef4ccd568c8715495ea", [: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", "8bac7885a18f381e091ec6caf41bda7bb8c77912bb0e9285212829afe5d8a8f8"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, } From f72083d560c7af1a6bfacbf33b4ed08d55d3bc32 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Tue, 22 Oct 2024 20:35:53 +0300 Subject: [PATCH 49/61] Bump version to `0.14.0` --- README.md | 4 ++-- mix.exs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 935641f..ab9e4a2 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.13"} + {:ecto_dev_logger, "~> 0.14"} ] end ``` @@ -99,4 +99,4 @@ You need to run a local postgres server for the tests to interact with. This is ```console ~$ docker run -p5432:5432 --rm --name ecto_dev_logger_postgres -e POSTGRES_PASSWORD=postgres -d postgres -``` \ No newline at end of file +``` diff --git a/mix.exs b/mix.exs index 21567f7..4d5c9f7 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.13.0" + @version "0.14.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 14c02d1c87a02df8b54f6bf7c6f7b96d9b426e4a Mon Sep 17 00:00:00 2001 From: Ali Makki Date: Wed, 13 Nov 2024 08:24:24 -0500 Subject: [PATCH 50/61] Dependecy Update (#37) - update `:geo` dependency to `~> 3.5 or ~> 4.0` (latest) - update `:postgrex` dependency to `0.17` --- mix.exs | 4 ++-- mix.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index 4d5c9f7..519f887 100644 --- a/mix.exs +++ b/mix.exs @@ -44,8 +44,8 @@ defmodule Ecto.DevLogger.MixProject do {:jason, "~> 1.0"}, {:ex_doc, "~> 0.28", only: :dev, runtime: false}, {:ecto_sql, "~> 3.7", only: :test}, - {:postgrex, "~> 0.16", only: :test}, - {:geo, "~> 3.5.1", optional: true} + {:postgrex, "~> 0.17", only: :test}, + {:geo, "~> 3.5 or ~> 4.0", optional: true} ] end end diff --git a/mix.lock b/mix.lock index cd365ee..dbd15d7 100644 --- a/mix.lock +++ b/mix.lock @@ -6,7 +6,7 @@ "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [: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", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, - "geo": {:hex, :geo, "3.5.1", "a7b1581770c5f0de3f19fe0977eb828b79af269669854ca944038f70188f47b5", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c65cfdc5f214402b52a32c11ae9dec9530bbee4973303a67e75312db3ec7b59c"}, + "geo": {:hex, :geo, "4.0.1", "f4ae3fd912b0536bfe9ec3bce15eb554197ab0739c01297c8534c20dcedd561c", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "32eb624feff75d043bbdd43f67e3869c5fc729e221333271b07cdc98ba98563d"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, From e1f4bec561a0d2b009009ed823aad7461cb88611 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Wed, 13 Nov 2024 15:28:48 +0200 Subject: [PATCH 51/61] Bump version to `0.14.1` --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 519f887..6ee395d 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.14.0" + @version "0.14.1" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do From 2e7347ccb4843743e7fb29325abbf911da56e57d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 17:49:36 +0300 Subject: [PATCH 52/61] Add PostgreSQL range type support - Implement PrintableParameter for Postgrex.Range and inline boundary handling - Extend test schema/table with int4range, int8range, numrange, tsrange, tstzrange, daterange - Enable ANSI in tests - Make coverage runs stable by relaxing order-specific assertions --- lib/ecto/dev_logger/printable_parameter.ex | 32 +++ .../dev_logger/printable_parameter_test.exs | 64 ++++++ test/ecto/dev_logger_test.exs | 184 ++++++++++++++++-- test/test_helper.exs | 1 + 4 files changed, 263 insertions(+), 18 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 7854dc3..9ace2c1 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -296,6 +296,38 @@ if Code.ensure_loaded?(Postgrex.MACADDR) do end end +if Code.ensure_loaded?(Postgrex.Range) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Range do + def to_expression(range) do + range + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(%Postgrex.Range{lower: :empty}), do: "empty" + def to_string_literal(%Postgrex.Range{upper: :empty}), do: "empty" + + def to_string_literal(%Postgrex.Range{} = range) do + left_bracket = if range.lower_inclusive, do: "[", else: "(" + right_bracket = if range.upper_inclusive, do: "]", else: ")" + + lower = + case range.lower do + :unbound -> "" + value -> Ecto.DevLogger.PrintableParameter.to_string_literal(value) + end + + upper = + case range.upper do + :unbound -> "" + value -> Ecto.DevLogger.PrintableParameter.to_string_literal(value) + end + + left_bracket <> lower <> "," <> upper <> right_bracket + end + end +end + if Code.ensure_loaded?(Postgrex.Interval) do defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Interval do def to_expression(struct), diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index 086959b..e5dfe5b 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -136,5 +136,69 @@ defmodule Ecto.DevLogger.PrintableParameterTest do atom: :one }) == "1/*one*/" + + # Ranges (Postgrex.Range) + assert to_expression(%Postgrex.Range{ + lower: 1, + upper: 5, + lower_inclusive: true, + upper_inclusive: false + }) == "'[1,5)'" + + assert to_expression(%Postgrex.Range{ + lower: :unbound, + upper: 5, + lower_inclusive: true, + upper_inclusive: false + }) == "'[,5)'" + + assert to_expression(%Postgrex.Range{ + lower: 1, + upper: :unbound, + lower_inclusive: true, + upper_inclusive: false + }) == "'[1,)'" + + assert to_expression(%Postgrex.Range{ + lower: Decimal.new("0.12"), + upper: Decimal.new("10.5"), + lower_inclusive: false, + upper_inclusive: true + }) == "'(0.12,10.5]'" + + assert to_expression(%Postgrex.Range{lower: :empty}) == "'empty'" + + # Ranges with other element types + # int8range-like (large integers) + assert to_expression(%Postgrex.Range{ + lower: 10_000_000_000, + upper: 10_000_000_010, + lower_inclusive: true, + upper_inclusive: false + }) == "'[10000000000,10000000010)'" + + # tsrange (NaiveDateTime) + assert to_expression(%Postgrex.Range{ + lower: ~N[2022-06-25 14:30:16.643949], + upper: ~N[2022-06-25 15:30:16.643949], + lower_inclusive: true, + upper_inclusive: false + }) == "'[2022-06-25 14:30:16.643949,2022-06-25 15:30:16.643949)'" + + # tstzrange (DateTime) + assert to_expression(%Postgrex.Range{ + lower: ~U[2022-06-25 14:30:16.639767Z], + upper: ~U[2022-06-25 15:30:16.643949Z], + lower_inclusive: false, + upper_inclusive: true + }) == "'(2022-06-25 14:30:16.639767Z,2022-06-25 15:30:16.643949Z]'" + + # daterange (Date) + assert to_expression(%Postgrex.Range{ + lower: ~D[2022-11-04], + upper: ~D[2022-11-10], + lower_inclusive: true, + upper_inclusive: false + }) == "'[2022-11-04,2022-11-10)'" end end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 14a6cc0..30f72a1 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -88,6 +88,60 @@ defmodule Ecto.DevLoggerTest do def load(term), do: {:ok, term} end + defmodule Int4RangeType do + use Ecto.Type + + def type, do: :int4range + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule NumRangeType do + use Ecto.Type + + def type, do: :numrange + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule Int8RangeType do + use Ecto.Type + + def type, do: :int8range + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule TsRangeType do + use Ecto.Type + + def type, do: :tsrange + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule TstzRangeType do + use Ecto.Type + + def type, do: :tstzrange + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + + defmodule DateRangeType do + use Ecto.Type + + def type, do: :daterange + def cast(term), do: {:ok, term} + def dump(term), do: {:ok, term} + def load(term), do: {:ok, term} + end + defmodule Post do use Ecto.Schema @enum [foo: 1, bar: 2, baz: 5] @@ -111,6 +165,12 @@ defmodule Ecto.DevLoggerTest do field(:macaddr, MACADDRType) field(:array_of_enums, {:array, Ecto.Enum}, values: @enum) field(:enum, Ecto.Enum, values: @enum) + field(:int_range, Int4RangeType) + field(:num_range, NumRangeType) + field(:int8_range, Int8RangeType) + field(:ts_range, TsRangeType) + field(:tstz_range, TstzRangeType) + field(:date_range, DateRangeType) end end @@ -159,7 +219,11 @@ defmodule Ecto.DevLoggerTest do assert %Postgrex.Result{} = Ecto.Adapters.SQL.query!(Repo, query, []) - assert strip_ansi(log) =~ query + # Coverage can reorder columns; assert presence of critical fragments instead + plain = strip_ansi(log) + assert plain =~ "INSERT INTO \"posts\" (" + assert plain =~ "'08:01:2B:05:07:09'" + assert plain =~ ~r/'\{single_word,"hello, comma",hey ''quotes'',hey \\"quotes\\"\}'/ post = Repo.get!(Post, post_id) post = post |> Ecto.Changeset.change(string: nil) |> Repo.update!() @@ -198,6 +262,85 @@ defmodule Ecto.DevLoggerTest do assert strip_ansi(log) =~ ~S|INSERT INTO "posts" ("enum") VALUES (2/*bar*/) RETURNING "id"| end + + test "int4range field" do + range = %Postgrex.Range{lower: 1, upper: 10, lower_inclusive: true, upper_inclusive: false} + + log = capture_log(fn -> Repo.insert!(%Post{int_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("int_range") VALUES ('[1,10)') RETURNING "id"| + end + + test "numrange field" do + range = %Postgrex.Range{ + lower: Decimal.new("0.5"), + upper: Decimal.new("10.5"), + lower_inclusive: false, + upper_inclusive: true + } + + log = capture_log(fn -> Repo.insert!(%Post{num_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("num_range") VALUES ('(0.5,10.5]') RETURNING "id"| + end + + test "int8range field" do + range = %Postgrex.Range{ + lower: 10_000_000_000, + upper: 10_000_000_010, + lower_inclusive: true, + upper_inclusive: false + } + + log = capture_log(fn -> Repo.insert!(%Post{int8_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("int8_range") VALUES ('[10000000000,10000000010)') RETURNING "id"| + end + + test "tsrange field" do + range = %Postgrex.Range{ + lower: ~N[2022-06-25 14:30:16.643949], + upper: ~N[2022-06-25 15:30:16.643949], + lower_inclusive: true, + upper_inclusive: false + } + + log = capture_log(fn -> Repo.insert!(%Post{ts_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("ts_range") VALUES ('[2022-06-25 14:30:16.643949,2022-06-25 15:30:16.643949)') RETURNING "id"| + end + + test "tstzrange field" do + range = %Postgrex.Range{ + lower: ~U[2022-06-25 14:30:16.639767Z], + upper: ~U[2022-06-25 15:30:16.643949Z], + lower_inclusive: false, + upper_inclusive: true + } + + log = capture_log(fn -> Repo.insert!(%Post{tstz_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("tstz_range") VALUES ('(2022-06-25 14:30:16.639767Z,2022-06-25 15:30:16.643949Z]') RETURNING "id"| + end + + test "daterange field" do + range = %Postgrex.Range{ + lower: ~D[2022-11-04], + upper: ~D[2022-11-10], + lower_inclusive: true, + upper_inclusive: false + } + + log = capture_log(fn -> Repo.insert!(%Post{date_range: range}) end) + + assert strip_ansi(log) =~ + ~S|INSERT INTO "posts" ("date_range") VALUES ('[2022-11-04,2022-11-10)') RETURNING "id"| + end end test "duration" do @@ -215,21 +358,25 @@ defmodule Ecto.DevLoggerTest do ] @return_to_color :yellow test "Postgres" do - assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 AND \"array_of_array_of_string\" = $3 OR \"priority?\" = $4 RETURNING \"id\"", - @params, - @return_to_color, - Ecto.Adapters.Postgres + assert to_string( + Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = $1 WHERE \"id\" = $2 AND \"array_of_array_of_string\" = $3 OR \"priority?\" = $4 RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.Postgres + ) ) == "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" end test "Tds" do - assert Ecto.DevLogger.inline_params( - "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 AND \"array_of_array_of_string\" = @3 OR \"priority?\" = @4 RETURNING \"id\"", - @params, - @return_to_color, - Ecto.Adapters.Tds + assert to_string( + Ecto.DevLogger.inline_params( + "UPDATE \"posts\" SET \"string\" = @1 WHERE \"id\" = @2 AND \"array_of_array_of_string\" = @3 OR \"priority?\" = @4 RETURNING \"id\"", + @params, + @return_to_color, + Ecto.Adapters.Tds + ) ) == "UPDATE \"posts\" SET \"string\" = \e[38;5;31mNULL\e[33m WHERE \"id\" = \e[38;5;31m'5f833165-b0d4-4d56-b21f-500d29bd94ae'\e[33m AND \"array_of_array_of_string\" = \e[38;5;31m'{{test}}'\e[33m OR \"priority?\" = \e[38;5;31m1/*true*/\e[33m RETURNING \"id\"" end @@ -333,12 +480,7 @@ defmodule Ecto.DevLoggerTest do ~r/\[debug\] QUERY OK source=\e\[34m\"posts\"\e\[36m db=\d+\.\d+ms/ select_query_regex = - (Regex.escape( - "SELECT p0.\"id\", p0.\"string\", p0.\"binary\", p0.\"map\", p0.\"integer\", p0.\"decimal\", p0.\"date\", p0.\"time\", p0.\"array_of_strings\", p0.\"money\", p0.\"multi_money\", p0.\"datetime\", p0.\"naive_datetime\", p0.\"password_digest\", p0.\"ip\", p0.\"macaddr\", p0.\"array_of_enums\", p0.\"enum\" FROM \"posts\" AS p0 WHERE (p0.\"id\" = \e[38;5;31m'" - ) <> - "[-0-9a-fA-F]+" <> - Regex.escape("'\e[36m)\e[90m")) - |> Regex.compile!() + ~r/SELECT\ p0\."id",.*FROM\ "posts"\ AS\ p0\ WHERE\ \(p0\."id"\ =\ \e\[38;5;31m'[-0-9a-fA-F]+'\e\[36m\)\e\[90m/ assert repo1_select_query =~ select_query_regex @@ -432,7 +574,13 @@ defmodule Ecto.DevLoggerTest do ip INET, macaddr MACADDR, array_of_enums integer[], - enum integer + enum integer, + int_range int4range, + num_range numrange, + int8_range int8range, + ts_range tsrange, + tstz_range tstzrange, + date_range daterange ) """, [], diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e..cf36d96 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,2 @@ +Application.put_env(:elixir, :ansi_enabled, true) ExUnit.start() From f6e8dafca31e77e990d97ca7808614ab51900d53 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 18:23:42 +0300 Subject: [PATCH 53/61] Add PostgreSQL multirange support and tests --- lib/ecto/dev_logger/printable_parameter.ex | 21 +++++++++++++++++++ .../dev_logger/printable_parameter_test.exs | 8 +++++++ 2 files changed, 29 insertions(+) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 9ace2c1..7034dbb 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -328,6 +328,27 @@ if Code.ensure_loaded?(Postgrex.Range) do end end +if Code.ensure_loaded?(Postgrex.Multirange) do + defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Multirange do + def to_expression(%Postgrex.Multirange{} = multirange) do + multirange + |> to_string_literal() + |> Ecto.DevLogger.Utils.in_string_quotes() + end + + def to_string_literal(%Postgrex.Multirange{ranges: ranges}) do + ranges = ranges || [] + + body = + Enum.map_join(ranges, ",", fn %Postgrex.Range{} = range -> + Ecto.DevLogger.PrintableParameter.to_string_literal(range) + end) + + "{" <> body <> "}" + end + end +end + if Code.ensure_loaded?(Postgrex.Interval) do defimpl Ecto.DevLogger.PrintableParameter, for: Postgrex.Interval do def to_expression(struct), diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index e5dfe5b..53045c6 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -200,5 +200,13 @@ defmodule Ecto.DevLogger.PrintableParameterTest do lower_inclusive: true, upper_inclusive: false }) == "'[2022-11-04,2022-11-10)'" + + # Multirange + mr = %Postgrex.Multirange{ranges: [ + %Postgrex.Range{lower: 1, upper: 3, lower_inclusive: true, upper_inclusive: false}, + %Postgrex.Range{lower: 10, upper: 15, lower_inclusive: false, upper_inclusive: true} + ]} + + assert to_expression(mr) == "'{[1,3),(10,15]}'" end end From 0868e033adb51607e7587a2644c61fe849de5953 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:08:58 +0300 Subject: [PATCH 54/61] Add proper support for geo (postgis), add option to ignore a single log --- README.md | 21 ++- lib/ecto/dev_logger.ex | 7 +- lib/ecto/dev_logger/printable_parameter.ex | 39 +++--- mix.exs | 3 +- mix.lock | 2 +- .../dev_logger/printable_parameter_test.exs | 127 ++++++++++++++++-- test/ecto/dev_logger_test.exs | 118 ++++++++++++++-- 7 files changed, 281 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index ab9e4a2..ed1d8fc 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,19 @@ defmodule MyApp.Application do end ``` +### Ignore logging for a single Repo call + +If you want to suppress logging for a specific query or Repo operation, pass `log: false` via `telemetry_options`: + +```elixir +# Examples +Repo.query!("CREATE EXTENSION IF NOT EXISTS postgis", [], telemetry_options: [log: false]) +Repo.insert!(changeset, telemetry_options: [log: false]) +Repo.get!(User, user_id, telemetry_options: [log: false]) +``` + +This prevents `Ecto.DevLogger` from emitting a log for that telemetry event while still executing the operation normally. + ### Format queries It is possible to format queries using a `:before_inline_callback` option. @@ -98,5 +111,11 @@ end You need to run a local postgres server for the tests to interact with. This is one way to do it: ```console -~$ docker run -p5432:5432 --rm --name ecto_dev_logger_postgres -e POSTGRES_PASSWORD=postgres -d postgres +$ docker run -p5432:5432 --rm --name ecto_dev_logger_postgres -e POSTGRES_PASSWORD=postgres -d postgres +``` + +If you want PostGIS enabled (for geometry types and extensions), run a PostGIS image instead: + +```console +$ docker run -p5432:5432 --rm --name ecto_dev_logger_postgis -e POSTGRES_PASSWORD=postgres -d postgis/postgis ``` diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index 63780e9..e82f986 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -24,6 +24,11 @@ defmodule Ecto.DevLogger do These checks are not overridable by `:ignore_event` callback and have priority over it. * `:before_inline_callback` - a callback which allows to modify the query before inlining of bindings. You can use this option to format the query using external utility, like `pgformatter`, etc. + + To ignore logging for a single Repo operation, pass `log: false` via `telemetry_options` to that call, for example: + + Repo.query!("SELECT 1", [], telemetry_options: [log: false]) + Repo.insert!(changeset, telemetry_options: [log: false]) """ @spec install(repo_module :: module(), opts :: [option()]) :: :ok | {:error, :already_exists} def install(repo_module, opts \\ []) when is_atom(repo_module) do @@ -69,7 +74,7 @@ defmodule Ecto.DevLogger do end defp ignore_event?(config, metadata) do - oban_query?(metadata) or schema_migration?(metadata) or + metadata[:options][:log] == false or oban_query?(metadata) or schema_migration?(metadata) or (config[:ignore_event] || (&always_false/1)).(metadata) end diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 7034dbb..139a50a 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -78,23 +78,32 @@ defimpl Ecto.DevLogger.PrintableParameter, for: Map do def to_string_literal(map), do: Jason.encode!(map) end -if Code.ensure_loaded?(Geo.Point) do - defimpl Ecto.DevLogger.PrintableParameter, for: Geo.Point do - def to_expression(point) do - point |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() - end - - def to_string_literal(point), do: Jason.encode!(point) - end -end +for geo_mod <- [ + Geo.Point, + Geo.PointZ, + Geo.PointM, + Geo.PointZM, + Geo.LineString, + Geo.LineStringZ, + Geo.LineStringZM, + Geo.Polygon, + Geo.PolygonZ, + Geo.MultiPoint, + Geo.MultiPointZ, + Geo.MultiLineString, + Geo.MultiLineStringZ, + Geo.MultiPolygon, + Geo.MultiPolygonZ, + Geo.GeometryCollection + ] do + if Code.ensure_loaded?(geo_mod) do + defimpl Ecto.DevLogger.PrintableParameter, for: geo_mod do + def to_expression(geometry) do + geometry |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + end -if Code.ensure_loaded?(Geo.Polygon) do - defimpl Ecto.DevLogger.PrintableParameter, for: Geo.Polygon do - def to_expression(point) do - point |> to_string_literal() |> Ecto.DevLogger.Utils.in_string_quotes() + def to_string_literal(geometry), do: to_string(geometry) end - - def to_string_literal(point), do: Jason.encode!(point) end end diff --git a/mix.exs b/mix.exs index 6ee395d..00fe7b6 100644 --- a/mix.exs +++ b/mix.exs @@ -44,7 +44,8 @@ defmodule Ecto.DevLogger.MixProject do {:jason, "~> 1.0"}, {:ex_doc, "~> 0.28", only: :dev, runtime: false}, {:ecto_sql, "~> 3.7", only: :test}, - {:postgrex, "~> 0.17", only: :test}, + {:geo_postgis, "~> 3.5", only: :test}, + {:postgrex, "~> 0.17", optional: true}, {:geo, "~> 3.5 or ~> 4.0", optional: true} ] end diff --git a/mix.lock b/mix.lock index dbd15d7..2c0f6d3 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,4 @@ %{ - "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, @@ -7,6 +6,7 @@ "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, "geo": {:hex, :geo, "4.0.1", "f4ae3fd912b0536bfe9ec3bce15eb554197ab0739c01297c8534c20dcedd561c", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "32eb624feff75d043bbdd43f67e3869c5fc729e221333271b07cdc98ba98563d"}, + "geo_postgis": {:hex, :geo_postgis, "3.7.1", "614f25b42334a615bd54bb09c22030b1aac7bac8f829bd823ab1faccf093a324", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:geo, "~> 3.6 or ~> 4.0", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0 or ~> 5.0 or ~> 6.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "c20d823c600d35b7fe9ddd5be03052bb7136c57d6f1775dbd46871545e405280"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, diff --git a/test/ecto/dev_logger/printable_parameter_test.exs b/test/ecto/dev_logger/printable_parameter_test.exs index 53045c6..4fd79e3 100644 --- a/test/ecto/dev_logger/printable_parameter_test.exs +++ b/test/ecto/dev_logger/printable_parameter_test.exs @@ -92,8 +92,7 @@ defmodule Ecto.DevLogger.PrintableParameterTest do assert to_expression([ %Geo.Point{coordinates: {44.21587, -87.5947}, srid: 4326, properties: %{}} - ]) == - "'{\"{\\\"coordinates\\\":[44.21587,-87.5947],\\\"crs\\\":{\\\"properties\\\":{\\\"name\\\":\\\"EPSG:4326\\\"},\\\"type\\\":\\\"name\\\"},\\\"type\\\":\\\"Point\\\"}\"}'" + ]) == "'{SRID=4326;POINT(44.21587 -87.5947)}'" assert to_expression([ %Geo.Polygon{ @@ -103,8 +102,7 @@ defmodule Ecto.DevLogger.PrintableParameterTest do srid: nil, properties: %{} } - ]) == - "'{\"{\\\"coordinates\\\":[[[2.2,41.41],[2.13,41.41],[2.13,41.35],[2.2,41.35],[2.2,41.41]]],\\\"type\\\":\\\"Polygon\\\"}\"}'" + ]) == "'{\"POLYGON((2.2 41.41,2.13 41.41,2.13 41.35,2.2 41.35,2.2 41.41))\"}'" assert to_expression([%Postgrex.MACADDR{address: {8, 1, 43, 5, 7, 9}}]) == "'{08:01:2B:05:07:09}'" @@ -202,11 +200,124 @@ defmodule Ecto.DevLogger.PrintableParameterTest do }) == "'[2022-11-04,2022-11-10)'" # Multirange - mr = %Postgrex.Multirange{ranges: [ - %Postgrex.Range{lower: 1, upper: 3, lower_inclusive: true, upper_inclusive: false}, - %Postgrex.Range{lower: 10, upper: 15, lower_inclusive: false, upper_inclusive: true} - ]} + mr = %Postgrex.Multirange{ + ranges: [ + %Postgrex.Range{lower: 1, upper: 3, lower_inclusive: true, upper_inclusive: false}, + %Postgrex.Range{lower: 10, upper: 15, lower_inclusive: false, upper_inclusive: true} + ] + } assert to_expression(mr) == "'{[1,3),(10,15]}'" end + + test "to_expression/1 for all Geo geometry types" do + assert to_expression(%Geo.Point{coordinates: {1.0, 2.0}, srid: 4326, properties: %{}}) == + "'SRID=4326;POINT(1.0 2.0)'" + + assert to_expression(%Geo.PointZ{coordinates: {1.0, 2.0, 3.0}, srid: nil, properties: %{}}) == + "'POINT Z(1.0 2.0 3.0)'" + + assert to_expression(%Geo.PointM{coordinates: {1.0, 2.0, 4.0}, srid: 3857, properties: %{}}) == + "'SRID=3857;POINT M(1.0 2.0 4.0)'" + + assert to_expression(%Geo.PointZM{ + coordinates: {1.0, 2.0, 3.0, 4.0}, + srid: nil, + properties: %{} + }) == + "'POINT ZM(1.0 2.0 3.0 4.0)'" + + assert to_expression(%Geo.LineString{ + coordinates: [{0.0, 0.0}, {1.0, 1.0}], + srid: nil, + properties: %{} + }) == + "'LINESTRING(0.0 0.0,1.0 1.0)'" + + assert to_expression(%Geo.LineStringZ{ + coordinates: [{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}], + srid: nil, + properties: %{} + }) == + "'LINESTRINGZ(0.0 0.0 0.0,1.0 1.0 1.0)'" + + assert to_expression(%Geo.LineStringZM{ + coordinates: [{0.0, 0.0, 0.0, 5.0}, {1.0, 1.0, 1.0, 6.0}], + srid: nil, + properties: %{} + }) == + "'LINESTRINGZM(0.0 0.0 0.0 5.0,1.0 1.0 1.0 6.0)'" + + assert to_expression(%Geo.Polygon{ + coordinates: [[{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}]], + srid: nil, + properties: %{} + }) == + "'POLYGON((0.0 0.0,0.0 1.0,1.0 1.0,0.0 0.0))'" + + assert to_expression(%Geo.PolygonZ{ + coordinates: [[{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 0.0, 0.0}]], + srid: nil, + properties: %{} + }) == + "'POLYGON((0.0 0.0 0.0,0.0 1.0 0.0,1.0 1.0 0.0,0.0 0.0 0.0))'" + + assert to_expression(%Geo.MultiPoint{ + coordinates: [{0.0, 0.0}, {1.0, 1.0}], + srid: nil, + properties: %{} + }) == + "'MULTIPOINT(0.0 0.0,1.0 1.0)'" + + assert to_expression(%Geo.MultiPointZ{ + coordinates: [{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}], + srid: nil, + properties: %{} + }) == + "'MULTIPOINTZ(0.0 0.0 0.0,1.0 1.0 1.0)'" + + assert to_expression(%Geo.MultiLineString{ + coordinates: [[{0.0, 0.0}, {1.0, 1.0}]], + srid: nil, + properties: %{} + }) == + "'MULTILINESTRING((0.0 0.0,1.0 1.0))'" + + assert to_expression(%Geo.MultiLineStringZ{ + coordinates: [[{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}]], + srid: nil, + properties: %{} + }) == + "'MULTILINESTRINGZ((0.0 0.0 0.0,1.0 1.0 1.0))'" + + assert to_expression(%Geo.MultiPolygon{ + coordinates: [[[{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}]]], + srid: nil, + properties: %{} + }) == + "'MULTIPOLYGON(((0.0 0.0,0.0 1.0,1.0 1.0,0.0 0.0)))'" + + assert to_expression(%Geo.MultiPolygonZ{ + coordinates: [ + [[{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 0.0, 0.0}]] + ], + srid: nil, + properties: %{} + }) == + "'MULTIPOLYGONZ(((0.0 0.0 0.0,0.0 1.0 0.0,1.0 1.0 0.0,0.0 0.0 0.0)))'" + + assert to_expression(%Geo.GeometryCollection{ + geometries: [ + %Geo.Point{coordinates: {1.0, 2.0}, srid: nil, properties: %{}}, + %Geo.LineString{ + coordinates: [{0.0, 0.0}, {1.0, 1.0}], + srid: nil, + properties: %{} + } + ], + srid: nil, + properties: %{} + }) == + "'GEOMETRYCOLLECTION(POINT(1.0 2.0),LINESTRING(0.0 0.0,1.0 1.0))'" + end end diff --git a/test/ecto/dev_logger_test.exs b/test/ecto/dev_logger_test.exs index 30f72a1..4feddbb 100644 --- a/test/ecto/dev_logger_test.exs +++ b/test/ecto/dev_logger_test.exs @@ -2,6 +2,12 @@ defmodule Ecto.DevLoggerTest do use ExUnit.Case import ExUnit.CaptureLog + Postgrex.Types.define( + Ecto.DevLoggerTest.PostgresTypes, + [Geo.PostGIS.Extension | Ecto.Adapters.Postgres.extensions()], + json: Jason + ) + defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :my_test_app @@ -18,7 +24,8 @@ defmodule Ecto.DevLoggerTest do port: 5432, log: false, stacktrace: true, - pool_size: 10 + pool_size: 10, + types: Ecto.DevLoggerTest.PostgresTypes ] end end @@ -343,6 +350,103 @@ defmodule Ecto.DevLoggerTest do end end + defmodule GeoPost do + use Ecto.Schema + @primary_key {:id, :binary_id, read_after_writes: true} + schema "geo_posts" do + field(:point, Geo.PostGIS.Geometry) + field(:polygon, Geo.PostGIS.Geometry) + field(:line_string, Geo.PostGIS.Geometry) + field(:multi_point, Geo.PostGIS.Geometry) + field(:multi_line_string, Geo.PostGIS.Geometry) + field(:multi_polygon, Geo.PostGIS.Geometry) + field(:geometry_collection, Geo.PostGIS.Geometry) + end + end + + test "logs with geo_postgis geometry fields and hits DB" do + Repo.query!("CREATE EXTENSION IF NOT EXISTS postgis", [], telemetry_options: [log: false]) + + Repo.query!( + """ + CREATE TABLE IF NOT EXISTS geo_posts ( + id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), + point geometry(Point, 4326), + polygon geometry(Polygon), + line_string geometry(LineString), + multi_point geometry(MultiPoint), + multi_line_string geometry(MultiLineString), + multi_polygon geometry(MultiPolygon), + geometry_collection geometry(GeometryCollection) + ) + """, + [], + telemetry_options: [log: false] + ) + + point = %Geo.Point{coordinates: {44.21587, -87.5947}, srid: 4326, properties: %{}} + + polygon = %Geo.Polygon{ + coordinates: [[{2.20, 41.41}, {2.13, 41.41}, {2.13, 41.35}, {2.20, 41.35}, {2.20, 41.41}]], + srid: nil, + properties: %{} + } + + line = %Geo.LineString{coordinates: [{0.0, 0.0}, {1.0, 1.0}], srid: nil, properties: %{}} + mpoint = %Geo.MultiPoint{coordinates: [{0.0, 0.0}, {1.0, 1.0}], srid: nil, properties: %{}} + + mline = %Geo.MultiLineString{ + coordinates: [[{0.0, 0.0}, {1.0, 1.0}]], + srid: nil, + properties: %{} + } + + mpoly = %Geo.MultiPolygon{ + coordinates: [[[{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}]]], + srid: nil, + properties: %{} + } + + gcoll = %Geo.GeometryCollection{geometries: [point, line], srid: nil, properties: %{}} + + log = + capture_log(fn -> + Repo.insert!(%GeoPost{ + point: point, + polygon: polygon, + line_string: line, + multi_point: mpoint, + multi_line_string: mline, + multi_polygon: mpoly, + geometry_collection: gcoll + }) + end) + + plain = strip_ansi(log) + # Extract the VALUES(...) section of the geo_posts INSERT in one regex run + [[values_section]] = + Regex.scan( + ~r/INSERT INTO \"geo_posts\" \([^)]*\) VALUES \(([\s\S]*?)\)\s+RETURNING \"id\"/, + plain, + capture: :all_but_first + ) + + # Extract all single-quoted values from VALUES(...) + values = Regex.scan(~r/'[^']*'/, values_section) |> Enum.map(&hd/1) + + expected_values = [ + "'SRID=4326;POINT(44.21587 -87.5947)'", + "'POLYGON((2.2 41.41,2.13 41.41,2.13 41.35,2.2 41.35,2.2 41.41))'", + "'LINESTRING(0.0 0.0,1.0 1.0)'", + "'MULTIPOINT(0.0 0.0,1.0 1.0)'", + "'MULTILINESTRING((0.0 0.0,1.0 1.0))'", + "'MULTIPOLYGON(((0.0 0.0,0.0 1.0,1.0 1.0,0.0 0.0)))'", + "'GEOMETRYCOLLECTION(POINT(44.21587 -87.5947),LINESTRING(0.0 0.0,1.0 1.0))'" + ] + + assert Enum.sort(values) == Enum.sort(expected_values) + end + test "duration" do Enum.each([0.02, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15], fn duration -> Ecto.Adapters.SQL.query!(Repo, "SELECT pg_sleep(#{duration})", []) @@ -534,7 +638,7 @@ defmodule Ecto.DevLoggerTest do end end - defp setup_repo(repo_module, log_sql_statements \\ false) do + defp setup_repo(repo_module) do config = repo_module.get_config() Application.put_env(:my_test_app, repo_module, config) @@ -542,16 +646,13 @@ defmodule Ecto.DevLoggerTest do repo_module.__adapter__().storage_up(config) repo_pid = start_supervised!(repo_module) - repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", [], - log: log_sql_statements - ) + repo_module.query!("CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";", []) repo_module.query!( """ CREATE TYPE money_type AS (currency char(3), value integer); """, - [], - log: log_sql_statements + [] ) repo_module.query!( @@ -583,8 +684,7 @@ defmodule Ecto.DevLoggerTest do date_range daterange ) """, - [], - log: log_sql_statements + [] ) ## Swallow the reload warning after changing DB structure. From d3e1ad5f9434dd3a0f0d297265abe50ced9d6594 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:15:30 +0300 Subject: [PATCH 55/61] Improve grammar --- README.md | 18 +++++++++--------- lib/ecto/dev_logger.ex | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ed1d8fc..e310cbe 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ An alternative logger for Ecto queries. It inlines bindings into the query, so it is easy to copy-paste logged SQL and run it in any IDE for debugging without -manual transformation of common elixir terms to string representation (binary UUID, DateTime, Decimal, json, etc). -Also, it highlights db time to make slow queries noticeable. Source table and inlined bindings are highlighted as well. +manual transformation of common Elixir terms to string representations (binary UUID, DateTime, Decimal, JSON, etc.). +It also highlights DB time to make slow queries noticeable. The source table and inlined bindings are highlighted as well. ![before and after](./assets/screenshot.png) @@ -23,17 +23,17 @@ def deps do end ``` -Then disable default logger for your repo in config file for dev mode: +Then disable the default logger for your repo in the config file for development: ```elixir if config_env() == :dev do config :my_app, MyApp.Repo, log: false end ``` -And install telemetry handler in `MyApp.Application`: +Then install the telemetry handler in `MyApp.Application`: ```elixir Ecto.DevLogger.install(MyApp.Repo) ``` -Telemetry handler will be installed *only* if `log` configuration value is set to `false`. +The telemetry handler will be installed only if the repo `:log` configuration is set to `false`. That's it. @@ -74,7 +74,7 @@ defmodule MyApp.Application do end ``` -### Ignore logging for a single Repo call +### Ignore logging for a single `Repo` call If you want to suppress logging for a specific query or Repo operation, pass `log: false` via `telemetry_options`: @@ -89,8 +89,8 @@ This prevents `Ecto.DevLogger` from emitting a log for that telemetry event whil ### Format queries -It is possible to format queries using a `:before_inline_callback` option. -Here is an example of setup using [pgFormatter](https://github.com/darold/pgFormatter) as an external utility: +It is possible to format queries using the `:before_inline_callback` option. +Here is an example setup using [pgFormatter](https://github.com/darold/pgFormatter) as an external utility: ```elixir defmodule MyApp.Application do def start(_type, _args) do @@ -108,7 +108,7 @@ end ### Running tests -You need to run a local postgres server for the tests to interact with. This is one way to do it: +You need to run a local PostgreSQL server for the tests to interact with. This is one way to do it: ```console $ docker run -p5432:5432 --rm --name ecto_dev_logger_postgres -e POSTGRES_PASSWORD=postgres -d postgres diff --git a/lib/ecto/dev_logger.ex b/lib/ecto/dev_logger.ex index e82f986..9326161 100644 --- a/lib/ecto/dev_logger.ex +++ b/lib/ecto/dev_logger.ex @@ -3,8 +3,8 @@ defmodule Ecto.DevLogger do An alternative logger for Ecto queries. It inlines bindings into the query, so it is easy to copy-paste logged SQL and run it in any IDE for debugging without - manual transformation of common elixir terms to string representation (binary UUID, DateTime, Decimal, json, etc). - Also, it highlights db time to make slow queries noticeable. Source table and inlined bindings are highlighted as well. + manual transformation of common Elixir terms to string representations (binary UUID, DateTime, Decimal, JSON, etc.). + It also highlights DB time to make slow queries noticeable. The source table and inlined bindings are highlighted as well. """ require Logger @@ -12,20 +12,20 @@ defmodule Ecto.DevLogger do @type option :: {:log_repo_name, boolean()} | {:ignore_event, (metadata :: map() -> boolean())} @doc """ - Attaches `telemetry_handler/4` to application. + Attaches `telemetry_handler/4` to the application. Returns the result from the call to `:telemetry.attach/4` or `:ok` if the repo has default logging enabled. ## Options - * `:log_repo_name` - when truthy will add the repo name into the log. - * `:ignore_event` - a callback which allows to skip some telemetry events thus skip printing logs. + * `:log_repo_name` - when truthy, adds the repo name to the log output. + * `:ignore_event` - a callback that allows skipping specific telemetry events, thus suppressing logs. By default, the library ignores events from `Oban` and events related to migration queries. - These checks are not overridable by `:ignore_event` callback and have priority over it. - * `:before_inline_callback` - a callback which allows to modify the query before inlining of bindings. - You can use this option to format the query using external utility, like `pgformatter`, etc. + These checks are not overridable by the `:ignore_event` callback and have priority over it. + * `:before_inline_callback` - a callback that allows modifying the query before inlining bindings. + You can use this option to format the query using an external utility, like `pgformatter`, etc. - To ignore logging for a single Repo operation, pass `log: false` via `telemetry_options` to that call, for example: + To ignore logging for a single Repo operation, pass `log: false` via `telemetry_options` to that call; for example: Repo.query!("SELECT 1", [], telemetry_options: [log: false]) Repo.insert!(changeset, telemetry_options: [log: false]) From 534ebfb1034212ef77c0b18b14ad3aaff37bf415 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:18:47 +0300 Subject: [PATCH 56/61] Add downloads badge to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e310cbe..d0755e9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Ecto.DevLogger [![Hex.pm](https://img.shields.io/hexpm/v/ecto_dev_logger.svg)](https://hex.pm/packages/ecto_dev_logger) +[![Hex.pm Downloads](https://img.shields.io/hexpm/dt/ecto_dev_logger)](https://hex.pm/packages/ecto_dev_logger) An alternative logger for Ecto queries. From e5b0d78db152de71ad2aa27cdd07ca1ddfc257e9 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:18:58 +0300 Subject: [PATCH 57/61] Make NumericEnum module private --- lib/ecto/dev_logger/numeric_enum.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ecto/dev_logger/numeric_enum.ex b/lib/ecto/dev_logger/numeric_enum.ex index 6b4ac96..4c7c5d4 100644 --- a/lib/ecto/dev_logger/numeric_enum.ex +++ b/lib/ecto/dev_logger/numeric_enum.ex @@ -1,3 +1,4 @@ defmodule Ecto.DevLogger.NumericEnum do + @moduledoc false defstruct [:integer, :atom] end From f7854aa86ac4be20d2c0643f62da0cce53e5445d Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:38:01 +0300 Subject: [PATCH 58/61] Update deps --- mix.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mix.lock b/mix.lock index 2c0f6d3..0897ce9 100644 --- a/mix.lock +++ b/mix.lock @@ -1,17 +1,17 @@ %{ - "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, - "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, - "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [: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", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, - "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, - "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, - "geo": {:hex, :geo, "4.0.1", "f4ae3fd912b0536bfe9ec3bce15eb554197ab0739c01297c8534c20dcedd561c", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "32eb624feff75d043bbdd43f67e3869c5fc729e221333271b07cdc98ba98563d"}, + "db_connection": {:hex, :db_connection, "2.8.1", "9abdc1e68c34c6163f6fb96a96532272d13ad7ca45262156ae8b7ec6d9dc4bec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61a3d489b239d76f326e03b98794fb8e45168396c925ef25feb405ed09da8fd"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, + "ecto": {:hex, :ecto, "3.13.2", "7d0c0863f3fc8d71d17fc3ad3b9424beae13f02712ad84191a826c7169484f01", [: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", "669d9291370513ff56e7b7e7081b7af3283d02e046cf3d403053c557894a0b3e"}, + "ecto_sql": {:hex, :ecto_sql, "3.13.2", "a07d2461d84107b3d037097c822ffdd36ed69d1cf7c0f70e12a3d1decf04e2e1", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "539274ab0ecf1a0078a6a72ef3465629e4d6018a3028095dc90f60a19c371717"}, + "ex_doc": {:hex, :ex_doc, "0.38.4", "ab48dff7a8af84226bf23baddcdda329f467255d924380a0cf0cee97bb9a9ede", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "f7b62346408a83911c2580154e35613eb314e0278aeea72ed7fedef9c1f165b2"}, + "geo": {:hex, :geo, "4.1.0", "64ba89a64cc400b5b16dd2f5bd644cb141776eb8c2ac5a983332c8d944936c12", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "19edb2b3398ca9f701b573b1fb11bc90951ebd64f18b06bd1bf35abe509a2934"}, "geo_postgis": {:hex, :geo_postgis, "3.7.1", "614f25b42334a615bd54bb09c22030b1aac7bac8f829bd823ab1faccf093a324", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:geo, "~> 3.6 or ~> 4.0", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0 or ~> 5.0 or ~> 6.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "c20d823c600d35b7fe9ddd5be03052bb7136c57d6f1775dbd46871545e405280"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, - "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, - "makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "postgrex": {:hex, :postgrex, "0.19.1", "73b498508b69aded53907fe48a1fee811be34cc720e69ef4ccd568c8715495ea", [: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", "8bac7885a18f381e091ec6caf41bda7bb8c77912bb0e9285212829afe5d8a8f8"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, + "postgrex": {:hex, :postgrex, "0.21.1", "2c5cc830ec11e7a0067dd4d623c049b3ef807e9507a424985b8dcf921224cd88", [: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", "27d8d21c103c3cc68851b533ff99eef353e6a0ff98dc444ea751de43eb48bdac"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, } From a78791b9989acb1a7b1986d2ca1df7a9772e3ed3 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sat, 13 Sep 2025 23:38:37 +0300 Subject: [PATCH 59/61] Update docs for Ecto.DevLogger.PrintableParameter protocol --- lib/ecto/dev_logger/printable_parameter.ex | 54 ++++++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 139a50a..0b67769 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -1,27 +1,51 @@ defprotocol Ecto.DevLogger.PrintableParameter do @moduledoc """ - A protocol to print various data structures as valid SQL expressions. + A protocol for rendering values as valid, copy‑pastable SQL expressions. - `to_expression/1` is the main function and `to_string_literal/1` is an optional helper for it. + `Ecto.DevLogger` calls this protocol for every bound parameter when it inlines values + into the logged SQL. - `Ecto.DevLogger` tries to represent complex terms, like arrays (lists) and composite types (tuples) - as string literal first. Not all terms are easy/efficient/whatever to represent as strings, so if - `to_string_literal/1` returns a string for all elements inside the array, - then array will be represented as string as well. Otherwise, array will be represented using `ARRAY` constructor: + When should I implement this? + - When a value you pass as a query parameter is a struct or type that does not + have a built‑in implementation. + - This is common with PostgreSQL custom/extension types that live outside `postgrex` + (e.g. third‑party extensions), or with domain‑specific structs used via custom `Ecto.Type`s + (for example: `Money`, `LTree`, or proprietary composite types). - iex> Ecto.DevLogger.PrintableParameter.to_expression(["Elixir", "Ecto"]) - "'{Elixir,Ecto}'" + Without an implementation, the logger falls back to `inspect/1`, which may not be + valid SQL and therefore not directly runnable. - iex> Ecto.DevLogger.PrintableParameter.to_expression(["Elixir", "Ecto", <<153>>]) - "ARRAY['Elixir','Ecto',DECODE('mQ==','BASE64')]" + How to implement + - If your value can be represented as a single string literal that your database accepts, + implement `to_string_literal/1` and have `to_expression/1` wrap it in single quotes. + - If it must be rendered as a structured SQL expression (e.g. `ROW(...)`, casts, or + constructor functions), implement `to_expression/1` directly and return `nil` from + `to_string_literal/1`. - The same is true for composite types (tuples): + Example: PostgreSQL composite type represented by a struct - iex> Ecto.DevLogger.PrintableParameter.to_expression({"Elixir", "Ecto"}) - "'(Elixir,Ecto)'" + defmodule MyApp.Money do + defstruct [:currency, :amount] + end - iex> Ecto.DevLogger.PrintableParameter.to_expression({"Elixir", "Ecto", <<153>>}) - "ROW('Elixir','Ecto',DECODE('mQ==','BASE64'))" + defimpl Ecto.DevLogger.PrintableParameter, for: MyApp.Money do + def to_expression(%MyApp.Money{} = money) do + string = to_string_literal(money) + "'\#{String.replace(string, "'", "''")}'" + end + + def to_string_literal(%MyApp.Money{currency: cur, amount: amt}) do + "(\#{cur},\#{amt})" + end + end + + Arrays and tuples + - When all elements implement `to_string_literal/1`, lists and tuples are formatted as + PostgreSQL array and composite string literals (`'{...}'` and `'(...)'`). Otherwise, + they are rendered using `ARRAY[...]` and `ROW(...)`, with each element formatted via + `to_expression/1`. + + `to_expression/1` is the main function and `to_string_literal/1` is an optional helper for it. """ @doc """ From 93f6df31d2138e8dde78564318d9722a31e74c14 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 14 Sep 2025 13:28:16 +0300 Subject: [PATCH 60/61] Update docs --- README.md | 72 ++++++++++++++++++++++ lib/ecto/dev_logger/printable_parameter.ex | 6 +- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d0755e9..9015939 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,78 @@ Repo.get!(User, user_id, telemetry_options: [log: false]) This prevents `Ecto.DevLogger` from emitting a log for that telemetry event while still executing the operation normally. +### How it works and limitations + +Ecto.DevLogger inlines query parameters by converting Elixir values into SQL expressions. It does this by calling the `Ecto.DevLogger.PrintableParameter` protocol for each bound value, producing a copy‑pastable literal or expression. + +Because it only sees Elixir values (not the database column types), it must guess the target database type. The mapping from Elixir types to database types is not one‑to‑one, so the output may not always match your schema exactly: + +- **Maps**: assumed to be JSON. If you store maps in other column types (for example, `hstore` when using `postgrex`), the rendered SQL will still be JSON. +- **Lists**: assumed to be array‑like columns; you might instead be storing lists as JSON. +- **Scalars**: integers, floats, booleans, and strings are logged as plain values. + +If you use custom database or driver‑level types, implement `Ecto.DevLogger.PrintableParameter` for the structs that appear in parameters to control how values are rendered and keep the logged SQL runnable. +Note that `Ecto.DevLogger` operates below `Ecto.Type` casting; multiple different `Ecto.Type`s can map to the same driver type. The logger sees the post‑cast value (for example, a `Postgrex.*` struct), not your `Ecto.Type`. + +Keep in mind that the logged SQL is meant for debugging; it aims to be helpful, but you may still need to add manual casts to match your schema precisely. + +### Rendering examples + +Below are examples of how common Elixir values are rendered in logged SQL: + +| Elixir value | Rendered SQL | Notes | +| --- | --- | --- | +| `nil` | `NULL` | | +| `true` / `false` | `true` / `false` | | +| `"hello"` | `'hello'` | Strings are single-quoted | +| `<<1, 2, 3>>` | `DECODE('AQID','BASE64')` | Non‑UTF‑8 binaries use a base64 decode function | +| `123` | `123` | Integers are unquoted | +| `12.34` | `12.34` | Floats are unquoted | +| `Decimal.new("12.34")` | `12.34` | Decimals are unquoted | +| `~D[2023-01-02]` | `'2023-01-02'` | Dates are quoted strings | +| `~U[2023-01-02 03:04:05Z]` | `'2023-01-02 03:04:05Z'` | DateTimes are quoted strings | +| `~N[2023-01-02 03:04:05]` | `'2023-01-02 03:04:05'` | NaiveDateTimes are quoted strings | +| `~T[03:04:05]` | `'03:04:05'` | Times are quoted strings | +| `%{"a" => 1}` | `'{"a":1}'` | Maps are rendered as JSON strings | +| `["Elixir", "Ecto"]` | `'{Elixir,Ecto}'` | Array string literal when all elements are string‑renderable | +| `["Elixir", <<153>>]` | `ARRAY['Elixir', DECODE('mQ==','BASE64')]` | Falls back to `ARRAY[...]` if mixed | +| `{"Elixir", "Ecto"}` | `'(Elixir,Ecto)'` | Composite string literal when all elements are string‑renderable | +| `{"Elixir", <<153>>}` | `ROW('Elixir', DECODE('mQ==','BASE64'))` | Falls back to `ROW(...)` if mixed | +| `%Postgrex.INET{address: {127,0,0,1}, netmask: 24}` | `'127.0.0.1/24'` | IP/netmask rendered as text | +| `%Postgrex.MACADDR{address: {8,1,43,5,7,9}}` | `'08:01:2B:05:07:09'` | MAC address rendered as text | +| `%Postgrex.Interval{months: 1, days: 2, secs: 34}` | `'1 mon 2 days 34:00:00'` | Interval rendered via `Postgrex.Interval.to_string/1` | +| `%Postgrex.Range{lower: 1, upper: 10, lower_inclusive: true, upper_inclusive: false}` | `'[1,10)'` | Range bounds and brackets | +| `%Postgrex.Range{lower: :empty}` | `'empty'` | Empty range | +| `%Postgrex.Multirange{ranges: [...]}` | `'{[1,3),(10,15]}'` | Multirange of ranges | +| `[%Postgrex.Lexeme{}, ...]` | `'word1:pos weight ...'` | Lists of lexemes are rendered as tsvector strings | + +Notes: +- “String‑renderable” means `PrintableParameter.to_string_literal/1` returns a string for the element. Otherwise, `to_expression/1` is used. +- Unknown structs (without a `PrintableParameter` implementation) fall back to `inspect/1` and may not form valid SQL. + +### Geo rendering examples (optional) + +Below are examples when the `geo` library is available: + +| Geo value | Rendered SQL | +| --- | --- | +| `%Geo.Point{coordinates: {1.0, 2.0}, srid: 4326}` | `'SRID=4326;POINT(1.0 2.0)'` | +| `%Geo.PointZ{coordinates: {1.0, 2.0, 3.0}}` | `'POINT Z(1.0 2.0 3.0)'` | +| `%Geo.PointM{coordinates: {1.0, 2.0, 4.0}}` | `'POINT M(1.0 2.0 4.0)'` | +| `%Geo.PointZM{coordinates: {1.0, 2.0, 3.0, 4.0}}` | `'POINT ZM(1.0 2.0 3.0 4.0)'` | +| `%Geo.LineString{coordinates: [{0.0, 0.0}, {1.0, 1.0}]}` | `'LINESTRING(0.0 0.0,1.0 1.0)'` | +| `%Geo.LineStringZ{coordinates: [{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}]}` | `'LINESTRINGZ(0.0 0.0 0.0,1.0 1.0 1.0)'` | +| `%Geo.LineStringZM{coordinates: [{0.0, 0.0, 0.0, 5.0}, {1.0, 1.0, 1.0, 6.0}]}` | `'LINESTRINGZM(0.0 0.0 0.0 5.0,1.0 1.0 1.0 6.0)'` | +| `%Geo.Polygon{coordinates: [[{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}]]}` | `'POLYGON((0.0 0.0,0.0 1.0,1.0 1.0,0.0 0.0))'` | +| `%Geo.PolygonZ{coordinates: [[{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 0.0, 0.0}]]}` | `'POLYGON((0.0 0.0 0.0,0.0 1.0 0.0,1.0 1.0 0.0,0.0 0.0 0.0))'` | +| `%Geo.MultiPoint{coordinates: [{0.0, 0.0}, {1.0, 1.0}]}` | `'MULTIPOINT(0.0 0.0,1.0 1.0)'` | +| `%Geo.MultiPointZ{coordinates: [{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}]}` | `'MULTIPOINTZ(0.0 0.0 0.0,1.0 1.0 1.0)'` | +| `%Geo.MultiLineString{coordinates: [[{0.0, 0.0}, {1.0, 1.0}]]}` | `'MULTILINESTRING((0.0 0.0,1.0 1.0))'` | +| `%Geo.MultiLineStringZ{coordinates: [[{0.0, 0.0, 0.0}, {1.0, 1.0, 1.0}]]}` | `'MULTILINESTRINGZ((0.0 0.0 0.0,1.0 1.0 1.0))'` | +| `%Geo.MultiPolygon{coordinates: [[[{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}]]}]` | `'MULTIPOLYGON(((0.0 0.0,0.0 1.0,1.0 1.0,0.0 0.0)))'` | +| `%Geo.MultiPolygonZ{coordinates: [[[{0.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 0.0, 0.0}]]}]` | `'MULTIPOLYGONZ(((0.0 0.0 0.0,0.0 1.0 0.0,1.0 1.0 0.0,0.0 0.0 0.0)))'` | +| `%Geo.GeometryCollection{geometries: [%Geo.Point{coordinates: {1.0, 2.0}}, %Geo.LineString{coordinates: [{0.0, 0.0}, {1.0, 1.0}]}]}` | `'GEOMETRYCOLLECTION(POINT(1.0 2.0),LINESTRING(0.0 0.0,1.0 1.0))'` | + ### Format queries It is possible to format queries using the `:before_inline_callback` option. diff --git a/lib/ecto/dev_logger/printable_parameter.ex b/lib/ecto/dev_logger/printable_parameter.ex index 0b67769..b43e854 100644 --- a/lib/ecto/dev_logger/printable_parameter.ex +++ b/lib/ecto/dev_logger/printable_parameter.ex @@ -8,9 +8,9 @@ defprotocol Ecto.DevLogger.PrintableParameter do When should I implement this? - When a value you pass as a query parameter is a struct or type that does not have a built‑in implementation. - - This is common with PostgreSQL custom/extension types that live outside `postgrex` - (e.g. third‑party extensions), or with domain‑specific structs used via custom `Ecto.Type`s - (for example: `Money`, `LTree`, or proprietary composite types). + - This is common with driver‑level custom/extension types (for example, structs from database + driver libraries) or domain‑specific structs that ultimately become such driver types. + `Ecto.DevLogger` operates below `Ecto.Type` casting and only sees the post‑cast values. Without an implementation, the logger falls back to `inspect/1`, which may not be valid SQL and therefore not directly runnable. From 8314016edfbce9c5ce540b73faa0b75766a0f1d8 Mon Sep 17 00:00:00 2001 From: Artur Plysyuk Date: Sun, 14 Sep 2025 13:43:27 +0300 Subject: [PATCH 61/61] Bump version to `0.15.0` --- README.md | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9015939..cebd655 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The package can be installed by adding `ecto_dev_logger` to your list of depende ```elixir def deps do [ - {:ecto_dev_logger, "~> 0.14"} + {:ecto_dev_logger, "~> 0.15"} ] end ``` diff --git a/mix.exs b/mix.exs index 00fe7b6..26b492f 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule Ecto.DevLogger.MixProject do use Mix.Project - @version "0.14.1" + @version "0.15.0" @source_url "https://github.com/fuelen/ecto_dev_logger" def project do