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,357 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_query"
|
|
4
|
+
require_relative "../search_result"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module UmlRepository
|
|
8
|
+
module Queries
|
|
9
|
+
# Query service for search operations.
|
|
10
|
+
#
|
|
11
|
+
# Provides methods for fuzzy text search and regex pattern matching
|
|
12
|
+
# across classes, attributes, and associations in the UML model.
|
|
13
|
+
#
|
|
14
|
+
# @example Searching for text
|
|
15
|
+
# query = SearchQuery.new(document, indexes)
|
|
16
|
+
# results = query.search("Building")
|
|
17
|
+
# # => { classes: [...], attributes: [...], associations: [...],
|
|
18
|
+
# total: 15 }
|
|
19
|
+
#
|
|
20
|
+
# @example Pattern matching
|
|
21
|
+
# results = query.search("^Urban", type: :class)
|
|
22
|
+
class SearchQuery < BaseQuery
|
|
23
|
+
# Perform a fuzzy text search across the model.
|
|
24
|
+
#
|
|
25
|
+
# Searches for the query string in class names, attribute names, and
|
|
26
|
+
# association names. Can optionally search in documentation fields.
|
|
27
|
+
# The search is case-insensitive.
|
|
28
|
+
#
|
|
29
|
+
# @param query_string [String] The text to search for
|
|
30
|
+
# @param types [Array<Symbol>] Types to search in - :class, :attribute,
|
|
31
|
+
# :association (default: [:class, :attribute, :association])
|
|
32
|
+
# @param fields [Array<Symbol>] Fields to search in
|
|
33
|
+
# - :name, :documentation
|
|
34
|
+
# (default: [:name])
|
|
35
|
+
# @return [Hash] Search results with keys :classes, :attributes,
|
|
36
|
+
# :associations, :total
|
|
37
|
+
# @example
|
|
38
|
+
# results = query.search("building")
|
|
39
|
+
# results = query.search("urban", fields: [:name, :documentation])
|
|
40
|
+
def search( # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
41
|
+
query_string, types: %i[class attribute association],
|
|
42
|
+
fields: [:name], case_sensitive: false
|
|
43
|
+
)
|
|
44
|
+
return empty_result if query_string.nil? || query_string.empty?
|
|
45
|
+
|
|
46
|
+
results = {
|
|
47
|
+
classes: [],
|
|
48
|
+
attributes: [],
|
|
49
|
+
associations: [],
|
|
50
|
+
total: 0,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Search classes
|
|
54
|
+
if types.include?(:class)
|
|
55
|
+
results[:classes] = search_classes(
|
|
56
|
+
query_string, fields: fields, case_sensitive: case_sensitive
|
|
57
|
+
)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Search attributes
|
|
61
|
+
if types.include?(:attribute)
|
|
62
|
+
results[:attributes] = search_attributes(
|
|
63
|
+
query_string, fields: fields, case_sensitive: case_sensitive
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Search associations
|
|
68
|
+
if types.include?(:association)
|
|
69
|
+
results[:associations] = search_associations(
|
|
70
|
+
query_string, fields: fields, case_sensitive: case_sensitive
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
results[:total] = results[:classes].size +
|
|
75
|
+
results[:attributes].size +
|
|
76
|
+
results[:associations].size
|
|
77
|
+
|
|
78
|
+
results
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Perform a full-text search across all text fields.
|
|
82
|
+
# Searches for the query string in all relevant text fields of classes
|
|
83
|
+
# and packages.
|
|
84
|
+
#
|
|
85
|
+
# @param query_string [String] The text to search for
|
|
86
|
+
# @param fields [Array<Symbol>] Fields to search in - :name, :
|
|
87
|
+
def full_text_search( # rubocop:disable Metrics/MethodLength
|
|
88
|
+
query_string,
|
|
89
|
+
fields: [:name], case_sensitive: false
|
|
90
|
+
)
|
|
91
|
+
results = empty_full_text_search_result
|
|
92
|
+
if query_string.nil? || query_string.empty?
|
|
93
|
+
return results
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Search classes
|
|
97
|
+
results[:classes] = search_classes(
|
|
98
|
+
query_string, fields: fields, case_sensitive: case_sensitive
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Search packages
|
|
102
|
+
results[:packages] = search_packages(
|
|
103
|
+
query_string, case_sensitive: case_sensitive
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
results[:total] = results[:classes].size + results[:packages].size
|
|
107
|
+
|
|
108
|
+
results
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Search for classes matching the query
|
|
112
|
+
#
|
|
113
|
+
# @param query [String] Query string
|
|
114
|
+
# @param fields [Array<Symbol>] Fields to search in
|
|
115
|
+
# @return [Array<SearchResult>] Matching search result objects
|
|
116
|
+
def search_classes( # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
117
|
+
query, fields: %i[name documentation],
|
|
118
|
+
case_sensitive: false
|
|
119
|
+
)
|
|
120
|
+
pattern = regex_pattern_from_query(
|
|
121
|
+
query, case_sensitive: case_sensitive
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
indexes[:qualified_names].filter_map do |qname, entity|
|
|
125
|
+
match_field = nil
|
|
126
|
+
qualified_name = nil
|
|
127
|
+
|
|
128
|
+
next unless entity.is_a?(Lutaml::Uml::Class)
|
|
129
|
+
|
|
130
|
+
# Check fields for match
|
|
131
|
+
fields.each do |field|
|
|
132
|
+
if entity.respond_to?(field) &&
|
|
133
|
+
entity.send(field)&.match?(pattern)
|
|
134
|
+
|
|
135
|
+
match_field = field
|
|
136
|
+
qualified_name = qname
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
if match_field
|
|
141
|
+
SearchResult.new(
|
|
142
|
+
element: entity,
|
|
143
|
+
element_type: :class,
|
|
144
|
+
qualified_name: qualified_name,
|
|
145
|
+
package_path: extract_package_path(qualified_name),
|
|
146
|
+
match_field: match_field,
|
|
147
|
+
)
|
|
148
|
+
end
|
|
149
|
+
end.uniq
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def search_by_stereotype(query, case_sensitive: false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
153
|
+
pattern = regex_pattern_from_query(
|
|
154
|
+
query, case_sensitive: case_sensitive
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
matched_entities = indexes[:stereotypes]
|
|
158
|
+
.filter_map do |_stereotype, entities|
|
|
159
|
+
entities.select do |entity|
|
|
160
|
+
entity.respond_to?(:stereotype) &&
|
|
161
|
+
entity.stereotype&.match?(pattern)
|
|
162
|
+
end.uniq
|
|
163
|
+
end.uniq.flatten
|
|
164
|
+
|
|
165
|
+
matched_entities.map do |entity|
|
|
166
|
+
SearchResult.new(
|
|
167
|
+
element: entity,
|
|
168
|
+
element_type: entity.class.name.split("::").last.downcase,
|
|
169
|
+
qualified_name: "",
|
|
170
|
+
package_path: "",
|
|
171
|
+
match_field: :stereotype,
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Search for packages matching the query
|
|
177
|
+
#
|
|
178
|
+
# @param query [String] Query string
|
|
179
|
+
# @param case_sensitive [Boolean] Whether the search is case-sensitive
|
|
180
|
+
# @return [Array<Lutaml::Uml::Package>] Matching package objects
|
|
181
|
+
def search_packages(query, case_sensitive: false) # rubocop:disable Metrics/MethodLength
|
|
182
|
+
pattern = regex_pattern_from_query(
|
|
183
|
+
query, case_sensitive: case_sensitive
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
indexes[:package_paths].filter_map do |path_string, package|
|
|
187
|
+
if path_string.to_s.match?(pattern)
|
|
188
|
+
SearchResult.new(
|
|
189
|
+
element: package,
|
|
190
|
+
element_type: :package,
|
|
191
|
+
qualified_name: path_string,
|
|
192
|
+
package_path: path_string,
|
|
193
|
+
match_field: :package_path,
|
|
194
|
+
)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def regex_pattern_from_query(query, case_sensitive: false)
|
|
200
|
+
# handle wildcard '*' and glob patterns
|
|
201
|
+
query = query.gsub("*", ".*") unless query.include?(".*")
|
|
202
|
+
|
|
203
|
+
if case_sensitive
|
|
204
|
+
Regexp.new(query)
|
|
205
|
+
else
|
|
206
|
+
Regexp.new(query, Regexp::IGNORECASE)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Search for attributes matching the query
|
|
211
|
+
#
|
|
212
|
+
# @param query [String] Query string
|
|
213
|
+
# @param fields [Array<Symbol>] Fields to search in
|
|
214
|
+
# @return [Array<Lutaml::Uml::Class>] Matching search result objects
|
|
215
|
+
def search_attributes(query, fields: [:name], case_sensitive: false) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
216
|
+
pattern = regex_pattern_from_query(
|
|
217
|
+
query, case_sensitive: case_sensitive
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
indexes[:qualified_names].filter_map do |class_qname, entity| # rubocop:disable Metrics/BlockLength
|
|
221
|
+
next unless entity.respond_to?(:attributes) && entity.attributes
|
|
222
|
+
|
|
223
|
+
match_field = nil
|
|
224
|
+
match_attr = nil
|
|
225
|
+
qualified_name = nil
|
|
226
|
+
|
|
227
|
+
entity.attributes.each do |attr|
|
|
228
|
+
# Check attribute for match
|
|
229
|
+
fields.each do |field|
|
|
230
|
+
if attr.respond_to?(field) &&
|
|
231
|
+
attr.send(field)&.match?(pattern)
|
|
232
|
+
|
|
233
|
+
match_attr = attr
|
|
234
|
+
match_field = field
|
|
235
|
+
qualified_name = class_qname
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
if match_field
|
|
241
|
+
SearchResult.new(
|
|
242
|
+
element: match_attr,
|
|
243
|
+
element_type: :attribute,
|
|
244
|
+
qualified_name: "#{qualified_name}::#{match_attr.name}",
|
|
245
|
+
package_path: extract_package_path(qualified_name),
|
|
246
|
+
match_field: match_field,
|
|
247
|
+
match_context: {
|
|
248
|
+
"class_name" => entity&.name,
|
|
249
|
+
"class_qname" => qualified_name,
|
|
250
|
+
},
|
|
251
|
+
)
|
|
252
|
+
end
|
|
253
|
+
end.uniq
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# Get all associations in the model
|
|
257
|
+
#
|
|
258
|
+
# @return [Array<Lutaml::Uml::Association>] All association objects
|
|
259
|
+
def get_all_associations # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
260
|
+
all_associations = []
|
|
261
|
+
|
|
262
|
+
# Get all associations defined at document level and
|
|
263
|
+
if document.respond_to?(:associations) && document.associations
|
|
264
|
+
all_associations << document.associations
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Get all associations defined within classes
|
|
268
|
+
indexes[:qualified_names].each_value do |entity|
|
|
269
|
+
next unless entity.respond_to?(:associations) && entity.associations
|
|
270
|
+
|
|
271
|
+
all_associations << entity.associations
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
all_associations.flatten.uniq
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Search for associations matching the query
|
|
278
|
+
#
|
|
279
|
+
# @param query [String] Query string
|
|
280
|
+
# @param fields [Array<Symbol>] Fields to search in
|
|
281
|
+
# @return [Array<SearchResult>] Matching search result objects
|
|
282
|
+
def search_associations(query, # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
283
|
+
fields: %i[
|
|
284
|
+
name owner_end member_end owner_end_attribute_name
|
|
285
|
+
member_end_attribute_name documentation
|
|
286
|
+
],
|
|
287
|
+
case_sensitive: false)
|
|
288
|
+
all_associations = get_all_associations
|
|
289
|
+
pattern = regex_pattern_from_query(
|
|
290
|
+
query, case_sensitive: case_sensitive
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
all_associations.filter_map do |assoc|
|
|
294
|
+
match_field = nil
|
|
295
|
+
|
|
296
|
+
fields.each do |field|
|
|
297
|
+
if assoc.respond_to?(field) && assoc.send(field)&.match?(pattern)
|
|
298
|
+
match_field = field
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
if match_field
|
|
303
|
+
SearchResult.new(
|
|
304
|
+
element: assoc,
|
|
305
|
+
element_type: :association,
|
|
306
|
+
qualified_name: assoc.name || "(unnamed)",
|
|
307
|
+
package_path: "",
|
|
308
|
+
match_field: match_field,
|
|
309
|
+
match_context: {
|
|
310
|
+
"source" => assoc.owner_end,
|
|
311
|
+
"target" => assoc.member_end,
|
|
312
|
+
},
|
|
313
|
+
)
|
|
314
|
+
end
|
|
315
|
+
end.uniq
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
private
|
|
319
|
+
|
|
320
|
+
# Extract package path from qualified name
|
|
321
|
+
#
|
|
322
|
+
# @param qualified_name [String] Qualified name
|
|
323
|
+
# (e.g., "pkg1::pkg2::Class")
|
|
324
|
+
# @return [String] Package path (e.g., "pkg1::pkg2")
|
|
325
|
+
def extract_package_path(qualified_name)
|
|
326
|
+
parts = qualified_name.to_s.split("::")
|
|
327
|
+
return "" if parts.size <= 1
|
|
328
|
+
|
|
329
|
+
parts[0..-2].join("::")
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
# Return empty search result
|
|
333
|
+
#
|
|
334
|
+
# @return [Hash] Empty result hash
|
|
335
|
+
def empty_result
|
|
336
|
+
{
|
|
337
|
+
classes: [],
|
|
338
|
+
attributes: [],
|
|
339
|
+
associations: [],
|
|
340
|
+
total: 0,
|
|
341
|
+
}
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
# Return empty full text search result
|
|
345
|
+
#
|
|
346
|
+
# @return [Hash] Empty result hash
|
|
347
|
+
def empty_full_text_search_result
|
|
348
|
+
{
|
|
349
|
+
classes: [],
|
|
350
|
+
packages: [],
|
|
351
|
+
total: 0,
|
|
352
|
+
}
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module UmlRepository
|
|
5
|
+
module QueryDSL
|
|
6
|
+
module Conditions
|
|
7
|
+
# Base class for query conditions
|
|
8
|
+
#
|
|
9
|
+
# Provides the interface for filtering results in query operations.
|
|
10
|
+
# All concrete condition classes must implement the {#apply} method.
|
|
11
|
+
#
|
|
12
|
+
# @abstract Subclass and override {#apply} to implement a custom
|
|
13
|
+
# condition
|
|
14
|
+
class BaseCondition
|
|
15
|
+
# Apply the condition to filter results
|
|
16
|
+
#
|
|
17
|
+
# @param results [Array] The collection to filter
|
|
18
|
+
# @return [Array] The filtered collection
|
|
19
|
+
# @raise [NotImplementedError] if not implemented by subclass
|
|
20
|
+
def apply(results)
|
|
21
|
+
raise NotImplementedError,
|
|
22
|
+
"#{self.class} must implement #apply"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_condition"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module UmlRepository
|
|
7
|
+
module QueryDSL
|
|
8
|
+
module Conditions
|
|
9
|
+
# Block-based condition for custom filtering logic
|
|
10
|
+
#
|
|
11
|
+
# Allows arbitrary filtering logic to be specified using a Ruby block.
|
|
12
|
+
# The block receives each object and should return true/false.
|
|
13
|
+
#
|
|
14
|
+
# @example Filter by attribute count
|
|
15
|
+
# condition = BlockCondition.new { |c| c.attributes.size > 10 }
|
|
16
|
+
# filtered = condition.apply(classes)
|
|
17
|
+
#
|
|
18
|
+
# @example Complex filtering
|
|
19
|
+
# condition = BlockCondition.new do |c|
|
|
20
|
+
# c.attributes.any? && c.associations.empty?
|
|
21
|
+
# end
|
|
22
|
+
# filtered = condition.apply(classes)
|
|
23
|
+
class BlockCondition < BaseCondition
|
|
24
|
+
# Initialize with a filtering block
|
|
25
|
+
#
|
|
26
|
+
# @param block [Proc] The block to use for filtering
|
|
27
|
+
# @raise [ArgumentError] if no block provided
|
|
28
|
+
def initialize(&block)
|
|
29
|
+
super()
|
|
30
|
+
raise ArgumentError, "Block required" unless block
|
|
31
|
+
|
|
32
|
+
@block = block
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Apply block-based filtering to results
|
|
36
|
+
#
|
|
37
|
+
# @param results [Array] The collection to filter
|
|
38
|
+
# @return [Array] Objects for which block returns true
|
|
39
|
+
def apply(results)
|
|
40
|
+
results.select(&@block)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_condition"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module UmlRepository
|
|
7
|
+
module QueryDSL
|
|
8
|
+
module Conditions
|
|
9
|
+
# Hash-based condition for filtering query results
|
|
10
|
+
#
|
|
11
|
+
# Filters results based on attribute-value pairs specified in a hash.
|
|
12
|
+
# All conditions must match for an object to be included in results.
|
|
13
|
+
#
|
|
14
|
+
# @example Filter by stereotype
|
|
15
|
+
# condition = HashCondition.new(stereotype: 'featureType')
|
|
16
|
+
# filtered = condition.apply(classes)
|
|
17
|
+
#
|
|
18
|
+
# @example Multiple conditions
|
|
19
|
+
# condition = HashCondition.new(
|
|
20
|
+
# stereotype: 'featureType',
|
|
21
|
+
# is_abstract: false
|
|
22
|
+
# )
|
|
23
|
+
# filtered = condition.apply(classes)
|
|
24
|
+
class HashCondition < BaseCondition
|
|
25
|
+
# Initialize with hash conditions
|
|
26
|
+
#
|
|
27
|
+
# @param conditions [Hash] Attribute-value pairs to match
|
|
28
|
+
def initialize(conditions)
|
|
29
|
+
super()
|
|
30
|
+
@conditions = conditions
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Apply hash-based filtering to results
|
|
34
|
+
#
|
|
35
|
+
# @param results [Array] The collection to filter
|
|
36
|
+
# @return [Array] Objects matching all conditions
|
|
37
|
+
def apply(results)
|
|
38
|
+
results.select do |obj|
|
|
39
|
+
@conditions.all? do |key, value|
|
|
40
|
+
matches_condition?(obj, key, value)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# Check if object matches a single condition
|
|
48
|
+
#
|
|
49
|
+
# @param obj [Object] The object to check
|
|
50
|
+
# @param key [Symbol, String] The attribute name
|
|
51
|
+
# @param value [Object] The expected value
|
|
52
|
+
# @return [Boolean] true if condition matches
|
|
53
|
+
def matches_condition?(obj, key, value)
|
|
54
|
+
return false unless obj.respond_to?(key)
|
|
55
|
+
|
|
56
|
+
actual_value = obj.send(key)
|
|
57
|
+
compare_values(actual_value, value)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Compare actual and expected values
|
|
61
|
+
#
|
|
62
|
+
# @param actual [Object] The actual value from object
|
|
63
|
+
# @param expected [Object] The expected value
|
|
64
|
+
# @return [Boolean] true if values match
|
|
65
|
+
def compare_values(actual, expected) # rubocop:disable Metrics/MethodLength
|
|
66
|
+
case expected
|
|
67
|
+
when Regexp
|
|
68
|
+
expected.match?(actual.to_s)
|
|
69
|
+
when Proc
|
|
70
|
+
expected.call(actual)
|
|
71
|
+
else
|
|
72
|
+
# Handle array attributes (e.g., stereotype)
|
|
73
|
+
if actual.is_a?(Array)
|
|
74
|
+
actual.include?(expected)
|
|
75
|
+
else
|
|
76
|
+
actual == expected
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_condition"
|
|
4
|
+
require_relative "../../../uml/package_path"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module UmlRepository
|
|
8
|
+
module QueryDSL
|
|
9
|
+
module Conditions
|
|
10
|
+
# Package-based condition for filtering by package membership
|
|
11
|
+
#
|
|
12
|
+
# Filters results based on package path, with support for
|
|
13
|
+
# recursive (descendant) matching.
|
|
14
|
+
#
|
|
15
|
+
# @example Filter by exact package
|
|
16
|
+
# condition = PackageCondition.new(
|
|
17
|
+
# "ModelRoot::i-UR", recursive: false)
|
|
18
|
+
# filtered = condition.apply(classes)
|
|
19
|
+
#
|
|
20
|
+
# @example Filter by package and descendants
|
|
21
|
+
# condition = PackageCondition.new("ModelRoot::i-UR", recursive: true)
|
|
22
|
+
# filtered = condition.apply(classes)
|
|
23
|
+
class PackageCondition < BaseCondition
|
|
24
|
+
# Initialize with package path and recursion setting
|
|
25
|
+
#
|
|
26
|
+
# @param package_path [String, PackagePath]
|
|
27
|
+
# The package path to filter by
|
|
28
|
+
# @param recursive [Boolean] Whether to include descendants
|
|
29
|
+
def initialize(package_path, recursive: false)
|
|
30
|
+
super()
|
|
31
|
+
@package_path = if package_path.is_a?(PackagePath)
|
|
32
|
+
package_path
|
|
33
|
+
else
|
|
34
|
+
PackagePath.new(package_path)
|
|
35
|
+
end
|
|
36
|
+
@recursive = recursive
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Apply package-based filtering to results
|
|
40
|
+
#
|
|
41
|
+
# @param results [Array] The collection to filter
|
|
42
|
+
# @return [Array] Objects in the specified package
|
|
43
|
+
def apply(results)
|
|
44
|
+
results.select do |obj|
|
|
45
|
+
matches_package?(obj)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Check if object matches package condition
|
|
52
|
+
#
|
|
53
|
+
# @param obj [Object] The object to check
|
|
54
|
+
# @return [Boolean] true if object is in target package
|
|
55
|
+
def matches_package?(obj)
|
|
56
|
+
obj_package_path = extract_package_path(obj)
|
|
57
|
+
return false unless obj_package_path
|
|
58
|
+
|
|
59
|
+
if @recursive
|
|
60
|
+
obj_package_path.starts_with?(@package_path)
|
|
61
|
+
else
|
|
62
|
+
obj_package_path == @package_path
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Extract package path from object
|
|
67
|
+
#
|
|
68
|
+
# @param obj [Object] The object to extract path from
|
|
69
|
+
# @return [PackagePath, nil] The object's package path
|
|
70
|
+
def extract_package_path(obj)
|
|
71
|
+
return nil unless obj.respond_to?(:package_path)
|
|
72
|
+
|
|
73
|
+
path = obj.package_path
|
|
74
|
+
return nil unless path
|
|
75
|
+
|
|
76
|
+
path.is_a?(PackagePath) ? path : PackagePath.new(path)
|
|
77
|
+
rescue ArgumentError
|
|
78
|
+
nil
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module UmlRepository
|
|
5
|
+
module QueryDSL
|
|
6
|
+
# Order specification for sorting query results
|
|
7
|
+
#
|
|
8
|
+
# Sorts results based on a specified field and direction.
|
|
9
|
+
# Handles nil values by treating them as empty strings for comparison.
|
|
10
|
+
#
|
|
11
|
+
# @example Ascending order
|
|
12
|
+
# order = Order.new(:name, :asc)
|
|
13
|
+
# sorted = order.apply(classes)
|
|
14
|
+
#
|
|
15
|
+
# @example Descending order
|
|
16
|
+
# order = Order.new(:name, :desc)
|
|
17
|
+
# sorted = order.apply(classes)
|
|
18
|
+
class Order
|
|
19
|
+
VALID_DIRECTIONS = %i[asc desc].freeze
|
|
20
|
+
|
|
21
|
+
attr_reader :field, :direction
|
|
22
|
+
|
|
23
|
+
# Initialize with field and direction
|
|
24
|
+
#
|
|
25
|
+
# @param field [Symbol, String] The field to sort by
|
|
26
|
+
# @param direction [Symbol] The sort direction (:asc or :desc)
|
|
27
|
+
# @raise [ArgumentError] if direction is invalid
|
|
28
|
+
def initialize(field, direction = :asc)
|
|
29
|
+
@field = field.to_sym
|
|
30
|
+
@direction = validate_direction(direction)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Apply ordering to results
|
|
34
|
+
#
|
|
35
|
+
# @param results [Array] The collection to sort
|
|
36
|
+
# @return [Array] The sorted collection
|
|
37
|
+
def apply(results)
|
|
38
|
+
sorted = results.sort_by do |obj|
|
|
39
|
+
extract_sort_value(obj)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@direction == :desc ? sorted.reverse : sorted
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# Validate sort direction
|
|
48
|
+
#
|
|
49
|
+
# @param direction [Symbol] The direction to validate
|
|
50
|
+
# @return [Symbol] The validated direction
|
|
51
|
+
# @raise [ArgumentError] if direction is invalid
|
|
52
|
+
def validate_direction(direction)
|
|
53
|
+
dir = direction.to_sym
|
|
54
|
+
unless VALID_DIRECTIONS.include?(dir)
|
|
55
|
+
raise ArgumentError,
|
|
56
|
+
"Invalid direction: #{direction}. " \
|
|
57
|
+
"Must be one of #{VALID_DIRECTIONS.join(', ')}"
|
|
58
|
+
end
|
|
59
|
+
dir
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Extract sort value from object
|
|
63
|
+
#
|
|
64
|
+
# @param obj [Object] The object to extract value from
|
|
65
|
+
# @return [Object] The value to use for sorting
|
|
66
|
+
def extract_sort_value(obj)
|
|
67
|
+
return "" unless obj.respond_to?(@field)
|
|
68
|
+
|
|
69
|
+
value = obj.send(@field)
|
|
70
|
+
normalize_value(value)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Normalize value for sorting
|
|
74
|
+
#
|
|
75
|
+
# @param value [Object] The value to normalize
|
|
76
|
+
# @return [Object] The normalized value
|
|
77
|
+
def normalize_value(value)
|
|
78
|
+
case value
|
|
79
|
+
when nil
|
|
80
|
+
""
|
|
81
|
+
when String
|
|
82
|
+
value.downcase
|
|
83
|
+
else
|
|
84
|
+
value
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|