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,719 @@
1
+ = Entity relationship diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Entity Relationship (ER) diagrams in Sirena model the relationships between entities in a database or data model. They are essential for database design, showing entities (tables), their attributes (columns), and the relationships between them.
8
+
9
+ ER diagrams are useful for:
10
+
11
+ * Database schema design and documentation
12
+ * Planning data models before implementation
13
+ * Communicating data structure to stakeholders
14
+ * Identifying relationships and cardinality
15
+ * Normalizing database structures
16
+ * Visualizing entity dependencies
17
+
18
+ == Syntax specification
19
+
20
+ === Diagram declaration
21
+
22
+ ER diagrams are declared using the `erDiagram` keyword:
23
+
24
+ [source,mermaid]
25
+ ----
26
+ erDiagram
27
+ <diagram-content>
28
+ ----
29
+
30
+ === Entities
31
+
32
+ Entities are defined implicitly through relationships or explicitly with attributes:
33
+
34
+ [source,mermaid]
35
+ ----
36
+ erDiagram
37
+ CUSTOMER
38
+ ORDER
39
+ ----
40
+
41
+ === Relationships
42
+
43
+ Relationships connect entities and specify cardinality:
44
+
45
+ [source,mermaid]
46
+ ----
47
+ erDiagram
48
+ CUSTOMER ||--o{ ORDER : places
49
+ ----
50
+
51
+ ==== Relationship syntax
52
+
53
+ The basic syntax is:
54
+
55
+ [source]
56
+ ----
57
+ <first-entity> [<relationship>] <second-entity> : <relationship-label>
58
+ ----
59
+
60
+ ==== Cardinality and relationship types
61
+
62
+ Relationships consist of three parts:
63
+
64
+ 1. Left cardinality/relationship
65
+ 2. Relationship line style
66
+ 3. Right cardinality/relationship
67
+
68
+ [cols="2,2,3"]
69
+ |===
70
+ |Symbol |Meaning |Description
71
+
72
+ |`\|o`
73
+ |Zero or one
74
+ |Optional relationship (0 or 1)
75
+
76
+ |`\|\|`
77
+ |Exactly one
78
+ |Mandatory relationship (1)
79
+
80
+ |`}o`
81
+ |Zero or more
82
+ |Optional many (0 or more)
83
+
84
+ |`}\|`
85
+ |One or more
86
+ |Mandatory many (1 or more)
87
+ |===
88
+
89
+ ==== Relationship line styles
90
+
91
+ [cols="2,3"]
92
+ |===
93
+ |Symbol |Meaning
94
+
95
+ |`--`
96
+ |Non-identifying relationship
97
+
98
+ |`..`
99
+ |Identifying relationship (not commonly used)
100
+ |===
101
+
102
+ ==== Common relationship patterns
103
+
104
+ [cols="3,2,3"]
105
+ |===
106
+ |Syntax |Reads as |Description
107
+
108
+ |`\|\|--o{`
109
+ |One to zero or more
110
+ |One entity has many optional related entities
111
+
112
+ |`\|\|--\|\{`
113
+ |One to one or more
114
+ |One entity has many required related entities
115
+
116
+ |`\|\|--\|\|`
117
+ |One to one
118
+ |Exactly one-to-one relationship
119
+
120
+ |`\|\|--o\|`
121
+ |One to zero or one
122
+ |Optional one-to-one relationship
123
+
124
+ |`}o--o{`
125
+ |Zero or more to zero or more
126
+ |Many-to-many optional relationship
127
+
128
+ |`}o--\|\|`
129
+ |Zero or more to exactly one
130
+ |Many optional to one required
131
+ |===
132
+
133
+ === Attributes
134
+
135
+ Attributes define the properties of entities:
136
+
137
+ [source,mermaid]
138
+ ----
139
+ erDiagram
140
+ CUSTOMER {
141
+ int id
142
+ string name
143
+ string email
144
+ }
145
+ ----
146
+
147
+ ==== Attribute syntax
148
+
149
+ [source]
150
+ ----
151
+ <type> <name> [<key-type>] ["comment"]
152
+ ----
153
+
154
+ Where:
155
+
156
+ * `type` is the data type (int, string, varchar, etc.)
157
+ * `name` is the attribute name
158
+ * `key-type` (optional) can be:
159
+ - `PK` - Primary Key
160
+ - `FK` - Foreign Key
161
+ - `UK` - Unique Key
162
+ * `comment` (optional) is a descriptive comment
163
+
164
+ ==== Example with keys
165
+
166
+ [source,mermaid]
167
+ ----
168
+ erDiagram
169
+ USER {
170
+ int id PK "Primary identifier"
171
+ string username UK "Unique username"
172
+ string email UK "Unique email address"
173
+ string password_hash "Hashed password"
174
+ }
175
+ ----
176
+
177
+ === Relationship labels
178
+
179
+ Relationships can have descriptive labels:
180
+
181
+ [source,mermaid]
182
+ ----
183
+ erDiagram
184
+ CUSTOMER ||--o{ ORDER : places
185
+ ORDER ||--|{ ORDER_ITEM : contains
186
+ PRODUCT ||--o{ ORDER_ITEM : "ordered in"
187
+ ----
188
+
189
+ == Examples
190
+
191
+ === Basic ER diagram
192
+
193
+ .Simple two-entity relationship
194
+ [example]
195
+ ====
196
+ [source,mermaid]
197
+ ----
198
+ erDiagram
199
+ CUSTOMER ||--o{ ORDER : places
200
+ ----
201
+
202
+ This creates a simple ER diagram showing:
203
+
204
+ * One customer can place zero or more orders
205
+ * Each order is placed by exactly one customer
206
+ ====
207
+
208
+ === Entities with attributes
209
+
210
+ .Complete entity definitions
211
+ [example]
212
+ ====
213
+ [source,mermaid]
214
+ ----
215
+ erDiagram
216
+ CUSTOMER {
217
+ int id PK
218
+ string name
219
+ string email UK
220
+ }
221
+
222
+ ORDER {
223
+ int id PK
224
+ int customer_id FK
225
+ date order_date
226
+ }
227
+
228
+ CUSTOMER ||--o{ ORDER : places
229
+ ----
230
+
231
+ This demonstrates:
232
+
233
+ * Entity definitions with attributes
234
+ * Primary keys (PK)
235
+ * Foreign keys (FK)
236
+ * Unique keys (UK)
237
+ * One-to-many relationship
238
+ ====
239
+
240
+ === Multiple relationships
241
+
242
+ .Complex relationship network
243
+ [example]
244
+ ====
245
+ [source,mermaid]
246
+ ----
247
+ erDiagram
248
+ USER ||--o{ POST : writes
249
+ USER ||--o{ COMMENT : writes
250
+ POST ||--o{ COMMENT : has
251
+ POST }o--|| CATEGORY : belongs_to
252
+ POST }o--o{ TAG : tagged_with
253
+ ----
254
+
255
+ This shows:
256
+
257
+ * Multiple relationships from one entity
258
+ * One-to-many relationships (`||--o{`)
259
+ * Many-to-one relationships (`}o--||`)
260
+ * Many-to-many relationships (`}o--o{`)
261
+ ====
262
+
263
+ === Complete database schema
264
+
265
+ .E-commerce database schema
266
+ [example]
267
+ ====
268
+ [source,mermaid]
269
+ ----
270
+ erDiagram
271
+ USER ||--o{ POST : writes
272
+ USER ||--o{ COMMENT : writes
273
+ POST ||--o{ COMMENT : has
274
+ POST }o--|| CATEGORY : belongs_to
275
+ POST }o--o{ TAG : tagged_with
276
+ USER ||--o{ LIKE : gives
277
+ POST ||--o{ LIKE : receives
278
+ COMMENT ||--o{ LIKE : receives
279
+
280
+ USER {
281
+ int id PK
282
+ string username UK
283
+ string email UK
284
+ string password_hash
285
+ datetime created_at
286
+ datetime updated_at
287
+ boolean is_active
288
+ }
289
+
290
+ POST {
291
+ int id PK
292
+ int user_id FK
293
+ int category_id FK
294
+ string title
295
+ text content
296
+ string slug UK
297
+ datetime published_at
298
+ datetime created_at
299
+ datetime updated_at
300
+ int view_count
301
+ }
302
+
303
+ COMMENT {
304
+ int id PK
305
+ int post_id FK
306
+ int user_id FK
307
+ int parent_id FK
308
+ text content
309
+ datetime created_at
310
+ datetime updated_at
311
+ boolean is_approved
312
+ }
313
+
314
+ CATEGORY {
315
+ int id PK
316
+ string name UK
317
+ string slug UK
318
+ text description
319
+ }
320
+
321
+ TAG {
322
+ int id PK
323
+ string name UK
324
+ string slug UK
325
+ }
326
+
327
+ LIKE {
328
+ int id PK
329
+ int user_id FK
330
+ int post_id FK
331
+ int comment_id FK
332
+ datetime created_at
333
+ }
334
+ ----
335
+
336
+ This comprehensive example includes:
337
+
338
+ * Multiple entities with full attribute definitions
339
+ * Various relationship types
340
+ * Primary and foreign keys
341
+ * Unique constraints
342
+ * Different data types
343
+ * Complex relationship network
344
+ ====
345
+
346
+ === Self-referential relationship
347
+
348
+ .Hierarchical data structure
349
+ [example]
350
+ ====
351
+ [source,mermaid]
352
+ ----
353
+ erDiagram
354
+ EMPLOYEE ||--o{ EMPLOYEE : manages
355
+
356
+ EMPLOYEE {
357
+ int id PK
358
+ string name
359
+ string email UK
360
+ int manager_id FK
361
+ string position
362
+ }
363
+ ----
364
+
365
+ This demonstrates:
366
+
367
+ * Self-referential relationship
368
+ * Hierarchical structure (employees managing employees)
369
+ * Foreign key referencing the same table
370
+ ====
371
+
372
+ === Many-to-many with junction table
373
+
374
+ .Explicit junction table for many-to-many
375
+ [example]
376
+ ====
377
+ [source,mermaid]
378
+ ----
379
+ erDiagram
380
+ STUDENT ||--o{ ENROLLMENT : has
381
+ COURSE ||--o{ ENROLLMENT : includes
382
+ ENROLLMENT }o--|| STUDENT : belongs_to
383
+ ENROLLMENT }o--|| COURSE : is_for
384
+
385
+ STUDENT {
386
+ int id PK
387
+ string name
388
+ string email UK
389
+ date enrollment_date
390
+ }
391
+
392
+ COURSE {
393
+ int id PK
394
+ string code UK
395
+ string title
396
+ int credits
397
+ }
398
+
399
+ ENROLLMENT {
400
+ int id PK
401
+ int student_id FK
402
+ int course_id FK
403
+ date enrolled_date
404
+ string grade
405
+ }
406
+ ----
407
+
408
+ This shows:
409
+
410
+ * Explicit junction table for many-to-many relationship
411
+ * Junction table with its own attributes
412
+ * Multiple relationships connecting the junction table
413
+ ====
414
+
415
+ === One-to-one relationships
416
+
417
+ .User profile relationship
418
+ [example]
419
+ ====
420
+ [source,mermaid]
421
+ ----
422
+ erDiagram
423
+ USER ||--|| USER_PROFILE : has
424
+ USER ||--o| BILLING_INFO : has
425
+
426
+ USER {
427
+ int id PK
428
+ string username UK
429
+ string email UK
430
+ }
431
+
432
+ USER_PROFILE {
433
+ int id PK
434
+ int user_id FK
435
+ string full_name
436
+ string bio
437
+ string avatar_url
438
+ }
439
+
440
+ BILLING_INFO {
441
+ int id PK
442
+ int user_id FK
443
+ string address
444
+ string payment_method
445
+ }
446
+ ----
447
+
448
+ This demonstrates:
449
+
450
+ * Mandatory one-to-one relationship (`||--||`)
451
+ * Optional one-to-one relationship (`||--o|`)
452
+ * Extended user information in separate tables
453
+ ====
454
+
455
+ === Database with all cardinality types
456
+
457
+ .Comprehensive cardinality example
458
+ [example]
459
+ ====
460
+ [source,mermaid]
461
+ ----
462
+ erDiagram
463
+ PERSON ||--o| PASSPORT : has
464
+ PERSON ||--o{ PHONE : owns
465
+ COMPANY ||--|{ EMPLOYEE : employs
466
+ EMPLOYEE }o--|| DEPARTMENT : works_in
467
+ PROJECT }o--o{ EMPLOYEE : assigned_to
468
+
469
+ PERSON {
470
+ int id PK
471
+ string name
472
+ }
473
+
474
+ PASSPORT {
475
+ int id PK
476
+ int person_id FK
477
+ string number UK
478
+ }
479
+
480
+ PHONE {
481
+ int id PK
482
+ int person_id FK
483
+ string number
484
+ }
485
+
486
+ COMPANY {
487
+ int id PK
488
+ string name
489
+ }
490
+
491
+ DEPARTMENT {
492
+ int id PK
493
+ int company_id FK
494
+ string name
495
+ }
496
+
497
+ EMPLOYEE {
498
+ int id PK
499
+ int person_id FK
500
+ int department_id FK
501
+ }
502
+
503
+ PROJECT {
504
+ int id PK
505
+ string name
506
+ }
507
+ ----
508
+
509
+ This comprehensive example shows:
510
+
511
+ * One-to-zero-or-one (`||--o|`) - person may have passport
512
+ * One-to-many (`||--o{`) - person can have multiple phones
513
+ * One-to-one-or-more (`||--|{`) - company must have employees
514
+ * Many-to-one (`}o--||`) - employees work in one department
515
+ * Many-to-many (`}o--o{`) - projects and employees
516
+ ====
517
+
518
+ == Features
519
+
520
+ === Data types
521
+
522
+ Common data types include:
523
+
524
+ * `int`, `integer` - Integer numbers
525
+ * `string`, `varchar` - Text strings
526
+ * `text` - Long text
527
+ * `date` - Date values
528
+ * `datetime`, `timestamp` - Date and time
529
+ * `boolean`, `bool` - True/false values
530
+ * `float`, `decimal` - Decimal numbers
531
+
532
+ Custom types are also supported:
533
+
534
+ [source,mermaid]
535
+ ----
536
+ erDiagram
537
+ PRODUCT {
538
+ uuid id PK
539
+ money price
540
+ json metadata
541
+ }
542
+ ----
543
+
544
+ === Attribute comments
545
+
546
+ Attributes can have comments for documentation:
547
+
548
+ [source,mermaid]
549
+ ----
550
+ erDiagram
551
+ USER {
552
+ int id PK "Auto-incrementing primary key"
553
+ string email UK "Must be unique and valid"
554
+ datetime created_at "Account creation timestamp"
555
+ }
556
+ ----
557
+
558
+ === Multiple foreign keys
559
+
560
+ Entities can reference multiple other entities:
561
+
562
+ [source,mermaid]
563
+ ----
564
+ erDiagram
565
+ ORDER {
566
+ int id PK
567
+ int customer_id FK
568
+ int shipping_address_id FK
569
+ int billing_address_id FK
570
+ }
571
+ ----
572
+
573
+ === Composite keys
574
+
575
+ While not explicitly shown in syntax, you can document composite keys in comments:
576
+
577
+ [source,mermaid]
578
+ ----
579
+ erDiagram
580
+ ENROLLMENT {
581
+ int student_id FK "Part of composite PK"
582
+ int course_id FK "Part of composite PK"
583
+ date enrollment_date
584
+ }
585
+ ----
586
+
587
+ == Limitations
588
+
589
+ === Currently not supported
590
+
591
+ The following Mermaid ER diagram features are not yet supported in Sirena:
592
+
593
+ * Custom styling with CSS classes
594
+ * Click events and links
595
+ * Entity grouping or namespaces
596
+ * Weak entities (double borders)
597
+ * Identifying relationships with double lines
598
+ * Attribute-level constraints beyond PK, FK, UK
599
+
600
+ === Known issues
601
+
602
+ * Very large diagrams with many entities may become cluttered
603
+ * Long relationship labels may overlap with entities
604
+ * Complex many-to-many relationships may need manual layout adjustment
605
+
606
+ == Best practices
607
+
608
+ === Use clear entity names
609
+
610
+ Choose descriptive, singular nouns for entities:
611
+
612
+ [source,mermaid]
613
+ ----
614
+ %% Good - singular, clear names
615
+ erDiagram
616
+ CUSTOMER
617
+ ORDER
618
+ PRODUCT
619
+
620
+ %% Less clear - plural or abbreviated
621
+ erDiagram
622
+ CUSTOMERS
623
+ ORDS
624
+ PRODS
625
+ ----
626
+
627
+ === Document key relationships
628
+
629
+ Always identify primary and foreign keys:
630
+
631
+ [source,mermaid]
632
+ ----
633
+ erDiagram
634
+ ORDER {
635
+ int id PK
636
+ int customer_id FK
637
+ int product_id FK
638
+ }
639
+ ----
640
+
641
+ === Use appropriate cardinality
642
+
643
+ Choose the correct cardinality for relationships:
644
+
645
+ [source,mermaid]
646
+ ----
647
+ %% One customer, many orders
648
+ CUSTOMER ||--o{ ORDER : places
649
+
650
+ %% Many-to-many with junction table
651
+ STUDENT }o--o{ COURSE : enrolls_in
652
+ ----
653
+
654
+ === Group related entities visually
655
+
656
+ When creating the diagram, place related entities near each other:
657
+
658
+ [source,mermaid]
659
+ ----
660
+ erDiagram
661
+ %% User-related entities together
662
+ USER ||--o{ POST : writes
663
+ USER ||--o{ COMMENT : writes
664
+
665
+ %% Content-related entities together
666
+ POST ||--o{ COMMENT : has
667
+ POST }o--|| CATEGORY : belongs_to
668
+ ----
669
+
670
+ === Add meaningful comments
671
+
672
+ Use comments to clarify constraints:
673
+
674
+ [source,mermaid]
675
+ ----
676
+ erDiagram
677
+ USER {
678
+ int id PK "Auto-generated"
679
+ string email UK "Lowercase, validated"
680
+ datetime last_login "Nullable"
681
+ }
682
+ ----
683
+
684
+ === Keep diagrams focused
685
+
686
+ For large systems, create multiple diagrams:
687
+
688
+ * One diagram per domain/module
689
+ * Separate diagrams for different abstraction levels
690
+ * Core entities in one diagram, auxiliary in another
691
+
692
+ === Use consistent naming
693
+
694
+ Maintain naming consistency:
695
+
696
+ [source,mermaid]
697
+ ----
698
+ %% Consistent ID naming
699
+ CUSTOMER {
700
+ int id PK
701
+ }
702
+
703
+ ORDER {
704
+ int id PK
705
+ int customer_id FK
706
+ }
707
+
708
+ %% Consistent timestamp naming
709
+ POST {
710
+ datetime created_at
711
+ datetime updated_at
712
+ }
713
+ ----
714
+
715
+ == Related documentation
716
+
717
+ * <<index.adoc#,Diagram types overview>>
718
+ * <<class-diagram.adoc#,Class diagrams>>
719
+ * link:https://mermaid.js.org/syntax/entityRelationshipDiagram.html[Official Mermaid ER diagram documentation]