mxrb 0.1.2 → 0.1.4

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mxrb +458 -10
  3. data/docs/de-DE/README.md +1 -0
  4. data/docs/de-DE/oql-sql.md +42 -0
  5. data/docs/de-DE/project-structure.md +201 -2
  6. data/docs/de-DE/runtime-ruby.md +104 -0
  7. data/docs/de-DE/runtime-schema-migrations.md +44 -0
  8. data/docs/de-DE/validation-matrix.md +42 -4
  9. data/docs/en-US/README.md +1 -0
  10. data/docs/en-US/oql-sql.md +41 -0
  11. data/docs/en-US/project-structure.md +192 -2
  12. data/docs/en-US/runtime-ruby.md +100 -0
  13. data/docs/en-US/runtime-schema-migrations.md +41 -0
  14. data/docs/en-US/validation-matrix.md +39 -4
  15. data/docs/pt-BR/README.md +1 -0
  16. data/docs/pt-BR/entity-dsl.md +8 -0
  17. data/docs/pt-BR/oql-sql.md +41 -0
  18. data/docs/pt-BR/project-structure.md +197 -2
  19. data/docs/pt-BR/runtime-ruby.md +108 -0
  20. data/docs/pt-BR/runtime-schema-migrations.md +40 -0
  21. data/docs/pt-BR/validation-matrix.md +42 -5
  22. data/docs/pt-BR/writing.md +28 -0
  23. data/lib/mxrb/cli/help.rb +426 -0
  24. data/lib/mxrb/cli/release.rb +137 -0
  25. data/lib/mxrb/compiler/compatibility_analyzer.rb +1 -1
  26. data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +8 -1
  27. data/lib/mxrb/compiler/domain_document_compiler.rb +3 -0
  28. data/lib/mxrb/compiler/gallery_bundle_compiler.rb +11 -1
  29. data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +76 -19
  30. data/lib/mxrb/compiler/legacy_custom_widget_compiler.rb +159 -0
  31. data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +43 -7
  32. data/lib/mxrb/compiler/legacy_page_builder.rb +1248 -23
  33. data/lib/mxrb/compiler/packager.rb +27 -13
  34. data/lib/mxrb/compiler/page_bundle_compiler.rb +13 -4
  35. data/lib/mxrb/compiler/portable_packager.rb +16 -11
  36. data/lib/mxrb/compiler/web_bundle_builder.rb +5 -1
  37. data/lib/mxrb/compiler/web_shell_materializer.rb +42 -2
  38. data/lib/mxrb/compiler/widget_package_extractor.rb +3 -0
  39. data/lib/mxrb/domain_diagram/lifecycle.rb +272 -0
  40. data/lib/mxrb/domain_diagram.rb +409 -0
  41. data/lib/mxrb/dsl/builder.rb +62 -11
  42. data/lib/mxrb/environment.rb +226 -0
  43. data/lib/mxrb/exporter.rb +265 -45
  44. data/lib/mxrb/http/server.rb +107 -0
  45. data/lib/mxrb/initializer.rb +80 -9
  46. data/lib/mxrb/integrity/validator.rb +32 -7
  47. data/lib/mxrb/io/bson_codec.rb +42 -1
  48. data/lib/mxrb/io/mpr_file.rb +146 -3
  49. data/lib/mxrb/model/attribute.rb +3 -0
  50. data/lib/mxrb/model/entity.rb +44 -2
  51. data/lib/mxrb/model/microflow.rb +3 -1
  52. data/lib/mxrb/model/module.rb +71 -0
  53. data/lib/mxrb/model/page.rb +126 -15
  54. data/lib/mxrb/model/project.rb +3 -0
  55. data/lib/mxrb/modeler/catalog.rb +178 -0
  56. data/lib/mxrb/official_marketplace/module_package_importer.rb +23 -12
  57. data/lib/mxrb/official_marketplace/widget_package_installer.rb +15 -11
  58. data/lib/mxrb/official_marketplace.rb +9 -3
  59. data/lib/mxrb/oql/reverse_translator.rb +394 -0
  60. data/lib/mxrb/oql/server.rb +4 -8
  61. data/lib/mxrb/oql.rb +32 -4
  62. data/lib/mxrb/progress.rb +242 -0
  63. data/lib/mxrb/project_lifecycle.rb +5 -2
  64. data/lib/mxrb/ruby_app/exporter.rb +1749 -0
  65. data/lib/mxrb/ruby_app/preset.rb +506 -0
  66. data/lib/mxrb/ruby_app/session_manager.rb +122 -0
  67. data/lib/mxrb/ruby_app.rb +1361 -0
  68. data/lib/mxrb/runtime/access_control.rb +408 -0
  69. data/lib/mxrb/runtime/native.rb +1015 -93
  70. data/lib/mxrb/runtime/scheduler.rb +396 -0
  71. data/lib/mxrb/runtime/schema_migrator.rb +598 -0
  72. data/lib/mxrb/runtime/shared_store.rb +335 -0
  73. data/lib/mxrb/runtime/sqlite_store.rb +729 -0
  74. data/lib/mxrb/scaffold/generator.rb +11 -3
  75. data/lib/mxrb/team_server.rb +10 -7
  76. data/lib/mxrb/uml/activity_diagram.rb +118 -0
  77. data/lib/mxrb/uml/class_diagram.rb +118 -0
  78. data/lib/mxrb/uml/sequence_diagram.rb +112 -0
  79. data/lib/mxrb/uml/server.rb +146 -0
  80. data/lib/mxrb/uml/support.rb +35 -0
  81. data/lib/mxrb/version.rb +1 -1
  82. data/lib/mxrb/web_ui/assets/abnfDiagram-N423BO3Z-C4JD3cEC.js +1 -0
  83. data/lib/mxrb/web_ui/assets/arc-3Z53kgFp.js +1 -0
  84. data/lib/mxrb/web_ui/assets/architecture-TIHT7OUA-BStBTLea.js +1 -0
  85. data/lib/mxrb/web_ui/assets/architectureDiagram-T3A2C74G-DBwqnM4J.js +36 -0
  86. data/lib/mxrb/web_ui/assets/array-BifhSqXX.js +1 -0
  87. data/lib/mxrb/web_ui/assets/blockDiagram-VBNYF7ZC-DLtuHt-j.js +132 -0
  88. data/lib/mxrb/web_ui/assets/c4Diagram-5PPSVZJV-ConSk_pe.js +10 -0
  89. data/lib/mxrb/web_ui/assets/channel-BhPvD7Dt.js +1 -0
  90. data/lib/mxrb/web_ui/assets/chunk-2GRJ4B5K-D2HpWsf_.js +1 -0
  91. data/lib/mxrb/web_ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  92. data/lib/mxrb/web_ui/assets/chunk-4I5QYGJK-CiIdNwaF.js +1 -0
  93. data/lib/mxrb/web_ui/assets/chunk-5RXB4S5H-Bu_AaEkE.js +231 -0
  94. data/lib/mxrb/web_ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  95. data/lib/mxrb/web_ui/assets/chunk-6Q2QTUOP-wQkNmt_X.js +88 -0
  96. data/lib/mxrb/web_ui/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  97. data/lib/mxrb/web_ui/assets/chunk-GF5L2VYU-G8MmiBzU.js +206 -0
  98. data/lib/mxrb/web_ui/assets/chunk-I66GZJ75-CulcrLPh.js +127 -0
  99. data/lib/mxrb/web_ui/assets/chunk-JQJVKLGR-ukjzcdlL.js +156 -0
  100. data/lib/mxrb/web_ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  101. data/lib/mxrb/web_ui/assets/chunk-KBJHAD2P-Wm35lYov.js +1 -0
  102. data/lib/mxrb/web_ui/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
  103. data/lib/mxrb/web_ui/assets/chunk-NSK5VX7P-D2nYrCY4.js +2 -0
  104. data/lib/mxrb/web_ui/assets/chunk-QR6OTTB3-BrdIzg4Q.js +62 -0
  105. data/lib/mxrb/web_ui/assets/chunk-RYQCIY6F-CCfZMcW6.js +1 -0
  106. data/lib/mxrb/web_ui/assets/chunk-UBXNYLIW-BPEVYsFK.js +1 -0
  107. data/lib/mxrb/web_ui/assets/chunk-W5SLKNZC-2E6OPhA4.js +1 -0
  108. data/lib/mxrb/web_ui/assets/chunk-WRU74C26-CBIvOyWp.js +70 -0
  109. data/lib/mxrb/web_ui/assets/chunk-XXDRQBXY-pH58XAyl.js +1 -0
  110. data/lib/mxrb/web_ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  111. data/lib/mxrb/web_ui/assets/classDiagram-JCYQIIEL-xiqo4D89.js +1 -0
  112. data/lib/mxrb/web_ui/assets/classDiagram-v2-OCEON4UE-xiqo4D89.js +1 -0
  113. data/lib/mxrb/web_ui/assets/cose-bilkent-JH36ORCC-t_flPpii.js +1 -0
  114. data/lib/mxrb/web_ui/assets/cynefin-VYW2F7L2-BIqktTEv.js +1 -0
  115. data/lib/mxrb/web_ui/assets/cynefinDiagram-MW4NZA55-C2d--lut.js +62 -0
  116. data/lib/mxrb/web_ui/assets/cytoscape.esm-B-NFISlW.js +321 -0
  117. data/lib/mxrb/web_ui/assets/dagre-Buvkdvvj.js +1 -0
  118. data/lib/mxrb/web_ui/assets/dagre-VZM6K2ZE-CSz2_tb5.js +4 -0
  119. data/lib/mxrb/web_ui/assets/defaultLocale-BFoDCU3G.js +1 -0
  120. data/lib/mxrb/web_ui/assets/diagram-7IWD3JNH-DCt7u7V_.js +30 -0
  121. data/lib/mxrb/web_ui/assets/diagram-B4RE2ZJO-DqZBqkMu.js +3 -0
  122. data/lib/mxrb/web_ui/assets/diagram-LBJQPF4R-ClIYbIsI.js +24 -0
  123. data/lib/mxrb/web_ui/assets/diagram-Q27KOJAE-DFxhvthJ.js +24 -0
  124. data/lib/mxrb/web_ui/assets/diagram-UB23O5K3-BSUTXptv.js +41 -0
  125. data/lib/mxrb/web_ui/assets/dist-D2qOEbeJ.js +1 -0
  126. data/lib/mxrb/web_ui/assets/domain-mGOZ1KCG.css +1 -0
  127. data/lib/mxrb/web_ui/assets/domain-qsjXhy4v.js +1 -0
  128. data/lib/mxrb/web_ui/assets/ebnfDiagram-BXEA7PRR-B5reICEi.js +1 -0
  129. data/lib/mxrb/web_ui/assets/erDiagram-JOGREHBK-Co5Mxn2p.js +85 -0
  130. data/lib/mxrb/web_ui/assets/eventmodeling-45OFAUF4-C1ylhSks.js +1 -0
  131. data/lib/mxrb/web_ui/assets/flowDiagram-UKHOOZJN-CHXaJIaS.js +1 -0
  132. data/lib/mxrb/web_ui/assets/ganttDiagram-PKOTCBZU-DPPPaWaz.js +292 -0
  133. data/lib/mxrb/web_ui/assets/gitGraph-TEB2WS4Q-qS77ywA9.js +1 -0
  134. data/lib/mxrb/web_ui/assets/gitGraphDiagram-DS77QQ5N-DpAv6-BT.js +106 -0
  135. data/lib/mxrb/web_ui/assets/graphlib-DS17s2tU.js +1 -0
  136. data/lib/mxrb/web_ui/assets/info-DKCQHKI2-C9VD1Y4e.js +1 -0
  137. data/lib/mxrb/web_ui/assets/infoDiagram-6WML65LV-Bk1kbcCy.js +2 -0
  138. data/lib/mxrb/web_ui/assets/init-C-OQMol4.js +1 -0
  139. data/lib/mxrb/web_ui/assets/ishikawaDiagram-WSZJBQD7-0gcISBFR.js +70 -0
  140. data/lib/mxrb/web_ui/assets/journeyDiagram-NVQOT4AX-Dt0RQnlh.js +139 -0
  141. data/lib/mxrb/web_ui/assets/jsx-runtime-DV0a5kSb.js +9 -0
  142. data/lib/mxrb/web_ui/assets/kanban-definition-27J2QSJJ-DIPQM7w9.js +89 -0
  143. data/lib/mxrb/web_ui/assets/katex-CXMH3UgJ.js +257 -0
  144. data/lib/mxrb/web_ui/assets/line-C0rYD-tL.js +1 -0
  145. data/lib/mxrb/web_ui/assets/linear-BPPxWorj.js +1 -0
  146. data/lib/mxrb/web_ui/assets/map-BaFkSB1l.js +1 -0
  147. data/lib/mxrb/web_ui/assets/mermaid-parser.core-B_UPzTxa.js +7 -0
  148. data/lib/mxrb/web_ui/assets/mindmap-definition-FAOFIHXS-CdJRSMuk.js +96 -0
  149. data/lib/mxrb/web_ui/assets/modeler-BNqHthwk.css +1 -0
  150. data/lib/mxrb/web_ui/assets/modeler-CQmqflbg.js +1 -0
  151. data/lib/mxrb/web_ui/assets/ordinal-BDEzSJ7C.js +1 -0
  152. data/lib/mxrb/web_ui/assets/packet-7NZHBO7P-CwQ4NSBs.js +1 -0
  153. data/lib/mxrb/web_ui/assets/path-fybaL0A-.js +1 -0
  154. data/lib/mxrb/web_ui/assets/pegDiagram-VL7TDLO6-D40S7ppx.js +1 -0
  155. data/lib/mxrb/web_ui/assets/pie-RZYD4A2V-CJroHMKh.js +1 -0
  156. data/lib/mxrb/web_ui/assets/pieDiagram-7S7Q4E2Y-QB54__BV.js +39 -0
  157. data/lib/mxrb/web_ui/assets/quadrantDiagram-CIZ2JOQS-DBhDS6ag.js +7 -0
  158. data/lib/mxrb/web_ui/assets/radar-I7S5WNFK-DdIUwd2d.js +1 -0
  159. data/lib/mxrb/web_ui/assets/railroad-3IZDKUUU-B1Lw6Xyq.js +1 -0
  160. data/lib/mxrb/web_ui/assets/railroad-abnf-AHOZXSZD-CQgQoeak.js +1 -0
  161. data/lib/mxrb/web_ui/assets/railroad-ebnf-EBAXGLYW-D7qEQ2x8.js +1 -0
  162. data/lib/mxrb/web_ui/assets/railroad-peg-LSFZ7HO6-C005Vxbb.js +1 -0
  163. data/lib/mxrb/web_ui/assets/railroadDiagram-AXF67PYL-BBP2qk7M.js +1 -0
  164. data/lib/mxrb/web_ui/assets/requirementDiagram-LRYGKXZP-D2cLsAoI.js +84 -0
  165. data/lib/mxrb/web_ui/assets/rough.esm-Dy-Kn_BL.js +1 -0
  166. data/lib/mxrb/web_ui/assets/sankeyDiagram-W5VNT64P-Bpi3FiP2.js +40 -0
  167. data/lib/mxrb/web_ui/assets/sequenceDiagram-SI44F4Z6-DCRcDlVe.js +162 -0
  168. data/lib/mxrb/web_ui/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  169. data/lib/mxrb/web_ui/assets/src-CvxfUak2.js +1 -0
  170. data/lib/mxrb/web_ui/assets/stateDiagram-OKZ733FA-C2GCEoxl.js +1 -0
  171. data/lib/mxrb/web_ui/assets/stateDiagram-v2-UEYNNEHI-D2gWgedh.js +1 -0
  172. data/lib/mxrb/web_ui/assets/swimlanes-SLNWSIFB-CRI9irEW.js +2 -0
  173. data/lib/mxrb/web_ui/assets/swimlanesDiagram-ULZ7WXOC-C5Wb_-hZ.js +8 -0
  174. data/lib/mxrb/web_ui/assets/theme-_mxc7BdY.css +1 -0
  175. data/lib/mxrb/web_ui/assets/timeline-definition-Z64GVDOM-B1-mNg-h.js +120 -0
  176. data/lib/mxrb/web_ui/assets/treeView-QDETBFTQ-7CTvIwKq.js +1 -0
  177. data/lib/mxrb/web_ui/assets/treemap-6X3UGDF4-CtL22pq5.js +1 -0
  178. data/lib/mxrb/web_ui/assets/uml-C3KAFGTq.js +51 -0
  179. data/lib/mxrb/web_ui/assets/uml-Dn-qd01X.css +1 -0
  180. data/lib/mxrb/web_ui/assets/vennDiagram-T6HMQDX7-BzVnUEAy.js +34 -0
  181. data/lib/mxrb/web_ui/assets/wardley-OPB4EBWU-JNi-QNag.js +1 -0
  182. data/lib/mxrb/web_ui/assets/wardleyDiagram-T6FBY63Y-BUwmAQ-B.js +78 -0
  183. data/lib/mxrb/web_ui/assets/xychartDiagram-ELKLHX3M-DEQS8sKp.js +7 -0
  184. data/lib/mxrb/web_ui/domain.html +15 -0
  185. data/lib/mxrb/web_ui/modeler.html +16 -0
  186. data/lib/mxrb/web_ui/uml.html +31 -0
  187. data/lib/mxrb/web_ui.rb +89 -0
  188. data/lib/mxrb/widget_certification.rb +208 -0
  189. data/lib/mxrb/writer.rb +278 -41
  190. data/lib/mxrb.rb +38 -8
  191. metadata +157 -5
