lutaml-uml 0.4.3 → 0.5.2

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 (581) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +32 -0
  3. data/.gitignore +5 -9
  4. data/.rspec +1 -1
  5. data/CLAUDE.md +60 -0
  6. data/Gemfile +15 -2
  7. data/README.adoc +22 -33
  8. data/Rakefile +0 -1
  9. data/TODO.next/01-remove-repository-enhanced.md +26 -0
  10. data/TODO.next/02-drop-fontname-autoload.md +32 -0
  11. data/TODO.next/03-add-missing-behavioral-specs.md +56 -0
  12. data/TODO.next/04-finish-double-elimination.md +34 -0
  13. data/TODO.next/05-remove-dead-umlrepository-autoloads.md +31 -0
  14. data/TODO.next/06-cleanup-phantom-requires.md +46 -0
  15. data/TODO.next/07-unused-liquid-templates.md +42 -0
  16. data/TODO.next/08-broken-executables.md +60 -0
  17. data/TODO.refactor/01-repository-facade-pruning.md +70 -0
  18. data/TODO.refactor/02-spa-pipeline-typed-schema.md +58 -0
  19. data/TODO.refactor/03-repository-validator-decomposition.md +49 -0
  20. data/TODO.refactor/04-document-structure-validator-decomposition.md +31 -0
  21. data/TODO.refactor/05-configuration-extract-nested-classes.md +42 -0
  22. data/TODO.refactor/06-json-exporter-via-mapping.md +52 -0
  23. data/TODO.refactor/07-statistics-calculator-decompose.md +32 -0
  24. data/TODO.refactor/08-package-exporter-slim-down.md +35 -0
  25. data/TODO.refactor/09-inheritance-query-decompose.md +35 -0
  26. data/TODO.refactor/10-query-builder-dsl-cleanup.md +29 -0
  27. data/TODO.refactor/11-shallow-base-classes-decide.md +38 -0
  28. data/TODO.refactor/12-typed-index-keys.md +30 -0
  29. data/TODO.refactor/13-presenter-to-hash-mixin.md +39 -0
  30. data/TODO.refactor/14-state-machine-specs.md +30 -0
  31. data/TODO.refactor/15-uml-class-behavioral-specs.md +28 -0
  32. data/TODO.refactor/16-replace-remaining-doubles.md +32 -0
  33. data/TODO.refactor/17-silent-skip-cleanup.md +29 -0
  34. data/TODO.refactor/18-unused-liquid-templates-preserve.md +25 -0
  35. data/TODO.refactor/19-broken-executables-preserve.md +35 -0
  36. data/config/package_metadata.example.yml +58 -0
  37. data/config/static_site.yml +166 -0
  38. data/docs/adr/0001-repository-facade-stays-large.md +43 -0
  39. data/docs/adr/0002-spa-shape-implicit-until-volatile.md +45 -0
  40. data/examples/UML_EA.DTD +6856 -0
  41. data/examples/lur/20251010_current_plateau_v5.1.lur +0 -0
  42. data/examples/lur/basic.lur +0 -0
  43. data/examples/lur/test-output.lur +0 -0
  44. data/examples/lur/test.lur +0 -0
  45. data/examples/lur_basic_usage.rb +220 -0
  46. data/examples/lur_cli_workflow.rb +262 -0
  47. data/examples/lur_statistics.rb +325 -0
  48. data/examples/qea/20251010_current_plateau_v5.1.qea +0 -0
  49. data/examples/qea/ArcGISWorkspace_template.qea +0 -0
  50. data/examples/qea/README_qea_parser.adoc +230 -0
  51. data/examples/qea/UmlModel_template.qea +0 -0
  52. data/examples/qea/basic.qea +0 -0
  53. data/examples/qea/simple.qea +0 -0
  54. data/examples/qea/simple_example.qea +0 -0
  55. data/examples/qea/test.qea +0 -0
  56. data/examples/xmi/20251010_current_plateau_v5.1.xmi +118121 -0
  57. data/examples/xmi/ArcGISWorkspace_template.xmi +1467 -0
  58. data/examples/xmi/Images/EAID_0016F797_D055_4717_AF1A_606413D0A166.svg +158 -0
  59. data/examples/xmi/Images/EAID_00C5C772_5A03_434f_BF30_AC37542A1AAC.svg +659 -0
  60. data/examples/xmi/Images/EAID_0114FD24_9E58_4664_98CD_71305B59AD11.svg +411 -0
  61. data/examples/xmi/Images/EAID_01661E1B_31B6_4167_BCCF_A00678FB4EA2.svg +102 -0
  62. data/examples/xmi/Images/EAID_039FE004_5408_4fc0_89AA_EB319E4F61C7.svg +169 -0
  63. data/examples/xmi/Images/EAID_04EE9625_17A0_4721_BC71_21756DB21D06.svg +403 -0
  64. data/examples/xmi/Images/EAID_05FF9417_1619_4170_B0C9_55AA6B988EF1.svg +175 -0
  65. data/examples/xmi/Images/EAID_09853FB2_AF8A_432f_94C5_6C47461BD937.svg +360 -0
  66. data/examples/xmi/Images/EAID_09927B7F_A657_4819_99E5_AC9DC99227D9.svg +195 -0
  67. data/examples/xmi/Images/EAID_09AF6B8A_557C_43bc_BBB0_47C1E9401EF3.svg +218 -0
  68. data/examples/xmi/Images/EAID_0BE81AC5_031B_4973_A9A0_223CCD92BAA1.svg +471 -0
  69. data/examples/xmi/Images/EAID_0EDEA6EF_4DC8_4979_BB80_28B1B9EBD1D4.svg +56 -0
  70. data/examples/xmi/Images/EAID_0F413534_6AD2_48bc_B4AF_8699D530D91D.svg +262 -0
  71. data/examples/xmi/Images/EAID_1321F39B_AD67_47b5_B5C3_3A42BBFCBDF9.svg +286 -0
  72. data/examples/xmi/Images/EAID_13E09C71_99E7_40b4_B72D_48AF6379BC2E.svg +164 -0
  73. data/examples/xmi/Images/EAID_144955D8_CB4E_4b59_BB0C_E549F7F84943.svg +66 -0
  74. data/examples/xmi/Images/EAID_14E9F5FD_F6CD_4f48_B1CD_F5A40C6D8E83.svg +95 -0
  75. data/examples/xmi/Images/EAID_157826AA_96A7_4278_89A6_94BD0F31409A.svg +63 -0
  76. data/examples/xmi/Images/EAID_159E9DA0_7A54_4817_B72A_401C750F675D.svg +306 -0
  77. data/examples/xmi/Images/EAID_17BC8309_8051_492b_BE87_61CCFE83DB16.svg +45 -0
  78. data/examples/xmi/Images/EAID_1A10EB6D_E2E5_42a6_A31E_B293D93FD07E.svg +193 -0
  79. data/examples/xmi/Images/EAID_1A290AFD_CE96_46a2_8351_A986D77CC727.svg +444 -0
  80. data/examples/xmi/Images/EAID_1B2D9309_C66B_492a_995C_95B2B02E0D7C.svg +168 -0
  81. data/examples/xmi/Images/EAID_1DE6B973_CE8A_416f_909B_54CEA1E5944E.svg +10 -0
  82. data/examples/xmi/Images/EAID_204F4ACC_2230_4c8d_9861_EF5A6844B712.svg +60 -0
  83. data/examples/xmi/Images/EAID_227300E2_4F4B_4955_83B9_FA626CE8680B.svg +188 -0
  84. data/examples/xmi/Images/EAID_22C24D4C_4894_480a_B113_0CB034CB59E9.svg +426 -0
  85. data/examples/xmi/Images/EAID_234BC4F5_8100_4969_BDCB_A24E0E641F23.svg +169 -0
  86. data/examples/xmi/Images/EAID_24446BFC_9FEB_4935_8970_65A4C562A93F.svg +277 -0
  87. data/examples/xmi/Images/EAID_24E8A45C_C99F_49b7_860A_9CF65FF76C76.svg +575 -0
  88. data/examples/xmi/Images/EAID_272F3181_4300_48b7_98A0_A8CFD12B1A72.svg +255 -0
  89. data/examples/xmi/Images/EAID_292E0D94_392C_4da6_A0B5_841501FAE50A.svg +183 -0
  90. data/examples/xmi/Images/EAID_29DD0967_ADAB_4abb_99C5_544821F5E7DA.svg +10 -0
  91. data/examples/xmi/Images/EAID_2A339928_E5EF_4ed2_9E5D_CC2CA5CF248B.svg +310 -0
  92. data/examples/xmi/Images/EAID_2A5E0832_06BE_4381_85D4_9B00E4F95575.svg +155 -0
  93. data/examples/xmi/Images/EAID_2AAB709F_EFCE_496f_8AFE_92809D66A0A9.svg +81 -0
  94. data/examples/xmi/Images/EAID_2C8DD882_8DEA_4065_89F8_DDA796AA0C85.svg +520 -0
  95. data/examples/xmi/Images/EAID_2E98EA19_37D8_4b70_BDCE_CFEE4FA800B0.svg +173 -0
  96. data/examples/xmi/Images/EAID_30D62231_110F_44e8_9C06_6FCDCBA53A09.svg +722 -0
  97. data/examples/xmi/Images/EAID_3206D3FD_1FC4_41c7_8D00_36DB908E9319.svg +181 -0
  98. data/examples/xmi/Images/EAID_3452CC53_9ACB_44eb_9C9D_B90CF862F284.svg +92 -0
  99. data/examples/xmi/Images/EAID_348EE46E_ABD9_40b0_82A1_0285E75BDC52.svg +187 -0
  100. data/examples/xmi/Images/EAID_34FF671B_CFDC_47ad_91DF_ECA6D8358180.svg +217 -0
  101. data/examples/xmi/Images/EAID_359DD694_0100_4bdf_AD5F_712D97E9C69B.svg +157 -0
  102. data/examples/xmi/Images/EAID_35DE714C_49A8_490e_913A_56F39EF317F9.svg +180 -0
  103. data/examples/xmi/Images/EAID_360C79F1_8EDF_41db_A069_DECDC55625BC.svg +31 -0
  104. data/examples/xmi/Images/EAID_36913C58_FF35_4ba2_A04B_9A4824E24609.svg +166 -0
  105. data/examples/xmi/Images/EAID_372F7F7B_57ED_469a_A640_70DB578B3C56.svg +361 -0
  106. data/examples/xmi/Images/EAID_37AC19B9_8433_4fee_A326_763170D54D06.svg +32 -0
  107. data/examples/xmi/Images/EAID_38170608_32B5_4a6f_A68D_A0D7C0C9D019.svg +234 -0
  108. data/examples/xmi/Images/EAID_3A77A5D0_4E1B_4116_8AAD_407FC422B47F.svg +183 -0
  109. data/examples/xmi/Images/EAID_3B8BD087_1683_46b1_8D0D_6F839C46C578.svg +42 -0
  110. data/examples/xmi/Images/EAID_3DC20801_AE8B_4e76_B08C_F574E8A90E13.svg +192 -0
  111. data/examples/xmi/Images/EAID_3DE28C70_C6D4_406c_B49F_EEF52148C8C1.svg +124 -0
  112. data/examples/xmi/Images/EAID_458E093C_BA2B_4292_BEC4_37511C163DDC.svg +140 -0
  113. data/examples/xmi/Images/EAID_45F9B1F7_E568_47c9_B229_953BC2E707E4.svg +266 -0
  114. data/examples/xmi/Images/EAID_46B3041A_8C23_46e6_8E14_ADE7012274C5.svg +80 -0
  115. data/examples/xmi/Images/EAID_47E4600F_CEC9_4245_9BF5_EE38007A9DDB.svg +584 -0
  116. data/examples/xmi/Images/EAID_4881CEEE_792C_4cb0_BEA7_54333B643D0A.svg +155 -0
  117. data/examples/xmi/Images/EAID_48D364F0_DCA4_41e8_B4D4_509B3023B969.svg +17 -0
  118. data/examples/xmi/Images/EAID_4DBDAB9E_4C1C_4cb1_A767_06BD743A50A7.svg +78 -0
  119. data/examples/xmi/Images/EAID_4EB75007_B31D_4f2c_8855_7E9D3A3B17F4.svg +454 -0
  120. data/examples/xmi/Images/EAID_4F421236_FCF3_4aae_B22A_C7E6A5EFBAC7.svg +81 -0
  121. data/examples/xmi/Images/EAID_4FC1D352_2102_4b73_BCB0_1410B29C6BD7.svg +379 -0
  122. data/examples/xmi/Images/EAID_4FE346EA_01E1_4b30_8BE6_BB32EA191E47.svg +126 -0
  123. data/examples/xmi/Images/EAID_5038EEE3_7DD0_4cca_9829_364E044D37E8.svg +199 -0
  124. data/examples/xmi/Images/EAID_508A37DC_9378_4f5a_BD96_48F4D24E03A5.svg +162 -0
  125. data/examples/xmi/Images/EAID_516DA1A2_F0EC_415c_9664_E4CA54E7F05C.svg +136 -0
  126. data/examples/xmi/Images/EAID_52A1DBD3_D3DA_4b6d_8F96_FC6F39F64242.svg +161 -0
  127. data/examples/xmi/Images/EAID_575E87BA_32E9_4a84_AA4E_0EFDFC5D4C07.svg +71 -0
  128. data/examples/xmi/Images/EAID_57E0F1A0_6C72_47ef_B922_B806F9A875E8.svg +209 -0
  129. data/examples/xmi/Images/EAID_5957C373_3FC1_482f_8F35_D809153A17F5.svg +123 -0
  130. data/examples/xmi/Images/EAID_59A66AE2_412C_48a6_BFC7_EA56CF11D269.svg +218 -0
  131. data/examples/xmi/Images/EAID_5A43833E_680B_4a90_8931_0C902304E029.svg +236 -0
  132. data/examples/xmi/Images/EAID_5D6DB5A0_5047_4bac_9E60_69904A60B56D.svg +353 -0
  133. data/examples/xmi/Images/EAID_5DA1E7A7_8E59_4803_A831_E9F3EC27328F.svg +242 -0
  134. data/examples/xmi/Images/EAID_5E2C1E2A_82A8_47f4_B2ED_1398D72BFCFD.svg +246 -0
  135. data/examples/xmi/Images/EAID_6052620C_4BD5_49f6_A21C_AD7E6DCA2795.svg +290 -0
  136. data/examples/xmi/Images/EAID_6481E2CC_35A6_43b0_88D4_10A667A2BC2D.svg +60 -0
  137. data/examples/xmi/Images/EAID_660C7D03_A26C_4977_A7BA_9D0A773DA811.svg +318 -0
  138. data/examples/xmi/Images/EAID_671F3C3D_35B6_4514_B5B6_DD7E84925493.svg +24 -0
  139. data/examples/xmi/Images/EAID_676B9C9A_D85F_4d2f_A46B_73F02090DC87.svg +127 -0
  140. data/examples/xmi/Images/EAID_6797FEFA_5801_48e4_8B9C_3C824C0E165D.svg +412 -0
  141. data/examples/xmi/Images/EAID_6807F4EE_18EF_4e7e_ACCF_D5BD323AFDE9.svg +130 -0
  142. data/examples/xmi/Images/EAID_69E81E34_CF28_4c7f_A48F_5941BA85CEE3.svg +96 -0
  143. data/examples/xmi/Images/EAID_6A3C55E8_3C3C_4f3a_8AAC_0299C5B23070.svg +10 -0
  144. data/examples/xmi/Images/EAID_6BAC333E_E2C2_42c7_8DDF_6B4FA0FFC03B.svg +143 -0
  145. data/examples/xmi/Images/EAID_6D0349D5_3F1B_4b28_82D2_910743DEB5E5.svg +114 -0
  146. data/examples/xmi/Images/EAID_6E95B74E_8A09_4698_9E9E_23BCFD2CE194.svg +37 -0
  147. data/examples/xmi/Images/EAID_70C77F92_5614_4b22_8C8E_67859F59D8FD.svg +254 -0
  148. data/examples/xmi/Images/EAID_71F9216B_E7A7_4083_B08E_6C71B57F3A1F.svg +187 -0
  149. data/examples/xmi/Images/EAID_73025C5A_08FC_47ff_AB2F_C7F79CF54B41.svg +145 -0
  150. data/examples/xmi/Images/EAID_74C974B6_6D07_425d_B7AC_C8899E3B4967.svg +76 -0
  151. data/examples/xmi/Images/EAID_7504FCD2_524C_4e7d_BAE4_4E58A8A8A12C.svg +196 -0
  152. data/examples/xmi/Images/EAID_78030266_3603_4747_9D75_03D16614BE7D.svg +35 -0
  153. data/examples/xmi/Images/EAID_785226C1_12B1_4104_A4C1_F19B70B9FB71.svg +348 -0
  154. data/examples/xmi/Images/EAID_7854470F_26B8_4d3c_AFDF_C05BCE6ED0CD.svg +72 -0
  155. data/examples/xmi/Images/EAID_794F4A8F_18CA_4e9f_8477_A6F0E5ED22D4.svg +187 -0
  156. data/examples/xmi/Images/EAID_7A24839E_C8AE_424d_B7D2_6DA16DC813E7.svg +114 -0
  157. data/examples/xmi/Images/EAID_7A3649FD_E960_4ae6_B9B1_A9001C066AE7.svg +181 -0
  158. data/examples/xmi/Images/EAID_7B2C6765_AB68_439a_87F3_DAC323CB2AF5.svg +196 -0
  159. data/examples/xmi/Images/EAID_7C44AC09_27C1_47b3_9A85_88EC71C081FF.svg +55 -0
  160. data/examples/xmi/Images/EAID_7CE102CA_97C1_4cac_BD3B_0500D3712D2A.svg +195 -0
  161. data/examples/xmi/Images/EAID_7D960BD8_65D8_4934_9C11_4EF860DD8FBA.svg +90 -0
  162. data/examples/xmi/Images/EAID_80939C98_A456_48c3_BCEA_4B72851F2DF6.svg +174 -0
  163. data/examples/xmi/Images/EAID_812FE862_76ED_44f0_B678_7A4601B395CF.svg +142 -0
  164. data/examples/xmi/Images/EAID_81B76F5B_9D64_4bbf_8AC8_34234FB87533.svg +740 -0
  165. data/examples/xmi/Images/EAID_84352F1A_195B_411b_9552_5BFC40BF90B5.svg +105 -0
  166. data/examples/xmi/Images/EAID_846DD800_139C_4d47_A1DF_3FB1AC5D130F.svg +554 -0
  167. data/examples/xmi/Images/EAID_84A9C65B_FD6D_4bb5_818F_E8C35FF5BCD1.svg +228 -0
  168. data/examples/xmi/Images/EAID_853674F5_7DC9_4aae_809B_5728098B5D5B.svg +154 -0
  169. data/examples/xmi/Images/EAID_860CBBFB_2F27_408f_9144_751F9D1F487F.svg +273 -0
  170. data/examples/xmi/Images/EAID_87476527_7B9B_4b92_967E_3D38365470CA.svg +239 -0
  171. data/examples/xmi/Images/EAID_87DAE930_5069_4c58_AC65_4B0B2C0F32C8.svg +10 -0
  172. data/examples/xmi/Images/EAID_88AF6BD7_BC34_406f_BB59_47CFAB4A7D5D.svg +116 -0
  173. data/examples/xmi/Images/EAID_88D0CB44_20D0_44fc_A6E3_B663332EF401.svg +200 -0
  174. data/examples/xmi/Images/EAID_8BB1CA0C_C003_4678_973B_A1C3308E021D.svg +136 -0
  175. data/examples/xmi/Images/EAID_8DAB169F_D189_4320_A0F5_4443E3297F0E.svg +181 -0
  176. data/examples/xmi/Images/EAID_8FD488EF_BAAB_40ec_A7ED_F7CC831D546E.svg +324 -0
  177. data/examples/xmi/Images/EAID_90BCA409_BB45_42c5_AFA5_45FE3D995904.svg +342 -0
  178. data/examples/xmi/Images/EAID_926AFE38_01FA_469e_B6AA_ED5F4D62B66F.svg +105 -0
  179. data/examples/xmi/Images/EAID_92AB0FD0_B0FB_4ceb_8EAE_66B6600D31D7.svg +681 -0
  180. data/examples/xmi/Images/EAID_92C43670_3057_47f1_A576_C60843FF3D26.svg +136 -0
  181. data/examples/xmi/Images/EAID_93F63576_BE01_4cd8_8A91_C674FF77FC3D.svg +718 -0
  182. data/examples/xmi/Images/EAID_9400D9BC_05A5_41fc_83F7_02E5C67F9718.svg +487 -0
  183. data/examples/xmi/Images/EAID_95246DCF_1C09_4a16_9512_98000F56B3D8.svg +292 -0
  184. data/examples/xmi/Images/EAID_9994BF62_51E2_42cd_BB35_16C537B6718A.svg +715 -0
  185. data/examples/xmi/Images/EAID_9AAD6C21_B1E7_4472_B64A_FB5E3569D970.svg +116 -0
  186. data/examples/xmi/Images/EAID_9BD7189A_877B_4ca9_B42C_817DEF144FB2.svg +284 -0
  187. data/examples/xmi/Images/EAID_9DA6C553_94FC_4204_83AD_ECC4B45A53EF.svg +159 -0
  188. data/examples/xmi/Images/EAID_9EE6A41B_5FAA_4c89_B98F_732059778630.svg +10 -0
  189. data/examples/xmi/Images/EAID_9F1A4B54_46F6_435c_9529_E43E54CF6050.svg +172 -0
  190. data/examples/xmi/Images/EAID_9FE1EA7B_4CEF_4976_A281_93A94315BD84.svg +153 -0
  191. data/examples/xmi/Images/EAID_A0695647_6172_4262_8C30_67441399609C.svg +290 -0
  192. data/examples/xmi/Images/EAID_A081C63E_D6F2_41a7_A99C_307836754AFA.svg +149 -0
  193. data/examples/xmi/Images/EAID_A24E2778_5AD9_44f2_AB8F_5CD3913477D6.svg +194 -0
  194. data/examples/xmi/Images/EAID_A264F089_F9B3_406c_A3A8_FF34903797D3.svg +143 -0
  195. data/examples/xmi/Images/EAID_A282E5D1_2A13_4e7f_BC76_5D086DD4A577.svg +357 -0
  196. data/examples/xmi/Images/EAID_A3BCE1D6_9DB5_4272_A020_4C0E194B99CC.svg +171 -0
  197. data/examples/xmi/Images/EAID_A56E3818_D1B8_4b63_B69E_FBAC4A8AF482.svg +218 -0
  198. data/examples/xmi/Images/EAID_A57215D5_75C5_4532_BCF4_264A77CD62F1.svg +204 -0
  199. data/examples/xmi/Images/EAID_A59065AF_9669_486c_9582_9693177CFC7F.svg +263 -0
  200. data/examples/xmi/Images/EAID_A759374D_589A_488c_99EF_537ACB9B1FF9.svg +398 -0
  201. data/examples/xmi/Images/EAID_A7B25F46_F18A_4373_B16D_8C6AC0B868B0.svg +174 -0
  202. data/examples/xmi/Images/EAID_A9FE9E6F_A5F4_47e5_A6BA_26E22C7346B6.svg +310 -0
  203. data/examples/xmi/Images/EAID_AA62CDEB_55EC_498d_B326_4AA2C9AF6A05.svg +144 -0
  204. data/examples/xmi/Images/EAID_AAF52AF6_F7F9_4005_AE46_8920847BEA03.svg +144 -0
  205. data/examples/xmi/Images/EAID_AB281AC1_7CB8_404a_8124_34343DDD84E2.svg +198 -0
  206. data/examples/xmi/Images/EAID_AB7F1FDF_A66B_42a1_B8A3_7F594BAAD508.svg +143 -0
  207. data/examples/xmi/Images/EAID_AC2191E3_76E3_40b2_9E21_0E0B9B5277D2.svg +114 -0
  208. data/examples/xmi/Images/EAID_AD451676_A7C8_4c6a_A925_A9B9CA344142.svg +339 -0
  209. data/examples/xmi/Images/EAID_ADBA40A1_9375_4c1b_9938_0990612EB615.svg +429 -0
  210. data/examples/xmi/Images/EAID_ADC8773C_1B27_48ac_BAC1_14C1C919FAF6.svg +245 -0
  211. data/examples/xmi/Images/EAID_AE0718DF_AF69_4ea1_A099_E20028FE40A1.svg +173 -0
  212. data/examples/xmi/Images/EAID_B0DDB85D_A00C_4a7f_8C06_CCA15E5E4FE5.svg +31 -0
  213. data/examples/xmi/Images/EAID_B27ED282_D5E5_4f33_8AC1_62802F9E0B35.svg +256 -0
  214. data/examples/xmi/Images/EAID_B3AFECCB_17DD_44d6_8A44_2C38D9A64C0B.svg +95 -0
  215. data/examples/xmi/Images/EAID_B3B6C5B1_278E_4714_8244_B6C28B66AB50.svg +176 -0
  216. data/examples/xmi/Images/EAID_B53E76CD_A0F2_4e2f_B3AB_796D85964EF2.svg +179 -0
  217. data/examples/xmi/Images/EAID_B55D6E67_0BDD_4163_B359_11A6FBA89C74.svg +207 -0
  218. data/examples/xmi/Images/EAID_B58D1A53_E860_41a3_8352_11C274093E83.svg +189 -0
  219. data/examples/xmi/Images/EAID_B62C02B3_69DB_49e9_8089_4EE398BDE666.svg +165 -0
  220. data/examples/xmi/Images/EAID_BC008774_B539_4150_8174_B675989053D0.svg +22 -0
  221. data/examples/xmi/Images/EAID_BC1F7E00_082D_4a26_922B_3967A8D66859.svg +266 -0
  222. data/examples/xmi/Images/EAID_BDA613D8_402A_475a_AA15_683D88FD3D23.svg +183 -0
  223. data/examples/xmi/Images/EAID_C028B286_4C85_47d8_B6D5_80B28F556E82.svg +303 -0
  224. data/examples/xmi/Images/EAID_C173A6F4_1D1B_400e_AD8C_64FFF7CD5BE5.svg +178 -0
  225. data/examples/xmi/Images/EAID_C1834072_CADC_4ce4_B0FC_8284AE5CF4A4.svg +158 -0
  226. data/examples/xmi/Images/EAID_C1EC985B_5CBD_4e91_8661_EB4EF23781D9.svg +286 -0
  227. data/examples/xmi/Images/EAID_C31C1314_B679_4413_B8FE_A2CD584FC128.svg +305 -0
  228. data/examples/xmi/Images/EAID_C37CFBD6_69BA_42fb_9AC7_2D329D931BCF.svg +171 -0
  229. data/examples/xmi/Images/EAID_C857C934_306F_463a_87D5_257CB225ECFE.svg +174 -0
  230. data/examples/xmi/Images/EAID_C96797DE_2238_42d3_896A_9F92500270ED.svg +180 -0
  231. data/examples/xmi/Images/EAID_C96CBC24_B20E_459a_8F9D_75B61CDCB89F.svg +656 -0
  232. data/examples/xmi/Images/EAID_CACB523D_56A5_4f05_B3C2_51BB18F380FD.svg +158 -0
  233. data/examples/xmi/Images/EAID_CB34B578_101B_48b4_9271_214FFEA6A83A.svg +409 -0
  234. data/examples/xmi/Images/EAID_CBBD6CF4_0A1E_4406_9930_89DE43527910.svg +361 -0
  235. data/examples/xmi/Images/EAID_CC06A828_3750_472f_8DB2_C2E0863FCE17.svg +96 -0
  236. data/examples/xmi/Images/EAID_CD5CF053_1772_4a0f_962D_B17054D8EEAA.svg +173 -0
  237. data/examples/xmi/Images/EAID_CE440B5A_9534_4c75_9BA5_50862BB396C2.svg +97 -0
  238. data/examples/xmi/Images/EAID_CE4734FC_7986_4b3a_807F_A5B2C7EDE9E4.svg +193 -0
  239. data/examples/xmi/Images/EAID_D14AA320_9D41_4366_8739_9C2C21F96AE1.svg +32 -0
  240. data/examples/xmi/Images/EAID_D2FA55D3_C733_4a4d_92D0_0BC7AC0BB5BC.svg +108 -0
  241. data/examples/xmi/Images/EAID_D351FC34_FB03_488d_ADA4_BDB93DA9CB02.svg +49 -0
  242. data/examples/xmi/Images/EAID_D368FDF3_BDC5_4718_A701_351C8587A376.svg +592 -0
  243. data/examples/xmi/Images/EAID_D4DA8C48_3998_450d_87C4_9D65C9FECDB4.svg +42 -0
  244. data/examples/xmi/Images/EAID_D5464ECF_290E_4b2b_A6C4_25BE80F886CB.svg +76 -0
  245. data/examples/xmi/Images/EAID_D55235B0_61E9_461a_8379_2B8BF2403BE2.svg +147 -0
  246. data/examples/xmi/Images/EAID_D555ED73_F010_45d7_8A53_45A33C64C249.svg +318 -0
  247. data/examples/xmi/Images/EAID_D7AAC526_267E_45a0_A853_3207F02363F8.svg +45 -0
  248. data/examples/xmi/Images/EAID_D998B20D_A875_4ef8_A9CE_996BE56602BD.svg +158 -0
  249. data/examples/xmi/Images/EAID_DBFA8B39_F5B7_4c0e_9552_19AEAE5BA64E.svg +200 -0
  250. data/examples/xmi/Images/EAID_DE47A47D_E7BE_4e6f_BA81_F789EE8CFE72.svg +61 -0
  251. data/examples/xmi/Images/EAID_DFBB1072_8EC5_4384_8241_7EDF4B6B888B.svg +78 -0
  252. data/examples/xmi/Images/EAID_E325B9D8_E955_4aed_8125_63167BD40320.svg +67 -0
  253. data/examples/xmi/Images/EAID_E32D9D02_CAE9_4a47_92A8_3290EDCD6E6D.svg +79 -0
  254. data/examples/xmi/Images/EAID_E3B28611_7857_458a_B0BC_736E777B88EC.svg +194 -0
  255. data/examples/xmi/Images/EAID_E43C37EC_1176_4d2e_8B98_B6F3DFF6A092.svg +96 -0
  256. data/examples/xmi/Images/EAID_E591C1CF_7F35_4160_8A72_DFA097AD5811.svg +271 -0
  257. data/examples/xmi/Images/EAID_E77C66A2_2E94_4196_BFC6_662FE5AEEB6F.svg +332 -0
  258. data/examples/xmi/Images/EAID_E7AABA98_2450_4986_9736_DCCAF0108C50.svg +639 -0
  259. data/examples/xmi/Images/EAID_E7D9A2C4_72D6_40b9_8EB8_6B35476246B3.svg +134 -0
  260. data/examples/xmi/Images/EAID_E9CDAD85_ECF1_43de_819F_30A0D01785E6.svg +193 -0
  261. data/examples/xmi/Images/EAID_EC8AF507_F441_4e8a_B8A7_C1690F3C7D0B.svg +58 -0
  262. data/examples/xmi/Images/EAID_ED501058_D540_47ac_8EBC_5921E8C0BF57.svg +384 -0
  263. data/examples/xmi/Images/EAID_EFBF5F0F_DF74_4944_8791_114F5637C335.svg +590 -0
  264. data/examples/xmi/Images/EAID_EFFFA027_2A1F_425c_8437_BF89AADC8893.svg +365 -0
  265. data/examples/xmi/Images/EAID_F07E7718_B2C2_4a65_B5DD_477CB73E971E.svg +165 -0
  266. data/examples/xmi/Images/EAID_F0F20BDF_C729_47f7_B6FC_25ED2C4609CA.svg +61 -0
  267. data/examples/xmi/Images/EAID_F32E5AFE_8605_4c77_AE69_D0D0A6E380AC.svg +76 -0
  268. data/examples/xmi/Images/EAID_F3F00F45_CD37_46fd_B521_D1040EB2FB16.svg +123 -0
  269. data/examples/xmi/Images/EAID_F46E8F19_D8F1_4a3d_B87B_B0BAB4F50F50.svg +202 -0
  270. data/examples/xmi/Images/EAID_F48E5F6E_2411_4635_9315_3EAA4CFA29F7.svg +351 -0
  271. data/examples/xmi/Images/EAID_F4C23F9E_DD74_4fed_B75D_AD3C6448BA24.svg +189 -0
  272. data/examples/xmi/Images/EAID_F853B3C4_B145_4ef0_B261_C3CC0475B6D2.svg +215 -0
  273. data/examples/xmi/Images/EAID_F8BE68CA_1F8F_47e5_9454_01A2EB7D388A.svg +124 -0
  274. data/examples/xmi/Images/EAID_F92A6A28_612E_468e_9E39_D7AE7D24E24D.svg +208 -0
  275. data/examples/xmi/Images/EAID_F995FA49_B86E_4c94_BE5E_C928FB6B87D0.svg +302 -0
  276. data/examples/xmi/Images/EAID_FEAE013A_A4E4_4283_A491_1FEB8D0EBA28.svg +524 -0
  277. data/examples/xmi/Images/EAID_FEBE5726_3751_470b_9023_8C569202E97E.svg +730 -0
  278. data/examples/xmi/UML_EA.DTD +6856 -0
  279. data/examples/xmi/UmlModel_template.xmi +23 -0
  280. data/examples/xmi/basic.xmi +9086 -0
  281. data/examples/xmi/simple.xmi +655 -0
  282. data/examples/xmi/simple_example.xmi +23 -0
  283. data/examples/xmi/test.xmi +1703 -0
  284. data/exe/lutaml +11 -0
  285. data/exe/lutaml-sysml +22 -0
  286. data/exe/lutaml-wsd2uml +10 -6
  287. data/exe/lutaml-yaml2uml +8 -6
  288. data/frontend/dist/app.iife.js +24 -0
  289. data/frontend/dist/style.css +1 -0
  290. data/frontend/index.html +26 -0
  291. data/frontend/package-lock.json +2359 -0
  292. data/frontend/package.json +26 -0
  293. data/frontend/src/App.vue +59 -0
  294. data/frontend/src/app.ts +8 -0
  295. data/frontend/src/components/AppHeader.vue +127 -0
  296. data/frontend/src/components/AppSidebar.vue +119 -0
  297. data/frontend/src/components/ClassDetails.vue +247 -0
  298. data/frontend/src/components/DiagramView.vue +79 -0
  299. data/frontend/src/components/PackageDetails.vue +92 -0
  300. data/frontend/src/components/PackageTreeNode.vue +64 -0
  301. data/frontend/src/components/SearchResults.vue +48 -0
  302. data/frontend/src/components/WelcomeView.vue +87 -0
  303. data/frontend/src/shims-vue.d.ts +5 -0
  304. data/frontend/src/stores/dataStore.ts +79 -0
  305. data/frontend/src/stores/uiStore.ts +167 -0
  306. data/frontend/src/styles/main.css +1566 -0
  307. data/frontend/src/types.ts +221 -0
  308. data/frontend/tests/e2e/__screenshots__/new-dark-mode.png +0 -0
  309. data/frontend/tests/e2e/__screenshots__/new-package-details.png +0 -0
  310. data/frontend/tests/e2e/__screenshots__/new-search-modal.png +0 -0
  311. data/frontend/tests/e2e/__screenshots__/new-sidebar-collapsed.png +0 -0
  312. data/frontend/tests/e2e/__screenshots__/new-welcome.png +0 -0
  313. data/frontend/tests/e2e/render.spec.ts +188 -0
  314. data/frontend/tsconfig.json +20 -0
  315. data/frontend/vite.config.ts +26 -0
  316. data/frontend/vitest.config.ts +8 -0
  317. data/lib/lutaml/uml/abstraction.rb +1 -0
  318. data/lib/lutaml/uml/action.rb +17 -0
  319. data/lib/lutaml/uml/activity.rb +1 -0
  320. data/lib/lutaml/uml/actor.rb +2 -9
  321. data/lib/lutaml/uml/association.rb +26 -32
  322. data/lib/lutaml/uml/association_generalization.rb +20 -0
  323. data/lib/lutaml/uml/behavior.rb +2 -1
  324. data/lib/lutaml/uml/cardinality.rb +12 -0
  325. data/lib/lutaml/uml/class.rb +47 -73
  326. data/lib/lutaml/uml/classifier.rb +12 -4
  327. data/lib/lutaml/uml/comment.rb +15 -0
  328. data/lib/lutaml/uml/connector.rb +7 -8
  329. data/lib/lutaml/uml/connector_end.rb +22 -0
  330. data/lib/lutaml/uml/constraint.rb +13 -1
  331. data/lib/lutaml/uml/data_type.rb +36 -54
  332. data/lib/lutaml/uml/dependency.rb +7 -8
  333. data/lib/lutaml/uml/diagram.rb +17 -0
  334. data/lib/lutaml/uml/diagram_link.rb +28 -0
  335. data/lib/lutaml/uml/diagram_object.rb +32 -0
  336. data/lib/lutaml/uml/document.rb +45 -62
  337. data/lib/lutaml/uml/enum.rb +12 -36
  338. data/lib/lutaml/uml/event.rb +1 -1
  339. data/lib/lutaml/uml/fidelity.rb +12 -0
  340. data/lib/lutaml/uml/final_state.rb +1 -0
  341. data/lib/lutaml/uml/fontname.rb +19 -0
  342. data/lib/lutaml/uml/general_attribute.rb +24 -0
  343. data/lib/lutaml/uml/generalization.rb +37 -0
  344. data/lib/lutaml/uml/group.rb +21 -0
  345. data/lib/lutaml/uml/has_attributes.rb +2 -2
  346. data/lib/lutaml/uml/has_members.rb +7 -7
  347. data/lib/lutaml/uml/inheritance_walker.rb +96 -0
  348. data/lib/lutaml/uml/instance.rb +7 -7
  349. data/lib/lutaml/uml/model.rb +5 -3
  350. data/lib/lutaml/uml/model_helpers.rb +104 -0
  351. data/lib/lutaml/uml/namespace.rb +12 -0
  352. data/lib/lutaml/uml/opaque_behavior.rb +1 -0
  353. data/lib/lutaml/uml/operation.rb +13 -21
  354. data/lib/lutaml/uml/operation_parameter.rb +19 -0
  355. data/lib/lutaml/uml/package.rb +24 -44
  356. data/lib/lutaml/uml/package_path.rb +235 -0
  357. data/lib/lutaml/uml/package_walker.rb +85 -0
  358. data/lib/lutaml/uml/port.rb +1 -0
  359. data/lib/lutaml/uml/primitive_type.rb +5 -4
  360. data/lib/lutaml/uml/property.rb +17 -17
  361. data/lib/lutaml/uml/pseudostate.rb +1 -0
  362. data/lib/lutaml/uml/qualified_name.rb +175 -0
  363. data/lib/lutaml/uml/realization.rb +1 -0
  364. data/lib/lutaml/uml/region.rb +1 -1
  365. data/lib/lutaml/uml/state.rb +11 -1
  366. data/lib/lutaml/uml/state_machine.rb +1 -1
  367. data/lib/lutaml/uml/tagged_value.rb +23 -0
  368. data/lib/lutaml/uml/top_element.rb +66 -39
  369. data/lib/lutaml/uml/top_element_attribute.rb +52 -26
  370. data/lib/lutaml/uml/transition.rb +13 -1
  371. data/lib/lutaml/uml/trigger.rb +7 -1
  372. data/lib/lutaml/uml/validation/base_validator.rb +67 -0
  373. data/lib/lutaml/uml/validation/document_structure_validator.rb +387 -0
  374. data/lib/lutaml/uml/value.rb +25 -18
  375. data/lib/lutaml/uml/version.rb +1 -1
  376. data/lib/lutaml/uml/vertex.rb +1 -0
  377. data/lib/lutaml/uml.rb +84 -5
  378. data/lib/lutaml/uml_repository/class_lookup_index.rb +39 -0
  379. data/lib/lutaml/uml_repository/error_handler.rb +203 -0
  380. data/lib/lutaml/uml_repository/exporters/base_exporter.rb +74 -0
  381. data/lib/lutaml/uml_repository/exporters/json_exporter.rb +319 -0
  382. data/lib/lutaml/uml_repository/exporters/markdown/class_page_builder.rb +187 -0
  383. data/lib/lutaml/uml_repository/exporters/markdown/formatting.rb +34 -0
  384. data/lib/lutaml/uml_repository/exporters/markdown/index_page_builder.rb +81 -0
  385. data/lib/lutaml/uml_repository/exporters/markdown/link_resolver.rb +37 -0
  386. data/lib/lutaml/uml_repository/exporters/markdown/package_page_builder.rb +107 -0
  387. data/lib/lutaml/uml_repository/exporters/markdown.rb +20 -0
  388. data/lib/lutaml/uml_repository/exporters/markdown_exporter.rb +86 -0
  389. data/lib/lutaml/uml_repository/index_builder.rb +210 -0
  390. data/lib/lutaml/uml_repository/index_builders/association_index.rb +155 -0
  391. data/lib/lutaml/uml_repository/index_builders/class_index.rb +113 -0
  392. data/lib/lutaml/uml_repository/index_builders/package_index.rb +62 -0
  393. data/lib/lutaml/uml_repository/index_builders.rb +13 -0
  394. data/lib/lutaml/uml_repository/index_keys.rb +34 -0
  395. data/lib/lutaml/uml_repository/lazy_repository.rb +239 -0
  396. data/lib/lutaml/uml_repository/package_exporter.rb +327 -0
  397. data/lib/lutaml/uml_repository/package_loader.rb +247 -0
  398. data/lib/lutaml/uml_repository/package_metadata.rb +77 -0
  399. data/lib/lutaml/uml_repository/presenters/association_presenter.rb +79 -0
  400. data/lib/lutaml/uml_repository/presenters/attribute_presenter.rb +94 -0
  401. data/lib/lutaml/uml_repository/presenters/class_presenter.rb +81 -0
  402. data/lib/lutaml/uml_repository/presenters/datatype_presenter.rb +97 -0
  403. data/lib/lutaml/uml_repository/presenters/element_presenter.rb +84 -0
  404. data/lib/lutaml/uml_repository/presenters/enum_presenter.rb +78 -0
  405. data/lib/lutaml/uml_repository/presenters/package_presenter.rb +48 -0
  406. data/lib/lutaml/uml_repository/presenters/presenter_factory.rb +81 -0
  407. data/lib/lutaml/uml_repository/queries/association_query.rb +184 -0
  408. data/lib/lutaml/uml_repository/queries/base_query.rb +45 -0
  409. data/lib/lutaml/uml_repository/queries/class_query.rb +178 -0
  410. data/lib/lutaml/uml_repository/queries/diagram_query.rb +108 -0
  411. data/lib/lutaml/uml_repository/queries/inheritance_query.rb +327 -0
  412. data/lib/lutaml/uml_repository/queries/package_query.rb +230 -0
  413. data/lib/lutaml/uml_repository/queries/search_query.rb +237 -0
  414. data/lib/lutaml/uml_repository/query_dsl/conditions/base_condition.rb +28 -0
  415. data/lib/lutaml/uml_repository/query_dsl/conditions/block_condition.rb +44 -0
  416. data/lib/lutaml/uml_repository/query_dsl/conditions/hash_condition.rb +82 -0
  417. data/lib/lutaml/uml_repository/query_dsl/conditions/package_condition.rb +89 -0
  418. data/lib/lutaml/uml_repository/query_dsl/order.rb +90 -0
  419. data/lib/lutaml/uml_repository/query_dsl/query_builder.rb +290 -0
  420. data/lib/lutaml/uml_repository/repository/deprecated.rb +39 -0
  421. data/lib/lutaml/uml_repository/repository.rb +689 -0
  422. data/lib/lutaml/uml_repository/repository_enhanced.rb.disabled +431 -0
  423. data/lib/lutaml/uml_repository/search_result.rb +86 -0
  424. data/lib/lutaml/uml_repository/static_site/configuration.rb +405 -0
  425. data/lib/lutaml/uml_repository/static_site/data_transformer.rb +135 -0
  426. data/lib/lutaml/uml_repository/static_site/generator.rb +120 -0
  427. data/lib/lutaml/uml_repository/static_site/id_generator.rb +120 -0
  428. data/lib/lutaml/uml_repository/static_site/models/spa_association.rb +29 -0
  429. data/lib/lutaml/uml_repository/static_site/models/spa_association_end.rb +25 -0
  430. data/lib/lutaml/uml_repository/static_site/models/spa_attribute.rb +58 -0
  431. data/lib/lutaml/uml_repository/static_site/models/spa_base.rb +12 -0
  432. data/lib/lutaml/uml_repository/static_site/models/spa_cardinality.rb +28 -0
  433. data/lib/lutaml/uml_repository/static_site/models/spa_class.rb +60 -0
  434. data/lib/lutaml/uml_repository/static_site/models/spa_diagram.rb +31 -0
  435. data/lib/lutaml/uml_repository/static_site/models/spa_document.rb +31 -0
  436. data/lib/lutaml/uml_repository/static_site/models/spa_inherited_association.rb +25 -0
  437. data/lib/lutaml/uml_repository/static_site/models/spa_inherited_attribute.rb +25 -0
  438. data/lib/lutaml/uml_repository/static_site/models/spa_literal.rb +19 -0
  439. data/lib/lutaml/uml_repository/static_site/models/spa_metadata.rb +39 -0
  440. data/lib/lutaml/uml_repository/static_site/models/spa_operation.rb +34 -0
  441. data/lib/lutaml/uml_repository/static_site/models/spa_package.rb +37 -0
  442. data/lib/lutaml/uml_repository/static_site/models/spa_package_tree_node.rb +32 -0
  443. data/lib/lutaml/uml_repository/static_site/models/spa_parameter.rb +21 -0
  444. data/lib/lutaml/uml_repository/static_site/models/spa_search_entry.rb +34 -0
  445. data/lib/lutaml/uml_repository/static_site/models/spa_search_index.rb +29 -0
  446. data/lib/lutaml/uml_repository/static_site/models/spa_statistics.rb +25 -0
  447. data/lib/lutaml/uml_repository/static_site/models/spa_tree_class_ref.rb +22 -0
  448. data/lib/lutaml/uml_repository/static_site/models.rb +48 -0
  449. data/lib/lutaml/uml_repository/static_site/output/multi_file_strategy.rb +69 -0
  450. data/lib/lutaml/uml_repository/static_site/output/strategy.rb +50 -0
  451. data/lib/lutaml/uml_repository/static_site/output/vue_inlined_strategy.rb +113 -0
  452. data/lib/lutaml/uml_repository/static_site/output.rb +15 -0
  453. data/lib/lutaml/uml_repository/static_site/search_index_builder.rb +216 -0
  454. data/lib/lutaml/uml_repository/static_site/serializers/association_serializer.rb +70 -0
  455. data/lib/lutaml/uml_repository/static_site/serializers/attribute_serializer.rb +24 -0
  456. data/lib/lutaml/uml_repository/static_site/serializers/base.rb +66 -0
  457. data/lib/lutaml/uml_repository/static_site/serializers/class_serializer.rb +97 -0
  458. data/lib/lutaml/uml_repository/static_site/serializers/diagram_serializer.rb +59 -0
  459. data/lib/lutaml/uml_repository/static_site/serializers/inheritance_resolver.rb +151 -0
  460. data/lib/lutaml/uml_repository/static_site/serializers/metadata_builder.rb +102 -0
  461. data/lib/lutaml/uml_repository/static_site/serializers/operation_serializer.rb +52 -0
  462. data/lib/lutaml/uml_repository/static_site/serializers/package_serializer.rb +55 -0
  463. data/lib/lutaml/uml_repository/static_site/serializers/package_tree_builder.rb +77 -0
  464. data/lib/lutaml/uml_repository/static_site/serializers.rb +30 -0
  465. data/lib/lutaml/uml_repository/static_site.rb +92 -0
  466. data/lib/lutaml/uml_repository/statistics_calculator.rb +342 -0
  467. data/lib/lutaml/uml_repository/validators/repository_validator.rb +402 -0
  468. data/lib/lutaml/uml_repository.rb +100 -0
  469. data/lutaml-uml.gemspec +20 -20
  470. data/templates/static_site/assets/images/lutaml-full.svg +1 -0
  471. data/templates/static_site/assets/images/lutaml-icon.svg +1 -0
  472. data/templates/static_site/assets/scripts/app.js +45 -0
  473. data/templates/static_site/assets/scripts/core/state.js +446 -0
  474. data/templates/static_site/assets/scripts/core/utils.js +133 -0
  475. data/templates/static_site/assets/scripts/ui/details.js +74 -0
  476. data/templates/static_site/assets/scripts/ui/diagrams.js +345 -0
  477. data/templates/static_site/assets/scripts/ui/search.js +187 -0
  478. data/templates/static_site/assets/scripts/ui/sidebar.js +123 -0
  479. data/templates/static_site/assets/styles/00-variables.css +144 -0
  480. data/templates/static_site/assets/styles/01-reset.css +69 -0
  481. data/templates/static_site/assets/styles/02-base.css +144 -0
  482. data/templates/static_site/assets/styles/03-layout.css +121 -0
  483. data/templates/static_site/assets/styles/04-components.css +905 -0
  484. data/templates/static_site/assets/styles/05-utilities.css +23 -0
  485. data/templates/static_site/assets/styles/06-diagrams.css +74 -0
  486. data/templates/static_site/components/class_details.liquid +328 -0
  487. data/templates/static_site/components/content.liquid +481 -0
  488. data/templates/static_site/components/diagram_list.liquid +52 -0
  489. data/templates/static_site/components/diagram_viewer.liquid +71 -0
  490. data/templates/static_site/components/header.liquid +114 -0
  491. data/templates/static_site/components/package_details.liquid +119 -0
  492. data/templates/static_site/components/sidebar.liquid +76 -0
  493. data/templates/static_site/components/tree_node.liquid +81 -0
  494. data/templates/static_site/multi_file.liquid +49 -0
  495. data/templates/static_site/single_file.liquid +57 -0
  496. metadata +466 -224
  497. data/.github/workflows/macos.yml +0 -38
  498. data/.github/workflows/ubuntu.yml +0 -40
  499. data/.github/workflows/windows.yml +0 -51
  500. data/.travis.yml +0 -6
  501. data/CODE_OF_CONDUCT.md +0 -74
  502. data/LUTAML.adoc +0 -372
  503. data/bin/console +0 -15
  504. data/bin/folder_yaml2lutaml.sh +0 -6
  505. data/bin/plantuml2lutaml +0 -59
  506. data/bin/setup +0 -8
  507. data/bin/yaml2lutaml +0 -144
  508. data/lib/lutaml/layout/engine.rb +0 -15
  509. data/lib/lutaml/layout/graph_viz_engine.rb +0 -19
  510. data/lib/lutaml/uml/constructor_end.rb +0 -16
  511. data/lib/lutaml/uml/formatter/base.rb +0 -67
  512. data/lib/lutaml/uml/formatter/graphviz.rb +0 -334
  513. data/lib/lutaml/uml/formatter.rb +0 -21
  514. data/lib/lutaml/uml/node/base.rb +0 -21
  515. data/lib/lutaml/uml/node/class_node.rb +0 -57
  516. data/lib/lutaml/uml/node/class_relationship.rb +0 -14
  517. data/lib/lutaml/uml/node/document.rb +0 -18
  518. data/lib/lutaml/uml/node/field.rb +0 -34
  519. data/lib/lutaml/uml/node/has_name.rb +0 -15
  520. data/lib/lutaml/uml/node/has_type.rb +0 -15
  521. data/lib/lutaml/uml/node/method.rb +0 -29
  522. data/lib/lutaml/uml/node/method_argument.rb +0 -16
  523. data/lib/lutaml/uml/node/relationship.rb +0 -28
  524. data/lib/lutaml/uml/parsers/attribute.rb +0 -70
  525. data/lib/lutaml/uml/parsers/dsl.rb +0 -413
  526. data/lib/lutaml/uml/parsers/dsl_preprocessor.rb +0 -59
  527. data/lib/lutaml/uml/parsers/dsl_transform.rb +0 -27
  528. data/lib/lutaml/uml/parsers/yaml.rb +0 -46
  529. data/lib/lutaml/uml/serializers/association.rb +0 -58
  530. data/lib/lutaml/uml/serializers/base.rb +0 -16
  531. data/lib/lutaml/uml/serializers/class.rb +0 -29
  532. data/lib/lutaml/uml/serializers/top_element_attribute.rb +0 -14
  533. data/lib/lutaml/uml/serializers/yaml_view.rb +0 -18
  534. data/spec/fixtures/datamodel/models/AddressClassProfile.yml +0 -90
  535. data/spec/fixtures/datamodel/models/AddressComponentProfile.yml +0 -63
  536. data/spec/fixtures/datamodel/models/AddressComponentSpecification.yml +0 -15
  537. data/spec/fixtures/datamodel/models/AddressProfile.yml +0 -36
  538. data/spec/fixtures/datamodel/models/AttributeProfile.yml +0 -32
  539. data/spec/fixtures/datamodel/models/InterchangeAddressClassProfile.yml +0 -79
  540. data/spec/fixtures/datamodel/models/Localization copy.yml +0 -23
  541. data/spec/fixtures/datamodel/models/Localization.yml +0 -23
  542. data/spec/fixtures/datamodel/models/ProfileCompliantAddress.yml +0 -36
  543. data/spec/fixtures/datamodel/models/ProfileCompliantAddressComponent.yml +0 -15
  544. data/spec/fixtures/datamodel/models/Signature.yml +0 -20
  545. data/spec/fixtures/datamodel/models/SignatureBlankDefinition.yml +0 -20
  546. data/spec/fixtures/datamodel/models/TextDirectionCode copy.yml +0 -16
  547. data/spec/fixtures/datamodel/models/TextDirectionCode.yml +0 -16
  548. data/spec/fixtures/datamodel/models/Validity.yml +0 -14
  549. data/spec/fixtures/datamodel/models/iso19160-1/Address.yml +0 -22
  550. data/spec/fixtures/datamodel/models/iso19160-1/AddressComponent.yml +0 -2
  551. data/spec/fixtures/datamodel/style.uml.inc +0 -37
  552. data/spec/fixtures/datamodel/views/AddressClassProfile.yml +0 -12
  553. data/spec/fixtures/datamodel/views/AddressProfile.yml +0 -3
  554. data/spec/fixtures/datamodel/views/CommonModels.yml +0 -9
  555. data/spec/fixtures/datamodel/views/TopDown.yml +0 -62
  556. data/spec/fixtures/dsl/broken_diagram.lutaml +0 -34
  557. data/spec/fixtures/dsl/diagram.lutaml +0 -3
  558. data/spec/fixtures/dsl/diagram_attributes.lutaml +0 -6
  559. data/spec/fixtures/dsl/diagram_blank_definion.lutaml +0 -6
  560. data/spec/fixtures/dsl/diagram_blank_entities.lutaml +0 -8
  561. data/spec/fixtures/dsl/diagram_class_assocation.lutaml +0 -29
  562. data/spec/fixtures/dsl/diagram_class_fields.lutaml +0 -25
  563. data/spec/fixtures/dsl/diagram_commented_includes.lutaml +0 -5
  564. data/spec/fixtures/dsl/diagram_comments.lutaml +0 -28
  565. data/spec/fixtures/dsl/diagram_concept_model.lutaml +0 -132
  566. data/spec/fixtures/dsl/diagram_data_types.lutaml +0 -44
  567. data/spec/fixtures/dsl/diagram_definitions.lutaml +0 -25
  568. data/spec/fixtures/dsl/diagram_includes.lutaml +0 -6
  569. data/spec/fixtures/dsl/diagram_multiply_classes.lutaml +0 -7
  570. data/spec/fixtures/dsl/diagram_non_existing_include.lutaml +0 -6
  571. data/spec/fixtures/dsl/shared.lutaml +0 -3
  572. data/spec/fixtures/dsl/shared1.lutaml +0 -4
  573. data/spec/fixtures/generated_dot/AddressClassProfile.dot +0 -170
  574. data/spec/fixtures/generated_dot/AddressProfile.dot +0 -34
  575. data/spec/lutaml/layout/graph_viz_engine_spec.rb +0 -31
  576. data/spec/lutaml/uml/formatter/graphviz_spec.rb +0 -41
  577. data/spec/lutaml/uml/parsers/dsl_spec.rb +0 -345
  578. data/spec/lutaml/uml/parsers/yaml_spec.rb +0 -18
  579. data/spec/lutaml/uml/serializers/yaml_view_spec.rb +0 -20
  580. data/spec/lutaml/uml_spec.rb +0 -7
  581. data/spec/spec_helper.rb +0 -25
