- Pull down the repository (
git clone [email protected]:sig-gis/behave-polylith
) - Pull down the submodules (
git submodule update --init --remote
) - Follow the Datomic Setup (see below)
- Start the Datomic Transactor (see below)
- Open
development/user.cljs
in Emacs - Start the CIDER nREPL
cider-jack-in-clj&cljs
- Choose
figwheel-main
anddev
for the front-end build. - Open
http://localhost:8080
in your browser.
This project adopts a Polylith design, which allows both a mono-repo experience across mulitple projects.
The Polylith project organization method attempts to marry the best parts of operating within a single Monorepo (single source of truth, DRY code, less repos to manage), with the benefits of having single repos for each project (customization).
The Polylith design is made up of three parts: Components, Bases, and Projects.
This is the most basic unit for Polylith. Ideally, Components require few, if
any, dependencies. Each component always has an <component>.interface
namespace, which includes the public functions that are meant to be exported
from the component. Components (ideally) are written in the Clojure Common (*.cljc
)
format so as to be used in both CLJ and CLJS environments.
Bases are groups of components and other dependencies that constitute a
middle-tier of the Polylith. Bases can be project-specific, but ideally are
general enough to be used across multiple projects. Bases typically
only have a main.clj[sc]
file.
Projects are made up of multiple bases and components. Many projects can exist within a Polylith, which enables a great deal of customization while also sharing components and bases across projects.
The projects take advantage of the Behave Components shared UI components library. Check out the docs on the Behave Components page to learn more.
The projects use both Reagent and Re-Frame to manage application state and application logic. Re-Frame was adopted to reduce tight coupling between views/components and the data/actions that are used within them.
The projects store data in Datoms and performs queries using the Datalog syntax. The back-end access Datoms using DataHike, and the front-end accesses Datoms through DataScript. Re-Posh is also used to enable subscriptions on DataScript entities, reducing view logic.
digraph GitHub {
graph [rankdir = "LR"]
node [shape = record]
Tool [label="Tools
|{ :bp/uuid | string }
|{ :tool/name | string }
|{ :tool/order | number }
|{ :tool/translation-key | string }
|{ :tool/help-key | string }"]
SubTool [label="Subtool
|{ :bp/uuid | string }
|{ :subtool/name | string }
|{ :subtool/order | number }
|{ :subtool/autocompute? | boolean }
|{ :subtool/translation-key | string }
|{ :subtool/help-key | string }"]
SubToolVariable [label="Subtool-Variable
|{ :bp/uuid | string }
|{ :subtool-variable/io | keyword }
|{ :subtool-variable/order | number }
|{ :subtool-variable/cpp-namespace-uuid | string }
|{ :subtool-variable/cpp-mclass | string }
|{ :subtool-variable/cpp-function-uuid | string }
|{ :subtool-variable/translation-key | string }
|{ :subtool-variable/help-key | string }"]
Variable [label="Variable
|{ :bp/uuid | string }
|{ :variable/name | string }
|{ :variable/bp6-label | string }
|{ :variable/bp6-code | string }
|{ :variable/kind | keyword}
|{ :variable/translation-key | string }
|{ :variable/native-decimals | double }
|{ :variable/english-decimals | double }
|{ :variable/metric-decimals | double }
|{ :variable/maximum | double }
|{ :variable/minimum | double }
|{ :variable/default-value | double }
|{ :variable/map-units-convertible? | double }
"]
List [label="List
|{ :bp/uuid | string }
|{ :list/name | string }
|{ :list/translation-key | string }
"]
ListOptions [label="List-Options
|{ :bp/uuid | string }
|{ :list-option/name | string }
|{ :list-option/default | string }
|{ :list-option/value | string }
|{ :list-option/order | string }
|{ :list-option/translation-key | string }
"]
Dimension [label="Dimension
|{ :bp/uuid | string }
|{ :dimension/name | string }
|{ :dimension/cpp-enum-uuid | string }
"]
Unit [label="Unit
|{ :bp/uuid | string }
|{ :unit/name | string }
|{ :unit/short-code | string }
|{ :unit/system | string }
|{ :unit/cpp-enum-member-uuid | string }
"]
DomainSet [label="Domain-Set
|{ :bp/uuid | string }
|{ :domain-set/name | string }
"]
Domain [label="Domain
|{ :bp/uuid | string }
|{ :domain/name | string }
|{ :domain/decimals | string }
"]
Tool -> SubTool [label=":tool/subtools" taillabel=1 headlabel=N]
SubTool -> SubToolVariable [label=":subtool/variables" taillabel=1 headlabel=N]
Variable -> SubToolVariable [label=":variable/subtool-variables" taillabel=1 headlabel=N]
Variable -> List [label=":variable/list" taillabel=1 headlabel=1]
Variable -> Domain [label=":variable/domain-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/native-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/english-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/metric-unit-uuid" taillabel=1 headlabel=1]
List -> ListOptions [label=":list/options" taillabel=1 headlabel=N]
Dimension -> Unit [label=":dimension/units" taillabel=1 headlabel=N]
DomainSet -> Domain [label=":domain-set/domains" taillabel=1 headlabel=N]
Domain -> Dimension [label=":domain/dimension-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/native-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/english-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/metric-unit-uuid" taillabel=1 headlabel=1]
}
- Navigate to
projects/behave
. All paths described here will use this directory as root. - Add/edit the
resources/config.edn
for your deployment. Below is an example file:
;; resources/config.edn
{:database {:config {:store {:backend :file
:path "~/.behave/db"}}}
:site {:title "BehavePlus 7"
:description "Wildfire Analysis toolkit."}
:server {:http-port 8007
:mode "prod"}
:vms {:secret-token "<vms-secret-token>"}}
- Compile ClojureScript
bb build-js
- Build the UberJAR
NOTE: The uberjar build process requires triangulum to be available in the deps.edn located at the user level (i.e. home/<user>/.clojure/deps.edn).
{sig-gis/triangulum {:git/url "https://github.com/sig-gis/triangulum"
:sha "<latest-sha>"}}
bb uber
- Congratulations! You’re now the owner of an UberJAR.
(i.e.
target/behave7-2023.10.19-97f1ef9-standalone.jar
)
TODO
mkdir -p ~/.datomic
cd ~/.datomic
curl -O https://datomic-pro-downloads.s3.amazonaws.com/1.0.7075/datomic-pro-1.0.7075.zip
unzip *.zip
ln -s $PWD/datomic-pro-1.0.7075 $PWD/current
echo 'export PATH="$HOME/.datomic/current/bin:$PATH"' >> ~/.bashrc # Or ~/.zshrc
Be sure that PostgreSQL is running on port 5432.
cd /bases/datomic_store/sql/
psql -U postgres -f 01_setup.sql # Creates the Datomic DB, User
psql -U datomic datomic -f 02_tables.sql # Sets up the KV table
bb transactor
bb console --port <port>
Then visit localhost:8000/browse
bb restore --file <datomic-2024-##-##.dump>
The “behave-lib” directory includes the build process for generating a WASM file using c++ code from “behave-mirror” and “include” directories. Here’s Checklist for when new c++ code needs to be transcribed into wasm and be available via the Behave CMS.
- [ ] Run the pair of header files (i.e. surface.h and SIGSurface.h) through Hatchet (see Hatchet README).
- [ ] Replace/Edit text
- [ ] “std_string” with “[Const] DOMString”
- [ ] “string” with [Const] DOMString
- [ ] Any type ref to other classes with “[Ref] SIG<module>”
- [ ] Add [Const] to beginning of function in behave.idl for any functions in header file ending in const.
- [ ] Copy missing functions to the SIG<module> interface in “behave-lib/include/idl/behave.idl”
- [ ] Add new enums in “behave-lib/include/idl/behave.idl”
- [ ] For each enum in behave.idl there should be an enum entry in “src/cljs/behave/lib/enums.cljs”
- [ ] Add missing functions from hatchet’s output cljs file to “behave/src/cljs/behave/lib/<model>.cljs”
- [ ] Add this to the end of the file
(def ^:export ns-public-fns (update-keys (ns-publics 'behave.lib.ignite) name))
- [ ] Add mapping for new enums in “behave-lib/include/cpp/emscripten/enums.cpp”
- [ ] Update behave_extern.js with functions from cljs file
- [ ] In “behave-lib” run
make install
- [ ] Both edn files have been created through hatchet (i.e. surface.edn and SIGSurface.edn)
- [ ] Run a modified version of the code block below for the module that needs updating
(ns cms-import)
;; Combine edn files from hatchet
(cms-import {:behave-file "path/to/hatchet/output/surface.edn"
:sig-adapter-file "path/to/hatchet/output/SIGSurface.edn"
:out-file-name "SIGSurface.edn"
:from-key :Surface
:to-key :SIGSurface})
(add-export-file-to-conn "./cms-exports/SIGSurface.edn" conn)
This schema is used for the Behave VMS. It largely impacts the rendering UI of the Behave VMS and the Application.
// Relations (NOTE when a relation attribute of type :db/type/string instead of type :db.type/ref, this means the value is a UUID that matches the :bp/uuid of the related entity.)
digraph GitHub {
graph [rankdir = "LR"]
node [shape = record]
//----------------------------------------------------------------------------------------------
// VMS Schema Starts Here
//----------------------------------------------------------------------------------------------
User [label="User
|{ :bp/uuid | string }
|{ :user/name | string }
|{ :user/email | string }
|{ :user/password | string }
|{ :user/reset-key | string }
|{ :user/verified? | boolean }
|{ :user/super-admin? | boolean }
|{ :user/help-key | string }
"]
//----------------------------------------------------------------------------------------------
Application [label="Application
|{ :bp/uuid | string }
|{ :application/name | string }
|{ :application/version-major | number }
|{ :application/version-minor | number }
|{ :application/version-patch | number }
|{ :application/version | tuple }
|{ :application/help-key | string }
"]
Application -> Module [label=":application/modules" taillabel=1 headlabel=N]
Application -> Tool [label=":application/tools" taillabel=1 headlabel=N]
Application -> HelpPage [label=":application/help-key" taillabel=1 headlabel=1]
Application -> Translation [label=":application/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Module [label="Module
|{ :bp/uuid | string }
|{ :module/name | string }
|{ :module/order | number }
"]
Module -> Submodule [label=":module/submodules" taillabel=1 headlabel=N]
Module -> Diagram [label=":module/diagram" taillabel=1 headlabel=N]
Module -> HelpPage [label=":module/help-key" taillabel=1 headlabel=1]
Module -> Translation [label=":module/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Submodule [label="Submodule
|{ :bp/uuid | string }
|{ :submodule/name | string }
|{ :submodule/order | number }
|{ :submodule/io | keyword }
|{ :submodule/research? | boolean }
|{ :submodule/conditionals-operator | keyword }
"]
Submodule -> Group [label=":submodule/groups" taillabel=1 headlabel=N]
Submodule -> Conditional [label=":submodule/conditionals" taillabel=1 headlabel=N]
Submodule -> HelpPage [label=":submodule/help-key" taillabel=1 headlabel=1]
Submodule -> Translation [label=":submodule/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Group [label="Group
|{ :bp/uuid | string }
|{ :group/name | string }
|{ :group/order | long }
|{ :group/io | keyword }
|{ :group/research? | boolean }
|{ :group/repeat? | boolean }
|{ :group/max-repeat | long }
|{ :group/conditionals-operator | keyword }
"]
Group -> Group [label=":group/children" taillabel=1 headlabel=1]
Group -> Conditional [label=":group/conditionals" taillabel=1 headlabel=N]
Group -> GroupVariable [label=":group/group-variables" taillabel=1 headlabel=N]
Group -> HelpPage [label=":group/help-key" taillabel=1 headlabel=1]
Group -> Translation [label=":group/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
GroupVariable [label="Group-Variable
|{ :bp/uuid | string }
|{ :group-variable/cpp-class | string }
|{ :group-variable/cpp-function | string }
|{ :group-variable/cpp-namespace | string }
|{ :group-variable/cpp-parameter | string }
|{ :group-variable/order | long}
|{ :group-variable/research? | boolean }
"]
GroupVariable -> CppClass [label=":group-variable/cpp-class (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppFunction [label=":group-variable/cpp-function (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppNamespace [label=":group-variable/cpp-namespace (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppParameter [label=":group-variable/cpp-parameter (uuid)" taillabel=1 headlabel=1]
GroupVariable -> HelpPage [label=":group-variable/help-key" taillabel=1 headlabel=1]
GroupVariable -> Translation [label=":group-variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
CppClass [label="Cpp.Class
|{ :bp/uuid | string }
|{ :cpp.class/name | string }
"]
CppClass -> CppFunction [label=":cpp.class/function" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppFunction [label="Cpp.Function
|{ :bp/uuid | string }
|{ :cpp.function/name | string }
|{ :cpp.function/return-type | stringema}
"]
CppFunction -> CppParameter [label=":cpp.function/parameter" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppParameter [label="Cpp.Parameter
|{ :bp/uuid | string }
|{ :cpp.parameter/name | string }
|{ :cpp.parameter/order | number }
|{ :cpp.parameter/type | string }
"]
//----------------------------------------------------------------------------------------------
CppNamespace [label="Cpp.Namespace
|{ :bp/uuid | string }
|{ :cpp.namespace/name | string }
"]
CppNamespace -> CppClass [label=":cpp.namespace/class" taillabel=1 headlabel=N]
CppNamespace -> CppEnum [label=":cpp.namespace/enum" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppEnum [label="Cpp.Enum
|{ :bp/uuid | string }
|{ :cpp.enum/name | string }
"]
CppEnum -> CppEnumMember [label=":cpp.enum/enum-member" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppEnumMember [label="Cpp.Enum-member
|{ :bp/uuid | string }
|{ :cpp.enum-member/name | string }
|{ :cpp.enum-member/value | number }
"]
//----------------------------------------------------------------------------------------------
Tool [label="Tools
|{ :bp/uuid | string }
|{ :tool/name | string }
|{ :tool/order | number }
"]
Tool -> SubTool [label=":tool/subtools" taillabel=1 headlabel=N]
Tool -> HelpPage [label=":tool/help-key" taillabel=1 headlabel=1]
Tool -> Translation [label=":tool/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
SubTool [label="Subtool
|{ :bp/uuid | string }
|{ :subtool/name | string }
|{ :subtool/order | number }
|{ :subtool/autocompute? | boolean }
"]
SubTool -> SubToolVariable [label=":subtool/variables" taillabel=1 headlabel=N]
SubTool -> HelpPage [label=":subtool/help-key" taillabel=1 headlabel=1]
SubTool -> Translation [label=":subtool/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
SubToolVariable [label="Subtool-Variable
|{ :bp/uuid | string }
|{ :subtool-variable/io | keyword }
|{ :subtool-variable/order | long }
|{ :subtool-variable/cpp-namespace-uuid | string }
|{ :subtool-variable/cpp-mclass | string }
|{ :subtool-variable/cpp-function-uuid | string }
"]
SubToolVariable -> HelpPage [label=":subtool-variable/help-key" taillabel=1 headlabel=1]
SubToolVariable -> Translation [label=":subtool-variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Variable [label="Variable
|{ :bp/uuid | string }
|{ :variable/name | string }
|{ :variable/bp6-label | string }
|{ :variable/bp6-code | string }
|{ :variable/kind | keyword}
|{ :variable/native-decimals | double }
|{ :variable/english-decimals | double }
|{ :variable/metric-decimals | double }
|{ :variable/maximum | double }
|{ :variable/minimum | double }
|{ :variable/default-value | double }
|{ :variable/map-units-convertible? | boolean }
"]
Variable -> GroupVariable [label=":variable/group-variables" taillabel=1 headlabel=N]
Variable -> SubToolVariable [label=":variable/subtool-variables" taillabel=1 headlabel=N]
Variable -> List [label=":variable/list" taillabel=1 headlabel=1]
Variable -> Domain [label=":variable/domain-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/native-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/english-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/metric-unit-uuid" taillabel=1 headlabel=1]
Variable -> Translation [label=":variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
List [label="List
|{ :bp/uuid | string }
|{ :list/name | string }
"]
List -> ListOption [label=":list/options" taillabel=1 headlabel=N]
List -> Translation [label=":list/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ListOption [label="List-Option
|{ :bp/uuid | string }
|{ :list-option/name | string }
|{ :list-option/default | string }
|{ :list-option/value | string }
|{ :list-option/order | long }
|{ :list-option/hide? | boolean }
"]
ListOption -> Translation [label=":list-option/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Dimension [label="Dimension
|{ :bp/uuid | string }
|{ :dimension/name | string }
|{ :dimension/cpp-enum-uuid | string }
"]
Dimension -> Unit [label=":dimension/units" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Unit [label="Unit
|{ :bp/uuid | string }
|{ :unit/name | string }
|{ :unit/short-code | string }
|{ :unit/system | string }
|{ :unit/cpp-enum-member-uuid | string }
"]
//----------------------------------------------------------------------------------------------
DomainSet [label="Domain-Set
|{ :bp/uuid | string }
|{ :domain-set/name | string }
"]
DomainSet -> Domain [label=":domain-set/domains" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Domain [label="Domain
|{ :bp/uuid | string }
|{ :domain/name | string }
|{ :domain/decimals | string }
"]
Domain -> Dimension [label=":domain/dimension-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/native-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/english-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/metric-unit-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Conditional [label="Conditional
|{ :bp/uuid | string }
|{ :conditional/type | keyword }
|{ :conditional/operator | keyword }
|{ :conditional/values | string }
"]
Conditional -> GroupVariable [label=":conditional/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Diagram [label="Diagram
|{ :bp/uuid | keyword }
|{ :diagram/type | string }
"]
Diagram -> GroupVariable [label=":diagram/group-variable" taillabel=1 headlabel=1]
Diagram -> GroupVariable [label=":diagram/input-group-variables" taillabel=1 headlabel=N]
Diagram -> GroupVariable [label=":diagram/output-group-variables" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Language [label="Language
|{ :bp/uuid | keyword }
|{ :language/name | string }
|{ :language/short-code | string }
"]
Language -> Translation [label=":language/translation" taillabel=1 headlabel=1]
Language -> HelpPage [label=":language/help-page" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Translation [label="Translation
|{ :bp/uuid | keyword }
|{ :translation/name | string }
|{ :translation/key | string }
|{ :translation/translation | string }
"]
//----------------------------------------------------------------------------------------------
HelpPage [label="Help-page
|{ :bp/uuid | keyword }
|{ :help-page/key | string }
|{ :help-page/content | string }
"]
//----------------------------------------------------------------------------------------------
Link [label="Link
|{ :bp/uuid | keyword }
"]
Link -> GroupVariable [label="link/source" taillabel=1 headlabel=1]
Link -> GroupVariable [label="link/destination" taillabel=1 headlabel=1]
}
This schema is used to store instances of worksheet information in the Behave application.
// Relations (NOTE when a relation attribute of type :db/type/string instead of type :db.type/ref, this means the value is a UUID that matches the :bp/uuid of the related entity.)
digraph GitHub {
graph [rankdir = "LR"]
node [shape = record]
//----------------------------------------------------------------------------------------------
// Worksheet Schema Starts Here
//----------------------------------------------------------------------------------------------
Worksheet [label="Worksheet
|{ :bp/uuid | string }
|{ :worksheet/run-description | string }
|{ :worksheet/name | string }
|{ :worksheet/created | long }
|{ :worksheet/furthest-visited-step | keyword }
|{ :worksheet/modules | keywords }
"]
Worksheet -> Note [label=":worksheet/notes" taillabel=1 headlabel=N]
Worksheet -> InputGroup [label=":worksheet/input-groups" taillabel=1 headlabel=N]
Worksheet -> RepeatGroup [label=":worksheet/repeat-groups" taillabel=1 headlabel=N]
Worksheet -> Output [label=":worksheet/outputs" taillabel=1 headlabel=N]
Worksheet -> ResultTable [label=":worksheet/result-table" taillabel=1 headlabel=1]
Worksheet -> GraphSettings [label=":worksheet/graph-settings" taillabel=1 headlabel=1]
Worksheet -> TableSettings [label=":worksheet/table-settings" taillabel=1 headlabel=1]
Worksheet -> WorksheetDiagram [label=":worksheet/diagrams" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Note [label="Note
|{ :bp/uuid | string }
|{ :note/name | string }
|{ :note/content | string }
|{ :note/submodule | string }
"]
//----------------------------------------------------------------------------------------------
InputGroup [label="Input-Group
|{ :bp/uuid | string }
|{ :input-group/repeat-id | long }
|{ :input-group/inputs | long }
"]
InputGroup -> Group [label=":input-group/group-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
RepeatGroup [label="Repeat-Group
|{ :bp/uuid | string }
|{ :repeat-group/group-uuid | string }
|{ :repeat-group/repeats | long }
|{ :repeat-group/inputs | long }
"]
RepeatGroup -> Group [label=":repeat-group/group-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Output [label="Output
|{ :bp/uuid | string }
|{ :output/enabled? | boolean }
"]
Output -> GroupVariable [label=":output/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ResultTable [label="Result-Table
|{ :bp/uuid | string }
"]
ResultTable -> ResultHeader [label=":result-table/headers" taillabel=1 headlabel=N]
ResultTable -> ResultRow [label=":result-table/rows" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
ResultHeader [label="Result-Header
|{ :bp/uuid | string }
|{ :result-header/repeat-id | long }
|{ :result-header/order | long }
|{ :result-header/units | string }
"]
ResultHeader -> GroupVariable [label=":result-header/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ResultRow [label="Result-Row
|{ :bp/uuid | string }
|{ :result-row/id | long }
"]
ResultRow -> ResultCell [label=":result-row/cells" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
ResultCell [label="Result-Cell
|{ :bp/uuid | string }
|{ :result-cell/value | string }
"]
ResultCell -> ResultHeader [label=":result-cell/header" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
TableSettings [label="Table-Settings
|{ :bp/uuid | string }
|{ :table-settings/enabled? | boolean }
"]
TableSettings -> TableFilter [label=":table-settings/filters" taillabel=1 headlabel=N]
TableSettings -> MapUnitsSettings [label=":table-settings/map-units-settings" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
TableFilter [label="Table-Filter
|{ :bp/uuid | string }
|{ :table-filter/min | long }
|{ :table-filter/max | long }
|{ :table-filter/enabled? | boolean }
"]
TableFilter -> GroupVariable [label=":table-filter/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
MapUnitsSettings [label="Map-Units-settings
|{ :bp/uuid | string }
|{ :map-units-settings/enabled? | boolean }
|{ :map-units-settings/units | string }
|{ :map-units-settings/map-rep-fraction | long }
"]
//----------------------------------------------------------------------------------------------
GraphSettings [label="Graph-Settings
|{ :bp/uuid | string }
|{ :graph-settings/enabled? | boolean }
"]
GraphSettings -> YAxisLimit [label=":graph-settings/y-axis-limits" taillabel=1 headlabel=N]
GraphSettings -> GroupVariable [label=":graph-settings/x-axis-group-variable-uuid" taillabel=1 headlabel=1]
GraphSettings -> GroupVariable [label=":graph-settings/z-axis-group-variable-uuid" taillabel=1 headlabel=1]
GraphSettings -> GroupVariable [label=":graph-settings/z2-axis-group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
YAxisLimit [label="Y-Axis-Limit
|{ :bp/uuid | string }
|{ :y-axis-limit/min | long }
|{ :y-axis-limit/max | long }
"]
YAxisLimit -> GroupVariable [label=":y-axis-limit/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
WorksheetDiagram [label="Worksheet-diagram
|{ :bp/uuid | string }
|{ :worksheet.diagram/title | string }
|{ :worksheet.diagram/row-id | long }
"]
WorksheetDiagram -> GroupVariable [label=":worksheet.diagram/group-variable-uuid" taillabel=1 headlabel=1]
WorksheetDiagram -> Ellipse [label=":worksheet.diagram/ellises" taillabel=1 headlabel=N]
WorksheetDiagram -> Arrow [label=":worksheet.diagram/arrows" taillabel=1 headlabel=N]
WorksheetDiagram -> ScatterPlot [label=":worksheet.diagram/scatter-plots" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Ellipse [label="Ellipse
|{ :bp/uuid | string }
|{ :ellipse/legend-id | string }
|{ :ellipse/semi-major-axis | double }
|{ :ellipse/semi-minor-axis | double }
|{ :ellipse/rotation | long }
|{ :ellipse/color | string }
"]
//----------------------------------------------------------------------------------------------
Arrow [label="Arrow
|{ :bp/uuid | string }
|{ :arrow/legend-id | string }
|{ :arrow/length | double }
|{ :arrow/rotation | double }
|{ :arrow/color | string }
|{ :arrow/dashed? | string }
"]
//----------------------------------------------------------------------------------------------
ScatterPlot [label="Scatter-Plot
|{ :bp/uuid | string }
|{ :scatter-plot/legend-id | string }
|{ :scatter-plot/color | string }
|{ :scatter-plot/x-coordinates | string }
|{ :scatter-plot/y-coordinates | string }
"]
}
This Documents the schema for both the behave and behave_cms project.
// Relations (NOTE when a relation attribute of type :db/type/string instead of type :db.type/ref, this means the value is a UUID that matches the :bp/uuid of the related entity.)
digraph GitHub {
graph [rankdir = "LR"]
node [shape = record]
//----------------------------------------------------------------------------------------------
// VMS Schema Starts Here
//----------------------------------------------------------------------------------------------
User [label="User
|{ :bp/uuid | string }
|{ :user/name | string }
|{ :user/email | string }
|{ :user/password | string }
|{ :user/reset-key | string }
|{ :user/verified? | boolean }
|{ :user/super-admin? | boolean }
|{ :user/help-key | string }
"]
//----------------------------------------------------------------------------------------------
Application [label="Application
|{ :bp/uuid | string }
|{ :application/name | string }
|{ :application/version-major | number }
|{ :application/version-minor | number }
|{ :application/version-patch | number }
|{ :application/version | tuple }
|{ :application/help-key | string }
"]
Application -> Module [label=":application/modules" taillabel=1 headlabel=N]
Application -> Tool [label=":application/tools" taillabel=1 headlabel=N]
Application -> HelpPage [label=":application/help-key" taillabel=1 headlabel=1]
Application -> Translation [label=":application/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Module [label="Module
|{ :bp/uuid | string }
|{ :module/name | string }
|{ :module/order | number }
"]
Module -> Submodule [label=":module/submodules" taillabel=1 headlabel=N]
Module -> Diagram [label=":module/diagram" taillabel=1 headlabel=N]
Module -> HelpPage [label=":module/help-key" taillabel=1 headlabel=1]
Module -> Translation [label=":module/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Submodule [label="Submodule
|{ :bp/uuid | string }
|{ :submodule/name | string }
|{ :submodule/order | number }
|{ :submodule/io | keyword }
|{ :submodule/research? | boolean }
|{ :submodule/conditionals-operator | keyword }
"]
Submodule -> Group [label=":submodule/groups" taillabel=1 headlabel=N]
Submodule -> Conditional [label=":submodule/conditionals" taillabel=1 headlabel=N]
Submodule -> HelpPage [label=":submodule/help-key" taillabel=1 headlabel=1]
Submodule -> Translation [label=":submodule/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Group [label="Group
|{ :bp/uuid | string }
|{ :group/name | string }
|{ :group/order | long }
|{ :group/io | keyword }
|{ :group/research? | boolean }
|{ :group/repeat? | boolean }
|{ :group/max-repeat | long }
|{ :group/conditionals-operator | keyword }
"]
Group -> Group [label=":group/children" taillabel=1 headlabel=1]
Group -> Conditional [label=":group/conditionals" taillabel=1 headlabel=N]
Group -> GroupVariable [label=":group/group-variables" taillabel=1 headlabel=N]
Group -> HelpPage [label=":group/help-key" taillabel=1 headlabel=1]
Group -> Translation [label=":group/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
GroupVariable [label="Group-Variable
|{ :bp/uuid | string }
|{ :group-variable/cpp-class | string }
|{ :group-variable/cpp-function | string }
|{ :group-variable/cpp-namespace | string }
|{ :group-variable/cpp-parameter | string }
|{ :group-variable/order | long}
|{ :group-variable/research? | boolean }
"]
GroupVariable -> CppClass [label=":group-variable/cpp-class (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppFunction [label=":group-variable/cpp-function (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppNamespace [label=":group-variable/cpp-namespace (uuid)" taillabel=1 headlabel=1]
GroupVariable -> CppParameter [label=":group-variable/cpp-parameter (uuid)" taillabel=1 headlabel=1]
GroupVariable -> HelpPage [label=":group-variable/help-key" taillabel=1 headlabel=1]
GroupVariable -> Translation [label=":group-variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
CppClass [label="Cpp.Class
|{ :bp/uuid | string }
|{ :cpp.class/name | string }
"]
CppClass -> CppFunction [label=":cpp.class/function" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppFunction [label="Cpp.Function
|{ :bp/uuid | string }
|{ :cpp.function/name | string }
|{ :cpp.function/return-type | stringema}
"]
CppFunction -> CppParameter [label=":cpp.function/parameter" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppParameter [label="Cpp.Parameter
|{ :bp/uuid | string }
|{ :cpp.parameter/name | string }
|{ :cpp.parameter/order | number }
|{ :cpp.parameter/type | string }
"]
//----------------------------------------------------------------------------------------------
CppNamespace [label="Cpp.Namespace
|{ :bp/uuid | string }
|{ :cpp.namespace/name | string }
"]
CppNamespace -> CppClass [label=":cpp.namespace/class" taillabel=1 headlabel=N]
CppNamespace -> CppEnum [label=":cpp.namespace/enum" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppEnum [label="Cpp.Enum
|{ :bp/uuid | string }
|{ :cpp.enum/name | string }
"]
CppEnum -> CppEnumMember [label=":cpp.enum/enum-member" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
CppEnumMember [label="Cpp.Enum-member
|{ :bp/uuid | string }
|{ :cpp.enum-member/name | string }
|{ :cpp.enum-member/value | number }
"]
//----------------------------------------------------------------------------------------------
Tool [label="Tools
|{ :bp/uuid | string }
|{ :tool/name | string }
|{ :tool/order | number }
"]
Tool -> SubTool [label=":tool/subtools" taillabel=1 headlabel=N]
Tool -> HelpPage [label=":tool/help-key" taillabel=1 headlabel=1]
Tool -> Translation [label=":tool/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
SubTool [label="Subtool
|{ :bp/uuid | string }
|{ :subtool/name | string }
|{ :subtool/order | number }
|{ :subtool/autocompute? | boolean }
"]
SubTool -> SubToolVariable [label=":subtool/variables" taillabel=1 headlabel=N]
SubTool -> HelpPage [label=":subtool/help-key" taillabel=1 headlabel=1]
SubTool -> Translation [label=":subtool/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
SubToolVariable [label="Subtool-Variable
|{ :bp/uuid | string }
|{ :subtool-variable/io | keyword }
|{ :subtool-variable/order | long }
|{ :subtool-variable/cpp-namespace-uuid | string }
|{ :subtool-variable/cpp-mclass | string }
|{ :subtool-variable/cpp-function-uuid | string }
"]
SubToolVariable -> HelpPage [label=":subtool-variable/help-key" taillabel=1 headlabel=1]
SubToolVariable -> Translation [label=":subtool-variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Variable [label="Variable
|{ :bp/uuid | string }
|{ :variable/name | string }
|{ :variable/bp6-label | string }
|{ :variable/bp6-code | string }
|{ :variable/kind | keyword}
|{ :variable/native-decimals | double }
|{ :variable/english-decimals | double }
|{ :variable/metric-decimals | double }
|{ :variable/maximum | double }
|{ :variable/minimum | double }
|{ :variable/default-value | double }
|{ :variable/map-units-convertible? | boolean }
"]
Variable -> GroupVariable [label=":variable/group-variables" taillabel=1 headlabel=N]
Variable -> SubToolVariable [label=":variable/subtool-variables" taillabel=1 headlabel=N]
Variable -> List [label=":variable/list" taillabel=1 headlabel=1]
Variable -> Domain [label=":variable/domain-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/native-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/english-unit-uuid" taillabel=1 headlabel=1]
Variable -> Unit [label=":variable/metric-unit-uuid" taillabel=1 headlabel=1]
Variable -> Translation [label=":variable/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
List [label="List
|{ :bp/uuid | string }
|{ :list/name | string }
"]
List -> ListOption [label=":list/options" taillabel=1 headlabel=N]
List -> Translation [label=":list/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ListOption [label="List-Option
|{ :bp/uuid | string }
|{ :list-option/name | string }
|{ :list-option/default | string }
|{ :list-option/value | string }
|{ :list-option/order | long }
|{ :list-option/hide? | boolean }
"]
ListOption -> Translation [label=":list-option/translation-key" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Dimension [label="Dimension
|{ :bp/uuid | string }
|{ :dimension/name | string }
|{ :dimension/cpp-enum-uuid | string }
"]
Dimension -> Unit [label=":dimension/units" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Unit [label="Unit
|{ :bp/uuid | string }
|{ :unit/name | string }
|{ :unit/short-code | string }
|{ :unit/system | string }
|{ :unit/cpp-enum-member-uuid | string }
"]
//----------------------------------------------------------------------------------------------
DomainSet [label="Domain-Set
|{ :bp/uuid | string }
|{ :domain-set/name | string }
"]
DomainSet -> Domain [label=":domain-set/domains" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Domain [label="Domain
|{ :bp/uuid | string }
|{ :domain/name | string }
|{ :domain/decimals | string }
"]
Domain -> Dimension [label=":domain/dimension-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/native-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/english-unit-uuid" taillabel=1 headlabel=1]
Domain -> Unit [label=":domain/metric-unit-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Conditional [label="Conditional
|{ :bp/uuid | string }
|{ :conditional/type | keyword }
|{ :conditional/operator | keyword }
|{ :conditional/values | string }
"]
Conditional -> GroupVariable [label=":conditional/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Diagram [label="Diagram
|{ :bp/uuid | keyword }
|{ :diagram/type | string }
"]
Diagram -> GroupVariable [label=":diagram/group-variable" taillabel=1 headlabel=1]
Diagram -> GroupVariable [label=":diagram/input-group-variables" taillabel=1 headlabel=N]
Diagram -> GroupVariable [label=":diagram/output-group-variables" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Language [label="Language
|{ :bp/uuid | keyword }
|{ :language/name | string }
|{ :language/short-code | string }
"]
Language -> Translation [label=":language/translation" taillabel=1 headlabel=1]
Language -> HelpPage [label=":language/help-page" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Translation [label="Translation
|{ :bp/uuid | keyword }
|{ :translation/name | string }
|{ :translation/key | string }
|{ :translation/translation | string }
"]
//----------------------------------------------------------------------------------------------
HelpPage [label="Help-page
|{ :bp/uuid | keyword }
|{ :help-page/key | string }
|{ :help-page/content | string }
"]
//----------------------------------------------------------------------------------------------
Link [label="Link
|{ :bp/uuid | keyword }
"]
Link -> GroupVariable [label="link/source" taillabel=1 headlabel=1]
Link -> GroupVariable [label="link/destination" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
// Worksheet Schema Starts Here
//----------------------------------------------------------------------------------------------
Worksheet [label="Worksheet
|{ :bp/uuid | string }
|{ :worksheet/run-description | string }
|{ :worksheet/name | string }
|{ :worksheet/created | long }
|{ :worksheet/furthest-visited-step | keyword }
|{ :worksheet/modules | keywords }
"]
Worksheet -> Note [label=":worksheet/notes" taillabel=1 headlabel=N]
Worksheet -> InputGroup [label=":worksheet/input-groups" taillabel=1 headlabel=N]
Worksheet -> RepeatGroup [label=":worksheet/repeat-groups" taillabel=1 headlabel=N]
Worksheet -> Output [label=":worksheet/outputs" taillabel=1 headlabel=N]
Worksheet -> ResultTable [label=":worksheet/result-table" taillabel=1 headlabel=1]
Worksheet -> GraphSettings [label=":worksheet/graph-settings" taillabel=1 headlabel=1]
Worksheet -> TableSettings [label=":worksheet/table-settings" taillabel=1 headlabel=1]
Worksheet -> WorksheetDiagram [label=":worksheet/diagrams" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Note [label="Note
|{ :bp/uuid | string }
|{ :note/name | string }
|{ :note/content | string }
|{ :note/submodule | string }
"]
//----------------------------------------------------------------------------------------------
InputGroup [label="Input-Group
|{ :bp/uuid | string }
|{ :input-group/repeat-id | long }
|{ :input-group/inputs | long }
"]
InputGroup -> Group [label=":input-group/group-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
RepeatGroup [label="Repeat-Group
|{ :bp/uuid | string }
|{ :repeat-group/group-uuid | string }
|{ :repeat-group/repeats | long }
|{ :repeat-group/inputs | long }
"]
RepeatGroup -> Group [label=":repeat-group/group-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
Output [label="Output
|{ :bp/uuid | string }
|{ :output/enabled? | boolean }
"]
Output -> GroupVariable [label=":output/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ResultTable [label="Result-Table
|{ :bp/uuid | string }
"]
ResultTable -> ResultHeader [label=":result-table/headers" taillabel=1 headlabel=N]
ResultTable -> ResultRow [label=":result-table/rows" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
ResultHeader [label="Result-Header
|{ :bp/uuid | string }
|{ :result-header/repeat-id | long }
|{ :result-header/order | long }
|{ :result-header/units | string }
"]
ResultHeader -> GroupVariable [label=":result-header/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
ResultRow [label="Result-Row
|{ :bp/uuid | string }
|{ :result-row/id | long }
"]
ResultRow -> ResultCell [label=":result-row/cells" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
ResultCell [label="Result-Cell
|{ :bp/uuid | string }
|{ :result-cell/value | string }
"]
ResultCell -> ResultHeader [label=":result-cell/header" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
TableSettings [label="Table-Settings
|{ :bp/uuid | string }
|{ :table-settings/enabled? | boolean }
"]
TableSettings -> TableFilter [label=":table-settings/filters" taillabel=1 headlabel=N]
TableSettings -> MapUnitsSettings [label=":table-settings/map-units-settings" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
TableFilter [label="Table-Filter
|{ :bp/uuid | string }
|{ :table-filter/min | long }
|{ :table-filter/max | long }
|{ :table-filter/enabled? | boolean }
"]
TableFilter -> GroupVariable [label=":table-filter/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
MapUnitsSettings [label="Map-Units-settings
|{ :bp/uuid | string }
|{ :map-units-settings/enabled? | boolean }
|{ :map-units-settings/units | string }
|{ :map-units-settings/map-rep-fraction | long }
"]
//----------------------------------------------------------------------------------------------
GraphSettings [label="Graph-Settings
|{ :bp/uuid | string }
|{ :graph-settings/enabled? | boolean }
"]
GraphSettings -> YAxisLimit [label=":graph-settings/y-axis-limits" taillabel=1 headlabel=N]
GraphSettings -> GroupVariable [label=":graph-settings/x-axis-group-variable-uuid" taillabel=1 headlabel=1]
GraphSettings -> GroupVariable [label=":graph-settings/z-axis-group-variable-uuid" taillabel=1 headlabel=1]
GraphSettings -> GroupVariable [label=":graph-settings/z2-axis-group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
YAxisLimit [label="Y-Axis-Limit
|{ :bp/uuid | string }
|{ :y-axis-limit/min | long }
|{ :y-axis-limit/max | long }
"]
YAxisLimit -> GroupVariable [label=":y-axis-limit/group-variable-uuid" taillabel=1 headlabel=1]
//----------------------------------------------------------------------------------------------
WorksheetDiagram [label="Worksheet-diagram
|{ :bp/uuid | string }
|{ :worksheet.diagram/title | string }
|{ :worksheet.diagram/row-id | long }
"]
WorksheetDiagram -> GroupVariable [label=":worksheet.diagram/group-variable-uuid" taillabel=1 headlabel=1]
WorksheetDiagram -> Ellipse [label=":worksheet.diagram/ellises" taillabel=1 headlabel=N]
WorksheetDiagram -> Arrow [label=":worksheet.diagram/arrows" taillabel=1 headlabel=N]
WorksheetDiagram -> ScatterPlot [label=":worksheet.diagram/scatter-plots" taillabel=1 headlabel=N]
//----------------------------------------------------------------------------------------------
Ellipse [label="Ellipse
|{ :bp/uuid | string }
|{ :ellipse/legend-id | string }
|{ :ellipse/semi-major-axis | double }
|{ :ellipse/semi-minor-axis | double }
|{ :ellipse/rotation | long }
|{ :ellipse/color | string }
"]
//----------------------------------------------------------------------------------------------
Arrow [label="Arrow
|{ :bp/uuid | string }
|{ :arrow/legend-id | string }
|{ :arrow/length | double }
|{ :arrow/rotation | double }
|{ :arrow/color | string }
|{ :arrow/dashed? | string }
"]
//----------------------------------------------------------------------------------------------
ScatterPlot [label="Scatter-Plot
|{ :bp/uuid | string }
|{ :scatter-plot/legend-id | string }
|{ :scatter-plot/color | string }
|{ :scatter-plot/x-coordinates | string }
|{ :scatter-plot/y-coordinates | string }
"]
}