mxrb 0.1.3 → 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.
- checksums.yaml +4 -4
- data/bin/mxrb +455 -10
- data/docs/de-DE/README.md +1 -0
- data/docs/de-DE/oql-sql.md +42 -0
- data/docs/de-DE/project-structure.md +201 -2
- data/docs/de-DE/runtime-ruby.md +104 -0
- data/docs/de-DE/runtime-schema-migrations.md +44 -0
- data/docs/de-DE/validation-matrix.md +42 -4
- data/docs/en-US/README.md +1 -0
- data/docs/en-US/oql-sql.md +41 -0
- data/docs/en-US/project-structure.md +192 -2
- data/docs/en-US/runtime-ruby.md +100 -0
- data/docs/en-US/runtime-schema-migrations.md +41 -0
- data/docs/en-US/validation-matrix.md +39 -4
- data/docs/pt-BR/README.md +1 -0
- data/docs/pt-BR/oql-sql.md +41 -0
- data/docs/pt-BR/project-structure.md +197 -2
- data/docs/pt-BR/runtime-ruby.md +108 -0
- data/docs/pt-BR/runtime-schema-migrations.md +40 -0
- data/docs/pt-BR/validation-matrix.md +42 -5
- data/lib/mxrb/cli/help.rb +426 -0
- data/lib/mxrb/cli/release.rb +137 -0
- data/lib/mxrb/compiler/compatibility_analyzer.rb +1 -1
- data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +8 -1
- data/lib/mxrb/compiler/domain_document_compiler.rb +3 -0
- data/lib/mxrb/compiler/gallery_bundle_compiler.rb +11 -1
- data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +76 -19
- data/lib/mxrb/compiler/legacy_custom_widget_compiler.rb +159 -0
- data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +43 -7
- data/lib/mxrb/compiler/legacy_page_builder.rb +1248 -23
- data/lib/mxrb/compiler/page_bundle_compiler.rb +13 -4
- data/lib/mxrb/compiler/web_bundle_builder.rb +5 -1
- data/lib/mxrb/compiler/web_shell_materializer.rb +42 -2
- data/lib/mxrb/compiler/widget_package_extractor.rb +3 -0
- data/lib/mxrb/domain_diagram/lifecycle.rb +272 -0
- data/lib/mxrb/domain_diagram.rb +409 -0
- data/lib/mxrb/dsl/builder.rb +43 -9
- data/lib/mxrb/environment.rb +226 -0
- data/lib/mxrb/exporter.rb +89 -15
- data/lib/mxrb/http/server.rb +107 -0
- data/lib/mxrb/initializer.rb +80 -9
- data/lib/mxrb/integrity/validator.rb +14 -0
- data/lib/mxrb/io/bson_codec.rb +42 -1
- data/lib/mxrb/io/mpr_file.rb +146 -3
- data/lib/mxrb/model/attribute.rb +3 -0
- data/lib/mxrb/model/entity.rb +28 -2
- data/lib/mxrb/model/microflow.rb +3 -1
- data/lib/mxrb/model/page.rb +126 -15
- data/lib/mxrb/model/project.rb +3 -0
- data/lib/mxrb/modeler/catalog.rb +178 -0
- data/lib/mxrb/oql/reverse_translator.rb +394 -0
- data/lib/mxrb/oql/server.rb +4 -8
- data/lib/mxrb/oql.rb +23 -1
- data/lib/mxrb/project_lifecycle.rb +5 -2
- data/lib/mxrb/ruby_app/exporter.rb +1749 -0
- data/lib/mxrb/ruby_app/preset.rb +506 -0
- data/lib/mxrb/ruby_app/session_manager.rb +122 -0
- data/lib/mxrb/ruby_app.rb +1361 -0
- data/lib/mxrb/runtime/access_control.rb +408 -0
- data/lib/mxrb/runtime/native.rb +1015 -93
- data/lib/mxrb/runtime/scheduler.rb +396 -0
- data/lib/mxrb/runtime/schema_migrator.rb +598 -0
- data/lib/mxrb/runtime/shared_store.rb +335 -0
- data/lib/mxrb/runtime/sqlite_store.rb +729 -0
- data/lib/mxrb/scaffold/generator.rb +11 -3
- data/lib/mxrb/uml/activity_diagram.rb +118 -0
- data/lib/mxrb/uml/class_diagram.rb +118 -0
- data/lib/mxrb/uml/sequence_diagram.rb +112 -0
- data/lib/mxrb/uml/server.rb +146 -0
- data/lib/mxrb/uml/support.rb +35 -0
- data/lib/mxrb/version.rb +1 -1
- data/lib/mxrb/web_ui/assets/abnfDiagram-N423BO3Z-C4JD3cEC.js +1 -0
- data/lib/mxrb/web_ui/assets/arc-3Z53kgFp.js +1 -0
- data/lib/mxrb/web_ui/assets/architecture-TIHT7OUA-BStBTLea.js +1 -0
- data/lib/mxrb/web_ui/assets/architectureDiagram-T3A2C74G-DBwqnM4J.js +36 -0
- data/lib/mxrb/web_ui/assets/array-BifhSqXX.js +1 -0
- data/lib/mxrb/web_ui/assets/blockDiagram-VBNYF7ZC-DLtuHt-j.js +132 -0
- data/lib/mxrb/web_ui/assets/c4Diagram-5PPSVZJV-ConSk_pe.js +10 -0
- data/lib/mxrb/web_ui/assets/channel-BhPvD7Dt.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-2GRJ4B5K-D2HpWsf_.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-4I5QYGJK-CiIdNwaF.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-5RXB4S5H-Bu_AaEkE.js +231 -0
- data/lib/mxrb/web_ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- data/lib/mxrb/web_ui/assets/chunk-6Q2QTUOP-wQkNmt_X.js +88 -0
- data/lib/mxrb/web_ui/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-GF5L2VYU-G8MmiBzU.js +206 -0
- data/lib/mxrb/web_ui/assets/chunk-I66GZJ75-CulcrLPh.js +127 -0
- data/lib/mxrb/web_ui/assets/chunk-JQJVKLGR-ukjzcdlL.js +156 -0
- data/lib/mxrb/web_ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-KBJHAD2P-Wm35lYov.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
- data/lib/mxrb/web_ui/assets/chunk-NSK5VX7P-D2nYrCY4.js +2 -0
- data/lib/mxrb/web_ui/assets/chunk-QR6OTTB3-BrdIzg4Q.js +62 -0
- data/lib/mxrb/web_ui/assets/chunk-RYQCIY6F-CCfZMcW6.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-UBXNYLIW-BPEVYsFK.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-W5SLKNZC-2E6OPhA4.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-WRU74C26-CBIvOyWp.js +70 -0
- data/lib/mxrb/web_ui/assets/chunk-XXDRQBXY-pH58XAyl.js +1 -0
- data/lib/mxrb/web_ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- data/lib/mxrb/web_ui/assets/classDiagram-JCYQIIEL-xiqo4D89.js +1 -0
- data/lib/mxrb/web_ui/assets/classDiagram-v2-OCEON4UE-xiqo4D89.js +1 -0
- data/lib/mxrb/web_ui/assets/cose-bilkent-JH36ORCC-t_flPpii.js +1 -0
- data/lib/mxrb/web_ui/assets/cynefin-VYW2F7L2-BIqktTEv.js +1 -0
- data/lib/mxrb/web_ui/assets/cynefinDiagram-MW4NZA55-C2d--lut.js +62 -0
- data/lib/mxrb/web_ui/assets/cytoscape.esm-B-NFISlW.js +321 -0
- data/lib/mxrb/web_ui/assets/dagre-Buvkdvvj.js +1 -0
- data/lib/mxrb/web_ui/assets/dagre-VZM6K2ZE-CSz2_tb5.js +4 -0
- data/lib/mxrb/web_ui/assets/defaultLocale-BFoDCU3G.js +1 -0
- data/lib/mxrb/web_ui/assets/diagram-7IWD3JNH-DCt7u7V_.js +30 -0
- data/lib/mxrb/web_ui/assets/diagram-B4RE2ZJO-DqZBqkMu.js +3 -0
- data/lib/mxrb/web_ui/assets/diagram-LBJQPF4R-ClIYbIsI.js +24 -0
- data/lib/mxrb/web_ui/assets/diagram-Q27KOJAE-DFxhvthJ.js +24 -0
- data/lib/mxrb/web_ui/assets/diagram-UB23O5K3-BSUTXptv.js +41 -0
- data/lib/mxrb/web_ui/assets/dist-D2qOEbeJ.js +1 -0
- data/lib/mxrb/web_ui/assets/domain-mGOZ1KCG.css +1 -0
- data/lib/mxrb/web_ui/assets/domain-qsjXhy4v.js +1 -0
- data/lib/mxrb/web_ui/assets/ebnfDiagram-BXEA7PRR-B5reICEi.js +1 -0
- data/lib/mxrb/web_ui/assets/erDiagram-JOGREHBK-Co5Mxn2p.js +85 -0
- data/lib/mxrb/web_ui/assets/eventmodeling-45OFAUF4-C1ylhSks.js +1 -0
- data/lib/mxrb/web_ui/assets/flowDiagram-UKHOOZJN-CHXaJIaS.js +1 -0
- data/lib/mxrb/web_ui/assets/ganttDiagram-PKOTCBZU-DPPPaWaz.js +292 -0
- data/lib/mxrb/web_ui/assets/gitGraph-TEB2WS4Q-qS77ywA9.js +1 -0
- data/lib/mxrb/web_ui/assets/gitGraphDiagram-DS77QQ5N-DpAv6-BT.js +106 -0
- data/lib/mxrb/web_ui/assets/graphlib-DS17s2tU.js +1 -0
- data/lib/mxrb/web_ui/assets/info-DKCQHKI2-C9VD1Y4e.js +1 -0
- data/lib/mxrb/web_ui/assets/infoDiagram-6WML65LV-Bk1kbcCy.js +2 -0
- data/lib/mxrb/web_ui/assets/init-C-OQMol4.js +1 -0
- data/lib/mxrb/web_ui/assets/ishikawaDiagram-WSZJBQD7-0gcISBFR.js +70 -0
- data/lib/mxrb/web_ui/assets/journeyDiagram-NVQOT4AX-Dt0RQnlh.js +139 -0
- data/lib/mxrb/web_ui/assets/jsx-runtime-DV0a5kSb.js +9 -0
- data/lib/mxrb/web_ui/assets/kanban-definition-27J2QSJJ-DIPQM7w9.js +89 -0
- data/lib/mxrb/web_ui/assets/katex-CXMH3UgJ.js +257 -0
- data/lib/mxrb/web_ui/assets/line-C0rYD-tL.js +1 -0
- data/lib/mxrb/web_ui/assets/linear-BPPxWorj.js +1 -0
- data/lib/mxrb/web_ui/assets/map-BaFkSB1l.js +1 -0
- data/lib/mxrb/web_ui/assets/mermaid-parser.core-B_UPzTxa.js +7 -0
- data/lib/mxrb/web_ui/assets/mindmap-definition-FAOFIHXS-CdJRSMuk.js +96 -0
- data/lib/mxrb/web_ui/assets/modeler-BNqHthwk.css +1 -0
- data/lib/mxrb/web_ui/assets/modeler-CQmqflbg.js +1 -0
- data/lib/mxrb/web_ui/assets/ordinal-BDEzSJ7C.js +1 -0
- data/lib/mxrb/web_ui/assets/packet-7NZHBO7P-CwQ4NSBs.js +1 -0
- data/lib/mxrb/web_ui/assets/path-fybaL0A-.js +1 -0
- data/lib/mxrb/web_ui/assets/pegDiagram-VL7TDLO6-D40S7ppx.js +1 -0
- data/lib/mxrb/web_ui/assets/pie-RZYD4A2V-CJroHMKh.js +1 -0
- data/lib/mxrb/web_ui/assets/pieDiagram-7S7Q4E2Y-QB54__BV.js +39 -0
- data/lib/mxrb/web_ui/assets/quadrantDiagram-CIZ2JOQS-DBhDS6ag.js +7 -0
- data/lib/mxrb/web_ui/assets/radar-I7S5WNFK-DdIUwd2d.js +1 -0
- data/lib/mxrb/web_ui/assets/railroad-3IZDKUUU-B1Lw6Xyq.js +1 -0
- data/lib/mxrb/web_ui/assets/railroad-abnf-AHOZXSZD-CQgQoeak.js +1 -0
- data/lib/mxrb/web_ui/assets/railroad-ebnf-EBAXGLYW-D7qEQ2x8.js +1 -0
- data/lib/mxrb/web_ui/assets/railroad-peg-LSFZ7HO6-C005Vxbb.js +1 -0
- data/lib/mxrb/web_ui/assets/railroadDiagram-AXF67PYL-BBP2qk7M.js +1 -0
- data/lib/mxrb/web_ui/assets/requirementDiagram-LRYGKXZP-D2cLsAoI.js +84 -0
- data/lib/mxrb/web_ui/assets/rough.esm-Dy-Kn_BL.js +1 -0
- data/lib/mxrb/web_ui/assets/sankeyDiagram-W5VNT64P-Bpi3FiP2.js +40 -0
- data/lib/mxrb/web_ui/assets/sequenceDiagram-SI44F4Z6-DCRcDlVe.js +162 -0
- data/lib/mxrb/web_ui/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- data/lib/mxrb/web_ui/assets/src-CvxfUak2.js +1 -0
- data/lib/mxrb/web_ui/assets/stateDiagram-OKZ733FA-C2GCEoxl.js +1 -0
- data/lib/mxrb/web_ui/assets/stateDiagram-v2-UEYNNEHI-D2gWgedh.js +1 -0
- data/lib/mxrb/web_ui/assets/swimlanes-SLNWSIFB-CRI9irEW.js +2 -0
- data/lib/mxrb/web_ui/assets/swimlanesDiagram-ULZ7WXOC-C5Wb_-hZ.js +8 -0
- data/lib/mxrb/web_ui/assets/theme-_mxc7BdY.css +1 -0
- data/lib/mxrb/web_ui/assets/timeline-definition-Z64GVDOM-B1-mNg-h.js +120 -0
- data/lib/mxrb/web_ui/assets/treeView-QDETBFTQ-7CTvIwKq.js +1 -0
- data/lib/mxrb/web_ui/assets/treemap-6X3UGDF4-CtL22pq5.js +1 -0
- data/lib/mxrb/web_ui/assets/uml-C3KAFGTq.js +51 -0
- data/lib/mxrb/web_ui/assets/uml-Dn-qd01X.css +1 -0
- data/lib/mxrb/web_ui/assets/vennDiagram-T6HMQDX7-BzVnUEAy.js +34 -0
- data/lib/mxrb/web_ui/assets/wardley-OPB4EBWU-JNi-QNag.js +1 -0
- data/lib/mxrb/web_ui/assets/wardleyDiagram-T6FBY63Y-BUwmAQ-B.js +78 -0
- data/lib/mxrb/web_ui/assets/xychartDiagram-ELKLHX3M-DEQS8sKp.js +7 -0
- data/lib/mxrb/web_ui/domain.html +15 -0
- data/lib/mxrb/web_ui/modeler.html +16 -0
- data/lib/mxrb/web_ui/uml.html +31 -0
- data/lib/mxrb/web_ui.rb +89 -0
- data/lib/mxrb/widget_certification.rb +208 -0
- data/lib/mxrb/writer.rb +200 -24
- data/lib/mxrb.rb +26 -1
- metadata +156 -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
|
-
|
|
6
|
-
|
|
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
|
+
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.
|
|
41
|
-
- 100 % Zeilenabdeckung (
|
|
42
|
-
- 100 % Branch-Abdeckung (
|
|
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)
|
data/docs/en-US/oql-sql.md
CHANGED
|
@@ -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,
|