summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <klishinm@vmware.com>2023-04-24 20:17:40 +0400
committerGitHub <noreply@github.com>2023-04-24 20:17:40 +0400
commit5f62600fce6199c4e2da06c9bfdfb689eca8b2a6 (patch)
treef09562f1d88cafa2f816dc2497b67c715b07c2bd
parent686fb9a4e90b03cae1610e532f9d4547029e2197 (diff)
parent8625301e8d8b81cefa577e0ae58ebe5cca390044 (diff)
downloadrabbitmq-server-git-5f62600fce6199c4e2da06c9bfdfb689eca8b2a6.tar.gz
Merge pull request #7963 from rabbitmq/mk-cli-table-formatter-otp-26-compat
CLI: make input ordering preditable when formatting a table
-rw-r--r--deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/formatter_helpers.ex12
-rw-r--r--deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/table.ex8
-rw-r--r--deps/rabbitmq_cli/test/core/table_formatter_test.exs23
3 files changed, 17 insertions, 26 deletions
diff --git a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/formatter_helpers.ex b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/formatter_helpers.ex
index c4dfa10194..edd703f551 100644
--- a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/formatter_helpers.ex
+++ b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/formatter_helpers.ex
@@ -48,10 +48,12 @@ defmodule RabbitMQ.CLI.Formatters.FormatterHelpers do
def format_info_item(item, escaped \\ true)
def format_info_item(map, escaped) when is_map(map) do
+ kv = to_predictably_ordered_keyword_list(map)
+
[
"\#\{",
Enum.map(
- map,
+ kv,
fn {k, v} ->
["#{escape(k, escaped)} => ", format_info_item(v, escaped)]
end
@@ -125,6 +127,14 @@ defmodule RabbitMQ.CLI.Formatters.FormatterHelpers do
:io_lib.format("~1000000000000tp", [value])
end
+ @spec to_predictably_ordered_keyword_list(Enumerable.t()) :: Keyword.t()
+ def to_predictably_ordered_keyword_list(input0) do
+ case input0 do
+ m when is_map(m) -> Enum.sort(Keyword.new(m))
+ other -> other
+ end
+ end
+
defp prettify_amqp_table(table, escaped) do
for {k, t, v} <- table do
{escape(k, escaped), prettify_typed_amqp_value(t, v, escaped)}
diff --git a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/table.ex b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/table.ex
index 44cd8d9612..2672d65a4a 100644
--- a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/table.ex
+++ b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/table.ex
@@ -18,7 +18,7 @@ defmodule RabbitMQ.CLI.Formatters.Table do
fn
[first | _] = element ->
case FormatterHelpers.proplist?(first) or is_map(first) do
- true -> element
+ true -> FormatterHelpers.to_predictably_ordered_keyword_list(element)
false -> [element]
end
@@ -38,7 +38,10 @@ defmodule RabbitMQ.CLI.Formatters.Table do
)
end
- def format_output(output, options) do
+ def format_output(output0, options) do
+ # on Erlang 26, map entry ordering has changed, this avoids
+ # implicitly depending on map key order
+ output = FormatterHelpers.to_predictably_ordered_keyword_list(output0)
maybe_header(output, options)
end
@@ -61,6 +64,7 @@ defmodule RabbitMQ.CLI.Formatters.Table do
defp format_output_1(output, options) when is_map(output) do
escaped = escaped?(options)
pad_to_header = pad_to_header?(options)
+
format_line(output, escaped, pad_to_header)
end
diff --git a/deps/rabbitmq_cli/test/core/table_formatter_test.exs b/deps/rabbitmq_cli/test/core/table_formatter_test.exs
index 165e0ba1cf..3358e46032 100644
--- a/deps/rabbitmq_cli/test/core/table_formatter_test.exs
+++ b/deps/rabbitmq_cli/test/core/table_formatter_test.exs
@@ -9,20 +9,6 @@ defmodule TableFormatterTest do
@formatter RabbitMQ.CLI.Formatters.Table
- test "format_output tab-separates map values" do
- assert @formatter.format_output(%{a: :apple, b: :beer}, %{}) == ["a\tb", "apple\tbeer"]
-
- assert @formatter.format_output(%{a: :apple, b: :beer, c: 1}, %{}) == [
- "a\tb\tc",
- "apple\tbeer\t1"
- ]
-
- assert @formatter.format_output(%{a: "apple", b: 'beer', c: 1}, %{}) == [
- "a\tb\tc",
- "apple\t\"beer\"\t1"
- ]
- end
-
test "format_output tab-separates keyword values" do
assert @formatter.format_output([a: :apple, b: :beer], %{}) == ["a\tb", "apple\tbeer"]
@@ -37,15 +23,6 @@ defmodule TableFormatterTest do
]
end
- test "format_stream tab-separates map values" do
- assert @formatter.format_stream(
- [%{a: :apple, b: :beer, c: 1}, %{a: "aadvark", b: 'bee', c: 2}],
- %{}
- )
- |> Enum.to_list() ==
- ["a\tb\tc", "apple\tbeer\t1", "aadvark\t\"bee\"\t2"]
- end
-
test "format_stream tab-separates keyword values" do
assert @formatter.format_stream(
[[a: :apple, b: :beer, c: 1], [a: "aadvark", b: 'bee', c: 2]],