lutaml 0.9.43 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (583) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +63 -0
  3. data/.github/workflows/links.yml +99 -0
  4. data/.github/workflows/rake.yml +13 -2
  5. data/.github/workflows/release.yml +12 -6
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +11 -3
  8. data/.rubocop_todo.yml +336 -0
  9. data/Gemfile +18 -7
  10. data/README.adoc +1854 -21
  11. data/Rakefile +7 -1
  12. data/bin/plantuml2lutaml +3 -3
  13. data/bin/yaml2lutaml +2 -2
  14. data/config/diagram_styles.yml +200 -0
  15. data/config/model_transformations.yml +266 -0
  16. data/config/package_metadata.example.yml +58 -0
  17. data/config/qea_schema.yml +1024 -0
  18. data/config/static_site.yml +166 -0
  19. data/docs/.github/workflows/docs.yml +66 -0
  20. data/docs/.github/workflows/links.yml +78 -0
  21. data/docs/CONTINUATION_PLAN.md +168 -0
  22. data/docs/Gemfile +13 -0
  23. data/docs/MIGRATION_GUIDE.md +202 -0
  24. data/docs/README.md +252 -0
  25. data/docs/REFACTOR_PLAN.md +214 -0
  26. data/docs/_config.yml +144 -0
  27. data/docs/_guides/diagram-generation.adoc +316 -0
  28. data/docs/_guides/index.adoc +135 -0
  29. data/docs/{lutaml-express.adoc → _guides/parsing/express-parsing.adoc} +7 -0
  30. data/docs/_guides/parsing/index.adoc +77 -0
  31. data/docs/{lutaml-xmi.adoc → _guides/parsing/xmi-parsing.adoc} +7 -0
  32. data/docs/_guides/sysml-modeling.adoc +37 -0
  33. data/docs/{lutaml-uml.adoc → _guides/uml-modeling.adoc} +8 -2
  34. data/docs/_pages/concepts/diagram-generation.adoc +337 -0
  35. data/docs/_pages/concepts/lur-format.adoc +711 -0
  36. data/docs/_pages/concepts/qea-parsing.adoc +418 -0
  37. data/docs/_pages/core/architecture.adoc +329 -0
  38. data/docs/_pages/core/installation.adoc +321 -0
  39. data/docs/_pages/core/overview.adoc +197 -0
  40. data/docs/_pages/index.adoc +48 -0
  41. data/docs/_pages/uml-syntax.adoc +995 -0
  42. data/docs/_references/configuration/diagram-styles.adoc +716 -0
  43. data/docs/_references/configuration/index.adoc +52 -0
  44. data/docs/_references/configuration/package-metadata.adoc +416 -0
  45. data/docs/_references/formats/index.adoc +42 -0
  46. data/docs/{lutaml_syntax.adoc → _references/formats/lutaml-syntax.adoc} +7 -0
  47. data/docs/_references/formats/qea-structure.adoc +1364 -0
  48. data/docs/_references/index.adoc +197 -0
  49. data/docs/_tutorials/index.adoc +109 -0
  50. data/docs/index.adoc +64 -0
  51. data/docs/lychee.toml +83 -0
  52. data/examples/UML_EA.DTD +6856 -0
  53. data/examples/lur/20251010_current_plateau_v5.1.lur +0 -0
  54. data/examples/lur/basic.lur +0 -0
  55. data/examples/lur/test-output.lur +0 -0
  56. data/examples/lur/test.lur +0 -0
  57. data/examples/lur_basic_usage.rb +220 -0
  58. data/examples/lur_cli_workflow.rb +262 -0
  59. data/examples/lur_statistics.rb +325 -0
  60. data/examples/qea/20251010_current_plateau_v5.1.qea +0 -0
  61. data/examples/qea/ArcGISWorkspace_template.qea +0 -0
  62. data/examples/qea/README_qea_parser.adoc +230 -0
  63. data/examples/qea/UmlModel_template.qea +0 -0
  64. data/examples/qea/basic.qea +0 -0
  65. data/examples/qea/simple.qea +0 -0
  66. data/examples/qea/simple_example.qea +0 -0
  67. data/examples/qea/test.qea +0 -0
  68. data/examples/xmi/20251010_current_plateau_v5.1.xmi +118121 -0
  69. data/examples/xmi/ArcGISWorkspace_template.xmi +1467 -0
  70. data/examples/xmi/Images/EAID_0016F797_D055_4717_AF1A_606413D0A166.svg +158 -0
  71. data/examples/xmi/Images/EAID_00C5C772_5A03_434f_BF30_AC37542A1AAC.svg +659 -0
  72. data/examples/xmi/Images/EAID_0114FD24_9E58_4664_98CD_71305B59AD11.svg +411 -0
  73. data/examples/xmi/Images/EAID_01661E1B_31B6_4167_BCCF_A00678FB4EA2.svg +102 -0
  74. data/examples/xmi/Images/EAID_039FE004_5408_4fc0_89AA_EB319E4F61C7.svg +169 -0
  75. data/examples/xmi/Images/EAID_04EE9625_17A0_4721_BC71_21756DB21D06.svg +403 -0
  76. data/examples/xmi/Images/EAID_05FF9417_1619_4170_B0C9_55AA6B988EF1.svg +175 -0
  77. data/examples/xmi/Images/EAID_09853FB2_AF8A_432f_94C5_6C47461BD937.svg +360 -0
  78. data/examples/xmi/Images/EAID_09927B7F_A657_4819_99E5_AC9DC99227D9.svg +195 -0
  79. data/examples/xmi/Images/EAID_09AF6B8A_557C_43bc_BBB0_47C1E9401EF3.svg +218 -0
  80. data/examples/xmi/Images/EAID_0BE81AC5_031B_4973_A9A0_223CCD92BAA1.svg +471 -0
  81. data/examples/xmi/Images/EAID_0EDEA6EF_4DC8_4979_BB80_28B1B9EBD1D4.svg +56 -0
  82. data/examples/xmi/Images/EAID_0F413534_6AD2_48bc_B4AF_8699D530D91D.svg +262 -0
  83. data/examples/xmi/Images/EAID_1321F39B_AD67_47b5_B5C3_3A42BBFCBDF9.svg +286 -0
  84. data/examples/xmi/Images/EAID_13E09C71_99E7_40b4_B72D_48AF6379BC2E.svg +164 -0
  85. data/examples/xmi/Images/EAID_144955D8_CB4E_4b59_BB0C_E549F7F84943.svg +66 -0
  86. data/examples/xmi/Images/EAID_14E9F5FD_F6CD_4f48_B1CD_F5A40C6D8E83.svg +95 -0
  87. data/examples/xmi/Images/EAID_157826AA_96A7_4278_89A6_94BD0F31409A.svg +63 -0
  88. data/examples/xmi/Images/EAID_159E9DA0_7A54_4817_B72A_401C750F675D.svg +306 -0
  89. data/examples/xmi/Images/EAID_17BC8309_8051_492b_BE87_61CCFE83DB16.svg +45 -0
  90. data/examples/xmi/Images/EAID_1A10EB6D_E2E5_42a6_A31E_B293D93FD07E.svg +193 -0
  91. data/examples/xmi/Images/EAID_1A290AFD_CE96_46a2_8351_A986D77CC727.svg +444 -0
  92. data/examples/xmi/Images/EAID_1B2D9309_C66B_492a_995C_95B2B02E0D7C.svg +168 -0
  93. data/examples/xmi/Images/EAID_1DE6B973_CE8A_416f_909B_54CEA1E5944E.svg +10 -0
  94. data/examples/xmi/Images/EAID_204F4ACC_2230_4c8d_9861_EF5A6844B712.svg +60 -0
  95. data/examples/xmi/Images/EAID_227300E2_4F4B_4955_83B9_FA626CE8680B.svg +188 -0
  96. data/examples/xmi/Images/EAID_22C24D4C_4894_480a_B113_0CB034CB59E9.svg +426 -0
  97. data/examples/xmi/Images/EAID_234BC4F5_8100_4969_BDCB_A24E0E641F23.svg +169 -0
  98. data/examples/xmi/Images/EAID_24446BFC_9FEB_4935_8970_65A4C562A93F.svg +277 -0
  99. data/examples/xmi/Images/EAID_24E8A45C_C99F_49b7_860A_9CF65FF76C76.svg +575 -0
  100. data/examples/xmi/Images/EAID_272F3181_4300_48b7_98A0_A8CFD12B1A72.svg +255 -0
  101. data/examples/xmi/Images/EAID_292E0D94_392C_4da6_A0B5_841501FAE50A.svg +183 -0
  102. data/examples/xmi/Images/EAID_29DD0967_ADAB_4abb_99C5_544821F5E7DA.svg +10 -0
  103. data/examples/xmi/Images/EAID_2A339928_E5EF_4ed2_9E5D_CC2CA5CF248B.svg +310 -0
  104. data/examples/xmi/Images/EAID_2A5E0832_06BE_4381_85D4_9B00E4F95575.svg +155 -0
  105. data/examples/xmi/Images/EAID_2AAB709F_EFCE_496f_8AFE_92809D66A0A9.svg +81 -0
  106. data/examples/xmi/Images/EAID_2C8DD882_8DEA_4065_89F8_DDA796AA0C85.svg +520 -0
  107. data/examples/xmi/Images/EAID_2E98EA19_37D8_4b70_BDCE_CFEE4FA800B0.svg +173 -0
  108. data/examples/xmi/Images/EAID_30D62231_110F_44e8_9C06_6FCDCBA53A09.svg +722 -0
  109. data/examples/xmi/Images/EAID_3206D3FD_1FC4_41c7_8D00_36DB908E9319.svg +181 -0
  110. data/examples/xmi/Images/EAID_3452CC53_9ACB_44eb_9C9D_B90CF862F284.svg +92 -0
  111. data/examples/xmi/Images/EAID_348EE46E_ABD9_40b0_82A1_0285E75BDC52.svg +187 -0
  112. data/examples/xmi/Images/EAID_34FF671B_CFDC_47ad_91DF_ECA6D8358180.svg +217 -0
  113. data/examples/xmi/Images/EAID_359DD694_0100_4bdf_AD5F_712D97E9C69B.svg +157 -0
  114. data/examples/xmi/Images/EAID_35DE714C_49A8_490e_913A_56F39EF317F9.svg +180 -0
  115. data/examples/xmi/Images/EAID_360C79F1_8EDF_41db_A069_DECDC55625BC.svg +31 -0
  116. data/examples/xmi/Images/EAID_36913C58_FF35_4ba2_A04B_9A4824E24609.svg +166 -0
  117. data/examples/xmi/Images/EAID_372F7F7B_57ED_469a_A640_70DB578B3C56.svg +361 -0
  118. data/examples/xmi/Images/EAID_37AC19B9_8433_4fee_A326_763170D54D06.svg +32 -0
  119. data/examples/xmi/Images/EAID_38170608_32B5_4a6f_A68D_A0D7C0C9D019.svg +234 -0
  120. data/examples/xmi/Images/EAID_3A77A5D0_4E1B_4116_8AAD_407FC422B47F.svg +183 -0
  121. data/examples/xmi/Images/EAID_3B8BD087_1683_46b1_8D0D_6F839C46C578.svg +42 -0
  122. data/examples/xmi/Images/EAID_3DC20801_AE8B_4e76_B08C_F574E8A90E13.svg +192 -0
  123. data/examples/xmi/Images/EAID_3DE28C70_C6D4_406c_B49F_EEF52148C8C1.svg +124 -0
  124. data/examples/xmi/Images/EAID_458E093C_BA2B_4292_BEC4_37511C163DDC.svg +140 -0
  125. data/examples/xmi/Images/EAID_45F9B1F7_E568_47c9_B229_953BC2E707E4.svg +266 -0
  126. data/examples/xmi/Images/EAID_46B3041A_8C23_46e6_8E14_ADE7012274C5.svg +80 -0
  127. data/examples/xmi/Images/EAID_47E4600F_CEC9_4245_9BF5_EE38007A9DDB.svg +584 -0
  128. data/examples/xmi/Images/EAID_4881CEEE_792C_4cb0_BEA7_54333B643D0A.svg +155 -0
  129. data/examples/xmi/Images/EAID_48D364F0_DCA4_41e8_B4D4_509B3023B969.svg +17 -0
  130. data/examples/xmi/Images/EAID_4DBDAB9E_4C1C_4cb1_A767_06BD743A50A7.svg +78 -0
  131. data/examples/xmi/Images/EAID_4EB75007_B31D_4f2c_8855_7E9D3A3B17F4.svg +454 -0
  132. data/examples/xmi/Images/EAID_4F421236_FCF3_4aae_B22A_C7E6A5EFBAC7.svg +81 -0
  133. data/examples/xmi/Images/EAID_4FC1D352_2102_4b73_BCB0_1410B29C6BD7.svg +379 -0
  134. data/examples/xmi/Images/EAID_4FE346EA_01E1_4b30_8BE6_BB32EA191E47.svg +126 -0
  135. data/examples/xmi/Images/EAID_5038EEE3_7DD0_4cca_9829_364E044D37E8.svg +199 -0
  136. data/examples/xmi/Images/EAID_508A37DC_9378_4f5a_BD96_48F4D24E03A5.svg +162 -0
  137. data/examples/xmi/Images/EAID_516DA1A2_F0EC_415c_9664_E4CA54E7F05C.svg +136 -0
  138. data/examples/xmi/Images/EAID_52A1DBD3_D3DA_4b6d_8F96_FC6F39F64242.svg +161 -0
  139. data/examples/xmi/Images/EAID_575E87BA_32E9_4a84_AA4E_0EFDFC5D4C07.svg +71 -0
  140. data/examples/xmi/Images/EAID_57E0F1A0_6C72_47ef_B922_B806F9A875E8.svg +209 -0
  141. data/examples/xmi/Images/EAID_5957C373_3FC1_482f_8F35_D809153A17F5.svg +123 -0
  142. data/examples/xmi/Images/EAID_59A66AE2_412C_48a6_BFC7_EA56CF11D269.svg +218 -0
  143. data/examples/xmi/Images/EAID_5A43833E_680B_4a90_8931_0C902304E029.svg +236 -0
  144. data/examples/xmi/Images/EAID_5D6DB5A0_5047_4bac_9E60_69904A60B56D.svg +353 -0
  145. data/examples/xmi/Images/EAID_5DA1E7A7_8E59_4803_A831_E9F3EC27328F.svg +242 -0
  146. data/examples/xmi/Images/EAID_5E2C1E2A_82A8_47f4_B2ED_1398D72BFCFD.svg +246 -0
  147. data/examples/xmi/Images/EAID_6052620C_4BD5_49f6_A21C_AD7E6DCA2795.svg +290 -0
  148. data/examples/xmi/Images/EAID_6481E2CC_35A6_43b0_88D4_10A667A2BC2D.svg +60 -0
  149. data/examples/xmi/Images/EAID_660C7D03_A26C_4977_A7BA_9D0A773DA811.svg +318 -0
  150. data/examples/xmi/Images/EAID_671F3C3D_35B6_4514_B5B6_DD7E84925493.svg +24 -0
  151. data/examples/xmi/Images/EAID_676B9C9A_D85F_4d2f_A46B_73F02090DC87.svg +127 -0
  152. data/examples/xmi/Images/EAID_6797FEFA_5801_48e4_8B9C_3C824C0E165D.svg +412 -0
  153. data/examples/xmi/Images/EAID_6807F4EE_18EF_4e7e_ACCF_D5BD323AFDE9.svg +130 -0
  154. data/examples/xmi/Images/EAID_69E81E34_CF28_4c7f_A48F_5941BA85CEE3.svg +96 -0
  155. data/examples/xmi/Images/EAID_6A3C55E8_3C3C_4f3a_8AAC_0299C5B23070.svg +10 -0
  156. data/examples/xmi/Images/EAID_6BAC333E_E2C2_42c7_8DDF_6B4FA0FFC03B.svg +143 -0
  157. data/examples/xmi/Images/EAID_6D0349D5_3F1B_4b28_82D2_910743DEB5E5.svg +114 -0
  158. data/examples/xmi/Images/EAID_6E95B74E_8A09_4698_9E9E_23BCFD2CE194.svg +37 -0
  159. data/examples/xmi/Images/EAID_70C77F92_5614_4b22_8C8E_67859F59D8FD.svg +254 -0
  160. data/examples/xmi/Images/EAID_71F9216B_E7A7_4083_B08E_6C71B57F3A1F.svg +187 -0
  161. data/examples/xmi/Images/EAID_73025C5A_08FC_47ff_AB2F_C7F79CF54B41.svg +145 -0
  162. data/examples/xmi/Images/EAID_74C974B6_6D07_425d_B7AC_C8899E3B4967.svg +76 -0
  163. data/examples/xmi/Images/EAID_7504FCD2_524C_4e7d_BAE4_4E58A8A8A12C.svg +196 -0
  164. data/examples/xmi/Images/EAID_78030266_3603_4747_9D75_03D16614BE7D.svg +35 -0
  165. data/examples/xmi/Images/EAID_785226C1_12B1_4104_A4C1_F19B70B9FB71.svg +348 -0
  166. data/examples/xmi/Images/EAID_7854470F_26B8_4d3c_AFDF_C05BCE6ED0CD.svg +72 -0
  167. data/examples/xmi/Images/EAID_794F4A8F_18CA_4e9f_8477_A6F0E5ED22D4.svg +187 -0
  168. data/examples/xmi/Images/EAID_7A24839E_C8AE_424d_B7D2_6DA16DC813E7.svg +114 -0
  169. data/examples/xmi/Images/EAID_7A3649FD_E960_4ae6_B9B1_A9001C066AE7.svg +181 -0
  170. data/examples/xmi/Images/EAID_7B2C6765_AB68_439a_87F3_DAC323CB2AF5.svg +196 -0
  171. data/examples/xmi/Images/EAID_7C44AC09_27C1_47b3_9A85_88EC71C081FF.svg +55 -0
  172. data/examples/xmi/Images/EAID_7CE102CA_97C1_4cac_BD3B_0500D3712D2A.svg +195 -0
  173. data/examples/xmi/Images/EAID_7D960BD8_65D8_4934_9C11_4EF860DD8FBA.svg +90 -0
  174. data/examples/xmi/Images/EAID_80939C98_A456_48c3_BCEA_4B72851F2DF6.svg +174 -0
  175. data/examples/xmi/Images/EAID_812FE862_76ED_44f0_B678_7A4601B395CF.svg +142 -0
  176. data/examples/xmi/Images/EAID_81B76F5B_9D64_4bbf_8AC8_34234FB87533.svg +740 -0
  177. data/examples/xmi/Images/EAID_84352F1A_195B_411b_9552_5BFC40BF90B5.svg +105 -0
  178. data/examples/xmi/Images/EAID_846DD800_139C_4d47_A1DF_3FB1AC5D130F.svg +554 -0
  179. data/examples/xmi/Images/EAID_84A9C65B_FD6D_4bb5_818F_E8C35FF5BCD1.svg +228 -0
  180. data/examples/xmi/Images/EAID_853674F5_7DC9_4aae_809B_5728098B5D5B.svg +154 -0
  181. data/examples/xmi/Images/EAID_860CBBFB_2F27_408f_9144_751F9D1F487F.svg +273 -0
  182. data/examples/xmi/Images/EAID_87476527_7B9B_4b92_967E_3D38365470CA.svg +239 -0
  183. data/examples/xmi/Images/EAID_87DAE930_5069_4c58_AC65_4B0B2C0F32C8.svg +10 -0
  184. data/examples/xmi/Images/EAID_88AF6BD7_BC34_406f_BB59_47CFAB4A7D5D.svg +116 -0
  185. data/examples/xmi/Images/EAID_88D0CB44_20D0_44fc_A6E3_B663332EF401.svg +200 -0
  186. data/examples/xmi/Images/EAID_8BB1CA0C_C003_4678_973B_A1C3308E021D.svg +136 -0
  187. data/examples/xmi/Images/EAID_8DAB169F_D189_4320_A0F5_4443E3297F0E.svg +181 -0
  188. data/examples/xmi/Images/EAID_8FD488EF_BAAB_40ec_A7ED_F7CC831D546E.svg +324 -0
  189. data/examples/xmi/Images/EAID_90BCA409_BB45_42c5_AFA5_45FE3D995904.svg +342 -0
  190. data/examples/xmi/Images/EAID_926AFE38_01FA_469e_B6AA_ED5F4D62B66F.svg +105 -0
  191. data/examples/xmi/Images/EAID_92AB0FD0_B0FB_4ceb_8EAE_66B6600D31D7.svg +681 -0
  192. data/examples/xmi/Images/EAID_92C43670_3057_47f1_A576_C60843FF3D26.svg +136 -0
  193. data/examples/xmi/Images/EAID_93F63576_BE01_4cd8_8A91_C674FF77FC3D.svg +718 -0
  194. data/examples/xmi/Images/EAID_9400D9BC_05A5_41fc_83F7_02E5C67F9718.svg +487 -0
  195. data/examples/xmi/Images/EAID_95246DCF_1C09_4a16_9512_98000F56B3D8.svg +292 -0
  196. data/examples/xmi/Images/EAID_9994BF62_51E2_42cd_BB35_16C537B6718A.svg +715 -0
  197. data/examples/xmi/Images/EAID_9AAD6C21_B1E7_4472_B64A_FB5E3569D970.svg +116 -0
  198. data/examples/xmi/Images/EAID_9BD7189A_877B_4ca9_B42C_817DEF144FB2.svg +284 -0
  199. data/examples/xmi/Images/EAID_9DA6C553_94FC_4204_83AD_ECC4B45A53EF.svg +159 -0
  200. data/examples/xmi/Images/EAID_9EE6A41B_5FAA_4c89_B98F_732059778630.svg +10 -0
  201. data/examples/xmi/Images/EAID_9F1A4B54_46F6_435c_9529_E43E54CF6050.svg +172 -0
  202. data/examples/xmi/Images/EAID_9FE1EA7B_4CEF_4976_A281_93A94315BD84.svg +153 -0
  203. data/examples/xmi/Images/EAID_A0695647_6172_4262_8C30_67441399609C.svg +290 -0
  204. data/examples/xmi/Images/EAID_A081C63E_D6F2_41a7_A99C_307836754AFA.svg +149 -0
  205. data/examples/xmi/Images/EAID_A24E2778_5AD9_44f2_AB8F_5CD3913477D6.svg +194 -0
  206. data/examples/xmi/Images/EAID_A264F089_F9B3_406c_A3A8_FF34903797D3.svg +143 -0
  207. data/examples/xmi/Images/EAID_A282E5D1_2A13_4e7f_BC76_5D086DD4A577.svg +357 -0
  208. data/examples/xmi/Images/EAID_A3BCE1D6_9DB5_4272_A020_4C0E194B99CC.svg +171 -0
  209. data/examples/xmi/Images/EAID_A56E3818_D1B8_4b63_B69E_FBAC4A8AF482.svg +218 -0
  210. data/examples/xmi/Images/EAID_A57215D5_75C5_4532_BCF4_264A77CD62F1.svg +204 -0
  211. data/examples/xmi/Images/EAID_A59065AF_9669_486c_9582_9693177CFC7F.svg +263 -0
  212. data/examples/xmi/Images/EAID_A759374D_589A_488c_99EF_537ACB9B1FF9.svg +398 -0
  213. data/examples/xmi/Images/EAID_A7B25F46_F18A_4373_B16D_8C6AC0B868B0.svg +174 -0
  214. data/examples/xmi/Images/EAID_A9FE9E6F_A5F4_47e5_A6BA_26E22C7346B6.svg +310 -0
  215. data/examples/xmi/Images/EAID_AA62CDEB_55EC_498d_B326_4AA2C9AF6A05.svg +144 -0
  216. data/examples/xmi/Images/EAID_AAF52AF6_F7F9_4005_AE46_8920847BEA03.svg +144 -0
  217. data/examples/xmi/Images/EAID_AB281AC1_7CB8_404a_8124_34343DDD84E2.svg +198 -0
  218. data/examples/xmi/Images/EAID_AB7F1FDF_A66B_42a1_B8A3_7F594BAAD508.svg +143 -0
  219. data/examples/xmi/Images/EAID_AC2191E3_76E3_40b2_9E21_0E0B9B5277D2.svg +114 -0
  220. data/examples/xmi/Images/EAID_AD451676_A7C8_4c6a_A925_A9B9CA344142.svg +339 -0
  221. data/examples/xmi/Images/EAID_ADBA40A1_9375_4c1b_9938_0990612EB615.svg +429 -0
  222. data/examples/xmi/Images/EAID_ADC8773C_1B27_48ac_BAC1_14C1C919FAF6.svg +245 -0
  223. data/examples/xmi/Images/EAID_AE0718DF_AF69_4ea1_A099_E20028FE40A1.svg +173 -0
  224. data/examples/xmi/Images/EAID_B0DDB85D_A00C_4a7f_8C06_CCA15E5E4FE5.svg +31 -0
  225. data/examples/xmi/Images/EAID_B27ED282_D5E5_4f33_8AC1_62802F9E0B35.svg +256 -0
  226. data/examples/xmi/Images/EAID_B3AFECCB_17DD_44d6_8A44_2C38D9A64C0B.svg +95 -0
  227. data/examples/xmi/Images/EAID_B3B6C5B1_278E_4714_8244_B6C28B66AB50.svg +176 -0
  228. data/examples/xmi/Images/EAID_B53E76CD_A0F2_4e2f_B3AB_796D85964EF2.svg +179 -0
  229. data/examples/xmi/Images/EAID_B55D6E67_0BDD_4163_B359_11A6FBA89C74.svg +207 -0
  230. data/examples/xmi/Images/EAID_B58D1A53_E860_41a3_8352_11C274093E83.svg +189 -0
  231. data/examples/xmi/Images/EAID_B62C02B3_69DB_49e9_8089_4EE398BDE666.svg +165 -0
  232. data/examples/xmi/Images/EAID_BC008774_B539_4150_8174_B675989053D0.svg +22 -0
  233. data/examples/xmi/Images/EAID_BC1F7E00_082D_4a26_922B_3967A8D66859.svg +266 -0
  234. data/examples/xmi/Images/EAID_BDA613D8_402A_475a_AA15_683D88FD3D23.svg +183 -0
  235. data/examples/xmi/Images/EAID_C028B286_4C85_47d8_B6D5_80B28F556E82.svg +303 -0
  236. data/examples/xmi/Images/EAID_C173A6F4_1D1B_400e_AD8C_64FFF7CD5BE5.svg +178 -0
  237. data/examples/xmi/Images/EAID_C1834072_CADC_4ce4_B0FC_8284AE5CF4A4.svg +158 -0
  238. data/examples/xmi/Images/EAID_C1EC985B_5CBD_4e91_8661_EB4EF23781D9.svg +286 -0
  239. data/examples/xmi/Images/EAID_C31C1314_B679_4413_B8FE_A2CD584FC128.svg +305 -0
  240. data/examples/xmi/Images/EAID_C37CFBD6_69BA_42fb_9AC7_2D329D931BCF.svg +171 -0
  241. data/examples/xmi/Images/EAID_C857C934_306F_463a_87D5_257CB225ECFE.svg +174 -0
  242. data/examples/xmi/Images/EAID_C96797DE_2238_42d3_896A_9F92500270ED.svg +180 -0
  243. data/examples/xmi/Images/EAID_C96CBC24_B20E_459a_8F9D_75B61CDCB89F.svg +656 -0
  244. data/examples/xmi/Images/EAID_CACB523D_56A5_4f05_B3C2_51BB18F380FD.svg +158 -0
  245. data/examples/xmi/Images/EAID_CB34B578_101B_48b4_9271_214FFEA6A83A.svg +409 -0
  246. data/examples/xmi/Images/EAID_CBBD6CF4_0A1E_4406_9930_89DE43527910.svg +361 -0
  247. data/examples/xmi/Images/EAID_CC06A828_3750_472f_8DB2_C2E0863FCE17.svg +96 -0
  248. data/examples/xmi/Images/EAID_CD5CF053_1772_4a0f_962D_B17054D8EEAA.svg +173 -0
  249. data/examples/xmi/Images/EAID_CE440B5A_9534_4c75_9BA5_50862BB396C2.svg +97 -0
  250. data/examples/xmi/Images/EAID_CE4734FC_7986_4b3a_807F_A5B2C7EDE9E4.svg +193 -0
  251. data/examples/xmi/Images/EAID_D14AA320_9D41_4366_8739_9C2C21F96AE1.svg +32 -0
  252. data/examples/xmi/Images/EAID_D2FA55D3_C733_4a4d_92D0_0BC7AC0BB5BC.svg +108 -0
  253. data/examples/xmi/Images/EAID_D351FC34_FB03_488d_ADA4_BDB93DA9CB02.svg +49 -0
  254. data/examples/xmi/Images/EAID_D368FDF3_BDC5_4718_A701_351C8587A376.svg +592 -0
  255. data/examples/xmi/Images/EAID_D4DA8C48_3998_450d_87C4_9D65C9FECDB4.svg +42 -0
  256. data/examples/xmi/Images/EAID_D5464ECF_290E_4b2b_A6C4_25BE80F886CB.svg +76 -0
  257. data/examples/xmi/Images/EAID_D55235B0_61E9_461a_8379_2B8BF2403BE2.svg +147 -0
  258. data/examples/xmi/Images/EAID_D555ED73_F010_45d7_8A53_45A33C64C249.svg +318 -0
  259. data/examples/xmi/Images/EAID_D7AAC526_267E_45a0_A853_3207F02363F8.svg +45 -0
  260. data/examples/xmi/Images/EAID_D998B20D_A875_4ef8_A9CE_996BE56602BD.svg +158 -0
  261. data/examples/xmi/Images/EAID_DBFA8B39_F5B7_4c0e_9552_19AEAE5BA64E.svg +200 -0
  262. data/examples/xmi/Images/EAID_DE47A47D_E7BE_4e6f_BA81_F789EE8CFE72.svg +61 -0
  263. data/examples/xmi/Images/EAID_DFBB1072_8EC5_4384_8241_7EDF4B6B888B.svg +78 -0
  264. data/examples/xmi/Images/EAID_E325B9D8_E955_4aed_8125_63167BD40320.svg +67 -0
  265. data/examples/xmi/Images/EAID_E32D9D02_CAE9_4a47_92A8_3290EDCD6E6D.svg +79 -0
  266. data/examples/xmi/Images/EAID_E3B28611_7857_458a_B0BC_736E777B88EC.svg +194 -0
  267. data/examples/xmi/Images/EAID_E43C37EC_1176_4d2e_8B98_B6F3DFF6A092.svg +96 -0
  268. data/examples/xmi/Images/EAID_E591C1CF_7F35_4160_8A72_DFA097AD5811.svg +271 -0
  269. data/examples/xmi/Images/EAID_E77C66A2_2E94_4196_BFC6_662FE5AEEB6F.svg +332 -0
  270. data/examples/xmi/Images/EAID_E7AABA98_2450_4986_9736_DCCAF0108C50.svg +639 -0
  271. data/examples/xmi/Images/EAID_E7D9A2C4_72D6_40b9_8EB8_6B35476246B3.svg +134 -0
  272. data/examples/xmi/Images/EAID_E9CDAD85_ECF1_43de_819F_30A0D01785E6.svg +193 -0
  273. data/examples/xmi/Images/EAID_EC8AF507_F441_4e8a_B8A7_C1690F3C7D0B.svg +58 -0
  274. data/examples/xmi/Images/EAID_ED501058_D540_47ac_8EBC_5921E8C0BF57.svg +384 -0
  275. data/examples/xmi/Images/EAID_EFBF5F0F_DF74_4944_8791_114F5637C335.svg +590 -0
  276. data/examples/xmi/Images/EAID_EFFFA027_2A1F_425c_8437_BF89AADC8893.svg +365 -0
  277. data/examples/xmi/Images/EAID_F07E7718_B2C2_4a65_B5DD_477CB73E971E.svg +165 -0
  278. data/examples/xmi/Images/EAID_F0F20BDF_C729_47f7_B6FC_25ED2C4609CA.svg +61 -0
  279. data/examples/xmi/Images/EAID_F32E5AFE_8605_4c77_AE69_D0D0A6E380AC.svg +76 -0
  280. data/examples/xmi/Images/EAID_F3F00F45_CD37_46fd_B521_D1040EB2FB16.svg +123 -0
  281. data/examples/xmi/Images/EAID_F46E8F19_D8F1_4a3d_B87B_B0BAB4F50F50.svg +202 -0
  282. data/examples/xmi/Images/EAID_F48E5F6E_2411_4635_9315_3EAA4CFA29F7.svg +351 -0
  283. data/examples/xmi/Images/EAID_F4C23F9E_DD74_4fed_B75D_AD3C6448BA24.svg +189 -0
  284. data/examples/xmi/Images/EAID_F853B3C4_B145_4ef0_B261_C3CC0475B6D2.svg +215 -0
  285. data/examples/xmi/Images/EAID_F8BE68CA_1F8F_47e5_9454_01A2EB7D388A.svg +124 -0
  286. data/examples/xmi/Images/EAID_F92A6A28_612E_468e_9E39_D7AE7D24E24D.svg +208 -0
  287. data/examples/xmi/Images/EAID_F995FA49_B86E_4c94_BE5E_C928FB6B87D0.svg +302 -0
  288. data/examples/xmi/Images/EAID_FEAE013A_A4E4_4283_A491_1FEB8D0EBA28.svg +524 -0
  289. data/examples/xmi/Images/EAID_FEBE5726_3751_470b_9023_8C569202E97E.svg +730 -0
  290. data/examples/xmi/UML_EA.DTD +6856 -0
  291. data/examples/xmi/UmlModel_template.xmi +23 -0
  292. data/examples/xmi/basic.xmi +9086 -0
  293. data/examples/xmi/simple.xmi +655 -0
  294. data/examples/xmi/simple_example.xmi +23 -0
  295. data/examples/xmi/test.xmi +1703 -0
  296. data/exe/lutaml +2 -16
  297. data/exe/lutaml-wsd2uml +3 -3
  298. data/exe/lutaml-yaml2uml +2 -2
  299. data/lib/lutaml/cli/commands/base_command.rb +118 -0
  300. data/lib/lutaml/cli/element_identifier.rb +165 -0
  301. data/lib/lutaml/cli/enhanced_formatter.rb +502 -0
  302. data/lib/lutaml/cli/interactive_shell.rb +911 -0
  303. data/lib/lutaml/cli/lml_commands.rb +201 -0
  304. data/lib/lutaml/cli/output_formatter.rb +348 -0
  305. data/lib/lutaml/cli/resource_registry.rb +127 -0
  306. data/lib/lutaml/cli/tree_view_formatter.rb +308 -0
  307. data/lib/lutaml/cli/uml/build_command.rb +538 -0
  308. data/lib/lutaml/cli/uml/diagram_command.rb +421 -0
  309. data/lib/lutaml/cli/uml/export_command.rb +78 -0
  310. data/lib/lutaml/cli/uml/find_command.rb +122 -0
  311. data/lib/lutaml/cli/uml/info_command.rb +104 -0
  312. data/lib/lutaml/cli/uml/inspect_command.rb +88 -0
  313. data/lib/lutaml/cli/uml/ls_command.rb +105 -0
  314. data/lib/lutaml/cli/uml/repl_command.rb +50 -0
  315. data/lib/lutaml/cli/uml/search_command.rb +88 -0
  316. data/lib/lutaml/cli/uml/serve_command.rb +59 -0
  317. data/lib/lutaml/cli/uml/shared_helpers.rb +51 -0
  318. data/lib/lutaml/cli/uml/spa_command.rb +209 -0
  319. data/lib/lutaml/cli/uml/stats_command.rb +60 -0
  320. data/lib/lutaml/cli/uml/tree_command.rb +85 -0
  321. data/lib/lutaml/cli/uml/validate_command.rb +195 -0
  322. data/lib/lutaml/cli/uml/verify_command.rb +107 -0
  323. data/lib/lutaml/cli/uml_commands.rb +163 -0
  324. data/lib/lutaml/cli.rb +72 -0
  325. data/lib/lutaml/command_line.rb +8 -6
  326. data/lib/lutaml/converter/dsl_to_uml.rb +2 -0
  327. data/lib/lutaml/converter/xmi_to_uml.rb +40 -19
  328. data/lib/lutaml/ea/diagram/configuration.rb +379 -0
  329. data/lib/lutaml/ea/diagram/element_renderers/base_renderer.rb +81 -0
  330. data/lib/lutaml/ea/diagram/element_renderers/class_renderer.rb +330 -0
  331. data/lib/lutaml/ea/diagram/element_renderers/connector_renderer.rb +55 -0
  332. data/lib/lutaml/ea/diagram/element_renderers/package_renderer.rb +69 -0
  333. data/lib/lutaml/ea/diagram/extractor.rb +559 -0
  334. data/lib/lutaml/ea/diagram/layout_engine.rb +251 -0
  335. data/lib/lutaml/ea/diagram/path_builder.rb +258 -0
  336. data/lib/lutaml/ea/diagram/style_parser.rb +315 -0
  337. data/lib/lutaml/ea/diagram/style_resolver.rb +291 -0
  338. data/lib/lutaml/ea/diagram/svg_renderer.rb +285 -0
  339. data/lib/lutaml/ea/diagram/util.rb +69 -0
  340. data/lib/lutaml/ea/diagram.rb +77 -0
  341. data/lib/lutaml/express/parsers/exp.rb +1 -1
  342. data/lib/lutaml/express.rb +4 -2
  343. data/lib/lutaml/formatter/base.rb +6 -6
  344. data/lib/lutaml/formatter/graphviz.rb +10 -8
  345. data/lib/lutaml/formatter.rb +3 -0
  346. data/lib/lutaml/layout/engine.rb +9 -7
  347. data/lib/lutaml/layout/graph_viz_engine.rb +2 -1
  348. data/lib/lutaml/layout.rb +8 -0
  349. data/lib/lutaml/model_transformations/configuration.rb +333 -0
  350. data/lib/lutaml/model_transformations/format_registry.rb +394 -0
  351. data/lib/lutaml/model_transformations/parsers/base_parser.rb +389 -0
  352. data/lib/lutaml/model_transformations/parsers/qea_parser.rb +455 -0
  353. data/lib/lutaml/model_transformations/parsers/xmi_parser.rb +301 -0
  354. data/lib/lutaml/model_transformations/transformation_engine.rb +409 -0
  355. data/lib/lutaml/model_transformations.rb +143 -0
  356. data/lib/lutaml/parser.rb +15 -7
  357. data/lib/lutaml/qea/benchmark.rb +212 -0
  358. data/lib/lutaml/qea/database.rb +324 -0
  359. data/lib/lutaml/qea/factory/association_transformer.rb +115 -0
  360. data/lib/lutaml/qea/factory/attribute_tag_transformer.rb +60 -0
  361. data/lib/lutaml/qea/factory/attribute_transformer.rb +103 -0
  362. data/lib/lutaml/qea/factory/base_transformer.rb +132 -0
  363. data/lib/lutaml/qea/factory/class_transformer.rb +734 -0
  364. data/lib/lutaml/qea/factory/constraint_transformer.rb +78 -0
  365. data/lib/lutaml/qea/factory/data_type_transformer.rb +162 -0
  366. data/lib/lutaml/qea/factory/diagram_transformer.rb +182 -0
  367. data/lib/lutaml/qea/factory/document_builder.rb +275 -0
  368. data/lib/lutaml/qea/factory/ea_to_uml_factory.rb +260 -0
  369. data/lib/lutaml/qea/factory/enum_transformer.rb +87 -0
  370. data/lib/lutaml/qea/factory/generalization_transformer.rb +106 -0
  371. data/lib/lutaml/qea/factory/instance_transformer.rb +96 -0
  372. data/lib/lutaml/qea/factory/object_property_transformer.rb +61 -0
  373. data/lib/lutaml/qea/factory/operation_transformer.rb +75 -0
  374. data/lib/lutaml/qea/factory/package_transformer.rb +199 -0
  375. data/lib/lutaml/qea/factory/reference_resolver.rb +99 -0
  376. data/lib/lutaml/qea/factory/tagged_value_transformer.rb +41 -0
  377. data/lib/lutaml/qea/factory/transformer_registry.rb +85 -0
  378. data/lib/lutaml/qea/file_detector.rb +178 -0
  379. data/lib/lutaml/qea/infrastructure/database_connection.rb +100 -0
  380. data/lib/lutaml/qea/infrastructure/schema_reader.rb +136 -0
  381. data/lib/lutaml/qea/infrastructure/table_reader.rb +224 -0
  382. data/lib/lutaml/qea/models/base_model.rb +48 -0
  383. data/lib/lutaml/qea/models/ea_attribute.rb +135 -0
  384. data/lib/lutaml/qea/models/ea_attribute_tag.rb +109 -0
  385. data/lib/lutaml/qea/models/ea_complexity_type.rb +81 -0
  386. data/lib/lutaml/qea/models/ea_connector.rb +162 -0
  387. data/lib/lutaml/qea/models/ea_connector_type.rb +62 -0
  388. data/lib/lutaml/qea/models/ea_constraint_type.rb +65 -0
  389. data/lib/lutaml/qea/models/ea_datatype.rb +108 -0
  390. data/lib/lutaml/qea/models/ea_diagram.rb +117 -0
  391. data/lib/lutaml/qea/models/ea_diagram_link.rb +80 -0
  392. data/lib/lutaml/qea/models/ea_diagram_object.rb +86 -0
  393. data/lib/lutaml/qea/models/ea_diagram_type.rb +58 -0
  394. data/lib/lutaml/qea/models/ea_document.rb +68 -0
  395. data/lib/lutaml/qea/models/ea_object.rb +208 -0
  396. data/lib/lutaml/qea/models/ea_object_constraint.rb +62 -0
  397. data/lib/lutaml/qea/models/ea_object_property.rb +96 -0
  398. data/lib/lutaml/qea/models/ea_object_type.rb +75 -0
  399. data/lib/lutaml/qea/models/ea_operation.rb +153 -0
  400. data/lib/lutaml/qea/models/ea_operation_param.rb +73 -0
  401. data/lib/lutaml/qea/models/ea_package.rb +75 -0
  402. data/lib/lutaml/qea/models/ea_script.rb +69 -0
  403. data/lib/lutaml/qea/models/ea_status_type.rb +68 -0
  404. data/lib/lutaml/qea/models/ea_stereotype.rb +59 -0
  405. data/lib/lutaml/qea/models/ea_tagged_value.rb +105 -0
  406. data/lib/lutaml/qea/models/ea_xref.rb +174 -0
  407. data/lib/lutaml/qea/parser.rb +61 -0
  408. data/lib/lutaml/qea/repositories/base_repository.rb +215 -0
  409. data/lib/lutaml/qea/repositories/object_repository.rb +221 -0
  410. data/lib/lutaml/qea/services/configuration.rb +211 -0
  411. data/lib/lutaml/qea/services/database_loader.rb +215 -0
  412. data/lib/lutaml/qea/validation/association_validator.rb +75 -0
  413. data/lib/lutaml/qea/validation/attribute_validator.rb +103 -0
  414. data/lib/lutaml/qea/validation/base_validator.rb +305 -0
  415. data/lib/lutaml/qea/validation/class_validator.rb +123 -0
  416. data/lib/lutaml/qea/validation/database/circular_reference_validator.rb +111 -0
  417. data/lib/lutaml/qea/validation/database/orphan_validator.rb +155 -0
  418. data/lib/lutaml/qea/validation/database/referential_integrity_validator.rb +130 -0
  419. data/lib/lutaml/qea/validation/diagram_validator.rb +114 -0
  420. data/lib/lutaml/qea/validation/formatters/json_formatter.rb +137 -0
  421. data/lib/lutaml/qea/validation/formatters/text_formatter.rb +235 -0
  422. data/lib/lutaml/qea/validation/operation_validator.rb +81 -0
  423. data/lib/lutaml/qea/validation/package_validator.rb +113 -0
  424. data/lib/lutaml/qea/validation/validation_engine.rb +497 -0
  425. data/lib/lutaml/qea/validation/validation_message.rb +144 -0
  426. data/lib/lutaml/qea/validation/validation_result.rb +212 -0
  427. data/lib/lutaml/qea/validation/validator_registry.rb +134 -0
  428. data/lib/lutaml/qea/verification/comparison_result.rb +264 -0
  429. data/lib/lutaml/qea/verification/document_normalizer.rb +177 -0
  430. data/lib/lutaml/qea/verification/document_verifier.rb +320 -0
  431. data/lib/lutaml/qea/verification/element_comparator.rb +306 -0
  432. data/lib/lutaml/qea/verification/structure_matcher.rb +287 -0
  433. data/lib/lutaml/qea.rb +226 -0
  434. data/lib/lutaml/sysml/allocate.rb +2 -0
  435. data/lib/lutaml/sysml/allocated.rb +2 -0
  436. data/lib/lutaml/sysml/binding_connector.rb +2 -0
  437. data/lib/lutaml/sysml/block.rb +2 -0
  438. data/lib/lutaml/sysml/constraint_block.rb +2 -0
  439. data/lib/lutaml/sysml/copy.rb +2 -0
  440. data/lib/lutaml/sysml/derive_requirement.rb +2 -0
  441. data/lib/lutaml/sysml/nested_connector_end.rb +2 -0
  442. data/lib/lutaml/sysml/refine.rb +2 -0
  443. data/lib/lutaml/sysml/requirement.rb +2 -0
  444. data/lib/lutaml/sysml/requirement_related.rb +2 -0
  445. data/lib/lutaml/sysml/satisfy.rb +2 -0
  446. data/lib/lutaml/sysml/test_case.rb +2 -0
  447. data/lib/lutaml/sysml/trace.rb +2 -0
  448. data/lib/lutaml/sysml/verify.rb +2 -0
  449. data/lib/lutaml/sysml/xmi_file.rb +2 -0
  450. data/lib/lutaml/sysml.rb +3 -1
  451. data/lib/lutaml/uml/association.rb +4 -0
  452. data/lib/lutaml/uml/class.rb +11 -9
  453. data/lib/lutaml/uml/classifier.rb +3 -0
  454. data/lib/lutaml/uml/comment.rb +13 -0
  455. data/lib/lutaml/uml/data_type.rb +7 -6
  456. data/lib/lutaml/uml/diagram.rb +12 -0
  457. data/lib/lutaml/uml/diagram_link.rb +26 -0
  458. data/lib/lutaml/uml/diagram_object.rb +30 -0
  459. data/lib/lutaml/uml/document.rb +18 -0
  460. data/lib/lutaml/uml/enum.rb +4 -3
  461. data/lib/lutaml/uml/fontname.rb +13 -0
  462. data/lib/lutaml/uml/generalization.rb +2 -0
  463. data/lib/lutaml/uml/group.rb +2 -0
  464. data/lib/lutaml/uml/namespace.rb +2 -2
  465. data/lib/lutaml/uml/node/{field.rb → attribute.rb} +4 -4
  466. data/lib/lutaml/uml/node/base.rb +1 -1
  467. data/lib/lutaml/uml/node/class_node.rb +12 -12
  468. data/lib/lutaml/uml/node/class_relationship.rb +2 -2
  469. data/lib/lutaml/uml/node/document.rb +2 -2
  470. data/lib/lutaml/uml/node/method_argument.rb +3 -3
  471. data/lib/lutaml/uml/node/{method.rb → operation.rb} +4 -4
  472. data/lib/lutaml/uml/node/relationship.rb +3 -3
  473. data/lib/lutaml/uml/package.rb +7 -4
  474. data/lib/lutaml/uml/package_path.rb +235 -0
  475. data/lib/lutaml/uml/parsers/attribute.rb +2 -2
  476. data/lib/lutaml/uml/parsers/dsl.rb +3 -4
  477. data/lib/lutaml/uml/parsers/yaml.rb +1 -1
  478. data/lib/lutaml/uml/qualified_name.rb +178 -0
  479. data/lib/lutaml/uml/tagged_value.rb +21 -0
  480. data/lib/lutaml/uml/top_element.rb +7 -1
  481. data/lib/lutaml/uml/top_element_attribute.rb +4 -0
  482. data/lib/lutaml/uml/validation/document_structure_validator.rb +389 -0
  483. data/lib/lutaml/uml.rb +89 -45
  484. data/lib/lutaml/uml_repository/error_handler.rb +203 -0
  485. data/lib/lutaml/uml_repository/exporters/base_exporter.rb +61 -0
  486. data/lib/lutaml/uml_repository/exporters/json_exporter.rb +344 -0
  487. data/lib/lutaml/uml_repository/exporters/markdown_exporter.rb +598 -0
  488. data/lib/lutaml/uml_repository/index_builder.rb +460 -0
  489. data/lib/lutaml/uml_repository/lazy_repository.rb +238 -0
  490. data/lib/lutaml/uml_repository/package_exporter.rb +336 -0
  491. data/lib/lutaml/uml_repository/package_loader.rb +220 -0
  492. data/lib/lutaml/uml_repository/package_metadata.rb +77 -0
  493. data/lib/lutaml/uml_repository/presenters/association_presenter.rb +86 -0
  494. data/lib/lutaml/uml_repository/presenters/attribute_presenter.rb +101 -0
  495. data/lib/lutaml/uml_repository/presenters/class_presenter.rb +75 -0
  496. data/lib/lutaml/uml_repository/presenters/datatype_presenter.rb +108 -0
  497. data/lib/lutaml/uml_repository/presenters/diagram_presenter.rb +508 -0
  498. data/lib/lutaml/uml_repository/presenters/element_presenter.rb +92 -0
  499. data/lib/lutaml/uml_repository/presenters/enum_presenter.rb +83 -0
  500. data/lib/lutaml/uml_repository/presenters/package_presenter.rb +48 -0
  501. data/lib/lutaml/uml_repository/presenters/presenter_factory.rb +76 -0
  502. data/lib/lutaml/uml_repository/queries/association_query.rb +187 -0
  503. data/lib/lutaml/uml_repository/queries/base_query.rb +45 -0
  504. data/lib/lutaml/uml_repository/queries/class_query.rb +117 -0
  505. data/lib/lutaml/uml_repository/queries/diagram_query.rb +111 -0
  506. data/lib/lutaml/uml_repository/queries/inheritance_query.rb +259 -0
  507. data/lib/lutaml/uml_repository/queries/package_query.rb +239 -0
  508. data/lib/lutaml/uml_repository/queries/search_query.rb +357 -0
  509. data/lib/lutaml/uml_repository/query_dsl/conditions/base_condition.rb +28 -0
  510. data/lib/lutaml/uml_repository/query_dsl/conditions/block_condition.rb +46 -0
  511. data/lib/lutaml/uml_repository/query_dsl/conditions/hash_condition.rb +84 -0
  512. data/lib/lutaml/uml_repository/query_dsl/conditions/package_condition.rb +84 -0
  513. data/lib/lutaml/uml_repository/query_dsl/order.rb +90 -0
  514. data/lib/lutaml/uml_repository/query_dsl/query_builder.rb +296 -0
  515. data/lib/lutaml/uml_repository/repository.rb +764 -0
  516. data/lib/lutaml/uml_repository/repository_enhanced.rb +439 -0
  517. data/lib/lutaml/uml_repository/search_result.rb +86 -0
  518. data/lib/lutaml/uml_repository/static_site/configuration.rb +270 -0
  519. data/lib/lutaml/uml_repository/static_site/data_transformer.rb +967 -0
  520. data/lib/lutaml/uml_repository/static_site/generator.rb +401 -0
  521. data/lib/lutaml/uml_repository/static_site/id_generator.rb +115 -0
  522. data/lib/lutaml/uml_repository/static_site/search_index_builder.rb +317 -0
  523. data/lib/lutaml/uml_repository/static_site.rb +88 -0
  524. data/lib/lutaml/uml_repository/statistics_calculator.rb +334 -0
  525. data/lib/lutaml/uml_repository/validators/repository_validator.rb +404 -0
  526. data/lib/lutaml/uml_repository/web_ui/app.rb +144 -0
  527. data/lib/lutaml/uml_repository/web_ui/public/app.js +452 -0
  528. data/lib/lutaml/uml_repository/web_ui/public/styles.css +381 -0
  529. data/lib/lutaml/uml_repository/web_ui/views/index.erb +40 -0
  530. data/lib/lutaml/uml_repository.rb +97 -0
  531. data/lib/lutaml/version.rb +3 -1
  532. data/lib/lutaml/xmi/liquid_drops/association_drop.rb +60 -58
  533. data/lib/lutaml/xmi/liquid_drops/attribute_drop.rb +55 -53
  534. data/lib/lutaml/xmi/liquid_drops/cardinality_drop.rb +15 -13
  535. data/lib/lutaml/xmi/liquid_drops/connector_drop.rb +50 -46
  536. data/lib/lutaml/xmi/liquid_drops/constraint_drop.rb +19 -17
  537. data/lib/lutaml/xmi/liquid_drops/data_type_drop.rb +93 -90
  538. data/lib/lutaml/xmi/liquid_drops/dependency_drop.rb +26 -24
  539. data/lib/lutaml/xmi/liquid_drops/diagram_drop.rb +26 -24
  540. data/lib/lutaml/xmi/liquid_drops/enum_drop.rb +40 -37
  541. data/lib/lutaml/xmi/liquid_drops/enum_owned_literal_drop.rb +20 -18
  542. data/lib/lutaml/xmi/liquid_drops/generalization_attribute_drop.rb +64 -62
  543. data/lib/lutaml/xmi/liquid_drops/generalization_drop.rb +142 -140
  544. data/lib/lutaml/xmi/liquid_drops/klass_drop.rb +174 -170
  545. data/lib/lutaml/xmi/liquid_drops/operation_drop.rb +23 -21
  546. data/lib/lutaml/xmi/liquid_drops/package_drop.rb +95 -93
  547. data/lib/lutaml/xmi/liquid_drops/root_drop.rb +28 -25
  548. data/lib/lutaml/xmi/liquid_drops/source_target_drop.rb +39 -37
  549. data/lib/lutaml/xmi/parsers/xmi_base.rb +27 -17
  550. data/lib/lutaml/xmi/parsers/xml.rb +9 -9
  551. data/lib/lutaml/xmi.rb +37 -6
  552. data/lib/lutaml/xml/parsers/xml.rb +3 -1
  553. data/lib/lutaml/xml.rb +3 -1
  554. data/lib/lutaml.rb +14 -2
  555. data/lutaml.gemspec +16 -8
  556. data/plateau_all_packages.lur +0 -0
  557. data/templates/static_site/assets/scripts/app.js +45 -0
  558. data/templates/static_site/assets/scripts/core/state.js +419 -0
  559. data/templates/static_site/assets/scripts/core/utils.js +133 -0
  560. data/templates/static_site/assets/scripts/ui/details.js +74 -0
  561. data/templates/static_site/assets/scripts/ui/diagrams.js +345 -0
  562. data/templates/static_site/assets/scripts/ui/search.js +187 -0
  563. data/templates/static_site/assets/scripts/ui/sidebar.js +214 -0
  564. data/templates/static_site/assets/styles/00-variables.css +144 -0
  565. data/templates/static_site/assets/styles/01-reset.css +79 -0
  566. data/templates/static_site/assets/styles/02-base.css +149 -0
  567. data/templates/static_site/assets/styles/03-layout.css +171 -0
  568. data/templates/static_site/assets/styles/04-components.css +856 -0
  569. data/templates/static_site/assets/styles/05-utilities.css +89 -0
  570. data/templates/static_site/assets/styles/06-diagrams.css +277 -0
  571. data/templates/static_site/components/class_details.liquid +328 -0
  572. data/templates/static_site/components/content.liquid +508 -0
  573. data/templates/static_site/components/diagram_list.liquid +52 -0
  574. data/templates/static_site/components/diagram_viewer.liquid +71 -0
  575. data/templates/static_site/components/header.liquid +134 -0
  576. data/templates/static_site/components/package_details.liquid +119 -0
  577. data/templates/static_site/components/sidebar.liquid +46 -0
  578. data/templates/static_site/components/tree_node.liquid +81 -0
  579. data/templates/static_site/multi_file.liquid +46 -0
  580. data/templates/static_site/single_file.liquid +52 -0
  581. metadata +604 -31
  582. data/CODE_OF_CONDUCT.md +0 -74
  583. data/docs/lutaml-sysml.adoc +0 -10
