Current section

Files

Jump to
partisan rebar.config
Raw

rebar.config

{minimum_otp_vsn, "27"}.
%% Generate partisan-flavoured copies of OTP's `gen_server', `gen_statem',
%% `supervisor', etc. from the INSTALLED OTP source BEFORE partisan's own
%% compile starts. The escript calls `partisan_gen_transform:generate_all/1',
%% which compiles the rewritten forms straight to `partisan_gen_*' BEAMs in
%% partisan's `ebin' (NOT `.erl' sources in `src' — pretty-printing to source
%% would mis-render auto-imported BIFs; see the escript header). This makes the
%% `partisan_gen_*' beams exist by the time any downstream dependency (plum_db,
%% bondy, …) starts compiling against them.
%%
%% A pre-compile hook is required because, when two direct deps of a
%% top-level project both depend on partisan, rebar3 may start the
%% second dep's compile before partisan's post-compile hook fires. See
%% `priv/generate_otp_sources.escript' for details.
{pre_hooks, [
{compile, "escript priv/generate_otp_sources.escript"}
]}.
{deps, [
%% Core dependencies
{uuid, "2.0.5", {pkg, uuid_erl}},
{types, "~> 0.1.8"},
{opentelemetry_api, "1.2.1"},
telemetry,
%% Exponential backoff for partisan_retry's optional backoff mode.
{backoff, "1.1.6"}
%% Applications under test
%% {hbbft, {git, "git://github.com/helium/erlang-hbbft", {branch, "master"}}}
%% {riak_ensemble, {git, "git://github.com/cmeiklejohn/riak_ensemble", {branch, "partisan"}}},
%% {paxoid, {git, "git://github.com/cmeiklejohn/paxoid", {branch, "partisan"}}},
%% {lashup, {git, "git://github.com/cmeiklejohn/lashup", {branch, "partisan"}}},
%% {hbbft, {git, "git://github.com/helium/erlang-hbbft", {branch, "master"}}},
%% {zraft_lib, {git, "git://github.com/cmeiklejohn/zraft_lib", {branch, "master"}}}
]}.
{dialyzer, [
{base_plt_apps, [
kernel, stdlib, erts, sasl, eunit, syntax_tools, compiler, crypto,
ssl, public_key, inets
]}
]}.
{xref_checks, [undefined_function_calls]}.
{xref_ignores, [
eredis,
{partisan_peer_discovery_agent, format_status, 2}
]}.
{cover_enabled, true}.
{cover_opts, [verbose]}.
{cover_export_enabled, true}.
{covertool, [{coverdata_files, ["ct.coverdata"]}]}.
{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
{erlfmt, [
write,
{print_width, 80},
{exclude_files, []},
{files, "{src,include,test,examples}/*.{hrl,erl}"}
]}.
{project_plugins, [
rebar3_proper,
rebar3_ex_doc,
rebar3_hex,
rebar3_hank,
{erlfmt, "1.8.0"}
]}.
{shell, [
{erl_opts, [warnings_as_errors]},
{apps, [partisan]},
{config, "config/sys.config"}
]}.
{relx, [
{release, {partisan, "6.0.0"}, [
%% Erlang
sasl,
crypto,
inets,
tools,
runtime_tools,
os_mon,
debugger,
%% Third-parties
types,
uuid,
opentelemetry_api,
telemetry,
partisan
]},
{dev_mode, false},
{include_src, false},
{include_erts, true},
{extended_start_script, true},
{overlay_vars, "config/vars.config"}
]}.
{profiles, [
{node1, [
{deps, [
recon,
observer_cli
]},
{relx, [
{dev_mode, false},
{mode, prod},
{include_src, false},
{include_erts, true},
{sys_config, "config/node1/sys.config"},
{vm_args, "config/node1/vm.args"},
{overlay, [
{mkdir, "{{platform_etc_dir}}"},
{copy,
"config/_ssl/server/cacerts.pem",
"{{platform_etc_dir}}/ssl/server/cacerts.pem"
},
{copy,
"config/_ssl/server/keycert.pem",
"{{platform_etc_dir}}/ssl/server/keycert.pem"
},
{copy,
"config/_ssl/server/key.pem",
"{{platform_etc_dir}}/ssl/server/key.pem"
},
{copy,
"config/_ssl/client/cacerts.pem",
"{{platform_etc_dir}}/ssl/client/cacerts.pem"
},
{copy,
"config/_ssl/client/keycert.pem",
"{{platform_etc_dir}}/ssl/client/keycert.pem"
},
{copy,
"config/_ssl/client/key.pem",
"{{platform_etc_dir}}/ssl/client/key.pem"
}
]}
]}
]},
{node2, [
{deps, [
recon,
observer_cli
]},
{relx, [
{dev_mode, false},
{mode, prod},
{include_src, false},
{include_erts, true},
{sys_config, "config/node2/sys.config"},
{vm_args, "config/node2/vm.args"},
{overlay, [
{mkdir, "etc"},
{mkdir, "{{platform_etc_dir}}/ssl"},
{copy,
"config/_ssl/server/cacerts.pem",
"{{platform_etc_dir}}/ssl/server/cacerts.pem"
},
{copy,
"config/_ssl/server/keycert.pem",
"{{platform_etc_dir}}/ssl/server/keycert.pem"
},
{copy,
"config/_ssl/server/key.pem",
"{{platform_etc_dir}}/ssl/server/key.pem"
},
{copy,
"config/_ssl/client/cacerts.pem",
"{{platform_etc_dir}}/ssl/client/cacerts.pem"
},
{copy,
"config/_ssl/client/keycert.pem",
"{{platform_etc_dir}}/ssl/client/keycert.pem"
},
{copy,
"config/_ssl/client/key.pem",
"{{platform_etc_dir}}/ssl/client/key.pem"
}
]}
]}
]},
{node3, [
{deps, [
recon,
observer_cli
]},
{relx, [
{dev_mode, false},
{include_src, false},
{include_erts, true},
{sys_config, "config/node3/sys.config"},
{vm_args, "config/node3/vm.args"},
{overlay, [
{mkdir, "etc"},
{mkdir, "{{platform_etc_dir}}/ssl"},
{copy,
"config/_ssl/server/cacerts.pem",
"{{platform_etc_dir}}/ssl/server/cacerts.pem"
},
{copy,
"config/_ssl/server/keycert.pem",
"{{platform_etc_dir}}/ssl/server/keycert.pem"
},
{copy,
"config/_ssl/server/key.pem",
"{{platform_etc_dir}}/ssl/server/key.pem"
},
{copy,
"config/_ssl/client/cacerts.pem",
"{{platform_etc_dir}}/ssl/client/cacerts.pem"
},
{copy,
"config/_ssl/client/keycert.pem",
"{{platform_etc_dir}}/ssl/client/keycert.pem"
},
{copy,
"config/_ssl/client/key.pem",
"{{platform_etc_dir}}/ssl/client/key.pem"
}
]}
]}
]},
{node4, [
{deps, [
recon,
observer_cli
]},
{relx, [
{dev_mode, false},
{include_src, false},
{include_erts, true},
{sys_config, "config/node4/sys.config"},
{vm_args, "config/node4/vm.args"},
{overlay, [
{mkdir, "etc"},
{mkdir, "{{platform_etc_dir}}/ssl"},
{copy,
"config/_ssl/server/cacerts.pem",
"{{platform_etc_dir}}/ssl/server/cacerts.pem"
},
{copy,
"config/_ssl/server/keycert.pem",
"{{platform_etc_dir}}/ssl/server/keycert.pem"
},
{copy,
"config/_ssl/server/key.pem",
"{{platform_etc_dir}}/ssl/server/key.pem"
},
{copy,
"config/_ssl/client/cacerts.pem",
"{{platform_etc_dir}}/ssl/client/cacerts.pem"
},
{copy,
"config/_ssl/client/keycert.pem",
"{{platform_etc_dir}}/ssl/client/keycert.pem"
},
{copy,
"config/_ssl/client/key.pem",
"{{platform_etc_dir}}/ssl/client/key.pem"
}
]}
]}
]},
{test, [
{erl_opts, [
nowarn_export_all,
nowarn_unused_type,
nowarn_deprecated_function,
debug_info
]},
{extra_src_dirs, ["protocols", "test/otp", "bench"]},
{deps, [
{eredis,
{git, "https://github.com/wooga/eredis.git", {tag, "master"}}
},
{jsx, "3.1.0"},
{proper, "1.4.0"},
recon
]},
{relx, [{release, {partisan, "6.0.0"}, [eredis, partisan]},
{extended_start_script, true},
{dev_mode, true},
{include_erts, false},
{sys_config, "config/sys.config"},
{vm_args, "config/vm.args"},
{overlay, [{mkdir, "log/sasl"},
{mkdir, "data/"},
{copy, "bin/env", "bin"}
]}
]}
]},
{lint, [
{erl_opts, [
warnings_as_errors,
nowarn_export_all,
nowarn_deprecated_function,
debug_info
]},
{plugins, [rebar3_lint]}
]}
]}.
{hex, [
{doc, #{provider => ex_doc}}
]}.
{ex_doc, [
{source_url, <<"https://github.com/lasp-lang/partisan">>},
{extras, [
<<"README.md">>,
<<"doc_extras/installation.md">>,
<<"doc_extras/migrating_v5_to_v6.md">>,
<<"doc_extras/cheatsheet.cheatmd">>,
<<"doc_extras/telemetry.md">>,
<<"doc_extras/cluster_security.md">>,
<<"doc_extras/adrs/ADR-000001.md">>,
<<"doc_extras/adrs/ADR-000002.md">>,
<<"doc_extras/adrs/ADR-000003.md">>,
<<"doc_extras/adrs/ADR-000004.md">>,
<<"doc_extras/adrs/ADR-000005.md">>,
<<"doc_extras/adrs/ADR-000006.md">>,
<<"doc_extras/adrs/ADR-000007.md">>,
<<"CODE_OF_CONDUCT.md">>,
<<"LICENSE">>,
<<"CHANGELOG.md">>
]},
{main, <<"README.md">>},
{logo, "assets/partisan_isotype.png"},
%% Render ```mermaid fenced blocks as diagrams. Atom `html` key is required
%% (ex_doc uses the format atom); mermaid.js is loaded from a CDN per page.
{before_closing_body_tag, #{html => "<script src=\"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js\"></script><script>document.addEventListener(\"DOMContentLoaded\", function () { mermaid.initialize({startOnLoad: false, theme: document.body.className.includes(\"dark\") ? \"dark\" : \"default\"}); let id = 0; for (const codeEl of document.querySelectorAll(\"pre code.mermaid\")) { const preEl = codeEl.parentElement; const graphDefinition = codeEl.textContent; const graphEl = document.createElement(\"div\"); mermaid.render(\"mermaid-graph-\" + id++, graphDefinition).then(({svg, bindFunctions}) => { graphEl.innerHTML = svg; bindFunctions && bindFunctions(graphEl); preEl.insertAdjacentElement(\"afterend\", graphEl); preEl.remove(); }); } });</script>"}},
{api_reference, true},
%% Pages/modules whose doc references are intentionally unresolvable and must
%% not raise ex_doc "undefined or private" warnings. ex_doc checks each entry
%% against `config.id`, `config.module_id`, *and* the reference's file path
%% relative to cwd — for an extra (a Markdown page) only the file path ever
%% matches, so those two entries must be the source file's relative path, not
%% a derived slug like "changelog":
%% * CHANGELOG.md / cheatsheet.cheatmd — reference functions removed in
%% earlier versions and OTP functions (gen_server, erlang, net_kernel)
%% shown for comparison;
%% * acceptor / acceptor_pool — vendored modules referencing OTP `supervisor`
%% and library types;
%% * partisan_monitor — references peer-service-manager *callbacks* (on_up/2,
%% on_down/2), which are not functions.
{skip_undefined_reference_warnings_on, [
<<"CHANGELOG.md">>,
<<"doc_extras/cheatsheet.cheatmd">>,
<<"acceptor">>,
<<"acceptor_pool">>,
<<"partisan_monitor">>
]},
{groups_for_extras, [
{<<"Guides">>, [
<<"doc_extras/installation.md">>,
<<"doc_extras/migrating_v5_to_v6.md">>,
<<"doc_extras/cheatsheet.cheatmd">>
]},
{<<"Deployment">>, [
<<"doc_extras/cluster_security.md">>,
<<"doc_extras/telemetry.md">>
]},
{<<"Architecture Decision Records">>, [
<<"doc_extras/adrs/ADR-000001.md">>,
<<"doc_extras/adrs/ADR-000002.md">>,
<<"doc_extras/adrs/ADR-000003.md">>,
<<"doc_extras/adrs/ADR-000004.md">>,
<<"doc_extras/adrs/ADR-000005.md">>,
<<"doc_extras/adrs/ADR-000006.md">>,
<<"doc_extras/adrs/ADR-000007.md">>
]}
]},
{groups_for_modules, [
{<<"API">>, [
partisan,
partisan_config,
partisan_peer_service
]},
{<<"OTP">>, [
partisan_erpc,
partisan_gen,
partisan_gen_event,
partisan_gen_server,
partisan_gen_statem,
partisan_gen_supervisor,
partisan_monitor,
partisan_proc_lib,
partisan_rpc,
partisan_rpc_backend,
partisan_sys,
partisan_test_server
]},
{<<"Peer Discovery Agent">>, [
partisan_peer_discovery_agent,
partisan_peer_discovery_list,
partisan_peer_discovery_dns
]},
{<<"Peer Service (Sampling|Membership)">>, [
partisan_peer_service,
partisan_peer_service_manager,
partisan_peer_service_sup,
partisan_membership,
partisan_peer_service_console,
partisan_peer_service_client,
partisan_peer_service_server,
partisan_remote_ref
]},
{<<"Sampling|Membership Protocols">>, [
partisan_pluggable_peer_service_manager,
partisan_hyparview_peer_service_manager,
partisan_client_server_peer_service_manager,
partisan_static_peer_service_manager
]},
{<<"Pluggable Membership Strategy">>, [
partisan_membership_set,
partisan_membership_strategy,
partisan_full_membership_strategy,
partisan_scamp_v1_membership_strategy,
partisan_scamp_v2_membership_strategy
]},
{<<"Gossip-based Broadcast">>, [
partisan_broadcast,
partisan_broadcast_engine,
partisan_plumtree_engine,
partisan_thicket_engine,
partisan_plumtree_backend,
partisan_plumtree_broadcast,
partisan_plumtree_broadcast_handler,
partisan_plumtree_util
]},
{<<"Routing Backend">>, [
partisan_acknowledgement_backend,
partisan_causality_backend
]},
{<<"Connection Management">>, [
partisan_peer_connections,
partisan_peer_socket,
partisan_acceptor_pool,
partisan_acceptor_socket_pool_sup,
partisan_acceptor_socket
]},
{<<"Orchestration">>, [
partisan_orchestration_strategy,
partisan_orchestration_backend,
partisan_compose_orchestration_strategy,
partisan_kubernetes_orchestration_strategy
]},
{<<"Tracing">>, [
partisan_trace_file,
partisan_trace_orchestrator
]},
{<<"Scaffolding">>, [
partisan_app,
partisan_sup
]},
{<<"Utils">>, [
partisan_util,
partisan_inet,
partisan_vclock,
partisan_transform,
partisan_transformed_module,
partisan_analysis,
partisan_logger
]},
{<<"Deprecated">>, [
partisan_otp_adapter,
partisan_gen_fsm
]}
]}
]}.
{elvis,
[#{dirs => ["src"],
filter => "*.erl",
rules => [
%% {elvis_style, line_length,
%% #{ignore => [],
%% limit => 80,
%% skip_comments => false}},
{elvis_style, no_tabs},
{elvis_style, no_trailing_whitespace},
{elvis_style, macro_names, #{ignore => []}},
%% {elvis_style, macro_module_names},
{elvis_style, operator_spaces, #{rules => [{right, ","},
{right, "++"},
{left, "++"}]}},
%% {elvis_style, nesting_level, #{level => 3}},
{elvis_style, god_modules,
#{limit => 25,
ignore => []}},
{elvis_style, no_if_expression},
%% {elvis_style, invalid_dynamic_call, #{ignore => []}},
{elvis_style, used_ignored_variable},
{elvis_style, no_behavior_info},
{
elvis_style,
module_naming_convention,
#{regex => "^[a-z]([a-z0-9]*_?)*(_SUITE)?$",
ignore => []}
},
{
elvis_style,
function_naming_convention,
#{regex => "^([a-z][a-z0-9]*_?)*$"}
},
{elvis_style, state_record_and_type},
{elvis_style, no_spec_with_records}
%% {elvis_style, dont_repeat_yourself, #{min_complexity => 10}}
%% {elvis_style, no_debug_call, #{ignore => []}}
]
},
#{dirs => ["."],
filter => "Makefile",
rules => [{elvis_project, no_deps_master_erlang_mk, #{ignore => []}},
{elvis_project, protocol_for_deps_erlang_mk, #{ignore => []}}]
},
#{dirs => ["."],
filter => "rebar.config",
rules => [{elvis_project, no_deps_master_rebar, #{ignore => []}},
{elvis_project, protocol_for_deps_rebar, #{ignore => []}}]
}
]
}.