From 2e910e5338d472c920eafb31503e1af5785a468f Mon Sep 17 00:00:00 2001 From: Laurence Isla Date: Fri, 14 Jun 2024 18:41:00 -0500 Subject: [PATCH] docs: improve architecture diagram - SVG format instead of PNG - The components now have links to their reference in the Docs - Supports dark mode --- docs/_diagrams/README.md | 13 ++++++++++++ docs/_diagrams/arch-dark.uml | 3 +++ docs/_diagrams/arch.uml | 28 ++++++++++++++++++------- docs/_static/arch-dark.svg | 1 + docs/_static/arch.png | Bin 56366 -> 0 bytes docs/_static/arch.svg | 1 + docs/explanations/architecture.rst | 17 ++++++++++++++- docs/explanations/schema_isolation.rst | 4 ---- nix/tools/docs.nix | 3 ++- 9 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 docs/_diagrams/arch-dark.uml create mode 100644 docs/_static/arch-dark.svg delete mode 100644 docs/_static/arch.png create mode 100644 docs/_static/arch.svg diff --git a/docs/_diagrams/README.md b/docs/_diagrams/README.md index 90be8f2e6..bb121daa7 100644 --- a/docs/_diagrams/README.md +++ b/docs/_diagrams/README.md @@ -37,3 +37,16 @@ zathura db.pdf & # live reload with entr echo db.tex | entr pdflatex --shell-escape -halt-on-error db.tex ``` + +## UML + +The UML diagrams are created with https://plantuml.com/. + +PlantUML only creates one diagram per file. +That's why we need to create another one for dark mode. +For example, for the file [arch.uml](./arch.uml) there's [arch-dark](./arch-dark.uml) which includes the first one: + +```bash +plantuml -tsvg arch.uml -o ../_static +plantuml -tsvg -darkmode arch-dark.uml -o ../_static +``` diff --git a/docs/_diagrams/arch-dark.uml b/docs/_diagrams/arch-dark.uml new file mode 100644 index 000000000..6cc420d2e --- /dev/null +++ b/docs/_diagrams/arch-dark.uml @@ -0,0 +1,3 @@ +@startuml +!include arch.uml +@enduml diff --git a/docs/_diagrams/arch.uml b/docs/_diagrams/arch.uml index a1d3482e7..d61a1a82e 100644 --- a/docs/_diagrams/arch.uml +++ b/docs/_diagrams/arch.uml @@ -1,5 +1,7 @@ @startuml +skinparam backgroundColor transparent + package "PostgREST" { () HTTP as HTTPAPI HTTPAPI - [Auth] @@ -14,11 +16,9 @@ package "PostgREST" { [Admin] -r- () HTTPADMIN [Config] -l- () CLI - [Config] <-l~ Listener + [Config] <-r~ Listener HTTPADMIN -[hidden]r- CLI - Listener -[hidden]r- [Schema Cache] - Listener -[hidden]r- [Config] [Schema Cache] -l[hidden]- [Config] [Schema Cache] -l[hidden]- [Admin] [Schema Cache] -l[hidden]- CLI @@ -26,16 +26,16 @@ package "PostgREST" { database "PostgreSQL" { - node "API schema" as API { - rectangle "Functions, Views" - } node Authorization { rectangle "Roles, GRANT, RLS" } + node "API schema" as API { + rectangle "Functions, Views" + } rectangle "Tables, extensions" as tbs API -d- tbs - API -[hidden]l- Authorization + API -l[hidden]- Authorization } :user: @@ -67,4 +67,18 @@ end note note top of Listener LISTEN session end note + +url of Admin is [[../references/admin_server.html#admin-server]] +url of API is [[../explanations/schema_isolation.html]] +url of Auth is [[../references/auth.html#authn]] +url of Authorization is [[../explanations/db_authz.html]] +url of CLI is [[../references/cli.html#cli]] +url of "Connection Pool" is [[../references/connection_pool.html]] +url of Config is [[../references/configuration.html#configuration]] +url of HTTPADMIN is [[https://aosabook.org/en/posa/warp.html]] +url of HTTPAPI is [[https://aosabook.org/en/posa/warp.html]] +url of Listener is [[../references/listener.html#listener]] +url of Proxy is [[../explanations/nginx.html]] +url of "Schema Cache" is [[../references/schema_cache.html#schema-cache]] + @enduml diff --git a/docs/_static/arch-dark.svg b/docs/_static/arch-dark.svg new file mode 100644 index 000000000..31c19df5e --- /dev/null +++ b/docs/_static/arch-dark.svg @@ -0,0 +1 @@ +PostgRESTPostgreSQLAuthorizationAPI schemaHTTPAuthApiRequestPlanQueryConnection PoolSchema CacheListenerHTTPAdminConfigCLITables, extensionsRoles, GRANT, RLSFunctions, ViewsuserProxyoperatordeveloperAuthenticates the user requestParses the URL syntaxGenerates the SQLLISTEN sessionusesreloads \ No newline at end of file diff --git a/docs/_static/arch.png b/docs/_static/arch.png deleted file mode 100644 index 89943ad1ff4784fc586a71764fcc830f461ca516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56366 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 diff --git a/docs/_static/arch.svg b/docs/_static/arch.svg new file mode 100644 index 000000000..b2005f268 --- /dev/null +++ b/docs/_static/arch.svg @@ -0,0 +1 @@ +PostgRESTPostgreSQLAuthorizationAPI schemaHTTPAuthApiRequestPlanQueryConnection PoolSchema CacheListenerHTTPAdminConfigCLITables, extensionsRoles, GRANT, RLSFunctions, ViewsuserProxyoperatordeveloperAuthenticates the user requestParses the URL syntaxGenerates the SQLLISTEN sessionusesreloads \ No newline at end of file diff --git a/docs/explanations/architecture.rst b/docs/explanations/architecture.rst index ea4775238..23a377518 100644 --- a/docs/explanations/architecture.rst +++ b/docs/explanations/architecture.rst @@ -6,7 +6,22 @@ This page describes the architecture of PostgREST. Bird's Eye View =============== -.. image:: ../_static/arch.png +You can click on the components to navigate to their respective documentation. + + .. container:: img-dark + + .. See https://github.com/sphinx-doc/sphinx/issues/2240#issuecomment-187366626 + + .. raw:: html + + + + .. container:: img-light + + .. raw:: html + + + Code Map ======== diff --git a/docs/explanations/schema_isolation.rst b/docs/explanations/schema_isolation.rst index 73cadb26b..6c8240108 100644 --- a/docs/explanations/schema_isolation.rst +++ b/docs/explanations/schema_isolation.rst @@ -1,7 +1,3 @@ -.. note:: - - This page is a work in progress. - .. _schema_isolation: Schema Isolation diff --git a/nix/tools/docs.nix b/nix/tools/docs.nix index f177c4f09..f4edfa393 100644 --- a/nix/tools/docs.nix +++ b/nix/tools/docs.nix @@ -90,7 +90,8 @@ let ${pdflatex}/bin/pdflatex -halt-on-error -output-directory="$tmpdir" db.tex ${imagemagick}/bin/convert -density 300 "$tmpdir/db.pdf" ../_static/db.png - ${plantuml}/bin/plantuml arch.uml -o ../_static + ${plantuml}/bin/plantuml -tsvg arch.uml -o ../_static + ${plantuml}/bin/plantuml -tsvg -darkmode arch-dark.uml -o ../_static ''; server =