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,324 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "repositories/object_repository"
|
|
4
|
+
|
|
5
|
+
module Lutaml
|
|
6
|
+
module Qea
|
|
7
|
+
# Database container for all loaded EA models
|
|
8
|
+
#
|
|
9
|
+
# This class provides a unified container for all EA table collections
|
|
10
|
+
# loaded from a QEA database. It stores collections by name and provides
|
|
11
|
+
# accessor methods, statistics, and lookup functionality.
|
|
12
|
+
#
|
|
13
|
+
# @example Load and access database
|
|
14
|
+
# database = Lutaml::Qea::Services::DatabaseLoader.new("file.qea").load
|
|
15
|
+
# puts database.stats
|
|
16
|
+
# # => {"objects" => 693, "attributes" => 1910, ...}
|
|
17
|
+
#
|
|
18
|
+
# classes = database.objects.find_by_type("Class")
|
|
19
|
+
# obj = database.find_object(123)
|
|
20
|
+
class Database
|
|
21
|
+
# @return [Hash<Symbol, Array>] Collections of records by name
|
|
22
|
+
attr_reader :collections
|
|
23
|
+
|
|
24
|
+
# @return [String] Path to the QEA file
|
|
25
|
+
attr_reader :qea_path
|
|
26
|
+
|
|
27
|
+
# @return [SQLite3::Database, nil] Database connection
|
|
28
|
+
attr_reader :connection
|
|
29
|
+
|
|
30
|
+
def initialize(qea_path, connection = nil)
|
|
31
|
+
@qea_path = qea_path
|
|
32
|
+
@connection = connection
|
|
33
|
+
@collections = {}
|
|
34
|
+
@mutex = Mutex.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Set database connection
|
|
38
|
+
#
|
|
39
|
+
# @param connection [SQLite3::Database] Database connection
|
|
40
|
+
# @return [void]
|
|
41
|
+
def connection=(connection)
|
|
42
|
+
@connection = connection
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Add a collection to the database
|
|
46
|
+
#
|
|
47
|
+
# @param name [Symbol, String] Collection name (e.g., :objects)
|
|
48
|
+
# @param records [Array] Array of model instances
|
|
49
|
+
# @return [void]
|
|
50
|
+
def add_collection(name, records)
|
|
51
|
+
@mutex.synchronize do
|
|
52
|
+
@collections[name.to_sym] = records.freeze
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Get objects collection
|
|
57
|
+
#
|
|
58
|
+
# @return [Repositories::ObjectRepository] Repository for objects
|
|
59
|
+
def objects
|
|
60
|
+
return @objects if defined?(@objects)
|
|
61
|
+
|
|
62
|
+
@objects = Repositories::ObjectRepository.new(
|
|
63
|
+
@collections[:objects] || [],
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get attributes collection
|
|
68
|
+
#
|
|
69
|
+
# @return [Array<Models::EaAttribute>] Array of attributes
|
|
70
|
+
def attributes
|
|
71
|
+
@collections[:attributes] || []
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Get operations collection
|
|
75
|
+
#
|
|
76
|
+
# @return [Array<Models::EaOperation>] Array of operations
|
|
77
|
+
def operations
|
|
78
|
+
@collections[:operations] || []
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Get operation parameters collection
|
|
82
|
+
#
|
|
83
|
+
# @return [Array<Models::EaOperationParam>] Array of operation parameters
|
|
84
|
+
def operation_params
|
|
85
|
+
@collections[:operation_params] || []
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Get connectors collection
|
|
89
|
+
#
|
|
90
|
+
# @return [Array<Models::EaConnector>] Array of connectors
|
|
91
|
+
def connectors
|
|
92
|
+
@collections[:connectors] || []
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Get packages collection
|
|
96
|
+
#
|
|
97
|
+
# @return [Array<Models::EaPackage>] Array of packages
|
|
98
|
+
def packages
|
|
99
|
+
@collections[:packages] || []
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Get diagrams collection
|
|
103
|
+
#
|
|
104
|
+
# @return [Array<Models::EaDiagram>] Array of diagrams
|
|
105
|
+
def diagrams
|
|
106
|
+
@collections[:diagrams] || []
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Get diagram objects collection (visual placement)
|
|
110
|
+
#
|
|
111
|
+
# @return [Array<Models::EaDiagramObject>] Array of diagram objects
|
|
112
|
+
def diagram_objects
|
|
113
|
+
@collections[:diagram_objects] || []
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Get diagram links collection (visual routing)
|
|
117
|
+
#
|
|
118
|
+
# @return [Array<Models::EaDiagramLink>] Array of diagram links
|
|
119
|
+
def diagram_links
|
|
120
|
+
@collections[:diagram_links] || []
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Get object constraints collection
|
|
124
|
+
#
|
|
125
|
+
# @return [Array<Models::EaObjectConstraint>] Array of object
|
|
126
|
+
# constraints
|
|
127
|
+
def object_constraints
|
|
128
|
+
@collections[:object_constraints] || []
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Get tagged values collection
|
|
132
|
+
#
|
|
133
|
+
# @return [Array<Models::EaTaggedValue>] Array of tagged values
|
|
134
|
+
def tagged_values
|
|
135
|
+
@collections[:tagged_values] || []
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Get object properties collection
|
|
139
|
+
#
|
|
140
|
+
# @return [Array<Models::EaObjectProperty>] Array of object properties
|
|
141
|
+
def object_properties
|
|
142
|
+
@collections[:object_properties] || []
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Get attribute tags collection
|
|
146
|
+
#
|
|
147
|
+
# @return [Array<Models::EaAttributeTag>] Array of attribute tags
|
|
148
|
+
def attribute_tags
|
|
149
|
+
@collections[:attribute_tags] || []
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Get cross-references collection
|
|
153
|
+
#
|
|
154
|
+
# @return [Array<Models::EaXref>] Array of cross-references
|
|
155
|
+
def xrefs
|
|
156
|
+
@collections[:xrefs] || []
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Get stereotypes collection
|
|
160
|
+
#
|
|
161
|
+
# @return [Array<Models::EaStereotype>] Array of stereotype definitions
|
|
162
|
+
def stereotypes
|
|
163
|
+
@collections[:stereotypes] || []
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Get datatypes collection
|
|
167
|
+
#
|
|
168
|
+
# @return [Array<Models::EaDatatype>] Array of datatype definitions
|
|
169
|
+
def datatypes
|
|
170
|
+
@collections[:datatypes] || []
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Get constraint types collection (Priority 3 lookup table)
|
|
174
|
+
#
|
|
175
|
+
# @return [Array<Models::EaConstraintType>] Array of constraint type
|
|
176
|
+
# definitions
|
|
177
|
+
def constraint_types
|
|
178
|
+
@collections[:constraint_types] || []
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Get connector types collection (Priority 3 lookup table)
|
|
182
|
+
#
|
|
183
|
+
# @return [Array<Models::EaConnectorType>] Array of connector type
|
|
184
|
+
# definitions
|
|
185
|
+
def connector_types
|
|
186
|
+
@collections[:connector_types] || []
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Get diagram types collection (Priority 3 lookup table)
|
|
190
|
+
#
|
|
191
|
+
# @return [Array<Models::EaDiagramType>] Array of diagram type
|
|
192
|
+
# definitions
|
|
193
|
+
def diagram_types
|
|
194
|
+
@collections[:diagram_types] || []
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Get object types collection (Priority 3 lookup table)
|
|
198
|
+
#
|
|
199
|
+
# @return [Array<Models::EaObjectType>] Array of object type definitions
|
|
200
|
+
def object_types
|
|
201
|
+
@collections[:object_types] || []
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Get status types collection (Priority 3 lookup table)
|
|
205
|
+
#
|
|
206
|
+
# @return [Array<Models::EaStatusType>] Array of status type definitions
|
|
207
|
+
def status_types
|
|
208
|
+
@collections[:status_types] || []
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Get complexity types collection (Priority 3 lookup table)
|
|
212
|
+
#
|
|
213
|
+
# @return [Array<Models::EaComplexityType>] Array of complexity type
|
|
214
|
+
# definitions
|
|
215
|
+
def complexity_types
|
|
216
|
+
@collections[:complexity_types] || []
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Get documents collection (Priority 4)
|
|
220
|
+
#
|
|
221
|
+
# @return [Array<Models::EaDocument>] Array of document artifacts
|
|
222
|
+
def documents
|
|
223
|
+
@collections[:documents] || []
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Get scripts collection (Priority 4)
|
|
227
|
+
#
|
|
228
|
+
# @return [Array<Models::EaScript>] Array of behavioral scripts
|
|
229
|
+
def scripts
|
|
230
|
+
@collections[:scripts] || []
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# Get statistics for all collections
|
|
234
|
+
#
|
|
235
|
+
# @return [Hash<String, Integer>] Record counts by collection name
|
|
236
|
+
#
|
|
237
|
+
# @example
|
|
238
|
+
# database.stats
|
|
239
|
+
# # => {
|
|
240
|
+
# # "objects" => 693,
|
|
241
|
+
# # "attributes" => 1910,
|
|
242
|
+
# # "connectors" => 908,
|
|
243
|
+
# # ...
|
|
244
|
+
# # }
|
|
245
|
+
def stats
|
|
246
|
+
@collections.each_with_object({}) do |(name, records), hash|
|
|
247
|
+
hash[name.to_s] = records.size
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Get total number of records across all collections
|
|
252
|
+
#
|
|
253
|
+
# @return [Integer] Total record count
|
|
254
|
+
def total_records
|
|
255
|
+
@collections.values.sum(&:size)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# Find an object by ID
|
|
259
|
+
#
|
|
260
|
+
# @param id [Integer] Object ID
|
|
261
|
+
# @return [Models::EaObject, nil] The object or nil if not found
|
|
262
|
+
def find_object(id)
|
|
263
|
+
objects.find_by_key(:ea_object_id, id)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Find a package by ID
|
|
267
|
+
#
|
|
268
|
+
# @param id [Integer] Package ID
|
|
269
|
+
# @return [Models::EaPackage, nil] The package or nil if not found
|
|
270
|
+
def find_package(id)
|
|
271
|
+
packages.find { |pkg| pkg.package_id == id }
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
# Find an attribute by ID
|
|
275
|
+
#
|
|
276
|
+
# @param id [Integer] Attribute ID
|
|
277
|
+
# @return [Models::EaAttribute, nil] The attribute or nil if not found
|
|
278
|
+
def find_attribute(id)
|
|
279
|
+
attributes.find { |attr| attr.id == id }
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# Find a connector by ID
|
|
283
|
+
#
|
|
284
|
+
# @param id [Integer] Connector ID
|
|
285
|
+
# @return [Models::EaConnector, nil] The connector or nil if not found
|
|
286
|
+
def find_connector(id)
|
|
287
|
+
connectors.find { |conn| conn.connector_id == id }
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# Find a diagram by ID
|
|
291
|
+
#
|
|
292
|
+
# @param id [Integer] Diagram ID
|
|
293
|
+
# @return [Models::EaDiagram, nil] The diagram or nil if not found
|
|
294
|
+
def find_diagram(id)
|
|
295
|
+
diagrams.find { |diag| diag.diagram_id == id }
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# Check if database is empty
|
|
299
|
+
#
|
|
300
|
+
# @return [Boolean] true if no collections loaded
|
|
301
|
+
def empty?
|
|
302
|
+
@collections.empty? || total_records.zero?
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Get collection names
|
|
306
|
+
#
|
|
307
|
+
# @return [Array<Symbol>] Array of collection names
|
|
308
|
+
def collection_names
|
|
309
|
+
@collections.keys
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Freeze all collections to make database immutable
|
|
313
|
+
#
|
|
314
|
+
# @return [self]
|
|
315
|
+
def freeze
|
|
316
|
+
# Memoize repositories before freezing
|
|
317
|
+
objects
|
|
318
|
+
|
|
319
|
+
@collections.freeze
|
|
320
|
+
super
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require_relative "tagged_value_transformer"
|
|
5
|
+
require "lutaml/uml"
|
|
6
|
+
|
|
7
|
+
module Lutaml
|
|
8
|
+
module Qea
|
|
9
|
+
module Factory
|
|
10
|
+
# Transforms EA connectors (Association type) to UML associations
|
|
11
|
+
class AssociationTransformer < BaseTransformer
|
|
12
|
+
# Transform EA connector to UML association
|
|
13
|
+
# @param ea_connector [EaConnector] EA connector model
|
|
14
|
+
# @return [Lutaml::Uml::Association] UML association
|
|
15
|
+
def transform(ea_connector) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
16
|
+
return nil if ea_connector.nil?
|
|
17
|
+
return nil unless ea_connector.association?
|
|
18
|
+
|
|
19
|
+
Lutaml::Uml::Association.new.tap do |assoc| # rubocop:disable Metrics/BlockLength
|
|
20
|
+
# Map basic properties
|
|
21
|
+
assoc.name = ea_connector.name unless
|
|
22
|
+
ea_connector.name.nil? || ea_connector.name.empty?
|
|
23
|
+
assoc.xmi_id = normalize_guid_to_xmi_format(ea_connector.ea_guid,
|
|
24
|
+
"EAID")
|
|
25
|
+
|
|
26
|
+
# Map source (owner) end
|
|
27
|
+
source_obj = find_object(ea_connector.start_object_id)
|
|
28
|
+
if source_obj
|
|
29
|
+
assoc.owner_end = source_obj.name
|
|
30
|
+
assoc.owner_end_xmi_id = normalize_guid_to_xmi_format(
|
|
31
|
+
source_obj.ea_guid, "EAID"
|
|
32
|
+
)
|
|
33
|
+
assoc.owner_end_attribute_name = ea_connector.sourcerole
|
|
34
|
+
assoc.owner_end_cardinality = build_cardinality_from_string(
|
|
35
|
+
ea_connector.sourcecard,
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Map target (member) end
|
|
40
|
+
target_obj = find_object(ea_connector.end_object_id)
|
|
41
|
+
if target_obj
|
|
42
|
+
assoc.member_end = target_obj.name
|
|
43
|
+
assoc.member_end_xmi_id = normalize_guid_to_xmi_format(
|
|
44
|
+
target_obj.ea_guid, "EAID"
|
|
45
|
+
)
|
|
46
|
+
assoc.member_end_attribute_name = ea_connector.destrole
|
|
47
|
+
assoc.member_end_cardinality = build_cardinality_from_string(
|
|
48
|
+
ea_connector.destcard,
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Map definition/notes
|
|
53
|
+
assoc.definition = ea_connector.notes unless
|
|
54
|
+
ea_connector.notes.nil? || ea_connector.notes.empty?
|
|
55
|
+
|
|
56
|
+
# Map stereotype
|
|
57
|
+
if ea_connector.stereotype && !ea_connector.stereotype.empty?
|
|
58
|
+
assoc.stereotype = [ea_connector.stereotype]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Load and transform tagged values
|
|
62
|
+
assoc.tagged_values = load_tagged_values(ea_connector.ea_guid)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# Find object by ID
|
|
69
|
+
# @param object_id [Integer] Object ID
|
|
70
|
+
# @return [EaObject, nil] EA object or nil if not found
|
|
71
|
+
def find_object(object_id)
|
|
72
|
+
return nil if object_id.nil?
|
|
73
|
+
|
|
74
|
+
query = "SELECT * FROM t_object WHERE Object_ID = ?"
|
|
75
|
+
rows = database.connection.execute(query, object_id)
|
|
76
|
+
return nil if rows.empty?
|
|
77
|
+
|
|
78
|
+
Models::EaObject.from_db_row(rows.first)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Build cardinality from string
|
|
82
|
+
# @param cardinality_str [String] Cardinality string
|
|
83
|
+
# @return [Lutaml::Uml::Cardinality, nil] Cardinality object
|
|
84
|
+
def build_cardinality_from_string(cardinality_str)
|
|
85
|
+
return nil if cardinality_str.nil? || cardinality_str.empty?
|
|
86
|
+
|
|
87
|
+
parsed = parse_cardinality(cardinality_str)
|
|
88
|
+
return nil if parsed[:min].nil? && parsed[:max].nil?
|
|
89
|
+
|
|
90
|
+
Lutaml::Uml::Cardinality.new.tap do |card|
|
|
91
|
+
card.min = parsed[:min]
|
|
92
|
+
card.max = parsed[:max]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Load and transform tagged values for an association
|
|
97
|
+
# @param ea_guid [String] Element GUID
|
|
98
|
+
# @return [Array<Lutaml::Uml::TaggedValue>] UML tagged values
|
|
99
|
+
def load_tagged_values(ea_guid)
|
|
100
|
+
return [] if ea_guid.nil?
|
|
101
|
+
return [] unless database.tagged_values
|
|
102
|
+
|
|
103
|
+
# Filter tagged values for this element from the in-memory collection
|
|
104
|
+
ea_tags = database.tagged_values.select do |tag|
|
|
105
|
+
tag.element_id == ea_guid
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Transform to UML tagged values
|
|
109
|
+
tag_transformer = TaggedValueTransformer.new(database)
|
|
110
|
+
tag_transformer.transform_collection(ea_tags)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require "lutaml/uml"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Qea
|
|
8
|
+
module Factory
|
|
9
|
+
# Transforms EA AttributeTag to UML TaggedValue
|
|
10
|
+
#
|
|
11
|
+
# This transformer converts Enterprise Architect attribute tags
|
|
12
|
+
# (GML/XML Schema encoding metadata for attributes) to UML
|
|
13
|
+
# TaggedValue objects.
|
|
14
|
+
#
|
|
15
|
+
# @example Transform an attribute tag
|
|
16
|
+
# ea_tag = Models::EaAttributeTag.new(
|
|
17
|
+
# property_id: 1,
|
|
18
|
+
# element_id: 367,
|
|
19
|
+
# property: "isMetadata",
|
|
20
|
+
# value: "false"
|
|
21
|
+
# )
|
|
22
|
+
# transformer = AttributeTagTransformer.new
|
|
23
|
+
# uml_tag = transformer.transform(ea_tag)
|
|
24
|
+
class AttributeTagTransformer < BaseTransformer
|
|
25
|
+
# Transform EA attribute tag to UML TaggedValue
|
|
26
|
+
#
|
|
27
|
+
# Attribute tags enhance UML attributes with GML/XML encoding
|
|
28
|
+
# metadata. They are transformed into tagged values to preserve
|
|
29
|
+
# this semantic information.
|
|
30
|
+
#
|
|
31
|
+
# @param ea_tag [Models::EaAttributeTag] EA attribute tag
|
|
32
|
+
# @return [Lutaml::Uml::TaggedValue, nil] UML tagged value or nil
|
|
33
|
+
def transform(ea_tag)
|
|
34
|
+
return nil unless ea_tag
|
|
35
|
+
return nil unless ea_tag.property
|
|
36
|
+
|
|
37
|
+
Lutaml::Uml::TaggedValue.new.tap do |tag|
|
|
38
|
+
tag.name = ea_tag.property
|
|
39
|
+
tag.value = ea_tag.value || ""
|
|
40
|
+
tag.notes = format_notes(ea_tag)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
# Format notes from EA attribute tag
|
|
47
|
+
#
|
|
48
|
+
# @param ea_tag [Models::EaAttributeTag] EA tag
|
|
49
|
+
# @return [String, nil] Formatted notes
|
|
50
|
+
def format_notes(ea_tag)
|
|
51
|
+
return nil unless ea_tag.notes
|
|
52
|
+
|
|
53
|
+
# Clean up EA's note format
|
|
54
|
+
notes = ea_tag.notes.strip
|
|
55
|
+
notes.empty? ? nil : notes
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base_transformer"
|
|
4
|
+
require_relative "attribute_tag_transformer"
|
|
5
|
+
require "lutaml/uml"
|
|
6
|
+
|
|
7
|
+
module Lutaml
|
|
8
|
+
module Qea
|
|
9
|
+
module Factory
|
|
10
|
+
# Transforms EA attributes to UML attributes
|
|
11
|
+
class AttributeTransformer < BaseTransformer
|
|
12
|
+
# Transform EA attribute to UML attribute
|
|
13
|
+
# @param ea_attribute [EaAttribute] EA attribute model
|
|
14
|
+
# @return [Lutaml::Uml::TopElementAttribute] UML attribute
|
|
15
|
+
def transform(ea_attribute) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
16
|
+
return nil if ea_attribute.nil?
|
|
17
|
+
|
|
18
|
+
Lutaml::Uml::TopElementAttribute.new.tap do |attr|
|
|
19
|
+
attr.name = ea_attribute.name
|
|
20
|
+
attr.type = ea_attribute.type
|
|
21
|
+
attr.visibility = map_visibility(ea_attribute.scope)
|
|
22
|
+
|
|
23
|
+
# XMI uses the TYPE's XMI ID, not the attribute's ID
|
|
24
|
+
type_xmi_id = lookup_type_xmi_id(ea_attribute.classifier)
|
|
25
|
+
attr.xmi_id = type_xmi_id || normalize_guid_to_xmi_format(
|
|
26
|
+
ea_attribute.ea_guid, "EAID"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
attr.id = normalize_guid_to_xmi_format(ea_attribute.ea_guid, "EAID")
|
|
30
|
+
attr.static = ea_attribute.static? ? "true" : nil
|
|
31
|
+
attr.is_derived = ea_attribute.derived == "1"
|
|
32
|
+
|
|
33
|
+
# Map cardinality if bounds are present
|
|
34
|
+
if ea_attribute.lowerbound || ea_attribute.upperbound
|
|
35
|
+
attr.cardinality = build_cardinality(
|
|
36
|
+
ea_attribute.lowerbound,
|
|
37
|
+
ea_attribute.upperbound,
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Map definition/notes
|
|
42
|
+
attr.definition = normalize_line_endings(ea_attribute.notes) unless
|
|
43
|
+
ea_attribute.notes.nil? || ea_attribute.notes.empty?
|
|
44
|
+
|
|
45
|
+
# Load and transform attribute tags
|
|
46
|
+
attr.tagged_values = load_attribute_tags(ea_attribute.id)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
# Look up the type object's XMI ID from classifier
|
|
53
|
+
# @param classifier_id [Integer] Classifier ID
|
|
54
|
+
# @return [String, nil] Type's XMI ID
|
|
55
|
+
def lookup_type_xmi_id(classifier_id) # rubocop:disable Metrics/AbcSize
|
|
56
|
+
return nil if classifier_id.nil? || classifier_id.to_i.zero?
|
|
57
|
+
|
|
58
|
+
query = "SELECT ea_guid FROM t_object WHERE Object_ID = ?"
|
|
59
|
+
rows = database.connection.execute(query, [classifier_id])
|
|
60
|
+
return nil if rows.empty?
|
|
61
|
+
|
|
62
|
+
ea_guid = if rows.first.is_a?(Hash)
|
|
63
|
+
rows.first["ea_guid"] || rows.first[:ea_guid]
|
|
64
|
+
else
|
|
65
|
+
rows.first[0]
|
|
66
|
+
end
|
|
67
|
+
normalize_guid_to_xmi_format(ea_guid, "EAID")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Build cardinality from lower and upper bounds
|
|
71
|
+
# @param lower [String] Lower bound
|
|
72
|
+
# @param upper [String] Upper bound
|
|
73
|
+
# @return [Lutaml::Uml::Cardinality] Cardinality object
|
|
74
|
+
def build_cardinality(lower, upper)
|
|
75
|
+
return nil if lower.nil? && upper.nil?
|
|
76
|
+
|
|
77
|
+
Lutaml::Uml::Cardinality.new.tap do |card|
|
|
78
|
+
card.min = lower || "0"
|
|
79
|
+
card.max = upper || "*"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Load and transform attribute tags for an attribute
|
|
84
|
+
# @param attribute_id [Integer] Attribute ID
|
|
85
|
+
# @return [Array<Lutaml::Uml::TaggedValue>] UML tagged values
|
|
86
|
+
def load_attribute_tags(attribute_id)
|
|
87
|
+
return [] if attribute_id.nil?
|
|
88
|
+
return [] unless database.attribute_tags
|
|
89
|
+
|
|
90
|
+
# Filter attribute tags for this attribute from the in-memory
|
|
91
|
+
# collection
|
|
92
|
+
ea_tags = database.attribute_tags.select do |tag|
|
|
93
|
+
tag.element_id == attribute_id
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Transform to UML tagged values
|
|
97
|
+
tag_transformer = AttributeTagTransformer.new(database)
|
|
98
|
+
tag_transformer.transform_collection(ea_tags)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|