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.
Files changed (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build_deploy.yml +59 -0
  3. data/.github/workflows/links.yml +85 -0
  4. data/.github/workflows/rake.yml +15 -0
  5. data/.github/workflows/release.yml +27 -0
  6. data/.gitignore +68 -0
  7. data/.rspec +3 -0
  8. data/.rubocop.yml +14 -0
  9. data/.rubocop_todo.yml +70 -0
  10. data/ARCHITECTURE.md +744 -0
  11. data/Gemfile +12 -0
  12. data/LICENSE +25 -0
  13. data/README.adoc +357 -0
  14. data/Rakefile +11 -0
  15. data/docs/.gitignore +1 -0
  16. data/docs/Gemfile +13 -0
  17. data/docs/_config.yml +182 -0
  18. data/docs/_diagram_types/architecture-diagram.adoc +314 -0
  19. data/docs/_diagram_types/block-diagram.adoc +345 -0
  20. data/docs/_diagram_types/c4-diagram.adoc +559 -0
  21. data/docs/_diagram_types/class-diagram.adoc +816 -0
  22. data/docs/_diagram_types/er-diagram.adoc +719 -0
  23. data/docs/_diagram_types/error-diagram.adoc +114 -0
  24. data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
  25. data/docs/_diagram_types/flowchart.adoc +488 -0
  26. data/docs/_diagram_types/gantt-chart.adoc +502 -0
  27. data/docs/_diagram_types/git-graph.adoc +600 -0
  28. data/docs/_diagram_types/index.adoc +192 -0
  29. data/docs/_diagram_types/info-diagram.adoc +103 -0
  30. data/docs/_diagram_types/kanban-diagram.adoc +262 -0
  31. data/docs/_diagram_types/mindmap.adoc +603 -0
  32. data/docs/_diagram_types/packet-diagram.adoc +378 -0
  33. data/docs/_diagram_types/pie-chart.adoc +335 -0
  34. data/docs/_diagram_types/quadrant-chart.adoc +406 -0
  35. data/docs/_diagram_types/radar-chart.adoc +528 -0
  36. data/docs/_diagram_types/requirement-diagram.adoc +416 -0
  37. data/docs/_diagram_types/sankey-diagram.adoc +357 -0
  38. data/docs/_diagram_types/sequence-diagram.adoc +664 -0
  39. data/docs/_diagram_types/state-diagram.adoc +658 -0
  40. data/docs/_diagram_types/timeline.adoc +352 -0
  41. data/docs/_diagram_types/treemap-diagram.adoc +462 -0
  42. data/docs/_diagram_types/user-journey.adoc +602 -0
  43. data/docs/_features/index.adoc +129 -0
  44. data/docs/_guides/cli-reference.adoc +203 -0
  45. data/docs/_guides/index.adoc +56 -0
  46. data/docs/_guides/installation.adoc +100 -0
  47. data/docs/_guides/quick-start.adoc +132 -0
  48. data/docs/_pages/comparison.adoc +441 -0
  49. data/docs/_pages/compatibility.adoc +300 -0
  50. data/docs/_pages/index.adoc +39 -0
  51. data/docs/_references/index.adoc +103 -0
  52. data/docs/_tutorials/index.adoc +57 -0
  53. data/docs/index.adoc +166 -0
  54. data/docs/lychee.toml +54 -0
  55. data/examples/.gitignore +10 -0
  56. data/examples/README.adoc +196 -0
  57. data/examples/README.md +64 -0
  58. data/examples/architecture/01-basic-services.mmd +9 -0
  59. data/examples/architecture/01-basic-services.svg +37 -0
  60. data/examples/architecture/02-service-groups.mmd +16 -0
  61. data/examples/architecture/02-service-groups.svg +55 -0
  62. data/examples/architecture/README.adoc +79 -0
  63. data/examples/block/01-basic-blocks.mmd +13 -0
  64. data/examples/block/01-basic-blocks.svg +44 -0
  65. data/examples/block/02-block-shapes.mmd +13 -0
  66. data/examples/block/02-block-shapes.svg +47 -0
  67. data/examples/block/README.adoc +85 -0
  68. data/examples/c4/01-context-diagram.mmd +10 -0
  69. data/examples/c4/01-context-diagram.svg +45 -0
  70. data/examples/c4/02-container-diagram.mmd +24 -0
  71. data/examples/c4/02-container-diagram.svg +105 -0
  72. data/examples/c4/README.adoc +92 -0
  73. data/examples/class_diagram/01-basic-classes.mmd +61 -0
  74. data/examples/class_diagram/01-basic-classes.svg +117 -0
  75. data/examples/class_diagram/02-relationships.mmd +61 -0
  76. data/examples/class_diagram/02-relationships.svg +129 -0
  77. data/examples/class_diagram/README.adoc +93 -0
  78. data/examples/er_diagram/01-basic-entities.mmd +64 -0
  79. data/examples/er_diagram/01-basic-entities.svg +5 -0
  80. data/examples/er_diagram/02-cardinality.mmd +57 -0
  81. data/examples/er_diagram/02-cardinality.svg +125 -0
  82. data/examples/er_diagram/README.adoc +88 -0
  83. data/examples/error/01-basic-error.mmd +1 -0
  84. data/examples/error/01-basic-error.svg +13 -0
  85. data/examples/error/02-error-display.mmd +1 -0
  86. data/examples/error/02-error-display.svg +13 -0
  87. data/examples/error/README.adoc +71 -0
  88. data/examples/error_message_example.svg +13 -0
  89. data/examples/flowchart/00-original.mmd +13 -0
  90. data/examples/flowchart/00-original.svg +5 -0
  91. data/examples/flowchart/01-basic-flow.mmd +7 -0
  92. data/examples/flowchart/01-basic-flow.svg +52 -0
  93. data/examples/flowchart/01-basic-flow.yml +13 -0
  94. data/examples/flowchart/02*.svg +87 -0
  95. data/examples/flowchart/02-node-shapes.mmd +9 -0
  96. data/examples/flowchart/02-node-shapes.svg +33 -0
  97. data/examples/flowchart/03-edge-types.mmd +7 -0
  98. data/examples/flowchart/03-edge-types.svg +53 -0
  99. data/examples/flowchart/04-subgraphs.mmd +9 -0
  100. data/examples/flowchart/04-subgraphs.svg +33 -0
  101. data/examples/flowchart/05-styling.mmd +9 -0
  102. data/examples/flowchart/05-styling.svg +33 -0
  103. data/examples/flowchart/06-complex-flow.mmd +8 -0
  104. data/examples/flowchart/06-complex-flow.svg +59 -0
  105. data/examples/flowchart/README.adoc +167 -0
  106. data/examples/gantt/01-simple-timeline.* +14 -0
  107. data/examples/gantt/01-simple-timeline.mmd +6 -0
  108. data/examples/gantt/01-simple-timeline.svg +26 -0
  109. data/examples/gantt/02-task-dependencies.mmd +6 -0
  110. data/examples/gantt/02-task-dependencies.svg +26 -0
  111. data/examples/gantt/README.adoc +86 -0
  112. data/examples/git_graph/01-linear-history.mmd +12 -0
  113. data/examples/git_graph/01-linear-history.svg +26 -0
  114. data/examples/git_graph/02-branching.mmd +12 -0
  115. data/examples/git_graph/02-branching.svg +26 -0
  116. data/examples/git_graph/README.adoc +73 -0
  117. data/examples/info/02-showinfo.mmd +1 -0
  118. data/examples/info/02-showinfo.svg +10 -0
  119. data/examples/info/README.adoc +58 -0
  120. data/examples/info_showinfo_example.svg +10 -0
  121. data/examples/kanban/01-simple-board.mmd +8 -0
  122. data/examples/kanban/01-simple-board.svg +43 -0
  123. data/examples/kanban/02-workflow.mmd +8 -0
  124. data/examples/kanban/02-workflow.svg +43 -0
  125. data/examples/kanban/README.adoc +79 -0
  126. data/examples/mindmap/01-simple-tree.mmd +19 -0
  127. data/examples/mindmap/01-simple-tree.svg +61 -0
  128. data/examples/mindmap/02-knowledge-map.mmd +19 -0
  129. data/examples/mindmap/02-knowledge-map.svg +61 -0
  130. data/examples/mindmap/README.adoc +77 -0
  131. data/examples/packet/01-basic-packet.* +17 -0
  132. data/examples/packet/01-basic-packet.mmd +4 -0
  133. data/examples/packet/01-basic-packet.svg +82 -0
  134. data/examples/packet/README.adoc +58 -0
  135. data/examples/pie/01-simple-chart.mmd +5 -0
  136. data/examples/pie/01-simple-chart.svg +17 -0
  137. data/examples/pie/02-labeled-slices.mmd +6 -0
  138. data/examples/pie/02-labeled-slices.svg +19 -0
  139. data/examples/pie/README.adoc +75 -0
  140. data/examples/quadrant/01-basic-quadrant.mmd +13 -0
  141. data/examples/quadrant/01-basic-quadrant.svg +33 -0
  142. data/examples/quadrant/02-positioned-items.mmd +14 -0
  143. data/examples/quadrant/02-positioned-items.svg +35 -0
  144. data/examples/quadrant/README.adoc +84 -0
  145. data/examples/radar/01-simple-radar.* +5 -0
  146. data/examples/radar/01-simple-radar.mmd +3 -0
  147. data/examples/radar/01-simple-radar.svg +25 -0
  148. data/examples/radar/02-multiple-curves.mmd +4 -0
  149. data/examples/radar/02-multiple-curves.svg +43 -0
  150. data/examples/radar/README.adoc +75 -0
  151. data/examples/requirement/01-basic-requirements.mmd +23 -0
  152. data/examples/requirement/01-basic-requirements.svg +49 -0
  153. data/examples/requirement/02-risk-levels.mmd +23 -0
  154. data/examples/requirement/02-risk-levels.svg +49 -0
  155. data/examples/requirement/README.adoc +85 -0
  156. data/examples/sankey/01-simple-flow.mmd +7 -0
  157. data/examples/sankey/01-simple-flow.svg +34 -0
  158. data/examples/sankey/02-multi-stage.mmd +11 -0
  159. data/examples/sankey/02-multi-stage.svg +44 -0
  160. data/examples/sankey/README.adoc +74 -0
  161. data/examples/sequence/01-basic-sequence.mmd +27 -0
  162. data/examples/sequence/01-basic-sequence.svg +5 -0
  163. data/examples/sequence/02-activations.mmd +17 -0
  164. data/examples/sequence/02-activations.svg +78 -0
  165. data/examples/sequence/README.adoc +86 -0
  166. data/examples/state_diagram/01-simple-states.mmd +29 -0
  167. data/examples/state_diagram/01-simple-states.svg +5 -0
  168. data/examples/state_diagram/02-composite.mmd +19 -0
  169. data/examples/state_diagram/02-composite.svg +81 -0
  170. data/examples/state_diagram/README.adoc +90 -0
  171. data/examples/timeline/01-simple-timeline.mmd +11 -0
  172. data/examples/timeline/01-simple-timeline.svg +36 -0
  173. data/examples/timeline/02-periods.mmd +15 -0
  174. data/examples/timeline/02-periods.svg +47 -0
  175. data/examples/timeline/README.adoc +78 -0
  176. data/examples/treemap/01-basic-treemap.mmd +12 -0
  177. data/examples/treemap/01-basic-treemap.svg +59 -0
  178. data/examples/treemap/README.adoc +59 -0
  179. data/examples/user_journey/01-simple-journey.mmd +23 -0
  180. data/examples/user_journey/01-simple-journey.svg +5 -0
  181. data/examples/user_journey/02-multi-actor.mmd +18 -0
  182. data/examples/user_journey/02-multi-actor.svg +129 -0
  183. data/examples/user_journey/README.adoc +81 -0
  184. data/examples/xychart/01-line-chart.mmd +5 -0
  185. data/examples/xychart/01-line-chart.svg +43 -0
  186. data/examples/xychart/02-bar-chart.mmd +7 -0
  187. data/examples/xychart/02-bar-chart.svg +48 -0
  188. data/examples/xychart/README.adoc +80 -0
  189. data/exe/sirena +7 -0
  190. data/lib/sirena/cli.rb +138 -0
  191. data/lib/sirena/commands/batch.rb +117 -0
  192. data/lib/sirena/commands/render.rb +80 -0
  193. data/lib/sirena/commands/types.rb +29 -0
  194. data/lib/sirena/commands/version.rb +24 -0
  195. data/lib/sirena/diagram/architecture.rb +46 -0
  196. data/lib/sirena/diagram/base.rb +61 -0
  197. data/lib/sirena/diagram/block.rb +81 -0
  198. data/lib/sirena/diagram/c4.rb +328 -0
  199. data/lib/sirena/diagram/class_diagram.rb +385 -0
  200. data/lib/sirena/diagram/er_diagram.rb +238 -0
  201. data/lib/sirena/diagram/error.rb +38 -0
  202. data/lib/sirena/diagram/flowchart.rb +160 -0
  203. data/lib/sirena/diagram/gantt.rb +71 -0
  204. data/lib/sirena/diagram/git_graph.rb +36 -0
  205. data/lib/sirena/diagram/info.rb +38 -0
  206. data/lib/sirena/diagram/kanban.rb +178 -0
  207. data/lib/sirena/diagram/mindmap.rb +54 -0
  208. data/lib/sirena/diagram/packet.rb +79 -0
  209. data/lib/sirena/diagram/pie.rb +115 -0
  210. data/lib/sirena/diagram/quadrant.rb +138 -0
  211. data/lib/sirena/diagram/radar.rb +52 -0
  212. data/lib/sirena/diagram/requirement.rb +133 -0
  213. data/lib/sirena/diagram/sankey.rb +217 -0
  214. data/lib/sirena/diagram/sequence.rb +242 -0
  215. data/lib/sirena/diagram/state_diagram.rb +237 -0
  216. data/lib/sirena/diagram/timeline.rb +171 -0
  217. data/lib/sirena/diagram/treemap.rb +84 -0
  218. data/lib/sirena/diagram/user_journey.rb +149 -0
  219. data/lib/sirena/diagram/xy_chart.rb +76 -0
  220. data/lib/sirena/diagram.rb +8 -0
  221. data/lib/sirena/diagram_registry.rb +101 -0
  222. data/lib/sirena/engine.rb +292 -0
  223. data/lib/sirena/parser/architecture.rb +41 -0
  224. data/lib/sirena/parser/base.rb +41 -0
  225. data/lib/sirena/parser/block.rb +72 -0
  226. data/lib/sirena/parser/c4.rb +53 -0
  227. data/lib/sirena/parser/class_diagram.rb +63 -0
  228. data/lib/sirena/parser/er_diagram.rb +40 -0
  229. data/lib/sirena/parser/error.rb +49 -0
  230. data/lib/sirena/parser/flowchart.rb +71 -0
  231. data/lib/sirena/parser/gantt.rb +60 -0
  232. data/lib/sirena/parser/git_graph.rb +95 -0
  233. data/lib/sirena/parser/grammars/architecture.rb +145 -0
  234. data/lib/sirena/parser/grammars/block.rb +190 -0
  235. data/lib/sirena/parser/grammars/c4.rb +226 -0
  236. data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
  237. data/lib/sirena/parser/grammars/common.rb +84 -0
  238. data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
  239. data/lib/sirena/parser/grammars/error.rb +40 -0
  240. data/lib/sirena/parser/grammars/flowchart.rb +298 -0
  241. data/lib/sirena/parser/grammars/gantt.rb +252 -0
  242. data/lib/sirena/parser/grammars/git_graph.rb +167 -0
  243. data/lib/sirena/parser/grammars/info.rb +58 -0
  244. data/lib/sirena/parser/grammars/kanban.rb +83 -0
  245. data/lib/sirena/parser/grammars/mindmap.rb +115 -0
  246. data/lib/sirena/parser/grammars/packet.rb +73 -0
  247. data/lib/sirena/parser/grammars/pie.rb +128 -0
  248. data/lib/sirena/parser/grammars/quadrant.rb +199 -0
  249. data/lib/sirena/parser/grammars/radar.rb +150 -0
  250. data/lib/sirena/parser/grammars/requirement.rb +188 -0
  251. data/lib/sirena/parser/grammars/sankey.rb +104 -0
  252. data/lib/sirena/parser/grammars/sequence.rb +247 -0
  253. data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
  254. data/lib/sirena/parser/grammars/timeline.rb +142 -0
  255. data/lib/sirena/parser/grammars/treemap.rb +120 -0
  256. data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
  257. data/lib/sirena/parser/info.rb +49 -0
  258. data/lib/sirena/parser/kanban.rb +97 -0
  259. data/lib/sirena/parser/mindmap.rb +106 -0
  260. data/lib/sirena/parser/packet.rb +76 -0
  261. data/lib/sirena/parser/pie.rb +49 -0
  262. data/lib/sirena/parser/quadrant.rb +57 -0
  263. data/lib/sirena/parser/radar.rb +104 -0
  264. data/lib/sirena/parser/requirement.rb +70 -0
  265. data/lib/sirena/parser/sankey.rb +64 -0
  266. data/lib/sirena/parser/sequence.rb +51 -0
  267. data/lib/sirena/parser/state_diagram.rb +69 -0
  268. data/lib/sirena/parser/timeline.rb +57 -0
  269. data/lib/sirena/parser/transforms/architecture.rb +97 -0
  270. data/lib/sirena/parser/transforms/block.rb +254 -0
  271. data/lib/sirena/parser/transforms/c4.rb +347 -0
  272. data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
  273. data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
  274. data/lib/sirena/parser/transforms/error.rb +58 -0
  275. data/lib/sirena/parser/transforms/flowchart.rb +293 -0
  276. data/lib/sirena/parser/transforms/gantt.rb +215 -0
  277. data/lib/sirena/parser/transforms/git_graph.rb +160 -0
  278. data/lib/sirena/parser/transforms/info.rb +58 -0
  279. data/lib/sirena/parser/transforms/kanban.rb +176 -0
  280. data/lib/sirena/parser/transforms/mindmap.rb +227 -0
  281. data/lib/sirena/parser/transforms/packet.rb +63 -0
  282. data/lib/sirena/parser/transforms/pie.rb +143 -0
  283. data/lib/sirena/parser/transforms/quadrant.rb +177 -0
  284. data/lib/sirena/parser/transforms/radar.rb +126 -0
  285. data/lib/sirena/parser/transforms/requirement.rb +272 -0
  286. data/lib/sirena/parser/transforms/sankey.rb +122 -0
  287. data/lib/sirena/parser/transforms/sequence.rb +342 -0
  288. data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
  289. data/lib/sirena/parser/transforms/timeline.rb +177 -0
  290. data/lib/sirena/parser/transforms/treemap.rb +81 -0
  291. data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
  292. data/lib/sirena/parser/treemap.rb +98 -0
  293. data/lib/sirena/parser/user_journey.rb +120 -0
  294. data/lib/sirena/parser/xy_chart.rb +114 -0
  295. data/lib/sirena/parser.rb +8 -0
  296. data/lib/sirena/renderer/architecture.rb +251 -0
  297. data/lib/sirena/renderer/base.rb +251 -0
  298. data/lib/sirena/renderer/block.rb +286 -0
  299. data/lib/sirena/renderer/c4.rb +490 -0
  300. data/lib/sirena/renderer/class_diagram.rb +499 -0
  301. data/lib/sirena/renderer/er_diagram.rb +417 -0
  302. data/lib/sirena/renderer/error.rb +131 -0
  303. data/lib/sirena/renderer/flowchart.rb +301 -0
  304. data/lib/sirena/renderer/gantt.rb +331 -0
  305. data/lib/sirena/renderer/git_graph.rb +368 -0
  306. data/lib/sirena/renderer/info.rb +93 -0
  307. data/lib/sirena/renderer/kanban.rb +295 -0
  308. data/lib/sirena/renderer/mindmap.rb +396 -0
  309. data/lib/sirena/renderer/packet.rb +239 -0
  310. data/lib/sirena/renderer/pie.rb +235 -0
  311. data/lib/sirena/renderer/quadrant.rb +292 -0
  312. data/lib/sirena/renderer/radar.rb +323 -0
  313. data/lib/sirena/renderer/requirement.rb +371 -0
  314. data/lib/sirena/renderer/sankey.rb +255 -0
  315. data/lib/sirena/renderer/sequence.rb +424 -0
  316. data/lib/sirena/renderer/state_diagram.rb +328 -0
  317. data/lib/sirena/renderer/timeline.rb +304 -0
  318. data/lib/sirena/renderer/treemap.rb +152 -0
  319. data/lib/sirena/renderer/user_journey.rb +331 -0
  320. data/lib/sirena/renderer/xy_chart.rb +452 -0
  321. data/lib/sirena/renderer.rb +8 -0
  322. data/lib/sirena/svg/circle.rb +41 -0
  323. data/lib/sirena/svg/document.rb +103 -0
  324. data/lib/sirena/svg/element.rb +65 -0
  325. data/lib/sirena/svg/ellipse.rb +33 -0
  326. data/lib/sirena/svg/group.rb +71 -0
  327. data/lib/sirena/svg/line.rb +49 -0
  328. data/lib/sirena/svg/path.rb +76 -0
  329. data/lib/sirena/svg/polygon.rb +43 -0
  330. data/lib/sirena/svg/polyline.rb +35 -0
  331. data/lib/sirena/svg/rect.rb +57 -0
  332. data/lib/sirena/svg/style.rb +44 -0
  333. data/lib/sirena/svg/text.rb +72 -0
  334. data/lib/sirena/svg.rb +19 -0
  335. data/lib/sirena/text_measurement.rb +71 -0
  336. data/lib/sirena/theme/builtin/dark.yml +70 -0
  337. data/lib/sirena/theme/builtin/default.yml +80 -0
  338. data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
  339. data/lib/sirena/theme/builtin/light.yml +70 -0
  340. data/lib/sirena/theme/color_palette.rb +48 -0
  341. data/lib/sirena/theme/effect_styles.rb +28 -0
  342. data/lib/sirena/theme/registry.rb +41 -0
  343. data/lib/sirena/theme/shape_styles.rb +28 -0
  344. data/lib/sirena/theme/spacing_config.rb +24 -0
  345. data/lib/sirena/theme/typography.rb +30 -0
  346. data/lib/sirena/theme.rb +69 -0
  347. data/lib/sirena/transform/architecture.rb +273 -0
  348. data/lib/sirena/transform/base.rb +199 -0
  349. data/lib/sirena/transform/block.rb +215 -0
  350. data/lib/sirena/transform/c4.rb +288 -0
  351. data/lib/sirena/transform/class_diagram.rb +296 -0
  352. data/lib/sirena/transform/er_diagram.rb +204 -0
  353. data/lib/sirena/transform/error.rb +39 -0
  354. data/lib/sirena/transform/flowchart.rb +161 -0
  355. data/lib/sirena/transform/gantt.rb +253 -0
  356. data/lib/sirena/transform/git_graph.rb +283 -0
  357. data/lib/sirena/transform/info.rb +39 -0
  358. data/lib/sirena/transform/kanban.rb +180 -0
  359. data/lib/sirena/transform/mindmap.rb +251 -0
  360. data/lib/sirena/transform/packet.rb +185 -0
  361. data/lib/sirena/transform/pie.rb +62 -0
  362. data/lib/sirena/transform/quadrant.rb +167 -0
  363. data/lib/sirena/transform/radar.rb +227 -0
  364. data/lib/sirena/transform/requirement.rb +233 -0
  365. data/lib/sirena/transform/sankey.rb +212 -0
  366. data/lib/sirena/transform/sequence.rb +143 -0
  367. data/lib/sirena/transform/state_diagram.rb +228 -0
  368. data/lib/sirena/transform/timeline.rb +139 -0
  369. data/lib/sirena/transform/treemap.rb +120 -0
  370. data/lib/sirena/transform/user_journey.rb +207 -0
  371. data/lib/sirena/transform/xy_chart.rb +273 -0
  372. data/lib/sirena/transform.rb +8 -0
  373. data/lib/sirena/version.rb +5 -0
  374. data/lib/sirena.rb +328 -0
  375. data/lib/tasks/benchmark.rake +532 -0
  376. data/lib/tasks/examples.rake +468 -0
  377. data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
  378. data/lib/tasks/mermaid_fixtures.rake +46 -0
  379. data/scripts/extract_mermaid_tests.rb +493 -0
  380. data/scripts/rename_to_sirena.rb +73 -0
  381. data/sirena.gemspec +47 -0
  382. 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]