Skip to content

Commit

Permalink
Check credo config for large_number rewrite
Browse files Browse the repository at this point in the history
  • Loading branch information
emkguts committed Feb 3, 2025
1 parent 6af9acd commit c44e9a7
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 20 deletions.
10 changes: 10 additions & 0 deletions lib/quokka/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ defmodule Quokka.Config do

alias Credo.Check.Readability.AliasOrder
alias Credo.Check.Readability.BlockPipe
alias Credo.Check.Readability.LargeNumbers
alias Credo.Check.Readability.MaxLineLength
alias Credo.Check.Readability.ParenthesesOnZeroArityDefs
alias Credo.Check.Readability.SinglePipe
Expand Down Expand Up @@ -73,6 +74,7 @@ defmodule Quokka.Config do
:persistent_term.put(@key, %{
block_pipe_flag: credo_opts[:block_pipe_flag] || false,
block_pipe_exclude: credo_opts[:block_pipe_exclude] || [],
large_numbers_gt: credo_opts[:large_numbers_gt] || :infinity,
lifting_excludes: excludes,
line_length: credo_opts[:line_length] || 98,
pipe_chain_start_flag: credo_opts[:pipe_chain_start_flag] || false,
Expand Down Expand Up @@ -116,6 +118,10 @@ defmodule Quokka.Config do
get(:block_pipe_exclude)
end

def large_numbers_gt() do
get(:large_numbers_gt)
end

def line_length() do
get(:line_length)
end
Expand Down Expand Up @@ -157,6 +163,10 @@ defmodule Quokka.Config do
|> Map.put(:block_pipe_flag, true)
|> Map.put(:block_pipe_exclude, opts[:exclude])

{LargeNumbers, opts}, acc when is_list(opts) ->
acc
|> Map.put(:large_numbers_gt, opts[:only_greater_than] || 9999)

{MaxLineLength, opts}, acc when is_list(opts) ->
Map.put(acc, :line_length, opts[:max_length])

Expand Down
42 changes: 23 additions & 19 deletions lib/style/single_node.ex
Original file line number Diff line number Diff line change
Expand Up @@ -81,31 +81,35 @@ defmodule Quokka.Style.SingleNode do
# but doesn't rewrite typos like `100_000_0`, so it's worthwhile to have Quokka do this
#
# `?-` isn't part of the number node - it's its parent - so all numbers are positive at this point
defp style({:__block__, meta, [number]}) when is_number(number) and number >= 10_000 do
# Checking here rather than in the anonymous function due to compiler bug https://github.com/elixir-lang/elixir/issues/10485
integer? = is_integer(number)
defp style({:__block__, meta, [number]}) when is_number(number) do
if number > Quokka.Config.large_numbers_gt() do
# Checking here rather than in the anonymous function due to compiler bug https://github.com/elixir-lang/elixir/issues/10485
integer? = is_integer(number)

meta =
Keyword.update!(meta, :token, fn
"0x" <> _ = token ->
token
meta =
Keyword.update!(meta, :token, fn
"0x" <> _ = token ->
token

"0b" <> _ = token ->
token
"0b" <> _ = token ->
token

"0o" <> _ = token ->
token
"0o" <> _ = token ->
token

token when integer? ->
delimit(token)
token when integer? ->
delimit(token)

# is float
token ->
[int_token, decimals] = String.split(token, ".")
"#{delimit(int_token)}.#{decimals}"
end)
# is float
token ->
[int_token, decimals] = String.split(token, ".")
"#{delimit(int_token)}.#{decimals}"
end)

{:__block__, meta, [number]}
{:__block__, meta, [number]}
else
{:__block__, meta, [number]}
end
end

## INEFFICIENT FUNCTION REWRITES
Expand Down
21 changes: 20 additions & 1 deletion test/style/single_node_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,11 @@ defmodule Quokka.Style.SingleNodeTest do

describe "RHS pattern matching" do
test "left arrows" do
assert_style("with {:ok, result = %{}} <- foo, do: result", "with {:ok, %{} = result} <- foo, do: result")
assert_style(
"with {:ok, result = %{}} <- foo, do: result",
"with {:ok, %{} = result} <- foo, do: result"
)

assert_style("for map = %{} <- maps, do: map[:key]", "for %{} = map <- maps, do: map[:key]")
end

Expand Down Expand Up @@ -351,6 +355,21 @@ defmodule Quokka.Style.SingleNodeTest do
assert_style("0b1111_1111_1111_1111")
assert_style("0o777_7777")
end

test "respects credo config :only_greater_than" do
Quokka.Config.set_for_test!(:large_numbers_gt, 20_000)
assert_style("20000", "20000")
assert_style("20001", "20_001")
Quokka.Config.set_for_test!(:large_numbers_gt, 9999)
assert_style("20000", "20_000")
end

test "respects credo config LargeNumbers false" do
Quokka.Config.set_for_test!(:large_numbers_gt, :infinity)
assert_style("10000", "10000")
Quokka.Config.set_for_test!(:large_numbers_gt, 9999)
assert_style("10000", "10_000")
end
end

describe "Enum.into and $collectable.new" do
Expand Down

0 comments on commit c44e9a7

Please sign in to comment.