Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
6eb6dd0
Set newer expectations
paulo-ferraz-oliveira Jul 5, 2025
da75963
Expect to move keys (and default handling) to elvis_config
paulo-ferraz-oliveira Jul 5, 2025
9d596a4
Approach our expectations on continuing validation
paulo-ferraz-oliveira Jul 5, 2025
38f0ae4
Implement mechanism to prevent re-validation
paulo-ferraz-oliveira Jul 5, 2025
60d2d0b
Go back to elvis_core as is: leave validation to elvis_config
paulo-ferraz-oliveira Jul 5, 2025
6bf4ceb
Make it easier to debug and formulate newer implementation
paulo-ferraz-oliveira Jul 5, 2025
2f5b2b7
Doc. it for consumers
paulo-ferraz-oliveira Jul 10, 2025
1658690
Prepare for further validation
paulo-ferraz-oliveira Jul 10, 2025
16e475b
Trim to useful API
paulo-ferraz-oliveira Jul 10, 2025
d11c2f8
Doc. it a little better
paulo-ferraz-oliveira Jul 10, 2025
65e98c5
Export used type
paulo-ferraz-oliveira Jul 10, 2025
4183e74
Respect current constraints
paulo-ferraz-oliveira Jul 10, 2025
94bf88b
Adapt to current API
paulo-ferraz-oliveira Jul 10, 2025
bf33731
Expect test results to remain the same (adapt to current implementation)
paulo-ferraz-oliveira Jul 13, 2025
3392690
Allow elvis_rule to validate an input 2/3-tuple
paulo-ferraz-oliveira Jul 13, 2025
49018f6
Allow elvis_rule to validate an input ignorable
paulo-ferraz-oliveira Jul 13, 2025
85517d6
Have notion of definition belong to appropriate namespace
paulo-ferraz-oliveira Jul 13, 2025
642f85d
Allow for further config. validation
paulo-ferraz-oliveira Jul 13, 2025
27005e6
Validate the configuration
paulo-ferraz-oliveira Jul 14, 2025
60bef3f
Act on test results and prepare for final touches
paulo-ferraz-oliveira Jul 15, 2025
b3dfaa3
Act on Xref results
paulo-ferraz-oliveira Jul 15, 2025
a686d63
Fix for erl_files_test trim'ing
paulo-ferraz-oliveira Jul 16, 2025
9803ffc
Don't be afraid to write text as it's supposed to be read
paulo-ferraz-oliveira Jul 16, 2025
42fc5ce
Just because something sounds similar...
paulo-ferraz-oliveira Jul 16, 2025
651c604
Care more about how it's read that correct form
paulo-ferraz-oliveira Jul 16, 2025
d7da54f
Be more correct
paulo-ferraz-oliveira Jul 16, 2025
48be7f6
Use ?MODULE less
paulo-ferraz-oliveira Jul 16, 2025
ee5b093
Drop unused test code
paulo-ferraz-oliveira Jul 16, 2025
0734f2d
Allow xref'ing further
paulo-ferraz-oliveira Jul 16, 2025
540b064
Make it compilation error -free
paulo-ferraz-oliveira Jul 16, 2025
836f494
Ease it again!
paulo-ferraz-oliveira Jul 16, 2025
5d4664f
Go with no-throw-but-error, by default
paulo-ferraz-oliveira Jul 16, 2025
b08309d
Have `elvis_core on elvis_core` work
paulo-ferraz-oliveira Jul 16, 2025
76328fb
Re-read README and act on expected output
paulo-ferraz-oliveira Jul 16, 2025
2b0ba4b
Don't change if we don't have to
paulo-ferraz-oliveira Jul 16, 2025
39d3cbe
Rename it for clarity
paulo-ferraz-oliveira Jul 16, 2025
85d72d7
Use it if available, and drop custom ignore_xref
paulo-ferraz-oliveira Jul 16, 2025
7cb4cc7
Spec it for consumption
paulo-ferraz-oliveira Jul 16, 2025
961d118
Add convenience elvis_config API
paulo-ferraz-oliveira Jul 16, 2025
9e3c7ef
Fix default configuration
paulo-ferraz-oliveira Jul 16, 2025
1767ba4
Add a note on default configuration to the README
paulo-ferraz-oliveira Jul 16, 2025
797de2b
Make for easier-to-follow output
paulo-ferraz-oliveira Jul 17, 2025
d839029
Adapt new entrypoint
paulo-ferraz-oliveira Jul 17, 2025
adf86c2
Adapt to Elvis (temporarily?)
paulo-ferraz-oliveira Jul 17, 2025
7afc514
Fix API per consumption
paulo-ferraz-oliveira Jul 17, 2025
a7d49d7
Act on dogfooding
paulo-ferraz-oliveira Jul 17, 2025
ae1bd21
Typo
paulo-ferraz-oliveira Jul 17, 2025
3bb94be
Make it easier to follow
paulo-ferraz-oliveira Jul 17, 2025
39a4da2
Add a bit more higher-level validation to proceed further
paulo-ferraz-oliveira Jul 17, 2025
3ce87b3
Match on what we expect to
paulo-ferraz-oliveira Jul 17, 2025
00c9d8e
Make it prettier
paulo-ferraz-oliveira Jul 21, 2025
890e739
Tweak for a "better" default (?)
paulo-ferraz-oliveira Jul 21, 2025
50f1839
Previous errors weren't actually `error`, but `notice`
paulo-ferraz-oliveira Jul 21, 2025
d5c5ba1
Respect expected verbosity
paulo-ferraz-oliveira Jul 21, 2025
7fd2482
Fix broken rule result
paulo-ferraz-oliveira Jul 21, 2025
d1b2e68
Adapt to actual usage
paulo-ferraz-oliveira Jul 21, 2025
23a91f3
rebar3 fmt it!
paulo-ferraz-oliveira Jul 21, 2025
8d4b07d
Remove extraneous ~n
paulo-ferraz-oliveira Jul 21, 2025
37da2b7
Initialise the elvis_config_SUITE
paulo-ferraz-oliveira Jul 22, 2025
e68cd26
Don't ignore stuff we don't generate any more
paulo-ferraz-oliveira Jul 22, 2025
c41293d
Further minor tweaks on output
paulo-ferraz-oliveira Jul 24, 2025
9710c29
Fix for test results
paulo-ferraz-oliveira Jul 24, 2025
63d1355
Fix for test results
paulo-ferraz-oliveira Jul 24, 2025
5588551
Act on review comment
paulo-ferraz-oliveira Jul 29, 2025
6e862cc
Fix it
paulo-ferraz-oliveira Jul 30, 2025
2bf6711
Minor tweak for test results
paulo-ferraz-oliveira Jul 30, 2025
1fa8791
Throw earlier when elvis.config exists but is invalid Erlang
paulo-ferraz-oliveira Jul 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ _build/
doc/
/rebar3.crashdump
.rebar3/
logs
test/**/*.beam
test/logs/
_checkouts/
Expand Down
65 changes: 48 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,37 +37,42 @@ Once this is done you can apply the style rules in the following ways.
#### Loading configuration from a file

