Packages
finitomata
0.41.0
0.41.0
0.40.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.30.3
0.30.2
0.30.1
0.30.0
0.29.10
0.29.9
0.29.8
0.29.7
0.29.6
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.4
0.26.3
0.26.2
0.26.1
0.26.0
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.7
0.23.6
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.1
0.15.0
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.1
0.1.0
The FSM implementation generated from PlantUML textual representation.
Current section
Files
Jump to
Current section
Files
finitomata
mix.exs
mix.exs
defmodule Finitomata.MixProject do
use Mix.Project
major = System.otp_release()
otp_version =
try do
{:ok, contents} = File.read(Path.join([:code.root_dir(), "releases", major, "OTP_VERSION"]))
String.split(contents, "\n", trim: true)
else
[full] -> full
_ -> major
catch
:error, _ -> major
end
|> String.split("-")
|> hd()
|> String.split(".")
|> case do
[major] -> [major, 0, 0]
[major, minor] -> [major, minor, 0]
[major, minor, patch | _] -> [major, minor, patch]
end
|> Enum.join(".")
@modern_libs if Version.compare(otp_version, "25.1.0") == :lt,
do: [],
else: [{:enfiladex, "~> 0.1", only: [:dev, :test, :finitomata]}]
@app :finitomata
@version "0.41.0"
def lib?(lib), do: lib in Enum.map(@modern_libs, &elem(&1, 0))
def project do
[
app: @app,
name: "Finitomata",
version: @version,
elixir: "~> 1.14",
compilers: compilers(Mix.env()),
elixirc_paths: elixirc_paths(Mix.env()),
prune_code_paths: Mix.env() == :prod,
consolidate_protocols: Mix.env() not in [:dev, :test],
description: description(),
package: package(),
deps: deps(),
aliases: aliases(),
xref: [exclude: []],
docs: docs(),
# elixirc_options: [debug_info: Mix.env() in [:dev, :test, :ci]],
releases: [],
dialyzer: [
plt_file: {:no_warn, ".dialyzer/dialyzer.plt"},
plt_add_deps: :app_tree,
plt_add_apps: [:mix],
list_unused_filters: true,
ignore_warnings: ".dialyzer/ignore.exs"
],
# `--cover` is informational: the test suites are split (standard, distributed,
# `:finitomata`, examples) and each exercises different code paths, so a single
# run must not gate on the partial number. Raise the `summary` threshold only with
# cross-suite aggregation.
test_coverage: [summary: [threshold: 0]]
]
end
def application do
[
mod: {Finitomata.Application, []},
extra_applications: [:logger]
]
end
def cli do
[preferred_envs: ["enfiladex.suite": :test]]
end
defp deps do
[
# core
{:nimble_parsec, "~> 1.0"},
{:nimble_options, "~> 0.3 or ~> 1.0"},
{:gen_stage, "~> 1.0"},
{:estructura, "~> 1.6"},
# optional
{:telemetry, "~> 1.0", optional: true},
{:telemetry_poller, "~> 1.0", optional: true},
{:telemetria, "~> 0.21", optional: true},
# dev / test
{:nimble_ownership, "~> 1.0", only: [:dev, :test, :ci, :finitomata]},
{:mox, "~> 1.2", only: [:dev, :test, :ci, :finitomata]},
{:stream_data, "~> 1.0"},
{:observer_cli, "~> 1.5", only: [:dev]},
{:credo, "~> 1.0", only: [:dev, :ci]},
{:dialyxir, "~> 1.0", only: [:dev, :ci], runtime: false},
{:ex_doc, "~> 0.11", only: [:dev]}
] ++ @modern_libs
end
defp aliases do
[
test: ["test --exclude distributed", "test --exclude test --include distributed"],
quality: ["format", "credo --strict", "dialyzer --unmatched_returns"],
"quality.ci": [
"format --check-formatted",
"credo --strict",
"dialyzer --unmatched_returns"
]
]
end
defp description do
"""
The FSM implementation generated from PlantUML textual representation.
"""
end
defp package do
[
name: @app,
files: ~w|stuff lib mix.exs README.md LICENSE .formatter.exs|,
maintainers: ["Aleksei Matiushkin"],
licenses: ["MIT"],
links: %{
"GitHub" => "https://github.com/am-kantox/#{@app}",
"Docs" => "https://hexdocs.pm/#{@app}"
}
]
end
defp docs do
[
main: "readme",
source_ref: "v#{@version}",
canonical: "http://hexdocs.pm/#{@app}",
logo: "stuff/#{@app}-48x48.png",
source_url: "https://github.com/am-kantox/#{@app}",
assets: %{"stuff/images" => "assets"},
extras: ~w[README.md stuff/fsm.md stuff/compiler.md stuff/cheatsheet.md],
# These modules/functions are intentionally `@moduledoc false`/`@doc false` yet are
# referenced by name in the docs; skip autolinking to avoid "references ... but it is
# hidden" warnings from `mix docs` while keeping the inline monospace text.
skip_code_autolink_to: [
"Finitomata.Engine",
"Finitomata.ConfigBuilder",
"Finitomata.StateCache",
"Finitomata.timer_tick/2",
"Finitomata.ExUnit.refute_receive_timeout/0"
],
groups_for_modules: [
FSM: [Finitomata, Infinitomata, Finitomata.Flow, Finitomata.Error],
Test: [Finitomata.ExUnit, Finitomata.ExUnit.Listener],
Goods: [Finitomata.Throttler, Finitomata.Pool, Finitomata.Cache, Finitomata.Accessible],
Internals: [
Finitomata.Listener,
Finitomata.ClusterInfo,
Finitomata.Parser,
Finitomata.Pool.Actor,
Finitomata.Supervisor,
Finitomata.State,
Finitomata.Transition,
Finitomata.Transition.Path
],
Persistence: [
Finitomata.Persistency,
Finitomata.Persistency.ETS,
Finitomata.Persistency.DETS,
Finitomata.Persistency.Persistable,
Finitomata.Persistency.Protocol
]
],
before_closing_body_tag: &before_closing_body_tag/1
]
end
defp compilers(_), do: Mix.compilers() ++ [:finitomata]
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(:finitomata), do: ["lib", "test/support"]
defp elixirc_paths(:ci), do: ["lib"]
defp elixirc_paths(:dev), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
defp before_closing_body_tag(:html) do
"""
<script defer src="https://cdn.jsdelivr.net/npm/mermaid@10.2.3/dist/mermaid.min.js"></script>
<script>
let initialized = false;
window.addEventListener("exdoc:loaded", () => {
if (!initialized) {
mermaid.initialize({
startOnLoad: false,
theme: document.body.className.includes("dark") ? "dark" : "default"
});
initialized = true;
}
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");
const graphId = "mermaid-graph-" + id++;
mermaid.render(graphId, graphDefinition).then(({svg, bindFunctions}) => {
graphEl.innerHTML = svg;
bindFunctions?.(graphEl);
preEl.insertAdjacentElement("afterend", graphEl);
preEl.remove();
});
}
});
</script>
"""
end
defp before_closing_body_tag(_), do: ""
end