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,664 @@
1
+ = Sequence diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Sequence diagrams in Sirena represent interactions between participants over time. They show how processes operate with one another and in what order, making them ideal for documenting system interactions, API calls, and message flows.
8
+
9
+ Sequence diagrams are useful for:
10
+
11
+ * Documenting API interactions and request/response flows
12
+ * Visualizing authentication and authorization processes
13
+ * Mapping multi-system communication patterns
14
+ * Showing temporal relationships between components
15
+ * Illustrating concurrent and asynchronous operations
16
+
17
+ == Syntax specification
18
+
19
+ === Diagram declaration
20
+
21
+ Sequence diagrams are declared using the `sequenceDiagram` keyword:
22
+
23
+ [source,mermaid]
24
+ ----
25
+ sequenceDiagram
26
+ <diagram-content>
27
+ ----
28
+
29
+ === Participants
30
+
31
+ Participants can be declared explicitly or implicitly:
32
+
33
+ [source,mermaid]
34
+ ----
35
+ sequenceDiagram
36
+ participant Alice
37
+ participant Bob
38
+ Alice->>Bob: Hello
39
+ ----
40
+
41
+ ==== Participant aliases
42
+
43
+ Participants can have aliases for cleaner syntax:
44
+
45
+ [source,mermaid]
46
+ ----
47
+ sequenceDiagram
48
+ participant A as Alice
49
+ participant B as Bob
50
+ A->>B: Hello
51
+ ----
52
+
53
+ ==== Actor syntax
54
+
55
+ The `actor` keyword creates participant boxes with a stick figure icon:
56
+
57
+ [source,mermaid]
58
+ ----
59
+ sequenceDiagram
60
+ actor Alice
61
+ actor Bob
62
+ Alice->>Bob: Hello
63
+ ----
64
+
65
+ === Messages
66
+
67
+ Messages connect participants and represent communication:
68
+
69
+ [cols="2,2,3"]
70
+ |===
71
+ |Syntax |Style |Description
72
+
73
+ |`A->>B: text`
74
+ |Solid arrow
75
+ |Synchronous message with arrowhead
76
+
77
+ |`A-->>B: text`
78
+ |Dotted arrow
79
+ |Response or return message
80
+
81
+ |`A->B: text`
82
+ |Solid line
83
+ |Async message without arrowhead
84
+
85
+ |`A-->B: text`
86
+ |Dotted line
87
+ |Async response without arrowhead
88
+
89
+ |`A-xB: text`
90
+ |Solid with cross
91
+ |Message with cross ending
92
+
93
+ |`A--xB: text`
94
+ |Dotted with cross
95
+ |Response with cross ending
96
+
97
+ |`A-)B: text`
98
+ |Solid with open arrow
99
+ |Async message with open arrow
100
+
101
+ |`A--)B: text`
102
+ |Dotted with open arrow
103
+ |Async response with open arrow
104
+
105
+ |`A<<->>B: text`
106
+ |Bidirectional solid
107
+ |Bidirectional synchronous message
108
+
109
+ |`A<<-->>B: text`
110
+ |Bidirectional dotted
111
+ |Bidirectional async message
112
+ |===
113
+
114
+ === Activation
115
+
116
+ Activation boxes show when a participant is actively processing:
117
+
118
+ [source,mermaid]
119
+ ----
120
+ sequenceDiagram
121
+ Alice->>+Bob: Request
122
+ Bob-->>-Alice: Response
123
+ ----
124
+
125
+ The `+` symbol activates a participant, and `-` deactivates it.
126
+
127
+ Explicit activation syntax:
128
+
129
+ [source,mermaid]
130
+ ----
131
+ sequenceDiagram
132
+ Alice->>Bob: Request
133
+ activate Bob
134
+ Bob-->>Alice: Response
135
+ deactivate Bob
136
+ ----
137
+
138
+ === Notes
139
+
140
+ Notes provide additional context and can be positioned relative to participants:
141
+
142
+ [source,mermaid]
143
+ ----
144
+ Note left of Alice: Left note
145
+ Note right of Bob: Right note
146
+ Note over Alice: Note over one participant
147
+ Note over Alice,Bob: Note spanning participants
148
+ ----
149
+
150
+ === Loops
151
+
152
+ Loops represent repeated interactions:
153
+
154
+ [source,mermaid]
155
+ ----
156
+ loop Loop label
157
+ Alice->>Bob: Message
158
+ end
159
+ ----
160
+
161
+ === Conditional blocks
162
+
163
+ ==== Alt (alternative paths)
164
+
165
+ The `alt` block represents conditional execution:
166
+
167
+ [source,mermaid]
168
+ ----
169
+ alt Condition description
170
+ Alice->>Bob: Message if true
171
+ else Another condition
172
+ Alice->>Bob: Message if second condition
173
+ else
174
+ Alice->>Bob: Default message
175
+ end
176
+ ----
177
+
178
+ ==== Opt (optional)
179
+
180
+ The `opt` block represents optional execution:
181
+
182
+ [source,mermaid]
183
+ ----
184
+ opt Optional condition
185
+ Alice->>Bob: Optional message
186
+ end
187
+ ----
188
+
189
+ ==== Par (parallel)
190
+
191
+ The `par` block represents parallel execution:
192
+
193
+ [source,mermaid]
194
+ ----
195
+ par Parallel task 1
196
+ Alice->>Bob: Message 1
197
+ and Parallel task 2
198
+ Alice->>Charlie: Message 2
199
+ end
200
+ ----
201
+
202
+ ==== Critical (critical region)
203
+
204
+ The `critical` block represents critical sections:
205
+
206
+ [source,mermaid]
207
+ ----
208
+ critical Critical operation
209
+ Alice->>Bob: Critical message
210
+ option Error handling
211
+ Bob->>Alice: Error response
212
+ end
213
+ ----
214
+
215
+ ==== Break
216
+
217
+ The `break` block represents breaking out of a flow:
218
+
219
+ [source,mermaid]
220
+ ----
221
+ break Break condition
222
+ Alice->>Bob: Break message
223
+ end
224
+ ----
225
+
226
+ === Boxes
227
+
228
+ Boxes group related participants:
229
+
230
+ [source,mermaid]
231
+ ----
232
+ box "Box Label"
233
+ participant A
234
+ participant B
235
+ end
236
+ ----
237
+
238
+ Boxes can have background colors:
239
+
240
+ [source,mermaid]
241
+ ----
242
+ box rgb(255,240,240) "Red Box"
243
+ participant A
244
+ end
245
+ ----
246
+
247
+ === Sequence numbers
248
+
249
+ Sequence numbers can be enabled:
250
+
251
+ [source,mermaid]
252
+ ----
253
+ sequenceDiagram
254
+ autonumber
255
+ Alice->>Bob: First message
256
+ Bob->>Alice: Second message
257
+ ----
258
+
259
+ == Examples
260
+
261
+ === Basic sequence diagram
262
+
263
+ .Simple message exchange
264
+ [example]
265
+ ====
266
+ [source,mermaid]
267
+ ----
268
+ sequenceDiagram
269
+ Alice->>Bob: Hello Bob
270
+ Bob-->>Alice: Hello Alice
271
+ ----
272
+
273
+ This creates a simple sequence diagram with two participants exchanging messages.
274
+ ====
275
+
276
+ === Sequence with activation
277
+
278
+ .Request-response with activation
279
+ [example]
280
+ ====
281
+ [source,mermaid]
282
+ ----
283
+ sequenceDiagram
284
+ participant User
285
+ participant WebApp
286
+ participant API
287
+ participant Database
288
+
289
+ User->>+WebApp: Request Product Page
290
+ WebApp->>+API: GET /api/product/123
291
+ API->>+Database: SELECT * FROM products WHERE id=123
292
+ Database-->>-API: Product Data
293
+ API-->>-WebApp: JSON Response
294
+ WebApp-->>-User: Render Product Page
295
+ ----
296
+
297
+ This example demonstrates:
298
+
299
+ * Multiple participants
300
+ * Activation boxes showing processing time
301
+ * Nested activations
302
+ * Request-response patterns
303
+ ====
304
+
305
+ === Loop and conditional example
306
+
307
+ .Complex flow with loops and conditionals
308
+ [example]
309
+ ====
310
+ [source,mermaid]
311
+ ----
312
+ sequenceDiagram
313
+ participant User
314
+ participant System
315
+ participant Database
316
+
317
+ User->>+System: Login Request
318
+
319
+ loop Retry up to 3 times
320
+ System->>+Database: Verify Credentials
321
+ Database-->>-System: Result
322
+
323
+ alt Valid Credentials
324
+ System-->>User: Success
325
+ else Invalid Credentials
326
+ System-->>User: Error
327
+ end
328
+ end
329
+
330
+ System-->>-User: Final Response
331
+ ----
332
+
333
+ This shows:
334
+
335
+ * Loop blocks for repeated actions
336
+ * Alt/else blocks for conditional logic
337
+ * Nested control structures
338
+ ====
339
+
340
+ === Notes and documentation
341
+
342
+ .Sequence with notes
343
+ [example]
344
+ ====
345
+ [source,mermaid]
346
+ ----
347
+ sequenceDiagram
348
+ participant User
349
+ participant Cache
350
+ participant API
351
+
352
+ Note over User,API: First request - cache miss
353
+
354
+ User->>+Cache: Check Cache
355
+ Cache-->>-User: Cache Miss
356
+
357
+ User->>+API: GET /data
358
+ API-->>-User: Data Response
359
+
360
+ User->>+Cache: Store in Cache
361
+ Cache-->>-User: Cached
362
+
363
+ Note right of Cache: Data now cached
364
+
365
+ Note over User,API: Second request - cache hit
366
+
367
+ User->>+Cache: Check Cache
368
+ Cache-->>-User: Cache Hit (Fast)
369
+ ----
370
+
371
+ This demonstrates:
372
+
373
+ * Notes over multiple participants
374
+ * Notes to the left/right of participants
375
+ * Using notes to explain flow sections
376
+ ====
377
+
378
+ === Participant boxes
379
+
380
+ .Grouping participants in boxes
381
+ [example]
382
+ ====
383
+ [source,mermaid]
384
+ ----
385
+ sequenceDiagram
386
+ box "Frontend"
387
+ participant User
388
+ participant WebApp
389
+ end
390
+
391
+ box "Backend Services"
392
+ participant API
393
+ participant Database
394
+ end
395
+
396
+ User->>WebApp: Click Button
397
+ WebApp->>API: API Request
398
+ API->>Database: Query
399
+ Database-->>API: Result
400
+ API-->>WebApp: Response
401
+ WebApp-->>User: Update UI
402
+ ----
403
+
404
+ This shows:
405
+
406
+ * Grouping related participants in boxes
407
+ * Visual organization of system layers
408
+ * Clear separation of concerns
409
+ ====
410
+
411
+ === Parallel execution
412
+
413
+ .Concurrent operations
414
+ [example]
415
+ ====
416
+ [source,mermaid]
417
+ ----
418
+ sequenceDiagram
419
+ participant User
420
+ participant App
421
+ participant Service1
422
+ participant Service2
423
+
424
+ User->>App: Request Data
425
+
426
+ par Fetch User Profile
427
+ App->>Service1: Get Profile
428
+ Service1-->>App: Profile Data
429
+ and Fetch User Posts
430
+ App->>Service2: Get Posts
431
+ Service2-->>App: Posts Data
432
+ end
433
+
434
+ App-->>User: Combined Response
435
+ ----
436
+
437
+ This demonstrates:
438
+
439
+ * Parallel execution using `par` blocks
440
+ * Multiple concurrent operations
441
+ * Joining results after parallel execution
442
+ ====
443
+
444
+ === Comprehensive example with multiple features
445
+
446
+ .Real-world authentication flow
447
+ [example]
448
+ ====
449
+ [source,mermaid]
450
+ ----
451
+ sequenceDiagram
452
+ autonumber
453
+ actor User
454
+ participant WebApp
455
+ participant API
456
+ participant Database
457
+ participant Cache
458
+
459
+ User->>+WebApp: Request Product Page
460
+ WebApp->>+Cache: Check Cache
461
+ Cache-->>-WebApp: Cache Miss
462
+
463
+ WebApp->>+API: GET /api/product/123
464
+ API->>+Database: SELECT * FROM products WHERE id=123
465
+ Database-->>-API: Product Data
466
+ API-->>-WebApp: JSON Response
467
+
468
+ WebApp->>+Cache: Store in Cache
469
+ Cache-->>-WebApp: Cached
470
+
471
+ WebApp-->>-User: Render Product Page
472
+
473
+ Note over User,Cache: Subsequent request will hit cache
474
+
475
+ User->>+WebApp: Refresh Page
476
+ WebApp->>+Cache: Check Cache
477
+ Cache-->>-WebApp: Cache Hit
478
+ WebApp-->>-User: Render Product Page (Fast)
479
+ ----
480
+
481
+ This comprehensive example includes:
482
+
483
+ * Sequence numbers with `autonumber`
484
+ * Actor notation for human users
485
+ * Activation boxes
486
+ * Notes explaining behavior
487
+ * Caching pattern
488
+ * Multiple system interactions
489
+ ====
490
+
491
+ == Features
492
+
493
+ === Participant declaration
494
+
495
+ Participants can be declared in any order:
496
+
497
+ [source,mermaid]
498
+ ----
499
+ sequenceDiagram
500
+ participant Alice
501
+ participant Bob
502
+ participant Charlie
503
+ ----
504
+
505
+ Or defined implicitly when first used:
506
+
507
+ [source,mermaid]
508
+ ----
509
+ sequenceDiagram
510
+ Alice->>Bob: Hello
511
+ Bob->>Charlie: Hi Charlie
512
+ ----
513
+
514
+ === Special characters in names
515
+
516
+ Participants can have spaces and special characters when quoted:
517
+
518
+ [source,mermaid]
519
+ ----
520
+ sequenceDiagram
521
+ participant "User Service"
522
+ participant "Payment API"
523
+ "User Service"->>"Payment API": Process payment
524
+ ----
525
+
526
+ === Message text
527
+
528
+ Messages support long text that will be wrapped:
529
+
530
+ [source,mermaid]
531
+ ----
532
+ sequenceDiagram
533
+ Alice->>Bob: Extremely long message text that will be wrapped automatically to fit within the diagram boundaries
534
+ ----
535
+
536
+ === Nested activation
537
+
538
+ Activations can be nested for complex call stacks:
539
+
540
+ [source,mermaid]
541
+ ----
542
+ sequenceDiagram
543
+ A->>+B: Request
544
+ B->>+C: Sub-request
545
+ C-->>-B: Sub-response
546
+ B-->>-A: Response
547
+ ----
548
+
549
+ === Multiple control structures
550
+
551
+ Control structures can be combined and nested:
552
+
553
+ [source,mermaid]
554
+ ----
555
+ sequenceDiagram
556
+ loop Retry
557
+ alt Success
558
+ A->>B: Success path
559
+ else Failure
560
+ opt Log error
561
+ A->>Logger: Log
562
+ end
563
+ end
564
+ end
565
+ ----
566
+
567
+ == Limitations
568
+
569
+ === Currently not supported
570
+
571
+ The following Mermaid sequence diagram features are not yet supported in Sirena:
572
+
573
+ * Styling with custom CSS classes
574
+ * Click events and links
575
+ * Background colors for messages
576
+ * Custom line styles
577
+ * Rect (background highlighting)
578
+ * Links on participants
579
+
580
+ === Known issues
581
+
582
+ * Very long participant names may cause layout issues
583
+ * Deeply nested control structures may not render optimally
584
+ * Complex parallel blocks may have spacing inconsistencies
585
+
586
+ == Best practices
587
+
588
+ === Keep participants minimal
589
+
590
+ Limit the number of participants to maintain readability:
591
+
592
+ [source,mermaid]
593
+ ----
594
+ %% Good - 4 participants
595
+ sequenceDiagram
596
+ User->>API->>Database->>Cache
597
+
598
+ %% Less readable - too many
599
+ sequenceDiagram
600
+ A->>B->>C->>D->>E->>F->>G->>H
601
+ ----
602
+
603
+ === Use meaningful names
604
+
605
+ Choose descriptive participant names:
606
+
607
+ [source,mermaid]
608
+ ----
609
+ %% Good
610
+ sequenceDiagram
611
+ participant UserService
612
+ participant PaymentGateway
613
+
614
+ %% Less clear
615
+ sequenceDiagram
616
+ participant A
617
+ participant B
618
+ ----
619
+
620
+ === Group related interactions
621
+
622
+ Use boxes to group related participants:
623
+
624
+ [source,mermaid]
625
+ ----
626
+ sequenceDiagram
627
+ box "Frontend"
628
+ participant UI
629
+ participant WebApp
630
+ end
631
+ box "Backend"
632
+ participant API
633
+ participant DB
634
+ end
635
+ ----
636
+
637
+ === Add notes for clarity
638
+
639
+ Use notes to explain complex interactions:
640
+
641
+ [source,mermaid]
642
+ ----
643
+ sequenceDiagram
644
+ A->>B: Request
645
+ Note right of B: This validates the request before processing
646
+ B->>C: Process
647
+ ----
648
+
649
+ === Use activation consistently
650
+
651
+ Always pair activation and deactivation:
652
+
653
+ [source,mermaid]
654
+ ----
655
+ sequenceDiagram
656
+ A->>+B: Request
657
+ B-->>-A: Response
658
+ ----
659
+
660
+ == Related documentation
661
+
662
+ * <<index.adoc#,Diagram types overview>>
663
+ * <<flowchart.adoc#,Flowchart diagrams>>
664
+ * link:https://mermaid.js.org/syntax/sequenceDiagram.html[Official Mermaid sequence diagram documentation]