sirena 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/build_deploy.yml +59 -0
- data/.github/workflows/links.yml +85 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +27 -0
- data/.gitignore +68 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +70 -0
- data/ARCHITECTURE.md +744 -0
- data/Gemfile +12 -0
- data/LICENSE +25 -0
- data/README.adoc +357 -0
- data/Rakefile +11 -0
- data/docs/.gitignore +1 -0
- data/docs/Gemfile +13 -0
- data/docs/_config.yml +182 -0
- data/docs/_diagram_types/architecture-diagram.adoc +314 -0
- data/docs/_diagram_types/block-diagram.adoc +345 -0
- data/docs/_diagram_types/c4-diagram.adoc +559 -0
- data/docs/_diagram_types/class-diagram.adoc +816 -0
- data/docs/_diagram_types/er-diagram.adoc +719 -0
- data/docs/_diagram_types/error-diagram.adoc +114 -0
- data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
- data/docs/_diagram_types/flowchart.adoc +488 -0
- data/docs/_diagram_types/gantt-chart.adoc +502 -0
- data/docs/_diagram_types/git-graph.adoc +600 -0
- data/docs/_diagram_types/index.adoc +192 -0
- data/docs/_diagram_types/info-diagram.adoc +103 -0
- data/docs/_diagram_types/kanban-diagram.adoc +262 -0
- data/docs/_diagram_types/mindmap.adoc +603 -0
- data/docs/_diagram_types/packet-diagram.adoc +378 -0
- data/docs/_diagram_types/pie-chart.adoc +335 -0
- data/docs/_diagram_types/quadrant-chart.adoc +406 -0
- data/docs/_diagram_types/radar-chart.adoc +528 -0
- data/docs/_diagram_types/requirement-diagram.adoc +416 -0
- data/docs/_diagram_types/sankey-diagram.adoc +357 -0
- data/docs/_diagram_types/sequence-diagram.adoc +664 -0
- data/docs/_diagram_types/state-diagram.adoc +658 -0
- data/docs/_diagram_types/timeline.adoc +352 -0
- data/docs/_diagram_types/treemap-diagram.adoc +462 -0
- data/docs/_diagram_types/user-journey.adoc +602 -0
- data/docs/_features/index.adoc +129 -0
- data/docs/_guides/cli-reference.adoc +203 -0
- data/docs/_guides/index.adoc +56 -0
- data/docs/_guides/installation.adoc +100 -0
- data/docs/_guides/quick-start.adoc +132 -0
- data/docs/_pages/comparison.adoc +441 -0
- data/docs/_pages/compatibility.adoc +300 -0
- data/docs/_pages/index.adoc +39 -0
- data/docs/_references/index.adoc +103 -0
- data/docs/_tutorials/index.adoc +57 -0
- data/docs/index.adoc +166 -0
- data/docs/lychee.toml +54 -0
- data/examples/.gitignore +10 -0
- data/examples/README.adoc +196 -0
- data/examples/README.md +64 -0
- data/examples/architecture/01-basic-services.mmd +9 -0
- data/examples/architecture/01-basic-services.svg +37 -0
- data/examples/architecture/02-service-groups.mmd +16 -0
- data/examples/architecture/02-service-groups.svg +55 -0
- data/examples/architecture/README.adoc +79 -0
- data/examples/block/01-basic-blocks.mmd +13 -0
- data/examples/block/01-basic-blocks.svg +44 -0
- data/examples/block/02-block-shapes.mmd +13 -0
- data/examples/block/02-block-shapes.svg +47 -0
- data/examples/block/README.adoc +85 -0
- data/examples/c4/01-context-diagram.mmd +10 -0
- data/examples/c4/01-context-diagram.svg +45 -0
- data/examples/c4/02-container-diagram.mmd +24 -0
- data/examples/c4/02-container-diagram.svg +105 -0
- data/examples/c4/README.adoc +92 -0
- data/examples/class_diagram/01-basic-classes.mmd +61 -0
- data/examples/class_diagram/01-basic-classes.svg +117 -0
- data/examples/class_diagram/02-relationships.mmd +61 -0
- data/examples/class_diagram/02-relationships.svg +129 -0
- data/examples/class_diagram/README.adoc +93 -0
- data/examples/er_diagram/01-basic-entities.mmd +64 -0
- data/examples/er_diagram/01-basic-entities.svg +5 -0
- data/examples/er_diagram/02-cardinality.mmd +57 -0
- data/examples/er_diagram/02-cardinality.svg +125 -0
- data/examples/er_diagram/README.adoc +88 -0
- data/examples/error/01-basic-error.mmd +1 -0
- data/examples/error/01-basic-error.svg +13 -0
- data/examples/error/02-error-display.mmd +1 -0
- data/examples/error/02-error-display.svg +13 -0
- data/examples/error/README.adoc +71 -0
- data/examples/error_message_example.svg +13 -0
- data/examples/flowchart/00-original.mmd +13 -0
- data/examples/flowchart/00-original.svg +5 -0
- data/examples/flowchart/01-basic-flow.mmd +7 -0
- data/examples/flowchart/01-basic-flow.svg +52 -0
- data/examples/flowchart/01-basic-flow.yml +13 -0
- data/examples/flowchart/02*.svg +87 -0
- data/examples/flowchart/02-node-shapes.mmd +9 -0
- data/examples/flowchart/02-node-shapes.svg +33 -0
- data/examples/flowchart/03-edge-types.mmd +7 -0
- data/examples/flowchart/03-edge-types.svg +53 -0
- data/examples/flowchart/04-subgraphs.mmd +9 -0
- data/examples/flowchart/04-subgraphs.svg +33 -0
- data/examples/flowchart/05-styling.mmd +9 -0
- data/examples/flowchart/05-styling.svg +33 -0
- data/examples/flowchart/06-complex-flow.mmd +8 -0
- data/examples/flowchart/06-complex-flow.svg +59 -0
- data/examples/flowchart/README.adoc +167 -0
- data/examples/gantt/01-simple-timeline.* +14 -0
- data/examples/gantt/01-simple-timeline.mmd +6 -0
- data/examples/gantt/01-simple-timeline.svg +26 -0
- data/examples/gantt/02-task-dependencies.mmd +6 -0
- data/examples/gantt/02-task-dependencies.svg +26 -0
- data/examples/gantt/README.adoc +86 -0
- data/examples/git_graph/01-linear-history.mmd +12 -0
- data/examples/git_graph/01-linear-history.svg +26 -0
- data/examples/git_graph/02-branching.mmd +12 -0
- data/examples/git_graph/02-branching.svg +26 -0
- data/examples/git_graph/README.adoc +73 -0
- data/examples/info/02-showinfo.mmd +1 -0
- data/examples/info/02-showinfo.svg +10 -0
- data/examples/info/README.adoc +58 -0
- data/examples/info_showinfo_example.svg +10 -0
- data/examples/kanban/01-simple-board.mmd +8 -0
- data/examples/kanban/01-simple-board.svg +43 -0
- data/examples/kanban/02-workflow.mmd +8 -0
- data/examples/kanban/02-workflow.svg +43 -0
- data/examples/kanban/README.adoc +79 -0
- data/examples/mindmap/01-simple-tree.mmd +19 -0
- data/examples/mindmap/01-simple-tree.svg +61 -0
- data/examples/mindmap/02-knowledge-map.mmd +19 -0
- data/examples/mindmap/02-knowledge-map.svg +61 -0
- data/examples/mindmap/README.adoc +77 -0
- data/examples/packet/01-basic-packet.* +17 -0
- data/examples/packet/01-basic-packet.mmd +4 -0
- data/examples/packet/01-basic-packet.svg +82 -0
- data/examples/packet/README.adoc +58 -0
- data/examples/pie/01-simple-chart.mmd +5 -0
- data/examples/pie/01-simple-chart.svg +17 -0
- data/examples/pie/02-labeled-slices.mmd +6 -0
- data/examples/pie/02-labeled-slices.svg +19 -0
- data/examples/pie/README.adoc +75 -0
- data/examples/quadrant/01-basic-quadrant.mmd +13 -0
- data/examples/quadrant/01-basic-quadrant.svg +33 -0
- data/examples/quadrant/02-positioned-items.mmd +14 -0
- data/examples/quadrant/02-positioned-items.svg +35 -0
- data/examples/quadrant/README.adoc +84 -0
- data/examples/radar/01-simple-radar.* +5 -0
- data/examples/radar/01-simple-radar.mmd +3 -0
- data/examples/radar/01-simple-radar.svg +25 -0
- data/examples/radar/02-multiple-curves.mmd +4 -0
- data/examples/radar/02-multiple-curves.svg +43 -0
- data/examples/radar/README.adoc +75 -0
- data/examples/requirement/01-basic-requirements.mmd +23 -0
- data/examples/requirement/01-basic-requirements.svg +49 -0
- data/examples/requirement/02-risk-levels.mmd +23 -0
- data/examples/requirement/02-risk-levels.svg +49 -0
- data/examples/requirement/README.adoc +85 -0
- data/examples/sankey/01-simple-flow.mmd +7 -0
- data/examples/sankey/01-simple-flow.svg +34 -0
- data/examples/sankey/02-multi-stage.mmd +11 -0
- data/examples/sankey/02-multi-stage.svg +44 -0
- data/examples/sankey/README.adoc +74 -0
- data/examples/sequence/01-basic-sequence.mmd +27 -0
- data/examples/sequence/01-basic-sequence.svg +5 -0
- data/examples/sequence/02-activations.mmd +17 -0
- data/examples/sequence/02-activations.svg +78 -0
- data/examples/sequence/README.adoc +86 -0
- data/examples/state_diagram/01-simple-states.mmd +29 -0
- data/examples/state_diagram/01-simple-states.svg +5 -0
- data/examples/state_diagram/02-composite.mmd +19 -0
- data/examples/state_diagram/02-composite.svg +81 -0
- data/examples/state_diagram/README.adoc +90 -0
- data/examples/timeline/01-simple-timeline.mmd +11 -0
- data/examples/timeline/01-simple-timeline.svg +36 -0
- data/examples/timeline/02-periods.mmd +15 -0
- data/examples/timeline/02-periods.svg +47 -0
- data/examples/timeline/README.adoc +78 -0
- data/examples/treemap/01-basic-treemap.mmd +12 -0
- data/examples/treemap/01-basic-treemap.svg +59 -0
- data/examples/treemap/README.adoc +59 -0
- data/examples/user_journey/01-simple-journey.mmd +23 -0
- data/examples/user_journey/01-simple-journey.svg +5 -0
- data/examples/user_journey/02-multi-actor.mmd +18 -0
- data/examples/user_journey/02-multi-actor.svg +129 -0
- data/examples/user_journey/README.adoc +81 -0
- data/examples/xychart/01-line-chart.mmd +5 -0
- data/examples/xychart/01-line-chart.svg +43 -0
- data/examples/xychart/02-bar-chart.mmd +7 -0
- data/examples/xychart/02-bar-chart.svg +48 -0
- data/examples/xychart/README.adoc +80 -0
- data/exe/sirena +7 -0
- data/lib/sirena/cli.rb +138 -0
- data/lib/sirena/commands/batch.rb +117 -0
- data/lib/sirena/commands/render.rb +80 -0
- data/lib/sirena/commands/types.rb +29 -0
- data/lib/sirena/commands/version.rb +24 -0
- data/lib/sirena/diagram/architecture.rb +46 -0
- data/lib/sirena/diagram/base.rb +61 -0
- data/lib/sirena/diagram/block.rb +81 -0
- data/lib/sirena/diagram/c4.rb +328 -0
- data/lib/sirena/diagram/class_diagram.rb +385 -0
- data/lib/sirena/diagram/er_diagram.rb +238 -0
- data/lib/sirena/diagram/error.rb +38 -0
- data/lib/sirena/diagram/flowchart.rb +160 -0
- data/lib/sirena/diagram/gantt.rb +71 -0
- data/lib/sirena/diagram/git_graph.rb +36 -0
- data/lib/sirena/diagram/info.rb +38 -0
- data/lib/sirena/diagram/kanban.rb +178 -0
- data/lib/sirena/diagram/mindmap.rb +54 -0
- data/lib/sirena/diagram/packet.rb +79 -0
- data/lib/sirena/diagram/pie.rb +115 -0
- data/lib/sirena/diagram/quadrant.rb +138 -0
- data/lib/sirena/diagram/radar.rb +52 -0
- data/lib/sirena/diagram/requirement.rb +133 -0
- data/lib/sirena/diagram/sankey.rb +217 -0
- data/lib/sirena/diagram/sequence.rb +242 -0
- data/lib/sirena/diagram/state_diagram.rb +237 -0
- data/lib/sirena/diagram/timeline.rb +171 -0
- data/lib/sirena/diagram/treemap.rb +84 -0
- data/lib/sirena/diagram/user_journey.rb +149 -0
- data/lib/sirena/diagram/xy_chart.rb +76 -0
- data/lib/sirena/diagram.rb +8 -0
- data/lib/sirena/diagram_registry.rb +101 -0
- data/lib/sirena/engine.rb +292 -0
- data/lib/sirena/parser/architecture.rb +41 -0
- data/lib/sirena/parser/base.rb +41 -0
- data/lib/sirena/parser/block.rb +72 -0
- data/lib/sirena/parser/c4.rb +53 -0
- data/lib/sirena/parser/class_diagram.rb +63 -0
- data/lib/sirena/parser/er_diagram.rb +40 -0
- data/lib/sirena/parser/error.rb +49 -0
- data/lib/sirena/parser/flowchart.rb +71 -0
- data/lib/sirena/parser/gantt.rb +60 -0
- data/lib/sirena/parser/git_graph.rb +95 -0
- data/lib/sirena/parser/grammars/architecture.rb +145 -0
- data/lib/sirena/parser/grammars/block.rb +190 -0
- data/lib/sirena/parser/grammars/c4.rb +226 -0
- data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
- data/lib/sirena/parser/grammars/common.rb +84 -0
- data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
- data/lib/sirena/parser/grammars/error.rb +40 -0
- data/lib/sirena/parser/grammars/flowchart.rb +298 -0
- data/lib/sirena/parser/grammars/gantt.rb +252 -0
- data/lib/sirena/parser/grammars/git_graph.rb +167 -0
- data/lib/sirena/parser/grammars/info.rb +58 -0
- data/lib/sirena/parser/grammars/kanban.rb +83 -0
- data/lib/sirena/parser/grammars/mindmap.rb +115 -0
- data/lib/sirena/parser/grammars/packet.rb +73 -0
- data/lib/sirena/parser/grammars/pie.rb +128 -0
- data/lib/sirena/parser/grammars/quadrant.rb +199 -0
- data/lib/sirena/parser/grammars/radar.rb +150 -0
- data/lib/sirena/parser/grammars/requirement.rb +188 -0
- data/lib/sirena/parser/grammars/sankey.rb +104 -0
- data/lib/sirena/parser/grammars/sequence.rb +247 -0
- data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
- data/lib/sirena/parser/grammars/timeline.rb +142 -0
- data/lib/sirena/parser/grammars/treemap.rb +120 -0
- data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
- data/lib/sirena/parser/info.rb +49 -0
- data/lib/sirena/parser/kanban.rb +97 -0
- data/lib/sirena/parser/mindmap.rb +106 -0
- data/lib/sirena/parser/packet.rb +76 -0
- data/lib/sirena/parser/pie.rb +49 -0
- data/lib/sirena/parser/quadrant.rb +57 -0
- data/lib/sirena/parser/radar.rb +104 -0
- data/lib/sirena/parser/requirement.rb +70 -0
- data/lib/sirena/parser/sankey.rb +64 -0
- data/lib/sirena/parser/sequence.rb +51 -0
- data/lib/sirena/parser/state_diagram.rb +69 -0
- data/lib/sirena/parser/timeline.rb +57 -0
- data/lib/sirena/parser/transforms/architecture.rb +97 -0
- data/lib/sirena/parser/transforms/block.rb +254 -0
- data/lib/sirena/parser/transforms/c4.rb +347 -0
- data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
- data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
- data/lib/sirena/parser/transforms/error.rb +58 -0
- data/lib/sirena/parser/transforms/flowchart.rb +293 -0
- data/lib/sirena/parser/transforms/gantt.rb +215 -0
- data/lib/sirena/parser/transforms/git_graph.rb +160 -0
- data/lib/sirena/parser/transforms/info.rb +58 -0
- data/lib/sirena/parser/transforms/kanban.rb +176 -0
- data/lib/sirena/parser/transforms/mindmap.rb +227 -0
- data/lib/sirena/parser/transforms/packet.rb +63 -0
- data/lib/sirena/parser/transforms/pie.rb +143 -0
- data/lib/sirena/parser/transforms/quadrant.rb +177 -0
- data/lib/sirena/parser/transforms/radar.rb +126 -0
- data/lib/sirena/parser/transforms/requirement.rb +272 -0
- data/lib/sirena/parser/transforms/sankey.rb +122 -0
- data/lib/sirena/parser/transforms/sequence.rb +342 -0
- data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
- data/lib/sirena/parser/transforms/timeline.rb +177 -0
- data/lib/sirena/parser/transforms/treemap.rb +81 -0
- data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
- data/lib/sirena/parser/treemap.rb +98 -0
- data/lib/sirena/parser/user_journey.rb +120 -0
- data/lib/sirena/parser/xy_chart.rb +114 -0
- data/lib/sirena/parser.rb +8 -0
- data/lib/sirena/renderer/architecture.rb +251 -0
- data/lib/sirena/renderer/base.rb +251 -0
- data/lib/sirena/renderer/block.rb +286 -0
- data/lib/sirena/renderer/c4.rb +490 -0
- data/lib/sirena/renderer/class_diagram.rb +499 -0
- data/lib/sirena/renderer/er_diagram.rb +417 -0
- data/lib/sirena/renderer/error.rb +131 -0
- data/lib/sirena/renderer/flowchart.rb +301 -0
- data/lib/sirena/renderer/gantt.rb +331 -0
- data/lib/sirena/renderer/git_graph.rb +368 -0
- data/lib/sirena/renderer/info.rb +93 -0
- data/lib/sirena/renderer/kanban.rb +295 -0
- data/lib/sirena/renderer/mindmap.rb +396 -0
- data/lib/sirena/renderer/packet.rb +239 -0
- data/lib/sirena/renderer/pie.rb +235 -0
- data/lib/sirena/renderer/quadrant.rb +292 -0
- data/lib/sirena/renderer/radar.rb +323 -0
- data/lib/sirena/renderer/requirement.rb +371 -0
- data/lib/sirena/renderer/sankey.rb +255 -0
- data/lib/sirena/renderer/sequence.rb +424 -0
- data/lib/sirena/renderer/state_diagram.rb +328 -0
- data/lib/sirena/renderer/timeline.rb +304 -0
- data/lib/sirena/renderer/treemap.rb +152 -0
- data/lib/sirena/renderer/user_journey.rb +331 -0
- data/lib/sirena/renderer/xy_chart.rb +452 -0
- data/lib/sirena/renderer.rb +8 -0
- data/lib/sirena/svg/circle.rb +41 -0
- data/lib/sirena/svg/document.rb +103 -0
- data/lib/sirena/svg/element.rb +65 -0
- data/lib/sirena/svg/ellipse.rb +33 -0
- data/lib/sirena/svg/group.rb +71 -0
- data/lib/sirena/svg/line.rb +49 -0
- data/lib/sirena/svg/path.rb +76 -0
- data/lib/sirena/svg/polygon.rb +43 -0
- data/lib/sirena/svg/polyline.rb +35 -0
- data/lib/sirena/svg/rect.rb +57 -0
- data/lib/sirena/svg/style.rb +44 -0
- data/lib/sirena/svg/text.rb +72 -0
- data/lib/sirena/svg.rb +19 -0
- data/lib/sirena/text_measurement.rb +71 -0
- data/lib/sirena/theme/builtin/dark.yml +70 -0
- data/lib/sirena/theme/builtin/default.yml +80 -0
- data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
- data/lib/sirena/theme/builtin/light.yml +70 -0
- data/lib/sirena/theme/color_palette.rb +48 -0
- data/lib/sirena/theme/effect_styles.rb +28 -0
- data/lib/sirena/theme/registry.rb +41 -0
- data/lib/sirena/theme/shape_styles.rb +28 -0
- data/lib/sirena/theme/spacing_config.rb +24 -0
- data/lib/sirena/theme/typography.rb +30 -0
- data/lib/sirena/theme.rb +69 -0
- data/lib/sirena/transform/architecture.rb +273 -0
- data/lib/sirena/transform/base.rb +199 -0
- data/lib/sirena/transform/block.rb +215 -0
- data/lib/sirena/transform/c4.rb +288 -0
- data/lib/sirena/transform/class_diagram.rb +296 -0
- data/lib/sirena/transform/er_diagram.rb +204 -0
- data/lib/sirena/transform/error.rb +39 -0
- data/lib/sirena/transform/flowchart.rb +161 -0
- data/lib/sirena/transform/gantt.rb +253 -0
- data/lib/sirena/transform/git_graph.rb +283 -0
- data/lib/sirena/transform/info.rb +39 -0
- data/lib/sirena/transform/kanban.rb +180 -0
- data/lib/sirena/transform/mindmap.rb +251 -0
- data/lib/sirena/transform/packet.rb +185 -0
- data/lib/sirena/transform/pie.rb +62 -0
- data/lib/sirena/transform/quadrant.rb +167 -0
- data/lib/sirena/transform/radar.rb +227 -0
- data/lib/sirena/transform/requirement.rb +233 -0
- data/lib/sirena/transform/sankey.rb +212 -0
- data/lib/sirena/transform/sequence.rb +143 -0
- data/lib/sirena/transform/state_diagram.rb +228 -0
- data/lib/sirena/transform/timeline.rb +139 -0
- data/lib/sirena/transform/treemap.rb +120 -0
- data/lib/sirena/transform/user_journey.rb +207 -0
- data/lib/sirena/transform/xy_chart.rb +273 -0
- data/lib/sirena/transform.rb +8 -0
- data/lib/sirena/version.rb +5 -0
- data/lib/sirena.rb +328 -0
- data/lib/tasks/benchmark.rake +532 -0
- data/lib/tasks/examples.rake +468 -0
- data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
- data/lib/tasks/mermaid_fixtures.rake +46 -0
- data/scripts/extract_mermaid_tests.rb +493 -0
- data/scripts/rename_to_sirena.rb +73 -0
- data/sirena.gemspec +47 -0
- metadata +529 -0
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
= C4 Diagram Support
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Overview
|
|
6
|
+
|
|
7
|
+
C4 (Context, Container, Component, Code) diagrams visualize software architecture at different levels of abstraction. Sirena provides full support for rendering C4 diagrams with all major element types, boundaries, and relationships.
|
|
8
|
+
|
|
9
|
+
=== Supported C4 Levels
|
|
10
|
+
|
|
11
|
+
* **C4Context** - System Context diagrams showing the big picture
|
|
12
|
+
* **C4Container** - Container diagrams showing high-level technology choices
|
|
13
|
+
* **C4Component** - Component diagrams showing components within containers
|
|
14
|
+
* **C4Dynamic** - Dynamic diagrams showing runtime behavior
|
|
15
|
+
* **C4Deployment** - Deployment diagrams showing infrastructure mapping
|
|
16
|
+
|
|
17
|
+
== Basic Usage
|
|
18
|
+
|
|
19
|
+
=== Simple C4 Context Diagram
|
|
20
|
+
|
|
21
|
+
[source,mermaid]
|
|
22
|
+
----
|
|
23
|
+
C4Context
|
|
24
|
+
title System Context for Banking System
|
|
25
|
+
Person(customer, "Customer", "A bank customer")
|
|
26
|
+
System(banking, "Banking System", "Core banking application")
|
|
27
|
+
System_Ext(email, "Email System", "External email service")
|
|
28
|
+
|
|
29
|
+
Rel(customer, banking, "Uses")
|
|
30
|
+
Rel(banking, email, "Sends emails", "SMTP")
|
|
31
|
+
----
|
|
32
|
+
|
|
33
|
+
This creates a context diagram showing:
|
|
34
|
+
|
|
35
|
+
* A person (customer) interacting with the system
|
|
36
|
+
* The main banking system
|
|
37
|
+
* An external email system
|
|
38
|
+
* Relationships between components
|
|
39
|
+
|
|
40
|
+
=== C4 Container Diagram
|
|
41
|
+
|
|
42
|
+
[source,mermaid]
|
|
43
|
+
----
|
|
44
|
+
C4Container
|
|
45
|
+
title Container Diagram for Banking System
|
|
46
|
+
|
|
47
|
+
Person(customer, "Customer", "A bank customer")
|
|
48
|
+
|
|
49
|
+
Container(web, "Web Application", "React", "Customer-facing web app")
|
|
50
|
+
Container(api, "API", "Node.js", "Backend REST API")
|
|
51
|
+
ContainerDb(db, "Database", "PostgreSQL", "Stores customer data")
|
|
52
|
+
|
|
53
|
+
Rel(customer, web, "Uses", "HTTPS")
|
|
54
|
+
Rel(web, api, "Calls", "REST/JSON")
|
|
55
|
+
Rel(api, db, "Reads/Writes", "SQL")
|
|
56
|
+
----
|
|
57
|
+
|
|
58
|
+
== Element Types
|
|
59
|
+
|
|
60
|
+
=== People
|
|
61
|
+
|
|
62
|
+
==== Person
|
|
63
|
+
|
|
64
|
+
Represents a user of the system.
|
|
65
|
+
|
|
66
|
+
[source,mermaid]
|
|
67
|
+
----
|
|
68
|
+
C4Context
|
|
69
|
+
Person(user, "User", "A system user")
|
|
70
|
+
----
|
|
71
|
+
|
|
72
|
+
Where:
|
|
73
|
+
|
|
74
|
+
* `user` - Unique identifier
|
|
75
|
+
* `"User"` - Display label
|
|
76
|
+
* `"A system user"` - Description
|
|
77
|
+
|
|
78
|
+
==== Person_Ext
|
|
79
|
+
|
|
80
|
+
Represents an external user outside the system boundary.
|
|
81
|
+
|
|
82
|
+
[source,mermaid]
|
|
83
|
+
----
|
|
84
|
+
C4Context
|
|
85
|
+
Person_Ext(external, "External User", "Outside the organization")
|
|
86
|
+
----
|
|
87
|
+
|
|
88
|
+
=== Systems
|
|
89
|
+
|
|
90
|
+
==== System
|
|
91
|
+
|
|
92
|
+
Represents a software system.
|
|
93
|
+
|
|
94
|
+
[source,mermaid]
|
|
95
|
+
----
|
|
96
|
+
C4Context
|
|
97
|
+
System(app, "Application", "Main application system")
|
|
98
|
+
----
|
|
99
|
+
|
|
100
|
+
==== System_Ext
|
|
101
|
+
|
|
102
|
+
Represents an external system.
|
|
103
|
+
|
|
104
|
+
[source,mermaid]
|
|
105
|
+
----
|
|
106
|
+
C4Context
|
|
107
|
+
System_Ext(crm, "CRM System", "Third-party CRM")
|
|
108
|
+
----
|
|
109
|
+
|
|
110
|
+
==== SystemDb
|
|
111
|
+
|
|
112
|
+
Represents a database system.
|
|
113
|
+
|
|
114
|
+
[source,mermaid]
|
|
115
|
+
----
|
|
116
|
+
C4Context
|
|
117
|
+
SystemDb(maindb, "Main Database", "Central data store")
|
|
118
|
+
----
|
|
119
|
+
|
|
120
|
+
==== SystemDb_Ext
|
|
121
|
+
|
|
122
|
+
Represents an external database.
|
|
123
|
+
|
|
124
|
+
[source,mermaid]
|
|
125
|
+
----
|
|
126
|
+
C4Context
|
|
127
|
+
SystemDb_Ext(legacy, "Legacy DB", "Old system database")
|
|
128
|
+
----
|
|
129
|
+
|
|
130
|
+
==== SystemQueue
|
|
131
|
+
|
|
132
|
+
Represents a message queue system.
|
|
133
|
+
|
|
134
|
+
[source,mermaid]
|
|
135
|
+
----
|
|
136
|
+
C4Context
|
|
137
|
+
SystemQueue(queue, "Message Queue", "Event processing")
|
|
138
|
+
----
|
|
139
|
+
|
|
140
|
+
==== SystemQueue_Ext
|
|
141
|
+
|
|
142
|
+
Represents an external queue system.
|
|
143
|
+
|
|
144
|
+
[source,mermaid]
|
|
145
|
+
----
|
|
146
|
+
C4Context
|
|
147
|
+
SystemQueue_Ext(kafka, "Kafka", "External event stream")
|
|
148
|
+
----
|
|
149
|
+
|
|
150
|
+
=== Containers
|
|
151
|
+
|
|
152
|
+
==== Container
|
|
153
|
+
|
|
154
|
+
Represents an application or service container.
|
|
155
|
+
|
|
156
|
+
[source,mermaid]
|
|
157
|
+
----
|
|
158
|
+
C4Container
|
|
159
|
+
Container(web, "Web App", "React", "Frontend application")
|
|
160
|
+
----
|
|
161
|
+
|
|
162
|
+
Where:
|
|
163
|
+
|
|
164
|
+
* `web` - Unique identifier
|
|
165
|
+
* `"Web App"` - Display label
|
|
166
|
+
* `"React"` - Technology stack
|
|
167
|
+
* `"Frontend application"` - Description
|
|
168
|
+
|
|
169
|
+
==== ContainerDb
|
|
170
|
+
|
|
171
|
+
Represents a database container.
|
|
172
|
+
|
|
173
|
+
[source,mermaid]
|
|
174
|
+
----
|
|
175
|
+
C4Container
|
|
176
|
+
ContainerDb(db, "Database", "PostgreSQL", "Data persistence")
|
|
177
|
+
----
|
|
178
|
+
|
|
179
|
+
==== ContainerQueue
|
|
180
|
+
|
|
181
|
+
Represents a message queue container.
|
|
182
|
+
|
|
183
|
+
[source,mermaid]
|
|
184
|
+
----
|
|
185
|
+
C4Container
|
|
186
|
+
ContainerQueue(mq, "Queue", "RabbitMQ", "Async messaging")
|
|
187
|
+
----
|
|
188
|
+
|
|
189
|
+
=== Components
|
|
190
|
+
|
|
191
|
+
==== Component
|
|
192
|
+
|
|
193
|
+
Represents a component within a container.
|
|
194
|
+
|
|
195
|
+
[source,mermaid]
|
|
196
|
+
----
|
|
197
|
+
C4Component
|
|
198
|
+
Component(ctrl, "Controller", "REST Controller", "Handles HTTP requests")
|
|
199
|
+
----
|
|
200
|
+
|
|
201
|
+
== Relationships
|
|
202
|
+
|
|
203
|
+
=== Basic Relationship
|
|
204
|
+
|
|
205
|
+
Use [`Rel()`](lib/sirena/diagram/c4.rb:100) to show a directional relationship:
|
|
206
|
+
|
|
207
|
+
[source,mermaid]
|
|
208
|
+
----
|
|
209
|
+
C4Context
|
|
210
|
+
Person(user, "User")
|
|
211
|
+
System(app, "App")
|
|
212
|
+
Rel(user, app, "Uses")
|
|
213
|
+
----
|
|
214
|
+
|
|
215
|
+
Parameters:
|
|
216
|
+
|
|
217
|
+
* Source element ID
|
|
218
|
+
* Target element ID
|
|
219
|
+
* Relationship label
|
|
220
|
+
* Technology (optional)
|
|
221
|
+
|
|
222
|
+
.Example with technology
|
|
223
|
+
[example]
|
|
224
|
+
====
|
|
225
|
+
[source,mermaid]
|
|
226
|
+
----
|
|
227
|
+
Rel(web, api, "Calls API", "REST/HTTPS")
|
|
228
|
+
----
|
|
229
|
+
====
|
|
230
|
+
|
|
231
|
+
=== Bidirectional Relationship
|
|
232
|
+
|
|
233
|
+
Use `BiRel()` for two-way relationships:
|
|
234
|
+
|
|
235
|
+
[source,mermaid]
|
|
236
|
+
----
|
|
237
|
+
C4Context
|
|
238
|
+
System(app1, "App 1")
|
|
239
|
+
System(app2, "App 2")
|
|
240
|
+
BiRel(app1, app2, "Syncs data")
|
|
241
|
+
----
|
|
242
|
+
|
|
243
|
+
== Boundaries
|
|
244
|
+
|
|
245
|
+
Boundaries group related elements together.
|
|
246
|
+
|
|
247
|
+
=== Enterprise Boundary
|
|
248
|
+
|
|
249
|
+
Groups systems within an enterprise.
|
|
250
|
+
|
|
251
|
+
[source,mermaid]
|
|
252
|
+
----
|
|
253
|
+
C4Context
|
|
254
|
+
Enterprise_Boundary(org, "Our Organization") {
|
|
255
|
+
System(app1, "App 1")
|
|
256
|
+
System(app2, "App 2")
|
|
257
|
+
}
|
|
258
|
+
----
|
|
259
|
+
|
|
260
|
+
=== System Boundary
|
|
261
|
+
|
|
262
|
+
Groups containers within a system.
|
|
263
|
+
|
|
264
|
+
[source,mermaid]
|
|
265
|
+
----
|
|
266
|
+
C4Container
|
|
267
|
+
System_Boundary(sys, "Banking System") {
|
|
268
|
+
Container(web, "Web App", "React")
|
|
269
|
+
Container(api, "API", "Node.js")
|
|
270
|
+
}
|
|
271
|
+
----
|
|
272
|
+
|
|
273
|
+
=== Custom Boundary
|
|
274
|
+
|
|
275
|
+
Generic boundary with custom type.
|
|
276
|
+
|
|
277
|
+
[source,mermaid]
|
|
278
|
+
----
|
|
279
|
+
C4Context
|
|
280
|
+
Boundary(custom, "Custom Group", "boundary") {
|
|
281
|
+
System(s1, "System 1")
|
|
282
|
+
System(s2, "System 2")
|
|
283
|
+
}
|
|
284
|
+
----
|
|
285
|
+
|
|
286
|
+
=== Nested Boundaries
|
|
287
|
+
|
|
288
|
+
Boundaries can be nested for hierarchical organization:
|
|
289
|
+
|
|
290
|
+
[source,mermaid]
|
|
291
|
+
----
|
|
292
|
+
C4Context
|
|
293
|
+
Enterprise_Boundary(org, "Organization") {
|
|
294
|
+
System_Boundary(sys, "System") {
|
|
295
|
+
Boundary(module, "Module", "boundary") {
|
|
296
|
+
System(app, "Application")
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
----
|
|
301
|
+
|
|
302
|
+
== Element Attributes
|
|
303
|
+
|
|
304
|
+
=== Sprite Icons
|
|
305
|
+
|
|
306
|
+
Add custom icons to elements:
|
|
307
|
+
|
|
308
|
+
[source,mermaid]
|
|
309
|
+
----
|
|
310
|
+
C4Context
|
|
311
|
+
Person(user, "User", "Description", $sprite="person_icon")
|
|
312
|
+
----
|
|
313
|
+
|
|
314
|
+
=== Links
|
|
315
|
+
|
|
316
|
+
Add clickable links:
|
|
317
|
+
|
|
318
|
+
[source,mermaid]
|
|
319
|
+
----
|
|
320
|
+
C4Context
|
|
321
|
+
System(app, "App", "Description", $link="https://example.com")
|
|
322
|
+
----
|
|
323
|
+
|
|
324
|
+
=== Tags
|
|
325
|
+
|
|
326
|
+
Add tags for categorization:
|
|
327
|
+
|
|
328
|
+
[source,mermaid]
|
|
329
|
+
----
|
|
330
|
+
C4Context
|
|
331
|
+
System(app, "App", "Description", $tags="critical,production")
|
|
332
|
+
----
|
|
333
|
+
|
|
334
|
+
=== Combined Attributes
|
|
335
|
+
|
|
336
|
+
Multiple attributes can be combined:
|
|
337
|
+
|
|
338
|
+
[source,mermaid]
|
|
339
|
+
----
|
|
340
|
+
C4Container
|
|
341
|
+
Container(web, "Web App", "React", "Frontend",
|
|
342
|
+
$sprite="react", $link="https://app.example.com",
|
|
343
|
+
$tags="frontend,critical")
|
|
344
|
+
----
|
|
345
|
+
|
|
346
|
+
== Layout Configuration
|
|
347
|
+
|
|
348
|
+
Configure diagram layout using [`UpdateLayoutConfig()`](lib/sirena/transform/c4.rb:254):
|
|
349
|
+
|
|
350
|
+
[source,mermaid]
|
|
351
|
+
----
|
|
352
|
+
C4Context
|
|
353
|
+
UpdateLayoutConfig($c4ShapeInRow=3, $c4BoundaryInRow=2)
|
|
354
|
+
|
|
355
|
+
Person(user, "User")
|
|
356
|
+
System(app, "App")
|
|
357
|
+
----
|
|
358
|
+
|
|
359
|
+
== Complete Example
|
|
360
|
+
|
|
361
|
+
.Full C4 Context Diagram with Nested Boundaries
|
|
362
|
+
[example]
|
|
363
|
+
====
|
|
364
|
+
[source,mermaid]
|
|
365
|
+
----
|
|
366
|
+
C4Context
|
|
367
|
+
title Internet Banking System Context
|
|
368
|
+
|
|
369
|
+
Enterprise_Boundary(bank, "Bank Boundary") {
|
|
370
|
+
Person(customer, "Customer", "Bank customer with accounts")
|
|
371
|
+
|
|
372
|
+
System_Boundary(core, "Core Banking") {
|
|
373
|
+
System(banking, "Banking System", "Main application")
|
|
374
|
+
SystemDb(db, "Database", "Customer and account data")
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
System_Ext(email, "Email System", "Microsoft Exchange")
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
System_Ext(mainframe, "Mainframe", "Legacy system")
|
|
381
|
+
|
|
382
|
+
BiRel(customer, banking, "Uses")
|
|
383
|
+
Rel(banking, db, "Reads/Writes", "SQL")
|
|
384
|
+
Rel(banking, email, "Sends emails", "SMTP")
|
|
385
|
+
Rel(banking, mainframe, "Gets data", "XML/HTTPS")
|
|
386
|
+
----
|
|
387
|
+
|
|
388
|
+
This creates a hierarchical diagram showing:
|
|
389
|
+
|
|
390
|
+
* Enterprise boundary containing the bank's systems
|
|
391
|
+
* System boundary for core banking components
|
|
392
|
+
* Internal and external systems
|
|
393
|
+
* Database and email integration
|
|
394
|
+
* Bidirectional and unidirectional relationships
|
|
395
|
+
====
|
|
396
|
+
|
|
397
|
+
== Visual Styling
|
|
398
|
+
|
|
399
|
+
=== C4 Color Scheme
|
|
400
|
+
|
|
401
|
+
Sirena uses the standard C4-PlantUML color scheme:
|
|
402
|
+
|
|
403
|
+
* **Person** - Dark blue (#08427B)
|
|
404
|
+
* **Person_Ext** - Gray (#6C6477)
|
|
405
|
+
* **System** - Blue (#1168BD)
|
|
406
|
+
* **System_Ext** - Gray (#8F8F8F)
|
|
407
|
+
* **Container** - Light blue (#438DD5)
|
|
408
|
+
* **Component** - Lighter blue (#85BBF0)
|
|
409
|
+
* **Boundary** - Dashed border (#9BA7B4)
|
|
410
|
+
|
|
411
|
+
=== Element Dimensions
|
|
412
|
+
|
|
413
|
+
Default element sizes:
|
|
414
|
+
|
|
415
|
+
* Person: 140x180 px
|
|
416
|
+
* System: 160x120 px
|
|
417
|
+
* Container: 160x120 px
|
|
418
|
+
* Component: 160x100 px
|
|
419
|
+
|
|
420
|
+
=== Text Formatting
|
|
421
|
+
|
|
422
|
+
* **Labels** - Bold, 14-16pt
|
|
423
|
+
* **Descriptions** - Normal, 11pt
|
|
424
|
+
* **Technology** - Italic, 10pt
|
|
425
|
+
|
|
426
|
+
== Best Practices
|
|
427
|
+
|
|
428
|
+
=== When to Use Each Level
|
|
429
|
+
|
|
430
|
+
* **C4Context** - For stakeholders, showing external dependencies
|
|
431
|
+
* **C4Container** - For architects, showing deployment units
|
|
432
|
+
* **C4Component** - For developers, showing internal structure
|
|
433
|
+
* **C4Dynamic** - For runtime scenarios and workflows
|
|
434
|
+
* **C4Deployment** - For infrastructure and DevOps teams
|
|
435
|
+
|
|
436
|
+
=== Naming Conventions
|
|
437
|
+
|
|
438
|
+
* Use clear, descriptive labels
|
|
439
|
+
* Keep descriptions concise (1-2 lines)
|
|
440
|
+
* Specify technology for containers/components
|
|
441
|
+
* Use consistent naming across diagrams
|
|
442
|
+
|
|
443
|
+
=== Diagram Organization
|
|
444
|
+
|
|
445
|
+
* Start with Context, drill down to Container, then Component
|
|
446
|
+
* Use boundaries to group related elements
|
|
447
|
+
* Limit elements per diagram (5-15 for readability)
|
|
448
|
+
* Show only relevant relationships
|
|
449
|
+
|
|
450
|
+
=== Common Patterns
|
|
451
|
+
|
|
452
|
+
.Microservices Architecture
|
|
453
|
+
[example]
|
|
454
|
+
====
|
|
455
|
+
[source,mermaid]
|
|
456
|
+
----
|
|
457
|
+
C4Container
|
|
458
|
+
title Microservices System
|
|
459
|
+
|
|
460
|
+
Container(gateway, "API Gateway", "Kong", "Entry point")
|
|
461
|
+
Container(auth, "Auth Service", "OAuth2", "Authentication")
|
|
462
|
+
Container(users, "User Service", "Node.js", "User management")
|
|
463
|
+
Container(orders, "Order Service", "Java", "Order processing")
|
|
464
|
+
ContainerDb(userdb, "User DB", "PostgreSQL")
|
|
465
|
+
ContainerDb(orderdb, "Order DB", "MongoDB")
|
|
466
|
+
|
|
467
|
+
Rel(gateway, auth, "Validates")
|
|
468
|
+
Rel(gateway, users, "Routes")
|
|
469
|
+
Rel(gateway, orders, "Routes")
|
|
470
|
+
Rel(users, userdb, "Stores")
|
|
471
|
+
Rel(orders, orderdb, "Stores")
|
|
472
|
+
----
|
|
473
|
+
====
|
|
474
|
+
|
|
475
|
+
== Implementation Details
|
|
476
|
+
|
|
477
|
+
=== Architecture
|
|
478
|
+
|
|
479
|
+
C4 diagrams are implemented using the standard 7-file Parslet architecture:
|
|
480
|
+
|
|
481
|
+
1. [`Diagram::C4`](lib/sirena/diagram/c4.rb:224) - Data model with elements, boundaries, relationships
|
|
482
|
+
2. [`Parser::Grammars::C4`](lib/sirena/parser/grammars/c4.rb:13) - Parslet grammar for C4 syntax
|
|
483
|
+
3. [`Parser::Transforms::C4`](lib/sirena/parser/transforms/c4.rb:13) - Parse tree to diagram model transformer
|
|
484
|
+
4. [`Parser::C4Parser`](lib/sirena/parser/c4.rb:29) - Main parser class
|
|
485
|
+
5. [`Transform::C4Transform`](lib/sirena/transform/c4.rb:17) - Diagram to graph transformer
|
|
486
|
+
6. [`Renderer::C4Renderer`](lib/sirena/renderer/c4.rb:16) - SVG renderer
|
|
487
|
+
7. Layout - Automatic hierarchical layout via ELK
|
|
488
|
+
|
|
489
|
+
=== Rendering Pipeline
|
|
490
|
+
|
|
491
|
+
The C4 rendering pipeline:
|
|
492
|
+
|
|
493
|
+
1. **Parse** - Convert Mermaid source to [`C4`](lib/sirena/diagram/c4.rb:224) model
|
|
494
|
+
2. **Transform** - Convert to graph structure with positions
|
|
495
|
+
3. **Layout** - Calculate positions for elements and boundaries
|
|
496
|
+
4. **Render** - Generate SVG with C4 styling
|
|
497
|
+
|
|
498
|
+
=== Performance
|
|
499
|
+
|
|
500
|
+
* Parsing: O(n) where n is source length
|
|
501
|
+
* Layout: O(n log n) for hierarchical layout
|
|
502
|
+
* Rendering: O(e + r) where e=elements, r=relationships
|
|
503
|
+
|
|
504
|
+
=== Limitations
|
|
505
|
+
|
|
506
|
+
* Variable syntax (`${macroName}`) has limited support
|
|
507
|
+
* Some test-specific constructs may not parse
|
|
508
|
+
* Current coverage: 88.1% of test fixtures (37/42)
|
|
509
|
+
|
|
510
|
+
== Troubleshooting
|
|
511
|
+
|
|
512
|
+
=== Common Issues
|
|
513
|
+
|
|
514
|
+
==== Parse Errors
|
|
515
|
+
|
|
516
|
+
**Issue**: "Syntax error at line X"
|
|
517
|
+
|
|
518
|
+
**Solution**: Check for:
|
|
519
|
+
|
|
520
|
+
* Proper element syntax: `Type(id, "label", "desc")`
|
|
521
|
+
* Matching braces in boundaries
|
|
522
|
+
* Comma-separated parameters
|
|
523
|
+
* Quoted strings for labels and descriptions
|
|
524
|
+
|
|
525
|
+
==== Missing Elements
|
|
526
|
+
|
|
527
|
+
**Issue**: Elements don't appear in output
|
|
528
|
+
|
|
529
|
+
**Solution**: Verify:
|
|
530
|
+
|
|
531
|
+
* Element IDs are unique
|
|
532
|
+
* Elements are within boundaries if nested
|
|
533
|
+
* Relationships reference existing element IDs
|
|
534
|
+
|
|
535
|
+
==== Layout Issues
|
|
536
|
+
|
|
537
|
+
**Issue**: Elements overlap or poorly positioned
|
|
538
|
+
|
|
539
|
+
**Solution**:
|
|
540
|
+
|
|
541
|
+
* Use boundaries to organize elements
|
|
542
|
+
* Limit elements per diagram
|
|
543
|
+
* Consider using `UpdateLayoutConfig()` for fine-tuning
|
|
544
|
+
|
|
545
|
+
=== Getting Help
|
|
546
|
+
|
|
547
|
+
For issues not covered here:
|
|
548
|
+
|
|
549
|
+
* Check examples in `spec/mermaid/c4/`
|
|
550
|
+
* Review source code comments
|
|
551
|
+
* Submit bug reports with minimal reproducible examples
|
|
552
|
+
|
|
553
|
+
== See Also
|
|
554
|
+
|
|
555
|
+
* link:../README.adoc[Main Documentation]
|
|
556
|
+
* link:flowchart.adoc[Flowchart Diagrams]
|
|
557
|
+
* link:sequence.adoc[Sequence Diagrams]
|
|
558
|
+
* https://c4model.com/[C4 Model Official Site]
|
|
559
|
+
* https://github.com/plantuml-stdlib/C4-PlantUML[C4-PlantUML Reference]
|