diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/Makefile | 20 | ||||
-rw-r--r-- | doc/make.bat | 35 | ||||
-rw-r--r-- | doc/source/_static/arch_dark.png | bin | 0 -> 27346 bytes | |||
-rw-r--r-- | doc/source/_static/arch_dark.svg | 500 | ||||
-rw-r--r-- | doc/source/_static/arch_light.png | bin | 0 -> 17509 bytes | |||
-rw-r--r-- | doc/source/_static/arch_light.svg | 499 | ||||
-rw-r--r-- | doc/source/architecture.rst | 87 | ||||
-rw-r--r-- | doc/source/concepts.rst | 98 | ||||
-rw-r--r-- | doc/source/conf.py | 37 | ||||
-rw-r--r-- | doc/source/index.rst | 75 | ||||
-rw-r--r-- | doc/source/installation.rst | 43 |
11 files changed, 1394 insertions, 0 deletions
diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/doc/source/_static/arch_dark.png b/doc/source/_static/arch_dark.png Binary files differnew file mode 100644 index 0000000..b5ea1b3 --- /dev/null +++ b/doc/source/_static/arch_dark.png diff --git a/doc/source/_static/arch_dark.svg b/doc/source/_static/arch_dark.svg new file mode 100644 index 0000000..22de237 --- /dev/null +++ b/doc/source/_static/arch_dark.svg @@ -0,0 +1,500 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="226.45284mm" + height="347.16772mm" + viewBox="0 0 226.45283 347.16772" + version="1.1" + id="svg8" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="architecture.svg" + inkscape:export-filename="/home/matthias/projects/black_star/modules/bsfs/doc/source/_static/architecture.png" + inkscape:export-xdpi="36.581741" + inkscape:export-ydpi="36.581741" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker5768" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.6) translate(0,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round" + id="path5499" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow2Mend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Mend" + inkscape:isstock="true"> + <path + transform="scale(0.6) rotate(180) translate(0,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;" + id="path5502" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Send" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Send" + inkscape:isstock="true"> + <path + transform="scale(0.2) rotate(180) translate(6,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5490" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Mend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Mend" + inkscape:isstock="true"> + <path + transform="scale(0.4) rotate(180) translate(10,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5484" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Mstart" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(10,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5481" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path1226" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker2003" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path2001" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1943" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1941" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1883" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Send"> + <path + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1881" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:path-effect + effect="bspline" + id="path-effect1392" + is_visible="true" + weight="33.333333" + steps="2" + helper_size="0" + apply_no_weight="true" + apply_with_weight="true" + only_selected="false" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1104"> + <rect + ry="1.9402644e-06" + y="299.74707" + x="38.425957" + height="39.287846" + width="72.863937" + id="rect1106" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.99141636;stroke:#ab0000;stroke-width:1.50988853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + </clipPath> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.48410751" + inkscape:cx="549.46473" + inkscape:cy="378.01521" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:object-paths="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1920" + inkscape:window-height="1147" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(62.276606,-425.46216)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="32.604725" + y="629.79327" + id="text858"><tspan + sodipodi:role="line" + id="tspan856" + x="32.604725" + y="629.79327" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Graph</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="31.855417" + y="653.12" + id="text862"><tspan + sodipodi:role="line" + id="tspan860" + x="31.855417" + y="653.12" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Nodes</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="41.7075" + y="675.25732" + id="text866"><tspan + sodipodi:role="line" + id="tspan864" + x="41.7075" + y="675.25732" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">AC</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-6" + width="58.738262" + height="66.901787" + x="19.325045" + y="615.82233" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="26.010805" + y="742.52582" + id="text870"><tspan + sodipodi:role="line" + id="tspan868" + x="26.010805" + y="742.52582" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Backend</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-7" + width="58.738262" + height="66.901787" + x="19.325045" + y="705.22809" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="38.606937" + y="541.41333" + id="text874"><tspan + sodipodi:role="line" + id="tspan872" + x="38.606937" + y="541.41333" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">App</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="40.692081" + y="563.71997" + id="text878"><tspan + sodipodi:role="line" + id="tspan876" + x="40.692081" + y="563.71997" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Lib</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-9" + width="58.738262" + height="66.901787" + x="19.325045" + y="526.41656" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="31.886417" + y="585.92139" + id="text882"><tspan + sodipodi:role="line" + id="tspan880" + x="31.886417" + y="585.92139" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Config</tspan></text> + <rect + transform="rotate(-90)" + y="-34.720181" + x="-772.12939" + height="14.9375" + width="230.69272" + id="rect815" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="rotate(-90)" + id="text819" + y="-23.857788" + x="-677.57135" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1" + y="-23.857788" + x="-677.57135" + id="tspan817" + sodipodi:role="line">Query AST</tspan></text> + <rect + transform="rotate(-90)" + y="-61.77615" + x="-772.12897" + height="15.004211" + width="230.69226" + id="rect815-3" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:1.00091;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="rotate(-90)" + id="text819-6" + y="-50.361935" + x="-670.42908" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1" + y="-50.361935" + x="-670.42908" + id="tspan817-7" + sodipodi:role="line">Schema</tspan></text> + <rect + transform="rotate(-90)" + y="-7.7468448" + x="-772.1449" + height="15.036049" + width="230.70819" + id="rect815-3-7" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:0.969072;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="matrix(0,-0.96614119,1.0350454,0,0,0)" + id="text819-6-5" + y="3.5665975" + x="-691.72668" + style="font-style:normal;font-weight:normal;font-size:10.2467px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.256167" + xml:space="preserve"><tspan + style="stroke-width:0.256167;fill:#c5c9c7;fill-opacity:1" + y="3.5665975" + x="-691.72668" + id="tspan817-7-9" + sodipodi:role="line">Utils</tspan></text> + <g + id="g1066-2" + transform="translate(79.507472,180.86615)" /> + <path + style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,771.63946 c 23.866256,0 0,-33.21047 23.866256,-33.21047 -23.866256,0 0,-33.2105 -23.866256,-33.2105" + id="path1406-3-2-6" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.08542" + y="563.90021" + id="text1481"><tspan + sodipodi:role="line" + id="tspan1479" + x="128.08542" + y="563.90021" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Front</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.52983" + y="653.37573" + id="text1481-1"><tspan + sodipodi:role="line" + id="tspan1479-5" + x="128.52983" + y="653.37573" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Center</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.08542" + y="742.37445" + id="text1481-5"><tspan + sodipodi:role="line" + id="tspan1479-4" + x="128.08542" + y="742.37445" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Back</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-51.901089" + y="536.83838" + id="text1481-7"><tspan + sodipodi:role="line" + id="tspan1479-6" + x="-51.901089" + y="536.83838" + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1">Envelope</tspan></text> + <path + style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,682.73371 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105" + id="path1406-3-2-6-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <path + style="fill:none;stroke:#c5c9c7;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,593.32795 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105" + id="path1406-3-2-6-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <text + id="text1593" + y="491.35275" + x="-4.7864752" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#c5c9c7;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#c5c9c7;fill-opacity:1" + y="491.35275" + x="-4.7864752" + id="tspan1591" + sodipodi:role="line">Client</tspan></text> + <g + transform="translate(-64.429786,152.46769)" + style="stroke:#c5c9c7;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="g1110"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#c5c9c7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="path1089" + cx="75.138489" + cy="287.25885" + r="13.76438" /> + <ellipse + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#c5c9c7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="path1091" + cx="75.138489" + cy="352.85028" + rx="30.794813" + ry="49.827057" + clip-path="url(#clipPath1104)" /> + </g> + <path + style="mix-blend-mode:normal;fill:none;fill-opacity:0.101961;stroke:#c5c9c7;stroke-width:0.718;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5768);marker-end:url(#Arrow2Mend);paint-order:normal" + d="m -26.95943,522.5725 c 0,-0.24385 0.07083,-4.09079 0.07878,-4.32466 0.761115,-22.40679 37.602027,0.47268 37.602027,-22.88944 0,23.36145 36.838813,0.48396 37.601969,22.88752 0.008,0.23448 0.0397,4.10164 0.0397,4.34615" + id="path1406-3-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscsc" /> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#c5c9c7;stroke-width:0.96907479;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect815-3-7-7" + width="69.081276" + height="15.036072" + x="-61.792068" + y="526.40063" /> + </g> +</svg> diff --git a/doc/source/_static/arch_light.png b/doc/source/_static/arch_light.png Binary files differnew file mode 100644 index 0000000..c210ecf --- /dev/null +++ b/doc/source/_static/arch_light.png diff --git a/doc/source/_static/arch_light.svg b/doc/source/_static/arch_light.svg new file mode 100644 index 0000000..e93694c --- /dev/null +++ b/doc/source/_static/arch_light.svg @@ -0,0 +1,499 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="226.45284mm" + height="347.16772mm" + viewBox="0 0 226.45283 347.16772" + version="1.1" + id="svg8" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="arch_light.svg" + inkscape:export-filename="/home/matthias/projects/black_star/modules/bsfs/doc/source/_static/arch_light.png" + inkscape:export-xdpi="36.581741" + inkscape:export-ydpi="36.581741" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker5768" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.6) translate(0,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round" + id="path5499" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow2Mend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Mend" + inkscape:isstock="true"> + <path + transform="scale(0.6) rotate(180) translate(0,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;" + id="path5502" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Send" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Send" + inkscape:isstock="true"> + <path + transform="scale(0.2) rotate(180) translate(6,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5490" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Mend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Mend" + inkscape:isstock="true"> + <path + transform="scale(0.4) rotate(180) translate(10,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5484" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Mstart" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(10,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5481" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path1226" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker2003" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + id="path2001" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1943" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1941" + inkscape:connector-curvature="0" /> + </marker> + <marker + inkscape:isstock="true" + style="overflow:visible" + id="marker1883" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Send"> + <path + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1881" + inkscape:connector-curvature="0" /> + </marker> + <inkscape:path-effect + effect="bspline" + id="path-effect1392" + is_visible="true" + weight="33.333333" + steps="2" + helper_size="0" + apply_no_weight="true" + apply_with_weight="true" + only_selected="false" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath1104"> + <rect + ry="1.9402644e-06" + y="299.74707" + x="38.425957" + height="39.287846" + width="72.863937" + id="rect1106" + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.99141636;stroke:#ab0000;stroke-width:1.50988853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + </clipPath> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.48410751" + inkscape:cx="532.93947" + inkscape:cy="378.01521" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:object-paths="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1920" + inkscape:window-height="1147" + inkscape:window-x="0" + inkscape:window-y="29" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(62.276606,-425.46216)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="32.604725" + y="629.79327" + id="text858"><tspan + sodipodi:role="line" + id="tspan856" + x="32.604725" + y="629.79327" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Graph</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="31.855417" + y="653.12" + id="text862"><tspan + sodipodi:role="line" + id="tspan860" + x="31.855417" + y="653.12" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Nodes</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="41.7075" + y="675.25732" + id="text866"><tspan + sodipodi:role="line" + id="tspan864" + x="41.7075" + y="675.25732" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">AC</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-6" + width="58.738262" + height="66.901787" + x="19.325045" + y="615.82233" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="26.010805" + y="742.52582" + id="text870"><tspan + sodipodi:role="line" + id="tspan868" + x="26.010805" + y="742.52582" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Backend</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-7" + width="58.738262" + height="66.901787" + x="19.325045" + y="705.22809" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="38.606937" + y="541.41333" + id="text874"><tspan + sodipodi:role="line" + id="tspan872" + x="38.606937" + y="541.41333" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">App</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="40.692081" + y="563.71997" + id="text878"><tspan + sodipodi:role="line" + id="tspan876" + x="40.692081" + y="563.71997" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Lib</tspan></text> + <rect + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect854-9-9" + width="58.738262" + height="66.901787" + x="19.325045" + y="526.41656" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="31.886417" + y="585.92139" + id="text882"><tspan + sodipodi:role="line" + id="tspan880" + x="31.886417" + y="585.92139" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Config</tspan></text> + <rect + transform="rotate(-90)" + y="-34.720181" + x="-772.12939" + height="14.9375" + width="230.69272" + id="rect815" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="rotate(-90)" + id="text819" + y="-23.857788" + x="-677.57135" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#000000;fill-opacity:1" + y="-23.857788" + x="-677.57135" + id="tspan817" + sodipodi:role="line">Query AST</tspan></text> + <rect + transform="rotate(-90)" + y="-61.77615" + x="-772.12897" + height="15.004211" + width="230.69226" + id="rect815-3" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00091;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="rotate(-90)" + id="text819-6" + y="-50.361935" + x="-670.42908" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#000000;fill-opacity:1" + y="-50.361935" + x="-670.42908" + id="tspan817-7" + sodipodi:role="line">Schema</tspan></text> + <rect + transform="rotate(-90)" + y="-7.7468448" + x="-772.1449" + height="15.036049" + width="230.70819" + id="rect815-3-7" + style="vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.969072;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" /> + <text + transform="matrix(0,-0.96614119,1.0350454,0,0,0)" + id="text819-6-5" + y="3.5665975" + x="-691.72668" + style="font-style:normal;font-weight:normal;font-size:10.2467px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.256167" + xml:space="preserve"><tspan + style="stroke-width:0.256167;fill:#000000;fill-opacity:1" + y="3.5665975" + x="-691.72668" + id="tspan817-7-9" + sodipodi:role="line">Utils</tspan></text> + <g + id="g1066-2" + transform="translate(79.507472,180.86615)" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,771.63946 c 23.866256,0 0,-33.21047 23.866256,-33.21047 -23.866256,0 0,-33.2105 -23.866256,-33.2105" + id="path1406-3-2-6" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.08542" + y="563.90021" + id="text1481"><tspan + sodipodi:role="line" + id="tspan1479" + x="128.08542" + y="563.90021" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Front</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.52983" + y="653.37573" + id="text1481-1"><tspan + sodipodi:role="line" + id="tspan1479-5" + x="128.52983" + y="653.37573" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Center</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.08542" + y="742.37445" + id="text1481-5"><tspan + sodipodi:role="line" + id="tspan1479-4" + x="128.08542" + y="742.37445" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Back</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-51.901089" + y="536.83838" + id="text1481-7"><tspan + sodipodi:role="line" + id="tspan1479-6" + x="-51.901089" + y="536.83838" + style="stroke-width:0.264583;fill:#000000;fill-opacity:1">Envelope</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,682.73371 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105" + id="path1406-3-2-6-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.98072147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 97.390174,593.32795 c 23.866246,0 0,-33.21047 23.866246,-33.21047 -23.866246,0 0,-33.2105 -23.866246,-33.2105" + id="path1406-3-2-6-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <text + id="text1593" + y="491.35275" + x="-4.7864752" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + xml:space="preserve"><tspan + style="stroke-width:0.264583;fill:#000000;fill-opacity:1" + y="491.35275" + x="-4.7864752" + id="tspan1591" + sodipodi:role="line">Client</tspan></text> + <g + transform="translate(-64.429786,152.46769)" + style="stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="g1110"> + <circle + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="path1089" + cx="75.138489" + cy="287.25885" + r="13.76438" /> + <ellipse + style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.991416;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="path1091" + cx="75.138489" + cy="352.85028" + rx="30.794813" + ry="49.827057" + clip-path="url(#clipPath1104)" /> + </g> + <path + style="mix-blend-mode:normal;fill:none;fill-opacity:0.101961;stroke:#000000;stroke-width:0.718;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker5768);marker-end:url(#Arrow2Mend);paint-order:normal" + d="m -26.95943,522.5725 c 0,-0.24385 0.07083,-4.09079 0.07878,-4.32466 0.761115,-22.40679 37.602027,0.47268 37.602027,-22.88944 0,23.36145 36.838813,0.48396 37.601969,22.88752 0.008,0.23448 0.0397,4.10164 0.0397,4.34615" + id="path1406-3-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscsc" /> + <rect + style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.96907479;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" + id="rect815-3-7-7" + width="69.081276" + height="15.036072" + x="-61.792068" + y="526.40063" /> + </g> +</svg> diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst new file mode 100644 index 0000000..4cca49a --- /dev/null +++ b/doc/source/architecture.rst @@ -0,0 +1,87 @@ + +Architecture +============ + +The BSFS stack can be coarsely divided into four parts (see the image below). + +* Envelope: Essentials and utils used throughout the whole codebase. +* Front: End-user applications and APIs. +* Center: The core interfaces and functionality. +* Back: The triple store backends. + +Details of these components are given in the sections below. + + +.. image:: _static/arch_light.png + :class: only-light + +.. image:: _static/arch_dark.png + :class: only-dark + + +Envelope +-------- + +Most notably, the envelope covers the :class:`Schema <bsfs.schema.schema.Schema>` and the :mod:`Query syntax trees (AST) <bsfs.query.ast>`. +Both of them essential for all parts of the BSFS stack. +For example, the schema is specified by the user via the :func:`Migrate <bsfs.apps.migrate.main>` command, checked and extended by the :class:`Graph <bsfs.graph.graph.Graph>`, and ultimately stored by a :class:`Triple Store backend <bsfs.triple_store.base.TripleStoreBase>`. +Similarly, the Query AST may be provided by a caller and is translated to a database query by a backend. +In addition, the envelope also contains some classes to handle URIs: +:class:`URI <bsfs.utils.uri.URI>` defines the URI base class, +:class:`Namespace <bsfs.namespace.Namespace>` provides shortcuts to generate URIs, and +:mod:`UUID <bsfs.utils.uuid>` is used to generate unique URIs. + + +Front +----- + +The front consists of exposed interfaces such as end-user applications or APIs, +and all utils needed to offer this functionality. +See :mod:`bsfs.apps` and :mod:`bsfs.front`. + + +Center +------ + +The heart of BSFS is grouped around the :mod:`bsfs.graph` module. +These classes provide the interface to navigate and manipulate the file graph +in a safe and programmer friendly manner. +Some of them are indirectly exposed through the higher-level APIs. + +The two core design principles of BSFS are the focus on nodes and batch processing. +They are realized in the the Graph and Nodes classes. +The :class:`Graph class <bsfs.graph.graph.Graph>` manages the graph as a whole, +and offers methods to get a specific set of Nodes. +In turn, the :class:`Nodes class <bsfs.graph.nodes.Nodes>` represents such a set of nodes, +and performs operations on the whole node set at once. +Besides, the :mod:`bsfs.graph` module also comes with some syntactic sugar. + +Example:: + + # Open a file graph. + from bsfs import Open, ns + graph = Open(...) + # Get all nodes of type File. + nodes = graph.all(ns.bsfs.File) + # Set the author of all nodes at once. + nodes.set(ns.bse.author, 'Myself') + # Retrieve the author of all nodes at once. + set(nodes.get(ns.bse.author, node=False)) + # Same as above, but shorter. + set(nodes.comment(node=False)) + + +Back +---- + +There are various graph databases (e.g., `RDFLib`_, `Blazegraph`_, `Titan`_, etc.) +and it would be foolish to replicate the work that others have done. +Instead, we use third-party stores that take care of how to store and manage the data. +The :class:`Backend base class <bsfs.triple_store.base.TripleStoreBase>` defines the +interface to integrate any such third-party store to BSFS. +Besides storing the data, a triple store backend also need to track the current schema. + + +.. _RDFLib: https://rdflib.readthedocs.io/en/stable/index.html +.. _Blazegraph: https://blazegraph.com/ +.. _Titan: http://titan.thinkaurelius.com/ diff --git a/doc/source/concepts.rst b/doc/source/concepts.rst new file mode 100644 index 0000000..9c2ed43 --- /dev/null +++ b/doc/source/concepts.rst @@ -0,0 +1,98 @@ + +Core concepts +============= + +In the following, we present a few core concepts that should help in understanding the BSFS operations and codebase. + + +Graph storage +------------- + +`RDF`_ describes a network or graph like the file graph as a set of +*(subject, predicate, object)* triples. +*Subject* is the identifier of the source node, +*object* is the identifier of the target node (or a literal value), +and *predicate* is the type of relation between the source node and the target. +As suggested by `RDF`_, we use URIs to identify nodes and predicates. +For example, a triple that assigns me as the author of a file could look like this:: + + <http://example.com/file#1234> <https://bsfs.io/schema/Entity#author> <http://example.com/me> + +Note that alternatively, the *object* could also be a literal value ("me"):: + + <http://example.com/file#1234> <https://bsfs.io/schema/Entity#author> "me" + +There are a number of graph databases that support this or an analoguous paradigm, +such as `RDFLib`_, `Blazegraph`_, `TypeDB`_, `Titan`_, +and `many more <https://en.wikipedia.org/wiki/Graph_database#List_of_graph_databases>`_. +BSFS uses such a third-party graph database to store its file graph. + +As usual in database systems, +we have to distinguish schema data (that coverns the structure of the storage) +from instance data (the actual database content). +Similar to relational database systems, +both kinds of data can be represented as triples, +and subsequently stored within the same graph storage +(although one might need to separate them logically). +In BSFS, we employ an explicit schema (see next section) that is managed alongside the data. + + + +Schema +------ + +BSFS ensures consistency across multiple distributed client applications +by maintaining an explicit schema that governs node types and predicates. +Furthermore, exposing the schema allows client to run a number of compatibility and validity checks +locally, and a graph database may use the schema to optimize its storage or operations. + +In BSFS, the schema is initially provided by the system administrator +(usually in the `Turtle`_ format) +and subsequently stored by the backend. +The default schema defines three root types +(``bsfs:Node``, ``bsfs:Predicate``, and ``bsfs:Literal``), +and BSFS expects any node, literal, or predicate to be derived from these roots. + +For example, a new predicate can be defined like so:: + + # define some abbreviations + prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> + prefix bsfs: <http://schema.bsfs.io/> + prefix bse: <http://schema.bsfs.io/Entity#> + + # define a node type + bsfs:Entity rdfs:subClassOf bsfs:Node . + + # define a literal type + xsd:string rdfs:subClassOf bsfs:Literal . + + # define a predicate ("author of a node") + bse:author rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsfs:Entity ; + rdfs:range xsd:string . + +BSFS checks all requests and rejects queries or operations that violate the schema. + + +Querying +-------- + +BSFS at its core is not much more than a translator from a user query into a graph database query. +It operates directly on three abstract syntax trees (AST), +to run fetch, search, or sort, queries respectively. +By not using an existing query language, +we avoid an unnecessary and possibly expensive parsing step. +Some routines create an AST internally (e.g., :func:`bsfs.graph.graph.Graph.all`), +others accept an user-defined AST (e.g., :func:`bsfs.graph.graph.Graph.get`). +One way or another, the AST is validated against the schema, +and access control conditions are added. + + +.. _RDF: https://www.w3.org/RDF/ +.. _RDFLib: https://rdflib.readthedocs.io/en/stable/index.html +.. _Blazegraph: https://blazegraph.com/ +.. _Titan: http://titan.thinkaurelius.com/ +.. _TypeDB: https://vaticle.com/ +.. _Turtle: https://www.w3.org/TR/turtle/ + + diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 0000000..6de4993 --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,37 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'Black Star File System' +copyright = '2023, Matthias Baumgartner' +author = 'Matthias Baumgartner' +release = '0.5' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + 'sphinx_copybutton', + 'sphinx.ext.autodoc', + ] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'furo' +html_static_path = ['_static'] + +html_title = 'bsfs' +html_theme_options = { + 'announcement': '<em>This project is under heavy development and subject to rapid changes. Use at your own discretion.</em>', + } + diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 0000000..91d53f6 --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,75 @@ + +The Black Star File System +========================== + +A file system has two roles: It has to specify how to write files to a medium, and it has to define how a user can access files. +Most file systems focus on the first role and adopt the standard directory tree approach for the second role. +It is of course necessary to solve the challenges of medium access, but we should not neglect the user's perspective. +As a user, I mostly care about how how conveniently I can organize my data, and quickly I can access relevant information. +The hierarchical approach is rather restrictive in this regard: +You can only organize files in a directory tree [#f1]_, and search tasks often require third-party tools like `find`_ or `locate`_. + +Tagging file systems proposed an alternative file organization model. +Instead of a placing files in directories, they assign one or more (user-defined) tags to each file. +This increases the flexibility over a hierarchical data model, +because you can group any combination of files, and each file can be a part of various groups. +Semantic file systems push this idea one step further by trying to understand +the data they're dealing with. +For example, files can be grouped by their data type (documents), file format (odt), +author (yourself), topic (information management), etc. +The benefit for the user is that they can browse their files by association rather than by location --- similar to how we nagivate the Web. + +Clearly, the hierarchical approach is insufficient to organize this variety of information. +Instead, we need a network of files, +where they can be connected to each other, their properties, or to auxiliary nodes +(such as tags, collections, etc.) under a given relationship. +We call this the file graph. +With the *Black Star File System (BSFS)*, you can store, manage, and query such a file graph. + +.. + TODO: Clarify + * Different relationships + * Properties and auxiliary nodes + + TODO: File graph image + TODO: SFS/TFS references + + TODO: BSFS features + Within BSFS, you can store the file content, file metadata, + and content-derived information (e.g., features) alike. + + Within the file graph, we link files directly, + through properties, or through intermediate nodes. + +The Black Star File System is designed with three query patterns in mind: +navigation, search, and browsing. + +The **navigation** pattern describes the case when the user knows exactly what they want, +and they already have an address or id of the target file. +BSFS identifies each file with a unique URI, +or you can quickly navigate to a file via its name or other file properties. + +A **search** occurs when the user lacks the specific address or identifier to a target file, +but they have relatively clear and narrow search criteria. +With BSFS, you can search by file properties (name, size), content (keywords, features), +or associations to other files and auxiliary nodes (tags, collections). + +**Browsing** takes place when the user has only vague query criteria but wants to quickly scan and compare many files. +In BSFS, you can browse along file associations and rank results by a variety of similarity metrics. + +.. toctree:: + :maxdepth: 1 + + installation + concepts + architecture + api/modules + + +.. [#f1] although links and similar techniques allow some deviation from this principle + +.. _find: https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-find.html#Invoking-find + +.. _locate: https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-locate.html + + diff --git a/doc/source/installation.rst b/doc/source/installation.rst new file mode 100644 index 0000000..4316136 --- /dev/null +++ b/doc/source/installation.rst @@ -0,0 +1,43 @@ + +Installation +============ + +Install *BSFS* via pip:: + + pip install --extra-index-url https://pip.bsfs.io bsfs + +This installs the `bsfs` python package as well as the `bsfs.app` command. +It is recommended to install *bsfs* in a virtual environment (via `virtualenv`). + + +License +------- + +This project is released under the terms of the 3-clause BSD License. +By downloading or using the application you agree to the license's terms and conditions. + +.. literalinclude:: ../../LICENSE + + +Source +------ + +Check out our git repository:: + + git clone https://git.bsfs.io/bsfs.git + +You can further install *bsfs* via the ususal `setuptools <https://setuptools.pypa.io/en/latest/index.html>`_ commands from your bsfs source directory:: + + python setup.py develop + +For development, you also need to install some additional dependencies:: + + # code style discipline + pip install mypy coverage pylint + + # documentation + pip install sphinx sphinx-copybutton furo + + # packaging + pip install build + |