Dotstop
Dotstop is an in-development text-based requirements management package. It is similar to doorstop, but uses a decoupled representation of the edges and nodes of the requirements graph both in memory and on disk. This has significant advantages for modularity and scalability, particularly for large software projects distributed across multiple repositories or even multiple platforms.
Concept1
In the simplest sense, dotstop is just a set of uniquely named markdown files
that are linked by edges described in a
.dot or "DAG of tomorrow" file.
.dot is a near-universal and open-source language for describing directed
acyclic graphs. This has many benefits for data analysis of Trustable, since
.dot can be directly parsed by many powerful open-source network analysis and
visualization tools, such as:
dotstop uses two small (and syntax-compliant) extensions to the .dot language.
First, dot's custom node and edge attributes are used to store the hashes of
items and their links:
"ITEM-001" [sha="<hash of file content>"]
"ITEM-001" --> "ITEM-002" [sha = "<hash of concatenated file contents>"]
This allows the Suspect status of items and links to be straightforwardly and robustly tracked.
Secondly, .dot supports C++ style comments (/*,*/ and //) and ignores
all lines beginning with #. Crucially though, such lines are not considered
comments. Since links (and their hashes) are stored separately from the content of
items, handling external dependencies can be reduced to a simple namespacing
problem:
# import https://github.com/project/project.git@sha as project
"project.ITEM-001" [sha="<hash of file content>"]
"project.ITEM-001" --> "ITEM-002" [sha = "<hash of concatenated file contents>"]
Implementation
Warning
Dotstop has now been developed to the point where we have fully deprecated doorstop as a viable backend.
The first important type introduced by dotstop is the Item class. These
objects possess all the data and functionality associated with a set of
Statements:
- Statement names (hashed)
- Statement text (hashed)
- Artifact references (hashed)
- Status (normative/non-normative) (hashed)
- Expression as a header
- Parent document
- Score
- Ordering, level-based and/or alphabetical
The second crucial type is the Graph class. Using a pydot.Graph
representation of the .dot file, this object provides all of the data and
functionality associated with the relationship between the set of Statements
and the wider project:
- Network adjacency matrix
- Representation as
.dotsource - Review status of
Items, based on item hashes - Link status, based on item hashes
Roadmap
Dotstop is under heavy development, and the design sketch below is for context only:
flowchart TB;
subgraph trustablemodule["`**trudag**`"]
direction BT
cli["`**trudag.cli**`"]
score["`**trudag.score**`"]
manage["`**trudag.manage**`"]
plot["`**trudag.plot**`"]
subgraph publishmodule["`**trudag.publish**`"]
direction BT
Report["`_trudag.publish.Report_`"]
end
plot
manage --"called by"-->cli
plot --"called by"--> cli
publishmodule --"called by"--> cli
score --"called by"--> cli
end
graphalyzer --"called by"--> score;
score --"called by"--> Report
subgraph graphalyzer["`**graphalyzer**`"]
DirectedAcyclicGraph["`_graphalyzer.DirectedAcyclicGraph_`"]
end
DotstopGraph --"built from"--> DirectedAcyclicGraph
DotstopGraph --"member of"--> Report
dotstopmodule --"called by"--> plot
dotstopmodule --"called by"--> manage
subgraph dotstopmodule["`**dotstop**`"];
DotstopGraph["`_dotstop.Graph_`"]
PydotGraph["`_pydot.Graph_`"]
MarkdownItem["`_dotstop.MarkdownItem_`"]
MarkdownItem --"member of"--> DotstopGraph;
PydotGraph --"member of"-->DotstopGraph;
end
dot --"read/write"--> PydotGraph;
item --"read/write"--> MarkdownItem;
subgraph Disk;
dot[/graph.dot/]
item[/ITEM-*.md/]
end
-
This section is intended to serve as motivation for the goals of the project and the technical decisions being made. These features are not yet implemented. ↩