@@ -2,8 +2,18 @@
2
2
 
3
3
  [Português](../pt-BR/project-structure.md) · [English](../en-US/project-structure.md) · **Deutsch**
4
4
 
5
- Der von `mxrb export` erzeugte Baum trennt anwendungsweite Richtlinien,
6
- Modulverhalten, erhaltene native Units und Assets:
5
+ `mxrb export` bietet zwei explizite Modi. `--mode mendix` ist der Standard und
6
+ behält den geschichteten Mendix-DSL-Baum. `--mode ruby` erzeugt eine
7
+ konventionelle ausführbare Ruby-Anwendung mit React + Vite.
8
+
9
+ ## Mendix-Modus
10
+
11
+ ```sh
12
+ bundle exec mxrb export App.mpr app-source --mode mendix
13
+ ```
14
+
15
+ Dieser Baum trennt anwendungsweite Richtlinien, Modulverhalten, erhaltene
16
+ native Units und Assets:
7
17
 
8
18
  ```text
9
19
  project.rb
@@ -29,4 +39,193 @@ Die Struktur unterstützt Ruby zu einem neuen Mendix-Projekt, Ruby auf einem
29
39
  exportierten Baseline, Mendix zu bearbeitbarem Ruby und den strukturell
30
40
  gleichwertigen Mendix → Ruby → Mendix Round-trip.
31
41
 
42
+ ## Ruby-Modus
43
+
44
+ Der Ruby-Modus kann auch ohne vorhandenes Mendix-Projekt beginnen:
45
+
46
+ ```sh
47
+ bundle exec mxrb init CustomerPortal --mode ruby
48
+ cd CustomerPortal
49
+ bundle install
50
+ npm install --prefix frontend
51
+ bundle exec mxrb run .
52
+ ```
53
+
54
+ Der Befehl erzeugt direkt die konventionelle Anwendung mit `app/models`,
55
+ `app/dtos`, `app/services`, `app/pages` und React + Vite. Eine reversible
56
+ Mendix-Basis bleibt unter `.mxrb` isoliert und bestimmt nicht die bearbeitbare
57
+ Quellstruktur. Das aktuelle Projekt wird so als MPR materialisiert:
58
+
59
+ ```sh
60
+ bundle exec mxrb generate project.rb build/CustomerPortal.mpr
61
+ ```
62
+
63
+ Neue Ruby-Models werden zu Entitäten, DTOs zu nicht-persistenten Entitäten und
64
+ bidirektionale Deklarationen werden in das MPR synchronisiert. Ruby- oder
65
+ React-Code ohne native Mendix-Repräsentation bleibt mit Prüfsumme eingebettet
66
+ und erscheint beim nächsten Export unverändert. Nicht darstellbare strukturelle
67
+ Änderungen führen explizit zum Fehler, statt unbemerkt teilweise konvertiert zu
68
+ werden.
69
+
70
+ Ein vorhandenes MPR wird so konvertiert:
71
+
72
+ ```sh
73
+ bundle exec mxrb export App.mpr app-ruby --mode ruby
74
+ ```
75
+
76
+ ```text
77
+ app/
78
+ models/
79
+ dtos/
80
+ services/
81
+ pages/
82
+ config/application.rb
83
+ frontend/
84
+ package.json
85
+ vite.config.ts
86
+ tsconfig.json
87
+ src/{main.tsx,App.tsx,types.ts,nanoflows.ts,app.css}
88
+ project.rb
89
+ .mxrb/
90
+ ruby-app.json
91
+ runtime/App.mpr
92
+ mendix/
93
+ ```
94
+
95
+ Persistente Entitäten werden Records. Nicht persistente Entitäten werden
96
+ DTO-Klassen und verwenden immer das Suffix `_dto.rb`, wodurch mehrdeutige
97
+ `_2.rb`-Namen entfallen. Services sind normale Ruby-Klassen und delegieren
98
+ anfangs an den nativen Pure-Ruby-Interpreter. Pages stellen dem React-TypeScript-
99
+ Frontend native Metadaten bereit. Der Export leitet `types.ts` aus Entitäten,
100
+ Enumerationen, Pages, Widgets, Kontexten, Effekten und API-Verträgen ab;
101
+ `npm run typecheck` ist Bestandteil des Vite-Builds.
102
+
103
+ Nach der einmaligen Installation der Ruby- und Frontend-Abhängigkeiten startet
104
+ ein einziger Befehl beide Prozesse:
105
+
106
+ ```sh
107
+ bundle install
108
+ npm install --prefix frontend
109
+ bundle exec mxrb run .
110
+ ```
111
+
112
+ `mxrb run` überwacht die über Puma 8 bereitgestellte Ruby-JSON-API auf Loopback
113
+ und den Vite-Server. Vite
114
+ leitet `/api` an Ruby weiter. `--server-port` legt den Backend-Port fest und
115
+ `--client-port` den Frontend-Port. `--no-frontend` startet nur die API. Die
116
+ bisherigen Namen `--api-port` und `--port` bleiben kompatible Aliase.
117
+ Die globale Option `--no-progress` ist optional und blendet nur Fortschritt aus.
118
+
119
+ Zwei optionale Stacks ergänzen vertraute Ruby-Konventionen, ohne den
120
+ Standard-Ruby-Modus zu ändern:
121
+
122
+ ```sh
123
+ bundle exec mxrb init ServiceDesk --mode ruby --flymetothemoon
124
+ bundle exec mxrb export App.mpr app-rails --mode ruby --onrails
125
+ ```
126
+
127
+ `--flymetothemoon` ergänzt Sinatra, Puma, ActiveRecord, Rake und RSpec.
128
+ `--onrails` ergänzt Rails, Puma, ActiveRecord und RSpec. Beide behalten React +
129
+ Vite als integriertes Anwendungs-Frontend und verwenden weiterhin
130
+ `mxrb run .`. ActiveRecord-Migrationen besitzen nur Ruby-Tabellen; für das
131
+ Mendix-Domain-Model und seine Round-trips bleibt das MXRB-Manifest maßgeblich.
132
+
133
+ ## Domain-Model-Diagramm im Browser
134
+
135
+ Domain Models eines oder mehrerer Mendix-Module lassen sich als
136
+ DBeaver-inspiriertes ER-Diagramm öffnen:
137
+
138
+ ```sh
139
+ bundle exec mxrb diagram-er App.mpr --module Sales
140
+ bundle exec mxrb diagram-er App.mpr --module Sales --module Billing \
141
+ --output build/App-layout.mpr
142
+ ```
143
+
144
+ In der Seitenleiste lassen sich mehrere Module gleichzeitig auswählen und ihre
145
+ modulübergreifenden Assoziationen anzeigen. Die Seite bietet außerdem
146
+ Entitätssuche, Drag-and-drop-Positionierung, Zoom, Anpassen, Auto-Anordnung,
147
+ Raster, Attributsichtbarkeit, Beziehungsrouting und ziehbare Quell-/Zielanker.
148
+ Persistente Entitäten sind blau, DTOs/non-persistent gelb und OQL Views grün.
149
+ **Layout im MPR speichern** schreibt Positionen und lokale Anker in native
150
+ Mendix-Felder. Modulübergreifende Anker ohne natives BSON-Feld werden als
151
+ isolierte visuelle MXRB-Metadaten in derselben sicheren Kopie gespeichert.
152
+ Standard ist `App.domain-layout.mpr`; eine vorhandene Ausgabe darf nur mit
153
+ `--force` ersetzt werden.
154
+
155
+ **PNG exportieren** lädt ein hochauflösendes Bild der ausgewählten Module mit
156
+ den aktuellen Farben, Attributen und Routen herunter. Der PNG-Export ändert das
157
+ MPR nicht; das Layout muss separat gespeichert werden, wenn die Positionen
158
+ einen Round-trip überstehen sollen.
159
+
160
+ Der Vordergrundmodus bleibt verfügbar und belegt das Terminal bis `Ctrl+C`.
161
+ Mit dem verwalteten Lifecycle läuft der ER-Editor im Hintergrund; beim Stoppen
162
+ bleibt die Layout-Kopie erhalten und das Quell-MPR wird weder bearbeitet noch
163
+ entfernt:
164
+
165
+ ```sh
166
+ bundle exec mxrb diagram-er up App.mpr --module Sales
167
+ bundle exec mxrb diagram-er status App.mpr
168
+ bundle exec mxrb diagram-er down App.mpr
169
+ bundle exec mxrb diagram-er up App.mpr # dieselbe Kopie fortsetzen
170
+ bundle exec mxrb diagram-er destroy App.mpr --yes
171
+ ```
172
+
173
+ `destroy` stoppt den Server und entfernt ausschließlich die von diesem
174
+ Lifecycle erzeugte Kopie samt externen Inhalten. Die Steuerung nutzt einen
175
+ privaten authentifizierten Loopback-Endpunkt; Zustand und Token liegen in lokal
176
+ zugriffsbeschränkten Dateien.
177
+
178
+ Die Editor-Oberfläche ist in React + TypeScript implementiert und verwendet nur
179
+ die APIs des Ruby-Servers. Das Vite-Bundle wird nach `lib/mxrb/web_ui`
180
+ kompiliert, in die Gem aufgenommen und lokal ausgeliefert. Node.js ist daher
181
+ für die Nutzung des installierten Editors nicht erforderlich, und es wird kein
182
+ CDN kontaktiert. Für die UI-Entwicklung werden in `frontend/modeler`
183
+ `npm install`, `npm run typecheck` und `npm run build` ausgeführt.
184
+ ER, UML, OQL und das generische `--mode ruby`-Backend verwenden denselben
185
+ eingebetteten Puma-Adapter. `puma ~> 8.0` ist eine direkte MXRB-Abhängigkeit und
186
+ bringt transitiv `nio4r ~> 2.0` mit; WEBrick gehört nicht zum HTTP-Stack.
187
+
188
+ ## UML-Diagramme
189
+
190
+ UML ist eine zusätzliche, vom ER-Editor unabhängige Implementierung. Sie nutzt
191
+ Port 4569 und verändert das Domain-Model-Layout nicht. Der Viewer vereint
192
+ Klassen-, Microflow-Aktivitäts- und Aufrufsequenzdiagramme mit Mermaid:
193
+
194
+ Derselbe Server veröffentlicht unter `http://127.0.0.1:4569/modeler` einen
195
+ visuellen React- und TypeScript-Katalog für Module, Seiten, Microflows und
196
+ Nanoflows, Navigation, Sicherheit, Integrationen und Einstellungen. Diese erste
197
+ erweiterte Oberfläche ist schreibgeschützt; Mutationen bleiben gesperrt, bis
198
+ Fail-Closed-Validierung und Roundtrip-Garantien dem ER-Editor entsprechen.
199
+
200
+ ```sh
201
+ bundle exec mxrb uml App.mpr
202
+ bundle exec mxrb uml App.mpr --export=class --module Sales
203
+ bundle exec mxrb uml App.mpr --export=activity \
204
+ --microflow=Sales.CreateOrder --format=plantuml
205
+ bundle exec mxrb uml App.mpr --export=sequence \
206
+ --root=Sales.CreateOrder --depth=3
207
+ bundle exec mxrb uml App.mpr --export=sequence --module=Sales
208
+ ```
209
+
210
+ Ohne `--export` läuft der gemeinsame Viewer unter
211
+ `http://127.0.0.1:4569`. Textexporte verwenden standardmäßig Mermaid;
212
+ PlantUML wird mit `--format=plantuml` gewählt. Sequenzdiagramme akzeptieren
213
+ entweder einen tiefenbegrenzten Einstiegspunkt oder alle internen Aufrufe eines
214
+ Moduls. Der Viewer verwendet denselben React-+-TypeScript-Workspace; Mermaid ist
215
+ lokal gebündelt, damit die Darstellung auch offline funktioniert.
216
+
217
+ ## Versionswechsel und Round-trips
218
+
219
+ Beide Modi behalten stabile Mendix-IDs und die vollständige native Baseline für
220
+ Upgrades, Downgrades und wiederholte Round-trips. Im Ruby-Modus werden
221
+ Model-/DTO-Deklarationen zurück in das MPR kompiliert. Ruby-Service-Bodies und
222
+ React-Quellen werden mit SHA-256 in einer MXRB-Quelltabelle innerhalb des MPR
223
+ gespeichert; ein späterer Export mit `--mode ruby` stellt die exakt bearbeiteten
224
+ Dateien wieder her.
225
+
226
+ Für Konstrukte ohne semantischen Ruby-zu-Mendix-Compiler bleibt das native
227
+ Mendix-Verhalten maßgeblich. Das Coverage-Manifest weist diesen Status explizit
228
+ aus, statt eine stille Konvertierung zu behaupten. Der erhaltene Ruby-/React-
229
+ Quellcode überlebt den Mendix-Round-trip auch ohne direkte Studio-Pro-Darstellung.
230
+
32
231
  [Zurück zum Index](README.md)
