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,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "element_presenter"
|
|
4
|
+
require_relative "presenter_factory"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module UmlRepository
|
|
8
|
+
module Presenters
|
|
9
|
+
# Presenter for UML Package elements.
|
|
10
|
+
#
|
|
11
|
+
# Formats package information for different output types:
|
|
12
|
+
# text, table rows, and structured data.
|
|
13
|
+
class PackagePresenter < ElementPresenter
|
|
14
|
+
# Generate detailed text view.
|
|
15
|
+
#
|
|
16
|
+
# @return [String] Multi-line formatted text
|
|
17
|
+
def to_text # rubocop:disable Metrics/AbcSize
|
|
18
|
+
lines = []
|
|
19
|
+
lines << "Package: #{element.name}"
|
|
20
|
+
lines << ("=" * 50)
|
|
21
|
+
lines << ""
|
|
22
|
+
lines << "Name: #{element.name}"
|
|
23
|
+
if element.respond_to?(:xmi_id)
|
|
24
|
+
lines << "XMI ID: #{element.xmi_id}"
|
|
25
|
+
end
|
|
26
|
+
lines.join("\n")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Generate structured hash.
|
|
30
|
+
#
|
|
31
|
+
# @return [Hash] Structured representation
|
|
32
|
+
def to_hash
|
|
33
|
+
data = {
|
|
34
|
+
type: "Package",
|
|
35
|
+
name: element.name,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
data[:xmi_id] = element.xmi_id if element.respond_to?(:xmi_id)
|
|
39
|
+
|
|
40
|
+
data
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Register with factory
|
|
45
|
+
PresenterFactory.register(Lutaml::Uml::Package, PackagePresenter)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "element_presenter"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module UmlRepository
|
|
7
|
+
module Presenters
|
|
8
|
+
# Factory for creating appropriate presenter for UML elements.
|
|
9
|
+
#
|
|
10
|
+
# Uses a registry pattern to map element classes to presenter classes.
|
|
11
|
+
# Automatically selects the correct presenter based on element type.
|
|
12
|
+
#
|
|
13
|
+
# @example Creating a presenter
|
|
14
|
+
# presenter = PresenterFactory.create(class_obj, repository)
|
|
15
|
+
# puts presenter.to_text
|
|
16
|
+
class PresenterFactory
|
|
17
|
+
@presenters = {}
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
# Create appropriate presenter for the given element.
|
|
21
|
+
#
|
|
22
|
+
# @param element [Object] UML element to present
|
|
23
|
+
# @param repository [UmlRepository, nil] Optional repository context
|
|
24
|
+
# @param context [Hash, nil] Optional context hash for presenter
|
|
25
|
+
# @return [ElementPresenter] Appropriate presenter instance
|
|
26
|
+
# @raise [ArgumentError] if no presenter registered for element
|
|
27
|
+
# type
|
|
28
|
+
def create(element, repository = nil, context = nil)
|
|
29
|
+
presenter_class = find_presenter_class(element)
|
|
30
|
+
presenter_class.new(element, repository, context)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Register a presenter class for an element class.
|
|
34
|
+
#
|
|
35
|
+
# @param element_class [Class] The UML element class
|
|
36
|
+
# @param presenter_class [Class] The presenter class to use
|
|
37
|
+
def register(element_class, presenter_class)
|
|
38
|
+
@presenters[element_class] = presenter_class
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Get all registered presenters.
|
|
42
|
+
#
|
|
43
|
+
# @return [Hash] Map of element classes to presenter classes
|
|
44
|
+
def presenters
|
|
45
|
+
@presenters
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# Find presenter class for element.
|
|
51
|
+
#
|
|
52
|
+
# Checks exact class match first, then inheritance chain.
|
|
53
|
+
#
|
|
54
|
+
# @param element [Object] Element to find presenter for
|
|
55
|
+
# @return [Class] Presenter class
|
|
56
|
+
# @raise [ArgumentError] if no presenter found
|
|
57
|
+
def find_presenter_class(element)
|
|
58
|
+
# Check exact class match
|
|
59
|
+
return @presenters[element.class] if
|
|
60
|
+
@presenters.key?(element.class)
|
|
61
|
+
|
|
62
|
+
# Check inheritance chain
|
|
63
|
+
element.class.ancestors.each do |ancestor|
|
|
64
|
+
return @presenters[ancestor] if @presenters.key?(ancestor)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# No presenter found
|
|
68
|
+
raise ArgumentError,
|
|
69
|
+
"No presenter registered for #{element.class}. " \
|
|
70
|
+
"Available: #{@presenters.keys.join(', ')}"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_query"
|
|
4
|
+
require_relative "inheritance_query"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module UmlRepository
|
|
8
|
+
module Queries
|
|
9
|
+
# Query service for association operations.
|
|
10
|
+
#
|
|
11
|
+
# Provides methods to find associations related to classes. Associations
|
|
12
|
+
# can be owned by classes or defined at the document level.
|
|
13
|
+
#
|
|
14
|
+
# @example Finding all associations for a class
|
|
15
|
+
# query = AssociationQuery.new(document, indexes)
|
|
16
|
+
# associations = query.find_for_class("ModelRoot::Building")
|
|
17
|
+
#
|
|
18
|
+
# @example Finding owned associations only
|
|
19
|
+
# associations = query.find_for_class(klass, owned_only: true)
|
|
20
|
+
#
|
|
21
|
+
# @example Finding associations in a specific direction
|
|
22
|
+
# associations = query.find_for_class(klass, direction: :source)
|
|
23
|
+
class AssociationQuery < BaseQuery
|
|
24
|
+
# Find associations for a specific class.
|
|
25
|
+
#
|
|
26
|
+
# @param class_or_qname [Lutaml::Uml::Class, String] The class object
|
|
27
|
+
# or qualified name string
|
|
28
|
+
# @param options [Hash] Query options
|
|
29
|
+
# @option options [Boolean] :owned_only Return only associations owned
|
|
30
|
+
# by the class (default: false)
|
|
31
|
+
# @option options [Boolean] :navigable_only Return only navigable
|
|
32
|
+
# associations (default: false)
|
|
33
|
+
# @option options [Symbol] :direction Filter by direction - :source
|
|
34
|
+
# (class is owner_end), :target (class is member_end), or :both
|
|
35
|
+
# (default: :both)
|
|
36
|
+
# @return [Array<Lutaml::Uml::Association>] Array of association objects
|
|
37
|
+
# @example
|
|
38
|
+
# # Get all associations
|
|
39
|
+
# all = query.find_for_class("ModelRoot::Building")
|
|
40
|
+
#
|
|
41
|
+
# # Get only owned associations
|
|
42
|
+
# owned = query.find_for_class(
|
|
43
|
+
# "ModelRoot::Building", owned_only: true)
|
|
44
|
+
#
|
|
45
|
+
# # Get associations where class is the source
|
|
46
|
+
# sources = query.find_for_class(
|
|
47
|
+
# "ModelRoot::Building", direction: :source)
|
|
48
|
+
def find_for_class(class_or_qname, options = {}) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
49
|
+
owned_only = options[:owned_only] || false
|
|
50
|
+
navigable_only = options[:navigable_only] || false
|
|
51
|
+
direction = options[:direction] || :both
|
|
52
|
+
|
|
53
|
+
klass = resolve_class(class_or_qname)
|
|
54
|
+
return [] unless klass
|
|
55
|
+
|
|
56
|
+
class_name = klass.name
|
|
57
|
+
results = []
|
|
58
|
+
|
|
59
|
+
# Get owned associations from the class itself
|
|
60
|
+
if klass.respond_to?(:associations) && klass.associations
|
|
61
|
+
results.concat(klass.associations)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Get associations from document level unless owned_only
|
|
65
|
+
if !owned_only &&
|
|
66
|
+
document.respond_to?(:associations) && document.associations
|
|
67
|
+
document_associations = document.associations.select do |assoc|
|
|
68
|
+
match_association?(assoc, class_name, direction)
|
|
69
|
+
end
|
|
70
|
+
results.concat(document_associations)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Filter navigable if requested
|
|
74
|
+
if navigable_only
|
|
75
|
+
results.select! { |assoc| navigable?(assoc) }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
results.uniq
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Find associations by their type.
|
|
82
|
+
#
|
|
83
|
+
# @param association_type [String] The type of association
|
|
84
|
+
# (e.g., "aggregation", "composition", "association")
|
|
85
|
+
# @return [Array<Lutaml::Uml::Association>] Array of association objects
|
|
86
|
+
def find_by_type(association_type)
|
|
87
|
+
resolve_all_associations.select do |assoc|
|
|
88
|
+
assoc.member_end_type == association_type
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def find_aggregations
|
|
93
|
+
find_by_type("aggregation")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def find_compositions
|
|
97
|
+
find_by_type("composition")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Find associations between two classes
|
|
101
|
+
#
|
|
102
|
+
# @param owner_end_xmi_id [String] XMI ID of the owner end class
|
|
103
|
+
# @param member_end_xmi_id [String] XMI ID of the member end class
|
|
104
|
+
# @return [Array<Lutaml::Uml::Association>] Array of association objects
|
|
105
|
+
def find_between_classes(owner_end_xmi_id, member_end_xmi_id)
|
|
106
|
+
resolve_all_associations.select do |assoc|
|
|
107
|
+
assoc.owner_end_xmi_id == owner_end_xmi_id &&
|
|
108
|
+
assoc.member_end_xmi_id == member_end_xmi_id
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Retrieve all associations in the document
|
|
113
|
+
#
|
|
114
|
+
# @return [Array<Lutaml::Uml::Association>] Array of all associations
|
|
115
|
+
def all
|
|
116
|
+
resolve_all_associations
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
private
|
|
120
|
+
|
|
121
|
+
# Resolve all associations in the document
|
|
122
|
+
#
|
|
123
|
+
# @return [Array<Lutaml::Uml::Association>] Array of all associations
|
|
124
|
+
def resolve_all_associations
|
|
125
|
+
indexes[:qualified_names].values.filter_map do |entity|
|
|
126
|
+
if entity.is_a?(Lutaml::Uml::Association)
|
|
127
|
+
entity
|
|
128
|
+
elsif entity.is_a?(Lutaml::Uml::Class) && entity.associations
|
|
129
|
+
entity.associations
|
|
130
|
+
end
|
|
131
|
+
end.flatten
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Resolve a class or qualified name to a class object
|
|
135
|
+
#
|
|
136
|
+
# @param class_or_qname [Lutaml::Uml::Class, String] The class object
|
|
137
|
+
# or qualified name string
|
|
138
|
+
# @return [Lutaml::Uml::Class, nil] The class object,
|
|
139
|
+
# or nil if not found
|
|
140
|
+
def resolve_class(class_or_qname)
|
|
141
|
+
if class_or_qname.is_a?(String)
|
|
142
|
+
indexes[:qualified_names][class_or_qname]
|
|
143
|
+
else
|
|
144
|
+
class_or_qname
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Check if an association matches the class name and direction
|
|
149
|
+
#
|
|
150
|
+
# @param assoc [Lutaml::Uml::Association] The association to check
|
|
151
|
+
# @param class_name [String] The class name to match
|
|
152
|
+
# @param direction [Symbol] The direction filter
|
|
153
|
+
# (:source, :target, :both)
|
|
154
|
+
# @return [Boolean] true if the association matches
|
|
155
|
+
def match_association?(assoc, class_name, direction) # rubocop:disable Metrics/MethodLength
|
|
156
|
+
case direction
|
|
157
|
+
when :source
|
|
158
|
+
# Class is the owner_end (source)
|
|
159
|
+
assoc.owner_end == class_name
|
|
160
|
+
when :target
|
|
161
|
+
# Class is the member_end (target)
|
|
162
|
+
assoc.member_end == class_name
|
|
163
|
+
when :both
|
|
164
|
+
# Class is either end
|
|
165
|
+
assoc.owner_end == class_name || assoc.member_end == class_name
|
|
166
|
+
else
|
|
167
|
+
false
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Check if an association is navigable
|
|
172
|
+
#
|
|
173
|
+
# An association is considered navigable if it has attribute names
|
|
174
|
+
# defined for navigation.
|
|
175
|
+
#
|
|
176
|
+
# @param assoc [Lutaml::Uml::Association] The association to check
|
|
177
|
+
# @return [Boolean] true if navigable
|
|
178
|
+
def navigable?(assoc)
|
|
179
|
+
# An association is navigable if it has member_end_attribute_name
|
|
180
|
+
# or owner_end_attribute_name defined
|
|
181
|
+
!assoc.member_end_attribute_name.nil? ||
|
|
182
|
+
!assoc.owner_end_attribute_name.nil?
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module UmlRepository
|
|
5
|
+
module Queries
|
|
6
|
+
# Base class for all query services.
|
|
7
|
+
#
|
|
8
|
+
# Provides common functionality for accessing the document and indexes
|
|
9
|
+
# that subclasses can use to implement specific query operations.
|
|
10
|
+
#
|
|
11
|
+
# @example Creating a custom query
|
|
12
|
+
# class CustomQuery < BaseQuery
|
|
13
|
+
# def find_something
|
|
14
|
+
# indexes[:qualified_names]["ModelRoot::MyClass"]
|
|
15
|
+
# end
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# query = CustomQuery.new(document, indexes)
|
|
19
|
+
# result = query.find_something
|
|
20
|
+
class BaseQuery
|
|
21
|
+
# Create a new query instance
|
|
22
|
+
#
|
|
23
|
+
# @param document [Lutaml::Uml::Document] The UML document to query
|
|
24
|
+
# @param indexes [Hash] The indexes built by IndexBuilder
|
|
25
|
+
def initialize(document, indexes)
|
|
26
|
+
@document = document
|
|
27
|
+
@indexes = indexes
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
attr_reader :document, :indexes
|
|
33
|
+
|
|
34
|
+
# Resolve all associations in the document
|
|
35
|
+
#
|
|
36
|
+
# @return [Array<Lutaml::Uml::Association>] Array of all associations
|
|
37
|
+
def find_class_by_id(class_id)
|
|
38
|
+
indexes[:qualified_names].find do |_qualified_name, entity|
|
|
39
|
+
entity.is_a?(Lutaml::Uml::Class) && entity.xmi_id == class_id
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_query"
|
|
4
|
+
require_relative "../../uml/qualified_name"
|
|
5
|
+
require_relative "../../uml/package_path"
|
|
6
|
+
|
|
7
|
+
module Lutaml
|
|
8
|
+
module UmlRepository
|
|
9
|
+
module Queries
|
|
10
|
+
# Query service for class/classifier operations.
|
|
11
|
+
#
|
|
12
|
+
# Provides methods to find and query classes, data types, and enums
|
|
13
|
+
# using the qualified_names and stereotypes indexes.
|
|
14
|
+
#
|
|
15
|
+
# @example Finding a class by qualified name
|
|
16
|
+
# query = ClassQuery.new(document, indexes)
|
|
17
|
+
# klass = query.find_by_qname("ModelRoot::i-UR::urf::Building")
|
|
18
|
+
#
|
|
19
|
+
# @example Finding classes by stereotype
|
|
20
|
+
# classes = query.find_by_stereotype("featureType")
|
|
21
|
+
#
|
|
22
|
+
# @example Getting classes in a package
|
|
23
|
+
# classes = query.in_package("ModelRoot::i-UR::urf")
|
|
24
|
+
class ClassQuery < BaseQuery
|
|
25
|
+
# Find a class by its qualified name.
|
|
26
|
+
#
|
|
27
|
+
# @param qualified_name_string [String] The qualified name
|
|
28
|
+
# (e.g., "ModelRoot::i-UR::urf::Building")
|
|
29
|
+
# @return [Lutaml::Uml::Class, Lutaml::Uml::DataType,
|
|
30
|
+
# Lutaml::Uml::Enum, nil]
|
|
31
|
+
# The class object, or nil if not found
|
|
32
|
+
# @example
|
|
33
|
+
# klass = query.find_by_qname("ModelRoot::i-UR::urf::Building")
|
|
34
|
+
def find_by_qname(qualified_name_string)
|
|
35
|
+
if qualified_name_string.nil? || qualified_name_string.empty?
|
|
36
|
+
return nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
indexes[:qualified_names][qualified_name_string]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Find all classes with a specific stereotype.
|
|
43
|
+
#
|
|
44
|
+
# @param stereotype [String] The stereotype to search for
|
|
45
|
+
# @return [Array] Array of class objects with the stereotype
|
|
46
|
+
# @example
|
|
47
|
+
# feature_types = query.find_by_stereotype("featureType")
|
|
48
|
+
# # => [Class{name: "Building"}, Class{name: "Road"}, ...]
|
|
49
|
+
def find_by_stereotype(stereotype)
|
|
50
|
+
return [] if stereotype.nil? || stereotype.empty?
|
|
51
|
+
|
|
52
|
+
indexes[:stereotypes][stereotype] || []
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Get classes in a specific package.
|
|
56
|
+
#
|
|
57
|
+
# @param package_path_string [String] The package path
|
|
58
|
+
# @param recursive [Boolean] Whether to include classes from nested
|
|
59
|
+
# packages (default: false)
|
|
60
|
+
# @return [Array] Array of class objects in the package
|
|
61
|
+
# @example Non-recursive query
|
|
62
|
+
# classes = query.in_package(
|
|
63
|
+
# "ModelRoot::i-UR::urf", recursive: false)
|
|
64
|
+
# # Returns only classes directly in the urf package
|
|
65
|
+
#
|
|
66
|
+
# @example Recursive query
|
|
67
|
+
# classes = query.in_package("ModelRoot::i-UR", recursive: true)
|
|
68
|
+
# # Returns classes in i-UR and all nested packages
|
|
69
|
+
def in_package(package_path_string, recursive: false) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
70
|
+
return [] if package_path_string.nil? || package_path_string.empty?
|
|
71
|
+
|
|
72
|
+
package_path = Lutaml::Uml::PackagePath.new(package_path_string)
|
|
73
|
+
results = []
|
|
74
|
+
|
|
75
|
+
# Check if the path is absolute (starts with ModelRoot)
|
|
76
|
+
is_absolute = package_path.absolute?
|
|
77
|
+
|
|
78
|
+
indexes[:qualified_names].each do |qname_string, klass| # rubocop:disable Metrics/BlockLength
|
|
79
|
+
qname = Lutaml::Uml::QualifiedName.new(qname_string)
|
|
80
|
+
|
|
81
|
+
matched = if is_absolute
|
|
82
|
+
# Absolute path - exact match
|
|
83
|
+
if recursive
|
|
84
|
+
qname.package_path.starts_with?(package_path)
|
|
85
|
+
else
|
|
86
|
+
qname.package_path == package_path
|
|
87
|
+
end
|
|
88
|
+
else
|
|
89
|
+
# Relative path - match if the class's package path ends with
|
|
90
|
+
# the given path
|
|
91
|
+
class_pkg_segs = qname.package_path.segments
|
|
92
|
+
search_segs = package_path.segments
|
|
93
|
+
|
|
94
|
+
if recursive
|
|
95
|
+
# For recursive, check if any suffix of the class path
|
|
96
|
+
# starts with search_segs
|
|
97
|
+
(0..(class_pkg_segs.size - search_segs.size))
|
|
98
|
+
.any? do |i|
|
|
99
|
+
class_pkg_segs[i, search_segs.size] == search_segs
|
|
100
|
+
end
|
|
101
|
+
else
|
|
102
|
+
# For non-recursive, check if class path ends with
|
|
103
|
+
# search_segs
|
|
104
|
+
class_pkg_segs.size >= search_segs.size &&
|
|
105
|
+
class_pkg_segs[-search_segs.size..] == search_segs
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
results << klass if matched
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
results
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_query"
|
|
4
|
+
require_relative "../../uml/package_path"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module UmlRepository
|
|
8
|
+
module Queries
|
|
9
|
+
# Query service for diagram operations.
|
|
10
|
+
#
|
|
11
|
+
# Provides methods to find and list diagrams from packages using the
|
|
12
|
+
# diagram_index which maps package IDs/paths to diagram collections.
|
|
13
|
+
#
|
|
14
|
+
# @example Finding diagrams in a package
|
|
15
|
+
# query = DiagramQuery.new(document, indexes)
|
|
16
|
+
# diagrams = query.in_package("ModelRoot::i-UR::urf")
|
|
17
|
+
#
|
|
18
|
+
# @example Finding a diagram by name
|
|
19
|
+
# diagram = query.find_by_name("Class Diagram")
|
|
20
|
+
#
|
|
21
|
+
# @example Getting all diagrams
|
|
22
|
+
# all_diagrams = query.all
|
|
23
|
+
class DiagramQuery < BaseQuery
|
|
24
|
+
# Get diagrams in a specific package.
|
|
25
|
+
#
|
|
26
|
+
# @param package_path_string [String] The package path
|
|
27
|
+
# @return [Array<Diagram>] Array of diagram objects in the package
|
|
28
|
+
# @example
|
|
29
|
+
# diagrams = query.in_package("ModelRoot::i-UR::urf")
|
|
30
|
+
def in_package(package_path_string) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
31
|
+
return [] if package_path_string.nil? || package_path_string.empty?
|
|
32
|
+
|
|
33
|
+
# Try to find diagrams by path
|
|
34
|
+
diagrams = indexes[:diagram_index][package_path_string]
|
|
35
|
+
return diagrams if diagrams
|
|
36
|
+
|
|
37
|
+
# Try to find the package and use its ID
|
|
38
|
+
package = indexes[:package_paths][package_path_string]
|
|
39
|
+
return [] unless package
|
|
40
|
+
|
|
41
|
+
package_id = package.respond_to?(:xmi_id) ? package.xmi_id : nil
|
|
42
|
+
return [] unless package_id
|
|
43
|
+
|
|
44
|
+
indexes[:diagram_index][package_id] || []
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Find a diagram by its name.
|
|
48
|
+
#
|
|
49
|
+
#
|
|
50
|
+
# @param diagram_name [String] The diagram name to search for
|
|
51
|
+
# @return Diagram The diagram object, or nil if not found
|
|
52
|
+
# @example
|
|
53
|
+
# diagram = query.find_by_name("Building Class Diagram")
|
|
54
|
+
def find_by_name(diagram_name)
|
|
55
|
+
indexes[:diagram_index].values.filter_map do |diagrams|
|
|
56
|
+
diagrams.select { |diagram| diagram.name == diagram_name }
|
|
57
|
+
end.flatten.first
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Find diagrams containing a specific package by its XMI ID.
|
|
61
|
+
#
|
|
62
|
+
# @param package_id [String] The XMI ID of the package
|
|
63
|
+
# @return [Array<Diagram>] Array of diagram objects
|
|
64
|
+
def find_by_package(package_id)
|
|
65
|
+
indexes[:diagram_index].values.filter_map do |diagrams|
|
|
66
|
+
diagrams.select { |diagram| diagram.package_id == package_id }
|
|
67
|
+
end.flatten
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Find diagrams containing a specific class by its XMI ID.
|
|
71
|
+
#
|
|
72
|
+
# @param class_xmi_id [String] The XMI ID of the class
|
|
73
|
+
# @return [Array<Diagram>] Array of diagram objects
|
|
74
|
+
def find_containing_class(class_xmi_id)
|
|
75
|
+
package = find_package_containing_class(class_xmi_id)
|
|
76
|
+
return [] unless package
|
|
77
|
+
|
|
78
|
+
find_by_package(package.xmi_id)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Find the package containing a specific class by its XMI ID.
|
|
82
|
+
#
|
|
83
|
+
# @param class_xmi_id [String] The XMI ID of the class
|
|
84
|
+
# @return [Lutaml::Uml::Package, nil] The package object
|
|
85
|
+
def find_package_containing_class(class_xmi_id)
|
|
86
|
+
qualified_name, _klass = find_class_by_id(class_xmi_id)
|
|
87
|
+
return nil unless qualified_name
|
|
88
|
+
|
|
89
|
+
package_path = qualified_name.split("::")[0..-2].join("::")
|
|
90
|
+
indexes[:package_paths][package_path]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Get all diagrams from all packages.
|
|
94
|
+
#
|
|
95
|
+
# @return [Array<Diagram>] Array of all diagram objects
|
|
96
|
+
# @example
|
|
97
|
+
# all_diagrams = query.all
|
|
98
|
+
# all_diagrams.each { |d| puts d.name }
|
|
99
|
+
def all
|
|
100
|
+
result = []
|
|
101
|
+
|
|
102
|
+
indexes[:diagram_index].each_value do |diagrams|
|
|
103
|
+
result.concat(diagrams)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
result
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|