Skip to content

Commit 90311f2

Browse files
committed
feat: make it configurable
(yes i know, this is transitional, as we progressively adapt ourselves to the new formatter)
1 parent 012bcd0 commit 90311f2

File tree

3 files changed

+75
-8
lines changed

3 files changed

+75
-8
lines changed

lib/styler.ex

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,28 @@ defmodule Styler do
2929
@doc false
3030
def style({ast, comments}, file, opts) do
3131
on_error = opts[:on_error] || :log
32+
enabled_styles = opts[:config] || @styles
3233
zipper = Zipper.zip(ast)
3334
context = %{comments: comments, file: file}
3435

3536
{{ast, _}, %{comments: comments}} =
36-
Enum.reduce(@styles, {zipper, context}, fn style, {zipper, context} ->
37+
enabled_styles
38+
|> Enum.filter(fn
39+
{_style, opts} ->
40+
if Keyword.has_key?(opts, :ignore_prefixes) do
41+
!Enum.any?(opts[:ignore_prefixes], &String.starts_with?(file, Path.join(File.cwd!(), &1)))
42+
else
43+
true
44+
end
45+
46+
_style ->
47+
true
48+
end)
49+
|> Enum.map(fn
50+
{style, _opts} -> style
51+
style -> style
52+
end)
53+
|> Enum.reduce({zipper, context}, fn style, {zipper, context} ->
3754
try do
3855
Zipper.traverse_while(zipper, context, &style.run/2)
3956
rescue
@@ -56,9 +73,26 @@ defmodule Styler do
5673
@impl Mix.Tasks.Format
5774
def features(_opts), do: [sigils: [], extensions: [".ex", ".exs"]]
5875

76+
@doc """
77+
Options is a list of styles, that can have options, à la credo:
78+
79+
Example `.formatter.exs`:
80+
81+
[
82+
plugins: [Styler],
83+
styler: [
84+
{Styler.Style.ModuleDirectives, ignore_prefixes: ["lib/"]},
85+
{Styler.Style.Pipes, ignore_prefixes: ["test/"]},
86+
]
87+
]
88+
89+
For now, the only config is `ignore_prefixes`, which is a list of file
90+
prefixes to ignore when styling.
91+
"""
5992
@impl Mix.Tasks.Format
6093
def format(input, formatter_opts, opts \\ []) do
6194
file = formatter_opts[:file]
95+
opts = Keyword.put(opts, :config, formatter_opts[:styler])
6296

6397
{ast, comments} =
6498
input

test/style/pipes_test.exs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,4 +672,34 @@ defmodule Styler.Style.PipesTest do
672672
end
673673
end
674674
end
675+
676+
describe "configurable" do
677+
test "filename prefix is ignored" do
678+
assert_style("f(g(h(x))) |> j()", "f(g(h(x))) |> j()", "lib/test.exs",
679+
config: [
680+
{Styler.Style.Pipes, ignore_prefixes: ["lib/"]}
681+
]
682+
)
683+
end
684+
685+
test "filename not in prefix is styled" do
686+
assert_style("f(g(h(x))) |> j()", "x |> h() |> g() |> f() |> j()", "test/test.exs",
687+
config: [
688+
{Styler.Style.Pipes, ignore_prefixes: ["lib/"]}
689+
]
690+
)
691+
end
692+
693+
test "filename prefix is ignored with multiple prefixes" do
694+
assert_style("f(g(h(x))) |> j()", "f(g(h(x))) |> j()", "lib/test.exs",
695+
config: [
696+
{Styler.Style.Pipes, ignore_prefixes: ["lib/", "test/"]}
697+
]
698+
)
699+
end
700+
701+
test "if style is not present, no changes are made" do
702+
assert_style("f(g(h(x))) |> j()", "f(g(h(x))) |> j()", "lib/test.exs", config: [])
703+
end
704+
end
675705
end

test/support/style_case.ex

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@ defmodule Styler.StyleCase do
1616

1717
using do
1818
quote do
19-
import unquote(__MODULE__), only: [assert_style: 1, assert_style: 2, style: 1]
19+
import unquote(__MODULE__), only: [assert_style: 1, assert_style: 2, assert_style: 3, assert_style: 4, style: 3]
2020
end
2121
end
2222

23-
defmacro assert_style(before, expected \\ nil) do
23+
defmacro assert_style(before, expected \\ nil, filename \\ "testfile", opts \\ []) do
2424
expected = expected || before
2525

26-
quote bind_quoted: [before: before, expected: expected] do
26+
quote bind_quoted: [before: before, expected: expected, filename: filename, opts: opts] do
2727
alias Styler.Zipper
2828

2929
expected = String.trim(expected)
30-
{styled_ast, styled, styled_comments} = style(before)
30+
{styled_ast, styled, styled_comments} = style(before, filename, opts)
3131

3232
if styled != expected and ExUnit.configuration()[:trace] do
3333
IO.puts("\n======Given=============\n")
@@ -89,7 +89,7 @@ defmodule Styler.StyleCase do
8989
end)
9090

9191
assert expected == styled
92-
{_, restyled, _} = style(styled)
92+
{_, restyled, _} = style(styled, filename, opts)
9393

9494
assert restyled == styled, """
9595
expected styling to be idempotent, but a second pass resulted in more changes.
@@ -107,9 +107,12 @@ defmodule Styler.StyleCase do
107107
end
108108
end
109109

110-
def style(code) do
110+
def style(code, filename, opts) do
111111
{ast, comments} = Styler.string_to_quoted_with_comments(code)
112-
{styled_ast, comments} = Styler.style({ast, comments}, "testfile", on_error: :raise)
112+
113+
opts = Keyword.put(opts, :on_error, :raise)
114+
115+
{styled_ast, comments} = Styler.style({ast, comments}, Path.join(File.cwd!(), filename), opts)
113116

114117
try do
115118
styled_code = styled_ast |> Styler.quoted_to_string(comments) |> String.trim_trailing("\n")

0 commit comments

Comments
 (0)