@@ -0,0 +1,104 @@
1
+ # Runtime ohne Java
2
+
3
+ Der Ruby-Modus startet das Backend ohne Mendix Java Runtime. Beim Öffnen einer
4
+ exportierten Anwendung migriert MXRB automatisch eine umgebungsspezifische
5
+ SQLite-Datenbank, öffnet den Microflow-Interpreter, registriert Lifecycle-Hooks,
6
+ erzwingt die Sicherheit und startet Scheduled Events.
7
+
8
+ Profile liegen unter `config/environments/`, typischerweise als
9
+ `development.env`, `qa.env`, `staging.env` und `production.env`. Die Priorität
10
+ lautet Prozessumgebung, Profildatei, `.env.<Profil>`, dann `.env`. Die Auswahl
11
+ erfolgt mit `--environment qa` oder `MXRB_ENV=qa`; `mxrb env . --environment qa`
12
+ zeigt Quellen und Schlüsselnamen, niemals Werte.
13
+
14
+ ```bash
15
+ mxrb run . --environment qa
16
+ mxrb test App.mpr smoke.rb --native --environment qa
17
+ ```
18
+
19
+ Jedes Profil verwendet standardmäßig `.mxrb/runtime/<Umgebung>.sqlite3`. Die
20
+ Migration leitet Entitäten, Attribute, Assoziationen und System-Member ab.
21
+ Additive Änderungen sind idempotent, inkompatible Änderungen verwenden einen
22
+ transaktionalen Rebuild. Nicht persistente Entitäten bleiben im Speicher.
23
+
24
+ Die Ruby-API bietet Login und Bearer-Token, Sessions, Schema, Navigation,
25
+ Seiten, Microflows, CRUD und Published REST. Rollen, Entitätsregeln,
26
+ Member-Rechte und der sichere XPath-Teil werden für jede Anfrage geprüft.
27
+ Zugangsdaten stammen aus `MXRB_USERS_JSON` und `MXRB_AUTH_TOKENS` und gehören in
28
+ ignorierte lokale Dateien oder den Secret Manager des Deployments.
29
+
30
+ Scheduled Events laufen im stdlib-basierten MXRB-Scheduler mit Minuten-,
31
+ Stunden- und Tagesintervallen, Overlap-Schutz und kontrolliertem Shutdown.
32
+ IANA-Zeitzonen wie `Europe/Berlin` verwenden `tzinfo` und berücksichtigen
33
+ Sommerzeitwechsel. Unbekannte Zonen führen zu einem Fehler statt unbemerkt auf
34
+ UTC zurückzufallen; `UTC`, `local` und numerische Offsets werden ebenfalls
35
+ unterstützt.
36
+
37
+ Sitzungen und Scheduler-Koordination verwenden standardmäßig die native
38
+ SQLite-Datei `.mxrb/runtime/<Umgebung>-shared.sqlite3`, ohne externen Dienst.
39
+ Mehrere Instanzen müssen mit `MXRB_SHARED_STORE_PATH` dieselbe Datei verwenden.
40
+ Idempotente Claims pro Ereignis/Zeitfenster und per Heartbeat erneuerte
41
+ Overlap-Leases sind atomar; ein unvollständiger Claim kann nach Lease-Ablauf
42
+ übernommen werden. Der Standard-Lease beträgt 300 Sekunden und lässt sich über
43
+ `MXRB_SCHEDULER_LEASE_TTL` ändern. `:memory:`, `memory` oder `local` aktivieren
44
+ explizit den prozesslokalen Modus.
45
+
46
+ Java Custom Actions starten niemals eine JVM. Jede erlaubte Action benötigt
47
+ einen expliziten Ruby-Adapter, der in `config/adapters.rb` unter dem
48
+ qualifizierten Namen registriert wird:
49
+
50
+ ```ruby
51
+ Mxrb::RubyApp::Registry.register_java_custom_action('Orders.CalculateTotal') do |arguments|
52
+ Calculator.call(
53
+ items: arguments.fetch('Items'),
54
+ discount: arguments.fetch('Discount')
55
+ )
56
+ end
57
+ ```
58
+
59
+ Die Schlüssel sind die Parameternamen aus dem Mendix-Modell. Basiswerte werden
60
+ im Microflow-Kontext ausgewertet; Entity-, Microflow- und Mapping-Referenzen
61
+ werden als qualifizierte Namen übergeben. Der Rückgabewert wird nur bei aktivem
62
+ `UseReturnVariable` zugewiesen (oder beim Legacy-Format, das ausschließlich
63
+ `ResultVariableName` deklariert). Eine nicht registrierte Action schlägt mit
64
+ ihrem Namen und einem Registrierungshinweis geschlossen fehl; es gibt weder
65
+ Klassenerkennung noch JAR-Ausführung oder JVM-Fallback. REST, App Services, SOAP,
66
+ Mappings und Dokumenterzeugung verwenden weiterhin typbezogene Ruby-Adapter.
67
+ Im Browser bleibt JavaScript/React; Backend und APIs laufen ohne Java Runtime.
68
+
69
+ ## Ruby → Mendix → Ruby-Zertifizierung
70
+
71
+ Das reproduzierbare Zertifizierungsszenario befindet sich in
72
+ [`spec/fixtures/flymetothemoon/project.rb`](../../spec/fixtures/flymetothemoon/project.rb).
73
+ Es modelliert Kunden, Produkte, Bestellungen und Positionen in Ruby, inklusive
74
+ Enumeration, Indizes, Assoziationen, Microflows, Nanoflow, Scheduled Event und
75
+ einer Seite mit Data Grid. Der Test
76
+ [`spec/flymetothemoon_roundtrip_spec.rb`](../../spec/flymetothemoon_roundtrip_spec.rb)
77
+ prüft folgende Anwendungsfälle:
78
+
79
+ - ein Mendix-11.12.1-MPR aus der Ruby-DSL erzeugen und validieren;
80
+ - über die echte CLI mit `--mode ruby --flymetothemoon` exportieren;
81
+ - Sinatra, Puma, ActiveRecord und RSpec bereitstellen, ohne Java-, JAR- oder
82
+ Bytecode-Dateien zu erzeugen;
83
+ - Erzeugung, Aggregation, Verzweigung, CRUD und Seitenmetadaten in der
84
+ Ruby-Runtime mit SQLite ausführen;
85
+ - eine unveränderte Anwendung kompilieren und das MPR strukturell mit der
86
+ Quelle vergleichen;
87
+ - ein Attribut hinzufügen und einen Microflow durch idiomatisches Ruby ersetzen;
88
+ - erneut exportieren und nachweisen, dass Ruby-Code und Mendix-Modell einen
89
+ zweiten strukturell identischen Roundtrip überstehen.
90
+
91
+ Der isolierte Test wird so ausgeführt:
92
+
93
+ ```bash
94
+ bundle exec rspec spec/flymetothemoon_roundtrip_spec.rb
95
+ ```
96
+
97
+ Für generierte Oberflächen wird das deklarative Szenario
98
+ [`spec/fixtures/frontend_browser/sudoku_full_flow.json`](../../spec/fixtures/frontend_browser/sudoku_full_flow.json)
99
+ mit `script/frontend_browser_acceptance` in einem echten Chromium ausgeführt.
100
+ Es deckt die Brettpositionen 73 und 74, Auswahl, Werteingabe sowie den Wechsel
101
+ zwischen Easy, Medium und Hard ab. Jeder kritische Klick wartet auf Microflow-POST
102
+ und Assoziations-GET und muss innerhalb von 250 ms enden. Galerieabfragen werden
103
+ in SQLite nach Kontext gefiltert; über eine inverse Assoziation geladene Objekte
104
+ behalten ihre Verknüpfung, wenn nur Attribute gespeichert werden.
@@ -0,0 +1,44 @@
1
+ # Schema-Migrationen der Ruby-Runtime
2
+
3
+ `Mxrb::Runtime::SchemaMigrator` identifiziert Mendix-Entitäten, Attribute und
4
+ Assoziationen anhand ihrer Storage-GUID. Wird ein Artefakt bei gleicher GUID
5
+ umbenannt, bleiben die physische Tabelle beziehungsweise Spalte und ihre Daten
6
+ erhalten.
7
+
8
+ ## Sichere Richtlinie
9
+
10
+ - Tabellen und optionale Attribute werden automatisch und idempotent angelegt.
11
+ - Pflichtattribute werden als `NOT NULL` erzeugt.
12
+ - Wird ein vorhandenes Attribut verpflichtend, wird die Tabelle innerhalb
13
+ einer Transaktion neu aufgebaut. Vorhandene `NULL`-Werte verwenden den
14
+ deklarierten Standardwert; ohne Standardwert wird die Migration abgelehnt.
15
+ - Ein neues Pflichtattribut in einer befüllten Tabelle benötigt einen
16
+ Standardwert.
17
+ - Kompatible Änderungen erhalten Entitäts- und Assoziationsdaten.
18
+ - Das Entfernen einer Entität, eines Attributs oder einer Assoziation löst
19
+ standardmäßig `Mxrb::Runtime::UnsafeSchemaMigrationError` aus und verändert
20
+ die Datenbank nicht.
21
+ - Nach Prüfung des Plans und einem Backup kann die Bereinigung mit
22
+ `allow_destructive: true` freigegeben werden. Entfernt werden ausschließlich
23
+ in den MXRB-Metadaten registrierte Artefakte; fremde Tabellen werden niemals
24
+ abgeleitet oder gelöscht.
25
+
26
+ Exportierte Ruby-Anwendungen deaktivieren destruktive Migrationen. Für einen
27
+ kontrollierten Lauf nach einem Backup kann im gewählten Umgebungsprofil
28
+ `MXRB_ALLOW_DESTRUCTIVE_MIGRATIONS=true` gesetzt werden. Jeder andere Wert
29
+ bleibt fail-closed.
30
+
31
+ ```ruby
32
+ database = SQLite3::Database.new('runtime.sqlite3')
33
+ migrator = Mxrb::Runtime::SchemaMigrator.new(
34
+ project,
35
+ database: database,
36
+ allow_destructive: true
37
+ )
38
+ result = migrator.migrate!
39
+ puts migrator.migration_plan.changes
40
+ ```
41
+
42
+ DDL, Datenkopie, Metadaten-Update und freigegebene Bereinigung laufen in einer
43
+ gemeinsamen SQLite-Transaktion. Eine Constraint-Verletzung oder ein anderer
44
+ Fehler setzt die gesamte Migration zurück.
@@ -2,7 +2,7 @@
2
2
 