```shell
1> ElvisConfig = elvis_config:from_file("elvis.config").
1> ElvisConfig = elvis_config:config().
<loaded_config>
2> elvis_core:rock(ElvisConfig).
2> application:set_env(elvis_core, verbose, true), elvis_core:rock(ElvisConfig).
Loading src/elvis_code.erl
# src/elvis_code.erl [OK]
Loading src/elvis_config.erl
# src/elvis_config.erl [OK]
Loading src/elvis_core.erl
# src/elvis_core.erl [OK]
# src/elvis_result.erl [OK]
# src/elvis_style.erl [OK]
# src/elvis_utils.erl [OK]
Loading src/elvis_file.erl
# src/elvis_file.erl [OK]
...
ok
3>
```

This will load the [configuration](#configuration), specified in file `elvis.config`, from the
current directory. If no configuration is found `{invalid_config, _}` is thrown.
current directory.

If `elvis.config` is not present, the application will fall back to searching for configuration
parameters in `rebar.config`. If `rebar.config` is also unavailable, the application proceeds to
perform a tertiary lookup within its application environment (which can also be set via the
`app/sys.config` file, or e.g., via `application:set_env(elvis_core, Key, Value).` for the required
settings.

#### Providing configuration as a value

Another option for using `elvis_core` from the shell is to explicitly provide the configuration as
an argument to `elvis_core:rock/1`:

```shell
1> ElvisConfig = [#{dirs => ["src"], filter => "*.erl", rules => []}].
1> ElvisConfig = [#{dirs => ["src"], filter => "elvis_rule.erl", ruleset => erl_files}].
[#{dirs => ["src"],filter => "*.erl",rules => []}]
2> elvis_core:rock(ElvisConfig).
Loading src/elvis_core.erl
# src/elvis_core.erl [OK]
Loading src/elvis_result.erl
# src/elvis_result.erl [OK]
Loading src/elvis_style.erl
# src/elvis_style.erl [OK]
Loading src/elvis_utils.erl
# src/elvis_utils.erl [OK]
2> application:set_env(elvis_core, verbose, true), elvis_core:rock(ElvisConfig).
Loading src/elvis_rule.erl
# src/elvis_rule.erl [OK]
ok
3>
```
Expand Down Expand Up @@ -118,6 +123,32 @@ An `elvis.config` file looks something like this:
]}].
```

To look at what is considered the "current default" configuration, do:

```console
rebar3 shell
...
1> elvis_config:default().
[#{filter => "*.erl",
dirs => ["apps/**/src/**","src/**"],
ruleset => erl_files},
#{filter => "*.erl",
dirs =>
["apps/**/src/**","src/**","apps/**/include/**",
"include/**"],
ruleset => hrl_files},
#{filter => "rebar.config",
dirs => ["."],
ruleset => rebar_config},
#{filter => ".gitignore",
dirs => ["."],
ruleset => gitignore}]
2>
```

**Note**: this element might change with time. The above was what was generated when this
documentation was updated.

### Files, rules and rulesets

The `dirs` key is a list that tells `elvis_core` where it should look for the files that match
Expand Down Expand Up @@ -238,7 +269,7 @@ found in this repository's [RULES.md](https://github.com/inaka/elvis_core/blob/m
The implementation of a new rule is a function that takes 2 arguments in the following order:

1. `t:elvis_rule:t()`: the opaque rule to implement
1. `t:elvis_config:config()`: the value of option `config` as found in the
1. `t:elvis_config:t()`: the value of each element in list `config` as found in the
[configuration](#configuration),

This means you can define rules of your own (user-defined rules) as long as the functions that
Expand Down
4 changes: 0 additions & 4 deletions RULES.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,6 @@ for `.hrl` files.
, filter => "*.hrl"
, ruleset => hrl_files
}
, #{ dirs => ["."]
, filter => "Makefile"
, ruleset => makefiles
, rules => [] }
, #{ dirs => ["."]
, filter => "rebar.config"
, ruleset => rebar_config
Expand Down
2 changes: 1 addition & 1 deletion config/elvis-test-custom-ruleset.config
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{rulesets, #{project => [{elvis_text_style, no_tabs}]}},
{config, [
#{
dirs => ["."],
dirs => ["../../../../_build/test/lib/elvis_core/test/dirs/src"],
filter => "*.erl",
ruleset => project
}
Expand Down
2 changes: 1 addition & 1 deletion config/elvis-test-hrl-files.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{elvis, [
{config, [
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples/"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples/"],
filter => "test_*.hrl",
ruleset => hrl_files
}
Expand Down
2 changes: 1 addition & 1 deletion config/elvis-test-pa.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{elvis, [
{config, [
#{
dirs => ["../../test/examples"],
dirs => ["../../../../test/examples"],
filter => "user_defined_rules.erl",
rules => [{user_defined_rules, rule}]
}
Expand Down
4 changes: 2 additions & 2 deletions config/elvis-test.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{elvis, [
{config, [
#{
dirs => ["../../src"],
dirs => ["../../../../src"],
filter => "*.erl",
rules =>
[
Expand All @@ -27,7 +27,7 @@
ruleset => erl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/ebin"],
dirs => ["../../../../_build/test/lib/elvis_core/ebin"],
filter => "*.beam",
rules =>
[
Expand Down
8 changes: 4 additions & 4 deletions config/elvis-umbrella.config
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
#{
dirs =>
[
"../../_build/test/lib/elvis_core/test/dirs/src/**",
"../../_build/test/lib/elvis_core/test/dirs/test/**",
"../../_build/test/lib/elvis_core/test/dirs/apps/**/src",
"../../_build/test/lib/elvis_core/test/dirs/apps/**/test"
"../../../../_build/test/lib/elvis_core/test/dirs/src",
"../../../../_build/test/lib/elvis_core/test/dirs/test",
"../../../../_build/test/lib/elvis_core/test/dirs/apps/**/src",
"../../../../_build/test/lib/elvis_core/test/dirs/apps/**/test"
],
filter => "*.erl",
ruleset => erl_files
Expand Down
10 changes: 5 additions & 5 deletions config/elvis.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@
{elvis, [
{config, [
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.erl",
ruleset => erl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.hrl",
ruleset => hrl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/non_compilable_examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/non_compilable_examples"],
filter => "*.erl",
ruleset => erl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.beam",
ruleset => beam_files
},
#{
dirs => ["."],
dirs => ["../../../.."],
filter => "rebar.config",
ruleset => rebar_config
}
Expand Down
2 changes: 1 addition & 1 deletion config/rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{elvis, [
{config, [
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.erl",
rules => [{elvis_text_style, line_length, #{limit => 135}}]
}
Expand Down
14 changes: 7 additions & 7 deletions config/test.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{elvis_core, [
{config, [
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.erl",
rules =>
[
Expand All @@ -15,13 +15,13 @@
ruleset => erl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.hrl",
rules => [],
ruleset => hrl_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.beam",
rules =>
[
Expand All @@ -33,15 +33,15 @@
ruleset => beam_files
},
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
filter => "rebar.config",
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "rebar3.config.success",
ruleset => rebar_config
},
#{
dirs =>
[
"../../_build/test/lib/elvis_core/test/dirs/apps/app1",
"../../_build/test/lib/elvis_core/test/dirs/apps/app2"
"../../../../_build/test/lib/elvis_core/test/dirs/apps/app1",
"../../../../_build/test/lib/elvis_core/test/dirs/apps/app2"
],
filter => ".gitignore",
ruleset => gitignore
Expand Down
2 changes: 1 addition & 1 deletion config/test.pass.config
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{elvis, [
{config, [
#{
dirs => ["../../_build/test/lib/elvis_core/test/examples"],
dirs => ["../../../../_build/test/lib/elvis_core/test/examples"],
filter => "*.erl",
rules => [{elvis_text_style, line_length, #{limit => 800}}]
}
Expand Down
21 changes: 16 additions & 5 deletions elvis.config
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,24 @@
rules =>
[
{elvis_style, no_invalid_dynamic_calls, #{
ignore => [{elvis_core, rock_this, 2}]
ignore => [
{elvis_core, rock_this, 2},
{elvis_config, check_rule_for_options, 2}
]
}},
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}},
{elvis_style, no_debug_call, #{
ignore => [{elvis_result, print_item, 4}, {elvis_utils, print, 2}]
ignore => [
{elvis_result, print_item, 4},
{elvis_utils, do_output, 2},
{elvis_core, main, 1}
]
}},
{elvis_style, no_god_modules, #{ignore => [elvis_style]}},
{elvis_style, no_throw, disable},
{elvis_style, max_function_length, disable},
{elvis_style, max_function_clause_length, disable},
{elvis_style, max_module_length, #{ignore => [elvis_style]}},
{elvis_style, max_module_length, #{ignore => [elvis_style, elvis_config]}},
{elvis_style, no_common_caveats_call, #{
ignore => [
{elvis_file, module, 1},
Expand All @@ -34,9 +41,13 @@
filter => "*.beam",
rules =>
[
{elvis_style, no_invalid_dynamic_calls, #{ignore => [elvis_core]}},
{elvis_style, no_invalid_dynamic_calls, #{
ignore => [elvis_core, elvis_config]
}},
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}},
{elvis_style, no_debug_call, #{ignore => [elvis_result, elvis_utils]}},
{elvis_style, no_debug_call, #{
ignore => [elvis_result, elvis_utils, elvis_core]
}},
{elvis_style, no_god_modules, #{ignore => [elvis_style]}},
{elvis_style, no_throw, disable},
{elvis_style, no_common_caveats_call, disable}
Expand Down
6 changes: 4 additions & 2 deletions rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
{deps, [{meck, "0.9.2"}]},
{erl_opts, [nowarn_missing_spec, nowarn_export_all]},
{dialyzer, [{warnings, [no_return, error_handling]}, {plt_extra_apps, [common_test]}]},
{ct_opts, [{sys_config, ["./config/test.config"]}, {logdir, "./logs"}, {verbose, true}]},
{ct_opts, [{sys_config, ["./config/test.config"]}, {verbose, true}]},
{cover_enabled, true},
{cover_opts, [verbose]}
]}
Expand Down Expand Up @@ -63,6 +63,8 @@

{dialyzer, [{warnings, [no_return, unmatched_returns, error_handling, unknown]}]}.

{xref_checks, [undefined_function_calls, deprecated_function_calls, deprecated_functions]}.
{xref_checks, [
undefined_function_calls, deprecated_function_calls, deprecated_functions, exports_not_used
]}.

{xref_extra_paths, ["test/**"]}.
5 changes: 4 additions & 1 deletion src/elvis_code.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
print_node/2
]).

% These are local debug functions.
-ignore_xref([print_node/1, print_node/2]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Public API
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Expand Down Expand Up @@ -186,6 +189,6 @@ print_node(#{type := Type} = Node, CurrentLevel) ->
Indentation = lists:duplicate(CurrentLevel * 4, $\s),
Content = ktn_code:content(Node),

ok = elvis_utils:info("~s - [~p] ~p~n", [Indentation, CurrentLevel, Type]),
ok = elvis_utils:info("~s - [~p] ~p", [Indentation, CurrentLevel, Type]),
_ = lists:map(fun(Child) -> print_node(Child, CurrentLevel + 1) end, Content),
ok.
Loading