mxrb 0.1.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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.de-DE.md +108 -0
- data/README.md +172 -0
- data/README.pt-BR.md +109 -0
- data/bin/mxrb +1613 -0
- data/docs/README.md +10 -0
- data/docs/de-DE/README.md +24 -0
- data/docs/de-DE/architectural-patterns.md +26 -0
- data/docs/de-DE/architectural-standard.md +48 -0
- data/docs/de-DE/architecture.md +76 -0
- data/docs/de-DE/compiler.md +162 -0
- data/docs/de-DE/conventions.md +19 -0
- data/docs/de-DE/design-system.md +52 -0
- data/docs/de-DE/entity-dsl.md +53 -0
- data/docs/de-DE/native-runtime-quality-report.md +74 -0
- data/docs/de-DE/oql-sql.md +211 -0
- data/docs/de-DE/platform-api-integration.md +36 -0
- data/docs/de-DE/platform-operations.md +243 -0
- data/docs/de-DE/project-structure.md +32 -0
- data/docs/de-DE/ruby-first-roadmap.md +116 -0
- data/docs/de-DE/scaffolds.md +59 -0
- data/docs/de-DE/semantic-refactoring.md +56 -0
- data/docs/de-DE/team-server.md +33 -0
- data/docs/de-DE/validation-matrix.md +64 -0
- data/docs/de-DE/vetclinic-acceptance.md +24 -0
- data/docs/de-DE/writing.md +138 -0
- data/docs/en-US/README.md +24 -0
- data/docs/en-US/architectural-patterns.md +151 -0
- data/docs/en-US/architectural-standard.md +89 -0
- data/docs/en-US/architecture.md +170 -0
- data/docs/en-US/compiler.md +157 -0
- data/docs/en-US/conventions.md +82 -0
- data/docs/en-US/design-system.md +163 -0
- data/docs/en-US/entity-dsl.md +53 -0
- data/docs/en-US/native-runtime-quality-report.md +73 -0
- data/docs/en-US/oql-sql.md +201 -0
- data/docs/en-US/platform-api-integration.md +36 -0
- data/docs/en-US/platform-operations.md +244 -0
- data/docs/en-US/project-structure.md +49 -0
- data/docs/en-US/ruby-first-roadmap.md +186 -0
- data/docs/en-US/scaffolds.md +57 -0
- data/docs/en-US/semantic-refactoring.md +198 -0
- data/docs/en-US/team-server.md +32 -0
- data/docs/en-US/validation-matrix.md +257 -0
- data/docs/en-US/vetclinic-acceptance.md +23 -0
- data/docs/en-US/writing.md +655 -0
- data/docs/pt-BR/README.md +24 -0
- data/docs/pt-BR/architectural-patterns.md +25 -0
- data/docs/pt-BR/architectural-standard.md +533 -0
- data/docs/pt-BR/architecture.md +300 -0
- data/docs/pt-BR/compiler.md +162 -0
- data/docs/pt-BR/conventions.md +19 -0
- data/docs/pt-BR/design-system.md +65 -0
- data/docs/pt-BR/entity-dsl.md +116 -0
- data/docs/pt-BR/native-runtime-quality-report.md +73 -0
- data/docs/pt-BR/oql-sql.md +208 -0
- data/docs/pt-BR/platform-api-integration.md +36 -0
- data/docs/pt-BR/platform-operations.md +260 -0
- data/docs/pt-BR/project-structure.md +32 -0
- data/docs/pt-BR/ruby-first-roadmap.md +239 -0
- data/docs/pt-BR/scaffolds.md +104 -0
- data/docs/pt-BR/semantic-refactoring.md +55 -0
- data/docs/pt-BR/team-server.md +59 -0
- data/docs/pt-BR/validation-matrix.md +86 -0
- data/docs/pt-BR/vetclinic-acceptance.md +50 -0
- data/docs/pt-BR/writing.md +177 -0
- data/examples/sudoku_evaluation.rb +14 -0
- data/examples/sudoku_functional_test.rb +28 -0
- data/lib/mxrb/architecture/graph.rb +124 -0
- data/lib/mxrb/architecture/validator.rb +98 -0
- data/lib/mxrb/benchmark.rb +33 -0
- data/lib/mxrb/compare.rb +390 -0
- data/lib/mxrb/compiler/adapter.rb +96 -0
- data/lib/mxrb/compiler/artifact_document_compiler.rb +102 -0
- data/lib/mxrb/compiler/artifact_materializer.rb +53 -0
- data/lib/mxrb/compiler/client_model_materializer.rb +42 -0
- data/lib/mxrb/compiler/code_action_document_compiler.rb +64 -0
- data/lib/mxrb/compiler/code_action_materializer.rb +35 -0
- data/lib/mxrb/compiler/code_action_type_compiler.rb +32 -0
- data/lib/mxrb/compiler/combo_box_bundle_compiler.rb +314 -0
- data/lib/mxrb/compiler/compatibility_analyzer.rb +169 -0
- data/lib/mxrb/compiler/constants_materializer.rb +111 -0
- data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +290 -0
- data/lib/mxrb/compiler/database_connector_action_compiler.rb +280 -0
- data/lib/mxrb/compiler/deployment_asset_copier.rb +60 -0
- data/lib/mxrb/compiler/deployment_bootstrapper.rb +208 -0
- data/lib/mxrb/compiler/deployment_materializer.rb +43 -0
- data/lib/mxrb/compiler/deployment_metadata.rb +64 -0
- data/lib/mxrb/compiler/domain_document_compiler.rb +153 -0
- data/lib/mxrb/compiler/domain_model_materializer.rb +35 -0
- data/lib/mxrb/compiler/domain_security_compiler.rb +82 -0
- data/lib/mxrb/compiler/gallery_bundle_compiler.rb +190 -0
- data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +281 -0
- data/lib/mxrb/compiler/image_bundle_compiler.rb +216 -0
- data/lib/mxrb/compiler/java_proxy_generator.rb +509 -0
- data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +267 -0
- data/lib/mxrb/compiler/legacy_page_builder.rb +287 -0
- data/lib/mxrb/compiler/mda.rb +99 -0
- data/lib/mxrb/compiler/microflow_document_compiler.rb +85 -0
- data/lib/mxrb/compiler/microflow_materializer.rb +48 -0
- data/lib/mxrb/compiler/microflow_node_compiler.rb +250 -0
- data/lib/mxrb/compiler/model_package.rb +116 -0
- data/lib/mxrb/compiler/model_values.rb +67 -0
- data/lib/mxrb/compiler/nanoflow_program_compiler.rb +483 -0
- data/lib/mxrb/compiler/navigation_document_compiler.rb +93 -0
- data/lib/mxrb/compiler/packager.rb +100 -0
- data/lib/mxrb/compiler/page_bundle_builder.rb +56 -0
- data/lib/mxrb/compiler/page_bundle_compiler.rb +2004 -0
- data/lib/mxrb/compiler/page_document_compiler.rb +77 -0
- data/lib/mxrb/compiler/portable_packager.rb +356 -0
- data/lib/mxrb/compiler/project_jar_archive.rb +84 -0
- data/lib/mxrb/compiler/project_jar_builder.rb +121 -0
- data/lib/mxrb/compiler/project_materializer.rb +139 -0
- data/lib/mxrb/compiler/project_model_orderer.rb +52 -0
- data/lib/mxrb/compiler/runtime_data_types.rb +31 -0
- data/lib/mxrb/compiler/runtime_model_schema.rb +90 -0
- data/lib/mxrb/compiler/schemas/runtime-10.24.0.73019.json +1052 -0
- data/lib/mxrb/compiler/schemas/runtime-11.json +1215 -0
- data/lib/mxrb/compiler/schemas/runtime-6.10.8.json +1148 -0
- data/lib/mxrb/compiler/schemas/runtime-7.17.0.json +1144 -0
- data/lib/mxrb/compiler/schemas/runtime-7.5.0.json +1215 -0
- data/lib/mxrb/compiler/schemas/runtime-9.6.1.29396.json +868 -0
- data/lib/mxrb/compiler/schemas/system-model-10.24.0.73019.b64 +1135 -0
- data/lib/mxrb/compiler/schemas/system-model-11.12.1.b64 +815 -0
- data/lib/mxrb/compiler/schemas/system-model-6.10.8.b64 +497 -0
- data/lib/mxrb/compiler/schemas/system-model-7.17.0.b64 +519 -0
- data/lib/mxrb/compiler/schemas/system-model-7.5.0.b64 +504 -0
- data/lib/mxrb/compiler/schemas/system-model-9.6.1.29396.b64 +816 -0
- data/lib/mxrb/compiler/security_materializer.rb +104 -0
- data/lib/mxrb/compiler/settings_document_compiler.rb +45 -0
- data/lib/mxrb/compiler/settings_materializer.rb +25 -0
- data/lib/mxrb/compiler/source_model.rb +128 -0
- data/lib/mxrb/compiler/system_model_seed.rb +88 -0
- data/lib/mxrb/compiler/system_queue_materializer.rb +54 -0
- data/lib/mxrb/compiler/system_text_materializer.rb +49 -0
- data/lib/mxrb/compiler/translation_materializer.rb +95 -0
- data/lib/mxrb/compiler/web_bundle_builder.rb +155 -0
- data/lib/mxrb/compiler/web_list_data_source.rb +139 -0
- data/lib/mxrb/compiler/web_operation_compiler.rb +614 -0
- data/lib/mxrb/compiler/web_shell_materializer.rb +194 -0
- data/lib/mxrb/compiler/widget_package_extractor.rb +63 -0
- data/lib/mxrb/doctor.rb +116 -0
- data/lib/mxrb/dsl/builder.rb +1636 -0
- data/lib/mxrb/errors.rb +18 -0
- data/lib/mxrb/evaluation.rb +131 -0
- data/lib/mxrb/exporter.rb +1716 -0
- data/lib/mxrb/frontend/migrator.rb +775 -0
- data/lib/mxrb/functional.rb +307 -0
- data/lib/mxrb/github/annotator.rb +161 -0
- data/lib/mxrb/initializer.rb +257 -0
- data/lib/mxrb/integrity/validator.rb +136 -0
- data/lib/mxrb/io/bson_codec.rb +145 -0
- data/lib/mxrb/io/mpr_file.rb +558 -0
- data/lib/mxrb/io/mxunit_codec.rb +42 -0
- data/lib/mxrb/marketplace.rb +380 -0
- data/lib/mxrb/model/association.rb +98 -0
- data/lib/mxrb/model/attribute.rb +100 -0
- data/lib/mxrb/model/connector.rb +17 -0
- data/lib/mxrb/model/design_materializer.rb +133 -0
- data/lib/mxrb/model/design_migration.rb +126 -0
- data/lib/mxrb/model/design_system.rb +111 -0
- data/lib/mxrb/model/domain_model.rb +51 -0
- data/lib/mxrb/model/entity.rb +180 -0
- data/lib/mxrb/model/menu.rb +38 -0
- data/lib/mxrb/model/microflow.rb +100 -0
- data/lib/mxrb/model/module.rb +142 -0
- data/lib/mxrb/model/navigation.rb +127 -0
- data/lib/mxrb/model/page.rb +410 -0
- data/lib/mxrb/model/project.rb +187 -0
- data/lib/mxrb/model/unit.rb +48 -0
- data/lib/mxrb/module_initializer.rb +75 -0
- data/lib/mxrb/official_marketplace/content_api.rb +292 -0
- data/lib/mxrb/official_marketplace/dependency_resolver.rb +329 -0
- data/lib/mxrb/official_marketplace/lifecycle.rb +367 -0
- data/lib/mxrb/official_marketplace/module_package_importer.rb +318 -0
- data/lib/mxrb/official_marketplace/widget_package_installer.rb +414 -0
- data/lib/mxrb/official_marketplace.rb +720 -0
- data/lib/mxrb/oql/analyzer.rb +155 -0
- data/lib/mxrb/oql/index_advisor.rb +85 -0
- data/lib/mxrb/oql/plan_analyzer.rb +185 -0
- data/lib/mxrb/oql/server.rb +132 -0
- data/lib/mxrb/oql/sql_server_plan_analyzer.rb +190 -0
- data/lib/mxrb/oql/sql_server_workload_analyzer.rb +80 -0
- data/lib/mxrb/oql/workload_analyzer.rb +175 -0
- data/lib/mxrb/oql/workload_baseline.rb +60 -0
- data/lib/mxrb/oql.rb +424 -0
- data/lib/mxrb/project_lifecycle.rb +76 -0
- data/lib/mxrb/protocols/plan.rb +86 -0
- data/lib/mxrb/protocols.rb +123 -0
- data/lib/mxrb/runtime/database_workspace.rb +677 -0
- data/lib/mxrb/runtime/docker_executor.rb +41 -0
- data/lib/mxrb/runtime/docker_workspace.rb +29 -0
- data/lib/mxrb/runtime/executor.rb +169 -0
- data/lib/mxrb/runtime/java_locator.rb +26 -0
- data/lib/mxrb/runtime/native.rb +474 -0
- data/lib/mxrb/runtime/sql_server_database.rb +146 -0
- data/lib/mxrb/runtime/toolchain.rb +82 -0
- data/lib/mxrb/scaffold/cli.rb +113 -0
- data/lib/mxrb/scaffold/generator.rb +246 -0
- data/lib/mxrb/scaffold/help.rb +80 -0
- data/lib/mxrb/scaffold/page_templates.rb +54 -0
- data/lib/mxrb/scaffold/recipes.rb +198 -0
- data/lib/mxrb/scaffold/registry.rb +82 -0
- data/lib/mxrb/scaffold/templates.rb +723 -0
- data/lib/mxrb/scaffold/transaction.rb +84 -0
- data/lib/mxrb/schema/tables.rb +55 -0
- data/lib/mxrb/semantic/analyzer.rb +473 -0
- data/lib/mxrb/semantic/batch_plan.rb +68 -0
- data/lib/mxrb/semantic/domain_mutator.rb +419 -0
- data/lib/mxrb/semantic/embedder.rb +51 -0
- data/lib/mxrb/semantic/extractor.rb +290 -0
- data/lib/mxrb/semantic/index.rb +623 -0
- data/lib/mxrb/semantic/inliner.rb +216 -0
- data/lib/mxrb/semantic/mover.rb +153 -0
- data/lib/mxrb/semantic/onnx_embedder.rb +34 -0
- data/lib/mxrb/semantic/remover.rb +70 -0
- data/lib/mxrb/semantic/renamer.rb +211 -0
- data/lib/mxrb/semantic/tfidf_embedder.rb +46 -0
- data/lib/mxrb/semantic/vec_store.rb +75 -0
- data/lib/mxrb/team_server.rb +390 -0
- data/lib/mxrb/templates/project/10.24.0.73019.json +32 -0
- data/lib/mxrb/templates/project/11.12.1.json +32 -0
- data/lib/mxrb/templates/project/6.10.8.json +50 -0
- data/lib/mxrb/templates/project/7.17.0.json +50 -0
- data/lib/mxrb/templates/project/7.5.0.json +50 -0
- data/lib/mxrb/templates/project/9.6.1.29396.json +50 -0
- data/lib/mxrb/version.rb +5 -0
- data/lib/mxrb/widget_package.rb +338 -0
- data/lib/mxrb/widget_synchronizer.rb +31 -0
- data/lib/mxrb/writer.rb +3775 -0
- data/lib/mxrb.rb +188 -0
- data/marketplace/catalog.json +10 -0
- data/marketplace/modules/shared-kernel/domain/README.md +4 -0
- data/marketplace/modules/shared-kernel/module.rb +5 -0
- data/marketplace/modules/shared-kernel/mxrb-module.json +9 -0
- metadata +447 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# OQL, SQL-Ansicht und lokale Datenbank
|
|
2
|
+
|
|
3
|
+
MXRB stellt OQL nur bereit, wenn das native Modell tatsächlich OQL enthält.
|
|
4
|
+
Erkannt werden OQL-Quellen von Datasets und Abfragen von View Entities. Eine
|
|
5
|
+
Anwendung ohne OQL liefert eine leere Sammlung und erhält keine künstlichen
|
|
6
|
+
Abfragedokumente.
|
|
7
|
+
|
|
8
|
+
## Statische Inspektion
|
|
9
|
+
|
|
10
|
+
```ruby
|
|
11
|
+
Mxrb.open("Shop.mpr") do |project|
|
|
12
|
+
next unless project.oql?
|
|
13
|
+
|
|
14
|
+
project.oql_queries.each do |query|
|
|
15
|
+
puts query.qualified_name
|
|
16
|
+
puts query.oql
|
|
17
|
+
puts query.parameters
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
project.oql_sql_views(dialect: :postgresql).each do |view|
|
|
21
|
+
puts view.sql if view.supported?
|
|
22
|
+
warn view.warnings.join("\n")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Die CLI liefert dasselbe typisierte Ergebnis:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
bundle exec mxrb oql Shop.mpr
|
|
31
|
+
bundle exec mxrb oql Shop.mpr --dialect ansi
|
|
32
|
+
bundle exec mxrb oql Shop.mpr --dialect sql_server --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Die SQL-Ansicht ist strikt schreibgeschützt. Parameter wie `$Customer` werden
|
|
36
|
+
zu benannten Bind-Parametern wie `:Customer`; Werte werden nie interpoliert.
|
|
37
|
+
Zeichenketten und Kommentare bleiben undurchsichtig. Mehrere Anweisungen und
|
|
38
|
+
schreibende OQL-Operationen werden abgelehnt.
|
|
39
|
+
|
|
40
|
+
Das erzeugte SQL hat die Vertrauensstufe `logical`. PostgreSQL- und
|
|
41
|
+
SQL-Server-Ansichten verwenden die übliche Tabellenform `module$entity`, ANSI
|
|
42
|
+
behält `Module.Entity` bei. Physische Namen müssen immer mit der Datenbank des
|
|
43
|
+
exakten Mendix Runtime geprüft werden. Assoziationspfad-Joins gelten als nicht
|
|
44
|
+
unterstützt, solange Runtime-Speichermetadaten den korrekten Join nicht
|
|
45
|
+
beweisen können.
|
|
46
|
+
|
|
47
|
+
## Dialektabhängige Analyse
|
|
48
|
+
|
|
49
|
+
`Oql::Analyzer` erkennt Kosten- und Portabilitätsmuster im Originaltext,
|
|
50
|
+
bewahrt das auslösende Fragment für Hervorhebungen und liefert konkrete
|
|
51
|
+
Alternativen für PostgreSQL, SQL Server und ANSI:
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
report = Mxrb::Oql::Analyzer.new(dialect: :postgresql)
|
|
55
|
+
.analyze_source("SELECT * FROM Sales.Order")
|
|
56
|
+
report.findings.each { puts "#{_1.rule}: #{_1.suggestions[:postgresql]}" }
|
|
57
|
+
|
|
58
|
+
reports = Mxrb.open("Shop.mpr") { _1.oql_analysis(dialect: :postgresql) }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Regeln erfassen führende und beidseitige Wildcards, Präfixsuchen,
|
|
62
|
+
`LOWER`/`UPPER`/`CAST` in `WHERE`, kartesische Produkte und `SELECT *`.
|
|
63
|
+
Findings sind `hint`, `warning` oder `error`; `clean?` bedeutet keine Fehler.
|
|
64
|
+
|
|
65
|
+
Die CLI verarbeitet natives OQL sowie Ad-hoc-Quellen in OQL und SQL:
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
bundle exec mxrb analyze Shop.mpr --dialect postgresql
|
|
69
|
+
bundle exec mxrb analyze --oql "SELECT * FROM Sales.Order"
|
|
70
|
+
bundle exec mxrb analyze --sql "SELECT * FROM sales$order" --json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Reale Pläne und Datenbank-Performance
|
|
74
|
+
|
|
75
|
+
Eine statische Analyse kann nicht beweisen, welchen Pfad der Optimierer wählt.
|
|
76
|
+
Im materialisierten PostgreSQL-Workspace fragt MXRB deshalb auch den realen
|
|
77
|
+
Planner im JSON-Format ab und verknüpft Planrelationen mit `pg_indexes`:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
bundle exec mxrb db explain Shop.mpr \
|
|
81
|
+
"SELECT * FROM \"sales$order\" WHERE status = 'Open'"
|
|
82
|
+
bundle exec mxrb db explain Shop.mpr \
|
|
83
|
+
"SELECT * FROM \"sales$order\" WHERE status = 'Open'" --analyze --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Der Standardmodus verwendet `EXPLAIN` und führt die Abfrage nicht aus.
|
|
87
|
+
`--analyze` ist explizit, weil es `EXPLAIN ANALYZE` verwendet; die Abfrage läuft
|
|
88
|
+
mit der schreibgeschützten Rolle und liefert Zeiten und Buffer. Der Bericht
|
|
89
|
+
unterscheidet kleine, möglicherweise optimale sequenzielle Scans von großen
|
|
90
|
+
Scans. Außerdem meldet er viele verworfene Filterzeilen, abweichende
|
|
91
|
+
Kardinalitätsschätzungen, Nested Loops mit hohem Volumen und Sortierungen auf
|
|
92
|
+
Festplatte. Vorhandene Indizes dienen als Evidenz; MXRB erfindet ohne
|
|
93
|
+
Selektivitäts- und Workload-Daten keine `CREATE INDEX`-Anweisungen.
|
|
94
|
+
|
|
95
|
+
Auch der kumulative PostgreSQL-Workload kann untersucht werden:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
bundle exec mxrb db workload Shop.mpr --limit 50
|
|
99
|
+
bundle exec mxrb db workload Shop.mpr --limit 50 --json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Der Workspace aktiviert `pg_stat_statements` und `track_io_timing`. Der Bericht
|
|
103
|
+
ordnet Query-Fingerprints nach kumulativem Aufwand und analysiert mittlere
|
|
104
|
+
Latenz, Cache-Hits, I/O, temporäre Blöcke und Zeilen pro Aufruf.
|
|
105
|
+
Tabellenstatistiken zeigen sequenziellen Scan-Druck; große nicht eindeutige
|
|
106
|
+
Indizes ohne beobachtete Scans werden ebenfalls gemeldet. Da diese Werte seit
|
|
107
|
+
dem Statistik-Reset kumulativ sind, wird eine Indexentfernung nie ohne Prüfung
|
|
108
|
+
des realen Zeitfensters und Workloads empfohlen.
|
|
109
|
+
|
|
110
|
+
Für ein SQL-Server-Deployment wird die Verbindung explizit mit `sqlcmd`
|
|
111
|
+
angegeben:
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
export MXRB_SQLSERVER_PASSWORD='geheim'
|
|
115
|
+
bundle exec mxrb db explain Shop.mpr \
|
|
116
|
+
"SELECT * FROM dbo.[Order] WHERE Status = 'Open'" \
|
|
117
|
+
--engine sql_server --server db.example:1433 \
|
|
118
|
+
--database Shop --user mxrb_analyst --json
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Der geschätzte Modus nutzt `SHOWPLAN_XML`; `--analyze` verwendet `STATISTICS
|
|
122
|
+
XML` und führt nur ein `SELECT`/`WITH` aus. Der Parser erkennt große Table- und
|
|
123
|
+
Clustered-Scans, Nested Loops mit hohem Volumen, tempdb-Spills,
|
|
124
|
+
Kardinalitätsabweichungen und Missing-Index-Hinweise. Diese Hinweise bleiben
|
|
125
|
+
Optimierer-Hypothesen und werden nicht automatisch als DDL ausgeführt. Das
|
|
126
|
+
Passwort wird über `SQLCMDPASSWORD` und nie per argv übertragen. Der Engine-Typ
|
|
127
|
+
wird nicht aus der MPR abgeleitet, da er zur Deployment-Konfiguration gehört.
|
|
128
|
+
|
|
129
|
+
## Materialisierte lokale PostgreSQL-Datenbank
|
|
130
|
+
|
|
131
|
+
Eine MPR enthält das Anwendungsmodell, nicht einen Snapshot der
|
|
132
|
+
Anwendungsdaten. Das Mendix Runtime verwaltet das Datenbankschema und
|
|
133
|
+
synchronisiert es aus dem Modell. MXRB kann das exakte portable Runtime bauen,
|
|
134
|
+
eine isolierte PostgreSQL-Datenbank starten, diese Synchronisierung ausführen
|
|
135
|
+
lassen und SQL-Zugriff bereitstellen:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
bundle exec mxrb db up Shop.mpr
|
|
139
|
+
bundle exec mxrb db status Shop.mpr
|
|
140
|
+
bundle exec mxrb db sql Shop.mpr \
|
|
141
|
+
'SELECT * FROM "sales$order" LIMIT 20'
|
|
142
|
+
bundle exec mxrb db shell Shop.mpr
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Nach einer Änderung der MPR wird unter Beibehaltung der Daten neu gebaut und
|
|
146
|
+
synchronisiert:
|
|
147
|
+
|
|
148
|
+
```sh
|
|
149
|
+
bundle exec mxrb db sync Shop.mpr
|
|
150
|
+
bundle exec mxrb db down Shop.mpr
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`db down` stoppt die Container, bewahrt aber das PostgreSQL-Volume. Ein
|
|
154
|
+
späteres `db up` verwendet Paket-Cache und Daten erneut. Der Standard-Port ist
|
|
155
|
+
`127.0.0.1:55432` und kann mit `--port` geändert werden.
|
|
156
|
+
|
|
157
|
+
Lokale Werkzeuge können denselben Workspace über JSON HTTP abfragen:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
bundle exec mxrb serve Shop.mpr --port 4567
|
|
161
|
+
curl -X POST http://127.0.0.1:4567/query \
|
|
162
|
+
-H 'Content-Type: application/json' \
|
|
163
|
+
-d '{"sql":"SELECT * FROM \"sales$order\" LIMIT 20"}'
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Der Body akzeptiert genau ein Feld `sql` oder `oql`. Ad-hoc-OQL durchläuft den
|
|
167
|
+
sicheren PostgreSQL-Übersetzer; parametrisierte Abfragen und alles außer einer
|
|
168
|
+
einzelnen `SELECT`-/`WITH`-Anweisung werden abgelehnt. Antworten enthalten
|
|
169
|
+
`rows`, `row_count`, `elapsed_ms`, Warnungen oder einen strukturierten Fehler.
|
|
170
|
+
Der Server bindet nur an Loopback, verwendet `mxrb_reader` und bereitet den
|
|
171
|
+
Workspace standardmäßig vor; `--no-up` verwendet einen bereits laufenden
|
|
172
|
+
Workspace.
|
|
173
|
+
|
|
174
|
+
Die dauerhafte Bereinigung ist absichtlich explizit:
|
|
175
|
+
|
|
176
|
+
```sh
|
|
177
|
+
bundle exec mxrb db destroy Shop.mpr --yes
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Entfernt werden nur Ressourcen mit dem passenden MXRB-Eigentümer-Label.
|
|
181
|
+
|
|
182
|
+
## Sicherheitsgrenze
|
|
183
|
+
|
|
184
|
+
- PostgreSQL wird ausschließlich an die Loopback-Schnittstelle gebunden.
|
|
185
|
+
- Jeder absolute MPR-Pfad erhält eigene Container, Netzwerk, Volume und
|
|
186
|
+
Zustandsdaten.
|
|
187
|
+
- Zufällige Zugangsdaten liegen außerhalb des Repositorys im
|
|
188
|
+
XDG-Zustandsverzeichnis und haben den Modus `0600`.
|
|
189
|
+
- `db sql`, `db shell` und `db url` verwenden `mxrb_reader`; Rolle und
|
|
190
|
+
Transaktionen sind standardmäßig schreibgeschützt.
|
|
191
|
+
- `mxrb_reader` erhält im isolierten Workspace `pg_read_all_stats`, damit
|
|
192
|
+
Runtime-Fingerprints korreliert werden können; dies erlaubt keine Datenänderung.
|
|
193
|
+
- `--write` wählt ausdrücklich die Eigentümerrolle des Runtime. Direkte
|
|
194
|
+
Schreibzugriffe können Mendix-Invarianten verletzen und sollten Ausnahmen
|
|
195
|
+
bleiben.
|
|
196
|
+
- Der PostgreSQL-Workspace zeigt nie auf eine bestehende entfernte Datenbank.
|
|
197
|
+
Die SQL-Server-Plananalyse ist eine separate, explizite Deployment-Verbindung;
|
|
198
|
+
dafür sollte ein Read-only-Login mit SHOWPLAN-Berechtigung verwendet werden.
|
|
199
|
+
Das Passwort bleibt in einer Umgebungsvariable und mutierende Schlüsselwörter,
|
|
200
|
+
auch in schreibenden CTEs, werden abgelehnt.
|
|
201
|
+
|
|
202
|
+
Das exakte Mendix-Toolchain und der Docker-Daemon müssen verfügbar sein. Für
|
|
203
|
+
SQL-Server-Pläne wird zusätzlich `sqlcmd` benötigt. Eine Schemasynchronisierung
|
|
204
|
+
kann bei Modelländerungen vorhandene Daten ändern oder
|
|
205
|
+
ablehnen. Wertvolle lokale Volumes sollten vor riskanten Migrationen gesichert
|
|
206
|
+
werden.
|
|
207
|
+
|
|
208
|
+
Siehe die offizielle Mendix-Dokumentation zu
|
|
209
|
+
[OQL](https://docs.mendix.com/refguide/oql/),
|
|
210
|
+
[Datenspeicherung](https://docs.mendix.com/refguide/data-storage/) und
|
|
211
|
+
[Runtime-Datenbankeinstellungen](https://docs.mendix.com/refguide/custom-settings/).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Bewertung der Mendix-API-Integration
|
|
2
|
+
|
|
3
|
+
Datum: 1. August 2026. Quelle: offizieller [Mendix-API- und SDK-Index](https://docs.mendix.com/apidocs-mxsdk/).
|
|
4
|
+
|
|
5
|
+
## Entscheidungsmatrix
|
|
6
|
+
|
|
7
|
+
| API oder SDK | Verwendung in MXRB | Entscheidung |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Projects API | zugängliche Apps und Projektmetadaten | als `team-server projects` integriert; standardmäßig lesend |
|
|
10
|
+
| App Repository API | Repository-Info, Branches und Commits | in Team-Server-Erkennung und Clone integriert |
|
|
11
|
+
| Marketplace Content API | Module/Widgets finden und laden | in Marketplace-Operationen integriert |
|
|
12
|
+
| Build API | natives Artefakt mit offiziellem Cloud-Build vergleichen | optionale Prüfung; nie Abhängigkeit des nativen Builds |
|
|
13
|
+
| Deploy API v4 | Apps/Umgebungen vor Release-Prüfung inventarisieren | lesender Adapter vorgeschlagen; Änderungen nur nach Bestätigung |
|
|
14
|
+
| Pipelines API | bestehende CI/CD-Pipeline starten und beobachten | Opt-in-Adapter mit Idempotenz und Statusabfrage vorgeschlagen |
|
|
15
|
+
| Backups API v2 | Snapshots vor Deployment auflisten/erstellen/laden | Sicherheitsadapter vorgeschlagen; Restore/Delete bleiben explizit |
|
|
16
|
+
| Runtime API 11 | eigenes Java kompilieren und Runtime-Verträge prüfen | Vertrag für Proxy-Erzeugung; Java-API, kein REST-Ersatz |
|
|
17
|
+
| Client- und Pluggable-Widget-APIs | Dojo-/React-/Data-Grid-Verträge | Referenz für Webartefakte, kein HTTP-Client |
|
|
18
|
+
| Catalog APIs | kontrollierte Datenquellen verwalten | zukünftiges Plugin; außerhalb von Build/Runtime |
|
|
19
|
+
| Model/Platform SDKs und Studio-Pro-Erweiterung | Apps remote modellieren oder Studio Pro erweitern | bewusst keine Pflicht; MXRB bleibt mit Ruby/SQLite/BSON eigenständig |
|
|
20
|
+
|
|
21
|
+
## Integrationsregeln
|
|
22
|
+
|
|
23
|
+
- Remote-Aufrufe sind explizit; `generate`, `compile`, `validate` und `db up` kontaktieren nie die Mendix Cloud.
|
|
24
|
+
- PATs/API-Schlüssel stammen aus geschützter Datei oder Umgebung und werden nie in Berichte, Logs, Projekte oder Git geschrieben.
|
|
25
|
+
- Lesen ist Standard. Build, Deploy, Pipeline, Restore, Mitgliedschaft und Löschen benötigen eigene Befehle und Bestätigung.
|
|
26
|
+
- Die Build API gilt nur für Mendix-Cloud-Apps und verwendet Account-API-Keys; sie ersetzt den lokalen Compiler nicht.
|
|
27
|
+
- Versionierte Runtime-/Frontend-APIs dienen als Kompatibilitätsnachweis. MXRB verwendet exakte Schemas/Seeds und schlägt ohne passenden Vertrag oder Launcher geschlossen fehl.
|
|
28
|
+
|
|
29
|
+
## Empfohlene Reihenfolge
|
|
30
|
+
|
|
31
|
+
1. App-Repository-Branches/Commits in `team-server` auflisten.
|
|
32
|
+
2. Lesendes Deploy-Inventar und optionales Build-Vergleichsgate.
|
|
33
|
+
3. Pipeline-Status/Start mit Idempotenz und begrenztem Polling.
|
|
34
|
+
4. Backup-Listen/Erstellen/Download vor Cloud-Änderungen.
|
|
35
|
+
|
|
36
|
+
Catalog und Studio-Pro-Erweiterungen bleiben getrennte Adapter, da sie das Risiko des nativen Kerns nicht senken.
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Betrieb, Lifecycle und Marketplace
|
|
2
|
+
|
|
3
|
+
## Diagnose, Benchmark und Weiterentwicklung
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
mxrb doctor .
|
|
7
|
+
mxrb benchmark App.mpr --iterations 5 --json
|
|
8
|
+
mxrb project inspect . --json
|
|
9
|
+
mxrb upgrade --mendix 11.12.1 --target .
|
|
10
|
+
mxrb upgrade --mendix 11.12.1 --target . --apply
|
|
11
|
+
mxrb migrate plan .
|
|
12
|
+
mxrb migrate check .
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`doctor` prüft Ruby-Projekt, Aggregatoren, MPR und lokale Toolchain.
|
|
16
|
+
`benchmark` misst Öffnen, semantische Indizierung und Validierung. Ein Upgrade
|
|
17
|
+
ist ohne `--apply` nur eine Vorschau. Migration erzeugt das Projekt temporär
|
|
18
|
+
und vergleicht es mit dem aktuellen MPR; `check` schlägt bei Modelldrift fehl.
|
|
19
|
+
|
|
20
|
+
## Frontend-Migration und Abnahme
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
mxrb frontend migrate App.mpr --json
|
|
24
|
+
mxrb frontend migrate App.mpr --apply --json
|
|
25
|
+
script/frontend_acceptance App.mpr -o frontend-round-trip.json
|
|
26
|
+
script/frontend_acceptance App.mpr --mxbuild /pfad/mxbuild -o frontend.json
|
|
27
|
+
script/frontend_acceptance App.mpr --mx /pfad/mx -o frontend-diagnostics.json
|
|
28
|
+
script/frontend_lifecycle_acceptance --version 11.12.1 --mx /pfad/mx \
|
|
29
|
+
--mxbuild /pfad/mxbuild --strict-warnings -o frontend-lifecycle.json
|
|
30
|
+
script/frontend_browser_acceptance --scenario examples/frontend-browser-scenario.json \
|
|
31
|
+
--url http://127.0.0.1:18080 --password-file /pfad/credentials.json \
|
|
32
|
+
--baseline examples/frontend-browser-baseline-11.12.1.json
|
|
33
|
+
script/frontend_browser_acceptance --scenario examples/page-chain-browser-scenario.json \
|
|
34
|
+
--url http://127.0.0.1:18080 --password-file /pfad/credentials.json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`mxrb frontend migrate` ist standardmäßig eine unveränderliche, fail-closed
|
|
38
|
+
Vorschau. Für Mendix 10 und 11 plant der Befehl Aktualisierungen installierter
|
|
39
|
+
Pluggable-Widget-Schemata, alter Layout-Zeilen-Gewichte und Design Properties
|
|
40
|
+
aus dem Paket-XML. `--apply` schreibt nur einen sicheren Plan in einer einzigen
|
|
41
|
+
MPR-Transaktion. Unbekannte konfigurierte Properties, eine nicht unterstützte
|
|
42
|
+
Generation oder eine nach der Vorschau geänderte Unit blockieren den Schreibzugriff.
|
|
43
|
+
Weder Vorschau noch Anwendung rufen Mendix-Werkzeuge auf.
|
|
44
|
+
|
|
45
|
+
`script/frontend_acceptance` ist das reproduzierbare 10/11-Gate. Es validiert
|
|
46
|
+
Quell- und Rebuild-MPR, verlangt für beide einen kompatiblen nativen Preflight,
|
|
47
|
+
exportiert nach Ruby, baut neu auf, vergleicht die Modellstruktur und prüft
|
|
48
|
+
vollständige Asset-Inventare, Bytes, SHA-256-Prüfsummen und Marketplace-
|
|
49
|
+
Provenienz. Die Provenienzgrenze umfasst `.mxrb/marketplace.lock.json`, den
|
|
50
|
+
Paketcache und `.mxrb/marketplace-originals`; fehlende, geänderte oder
|
|
51
|
+
unerwartete Dateien lassen das Gate fehlschlagen. Die akzeptierte Renderer-
|
|
52
|
+
Matrix deckt jetzt Forms-Tabellen, `ListViewXPathSource`, Listen-Target-
|
|
53
|
+
Objekt-Properties, strukturierte Page-Variable-Mappings und Combo-box-
|
|
54
|
+
Enumerationen ab. Die Preflight-Basis sank unter 10.24 von 28 auf 0 und unter
|
|
55
|
+
11.12 von 20 auf 0 Befunde.
|
|
56
|
+
|
|
57
|
+
Ohne `--mxbuild` lautet der Report-Scope `round_trip`, und `frontend_ready`
|
|
58
|
+
bleibt unbelegt. Mit `--mxbuild` dient MxBuild als schreibgeschütztes externes
|
|
59
|
+
Orakel und der Scope lautet `frontend`; es generiert, verändert oder repariert
|
|
60
|
+
das Projekt nie. Das Live-Orakel akzeptiert Erfolg nur, wenn MxBuild mit Status
|
|
61
|
+
null endet und ein nicht leeres MDA erzeugt; ein Toolchain-Fehler ohne gemeldete
|
|
62
|
+
Modellfehler schlägt geschlossen fehl. Am 4. August 2026 schloss die sichere
|
|
63
|
+
Migration die akzeptierte Matrix 10.24.0.73019 und 11.12.1 ab: Quelle und Rebuild lieferten null
|
|
64
|
+
MxBuild-Fehler, und beide Reports setzten `frontend_ready` auf `true`.
|
|
65
|
+
|
|
66
|
+
`script/frontend_lifecycle_acceptance` erstellt eine App ausschließlich über
|
|
67
|
+
die CLI, erzeugt das MPR, exportiert nach Ruby, ändert Home und Navigation,
|
|
68
|
+
fügt Entität, Formular, Microflow, Nanoflow und Asset hinzu, erzeugt erneut,
|
|
69
|
+
exportiert ein zweites Mal und verlangt einen strukturell identischen Rebuild.
|
|
70
|
+
In der offiziellen Matrix 10.24.0.73019 und 11.12.1 endeten Quelle und Rebuild
|
|
71
|
+
mit null Fehlern, Warnungen, Deprecations oder Empfehlungen in `mx check` sowie
|
|
72
|
+
null MxBuild-Fehlern.
|
|
73
|
+
|
|
74
|
+
`script/frontend_browser_acceptance` steuert Chromium über lokales CDP,
|
|
75
|
+
authentifiziert ohne Passwort in der Kommandozeile und vergleicht
|
|
76
|
+
deterministische Snapshots von Struktur, Geometrie, Styles und ARIA-Zustand.
|
|
77
|
+
Browser-Ausnahmen, defekte Widgets und der generische Runtime-Fehlerdialog
|
|
78
|
+
lassen das Gate fehlschlagen. Nur `--update-baseline` ersetzt die Baseline;
|
|
79
|
+
normale Läufe vergleichen schreibgeschützt. `mx.logout()` hält das Gate auch
|
|
80
|
+
unter einer Trial-Lizenz wiederholbar.
|
|
81
|
+
|
|
82
|
+
`page-chain-browser-scenario.json` verwendet eine `PageChainQa`-App mit
|
|
83
|
+
`DirectOrder`, `ClientOrder` und `HybridOrder`, erzeugt durch die drei Werte von
|
|
84
|
+
`page --chain`. Das Szenario klickt auf jeder Seite `Refresh` und verlangt auch
|
|
85
|
+
berechnetes CSS — Dokumentrand, Header-Gradient und Card-Hintergrund —, sodass
|
|
86
|
+
funktionales HTML ohne Theme das Gate nicht besteht.
|
|
87
|
+
|
|
88
|
+
`--mx` führt den offiziellen schreibgeschützten Checker mit Warnungen,
|
|
89
|
+
Deprecations und Best-Practice-Empfehlungen aus. Das Gate validiert die
|
|
90
|
+
Exit-Bitmaske und vergleicht normalisierte Signaturen von Quelle und Rebuild.
|
|
91
|
+
Die akzeptierte 10.24-Fixture hat 0 Fehler, 173 paketbezogene Warnungen,
|
|
92
|
+
0 Deprecations und 2 Kafka-Empfehlungen; 11.12 hat 0 Fehler, 10 paketbezogene
|
|
93
|
+
Warnungen, 0 Deprecations und dieselben 2 Empfehlungen. Die JSON-Dateien von
|
|
94
|
+
Quelle und Rebuild sind in beiden Generationen bytegleich; diese beobachtbaren
|
|
95
|
+
Paketdiagnosen sind kein MXRB-Round-trip-Drift.
|
|
96
|
+
|
|
97
|
+
## Offizieller und Community-Mendix-Marketplace
|
|
98
|
+
|
|
99
|
+
MXRB verwendet die dokumentierte Mendix Marketplace Content API. Das PAT
|
|
100
|
+
benötigt den Scope `mx:marketplace-content:read`:
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
cp .env.example .env
|
|
104
|
+
# MXRB_MENDIX_PAT in .env setzen; die Datei nie committen.
|
|
105
|
+
mxrb marketplace login --pat-file .env
|
|
106
|
+
mxrb marketplace search "Community Commons"
|
|
107
|
+
mxrb marketplace show 170
|
|
108
|
+
mxrb marketplace versions 170 --mendix-version 11.12.1
|
|
109
|
+
mxrb marketplace pull 170 --mpr MeineApp.mpr
|
|
110
|
+
mxrb marketplace dependencies CommunityCommons --mpr MeineApp.mpr
|
|
111
|
+
mxrb marketplace dependencies CommunityCommons --mpr MeineApp.mpr --apply
|
|
112
|
+
mxrb marketplace dependencies CommunityCommons --mpr MeineApp.mpr --apply-resolved
|
|
113
|
+
mxrb marketplace update 170@3.5.0 --mpr MeineApp.mpr
|
|
114
|
+
mxrb marketplace update 170@3.5.0 --mpr MeineApp.mpr --apply
|
|
115
|
+
mxrb marketplace remove CommunityCommons --mpr MeineApp.mpr
|
|
116
|
+
mxrb marketplace remove CommunityCommons --mpr MeineApp.mpr --apply
|
|
117
|
+
mxrb marketplace pull github:mendix/CommunityCommons
|
|
118
|
+
mxrb marketplace import ./CommunityCommons.mpk --mpr MeineApp.mpr
|
|
119
|
+
mxrb marketplace audit --target . --mendix-version 11.12.1
|
|
120
|
+
mxrb marketplace list
|
|
121
|
+
mxrb marketplace verify
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Der empfohlene Login speichert ausschließlich den absoluten `.env`-Pfad in
|
|
125
|
+
`~/.config/mxrb/credentials` (oder `$XDG_CONFIG_HOME/mxrb/credentials`). MXRB
|
|
126
|
+
kopiert oder verändert die referenzierte Datei nicht und liest sie erst für
|
|
127
|
+
eine authentifizierte Marketplace-Operation. Neue Scaffolds ignorieren `.env`
|
|
128
|
+
und erzeugen eine geheimnisfreie `.env.example`.
|
|
129
|
+
|
|
130
|
+
`mxrb marketplace login --store-pat` aktiviert die verwaltete Speicherung
|
|
131
|
+
explizit; Ziel, JSON-Format und Modus `0600` werden vor der Eingabe angezeigt.
|
|
132
|
+
`MXRB_MENDIX_PAT_FILE=/pfad/.env` funktioniert ohne gespeicherte Referenz.
|
|
133
|
+
Details zeigt `mxrb marketplace login --help`.
|
|
134
|
+
|
|
135
|
+
Die offizielle Suche umfasst öffentliche und unternehmensprivate Inhalte.
|
|
136
|
+
`show` liefert Herausgeber, Typ, Support, Lizenz, Sichtbarkeit und Freigabe;
|
|
137
|
+
`versions` liefert Kompatibilität, Release Notes sowie Sicherheitsstatus und
|
|
138
|
+
CVE/CWE-Kennungen.
|
|
139
|
+
|
|
140
|
+
Mit `--mpr` liest MXRB `package.xml` und die eingebettete `project.mpr` und
|
|
141
|
+
importiert den vollständigen Modulbaum direkt über Ruby/SQLite/BSON. Dabei
|
|
142
|
+
werden weder `mx` noch `mxcli`, Studio Pro oder das Model SDK ausgeführt. IDs
|
|
143
|
+
bleiben erhalten, deklarierte Assets werden transaktional installiert und
|
|
144
|
+
Paketcache sowie Modulidentität im Lockfile gespeichert. Kompatible offizielle
|
|
145
|
+
Pakete dürfen in eine neuere Modellversion des Projekts importiert werden;
|
|
146
|
+
lokale und GitHub-Imports erfordern weiterhin eine identische Modellversion.
|
|
147
|
+
Bei Atlas Core werden außerdem die Legacy-Sass-Variablen verbunden, ohne
|
|
148
|
+
Projektanpassungen zu überschreiben.
|
|
149
|
+
|
|
150
|
+
Der offizielle `pull` ist Standard, wählt eine zum Ziel-MPR kompatible Version
|
|
151
|
+
und blockiert bekannte verwundbare Versionen ohne `--allow-vulnerable`.
|
|
152
|
+
`github:` bleibt als Fallback erhalten, `import` verarbeitet lokale MPKs.
|
|
153
|
+
Content ID, Version ID und Sicherheitsstatus werden gesperrt; `audit` prüft
|
|
154
|
+
Updates und Schwachstellen. `login` validiert und speichert das PAT außerhalb
|
|
155
|
+
des Projekts mit Modus `0600`. Das PAT wird nur an die exakten offiziellen
|
|
156
|
+
Hosts `marketplace-api.mendix.com` und `marketplace.mendix.com` gesendet.
|
|
157
|
+
|
|
158
|
+
`marketplace dependencies` entdeckt ungelöste qualifizierte Modulreferenzen im
|
|
159
|
+
eingebetteten Paket-MPR, löst sie rekursiv über die offizielle API, lädt jeden
|
|
160
|
+
Kandidaten und akzeptiert ihn nur, wenn das MPK selbst die angeforderte
|
|
161
|
+
Modulidentität bestätigt. Projekteigene Module erfüllen Referenzen, ohne als
|
|
162
|
+
Marketplace-Pakete ausgegeben zu werden. Standard ist eine Vorschau; `--apply`
|
|
163
|
+
verlangt einen vollständig sicheren Graphen und installiert Blätter zuerst mit
|
|
164
|
+
Rollback. `--apply-resolved` ist die explizite Freigabe für den verifizierten
|
|
165
|
+
Teilgraphen und meldet ungelöste Identitäten weiterhin als blockiert.
|
|
166
|
+
|
|
167
|
+
Am 4. August 2026 importierte die authentifizierte Abnahme Kafka 2.12.0
|
|
168
|
+
(Content ID 105878) und löste den offiziellen Graphen unter 10.24.0.73019 und
|
|
169
|
+
11.12.1. Beide Graphen importierten DataWidgets 3.11.3 mit Content ID 116540
|
|
170
|
+
und Version ID `e7b6d703-8e47-42f4-bb92-934e3601e71b`. Die abschließend
|
|
171
|
+
authentifizierte Combo box ist die unabhängige offizielle Widget/clientModule-
|
|
172
|
+
Komponente 219304, Version 2.9.0, Version ID
|
|
173
|
+
`dce845f4-d051-4161-847c-016c01703caa`. Ihre Installation sichert und ersetzt
|
|
174
|
+
das ältere Combo-2.6.x-Asset aus Atlas Core (Content ID 117187); Atlas ist der
|
|
175
|
+
frühere Asset-Eigentümer, nicht die Combo-Komponente. Der 11.12-Graph enthält
|
|
176
|
+
außerdem Library Logging 1.13.0, Encryption 11.1.1, Mx Model Reflection 9.1.0
|
|
177
|
+
und Mendix Feedback Module 5.0.0 (Content ID 205506). Da der Namensindex
|
|
178
|
+
`FeedbackModule` nicht liefert, nutzt MXRB die offizielle Content ID nur als
|
|
179
|
+
Discovery-Hinweis und prüft weiterhin den internen MPK-Modulnamen.
|
|
180
|
+
|
|
181
|
+
Beide Generationen bestehen jetzt das vollständige Frontend-Abnahme-Gate mit
|
|
182
|
+
null Preflight-Befunden für Quelle und Rebuild, struktureller Gleichwertigkeit,
|
|
183
|
+
exakten Assets und Marketplace-Provenienz sowie null MxBuild-Fehlern. Ruby-
|
|
184
|
+
Export/Rebuild bewahrt den Marketplace-Lock, gecachte MPKs, Originale,
|
|
185
|
+
deklarierte Assets und ihre Prüfsummen; das neu aufgebaute Projekt behält damit
|
|
186
|
+
die Paketprovenienz und nicht nur die Widget-Bytes. MxBuild bleibt ausschließlich
|
|
187
|
+
externe Validierung und nie eine Implementierungsabhängigkeit von MXRB.
|
|
188
|
+
|
|
189
|
+
Offizielle Befehle `update` und `remove` sind ohne explizites `--apply` sichere
|
|
190
|
+
Vorschauen. Vor einer Änderung vergleicht MXRB Modul und Unit-Anzahl aus dem
|
|
191
|
+
Lock mit dem Cache-Paket, durchsucht alle externen Units nach Referenzen auf
|
|
192
|
+
wegfallende IDs und verweigert veränderte oder fehlende Paket-Assets. Ein
|
|
193
|
+
Update muss die Modul-ID und jede extern referenzierte Unit-ID erhalten. Beim
|
|
194
|
+
Anwenden sichert MXRB MPR, v2-`mprcontents`, Lock, Caches, deklarierte Assets und
|
|
195
|
+
die Atlas-Variablendatei; jeder Fehler stellt diese gesamte Grenze wieder her.
|
|
196
|
+
Gemeinsame Assets werden nicht entfernt, solange ein anderes gesperrtes Paket
|
|
197
|
+
sie beansprucht.
|
|
198
|
+
|
|
199
|
+
## Protokoll-Connector-Audit
|
|
200
|
+
|
|
201
|
+
`mxrb protocols` ist ein schreibgeschütztes Audit der IoT-, Industrie- und
|
|
202
|
+
Messaging-Connectoren, die ein Projekt aus dem Marketplace importiert hat. Es
|
|
203
|
+
führt kein Protokoll aus und installiert nichts; es meldet nur die öffentlichen
|
|
204
|
+
Metadaten, die das Modell offenlegt.
|
|
205
|
+
|
|
206
|
+
```sh
|
|
207
|
+
mxrb protocols App.mpr
|
|
208
|
+
mxrb protocols App.mpr --json
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Erkannte Connectoren werden mit Modulname, Protokoll und Marketplace-
|
|
212
|
+
Komponenten-id aufgeführt; nicht erkannte Marketplace-Module werden separat
|
|
213
|
+
gelistet. Die Erkennung erfolgt über eine verifizierte `AppStoreGuid`, sodass
|
|
214
|
+
ein Modul mit unbestätigter GUID als nicht erkannt gemeldet und nicht geraten
|
|
215
|
+
wird.
|
|
216
|
+
|
|
217
|
+
Diese Protokoll-Registry ist ein dritter Katalog, getrennt von den
|
|
218
|
+
wiederverwendbaren Ruby-Modulen aus `mxrb module` und den offiziellen Paketen
|
|
219
|
+
aus `mxrb marketplace`.
|
|
220
|
+
|
|
221
|
+
Verifizierte öffentliche Komponenten-IDs decken derzeit MQTT, OPC-UA, Kafka,
|
|
222
|
+
AMQP und WebSocket ab. Authentifizierte Abfragen der Content API und des
|
|
223
|
+
offiziellen Katalogs liefern weiterhin keine Modbus-Komponente; Modbus bleibt
|
|
224
|
+
daher unregistriert, bis eine offizielle Komponente oder ein echtes MPR-Fixture
|
|
225
|
+
die Identität belegt. Öffentliche IDs dienen der Planung; die Erkennung im MPR
|
|
226
|
+
erfordert weiterhin eine verifizierte `AppStoreGuid`.
|
|
227
|
+
|
|
228
|
+
Der Ruby-Builder kann eine Installation deklarieren, ohne ein leeres Modul oder
|
|
229
|
+
eine erfundene GUID zu schreiben:
|
|
230
|
+
|
|
231
|
+
```ruby
|
|
232
|
+
builder.connector :kafka, version: "2.12.0"
|
|
233
|
+
plaene = builder.connector_plans(adapter: Mxrb::Protocols.adapter(installer:, api:))
|
|
234
|
+
plaene.each { puts _1.changes }
|
|
235
|
+
plaene.each(&:apply!) # explizite authentifizierte Marketplace-Operation
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Ohne Adapter bleibt `connector_plans` eine Vorschau. `build!` schlägt bei noch
|
|
239
|
+
offenen Connector-Deklarationen ebenfalls geschlossen fehl; der echte Inhalt
|
|
240
|
+
muss zuerst über den offiziellen Adapter in ein MPR installiert werden.
|
|
241
|
+
Marketplace-Einträge vom Typ `Module` und `Service` können aufgelöst werden,
|
|
242
|
+
während das heruntergeladene MPK zusätzlich die Modul-Paketprüfungen bestehen
|
|
243
|
+
muss.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Struktur des exportierten Projekts
|
|
2
|
+
|
|
3
|
+
[Português](../pt-BR/project-structure.md) · [English](../en-US/project-structure.md) · **Deutsch**
|
|
4
|
+
|
|
5
|
+
Der von `mxrb export` erzeugte Baum trennt anwendungsweite Richtlinien,
|
|
6
|
+
Modulverhalten, erhaltene native Units und Assets:
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
project.rb
|
|
10
|
+
.mxrb/{native_units.json,native_units.rb,assets.json}
|
|
11
|
+
app/{security,navigation,design_system}/
|
|
12
|
+
modules/Modulname/{domain,application,presentation,infrastructure,security}/
|
|
13
|
+
theme/
|
|
14
|
+
themesource/
|
|
15
|
+
resources/
|
|
16
|
+
widgets/
|
|
17
|
+
javasource/
|
|
18
|
+
javascriptsource/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`project.rb` orchestriert das Laden. Module enthalten das Verhalten. Das
|
|
22
|
+
native Manifest erhält Strukturen ohne kompakte DSL; das Asset-Manifest
|
|
23
|
+
speichert relative Pfade, Größen und SHA-256-Prüfsummen.
|
|
24
|
+
|
|
25
|
+
Absolute Pfade, `..`-Traversal, fehlende Dateien und abweichende Prüfsummen
|
|
26
|
+
schlagen beim Wiederaufbau sicher fehl. Nur Manifest-Einträge werden geschrieben.
|
|
27
|
+
|
|
28
|
+
Die Struktur unterstützt Ruby zu einem neuen Mendix-Projekt, Ruby auf einem
|
|
29
|
+
exportierten Baseline, Mendix zu bearbeitbarem Ruby und den strukturell
|
|
30
|
+
gleichwertigen Mendix → Ruby → Mendix Round-trip.
|
|
31
|
+
|
|
32
|
+
[Zurück zum Index](README.md)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# MXRB: Ruby über alles
|
|
2
|
+
|
|
3
|
+
[Português](../pt-BR/ruby-first-roadmap.md) · [English](../en-US/ruby-first-roadmap.md) · **Deutsch**
|
|
4
|
+
|
|
5
|
+
## Architekturprinzip
|
|
6
|
+
|
|
7
|
+
Ruby ist die einzige öffentliche Sprache von MXRB. CLI-Befehle sind dünne
|
|
8
|
+
Adapter. Es wird weder MDL noch eine konkurrierende DSL eingeführt. Studio Pro
|
|
9
|
+
und MxBuild sind externe Validatoren, keine Abhängigkeiten des Ruby-Kerns.
|
|
10
|
+
|
|
11
|
+
## Verfügbar
|
|
12
|
+
|
|
13
|
+
- Tiefes Lesen und Schreiben von MPR v1/v2.
|
|
14
|
+
- Export in bearbeitbare Ruby-Projekte.
|
|
15
|
+
- Bearbeitbare `native_unit`-Hashes für jede native BSON-Struktur.
|
|
16
|
+
- Generierung, Integritätsprüfung, Vergleich und typisierter Diff.
|
|
17
|
+
- Semantischer Index, Referenzen, Caller/Callee und Impact.
|
|
18
|
+
- Sichere Umbenennung mit Vorschau.
|
|
19
|
+
- Sichere Entfernung eigenständiger Units mit Vorschau.
|
|
20
|
+
- Statische Analyse und ausführbare Modellbewertungen.
|
|
21
|
+
- Funktionale Microflow-Tests ohne JUnit.
|
|
22
|
+
- Lokale oder Docker-Ausführung von `mx check`, MxBuild und Runtime.
|
|
23
|
+
- Natives Coverage-Gate mit 100 % Zeilen und 100 % Branches im CI;
|
|
24
|
+
ohne explizite Grenzwerte bleibt der lokale Standard strenger bei 100/100.
|
|
25
|
+
|
|
26
|
+
## Beispiel
|
|
27
|
+
|
|
28
|
+
```ruby
|
|
29
|
+
Mxrb.open("app.mpr") do |project|
|
|
30
|
+
project.references_to("Sales.Order")
|
|
31
|
+
project.callers_of("Sales.Recalculate")
|
|
32
|
+
project.impact_of("Sales.Order")
|
|
33
|
+
project.plan_rename("Sales.Order", to: "Invoice")
|
|
34
|
+
plan = project.plan_remove("Sales.UnusedFlow")
|
|
35
|
+
plan.apply! if plan.safe?
|
|
36
|
+
project.analyze
|
|
37
|
+
end
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Bewertungsdateien sind gewöhnliches Ruby und werden mit
|
|
41
|
+
`mxrb evaluate app.mpr evaluation.rb` ausgeführt.
|
|
42
|
+
|
|
43
|
+
Schreibbare Projekte speichern einen fingerprint-basierten Cache des
|
|
44
|
+
semantischen Index im MPR. Schreibgeschützte Öffnungen dürfen ihn
|
|
45
|
+
wiederverwenden, verändern das Projekt jedoch nie.
|
|
46
|
+
`mxrb cache status`, `warm` und `clear` liefern Metriken und Wartung. Beim
|
|
47
|
+
Ersetzen wird zuerst per Upsert geschrieben und erst danach ein veralteter
|
|
48
|
+
Eintrag entfernt.
|
|
49
|
+
|
|
50
|
+
Die exakte native Mendix-5-Validierung bleibt von Windows/Studio Pro abhängig.
|
|
51
|
+
Sie ist als entfernte Legacy-Einschränkung dokumentiert und kein aktuelles
|
|
52
|
+
Auslieferungs-Gate.
|
|
53
|
+
|
|
54
|
+
Navigationsprofile lesen und schreiben jetzt native Mendix-Dokumente,
|
|
55
|
+
einschließlich rollenbasierter Startziele und rekursiver Menüs. Theme- und
|
|
56
|
+
Quell-Assets durchlaufen den Round-trip mit einem Prüfsummenmanifest;
|
|
57
|
+
Design-Tokens bieten Inventar, Lint, Kontrastmetriken und eine
|
|
58
|
+
Preview-basierte Migration literaler Werte.
|
|
59
|
+
|
|
60
|
+
Beim Entfernen blockieren eingehende Referenzen und Kind-Units den Plan.
|
|
61
|
+
Eingebettete Domain-Modellelemente benötigen ihre typisierte Mutation. Die CLI
|
|
62
|
+
zeigt mit `mxrb remove app.mpr Sales.UnusedFlow` nur die Vorschau; `--apply`
|
|
63
|
+
schreibt ausschließlich einen sicheren Plan.
|
|
64
|
+
|
|
65
|
+
Eigenständige Units können innerhalb desselben Moduls in ein Modul oder einen
|
|
66
|
+
Ordner verschoben werden:
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
plan = project.plan_move("Sales.Process", to: "Sales.Automation")
|
|
70
|
+
plan.apply!
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Der Plan bewahrt den nativen Containment-Typ und blockiert Domain-
|
|
74
|
+
Modellelemente, ungültige Container, Ordnerzyklen und modulübergreifende
|
|
75
|
+
Verschiebungen. `mxrb move` zeigt eine Vorschau; erst `--apply` schreibt.
|
|
76
|
+
|
|
77
|
+
## Offizieller Mendix Marketplace
|
|
78
|
+
|
|
79
|
+
Diese Befehlsfamilie bleibt von `mxrb module` getrennt. Die dokumentierte
|
|
80
|
+
Marketplace Content API unterstützt authentifizierte Suche, Details,
|
|
81
|
+
kompatible Versionen, direkten Download, private Unternehmensinhalte und
|
|
82
|
+
Sicherheitsaudits. GitHub und lokale MPKs bleiben Fallbacks.
|
|
83
|
+
|
|
84
|
+
Lokale MPKs werden vollständig und ohne Mendix-Werkzeuge direkt über
|
|
85
|
+
Ruby/SQLite/BSON in das Ziel-MPR importiert. Das PAT benötigt
|
|
86
|
+
`mx:marketplace-content:read`. Verwundbare Releases werden standardmäßig
|
|
87
|
+
abgelehnt; Content-/Version-IDs und Sicherheitsdaten stehen im Lockfile.
|
|
88
|
+
Die authentifizierte Kafka-Abnahme und der transaktionale Lifecycle sind jetzt
|
|
89
|
+
umgesetzt. `marketplace update` und `marketplace remove` zeigen standardmäßig
|
|
90
|
+
nur eine Vorschau, erhalten extern referenzierte IDs, verweigern veränderte
|
|
91
|
+
Assets und sichern MPR, `mprcontents`, Cache, Lock und Assets vor explizitem
|
|
92
|
+
`--apply`. Auch die authentifizierten Folgeschritte sind umgesetzt:
|
|
93
|
+
`marketplace dependencies` löst offizielle Pakete rekursiv aus Referenzen im
|
|
94
|
+
eingebetteten MPR, prüft die tatsächliche Modulidentität jedes MPKs, erkennt
|
|
95
|
+
projekteigene Module, installiert Blätter zuerst und führt atomaren Rollback
|
|
96
|
+
aus. Kafka-Graphen bestanden die Abnahme unter 10.24 und 11.12; Ruby-
|
|
97
|
+
Export/Rebuild bewahrt Assets, Prüfsummen und Quell-/Rebuild-Diagnosen.
|
|
98
|
+
|
|
99
|
+
Die authentifizierte Matrix enthält jetzt DataWidgets 3.11.3 (Content ID
|
|
100
|
+
116540, Version ID `e7b6d703-8e47-42f4-bb92-934e3601e71b`) und die unabhängige
|
|
101
|
+
offizielle Combo-box-Widget/clientModule-Komponente 219304, Version 2.9.0,
|
|
102
|
+
Version ID `dce845f4-d051-4161-847c-016c01703caa`. Die Installation sichert und
|
|
103
|
+
ersetzt das zuvor Atlas Core (Content ID 117187) gehörende 2.6.x-Asset. Ruby-
|
|
104
|
+
Roundtrips bewahren die Provenienz von Marketplace-Lock, Cache und Originalen;
|
|
105
|
+
`script/frontend_acceptance` blockiert Modell-, Asset-, Prüfsummen- oder
|
|
106
|
+
Provenienzdrift. Der native Renderer hat für die akzeptierten 10.24- und
|
|
107
|
+
11.12-Fixtures null Preflight-Befunde in Quelle und Rebuild.
|
|
108
|
+
|
|
109
|
+
Die Migrationsschnittstelle ist als `mxrb frontend migrate DATEI.mpr`
|
|
110
|
+
umgesetzt: Standard ist die Vorschau, erst `--apply` schreibt einen sicheren
|
|
111
|
+
transaktionalen Plan. Diese Migration ist auf der gesamten unterstützten
|
|
112
|
+
Frontend-Matrix abgeschlossen. Das optionale externe MxBuild-Orakel liefert
|
|
113
|
+
für Quelle und Rebuild unter 10.24 und 11.12 null Fehler; `mx check` bewahrt
|
|
114
|
+
außerdem bytegleiche beobachtbare Paketdiagnosen in jedem Round-trip. MXRB
|
|
115
|
+
bleibt unabhängig: `mx` und MxBuild sind nur Validierungsorakel, niemals
|
|
116
|
+
Generatoren, Mutatoren oder Runtime-Abhängigkeiten.
|