lutaml 0.10.18 → 0.11.2
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/release.yml +8 -1
- data/.gitignore +4 -0
- data/.rubocop_todo.yml +82 -161
- data/CLAUDE.md +32 -8
- data/Gemfile +14 -10
- data/Rakefile +6 -4
- data/lib/lutaml/version.rb +1 -1
- data/lib/lutaml.rb +3 -9
- data/lutaml.gemspec +2 -18
- metadata +5 -860
- data/Makefile +0 -2
- data/TODO.cleanups/05-replace-marshal-load.md +0 -37
- data/TODO.cleanups/06-replace-eval-in-tests.md +0 -41
- data/TODO.cleanups/10-split-large-files.md +0 -47
- data/config/diagram_styles.yml +0 -200
- data/config/model_transformations.yml +0 -266
- data/config/package_metadata.example.yml +0 -58
- data/config/qea_schema.yml +0 -1024
- data/config/static_site.yml +0 -166
- data/examples/UML_EA.DTD +0 -6856
- 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 +0 -220
- data/examples/lur_cli_workflow.rb +0 -262
- data/examples/lur_statistics.rb +0 -325
- 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 +0 -230
- 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 +0 -118121
- data/examples/xmi/ArcGISWorkspace_template.xmi +0 -1467
- data/examples/xmi/Images/EAID_0016F797_D055_4717_AF1A_606413D0A166.svg +0 -158
- data/examples/xmi/Images/EAID_00C5C772_5A03_434f_BF30_AC37542A1AAC.svg +0 -659
- data/examples/xmi/Images/EAID_0114FD24_9E58_4664_98CD_71305B59AD11.svg +0 -411
- data/examples/xmi/Images/EAID_01661E1B_31B6_4167_BCCF_A00678FB4EA2.svg +0 -102
- data/examples/xmi/Images/EAID_039FE004_5408_4fc0_89AA_EB319E4F61C7.svg +0 -169
- data/examples/xmi/Images/EAID_04EE9625_17A0_4721_BC71_21756DB21D06.svg +0 -403
- data/examples/xmi/Images/EAID_05FF9417_1619_4170_B0C9_55AA6B988EF1.svg +0 -175
- data/examples/xmi/Images/EAID_09853FB2_AF8A_432f_94C5_6C47461BD937.svg +0 -360
- data/examples/xmi/Images/EAID_09927B7F_A657_4819_99E5_AC9DC99227D9.svg +0 -195
- data/examples/xmi/Images/EAID_09AF6B8A_557C_43bc_BBB0_47C1E9401EF3.svg +0 -218
- data/examples/xmi/Images/EAID_0BE81AC5_031B_4973_A9A0_223CCD92BAA1.svg +0 -471
- data/examples/xmi/Images/EAID_0EDEA6EF_4DC8_4979_BB80_28B1B9EBD1D4.svg +0 -56
- data/examples/xmi/Images/EAID_0F413534_6AD2_48bc_B4AF_8699D530D91D.svg +0 -262
- data/examples/xmi/Images/EAID_1321F39B_AD67_47b5_B5C3_3A42BBFCBDF9.svg +0 -286
- data/examples/xmi/Images/EAID_13E09C71_99E7_40b4_B72D_48AF6379BC2E.svg +0 -164
- data/examples/xmi/Images/EAID_144955D8_CB4E_4b59_BB0C_E549F7F84943.svg +0 -66
- data/examples/xmi/Images/EAID_14E9F5FD_F6CD_4f48_B1CD_F5A40C6D8E83.svg +0 -95
- data/examples/xmi/Images/EAID_157826AA_96A7_4278_89A6_94BD0F31409A.svg +0 -63
- data/examples/xmi/Images/EAID_159E9DA0_7A54_4817_B72A_401C750F675D.svg +0 -306
- data/examples/xmi/Images/EAID_17BC8309_8051_492b_BE87_61CCFE83DB16.svg +0 -45
- data/examples/xmi/Images/EAID_1A10EB6D_E2E5_42a6_A31E_B293D93FD07E.svg +0 -193
- data/examples/xmi/Images/EAID_1A290AFD_CE96_46a2_8351_A986D77CC727.svg +0 -444
- data/examples/xmi/Images/EAID_1B2D9309_C66B_492a_995C_95B2B02E0D7C.svg +0 -168
- data/examples/xmi/Images/EAID_1DE6B973_CE8A_416f_909B_54CEA1E5944E.svg +0 -10
- data/examples/xmi/Images/EAID_204F4ACC_2230_4c8d_9861_EF5A6844B712.svg +0 -60
- data/examples/xmi/Images/EAID_227300E2_4F4B_4955_83B9_FA626CE8680B.svg +0 -188
- data/examples/xmi/Images/EAID_22C24D4C_4894_480a_B113_0CB034CB59E9.svg +0 -426
- data/examples/xmi/Images/EAID_234BC4F5_8100_4969_BDCB_A24E0E641F23.svg +0 -169
- data/examples/xmi/Images/EAID_24446BFC_9FEB_4935_8970_65A4C562A93F.svg +0 -277
- data/examples/xmi/Images/EAID_24E8A45C_C99F_49b7_860A_9CF65FF76C76.svg +0 -575
- data/examples/xmi/Images/EAID_272F3181_4300_48b7_98A0_A8CFD12B1A72.svg +0 -255
- data/examples/xmi/Images/EAID_292E0D94_392C_4da6_A0B5_841501FAE50A.svg +0 -183
- data/examples/xmi/Images/EAID_29DD0967_ADAB_4abb_99C5_544821F5E7DA.svg +0 -10
- data/examples/xmi/Images/EAID_2A339928_E5EF_4ed2_9E5D_CC2CA5CF248B.svg +0 -310
- data/examples/xmi/Images/EAID_2A5E0832_06BE_4381_85D4_9B00E4F95575.svg +0 -155
- data/examples/xmi/Images/EAID_2AAB709F_EFCE_496f_8AFE_92809D66A0A9.svg +0 -81
- data/examples/xmi/Images/EAID_2C8DD882_8DEA_4065_89F8_DDA796AA0C85.svg +0 -520
- data/examples/xmi/Images/EAID_2E98EA19_37D8_4b70_BDCE_CFEE4FA800B0.svg +0 -173
- data/examples/xmi/Images/EAID_30D62231_110F_44e8_9C06_6FCDCBA53A09.svg +0 -722
- data/examples/xmi/Images/EAID_3206D3FD_1FC4_41c7_8D00_36DB908E9319.svg +0 -181
- data/examples/xmi/Images/EAID_3452CC53_9ACB_44eb_9C9D_B90CF862F284.svg +0 -92
- data/examples/xmi/Images/EAID_348EE46E_ABD9_40b0_82A1_0285E75BDC52.svg +0 -187
- data/examples/xmi/Images/EAID_34FF671B_CFDC_47ad_91DF_ECA6D8358180.svg +0 -217
- data/examples/xmi/Images/EAID_359DD694_0100_4bdf_AD5F_712D97E9C69B.svg +0 -157
- data/examples/xmi/Images/EAID_35DE714C_49A8_490e_913A_56F39EF317F9.svg +0 -180
- data/examples/xmi/Images/EAID_360C79F1_8EDF_41db_A069_DECDC55625BC.svg +0 -31
- data/examples/xmi/Images/EAID_36913C58_FF35_4ba2_A04B_9A4824E24609.svg +0 -166
- data/examples/xmi/Images/EAID_372F7F7B_57ED_469a_A640_70DB578B3C56.svg +0 -361
- data/examples/xmi/Images/EAID_37AC19B9_8433_4fee_A326_763170D54D06.svg +0 -32
- data/examples/xmi/Images/EAID_38170608_32B5_4a6f_A68D_A0D7C0C9D019.svg +0 -234
- data/examples/xmi/Images/EAID_3A77A5D0_4E1B_4116_8AAD_407FC422B47F.svg +0 -183
- data/examples/xmi/Images/EAID_3B8BD087_1683_46b1_8D0D_6F839C46C578.svg +0 -42
- data/examples/xmi/Images/EAID_3DC20801_AE8B_4e76_B08C_F574E8A90E13.svg +0 -192
- data/examples/xmi/Images/EAID_3DE28C70_C6D4_406c_B49F_EEF52148C8C1.svg +0 -124
- data/examples/xmi/Images/EAID_458E093C_BA2B_4292_BEC4_37511C163DDC.svg +0 -140
- data/examples/xmi/Images/EAID_45F9B1F7_E568_47c9_B229_953BC2E707E4.svg +0 -266
- data/examples/xmi/Images/EAID_46B3041A_8C23_46e6_8E14_ADE7012274C5.svg +0 -80
- data/examples/xmi/Images/EAID_47E4600F_CEC9_4245_9BF5_EE38007A9DDB.svg +0 -584
- data/examples/xmi/Images/EAID_4881CEEE_792C_4cb0_BEA7_54333B643D0A.svg +0 -155
- data/examples/xmi/Images/EAID_48D364F0_DCA4_41e8_B4D4_509B3023B969.svg +0 -17
- data/examples/xmi/Images/EAID_4DBDAB9E_4C1C_4cb1_A767_06BD743A50A7.svg +0 -78
- data/examples/xmi/Images/EAID_4EB75007_B31D_4f2c_8855_7E9D3A3B17F4.svg +0 -454
- data/examples/xmi/Images/EAID_4F421236_FCF3_4aae_B22A_C7E6A5EFBAC7.svg +0 -81
- data/examples/xmi/Images/EAID_4FC1D352_2102_4b73_BCB0_1410B29C6BD7.svg +0 -379
- data/examples/xmi/Images/EAID_4FE346EA_01E1_4b30_8BE6_BB32EA191E47.svg +0 -126
- data/examples/xmi/Images/EAID_5038EEE3_7DD0_4cca_9829_364E044D37E8.svg +0 -199
- data/examples/xmi/Images/EAID_508A37DC_9378_4f5a_BD96_48F4D24E03A5.svg +0 -162
- data/examples/xmi/Images/EAID_516DA1A2_F0EC_415c_9664_E4CA54E7F05C.svg +0 -136
- data/examples/xmi/Images/EAID_52A1DBD3_D3DA_4b6d_8F96_FC6F39F64242.svg +0 -161
- data/examples/xmi/Images/EAID_575E87BA_32E9_4a84_AA4E_0EFDFC5D4C07.svg +0 -71
- data/examples/xmi/Images/EAID_57E0F1A0_6C72_47ef_B922_B806F9A875E8.svg +0 -209
- data/examples/xmi/Images/EAID_5957C373_3FC1_482f_8F35_D809153A17F5.svg +0 -123
- data/examples/xmi/Images/EAID_59A66AE2_412C_48a6_BFC7_EA56CF11D269.svg +0 -218
- data/examples/xmi/Images/EAID_5A43833E_680B_4a90_8931_0C902304E029.svg +0 -236
- data/examples/xmi/Images/EAID_5D6DB5A0_5047_4bac_9E60_69904A60B56D.svg +0 -353
- data/examples/xmi/Images/EAID_5DA1E7A7_8E59_4803_A831_E9F3EC27328F.svg +0 -242
- data/examples/xmi/Images/EAID_5E2C1E2A_82A8_47f4_B2ED_1398D72BFCFD.svg +0 -246
- data/examples/xmi/Images/EAID_6052620C_4BD5_49f6_A21C_AD7E6DCA2795.svg +0 -290
- data/examples/xmi/Images/EAID_6481E2CC_35A6_43b0_88D4_10A667A2BC2D.svg +0 -60
- data/examples/xmi/Images/EAID_660C7D03_A26C_4977_A7BA_9D0A773DA811.svg +0 -318
- data/examples/xmi/Images/EAID_671F3C3D_35B6_4514_B5B6_DD7E84925493.svg +0 -24
- data/examples/xmi/Images/EAID_676B9C9A_D85F_4d2f_A46B_73F02090DC87.svg +0 -127
- data/examples/xmi/Images/EAID_6797FEFA_5801_48e4_8B9C_3C824C0E165D.svg +0 -412
- data/examples/xmi/Images/EAID_6807F4EE_18EF_4e7e_ACCF_D5BD323AFDE9.svg +0 -130
- data/examples/xmi/Images/EAID_69E81E34_CF28_4c7f_A48F_5941BA85CEE3.svg +0 -96
- data/examples/xmi/Images/EAID_6A3C55E8_3C3C_4f3a_8AAC_0299C5B23070.svg +0 -10
- data/examples/xmi/Images/EAID_6BAC333E_E2C2_42c7_8DDF_6B4FA0FFC03B.svg +0 -143
- data/examples/xmi/Images/EAID_6D0349D5_3F1B_4b28_82D2_910743DEB5E5.svg +0 -114
- data/examples/xmi/Images/EAID_6E95B74E_8A09_4698_9E9E_23BCFD2CE194.svg +0 -37
- data/examples/xmi/Images/EAID_70C77F92_5614_4b22_8C8E_67859F59D8FD.svg +0 -254
- data/examples/xmi/Images/EAID_71F9216B_E7A7_4083_B08E_6C71B57F3A1F.svg +0 -187
- data/examples/xmi/Images/EAID_73025C5A_08FC_47ff_AB2F_C7F79CF54B41.svg +0 -145
- data/examples/xmi/Images/EAID_74C974B6_6D07_425d_B7AC_C8899E3B4967.svg +0 -76
- data/examples/xmi/Images/EAID_7504FCD2_524C_4e7d_BAE4_4E58A8A8A12C.svg +0 -196
- data/examples/xmi/Images/EAID_78030266_3603_4747_9D75_03D16614BE7D.svg +0 -35
- data/examples/xmi/Images/EAID_785226C1_12B1_4104_A4C1_F19B70B9FB71.svg +0 -348
- data/examples/xmi/Images/EAID_7854470F_26B8_4d3c_AFDF_C05BCE6ED0CD.svg +0 -72
- data/examples/xmi/Images/EAID_794F4A8F_18CA_4e9f_8477_A6F0E5ED22D4.svg +0 -187
- data/examples/xmi/Images/EAID_7A24839E_C8AE_424d_B7D2_6DA16DC813E7.svg +0 -114
- data/examples/xmi/Images/EAID_7A3649FD_E960_4ae6_B9B1_A9001C066AE7.svg +0 -181
- data/examples/xmi/Images/EAID_7B2C6765_AB68_439a_87F3_DAC323CB2AF5.svg +0 -196
- data/examples/xmi/Images/EAID_7C44AC09_27C1_47b3_9A85_88EC71C081FF.svg +0 -55
- data/examples/xmi/Images/EAID_7CE102CA_97C1_4cac_BD3B_0500D3712D2A.svg +0 -195
- data/examples/xmi/Images/EAID_7D960BD8_65D8_4934_9C11_4EF860DD8FBA.svg +0 -90
- data/examples/xmi/Images/EAID_80939C98_A456_48c3_BCEA_4B72851F2DF6.svg +0 -174
- data/examples/xmi/Images/EAID_812FE862_76ED_44f0_B678_7A4601B395CF.svg +0 -142
- data/examples/xmi/Images/EAID_81B76F5B_9D64_4bbf_8AC8_34234FB87533.svg +0 -740
- data/examples/xmi/Images/EAID_84352F1A_195B_411b_9552_5BFC40BF90B5.svg +0 -105
- data/examples/xmi/Images/EAID_846DD800_139C_4d47_A1DF_3FB1AC5D130F.svg +0 -554
- data/examples/xmi/Images/EAID_84A9C65B_FD6D_4bb5_818F_E8C35FF5BCD1.svg +0 -228
- data/examples/xmi/Images/EAID_853674F5_7DC9_4aae_809B_5728098B5D5B.svg +0 -154
- data/examples/xmi/Images/EAID_860CBBFB_2F27_408f_9144_751F9D1F487F.svg +0 -273
- data/examples/xmi/Images/EAID_87476527_7B9B_4b92_967E_3D38365470CA.svg +0 -239
- data/examples/xmi/Images/EAID_87DAE930_5069_4c58_AC65_4B0B2C0F32C8.svg +0 -10
- data/examples/xmi/Images/EAID_88AF6BD7_BC34_406f_BB59_47CFAB4A7D5D.svg +0 -116
- data/examples/xmi/Images/EAID_88D0CB44_20D0_44fc_A6E3_B663332EF401.svg +0 -200
- data/examples/xmi/Images/EAID_8BB1CA0C_C003_4678_973B_A1C3308E021D.svg +0 -136
- data/examples/xmi/Images/EAID_8DAB169F_D189_4320_A0F5_4443E3297F0E.svg +0 -181
- data/examples/xmi/Images/EAID_8FD488EF_BAAB_40ec_A7ED_F7CC831D546E.svg +0 -324
- data/examples/xmi/Images/EAID_90BCA409_BB45_42c5_AFA5_45FE3D995904.svg +0 -342
- data/examples/xmi/Images/EAID_926AFE38_01FA_469e_B6AA_ED5F4D62B66F.svg +0 -105
- data/examples/xmi/Images/EAID_92AB0FD0_B0FB_4ceb_8EAE_66B6600D31D7.svg +0 -681
- data/examples/xmi/Images/EAID_92C43670_3057_47f1_A576_C60843FF3D26.svg +0 -136
- data/examples/xmi/Images/EAID_93F63576_BE01_4cd8_8A91_C674FF77FC3D.svg +0 -718
- data/examples/xmi/Images/EAID_9400D9BC_05A5_41fc_83F7_02E5C67F9718.svg +0 -487
- data/examples/xmi/Images/EAID_95246DCF_1C09_4a16_9512_98000F56B3D8.svg +0 -292
- data/examples/xmi/Images/EAID_9994BF62_51E2_42cd_BB35_16C537B6718A.svg +0 -715
- data/examples/xmi/Images/EAID_9AAD6C21_B1E7_4472_B64A_FB5E3569D970.svg +0 -116
- data/examples/xmi/Images/EAID_9BD7189A_877B_4ca9_B42C_817DEF144FB2.svg +0 -284
- data/examples/xmi/Images/EAID_9DA6C553_94FC_4204_83AD_ECC4B45A53EF.svg +0 -159
- data/examples/xmi/Images/EAID_9EE6A41B_5FAA_4c89_B98F_732059778630.svg +0 -10
- data/examples/xmi/Images/EAID_9F1A4B54_46F6_435c_9529_E43E54CF6050.svg +0 -172
- data/examples/xmi/Images/EAID_9FE1EA7B_4CEF_4976_A281_93A94315BD84.svg +0 -153
- data/examples/xmi/Images/EAID_A0695647_6172_4262_8C30_67441399609C.svg +0 -290
- data/examples/xmi/Images/EAID_A081C63E_D6F2_41a7_A99C_307836754AFA.svg +0 -149
- data/examples/xmi/Images/EAID_A24E2778_5AD9_44f2_AB8F_5CD3913477D6.svg +0 -194
- data/examples/xmi/Images/EAID_A264F089_F9B3_406c_A3A8_FF34903797D3.svg +0 -143
- data/examples/xmi/Images/EAID_A282E5D1_2A13_4e7f_BC76_5D086DD4A577.svg +0 -357
- data/examples/xmi/Images/EAID_A3BCE1D6_9DB5_4272_A020_4C0E194B99CC.svg +0 -171
- data/examples/xmi/Images/EAID_A56E3818_D1B8_4b63_B69E_FBAC4A8AF482.svg +0 -218
- data/examples/xmi/Images/EAID_A57215D5_75C5_4532_BCF4_264A77CD62F1.svg +0 -204
- data/examples/xmi/Images/EAID_A59065AF_9669_486c_9582_9693177CFC7F.svg +0 -263
- data/examples/xmi/Images/EAID_A759374D_589A_488c_99EF_537ACB9B1FF9.svg +0 -398
- data/examples/xmi/Images/EAID_A7B25F46_F18A_4373_B16D_8C6AC0B868B0.svg +0 -174
- data/examples/xmi/Images/EAID_A9FE9E6F_A5F4_47e5_A6BA_26E22C7346B6.svg +0 -310
- data/examples/xmi/Images/EAID_AA62CDEB_55EC_498d_B326_4AA2C9AF6A05.svg +0 -144
- data/examples/xmi/Images/EAID_AAF52AF6_F7F9_4005_AE46_8920847BEA03.svg +0 -144
- data/examples/xmi/Images/EAID_AB281AC1_7CB8_404a_8124_34343DDD84E2.svg +0 -198
- data/examples/xmi/Images/EAID_AB7F1FDF_A66B_42a1_B8A3_7F594BAAD508.svg +0 -143
- data/examples/xmi/Images/EAID_AC2191E3_76E3_40b2_9E21_0E0B9B5277D2.svg +0 -114
- data/examples/xmi/Images/EAID_AD451676_A7C8_4c6a_A925_A9B9CA344142.svg +0 -339
- data/examples/xmi/Images/EAID_ADBA40A1_9375_4c1b_9938_0990612EB615.svg +0 -429
- data/examples/xmi/Images/EAID_ADC8773C_1B27_48ac_BAC1_14C1C919FAF6.svg +0 -245
- data/examples/xmi/Images/EAID_AE0718DF_AF69_4ea1_A099_E20028FE40A1.svg +0 -173
- data/examples/xmi/Images/EAID_B0DDB85D_A00C_4a7f_8C06_CCA15E5E4FE5.svg +0 -31
- data/examples/xmi/Images/EAID_B27ED282_D5E5_4f33_8AC1_62802F9E0B35.svg +0 -256
- data/examples/xmi/Images/EAID_B3AFECCB_17DD_44d6_8A44_2C38D9A64C0B.svg +0 -95
- data/examples/xmi/Images/EAID_B3B6C5B1_278E_4714_8244_B6C28B66AB50.svg +0 -176
- data/examples/xmi/Images/EAID_B53E76CD_A0F2_4e2f_B3AB_796D85964EF2.svg +0 -179
- data/examples/xmi/Images/EAID_B55D6E67_0BDD_4163_B359_11A6FBA89C74.svg +0 -207
- data/examples/xmi/Images/EAID_B58D1A53_E860_41a3_8352_11C274093E83.svg +0 -189
- data/examples/xmi/Images/EAID_B62C02B3_69DB_49e9_8089_4EE398BDE666.svg +0 -165
- data/examples/xmi/Images/EAID_BC008774_B539_4150_8174_B675989053D0.svg +0 -22
- data/examples/xmi/Images/EAID_BC1F7E00_082D_4a26_922B_3967A8D66859.svg +0 -266
- data/examples/xmi/Images/EAID_BDA613D8_402A_475a_AA15_683D88FD3D23.svg +0 -183
- data/examples/xmi/Images/EAID_C028B286_4C85_47d8_B6D5_80B28F556E82.svg +0 -303
- data/examples/xmi/Images/EAID_C173A6F4_1D1B_400e_AD8C_64FFF7CD5BE5.svg +0 -178
- data/examples/xmi/Images/EAID_C1834072_CADC_4ce4_B0FC_8284AE5CF4A4.svg +0 -158
- data/examples/xmi/Images/EAID_C1EC985B_5CBD_4e91_8661_EB4EF23781D9.svg +0 -286
- data/examples/xmi/Images/EAID_C31C1314_B679_4413_B8FE_A2CD584FC128.svg +0 -305
- data/examples/xmi/Images/EAID_C37CFBD6_69BA_42fb_9AC7_2D329D931BCF.svg +0 -171
- data/examples/xmi/Images/EAID_C857C934_306F_463a_87D5_257CB225ECFE.svg +0 -174
- data/examples/xmi/Images/EAID_C96797DE_2238_42d3_896A_9F92500270ED.svg +0 -180
- data/examples/xmi/Images/EAID_C96CBC24_B20E_459a_8F9D_75B61CDCB89F.svg +0 -656
- data/examples/xmi/Images/EAID_CACB523D_56A5_4f05_B3C2_51BB18F380FD.svg +0 -158
- data/examples/xmi/Images/EAID_CB34B578_101B_48b4_9271_214FFEA6A83A.svg +0 -409
- data/examples/xmi/Images/EAID_CBBD6CF4_0A1E_4406_9930_89DE43527910.svg +0 -361
- data/examples/xmi/Images/EAID_CC06A828_3750_472f_8DB2_C2E0863FCE17.svg +0 -96
- data/examples/xmi/Images/EAID_CD5CF053_1772_4a0f_962D_B17054D8EEAA.svg +0 -173
- data/examples/xmi/Images/EAID_CE440B5A_9534_4c75_9BA5_50862BB396C2.svg +0 -97
- data/examples/xmi/Images/EAID_CE4734FC_7986_4b3a_807F_A5B2C7EDE9E4.svg +0 -193
- data/examples/xmi/Images/EAID_D14AA320_9D41_4366_8739_9C2C21F96AE1.svg +0 -32
- data/examples/xmi/Images/EAID_D2FA55D3_C733_4a4d_92D0_0BC7AC0BB5BC.svg +0 -108
- data/examples/xmi/Images/EAID_D351FC34_FB03_488d_ADA4_BDB93DA9CB02.svg +0 -49
- data/examples/xmi/Images/EAID_D368FDF3_BDC5_4718_A701_351C8587A376.svg +0 -592
- data/examples/xmi/Images/EAID_D4DA8C48_3998_450d_87C4_9D65C9FECDB4.svg +0 -42
- data/examples/xmi/Images/EAID_D5464ECF_290E_4b2b_A6C4_25BE80F886CB.svg +0 -76
- data/examples/xmi/Images/EAID_D55235B0_61E9_461a_8379_2B8BF2403BE2.svg +0 -147
- data/examples/xmi/Images/EAID_D555ED73_F010_45d7_8A53_45A33C64C249.svg +0 -318
- data/examples/xmi/Images/EAID_D7AAC526_267E_45a0_A853_3207F02363F8.svg +0 -45
- data/examples/xmi/Images/EAID_D998B20D_A875_4ef8_A9CE_996BE56602BD.svg +0 -158
- data/examples/xmi/Images/EAID_DBFA8B39_F5B7_4c0e_9552_19AEAE5BA64E.svg +0 -200
- data/examples/xmi/Images/EAID_DE47A47D_E7BE_4e6f_BA81_F789EE8CFE72.svg +0 -61
- data/examples/xmi/Images/EAID_DFBB1072_8EC5_4384_8241_7EDF4B6B888B.svg +0 -78
- data/examples/xmi/Images/EAID_E325B9D8_E955_4aed_8125_63167BD40320.svg +0 -67
- data/examples/xmi/Images/EAID_E32D9D02_CAE9_4a47_92A8_3290EDCD6E6D.svg +0 -79
- data/examples/xmi/Images/EAID_E3B28611_7857_458a_B0BC_736E777B88EC.svg +0 -194
- data/examples/xmi/Images/EAID_E43C37EC_1176_4d2e_8B98_B6F3DFF6A092.svg +0 -96
- data/examples/xmi/Images/EAID_E591C1CF_7F35_4160_8A72_DFA097AD5811.svg +0 -271
- data/examples/xmi/Images/EAID_E77C66A2_2E94_4196_BFC6_662FE5AEEB6F.svg +0 -332
- data/examples/xmi/Images/EAID_E7AABA98_2450_4986_9736_DCCAF0108C50.svg +0 -639
- data/examples/xmi/Images/EAID_E7D9A2C4_72D6_40b9_8EB8_6B35476246B3.svg +0 -134
- data/examples/xmi/Images/EAID_E9CDAD85_ECF1_43de_819F_30A0D01785E6.svg +0 -193
- data/examples/xmi/Images/EAID_EC8AF507_F441_4e8a_B8A7_C1690F3C7D0B.svg +0 -58
- data/examples/xmi/Images/EAID_ED501058_D540_47ac_8EBC_5921E8C0BF57.svg +0 -384
- data/examples/xmi/Images/EAID_EFBF5F0F_DF74_4944_8791_114F5637C335.svg +0 -590
- data/examples/xmi/Images/EAID_EFFFA027_2A1F_425c_8437_BF89AADC8893.svg +0 -365
- data/examples/xmi/Images/EAID_F07E7718_B2C2_4a65_B5DD_477CB73E971E.svg +0 -165
- data/examples/xmi/Images/EAID_F0F20BDF_C729_47f7_B6FC_25ED2C4609CA.svg +0 -61
- data/examples/xmi/Images/EAID_F32E5AFE_8605_4c77_AE69_D0D0A6E380AC.svg +0 -76
- data/examples/xmi/Images/EAID_F3F00F45_CD37_46fd_B521_D1040EB2FB16.svg +0 -123
- data/examples/xmi/Images/EAID_F46E8F19_D8F1_4a3d_B87B_B0BAB4F50F50.svg +0 -202
- data/examples/xmi/Images/EAID_F48E5F6E_2411_4635_9315_3EAA4CFA29F7.svg +0 -351
- data/examples/xmi/Images/EAID_F4C23F9E_DD74_4fed_B75D_AD3C6448BA24.svg +0 -189
- data/examples/xmi/Images/EAID_F853B3C4_B145_4ef0_B261_C3CC0475B6D2.svg +0 -215
- data/examples/xmi/Images/EAID_F8BE68CA_1F8F_47e5_9454_01A2EB7D388A.svg +0 -124
- data/examples/xmi/Images/EAID_F92A6A28_612E_468e_9E39_D7AE7D24E24D.svg +0 -208
- data/examples/xmi/Images/EAID_F995FA49_B86E_4c94_BE5E_C928FB6B87D0.svg +0 -302
- data/examples/xmi/Images/EAID_FEAE013A_A4E4_4283_A491_1FEB8D0EBA28.svg +0 -524
- data/examples/xmi/Images/EAID_FEBE5726_3751_470b_9023_8C569202E97E.svg +0 -730
- data/examples/xmi/UML_EA.DTD +0 -6856
- data/examples/xmi/UmlModel_template.xmi +0 -23
- data/examples/xmi/basic.xmi +0 -9086
- data/examples/xmi/simple.xmi +0 -655
- data/examples/xmi/simple_example.xmi +0 -23
- data/examples/xmi/test.xmi +0 -1703
- data/exe/lutaml +0 -11
- data/exe/lutaml-sysml +0 -22
- data/exe/lutaml-wsd2uml +0 -63
- data/exe/lutaml-yaml2uml +0 -146
- data/lib/lutaml/cli/element_identifier.rb +0 -160
- data/lib/lutaml/cli/enhanced_formatter.rb +0 -494
- data/lib/lutaml/cli/interactive_shell/bookmark_commands.rb +0 -85
- data/lib/lutaml/cli/interactive_shell/command_base.rb +0 -32
- data/lib/lutaml/cli/interactive_shell/export_handler.rb +0 -73
- data/lib/lutaml/cli/interactive_shell/help_display.rb +0 -107
- data/lib/lutaml/cli/interactive_shell/navigation_commands.rb +0 -151
- data/lib/lutaml/cli/interactive_shell/query_commands.rb +0 -208
- data/lib/lutaml/cli/interactive_shell.rb +0 -254
- data/lib/lutaml/cli/lml_commands.rb +0 -205
- data/lib/lutaml/cli/output_formatter.rb +0 -348
- data/lib/lutaml/cli/resource_registry.rb +0 -127
- data/lib/lutaml/cli/tree_view_formatter.rb +0 -312
- data/lib/lutaml/cli/uml/build_command.rb +0 -466
- data/lib/lutaml/cli/uml/diagram_command.rb +0 -415
- data/lib/lutaml/cli/uml/export_command.rb +0 -77
- data/lib/lutaml/cli/uml/find_command.rb +0 -119
- data/lib/lutaml/cli/uml/info_command.rb +0 -103
- data/lib/lutaml/cli/uml/inspect_command.rb +0 -85
- data/lib/lutaml/cli/uml/ls_command.rb +0 -102
- data/lib/lutaml/cli/uml/repl_command.rb +0 -49
- data/lib/lutaml/cli/uml/search_command.rb +0 -85
- data/lib/lutaml/cli/uml/serve_command.rb +0 -58
- data/lib/lutaml/cli/uml/shared_helpers.rb +0 -49
- data/lib/lutaml/cli/uml/spa_command.rb +0 -208
- data/lib/lutaml/cli/uml/stats_command.rb +0 -57
- data/lib/lutaml/cli/uml/tree_command.rb +0 -82
- data/lib/lutaml/cli/uml/validate_command.rb +0 -190
- data/lib/lutaml/cli/uml/verify_command.rb +0 -103
- data/lib/lutaml/cli/uml.rb +0 -24
- data/lib/lutaml/cli/uml_commands.rb +0 -145
- data/lib/lutaml/cli.rb +0 -84
- data/lib/lutaml/converter/dsl_to_uml.rb +0 -237
- data/lib/lutaml/converter/xmi_to_uml.rb +0 -329
- data/lib/lutaml/converter/xmi_to_uml_generalization.rb +0 -193
- data/lib/lutaml/converter.rb +0 -10
- data/lib/lutaml/ea/diagram/configuration.rb +0 -379
- data/lib/lutaml/ea/diagram/element_renderers/base_renderer.rb +0 -81
- data/lib/lutaml/ea/diagram/element_renderers/class_renderer.rb +0 -328
- data/lib/lutaml/ea/diagram/element_renderers/connector_renderer.rb +0 -53
- data/lib/lutaml/ea/diagram/element_renderers/package_renderer.rb +0 -67
- data/lib/lutaml/ea/diagram/element_renderers.rb +0 -18
- data/lib/lutaml/ea/diagram/extractor.rb +0 -562
- data/lib/lutaml/ea/diagram/layout_engine.rb +0 -249
- data/lib/lutaml/ea/diagram/path_builder.rb +0 -256
- data/lib/lutaml/ea/diagram/style_parser.rb +0 -315
- data/lib/lutaml/ea/diagram/style_resolver.rb +0 -281
- data/lib/lutaml/ea/diagram/svg_renderer.rb +0 -279
- data/lib/lutaml/ea/diagram/util.rb +0 -69
- data/lib/lutaml/ea/diagram.rb +0 -62
- data/lib/lutaml/ea.rb +0 -7
- data/lib/lutaml/formatter/base.rb +0 -63
- data/lib/lutaml/formatter/graphviz.rb +0 -374
- data/lib/lutaml/formatter.rb +0 -20
- data/lib/lutaml/layout/engine.rb +0 -17
- data/lib/lutaml/layout/graph_viz_engine.rb +0 -19
- data/lib/lutaml/layout.rb +0 -8
- data/lib/lutaml/model_transformations/configuration.rb +0 -333
- data/lib/lutaml/model_transformations/format_registry.rb +0 -392
- data/lib/lutaml/model_transformations/parsers/base_parser.rb +0 -464
- data/lib/lutaml/model_transformations/parsers/qea_parser.rb +0 -450
- data/lib/lutaml/model_transformations/parsers/xmi_parser.rb +0 -289
- data/lib/lutaml/model_transformations/transformation_engine.rb +0 -405
- data/lib/lutaml/model_transformations.rb +0 -143
- data/lib/lutaml/qea/benchmark.rb +0 -210
- data/lib/lutaml/qea/database.rb +0 -270
- data/lib/lutaml/qea/factory/association_builder.rb +0 -203
- data/lib/lutaml/qea/factory/association_transformer.rb +0 -107
- data/lib/lutaml/qea/factory/attribute_tag_transformer.rb +0 -57
- data/lib/lutaml/qea/factory/attribute_transformer.rb +0 -93
- data/lib/lutaml/qea/factory/base_transformer.rb +0 -127
- data/lib/lutaml/qea/factory/class_transformer.rb +0 -164
- data/lib/lutaml/qea/factory/constraint_transformer.rb +0 -75
- data/lib/lutaml/qea/factory/data_type_transformer.rb +0 -133
- data/lib/lutaml/qea/factory/diagram_transformer.rb +0 -157
- data/lib/lutaml/qea/factory/document_builder.rb +0 -273
- data/lib/lutaml/qea/factory/ea_to_uml_factory.rb +0 -243
- data/lib/lutaml/qea/factory/enum_transformer.rb +0 -88
- data/lib/lutaml/qea/factory/generalization_builder.rb +0 -236
- data/lib/lutaml/qea/factory/generalization_transformer.rb +0 -98
- data/lib/lutaml/qea/factory/instance_transformer.rb +0 -84
- data/lib/lutaml/qea/factory/object_property_transformer.rb +0 -58
- data/lib/lutaml/qea/factory/operation_transformer.rb +0 -66
- data/lib/lutaml/qea/factory/package_transformer.rb +0 -208
- data/lib/lutaml/qea/factory/reference_resolver.rb +0 -99
- data/lib/lutaml/qea/factory/stereotype_loader.rb +0 -40
- data/lib/lutaml/qea/factory/tagged_value_transformer.rb +0 -38
- data/lib/lutaml/qea/factory/transformer_registry.rb +0 -77
- data/lib/lutaml/qea/factory.rb +0 -37
- data/lib/lutaml/qea/file_detector.rb +0 -178
- data/lib/lutaml/qea/infrastructure/database_connection.rb +0 -100
- data/lib/lutaml/qea/infrastructure/schema_reader.rb +0 -136
- data/lib/lutaml/qea/infrastructure/table_reader.rb +0 -224
- data/lib/lutaml/qea/infrastructure.rb +0 -12
- data/lib/lutaml/qea/models/base_model.rb +0 -48
- data/lib/lutaml/qea/models/ea_attribute.rb +0 -133
- data/lib/lutaml/qea/models/ea_attribute_tag.rb +0 -107
- data/lib/lutaml/qea/models/ea_complexity_type.rb +0 -79
- data/lib/lutaml/qea/models/ea_connector.rb +0 -160
- data/lib/lutaml/qea/models/ea_connector_type.rb +0 -60
- data/lib/lutaml/qea/models/ea_constraint_type.rb +0 -63
- data/lib/lutaml/qea/models/ea_datatype.rb +0 -104
- data/lib/lutaml/qea/models/ea_diagram.rb +0 -115
- data/lib/lutaml/qea/models/ea_diagram_link.rb +0 -78
- data/lib/lutaml/qea/models/ea_diagram_object.rb +0 -84
- data/lib/lutaml/qea/models/ea_diagram_type.rb +0 -56
- data/lib/lutaml/qea/models/ea_document.rb +0 -66
- data/lib/lutaml/qea/models/ea_object.rb +0 -206
- data/lib/lutaml/qea/models/ea_object_constraint.rb +0 -60
- data/lib/lutaml/qea/models/ea_object_property.rb +0 -94
- data/lib/lutaml/qea/models/ea_object_type.rb +0 -73
- data/lib/lutaml/qea/models/ea_operation.rb +0 -151
- data/lib/lutaml/qea/models/ea_operation_param.rb +0 -71
- data/lib/lutaml/qea/models/ea_package.rb +0 -73
- data/lib/lutaml/qea/models/ea_script.rb +0 -67
- data/lib/lutaml/qea/models/ea_status_type.rb +0 -66
- data/lib/lutaml/qea/models/ea_stereotype.rb +0 -57
- data/lib/lutaml/qea/models/ea_tagged_value.rb +0 -103
- data/lib/lutaml/qea/models/ea_xref.rb +0 -172
- data/lib/lutaml/qea/models.rb +0 -35
- data/lib/lutaml/qea/parser.rb +0 -57
- data/lib/lutaml/qea/repositories/base_repository.rb +0 -215
- data/lib/lutaml/qea/repositories/object_repository.rb +0 -219
- data/lib/lutaml/qea/repositories.rb +0 -10
- data/lib/lutaml/qea/services/configuration.rb +0 -211
- data/lib/lutaml/qea/services/database_loader.rb +0 -186
- data/lib/lutaml/qea/services.rb +0 -10
- data/lib/lutaml/qea/validation/association_validator.rb +0 -73
- data/lib/lutaml/qea/validation/attribute_validator.rb +0 -101
- data/lib/lutaml/qea/validation/base_validator.rb +0 -312
- data/lib/lutaml/qea/validation/class_validator.rb +0 -121
- data/lib/lutaml/qea/validation/database/circular_reference_validator.rb +0 -109
- data/lib/lutaml/qea/validation/database/orphan_validator.rb +0 -153
- data/lib/lutaml/qea/validation/database/referential_integrity_validator.rb +0 -128
- data/lib/lutaml/qea/validation/database.rb +0 -10
- data/lib/lutaml/qea/validation/diagram_validator.rb +0 -112
- data/lib/lutaml/qea/validation/formatters/json_formatter.rb +0 -137
- data/lib/lutaml/qea/validation/formatters/text_formatter.rb +0 -235
- data/lib/lutaml/qea/validation/operation_validator.rb +0 -79
- data/lib/lutaml/qea/validation/package_validator.rb +0 -111
- data/lib/lutaml/qea/validation/validation_engine.rb +0 -477
- data/lib/lutaml/qea/validation/validation_message.rb +0 -144
- data/lib/lutaml/qea/validation/validation_result.rb +0 -210
- data/lib/lutaml/qea/validation/validator_registry.rb +0 -134
- data/lib/lutaml/qea/validation.rb +0 -27
- data/lib/lutaml/qea/verification/comparison_result.rb +0 -264
- data/lib/lutaml/qea/verification/document_normalizer.rb +0 -169
- data/lib/lutaml/qea/verification/document_verifier.rb +0 -323
- data/lib/lutaml/qea/verification/element_comparator.rb +0 -277
- data/lib/lutaml/qea/verification/structure_matcher.rb +0 -287
- data/lib/lutaml/qea/verification.rb +0 -14
- data/lib/lutaml/qea.rb +0 -225
- data/lib/lutaml/uml/abstraction.rb +0 -11
- data/lib/lutaml/uml/action.rb +0 -15
- data/lib/lutaml/uml/activity.rb +0 -11
- data/lib/lutaml/uml/actor.rb +0 -11
- data/lib/lutaml/uml/association.rb +0 -35
- data/lib/lutaml/uml/association_generalization.rb +0 -18
- data/lib/lutaml/uml/behavior.rb +0 -11
- data/lib/lutaml/uml/cardinality.rb +0 -10
- data/lib/lutaml/uml/class.rb +0 -50
- data/lib/lutaml/uml/classifier.rb +0 -17
- data/lib/lutaml/uml/comment.rb +0 -13
- data/lib/lutaml/uml/connector.rb +0 -18
- data/lib/lutaml/uml/connector_end.rb +0 -20
- data/lib/lutaml/uml/constraint.rb +0 -22
- data/lib/lutaml/uml/data_type.rb +0 -54
- data/lib/lutaml/uml/dependency.rb +0 -18
- data/lib/lutaml/uml/diagram.rb +0 -23
- data/lib/lutaml/uml/diagram_link.rb +0 -26
- data/lib/lutaml/uml/diagram_object.rb +0 -30
- data/lib/lutaml/uml/document.rb +0 -62
- data/lib/lutaml/uml/enum.rb +0 -19
- data/lib/lutaml/uml/event.rb +0 -11
- data/lib/lutaml/uml/fidelity.rb +0 -10
- data/lib/lutaml/uml/final_state.rb +0 -11
- data/lib/lutaml/uml/fontname.rb +0 -13
- data/lib/lutaml/uml/general_attribute.rb +0 -22
- data/lib/lutaml/uml/generalization.rb +0 -35
- data/lib/lutaml/uml/group.rb +0 -19
- data/lib/lutaml/uml/has_attributes.rb +0 -14
- data/lib/lutaml/uml/has_members.rb +0 -30
- data/lib/lutaml/uml/inheritance_walker.rb +0 -96
- data/lib/lutaml/uml/instance.rb +0 -15
- data/lib/lutaml/uml/model.rb +0 -13
- data/lib/lutaml/uml/model_helpers.rb +0 -93
- data/lib/lutaml/uml/namespace.rb +0 -10
- data/lib/lutaml/uml/node/attribute.rb +0 -30
- data/lib/lutaml/uml/node/base.rb +0 -19
- data/lib/lutaml/uml/node/class_node.rb +0 -48
- data/lib/lutaml/uml/node/class_relationship.rb +0 -11
- data/lib/lutaml/uml/node/document.rb +0 -15
- data/lib/lutaml/uml/node/has_name.rb +0 -15
- data/lib/lutaml/uml/node/has_type.rb +0 -15
- data/lib/lutaml/uml/node/method_argument.rb +0 -12
- data/lib/lutaml/uml/node/operation.rb +0 -23
- data/lib/lutaml/uml/node/relationship.rb +0 -22
- data/lib/lutaml/uml/opaque_behavior.rb +0 -11
- data/lib/lutaml/uml/operation.rb +0 -21
- data/lib/lutaml/uml/operation_parameter.rb +0 -17
- data/lib/lutaml/uml/package.rb +0 -31
- data/lib/lutaml/uml/package_path.rb +0 -235
- data/lib/lutaml/uml/parsers/attribute.rb +0 -68
- data/lib/lutaml/uml/parsers/dsl.rb +0 -415
- data/lib/lutaml/uml/parsers/dsl_preprocessor.rb +0 -63
- data/lib/lutaml/uml/parsers/dsl_transform.rb +0 -27
- data/lib/lutaml/uml/parsers/yaml.rb +0 -23
- data/lib/lutaml/uml/port.rb +0 -8
- data/lib/lutaml/uml/primitive_type.rb +0 -13
- data/lib/lutaml/uml/property.rb +0 -25
- data/lib/lutaml/uml/pseudostate.rb +0 -11
- data/lib/lutaml/uml/qualified_name.rb +0 -175
- data/lib/lutaml/uml/realization.rb +0 -11
- data/lib/lutaml/uml/region.rb +0 -11
- data/lib/lutaml/uml/state.rb +0 -20
- data/lib/lutaml/uml/state_machine.rb +0 -11
- data/lib/lutaml/uml/tagged_value.rb +0 -21
- data/lib/lutaml/uml/top_element.rb +0 -83
- data/lib/lutaml/uml/top_element_attribute.rb +0 -62
- data/lib/lutaml/uml/transition.rb +0 -22
- data/lib/lutaml/uml/trigger.rb +0 -16
- data/lib/lutaml/uml/validation/document_structure_validator.rb +0 -387
- data/lib/lutaml/uml/value.rb +0 -35
- data/lib/lutaml/uml/vertex.rb +0 -11
- data/lib/lutaml/uml.rb +0 -113
- data/lib/lutaml/uml_repository/class_lookup_index.rb +0 -40
- data/lib/lutaml/uml_repository/error_handler.rb +0 -203
- data/lib/lutaml/uml_repository/exporters/base_exporter.rb +0 -61
- data/lib/lutaml/uml_repository/exporters/json_exporter.rb +0 -343
- data/lib/lutaml/uml_repository/exporters/markdown/class_page_builder.rb +0 -187
- data/lib/lutaml/uml_repository/exporters/markdown/formatting.rb +0 -34
- data/lib/lutaml/uml_repository/exporters/markdown/index_page_builder.rb +0 -81
- data/lib/lutaml/uml_repository/exporters/markdown/link_resolver.rb +0 -40
- data/lib/lutaml/uml_repository/exporters/markdown/package_page_builder.rb +0 -107
- data/lib/lutaml/uml_repository/exporters/markdown.rb +0 -20
- data/lib/lutaml/uml_repository/exporters/markdown_exporter.rb +0 -86
- data/lib/lutaml/uml_repository/index_builder.rb +0 -210
- data/lib/lutaml/uml_repository/index_builders/association_index.rb +0 -155
- data/lib/lutaml/uml_repository/index_builders/class_index.rb +0 -113
- data/lib/lutaml/uml_repository/index_builders/package_index.rb +0 -62
- data/lib/lutaml/uml_repository/index_builders.rb +0 -13
- data/lib/lutaml/uml_repository/lazy_repository.rb +0 -236
- data/lib/lutaml/uml_repository/package_exporter.rb +0 -334
- data/lib/lutaml/uml_repository/package_loader.rb +0 -240
- data/lib/lutaml/uml_repository/package_metadata.rb +0 -77
- data/lib/lutaml/uml_repository/presenters/association_presenter.rb +0 -79
- data/lib/lutaml/uml_repository/presenters/attribute_presenter.rb +0 -94
- data/lib/lutaml/uml_repository/presenters/class_presenter.rb +0 -72
- data/lib/lutaml/uml_repository/presenters/datatype_presenter.rb +0 -97
- data/lib/lutaml/uml_repository/presenters/diagram_presenter.rb +0 -469
- data/lib/lutaml/uml_repository/presenters/element_presenter.rb +0 -91
- data/lib/lutaml/uml_repository/presenters/enum_presenter.rb +0 -78
- data/lib/lutaml/uml_repository/presenters/package_presenter.rb +0 -48
- data/lib/lutaml/uml_repository/presenters/presenter_factory.rb +0 -74
- data/lib/lutaml/uml_repository/queries/association_query.rb +0 -184
- data/lib/lutaml/uml_repository/queries/base_query.rb +0 -45
- data/lib/lutaml/uml_repository/queries/class_query.rb +0 -178
- data/lib/lutaml/uml_repository/queries/diagram_query.rb +0 -108
- data/lib/lutaml/uml_repository/queries/inheritance_query.rb +0 -327
- data/lib/lutaml/uml_repository/queries/package_query.rb +0 -230
- data/lib/lutaml/uml_repository/queries/search_query.rb +0 -209
- data/lib/lutaml/uml_repository/query_dsl/conditions/base_condition.rb +0 -28
- data/lib/lutaml/uml_repository/query_dsl/conditions/block_condition.rb +0 -44
- data/lib/lutaml/uml_repository/query_dsl/conditions/hash_condition.rb +0 -82
- data/lib/lutaml/uml_repository/query_dsl/conditions/package_condition.rb +0 -89
- data/lib/lutaml/uml_repository/query_dsl/order.rb +0 -90
- data/lib/lutaml/uml_repository/query_dsl/query_builder.rb +0 -290
- data/lib/lutaml/uml_repository/repository/deprecated.rb +0 -39
- data/lib/lutaml/uml_repository/repository/loader.rb +0 -117
- data/lib/lutaml/uml_repository/repository.rb +0 -718
- data/lib/lutaml/uml_repository/repository_enhanced.rb +0 -431
- data/lib/lutaml/uml_repository/search_result.rb +0 -86
- data/lib/lutaml/uml_repository/static_site/association_serialization.rb +0 -77
- data/lib/lutaml/uml_repository/static_site/configuration.rb +0 -268
- data/lib/lutaml/uml_repository/static_site/data_transformer.rb +0 -121
- data/lib/lutaml/uml_repository/static_site/generator.rb +0 -434
- data/lib/lutaml/uml_repository/static_site/id_generator.rb +0 -115
- data/lib/lutaml/uml_repository/static_site/models/spa_association.rb +0 -29
- data/lib/lutaml/uml_repository/static_site/models/spa_association_end.rb +0 -25
- data/lib/lutaml/uml_repository/static_site/models/spa_attribute.rb +0 -39
- data/lib/lutaml/uml_repository/static_site/models/spa_base.rb +0 -12
- data/lib/lutaml/uml_repository/static_site/models/spa_cardinality.rb +0 -19
- data/lib/lutaml/uml_repository/static_site/models/spa_class.rb +0 -59
- data/lib/lutaml/uml_repository/static_site/models/spa_diagram.rb +0 -31
- data/lib/lutaml/uml_repository/static_site/models/spa_document.rb +0 -31
- data/lib/lutaml/uml_repository/static_site/models/spa_inherited_association.rb +0 -25
- data/lib/lutaml/uml_repository/static_site/models/spa_inherited_attribute.rb +0 -25
- data/lib/lutaml/uml_repository/static_site/models/spa_literal.rb +0 -19
- data/lib/lutaml/uml_repository/static_site/models/spa_metadata.rb +0 -23
- data/lib/lutaml/uml_repository/static_site/models/spa_operation.rb +0 -34
- data/lib/lutaml/uml_repository/static_site/models/spa_package.rb +0 -35
- data/lib/lutaml/uml_repository/static_site/models/spa_package_tree_node.rb +0 -32
- data/lib/lutaml/uml_repository/static_site/models/spa_parameter.rb +0 -21
- data/lib/lutaml/uml_repository/static_site/models/spa_search_entry.rb +0 -35
- data/lib/lutaml/uml_repository/static_site/models/spa_statistics.rb +0 -25
- data/lib/lutaml/uml_repository/static_site/models/spa_tree_class_ref.rb +0 -21
- data/lib/lutaml/uml_repository/static_site/models.rb +0 -46
- data/lib/lutaml/uml_repository/static_site/search_index_builder.rb +0 -239
- data/lib/lutaml/uml_repository/static_site/serializers/attribute_serializer.rb +0 -60
- data/lib/lutaml/uml_repository/static_site/serializers/class_serializer.rb +0 -123
- data/lib/lutaml/uml_repository/static_site/serializers/diagram_serializer.rb +0 -73
- data/lib/lutaml/uml_repository/static_site/serializers/inheritance_resolver.rb +0 -262
- data/lib/lutaml/uml_repository/static_site/serializers/metadata_builder.rb +0 -48
- data/lib/lutaml/uml_repository/static_site/serializers/operation_serializer.rb +0 -57
- data/lib/lutaml/uml_repository/static_site/serializers/package_serializer.rb +0 -79
- data/lib/lutaml/uml_repository/static_site/serializers/package_tree_builder.rb +0 -91
- data/lib/lutaml/uml_repository/static_site/serializers.rb +0 -26
- data/lib/lutaml/uml_repository/static_site.rb +0 -94
- data/lib/lutaml/uml_repository/statistics_calculator.rb +0 -342
- data/lib/lutaml/uml_repository/validators/repository_validator.rb +0 -392
- data/lib/lutaml/uml_repository/web_ui/app.rb +0 -161
- data/lib/lutaml/uml_repository/web_ui/public/app.js +0 -452
- data/lib/lutaml/uml_repository/web_ui/public/styles.css +0 -381
- data/lib/lutaml/uml_repository/web_ui/views/index.erb +0 -40
- data/lib/lutaml/uml_repository.rb +0 -117
- data/lib/lutaml/xmi/liquid_drops/association_drop.rb +0 -56
- data/lib/lutaml/xmi/liquid_drops/attribute_drop.rb +0 -72
- data/lib/lutaml/xmi/liquid_drops/cardinality_drop.rb +0 -35
- data/lib/lutaml/xmi/liquid_drops/connector_drop.rb +0 -54
- data/lib/lutaml/xmi/liquid_drops/constraint_drop.rb +0 -29
- data/lib/lutaml/xmi/liquid_drops/data_type_drop.rb +0 -63
- data/lib/lutaml/xmi/liquid_drops/dependency_drop.rb +0 -36
- data/lib/lutaml/xmi/liquid_drops/diagram_drop.rb +0 -34
- data/lib/lutaml/xmi/liquid_drops/enum_drop.rb +0 -49
- data/lib/lutaml/xmi/liquid_drops/enum_owned_literal_drop.rb +0 -25
- data/lib/lutaml/xmi/liquid_drops/generalization_attribute_drop.rb +0 -87
- data/lib/lutaml/xmi/liquid_drops/generalization_drop.rb +0 -127
- data/lib/lutaml/xmi/liquid_drops/klass_drop.rb +0 -191
- data/lib/lutaml/xmi/liquid_drops/operation_drop.rb +0 -29
- data/lib/lutaml/xmi/liquid_drops/package_drop.rb +0 -108
- data/lib/lutaml/xmi/liquid_drops/root_drop.rb +0 -34
- data/lib/lutaml/xmi/liquid_drops/source_target_drop.rb +0 -43
- data/lib/lutaml/xmi/parsers/xmi_base.rb +0 -301
- data/lib/lutaml/xmi/parsers/xmi_class_members.rb +0 -45
- data/lib/lutaml/xmi/parsers/xmi_connector.rb +0 -263
- data/lib/lutaml/xmi/parsers/xml.rb +0 -63
- data/lib/lutaml/xmi/xmi_lookup_service.rb +0 -40
- data/lib/lutaml/xmi.rb +0 -47
- data/templates/static_site/assets/images/lutaml-full.svg +0 -1
- data/templates/static_site/assets/images/lutaml-icon.svg +0 -1
- data/templates/static_site/assets/scripts/app.js +0 -45
- data/templates/static_site/assets/scripts/core/state.js +0 -446
- data/templates/static_site/assets/scripts/core/utils.js +0 -133
- data/templates/static_site/assets/scripts/ui/details.js +0 -74
- data/templates/static_site/assets/scripts/ui/diagrams.js +0 -345
- data/templates/static_site/assets/scripts/ui/search.js +0 -187
- data/templates/static_site/assets/scripts/ui/sidebar.js +0 -123
- data/templates/static_site/assets/styles/00-variables.css +0 -144
- data/templates/static_site/assets/styles/01-reset.css +0 -69
- data/templates/static_site/assets/styles/02-base.css +0 -144
- data/templates/static_site/assets/styles/03-layout.css +0 -121
- data/templates/static_site/assets/styles/04-components.css +0 -905
- data/templates/static_site/assets/styles/05-utilities.css +0 -23
- data/templates/static_site/assets/styles/06-diagrams.css +0 -74
- data/templates/static_site/components/class_details.liquid +0 -328
- data/templates/static_site/components/content.liquid +0 -481
- data/templates/static_site/components/diagram_list.liquid +0 -52
- data/templates/static_site/components/diagram_viewer.liquid +0 -71
- data/templates/static_site/components/header.liquid +0 -114
- data/templates/static_site/components/package_details.liquid +0 -119
- data/templates/static_site/components/sidebar.liquid +0 -76
- data/templates/static_site/components/tree_node.liquid +0 -81
- data/templates/static_site/multi_file.liquid +0 -49
- data/templates/static_site/single_file.liquid +0 -57
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Lutaml
|
|
4
|
-
module ModelTransformations
|
|
5
|
-
module Parsers
|
|
6
|
-
# XMI Parser implements the BaseParser interface for XML Metadata
|
|
7
|
-
# Interchange files.
|
|
8
|
-
#
|
|
9
|
-
# Delegates to Lutaml::Xmi::Parsers::Xml for actual parsing.
|
|
10
|
-
class XmiParser < BaseParser
|
|
11
|
-
# Get parser format name
|
|
12
|
-
#
|
|
13
|
-
# @return [String] Human-readable format name
|
|
14
|
-
def format_name
|
|
15
|
-
"XML Metadata Interchange (XMI)"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Get list of supported file extensions
|
|
19
|
-
#
|
|
20
|
-
# @return [Array<String>] List of extensions
|
|
21
|
-
def supported_extensions
|
|
22
|
-
[".xmi", ".xml"]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def content_patterns
|
|
26
|
-
[/xmi:version/]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def priority
|
|
30
|
-
80
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
protected
|
|
34
|
-
|
|
35
|
-
# Core parsing implementation for XMI files
|
|
36
|
-
#
|
|
37
|
-
# @param file_path [String] Path to the XMI file
|
|
38
|
-
# @return [Lutaml::Uml::Document] Parsed UML document
|
|
39
|
-
def parse_internal(file_path)
|
|
40
|
-
# Validate XMI file format
|
|
41
|
-
validate_xmi_format!(file_path)
|
|
42
|
-
|
|
43
|
-
# Use existing Lutaml::Xmi::Parsers::Xml for XMI parsing
|
|
44
|
-
document = Lutaml::Xmi::Parsers::Xml.parse(File.new(file_path))
|
|
45
|
-
|
|
46
|
-
if document.nil?
|
|
47
|
-
add_error("No document found in XMI file")
|
|
48
|
-
raise Parsers::ParseError.new("Empty XMI file or parsing failed")
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Post-process document if needed
|
|
52
|
-
post_process_xmi_document(document, file_path)
|
|
53
|
-
|
|
54
|
-
document
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Hook called before parsing starts
|
|
58
|
-
#
|
|
59
|
-
# @param file_path [String] Path to the file being parsed
|
|
60
|
-
# @return [void]
|
|
61
|
-
def before_parse(file_path)
|
|
62
|
-
add_info("Starting XMI parsing for: #{file_path}")
|
|
63
|
-
|
|
64
|
-
# Check file size and warn if very large
|
|
65
|
-
file_size = File.size(file_path)
|
|
66
|
-
if file_size > 100 * 1024 * 1024 # 100MB
|
|
67
|
-
add_warning("Large XMI file detected " \
|
|
68
|
-
"(#{format_file_size(file_size)}), " \
|
|
69
|
-
"parsing may take time")
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Hook called after parsing completes
|
|
74
|
-
#
|
|
75
|
-
# @param document [Lutaml::Uml::Document] Parsed document
|
|
76
|
-
# @param file_path [String] Path to the source file
|
|
77
|
-
# @return [Lutaml::Uml::Document] Processed document
|
|
78
|
-
def after_parse(document, file_path)
|
|
79
|
-
# Add metadata about the parsing process
|
|
80
|
-
add_parsing_metadata(document, file_path)
|
|
81
|
-
|
|
82
|
-
# Validate references if requested
|
|
83
|
-
validate_references(document) if @options[:resolve_references]
|
|
84
|
-
|
|
85
|
-
# Count elements and add statistics
|
|
86
|
-
add_parsing_statistics(document)
|
|
87
|
-
|
|
88
|
-
document
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Get default parsing options for XMI
|
|
92
|
-
#
|
|
93
|
-
# @return [Hash] Default options hash
|
|
94
|
-
def default_options
|
|
95
|
-
super.merge(
|
|
96
|
-
validate_xml: true,
|
|
97
|
-
resolve_references: true,
|
|
98
|
-
preserve_namespaces: true,
|
|
99
|
-
include_documentation: true,
|
|
100
|
-
)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
private
|
|
104
|
-
|
|
105
|
-
# Validate XMI file format
|
|
106
|
-
#
|
|
107
|
-
# @param file_path [String] Path to validate
|
|
108
|
-
# @raise [ParseError] if file is not valid XMI
|
|
109
|
-
def validate_xmi_format!(file_path) # rubocop:disable Metrics/MethodLength
|
|
110
|
-
# Quick validation by reading first few lines
|
|
111
|
-
File.open(file_path, "r") do |file|
|
|
112
|
-
header = file.read(1024)
|
|
113
|
-
|
|
114
|
-
unless header.include?("<?xml")
|
|
115
|
-
add_error("File does not appear to be an XML file")
|
|
116
|
-
raise Parsers::ParseError.new("Invalid XML format")
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Check for XMI-specific elements
|
|
120
|
-
unless header.include?("xmi:") || header.include?("uml:")
|
|
121
|
-
add_warning("File may not be a valid XMI file " \
|
|
122
|
-
"(no XMI namespace found)")
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# Post-process XMI document
|
|
128
|
-
#
|
|
129
|
-
# @param document [Lutaml::Uml::Document] Document to process
|
|
130
|
-
# @param file_path [String] Source file path
|
|
131
|
-
# @return [void]
|
|
132
|
-
def post_process_xmi_document(document, file_path)
|
|
133
|
-
# Set source file information
|
|
134
|
-
if document.class.method_defined?(:source_file=)
|
|
135
|
-
document.source_file = file_path
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Add timestamp
|
|
139
|
-
if document.class.method_defined?(:parsed_at=)
|
|
140
|
-
document.parsed_at = Time.now
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Normalize package paths if requested
|
|
144
|
-
normalize_package_paths(document) if @options[:normalize_paths]
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
# Add parsing metadata to document
|
|
148
|
-
#
|
|
149
|
-
# @param document [Lutaml::Uml::Document] Document to enhance
|
|
150
|
-
# @param file_path [String] Source file path
|
|
151
|
-
# @return [void]
|
|
152
|
-
def add_parsing_metadata(document, file_path) # rubocop:disable Metrics/MethodLength
|
|
153
|
-
metadata = {
|
|
154
|
-
source_file: file_path,
|
|
155
|
-
parsed_at: Time.now,
|
|
156
|
-
parser: self.class.name,
|
|
157
|
-
parser_version: "1.0",
|
|
158
|
-
options: @options,
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if document.class.method_defined?(:parsing_metadata=)
|
|
162
|
-
document.parsing_metadata = metadata
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Validate document references
|
|
167
|
-
#
|
|
168
|
-
# @param document [Lutaml::Uml::Document] Document to validate
|
|
169
|
-
# @return [void]
|
|
170
|
-
def validate_references(document)
|
|
171
|
-
# Check for unresolved references
|
|
172
|
-
unresolved_refs = find_unresolved_references(document)
|
|
173
|
-
|
|
174
|
-
if unresolved_refs.any?
|
|
175
|
-
add_warning("Found #{unresolved_refs.size} unresolved references")
|
|
176
|
-
unresolved_refs.each do |ref|
|
|
177
|
-
add_warning("Unresolved reference: #{ref}")
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# Find unresolved references in document
|
|
183
|
-
#
|
|
184
|
-
# @param document [Lutaml::Uml::Document] Document to check
|
|
185
|
-
# @return [Array<String>] List of unresolved reference IDs
|
|
186
|
-
def find_unresolved_references(document) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
187
|
-
unresolved = []
|
|
188
|
-
|
|
189
|
-
# This is a simplified implementation
|
|
190
|
-
# In practice, you would traverse the document structure
|
|
191
|
-
# and check for dangling references
|
|
192
|
-
|
|
193
|
-
# Check class generalizations
|
|
194
|
-
document.classes&.each do |klass|
|
|
195
|
-
klass.generalizations&.each do |gen|
|
|
196
|
-
# Reference by ID that might be unresolved
|
|
197
|
-
if gen.general.is_a?(String) && !find_element_by_id(document,
|
|
198
|
-
gen.general)
|
|
199
|
-
unresolved << gen.general
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
unresolved.uniq
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
# Find element by ID in document
|
|
208
|
-
#
|
|
209
|
-
# @param document [Lutaml::Uml::Document] Document to search
|
|
210
|
-
# @param id [String] ID to find
|
|
211
|
-
# @return [Object, nil] Found element or nil
|
|
212
|
-
def find_element_by_id(document, id)
|
|
213
|
-
# Simplified implementation - in practice would use proper indexing
|
|
214
|
-
all_elements = []
|
|
215
|
-
all_elements.concat(document.packages || [])
|
|
216
|
-
all_elements.concat(document.classes || [])
|
|
217
|
-
all_elements.concat(document.data_types || [])
|
|
218
|
-
all_elements.concat(document.enums || [])
|
|
219
|
-
|
|
220
|
-
all_elements.find { |element| element.xmi_id == id }
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
# Add parsing statistics
|
|
224
|
-
#
|
|
225
|
-
# @param document [Lutaml::Uml::Document] Document to analyze
|
|
226
|
-
# @return [void]
|
|
227
|
-
def add_parsing_statistics(document) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
228
|
-
stats = {
|
|
229
|
-
packages: document.packages&.size || 0,
|
|
230
|
-
classes: document.classes&.size || 0,
|
|
231
|
-
data_types: document.data_types&.size || 0,
|
|
232
|
-
enumerations: document.enums&.size || 0,
|
|
233
|
-
associations: document.associations&.size || 0,
|
|
234
|
-
diagrams: document.diagrams&.size || 0,
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
add_info("Parsed XMI successfully: #{format_statistics(stats)}")
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
# Normalize package paths
|
|
241
|
-
#
|
|
242
|
-
# @param document [Lutaml::Uml::Document] Document to process
|
|
243
|
-
# @return [void]
|
|
244
|
-
def normalize_package_paths(_document)
|
|
245
|
-
# Implementation would normalize package path formats
|
|
246
|
-
# This is a placeholder for future enhancement
|
|
247
|
-
add_info("Package path normalization completed")
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
# Format file size for display
|
|
251
|
-
#
|
|
252
|
-
# @param size [Integer] Size in bytes
|
|
253
|
-
# @return [String] Formatted size string
|
|
254
|
-
def format_file_size(size)
|
|
255
|
-
units = %w[B KB MB GB]
|
|
256
|
-
size = size.to_f
|
|
257
|
-
unit_index = 0
|
|
258
|
-
|
|
259
|
-
while size >= 1024 && unit_index < units.length - 1
|
|
260
|
-
size /= 1024
|
|
261
|
-
unit_index += 1
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
"#{size.round(1)} #{units[unit_index]}"
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
# Format statistics for display
|
|
268
|
-
#
|
|
269
|
-
# @param stats [Hash] Statistics hash
|
|
270
|
-
# @return [String] Formatted statistics string
|
|
271
|
-
def format_statistics(stats)
|
|
272
|
-
parts = stats.map { |key, value| "#{value} #{key}" }
|
|
273
|
-
parts.join(", ")
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
# Add info message (similar to warning but for information)
|
|
277
|
-
#
|
|
278
|
-
# @param message [String] Info message
|
|
279
|
-
# @param context [Hash] Additional context
|
|
280
|
-
# @return [void]
|
|
281
|
-
def add_info(message, context = {})
|
|
282
|
-
# For now, treat as warnings since base parser doesn't have info level
|
|
283
|
-
# In future, could extend base parser to support info level
|
|
284
|
-
add_warning(message, context)
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
end
|
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Lutaml
|
|
4
|
-
module ModelTransformations
|
|
5
|
-
# Transformation Engine orchestrates the entire model transformation
|
|
6
|
-
# process.
|
|
7
|
-
#
|
|
8
|
-
# This class implements the Facade pattern to provide a simple interface
|
|
9
|
-
# for complex model transformation operations. It coordinates between
|
|
10
|
-
# configuration, format detection, parser selection, and transformation.
|
|
11
|
-
#
|
|
12
|
-
# The engine follows the Dependency Inversion Principle by depending on
|
|
13
|
-
# abstractions (BaseParser interface) rather than concrete implementations.
|
|
14
|
-
#
|
|
15
|
-
# @example Basic usage
|
|
16
|
-
# engine = TransformationEngine.new
|
|
17
|
-
# document = engine.parse("model.xmi")
|
|
18
|
-
#
|
|
19
|
-
# @example With custom configuration
|
|
20
|
-
# config = Configuration.load("my_config.yml")
|
|
21
|
-
# engine = TransformationEngine.new(config)
|
|
22
|
-
# document = engine.parse("model.qea")
|
|
23
|
-
class TransformationEngine
|
|
24
|
-
# @return [Configuration] Current configuration
|
|
25
|
-
attr_reader :configuration
|
|
26
|
-
|
|
27
|
-
# @return [FormatRegistry] Format registry
|
|
28
|
-
attr_reader :format_registry
|
|
29
|
-
|
|
30
|
-
# @return [Array<Hash>] Transformation history
|
|
31
|
-
attr_reader :transformation_history
|
|
32
|
-
|
|
33
|
-
# @return [Parser] Parser instance
|
|
34
|
-
attr_reader :current_parser
|
|
35
|
-
|
|
36
|
-
# Initialize transformation engine
|
|
37
|
-
#
|
|
38
|
-
# @param configuration [Configuration, nil] Configuration to use
|
|
39
|
-
# (defaults to auto-loaded configuration)
|
|
40
|
-
def initialize(configuration = nil)
|
|
41
|
-
@configuration = configuration || Configuration.load
|
|
42
|
-
@format_registry = FormatRegistry.new
|
|
43
|
-
@transformation_history = []
|
|
44
|
-
@parser_cache = {}
|
|
45
|
-
|
|
46
|
-
# Load parsers from configuration
|
|
47
|
-
setup_parsers
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Parse a model file into a UML document
|
|
51
|
-
#
|
|
52
|
-
# This is the main entry point for model transformation. It auto-detects
|
|
53
|
-
# the file format and uses the appropriate parser.
|
|
54
|
-
#
|
|
55
|
-
# @param file_path [String] Path to the model file
|
|
56
|
-
# @param options [Hash] Parsing options (merged with configuration)
|
|
57
|
-
# @return [Lutaml::Uml::Document] Parsed UML document
|
|
58
|
-
# @raise [UnsupportedFormatError] if file format is not supported
|
|
59
|
-
# @raise [ParseError] if parsing fails
|
|
60
|
-
def parse(file_path, options = {}) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
61
|
-
validate_file_path!(file_path)
|
|
62
|
-
|
|
63
|
-
# Detect format and get parser
|
|
64
|
-
parser_class = detect_parser(file_path)
|
|
65
|
-
raise UnsupportedFormatError.new(file_path) unless parser_class
|
|
66
|
-
|
|
67
|
-
# Create parser instance with merged options
|
|
68
|
-
merged_options = merge_options(options)
|
|
69
|
-
@current_parser = get_parser_instance(parser_class, merged_options)
|
|
70
|
-
|
|
71
|
-
# Record transformation start
|
|
72
|
-
transformation_start = Time.now
|
|
73
|
-
|
|
74
|
-
begin
|
|
75
|
-
# Perform parsing
|
|
76
|
-
document = @current_parser.parse(file_path)
|
|
77
|
-
|
|
78
|
-
# Record successful transformation
|
|
79
|
-
record_transformation(
|
|
80
|
-
file_path: file_path,
|
|
81
|
-
parser: @current_parser,
|
|
82
|
-
duration: Time.now - transformation_start,
|
|
83
|
-
success: true,
|
|
84
|
-
document: document,
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
document
|
|
88
|
-
rescue StandardError => e
|
|
89
|
-
# Record failed transformation
|
|
90
|
-
record_transformation(
|
|
91
|
-
file_path: file_path,
|
|
92
|
-
parser: @current_parser,
|
|
93
|
-
duration: Time.now - transformation_start,
|
|
94
|
-
success: false,
|
|
95
|
-
error: e,
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
# Re-raise the error
|
|
99
|
-
raise
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Auto-detect file format and return appropriate parser class
|
|
104
|
-
#
|
|
105
|
-
# Uses multiple detection strategies:
|
|
106
|
-
# 1. File extension
|
|
107
|
-
# 2. Content detection (magic bytes)
|
|
108
|
-
# 3. Fallback parser from configuration
|
|
109
|
-
#
|
|
110
|
-
# @param file_path [String] Path to the model file
|
|
111
|
-
# @return [Class, nil] Parser class, or nil if format cannot be detected
|
|
112
|
-
def detect_parser(file_path) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
113
|
-
# Strategy 1: File extension detection
|
|
114
|
-
if @configuration.file_extension_detection_enabled?
|
|
115
|
-
parser_class = @format_registry.parser_for_file(file_path)
|
|
116
|
-
return parser_class if parser_class
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Strategy 2: Content detection
|
|
120
|
-
if @configuration.content_sniffing_enabled?
|
|
121
|
-
parser_class = @format_registry.detect_by_content(file_path)
|
|
122
|
-
return parser_class if parser_class
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
# Strategy 3: Fallback parser
|
|
126
|
-
fallback_parser_name = @configuration.fallback_parser
|
|
127
|
-
if fallback_parser_name
|
|
128
|
-
return constantize_class(fallback_parser_name)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
nil
|
|
132
|
-
rescue StandardError
|
|
133
|
-
nil
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Get list of supported file extensions
|
|
137
|
-
#
|
|
138
|
-
# @return [Array<String>] List of supported extensions
|
|
139
|
-
def supported_extensions
|
|
140
|
-
@format_registry.supported_extensions
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Check if a file format is supported
|
|
144
|
-
#
|
|
145
|
-
# @param file_path [String] Path to check
|
|
146
|
-
# @return [Boolean] true if format is supported
|
|
147
|
-
def supports_file?(file_path)
|
|
148
|
-
detect_parser(file_path) != nil
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Register a custom parser for a file extension
|
|
152
|
-
#
|
|
153
|
-
# @param extension [String] File extension (e.g., ".custom")
|
|
154
|
-
# @param parser_class [Class] Parser class implementing BaseParser
|
|
155
|
-
# interface
|
|
156
|
-
# @return [void]
|
|
157
|
-
def register_parser(extension, parser_class)
|
|
158
|
-
@format_registry.register(extension, parser_class)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# Unregister a parser for a file extension
|
|
162
|
-
#
|
|
163
|
-
# @param extension [String] File extension to unregister
|
|
164
|
-
# @return [Class, nil] The unregistered parser class
|
|
165
|
-
def unregister_parser(extension)
|
|
166
|
-
@format_registry.unregister(extension)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Set configuration and reload parsers
|
|
170
|
-
#
|
|
171
|
-
# @param config [Configuration] New configuration
|
|
172
|
-
# @return [void]
|
|
173
|
-
def configuration=(config)
|
|
174
|
-
@configuration = config
|
|
175
|
-
@parser_cache.clear
|
|
176
|
-
setup_parsers
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Get comprehensive transformation statistics
|
|
180
|
-
#
|
|
181
|
-
# @return [Hash] Statistics about transformations
|
|
182
|
-
def statistics # rubocop:disable Metrics/MethodLength
|
|
183
|
-
successful_transformations = @transformation_history.count do |t|
|
|
184
|
-
t[:success]
|
|
185
|
-
end
|
|
186
|
-
failed_transformations = @transformation_history.count do |t|
|
|
187
|
-
!t[:success]
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
{
|
|
191
|
-
total_transformations: @transformation_history.size,
|
|
192
|
-
successful_transformations: successful_transformations,
|
|
193
|
-
failed_transformations: failed_transformations,
|
|
194
|
-
success_rate: calculate_success_rate,
|
|
195
|
-
average_duration: calculate_average_duration,
|
|
196
|
-
supported_extensions: supported_extensions,
|
|
197
|
-
registered_parsers: @format_registry.all_parsers.keys,
|
|
198
|
-
configuration_version: @configuration.version,
|
|
199
|
-
}
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
# Clear transformation history
|
|
203
|
-
#
|
|
204
|
-
# @return [void]
|
|
205
|
-
def clear_history
|
|
206
|
-
@transformation_history.clear
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Get transformation history for a specific file
|
|
210
|
-
#
|
|
211
|
-
# @param file_path [String] Path to the file
|
|
212
|
-
# @return [Array<Hash>] Transformation history entries for the file
|
|
213
|
-
def history_for_file(file_path)
|
|
214
|
-
@transformation_history.select do |entry|
|
|
215
|
-
entry[:file_path] == file_path
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
# Get recent transformation failures
|
|
220
|
-
#
|
|
221
|
-
# @param limit [Integer] Maximum number of failures to return
|
|
222
|
-
# @return [Array<Hash>] Recent failure entries
|
|
223
|
-
def recent_failures(limit = 10)
|
|
224
|
-
@transformation_history
|
|
225
|
-
.reject { |entry| entry[:success] }
|
|
226
|
-
.last(limit)
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
# Validate configuration and parsers
|
|
230
|
-
#
|
|
231
|
-
# @return [Hash] Validation results
|
|
232
|
-
def validate_setup # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
233
|
-
results = {
|
|
234
|
-
configuration_valid: false,
|
|
235
|
-
parsers_loaded: 0,
|
|
236
|
-
parser_errors: [],
|
|
237
|
-
warnings: [],
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
# Validate configuration
|
|
241
|
-
begin
|
|
242
|
-
if @configuration&.enabled_parsers&.any?
|
|
243
|
-
results[:configuration_valid] = true
|
|
244
|
-
else
|
|
245
|
-
results[:warnings] << "No enabled parsers in configuration"
|
|
246
|
-
end
|
|
247
|
-
rescue StandardError => e
|
|
248
|
-
results[:parser_errors] << "Configuration error: #{e.message}"
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
# Validate each parser
|
|
252
|
-
@format_registry.all_parsers.each_value do |parser_class|
|
|
253
|
-
# Try to create instance to validate
|
|
254
|
-
parser = parser_class.new(configuration: @configuration)
|
|
255
|
-
if parser.class.method_defined?(:parse)
|
|
256
|
-
results[:parsers_loaded] += 1
|
|
257
|
-
else
|
|
258
|
-
results[:parser_errors] << "Parser #{parser_class} does not " \
|
|
259
|
-
"implement parse method"
|
|
260
|
-
end
|
|
261
|
-
rescue StandardError => e
|
|
262
|
-
results[:parser_errors] << "Failed to instantiate #{parser_class}: " \
|
|
263
|
-
"#{e.message}"
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
results
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
private
|
|
270
|
-
|
|
271
|
-
# Setup parsers from configuration
|
|
272
|
-
#
|
|
273
|
-
# @return [void]
|
|
274
|
-
def setup_parsers
|
|
275
|
-
# Clear existing parsers
|
|
276
|
-
@format_registry.clear
|
|
277
|
-
|
|
278
|
-
# Load parsers from configuration
|
|
279
|
-
@format_registry.load_from_configuration(@configuration)
|
|
280
|
-
|
|
281
|
-
# Load default parsers if none configured
|
|
282
|
-
if @format_registry.supported_extensions.empty?
|
|
283
|
-
@format_registry.load_default_parsers
|
|
284
|
-
end
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
# Get parser instance (with caching)
|
|
288
|
-
#
|
|
289
|
-
# @param parser_class [Class] Parser class
|
|
290
|
-
# @param options [Hash] Parser options
|
|
291
|
-
# @return [BaseParser] Parser instance
|
|
292
|
-
def get_parser_instance(parser_class, options)
|
|
293
|
-
cache_key = [parser_class, options.hash]
|
|
294
|
-
|
|
295
|
-
@parser_cache[cache_key] ||= parser_class.new(
|
|
296
|
-
configuration: @configuration,
|
|
297
|
-
options: options,
|
|
298
|
-
)
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
# Merge options with configuration defaults
|
|
302
|
-
#
|
|
303
|
-
# @param options [Hash] User-provided options
|
|
304
|
-
# @return [Hash] Merged options
|
|
305
|
-
def merge_options(options) # rubocop:disable Metrics/MethodLength
|
|
306
|
-
default_options = {}
|
|
307
|
-
|
|
308
|
-
if @configuration.transformation_options
|
|
309
|
-
default_options = {
|
|
310
|
-
validate_output: @configuration
|
|
311
|
-
.transformation_options.validate_output,
|
|
312
|
-
include_diagrams: @configuration
|
|
313
|
-
.transformation_options.include_diagrams,
|
|
314
|
-
preserve_ids: @configuration.transformation_options.preserve_ids,
|
|
315
|
-
resolve_references: @configuration
|
|
316
|
-
.transformation_options.resolve_references,
|
|
317
|
-
strict_mode: @configuration.transformation_options.strict_mode,
|
|
318
|
-
}
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
default_options.merge(options)
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
# Record transformation in history
|
|
325
|
-
#
|
|
326
|
-
# @param entry [Hash] Transformation entry
|
|
327
|
-
# @return [void]
|
|
328
|
-
def record_transformation(entry)
|
|
329
|
-
# Add timestamp and additional metadata
|
|
330
|
-
full_entry = entry.merge(
|
|
331
|
-
timestamp: Time.now,
|
|
332
|
-
engine_version: self.class.name,
|
|
333
|
-
configuration_version: @configuration.version,
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
@transformation_history << full_entry
|
|
337
|
-
|
|
338
|
-
# Keep history size manageable (last 1000 entries)
|
|
339
|
-
@transformation_history.shift if @transformation_history.size > 1000
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
# Calculate success rate
|
|
343
|
-
#
|
|
344
|
-
# @return [Float] Success rate as percentage
|
|
345
|
-
def calculate_success_rate
|
|
346
|
-
return 0.0 if @transformation_history.empty?
|
|
347
|
-
|
|
348
|
-
successful = @transformation_history.count { |t| t[:success] }
|
|
349
|
-
(successful.to_f / @transformation_history.size * 100).round(2)
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
# Calculate average transformation duration
|
|
353
|
-
#
|
|
354
|
-
# @return [Float] Average duration in seconds
|
|
355
|
-
def calculate_average_duration
|
|
356
|
-
return 0.0 if @transformation_history.empty?
|
|
357
|
-
|
|
358
|
-
total_duration = @transformation_history.sum { |t| t[:duration] || 0 }
|
|
359
|
-
(total_duration / @transformation_history.size).round(3)
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
# Validate file path
|
|
363
|
-
#
|
|
364
|
-
# @param file_path [String] File path to validate
|
|
365
|
-
# @raise [ArgumentError] if path is invalid
|
|
366
|
-
def validate_file_path!(file_path)
|
|
367
|
-
raise ArgumentError, "File path cannot be nil" if file_path.nil?
|
|
368
|
-
raise ArgumentError, "File path cannot be empty" if file_path.empty?
|
|
369
|
-
|
|
370
|
-
unless File.exist?(file_path)
|
|
371
|
-
raise ArgumentError,
|
|
372
|
-
"File does not exist: #{file_path}"
|
|
373
|
-
end
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
# Convert string class name to class constant
|
|
377
|
-
#
|
|
378
|
-
# @param class_name [String] Fully qualified class name
|
|
379
|
-
# @return [Class] The class constant
|
|
380
|
-
def constantize_class(class_name)
|
|
381
|
-
parts = class_name.split("::")
|
|
382
|
-
constant = Object
|
|
383
|
-
parts.each { |part| constant = constant.const_get(part) }
|
|
384
|
-
constant
|
|
385
|
-
rescue NameError
|
|
386
|
-
nil
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
# Error class for unsupported file formats
|
|
391
|
-
class UnsupportedFormatError < Lutaml::Error
|
|
392
|
-
# @return [String] Path to the unsupported file
|
|
393
|
-
attr_reader :file_path
|
|
394
|
-
|
|
395
|
-
# Initialize error
|
|
396
|
-
#
|
|
397
|
-
# @param file_path [String] Path to unsupported file
|
|
398
|
-
def initialize(file_path)
|
|
399
|
-
@file_path = file_path
|
|
400
|
-
extension = File.extname(file_path)
|
|
401
|
-
super("Unsupported file format: #{extension} (file: #{file_path})")
|
|
402
|
-
end
|
|
403
|
-
end
|
|
404
|
-
end
|
|
405
|
-
end
|