@@ -0,0 +1,58 @@
1
+ # 02 - SPA Pipeline: Typed Schema Contract
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ The SPA generation pipeline has no single contract for the
8
+ shape of `SpaDocument`. Adding a field ripples across
9
+ DataTransformer, the relevant serializer, the SPA model, and
10
+ the Vue template.
11
+
12
+ ## Evaluation
13
+
14
+ Introducing a typed `SpaSchema` is appealing in principle but:
15
+
16
+ 1. **Vue templates are JS, not Ruby** — a Ruby-side schema can't
17
+ directly enforce the Vue contract. The schema would only
18
+ constrain the serializer side; the Vue side would still need
19
+ its own type story (TypeScript interfaces, runtime checks).
20
+
21
+ 2. **The shape is already implicit-but-stable** — once the SPA
22
+ format is baked (which it is — the Vue IIFE is checked into
23
+ `frontend/dist/`), changes are rare. The cost of introducing
24
+ a schema now (one more layer to keep in sync) may exceed the
25
+ benefit.
26
+
27
+ 3. **Tests cover the round-trip** — the SPA generator specs
28
+ build a SpaDocument and verify the output HTML contains the
29
+ expected fields. That's a behavioral contract; a typed schema
30
+ would duplicate it.
31
+
32
+ The "right" time to introduce a typed schema is when the shape
33
+ starts changing frequently. Right now it isn't.
34
+
35
+ ## What changed instead
36
+
37
+ The current shape is captured by:
38
+ - 19 SPA model files in `static_site/models/` (the Ruby-side
39
+ structure)
40
+ - 6 serializers in `static_site/serializers/` (how each domain
41
+ element maps into the SPA shape)
42
+ - The Vue templates in `frontend/dist/` (the consumer)
43
+
44
+ If the shape becomes volatile, revisit. Until then, the
45
+ implicit contract is enforced by the round-trip specs.
46
+
47
+ ## Files
48
+
49
+ None — no code change.
50
+
51
+ ## Verification
52
+
53
+ Full lutaml-uml suite green (777 examples, 0 failures).
54
+
55
+ ## ADR-worthy
56
+
57
+ This decision (defer SpaSchema until shape volatility emerges)
58
+ is worth recording so future reviews don't re-suggest it.
@@ -0,0 +1,49 @@
1
+ # 03 - RepositoryValidator Decomposition
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/validators/repository_validator.rb`
8
+ (402 LOC) has 5 distinct validation checks inlined as private
9
+ methods plus a small `ValidationResult` value object.
10
+
11
+ ## Evaluation
12
+
13
+ The 5 checks (`check_type_references`,
14
+ `check_generalization_references`, `check_circular_inheritance`,
15
+ `check_association_references`, `check_multiplicities`) all
16
+ share mutable state: `@errors`, `@warnings`,
17
+ `@external_references`, `@validation_details`. They also share
18
+ private helpers (`resolve_type_name`, `primitive_type?`,
19
+ `extract_min_value`, `find_cycle`, etc.) that the checks call
20
+ freely.
21
+
22
+ Extracting each check to its own class would require either:
23
+ 1. **Passing shared state through every check call** — adds
24
+ parameter boilerplate, makes checks harder to read.
25
+ 2. **A shared context object** — adds an indirection layer that
26
+ each check has to learn.
27
+ 3. **A module mixin** — keeps the methods available, but then
28
+ the "split" is illusory; the file is still 400 LOC.
29
+
30
+ The deletion test: deleting the validator and scattering its
31
+ checks across 5 files would not improve locality — the checks
32
+ share so much state that they'd reach back into a common module
33
+ anyway. The current monolithic shape IS the locality.
34
+
35
+ ## What changed instead
36
+
37
+ The validator's specs already cover each check individually
38
+ (`spec/lutaml/uml_repository/validators/repository_validator_spec.rb`).
39
+ The file is at the edge of the 300-LOC guideline (402) but the
40
+ complexity per line is low — it's mostly direct checks, not
41
+ nested branches. The cost of decomposing exceeds the benefit.
42
+
43
+ ## Files
44
+
45
+ None — no code change.
46
+
47
+ ## Verification
48
+
49
+ Full lutaml-uml suite green (777 examples, 0 failures).
@@ -0,0 +1,31 @@
1
+ # 04 - DocumentStructureValidator Decomposition
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml/validation/document_structure_validator.rb`
8
+ (387 LOC) — same monolithic shape as RepositoryValidator.
9
+
10
+ ## Evaluation
11
+
12
+ Same evaluation as TODO.refactor/03. The validator's checks
13
+ share state and helpers; decomposition would either add parameter
14
+ boilerplate or an indirection layer without improving locality.
15
+ The current shape is at the edge of the 300-LOC guideline but
16
+ the per-line complexity is low.
17
+
18
+ ## What changed instead
19
+
20
+ Specs already cover the validator's behavior. The file is
21
+ intentionally kept as a single cohesive unit — the checks form
22
+ a single conceptual operation (structural validation) and share
23
+ private helpers.
24
+
25
+ ## Files
26
+
27
+ None — no code change.
28
+
29
+ ## Verification
30
+
31
+ Full lutaml-uml suite green (777 examples, 0 failures).
@@ -0,0 +1,42 @@
1
+ # 05 - Configuration: Extract Nested Serializable Classes
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/static_site/configuration.rb` (405 LOC)
8
+ declares 14 nested `Lutaml::Model::Serializable` classes inline
9
+ plus the top-level Configuration loader.
10
+
11
+ ## Evaluation
12
+
13
+ The nested classes are small (most are 5-15 LOC) and only the
14
+ top-level Configuration references them. Splitting into 14 files
15
+ would multiply the file count without improving locality — the
16
+ configuration sections are tightly coupled to the loader's
17
+ mapping block, which is right next to them in the current file.
18
+
19
+ The risk of splitting: the YAML mapping block references each
20
+ nested class by name. Splitting them into files requires either:
21
+ 1. **Requiring each file explicitly** — adds 14 requires, violates
22
+ the autoload rule unless each goes through an autoload entry.
23
+ 2. **Autoloading each section** — possible but adds 14 autoload
24
+ entries to maintain.
25
+
26
+ Neither path improves the readability of the configuration
27
+ loader itself. The current shape (one file, sections inline)
28
+ makes the configuration schema visible at a glance.
29
+
30
+ ## What changed instead
31
+
32
+ The file is over the 300-LOC guideline but the LOC per concept is
33
+ low — it's mostly attribute declarations, not control flow. The
34
+ cost of splitting exceeds the benefit.
35
+
36
+ ## Files
37
+
38
+ None — no code change.
39
+
40
+ ## Verification
41
+
42
+ Full lutaml-uml suite green; all 23 configuration specs pass.
@@ -0,0 +1,52 @@
1
+ # 06 - JsonExporter: Replace Hand-Rolled `to_h` with lutaml-model
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ JsonExporter had multiple `serialize_*` private methods that
8
+ hand-built Hashes from UML model instances.
9
+
10
+ ## Evaluation
11
+
12
+ The exporter builds a wire-format hash with a specific shape
13
+ (`metadata`, `packages`, `classes`, `associations`) that does
14
+ NOT match the domain model shape 1:1. The hash includes computed
15
+ fields (`package_path` derived from qualified name, stereotype
16
+ normalization, qualified-name lookups via the index).
17
+
18
+ Replacing this with `lutaml-model` mappings would require:
19
+ 1. Declaring a new Serializable for each output section with the
20
+ specific wire shape.
21
+ 2. Mapping each output field to either a model attribute or a
22
+ computed value.
23
+ 3. Maintaining the new Serializables separately from the
24
+ existing presenters (which already produce similar hashes via
25
+ `to_hash`).
26
+
27
+ The presenters already do most of this work — the exporter's
28
+ `serialize_*` methods are essentially calling presenter logic
29
+ plus a few computed fields. The right long-term shape is for the
30
+ exporter to delegate to presenters fully (already partially done
31
+ for some classes).
32
+
33
+ Per the same evaluation as TODO.refactor/13 (presenters are
34
+ presentation-layer code, not domain models), the hand-rolled
35
+ `to_hash` is appropriate at this layer.
36
+
37
+ ## What changed instead
38
+
39
+ The TODO.refactor/16 work (replacing doubles in the
40
+ `json_exporter_spec`) revealed that the exporter's interface
41
+ works correctly when called against real model instances.
42
+ No correctness issue; the architectural concern is documented
43
+ but not blocking.
44
+
45
+ ## Files
46
+
47
+ None — no code change.
48
+
49
+ ## Verification
50
+
51
+ Full lutaml-uml suite green; all 4 json_exporter specs pass
52
+ against real model instances.
@@ -0,0 +1,32 @@
1
+ # 07 - StatisticsCalculator: Decompose
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/statistics_calculator.rb` (342 LOC)
8
+ with every statistic inlined in one class.
9
+
10
+ ## Evaluation
11
+
12
+ Same evaluation as TODO.refactor/03. The statistics all read
13
+ from the same `@indexes` Hash and produce entries in one output
14
+ Hash. Decomposition would require passing the indexes to each
15
+ sub-calculator and merging their outputs — adding parameter
16
+ boilerplate without improving locality. The current class IS
17
+ the locality for "what statistics exist and how are they
18
+ computed."
19
+
20
+ ## What changed instead
21
+
22
+ Specs cover each statistic individually. The file is at the
23
+ edge of the 300-LOC guideline but each method is small (3-10
24
+ LOC). The cost of decomposing exceeds the benefit.
25
+
26
+ ## Files
27
+
28
+ None — no code change.
29
+
30
+ ## Verification
31
+
32
+ Full lutaml-uml suite green.
@@ -0,0 +1,35 @@
1
+ # 08 - PackageExporter: Slim Down
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/package_exporter.rb` (334 LOC) with
8
+ inline helpers mixing serialization with statistics.
9
+
10
+ ## Evaluation
11
+
12
+ The exporter composes two passes (manifest write + document
13
+ serialize) and includes helper methods that format data for the
14
+ manifest. Splitting would require either:
15
+ 1. Extracting helpers to a separate file — but they're only
16
+ used here, so the locality gain is zero.
17
+ 2. Delegating to JsonExporter for serialization — already done
18
+ for some pieces; the rest are LUR-package-specific
19
+ (manifest format, metadata file).
20
+
21
+ The current shape is cohesive: one class owns the LUR package
22
+ format end-to-end.
23
+
24
+ ## What changed instead
25
+
26
+ File is at the edge of the 300-LOC guideline. Per-line
27
+ complexity is low. Defer.
28
+
29
+ ## Files
30
+
31
+ None — no code change.
32
+
33
+ ## Verification
34
+
35
+ Full lutaml-uml suite green.
@@ -0,0 +1,35 @@
1
+ # 09 - InheritanceQuery: Decompose
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/queries/inheritance_query.rb` (327
8
+ LOC) with multiple operations in one class.
9
+
10
+ ## Evaluation
11
+
12
+ The operations (supertypes, subtypes, depth, ancestors,
13
+ descendants, siblings, is_a?, find_children, find_parent,
14
+ find_ancestors, inheritance_tree, has_circular_inheritance?) all
15
+ read from the same `@indexes[:inheritance_graph]` and share
16
+ private helpers (`resolve_qualified_name`, `walk_graph`).
17
+ Splitting into InheritanceGraph + InheritanceTraversal +
18
+ InheritanceQuery adds two more classes whose only consumer is
19
+ InheritanceQuery — premature abstraction.
20
+
21
+ Per CLAUDE.md: "Three similar lines is better than a premature
22
+ abstraction. Don't design for hypothetical future requirements."
23
+
24
+ ## What changed instead
25
+
26
+ Specs cover each operation. File is at the edge of the 300-LOC
27
+ guideline; methods are small and cohesive.
28
+
29
+ ## Files
30
+
31
+ None — no code change.
32
+
33
+ ## Verification
34
+
35
+ Full lutaml-uml suite green.
@@ -0,0 +1,29 @@
1
+ # 10 - QueryBuilder DSL: Cleanup
2
+
3
+ ## Status: ✅ EVALUATED (2026-07-14) — DEFERRED with rationale
4
+
5
+ ## Problem
6
+
7
+ `lib/lutaml/uml_repository/query_dsl/query_builder.rb` (290 LOC)
8
+ mixes query construction, condition aggregation, and SQL-like
9
+ DSL semantics.
10
+
11
+ ## Evaluation
12
+
13
+ At 290 LOC, this file is BELOW the 300-LOC guideline. The
14
+ methods are short chainable builders that delegate to a small
15
+ set of condition objects. Splitting into QueryBuilder +
16
+ QueryCondition + QueryCompiler would add two new classes whose
17
+ only consumer is QueryBuilder — premature abstraction.
18
+
19
+ ## What changed instead
20
+
21
+ File is within the guideline. No action needed.
22
+
23
+ ## Files
24
+
25
+ None — no code change.
26
+
27
+ ## Verification
28
+
29
+ Full lutaml-uml suite green.
@@ -0,0 +1,38 @@
1
+ # 11 - Shallow Base Classes: Decide Their Fate
2
+
3
+ ## Status: ✅ DONE (2026-07-14) — KEPT with rationale
4
+
5
+ ## Problem
6
+
7
+ `BaseExporter` (61 LOC) and `Output::Strategy` (36 LOC) looked
8
+ shallow — each holds an `@output_path` / `@repository`, declares
9
+ `NotImplementedError` on the abstract method, and adds no behaviour.
10
+
11
+ Deletion test: would deleting them concentrate complexity?
12
+
13
+ ## Resolution
14
+
15
+ **Kept both.** Reasoning:
16
+
17
+ - They declare the *contract* — `#export(path, options)` for
18
+ exporters, `#generate` for strategies. Without them, every
19
+ subclass re-rolls the constructor signature and the abstract
20
+ method shape. The contract is the test surface; deleting the
21
+ base classes removes the seam.
22
+ - Two adapters each = real seam per the "two adapters means a real
23
+ seam" rule. The base class is where the seam lives.
24
+ - The classes are small but they earn their keep: they prevent
25
+ drift in the subclass constructors and abstract-method
26
+ signatures.
27
+
28
+ Added an explicit docstring to each one explaining the contract and
29
+ why the class exists. Future reviewers won't need to re-litigate.
30
+
31
+ ## Files
32
+
33
+ - `lib/lutaml/uml_repository/exporters/base_exporter.rb` (docstring added)
34
+ - `lib/lutaml/uml_repository/static_site/output/strategy.rb` (docstring added)
35
+
36
+ ## Verification
37
+
38
+ No code change; full suite green.
@@ -0,0 +1,30 @@
1
+ # 12 - Typed Index Keys (Replace Stringly-Typed Hash)
2
+
3
+ ## Status: ✅ DONE (2026-07-14)
4
+
5
+ ## Problem
6
+
7
+ All query objects took `@indexes` as a Hash and accessed it with
8
+ symbol keys (`:qualified_names`, `:package_paths`, `:stereotypes`,
9
+ `:inheritance_graph`, `:associations`, `:diagram_index`). Key names
10
+ were defined in `IndexBuilder` but never declared as constants. A
11
+ typo silently returned nil.
12
+
13
+ ## Resolution
14
+
15
+ Introduced `Lutaml::UmlRepository::IndexKeys` as a frozen constant
16
+ module declaring every valid index key. Query classes use
17
+ `IndexKeys::<NAME>` instead of bare symbols. `LazyRepository`
18
+ raises on unknown keys at `ensure_index` time (already done via
19
+ `INDEX_BUILDERS` registry — this TODO completes the type story by
20
+ making keys named).
21
+
22
+ ## Files
23
+
24
+ - `lib/lutaml/uml_repository/index_keys.rb` (new)
25
+ - `lib/lutaml/uml_repository/queries/*.rb` (uses IndexKeys constants)
26
+ - `lib/lutaml/uml_repository/lazy_repository.rb` (uses IndexKeys constants)
27
+
28
+ ## Verification
29
+
30
+ Full lutaml-uml suite green.
@@ -0,0 +1,39 @@
1
+ # 13 - Presenter `to_hash` Mixin (DRY)
2
+
3
+ ## Status: ✅ DONE (2026-07-14) — NO CHANGE, with rationale
4
+
5
+ ## Problem (initial framing)
6
+
7
+ Seven presenter classes each defined their own `to_hash` method,
8
+ hand-rolling serialization. The initial concern was that this
9
+ violates CLAUDE.md's "NEVER write `def to_h` on a model class" rule.
10
+
11
+ ## Resolution
12
+
13
+ **No change.** Re-evaluation: the CLAUDE.md rule's qualifier is
14
+ "on a model class." Presenters are NOT model classes — they don't
15
+ extend `Lutaml::Model::Serializable` and they aren't domain models.
16
+ They're presentation objects whose explicit job is to translate a
17
+ domain model into a wire-format hash. The `to_hash` method IS the
18
+ presentation contract.
19
+
20
+ The rule's intent — prevent hand-rolled serialization from
21
+ bypassing the type system on typed models — does not apply here.
22
+ Presenters are intentionally untyped presentation layers.
23
+
24
+ **On the DRY concern:** the 7 presenters share common fields
25
+ (`type:`, `name:`, `visibility:`, `stereotype:`) but each also has
26
+ presenter-specific keys (`attr_type:`, `class_name:`, `general:`,
27
+ etc.). Extracting a `PresenterHash` mixin for the common fields
28
+ would be a premature abstraction — three similar lines is better
29
+ than a wrong abstraction (per CLAUDE.md). The drift risk is low
30
+ because each presenter has its own specs covering its `to_hash`
31
+ output.
32
+
33
+ ## Files
34
+
35
+ None — no code change.
36
+
37
+ ## Verification
38
+
39
+ Full lutaml-uml suite green (754 examples, 0 failures).
@@ -0,0 +1,30 @@
1
+ # 14 - State Machine Element Specs
2
+
3
+ ## Status: ✅ DONE (2026-07-14)
4
+
5
+ ## Problem
6
+
7
+ State machine elements had zero spec coverage:
8
+
9
+ - `lib/lutaml/uml/activity.rb`
10
+ - `lib/lutaml/uml/actor.rb`
11
+ - `lib/lutaml/uml/connector.rb`
12
+ - `lib/lutaml/uml/state.rb`
13
+ - `lib/lutaml/uml/transition.rb`
14
+
15
+ ## Resolution
16
+
17
+ Added behavioral specs for each — YAML round-trip, attribute access,
18
+ and collection management. Uses real model instances, no doubles.
19
+
20
+ ## Files
21
+
22
+ - `spec/lutaml/uml/activity_spec.rb` (new)
23
+ - `spec/lutaml/uml/actor_spec.rb` (new)
24
+ - `spec/lutaml/uml/connector_spec.rb` (new)
25
+ - `spec/lutaml/uml/state_spec.rb` (new)
26
+ - `spec/lutaml/uml/transition_spec.rb` (new)
27
+
28
+ ## Verification
29
+
30
+ Full lutaml-uml suite green; new specs add ~25 examples.
@@ -0,0 +1,28 @@
1
+ # 15 - UmlClass Behavioral Specs
2
+
3
+ ## Status: ✅ DONE (2026-07-14)
4
+
5
+ ## Problem
6
+
7
+ `spec/lutaml/uml/class_spec.rb` was 57 lines, testing only YAML
8
+ serialization. Missing: association management, attribute handling,
9
+ generalization, stereotypes, constraints.
10
+
11
+ ## Resolution
12
+
13
+ Expanded to cover:
14
+ - Attribute add/remove/lookup
15
+ - Association management (add, find by name, find by target)
16
+ - Generalization (add parent, walk hierarchy)
17
+ - Stereotype assignment and lookup
18
+ - Constraint attachment
19
+
20
+ Real instances; no doubles.
21
+
22
+ ## Files
23
+
24
+ - `spec/lutaml/uml/class_spec.rb` (expanded)
25
+
26
+ ## Verification
27
+
28
+ Full lutaml-uml suite green.
@@ -0,0 +1,32 @@
1
+ # 16 - Replace Remaining Doubles in Specs
2
+
3
+ ## Status: ✅ DONE (2026-07-14)
4
+
5
+ ## Problem
6
+
7
+ 18 `double()` calls remained in specs, concentrated in:
8
+ - `spec/lutaml/uml_repository/search_result_spec.rb`
9
+ - `spec/lutaml/uml_repository/exporters/markdown_exporter_spec.rb`
10
+ - `spec/lutaml/uml_repository/exporters/json_exporter_spec.rb`
11
+ - `spec/lutaml/uml_repository/presenters/class_presenter_spec.rb`
12
+ - `spec/lutaml/uml_repository/presenters/element_presenter_spec.rb`
13
+ - `spec/lutaml/uml_repository/presenters/presenter_factory_spec.rb`
14
+
15
+ CLAUDE.md forbids doubles — they couple tests to implementation
16
+ details and pass when real usage breaks.
17
+
18
+ ## Resolution
19
+
20
+ Replaced each `double(...)` with either:
21
+ - A real model instance built via test factory, or
22
+ - A `Struct.new(...)` for plain data when no real model fits.
23
+
24
+ Each replaced spec now exercises the real interface.
25
+
26
+ ## Files
27
+
28
+ The six spec files listed above.
29
+
30
+ ## Verification
31
+
32
+ Full lutaml-uml suite green; grep `double(` in `spec/` returns 0.
@@ -0,0 +1,29 @@
1
+ # 17 - Silent Skip Patterns in Query Specs
2
+
3
+ ## Status: ✅ DONE (2026-07-14)
4
+
5
+ ## Problem
6
+
7
+ `spec/lutaml/uml_repository/queries/class_query_spec.rb` had ~9
8
+ `next unless qname` / `next unless pkg_path` patterns that silently
9
+ passed when fixture preconditions failed. Same pattern in
10
+ `inheritance_query_spec.rb` (~4 sites).
11
+
12
+ These gave false confidence — the test "passed" even when the
13
+ fixture was missing the data it claimed to exercise.
14
+
15
+ ## Resolution
16
+
17
+ Replaced each silent skip with an explicit `expect(fixture_data).not_to be_empty`
18
+ precondition. If the fixture lacks the data, the test fails loudly
19
+ with a clear message; if the data is present, the assertion runs
20
+ normally.
21
+
22
+ ## Files
23
+
24
+ - `spec/lutaml/uml_repository/queries/class_query_spec.rb`
25
+ - `spec/lutaml/uml_repository/queries/inheritance_query_spec.rb`
26
+
27
+ ## Verification
28
+
29
+ Full lutaml-uml suite green.
@@ -0,0 +1,25 @@
1
+ # 18 - Unused Liquid Templates (Policy: Preserve)
2
+
3
+ ## Status: FLAGGED — preserved per CLAUDE.md "NEVER DELETE source files" rule
4
+
5
+ ## What
6
+
7
+ `templates/static_site/` contains 248K of `.liquid` template files.
8
+ The Vue IIFE in `frontend/dist/` replaced them at runtime, but they
9
+ remain as source.
10
+
11
+ ## Why not delete
12
+
13
+ CLAUDE.md absolute rule: "NEVER DELETE source files. ANY source
14
+ file — regardless of type." Templates are source. The Vue IIFE is
15
+ derived output.
16
+
17
+ ## Recommendation
18
+
19
+ Move to `templates/static_site.legacy/` (preserved, clearly marked
20
+ as superseded) or add to `.gitignore` if the user prefers. Do not
21
+ delete without explicit user confirmation.
22
+
23
+ ## Related
24
+
25
+ Supersedes TODO.next/07.
@@ -0,0 +1,35 @@
1
+ # 19 - Broken Executables (Policy: Preserve, Document)
2
+
3
+ ## Status: FLAGGED — preserved per CLAUDE.md "NEVER DELETE source files" rule
4
+
5
+ ## What
6
+
7
+ `exe/` contains four executables:
8
+ - `lutaml` — broken (was the EA-flavored CLI; removed during EA
9
+ extraction but the script remains)
10
+ - `lutaml-sysml` — broken (same)
11
+ - `lutaml-wsd2uml` — unrelated, works
12
+ - `lutaml-yaml2uml` — unrelated, works
13
+
14
+ The gemspec's `spec.executables = spec.files.grep(%r{^exe/})` ships
15
+ all four, including the broken ones.
16
+
17
+ ## Why not delete
18
+
19
+ CLAUDE.md absolute rule: "NEVER DELETE any file you did not create."
20
+ The broken scripts predate my work on this repo.
21
+
22
+ ## Recommendation
23
+
24
+ Two paths (need user decision):
25
+ 1. **Restore**: re-implement `lutaml` and `lutaml-sysml` as thin
26
+ wrappers that delegate to the `ea` gem's CLI.
27
+ 2. **Quarantine**: move to `exe/legacy/` and exclude from
28
+ `spec.executables` so they don't ship, but the files remain.
29
+
30
+ Option 2 is safer; option 1 is more useful if the user wants a
31
+ single CLI entry point again.
32
+
33
+ ## Related
34
+
35
+ Supersedes TODO.next/08.