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,300 @@
|
|
|
1
|
+
# Arquitetura de projetos Mendix no mxrb
|
|
2
|
+
|
|
3
|
+
**Português** · [English](../en-US/architecture.md) · [Deutsch](../de-DE/architecture.md)
|
|
4
|
+
|
|
5
|
+
Este documento define a estrutura canônica de um projeto editável pelo `mxrb`.
|
|
6
|
+
Ela tem dois objetivos igualmente importantes:
|
|
7
|
+
|
|
8
|
+
1. permitir escrever o projeto em Ruby e gerar um `.mpr`;
|
|
9
|
+
2. exportar um `.mpr` existente para Ruby, editar e gerar Mendix novamente.
|
|
10
|
+
|
|
11
|
+
O Ruby é uma representação versionável do metamodelo Mendix. Ele não é uma
|
|
12
|
+
segunda aplicação executada em paralelo ao runtime Mendix.
|
|
13
|
+
|
|
14
|
+
As regras normativas de classificação de microflows, nanoflows, security,
|
|
15
|
+
navigation e design system estão em
|
|
16
|
+
[padrão arquitetural](architectural-standard.md).
|
|
17
|
+
|
|
18
|
+
## Princípios de compatibilidade com Mendix
|
|
19
|
+
|
|
20
|
+
Um app Mendix é uma árvore de **units**. O app é a raiz; módulos e pastas são
|
|
21
|
+
units estruturais; Domain Models, páginas e microflows são units de modelo.
|
|
22
|
+
Cada módulo possui exatamente um Domain Model, além de seus documentos e
|
|
23
|
+
configurações.
|
|
24
|
+
|
|
25
|
+
Por isso, a principal fronteira arquitetural do `mxrb` também é o **módulo**.
|
|
26
|
+
Um módulo deve representar uma capacidade de negócio ou integração substituível,
|
|
27
|
+
por exemplo `CustomerManagement`, `OrderManagement` ou `PaymentIntegration`.
|
|
28
|
+
|
|
29
|
+
Referências:
|
|
30
|
+
|
|
31
|
+
- [App Explorer](https://docs.mendix.com/refguide/app-explorer/)
|
|
32
|
+
- [Modules](https://docs.mendix.com/refguide/modules/)
|
|
33
|
+
- [Mendix Metamodel](https://docs.mendix.com/apidocs-mxsdk/mxsdk/mendix-metamodel/)
|
|
34
|
+
- [Naming Convention Best Practices](https://docs.mendix.com/refguide/naming-convention-best-practices/)
|
|
35
|
+
|
|
36
|
+
## Estrutura canônica
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
meu_app/
|
|
40
|
+
├── project.rb
|
|
41
|
+
├── modules/
|
|
42
|
+
│ ├── CustomerManagement/
|
|
43
|
+
│ │ ├── module.rb
|
|
44
|
+
│ │ ├── domain/
|
|
45
|
+
│ │ │ ├── model.rb
|
|
46
|
+
│ │ │ └── entities/
|
|
47
|
+
│ │ │ ├── customer.rb
|
|
48
|
+
│ │ │ └── order.rb
|
|
49
|
+
│ │ ├── application/
|
|
50
|
+
│ │ │ ├── application.rb
|
|
51
|
+
│ │ │ └── microflows/
|
|
52
|
+
│ │ │ └── create_order.rb
|
|
53
|
+
│ │ ├── presentation/
|
|
54
|
+
│ │ │ ├── presentation.rb
|
|
55
|
+
│ │ │ └── pages/
|
|
56
|
+
│ │ │ └── order_list.rb
|
|
57
|
+
│ │ └── infrastructure/
|
|
58
|
+
│ │ └── .keep
|
|
59
|
+
│ └── OrderManagement/
|
|
60
|
+
│ └── ...
|
|
61
|
+
├── resources/ # arquivos externos ao metamodelo, quando houver
|
|
62
|
+
├── themesource/ # estrutura nativa do tema Mendix
|
|
63
|
+
├── widgets/ # widgets pluggable nativos
|
|
64
|
+
└── vendor/ # módulos/artefatos externos, não editados pelo domínio
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Arquivos como `themesource/`, `widgets/`, `javasource/`, `deployment/` e
|
|
68
|
+
`resources/` devem manter os nomes e formatos esperados pelo Mendix. O `mxrb`
|
|
69
|
+
não deve esconder ou renomear esses diretórios.
|
|
70
|
+
|
|
71
|
+
## Mapeamento para Clean Architecture
|
|
72
|
+
|
|
73
|
+
### `domain/`
|
|
74
|
+
|
|
75
|
+
Contém o Domain Model do módulo:
|
|
76
|
+
|
|
77
|
+
- entidades;
|
|
78
|
+
- atributos;
|
|
79
|
+
- associações;
|
|
80
|
+
- enumerações;
|
|
81
|
+
- regras de domínio puras, quando suportadas.
|
|
82
|
+
|
|
83
|
+
O domínio não deve depender de páginas, serviços externos ou detalhes de
|
|
84
|
+
infraestrutura. Uma entidade deve ter nome singular em PascalCase, como
|
|
85
|
+
`Customer` ou `PurchaseOrder`.
|
|
86
|
+
|
|
87
|
+
`domain/` representa o único Domain Model permitido pelo módulo Mendix.
|
|
88
|
+
`domain/model.rb` é somente o agregador; cada entidade fica em seu próprio
|
|
89
|
+
arquivo dentro de `domain/entities/`. Associações ficam no arquivo da entidade
|
|
90
|
+
que possui a referência.
|
|
91
|
+
|
|
92
|
+
```ruby
|
|
93
|
+
# domain/model.rb
|
|
94
|
+
evaluate File.join(__dir__, "entities", "customer.rb")
|
|
95
|
+
evaluate File.join(__dir__, "entities", "order.rb")
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```ruby
|
|
99
|
+
# domain/entities/order.rb
|
|
100
|
+
entity :Order do
|
|
101
|
+
decimal :Total, default: 0
|
|
102
|
+
association "Sales.Customer", name: "Order_Customer"
|
|
103
|
+
end
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
A cardinalidade segue o modelo de tipo/proprietário do Mendix:
|
|
107
|
+
|
|
108
|
+
```ruby
|
|
109
|
+
# 1:N (padrão): Reference + Default
|
|
110
|
+
association "Sales.Customer", name: "Order_Customer"
|
|
111
|
+
|
|
112
|
+
# 1:1: Reference + Both
|
|
113
|
+
association "Sales.Profile", name: "Customer_Profile", owner: :Both
|
|
114
|
+
|
|
115
|
+
# N:N: ReferenceSet + Default
|
|
116
|
+
association "Sales.Tag", name: "Order_Tags", type: :ReferenceSet
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### `application/`
|
|
120
|
+
|
|
121
|
+
Contém casos de uso e coordenação:
|
|
122
|
+
|
|
123
|
+
- microflows;
|
|
124
|
+
- nanoflows;
|
|
125
|
+
- regras de aplicação;
|
|
126
|
+
- scheduled events;
|
|
127
|
+
- task queues.
|
|
128
|
+
|
|
129
|
+
Convenções úteis para microflows:
|
|
130
|
+
|
|
131
|
+
- `ACT_`: operação de negócio reutilizável;
|
|
132
|
+
- `VAL_`: validação;
|
|
133
|
+
- `DS_`: data source;
|
|
134
|
+
- `SUB_`: submicroflow interno;
|
|
135
|
+
- `IVK_`: ação invocada pela interface;
|
|
136
|
+
- `API_`: operação exposta como contrato.
|
|
137
|
+
|
|
138
|
+
Esses prefixos são uma convenção do projeto, não uma exigência do formato MPR.
|
|
139
|
+
|
|
140
|
+
Cada microflow fica em `application/microflows/<nome>.rb`.
|
|
141
|
+
`application/application.rb` é somente o agregador desses arquivos.
|
|
142
|
+
|
|
143
|
+
### `presentation/`
|
|
144
|
+
|
|
145
|
+
Contém a interface:
|
|
146
|
+
|
|
147
|
+
- páginas;
|
|
148
|
+
- layouts;
|
|
149
|
+
- snippets;
|
|
150
|
+
- menus;
|
|
151
|
+
- recursos de navegação específicos do módulo.
|
|
152
|
+
|
|
153
|
+
A apresentação pode chamar casos de uso em `application/`, mas não deve
|
|
154
|
+
implementar regras centrais de negócio.
|
|
155
|
+
|
|
156
|
+
Cada página fica em `presentation/pages/<nome>.rb`.
|
|
157
|
+
`presentation/presentation.rb` é somente o agregador.
|
|
158
|
+
|
|
159
|
+
### `infrastructure/`
|
|
160
|
+
|
|
161
|
+
Contém adaptadores e detalhes externos:
|
|
162
|
+
|
|
163
|
+
- consumed/published REST, OData, GraphQL e SOAP;
|
|
164
|
+
- import/export mappings;
|
|
165
|
+
- message definitions;
|
|
166
|
+
- Java e JavaScript actions;
|
|
167
|
+
- persistência ou conectores externos;
|
|
168
|
+
- constantes técnicas.
|
|
169
|
+
|
|
170
|
+
Microflows de infraestrutura devem ser chamados pela camada de aplicação. O
|
|
171
|
+
domínio não deve depender diretamente deles.
|
|
172
|
+
|
|
173
|
+
## Regra de dependências
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
presentation ──────┐
|
|
177
|
+
├──> application ───> domain
|
|
178
|
+
infrastructure ────┘
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- `domain` não conhece nenhuma outra camada.
|
|
182
|
+
- `application` conhece o domínio e contratos necessários.
|
|
183
|
+
- `presentation` chama a aplicação.
|
|
184
|
+
- `infrastructure` implementa integrações usadas pela aplicação.
|
|
185
|
+
- dependências entre módulos devem passar por operações públicas documentadas,
|
|
186
|
+
evitando acesso disperso aos detalhes internos de outro módulo.
|
|
187
|
+
|
|
188
|
+
O Mendix não aplica essas restrições automaticamente; o `mxrb lint` deverá
|
|
189
|
+
validá-las em uma etapa futura.
|
|
190
|
+
|
|
191
|
+
## Arquivo raiz
|
|
192
|
+
|
|
193
|
+
`project.rb` monta o app e pode ser executado diretamente pelo comando
|
|
194
|
+
`mxrb generate`:
|
|
195
|
+
|
|
196
|
+
```ruby
|
|
197
|
+
require "mxrb"
|
|
198
|
+
|
|
199
|
+
output = ENV.fetch("MXRB_OUTPUT_PATH", File.join(__dir__, "MyApp.mpr"))
|
|
200
|
+
|
|
201
|
+
Mxrb.define(output) do
|
|
202
|
+
mendix_version "10.17.0"
|
|
203
|
+
evaluate File.join(__dir__, "modules", "CustomerManagement", "module.rb")
|
|
204
|
+
evaluate File.join(__dir__, "modules", "OrderManagement", "module.rb")
|
|
205
|
+
end
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Cada `module.rb` abre uma única definição de módulo:
|
|
209
|
+
|
|
210
|
+
```ruby
|
|
211
|
+
self.module :OrderManagement do
|
|
212
|
+
evaluate File.join(__dir__, "domain", "model.rb")
|
|
213
|
+
evaluate File.join(__dir__, "application", "application.rb")
|
|
214
|
+
evaluate File.join(__dir__, "presentation", "presentation.rb")
|
|
215
|
+
end
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Fluxo Ruby para Mendix
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
bundle exec mxrb generate meu_app/project.rb build/MyApp.mpr
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
O writer usa nomes como chave estável ao atualizar módulos, entidades,
|
|
225
|
+
atributos, associações e documentos. Reaplicar a mesma fonte Ruby não deve
|
|
226
|
+
duplicar artefatos.
|
|
227
|
+
|
|
228
|
+
Para projetos reais, mantenha o `.mpr` e o diretório `mprcontents/` juntos. Em
|
|
229
|
+
MPR v2, ambos formam o projeto.
|
|
230
|
+
|
|
231
|
+
## Fluxo Mendix para Ruby
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
bundle exec mxrb export MyApp.mpr meu_app/
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
O exportador cria:
|
|
238
|
+
|
|
239
|
+
- `project.rb`;
|
|
240
|
+
- um diretório por módulo;
|
|
241
|
+
- `domain/model.rb` como agregador;
|
|
242
|
+
- `domain/entities/*.rb`, um arquivo por entidade;
|
|
243
|
+
- `application/application.rb` e um arquivo por microflow;
|
|
244
|
+
- `presentation/presentation.rb` e um arquivo por página;
|
|
245
|
+
- o espaço reservado de `infrastructure/`.
|
|
246
|
+
|
|
247
|
+
Depois da exportação:
|
|
248
|
+
|
|
249
|
+
```sh
|
|
250
|
+
bundle exec mxrb generate meu_app/project.rb build/MyApp.mpr
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Esse round-trip preserva o metamodelo conhecido pelo `mxrb`. Flows dos fixtures
|
|
254
|
+
públicos são DSL tipada; páginas/widgets avançados usam um hash Ruby profundo e
|
|
255
|
+
editável. Units fora dessas superfícies usam o manifesto nativo como baseline
|
|
256
|
+
lossless até ganharem uma representação Ruby própria.
|
|
257
|
+
|
|
258
|
+
## Estratégia segura de round-trip
|
|
259
|
+
|
|
260
|
+
Há dois modos de trabalho:
|
|
261
|
+
|
|
262
|
+
### Atualização preservadora
|
|
263
|
+
|
|
264
|
+
Exporte um MPR, edite o Ruby e gere sobre uma cópia do MPR original. Esse é o
|
|
265
|
+
modo recomendado porque units ainda desconhecidas pelo `mxrb` continuam no
|
|
266
|
+
arquivo.
|
|
267
|
+
|
|
268
|
+
```sh
|
|
269
|
+
cp MyApp.mpr work/MyApp.mpr
|
|
270
|
+
cp -R mprcontents work/mprcontents # somente para MPR v2
|
|
271
|
+
bundle exec mxrb generate meu_app/project.rb work/MyApp.mpr
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Reconstrução
|
|
275
|
+
|
|
276
|
+
Gere um MPR novo a partir do Ruby. Use apenas quando todos os artefatos
|
|
277
|
+
necessários estiverem representados pelo DSL. Neste estágio, configurações
|
|
278
|
+
globais, segurança completa, widgets complexos, integrações e alguns tipos de
|
|
279
|
+
documento ainda não são reconstruídos integralmente.
|
|
280
|
+
|
|
281
|
+
## Convenções de nomes
|
|
282
|
+
|
|
283
|
+
- módulos: `UpperCamelCase`, descrevendo responsabilidade;
|
|
284
|
+
- entidades: singular e `PascalCase`;
|
|
285
|
+
- atributos: `PascalCase`;
|
|
286
|
+
- detalhes técnicos de entidade: prefixo `_`;
|
|
287
|
+
- associações: padrão Mendix `Origem_Destino`;
|
|
288
|
+
- nomes públicos devem ser estáveis, pois o Mendix usa nomes para reconciliar
|
|
289
|
+
vários artefatos durante substituições e atualizações.
|
|
290
|
+
|
|
291
|
+
## Fonte de verdade
|
|
292
|
+
|
|
293
|
+
Escolha uma fonte de verdade por branch de trabalho:
|
|
294
|
+
|
|
295
|
+
- **Ruby-first**: Ruby é editado; o MPR é artefato gerado/atualizado.
|
|
296
|
+
- **Mendix-first**: Studio Pro é editado; execute `mxrb export` antes de alterar
|
|
297
|
+
o Ruby.
|
|
298
|
+
|
|
299
|
+
Não edite simultaneamente os mesmos artefatos nos dois lados. O fluxo futuro de
|
|
300
|
+
`mxrb diff` deverá detectar divergências antes da conversão.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Compilador nativo, Runtime e formato MDA
|
|
2
|
+
|
|
3
|
+
O pipeline funcional do MXRB não executa `mx`, `mxbuild`, `mxcli`, Studio Pro
|
|
4
|
+
ou Model SDK. Esses programas podem continuar sendo usados como gates externos
|
|
5
|
+
de compatibilidade, mas não são dependências do build, do banco ou dos testes
|
|
6
|
+
funcionais.
|
|
7
|
+
|
|
8
|
+
## Build do zero
|
|
9
|
+
|
|
10
|
+
`DeploymentMaterializer` cria um `deployment/` inexistente a partir dos
|
|
11
|
+
templates da versão instalada e executa 12 estágios: segurança, constantes,
|
|
12
|
+
domain model, artefatos, traduções, textos de sistema, filas de sistema, modelo
|
|
13
|
+
cliente, actions, settings, microflows e índice de projeto/módulos. Ele também
|
|
14
|
+
gera `metadata.json`, dependências e o `model.mdp` em ordem BSON aceita pelo
|
|
15
|
+
Runtime.
|
|
16
|
+
|
|
17
|
+
O bootstrap possui seeds e catálogos auditados para 6.10.8, 7.5.0, 7.17.0,
|
|
18
|
+
9.6.1.29396, 10.24.0.73019 e 11.12.1. As famílias 6.x, 7.x, 9.x, 10.x e 11.x selecionam o seed
|
|
19
|
+
compatível; 5.x e 8.x falham fechadas por ainda não terem seed auditado.
|
|
20
|
+
Esse agrupamento vale para o schema do compilador. A Runtime deve sempre ter o
|
|
21
|
+
mesmo patch exato do MPR.
|
|
22
|
+
|
|
23
|
+
`ProjectJarBuilder` encontra o JDK por `MXRB_JAVA_HOME`, `JAVA_HOME`, asdf ou
|
|
24
|
+
mise, compila `javasource/**/*.java` com as bibliotecas do Runtime e do projeto
|
|
25
|
+
e escreve um `project.jar` OSGi determinístico. No VetClinic foram compilados
|
|
26
|
+
183 fontes em 249 classes.
|
|
27
|
+
|
|
28
|
+
`WebBundleBuilder` seleciona Dojo em 6/7, Dojo com React wrapper em 9, o cliente
|
|
29
|
+
clássico ou otimizado declarado pelo projeto em 10 e React em 11. No React,
|
|
30
|
+
gera entrypoint e módulos, expande `.mpk` e chama diretamente o Node/Rollup
|
|
31
|
+
da versão 10 ou Node/Rspack da versão 11. O Data Grid 2 é compilado no subconjunto com
|
|
32
|
+
fonte XPath e colunas de atributo, incluindo `operations.json`, datasource e
|
|
33
|
+
tipos dos atributos. Tipos ou combinações ainda não traduzidos recebem um
|
|
34
|
+
fallback DOM e ficam registrados em `web/mxrb-pages.json`; o manifesto do
|
|
35
|
+
VetClinic ficou vazio.
|
|
36
|
+
|
|
37
|
+
O compilador React também materializa containers, textos e títulos, grids
|
|
38
|
+
responsivos, colunas e botões de abertura/criação. O bootstrap injeta
|
|
39
|
+
`theme.compiled.css`, manifest e assets `themesource/*/public`; portanto uma
|
|
40
|
+
homepage com `LayoutGrid` não fica vazia. Para adicionar conteúdo em Ruby:
|
|
41
|
+
|
|
42
|
+
Formulários `DataView` ligados a parâmetros agora renderizam campos `TextBox`
|
|
43
|
+
editáveis e ações Save/Cancel. Create passa o GUID do novo objeto por
|
|
44
|
+
`openForm2`; as operações commit/rollback são registradas com os user roles do
|
|
45
|
+
projeto derivados dos module roles permitidos pela página. A autorização da
|
|
46
|
+
Runtime é preservada, sem contorno de segurança.
|
|
47
|
+
|
|
48
|
+
Layouts, placeholders, regiões de scroll, sidebars, headers, menus de navegação,
|
|
49
|
+
snippets, DataViews, ListViews, controles de formulário, imagens, combo boxes,
|
|
50
|
+
Gallery, Data Grid 2 e widgets pluggable respaldados por schema são compilados
|
|
51
|
+
pelos contratos nativos do cliente React. Ações de páginas, menus e widgets
|
|
52
|
+
cobrem navegação, microflows, nanoflows, ciclo de vida de objetos, links e
|
|
53
|
+
sign-out. Programas nanoflow também cobrem decisões, error handlers,
|
|
54
|
+
ações JavaScript e operações server-side de microflow/commit quando o contrato
|
|
55
|
+
do modelo pode ser mapeado com segurança.
|
|
56
|
+
|
|
57
|
+
O caminho React também compila a Gallery oficial com listas XPath e microflow,
|
|
58
|
+
conteúdo de item por template, seleção e atributos dinâmicos formatados. Fontes
|
|
59
|
+
e ações nanoflow usam os contratos `NanoflowObjectListProperty`,
|
|
60
|
+
`NanoflowObjectProperty` e `ActionProperty` do cliente Mendix. O MXRB emite
|
|
61
|
+
programas cliente reais `{ name, instructions }` para controle de fluxo em
|
|
62
|
+
grafo, retornos, variáveis, objetos, chamadas de nanoflow/microflow, ações
|
|
63
|
+
JavaScript, páginas, mensagens, validações e commits. Fluxos ausentes,
|
|
64
|
+
mapeamentos de parâmetro inseguros e instruções cliente não traduzidas falham
|
|
65
|
+
fechado e permanecem achados no manifesto de suporte.
|
|
66
|
+
|
|
67
|
+
Nas sessões locais da Runtime em modo developer, o mxrb também versiona imports
|
|
68
|
+
dinâmicos de páginas, aplica hash de conteúdo ao chunk corrigido do React Client
|
|
69
|
+
e dá à autoimportação do Rspack o mesmo token do entrypoint. Isso impede que as
|
|
70
|
+
respostas estáticas de longa duração do Mendix restaurem uma página branca
|
|
71
|
+
obsoleta depois de um rebuild nativo. O shell gerado também fornece um adaptador
|
|
72
|
+
limitado de `openForm` sobre `openForm2`; assim, handlers antigos em cache
|
|
73
|
+
navegam em vez de terminar silenciosamente sem disparar request.
|
|
74
|
+
|
|
75
|
+
```ruby
|
|
76
|
+
Mxrb.define("App.mpr") do
|
|
77
|
+
mendix_version "11.12.1"
|
|
78
|
+
self.module(:App) do
|
|
79
|
+
layout :Shell
|
|
80
|
+
page(:Home) do
|
|
81
|
+
layout "App.Shell"
|
|
82
|
+
title "Minha aplicação"
|
|
83
|
+
container(:main, class_name: "container") do
|
|
84
|
+
text :welcome, caption: "Conteúdo criado com mxrb"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Projetos existentes podem ser exportados, alterados na DSL e regenerados. Os
|
|
92
|
+
widgets fora do subconjunto continuam no manifesto, sem descarte silencioso.
|
|
93
|
+
|
|
94
|
+
Antes do build nativo, audite o MPR completo pelo renderer selecionado para sua
|
|
95
|
+
versão Mendix:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
mxrb preflight App.mpr
|
|
99
|
+
mxrb preflight App.mpr --json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
O comando é somente leitura e retorna código diferente de zero para versões ou
|
|
103
|
+
recursos cliente não suportados. Mendix 11 é auditado pelo compilador React;
|
|
104
|
+
6/7/9 usam a mesma auditoria Dojo legada do `WebBundleBuilder`. Assim o relatório
|
|
105
|
+
não declara compatibilidade por um renderer que o build real não utilizará.
|
|
106
|
+
|
|
107
|
+
No Dojo, o Data Grid 1 cobre fontes database, XPath e microflow, pesquisa,
|
|
108
|
+
ordenação, paginação, seleção e botões auditados. Outros widgets visuais são
|
|
109
|
+
registrados por página em `web/mxrb-legacy-pages.json`; não são declarados como
|
|
110
|
+
renderizados. Esse manifesto evita que XML servido seja confundido com página
|
|
111
|
+
visualmente completa.
|
|
112
|
+
|
|
113
|
+
## MDA e pacote portátil
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
mxrb pack Clinic.mpr --output build/Clinic.mda
|
|
117
|
+
mxrb mda inspect build/Clinic.mda
|
|
118
|
+
mxrb portable Clinic.mpr --output build/runtime.zip
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
O MDA e o ZIP portátil são determinísticos. O pacote portátil combina o
|
|
122
|
+
deployment nativo com o Runtime instalado da mesma versão, configurações,
|
|
123
|
+
constantes e scripts. Somente as raízes oficiais entram no MDA; diretórios de
|
|
124
|
+
trabalho como `data`, `log`, `run`, `build` e `.gradle` são excluídos.
|
|
125
|
+
|
|
126
|
+
## Evidência de regressão
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
script/runtime_boot_regression App.mpr /caminho/inexistente/deployment \
|
|
130
|
+
~/.local/share/mendix/11.12.1
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
O teste trabalha em diretório temporário, cria o deployment, compila Java e
|
|
134
|
+
web, empacota, inicia o Runtime e exige HTTP 200 para `/`, `dist/index.js` e
|
|
135
|
+
cada bundle de página. Também verifica shutdown limpo. O transcript e o SHA-256
|
|
136
|
+
ficam em `tmp/runtime-boot-evidence.log`. Quando Chromium está instalado, o
|
|
137
|
+
teste importa todos os módulos e instancia os factories que não exigem sessão.
|
|
138
|
+
O bundle do Data Grid é importado e avaliado; seu factory consulta a sessão do
|
|
139
|
+
cliente e, por isso, exige um teste autenticado para ser instanciado.
|
|
140
|
+
|
|
141
|
+
Em 1º de agosto de 2026, o VetClinic 11.12.1 partiu de deployment inexistente,
|
|
142
|
+
executou 675 comandos de sincronização de banco, ativou as filas `System`,
|
|
143
|
+
agendou `VetClinic.Cleanup`, respondeu 200 nos quatro bundles de página e
|
|
144
|
+
encerrou limpo. O teste funcional `ACT Create Animal` passou em seguida.
|
|
145
|
+
|
|
146
|
+
## Limites explícitos
|
|
147
|
+
|
|
148
|
+
- os 12 estágios e a geração web limpa foram validados em 6.10.8, 7.5.0,
|
|
149
|
+
7.17.0, 9.6.1.29396, 10.24.0.73019 e 11.12.1;
|
|
150
|
+
- o boot nativo exato foi provado em 10.24.0.73019 e 11.12.1. As distribuições
|
|
151
|
+
6/7/9 instaladas têm os bundles exatos, mas não launcher compatível; `db up` falha fechado em vez de
|
|
152
|
+
substituir pelo launcher Java 21 da versão 11;
|
|
153
|
+
- Data Grid 1 está coberto, mas os demais widgets Dojo continuam explicitamente
|
|
154
|
+
pendentes no manifesto legado;
|
|
155
|
+
- o caminho React/Rollup otimizado do Mendix 10 está coberto por uma aplicação
|
|
156
|
+
criada do zero; o caminho React do Mendix 11 tem preflight limpo e builds Rspack completos de
|
|
157
|
+
LearnNow, MyFirstModule, SLATaskApp, Sudoku e VetClinic. Essa matriz comprova
|
|
158
|
+
os contratos auditados, não compatibilidade universal;
|
|
159
|
+
- bundles web nativos são gerados; o pipeline React Native ainda depende dos
|
|
160
|
+
assets de template/projeto existentes;
|
|
161
|
+
- `mx` e `mxbuild` não são fallbacks. Um recurso sem compilador produz erro ou
|
|
162
|
+
entrada no manifesto de suporte.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Convenções
|
|
2
|
+
|
|
3
|
+
**Português** · [English](../en-US/conventions.md) · [Deutsch](../de-DE/conventions.md)
|
|
4
|
+
|
|
5
|
+
- Preserve nomes qualificados Mendix nas referências.
|
|
6
|
+
- Use `snake_case` nos arquivos Ruby sem mudar a identidade do artefato.
|
|
7
|
+
- Faça preview de rename, move, remove e migração antes do apply.
|
|
8
|
+
- Declare papéis de páginas e flows em projetos protegidos.
|
|
9
|
+
- Dê uma home padrão a cada perfil de navegação.
|
|
10
|
+
- Mapeie homes por papel a user roles com acesso ao alvo.
|
|
11
|
+
- Prefira tokens a estilos literais locais.
|
|
12
|
+
- Writers tipados alteram apenas campos explicitamente declarados.
|
|
13
|
+
- Themes, widgets, resources e fontes Java fazem parte do round-trip.
|
|
14
|
+
- Rode RSpec, branch report e RuboCop antes de enviar mudanças.
|
|
15
|
+
|
|
16
|
+
A validação exata do Mendix 5 em Windows permanece documentada como limitação
|
|
17
|
+
legada, mas não é um gate atual de entrega.
|
|
18
|
+
|
|
19
|
+
[Voltar ao índice](README.md)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Navegação e design system
|
|
2
|
+
|
|
3
|
+
**Português** · [English](../en-US/design-system.md) · [Deutsch](../de-DE/design-system.md)
|
|
4
|
+
|
|
5
|
+
Perfis são dados nativos Mendix. O MXRB lê e escreve home por página ou
|
|
6
|
+
microflow, login, título traduzido, ícone, home por papel e menus recursivos.
|
|
7
|
+
|
|
8
|
+
```ruby
|
|
9
|
+
navigation do
|
|
10
|
+
profile :Responsive, home_page: "Sales.Home", app_title: "Loja" do
|
|
11
|
+
title :en_US, "Shop"
|
|
12
|
+
home_for :Administrator, microflow: "Sales.OpenDashboard"
|
|
13
|
+
item "Pedidos", page: "Sales.Order_Overview", icon: "shopping_cart"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Ícones de navegação aceitos: `home`, `pets`/`heart`, `calendar`/
|
|
19
|
+
`calendar_today`, `user`, `search`, `settings`, `trash`, `file`, `time` e
|
|
20
|
+
`shopping_cart`. Também é possível informar diretamente um código Glyphicons
|
|
21
|
+
inteiro válido do Mendix; nomes desconhecidos falham durante a geração.
|
|
22
|
+
|
|
23
|
+
`project.design_system` inventaria propriedades CSS, variáveis Sass, temas e
|
|
24
|
+
catálogos `design-properties.json`. O lint encontra tokens ausentes, cores
|
|
25
|
+
literais e contratos de contraste abaixo do nível WCAG declarado.
|
|
26
|
+
|
|
27
|
+
Tokens declarados na DSL Ruby são materializados em
|
|
28
|
+
`theme/web/_mxrb-design-system.scss`, importado uma única vez por
|
|
29
|
+
`theme/web/main.scss`. Tokens de cor também viram propriedades `ColorPicker`
|
|
30
|
+
do Studio em `themesource/mxrb/web/design-properties.json`. Temas resolvem
|
|
31
|
+
herança e override antes da escrita; conteúdo existente do `main.scss` é
|
|
32
|
+
preservado. Ciclos, nomes inválidos e valores CSS estruturalmente inseguros são
|
|
33
|
+
rejeitados.
|
|
34
|
+
|
|
35
|
+
Themes, widgets, resources e fontes Java fazem round-trip por
|
|
36
|
+
`.mxrb/assets.json`, com SHA-256 e validação contra traversal.
|
|
37
|
+
|
|
38
|
+
Migrações de literais são preview-first:
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
plan = project.plan_design_token_migration(
|
|
42
|
+
"#3366ff" => "var(--brand-primary)"
|
|
43
|
+
)
|
|
44
|
+
plan.changes.each { puts "#{_1.path}: #{_1.occurrences}" }
|
|
45
|
+
plan.apply!
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
O apply rejeita arquivos alterados desde o preview e substitui cada arquivo
|
|
49
|
+
atomicamente.
|
|
50
|
+
|
|
51
|
+
Os mesmos fluxos estão disponíveis no CLI:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
bundle exec mxrb design scan App.mpr
|
|
55
|
+
bundle exec mxrb design scan App.mpr --json
|
|
56
|
+
bundle exec mxrb design migrate App.mpr '#3366ff' 'var(--brand-primary)'
|
|
57
|
+
bundle exec mxrb design migrate App.mpr '#3366ff' 'var(--brand-primary)' --apply
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`scan` mostra nome, valor, tipo, tema e localização de cada token, além dos
|
|
61
|
+
totais de cores literais e referências não resolvidas. `migrate` apenas mostra
|
|
62
|
+
o plano até receber `--apply`. Pares de contraste declarados na DSL continuam
|
|
63
|
+
sendo verificados por `mxrb lint` contra o nível WCAG configurado.
|
|
64
|
+
|
|
65
|
+
[Voltar ao índice](README.md)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# DSL de entidades
|
|
2
|
+
|
|
3
|
+
**Português** · [English](../en-US/entity-dsl.md) · [Deutsch](../de-DE/entity-dsl.md)
|
|
4
|
+
|
|
5
|
+
Arquivos criados por `mxrb entity new Modulo.Entidade` são avaliados dentro do
|
|
6
|
+
bloco do módulo. Por isso, a declaração usa somente o nome local:
|
|
7
|
+
|
|
8
|
+
```ruby
|
|
9
|
+
entity :Animal do
|
|
10
|
+
documentation "Animal atendido pela clínica"
|
|
11
|
+
string :Name, required: true, unique: true, length: 120,
|
|
12
|
+
default: "", documentation: "Nome de exibição"
|
|
13
|
+
integer :Age, default: 0
|
|
14
|
+
long :ExternalId
|
|
15
|
+
float :Weight
|
|
16
|
+
decimal :Balance
|
|
17
|
+
boolean :Active, default: true
|
|
18
|
+
datetime :BirthDate
|
|
19
|
+
autonumber :Sequence
|
|
20
|
+
hashstring :PasswordHash
|
|
21
|
+
binary :Document
|
|
22
|
+
enum :Species, enumeration: "VetClinic.AnimalSpecies"
|
|
23
|
+
end
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Os tipos disponíveis são `string`, `integer`, `long`, `float`, `decimal`,
|
|
27
|
+
`boolean`, `datetime`, `autonumber`, `hashstring`, `binary` e `enum`. As opções
|
|
28
|
+
comuns são `default:`, `documentation:`, `required:` e `unique:`. Strings
|
|
29
|
+
também aceitam `length:`; `enum` exige `enumeration:`. A enumeração é declarada
|
|
30
|
+
separadamente com `enumeration`; um atributo de enum usa `enum`, não
|
|
31
|
+
`enumeration`.
|
|
32
|
+
|
|
33
|
+
```ruby
|
|
34
|
+
enumeration :AnimalSpecies do
|
|
35
|
+
value :Dog, caption: "Dog"
|
|
36
|
+
value :Cat, caption: "Cat"
|
|
37
|
+
end
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Associações
|
|
41
|
+
|
|
42
|
+
O primeiro argumento é a entidade de destino qualificada. `name:` define o
|
|
43
|
+
nome estável da associação.
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
entity :Animal do
|
|
47
|
+
# Reference padrão: vários Animal podem apontar para um Owner (N:1).
|
|
48
|
+
association "VetClinic.Owner", name: "Animal_Owner"
|
|
49
|
+
|
|
50
|
+
# Reference 1:1: ambos os lados são proprietários da associação.
|
|
51
|
+
association "VetClinic.Passport", name: "Animal_Passport", owner: :Both
|
|
52
|
+
|
|
53
|
+
# ReferenceSet: muitos para muitos (N:N).
|
|
54
|
+
association "VetClinic.Tag", name: "Animal_Tags", type: :ReferenceSet
|
|
55
|
+
|
|
56
|
+
# ReferenceSet com propriedade em ambos os lados.
|
|
57
|
+
association "VetClinic.Group", name: "Animal_Groups",
|
|
58
|
+
type: :ReferenceSet, owner: :Both
|
|
59
|
+
end
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`type:` aceita `:Reference` (padrão) ou `:ReferenceSet`; `owner:` aceita
|
|
63
|
+
`:Default` (padrão) ou `:Both`.
|
|
64
|
+
|
|
65
|
+
## Índices, membros do sistema e generalização
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
entity :Animal do
|
|
69
|
+
string :Name, required: true
|
|
70
|
+
datetime :BirthDate
|
|
71
|
+
|
|
72
|
+
index :Name
|
|
73
|
+
index :BirthDate, :Name
|
|
74
|
+
|
|
75
|
+
system_members owner: true, created_date: true,
|
|
76
|
+
changed_date: true, changed_by: true
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
entity :VetUser do
|
|
80
|
+
generalizes "System.User"
|
|
81
|
+
string :Registration
|
|
82
|
+
end
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Índices são declarados dentro da entidade passando os atributos na ordem
|
|
86
|
+
desejada. `system_members` habilita os membros de sistema Mendix.
|
|
87
|
+
`generalizes` recebe a entidade base qualificada.
|
|
88
|
+
|
|
89
|
+
## Persistência, eventos e acesso
|
|
90
|
+
|
|
91
|
+
```ruby
|
|
92
|
+
entity :AnimalSearchResult do
|
|
93
|
+
non_persistent!
|
|
94
|
+
string :Name
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
entity :Animal do
|
|
98
|
+
before_commit microflow: "VetClinic.VAL_Animal"
|
|
99
|
+
after_commit microflow: "VetClinic.ACT_AfterAnimalCommit"
|
|
100
|
+
before_delete microflow: "VetClinic.VAL_DeleteAnimal"
|
|
101
|
+
after_delete microflow: "VetClinic.ACT_AfterAnimalDelete"
|
|
102
|
+
|
|
103
|
+
access_rule "VetClinic.User",
|
|
104
|
+
create: true,
|
|
105
|
+
delete: false,
|
|
106
|
+
read: :all,
|
|
107
|
+
write: %i[Name BirthDate],
|
|
108
|
+
xpath: "[Active = true()]"
|
|
109
|
+
end
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Em `access_rule`, `read:` e `write:` aceitam `:all`, `:none` ou uma lista de
|
|
113
|
+
atributos. Declare um ou mais papéis qualificados como primeiros argumentos.
|
|
114
|
+
|
|
115
|
+
Use `mxrb entity --help` para o comando e `mxrb generate project.rb` seguido de
|
|
116
|
+
`mxrb validate App.mpr` para validar o resultado.
|