Skip to content

Commit 228429a

Browse files
authored
Adopt Erlfmt (#152)
This is an attempt to define some consistent formatting rules for our Erlang code. I made some research and I tested various options, so far the one that I prefer is [erlfmt](https://github.com/WhatsApp/erlfmt) from WhatsApp. Like most non-builtin formatters, this is opinionated. But the choices they made are well thought, and seem to be a good starting point. You have both the option to reformat the code inline: ``` rebar3 fmt ``` or check the formatting: ``` rebar3 fmt --check ``` This last command is especially useful for CI integration.
1 parent 511b560 commit 228429a

36 files changed

+2570
-1750
lines changed

include/erldns.hrl

+23-21
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
-include_lib("dns_erlang/include/dns_records.hrl").
22

3-
-record(keyset,
4-
{key_signing_key :: crypto:rsa_private(),
5-
key_signing_key_tag :: non_neg_integer(),
6-
key_signing_alg :: non_neg_integer(),
7-
zone_signing_key :: crypto:rsa_private(),
8-
zone_signing_key_tag :: non_neg_integer(),
9-
zone_signing_alg :: non_neg_integer(),
10-
inception :: erlang:timestamp() | calendar:datetime1970(),
11-
valid_until :: erlang:timestamp() | calendar:datetime1970()}).
12-
-record(zone,
13-
{name :: dns:dname(),
14-
version :: binary(),
15-
authority = [] :: [dns:rr()],
16-
record_count = 0 :: non_neg_integer(),
17-
records = [] :: [dns:rr()] | trimmed,
18-
%% records_by_name is deprecated
19-
records_by_name :: #{binary() => [dns:rr()]} | trimmed,
20-
%% records_by_type is no longer in use, but cannot (easily) be deleted due to Mnesia schema evolution
21-
%% We cannot set it to undefined, because, again, when fetched from Mnesia, it may be set
22-
records_by_type :: term(),
23-
keysets :: [erldns:keyset()]}).
3+
-record(keyset, {
4+
key_signing_key :: crypto:rsa_private(),
5+
key_signing_key_tag :: non_neg_integer(),
6+
key_signing_alg :: non_neg_integer(),
7+
zone_signing_key :: crypto:rsa_private(),
8+
zone_signing_key_tag :: non_neg_integer(),
9+
zone_signing_alg :: non_neg_integer(),
10+
inception :: erlang:timestamp() | calendar:datetime1970(),
11+
valid_until :: erlang:timestamp() | calendar:datetime1970()
12+
}).
13+
-record(zone, {
14+
name :: dns:dname(),
15+
version :: binary(),
16+
authority = [] :: [dns:rr()],
17+
record_count = 0 :: non_neg_integer(),
18+
records = [] :: [dns:rr()] | trimmed,
19+
%% records_by_name is deprecated
20+
records_by_name :: #{binary() => [dns:rr()]} | trimmed,
21+
%% records_by_type is no longer in use, but cannot (easily) be deleted due to Mnesia schema evolution
22+
%% We cannot set it to undefined, because, again, when fetched from Mnesia, it may be set
23+
records_by_type :: term(),
24+
keysets :: [erldns:keyset()]
25+
}).
2426
-record(authorities, {owner_name, ttl, class, name_server, email_addr, serial_num, refresh, retry, expiry, nxdomain}).
2527
-record(zone_records, {zone_name, fqdn, records}).
2628
-record(zone_records_typed, {zone_name, fqdn, type, records}).

rebar.config

+61-46
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,84 @@
11
%%-*- mode: erlang -*-
22
{cover_enabled, true}.
3+
{erl_opts, [
4+
debug_info,
5+
fail_on_warning,
6+
{platform_define, "^[0-9]+", namespaced_types},
7+
{parse_transform, lager_transform}
8+
]}.
39

4-
{erl_opts, [debug_info, fail_on_warning,
5-
{platform_define, "^[0-9]+", namespaced_types},
6-
{parse_transform, lager_transform}]}.
10+
{project_plugins, [
11+
erlfmt
12+
]}.
713

8-
{deps, [{lager, "3.9.2"},
9-
recon,
10-
folsom,
11-
{jsx, "3.0.0"},
12-
{dns_erlang, ".*", {git, "https://github.com/dnsimple/dns_erlang.git", {branch, "main"}}},
13-
iso8601,
14-
{nodefinder, "2.0.0"},
15-
{opentelemetry_api, "0.6.0"},
16-
{meck, "0.9.2"}
14+
{deps, [
15+
{lager, "3.9.2"},
16+
recon,
17+
folsom,
18+
{jsx, "3.0.0"},
19+
{dns_erlang, ".*", {git, "https://github.com/dnsimple/dns_erlang.git", {branch, "main"}}},
20+
iso8601,
21+
{nodefinder, "2.0.0"},
22+
{opentelemetry_api, "0.6.0"},
23+
{meck, "0.9.2"}
1724
]}.
1825

1926
{profiles, [{test, [{deps, [proper]}]}]}.
2027

2128
{project_plugins, [rebar3_format]}.
2229

2330
{format, [
24-
{formatter, default_formatter},
25-
{files, [
26-
"src/**/*.?rl", "include/**/*.?rl"
27-
]},
28-
{options, #{
29-
paper => 160,
30-
ribbon => 150,
31-
inline_attributes => none,
32-
inline_qualified_function_composition => true}
33-
}]
34-
}.
31+
{formatter, default_formatter},
32+
{files, [
33+
"src/**/*.?rl", "include/**/*.?rl"
34+
]},
35+
{options, #{
36+
paper => 160,
37+
ribbon => 150,
38+
inline_attributes => none,
39+
inline_qualified_function_composition => true
40+
}}
41+
]}.
3542