data/README.adoc CHANGED
@@ -1,12 +1,12 @@
1
- = LutaML: Ruby library for accessing data models
1
+ = LutaML: Unified data model accessor
2
2
 
3
3
  == Purpose
4
4
 
5
- LutaML aims to be a universal data model accessor that allows parsing
5
+ LutaML aims to be a unified data model accessor that allows parsing
6
6
  data models in multiple languages, including:
7
7
 
8
8
  * EXPRESS (https://www.expresslang.org[EXPRESS Language Foundation], ISO 10303-11)
9
- * XMI (from OMG)
9
+ * Enterprise Architect UML models in QEA format or exported as OMG XMI
10
10
  * UML in LutaML format
11
11
 
12
12
 
@@ -26,28 +26,49 @@ Directly:
26
26
  $ gem install lutaml
27
27
  ----
28
28
 
29
- == Usages
29
+ == Documentation
30
+
31
+ Complete documentation is available at https://lutaml.github.io/lutaml/
32
+
33
+ The documentation includes:
34
+
35
+ * **Getting Started**: link:docs/_tutorials/getting-started.adoc[Quick Start Tutorial]
36
+ * **User Guides**: link:docs/_guides/index.adoc[Task-oriented how-to guides]
37
+ * **Core Topics**: link:docs/_pages/index.adoc[Fundamental concepts and architecture]
38
+ * **Reference**: link:docs/_references/index.adoc[Detailed specifications and API documentation]
39
+
40
+ You can also build and browse the documentation locally:
41
+
42
+ [source,shell]
43
+ ----
44
+ cd docs
45
+ bundle install
46
+ bundle exec jekyll serve
47
+ # Open http://localhost:4000/lutaml/
48
+ ----
49
+
50
+ == Usage
30
51
 
31
52
  === Parsing
32
53
 
33
54
  The `Lutaml::Parser.parse` method provides a single point of entry for parsing
34
- data model files, such as:
55
+ data model files, including:
35
56
 
36
57
  * EXPRESS files with `.exp` extension
37
58
  * YAML Compressed EXPRESS CACHE files
59
+ * QEA files with `.qea` extension (Enterprise Architect databases)
38
60
  * XMI files with `.xmi` extension
39
61
  * XML files with `.xml` extension
40
62
  * LutaML files with `.lutaml` extension
41
- * LutaML YAML files with `.yml` extension
42
63
 
43
64
  Depending on the input file type, `Lutaml::Parser.parse` returns:
44
65
 
45
66
  * `Expressir::Express::Model::Repository` for EXPRESS files
46
67
  * `Expressir::Express::Cache` for EXPRESS CACHE files
68
+ * `Lutaml::Uml::Document` for QEA files (returned as single-element array)
47
69
  * `Lutaml::Uml::Document` for XMI files
48
70
  * `Lutaml::Uml::Document` for XML files
49
71
  * `Lutaml::Uml::Document` for LutaML files
50
- * `Lutaml::Uml::Document` for LutaML YAML files
51
72
 
52
73
  Examples to use the `Lutaml::Parser.parse`:
53
74
 
@@ -81,31 +102,1843 @@ model = Lutaml::Parser.parse([File.new("example.yaml")])
81
102
  ----
82
103
 
83
104
 
84
- === CLI
105
+ == Working with UML
106
+
107
+ === General
108
+
109
+ Lutaml supports various UML formats and unifies them under a common data
110
+ model: `Lutaml::Uml::Document`.
111
+
112
+ Lutaml supports the following UML formats:
113
+
114
+ * Enterprise Architect QEA files (`.qea` extension)
115
+ * Enterprise Architect exported XMI files (`.xmi` extension)
116
+ * Enterprise Architect exported XML files (`.xml` extension)
117
+ * LutaML UML files (`.lutaml` extension)
118
+
119
+
120
+ === LutaML UML
121
+
122
+ LutaML UML is a simple, human-readable representation of UML models.
123
+
124
+ The syntax is described in link:docs/pages/uml-syntax.adoc[LutaML UML syntax].
85
125
 
86
- There is a command-line interface available for parsing supported data model files.
126
+ === Enterprise Architect
87
127
 
88
- * EXPRESS `*.exp`
89
- * LutaML UML `*.lutaml`
90
- * LutaML YAML datastruct files
128
+ Enterprise Architect is a popular UML modeling tool by Sparx Systems.
129
+ It supports exporting UML models in XMI and XML formats.
130
+
131
+
132
+
133
+ == Diagram generation
134
+
135
+ === LutaML Diagrams
136
+
137
+ LutaML Diagram is a lightweight textual syntax for defining model diagrams.
138
+
139
+ The syntax is described in link:docs/pages/uml-syntax.adoc[LutaML diagram
140
+ syntax].
141
+
142
+ A CLI is provided to generate diagrams from LutaML DSL files:
91
143
 
92
144
  [source,bash]
93
145
  ----
94
- # Will generate `test.dot` file in the current directory
146
+ # Generate diagrams from LutaML DSL files
95
147
  $ lutaml -o . test.lutaml
96
-
97
- # Will generate `test.png` file in the `assets` directory
98
148
  $ lutaml -o assets -t png test.lutaml
99
149
  ----
100
150
 
101
- For additional info refer to `lutaml --help output`.
102
151
 
103
- == Other Usages
104
152
 
105
- * link:docs/lutaml-uml.adoc[Usage with Lutaml::Uml]
106
- * link:docs/lutaml-express.adoc[Usage with Lutaml::Express]
107
- * link:docs/lutaml-xmi.adoc[Usage with Lutaml::XMI]
108
- // * link:docs/lutaml-sysml.adoc[Usage with Lutaml::Sysml]
153
+ //=== CLI
154
+
155
+ ==== General
156
+
157
+ LutaML provides comprehensive command-line interfaces for working with data models and UML repositories.
158
+
159
+
160
+ **UML repository commands** (for XMI, QEA, and LUR files):
161
+
162
+ The `lutaml uml` command suite provides a complete interface for working with UML models. See [CLI commands reference](#cli-commands-reference) for details.
163
+
164
+ [source,bash]
165
+ ----
166
+ # Build LUR package from XMI or QEA
167
+ $ lutaml uml build model.xmi -o model.lur
168
+ $ lutaml uml build project.qea -o project.lur
169
+
170
+ # Explore and query
171
+ $ lutaml uml ls model.lur
172
+ $ lutaml uml tree model.lur --depth 2
173
+ $ lutaml uml search model.lur "Building"
174
+ $ lutaml uml stats model.lur
175
+
176
+ # Export and document
177
+ $ lutaml uml export model.lur --format csv -o classes.csv
178
+ $ lutaml uml build-spa model.lur -o docs/index.html
179
+ $ lutaml uml serve model.lur --port 8080
180
+
181
+ # Interactive exploration
182
+ $ lutaml uml repl model.lur
183
+ ----
184
+
185
+ ==== Thin wrapper principle
186
+
187
+ The CLI is designed as a thin wrapper around the Ruby API. Every CLI command directly maps to Ruby API methods, making it easy to:
188
+
189
+ * Transition from CLI to programmatic usage
190
+ * Understand what the CLI does by reading the API documentation
191
+ * Script complex workflows using Ruby when needed
192
+
193
+ .CLI to API mapping example
194
+ [example]
195
+ ====
196
+ [source,bash]
197
+ ----
198
+ # CLI command
199
+ $ lutaml uml build model.xmi -o model.lur
200
+ ----
201
+
202
+ Equivalent Ruby code:
203
+
204
+ [source,ruby]
205
+ ----
206
+ require "lutaml/xmi"
207
+
208
+ repo = Lutaml::UmlRepository::Repository.from_xmi("model.xmi")
209
+ repo.export_to_package("model.lur")
210
+ ----
211
+ ====
212
+
213
+
214
+ == UML support
215
+
216
+ === QEA Direct Database Parsing
217
+
218
+ LutaML supports direct parsing of Enterprise Architect `.qea` files (SQLite databases) without requiring XMI export. This provides significant performance improvements and access to EA-specific metadata.
219
+
220
+ ==== What are QEA files?
221
+
222
+ QEA (Quantified EA) files are Enterprise Architect's native database format based on SQLite. They contain the complete UML model including:
223
+
224
+ * Packages, classes, attributes, operations
225
+ * Associations and generalizations
226
+ * Diagrams and diagram elements
227
+ * EA-specific metadata (stereotypes, tagged values, etc.)
228
+
229
+ ==== Why direct parsing?
230
+
231
+ Direct QEA parsing offers several advantages over XMI:
232
+
233
+ * **Performance**: 10-20x faster than XMI parsing
234
+ * **No export step**: Parse directly from EA database
235
+ * **EA metadata**: Access to EA-specific information not available in XMI
236
+ * **Memory efficient**: Streams data from SQLite without loading entire file
237
+
238
+ ==== Parser API usage
239
+
240
+ [source,ruby]
241
+ ----
242
+ require "lutaml"
243
+
244
+ # Parse QEA file directly
245
+ document = Lutaml::Parser.parse([File.new("model.qea")]).first
246
+ # => returns Lutaml::Uml::Document
247
+
248
+ # Use with UmlRepository
249
+ repo = Lutaml::UmlRepository::Repository.new(document: document)
250
+
251
+ # Query the model
252
+ classes = repo.find_classes_by_stereotype("featureType")
253
+ ----
254
+
255
+ ==== QEA module API
256
+
257
+ The `Lutaml::Qea` module provides direct access to QEA parsing:
258
+
259
+ [source,ruby]
260
+ ----
261
+ require "lutaml/qea"
262
+
263
+ # Parse QEA file
264
+ document = Lutaml::Qea.parse("model.qea")
265
+
266
+ # With options
267
+ document = Lutaml::Qea.parse("model.qea",
268
+ include_diagrams: true,
269
+ validate: true
270
+ )
271
+
272
+ # Load database for low-level access
273
+ database = Lutaml::Qea.load_database("model.qea") do |table, current, total|
274
+ puts "Loading #{table}: #{current}/#{total}"
275
+ end
276
+
277
+ # Get quick statistics
278
+ info = Lutaml::Qea.database_info("model.qea")
279
+ puts info # => {"objects" => 693, "attributes" => 1910, ...}
280
+ ----
281
+
282
+ ==== CLI usage with QEA files
283
+
284
+ All CLI commands accept both XMI and QEA files:
285
+
286
+ [source,shell]
287
+ ----
288
+ # Build LUR from QEA (10-20x faster than XMI)
289
+ lutaml uml build model.qea -o model.lur
290
+
291
+ # Build LUR from XMI
292
+ lutaml uml build model.xmi -o model.lur
293
+
294
+ # All other commands work the same
295
+ lutaml uml search model.lur "Building"
296
+ lutaml uml tree model.lur
297
+ ----
298
+
299
+ ==== File validation
300
+
301
+ [source,ruby]
302
+ ----
303
+ require "lutaml/qea/file_detector"
304
+
305
+ # Check if file is valid QEA
306
+ if Lutaml::Qea::FileDetector.qea_file?("model.qea")
307
+ puts "Valid QEA file"
308
+ end
309
+
310
+ # Validate structure
311
+ result = Lutaml::Qea::FileDetector.validate_qea("model.qea")
312
+ if result[:valid]
313
+ puts "QEA file is valid"
314
+ else
315
+ result[:errors].each { |e| puts "ERROR: #{e}" }
316
+ end
317
+
318
+ # Get file information
319
+ info = Lutaml::Qea::FileDetector.file_info("model.qea")
320
+ puts "Size: #{info[:size_mb]} MB"
321
+ puts "Tables: #{info[:table_count]}"
322
+ puts "Objects: #{info[:object_count]}"
323
+ ----
324
+
325
+ ==== Performance benchmarking
326
+
327
+ [source,ruby]
328
+ ----
329
+ require "lutaml/qea/benchmark"
330
+
331
+ # Compare QEA vs XMI parsing
332
+ results = Lutaml::Qea::Benchmark.compare("model.qea", "model.xmi")
333
+
334
+ puts "QEA: #{results[:qea][:time]}s"
335
+ puts "XMI: #{results[:xmi][:time]}s"
336
+ puts "Speedup: #{results[:speedup]}x faster"
337
+
338
+ # Display formatted results
339
+ puts Lutaml::Qea::Benchmark.format_results(results)
340
+ ----
341
+
342
+ ==== Performance characteristics
343
+
344
+ Typical performance for a 20MB EA model:
345
+
346
+ * **QEA parsing**: 1-2 seconds
347
+ * **XMI parsing**: 20-40 seconds
348
+ * **Speedup**: 10-20x faster
349
+ * **Memory**: Lower memory footprint with QEA
350
+
351
+ ==== Configuration
352
+
353
+ QEA parsing is configured via `config/qea_schema.yml`:
354
+
355
+ [source,yaml]
356
+ ----
357
+ tables:
358
+ - table_name: t_object
359
+ enabled: true
360
+ model_class: Object
361
+
362
+ - table_name: t_attribute
363
+ enabled: true
364
+ model_class: Attribute
365
+
366
+ # ... other tables
367
+ ----
368
+
369
+ ==== Limitations
370
+
371
+ * QEA files must be SQLite 3 format
372
+ * Requires EA-specific table structure
373
+ * Some EA proprietary features may not be fully supported
374
+ * Only reads from QEA; does not write back to EA database
375
+
376
+
377
+ === QEA vs XMI Comparison
378
+
379
+ LutaML supports both QEA (SQLite) and XMI (XML) formats from Enterprise Architect. While functionally equivalent, QEA parsing offers several advantages:
380
+
381
+ ==== Performance
382
+
383
+ * **QEA**: 1-2 seconds for 20MB files (direct SQLite access)
384
+ * **XMI**: 20-40 seconds for same files (XML parsing overhead)
385
+ * **Speedup**: 10-20x faster parsing with QEA
386
+
387
+ ==== Data Richness
388
+
389
+ QEA preserves more semantic information due to direct database access:
390
+
391
+ **Association type differentiation**::
392
+ QEA preserves the distinction between Association, Aggregation, and Composition connector types through the `member_end_type` field. XMI export from EA hardcodes all association types as "aggregation", losing this semantic information.
393
+
394
+ **Tagged values**::
395
+ QEA includes object properties as tagged values, capturing EA-specific metadata that may not be exported to XMI. For example, a class in QEA might have 3 tagged values while the same class in XMI has 0, representing metadata loss during XMI export.
396
+
397
+ **Association generalization structure**::
398
+ QEA provides rich `AssociationGeneralization` objects with full type information, while XMI reduces these to simple string IDs, losing structural detail.
399
+
400
+ ==== Compatibility
401
+
402
+ * **99.6% parity** between formats for core UML data
403
+ * QEA is the preferred format when working with Enterprise Architect models
404
+ * Both formats produce equivalent Lutaml::Uml::Document structures
405
+
406
+
407
+
408
+
409
+ == LutaML UML Repository (LUR)
410
+
411
+ === General
412
+
413
+ LutaML UML Repository provides a unified interface for UML models with
414
+ built-in indexing and package management.
415
+
416
+
417
+ === Package format
418
+
419
+ LUR packages are ZIP archives containing:
420
+
421
+ ----
422
+ model.lur
423
+ ├── metadata.yaml # Package info, statistics
424
+ ├── models/
425
+ │ └── document.marshal # Serialized UML model
426
+ ├── indexes/
427
+ │ ├── all.marshal # Pre-built indexes
428
+ │ └── index_tree.yaml # Human-readable package tree (NEW)
429
+ └── statistics.yaml # Detailed statistics
430
+ ----
431
+
432
+ The `index_tree.yaml` file provides a human-readable view of the package
433
+ hierarchy with class counts, making it easy to inspect the structure without
434
+ loading the full repository. This is particularly useful for:
435
+
436
+ * Quick package structure inspection
437
+ * Debugging package organization
438
+ * Understanding model hierarchy
439
+ * Generating documentation
440
+
441
+
442
+ === Quick start
443
+
444
+ ==== CLI usage
445
+
446
+ [source,shell]
447
+ ----
448
+ # Build LUR package
449
+ lutaml uml package build model.qea -o model.lur
450
+ lutaml uml package build model.xmi -o model.lur
451
+
452
+ # Show package info
453
+ lutaml uml package info model.lur
454
+
455
+ # List packages
456
+ lutaml uml list model.lur
457
+
458
+ # Show package tree
459
+ lutaml uml tree model.lur --max-depth 3
460
+
461
+ # Show class details
462
+ lutaml uml show class "MyPackage::MyClass" model.lur
463
+
464
+ # Search
465
+ lutaml uml search "building" model.lur
466
+
467
+ # Get statistics
468
+ lutaml uml stats model.lur
469
+
470
+ # Command aliases (shortcuts)
471
+ lutaml uml ls model.lur # alias for 'list'
472
+ lutaml uml t model.lur # alias for 'tree'
473
+ lutaml uml s class MyClass model.lur # alias for 'show'
474
+ lutaml uml ? "building" model.lur # alias for 'search'
475
+ lutaml uml f --stereotype featureType model.lur # alias for 'find'
476
+
477
+ # Interactive shell (REPL)
478
+ lutaml uml shell model.lur
479
+ ----
480
+
481
+
482
+ ==== Build repository from XMI or QEA
483
+
484
+ [source,ruby]
485
+ ----
486
+ require "lutaml/xmi"
487
+
488
+ # Build from XMI file
489
+ repo = Lutaml::UmlRepository::Repository.from_xmi("model.xmi")
490
+
491
+ # Build from QEA file
492
+ repo = Lutaml::UmlRepository::Repository.from_qea("model.qea")
493
+
494
+ # Query the model
495
+ package = repo.find_package("ModelRoot::MyPackage")
496
+ klass = repo.find_class("ModelRoot::MyPackage::MyClass")
497
+ classes = repo.find_classes_by_stereotype("featureType")
498
+
499
+ # Get statistics
500
+ stats = repo.statistics
501
+ puts "Total classes: #{stats[:total_classes]}"
502
+ ----
503
+
504
+ ==== Save as LUR package
505
+
506
+ [source,ruby]
507
+ ----
508
+ # Export to .lur package (fast loading)
509
+ repo.export_to_package("model.lur",
510
+ name: "My Model",
511
+ version: "1.0",
512
+ serialization_format: :marshal # or :yaml
513
+ )
514
+
515
+ # Load from package (< 100ms vs >5s parsing XMI)
516
+ repo = Lutaml::UmlRepository::Repository.from_package("model.lur")
517
+
518
+ # Smart file detection (auto-detects format)
519
+ repo = Lutaml::UmlRepository::Repository.from_file("model.xmi")
520
+ repo = Lutaml::UmlRepository::Repository.from_file("model.lur")
521
+
522
+ # Intelligent caching (uses cache if fresh, rebuilds if stale)
523
+ repo = Lutaml::UmlRepository::Repository.from_file_cached("model.xmi")
524
+ # Creates model.lur and reuses it on subsequent runs
525
+ ----
526
+
527
+ === LUR configuration
528
+
529
+ ==== General
530
+
531
+ A configuration file is used to describe package-specific settings for an
532
+ LUR package, including metadata and features enabled.
533
+
534
+ The configuration format is as follows:
535
+
536
+ [source,yaml]
537
+ ----
538
+ metadata:
539
+ name: My Model
540
+ version: 1.0
541
+ description: A sample UML model
542
+ license: MIT
543
+ author: John Doe
544
+ package:
545
+ input: /path/to/model.xmi # or .qea
546
+ storage_format: marshal # or yaml
547
+ include_original_file: true
548
+ ----
549
+
550
+
551
+ === Search
552
+
553
+ LUR packages allow full-text search across model elements.
554
+
555
+ [source,ruby]
556
+ ----
557
+ # Get helpful suggestions for typos
558
+ repo.find_class("ModelRoot::Buildng", raise_on_error: true)
559
+ # => NameError: Class not found: ModelRoot::Buildng
560
+ # Did you mean one of these?
561
+ # - ModelRoot::Building
562
+ # - ModelRoot::BuildingPart
563
+
564
+ repo.find_package("ModelRoot::i-UP", raise_on_error: true)
565
+ # => NameError: Package not found: ModelRoot::i-UP
566
+ # Did you mean one of these?
567
+ # - ModelRoot::i-UR
568
+ ----
569
+
570
+
571
+ === API reference
572
+
573
+ ==== Smart loading methods
574
+
575
+ [source,ruby]
576
+ ----
577
+ # Auto-detect file type
578
+ repo = Lutaml::UmlRepository::Repository.from_file("model.xmi")
579
+ repo = Lutaml::UmlRepository::Repository.from_file("model.lur")
580
+
581
+ # Smart caching (only rebuilds when XMI is newer than cache)
582
+ repo = Lutaml::UmlRepository::Repository.from_file_cached("model.xmi")
583
+ repo = Lutaml::UmlRepository::Repository.from_file_cached("model.xmi",
584
+ lur_path: "cache/model.lur")
585
+ ----
586
+
587
+ ==== Error handling with suggestions
588
+
589
+ [source,ruby]
590
+ ----
591
+ # Find class with error handling
592
+ klass = repo.find_class("ModelRoot::MyClass", raise_on_error: true)
593
+ # Raises NameError with suggestions if not found
594
+
595
+ # Find package with error handling
596
+ package = repo.find_package("ModelRoot::MyPackage", raise_on_error: true)
597
+ # Raises NameError with suggestions if not found
598
+ ----
599
+
600
+
601
+ ==== Package navigation
602
+
603
+ [source,ruby]
604
+ ----
605
+ # Find package by path
606
+ package = repo.find_package("ModelRoot::i-UR::urf")
607
+
608
+ # List packages
609
+ packages = repo.list_packages("ModelRoot::i-UR", recursive: true)
610
+
611
+ # Get package tree
612
+ tree = repo.package_tree("ModelRoot", max_depth: 3)
613
+ ----
614
+
615
+ ==== Class queries
616
+
617
+ [source,ruby]
618
+ ----
619
+ # Find by qualified name
620
+ klass = repo.find_class("ModelRoot::i-UR::urf::Building")
621
+
622
+ # Find by stereotype
623
+ feature_types = repo.find_classes_by_stereotype("featureType")
624
+
625
+ # Get classes in package
626
+ classes = repo.classes_in_package("ModelRoot::i-UR::urf", recursive: false)
627
+ ----
628
+
629
+ ==== Inheritance queries
630
+
631
+ [source,ruby]
632
+ ----
633
+ # Get parent class
634
+ parent = repo.supertype_of("ModelRoot::MyPackage::ChildClass")
635
+
636
+ # Get child classes
637
+ children = repo.subtypes_of("ModelRoot::MyPackage::ParentClass")
638
+
639
+ # Get all children recursively
640
+ all_children = repo.subtypes_of(parent_class, recursive: true)
641
+
642
+ # Get inheritance chain
643
+ ancestors = repo.ancestors_of("ModelRoot::MyPackage::MyClass")
644
+
645
+ # Get all descendants
646
+ descendants = repo.descendants_of(base_class, max_depth: 2)
647
+ ----
648
+
649
+ ==== Association & diagram queries
650
+
651
+ [source,ruby]
652
+ ----
653
+ # Get associations
654
+ assocs = repo.associations_of("ModelRoot::MyPackage::MyClass")
655
+
656
+ # Get owned associations only
657
+ owned = repo.associations_of(my_class, owned_only: true)
658
+
659
+ # Get diagrams
660
+ diagrams = repo.diagrams_in_package("ModelRoot::MyPackage")
661
+ diagram = repo.find_diagram("Class Diagram")
662
+ all_diagrams = repo.all_diagrams
663
+ ----
664
+
665
+ ==== Search and element display
666
+
667
+ [source,ruby]
668
+ ----
669
+ # Text search
670
+ results = repo.search("urban planning", types: [:class, :attribute])
671
+ puts "Found #{results[:total]} matches"
672
+
673
+ # Pattern search
674
+ classes = repo.search("^Urban.*Area$", types: [:class])
675
+
676
+ # Display element details using presenters
677
+ presenter = Lutaml::Xmi::Presenters::PresenterFactory.create(klass)
678
+ puts presenter.to_text
679
+ puts presenter.to_yaml
680
+ puts presenter.to_json
681
+ ----
682
+
683
+ ==== Query DSL (Advanced queries)
684
+
685
+ The Query DSL provides a fluent, expressive interface for building complex
686
+ queries with method chaining, lazy evaluation, and composable filters.
687
+
688
+ [source,ruby]
689
+ ----
690
+ # Basic query with hash conditions
691
+ results = repo.query do |q|
692
+ q.classes.where(stereotype: 'featureType')
693
+ end.all
694
+
695
+ # Complex query with method chaining
696
+ results = repo.query do |q|
697
+ q.classes
698
+ .in_package('ModelRoot::i-UR', recursive: true)
699
+ .where { |c| c.attributes&.size.to_i > 10 }
700
+ .order_by(:name, direction: :desc)
701
+ .limit(5)
702
+ end.execute
703
+
704
+ # Immediate execution with query!
705
+ results = repo.query! do |q|
706
+ q.classes.with_stereotype('featureType')
707
+ end
708
+ ----
709
+
710
+ ===== Query builder methods
711
+
712
+ * `classes` - Start a class query
713
+ * `packages` - Start a package query
714
+ * `where(conditions)` - Filter by hash conditions (e.g., `stereotype: 'featureType'`)
715
+ * `where { |obj| ... }` - Filter with custom block logic
716
+ * `with_stereotype(stereotype)` - Shortcut for stereotype filtering
717
+ * `in_package(path, recursive: false)` - Filter by package membership
718
+ * `order_by(field, direction: :asc)` - Sort results (`:asc` or `:desc`)
719
+ * `limit(count)` - Limit number of results
720
+ * `execute` / `all` - Execute query and return results
721
+ * `first` - Get first result
722
+ * `last` - Get last result
723
+ * `count` - Count matching results
724
+ * `any?` - Check if any results exist
725
+ * `empty?` - Check if no results exist
726
+
727
+ ===== Query examples
728
+
729
+ [source,ruby]
730
+ ----
731
+ # Find all feature types with many attributes
732
+ large_features = repo.query! do |q|
733
+ q.classes
734
+ .with_stereotype('featureType')
735
+ .where { |c| c.attributes&.size.to_i > 20 }
736
+ .order_by(:name)
737
+ end
738
+
739
+ # Find classes in package hierarchy
740
+ classes = repo.query do |q|
741
+ q.classes
742
+ .in_package('ModelRoot::i-UR', recursive: true)
743
+ .where(is_abstract: false)
744
+ end.all
745
+
746
+ # Complex filtering with regex
747
+ results = repo.query! do |q|
748
+ q.classes
749
+ .where(name: /^Building/)
750
+ .where { |c| c.associations&.any? }
751
+ .limit(10)
752
+ end
753
+
754
+ # Combining multiple conditions
755
+ feature_types = repo.query do |q|
756
+ q.classes
757
+ .with_stereotype('featureType')
758
+ .where { |c| c.attributes&.size.to_i > 5 }
759
+ .where { |c| c.associations&.size.to_i > 2 }
760
+ end
761
+
762
+ # Get count without loading all results
763
+ count = feature_types.count
764
+
765
+ # Check if any exist
766
+ has_results = feature_types.any?
767
+
768
+ # Get ordered results
769
+ sorted = feature_types.order_by(:name, direction: :desc).all
770
+ ----
771
+
772
+ ===== Deferred vs immediate execution
773
+
774
+ [source,ruby]
775
+ ----
776
+ # Deferred execution - build query, execute later
777
+ builder = repo.query do |q|
778
+ q.classes.with_stereotype('featureType')
779
+ end
780
+
781
+ # Can add more conditions
782
+ builder.where { |c| c.attributes.size > 10 }
783
+
784
+ # Execute when ready
785
+ results = builder.execute
786
+
787
+ # Immediate execution - execute and return results
788
+ results = repo.query! do |q|
789
+ q.classes.with_stereotype('featureType')
790
+ end
791
+ ----
792
+
793
+ ==== Statistics & validation
794
+
795
+ [source,ruby]
796
+ ----
797
+ # Get statistics
798
+ stats = repo.statistics
799
+ puts "Packages: #{stats[:total_packages]}"
800
+ puts "Classes: #{stats[:total_classes]}"
801
+ puts "Stereotypes: #{stats[:classes_by_stereotype]}"
802
+
803
+ # Validate model
804
+ result = repo.validate
805
+ if result.valid?
806
+ puts "Model is valid"
807
+ else
808
+ result.errors.each { |error| puts "ERROR: #{error}" }
809
+ end
810
+ ----
811
+
812
+
813
+ === CLI commands
814
+
815
+ ==== General
816
+
817
+ The CLI provides 13 commands organized into 5 categories:
818
+
819
+ **Resource lifecycle:**
820
+
821
+ * `build` - Build LUR packages from XMI/QEA files
822
+ * `info` - Show LUR package metadata
823
+ * `validate` - Validate LUR packages
824
+ * `validate-qea` - Validate QEA files
825
+
826
+ **Viewing:**
827
+
828
+ * `ls` - List elements (packages, classes, diagrams)
829
+ * `inspect` - Show element details
830
+ * `tree` - Hierarchical package tree
831
+ * `stats` - Repository statistics
832
+
833
+ **Querying:**
834
+
835
+ * `search` - Full-text search
836
+ * `find` - Criteria-based search
837
+
838
+ **Output:**
839
+
840
+ * `export` - Export to CSV/JSON/Markdown
841
+ * `build-spa` - Generate SPA documentation site
842
+ * `serve` - Start interactive web UI
843
+
844
+ **Development:**
845
+
846
+ * `repl` - Interactive REPL shell
847
+
848
+
849
+ [[build-command]]
850
+ ==== `build` - Build LUR package
851
+
852
+ Build a LUR package from XMI or QEA source files.
853
+
854
+ [source,shell]
855
+ ----
856
+ lutaml uml build MODEL -o OUTPUT.lur [OPTIONS]
857
+ ----
858
+
859
+ Where,
860
+
861
+ `MODEL`:: Path to XMI or QEA file
862
+ `-o, --output`:: Output LUR file path (default: input with .lur extension)
863
+ `--name`:: Package name (optional)
864
+ `--version`:: Package version (default: 1.0)
865
+ `--format`:: Serialization format: marshal or yaml (default: marshal)
866
+ `--validate`:: Validate before building (default: true)
867
+ `--strict`:: Fail build on validation errors (default: false)
868
+
869
+ .Building from XMI file
870
+ [example]
871
+ ====
872
+ [source,shell]
873
+ ----
874
+ $ lutaml uml build model.xmi -o model.lur --name "My Model"
875
+ ----
876
+
877
+ Parses the XMI file, validates the model, and creates a LUR package.
878
+ ====
879
+
880
+ .Building from QEA file
881
+ [example]
882
+ ====
883
+ [source,shell]
884
+ ----
885
+ $ lutaml uml build project.qea -o project.lur --validate
886
+ ----
887
+
888
+ Parses QEA directly, faster than XMI export+parse.
889
+ ====
890
+
891
+ .Build with strict validation
892
+ [example]
893
+ ====
894
+ [source,shell]
895
+ ----
896
+ $ lutaml uml build model.xmi --strict
897
+ ----
898
+
899
+ Fails the build if any validation errors are found.
900
+ ====
901
+
902
+ [[info-command]]
903
+ ==== `info` - Show package metadata
904
+
905
+ Display metadata and statistics for a LUR package without loading the full repository.
906
+
907
+ [source,shell]
908
+ ----
909
+ lutaml uml info LUR [OPTIONS]
910
+ ----
911
+
912
+ Where,
913
+
914
+ `LUR`:: Path to LUR package file
915
+ `--format`:: Output format: text, yaml, or json (default: text)
916
+
917
+ .Viewing package information
918
+ [example]
919
+ ====
920
+ [source,shell]
921
+ ----
922
+ $ lutaml uml info model.lur
923
+ ----
924
+
925
+ Shows package name, version, creation date, and contents summary.
926
+ ====
927
+
928
+ [[validate-command]]
929
+ ==== `validate` - Validate LUR package
930
+
931
+ Validate a LUR package for consistency and completeness.
932
+
933
+ [source,shell]
934
+ ----
935
+ lutaml uml validate LUR [OPTIONS]
936
+ ----
937
+
938
+ Where,
939
+
940
+ `LUR`:: Path to LUR package file
941
+ `--verbose`:: Show detailed per-attribute type resolution information
942
+
943
+ Checks for:
944
+
945
+ * Dangling references
946
+ * Missing types (with detailed resolution paths when `--verbose` is used)
947
+ * External dependencies
948
+ * Structural integrity
949
+
950
+ .Validating a package
951
+ [example]
952
+ ====
953
+ [source,shell]
954
+ ----
955
+ $ lutaml uml validate model.lur
956
+ ----
957
+ ====
958
+
959
+ .Verbose validation with detailed type resolution
960
+ [example]
961
+ ====
962
+ [source,shell]
963
+ ----
964
+ $ lutaml uml validate model.lur --verbose
965
+ ----
966
+
967
+ Shows detailed information about type resolution for each attribute, helping diagnose type reference issues.
968
+ ====
969
+
970
+ [[validate-qea-command]]
971
+ ==== `validate-qea` - Validate QEA file
972
+
973
+ Validate QEA file structure, referential integrity, and data quality.
974
+
975
+ [source,shell]
976
+ ----
977
+ lutaml uml validate-qea FILE [OPTIONS]
978
+ ----
979
+
980
+ Where,
981
+
982
+ `FILE`:: Path to QEA file
983
+ `--format`:: Output format: text or json (default: text)
984
+ `-o, --output`:: Save report to file
985
+ `--strict`:: Exit with error if validation fails
986
+ `--show-warnings`:: Show warnings (default: true)
987
+
988
+ .Validating QEA file structure
989
+ [example]
990
+ ====
991
+ [source,shell]
992
+ ----
993
+ $ lutaml uml validate-qea model.qea --format json -o report.json
994
+ ----
995
+
996
+ Validates package structure, associations, references, and exports detailed report.
997
+ ====
998
+
999
+ [[ls-command]]
1000
+ ==== `ls` - List elements
1001
+
1002
+ List elements at the specified path in the repository.
1003
+
1004
+ [source,shell]
1005
+ ----
1006
+ lutaml uml ls LUR [PATH] [OPTIONS]
1007
+ ----
1008
+
1009
+ Where,
1010
+
1011
+ `LUR`:: Path to LUR package file
1012
+ `PATH`:: Package path to list (optional, default: root)
1013
+ `--type`:: Element type: packages, classes, diagrams, or all (default: packages)
1014
+ `--format`:: Output format: text, table, yaml, or json (default: text)
1015
+ `-r, --recursive`:: Include nested elements
1016
+ `--lazy`:: Use lazy loading for large repositories
1017
+
1018
+ .List top-level packages
1019
+ [example]
1020
+ ====
1021
+ [source,shell]
1022
+ ----
1023
+ $ lutaml uml ls model.lur
1024
+ ----
1025
+ ====
1026
+
1027
+ .List classes in a package
1028
+ [example]
1029
+ ====
1030
+ [source,shell]
1031
+ ----
1032
+ $ lutaml uml ls model.lur ModelRoot::Core --type classes
1033
+ ----
1034
+ ====
1035
+
1036
+ .List all diagrams
1037
+ [example]
1038
+ ====
1039
+ [source,shell]
1040
+ ----
1041
+ $ lutaml uml ls model.lur --type diagrams
1042
+ ----
1043
+ ====
1044
+
1045
+ [[inspect-command]]
1046
+ ==== `inspect` - Show element details
1047
+
1048
+ Display detailed information about a specific element.
1049
+
1050
+ [source,shell]
1051
+ ----
1052
+ lutaml uml inspect LUR ELEMENT [OPTIONS]
1053
+ ----
1054
+
1055
+ Where,
1056
+
1057
+ `LUR`:: Path to LUR package file
1058
+ `ELEMENT`:: Element identifier in format `type:identifier`
1059
+ +
1060
+ Valid types: `package`, `class`, `diagram`, `attribute`
1061
+
1062
+ `--format`:: Output format: text, yaml, or json (default: text)
1063
+ `--include`:: Sections to include: attributes, associations, operations
1064
+
1065
+ .Inspect a class
1066
+ [example]
1067
+ ====
1068
+ [source,shell]
1069
+ ----
1070
+ $ lutaml uml inspect model.lur class:Building
1071
+ $ lutaml uml inspect model.lur class:ModelRoot::Core::Building
1072
+ ----
1073
+
1074
+ Shows class details including attributes, associations, and operations.
1075
+ ====
1076
+
1077
+ .Inspect a package
1078
+ [example]
1079
+ ====
1080
+ [source,shell]
1081
+ ----
1082
+ $ lutaml uml inspect model.lur package:ModelRoot::Core
1083
+ ----
1084
+ ====
1085
+
1086
+ .Inspect a diagram
1087
+ [example]
1088
+ ====
1089
+ [source,shell]
1090
+ ----
1091
+ $ lutaml uml inspect model.lur diagram:ClassDiagram1
1092
+ ----
1093
+ ====
1094
+
1095
+ [[tree-command]]
1096
+ ==== `tree` - Show package tree
1097
+
1098
+ Display a hierarchical tree view of the package structure.
1099
+
1100
+ [source,shell]
1101
+ ----
1102
+ lutaml uml tree LUR [PATH] [OPTIONS]
1103
+ ----
1104
+
1105
+ Where,
1106
+
1107
+ `LUR`:: Path to LUR package file
1108
+ `PATH`:: Starting package path (optional, default: root)
1109
+ `-d, --depth`:: Maximum depth to display
1110
+ `--show-counts`:: Show class and diagram counts (default: true)
1111
+ `--format`:: Output format: text, yaml, or json (default: text)
1112
+
1113
+ .Show full package tree
1114
+ [example]
1115
+ ====
1116
+ [source,shell]
1117
+ ----
1118
+ $ lutaml uml tree model.lur
1119
+ ----
1120
+ ====
1121
+
1122
+ .Show subtree with limited depth
1123
+ [example]
1124
+ ====
1125
+ [source,shell]
1126
+ ----
1127
+ $ lutaml uml tree model.lur ModelRoot::Core --depth 2
1128
+ ----
1129
+ ====
1130
+
1131
+ [[element-details]]
1132
+ ==== `show` - Display element details
1133
+
1134
+ ===== General
1135
+
1136
+ The `show` commands display detailed information about specific UML elements.
1137
+
1138
+ ===== Showing class details
1139
+
1140
+ [source,shell]
1141
+ ----
1142
+ lutaml uml show class <QUALIFIED_NAME> --from <LUR_PATH>
1143
+ ----
1144
+
1145
+ .Viewing a class
1146
+ [example]
1147
+ ====
1148
+ [source,shell]
1149
+ ----
1150
+ $ lutaml uml show class "ModelRoot::CityGML2.0::bldg::Building" --from plateau.lur
1151
+ ----
1152
+
1153
+ Displays:
1154
+
1155
+ * Class name and XMI ID
1156
+ * Stereotype and abstract flag
1157
+ * Inheritance information
1158
+ * Attributes (with types and cardinality)
1159
+ * Associations
1160
+ * Operations
1161
+ ====
1162
+
1163
+ ===== Showing attribute details
1164
+
1165
+ [source,shell]
1166
+ ----
1167
+ lutaml uml show attribute <QUALIFIED_NAME> --from <LUR_PATH>
1168
+ ----
1169
+
1170
+ Where `<QUALIFIED_NAME>` includes the class path, e.g., `Package::Class::attributeName`.
1171
+
1172
+ .Viewing an attribute
1173
+ [example]
1174
+ ====
1175
+ [source,shell]
1176
+ ----
1177
+ $ lutaml uml show attribute "ModelRoot::CityGML2.0::bldg::Building::buildingHeight" --from plateau.lur
1178
+ ----
1179
+
1180
+ Displays:
1181
+
1182
+ * Attribute name
1183
+ * Owning class
1184
+ * Type and cardinality
1185
+ * Visibility and stereotype
1186
+ * Documentation
1187
+ ====
1188
+
1189
+ ===== Showing association details
1190
+
1191
+ [source,shell]
1192
+ ----
1193
+ lutaml uml show association <NAME_OR_ID> --from <LUR_PATH>
1194
+ ----
1195
+
1196
+ .Viewing an association
1197
+ [example]
1198
+ ====
1199
+ [source,shell]
1200
+ ----
1201
+ $ lutaml uml show association "cityObjectMember" --from plateau.lur
1202
+ ----
1203
+
1204
+ Displays:
1205
+
1206
+ * Association name and XMI ID
1207
+ * Source and target classes
1208
+ * Roles and multiplicities
1209
+ * Association type
1210
+ ====
1211
+
1212
+ ===== Showing enumeration details
1213
+
1214
+ [source,shell]
1215
+ ----
1216
+ lutaml uml show enum <QUALIFIED_NAME> --from <LUR_PATH>
1217
+ ----
1218
+
1219
+ .Viewing an enumeration
1220
+ [example]
1221
+ ====
1222
+ [source,shell]
1223
+ ----
1224
+ $ lutaml uml show enum "ModelRoot::Package::StatusCode" --from plateau.lur
1225
+ ----
1226
+
1227
+ Displays:
1228
+
1229
+ * Enum name and package
1230
+ * All literal values
1231
+ * Stereotypes
1232
+ * Documentation
1233
+ ====
1234
+
1235
+ ===== Showing data type details
1236
+
1237
+ [source,shell]
1238
+ ----
1239
+ lutaml uml show datatype <QUALIFIED_NAME> --from <LUR_PATH>
1240
+ ----
1241
+
1242
+ .Viewing a data type
1243
+ [example]
1244
+ ====
1245
+ [source,shell]
1246
+ ----
1247
+ $ lutaml uml show datatype "ModelRoot::gml::MeasureType" --from plateau.lur
1248
+ ----
1249
+
1250
+ Displays:
1251
+
1252
+ * Data type name
1253
+ * Attributes (if structured)
1254
+ * Operations
1255
+ * Stereotypes
1256
+ ====
1257
+
1258
+ ===== Output formats
1259
+
1260
+ All `show` commands support multiple output formats via the `--format` option:
1261
+
1262
+ `--format text`:: Formatted text output (default)
1263
+ `--format yaml`:: YAML structured data
1264
+ `--format json`:: JSON structured data
1265
+
1266
+ .Exporting element details as JSON
1267
+ [example]
1268
+ ====
1269
+ [source,shell]
1270
+ ----
1271
+ $ lutaml uml show class "ModelRoot::Package::MyClass" --from model.lur --format json
1272
+ ----
1273
+
1274
+ Returns structured JSON data suitable for programmatic processing.
1275
+ ====
1276
+
1277
+
1278
+ [[stats-command]]
1279
+ ==== `stats` - Repository statistics
1280
+
1281
+ Display statistics about the repository or a specific package.
1282
+
1283
+ [source,shell]
1284
+ ----
1285
+ lutaml uml stats LUR [OPTIONS]
1286
+ ----
1287
+
1288
+ Where,
1289
+
1290
+ `LUR`:: Path to LUR package file
1291
+ `--type`:: Statistics type: packages, classes, diagrams, or all (default: all)
1292
+ `--detailed`:: Show detailed breakdown
1293
+ `--format`:: Output format: text, yaml, or json (default: text)
1294
+
1295
+ .Show repository statistics
1296
+ [example]
1297
+ ====
1298
+ [source,shell]
1299
+ ----
1300
+ $ lutaml uml stats model.lur --detailed
1301
+ ----
1302
+
1303
+ Displays counts of packages, classes, data types, enumerations, diagrams, and stereotypes.
1304
+ ====
1305
+
1306
+ [[search-command]]
1307
+ ==== `search` - Full-text search
1308
+
1309
+ The `search` command performs powerful text and pattern-based search across
1310
+ classes, attributes, and associations with advanced filtering, export
1311
+ capabilities, and intelligent suggestions.
1312
+
1313
+ Advanced features include wildcard package matching, regex patterns,
1314
+ field-specific search, result export, and search suggestions.
1315
+
1316
+ [source,shell]
1317
+ ----
1318
+ lutaml uml search <LUR> <QUERY> [OPTIONS]
1319
+ ----
1320
+
1321
+ Where,
1322
+
1323
+ `<LUR>`:: Path to LUR package file
1324
+ `<QUERY>`:: Search query text
1325
+ `--type`:: Element types to search: class, attribute, association (default: all)
1326
+ `--package`:: Filter by package path (supports wildcards: `*`, `?`, `[abc]`)
1327
+ `--regex`:: Treat query as regular expression
1328
+ `--in`:: Fields to search: name, documentation (default: name)
1329
+ `--format`:: Output format: text, table, yaml, or json (default: table)
1330
+ `--limit`:: Maximum results (default: 100)
1331
+
1332
+ .Searching for "building" across all element types
1333
+ [example]
1334
+ ====
1335
+ [source,shell]
1336
+ ----
1337
+ $ lutaml uml search plateau.lur "building"
1338
+ ----
1339
+
1340
+ This searches for "building" in class names, attribute names, and association names, displaying results in a table format:
1341
+
1342
+ [source]
1343
+ ----
1344
+ Search Results for 'building':
1345
+
1346
+ Type | Name | Package | Details
1347
+ ──────────────────────────────────────────────────────────────────────────────────────
1348
+ Class | Building | ModelRoot::CityGML2.0::bldg | <<FeatureType>>
1349
+ Class | BuildingPart | ModelRoot::CityGML2.0::bldg | <<FeatureType>>
1350
+ Attribute | buildingHeight | ModelRoot::CityGML2.0::bldg | Building::buildingHeight : Double
1351
+ Attribute | buildingCoverageRate | ModelRoot::i-UR::urf | Administration::buildingCoverageRate : xs::integer
1352
+ ...
1353
+
1354
+ Summary: 28 class(es), 73 attribute(s), 45 association(s)
1355
+ ----
1356
+ ====
1357
+
1358
+
1359
+ **Core search options**:
1360
+
1361
+ `--element-type <TYPE>`::
1362
+ Filter results by element type.
1363
+ Valid values: `class`, `attribute`, `association`.
1364
+
1365
+ `--package <PATH>`::
1366
+ Filter results to show only elements within the specified package path.
1367
+ Supports explicit wildcards: `*`, `?`, `[abc]`.
1368
+
1369
+ `--sort <FIELD>`::
1370
+ Sort results.
1371
+ Valid values: `type`, `name`, `package`.
1372
+ Default: `type`.
1373
+
1374
+ `--limit <NUMBER>`::
1375
+ Limit the number of results displayed.
1376
+ Default: `100`.
1377
+
1378
+ `--format <FORMAT>`::
1379
+ Output format.
1380
+ Valid values: `table`, `text`, `yaml`, `json`.
1381
+ Default: `table`.
1382
+
1383
+ `--regex`::
1384
+ Treat query as a regular expression pattern.
1385
+ Enables powerful pattern-based searching.
1386
+
1387
+ `--in <FIELDS...>`::
1388
+ Specify which fields to search in.
1389
+ Valid values: `name`, `documentation`.
1390
+ Default: `name`.
1391
+ Can specify multiple fields.
1392
+
1393
+ `--count`::
1394
+ Show only result counts without displaying full results.
1395
+ Displays total count and breakdown by element type.
1396
+
1397
+ `--export <FILE>`::
1398
+ Export search results to a file.
1399
+ Format auto-detected from extension (`.json` or `.yaml`/`.yml`).
1400
+
1401
+ .Wildcard package matching
1402
+ [example]
1403
+ ====
1404
+ [source,shell]
1405
+ ----
1406
+ $ lutaml uml search plateau.lur "building" --package "*i-UR*"
1407
+ ----
1408
+
1409
+ Matches any package path containing "i-UR" anywhere.
1410
+ Found 95 results compared to 50 with full path `"ModelRoot::Conceptual Models::i-UR"`.
1411
+
1412
+ Wildcard patterns supported:
1413
+
1414
+ * `*` - Matches any characters
1415
+ * `?` - Matches single character
1416
+ * `[abc]` - Matches one character from set
1417
+ ====
1418
+
1419
+
1420
+ .Regex pattern search
1421
+ [example]
1422
+ ====
1423
+ [source,shell]
1424
+ ----
1425
+ $ lutaml uml search plateau.lur "^Building" --regex --element-type class
1426
+ ----
1427
+
1428
+ Finds all classes whose names start with "Building" (case-sensitive regex).
1429
+ Found 17 classes: Building, BuildingPart, BuildingInstallation, etc.
1430
+
1431
+ The `--regex` flag treats the query as a regular expression:
1432
+
1433
+ * `^Building` - Names starting with "Building"
1434
+ * `.*Address$` - Names ending with "Address"
1435
+ * `Building|Structure` - Names containing either word
1436
+ ====
1437
+
1438
+
1439
+ .Searching in documentation
1440
+ [example]
1441
+ ====
1442
+ [source,shell]
1443
+ ----
1444
+ $ lutaml uml search plateau.lur "urban planning" --in name documentation
1445
+ ----
1446
+
1447
+ Searches both name and documentation fields.
1448
+ Useful for finding elements by their purpose or description, not just their name.
1449
+
1450
+ Multiple fields can be specified:
1451
+
1452
+ * `--in name` - Search names only (default)
1453
+ * `--in documentation` - Search documentation only
1454
+ * `--in name documentation` - Search both fields
1455
+ ====
1456
+
1457
+ .Count-only mode
1458
+ [example]
1459
+ ====
1460
+ [source,shell]
1461
+ ----
1462
+ $ lutaml uml search plateau.lur "building" --count
1463
+ ----
1464
+
1465
+ Shows statistics without displaying full results:
1466
+
1467
+ [source]
1468
+ ----
1469
+ Search Results for 'building':
1470
+
1471
+ Total Results: 146
1472
+
1473
+ Breakdown by Type:
1474
+ Association 45
1475
+ Attribute 73
1476
+ Class 28
1477
+ ----
1478
+
1479
+ Useful for quick analysis or when combined with filters:
1480
+
1481
+ [source,shell]
1482
+ ----
1483
+ $ lutaml uml search plateau.lur "building" --element-type class --count
1484
+ ----
1485
+ ====
1486
+
1487
+ .Exporting search results
1488
+ [example]
1489
+ ====
1490
+ [source,shell]
1491
+ ----
1492
+ $ lutaml uml search plateau.lur "Building" --element-type class --export results.json
1493
+ $ lutaml uml search plateau.lur "Building" --element-type class --export results.yaml
1494
+ ----
1495
+
1496
+ Exports filtered search results to a file for further processing.
1497
+ The format is auto-detected from the file extension.
1498
+
1499
+ Exported data includes:
1500
+
1501
+ * `element_type` - Type of element (class, attribute, association)
1502
+ * `qualified_name` - Full qualified name
1503
+ * `package_path` - Package location
1504
+ * `match_field` - Which field matched (name or documentation)
1505
+ * `match_context` - Additional context (e.g., class name for attributes)
1506
+ ====
1507
+
1508
+ .Search suggestions
1509
+ [example]
1510
+ ====
1511
+ When no results are found, the search suggests similar terms based on edit distance and substring matching:
1512
+
1513
+ [source,shell]
1514
+ ----
1515
+ $ lutaml uml search plateau.lur "Buiding"
1516
+ ----
1517
+
1518
+ [source]
1519
+ ----
1520
+ ⚠ No results found for 'Buiding'
1521
+
1522
+ Did you mean one of these?
1523
+ • Building
1524
+ • BuildingPart
1525
+ • BuildingInstallation
1526
+ ----
1527
+
1528
+ Suggestions use Levenshtein distance algorithm to find close matches.
1529
+ ====
1530
+
1531
+ .Combining advanced features
1532
+ [example]
1533
+ ====
1534
+ [source,shell]
1535
+ ----
1536
+ $ lutaml uml search plateau.lur "^Build" \
1537
+ --regex \
1538
+ --package "*CityGML*" \
1539
+ --element-type class \
1540
+ --sort name \
1541
+ --limit 10 \
1542
+ --export citygml_buildings.json
1543
+ ----
1544
+
1545
+ This command:
1546
+
1547
+ * Uses regex to find names starting with "Build"
1548
+ * Filters to packages containing "CityGML"
1549
+ * Shows only classes
1550
+ * Sorts by name
1551
+ * Limits to 10 results
1552
+ * Exports to JSON file
1553
+
1554
+ Multiple filters work together seamlessly.
1555
+ ====
1556
+
1557
+ .Filtering search results by element type
1558
+ [example]
1559
+ ====
1560
+ [source,shell]
1561
+ ----
1562
+ $ lutaml uml search plateau.lur "building" --element-type class
1563
+ ----
1564
+
1565
+ Shows only classes matching "building", excluding attributes and associations.
1566
+ ====
1567
+
1568
+ .Searching within a specific package
1569
+ [example]
1570
+ ====
1571
+ [source,shell]
1572
+ ----
1573
+ $ lutaml uml search plateau.lur "urban" --package "ModelRoot::Conceptual Models::i-UR"
1574
+ ----
1575
+
1576
+ Searches for "urban" only within the i-UR package and its subpackages.
1577
+ ====
1578
+
1579
+
1580
+ *Pagination*::
1581
+
1582
+ For large result sets, use pagination to view results in manageable chunks.
1583
+
1584
+ `--per-page <NUMBER>`::
1585
+ Number of results per page.
1586
+ Default: `50`.
1587
+
1588
+ `--page <NUMBER>`::
1589
+ Page number to display (1-based).
1590
+ Default: `1`.
1591
+
1592
+ .Paginating through search results
1593
+ [example]
1594
+ ====
1595
+ [source,shell]
1596
+ ----
1597
+ $ lutaml uml search plateau.lur "class" --per-page 20 --page 1 # First page
1598
+ $ lutaml uml search plateau.lur "class" --per-page 20 --page 2 # Second page
1599
+ ----
1600
+
1601
+ View results 20 at a time, navigating through pages.
1602
+ ====
1603
+
1604
+
1605
+ // TODO: COMBINE SEARCH AND FIND
1606
+ [[find-command]]
1607
+ ==== `find` - Find by criteria
1608
+
1609
+ Find elements matching specific criteria.
1610
+
1611
+ [source,shell]
1612
+ ----
1613
+ lutaml uml find LUR [OPTIONS]
1614
+ ----
1615
+
1616
+ Where,
1617
+
1618
+ `LUR`:: Path to LUR package file
1619
+ `--stereotype`:: Filter by stereotype
1620
+ `--package`:: Filter by package path
1621
+ `--pattern`:: Match name pattern (regex)
1622
+ `--format`:: Output format: text, yaml, or json (default: text)
1623
+
1624
+ .Find by stereotype
1625
+ [example]
1626
+ ====
1627
+ [source,shell]
1628
+ ----
1629
+ $ lutaml uml find model.lur --stereotype featureType
1630
+ ----
1631
+ ====
1632
+
1633
+ .Find by package
1634
+ [example]
1635
+ ====
1636
+ [source,shell]
1637
+ ----
1638
+ $ lutaml uml find model.lur --package ModelRoot::Core
1639
+ ----
1640
+ ====
1641
+
1642
+ .Find by pattern
1643
+ [example]
1644
+ ====
1645
+ [source,shell]
1646
+ ----
1647
+ $ lutaml uml find model.lur --pattern "^Building.*"
1648
+ ----
1649
+ ====
1650
+
1651
+ // TODO: REMOVE THIS COMMAND
1652
+ // [[export-command]]
1653
+ // ==== `export` - Export to formats
1654
+
1655
+ // Export repository data to various structured formats.
1656
+
1657
+ // [source,shell]
1658
+ // ----
1659
+ // lutaml uml export LUR --format FORMAT -o OUTPUT [OPTIONS]
1660
+ // ----
1661
+
1662
+ // Where,
1663
+
1664
+ // `LUR`:: Path to LUR package file
1665
+ // `--format`:: Export format: csv, json, or markdown (required)
1666
+ // `-o, --output`:: Output path (required)
1667
+ // `--package`:: Filter by package
1668
+ // `--recursive`:: Include nested packages (default: true)
1669
+
1670
+ // .Export to CSV
1671
+ // [example]
1672
+ // ====
1673
+ // [source,shell]
1674
+ // ----
1675
+ // $ lutaml uml export model.lur --format csv -o classes.csv
1676
+ // ----
1677
+
1678
+ // Exports all classes to CSV format.
1679
+ // ====
1680
+
1681
+ // .Export to JSON
1682
+ // [example]
1683
+ // ====
1684
+ // [source,shell]
1685
+ // ----
1686
+ // $ lutaml uml export model.lur --format json -o model.json
1687
+ // ----
1688
+
1689
+ // Exports full repository structure to JSON.
1690
+ // ====
1691
+
1692
+ // .Export to Markdown
1693
+ // [example]
1694
+ // ====
1695
+ // [source,shell]
1696
+ // ----
1697
+ // $ lutaml uml export model.lur --format markdown -o docs/
1698
+ // ----
1699
+
1700
+ // Generates Markdown documentation files.
1701
+ // ====
1702
+
1703
+
1704
+
1705
+ [[build-spa-command]]
1706
+ ==== `build-spa` - Generate SPA documentation
1707
+
1708
+ A LUR package can be transformed into a Single Page Application (SPA) for
1709
+ interactive browsing of the UML model.
1710
+
1711
+ The SPA provides a user-friendly web interface with search, navigation, and
1712
+ detailed class views.
1713
+
1714
+ Features of the generated SPA:
1715
+
1716
+ * Vanilla JavaScript: No frameworks required, fast loading
1717
+ * Responsive design: Works on desktop and mobile
1718
+ * Offline capable: Single-file mode works without a server
1719
+ * Search: Full-text search with highlighting
1720
+ * Navigation: Package tree with counts, breadcrumbs
1721
+
1722
+ * Detailed view: Comprehensive class information with:
1723
+ ** Direct attributes and inherited attributes (in separate tables)
1724
+ ** Direct associations and inherited associations (in separate tables)
1725
+ ** Operations
1726
+ ** Inheritance hierarchy (generalizations and specializations)
1727
+ ** Stereotypes and documentation
1728
+
1729
+
1730
+ Syntax:
1731
+
1732
+ [source,shell]
1733
+ ----
1734
+ lutaml uml build-spa LUR -o OUTPUT [OPTIONS]
1735
+ ----
1736
+
1737
+ Where,
1738
+
1739
+ `LUR`:: Path to LUR package file
1740
+ `-o, --output`:: Output file path (required)
1741
+ `--mode`:: Generation mode: `single_file` (default) or `multi_file`
1742
+ `--title`:: Documentation title (default: "UML Model Browser")
1743
+ `--theme`:: Color theme: `light` (default) or `dark`
1744
+
1745
+ The `build-spa` command generates an interactive documentation site with:
1746
+
1747
+ * **Search functionality**: Full-text search across all model elements
1748
+ * **Package navigation**: Tree-based browsing of the package hierarchy
1749
+ * **Class details**: Complete class information including attributes, associations, operations, and inheritance
1750
+ * **Inherited data**: Separate display of inherited attributes and associations
1751
+ * **Diagram integration**: Embedded diagram viewing (when available)
1752
+
1753
+ .Generate single-file SPA (default)
1754
+ [example]
1755
+ ====
1756
+ [source,shell]
1757
+ ----
1758
+ $ lutaml uml build-spa model.lur -o docs/index.html --title "My UML Model"
1759
+ ----
1760
+
1761
+ Creates a single HTML file (3-4MB for large models) with all data, CSS, and JavaScript embedded. Perfect for easy distribution and offline viewing.
1762
+ ====
1763
+
1764
+ .Generate multi-file SPA
1765
+ [example]
1766
+ ====
1767
+ [source,shell]
1768
+ ----
1769
+ $ lutaml uml build-spa model.lur -o docs/ --mode multi_file
1770
+ ----
1771
+
1772
+ Creates a directory structure with separate HTML, CSS, and JavaScript files. Better for version control and incremental updates.
1773
+ ====
1774
+
1775
+
1776
+
1777
+ [[serve-command]]
1778
+ ==== `serve` - Start web UI
1779
+
1780
+ Start a web server with an interactive UI for browsing the model.
1781
+
1782
+ [source,shell]
1783
+ ----
1784
+ lutaml uml serve LUR [OPTIONS]
1785
+ ----
1786
+
1787
+ Where,
1788
+
1789
+ `LUR`:: Path to LUR package file
1790
+ `-p, --port`:: Port to listen on (default: 3000)
1791
+ `-h, --host`:: Host to bind to (default: localhost)
1792
+
1793
+ .Start web UI server
1794
+ [example]
1795
+ ====
1796
+ [source,shell]
1797
+ ----
1798
+ $ lutaml uml serve model.lur --port 8080
1799
+ ----
1800
+
1801
+ Starts interactive web interface at http://localhost:8080.
1802
+ ====
1803
+
1804
+
1805
+
1806
+ [[repl-command]]
1807
+ ==== `repl` - Interactive shell
1808
+
1809
+ LutaML provides an interactive command-line shell (REPL) for exploring LUR
1810
+ packages.
1811
+
1812
+ Syntax:
1813
+
1814
+ [source,shell]
1815
+ ----
1816
+ lutaml uml repl LUR [OPTIONS]
1817
+ ----
1818
+
1819
+ Where,
1820
+
1821
+ `LUR`:: Path to LUR package file
1822
+ `--color`:: Enable colored output (default: true)
1823
+ `--icons`:: Enable icons in output (default: true)
1824
+
1825
+ .Start interactive shell
1826
+ [example]
1827
+ ====
1828
+ [source,shell]
1829
+ ----
1830
+ $ lutaml uml repl model.lur
1831
+ ----
1832
+
1833
+ Opens an interactive shell with commands like `cd`, `ls`, `tree`, `find`,
1834
+ `search`, bookmarks, and more.
1835
+ ====
1836
+
1837
+ The interactive shell provides a full-featured command-line interface for
1838
+ exploring UML repositories:
1839
+
1840
+ [source,shell]
1841
+ ----
1842
+ # Start interactive shell
1843
+ lutaml uml shell model.lur
1844
+
1845
+ # Inside the shell:
1846
+ lutaml[/]> help # Show available commands
1847
+ lutaml[/]> ls # List packages in current location
1848
+ lutaml[/]> cd i-UR::urf # Navigate to package
1849
+ lutaml[/i-UR::urf]> pwd # Show current path
1850
+ lutaml[/i-UR::urf]> tree # Show tree from current location
1851
+ lutaml[/i-UR::urf]> find Building # Find classes
1852
+ lutaml[/i-UR::urf]> show 1 # Show first search result
1853
+ lutaml[/i-UR::urf]> bookmark add urf # Bookmark current location
1854
+ lutaml[/i-UR::urf]> bm urf # Jump to bookmark
1855
+ lutaml[/i-UR::urf]> stats # Show statistics
1856
+ lutaml[/i-UR::urf]> exit # Exit shell
1857
+ ----
1858
+
1859
+ The shell provides a number of useful features:
1860
+
1861
+ * Tab completion for commands and paths
1862
+ * Command history persisted to `~/.lutaml-xmi-history`
1863
+ * Colorized output with Unicode icons
1864
+ * Contextual prompts showing current location
1865
+ * Error handling with helpful messages
1866
+
1867
+
1868
+ Navigation commands::
1869
+
1870
+ `cd PATH`::: Change to package path
1871
+ `pwd`::: Print current working path
1872
+ `ls [PATH]`::: List packages at path
1873
+ `tree [PATH]`::: Show tree from path
1874
+ `up`::: Go to parent package
1875
+ `root`::: Go to ModelRoot
1876
+ `back`::: Go to previous location
1877
+
1878
+ Query commands::
1879
+
1880
+ `find CLASS_NAME`::: Find class (fuzzy search)
1881
+ `show class QNAME`::: Show class details
1882
+ `show package PATH`::: Show package details
1883
+ `show NUMBER`::: Show numbered result from last search
1884
+ `search QUERY`::: Full-text search
1885
+ `? QUERY`::: Alias for search
1886
+
1887
+ Bookmark commands::
1888
+
1889
+ `bookmark add NAME`::: Bookmark current path or last result
1890
+ `bookmark list`::: List all bookmarks
1891
+ `bookmark go NAME`::: Jump to bookmark
1892
+ `bookmark rm NAME`::: Remove bookmark
1893
+ `bm NAME`::: Quick jump to bookmark
1894
+
1895
+ Utility commands::
1896
+
1897
+ `results`::: Show last search results
1898
+ `export last csv FILE`::: Export last results to CSV
1899
+ `export last json FILE`::: Export to JSON
1900
+ `export last yaml FILE`::: Export to YAML
1901
+ `help [COMMAND]`::: Show help
1902
+ `history`::: Show command history
1903
+ `clear`::: Clear screen
1904
+ `config`::: Show configuration
1905
+ `stats`::: Quick statistics
1906
+ `exit`, `quit`, `q`::: Exit shell
1907
+
1908
+
1909
+ // === Integration with lutaml-klin
1910
+
1911
+ // [source,ruby]
1912
+ // ----
1913
+ // # In lutaml-klin workflow
1914
+ // uml_repo = Lutaml::UmlRepository::Repository.from_package("model.lur")
1915
+ // xsd_repo = Lutaml::Xsd::SchemaRepository.from_package("schemas.lxr")
1916
+
1917
+ // # Map UML classes to XSD types
1918
+ // uml_repo.find_classes_by_stereotype("featureType").each do |uml_class|
1919
+ // xsd_type = xsd_repo.resolve_type("#{uml_class.name}Type")
1920
+ // # Create mapping...
1921
+ // end
1922
+ // ----
1923
+
1924
+ === Examples
1925
+
1926
+ See the `examples/` directory for complete examples:
1927
+
1928
+ * `examples/lur_basic_usage.rb` - Basic repository operations
1929
+ * `examples/lur_cli_workflow.rb` - Command-line workflow
1930
+ * `examples/lur_statistics.rb` - Statistics and validation
1931
+
1932
+ == See Also
1933
+
1934
+ For detailed information on specific topics:
1935
+
1936
+ * link:docs/_guides/uml-modeling.adoc[UML Modeling Guide]
1937
+ * link:docs/_guides/parsing/express-parsing.adoc[EXPRESS Parsing Guide]
1938
+ * link:docs/_guides/parsing/xmi-parsing.adoc[XMI Parsing Guide]
1939
+ * link:docs/_guides/sysml-modeling.adoc[SysML Modeling Guide]
1940
+ * link:docs/_guides/diagram-generation.adoc[Diagram Generation Guide]
1941
+ * link:docs/_references/formats/qea-structure.adoc[QEA File Format Reference]
109
1942
 
110
1943
  == Copyright and license
111
1944