Choreo.Lab.DSL.Requirement (Choreo v0.12.0)

Copy Markdown View Source

Experimental Livebook-friendly DSL for sketching requirements traceability models.

This Lab DSL compiles to the stable, pipe-first Choreo.Requirement builders and returns an ordinary %Choreo.Requirement{}. It is useful for quickly connecting requirements to stakeholders, implementation components, tests, and traceability links in design notebooks.

Examples

iex> import Choreo.Lab.DSL.Requirement
...> model = requirements "Auth v2" do
...>   security = stakeholder("Security Team")
...>   mfa = functional("Users must authenticate with MFA", id: "REQ-001", risk: :high)
...>   auth = component("Auth Service")
...>   mfa_test = test_case("MFA login test")
...>
...>   security ~> mfa |> traces("owns")
...>   auth ~> mfa |> satisfies("implements")
...>   mfa_test ~> mfa |> verifies("proves")
...> end
iex> model.name
"Auth v2"
iex> Enum.sort(Choreo.Requirement.requirements(model))
[:mfa]

Requirement constructors accept a text/label and can infer stable options for quick sketches:

mfa = requirement("Users must authenticate with MFA", id: "REQ-001")
perf = performance("p95 latency below 100ms", risk: :high)

Edges can use generic, typed, or pipe-modified forms:

auth ~> mfa |> satisfies("implements")
test ~> mfa |> verifies("covers")
child ~> parent |> refines("elaborates")
edge req_a ~> req_b, depends: "requires first"
contains parent ~> child, "breaks down"

Summary

Types

edge_decl()

@type edge_decl() :: %{
  from: Yog.node_id(),
  to: Yog.node_id(),
  opts: keyword(),
  builder: atom()
}

node_decl()

@type node_decl() :: %{id: Yog.node_id(), builder: atom(), opts: keyword()}

Functions

actor(arg1 \\ nil, arg2 \\ nil, opts \\ [])

component(arg1 \\ nil, arg2 \\ nil, opts \\ [])

constraint(arg1 \\ nil, arg2 \\ nil, opts \\ [])

contains(arg1 \\ nil, arg2 \\ nil, opts \\ [])

depends(arg1 \\ nil, arg2 \\ nil, opts \\ [])

derives(arg1 \\ nil, arg2 \\ nil, opts \\ [])

design_constraint(arg1 \\ nil, arg2 \\ nil, opts \\ [])

functional(arg1 \\ nil, arg2 \\ nil, opts \\ [])

interface_requirement(arg1 \\ nil, arg2 \\ nil, opts \\ [])

module(arg1 \\ nil, arg2 \\ nil, opts \\ [])

owner(arg1 \\ nil, arg2 \\ nil, opts \\ [])

performance(arg1 \\ nil, arg2 \\ nil, opts \\ [])

physical(arg1 \\ nil, arg2 \\ nil, opts \\ [])

refines(arg1 \\ nil, arg2 \\ nil, opts \\ [])

relates(arg1 \\ nil, arg2 \\ nil, opts \\ [])

req(arg1 \\ nil, arg2 \\ nil, opts \\ [])

requirements(list)

(macro)

Builds a %Choreo.Requirement{} from a compact Lab DSL block.

requirements(name_or_opts, list)

(macro)

satisfies(arg1 \\ nil, arg2 \\ nil, opts \\ [])

service(arg1 \\ nil, arg2 \\ nil, opts \\ [])

stakeholder(arg1 \\ nil, arg2 \\ nil, opts \\ [])

system(arg1 \\ nil, arg2 \\ nil, opts \\ [])

taxonomy()

@spec taxonomy() :: %{
  requirements: [atom()],
  nodes: [atom()],
  edges: [atom()],
  modifiers: [atom()],
  options: [atom()]
}

Returns the vocabulary supported by the requirement DSL.

iex> taxonomy = Choreo.Lab.DSL.Requirement.taxonomy()
iex> :functional in taxonomy.requirements
true
iex> :component in taxonomy.nodes
true
iex> :satisfies in taxonomy.edges
true

team(arg1 \\ nil, arg2 \\ nil, opts \\ [])

test_case(arg1 \\ nil, arg2 \\ nil, opts \\ [])

traces(arg1 \\ nil, arg2 \\ nil, opts \\ [])

verbs()

@spec verbs() :: map()

Compatibility alias for taxonomy/0.

verification(arg1 \\ nil, arg2 \\ nil, opts \\ [])

verifies(arg1 \\ nil, arg2 \\ nil, opts \\ [])