lutaml 0.9.43 → 0.10.1
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 +378 -0
- data/Gemfile +15 -7
- data/README.adoc +1854 -21
- data/Rakefile +7 -1
- data/TODO.bugfix.md +24 -0
- 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 +504 -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 +417 -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 +51 -26
- 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 +564 -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 +466 -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 +723 -0
- data/lib/lutaml/qea/factory/constraint_transformer.rb +78 -0
- data/lib/lutaml/qea/factory/data_type_transformer.rb +155 -0
- data/lib/lutaml/qea/factory/diagram_transformer.rb +179 -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 +85 -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 +225 -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 +310 -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 +169 -0
- data/lib/lutaml/qea/verification/document_verifier.rb +330 -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 +478 -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 +503 -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 +325 -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 +798 -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 +162 -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 +93 -166
- 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 +19 -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 +644 -28
- data/CODE_OF_CONDUCT.md +0 -74
- data/docs/lutaml-sysml.adoc +0 -10
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../output_formatter"
|
|
4
|
+
require_relative "../../uml"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Cli
|
|
8
|
+
module Uml
|
|
9
|
+
# SpaCommand generates static SPA browser for UML models
|
|
10
|
+
class SpaCommand
|
|
11
|
+
attr_reader :options
|
|
12
|
+
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
@options = options.transform_keys(&:to_sym)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.add_options_to(thor_class, _method_name) # rubocop:disable Metrics/MethodLength
|
|
18
|
+
thor_class.long_desc <<-DESC
|
|
19
|
+
Generate a modern, interactive Single Page Application (SPA) for browsing
|
|
20
|
+
UML models. Supports both single-file (all-in-one HTML) and multi-file
|
|
21
|
+
(separate assets) output modes.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
# Single-file SPA (open directly in browser)
|
|
25
|
+
lutaml uml build-spa model.lur -o browser.html
|
|
26
|
+
|
|
27
|
+
# Multi-file site (for hosting)
|
|
28
|
+
lutaml uml build-spa model.lur -o dist/ -m multi-file
|
|
29
|
+
|
|
30
|
+
# With custom title and minification
|
|
31
|
+
lutaml uml build-spa model.lur -o dist/ --title "My Model" --minify
|
|
32
|
+
|
|
33
|
+
# From QEA file
|
|
34
|
+
lutaml uml build-spa model.qea -o browser.html
|
|
35
|
+
DESC
|
|
36
|
+
|
|
37
|
+
thor_class.option :output, aliases: "-o", required: true,
|
|
38
|
+
desc: "Output path (file for " \
|
|
39
|
+
"single-file, directory for " \
|
|
40
|
+
"multi-file)"
|
|
41
|
+
thor_class.option :mode, aliases: "-m", default: "single-file",
|
|
42
|
+
desc: "Output mode: 'single-file' or " \
|
|
43
|
+
"'multi-file'"
|
|
44
|
+
thor_class.option :title, type: :string, default: "UML Model Browser",
|
|
45
|
+
desc: "Site title"
|
|
46
|
+
thor_class.option :minify, type: :boolean, default: false,
|
|
47
|
+
desc: "Minify HTML/CSS/JS output"
|
|
48
|
+
thor_class.option :theme, type: :string, default: "light",
|
|
49
|
+
desc: "Default theme: 'light' or 'dark'"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def run(input_path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
53
|
+
validate_input(input_path)
|
|
54
|
+
|
|
55
|
+
mode = determine_mode
|
|
56
|
+
output_path = validate_output_path(mode)
|
|
57
|
+
|
|
58
|
+
OutputFormatter.progress("Loading repository from #{input_path}")
|
|
59
|
+
repository = load_repository(input_path)
|
|
60
|
+
OutputFormatter.progress_done
|
|
61
|
+
|
|
62
|
+
OutputFormatter.progress("Generating SPA (#{mode} mode)")
|
|
63
|
+
generate_spa(repository, mode, output_path)
|
|
64
|
+
OutputFormatter.progress_done
|
|
65
|
+
|
|
66
|
+
display_success_message(mode, output_path)
|
|
67
|
+
rescue StandardError => e
|
|
68
|
+
OutputFormatter.progress_done(success: false)
|
|
69
|
+
puts OutputFormatter.error("SPA generation failed: #{e.message}")
|
|
70
|
+
puts "Backtrace:"
|
|
71
|
+
puts e.backtrace.first(20).join("\n")
|
|
72
|
+
raise Thor::Error, "SPA generation failed: #{e.message}"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
def validate_input(input_path)
|
|
78
|
+
return if File.exist?(input_path)
|
|
79
|
+
|
|
80
|
+
puts OutputFormatter.error("Input file not found: #{input_path}")
|
|
81
|
+
raise Thor::Error, "Input file not found: #{input_path}"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def detect_mode # rubocop:disable Metrics/MethodLength
|
|
85
|
+
mode_value = options[:mode] || options["mode"] || "single-file"
|
|
86
|
+
|
|
87
|
+
case mode_value.downcase
|
|
88
|
+
when "single-file", "single_file", "single"
|
|
89
|
+
:single_file
|
|
90
|
+
when "multi-file", "multi_file", "multi"
|
|
91
|
+
:multi_file
|
|
92
|
+
else
|
|
93
|
+
puts OutputFormatter.error("Invalid mode: #{mode_value}. " \
|
|
94
|
+
"Use 'single-file' or 'multi-file'")
|
|
95
|
+
raise Thor::Error,
|
|
96
|
+
"Invalid mode: #{mode_value}. " \
|
|
97
|
+
"Use 'single-file' or 'multi-file'"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def determine_mode # rubocop:disable Metrics/MethodLength
|
|
102
|
+
mode_value = options[:mode] || "single-file"
|
|
103
|
+
|
|
104
|
+
case mode_value.to_s.downcase
|
|
105
|
+
when "multi-file", "multi_file", "multifile"
|
|
106
|
+
:multi_file
|
|
107
|
+
when "single-file", "single_file", "singlefile", ""
|
|
108
|
+
:single_file
|
|
109
|
+
else
|
|
110
|
+
puts OutputFormatter.error("Invalid mode: #{mode_value}. " \
|
|
111
|
+
"Use 'single-file' or 'multi-file'")
|
|
112
|
+
raise Thor::Error,
|
|
113
|
+
"Invalid mode: #{mode_value}. " \
|
|
114
|
+
"Use 'single-file' or 'multi-file'"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def validate_output_path(mode) # rubocop:disable Metrics/MethodLength
|
|
119
|
+
output = options[:output]
|
|
120
|
+
|
|
121
|
+
# For multi-file mode, ensure output is a directory
|
|
122
|
+
if mode == :multi_file && File.extname(output) != ""
|
|
123
|
+
puts OutputFormatter.colorize(
|
|
124
|
+
"Warning: Multi-file mode requires directory output", :yellow
|
|
125
|
+
)
|
|
126
|
+
output_dir = File.dirname(output)
|
|
127
|
+
puts "Using directory: #{output_dir}"
|
|
128
|
+
output_dir
|
|
129
|
+
else
|
|
130
|
+
output
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def load_repository(path)
|
|
135
|
+
ext = File.extname(path).downcase
|
|
136
|
+
|
|
137
|
+
case ext
|
|
138
|
+
when ".lur"
|
|
139
|
+
load_from_lur(path)
|
|
140
|
+
when ".qea"
|
|
141
|
+
load_from_qea(path)
|
|
142
|
+
else
|
|
143
|
+
raise "Unsupported file type: #{ext}. Expected .lur or .qea"
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def load_from_lur(path)
|
|
148
|
+
Lutaml::UmlRepository::Repository.from_package(path)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def load_from_qea(path)
|
|
152
|
+
require_relative "../../qea"
|
|
153
|
+
|
|
154
|
+
# Load QEA database
|
|
155
|
+
qea_db = Lutaml::Qea::Services::DatabaseLoader.new(path).load
|
|
156
|
+
|
|
157
|
+
# Convert to UML Document using factory
|
|
158
|
+
factory = Lutaml::Qea::Factory::EaToUmlFactory.new(qea_db)
|
|
159
|
+
document = factory.create_document
|
|
160
|
+
|
|
161
|
+
# Create repository from document
|
|
162
|
+
Lutaml::UmlRepository::Repository.new(document: document)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def generate_spa(repository, mode, output_path)
|
|
166
|
+
generation_options = {
|
|
167
|
+
mode: mode,
|
|
168
|
+
output: output_path,
|
|
169
|
+
title: options[:title] || "UML Model Browser",
|
|
170
|
+
minify: options[:minify] || false,
|
|
171
|
+
theme: options[:theme] || "light",
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
Lutaml::UmlRepository::StaticSite.generate(repository,
|
|
175
|
+
generation_options)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def display_success_message(mode, output_path) # rubocop:disable Metrics/MethodLength
|
|
179
|
+
puts ""
|
|
180
|
+
if mode == :single_file
|
|
181
|
+
size_mb = File.size(output_path) / 1024.0 / 1024.0
|
|
182
|
+
puts OutputFormatter.success(
|
|
183
|
+
"Generated single-file SPA: #{output_path} " \
|
|
184
|
+
"(#{'%.2f' % size_mb} MB)",
|
|
185
|
+
)
|
|
186
|
+
puts OutputFormatter.colorize("Open in browser to view", :cyan)
|
|
187
|
+
else
|
|
188
|
+
puts OutputFormatter.success(
|
|
189
|
+
"Generated multi-file site in: #{output_path}",
|
|
190
|
+
)
|
|
191
|
+
puts OutputFormatter.colorize(
|
|
192
|
+
"Open #{output_path}/index.html in browser", :cyan
|
|
193
|
+
)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def format_size(bytes)
|
|
198
|
+
if bytes < 1024
|
|
199
|
+
"#{bytes} B"
|
|
200
|
+
elsif bytes < 1024 * 1024
|
|
201
|
+
"#{'%.2f' % (bytes / 1024.0)} KB"
|
|
202
|
+
else
|
|
203
|
+
"#{'%.2f' % (bytes / 1024.0 / 1024.0)} MB"
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../output_formatter"
|
|
4
|
+
require_relative "shared_helpers"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Cli
|
|
8
|
+
module Uml
|
|
9
|
+
# StatsCommand shows repository statistics
|
|
10
|
+
class StatsCommand
|
|
11
|
+
include SharedHelpers
|
|
12
|
+
|
|
13
|
+
attr_reader :options
|
|
14
|
+
|
|
15
|
+
def initialize(options = {})
|
|
16
|
+
@options = options.transform_keys(&:to_sym)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.add_options_to(thor_class, _method_name)
|
|
20
|
+
thor_class.long_desc <<-DESC
|
|
21
|
+
Display statistics about the repository or a specific package.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
lutaml uml stats model.lur # Full repository stats
|
|
25
|
+
lutaml uml stats model.lur --detailed # Detailed breakdown
|
|
26
|
+
lutaml uml stats model.lur --type diagrams # Diagram-specific stats
|
|
27
|
+
DESC
|
|
28
|
+
|
|
29
|
+
thor_class.option :type, type: :string, default: "all",
|
|
30
|
+
desc: "Statistics type " \
|
|
31
|
+
"(packages|classes|diagrams|all)"
|
|
32
|
+
thor_class.option :detailed, type: :boolean, default: false,
|
|
33
|
+
desc: "Show detailed statistics"
|
|
34
|
+
thor_class.option :format, type: :string, default: "text",
|
|
35
|
+
desc: "Output format (text|yaml|json)"
|
|
36
|
+
thor_class.option :lazy, type: :boolean, default: false,
|
|
37
|
+
desc: "Use lazy loading"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def run(lur_path, _path = nil) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
41
|
+
repo = load_repository(lur_path, lazy: options[:lazy])
|
|
42
|
+
statistics = repo.statistics
|
|
43
|
+
|
|
44
|
+
if options[:format] == "text"
|
|
45
|
+
puts OutputFormatter.format_stats(statistics,
|
|
46
|
+
detailed: options[:detailed])
|
|
47
|
+
else
|
|
48
|
+
puts OutputFormatter.format(statistics, format: options[:format])
|
|
49
|
+
end
|
|
50
|
+
rescue Thor::Error
|
|
51
|
+
raise
|
|
52
|
+
rescue ArgumentError => e
|
|
53
|
+
raise Thor::Error, e.message
|
|
54
|
+
rescue StandardError => e
|
|
55
|
+
raise Thor::Error, "Stats command failed: #{e.message}"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../output_formatter"
|
|
4
|
+
require_relative "shared_helpers"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Cli
|
|
8
|
+
module Uml
|
|
9
|
+
# TreeCommand shows hierarchical tree view
|
|
10
|
+
class TreeCommand
|
|
11
|
+
include SharedHelpers
|
|
12
|
+
|
|
13
|
+
attr_reader :options
|
|
14
|
+
|
|
15
|
+
def initialize(options = {})
|
|
16
|
+
@options = options.transform_keys(&:to_sym)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.add_options_to(thor_class, _method_name)
|
|
20
|
+
thor_class.long_desc <<-DESC
|
|
21
|
+
Display a tree view of the package hierarchy.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
lutaml uml tree model.lur # Full tree
|
|
25
|
+
lutaml uml tree model.lur ModelRoot::Core # Subtree
|
|
26
|
+
lutaml uml tree model.lur --depth 2 # Limited depth
|
|
27
|
+
DESC
|
|
28
|
+
|
|
29
|
+
thor_class.option :depth, aliases: "-d", type: :numeric,
|
|
30
|
+
desc: "Maximum depth to display"
|
|
31
|
+
thor_class.option :show_counts, type: :boolean, default: true,
|
|
32
|
+
desc: "Show class and diagram counts"
|
|
33
|
+
thor_class.option :format, type: :string, default: "text",
|
|
34
|
+
desc: "Output format (text|yaml|json)"
|
|
35
|
+
thor_class.option :lazy, type: :boolean, default: false,
|
|
36
|
+
desc: "Use lazy loading"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def run(lur_path, path = nil) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
40
|
+
unless File.exist?(lur_path)
|
|
41
|
+
puts OutputFormatter.error("Package file not found: #{lur_path}")
|
|
42
|
+
raise Thor::Error, "Package file not found: #{lur_path}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
path = normalize_path(path)
|
|
46
|
+
repo = load_repository(lur_path, lazy: options[:lazy])
|
|
47
|
+
tree_data = repo.package_tree(path, max_depth: options[:depth])
|
|
48
|
+
|
|
49
|
+
unless tree_data
|
|
50
|
+
puts OutputFormatter.error("Package not found: #{path}")
|
|
51
|
+
raise Thor::Error, "Package not found: #{path}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if options[:format] == "text"
|
|
55
|
+
puts display_tree_without_root(tree_data,
|
|
56
|
+
show_counts: options[:show_counts])
|
|
57
|
+
else
|
|
58
|
+
puts OutputFormatter.format(tree_data, format: options[:format])
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def display_tree_without_root(tree_data, show_counts: true) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
65
|
+
name = if tree_data.is_a?(Hash)
|
|
66
|
+
tree_data["name"] || tree_data[:name]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if name == "ModelRoot"
|
|
70
|
+
children = tree_data["children"] || tree_data[:children]
|
|
71
|
+
if children.is_a?(Array) && !children.empty?
|
|
72
|
+
children.map do |child|
|
|
73
|
+
OutputFormatter.format_tree(child, show_counts: show_counts)
|
|
74
|
+
end.join("\n")
|
|
75
|
+
else
|
|
76
|
+
"(empty repository)"
|
|
77
|
+
end
|
|
78
|
+
else
|
|
79
|
+
OutputFormatter.format_tree(tree_data, show_counts: show_counts)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../output_formatter"
|
|
4
|
+
module Lutaml
|
|
5
|
+
module Cli
|
|
6
|
+
module Uml
|
|
7
|
+
# ValidateCommand validates LUR packages or QEA files
|
|
8
|
+
class ValidateCommand
|
|
9
|
+
attr_reader :options
|
|
10
|
+
|
|
11
|
+
def initialize(options = {})
|
|
12
|
+
@options = options.transform_keys(&:to_sym)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.add_options_to(thor_class, _method_name) # rubocop:disable Metrics/MethodLength
|
|
16
|
+
thor_class.long_desc <<-DESC
|
|
17
|
+
Validate a LUR package or QEA file for consistency and completeness.
|
|
18
|
+
|
|
19
|
+
Auto-detects file type:
|
|
20
|
+
- .lur files: Validate LUR package structure
|
|
21
|
+
- .qea files: Validate QEA file structure and integrity
|
|
22
|
+
|
|
23
|
+
LUR validation checks:
|
|
24
|
+
- Dangling references
|
|
25
|
+
- Missing types
|
|
26
|
+
- External dependencies
|
|
27
|
+
- Structural integrity
|
|
28
|
+
|
|
29
|
+
QEA validation checks:
|
|
30
|
+
- Package structure validation
|
|
31
|
+
- Class and attribute validation
|
|
32
|
+
- Association endpoint validation
|
|
33
|
+
- Referential integrity
|
|
34
|
+
- Orphaned elements
|
|
35
|
+
- Circular references
|
|
36
|
+
|
|
37
|
+
Examples:
|
|
38
|
+
lutaml uml validate model.lur
|
|
39
|
+
lutaml uml validate model.qea
|
|
40
|
+
lutaml uml validate model.qea --format json -o report.json
|
|
41
|
+
DESC
|
|
42
|
+
|
|
43
|
+
thor_class.option :format, type: :string, default: "text",
|
|
44
|
+
desc: "Output format (text|json)"
|
|
45
|
+
thor_class.option :output, aliases: "-o", type: :string,
|
|
46
|
+
desc: "Save report to file"
|
|
47
|
+
thor_class.option :strict, type: :boolean, default: false,
|
|
48
|
+
desc: "Exit with error if validation fails"
|
|
49
|
+
thor_class.option :show_warnings, type: :boolean, default: true,
|
|
50
|
+
desc: "Show warnings in output"
|
|
51
|
+
thor_class.option :verbose, type: :boolean, default: false,
|
|
52
|
+
desc: "Show detailed validation messages"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def run(file_path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
56
|
+
unless File.exist?(file_path)
|
|
57
|
+
puts OutputFormatter.error("File not found: #{file_path}")
|
|
58
|
+
raise Thor::Error, "File not found: #{file_path}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Auto-detect file type
|
|
62
|
+
if file_path.end_with?(".qea")
|
|
63
|
+
validate_qea_file(file_path)
|
|
64
|
+
elsif file_path.end_with?(".lur")
|
|
65
|
+
validate_lur_file(file_path)
|
|
66
|
+
else
|
|
67
|
+
puts OutputFormatter.error(
|
|
68
|
+
"Unsupported file type. Please provide a .qea or .lur file.",
|
|
69
|
+
)
|
|
70
|
+
raise Thor::Error,
|
|
71
|
+
"Unsupported file type. Please provide a .qea or .lur file."
|
|
72
|
+
end
|
|
73
|
+
rescue Thor::Error
|
|
74
|
+
raise
|
|
75
|
+
rescue StandardError => e
|
|
76
|
+
OutputFormatter.progress_done(success: false)
|
|
77
|
+
puts OutputFormatter.error("Validation failed: #{e.message}")
|
|
78
|
+
puts e.backtrace.first(5).join("\n") if ENV["DEBUG"]
|
|
79
|
+
raise Thor::Error, "Validation failed: #{e.message}"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def validate_lur_file(lur_path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
85
|
+
OutputFormatter.progress("Loading package")
|
|
86
|
+
repo = Lutaml::UmlRepository::Repository.from_package(lur_path)
|
|
87
|
+
OutputFormatter.progress_done
|
|
88
|
+
|
|
89
|
+
OutputFormatter.progress("Validating repository")
|
|
90
|
+
result = repo.validate
|
|
91
|
+
OutputFormatter.progress_done
|
|
92
|
+
|
|
93
|
+
puts ""
|
|
94
|
+
if result.valid?
|
|
95
|
+
puts OutputFormatter.success("Package is valid")
|
|
96
|
+
else
|
|
97
|
+
puts OutputFormatter.warning("Package has validation issues")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
display_validation_results(result)
|
|
101
|
+
|
|
102
|
+
if options[:strict] && result.errors.any?
|
|
103
|
+
raise Thor::Error, "Package validation failed"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def validate_qea_file(qea_path) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
108
|
+
require_relative "../../qea"
|
|
109
|
+
require_relative "../../qea/validation/formatters/text_formatter"
|
|
110
|
+
require_relative "../../qea/validation/formatters/json_formatter"
|
|
111
|
+
|
|
112
|
+
puts OutputFormatter.colorize("\n=== QEA File Validation ===\n",
|
|
113
|
+
:cyan)
|
|
114
|
+
puts "File: #{qea_path}"
|
|
115
|
+
puts ""
|
|
116
|
+
|
|
117
|
+
# Parse with validation
|
|
118
|
+
OutputFormatter.progress("Loading and validating QEA file")
|
|
119
|
+
result = Lutaml::Qea.parse(qea_path, validate: true)
|
|
120
|
+
OutputFormatter.progress_done
|
|
121
|
+
|
|
122
|
+
result[:document]
|
|
123
|
+
validation_result = result[:validation_result]
|
|
124
|
+
|
|
125
|
+
# Format output
|
|
126
|
+
formatter_class = case options[:format].downcase
|
|
127
|
+
when "json"
|
|
128
|
+
Lutaml::Qea::Validation::Formatters::JsonFormatter
|
|
129
|
+
else
|
|
130
|
+
Lutaml::Qea::Validation::Formatters::TextFormatter
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
formatter_options = {
|
|
134
|
+
result: validation_result,
|
|
135
|
+
verbose: options[:verbose],
|
|
136
|
+
}
|
|
137
|
+
formatter_options[:color] = true if options[:format] == "text"
|
|
138
|
+
|
|
139
|
+
formatter = formatter_class.new(**formatter_options)
|
|
140
|
+
output = formatter.format
|
|
141
|
+
|
|
142
|
+
# Display or save output
|
|
143
|
+
if options[:output]
|
|
144
|
+
File.write(options[:output], output)
|
|
145
|
+
puts OutputFormatter.success(
|
|
146
|
+
"Validation report saved to: #{options[:output]}",
|
|
147
|
+
)
|
|
148
|
+
else
|
|
149
|
+
puts output
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Exit with appropriate status
|
|
153
|
+
if options[:strict] && validation_result.has_errors?
|
|
154
|
+
puts ""
|
|
155
|
+
puts OutputFormatter.error("Validation FAILED")
|
|
156
|
+
raise Thor::Error, "Validation FAILED"
|
|
157
|
+
elsif validation_result.valid?
|
|
158
|
+
puts ""
|
|
159
|
+
puts OutputFormatter.success("Validation PASSED")
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def display_validation_results(result) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
|
164
|
+
if result.warnings.any?
|
|
165
|
+
puts ""
|
|
166
|
+
puts OutputFormatter.colorize("Warnings:", :yellow)
|
|
167
|
+
result.warnings.each { |w| puts " - #{w}" }
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
if result.errors.any?
|
|
171
|
+
puts ""
|
|
172
|
+
puts OutputFormatter.colorize("Errors:", :red)
|
|
173
|
+
result.errors.each { |e| puts " - #{e}" }
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
if result.has_external_references?
|
|
177
|
+
puts ""
|
|
178
|
+
puts OutputFormatter.colorize(
|
|
179
|
+
"External Type References (#{result.external_references.size}):",
|
|
180
|
+
:cyan,
|
|
181
|
+
)
|
|
182
|
+
puts ""
|
|
183
|
+
puts OutputFormatter.format_array_table(
|
|
184
|
+
result.external_references,
|
|
185
|
+
options: {
|
|
186
|
+
title: "Types referenced but not defined in this repository",
|
|
187
|
+
layout: false,
|
|
188
|
+
},
|
|
189
|
+
)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../output_formatter"
|
|
4
|
+
require_relative "../../qea/verification/document_verifier"
|
|
5
|
+
|
|
6
|
+
module Lutaml
|
|
7
|
+
module Cli
|
|
8
|
+
module Uml
|
|
9
|
+
# VerifyCommand verifies XMI/QEA equivalence
|
|
10
|
+
class VerifyCommand
|
|
11
|
+
attr_reader :options
|
|
12
|
+
|
|
13
|
+
def initialize(options = {})
|
|
14
|
+
@options = options.transform_keys(&:to_sym)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.add_options_to(thor_class, _method_name)
|
|
18
|
+
thor_class.long_desc <<-DESC
|
|
19
|
+
Verify that QEA and XMI files contain equivalent information.
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
lutaml uml verify model.xmi model.qea
|
|
23
|
+
lutaml uml verify model.xmi model.qea --report report.json
|
|
24
|
+
DESC
|
|
25
|
+
|
|
26
|
+
thor_class.option :report, type: :string, desc: "Save report to file"
|
|
27
|
+
thor_class.option :format, type: :string, default: "text",
|
|
28
|
+
desc: "Output format (text|json|yaml)"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def run(xmi_path, qea_path) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
32
|
+
unless File.exist?(xmi_path)
|
|
33
|
+
puts OutputFormatter.error("XMI file not found: #{xmi_path}")
|
|
34
|
+
raise Thor::Error, "XMI file not found: #{xmi_path}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
unless File.exist?(qea_path)
|
|
38
|
+
puts OutputFormatter.error("QEA file not found: #{qea_path}")
|
|
39
|
+
raise Thor::Error, "QEA file not found: #{qea_path}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
puts OutputFormatter.colorize(
|
|
43
|
+
"\n=== XMI/QEA Equivalence Verification ===\n", :cyan
|
|
44
|
+
)
|
|
45
|
+
puts "XMI File: #{xmi_path}"
|
|
46
|
+
puts "QEA File: #{qea_path}"
|
|
47
|
+
puts ""
|
|
48
|
+
|
|
49
|
+
OutputFormatter.progress("Verifying equivalence")
|
|
50
|
+
verifier = Lutaml::Qea::Verification::DocumentVerifier.new
|
|
51
|
+
|
|
52
|
+
begin
|
|
53
|
+
result = verifier.verify(xmi_path, qea_path)
|
|
54
|
+
OutputFormatter.progress_done
|
|
55
|
+
rescue StandardError => e
|
|
56
|
+
OutputFormatter.progress_done(success: false)
|
|
57
|
+
puts OutputFormatter.error("Verification failed: #{e.message}")
|
|
58
|
+
raise Thor::Error, "Verification failed: #{e.message}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
display_verification_result(result)
|
|
62
|
+
|
|
63
|
+
if options[:report]
|
|
64
|
+
save_verification_report(result, options[:report])
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Exit with appropriate status
|
|
68
|
+
if options[:strict] && !result.equivalent?
|
|
69
|
+
puts ""
|
|
70
|
+
puts OutputFormatter.error("Verification FAILED")
|
|
71
|
+
raise Thor::Error, "Verification FAILED"
|
|
72
|
+
elsif result.equivalent?
|
|
73
|
+
puts ""
|
|
74
|
+
puts OutputFormatter.success("Verification PASSED")
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def display_verification_result(result)
|
|
81
|
+
puts result.summary
|
|
82
|
+
|
|
83
|
+
if result.critical_issues.any?
|
|
84
|
+
puts "\n#{OutputFormatter.colorize('Critical Issues:', :red)}"
|
|
85
|
+
result.critical_issues.each do |issue|
|
|
86
|
+
puts " ✗ #{issue}"
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def save_verification_report(result, report_path)
|
|
92
|
+
report_data = result.to_report
|
|
93
|
+
ext = File.extname(report_path).downcase
|
|
94
|
+
report_format = case ext
|
|
95
|
+
when ".json" then :json
|
|
96
|
+
when ".yaml", ".yml" then :yaml
|
|
97
|
+
else :json
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
File.write(report_path,
|
|
101
|
+
OutputFormatter.format(report_data, format: report_format))
|
|
102
|
+
puts OutputFormatter.success("Report saved: #{report_path}")
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|