3
3
  [Português](../pt-BR/validation-matrix.md) · [English](../en-US/validation-matrix.md) · **Deutsch**
4
4
 
5
- Stand: 5. August 2026.
5
+ Stand: 11. August 2026.
6
6
 
7
7
  ```text
8
8
  Original-MPR → validate → export → generate → validate → compare
@@ -17,6 +17,25 @@ Original-MPR → validate → export → generate → validate → compare
17
17
  | TreeviewDemo | 5.21.4 | v1 | bestanden |
18
18
  | GridViewPlayground | 6.10.8 | v1 | bestanden |
19
19
 
20
+ Am 11. August wiederholte `script/validate_matrix` die Matrix mit **6/6
21
+ erfolgreichen Läufen**: 1.506 Units, 1.734 Artefakte und 3.388 Referenzen in
22
+ 16,381 Sekunden.
23
+
24
+ ## Zusätzliches lokales Inventar
25
+
26
+ `script/certify_mprs --cycles 2 --repair-hashes` zertifizierte sieben weitere
27
+ MPRs in 14 aufeinanderfolgenden Roundtrips: **7/7 bestanden**, 2.799 Units,
28
+ 3.238 Artefakte und 4.819 Referenzen. Enthalten sind LearnNow, SLATaskApp,
29
+ SLATaskAppNative, MyFirstModule, CourseManager, RubyBridgeSandbox und
30
+ VetClinic.
31
+
32
+ SLATaskApp enthielt einen veralteten Content-Hash, RubyBridgeSandbox zwei. Das
33
+ Gate reparierte ausschließlich `Unit.ContentsHash` in temporären Kopien,
34
+ protokollierte die geänderten UUIDs und bewahrte die ursprünglichen BSON-Bytes.
35
+ Die Quelldateien wurden nicht verändert. Der zweite Roundtrip deckte außerdem
36
+ als Strings deserialisierte Native-Widget-Typen auf und führte zu deren
37
+ Korrektur.
38
+
20
39
  ## Tiefe Abdeckung
21
40
 
22
41
  Der Vergleich umfasst Metadaten, Security, Unit-Baum, Entitäten,
@@ -37,9 +56,9 @@ Gate.
37
56
  ## Semantik, Tests und Runtime
38
57
 
39
58
  - 1.778 Artefakte und 3.387 Referenzen;
40
- - 1.039 Beispiele, keine Fehler;
41
- - 100 % Zeilenabdeckung (17.224/17.224);
42
- - 100 % Branch-Abdeckung (6.811/6.811);
59
+ - 1.329 Beispiele, keine Fehler;
60
+ - 100 % Zeilenabdeckung (23.771/23.771);
61
+ - 100 % Branch-Abdeckung (9.704/9.704);
43
62
  - Sudoku-Modellbewertung: 7/7;
44
63
  - funktionale Runtime-Tests: 3/3 lokal und 3/3 in Docker.
45
64
 
@@ -62,3 +81,22 @@ Deterministisches Fuzzing deckt 250 BSON-Dokumente und 50 atomare
62
81
 
63
82
  Die Matrix beweist die geprüften Szenarien, nicht universelle Kompatibilität
64
83
  mit jedem Mendix-Metamodell. Unbekannte `.mxunit`-Kodierungen werden abgelehnt.
84
+
85
+ ## Widget-Zertifizierung
86
+
87
+ `script/certify_widgets --browser-report REPORT.json App.mpr` ist das
88
+ Fail-Closed-Gate für tatsächlich verwendete Widgets des nativen Web-Compilers
89
+ und Marketplace-Widgets. Es
90
+ verlangt gemeinsam eine Page/Layout-Kompilierung ohne Fallback, die Auflösung
91
+ jeder Pluggable-ID auf einen MPK-`.mjs`-Eintrag samt SHA-256, einen nativen
92
+ Rspack-Build der Mendix-Version und bestandene Chromium-Evidenz, die alle
93
+ geprüften Widget-Typen und IDs ohne sichtbare Runtime-/Widget-Fehler ausweist.
94
+
95
+ Der MPK-Import oder ein erfolgreicher Bundle-Build allein zertifiziert kein
96
+ Verhalten. Widgets mit erforderlicher Datenquelle, Attributbindung oder
97
+ Elternplatzierung bestehen nur in einem korrekt konfigurierten Browserszenario.
98
+ Zukünftige oder ungeprüfte Pakete scheitern als fehlende Evidenz, statt eine
99
+ pauschale Kompatibilitätszusage zu erben.
100
+ Das React/TypeScript-Frontend von `--mode ruby` besitzt eine getrennte Spur:
101
+ Sein Chromium-Bericht zertifiziert diese Widgets, ohne zu behaupten, dass die
102
+ entsprechenden Pluggable-Komponenten auch im Mendix Runtime bestanden haben.
data/docs/en-US/README.md CHANGED
@@ -13,6 +13,7 @@
13
13
  - [Ruby-first roadmap](ruby-first-roadmap.md)
14
14
  - [Validation matrix](validation-matrix.md)
15
15
  - [Native compiler and Runtime](compiler.md)
16
+ - [Java-free Ruby runtime and environments](runtime-ruby.md)
16
17
  - [Native build and Runtime quality report](native-runtime-quality-report.md)
17
18
  - [Writing projects](writing.md)
18
19
  - [Project scaffolds](scaffolds.md)
@@ -42,6 +42,47 @@ Always verify physical table and column names against the database created by
42
42
  the exact Mendix Runtime. Association-path joins are reported as unsupported
43
43
  until Runtime storage metadata can prove the correct join.
44
44
 
45
+ ## Safe SQL-to-OQL conversion
46
+
47
+ The reverse path accepts a read-only `SELECT` subset in PostgreSQL, SQL Server,
48
+ or ANSI and emits logical OQL. Supplying the project restores the exact module,
49
+ entity, and attribute casing:
50
+
51
+ ```ruby
52
+ projection = Mxrb.open("Shop.mpr") do |project|
53
+ project.sql_to_oql(
54
+ 'SELECT p."name" FROM "shop$product" p WHERE p."name" = :Name',
55
+ dialect: :postgresql
56
+ )
57
+ end
58
+
59
+ puts projection.oql if projection.supported?
60
+ # SELECT p/Name FROM Shop.Product p WHERE p/Name = $Name
61
+ ```
62
+
63
+ The unified `query` command converts in both directions. `--input -` reads
64
+ stdin and `--json` returns the typed result:
65
+
66
+ ```sh
67
+ bundle exec mxrb query \
68
+ 'SELECT p."name" FROM "shop$product" p WHERE p."name" = :Name' \
69
+ --from sql --to oql --project Shop.mpr --dialect postgresql
70
+ bundle exec mxrb query 'SELECT p/Name FROM Shop.Product p' \
71
+ --from oql --to sql --dialect sql_server
72
+ bundle exec mxrb query --input query.sql --from sql --dialect sql_server --json
73
+ ```
74
+
75
+ The subset includes aliases, explicit joins, comma-separated sources,
76
+ `WHERE`, `GROUP BY`, `HAVING`, `UNION`, `ORDER BY`, `LIMIT`/`OFFSET`, known OQL
77
+ functions, and named parameters (`:Name`, `@Name`, or `$Name`). Physical
78
+ `module$entity` tables become `Module.Entity`; without `--project`, casing is
79
+ inferred and the result has `inferred` confidence.
80
+
81
+ Writes, multiple statements, CTEs, table subqueries in `FROM`/`JOIN`, positional
82
+ parameters, unknown functions, and extensions without a safe OQL equivalent—such as `ILIKE`, `DISTINCT ON`,
83
+ `TOP`, `::`, and `||` concatenation—return `supported? == false` with an
84
+ explanation in `warnings`.
85
+
45
86
  ## Dialect-aware analysis
46
87
 
47
88
  `Oql::Analyzer` detects cost and portability patterns in the original source,