lutaml 0.9.43 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/docs.yml +63 -0
- data/.github/workflows/links.yml +99 -0
- data/.github/workflows/rake.yml +13 -2
- data/.github/workflows/release.yml +12 -6
- data/.gitignore +3 -0
- data/.rubocop.yml +11 -3
- data/.rubocop_todo.yml +336 -0
- data/Gemfile +18 -7
- data/README.adoc +1854 -21
- data/Rakefile +7 -1
- data/bin/plantuml2lutaml +3 -3
- data/bin/yaml2lutaml +2 -2
- data/config/diagram_styles.yml +200 -0
- data/config/model_transformations.yml +266 -0
- data/config/package_metadata.example.yml +58 -0
- data/config/qea_schema.yml +1024 -0
- data/config/static_site.yml +166 -0
- data/docs/.github/workflows/docs.yml +66 -0
- data/docs/.github/workflows/links.yml +78 -0
- data/docs/CONTINUATION_PLAN.md +168 -0
- data/docs/Gemfile +13 -0
- data/docs/MIGRATION_GUIDE.md +202 -0
- data/docs/README.md +252 -0
- data/docs/REFACTOR_PLAN.md +214 -0
- data/docs/_config.yml +144 -0
- data/docs/_guides/diagram-generation.adoc +316 -0
- data/docs/_guides/index.adoc +135 -0
- data/docs/{lutaml-express.adoc → _guides/parsing/express-parsing.adoc} +7 -0
- data/docs/_guides/parsing/index.adoc +77 -0
- data/docs/{lutaml-xmi.adoc → _guides/parsing/xmi-parsing.adoc} +7 -0
- data/docs/_guides/sysml-modeling.adoc +37 -0
- data/docs/{lutaml-uml.adoc → _guides/uml-modeling.adoc} +8 -2
- data/docs/_pages/concepts/diagram-generation.adoc +337 -0
- data/docs/_pages/concepts/lur-format.adoc +711 -0
- data/docs/_pages/concepts/qea-parsing.adoc +418 -0
- data/docs/_pages/core/architecture.adoc +329 -0
- data/docs/_pages/core/installation.adoc +321 -0
- data/docs/_pages/core/overview.adoc +197 -0
- data/docs/_pages/index.adoc +48 -0
- data/docs/_pages/uml-syntax.adoc +995 -0
- data/docs/_references/configuration/diagram-styles.adoc +716 -0
- data/docs/_references/configuration/index.adoc +52 -0
- data/docs/_references/configuration/package-metadata.adoc +416 -0
- data/docs/_references/formats/index.adoc +42 -0
- data/docs/{lutaml_syntax.adoc → _references/formats/lutaml-syntax.adoc} +7 -0
- data/docs/_references/formats/qea-structure.adoc +1364 -0
- data/docs/_references/index.adoc +197 -0
- data/docs/_tutorials/index.adoc +109 -0
- data/docs/index.adoc +64 -0
- data/docs/lychee.toml +83 -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 +2 -16
- data/exe/lutaml-wsd2uml +3 -3
- data/exe/lutaml-yaml2uml +2 -2
- data/lib/lutaml/cli/commands/base_command.rb +118 -0
- data/lib/lutaml/cli/element_identifier.rb +165 -0
- data/lib/lutaml/cli/enhanced_formatter.rb +502 -0
- data/lib/lutaml/cli/interactive_shell.rb +911 -0
- data/lib/lutaml/cli/lml_commands.rb +201 -0
- data/lib/lutaml/cli/output_formatter.rb +348 -0
- data/lib/lutaml/cli/resource_registry.rb +127 -0
- data/lib/lutaml/cli/tree_view_formatter.rb +308 -0
- data/lib/lutaml/cli/uml/build_command.rb +538 -0
- data/lib/lutaml/cli/uml/diagram_command.rb +421 -0
- data/lib/lutaml/cli/uml/export_command.rb +78 -0
- data/lib/lutaml/cli/uml/find_command.rb +122 -0
- data/lib/lutaml/cli/uml/info_command.rb +104 -0
- data/lib/lutaml/cli/uml/inspect_command.rb +88 -0
- data/lib/lutaml/cli/uml/ls_command.rb +105 -0
- data/lib/lutaml/cli/uml/repl_command.rb +50 -0
- data/lib/lutaml/cli/uml/search_command.rb +88 -0
- data/lib/lutaml/cli/uml/serve_command.rb +59 -0
- data/lib/lutaml/cli/uml/shared_helpers.rb +51 -0
- data/lib/lutaml/cli/uml/spa_command.rb +209 -0
- data/lib/lutaml/cli/uml/stats_command.rb +60 -0
- data/lib/lutaml/cli/uml/tree_command.rb +85 -0
- data/lib/lutaml/cli/uml/validate_command.rb +195 -0
- data/lib/lutaml/cli/uml/verify_command.rb +107 -0
- data/lib/lutaml/cli/uml_commands.rb +163 -0
- data/lib/lutaml/cli.rb +72 -0
- data/lib/lutaml/command_line.rb +8 -6
- data/lib/lutaml/converter/dsl_to_uml.rb +2 -0
- data/lib/lutaml/converter/xmi_to_uml.rb +40 -19
- data/lib/lutaml/ea/diagram/configuration.rb +379 -0
- data/lib/lutaml/ea/diagram/element_renderers/base_renderer.rb +81 -0
- data/lib/lutaml/ea/diagram/element_renderers/class_renderer.rb +330 -0
- data/lib/lutaml/ea/diagram/element_renderers/connector_renderer.rb +55 -0
- data/lib/lutaml/ea/diagram/element_renderers/package_renderer.rb +69 -0
- data/lib/lutaml/ea/diagram/extractor.rb +559 -0
- data/lib/lutaml/ea/diagram/layout_engine.rb +251 -0
- data/lib/lutaml/ea/diagram/path_builder.rb +258 -0
- data/lib/lutaml/ea/diagram/style_parser.rb +315 -0
- data/lib/lutaml/ea/diagram/style_resolver.rb +291 -0
- data/lib/lutaml/ea/diagram/svg_renderer.rb +285 -0
- data/lib/lutaml/ea/diagram/util.rb +69 -0
- data/lib/lutaml/ea/diagram.rb +77 -0
- data/lib/lutaml/express/parsers/exp.rb +1 -1
- data/lib/lutaml/express.rb +4 -2
- data/lib/lutaml/formatter/base.rb +6 -6
- data/lib/lutaml/formatter/graphviz.rb +10 -8
- data/lib/lutaml/formatter.rb +3 -0
- data/lib/lutaml/layout/engine.rb +9 -7
- data/lib/lutaml/layout/graph_viz_engine.rb +2 -1
- data/lib/lutaml/layout.rb +8 -0
- data/lib/lutaml/model_transformations/configuration.rb +333 -0
- data/lib/lutaml/model_transformations/format_registry.rb +394 -0
- data/lib/lutaml/model_transformations/parsers/base_parser.rb +389 -0
- data/lib/lutaml/model_transformations/parsers/qea_parser.rb +455 -0
- data/lib/lutaml/model_transformations/parsers/xmi_parser.rb +301 -0
- data/lib/lutaml/model_transformations/transformation_engine.rb +409 -0
- data/lib/lutaml/model_transformations.rb +143 -0
- data/lib/lutaml/parser.rb +15 -7
- data/lib/lutaml/qea/benchmark.rb +212 -0
- data/lib/lutaml/qea/database.rb +324 -0
- data/lib/lutaml/qea/factory/association_transformer.rb +115 -0
- data/lib/lutaml/qea/factory/attribute_tag_transformer.rb +60 -0
- data/lib/lutaml/qea/factory/attribute_transformer.rb +103 -0
- data/lib/lutaml/qea/factory/base_transformer.rb +132 -0
- data/lib/lutaml/qea/factory/class_transformer.rb +734 -0
- data/lib/lutaml/qea/factory/constraint_transformer.rb +78 -0
- data/lib/lutaml/qea/factory/data_type_transformer.rb +162 -0
- data/lib/lutaml/qea/factory/diagram_transformer.rb +182 -0
- data/lib/lutaml/qea/factory/document_builder.rb +275 -0
- data/lib/lutaml/qea/factory/ea_to_uml_factory.rb +260 -0
- data/lib/lutaml/qea/factory/enum_transformer.rb +87 -0
- data/lib/lutaml/qea/factory/generalization_transformer.rb +106 -0
- data/lib/lutaml/qea/factory/instance_transformer.rb +96 -0
- data/lib/lutaml/qea/factory/object_property_transformer.rb +61 -0
- data/lib/lutaml/qea/factory/operation_transformer.rb +75 -0
- data/lib/lutaml/qea/factory/package_transformer.rb +199 -0
- data/lib/lutaml/qea/factory/reference_resolver.rb +99 -0
- data/lib/lutaml/qea/factory/tagged_value_transformer.rb +41 -0
- data/lib/lutaml/qea/factory/transformer_registry.rb +85 -0
- data/lib/lutaml/qea/file_detector.rb +178 -0
- data/lib/lutaml/qea/infrastructure/database_connection.rb +100 -0
- data/lib/lutaml/qea/infrastructure/schema_reader.rb +136 -0
- data/lib/lutaml/qea/infrastructure/table_reader.rb +224 -0
- data/lib/lutaml/qea/models/base_model.rb +48 -0
- data/lib/lutaml/qea/models/ea_attribute.rb +135 -0
- data/lib/lutaml/qea/models/ea_attribute_tag.rb +109 -0
- data/lib/lutaml/qea/models/ea_complexity_type.rb +81 -0
- data/lib/lutaml/qea/models/ea_connector.rb +162 -0
- data/lib/lutaml/qea/models/ea_connector_type.rb +62 -0
- data/lib/lutaml/qea/models/ea_constraint_type.rb +65 -0
- data/lib/lutaml/qea/models/ea_datatype.rb +108 -0
- data/lib/lutaml/qea/models/ea_diagram.rb +117 -0
- data/lib/lutaml/qea/models/ea_diagram_link.rb +80 -0
- data/lib/lutaml/qea/models/ea_diagram_object.rb +86 -0
- data/lib/lutaml/qea/models/ea_diagram_type.rb +58 -0
- data/lib/lutaml/qea/models/ea_document.rb +68 -0
- data/lib/lutaml/qea/models/ea_object.rb +208 -0
- data/lib/lutaml/qea/models/ea_object_constraint.rb +62 -0
- data/lib/lutaml/qea/models/ea_object_property.rb +96 -0
- data/lib/lutaml/qea/models/ea_object_type.rb +75 -0
- data/lib/lutaml/qea/models/ea_operation.rb +153 -0
- data/lib/lutaml/qea/models/ea_operation_param.rb +73 -0
- data/lib/lutaml/qea/models/ea_package.rb +75 -0
- data/lib/lutaml/qea/models/ea_script.rb +69 -0
- data/lib/lutaml/qea/models/ea_status_type.rb +68 -0
- data/lib/lutaml/qea/models/ea_stereotype.rb +59 -0
- data/lib/lutaml/qea/models/ea_tagged_value.rb +105 -0
- data/lib/lutaml/qea/models/ea_xref.rb +174 -0
- data/lib/lutaml/qea/parser.rb +61 -0
- data/lib/lutaml/qea/repositories/base_repository.rb +215 -0
- data/lib/lutaml/qea/repositories/object_repository.rb +221 -0
- data/lib/lutaml/qea/services/configuration.rb +211 -0
- data/lib/lutaml/qea/services/database_loader.rb +215 -0
- data/lib/lutaml/qea/validation/association_validator.rb +75 -0
- data/lib/lutaml/qea/validation/attribute_validator.rb +103 -0
- data/lib/lutaml/qea/validation/base_validator.rb +305 -0
- data/lib/lutaml/qea/validation/class_validator.rb +123 -0
- data/lib/lutaml/qea/validation/database/circular_reference_validator.rb +111 -0
- data/lib/lutaml/qea/validation/database/orphan_validator.rb +155 -0
- data/lib/lutaml/qea/validation/database/referential_integrity_validator.rb +130 -0
- data/lib/lutaml/qea/validation/diagram_validator.rb +114 -0
- data/lib/lutaml/qea/validation/formatters/json_formatter.rb +137 -0
- data/lib/lutaml/qea/validation/formatters/text_formatter.rb +235 -0
- data/lib/lutaml/qea/validation/operation_validator.rb +81 -0
- data/lib/lutaml/qea/validation/package_validator.rb +113 -0
- data/lib/lutaml/qea/validation/validation_engine.rb +497 -0
- data/lib/lutaml/qea/validation/validation_message.rb +144 -0
- data/lib/lutaml/qea/validation/validation_result.rb +212 -0
- data/lib/lutaml/qea/validation/validator_registry.rb +134 -0
- data/lib/lutaml/qea/verification/comparison_result.rb +264 -0
- data/lib/lutaml/qea/verification/document_normalizer.rb +177 -0
- data/lib/lutaml/qea/verification/document_verifier.rb +320 -0
- data/lib/lutaml/qea/verification/element_comparator.rb +306 -0
- data/lib/lutaml/qea/verification/structure_matcher.rb +287 -0
- data/lib/lutaml/qea.rb +226 -0
- data/lib/lutaml/sysml/allocate.rb +2 -0
- data/lib/lutaml/sysml/allocated.rb +2 -0
- data/lib/lutaml/sysml/binding_connector.rb +2 -0
- data/lib/lutaml/sysml/block.rb +2 -0
- data/lib/lutaml/sysml/constraint_block.rb +2 -0
- data/lib/lutaml/sysml/copy.rb +2 -0
- data/lib/lutaml/sysml/derive_requirement.rb +2 -0
- data/lib/lutaml/sysml/nested_connector_end.rb +2 -0
- data/lib/lutaml/sysml/refine.rb +2 -0
- data/lib/lutaml/sysml/requirement.rb +2 -0
- data/lib/lutaml/sysml/requirement_related.rb +2 -0
- data/lib/lutaml/sysml/satisfy.rb +2 -0
- data/lib/lutaml/sysml/test_case.rb +2 -0
- data/lib/lutaml/sysml/trace.rb +2 -0
- data/lib/lutaml/sysml/verify.rb +2 -0
- data/lib/lutaml/sysml/xmi_file.rb +2 -0
- data/lib/lutaml/sysml.rb +3 -1
- data/lib/lutaml/uml/association.rb +4 -0
- data/lib/lutaml/uml/class.rb +11 -9
- data/lib/lutaml/uml/classifier.rb +3 -0
- data/lib/lutaml/uml/comment.rb +13 -0
- data/lib/lutaml/uml/data_type.rb +7 -6
- data/lib/lutaml/uml/diagram.rb +12 -0
- data/lib/lutaml/uml/diagram_link.rb +26 -0
- data/lib/lutaml/uml/diagram_object.rb +30 -0
- data/lib/lutaml/uml/document.rb +18 -0
- data/lib/lutaml/uml/enum.rb +4 -3
- data/lib/lutaml/uml/fontname.rb +13 -0
- data/lib/lutaml/uml/generalization.rb +2 -0
- data/lib/lutaml/uml/group.rb +2 -0
- data/lib/lutaml/uml/namespace.rb +2 -2
- data/lib/lutaml/uml/node/{field.rb → attribute.rb} +4 -4
- data/lib/lutaml/uml/node/base.rb +1 -1
- data/lib/lutaml/uml/node/class_node.rb +12 -12
- data/lib/lutaml/uml/node/class_relationship.rb +2 -2
- data/lib/lutaml/uml/node/document.rb +2 -2
- data/lib/lutaml/uml/node/method_argument.rb +3 -3
- data/lib/lutaml/uml/node/{method.rb → operation.rb} +4 -4
- data/lib/lutaml/uml/node/relationship.rb +3 -3
- data/lib/lutaml/uml/package.rb +7 -4
- data/lib/lutaml/uml/package_path.rb +235 -0
- data/lib/lutaml/uml/parsers/attribute.rb +2 -2
- data/lib/lutaml/uml/parsers/dsl.rb +3 -4
- data/lib/lutaml/uml/parsers/yaml.rb +1 -1
- data/lib/lutaml/uml/qualified_name.rb +178 -0
- data/lib/lutaml/uml/tagged_value.rb +21 -0
- data/lib/lutaml/uml/top_element.rb +7 -1
- data/lib/lutaml/uml/top_element_attribute.rb +4 -0
- data/lib/lutaml/uml/validation/document_structure_validator.rb +389 -0
- data/lib/lutaml/uml.rb +89 -45
- data/lib/lutaml/uml_repository/error_handler.rb +203 -0
- data/lib/lutaml/uml_repository/exporters/base_exporter.rb +61 -0
- data/lib/lutaml/uml_repository/exporters/json_exporter.rb +344 -0
- data/lib/lutaml/uml_repository/exporters/markdown_exporter.rb +598 -0
- data/lib/lutaml/uml_repository/index_builder.rb +460 -0
- data/lib/lutaml/uml_repository/lazy_repository.rb +238 -0
- data/lib/lutaml/uml_repository/package_exporter.rb +336 -0
- data/lib/lutaml/uml_repository/package_loader.rb +220 -0
- data/lib/lutaml/uml_repository/package_metadata.rb +77 -0
- data/lib/lutaml/uml_repository/presenters/association_presenter.rb +86 -0
- data/lib/lutaml/uml_repository/presenters/attribute_presenter.rb +101 -0
- data/lib/lutaml/uml_repository/presenters/class_presenter.rb +75 -0
- data/lib/lutaml/uml_repository/presenters/datatype_presenter.rb +108 -0
- data/lib/lutaml/uml_repository/presenters/diagram_presenter.rb +508 -0
- data/lib/lutaml/uml_repository/presenters/element_presenter.rb +92 -0
- data/lib/lutaml/uml_repository/presenters/enum_presenter.rb +83 -0
- data/lib/lutaml/uml_repository/presenters/package_presenter.rb +48 -0
- data/lib/lutaml/uml_repository/presenters/presenter_factory.rb +76 -0
- data/lib/lutaml/uml_repository/queries/association_query.rb +187 -0
- data/lib/lutaml/uml_repository/queries/base_query.rb +45 -0
- data/lib/lutaml/uml_repository/queries/class_query.rb +117 -0
- data/lib/lutaml/uml_repository/queries/diagram_query.rb +111 -0
- data/lib/lutaml/uml_repository/queries/inheritance_query.rb +259 -0
- data/lib/lutaml/uml_repository/queries/package_query.rb +239 -0
- data/lib/lutaml/uml_repository/queries/search_query.rb +357 -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 +46 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/hash_condition.rb +84 -0
- data/lib/lutaml/uml_repository/query_dsl/conditions/package_condition.rb +84 -0
- data/lib/lutaml/uml_repository/query_dsl/order.rb +90 -0
- data/lib/lutaml/uml_repository/query_dsl/query_builder.rb +296 -0
- data/lib/lutaml/uml_repository/repository.rb +764 -0
- data/lib/lutaml/uml_repository/repository_enhanced.rb +439 -0
- data/lib/lutaml/uml_repository/search_result.rb +86 -0
- data/lib/lutaml/uml_repository/static_site/configuration.rb +270 -0
- data/lib/lutaml/uml_repository/static_site/data_transformer.rb +967 -0
- data/lib/lutaml/uml_repository/static_site/generator.rb +401 -0
- data/lib/lutaml/uml_repository/static_site/id_generator.rb +115 -0
- data/lib/lutaml/uml_repository/static_site/search_index_builder.rb +317 -0
- data/lib/lutaml/uml_repository/static_site.rb +88 -0
- data/lib/lutaml/uml_repository/statistics_calculator.rb +334 -0
- data/lib/lutaml/uml_repository/validators/repository_validator.rb +404 -0
- data/lib/lutaml/uml_repository/web_ui/app.rb +144 -0
- data/lib/lutaml/uml_repository/web_ui/public/app.js +452 -0
- data/lib/lutaml/uml_repository/web_ui/public/styles.css +381 -0
- data/lib/lutaml/uml_repository/web_ui/views/index.erb +40 -0
- data/lib/lutaml/uml_repository.rb +97 -0
- data/lib/lutaml/version.rb +3 -1
- data/lib/lutaml/xmi/liquid_drops/association_drop.rb +60 -58
- data/lib/lutaml/xmi/liquid_drops/attribute_drop.rb +55 -53
- data/lib/lutaml/xmi/liquid_drops/cardinality_drop.rb +15 -13
- data/lib/lutaml/xmi/liquid_drops/connector_drop.rb +50 -46
- data/lib/lutaml/xmi/liquid_drops/constraint_drop.rb +19 -17
- data/lib/lutaml/xmi/liquid_drops/data_type_drop.rb +93 -90
- data/lib/lutaml/xmi/liquid_drops/dependency_drop.rb +26 -24
- data/lib/lutaml/xmi/liquid_drops/diagram_drop.rb +26 -24
- data/lib/lutaml/xmi/liquid_drops/enum_drop.rb +40 -37
- data/lib/lutaml/xmi/liquid_drops/enum_owned_literal_drop.rb +20 -18
- data/lib/lutaml/xmi/liquid_drops/generalization_attribute_drop.rb +64 -62
- data/lib/lutaml/xmi/liquid_drops/generalization_drop.rb +142 -140
- data/lib/lutaml/xmi/liquid_drops/klass_drop.rb +174 -170
- data/lib/lutaml/xmi/liquid_drops/operation_drop.rb +23 -21
- data/lib/lutaml/xmi/liquid_drops/package_drop.rb +95 -93
- data/lib/lutaml/xmi/liquid_drops/root_drop.rb +28 -25
- data/lib/lutaml/xmi/liquid_drops/source_target_drop.rb +39 -37
- data/lib/lutaml/xmi/parsers/xmi_base.rb +27 -17
- data/lib/lutaml/xmi/parsers/xml.rb +9 -9
- data/lib/lutaml/xmi.rb +37 -6
- data/lib/lutaml/xml/parsers/xml.rb +3 -1
- data/lib/lutaml/xml.rb +3 -1
- data/lib/lutaml.rb +14 -2
- data/lutaml.gemspec +16 -8
- data/plateau_all_packages.lur +0 -0
- data/templates/static_site/assets/scripts/app.js +45 -0
- data/templates/static_site/assets/scripts/core/state.js +419 -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 +214 -0
- data/templates/static_site/assets/styles/00-variables.css +144 -0
- data/templates/static_site/assets/styles/01-reset.css +79 -0
- data/templates/static_site/assets/styles/02-base.css +149 -0
- data/templates/static_site/assets/styles/03-layout.css +171 -0
- data/templates/static_site/assets/styles/04-components.css +856 -0
- data/templates/static_site/assets/styles/05-utilities.css +89 -0
- data/templates/static_site/assets/styles/06-diagrams.css +277 -0
- data/templates/static_site/components/class_details.liquid +328 -0
- data/templates/static_site/components/content.liquid +508 -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 +134 -0
- data/templates/static_site/components/package_details.liquid +119 -0
- data/templates/static_site/components/sidebar.liquid +46 -0
- data/templates/static_site/components/tree_node.liquid +81 -0
- data/templates/static_site/multi_file.liquid +46 -0
- data/templates/static_site/single_file.liquid +52 -0
- metadata +604 -31
- data/CODE_OF_CONDUCT.md +0 -74
- data/docs/lutaml-sysml.adoc +0 -10
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require "lutaml/uml"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Qea
|
|
8
|
+
module Factory
|
|
9
|
+
# Transforms EA ObjectConstraint to UML Constraint
|
|
10
|
+
#
|
|
11
|
+
# This transformer converts Enterprise Architect constraint definitions
|
|
12
|
+
# (typically OCL constraints) to standard UML Constraint objects.
|
|
13
|
+
#
|
|
14
|
+
# @example Transform a constraint
|
|
15
|
+
# ea_constraint = Models::EaObjectConstraint.new(
|
|
16
|
+
# constraint_id: 1,
|
|
17
|
+
# object_id: 4,
|
|
18
|
+
# constraint: "count(self.legalConstraints) >= 1",
|
|
19
|
+
# constraint_type: "Invariant",
|
|
20
|
+
# weight: 0.0,
|
|
21
|
+
# status: "Approved"
|
|
22
|
+
# )
|
|
23
|
+
# transformer = ConstraintTransformer.new(database)
|
|
24
|
+
# uml_constraint = transformer.transform(ea_constraint)
|
|
25
|
+
class ConstraintTransformer < BaseTransformer
|
|
26
|
+
# Transform EA constraint to UML Constraint
|
|
27
|
+
#
|
|
28
|
+
# @param ea_constraint [Models::EaObjectConstraint] EA constraint model
|
|
29
|
+
# @return [Lutaml::Uml::Constraint, nil] UML constraint or nil
|
|
30
|
+
def transform(ea_constraint) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
31
|
+
return nil unless ea_constraint
|
|
32
|
+
|
|
33
|
+
Lutaml::Uml::Constraint.new.tap do |constraint|
|
|
34
|
+
# Generate unique ID for the constraint
|
|
35
|
+
constraint.xmi_id = "constraint_#{ea_constraint.constraint_id}" if
|
|
36
|
+
ea_constraint.constraint_id
|
|
37
|
+
|
|
38
|
+
# Generate descriptive name from constraint body or use ID
|
|
39
|
+
constraint.name = constraint_name(ea_constraint)
|
|
40
|
+
|
|
41
|
+
# Map constraint properties
|
|
42
|
+
constraint.body = ea_constraint.constraint
|
|
43
|
+
constraint.type = ea_constraint.constraint_type
|
|
44
|
+
constraint.weight = ea_constraint.weight&.to_s
|
|
45
|
+
constraint.status = ea_constraint.status
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Generate descriptive name from constraint body
|
|
52
|
+
#
|
|
53
|
+
# Extracts the first meaningful part of the constraint body to use
|
|
54
|
+
# as a descriptive name. Falls back to a generic name if extraction
|
|
55
|
+
# fails.
|
|
56
|
+
#
|
|
57
|
+
# @param ea_constraint [Models::EaObjectConstraint] EA constraint
|
|
58
|
+
# @return [String] Constraint name
|
|
59
|
+
def constraint_name(ea_constraint) # rubocop:disable Metrics/MethodLength
|
|
60
|
+
return "constraint_#{ea_constraint.constraint_id}" unless
|
|
61
|
+
ea_constraint.constraint
|
|
62
|
+
|
|
63
|
+
body = ea_constraint.constraint.to_s.strip
|
|
64
|
+
|
|
65
|
+
# Try to extract a meaningful name from the constraint body
|
|
66
|
+
# Take first 50 chars or until special chars
|
|
67
|
+
name_part = body[0..50].split(/[()<>=\s]/).first&.strip
|
|
68
|
+
|
|
69
|
+
if name_part && !name_part.empty?
|
|
70
|
+
name_part
|
|
71
|
+
else
|
|
72
|
+
"constraint_#{ea_constraint.constraint_id}"
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require_relative "attribute_transformer"
|
|
5
|
+
require_relative "operation_transformer"
|
|
6
|
+
require_relative "constraint_transformer"
|
|
7
|
+
require_relative "tagged_value_transformer"
|
|
8
|
+
require_relative "association_transformer"
|
|
9
|
+
require "lutaml/uml"
|
|
10
|
+
|
|
11
|
+
module Lutaml
|
|
12
|
+
module Qea
|
|
13
|
+
module Factory
|
|
14
|
+
# Transforms EA objects (DataType type) to UML data types
|
|
15
|
+
class DataTypeTransformer < BaseTransformer
|
|
16
|
+
# Transform EA object to UML data type
|
|
17
|
+
# @param ea_object [EaObject] EA object model
|
|
18
|
+
# @return [Lutaml::Uml::DataType] UML data type
|
|
19
|
+
def transform(ea_object) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
20
|
+
return nil if ea_object.nil?
|
|
21
|
+
return nil unless ea_object.data_type?
|
|
22
|
+
|
|
23
|
+
Lutaml::Uml::DataType.new.tap do |data_type| # rubocop:disable Metrics/BlockLength
|
|
24
|
+
# Map basic properties
|
|
25
|
+
data_type.name = ea_object.name
|
|
26
|
+
data_type.xmi_id = normalize_guid_to_xmi_format(ea_object.ea_guid,
|
|
27
|
+
"EAID")
|
|
28
|
+
data_type.is_abstract = ea_object.abstract?
|
|
29
|
+
data_type.type = "DataType"
|
|
30
|
+
data_type.visibility = map_visibility(ea_object.visibility)
|
|
31
|
+
|
|
32
|
+
# Set package path
|
|
33
|
+
data_type.package_path = calculate_package_path(
|
|
34
|
+
ea_object.package_id,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Map stereotype
|
|
38
|
+
if ea_object.stereotype && !ea_object.stereotype.empty?
|
|
39
|
+
data_type.stereotype = ea_object.stereotype
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Map definition/notes
|
|
43
|
+
data_type.definition = ea_object.note unless
|
|
44
|
+
ea_object.note.nil? || ea_object.note.empty?
|
|
45
|
+
|
|
46
|
+
# Load and transform attributes
|
|
47
|
+
attts = load_attributes(ea_object.ea_object_id)
|
|
48
|
+
assoc_attts = load_association_attributes(ea_object.ea_object_id)
|
|
49
|
+
data_type.attributes = attts + assoc_attts
|
|
50
|
+
|
|
51
|
+
# Load and transform operations
|
|
52
|
+
data_type.operations = load_operations(ea_object.ea_object_id)
|
|
53
|
+
|
|
54
|
+
# Load and transform constraints
|
|
55
|
+
data_type.constraints = load_constraints(ea_object.ea_object_id)
|
|
56
|
+
|
|
57
|
+
# Load and transform tagged values
|
|
58
|
+
data_type.tagged_values = load_tagged_values(ea_object.ea_guid)
|
|
59
|
+
|
|
60
|
+
# Load associations for this data type
|
|
61
|
+
data_type.associations = load_associations(ea_object.ea_object_id,
|
|
62
|
+
ea_object.ea_guid)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# Load and transform attributes for a data type
|
|
69
|
+
# @param object_id [Integer] Object ID
|
|
70
|
+
# @return [Array<Lutaml::Uml::TopElementAttribute>] UML attributes
|
|
71
|
+
def load_attributes(object_id)
|
|
72
|
+
return [] if object_id.nil?
|
|
73
|
+
|
|
74
|
+
query = "SELECT * FROM t_attribute WHERE Object_ID = ? ORDER BY Pos"
|
|
75
|
+
rows = database.connection.execute(query, object_id)
|
|
76
|
+
|
|
77
|
+
ea_attributes = rows.map do |row|
|
|
78
|
+
Models::EaAttribute.from_db_row(row)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
attribute_transformer = AttributeTransformer.new(database)
|
|
82
|
+
attribute_transformer.transform_collection(ea_attributes)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Load and transform operations for a data type
|
|
86
|
+
# @param object_id [Integer] Object ID
|
|
87
|
+
# @return [Array<Lutaml::Uml::Operation>] UML operations
|
|
88
|
+
def load_operations(object_id)
|
|
89
|
+
return [] if object_id.nil?
|
|
90
|
+
|
|
91
|
+
query = "SELECT * FROM t_operation WHERE Object_ID = ? ORDER BY Pos"
|
|
92
|
+
rows = database.connection.execute(query, object_id)
|
|
93
|
+
|
|
94
|
+
ea_operations = rows.map do |row|
|
|
95
|
+
Models::EaOperation.from_db_row(row)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
operation_transformer = OperationTransformer.new(database)
|
|
99
|
+
operation_transformer.transform_collection(ea_operations)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Load and transform constraints for a data type
|
|
103
|
+
# @param object_id [Integer] Object ID
|
|
104
|
+
# @return [Array<Lutaml::Uml::Constraint>] UML constraints
|
|
105
|
+
def load_constraints(object_id)
|
|
106
|
+
return [] if object_id.nil?
|
|
107
|
+
return [] unless database.object_constraints
|
|
108
|
+
|
|
109
|
+
ea_constraints = database.object_constraints.select do |c|
|
|
110
|
+
c.ea_object_id == object_id
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
constraint_transformer = ConstraintTransformer.new(database)
|
|
114
|
+
constraint_transformer.transform_collection(ea_constraints)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Load and transform tagged values for a data type
|
|
118
|
+
# @param ea_guid [String] Element GUID
|
|
119
|
+
# @return [Array<Lutaml::Uml::TaggedValue>] UML tagged values
|
|
120
|
+
def load_tagged_values(ea_guid)
|
|
121
|
+
return [] if ea_guid.nil?
|
|
122
|
+
return [] unless database.tagged_values
|
|
123
|
+
|
|
124
|
+
ea_tags = database.tagged_values.select do |tag|
|
|
125
|
+
tag.element_id == ea_guid
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
tag_transformer = TaggedValueTransformer.new(database)
|
|
129
|
+
tag_transformer.transform_collection(ea_tags)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Load associations for a data type
|
|
133
|
+
# @param object_id [Integer] Object ID
|
|
134
|
+
# @param object_guid [String] Object GUID
|
|
135
|
+
# @return [Array<Lutaml::Uml::Association>] UML associations
|
|
136
|
+
def load_associations(object_id, object_guid) # rubocop:disable Metrics/MethodLength
|
|
137
|
+
return [] if object_id.nil?
|
|
138
|
+
|
|
139
|
+
query = <<-SQL
|
|
140
|
+
SELECT * FROM t_connector
|
|
141
|
+
WHERE Connector_Type = 'Association'
|
|
142
|
+
AND (Start_Object_ID = ? OR End_Object_ID = ?)
|
|
143
|
+
SQL
|
|
144
|
+
|
|
145
|
+
rows = database.connection.execute(query, [object_id, object_id])
|
|
146
|
+
|
|
147
|
+
assoc_transformer = AssociationTransformer.new(database)
|
|
148
|
+
normalized_xmi_id = normalize_guid_to_xmi_format(object_guid, "EAID")
|
|
149
|
+
|
|
150
|
+
rows.filter_map do |row|
|
|
151
|
+
ea_connector = Models::EaConnector.from_db_row(row)
|
|
152
|
+
assoc = assoc_transformer.transform(ea_connector)
|
|
153
|
+
|
|
154
|
+
next unless assoc && assoc.owner_end_xmi_id == normalized_xmi_id
|
|
155
|
+
|
|
156
|
+
assoc
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require "lutaml/uml"
|
|
5
|
+
require_relative "../../uml/diagram_object"
|
|
6
|
+
require_relative "../../uml/diagram_link"
|
|
7
|
+
|
|
8
|
+
module Lutaml
|
|
9
|
+
module Qea
|
|
10
|
+
module Factory
|
|
11
|
+
# Transforms EA diagrams to UML diagrams
|
|
12
|
+
#
|
|
13
|
+
# This transformer loads diagram data along with diagram objects
|
|
14
|
+
# (visual placement) and diagram links (visual connector routing)
|
|
15
|
+
# to create a complete UML diagram representation.
|
|
16
|
+
class DiagramTransformer < BaseTransformer
|
|
17
|
+
# Transform EA diagram to UML diagram
|
|
18
|
+
# @param ea_diagram [EaDiagram] EA diagram model
|
|
19
|
+
# @return [Lutaml::Uml::Diagram] UML diagram
|
|
20
|
+
def transform(ea_diagram) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
|
21
|
+
return nil if ea_diagram.nil?
|
|
22
|
+
|
|
23
|
+
Lutaml::Uml::Diagram.new.tap do |diagram| # rubocop:disable Metrics/BlockLength
|
|
24
|
+
# Map basic properties
|
|
25
|
+
diagram.name = ea_diagram.name
|
|
26
|
+
diagram.xmi_id = normalize_guid_to_xmi_format(ea_diagram.ea_guid,
|
|
27
|
+
"EAID")
|
|
28
|
+
# TODO: Fix diagram_type assignment -
|
|
29
|
+
# lutaml-model compatibility issue
|
|
30
|
+
# diagram.diagram_type = ea_diagram.diagram_type
|
|
31
|
+
|
|
32
|
+
# Map package relationship - use GUID not numeric ID
|
|
33
|
+
if ea_diagram.package_id
|
|
34
|
+
package = find_package(ea_diagram.package_id)
|
|
35
|
+
if package
|
|
36
|
+
diagram.package_id = normalize_guid_to_xmi_format(
|
|
37
|
+
package.ea_guid, "EAPK"
|
|
38
|
+
)
|
|
39
|
+
diagram.package_name = package.name
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Map definition/notes
|
|
44
|
+
diagram.definition = ea_diagram.notes unless
|
|
45
|
+
ea_diagram.notes.nil? || ea_diagram.notes.empty?
|
|
46
|
+
|
|
47
|
+
# Map stereotype
|
|
48
|
+
if ea_diagram.stereotype && !ea_diagram.stereotype.empty?
|
|
49
|
+
diagram.stereotype = [ea_diagram.stereotype]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Load and transform diagram objects (visual placement)
|
|
53
|
+
diagram_objects = load_diagram_objects(ea_diagram.diagram_id)
|
|
54
|
+
if diagram_objects.any?
|
|
55
|
+
diagram.diagram_objects.concat(diagram_objects)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Load and transform diagram links (visual routing)
|
|
59
|
+
diagram_links = load_diagram_links(ea_diagram.diagram_id)
|
|
60
|
+
diagram.diagram_links.concat(diagram_links) if diagram_links.any?
|
|
61
|
+
|
|
62
|
+
# Load diagram type
|
|
63
|
+
diagram.diagram_type = ea_diagram.diagram_type
|
|
64
|
+
|
|
65
|
+
# Load diagram id
|
|
66
|
+
diagram.package_id = ea_diagram.package_id
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# Find package by ID
|
|
73
|
+
# @param package_id [Integer] Package ID
|
|
74
|
+
# @return [EaPackage, nil] EA package or nil if not found
|
|
75
|
+
def find_package(package_id)
|
|
76
|
+
return nil if package_id.nil?
|
|
77
|
+
|
|
78
|
+
query = "SELECT * FROM t_package WHERE Package_ID = ?"
|
|
79
|
+
rows = database.connection.execute(query, package_id)
|
|
80
|
+
return nil if rows.empty?
|
|
81
|
+
|
|
82
|
+
Models::EaPackage.from_db_row(rows.first)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Load diagram objects for a diagram
|
|
86
|
+
# @param diagram_id [Integer] Diagram ID
|
|
87
|
+
# @return [Array<Lutaml::Uml::DiagramObject>] UML diagram objects
|
|
88
|
+
def load_diagram_objects(diagram_id)
|
|
89
|
+
return [] if diagram_id.nil?
|
|
90
|
+
|
|
91
|
+
query = "SELECT * FROM t_diagramobjects WHERE Diagram_ID = ?"
|
|
92
|
+
rows = database.connection.execute(query, diagram_id)
|
|
93
|
+
|
|
94
|
+
rows.filter_map do |row|
|
|
95
|
+
ea_obj = Models::EaDiagramObject.from_db_row(row)
|
|
96
|
+
transform_diagram_object(ea_obj)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Transform EA diagram object to UML diagram object
|
|
101
|
+
# @param ea_obj [Models::EaDiagramObject] EA diagram object
|
|
102
|
+
# @return [Lutaml::Uml::DiagramObject] UML diagram object
|
|
103
|
+
def transform_diagram_object(ea_obj) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
104
|
+
return nil if ea_obj.nil?
|
|
105
|
+
|
|
106
|
+
Lutaml::Uml::DiagramObject.new.tap do |obj|
|
|
107
|
+
obj.diagram_object_id = ea_obj.ea_object_id.to_s
|
|
108
|
+
obj.left = ea_obj.rectleft
|
|
109
|
+
obj.top = ea_obj.recttop
|
|
110
|
+
obj.right = ea_obj.rectright
|
|
111
|
+
obj.bottom = ea_obj.rectbottom
|
|
112
|
+
obj.sequence = ea_obj.sequence
|
|
113
|
+
obj.style = ea_obj.objectstyle
|
|
114
|
+
|
|
115
|
+
# Try to find and set xmi_id from the referenced object
|
|
116
|
+
if ea_obj.ea_object_id
|
|
117
|
+
uml_object = find_object_by_id(ea_obj.ea_object_id)
|
|
118
|
+
if uml_object
|
|
119
|
+
obj.object_xmi_id = normalize_guid_to_xmi_format(
|
|
120
|
+
uml_object.ea_guid, "EAID"
|
|
121
|
+
)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Load diagram links for a diagram
|
|
128
|
+
# @param diagram_id [Integer] Diagram ID
|
|
129
|
+
# @return [Array<Lutaml::Uml::DiagramLink>] UML diagram links
|
|
130
|
+
def load_diagram_links(diagram_id)
|
|
131
|
+
return [] if diagram_id.nil?
|
|
132
|
+
|
|
133
|
+
query = "SELECT * FROM t_diagramlinks WHERE DiagramID = ?"
|
|
134
|
+
rows = database.connection.execute(query, diagram_id)
|
|
135
|
+
|
|
136
|
+
rows.filter_map do |row|
|
|
137
|
+
ea_link = Models::EaDiagramLink.from_db_row(row)
|
|
138
|
+
transform_diagram_link(ea_link)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Transform EA diagram link to UML diagram link
|
|
143
|
+
# @param ea_link [Models::EaDiagramLink] EA diagram link
|
|
144
|
+
# @return [Lutaml::Uml::DiagramLink] UML diagram link
|
|
145
|
+
def transform_diagram_link(ea_link) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
146
|
+
return nil if ea_link.nil?
|
|
147
|
+
|
|
148
|
+
Lutaml::Uml::DiagramLink.new.tap do |link|
|
|
149
|
+
link.connector_id = ea_link.connectorid.to_s
|
|
150
|
+
link.geometry = ea_link.geometry
|
|
151
|
+
link.style = ea_link.style
|
|
152
|
+
link.hidden = ea_link.hidden?
|
|
153
|
+
link.path = ea_link.path
|
|
154
|
+
|
|
155
|
+
# Try to find and set xmi_id from the referenced connector
|
|
156
|
+
if ea_link.connectorid
|
|
157
|
+
connector = find_connector_by_id(ea_link.connectorid)
|
|
158
|
+
if connector
|
|
159
|
+
link.connector_xmi_id = normalize_guid_to_xmi_format(
|
|
160
|
+
connector.ea_guid, "EAID"
|
|
161
|
+
)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Find connector by ID
|
|
168
|
+
# @param connector_id [Integer] Connector ID
|
|
169
|
+
# @return [Models::EaConnector, nil] EA connector or nil if not found
|
|
170
|
+
def find_connector_by_id(connector_id)
|
|
171
|
+
return nil if connector_id.nil?
|
|
172
|
+
|
|
173
|
+
query = "SELECT * FROM t_connector WHERE Connector_ID = ?"
|
|
174
|
+
rows = database.connection.execute(query, connector_id)
|
|
175
|
+
return nil if rows.empty?
|
|
176
|
+
|
|
177
|
+
Models::EaConnector.from_db_row(rows.first)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/uml"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module Qea
|
|
7
|
+
module Factory
|
|
8
|
+
# Builds and validates UML Document structure
|
|
9
|
+
# Ensures all required document sections are populated correctly
|
|
10
|
+
class DocumentBuilder
|
|
11
|
+
attr_reader :document
|
|
12
|
+
|
|
13
|
+
# Initialize builder with new document
|
|
14
|
+
# @param name [String] Document name
|
|
15
|
+
def initialize(name: "EA Model")
|
|
16
|
+
@document = Lutaml::Uml::Document.new
|
|
17
|
+
@document.name = name
|
|
18
|
+
# Don't initialize collections - they have default values
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Add packages to document
|
|
22
|
+
# @param packages [Array<Lutaml::Uml::Package>] Packages to add
|
|
23
|
+
# @return [self] For method chaining
|
|
24
|
+
def add_packages(packages)
|
|
25
|
+
return self if packages.nil? || packages.empty?
|
|
26
|
+
|
|
27
|
+
@document.packages.concat(packages)
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Add classes to document
|
|
32
|
+
# @param classes [Array<Lutaml::Uml::Class>] Classes to add
|
|
33
|
+
# @return [self] For method chaining
|
|
34
|
+
def add_classes(classes)
|
|
35
|
+
return self if classes.nil? || classes.empty?
|
|
36
|
+
|
|
37
|
+
@document.classes.concat(classes)
|
|
38
|
+
self
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Add enums to document
|
|
42
|
+
# @param enums [Array<Lutaml::Uml::Enum>] Enums to add
|
|
43
|
+
# @return [self] For method chaining
|
|
44
|
+
def add_enums(enums)
|
|
45
|
+
return self if enums.nil? || enums.empty?
|
|
46
|
+
|
|
47
|
+
@document.enums.concat(enums)
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Add data types to document
|
|
52
|
+
# @param data_types [Array<Lutaml::Uml::DataType>] Data types to add
|
|
53
|
+
# @return [self] For method chaining
|
|
54
|
+
def add_data_types(data_types)
|
|
55
|
+
return self if data_types.nil? || data_types.empty?
|
|
56
|
+
|
|
57
|
+
@document.data_types.concat(data_types)
|
|
58
|
+
self
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Add instances to document
|
|
62
|
+
# @param instances [Array<Lutaml::Uml::Instance>] Instances to add
|
|
63
|
+
# @return [self] For method chaining
|
|
64
|
+
def add_instances(instances)
|
|
65
|
+
return self if instances.nil? || instances.empty?
|
|
66
|
+
|
|
67
|
+
@document.instances.concat(instances)
|
|
68
|
+
self
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Add associations to document
|
|
72
|
+
# @param associations [Array<Lutaml::Uml::Association>] Associations
|
|
73
|
+
# @return [self] For method chaining
|
|
74
|
+
def add_associations(associations)
|
|
75
|
+
return self if associations.nil? || associations.empty?
|
|
76
|
+
|
|
77
|
+
@document.associations.concat(associations)
|
|
78
|
+
self
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Set document metadata
|
|
82
|
+
# @param title [String] Document title
|
|
83
|
+
# @param caption [String] Document caption
|
|
84
|
+
# @return [self] For method chaining
|
|
85
|
+
def set_metadata(title: nil, caption: nil)
|
|
86
|
+
@document.title = title if title
|
|
87
|
+
@document.caption = caption if caption
|
|
88
|
+
self
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Build and return the document
|
|
92
|
+
# @param validate [Boolean] Whether to validate before returning
|
|
93
|
+
# @return [Lutaml::Uml::Document] The built document
|
|
94
|
+
# @raise [ValidationError] If validation fails
|
|
95
|
+
def build(validate: true)
|
|
96
|
+
validate! if validate
|
|
97
|
+
@document
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Validate document integrity
|
|
101
|
+
# @return [Boolean] True if valid
|
|
102
|
+
# @raise [ValidationError] If validation fails
|
|
103
|
+
def validate! # rubocop:disable Metrics/MethodLength
|
|
104
|
+
errors = []
|
|
105
|
+
warnings = []
|
|
106
|
+
|
|
107
|
+
# Check for duplicate xmi_ids
|
|
108
|
+
check_duplicate_xmi_ids(errors)
|
|
109
|
+
|
|
110
|
+
# Check association references (warnings only for missing refs)
|
|
111
|
+
check_association_references(warnings)
|
|
112
|
+
|
|
113
|
+
# Print warnings if any
|
|
114
|
+
unless warnings.empty?
|
|
115
|
+
warn "Document validation warnings:"
|
|
116
|
+
warnings.each { |w| warn " - #{w}" }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
raise ValidationError, errors.join("; ") unless errors.empty?
|
|
120
|
+
|
|
121
|
+
true
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Get document statistics
|
|
125
|
+
# @return [Hash] Statistics about document contents
|
|
126
|
+
def stats
|
|
127
|
+
{
|
|
128
|
+
packages: @document.packages.size,
|
|
129
|
+
classes: @document.classes.size,
|
|
130
|
+
enums: @document.enums.size,
|
|
131
|
+
data_types: @document.data_types.size,
|
|
132
|
+
instances: @document.instances.size,
|
|
133
|
+
associations: @document.associations.size,
|
|
134
|
+
}
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
private
|
|
138
|
+
|
|
139
|
+
# Check for duplicate xmi_ids across all elements
|
|
140
|
+
# @param errors [Array<String>] Error accumulator
|
|
141
|
+
def check_duplicate_xmi_ids(errors)
|
|
142
|
+
xmi_ids = collect_all_xmi_ids
|
|
143
|
+
duplicates = xmi_ids.group_by { |id| id }
|
|
144
|
+
.select { |_, v| v.size > 1 }
|
|
145
|
+
.keys
|
|
146
|
+
|
|
147
|
+
unless duplicates.empty?
|
|
148
|
+
errors << "Duplicate xmi_ids found: #{duplicates.join(', ')}"
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Collect all xmi_ids from document
|
|
153
|
+
# @return [Array<String>] All xmi_ids
|
|
154
|
+
def collect_all_xmi_ids # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
155
|
+
ids = []
|
|
156
|
+
|
|
157
|
+
# Collect from top-level elements
|
|
158
|
+
ids.concat(@document.packages.filter_map(&:xmi_id))
|
|
159
|
+
ids.concat(@document.classes.filter_map(&:xmi_id))
|
|
160
|
+
ids.concat(@document.enums.filter_map(&:xmi_id))
|
|
161
|
+
ids.concat(@document.data_types.filter_map(&:xmi_id))
|
|
162
|
+
ids.concat(@document.instances.filter_map(&:xmi_id))
|
|
163
|
+
|
|
164
|
+
# Recursively collect from packages (where most classes actually are)
|
|
165
|
+
@document.packages.each do |package|
|
|
166
|
+
ids.concat(collect_package_xmi_ids(package))
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
ids
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Recursively collect all xmi_ids from a package and its descendants
|
|
173
|
+
# @param package [Lutaml::Uml::Package] Package to collect from
|
|
174
|
+
# @return [Array<String>] All xmi_ids in package hierarchy
|
|
175
|
+
def collect_package_xmi_ids(package) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
176
|
+
ids = []
|
|
177
|
+
|
|
178
|
+
# Collect from package's elements
|
|
179
|
+
ids.concat(package.classes.filter_map(&:xmi_id)) if package.classes
|
|
180
|
+
ids.concat(package.enums.filter_map(&:xmi_id)) if package.enums
|
|
181
|
+
if package.data_types
|
|
182
|
+
ids.concat(package.data_types.filter_map(&:xmi_id))
|
|
183
|
+
end
|
|
184
|
+
if package.instances
|
|
185
|
+
ids.concat(package.instances.filter_map(&:xmi_id))
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Recursively collect from child packages
|
|
189
|
+
package.packages&.each do |child_package|
|
|
190
|
+
ids.concat(collect_package_xmi_ids(child_package))
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
ids
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# Check that all association references are valid
|
|
197
|
+
# @param warnings [Array<String>] Warning accumulator
|
|
198
|
+
def check_association_references(warnings) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
199
|
+
return if @document.associations.empty?
|
|
200
|
+
|
|
201
|
+
all_xmi_ids = collect_all_xmi_ids.to_set
|
|
202
|
+
invalid_associations = []
|
|
203
|
+
|
|
204
|
+
@document.associations.each do |assoc|
|
|
205
|
+
has_invalid_member = !check_association_end_valid?(
|
|
206
|
+
assoc, :member_end_xmi_id, all_xmi_ids
|
|
207
|
+
)
|
|
208
|
+
has_invalid_owner = !check_association_end_valid?(
|
|
209
|
+
assoc, :owner_end_xmi_id, all_xmi_ids
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
if has_invalid_member || has_invalid_owner
|
|
213
|
+
invalid_associations << assoc
|
|
214
|
+
if has_invalid_member
|
|
215
|
+
add_invalid_end_warning(assoc, :member_end_xmi_id, all_xmi_ids,
|
|
216
|
+
warnings)
|
|
217
|
+
end
|
|
218
|
+
if has_invalid_owner
|
|
219
|
+
add_invalid_end_warning(assoc, :owner_end_xmi_id, all_xmi_ids,
|
|
220
|
+
warnings)
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Remove invalid associations from document
|
|
226
|
+
unless invalid_associations.empty?
|
|
227
|
+
@document.associations.reject! do |a|
|
|
228
|
+
invalid_associations.include?(a)
|
|
229
|
+
end
|
|
230
|
+
warnings << "Removed #{invalid_associations.size} association(s) " \
|
|
231
|
+
"with invalid references"
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Check if association end reference is valid
|
|
236
|
+
# @param assoc [Lutaml::Uml::Association] Association
|
|
237
|
+
# @param attr [Symbol] Attribute to check (should be xmi_id attribute)
|
|
238
|
+
# @param valid_ids [Set<String>] Set of valid xmi_ids
|
|
239
|
+
# @return [Boolean] True if valid or nil
|
|
240
|
+
def check_association_end_valid?(assoc, attr, valid_ids)
|
|
241
|
+
value = assoc.send(attr)
|
|
242
|
+
return true if value.nil?
|
|
243
|
+
|
|
244
|
+
valid_ids.include?(value)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Add warning for invalid association end
|
|
248
|
+
# @param assoc [Lutaml::Uml::Association] Association
|
|
249
|
+
# @param attr [Symbol] Attribute to check (should be xmi_id attribute)
|
|
250
|
+
# @param valid_ids [Set<String>] Set of valid xmi_ids
|
|
251
|
+
# @param warnings [Array<String>] Warning accumulator
|
|
252
|
+
def add_invalid_end_warning(assoc, attr, valid_ids, warnings) # rubocop:disable Metrics/MethodLength
|
|
253
|
+
value = assoc.send(attr)
|
|
254
|
+
return if value.nil?
|
|
255
|
+
|
|
256
|
+
unless valid_ids.include?(value)
|
|
257
|
+
# Get the corresponding name attribute for better error messages
|
|
258
|
+
name_attr = attr.to_s.gsub("_xmi_id", "").to_sym
|
|
259
|
+
name_value = begin
|
|
260
|
+
assoc.send(name_attr)
|
|
261
|
+
rescue StandardError
|
|
262
|
+
nil
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
warnings << "Association #{assoc.xmi_id} references " \
|
|
266
|
+
"invalid #{name_attr}: #{name_value}"
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Custom validation error
|
|
271
|
+
class ValidationError < StandardError; end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|