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,816 @@
1
+ = Class diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Class diagrams in Sirena represent the structure of object-oriented systems by showing classes, their attributes, methods, and the relationships between them. They are fundamental for documenting software architecture and design patterns.
8
+
9
+ Class diagrams are useful for:
10
+
11
+ * Documenting object-oriented system architecture
12
+ * Showing inheritance hierarchies
13
+ * Illustrating design patterns
14
+ * Mapping domain models
15
+ * Visualizing database schemas as objects
16
+ * Planning software structure before implementation
17
+
18
+ == Syntax specification
19
+
20
+ === Diagram declaration
21
+
22
+ Class diagrams are declared using the `classDiagram` keyword:
23
+
24
+ [source,mermaid]
25
+ ----
26
+ classDiagram
27
+ <diagram-content>
28
+ ----
29
+
30
+ === Class definition
31
+
32
+ Classes can be defined in two ways:
33
+
34
+ ==== Inline definition
35
+
36
+ [source,mermaid]
37
+ ----
38
+ classDiagram
39
+ class ClassName
40
+ ----
41
+
42
+ ==== Block definition
43
+
44
+ [source,mermaid]
45
+ ----
46
+ classDiagram
47
+ class ClassName {
48
+ +Type attributeName
49
+ +returnType methodName()
50
+ }
51
+ ----
52
+
53
+ === Attributes
54
+
55
+ Attributes (fields) are defined with visibility, type, and name:
56
+
57
+ [source,mermaid]
58
+ ----
59
+ class ClassName {
60
+ +public attribute
61
+ -private attribute
62
+ #protected attribute
63
+ ~package attribute
64
+ }
65
+ ----
66
+
67
+ Visibility modifiers:
68
+
69
+ [cols="1,2,3"]
70
+ |===
71
+ |Symbol |Visibility |Description
72
+
73
+ |`+`
74
+ |Public
75
+ |Accessible from anywhere
76
+
77
+ |`-`
78
+ |Private
79
+ |Accessible only within the class
80
+
81
+ |`#`
82
+ |Protected
83
+ |Accessible within the class and subclasses
84
+
85
+ |`~`
86
+ |Package/Internal
87
+ |Accessible within the same package
88
+ |===
89
+
90
+ Full attribute syntax:
91
+
92
+ [source,mermaid]
93
+ ----
94
+ visibility type name
95
+ ----
96
+
97
+ Example:
98
+
99
+ [source,mermaid]
100
+ ----
101
+ class Animal {
102
+ +String name
103
+ -int age
104
+ #bool isAlive
105
+ }
106
+ ----
107
+
108
+ === Methods
109
+
110
+ Methods are defined similarly to attributes but with parentheses:
111
+
112
+ [source,mermaid]
113
+ ----
114
+ class ClassName {
115
+ +returnType methodName()
116
+ +returnType methodName(paramType param)
117
+ }
118
+ ----
119
+
120
+ Examples:
121
+
122
+ [source,mermaid]
123
+ ----
124
+ class Animal {
125
+ +void makeSound()
126
+ +void eat(Food food)
127
+ +String getName()
128
+ }
129
+ ----
130
+
131
+ === Relationships
132
+
133
+ Class diagrams support various relationship types:
134
+
135
+ [cols="2,2,3"]
136
+ |===
137
+ |Syntax |Relationship |Description
138
+
139
+ |`ClassA <\|-- ClassB`
140
+ |Inheritance
141
+ |ClassB inherits from ClassA
142
+
143
+ |`ClassA *-- ClassB`
144
+ |Composition
145
+ |ClassA is composed of ClassB (strong ownership)
146
+
147
+ |`ClassA o-- ClassB`
148
+ |Aggregation
149
+ |ClassA contains ClassB (weak ownership)
150
+
151
+ |`ClassA --> ClassB`
152
+ |Association
153
+ |ClassA is associated with ClassB
154
+
155
+ |`ClassA -- ClassB`
156
+ |Link (solid)
157
+ |General connection between classes
158
+
159
+ |`ClassA ..> ClassB`
160
+ |Dependency
161
+ |ClassA depends on ClassB
162
+
163
+ |`ClassA ..\|> ClassB`
164
+ |Realization
165
+ |ClassA realizes interface ClassB
166
+
167
+ |`ClassA ..* ClassB`
168
+ |Composition (dotted)
169
+ |Alternative composition syntax
170
+ |===
171
+
172
+ ==== Relationship labels
173
+
174
+ Relationships can have labels:
175
+
176
+ [source,mermaid]
177
+ ----
178
+ ClassA "1" --> "many" ClassB : contains
179
+ ----
180
+
181
+ ==== Bidirectional associations
182
+
183
+ Arrows can point in both directions:
184
+
185
+ [source,mermaid]
186
+ ----
187
+ ClassA <-- ClassB
188
+ ClassA <--> ClassB
189
+ ----
190
+
191
+ === Cardinality
192
+
193
+ Relationships can specify cardinality (multiplicity):
194
+
195
+ [source,mermaid]
196
+ ----
197
+ ClassA "1" --> "*" ClassB
198
+ ClassA "1..*" --> "0..1" ClassB
199
+ ----
200
+
201
+ Common cardinality notations:
202
+
203
+ * `1` - Exactly one
204
+ * `0..1` - Zero or one
205
+ * `*` or `0..*` - Zero or more
206
+ * `1..*` - One or more
207
+ * `n` - Exactly n (specific number)
208
+ * `n..m` - Between n and m
209
+
210
+ === Generics
211
+
212
+ Generic types can be specified using tilde notation:
213
+
214
+ [source,mermaid]
215
+ ----
216
+ class List~T~ {
217
+ +T get(int index)
218
+ +void add(T item)
219
+ }
220
+ ----
221
+
222
+ === Abstract classes and interfaces
223
+
224
+ ==== Abstract classes
225
+
226
+ Abstract classes are indicated with `<<abstract>>` stereotype or italics:
227
+
228
+ [source,mermaid]
229
+ ----
230
+ class AbstractClass {
231
+ <<abstract>>
232
+ +abstractMethod()*
233
+ }
234
+ ----
235
+
236
+ ==== Interfaces
237
+
238
+ Interfaces are indicated with `<<interface>>` stereotype:
239
+
240
+ [source,mermaid]
241
+ ----
242
+ class IInterface {
243
+ <<interface>>
244
+ +method()
245
+ }
246
+ ----
247
+
248
+ === Stereotypes
249
+
250
+ Stereotypes provide additional classification:
251
+
252
+ [source,mermaid]
253
+ ----
254
+ class ClassName {
255
+ <<stereotype>>
256
+ }
257
+ ----
258
+
259
+ Common stereotypes:
260
+
261
+ * `<<interface>>`
262
+ * `<<abstract>>`
263
+ * `<<service>>`
264
+ * `<<enumeration>>`
265
+
266
+ === Annotations
267
+
268
+ Annotations can be added to classes:
269
+
270
+ [source,mermaid]
271
+ ----
272
+ class ClassName {
273
+ <<annotation>>
274
+ +method()
275
+ }
276
+ ----
277
+
278
+ == Examples
279
+
280
+ === Basic class
281
+
282
+ .Simple class definition
283
+ [example]
284
+ ====
285
+ [source,mermaid]
286
+ ----
287
+ classDiagram
288
+ class Animal {
289
+ +String name
290
+ +int age
291
+ +makeSound() void
292
+ }
293
+ ----
294
+
295
+ This creates a simple class with attributes and a method.
296
+ ====
297
+
298
+ === Inheritance hierarchy
299
+
300
+ .Class inheritance
301
+ [example]
302
+ ====
303
+ [source,mermaid]
304
+ ----
305
+ classDiagram
306
+ class Animal {
307
+ +String name
308
+ +int age
309
+ +String species
310
+ +makeSound() void
311
+ +eat(food Food) void
312
+ +sleep() void
313
+ }
314
+
315
+ class Mammal {
316
+ +String furColor
317
+ +bool warmBlooded
318
+ +giveBirth() void
319
+ }
320
+
321
+ class Bird {
322
+ +bool canFly
323
+ +String featherColor
324
+ +layEggs() void
325
+ }
326
+
327
+ Animal <|-- Mammal
328
+ Animal <|-- Bird
329
+ ----
330
+
331
+ This example demonstrates:
332
+
333
+ * Base class with common attributes and methods
334
+ * Specialized subclasses
335
+ * Inheritance relationships using `<|--`
336
+ ====
337
+
338
+ === Complex inheritance with multiple levels
339
+
340
+ .Multi-level inheritance
341
+ [example]
342
+ ====
343
+ [source,mermaid]
344
+ ----
345
+ classDiagram
346
+ class Animal {
347
+ +String name
348
+ +int age
349
+ +String species
350
+ +makeSound() void
351
+ +eat(food Food) void
352
+ +sleep() void
353
+ }
354
+
355
+ class Mammal {
356
+ +String furColor
357
+ +bool warmBlooded
358
+ +giveBirth() void
359
+ }
360
+
361
+ class Bird {
362
+ +bool canFly
363
+ +String featherColor
364
+ +layEggs() void
365
+ }
366
+
367
+ class Dog {
368
+ +String breed
369
+ +bark() void
370
+ +fetch(item Item) void
371
+ }
372
+
373
+ class Cat {
374
+ +bool indoor
375
+ +int lives
376
+ +meow() void
377
+ +purr() void
378
+ }
379
+
380
+ class Eagle {
381
+ +float wingSpan
382
+ +hunt() void
383
+ +soar() void
384
+ }
385
+
386
+ class Penguin {
387
+ +swim() void
388
+ +slide() void
389
+ }
390
+
391
+ Animal <|-- Mammal
392
+ Animal <|-- Bird
393
+ Mammal <|-- Dog
394
+ Mammal <|-- Cat
395
+ Bird <|-- Eagle
396
+ Bird <|-- Penguin
397
+ ----
398
+
399
+ This shows:
400
+
401
+ * Multi-level inheritance hierarchy
402
+ * Multiple subclasses at each level
403
+ * Common ancestor class
404
+ * Specialized behaviors in leaf classes
405
+ ====
406
+
407
+ === Associations and ownership
408
+
409
+ .Class associations with cardinality
410
+ [example]
411
+ ====
412
+ [source,mermaid]
413
+ ----
414
+ classDiagram
415
+ class Owner {
416
+ +String name
417
+ +String address
418
+ +List~Animal~ pets
419
+ +adoptPet(pet Animal) void
420
+ }
421
+
422
+ class Animal {
423
+ +String name
424
+ +int age
425
+ +makeSound() void
426
+ }
427
+
428
+ Owner "1" --> "*" Animal : owns
429
+ ----
430
+
431
+ This demonstrates:
432
+
433
+ * Association between classes
434
+ * Cardinality (one-to-many relationship)
435
+ * Relationship label ("owns")
436
+ * Generic type notation `List~Animal~`
437
+ ====
438
+
439
+ === Composition and aggregation
440
+
441
+ .Different types of relationships
442
+ [example]
443
+ ====
444
+ [source,mermaid]
445
+ ----
446
+ classDiagram
447
+ class University {
448
+ +String name
449
+ +String location
450
+ }
451
+
452
+ class Department {
453
+ +String name
454
+ +String head
455
+ }
456
+
457
+ class Professor {
458
+ +String name
459
+ +String specialization
460
+ }
461
+
462
+ class Student {
463
+ +String name
464
+ +int studentId
465
+ }
466
+
467
+ class Course {
468
+ +String code
469
+ +String title
470
+ +int credits
471
+ }
472
+
473
+ University *-- Department : contains
474
+ Department o-- Professor : employs
475
+ Department --> Course : offers
476
+ Professor --> Course : teaches
477
+ Student --> Course : enrolls in
478
+ ----
479
+
480
+ This shows:
481
+
482
+ * Composition (`*--`) - departments are part of university
483
+ * Aggregation (`o--`) - professors work for departments but can exist independently
484
+ * Associations (`-->`) - various relationships between entities
485
+ ====
486
+
487
+ === Interface implementation
488
+
489
+ .Interfaces and realization
490
+ [example]
491
+ ====
492
+ [source,mermaid]
493
+ ----
494
+ classDiagram
495
+ class Drawable {
496
+ <<interface>>
497
+ +draw() void
498
+ +resize(width int, height int) void
499
+ }
500
+
501
+ class Shape {
502
+ <<abstract>>
503
+ +color String
504
+ +getArea() float*
505
+ }
506
+
507
+ class Circle {
508
+ +radius float
509
+ +getArea() float
510
+ +draw() void
511
+ +resize(width int, height int) void
512
+ }
513
+
514
+ class Rectangle {
515
+ +width float
516
+ +height float
517
+ +getArea() float
518
+ +draw() void
519
+ +resize(width int, height int) void
520
+ }
521
+
522
+ Drawable <|.. Circle
523
+ Drawable <|.. Rectangle
524
+ Shape <|-- Circle
525
+ Shape <|-- Rectangle
526
+ ----
527
+
528
+ This demonstrates:
529
+
530
+ * Interface definition with `<<interface>>`
531
+ * Abstract class with `<<abstract>>`
532
+ * Interface realization using `<|..`
533
+ * Multiple inheritance (from abstract class and interface)
534
+ ====
535
+
536
+ === Generic types
537
+
538
+ .Using generics
539
+ [example]
540
+ ====
541
+ [source,mermaid]
542
+ ----
543
+ classDiagram
544
+ class Collection~T~ {
545
+ <<interface>>
546
+ +add(item T) void
547
+ +remove(item T) void
548
+ +get(index int) T
549
+ }
550
+
551
+ class List~T~ {
552
+ +items T[]
553
+ +add(item T) void
554
+ +remove(item T) void
555
+ +get(index int) T
556
+ }
557
+
558
+ class Map~K,V~ {
559
+ +put(key K, value V) void
560
+ +get(key K) V
561
+ +remove(key K) void
562
+ }
563
+
564
+ Collection~T~ <|.. List~T~
565
+ ----
566
+
567
+ This shows:
568
+
569
+ * Generic type parameters with tilde notation
570
+ * Single type parameter `~T~`
571
+ * Multiple type parameters `~K,V~`
572
+ * Generic interface and implementations
573
+ ====
574
+
575
+ === Complete domain model
576
+
577
+ .E-commerce domain model
578
+ [example]
579
+ ====
580
+ [source,mermaid]
581
+ ----
582
+ classDiagram
583
+ class Customer {
584
+ +int id
585
+ +String name
586
+ +String email
587
+ +List~Order~ orders
588
+ +placeOrder(order Order) void
589
+ }
590
+
591
+ class Order {
592
+ +int id
593
+ +Date orderDate
594
+ +OrderStatus status
595
+ +List~OrderItem~ items
596
+ +float totalAmount
597
+ +calculateTotal() float
598
+ }
599
+
600
+ class OrderItem {
601
+ +int quantity
602
+ +float price
603
+ +Product product
604
+ +getSubtotal() float
605
+ }
606
+
607
+ class Product {
608
+ +int id
609
+ +String name
610
+ +String description
611
+ +float price
612
+ +int stockQuantity
613
+ }
614
+
615
+ class OrderStatus {
616
+ <<enumeration>>
617
+ PENDING
618
+ PROCESSING
619
+ SHIPPED
620
+ DELIVERED
621
+ CANCELLED
622
+ }
623
+
624
+ class Payment {
625
+ +int id
626
+ +float amount
627
+ +Date paymentDate
628
+ +PaymentMethod method
629
+ +processPayment() bool
630
+ }
631
+
632
+ Customer "1" --> "*" Order : places
633
+ Order "1" *-- "*" OrderItem : contains
634
+ OrderItem "*" --> "1" Product : references
635
+ Order "1" --> "1" Payment : paid by
636
+ Order --> OrderStatus : has
637
+ ----
638
+
639
+ This comprehensive example includes:
640
+
641
+ * Multiple related classes
642
+ * Composition relationships
643
+ * Associations with cardinality
644
+ * Enumeration type
645
+ * Business logic methods
646
+ * Complete domain model structure
647
+ ====
648
+
649
+ == Features
650
+
651
+ === Method parameters
652
+
653
+ Methods can have typed parameters:
654
+
655
+ [source,mermaid]
656
+ ----
657
+ class Calculator {
658
+ +add(a int, b int) int
659
+ +divide(dividend float, divisor float) float
660
+ }
661
+ ----
662
+
663
+ === Multiple methods and attributes
664
+
665
+ Classes can have any number of attributes and methods:
666
+
667
+ [source,mermaid]
668
+ ----
669
+ class ComplexClass {
670
+ +String attr1
671
+ +int attr2
672
+ -bool attr3
673
+ +method1() void
674
+ +method2(param String) int
675
+ -privateMethod() void
676
+ }
677
+ ----
678
+
679
+ === Static members
680
+
681
+ Static members can be indicated with underline or `$`:
682
+
683
+ [source,mermaid]
684
+ ----
685
+ class MathUtils {
686
+ +$PI float
687
+ +$E float
688
+ +$sqrt(x float) float
689
+ }
690
+ ----
691
+
692
+ === Comments
693
+
694
+ Comments are not displayed but can be added:
695
+
696
+ [source,mermaid]
697
+ ----
698
+ classDiagram
699
+ %% This is a comment
700
+ class MyClass
701
+ ----
702
+
703
+ == Limitations
704
+
705
+ === Currently not supported
706
+
707
+ The following Mermaid class diagram features are not yet supported in Sirena:
708
+
709
+ * Custom styling with CSS classes
710
+ * Click events and links
711
+ * Notes and annotations on relationships
712
+ * Namespace grouping
713
+ * Direction control (top-to-bottom vs left-to-right)
714
+ * Custom class styling
715
+
716
+ === Known issues
717
+
718
+ * Very long class names may affect layout
719
+ * Complex relationship networks may become cluttered
720
+ * Generic syntax with nested types may not render correctly
721
+
722
+ == Best practices
723
+
724
+ === Keep classes focused
725
+
726
+ Follow the Single Responsibility Principle:
727
+
728
+ [source,mermaid]
729
+ ----
730
+ %% Good - focused class
731
+ class UserRepository {
732
+ +findById(id int) User
733
+ +save(user User) void
734
+ +delete(id int) void
735
+ }
736
+
737
+ %% Less ideal - too many responsibilities
738
+ class UserManager {
739
+ +validateUser() bool
740
+ +saveToDatabase() void
741
+ +sendEmail() void
742
+ +generateReport() void
743
+ +logActivity() void
744
+ }
745
+ ----
746
+
747
+ === Use meaningful names
748
+
749
+ Choose descriptive names for classes, attributes, and methods:
750
+
751
+ [source,mermaid]
752
+ ----
753
+ %% Good
754
+ class CustomerOrder {
755
+ +orderDate Date
756
+ +calculateTotal() float
757
+ }
758
+
759
+ %% Less clear
760
+ class CO {
761
+ +dt Date
762
+ +calc() float
763
+ }
764
+ ----
765
+
766
+ === Show relevant details
767
+
768
+ Include only the details necessary for the diagram's purpose:
769
+
770
+ [source,mermaid]
771
+ ----
772
+ %% For architecture overview - show only key methods
773
+ class UserService {
774
+ +createUser(data UserData) User
775
+ +authenticateUser(credentials Credentials) Session
776
+ }
777
+
778
+ %% For detailed implementation - show all methods
779
+ class UserService {
780
+ +createUser(data UserData) User
781
+ +authenticateUser(credentials Credentials) Session
782
+ -validateUserData(data UserData) bool
783
+ -hashPassword(password String) String
784
+ -sendWelcomeEmail(user User) void
785
+ }
786
+ ----
787
+
788
+ === Group related classes
789
+
790
+ Use inheritance and composition to show relationships:
791
+
792
+ [source,mermaid]
793
+ ----
794
+ classDiagram
795
+ class Animal
796
+ class Mammal
797
+ class Reptile
798
+
799
+ Animal <|-- Mammal
800
+ Animal <|-- Reptile
801
+ ----
802
+
803
+ === Use appropriate relationship types
804
+
805
+ Choose the correct relationship type for the situation:
806
+
807
+ * Use inheritance (`<|--`) for "is-a" relationships
808
+ * Use composition (`*--`) for "part-of" relationships with strong ownership
809
+ * Use aggregation (`o--`) for "has-a" relationships with weak ownership
810
+ * Use association (`-->`) for general relationships
811
+
812
+ == Related documentation
813
+
814
+ * <<index.adoc#,Diagram types overview>>
815
+ * <<er-diagram.adoc#,Entity relationship diagrams>>
816
+ * link:https://mermaid.js.org/syntax/classDiagram.html[Official Mermaid class diagram documentation]