36-
{shell, [{apps, [erldns]},
37-
{config, "erldns.config"}]}.
43+
{shell, [
44+
{apps, [erldns]},
45+
{config, "erldns.config"}
46+
]}.
3847

39-
{relx, [{release, {erldns, "3.0.0"},
40-
[erldns]},
48+
{relx, [
49+
{release, {erldns, "3.0.0"}, [erldns]},
4150

42-
{dev_mode, true},
43-
{include_erts, false},
44-
{sys_config, "erldns.config"},
45-
{overlay, [{copy, "priv/zones-example.json", "priv/zones-example.json"},
46-
{copy, "priv/zones-test.json", "priv/zones-test.json"}]},
51+
{dev_mode, true},
52+
{include_erts, false},
53+
{sys_config, "erldns.config"},
54+
{overlay, [
55+
{copy, "priv/zones-example.json", "priv/zones-example.json"},
56+
{copy, "priv/zones-test.json", "priv/zones-test.json"}
57+
]},
4758

48-
{extended_start_script, true}]}.
59+
{extended_start_script, true}
60+
]}.
4961

5062
%% This is a rebar3-ism
5163
{overrides, [
52-
{override, dns_erlang,
53-
[
54-
{plugins,[
55-
{provider_asn1, "0.2.3"}
64+
{override, dns_erlang, [
65+
{plugins, [
66+
{provider_asn1, "0.2.3"}
67+
]},
68+
{provider_hooks, [
69+
{pre, [
70+
{compile, {asn, compile}}
5671
]},
57-
{provider_hooks, [
58-
{pre, [
59-
{compile, {asn, compile}}
60-
]},
61-
{post, [
62-
{clean, {asn, clean}}
63-
]}
72+
{post, [
73+
{clean, {asn, clean}}
6474
]}
65-
]
66-
}
75+
]}
76+
]}
6777
]}.
6878

6979
{dialyzer, [{warnings, [no_unknown]}]}.
80+
81+
{erlfmt, [
82+
write,
83+
{print_width, 140}
84+
]}.

src/erldns.app.src

+25-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
% -*- mode: Erlang; -*-
2-
{application, erldns,
3-
[{description, "Erlang Authoritative DNS Server"},
4-
{vsn, "3.0.0"},
5-
{licenses, ["MIT"]},
6-
{mod, { erldns_app, []}},
7-
{applications, [kernel,
8-
stdlib,
9-
inets,
10-
crypto,
11-
lager,
12-
dns_erlang,
13-
jsx,
14-
ssl,
15-
mnesia,
16-
bear,
17-
folsom,
18-
iso8601,
19-
opentelemetry_api,
20-
nodefinder]},
21-
{start_phases, [{post_start, []}]},
2+
{application, erldns, [
3+
{description, "Erlang Authoritative DNS Server"},
4+
{vsn, "3.0.0"},
5+
{licenses, ["MIT"]},
6+
{mod, {erldns_app, []}},
7+
{applications, [
8+
kernel,
9+
stdlib,
10+
inets,
11+
crypto,
12+
lager,
13+
dns_erlang,
14+
jsx,
15+
ssl,
16+
mnesia,
17+
bear,
18+
folsom,
19+
iso8601,
20+
opentelemetry_api,
21+
nodefinder
22+
]},
23+
{start_phases, [{post_start, []}]},
2224

23-
{licenses, ["Apache-2.0"]},
24-
{links, [{"GitHub", "https://github.com/dnsimple/erldns"}]}
25-
]}.
25+
{licenses, ["Apache-2.0"]},
26+
{links, [{"GitHub", "https://github.com/dnsimple/erldns"}]}
27+
]}.

src/erldns.erl

+4-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
-export([start/0]).
2121
-export([normalize_name/1]).
2222

23-
-export_type([keyset/0,
24-
zone/0]).
23+
-export_type([
24+
keyset/0,
25+
zone/0
26+
]).
2527

2628
-type keyset() :: #keyset{}.
2729
-type zone() :: #zone{}.

src/erldns_app.erl

+5-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
-behavior(application).
1919

2020
% Application hooks
21-
-export([start/2,
22-
start_phase/3,
23-
stop/1]).
21+
-export([
22+
start/2,
23+
start_phase/3,
24+
stop/1
25+
]).
2426

2527
start(_Type, _Args) ->
2628
lager:info("Starting erldns application"),

src/erldns_axfr.erl

+12-8
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,22 @@
1717

1818
-include_lib("dns_erlang/include/dns.hrl").
1919

20-
-export([is_enabled/2,
21-
optionally_append_soa/1]).
20+
-export([
21+
is_enabled/2,
22+
optionally_append_soa/1
23+
]).
2224

2325
%% Determine if AXFR is enabled for the given request host.
2426
is_enabled(Host, Metadata) ->
2527
MatchingMetadata =
26-
lists:filter(fun(MetadataRow) ->
27-
[_Id, _DomainId, Kind, Content] = MetadataRow,
28-
{ok, AllowedAddress} = inet_parse:address(binary_to_list(Content)),
29-
AllowedAddress =:= Host andalso Kind =:= <<"axfr">>
30-
end,
31-
Metadata),
28+
lists:filter(
29+
fun(MetadataRow) ->
30+
[_Id, _DomainId, Kind, Content] = MetadataRow,
31+
{ok, AllowedAddress} = inet_parse:address(binary_to_list(Content)),
32+
AllowedAddress =:= Host andalso Kind =:= <<"axfr">>
33+
end,
34+
Metadata
35+
),
3236
length(MatchingMetadata) > 0.
3337

3438
%% If the message is an AXFR request then append the SOA record.

0 commit comments

Comments
 (0)