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,314 @@
1
+ = Architecture Diagram
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Purpose
6
+
7
+ Architecture diagrams visualize software system architecture at different levels, showing system boundaries, services, components, and their relationships. This is useful for documenting system architecture, communicating design decisions, and understanding system topology.
8
+
9
+ == Features
10
+
11
+ === General
12
+
13
+ Architecture diagrams support:
14
+
15
+ * Services with icons and labels
16
+ * Grouping services into boundaries
17
+ * Nested group hierarchies
18
+ * Directional connections between services
19
+ * Edge labels for protocols/technologies
20
+ * Metadata (title, accessibility)
21
+
22
+ The implementation follows Mermaid's `architecture-beta` syntax.
23
+
24
+ === Basic services
25
+
26
+ Define services with icons and labels.
27
+
28
+ Syntax:
29
+
30
+ [source]
31
+ ----
32
+ architecture-beta
33
+ service {id}({icon})[{label}]
34
+ ----
35
+
36
+ Where,
37
+
38
+ `id`:: Unique identifier for the service
39
+ `icon`:: Icon type (database, server, disk, cloud, internet, browser, etc.)
40
+ `label`:: Display label for the service
41
+
42
+ .Defining basic services
43
+ [example]
44
+ ====
45
+ [source,mermaid]
46
+ ----
47
+ architecture-beta
48
+ service db(database)[Database]
49
+ service api(server)[API Server]
50
+ service ui(browser)[Web UI]
51
+ ----
52
+
53
+ This creates three services:
54
+
55
+ * A database service with ID `db`
56
+ * An API server with ID `api`
57
+ * A web UI with ID `ui`
58
+ ====
59
+
60
+ === Service connections
61
+
62
+ Connect services with directional arrows.
63
+
64
+ Syntax:
65
+
66
+ [source]
67
+ ----
68
+ {from_id}:{from_pos} --> {to_pos}:{to_id}
69
+ {from_id} --> {to_id}
70
+ ----
71
+
72
+ Where,
73
+
74
+ `from_id`:: Source service identifier
75
+ `to_id`:: Target service identifier
76
+ `from_pos`:: Optional position hint (L/R/T/B for left/right/top/bottom)
77
+ `to_pos`:: Optional position hint for target side
78
+
79
+ .Connecting services with position hints
80
+ [example]
81
+ ====
82
+ [source,mermaid]
83
+ ----
84
+ architecture-beta
85
+ service db(database)[Database]
86
+ service server(server)[Server]
87
+
88
+ db:R --> L:server
89
+ ----
90
+
91
+ This creates a connection from the right side of the database to the left side of the server.
92
+ ====
93
+
94
+ === Edge labels
95
+
96
+ Add labels to connections to indicate protocols or technologies.
97
+
98
+ Syntax:
99
+
100
+ [source]
101
+ ----
102
+ {from_id} --> {to_id}: {label}
103
+ ----
104
+
105
+ Where,
106
+
107
+ `label`:: Text describing the connection (e.g., HTTP, SQL, REST)
108
+
109
+ .Adding edge labels
110
+ [example]
111
+ ====
112
+ [source,mermaid]
113
+ ----
114
+ architecture-beta
115
+ service ui(browser)[Web UI]
116
+ service api(server)[API]
117
+ service db(database)[Database]
118
+
119
+ ui:R --> L:api: HTTP
120
+ api:R --> L:db: SQL
121
+ ----
122
+
123
+ This shows the protocols used between services.
124
+ ====
125
+
126
+ === Groups and boundaries
127
+
128
+ Group related services using boundaries.
129
+
130
+ Syntax:
131
+
132
+ [source]
133
+ ----
134
+ group {id}({icon})[{label}]
135
+ service {service_id}({icon})[{label}] in {group_id}
136
+ ----
137
+
138
+ Where,
139
+
140
+ `group_id`:: Identifier for the group
141
+ `service_id`:: Service to place in the group
142
+ `icon`:: Optional icon for the group (e.g., cloud)
143
+ `label`:: Display label for the group boundary
144
+
145
+ .Grouping services
146
+ [example]
147
+ ====
148
+ [source,mermaid]
149
+ ----
150
+ architecture-beta
151
+ group api(cloud)[API Layer]
152
+
153
+ service db(database)[Database] in api
154
+ service server(server)[Server] in api
155
+
156
+ service gateway(internet)[Gateway]
157
+
158
+ gateway:R --> L:server
159
+ ----
160
+
161
+ This creates an API Layer group containing the database and server, with an external gateway service.
162
+ ====
163
+
164
+ === Nested groups
165
+
166
+ Create hierarchical group structures.
167
+
168
+ Syntax:
169
+
170
+ [source]
171
+ ----
172
+ group {parent_id}[{label}]
173
+ group {child_id}[{label}] in {parent_id}
174
+ ----
175
+
176
+ .Creating nested groups
177
+ [example]
178
+ ====
179
+ [source,mermaid]
180
+ ----
181
+ architecture-beta
182
+ group api[API]
183
+ group public[Public API] in api
184
+ group private[Private API] in api
185
+
186
+ service web(server)[Web Server] in public
187
+ service admin(server)[Admin Server] in private
188
+ service db(database)[Database] in private
189
+ ----
190
+
191
+ This creates a hierarchical structure with public and private API groups within a main API group.
192
+ ====
193
+
194
+ === Title and accessibility
195
+
196
+ Add metadata for documentation and accessibility.
197
+
198
+ Syntax:
199
+
200
+ [source]
201
+ ----
202
+ architecture-beta
203
+ title {diagram title}
204
+ accTitle: {accessibility title}
205
+ accDescr: {accessibility description}
206
+ ----
207
+
208
+ .Adding metadata
209
+ [example]
210
+ ====
211
+ [source,mermaid]
212
+ ----
213
+ architecture-beta
214
+ title E-Commerce System Architecture
215
+ accTitle: System Architecture Diagram
216
+ accDescr: Shows the main components of the e-commerce platform
217
+
218
+ service ui(browser)[Web UI]
219
+ service api(server)[API Gateway]
220
+ service db(database)[Database]
221
+ ----
222
+ ====
223
+
224
+ === Icon types
225
+
226
+ Common icon types supported:
227
+
228
+ * `database` - Database systems
229
+ * `server` - Application servers
230
+ * `disk` - Storage systems
231
+ * `cloud` - Cloud services
232
+ * `internet` - Internet gateway
233
+ * `browser` - Web browsers/clients
234
+
235
+ Additional icon prefixes (for future extension):
236
+
237
+ * `logos:{name}` - Logo icons (e.g., `logos:aws-s3`)
238
+ * `fa:{name}` - Font Awesome icons (e.g., `fa:image`)
239
+
240
+ == Implementation
241
+
242
+ Architecture diagrams use a 7-file Parslet architecture:
243
+
244
+ . **Model** ([`lib/sirena/diagram/architecture.rb`](lib/sirena/diagram/architecture.rb)) - Lutaml::Model classes for diagram structure
245
+ . **Grammar** ([`lib/sirena/parser/grammars/architecture.rb`](lib/sirena/parser/grammars/architecture.rb)) - Parslet grammar for syntax parsing
246
+ . **Transform** ([`lib/sirena/parser/transforms/architecture.rb`](lib/sirena/parser/transforms/architecture.rb)) - Converts parse tree to model
247
+ . **Parser** ([`lib/sirena/parser/architecture.rb`](lib/sirena/parser/architecture.rb)) - Orchestrates parsing pipeline
248
+ . **Layout** ([`lib/sirena/transform/architecture.rb`](lib/sirena/transform/architecture.rb)) - Positions elements spatially
249
+ . **Renderer** ([`lib/sirena/renderer/architecture.rb`](lib/sirena/renderer/architecture.rb)) - Generates SVG output
250
+ . **Tests** - Parser and renderer test suites
251
+
252
+ The implementation follows MECE principles with clear separation of concerns between parsing, transformation, layout, and rendering stages.
253
+
254
+ == Examples
255
+
256
+ === Simple three-tier architecture
257
+
258
+ [source,mermaid]
259
+ ----
260
+ architecture-beta
261
+ service ui(browser)[Web UI]
262
+ service api(server)[API Server]
263
+ service db(database)[Database]
264
+
265
+ ui:R --> L:api: HTTPS
266
+ api:R --> L:db: SQL
267
+ ----
268
+
269
+ === Microservices with groups
270
+
271
+ [source,mermaid]
272
+ ----
273
+ architecture-beta
274
+ group frontend[Frontend]
275
+ group backend[Backend Services]
276
+ group data[Data Layer]
277
+
278
+ service web(browser)[Web App] in frontend
279
+ service mobile(browser)[Mobile App] in frontend
280
+
281
+ service auth(server)[Auth Service] in backend
282
+ service orders(server)[Order Service] in backend
283
+ service inventory(server)[Inventory Service] in backend
284
+
285
+ service db(database)[Primary DB] in data
286
+ service cache(disk)[Cache] in data
287
+
288
+ web:B --> T:auth
289
+ mobile:B --> T:auth
290
+ auth:B --> T:db
291
+ orders:B --> T:db
292
+ inventory:R --> L:cache
293
+ ----
294
+
295
+ === Cloud architecture
296
+
297
+ [source,mermaid]
298
+ ----
299
+ architecture-beta
300
+ title Cloud Infrastructure
301
+
302
+ group aws(cloud)[AWS Cloud]
303
+
304
+ service lb(internet)[Load Balancer] in aws
305
+ service web(server)[Web Servers] in aws
306
+ service app(server)[App Servers] in aws
307
+ service db(database)[RDS Database] in aws
308
+ service s3(disk)[S3 Storage] in aws
309
+
310
+ lb:B --> T:web: HTTPS
311
+ web:B --> T:app: HTTP
312
+ app:R --> L:db: SQL
313
+ app:B --> T:s3: S3 API
314
+ ----
@@ -0,0 +1,345 @@
1
+ = Block Diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == General
6
+
7
+ Block diagrams in Sirena provide a column-based layout system for visualizing hierarchical structures, data flows, and system architectures using blocks and connections. Unlike flowcharts which use graph-based layouts, block diagrams arrange elements in a structured grid with explicit column positioning.
8
+
9
+ Block diagrams are declared with the `block-beta` keyword and support:
10
+
11
+ * Column-based layouts with configurable column counts
12
+ * Blocks with optional labels and width specifications
13
+ * Compound/nested blocks for hierarchical structures
14
+ * Space placeholders for layout control
15
+ * Connections between blocks (arrows and lines)
16
+ * Multiple block shapes (rectangles, circles)
17
+ * Styling directives for customization
18
+
19
+ == Basic block diagram
20
+
21
+ The simplest block diagram contains blocks arranged in columns:
22
+
23
+ [source,mermaid]
24
+ ----
25
+ block-beta
26
+ columns 2
27
+ A["Block A"]
28
+ B["Block B"]
29
+ ----
30
+
31
+ This creates a two-column layout with two blocks side by side.
32
+
33
+ == Block declarations
34
+
35
+ === Simple blocks
36
+
37
+ Blocks can be declared with just an identifier:
38
+
39
+ [source,mermaid]
40
+ ----
41
+ block-beta
42
+ A
43
+ B
44
+ C
45
+ ----
46
+
47
+ Without a label, the block displays its identifier as the label.
48
+
49
+ === Blocks with labels
50
+
51
+ Blocks can have custom labels using bracket notation:
52
+
53
+ [source,mermaid]
54
+ ----
55
+ block-beta
56
+ id1["Custom Label"]
57
+ id2["Another Block"]
58
+ ----
59
+
60
+ The label text appears inside the block, while the identifier is used for connections.
61
+
62
+ === Block widths
63
+
64
+ Blocks can span multiple columns using width specifications:
65
+
66
+ [source,mermaid]
67
+ ----
68
+ block-beta
69
+ columns 3
70
+ A:2
71
+ B:1
72
+ C:3
73
+ ----
74
+
75
+ Where:
76
+
77
+ `A:2`:: Block A spans 2 columns
78
+ `B:1`:: Block B spans 1 column (default)
79
+ `C:3`:: Block C spans 3 columns (entire row)
80
+
81
+ == Column layout
82
+
83
+ === Columns statement
84
+
85
+ The `columns` directive specifies how many columns the layout uses:
86
+
87
+ [source,mermaid]
88
+ ----
89
+ block-beta
90
+ columns 3
91
+ A
92
+ B
93
+ C
94
+ D
95
+ E
96
+ F
97
+ ----
98
+
99
+ This creates a grid with 3 columns. Blocks flow left to right, top to bottom.
100
+
101
+ === Default columns
102
+
103
+ If no `columns` statement is provided, the default is 1 column (vertical layout):
104
+
105
+ [source,mermaid]
106
+ ----
107
+ block-beta
108
+ A
109
+ B
110
+ C
111
+ ----
112
+
113
+ All blocks stack vertically in a single column.
114
+
115
+ == Block shapes
116
+
117
+ === Rectangle shape (default)
118
+
119
+ Blocks are rectangles by default, but can be explicitly labeled:
120
+
121
+ [source,mermaid]
122
+ ----
123
+ block-beta
124
+ A["Rectangle Block"]
125
+ ----
126
+
127
+ === Circle shape
128
+
129
+ Use double parentheses for circular blocks:
130
+
131
+ [source,mermaid]
132
+ ----
133
+ block-beta
134
+ db(("Database"))
135
+ ----
136
+
137
+ This creates a circular block, often used for databases or special nodes.
138
+
139
+ == Compound blocks
140
+
141
+ === Basic compound blocks
142
+
143
+ Compound blocks contain nested child blocks:
144
+
145
+ [source,mermaid]
146
+ ----
147
+ block-beta
148
+ block:group1
149
+ A
150
+ B
151
+ C
152
+ end
153
+ ----
154
+
155
+ Where:
156
+
157
+ `block:group1`:: Declares a compound block with ID "group1"
158
+ `A`, `B`, `C`:: Child blocks nested inside
159
+ `end`:: Closes the compound block
160
+
161
+ === Nested compound blocks
162
+
163
+ Compound blocks can be nested:
164
+
165
+ [source,mermaid]
166
+ ----
167
+ block-beta
168
+ block:outer
169
+ A
170
+ block:inner
171
+ B
172
+ C
173
+ end
174
+ D
175
+ end
176
+ ----
177
+
178
+ This creates a hierarchical structure with multiple levels.
179
+
180
+ == Space placeholders
181
+
182
+ === Space blocks
183
+
184
+ Use `space` to create empty cells in the grid:
185
+
186
+ [source,mermaid]
187
+ ----
188
+ block-beta
189
+ columns 3
190
+ A
191
+ space
192
+ B
193
+ C
194
+ space
195
+ space
196
+ ----
197
+
198
+ Space blocks maintain grid alignment but don't render visually.
199
+
200
+ == Connections
201
+
202
+ === Arrow connections
203
+
204
+ Connect blocks with arrows using `-->`:
205
+
206
+ [source,mermaid]
207
+ ----
208
+ block-beta
209
+ A
210
+ B
211
+ A --> B
212
+ ----
213
+
214
+ This draws an arrow from block A to block B.
215
+
216
+ === Line connections
217
+
218
+ Use `---` for non-directed line connections:
219
+
220
+ [source,mermaid]
221
+ ----
222
+ block-beta
223
+ A
224
+ B
225
+ A --- B
226
+ ----
227
+
228
+ This draws a simple line without an arrowhead.
229
+
230
+ === Multiple connections
231
+
232
+ A block can have multiple connections:
233
+
234
+ [source,mermaid]
235
+ ----
236
+ block-beta
237
+ A
238
+ B
239
+ C
240
+ A --> B
241
+ A --> C
242
+ B --> C
243
+ ----
244
+
245
+ == Styling
246
+
247
+ === Block styling
248
+
249
+ Style individual blocks using the `style` directive:
250
+
251
+ [source,mermaid]
252
+ ----
253
+ block-beta
254
+ A["Styled Block"]
255
+ style A fill:#969,stroke:#333,stroke-width:4px
256
+ ----
257
+
258
+ Where:
259
+
260
+ `fill:#969`:: Background color
261
+ `stroke:#333`:: Border color
262
+ `stroke-width:4px`:: Border width
263
+
264
+ === Style properties
265
+
266
+ Supported style properties include:
267
+
268
+ * `fill` - Background color
269
+ * `stroke` - Border color
270
+ * `stroke-width` - Border thickness
271
+
272
+ == Complete example
273
+
274
+ Here's a comprehensive example showing various features:
275
+
276
+ [source,mermaid]
277
+ ----
278
+ block-beta
279
+ columns 3
280
+
281
+ db(("Database"))
282
+ space
283
+ api["API Server"]
284
+
285
+ block:services
286
+ auth["Auth Service"]
287
+ users["User Service"]
288
+ data["Data Service"]
289
+ end
290
+
291
+ web["Web Client"]:3
292
+
293
+ db --> services
294
+ services --> api
295
+ api --> web
296
+
297
+ style db fill:#69f,stroke:#333,stroke-width:2px
298
+ style api fill:#f96,stroke:#333,stroke-width:2px
299
+ ----
300
+
301
+ This creates a multi-tier architecture diagram with:
302
+
303
+ * 3-column layout
304
+ * Circular database block
305
+ * Compound services block
306
+ * Full-width web client block
307
+ * Connections showing data flow
308
+ * Custom styling for key components
309
+
310
+ == Implementation notes
311
+
312
+ === Column-based layout
313
+
314
+ Unlike flowcharts that use graph algorithms, block diagrams use explicit column-based positioning. Blocks are placed in columns from left to right, wrapping to the next row when a row is full.
315
+
316
+ === Width calculation
317
+
318
+ Block widths are calculated based on:
319
+
320
+ * Explicit width specifications (`:N` syntax)
321
+ * Label text dimensions
322
+ * Minimum block size constraints
323
+
324
+ === Connection routing
325
+
326
+ Connections are routed from the bottom center of the source block to the top center of the target block using straight lines. Future enhancements may include bezier curves for more aesthetic routing.
327
+
328
+ === Compound block rendering
329
+
330
+ Compound blocks are rendered with:
331
+
332
+ * Dashed border to indicate grouping
333
+ * Padding around child blocks
334
+ * Automatic height calculation based on children
335
+
336
+ == Theme integration
337
+
338
+ Block diagrams support full theme integration:
339
+
340
+ * Block colors from theme palette
341
+ * Border colors and styles
342
+ * Text styling and fonts
343
+ * Connection colors and styles
344
+
345
+ All visual properties can be customized through themes or inline styling.