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,174 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_model"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module Qea
|
|
7
|
+
module Models
|
|
8
|
+
# Represents a cross-reference from the t_xref table in EA database
|
|
9
|
+
# Stores cross-references for stereotypes, properties, and relationships
|
|
10
|
+
# between UML elements
|
|
11
|
+
class EaXref < BaseModel
|
|
12
|
+
attribute :xref_id, Lutaml::Model::Type::String
|
|
13
|
+
attribute :name, Lutaml::Model::Type::String
|
|
14
|
+
attribute :xref_type, Lutaml::Model::Type::String
|
|
15
|
+
attribute :client, Lutaml::Model::Type::String
|
|
16
|
+
attribute :supplier, Lutaml::Model::Type::String
|
|
17
|
+
attribute :description, Lutaml::Model::Type::String
|
|
18
|
+
|
|
19
|
+
def self.primary_key_column
|
|
20
|
+
:xref_id
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.table_name
|
|
24
|
+
"t_xref"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Create from database row
|
|
28
|
+
#
|
|
29
|
+
# @param row [Hash] Database row with string keys
|
|
30
|
+
# @return [EaXref, nil] New instance or nil if row is nil
|
|
31
|
+
def self.from_db_row(row)
|
|
32
|
+
return nil if row.nil?
|
|
33
|
+
|
|
34
|
+
new(
|
|
35
|
+
xref_id: row["XrefID"],
|
|
36
|
+
name: row["Name"],
|
|
37
|
+
xref_type: row["Type"],
|
|
38
|
+
client: row["Client"],
|
|
39
|
+
supplier: row["Supplier"],
|
|
40
|
+
description: row["Description"],
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Convenience aliases
|
|
45
|
+
alias_method :id, :xref_id
|
|
46
|
+
alias_method :type, :xref_type
|
|
47
|
+
|
|
48
|
+
# Parse the Description field into structured data
|
|
49
|
+
#
|
|
50
|
+
# @return [Hash] Parsed description data
|
|
51
|
+
def parsed_description
|
|
52
|
+
return @parsed_description if defined?(@parsed_description)
|
|
53
|
+
|
|
54
|
+
@parsed_description = parse_description_field(description)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Check if this xref is for stereotypes
|
|
58
|
+
# @return [Boolean]
|
|
59
|
+
def stereotype?
|
|
60
|
+
name == "Stereotypes" || description&.include?("@STEREO")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Check if this xref is for custom properties
|
|
64
|
+
# @return [Boolean]
|
|
65
|
+
def custom_property?
|
|
66
|
+
!description&.include?("@STEREO") && !description&.include?("@TAG")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Check if this xref is for element properties
|
|
70
|
+
# @return [Boolean]
|
|
71
|
+
def element_property?
|
|
72
|
+
xref_type == "element property"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Check if this xref is for connector properties
|
|
76
|
+
# @return [Boolean]
|
|
77
|
+
def connector_property?
|
|
78
|
+
xref_type&.include?("connector") && xref_type.include?("property")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Check if this xref is for diagram properties
|
|
82
|
+
# @return [Boolean]
|
|
83
|
+
def diagram_property?
|
|
84
|
+
xref_type == "diagram properties"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Check if this xref is for attribute properties
|
|
88
|
+
# @return [Boolean]
|
|
89
|
+
def attribute_property?
|
|
90
|
+
xref_type == "attribute property"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# Parse Description field with various formats
|
|
96
|
+
#
|
|
97
|
+
# Formats:
|
|
98
|
+
# - @STEREO;Name=X;GUID={...};
|
|
99
|
+
# - @TAG;Name=X;Value=Y;GUID={...};
|
|
100
|
+
# - key=value;key=value;
|
|
101
|
+
#
|
|
102
|
+
# @param desc [String] Description field content
|
|
103
|
+
# @return [Hash] Parsed data
|
|
104
|
+
def parse_description_field(desc) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
105
|
+
return {} if desc.nil? || desc.empty?
|
|
106
|
+
|
|
107
|
+
result = { raw: desc }
|
|
108
|
+
|
|
109
|
+
# Detect format
|
|
110
|
+
if desc.start_with?("@STEREO")
|
|
111
|
+
result[:format] = :stereotype
|
|
112
|
+
result[:data] = parse_stereo_format(desc)
|
|
113
|
+
elsif desc.start_with?("@TAG")
|
|
114
|
+
result[:format] = :tag
|
|
115
|
+
result[:data] = parse_tag_format(desc)
|
|
116
|
+
else
|
|
117
|
+
result[:format] = :key_value
|
|
118
|
+
result[:data] = parse_key_value_format(desc)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
result
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Parse @STEREO format
|
|
125
|
+
# Example: @STEREO;Name=FeatureType;GUID={ABC...};
|
|
126
|
+
def parse_stereo_format(desc)
|
|
127
|
+
data = {}
|
|
128
|
+
parts = desc.sub(/^@STEREO;/, "").split(";")
|
|
129
|
+
|
|
130
|
+
parts.each do |part|
|
|
131
|
+
next if part.empty?
|
|
132
|
+
|
|
133
|
+
key, value = part.split("=", 2)
|
|
134
|
+
data[key.downcase.to_sym] = value if key && value
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
data
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Parse @TAG format
|
|
141
|
+
# Example: @TAG;Name=author;Value=John;GUID={...};
|
|
142
|
+
def parse_tag_format(desc)
|
|
143
|
+
data = {}
|
|
144
|
+
parts = desc.sub(/^@TAG;/, "").split(";")
|
|
145
|
+
|
|
146
|
+
parts.each do |part|
|
|
147
|
+
next if part.empty?
|
|
148
|
+
|
|
149
|
+
key, value = part.split("=", 2)
|
|
150
|
+
data[key.downcase.to_sym] = value if key && value
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
data
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Parse key=value format
|
|
157
|
+
# Example: aggregation=composite;direction=source;
|
|
158
|
+
def parse_key_value_format(desc)
|
|
159
|
+
data = {}
|
|
160
|
+
parts = desc.split(";")
|
|
161
|
+
|
|
162
|
+
parts.each do |part|
|
|
163
|
+
next if part.empty?
|
|
164
|
+
|
|
165
|
+
key, value = part.split("=", 2)
|
|
166
|
+
data[key.downcase.to_sym] = value if key && value
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
data
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../qea"
|
|
4
|
+
require_relative "services/database_loader"
|
|
5
|
+
require_relative "factory/ea_to_uml_factory"
|
|
6
|
+
|
|
7
|
+
module Lutaml
|
|
8
|
+
module Qea
|
|
9
|
+
# Parser class provides backward compatibility wrapper for Qea.parse
|
|
10
|
+
#
|
|
11
|
+
# This class exists for compatibility with older code that uses
|
|
12
|
+
# Qea::Parser.parse instead of the newer Qea.parse method.
|
|
13
|
+
#
|
|
14
|
+
# For validation use cases, this returns both database and document.
|
|
15
|
+
# For simple parsing, use Qea.parse directly which returns just document.
|
|
16
|
+
#
|
|
17
|
+
# @example Parse a QEA file for validation
|
|
18
|
+
# result = Lutaml::Qea::Parser.new.parse("model.qea")
|
|
19
|
+
# document = result[:document]
|
|
20
|
+
# database = result[:database]
|
|
21
|
+
#
|
|
22
|
+
# @see Qea.parse
|
|
23
|
+
class Parser
|
|
24
|
+
class << self
|
|
25
|
+
# Parse a QEA file and return document only
|
|
26
|
+
#
|
|
27
|
+
# This is a backward compatibility wrapper that delegates to Qea.parse
|
|
28
|
+
#
|
|
29
|
+
# @param qea_path [String] Path to the .qea file
|
|
30
|
+
# @param options [Hash] Transformation options
|
|
31
|
+
# @return [Lutaml::Uml::Document] Complete UML document
|
|
32
|
+
#
|
|
33
|
+
# @see Qea.parse
|
|
34
|
+
def parse(qea_path, options = {})
|
|
35
|
+
Qea.parse(qea_path, options)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Instance method for compatibility with test expectations
|
|
40
|
+
# @param qea_path [String] Path to the .qea file
|
|
41
|
+
# @param options [Hash] Transformation options
|
|
42
|
+
# @return [Hash] Hash with :database and :document keys
|
|
43
|
+
def parse(qea_path, options = {}) # rubocop:disable Metrics/MethodLength
|
|
44
|
+
# Load database
|
|
45
|
+
config = options[:config]
|
|
46
|
+
loader = Services::DatabaseLoader.new(qea_path, config)
|
|
47
|
+
database = loader.load
|
|
48
|
+
|
|
49
|
+
# Create document
|
|
50
|
+
factory = Factory::EaToUmlFactory.new(database, options)
|
|
51
|
+
document = factory.create_document
|
|
52
|
+
|
|
53
|
+
# Return both for validation support
|
|
54
|
+
{
|
|
55
|
+
database: database,
|
|
56
|
+
document: document,
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lutaml
|
|
4
|
+
module Qea
|
|
5
|
+
module Repositories
|
|
6
|
+
# Base repository for querying model collections
|
|
7
|
+
#
|
|
8
|
+
# This class provides common query methods for all model repositories.
|
|
9
|
+
# Subclasses can extend with model-specific query methods.
|
|
10
|
+
#
|
|
11
|
+
# @example Using base repository
|
|
12
|
+
# repository = BaseRepository.new(records)
|
|
13
|
+
# all_records = repository.all
|
|
14
|
+
# record = repository.find(123)
|
|
15
|
+
# filtered = repository.where { |r| r.name == "Test" }
|
|
16
|
+
class BaseRepository
|
|
17
|
+
include Enumerable
|
|
18
|
+
|
|
19
|
+
# @return [Array] The collection of records
|
|
20
|
+
attr_reader :records
|
|
21
|
+
|
|
22
|
+
# Initialize repository with a collection
|
|
23
|
+
#
|
|
24
|
+
# @param records [Array] Array of model instances
|
|
25
|
+
def initialize(records)
|
|
26
|
+
@records = records.freeze
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Iterates over all records
|
|
30
|
+
#
|
|
31
|
+
# @yield [record] Each record in the collection
|
|
32
|
+
# @return [Enumerator] if no block given
|
|
33
|
+
def each(&block)
|
|
34
|
+
return to_enum(:each) unless block
|
|
35
|
+
|
|
36
|
+
@records.each(&block)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Get all records
|
|
40
|
+
#
|
|
41
|
+
# @return [Array] All records in the collection
|
|
42
|
+
def all
|
|
43
|
+
@records
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Find a record by primary key
|
|
47
|
+
#
|
|
48
|
+
# @param id [Object] Primary key value
|
|
49
|
+
# @return [Object, nil] The record or nil if not found
|
|
50
|
+
def find(id)
|
|
51
|
+
@records.find { |record| record.primary_key == id }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Find a record by key and id
|
|
55
|
+
#
|
|
56
|
+
# @param key [Symbol] key attribute name
|
|
57
|
+
# @param id [Object] key value
|
|
58
|
+
# @return [Object, nil] The record or nil if not found
|
|
59
|
+
def find_by_key(key, id)
|
|
60
|
+
@records.find { |record| record.send(key) == id }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Filter records by conditions
|
|
64
|
+
#
|
|
65
|
+
# @param conditions [Hash] Hash of attribute/value pairs
|
|
66
|
+
# @yield [record] Optional block for custom filtering
|
|
67
|
+
# @yieldparam record [Object] Each record
|
|
68
|
+
# @yieldreturn [Boolean] true to include record
|
|
69
|
+
# @return [Array] Filtered records
|
|
70
|
+
#
|
|
71
|
+
# @example Hash conditions
|
|
72
|
+
# repository.where(name: "Test", type: "Class")
|
|
73
|
+
#
|
|
74
|
+
# @example Block condition
|
|
75
|
+
# repository.where { |r| r.name.start_with?("Test") }
|
|
76
|
+
def where(conditions = nil, &block) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
77
|
+
if block
|
|
78
|
+
@records.select(&block)
|
|
79
|
+
elsif conditions.is_a?(Hash)
|
|
80
|
+
@records.select do |record|
|
|
81
|
+
conditions.all? do |attr, value|
|
|
82
|
+
record.respond_to?(attr) && record.send(attr) == value
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
else
|
|
86
|
+
@records
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Count records
|
|
91
|
+
#
|
|
92
|
+
# @param conditions [Hash, nil] Optional conditions to filter
|
|
93
|
+
# @yield [record] Optional block for custom filtering
|
|
94
|
+
# @return [Integer] Number of records
|
|
95
|
+
#
|
|
96
|
+
# @example Count all
|
|
97
|
+
# repository.count
|
|
98
|
+
#
|
|
99
|
+
# @example Count with conditions
|
|
100
|
+
# repository.count(type: "Class")
|
|
101
|
+
#
|
|
102
|
+
# @example Count with block
|
|
103
|
+
# repository.count { |r| r.name.include?("Test") }
|
|
104
|
+
def count(conditions = nil, &block)
|
|
105
|
+
if block || conditions
|
|
106
|
+
where(conditions, &block).size
|
|
107
|
+
else
|
|
108
|
+
@records.size
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Find first record matching conditions
|
|
113
|
+
#
|
|
114
|
+
# @param conditions [Hash, nil] Optional conditions
|
|
115
|
+
# @yield [record] Optional block for custom filtering
|
|
116
|
+
# @return [Object, nil] First matching record or nil
|
|
117
|
+
#
|
|
118
|
+
# @example
|
|
119
|
+
# repository.find_first(name: "Test")
|
|
120
|
+
# repository.find_first { |r| r.name.start_with?("Test") }
|
|
121
|
+
def find_first(conditions = nil, &block)
|
|
122
|
+
where(conditions, &block).first
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Check if any records match conditions
|
|
126
|
+
#
|
|
127
|
+
# @param conditions [Hash, nil] Optional conditions
|
|
128
|
+
# @yield [record] Optional block for custom filtering
|
|
129
|
+
# @return [Boolean] true if any records match
|
|
130
|
+
def any?(conditions = nil, &block)
|
|
131
|
+
!where(conditions, &block).empty?
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Check if no records match conditions
|
|
135
|
+
#
|
|
136
|
+
# @param conditions [Hash, nil] Optional conditions
|
|
137
|
+
# @yield [record] Optional block for custom filtering
|
|
138
|
+
# @return [Boolean] true if no records match
|
|
139
|
+
def none?(conditions = nil, &block)
|
|
140
|
+
where(conditions, &block).empty?
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Select specific attributes from records
|
|
144
|
+
#
|
|
145
|
+
# @param attributes [Array<Symbol>] Attribute names to select
|
|
146
|
+
# @return [Array<Hash>] Array of hashes with selected attributes
|
|
147
|
+
#
|
|
148
|
+
# @example
|
|
149
|
+
# repository.pluck(:id, :name)
|
|
150
|
+
# # => [{id: 1, name: "Test"}, {id: 2, name: "Other"}]
|
|
151
|
+
def pluck(*attributes)
|
|
152
|
+
@records.map do |record|
|
|
153
|
+
attributes.each_with_object({}) do |attr, hash|
|
|
154
|
+
hash[attr] = record.send(attr) if record.respond_to?(attr)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Group records by an attribute
|
|
160
|
+
#
|
|
161
|
+
# @param attribute [Symbol] Attribute name to group by
|
|
162
|
+
# @return [Hash] Hash with attribute values as keys, arrays as values
|
|
163
|
+
#
|
|
164
|
+
# @example
|
|
165
|
+
# repository.group_by(:type)
|
|
166
|
+
# # => {"Class" => [obj1, obj2], "Interface" => [obj3]}
|
|
167
|
+
def group_by(attribute)
|
|
168
|
+
@records.group_by { |record| record.send(attribute) }
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Sort records by an attribute
|
|
172
|
+
#
|
|
173
|
+
# @param attribute [Symbol] Attribute name to sort by
|
|
174
|
+
# @param order [Symbol] :asc or :desc (default: :asc)
|
|
175
|
+
# @return [Array] Sorted records
|
|
176
|
+
#
|
|
177
|
+
# @example
|
|
178
|
+
# repository.order_by(:name)
|
|
179
|
+
# repository.order_by(:created_at, :desc)
|
|
180
|
+
def order_by(attribute, order = :asc)
|
|
181
|
+
sorted = @records.sort_by { |record| record.send(attribute) }
|
|
182
|
+
order == :desc ? sorted.reverse : sorted
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Get unique values for an attribute
|
|
186
|
+
#
|
|
187
|
+
# @param attribute [Symbol] Attribute name
|
|
188
|
+
# @return [Array] Unique values
|
|
189
|
+
#
|
|
190
|
+
# @example
|
|
191
|
+
# repository.distinct(:type)
|
|
192
|
+
# # => ["Class", "Interface", "Component"]
|
|
193
|
+
def distinct(attribute)
|
|
194
|
+
@records.map { |record| record.send(attribute) }.uniq
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Check if repository is empty
|
|
198
|
+
#
|
|
199
|
+
# @return [Boolean] true if no records
|
|
200
|
+
def empty?
|
|
201
|
+
@records.empty?
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Get the size of the collection
|
|
205
|
+
#
|
|
206
|
+
# @return [Integer] Number of records
|
|
207
|
+
def size
|
|
208
|
+
@records.size
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
alias length size
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_repository"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module Qea
|
|
7
|
+
module Repositories
|
|
8
|
+
# Repository for EaObject collection with type-specific queries
|
|
9
|
+
#
|
|
10
|
+
# This repository provides convenient methods for querying objects
|
|
11
|
+
# by type, package, and other common criteria.
|
|
12
|
+
#
|
|
13
|
+
# @example Query by type
|
|
14
|
+
# classes = repository.find_by_type("Class")
|
|
15
|
+
# interfaces = repository.interfaces
|
|
16
|
+
#
|
|
17
|
+
# @example Query by package
|
|
18
|
+
# pkg_objects = repository.find_by_package(5)
|
|
19
|
+
class ObjectRepository < BaseRepository
|
|
20
|
+
# Find objects by type
|
|
21
|
+
#
|
|
22
|
+
# @param object_type [String] The object type
|
|
23
|
+
# (e.g., "Class", "Interface")
|
|
24
|
+
# @return [Array<Models::EaObject>] Matching objects
|
|
25
|
+
#
|
|
26
|
+
# @example
|
|
27
|
+
# repository.find_by_type("Class")
|
|
28
|
+
# repository.find_by_type("Interface")
|
|
29
|
+
def find_by_type(object_type)
|
|
30
|
+
where(object_type: object_type)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Find objects by package ID
|
|
34
|
+
#
|
|
35
|
+
# @param package_id [Integer] The package ID
|
|
36
|
+
# @return [Array<Models::EaObject>] Objects in the package
|
|
37
|
+
def find_by_package(package_id)
|
|
38
|
+
where(package_id: package_id)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Find objects by stereotype
|
|
42
|
+
#
|
|
43
|
+
# @param stereotype [String] The stereotype name
|
|
44
|
+
# @return [Array<Models::EaObject>] Objects with the stereotype
|
|
45
|
+
def find_by_stereotype(stereotype)
|
|
46
|
+
where(stereotype: stereotype)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Get all UML classes
|
|
50
|
+
#
|
|
51
|
+
# @return [Array<Models::EaObject>] All Class objects
|
|
52
|
+
def classes
|
|
53
|
+
find_by_type("Class")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Get all interfaces
|
|
57
|
+
#
|
|
58
|
+
# @return [Array<Models::EaObject>] All Interface objects
|
|
59
|
+
def interfaces
|
|
60
|
+
find_by_type("Interface")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Get all enumerations
|
|
64
|
+
#
|
|
65
|
+
# @return [Array<Models::EaObject>] All Enumeration objects
|
|
66
|
+
def enumerations
|
|
67
|
+
find_by_type("Enumeration")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Get all components
|
|
71
|
+
#
|
|
72
|
+
# @return [Array<Models::EaObject>] All Component objects
|
|
73
|
+
def components
|
|
74
|
+
find_by_type("Component")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Get all data types
|
|
78
|
+
#
|
|
79
|
+
# @return [Array<Models::EaObject>] All DataType objects
|
|
80
|
+
def data_types
|
|
81
|
+
find_by_type("DataType")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Get all packages
|
|
85
|
+
#
|
|
86
|
+
# @return [Array<Models::EaObject>] All Package objects
|
|
87
|
+
def packages
|
|
88
|
+
find_by_type("Package")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Get all abstract objects
|
|
92
|
+
#
|
|
93
|
+
# @return [Array<Models::EaObject>] All abstract objects
|
|
94
|
+
def abstract_objects
|
|
95
|
+
where(&:abstract?)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Get all root objects
|
|
99
|
+
#
|
|
100
|
+
# @return [Array<Models::EaObject>] All root objects
|
|
101
|
+
def root_objects
|
|
102
|
+
where(&:root?)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Get all leaf objects
|
|
106
|
+
#
|
|
107
|
+
# @return [Array<Models::EaObject>] All leaf objects
|
|
108
|
+
def leaf_objects
|
|
109
|
+
where(&:leaf?)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Find objects by name pattern
|
|
113
|
+
#
|
|
114
|
+
# @param pattern [String, Regexp] Name pattern to match
|
|
115
|
+
# @return [Array<Models::EaObject>] Matching objects
|
|
116
|
+
#
|
|
117
|
+
# @example String match
|
|
118
|
+
# repository.find_by_name("MyClass")
|
|
119
|
+
#
|
|
120
|
+
# @example Regex match
|
|
121
|
+
# repository.find_by_name(/^Test/)
|
|
122
|
+
def find_by_name(pattern)
|
|
123
|
+
if pattern.is_a?(Regexp)
|
|
124
|
+
where { |obj| obj.name =~ pattern }
|
|
125
|
+
else
|
|
126
|
+
where(name: pattern)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Get objects created after a date
|
|
131
|
+
#
|
|
132
|
+
# @param date [String] Date in ISO format
|
|
133
|
+
# @return [Array<Models::EaObject>] Objects created after date
|
|
134
|
+
def created_after(date)
|
|
135
|
+
where { |obj| obj.createddate && obj.createddate > date }
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Get objects modified after a date
|
|
139
|
+
#
|
|
140
|
+
# @param date [String] Date in ISO format
|
|
141
|
+
# @return [Array<Models::EaObject>] Objects modified after date
|
|
142
|
+
def modified_after(date)
|
|
143
|
+
where { |obj| obj.modifieddate && obj.modifieddate > date }
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Get statistics by object type
|
|
147
|
+
#
|
|
148
|
+
# @return [Hash<String, Integer>] Count by object type
|
|
149
|
+
#
|
|
150
|
+
# @example
|
|
151
|
+
# repository.type_statistics
|
|
152
|
+
# # => {"Class" => 42, "Interface" => 15, ...}
|
|
153
|
+
def type_statistics
|
|
154
|
+
group_by(:object_type).transform_values(&:size)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Get statistics by package
|
|
158
|
+
#
|
|
159
|
+
# @return [Hash<Integer, Integer>] Count by package ID
|
|
160
|
+
def package_statistics
|
|
161
|
+
group_by(:package_id).transform_values(&:size)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Get all object types in the collection
|
|
165
|
+
#
|
|
166
|
+
# @return [Array<String>] Unique object types
|
|
167
|
+
def object_types
|
|
168
|
+
distinct(:object_type).compact
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Get all stereotypes in the collection
|
|
172
|
+
#
|
|
173
|
+
# @return [Array<String>] Unique stereotypes
|
|
174
|
+
def stereotypes
|
|
175
|
+
distinct(:stereotype).compact
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Find objects by visibility
|
|
179
|
+
#
|
|
180
|
+
# @param visibility [String] Visibility (e.g., "Public", "Private")
|
|
181
|
+
# @return [Array<Models::EaObject>] Objects with the visibility
|
|
182
|
+
def find_by_visibility(visibility)
|
|
183
|
+
where(visibility: visibility)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Get public objects
|
|
187
|
+
#
|
|
188
|
+
# @return [Array<Models::EaObject>] All public objects
|
|
189
|
+
def public_objects
|
|
190
|
+
find_by_visibility("Public")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Get private objects
|
|
194
|
+
#
|
|
195
|
+
# @return [Array<Models::EaObject>] All private objects
|
|
196
|
+
def private_objects
|
|
197
|
+
find_by_visibility("Private")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Get protected objects
|
|
201
|
+
#
|
|
202
|
+
# @return [Array<Models::EaObject>] All protected objects
|
|
203
|
+
def protected_objects
|
|
204
|
+
find_by_visibility("Protected")
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Search objects by name or alias
|
|
208
|
+
#
|
|
209
|
+
# @param query [String] Search query
|
|
210
|
+
# @return [Array<Models::EaObject>] Matching objects
|
|
211
|
+
def search(query)
|
|
212
|
+
query_downcase = query.downcase
|
|
213
|
+
where do |obj|
|
|
214
|
+
obj.name&.downcase&.include?(query_downcase) ||
|
|
215
|
+
obj.alias&.downcase&.include?(query_downcase)
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|