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.
Files changed (237) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.de-DE.md +108 -0
  4. data/README.md +172 -0
  5. data/README.pt-BR.md +109 -0
  6. data/bin/mxrb +1613 -0
  7. data/docs/README.md +10 -0
  8. data/docs/de-DE/README.md +24 -0
  9. data/docs/de-DE/architectural-patterns.md +26 -0
  10. data/docs/de-DE/architectural-standard.md +48 -0
  11. data/docs/de-DE/architecture.md +76 -0
  12. data/docs/de-DE/compiler.md +162 -0
  13. data/docs/de-DE/conventions.md +19 -0
  14. data/docs/de-DE/design-system.md +52 -0
  15. data/docs/de-DE/entity-dsl.md +53 -0
  16. data/docs/de-DE/native-runtime-quality-report.md +74 -0
  17. data/docs/de-DE/oql-sql.md +211 -0
  18. data/docs/de-DE/platform-api-integration.md +36 -0
  19. data/docs/de-DE/platform-operations.md +243 -0
  20. data/docs/de-DE/project-structure.md +32 -0
  21. data/docs/de-DE/ruby-first-roadmap.md +116 -0
  22. data/docs/de-DE/scaffolds.md +59 -0
  23. data/docs/de-DE/semantic-refactoring.md +56 -0
  24. data/docs/de-DE/team-server.md +33 -0
  25. data/docs/de-DE/validation-matrix.md +64 -0
  26. data/docs/de-DE/vetclinic-acceptance.md +24 -0
  27. data/docs/de-DE/writing.md +138 -0
  28. data/docs/en-US/README.md +24 -0
  29. data/docs/en-US/architectural-patterns.md +151 -0
  30. data/docs/en-US/architectural-standard.md +89 -0
  31. data/docs/en-US/architecture.md +170 -0
  32. data/docs/en-US/compiler.md +157 -0
  33. data/docs/en-US/conventions.md +82 -0
  34. data/docs/en-US/design-system.md +163 -0
  35. data/docs/en-US/entity-dsl.md +53 -0
  36. data/docs/en-US/native-runtime-quality-report.md +73 -0
  37. data/docs/en-US/oql-sql.md +201 -0
  38. data/docs/en-US/platform-api-integration.md +36 -0
  39. data/docs/en-US/platform-operations.md +244 -0
  40. data/docs/en-US/project-structure.md +49 -0
  41. data/docs/en-US/ruby-first-roadmap.md +186 -0
  42. data/docs/en-US/scaffolds.md +57 -0
  43. data/docs/en-US/semantic-refactoring.md +198 -0
  44. data/docs/en-US/team-server.md +32 -0
  45. data/docs/en-US/validation-matrix.md +257 -0
  46. data/docs/en-US/vetclinic-acceptance.md +23 -0
  47. data/docs/en-US/writing.md +655 -0
  48. data/docs/pt-BR/README.md +24 -0
  49. data/docs/pt-BR/architectural-patterns.md +25 -0
  50. data/docs/pt-BR/architectural-standard.md +533 -0
  51. data/docs/pt-BR/architecture.md +300 -0
  52. data/docs/pt-BR/compiler.md +162 -0
  53. data/docs/pt-BR/conventions.md +19 -0
  54. data/docs/pt-BR/design-system.md +65 -0
  55. data/docs/pt-BR/entity-dsl.md +116 -0
  56. data/docs/pt-BR/native-runtime-quality-report.md +73 -0
  57. data/docs/pt-BR/oql-sql.md +208 -0
  58. data/docs/pt-BR/platform-api-integration.md +36 -0
  59. data/docs/pt-BR/platform-operations.md +260 -0
  60. data/docs/pt-BR/project-structure.md +32 -0
  61. data/docs/pt-BR/ruby-first-roadmap.md +239 -0
  62. data/docs/pt-BR/scaffolds.md +104 -0
  63. data/docs/pt-BR/semantic-refactoring.md +55 -0
  64. data/docs/pt-BR/team-server.md +59 -0
  65. data/docs/pt-BR/validation-matrix.md +86 -0
  66. data/docs/pt-BR/vetclinic-acceptance.md +50 -0
  67. data/docs/pt-BR/writing.md +177 -0
  68. data/examples/sudoku_evaluation.rb +14 -0
  69. data/examples/sudoku_functional_test.rb +28 -0
  70. data/lib/mxrb/architecture/graph.rb +124 -0
  71. data/lib/mxrb/architecture/validator.rb +98 -0
  72. data/lib/mxrb/benchmark.rb +33 -0
  73. data/lib/mxrb/compare.rb +390 -0
  74. data/lib/mxrb/compiler/adapter.rb +96 -0
  75. data/lib/mxrb/compiler/artifact_document_compiler.rb +102 -0
  76. data/lib/mxrb/compiler/artifact_materializer.rb +53 -0
  77. data/lib/mxrb/compiler/client_model_materializer.rb +42 -0
  78. data/lib/mxrb/compiler/code_action_document_compiler.rb +64 -0
  79. data/lib/mxrb/compiler/code_action_materializer.rb +35 -0
  80. data/lib/mxrb/compiler/code_action_type_compiler.rb +32 -0
  81. data/lib/mxrb/compiler/combo_box_bundle_compiler.rb +314 -0
  82. data/lib/mxrb/compiler/compatibility_analyzer.rb +169 -0
  83. data/lib/mxrb/compiler/constants_materializer.rb +111 -0
  84. data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +290 -0
  85. data/lib/mxrb/compiler/database_connector_action_compiler.rb +280 -0
  86. data/lib/mxrb/compiler/deployment_asset_copier.rb +60 -0
  87. data/lib/mxrb/compiler/deployment_bootstrapper.rb +208 -0
  88. data/lib/mxrb/compiler/deployment_materializer.rb +43 -0
  89. data/lib/mxrb/compiler/deployment_metadata.rb +64 -0
  90. data/lib/mxrb/compiler/domain_document_compiler.rb +153 -0
  91. data/lib/mxrb/compiler/domain_model_materializer.rb +35 -0
  92. data/lib/mxrb/compiler/domain_security_compiler.rb +82 -0
  93. data/lib/mxrb/compiler/gallery_bundle_compiler.rb +190 -0
  94. data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +281 -0
  95. data/lib/mxrb/compiler/image_bundle_compiler.rb +216 -0
  96. data/lib/mxrb/compiler/java_proxy_generator.rb +509 -0
  97. data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +267 -0
  98. data/lib/mxrb/compiler/legacy_page_builder.rb +287 -0
  99. data/lib/mxrb/compiler/mda.rb +99 -0
  100. data/lib/mxrb/compiler/microflow_document_compiler.rb +85 -0
  101. data/lib/mxrb/compiler/microflow_materializer.rb +48 -0
  102. data/lib/mxrb/compiler/microflow_node_compiler.rb +250 -0
  103. data/lib/mxrb/compiler/model_package.rb +116 -0
  104. data/lib/mxrb/compiler/model_values.rb +67 -0
  105. data/lib/mxrb/compiler/nanoflow_program_compiler.rb +483 -0
  106. data/lib/mxrb/compiler/navigation_document_compiler.rb +93 -0
  107. data/lib/mxrb/compiler/packager.rb +100 -0
  108. data/lib/mxrb/compiler/page_bundle_builder.rb +56 -0
  109. data/lib/mxrb/compiler/page_bundle_compiler.rb +2004 -0
  110. data/lib/mxrb/compiler/page_document_compiler.rb +77 -0
  111. data/lib/mxrb/compiler/portable_packager.rb +356 -0
  112. data/lib/mxrb/compiler/project_jar_archive.rb +84 -0
  113. data/lib/mxrb/compiler/project_jar_builder.rb +121 -0
  114. data/lib/mxrb/compiler/project_materializer.rb +139 -0
  115. data/lib/mxrb/compiler/project_model_orderer.rb +52 -0
  116. data/lib/mxrb/compiler/runtime_data_types.rb +31 -0
  117. data/lib/mxrb/compiler/runtime_model_schema.rb +90 -0
  118. data/lib/mxrb/compiler/schemas/runtime-10.24.0.73019.json +1052 -0
  119. data/lib/mxrb/compiler/schemas/runtime-11.json +1215 -0
  120. data/lib/mxrb/compiler/schemas/runtime-6.10.8.json +1148 -0
  121. data/lib/mxrb/compiler/schemas/runtime-7.17.0.json +1144 -0
  122. data/lib/mxrb/compiler/schemas/runtime-7.5.0.json +1215 -0
  123. data/lib/mxrb/compiler/schemas/runtime-9.6.1.29396.json +868 -0
  124. data/lib/mxrb/compiler/schemas/system-model-10.24.0.73019.b64 +1135 -0
  125. data/lib/mxrb/compiler/schemas/system-model-11.12.1.b64 +815 -0
  126. data/lib/mxrb/compiler/schemas/system-model-6.10.8.b64 +497 -0
  127. data/lib/mxrb/compiler/schemas/system-model-7.17.0.b64 +519 -0
  128. data/lib/mxrb/compiler/schemas/system-model-7.5.0.b64 +504 -0
  129. data/lib/mxrb/compiler/schemas/system-model-9.6.1.29396.b64 +816 -0
  130. data/lib/mxrb/compiler/security_materializer.rb +104 -0
  131. data/lib/mxrb/compiler/settings_document_compiler.rb +45 -0
  132. data/lib/mxrb/compiler/settings_materializer.rb +25 -0
  133. data/lib/mxrb/compiler/source_model.rb +128 -0
  134. data/lib/mxrb/compiler/system_model_seed.rb +88 -0
  135. data/lib/mxrb/compiler/system_queue_materializer.rb +54 -0
  136. data/lib/mxrb/compiler/system_text_materializer.rb +49 -0
  137. data/lib/mxrb/compiler/translation_materializer.rb +95 -0
  138. data/lib/mxrb/compiler/web_bundle_builder.rb +155 -0
  139. data/lib/mxrb/compiler/web_list_data_source.rb +139 -0
  140. data/lib/mxrb/compiler/web_operation_compiler.rb +614 -0
  141. data/lib/mxrb/compiler/web_shell_materializer.rb +194 -0
  142. data/lib/mxrb/compiler/widget_package_extractor.rb +63 -0
  143. data/lib/mxrb/doctor.rb +116 -0
  144. data/lib/mxrb/dsl/builder.rb +1636 -0
  145. data/lib/mxrb/errors.rb +18 -0
  146. data/lib/mxrb/evaluation.rb +131 -0
  147. data/lib/mxrb/exporter.rb +1716 -0
  148. data/lib/mxrb/frontend/migrator.rb +775 -0
  149. data/lib/mxrb/functional.rb +307 -0
  150. data/lib/mxrb/github/annotator.rb +161 -0
  151. data/lib/mxrb/initializer.rb +257 -0
  152. data/lib/mxrb/integrity/validator.rb +136 -0
  153. data/lib/mxrb/io/bson_codec.rb +145 -0
  154. data/lib/mxrb/io/mpr_file.rb +558 -0
  155. data/lib/mxrb/io/mxunit_codec.rb +42 -0
  156. data/lib/mxrb/marketplace.rb +380 -0
  157. data/lib/mxrb/model/association.rb +98 -0
  158. data/lib/mxrb/model/attribute.rb +100 -0
  159. data/lib/mxrb/model/connector.rb +17 -0
  160. data/lib/mxrb/model/design_materializer.rb +133 -0
  161. data/lib/mxrb/model/design_migration.rb +126 -0
  162. data/lib/mxrb/model/design_system.rb +111 -0
  163. data/lib/mxrb/model/domain_model.rb +51 -0
  164. data/lib/mxrb/model/entity.rb +180 -0
  165. data/lib/mxrb/model/menu.rb +38 -0
  166. data/lib/mxrb/model/microflow.rb +100 -0
  167. data/lib/mxrb/model/module.rb +142 -0
  168. data/lib/mxrb/model/navigation.rb +127 -0
  169. data/lib/mxrb/model/page.rb +410 -0
  170. data/lib/mxrb/model/project.rb +187 -0
  171. data/lib/mxrb/model/unit.rb +48 -0
  172. data/lib/mxrb/module_initializer.rb +75 -0
  173. data/lib/mxrb/official_marketplace/content_api.rb +292 -0
  174. data/lib/mxrb/official_marketplace/dependency_resolver.rb +329 -0
  175. data/lib/mxrb/official_marketplace/lifecycle.rb +367 -0
  176. data/lib/mxrb/official_marketplace/module_package_importer.rb +318 -0
  177. data/lib/mxrb/official_marketplace/widget_package_installer.rb +414 -0
  178. data/lib/mxrb/official_marketplace.rb +720 -0
  179. data/lib/mxrb/oql/analyzer.rb +155 -0
  180. data/lib/mxrb/oql/index_advisor.rb +85 -0
  181. data/lib/mxrb/oql/plan_analyzer.rb +185 -0
  182. data/lib/mxrb/oql/server.rb +132 -0
  183. data/lib/mxrb/oql/sql_server_plan_analyzer.rb +190 -0
  184. data/lib/mxrb/oql/sql_server_workload_analyzer.rb +80 -0
  185. data/lib/mxrb/oql/workload_analyzer.rb +175 -0
  186. data/lib/mxrb/oql/workload_baseline.rb +60 -0
  187. data/lib/mxrb/oql.rb +424 -0
  188. data/lib/mxrb/project_lifecycle.rb +76 -0
  189. data/lib/mxrb/protocols/plan.rb +86 -0
  190. data/lib/mxrb/protocols.rb +123 -0
  191. data/lib/mxrb/runtime/database_workspace.rb +677 -0
  192. data/lib/mxrb/runtime/docker_executor.rb +41 -0
  193. data/lib/mxrb/runtime/docker_workspace.rb +29 -0
  194. data/lib/mxrb/runtime/executor.rb +169 -0
  195. data/lib/mxrb/runtime/java_locator.rb +26 -0
  196. data/lib/mxrb/runtime/native.rb +474 -0
  197. data/lib/mxrb/runtime/sql_server_database.rb +146 -0
  198. data/lib/mxrb/runtime/toolchain.rb +82 -0
  199. data/lib/mxrb/scaffold/cli.rb +113 -0
  200. data/lib/mxrb/scaffold/generator.rb +246 -0
  201. data/lib/mxrb/scaffold/help.rb +80 -0
  202. data/lib/mxrb/scaffold/page_templates.rb +54 -0
  203. data/lib/mxrb/scaffold/recipes.rb +198 -0
  204. data/lib/mxrb/scaffold/registry.rb +82 -0
  205. data/lib/mxrb/scaffold/templates.rb +723 -0
  206. data/lib/mxrb/scaffold/transaction.rb +84 -0
  207. data/lib/mxrb/schema/tables.rb +55 -0
  208. data/lib/mxrb/semantic/analyzer.rb +473 -0
  209. data/lib/mxrb/semantic/batch_plan.rb +68 -0
  210. data/lib/mxrb/semantic/domain_mutator.rb +419 -0
  211. data/lib/mxrb/semantic/embedder.rb +51 -0
  212. data/lib/mxrb/semantic/extractor.rb +290 -0
  213. data/lib/mxrb/semantic/index.rb +623 -0
  214. data/lib/mxrb/semantic/inliner.rb +216 -0
  215. data/lib/mxrb/semantic/mover.rb +153 -0
  216. data/lib/mxrb/semantic/onnx_embedder.rb +34 -0
  217. data/lib/mxrb/semantic/remover.rb +70 -0
  218. data/lib/mxrb/semantic/renamer.rb +211 -0
  219. data/lib/mxrb/semantic/tfidf_embedder.rb +46 -0
  220. data/lib/mxrb/semantic/vec_store.rb +75 -0
  221. data/lib/mxrb/team_server.rb +390 -0
  222. data/lib/mxrb/templates/project/10.24.0.73019.json +32 -0
  223. data/lib/mxrb/templates/project/11.12.1.json +32 -0
  224. data/lib/mxrb/templates/project/6.10.8.json +50 -0
  225. data/lib/mxrb/templates/project/7.17.0.json +50 -0
  226. data/lib/mxrb/templates/project/7.5.0.json +50 -0
  227. data/lib/mxrb/templates/project/9.6.1.29396.json +50 -0
  228. data/lib/mxrb/version.rb +5 -0
  229. data/lib/mxrb/widget_package.rb +338 -0
  230. data/lib/mxrb/widget_synchronizer.rb +31 -0
  231. data/lib/mxrb/writer.rb +3775 -0
  232. data/lib/mxrb.rb +188 -0
  233. data/marketplace/catalog.json +10 -0
  234. data/marketplace/modules/shared-kernel/domain/README.md +4 -0
  235. data/marketplace/modules/shared-kernel/module.rb +5 -0
  236. data/marketplace/modules/shared-kernel/mxrb-module.json +9 -0
  237. 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.