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.
- checksums.yaml +4 -4
- data/.github/workflows/release.yml +32 -0
- data/.gitignore +5 -9
- data/.rspec +1 -1
- data/CLAUDE.md +60 -0
- data/Gemfile +15 -2
- data/README.adoc +22 -33
- data/Rakefile +0 -1
- data/TODO.next/01-remove-repository-enhanced.md +26 -0
- data/TODO.next/02-drop-fontname-autoload.md +32 -0
- data/TODO.next/03-add-missing-behavioral-specs.md +56 -0
- data/TODO.next/04-finish-double-elimination.md +34 -0
- data/TODO.next/05-remove-dead-umlrepository-autoloads.md +31 -0
- data/TODO.next/06-cleanup-phantom-requires.md +46 -0
- data/TODO.next/07-unused-liquid-templates.md +42 -0
- data/TODO.next/08-broken-executables.md +60 -0
- data/TODO.refactor/01-repository-facade-pruning.md +70 -0
- data/TODO.refactor/02-spa-pipeline-typed-schema.md +58 -0
- data/TODO.refactor/03-repository-validator-decomposition.md +49 -0
- data/TODO.refactor/04-document-structure-validator-decomposition.md +31 -0
- data/TODO.refactor/05-configuration-extract-nested-classes.md +42 -0
- data/TODO.refactor/06-json-exporter-via-mapping.md +52 -0
- data/TODO.refactor/07-statistics-calculator-decompose.md +32 -0
- data/TODO.refactor/08-package-exporter-slim-down.md +35 -0
- data/TODO.refactor/09-inheritance-query-decompose.md +35 -0
- data/TODO.refactor/10-query-builder-dsl-cleanup.md +29 -0
- data/TODO.refactor/11-shallow-base-classes-decide.md +38 -0
- data/TODO.refactor/12-typed-index-keys.md +30 -0
- data/TODO.refactor/13-presenter-to-hash-mixin.md +39 -0
- data/TODO.refactor/14-state-machine-specs.md +30 -0
- data/TODO.refactor/15-uml-class-behavioral-specs.md +28 -0
- data/TODO.refactor/16-replace-remaining-doubles.md +32 -0
- data/TODO.refactor/17-silent-skip-cleanup.md +29 -0
- data/TODO.refactor/18-unused-liquid-templates-preserve.md +25 -0
- data/TODO.refactor/19-broken-executables-preserve.md +35 -0
- data/config/package_metadata.example.yml +58 -0
- data/config/static_site.yml +166 -0
- data/docs/adr/0001-repository-facade-stays-large.md +43 -0
- data/docs/adr/0002-spa-shape-implicit-until-volatile.md +45 -0
- data/examples/UML_EA.DTD +6856 -0
- data/examples/lur/20251010_current_plateau_v5.1.lur +0 -0
- data/examples/lur/basic.lur +0 -0
- data/examples/lur/test-output.lur +0 -0
- data/examples/lur/test.lur +0 -0
- data/examples/lur_basic_usage.rb +220 -0
- data/examples/lur_cli_workflow.rb +262 -0
- data/examples/lur_statistics.rb +325 -0
- data/examples/qea/20251010_current_plateau_v5.1.qea +0 -0
- data/examples/qea/ArcGISWorkspace_template.qea +0 -0
- data/examples/qea/README_qea_parser.adoc +230 -0
- data/examples/qea/UmlModel_template.qea +0 -0
- data/examples/qea/basic.qea +0 -0
- data/examples/qea/simple.qea +0 -0
- data/examples/qea/simple_example.qea +0 -0
- data/examples/qea/test.qea +0 -0
- data/examples/xmi/20251010_current_plateau_v5.1.xmi +118121 -0
- data/examples/xmi/ArcGISWorkspace_template.xmi +1467 -0
- data/examples/xmi/Images/EAID_0016F797_D055_4717_AF1A_606413D0A166.svg +158 -0
- data/examples/xmi/Images/EAID_00C5C772_5A03_434f_BF30_AC37542A1AAC.svg +659 -0
- data/examples/xmi/Images/EAID_0114FD24_9E58_4664_98CD_71305B59AD11.svg +411 -0
- data/examples/xmi/Images/EAID_01661E1B_31B6_4167_BCCF_A00678FB4EA2.svg +102 -0
- data/examples/xmi/Images/EAID_039FE004_5408_4fc0_89AA_EB319E4F61C7.svg +169 -0
- data/examples/xmi/Images/EAID_04EE9625_17A0_4721_BC71_21756DB21D06.svg +403 -0
- data/examples/xmi/Images/EAID_05FF9417_1619_4170_B0C9_55AA6B988EF1.svg +175 -0
- data/examples/xmi/Images/EAID_09853FB2_AF8A_432f_94C5_6C47461BD937.svg +360 -0
- data/examples/xmi/Images/EAID_09927B7F_A657_4819_99E5_AC9DC99227D9.svg +195 -0
- data/examples/xmi/Images/EAID_09AF6B8A_557C_43bc_BBB0_47C1E9401EF3.svg +218 -0
- data/examples/xmi/Images/EAID_0BE81AC5_031B_4973_A9A0_223CCD92BAA1.svg +471 -0
- data/examples/xmi/Images/EAID_0EDEA6EF_4DC8_4979_BB80_28B1B9EBD1D4.svg +56 -0
- data/examples/xmi/Images/EAID_0F413534_6AD2_48bc_B4AF_8699D530D91D.svg +262 -0
- data/examples/xmi/Images/EAID_1321F39B_AD67_47b5_B5C3_3A42BBFCBDF9.svg +286 -0
- data/examples/xmi/Images/EAID_13E09C71_99E7_40b4_B72D_48AF6379BC2E.svg +164 -0
- data/examples/xmi/Images/EAID_144955D8_CB4E_4b59_BB0C_E549F7F84943.svg +66 -0
- data/examples/xmi/Images/EAID_14E9F5FD_F6CD_4f48_B1CD_F5A40C6D8E83.svg +95 -0
- data/examples/xmi/Images/EAID_157826AA_96A7_4278_89A6_94BD0F31409A.svg +63 -0
- data/examples/xmi/Images/EAID_159E9DA0_7A54_4817_B72A_401C750F675D.svg +306 -0
- data/examples/xmi/Images/EAID_17BC8309_8051_492b_BE87_61CCFE83DB16.svg +45 -0
- data/examples/xmi/Images/EAID_1A10EB6D_E2E5_42a6_A31E_B293D93FD07E.svg +193 -0
- data/examples/xmi/Images/EAID_1A290AFD_CE96_46a2_8351_A986D77CC727.svg +444 -0
- data/examples/xmi/Images/EAID_1B2D9309_C66B_492a_995C_95B2B02E0D7C.svg +168 -0
- data/examples/xmi/Images/EAID_1DE6B973_CE8A_416f_909B_54CEA1E5944E.svg +10 -0
- data/examples/xmi/Images/EAID_204F4ACC_2230_4c8d_9861_EF5A6844B712.svg +60 -0
- data/examples/xmi/Images/EAID_227300E2_4F4B_4955_83B9_FA626CE8680B.svg +188 -0
- data/examples/xmi/Images/EAID_22C24D4C_4894_480a_B113_0CB034CB59E9.svg +426 -0
- data/examples/xmi/Images/EAID_234BC4F5_8100_4969_BDCB_A24E0E641F23.svg +169 -0
- data/examples/xmi/Images/EAID_24446BFC_9FEB_4935_8970_65A4C562A93F.svg +277 -0
- data/examples/xmi/Images/EAID_24E8A45C_C99F_49b7_860A_9CF65FF76C76.svg +575 -0
- data/examples/xmi/Images/EAID_272F3181_4300_48b7_98A0_A8CFD12B1A72.svg +255 -0
- data/examples/xmi/Images/EAID_292E0D94_392C_4da6_A0B5_841501FAE50A.svg +183 -0
- data/examples/xmi/Images/EAID_29DD0967_ADAB_4abb_99C5_544821F5E7DA.svg +10 -0
- data/examples/xmi/Images/EAID_2A339928_E5EF_4ed2_9E5D_CC2CA5CF248B.svg +310 -0
- data/examples/xmi/Images/EAID_2A5E0832_06BE_4381_85D4_9B00E4F95575.svg +155 -0
- data/examples/xmi/Images/EAID_2AAB709F_EFCE_496f_8AFE_92809D66A0A9.svg +81 -0
- data/examples/xmi/Images/EAID_2C8DD882_8DEA_4065_89F8_DDA796AA0C85.svg +520 -0
- data/examples/xmi/Images/EAID_2E98EA19_37D8_4b70_BDCE_CFEE4FA800B0.svg +173 -0
- data/examples/xmi/Images/EAID_30D62231_110F_44e8_9C06_6FCDCBA53A09.svg +722 -0
- data/examples/xmi/Images/EAID_3206D3FD_1FC4_41c7_8D00_36DB908E9319.svg +181 -0
- data/examples/xmi/Images/EAID_3452CC53_9ACB_44eb_9C9D_B90CF862F284.svg +92 -0
- data/examples/xmi/Images/EAID_348EE46E_ABD9_40b0_82A1_0285E75BDC52.svg +187 -0
- data/examples/xmi/Images/EAID_34FF671B_CFDC_47ad_91DF_ECA6D8358180.svg +217 -0
- data/examples/xmi/Images/EAID_359DD694_0100_4bdf_AD5F_712D97E9C69B.svg +157 -0
- data/examples/xmi/Images/EAID_35DE714C_49A8_490e_913A_56F39EF317F9.svg +180 -0
- data/examples/xmi/Images/EAID_360C79F1_8EDF_41db_A069_DECDC55625BC.svg +31 -0
- data/examples/xmi/Images/EAID_36913C58_FF35_4ba2_A04B_9A4824E24609.svg +166 -0
- data/examples/xmi/Images/EAID_372F7F7B_57ED_469a_A640_70DB578B3C56.svg +361 -0
- data/examples/xmi/Images/EAID_37AC19B9_8433_4fee_A326_763170D54D06.svg +32 -0
- data/examples/xmi/Images/EAID_38170608_32B5_4a6f_A68D_A0D7C0C9D019.svg +234 -0
- data/examples/xmi/Images/EAID_3A77A5D0_4E1B_4116_8AAD_407FC422B47F.svg +183 -0
- data/examples/xmi/Images/EAID_3B8BD087_1683_46b1_8D0D_6F839C46C578.svg +42 -0
- data/examples/xmi/Images/EAID_3DC20801_AE8B_4e76_B08C_F574E8A90E13.svg +192 -0
- data/examples/xmi/Images/EAID_3DE28C70_C6D4_406c_B49F_EEF52148C8C1.svg +124 -0
- data/examples/xmi/Images/EAID_458E093C_BA2B_4292_BEC4_37511C163DDC.svg +140 -0
- data/examples/xmi/Images/EAID_45F9B1F7_E568_47c9_B229_953BC2E707E4.svg +266 -0
- data/examples/xmi/Images/EAID_46B3041A_8C23_46e6_8E14_ADE7012274C5.svg +80 -0
- data/examples/xmi/Images/EAID_47E4600F_CEC9_4245_9BF5_EE38007A9DDB.svg +584 -0
- data/examples/xmi/Images/EAID_4881CEEE_792C_4cb0_BEA7_54333B643D0A.svg +155 -0
- data/examples/xmi/Images/EAID_48D364F0_DCA4_41e8_B4D4_509B3023B969.svg +17 -0
- data/examples/xmi/Images/EAID_4DBDAB9E_4C1C_4cb1_A767_06BD743A50A7.svg +78 -0
- data/examples/xmi/Images/EAID_4EB75007_B31D_4f2c_8855_7E9D3A3B17F4.svg +454 -0
- data/examples/xmi/Images/EAID_4F421236_FCF3_4aae_B22A_C7E6A5EFBAC7.svg +81 -0
- data/examples/xmi/Images/EAID_4FC1D352_2102_4b73_BCB0_1410B29C6BD7.svg +379 -0
- data/examples/xmi/Images/EAID_4FE346EA_01E1_4b30_8BE6_BB32EA191E47.svg +126 -0
- data/examples/xmi/Images/EAID_5038EEE3_7DD0_4cca_9829_364E044D37E8.svg +199 -0
- data/examples/xmi/Images/EAID_508A37DC_9378_4f5a_BD96_48F4D24E03A5.svg +162 -0
- data/examples/xmi/Images/EAID_516DA1A2_F0EC_415c_9664_E4CA54E7F05C.svg +136 -0
- data/examples/xmi/Images/EAID_52A1DBD3_D3DA_4b6d_8F96_FC6F39F64242.svg +161 -0
- data/examples/xmi/Images/EAID_575E87BA_32E9_4a84_AA4E_0EFDFC5D4C07.svg +71 -0
- data/examples/xmi/Images/EAID_57E0F1A0_6C72_47ef_B922_B806F9A875E8.svg +209 -0
- data/examples/xmi/Images/EAID_5957C373_3FC1_482f_8F35_D809153A17F5.svg +123 -0
- data/examples/xmi/Images/EAID_59A66AE2_412C_48a6_BFC7_EA56CF11D269.svg +218 -0
- data/examples/xmi/Images/EAID_5A43833E_680B_4a90_8931_0C902304E029.svg +236 -0
- data/examples/xmi/Images/EAID_5D6DB5A0_5047_4bac_9E60_69904A60B56D.svg +353 -0
- data/examples/xmi/Images/EAID_5DA1E7A7_8E59_4803_A831_E9F3EC27328F.svg +242 -0
- data/examples/xmi/Images/EAID_5E2C1E2A_82A8_47f4_B2ED_1398D72BFCFD.svg +246 -0
- data/examples/xmi/Images/EAID_6052620C_4BD5_49f6_A21C_AD7E6DCA2795.svg +290 -0
- data/examples/xmi/Images/EAID_6481E2CC_35A6_43b0_88D4_10A667A2BC2D.svg +60 -0
- data/examples/xmi/Images/EAID_660C7D03_A26C_4977_A7BA_9D0A773DA811.svg +318 -0
- data/examples/xmi/Images/EAID_671F3C3D_35B6_4514_B5B6_DD7E84925493.svg +24 -0
- data/examples/xmi/Images/EAID_676B9C9A_D85F_4d2f_A46B_73F02090DC87.svg +127 -0
- data/examples/xmi/Images/EAID_6797FEFA_5801_48e4_8B9C_3C824C0E165D.svg +412 -0
- data/examples/xmi/Images/EAID_6807F4EE_18EF_4e7e_ACCF_D5BD323AFDE9.svg +130 -0
- data/examples/xmi/Images/EAID_69E81E34_CF28_4c7f_A48F_5941BA85CEE3.svg +96 -0
- data/examples/xmi/Images/EAID_6A3C55E8_3C3C_4f3a_8AAC_0299C5B23070.svg +10 -0
- data/examples/xmi/Images/EAID_6BAC333E_E2C2_42c7_8DDF_6B4FA0FFC03B.svg +143 -0
- data/examples/xmi/Images/EAID_6D0349D5_3F1B_4b28_82D2_910743DEB5E5.svg +114 -0
- data/examples/xmi/Images/EAID_6E95B74E_8A09_4698_9E9E_23BCFD2CE194.svg +37 -0
- data/examples/xmi/Images/EAID_70C77F92_5614_4b22_8C8E_67859F59D8FD.svg +254 -0
- data/examples/xmi/Images/EAID_71F9216B_E7A7_4083_B08E_6C71B57F3A1F.svg +187 -0
- data/examples/xmi/Images/EAID_73025C5A_08FC_47ff_AB2F_C7F79CF54B41.svg +145 -0
- data/examples/xmi/Images/EAID_74C974B6_6D07_425d_B7AC_C8899E3B4967.svg +76 -0
- data/examples/xmi/Images/EAID_7504FCD2_524C_4e7d_BAE4_4E58A8A8A12C.svg +196 -0
- data/examples/xmi/Images/EAID_78030266_3603_4747_9D75_03D16614BE7D.svg +35 -0
- data/examples/xmi/Images/EAID_785226C1_12B1_4104_A4C1_F19B70B9FB71.svg +348 -0
- data/examples/xmi/Images/EAID_7854470F_26B8_4d3c_AFDF_C05BCE6ED0CD.svg +72 -0
- data/examples/xmi/Images/EAID_794F4A8F_18CA_4e9f_8477_A6F0E5ED22D4.svg +187 -0
- data/examples/xmi/Images/EAID_7A24839E_C8AE_424d_B7D2_6DA16DC813E7.svg +114 -0
- data/examples/xmi/Images/EAID_7A3649FD_E960_4ae6_B9B1_A9001C066AE7.svg +181 -0
- data/examples/xmi/Images/EAID_7B2C6765_AB68_439a_87F3_DAC323CB2AF5.svg +196 -0
- data/examples/xmi/Images/EAID_7C44AC09_27C1_47b3_9A85_88EC71C081FF.svg +55 -0
- data/examples/xmi/Images/EAID_7CE102CA_97C1_4cac_BD3B_0500D3712D2A.svg +195 -0
- data/examples/xmi/Images/EAID_7D960BD8_65D8_4934_9C11_4EF860DD8FBA.svg +90 -0
- data/examples/xmi/Images/EAID_80939C98_A456_48c3_BCEA_4B72851F2DF6.svg +174 -0
- data/examples/xmi/Images/EAID_812FE862_76ED_44f0_B678_7A4601B395CF.svg +142 -0
- data/examples/xmi/Images/EAID_81B76F5B_9D64_4bbf_8AC8_34234FB87533.svg +740 -0
- data/examples/xmi/Images/EAID_84352F1A_195B_411b_9552_5BFC40BF90B5.svg +105 -0
- data/examples/xmi/Images/EAID_846DD800_139C_4d47_A1DF_3FB1AC5D130F.svg +554 -0
- data/examples/xmi/Images/EAID_84A9C65B_FD6D_4bb5_818F_E8C35FF5BCD1.svg +228 -0
- data/examples/xmi/Images/EAID_853674F5_7DC9_4aae_809B_5728098B5D5B.svg +154 -0
- data/examples/xmi/Images/EAID_860CBBFB_2F27_408f_9144_751F9D1F487F.svg +273 -0
- data/examples/xmi/Images/EAID_87476527_7B9B_4b92_967E_3D38365470CA.svg +239 -0
- data/examples/xmi/Images/EAID_87DAE930_5069_4c58_AC65_4B0B2C0F32C8.svg +10 -0
- data/examples/xmi/Images/EAID_88AF6BD7_BC34_406f_BB59_47CFAB4A7D5D.svg +116 -0
- data/examples/xmi/Images/EAID_88D0CB44_20D0_44fc_A6E3_B663332EF401.svg +200 -0
- data/examples/xmi/Images/EAID_8BB1CA0C_C003_4678_973B_A1C3308E021D.svg +136 -0
- data/examples/xmi/Images/EAID_8DAB169F_D189_4320_A0F5_4443E3297F0E.svg +181 -0
- data/examples/xmi/Images/EAID_8FD488EF_BAAB_40ec_A7ED_F7CC831D546E.svg +324 -0
- data/examples/xmi/Images/EAID_90BCA409_BB45_42c5_AFA5_45FE3D995904.svg +342 -0
- data/examples/xmi/Images/EAID_926AFE38_01FA_469e_B6AA_ED5F4D62B66F.svg +105 -0
- data/examples/xmi/Images/EAID_92AB0FD0_B0FB_4ceb_8EAE_66B6600D31D7.svg +681 -0
- data/examples/xmi/Images/EAID_92C43670_3057_47f1_A576_C60843FF3D26.svg +136 -0
- data/examples/xmi/Images/EAID_93F63576_BE01_4cd8_8A91_C674FF77FC3D.svg +718 -0
- data/examples/xmi/Images/EAID_9400D9BC_05A5_41fc_83F7_02E5C67F9718.svg +487 -0
- data/examples/xmi/Images/EAID_95246DCF_1C09_4a16_9512_98000F56B3D8.svg +292 -0
- data/examples/xmi/Images/EAID_9994BF62_51E2_42cd_BB35_16C537B6718A.svg +715 -0
- data/examples/xmi/Images/EAID_9AAD6C21_B1E7_4472_B64A_FB5E3569D970.svg +116 -0
- data/examples/xmi/Images/EAID_9BD7189A_877B_4ca9_B42C_817DEF144FB2.svg +284 -0
- data/examples/xmi/Images/EAID_9DA6C553_94FC_4204_83AD_ECC4B45A53EF.svg +159 -0
- data/examples/xmi/Images/EAID_9EE6A41B_5FAA_4c89_B98F_732059778630.svg +10 -0
- data/examples/xmi/Images/EAID_9F1A4B54_46F6_435c_9529_E43E54CF6050.svg +172 -0
- data/examples/xmi/Images/EAID_9FE1EA7B_4CEF_4976_A281_93A94315BD84.svg +153 -0
- data/examples/xmi/Images/EAID_A0695647_6172_4262_8C30_67441399609C.svg +290 -0
- data/examples/xmi/Images/EAID_A081C63E_D6F2_41a7_A99C_307836754AFA.svg +149 -0
- data/examples/xmi/Images/EAID_A24E2778_5AD9_44f2_AB8F_5CD3913477D6.svg +194 -0
- data/examples/xmi/Images/EAID_A264F089_F9B3_406c_A3A8_FF34903797D3.svg +143 -0
- data/examples/xmi/Images/EAID_A282E5D1_2A13_4e7f_BC76_5D086DD4A577.svg +357 -0
- data/examples/xmi/Images/EAID_A3BCE1D6_9DB5_4272_A020_4C0E194B99CC.svg +171 -0
- data/examples/xmi/Images/EAID_A56E3818_D1B8_4b63_B69E_FBAC4A8AF482.svg +218 -0
- data/examples/xmi/Images/EAID_A57215D5_75C5_4532_BCF4_264A77CD62F1.svg +204 -0
- data/examples/xmi/Images/EAID_A59065AF_9669_486c_9582_9693177CFC7F.svg +263 -0
- data/examples/xmi/Images/EAID_A759374D_589A_488c_99EF_537ACB9B1FF9.svg +398 -0
- data/examples/xmi/Images/EAID_A7B25F46_F18A_4373_B16D_8C6AC0B868B0.svg +174 -0
- data/examples/xmi/Images/EAID_A9FE9E6F_A5F4_47e5_A6BA_26E22C7346B6.svg +310 -0
- data/examples/xmi/Images/EAID_AA62CDEB_55EC_498d_B326_4AA2C9AF6A05.svg +144 -0
- data/examples/xmi/Images/EAID_AAF52AF6_F7F9_4005_AE46_8920847BEA03.svg +144 -0
- data/examples/xmi/Images/EAID_AB281AC1_7CB8_404a_8124_34343DDD84E2.svg +198 -0
- data/examples/xmi/Images/EAID_AB7F1FDF_A66B_42a1_B8A3_7F594BAAD508.svg +143 -0
- data/examples/xmi/Images/EAID_AC2191E3_76E3_40b2_9E21_0E0B9B5277D2.svg +114 -0
- data/examples/xmi/Images/EAID_AD451676_A7C8_4c6a_A925_A9B9CA344142.svg +339 -0
- data/examples/xmi/Images/EAID_ADBA40A1_9375_4c1b_9938_0990612EB615.svg +429 -0
- data/examples/xmi/Images/EAID_ADC8773C_1B27_48ac_BAC1_14C1C919FAF6.svg +245 -0
- data/examples/xmi/Images/EAID_AE0718DF_AF69_4ea1_A099_E20028FE40A1.svg +173 -0
- data/examples/xmi/Images/EAID_B0DDB85D_A00C_4a7f_8C06_CCA15E5E4FE5.svg +31 -0
- data/examples/xmi/Images/EAID_B27ED282_D5E5_4f33_8AC1_62802F9E0B35.svg +256 -0
- data/examples/xmi/Images/EAID_B3AFECCB_17DD_44d6_8A44_2C38D9A64C0B.svg +95 -0
- data/examples/xmi/Images/EAID_B3B6C5B1_278E_4714_8244_B6C28B66AB50.svg +176 -0
- data/examples/xmi/Images/EAID_B53E76CD_A0F2_4e2f_B3AB_796D85964EF2.svg +179 -0
- data/examples/xmi/Images/EAID_B55D6E67_0BDD_4163_B359_11A6FBA89C74.svg +207 -0
- data/examples/xmi/Images/EAID_B58D1A53_E860_41a3_8352_11C274093E83.svg +189 -0
- data/examples/xmi/Images/EAID_B62C02B3_69DB_49e9_8089_4EE398BDE666.svg +165 -0
- data/examples/xmi/Images/EAID_BC008774_B539_4150_8174_B675989053D0.svg +22 -0
- data/examples/xmi/Images/EAID_BC1F7E00_082D_4a26_922B_3967A8D66859.svg +266 -0
- data/examples/xmi/Images/EAID_BDA613D8_402A_475a_AA15_683D88FD3D23.svg +183 -0
- data/examples/xmi/Images/EAID_C028B286_4C85_47d8_B6D5_80B28F556E82.svg +303 -0
- data/examples/xmi/Images/EAID_C173A6F4_1D1B_400e_AD8C_64FFF7CD5BE5.svg +178 -0
- data/examples/xmi/Images/EAID_C1834072_CADC_4ce4_B0FC_8284AE5CF4A4.svg +158 -0
- data/examples/xmi/Images/EAID_C1EC985B_5CBD_4e91_8661_EB4EF23781D9.svg +286 -0
- data/examples/xmi/Images/EAID_C31C1314_B679_4413_B8FE_A2CD584FC128.svg +305 -0
- data/examples/xmi/Images/EAID_C37CFBD6_69BA_42fb_9AC7_2D329D931BCF.svg +171 -0
- data/examples/xmi/Images/EAID_C857C934_306F_463a_87D5_257CB225ECFE.svg +174 -0
- data/examples/xmi/Images/EAID_C96797DE_2238_42d3_896A_9F92500270ED.svg +180 -0
- data/examples/xmi/Images/EAID_C96CBC24_B20E_459a_8F9D_75B61CDCB89F.svg +656 -0
- data/examples/xmi/Images/EAID_CACB523D_56A5_4f05_B3C2_51BB18F380FD.svg +158 -0
- data/examples/xmi/Images/EAID_CB34B578_101B_48b4_9271_214FFEA6A83A.svg +409 -0
- data/examples/xmi/Images/EAID_CBBD6CF4_0A1E_4406_9930_89DE43527910.svg +361 -0
- data/examples/xmi/Images/EAID_CC06A828_3750_472f_8DB2_C2E0863FCE17.svg +96 -0
- data/examples/xmi/Images/EAID_CD5CF053_1772_4a0f_962D_B17054D8EEAA.svg +173 -0
- data/examples/xmi/Images/EAID_CE440B5A_9534_4c75_9BA5_50862BB396C2.svg +97 -0
- data/examples/xmi/Images/EAID_CE4734FC_7986_4b3a_807F_A5B2C7EDE9E4.svg +193 -0
- data/examples/xmi/Images/EAID_D14AA320_9D41_4366_8739_9C2C21F96AE1.svg +32 -0
- data/examples/xmi/Images/EAID_D2FA55D3_C733_4a4d_92D0_0BC7AC0BB5BC.svg +108 -0
- data/examples/xmi/Images/EAID_D351FC34_FB03_488d_ADA4_BDB93DA9CB02.svg +49 -0
- data/examples/xmi/Images/EAID_D368FDF3_BDC5_4718_A701_351C8587A376.svg +592 -0
- data/examples/xmi/Images/EAID_D4DA8C48_3998_450d_87C4_9D65C9FECDB4.svg +42 -0
- data/examples/xmi/Images/EAID_D5464ECF_290E_4b2b_A6C4_25BE80F886CB.svg +76 -0
- data/examples/xmi/Images/EAID_D55235B0_61E9_461a_8379_2B8BF2403BE2.svg +147 -0
- data/examples/xmi/Images/EAID_D555ED73_F010_45d7_8A53_45A33C64C249.svg +318 -0
- data/examples/xmi/Images/EAID_D7AAC526_267E_45a0_A853_3207F02363F8.svg +45 -0
- data/examples/xmi/Images/EAID_D998B20D_A875_4ef8_A9CE_996BE56602BD.svg +158 -0
- data/examples/xmi/Images/EAID_DBFA8B39_F5B7_4c0e_9552_19AEAE5BA64E.svg +200 -0
- data/examples/xmi/Images/EAID_DE47A47D_E7BE_4e6f_BA81_F789EE8CFE72.svg +61 -0
- data/examples/xmi/Images/EAID_DFBB1072_8EC5_4384_8241_7EDF4B6B888B.svg +78 -0
- data/examples/xmi/Images/EAID_E325B9D8_E955_4aed_8125_63167BD40320.svg +67 -0
- data/examples/xmi/Images/EAID_E32D9D02_CAE9_4a47_92A8_3290EDCD6E6D.svg +79 -0
- data/examples/xmi/Images/EAID_E3B28611_7857_458a_B0BC_736E777B88EC.svg +194 -0
- data/examples/xmi/Images/EAID_E43C37EC_1176_4d2e_8B98_B6F3DFF6A092.svg +96 -0
- data/examples/xmi/Images/EAID_E591C1CF_7F35_4160_8A72_DFA097AD5811.svg +271 -0
- data/examples/xmi/Images/EAID_E77C66A2_2E94_4196_BFC6_662FE5AEEB6F.svg +332 -0
- data/examples/xmi/Images/EAID_E7AABA98_2450_4986_9736_DCCAF0108C50.svg +639 -0
- data/examples/xmi/Images/EAID_E7D9A2C4_72D6_40b9_8EB8_6B35476246B3.svg +134 -0
- data/examples/xmi/Images/EAID_E9CDAD85_ECF1_43de_819F_30A0D01785E6.svg +193 -0
- data/examples/xmi/Images/EAID_EC8AF507_F441_4e8a_B8A7_C1690F3C7D0B.svg +58 -0
- data/examples/xmi/Images/EAID_ED501058_D540_47ac_8EBC_5921E8C0BF57.svg +384 -0
- data/examples/xmi/Images/EAID_EFBF5F0F_DF74_4944_8791_114F5637C335.svg +590 -0
- data/examples/xmi/Images/EAID_EFFFA027_2A1F_425c_8437_BF89AADC8893.svg +365 -0
- data/examples/xmi/Images/EAID_F07E7718_B2C2_4a65_B5DD_477CB73E971E.svg +165 -0
- data/examples/xmi/Images/EAID_F0F20BDF_C729_47f7_B6FC_25ED2C4609CA.svg +61 -0
- data/examples/xmi/Images/EAID_F32E5AFE_8605_4c77_AE69_D0D0A6E380AC.svg +76 -0
- data/examples/xmi/Images/EAID_F3F00F45_CD37_46fd_B521_D1040EB2FB16.svg +123 -0
- data/examples/xmi/Images/EAID_F46E8F19_D8F1_4a3d_B87B_B0BAB4F50F50.svg +202 -0
- data/examples/xmi/Images/EAID_F48E5F6E_2411_4635_9315_3EAA4CFA29F7.svg +351 -0
- data/examples/xmi/Images/EAID_F4C23F9E_DD74_4fed_B75D_AD3C6448BA24.svg +189 -0
- data/examples/xmi/Images/EAID_F853B3C4_B145_4ef0_B261_C3CC0475B6D2.svg +215 -0
- data/examples/xmi/Images/EAID_F8BE68CA_1F8F_47e5_9454_01A2EB7D388A.svg +124 -0
- data/examples/xmi/Images/EAID_F92A6A28_612E_468e_9E39_D7AE7D24E24D.svg +208 -0
- data/examples/xmi/Images/EAID_F995FA49_B86E_4c94_BE5E_C928FB6B87D0.svg +302 -0
- data/examples/xmi/Images/EAID_FEAE013A_A4E4_4283_A491_1FEB8D0EBA28.svg +524 -0
- data/examples/xmi/Images/EAID_FEBE5726_3751_470b_9023_8C569202E97E.svg +730 -0
- data/examples/xmi/UML_EA.DTD +6856 -0
- data/examples/xmi/UmlModel_template.xmi +23 -0
- data/examples/xmi/basic.xmi +9086 -0
- data/examples/xmi/simple.xmi +655 -0
- data/examples/xmi/simple_example.xmi +23 -0
- data/examples/xmi/test.xmi +1703 -0
- data/exe/lutaml +11 -0
- data/exe/lutaml-sysml +22 -0
- data/exe/lutaml-wsd2uml +10 -6
- data/exe/lutaml-yaml2uml +8 -6
- data/frontend/dist/app.iife.js +24 -0
- data/frontend/dist/style.css +1 -0
- data/frontend/index.html +26 -0
- data/frontend/package-lock.json +2359 -0
- data/frontend/package.json +26 -0
- data/frontend/src/App.vue +59 -0
- data/frontend/src/app.ts +8 -0
- data/frontend/src/components/AppHeader.vue +127 -0
- data/frontend/src/components/AppSidebar.vue +119 -0
- data/frontend/src/components/ClassDetails.vue +247 -0
- data/frontend/src/components/DiagramView.vue +79 -0
- data/frontend/src/components/PackageDetails.vue +92 -0
- data/frontend/src/components/PackageTreeNode.vue +64 -0
- data/frontend/src/components/SearchResults.vue +48 -0
- data/frontend/src/components/WelcomeView.vue +87 -0
- data/frontend/src/shims-vue.d.ts +5 -0
- data/frontend/src/stores/dataStore.ts +79 -0
- data/frontend/src/stores/uiStore.ts +167 -0
- data/frontend/src/styles/main.css +1566 -0
- data/frontend/src/types.ts +221 -0
- data/frontend/tests/e2e/__screenshots__/new-dark-mode.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-package-details.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-search-modal.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-sidebar-collapsed.png +0 -0
- data/frontend/tests/e2e/__screenshots__/new-welcome.png +0 -0
- data/frontend/tests/e2e/render.spec.ts +188 -0
- data/frontend/tsconfig.json +20 -0
- data/frontend/vite.config.ts +26 -0
- data/frontend/vitest.config.ts +8 -0
- data/lib/lutaml/uml/abstraction.rb +1 -0
- data/lib/lutaml/uml/action.rb +17 -0
- data/lib/lutaml/uml/activity.rb +1 -0
- data/lib/lutaml/uml/actor.rb +2 -9
- data/lib/lutaml/uml/association.rb +26 -32
- data/lib/lutaml/uml/association_generalization.rb +20 -0
- data/lib/lutaml/uml/behavior.rb +2 -1
- data/lib/lutaml/uml/cardinality.rb +12 -0
- data/lib/lutaml/uml/class.rb +47 -73
- data/lib/lutaml/uml/classifier.rb +12 -4
- data/lib/lutaml/uml/comment.rb +15 -0
- data/lib/lutaml/uml/connector.rb +7 -8
- data/lib/lutaml/uml/connector_end.rb +22 -0
- data/lib/lutaml/uml/constraint.rb +13 -1
- data/lib/lutaml/uml/data_type.rb +36 -54
- data/lib/lutaml/uml/dependency.rb +7 -8
- data/lib/lutaml/uml/diagram.rb +17 -0
- data/lib/lutaml/uml/diagram_link.rb +28 -0
- data/lib/lutaml/uml/diagram_object.rb +32 -0
- data/lib/lutaml/uml/document.rb +45 -62
- data/lib/lutaml/uml/enum.rb +12 -36
- data/lib/lutaml/uml/event.rb +1 -1
- data/lib/lutaml/uml/fidelity.rb +12 -0
- data/lib/lutaml/uml/final_state.rb +1 -0
- data/lib/lutaml/uml/fontname.rb +19 -0
- data/lib/lutaml/uml/general_attribute.rb +24 -0
- data/lib/lutaml/uml/generalization.rb +37 -0
- data/lib/lutaml/uml/group.rb +21 -0
- data/lib/lutaml/uml/has_attributes.rb +2 -2
- data/lib/lutaml/uml/has_members.rb +7 -7
- data/lib/lutaml/uml/inheritance_walker.rb +96 -0
- data/lib/lutaml/uml/instance.rb +7 -7
- data/lib/lutaml/uml/model.rb +5 -3
- data/lib/lutaml/uml/model_helpers.rb +104 -0
- data/lib/lutaml/uml/namespace.rb +12 -0
- data/lib/lutaml/uml/opaque_behavior.rb +1 -0
- data/lib/lutaml/uml/operation.rb +13 -21
- data/lib/lutaml/uml/operation_parameter.rb +19 -0
- data/lib/lutaml/uml/package.rb +24 -44
- data/lib/lutaml/uml/package_path.rb +235 -0
- data/lib/lutaml/uml/package_walker.rb +85 -0
- data/lib/lutaml/uml/port.rb +1 -0
- data/lib/lutaml/uml/primitive_type.rb +5 -4
- data/lib/lutaml/uml/property.rb +17 -17
- data/lib/lutaml/uml/pseudostate.rb +1 -0
- data/lib/lutaml/uml/qualified_name.rb +175 -0
- data/lib/lutaml/uml/realization.rb +1 -0
- data/lib/lutaml/uml/region.rb +1 -1
- data/lib/lutaml/uml/state.rb +11 -1
- data/lib/lutaml/uml/state_machine.rb +1 -1
- data/lib/lutaml/uml/tagged_value.rb +23 -0
- data/lib/lutaml/uml/top_element.rb +66 -39
- data/lib/lutaml/uml/top_element_attribute.rb +52 -26
- data/lib/lutaml/uml/transition.rb +13 -1
- data/lib/lutaml/uml/trigger.rb +7 -1
- data/lib/lutaml/uml/validation/base_validator.rb +67 -0
- data/lib/lutaml/uml/validation/document_structure_validator.rb +387 -0
- data/lib/lutaml/uml/value.rb +25 -18
- data/lib/lutaml/uml/version.rb +1 -1
- data/lib/lutaml/uml/vertex.rb +1 -0
- data/lib/lutaml/uml.rb +84 -5
- data/lib/lutaml/uml_repository/class_lookup_index.rb +39 -0
- data/lib/lutaml/uml_repository/error_handler.rb +203 -0
- data/lib/lutaml/uml_repository/exporters/base_exporter.rb +74 -0
- data/lib/lutaml/uml_repository/exporters/json_exporter.rb +319 -0
- data/lib/lutaml/uml_repository/exporters/markdown/class_page_builder.rb +187 -0
- data/lib/lutaml/uml_repository/exporters/markdown/formatting.rb +34 -0
- data/lib/lutaml/uml_repository/exporters/markdown/index_page_builder.rb +81 -0
- data/lib/lutaml/uml_repository/exporters/markdown/link_resolver.rb +37 -0
- data/lib/lutaml/uml_repository/exporters/markdown/package_page_builder.rb +107 -0
- data/lib/lutaml/uml_repository/exporters/markdown.rb +20 -0
- data/lib/lutaml/uml_repository/exporters/markdown_exporter.rb +86 -0
- data/lib/lutaml/uml_repository/index_builder.rb +210 -0
- data/lib/lutaml/uml_repository/index_builders/association_index.rb +155 -0
- data/lib/lutaml/uml_repository/index_builders/class_index.rb +113 -0
- data/lib/lutaml/uml_repository/index_builders/package_index.rb +62 -0
- data/lib/lutaml/uml_repository/index_builders.rb +13 -0
- data/lib/lutaml/uml_repository/index_keys.rb +34 -0
- data/lib/lutaml/uml_repository/lazy_repository.rb +239 -0
- data/lib/lutaml/uml_repository/package_exporter.rb +327 -0
- data/lib/lutaml/uml_repository/package_loader.rb +247 -0
- data/lib/lutaml/uml_repository/package_metadata.rb +77 -0
- data/lib/lutaml/uml_repository/presenters/association_presenter.rb +79 -0
- data/lib/lutaml/uml_repository/presenters/attribute_presenter.rb +94 -0
- data/lib/lutaml/uml_repository/presenters/class_presenter.rb +81 -0
- data/lib/lutaml/uml_repository/presenters/datatype_presenter.rb +97 -0
- data/lib/lutaml/uml_repository/presenters/element_presenter.rb +84 -0
- data/lib/lutaml/uml_repository/presenters/enum_presenter.rb +78 -0
- data/lib/lutaml/uml_repository/presenters/package_presenter.rb +48 -0
- data/lib/lutaml/uml_repository/presenters/presenter_factory.rb +81 -0
- data/lib/lutaml/uml_repository/queries/association_query.rb +184 -0
- data/lib/lutaml/uml_repository/queries/base_query.rb +45 -0
- data/lib/lutaml/uml_repository/queries/class_query.rb +178 -0
- data/lib/lutaml/uml_repository/queries/diagram_query.rb +108 -0
- data/lib/lutaml/uml_repository/queries/inheritance_query.rb +327 -0
- data/lib/lutaml/uml_repository/queries/package_query.rb +230 -0
- data/lib/lutaml/uml_repository/queries/search_query.rb +237 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/base_condition.rb +28 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/block_condition.rb +44 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/hash_condition.rb +82 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/package_condition.rb +89 -0
- data/lib/lutaml/uml_repository/query_dsl/order.rb +90 -0
- data/lib/lutaml/uml_repository/query_dsl/query_builder.rb +290 -0
- data/lib/lutaml/uml_repository/repository/deprecated.rb +39 -0
- data/lib/lutaml/uml_repository/repository.rb +689 -0
- data/lib/lutaml/uml_repository/repository_enhanced.rb.disabled +431 -0
- data/lib/lutaml/uml_repository/search_result.rb +86 -0
- data/lib/lutaml/uml_repository/static_site/configuration.rb +405 -0
- data/lib/lutaml/uml_repository/static_site/data_transformer.rb +135 -0
- data/lib/lutaml/uml_repository/static_site/generator.rb +120 -0
- data/lib/lutaml/uml_repository/static_site/id_generator.rb +120 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_association.rb +29 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_association_end.rb +25 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_attribute.rb +58 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_base.rb +12 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_cardinality.rb +28 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_class.rb +60 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_diagram.rb +31 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_document.rb +31 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_inherited_association.rb +25 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_inherited_attribute.rb +25 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_literal.rb +19 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_metadata.rb +39 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_operation.rb +34 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_package.rb +37 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_package_tree_node.rb +32 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_parameter.rb +21 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_search_entry.rb +34 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_search_index.rb +29 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_statistics.rb +25 -0
- data/lib/lutaml/uml_repository/static_site/models/spa_tree_class_ref.rb +22 -0
- data/lib/lutaml/uml_repository/static_site/models.rb +48 -0
- data/lib/lutaml/uml_repository/static_site/output/multi_file_strategy.rb +69 -0
- data/lib/lutaml/uml_repository/static_site/output/strategy.rb +50 -0
- data/lib/lutaml/uml_repository/static_site/output/vue_inlined_strategy.rb +113 -0
- data/lib/lutaml/uml_repository/static_site/output.rb +15 -0
- data/lib/lutaml/uml_repository/static_site/search_index_builder.rb +216 -0
- data/lib/lutaml/uml_repository/static_site/serializers/association_serializer.rb +70 -0
- data/lib/lutaml/uml_repository/static_site/serializers/attribute_serializer.rb +24 -0
- data/lib/lutaml/uml_repository/static_site/serializers/base.rb +66 -0
- data/lib/lutaml/uml_repository/static_site/serializers/class_serializer.rb +97 -0
- data/lib/lutaml/uml_repository/static_site/serializers/diagram_serializer.rb +59 -0
- data/lib/lutaml/uml_repository/static_site/serializers/inheritance_resolver.rb +151 -0
- data/lib/lutaml/uml_repository/static_site/serializers/metadata_builder.rb +102 -0
- data/lib/lutaml/uml_repository/static_site/serializers/operation_serializer.rb +52 -0
- data/lib/lutaml/uml_repository/static_site/serializers/package_serializer.rb +55 -0
- data/lib/lutaml/uml_repository/static_site/serializers/package_tree_builder.rb +77 -0
- data/lib/lutaml/uml_repository/static_site/serializers.rb +30 -0
- data/lib/lutaml/uml_repository/static_site.rb +92 -0
- data/lib/lutaml/uml_repository/statistics_calculator.rb +342 -0
- data/lib/lutaml/uml_repository/validators/repository_validator.rb +402 -0
- data/lib/lutaml/uml_repository.rb +100 -0
- data/lutaml-uml.gemspec +20 -20
- data/templates/static_site/assets/images/lutaml-full.svg +1 -0
- data/templates/static_site/assets/images/lutaml-icon.svg +1 -0
- data/templates/static_site/assets/scripts/app.js +45 -0
- data/templates/static_site/assets/scripts/core/state.js +446 -0
- data/templates/static_site/assets/scripts/core/utils.js +133 -0
- data/templates/static_site/assets/scripts/ui/details.js +74 -0
- data/templates/static_site/assets/scripts/ui/diagrams.js +345 -0
- data/templates/static_site/assets/scripts/ui/search.js +187 -0
- data/templates/static_site/assets/scripts/ui/sidebar.js +123 -0
- data/templates/static_site/assets/styles/00-variables.css +144 -0
- data/templates/static_site/assets/styles/01-reset.css +69 -0
- data/templates/static_site/assets/styles/02-base.css +144 -0
- data/templates/static_site/assets/styles/03-layout.css +121 -0
- data/templates/static_site/assets/styles/04-components.css +905 -0
- data/templates/static_site/assets/styles/05-utilities.css +23 -0
- data/templates/static_site/assets/styles/06-diagrams.css +74 -0
- data/templates/static_site/components/class_details.liquid +328 -0
- data/templates/static_site/components/content.liquid +481 -0
- data/templates/static_site/components/diagram_list.liquid +52 -0
- data/templates/static_site/components/diagram_viewer.liquid +71 -0
- data/templates/static_site/components/header.liquid +114 -0
- data/templates/static_site/components/package_details.liquid +119 -0
- data/templates/static_site/components/sidebar.liquid +76 -0
- data/templates/static_site/components/tree_node.liquid +81 -0
- data/templates/static_site/multi_file.liquid +49 -0
- data/templates/static_site/single_file.liquid +57 -0
- metadata +466 -224
- data/.github/workflows/macos.yml +0 -38
- data/.github/workflows/ubuntu.yml +0 -40
- data/.github/workflows/windows.yml +0 -51
- data/.travis.yml +0 -6
- data/CODE_OF_CONDUCT.md +0 -74
- data/LUTAML.adoc +0 -372
- data/bin/console +0 -15
- data/bin/folder_yaml2lutaml.sh +0 -6
- data/bin/plantuml2lutaml +0 -59
- data/bin/setup +0 -8
- data/bin/yaml2lutaml +0 -144
- data/lib/lutaml/layout/engine.rb +0 -15
- data/lib/lutaml/layout/graph_viz_engine.rb +0 -19
- data/lib/lutaml/uml/constructor_end.rb +0 -16
- data/lib/lutaml/uml/formatter/base.rb +0 -67
- data/lib/lutaml/uml/formatter/graphviz.rb +0 -334
- data/lib/lutaml/uml/formatter.rb +0 -21
- data/lib/lutaml/uml/node/base.rb +0 -21
- data/lib/lutaml/uml/node/class_node.rb +0 -57
- data/lib/lutaml/uml/node/class_relationship.rb +0 -14
- data/lib/lutaml/uml/node/document.rb +0 -18
- data/lib/lutaml/uml/node/field.rb +0 -34
- data/lib/lutaml/uml/node/has_name.rb +0 -15
- data/lib/lutaml/uml/node/has_type.rb +0 -15
- data/lib/lutaml/uml/node/method.rb +0 -29
- data/lib/lutaml/uml/node/method_argument.rb +0 -16
- data/lib/lutaml/uml/node/relationship.rb +0 -28
- data/lib/lutaml/uml/parsers/attribute.rb +0 -70
- data/lib/lutaml/uml/parsers/dsl.rb +0 -413
- data/lib/lutaml/uml/parsers/dsl_preprocessor.rb +0 -59
- data/lib/lutaml/uml/parsers/dsl_transform.rb +0 -27
- data/lib/lutaml/uml/parsers/yaml.rb +0 -46
- data/lib/lutaml/uml/serializers/association.rb +0 -58
- data/lib/lutaml/uml/serializers/base.rb +0 -16
- data/lib/lutaml/uml/serializers/class.rb +0 -29
- data/lib/lutaml/uml/serializers/top_element_attribute.rb +0 -14
- data/lib/lutaml/uml/serializers/yaml_view.rb +0 -18
- data/spec/fixtures/datamodel/models/AddressClassProfile.yml +0 -90
- data/spec/fixtures/datamodel/models/AddressComponentProfile.yml +0 -63
- data/spec/fixtures/datamodel/models/AddressComponentSpecification.yml +0 -15
- data/spec/fixtures/datamodel/models/AddressProfile.yml +0 -36
- data/spec/fixtures/datamodel/models/AttributeProfile.yml +0 -32
- data/spec/fixtures/datamodel/models/InterchangeAddressClassProfile.yml +0 -79
- data/spec/fixtures/datamodel/models/Localization copy.yml +0 -23
- data/spec/fixtures/datamodel/models/Localization.yml +0 -23
- data/spec/fixtures/datamodel/models/ProfileCompliantAddress.yml +0 -36
- data/spec/fixtures/datamodel/models/ProfileCompliantAddressComponent.yml +0 -15
- data/spec/fixtures/datamodel/models/Signature.yml +0 -20
- data/spec/fixtures/datamodel/models/SignatureBlankDefinition.yml +0 -20
- data/spec/fixtures/datamodel/models/TextDirectionCode copy.yml +0 -16
- data/spec/fixtures/datamodel/models/TextDirectionCode.yml +0 -16
- data/spec/fixtures/datamodel/models/Validity.yml +0 -14
- data/spec/fixtures/datamodel/models/iso19160-1/Address.yml +0 -22
- data/spec/fixtures/datamodel/models/iso19160-1/AddressComponent.yml +0 -2
- data/spec/fixtures/datamodel/style.uml.inc +0 -37
- data/spec/fixtures/datamodel/views/AddressClassProfile.yml +0 -12
- data/spec/fixtures/datamodel/views/AddressProfile.yml +0 -3
- data/spec/fixtures/datamodel/views/CommonModels.yml +0 -9
- data/spec/fixtures/datamodel/views/TopDown.yml +0 -62
- data/spec/fixtures/dsl/broken_diagram.lutaml +0 -34
- data/spec/fixtures/dsl/diagram.lutaml +0 -3
- data/spec/fixtures/dsl/diagram_attributes.lutaml +0 -6
- data/spec/fixtures/dsl/diagram_blank_definion.lutaml +0 -6
- data/spec/fixtures/dsl/diagram_blank_entities.lutaml +0 -8
- data/spec/fixtures/dsl/diagram_class_assocation.lutaml +0 -29
- data/spec/fixtures/dsl/diagram_class_fields.lutaml +0 -25
- data/spec/fixtures/dsl/diagram_commented_includes.lutaml +0 -5
- data/spec/fixtures/dsl/diagram_comments.lutaml +0 -28
- data/spec/fixtures/dsl/diagram_concept_model.lutaml +0 -132
- data/spec/fixtures/dsl/diagram_data_types.lutaml +0 -44
- data/spec/fixtures/dsl/diagram_definitions.lutaml +0 -25
- data/spec/fixtures/dsl/diagram_includes.lutaml +0 -6
- data/spec/fixtures/dsl/diagram_multiply_classes.lutaml +0 -7
- data/spec/fixtures/dsl/diagram_non_existing_include.lutaml +0 -6
- data/spec/fixtures/dsl/shared.lutaml +0 -3
- data/spec/fixtures/dsl/shared1.lutaml +0 -4
- data/spec/fixtures/generated_dot/AddressClassProfile.dot +0 -170
- data/spec/fixtures/generated_dot/AddressProfile.dot +0 -34
- data/spec/lutaml/layout/graph_viz_engine_spec.rb +0 -31
- data/spec/lutaml/uml/formatter/graphviz_spec.rb +0 -41
- data/spec/lutaml/uml/parsers/dsl_spec.rb +0 -345
- data/spec/lutaml/uml/parsers/yaml_spec.rb +0 -18
- data/spec/lutaml/uml/serializers/yaml_view_spec.rb +0 -20
- data/spec/lutaml/uml_spec.rb +0 -7
- 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.
|