mxrb 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mxrb +458 -10
  3. data/docs/de-DE/README.md +1 -0
  4. data/docs/de-DE/oql-sql.md +42 -0
  5. data/docs/de-DE/project-structure.md +201 -2
  6. data/docs/de-DE/runtime-ruby.md +104 -0
  7. data/docs/de-DE/runtime-schema-migrations.md +44 -0
  8. data/docs/de-DE/validation-matrix.md +42 -4
  9. data/docs/en-US/README.md +1 -0
  10. data/docs/en-US/oql-sql.md +41 -0
  11. data/docs/en-US/project-structure.md +192 -2
  12. data/docs/en-US/runtime-ruby.md +100 -0
  13. data/docs/en-US/runtime-schema-migrations.md +41 -0
  14. data/docs/en-US/validation-matrix.md +39 -4
  15. data/docs/pt-BR/README.md +1 -0
  16. data/docs/pt-BR/entity-dsl.md +8 -0
  17. data/docs/pt-BR/oql-sql.md +41 -0
  18. data/docs/pt-BR/project-structure.md +197 -2
  19. data/docs/pt-BR/runtime-ruby.md +108 -0
  20. data/docs/pt-BR/runtime-schema-migrations.md +40 -0
  21. data/docs/pt-BR/validation-matrix.md +42 -5
  22. data/docs/pt-BR/writing.md +28 -0
  23. data/lib/mxrb/cli/help.rb +426 -0
  24. data/lib/mxrb/cli/release.rb +137 -0
  25. data/lib/mxrb/compiler/compatibility_analyzer.rb +1 -1
  26. data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +8 -1
  27. data/lib/mxrb/compiler/domain_document_compiler.rb +3 -0
  28. data/lib/mxrb/compiler/gallery_bundle_compiler.rb +11 -1
  29. data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +76 -19
  30. data/lib/mxrb/compiler/legacy_custom_widget_compiler.rb +159 -0
  31. data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +43 -7
  32. data/lib/mxrb/compiler/legacy_page_builder.rb +1248 -23
  33. data/lib/mxrb/compiler/packager.rb +27 -13
  34. data/lib/mxrb/compiler/page_bundle_compiler.rb +13 -4
  35. data/lib/mxrb/compiler/portable_packager.rb +16 -11
  36. data/lib/mxrb/compiler/web_bundle_builder.rb +5 -1
  37. data/lib/mxrb/compiler/web_shell_materializer.rb +42 -2
  38. data/lib/mxrb/compiler/widget_package_extractor.rb +3 -0
  39. data/lib/mxrb/domain_diagram/lifecycle.rb +272 -0
  40. data/lib/mxrb/domain_diagram.rb +409 -0
  41. data/lib/mxrb/dsl/builder.rb +62 -11
  42. data/lib/mxrb/environment.rb +226 -0
  43. data/lib/mxrb/exporter.rb +265 -45
  44. data/lib/mxrb/http/server.rb +107 -0
  45. data/lib/mxrb/initializer.rb +80 -9
  46. data/lib/mxrb/integrity/validator.rb +32 -7
  47. data/lib/mxrb/io/bson_codec.rb +42 -1
  48. data/lib/mxrb/io/mpr_file.rb +146 -3
  49. data/lib/mxrb/model/attribute.rb +3 -0
  50. data/lib/mxrb/model/entity.rb +44 -2
  51. data/lib/mxrb/model/microflow.rb +3 -1
  52. data/lib/mxrb/model/module.rb +71 -0
  53. data/lib/mxrb/model/page.rb +126 -15
  54. data/lib/mxrb/model/project.rb +3 -0
  55. data/lib/mxrb/modeler/catalog.rb +178 -0
  56. data/lib/mxrb/official_marketplace/module_package_importer.rb +23 -12
  57. data/lib/mxrb/official_marketplace/widget_package_installer.rb +15 -11
  58. data/lib/mxrb/official_marketplace.rb +9 -3
  59. data/lib/mxrb/oql/reverse_translator.rb +394 -0
  60. data/lib/mxrb/oql/server.rb +4 -8
  61. data/lib/mxrb/oql.rb +32 -4
  62. data/lib/mxrb/progress.rb +242 -0
  63. data/lib/mxrb/project_lifecycle.rb +5 -2
  64. data/lib/mxrb/ruby_app/exporter.rb +1749 -0
  65. data/lib/mxrb/ruby_app/preset.rb +506 -0
  66. data/lib/mxrb/ruby_app/session_manager.rb +122 -0
  67. data/lib/mxrb/ruby_app.rb +1361 -0
  68. data/lib/mxrb/runtime/access_control.rb +408 -0
  69. data/lib/mxrb/runtime/native.rb +1015 -93
  70. data/lib/mxrb/runtime/scheduler.rb +396 -0
  71. data/lib/mxrb/runtime/schema_migrator.rb +598 -0
  72. data/lib/mxrb/runtime/shared_store.rb +335 -0
  73. data/lib/mxrb/runtime/sqlite_store.rb +729 -0
  74. data/lib/mxrb/scaffold/generator.rb +11 -3
  75. data/lib/mxrb/team_server.rb +10 -7
  76. data/lib/mxrb/uml/activity_diagram.rb +118 -0
  77. data/lib/mxrb/uml/class_diagram.rb +118 -0
  78. data/lib/mxrb/uml/sequence_diagram.rb +112 -0
  79. data/lib/mxrb/uml/server.rb +146 -0
  80. data/lib/mxrb/uml/support.rb +35 -0
  81. data/lib/mxrb/version.rb +1 -1
  82. data/lib/mxrb/web_ui/assets/abnfDiagram-N423BO3Z-C4JD3cEC.js +1 -0
  83. data/lib/mxrb/web_ui/assets/arc-3Z53kgFp.js +1 -0
  84. data/lib/mxrb/web_ui/assets/architecture-TIHT7OUA-BStBTLea.js +1 -0
  85. data/lib/mxrb/web_ui/assets/architectureDiagram-T3A2C74G-DBwqnM4J.js +36 -0
  86. data/lib/mxrb/web_ui/assets/array-BifhSqXX.js +1 -0
  87. data/lib/mxrb/web_ui/assets/blockDiagram-VBNYF7ZC-DLtuHt-j.js +132 -0
  88. data/lib/mxrb/web_ui/assets/c4Diagram-5PPSVZJV-ConSk_pe.js +10 -0
  89. data/lib/mxrb/web_ui/assets/channel-BhPvD7Dt.js +1 -0
  90. data/lib/mxrb/web_ui/assets/chunk-2GRJ4B5K-D2HpWsf_.js +1 -0
  91. data/lib/mxrb/web_ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  92. data/lib/mxrb/web_ui/assets/chunk-4I5QYGJK-CiIdNwaF.js +1 -0
  93. data/lib/mxrb/web_ui/assets/chunk-5RXB4S5H-Bu_AaEkE.js +231 -0
  94. data/lib/mxrb/web_ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  95. data/lib/mxrb/web_ui/assets/chunk-6Q2QTUOP-wQkNmt_X.js +88 -0
  96. data/lib/mxrb/web_ui/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  97. data/lib/mxrb/web_ui/assets/chunk-GF5L2VYU-G8MmiBzU.js +206 -0
  98. data/lib/mxrb/web_ui/assets/chunk-I66GZJ75-CulcrLPh.js +127 -0
  99. data/lib/mxrb/web_ui/assets/chunk-JQJVKLGR-ukjzcdlL.js +156 -0
  100. data/lib/mxrb/web_ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  101. data/lib/mxrb/web_ui/assets/chunk-KBJHAD2P-Wm35lYov.js +1 -0
  102. data/lib/mxrb/web_ui/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
  103. data/lib/mxrb/web_ui/assets/chunk-NSK5VX7P-D2nYrCY4.js +2 -0
  104. data/lib/mxrb/web_ui/assets/chunk-QR6OTTB3-BrdIzg4Q.js +62 -0
  105. data/lib/mxrb/web_ui/assets/chunk-RYQCIY6F-CCfZMcW6.js +1 -0
  106. data/lib/mxrb/web_ui/assets/chunk-UBXNYLIW-BPEVYsFK.js +1 -0
  107. data/lib/mxrb/web_ui/assets/chunk-W5SLKNZC-2E6OPhA4.js +1 -0
  108. data/lib/mxrb/web_ui/assets/chunk-WRU74C26-CBIvOyWp.js +70 -0
  109. data/lib/mxrb/web_ui/assets/chunk-XXDRQBXY-pH58XAyl.js +1 -0
  110. data/lib/mxrb/web_ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  111. data/lib/mxrb/web_ui/assets/classDiagram-JCYQIIEL-xiqo4D89.js +1 -0
  112. data/lib/mxrb/web_ui/assets/classDiagram-v2-OCEON4UE-xiqo4D89.js +1 -0
  113. data/lib/mxrb/web_ui/assets/cose-bilkent-JH36ORCC-t_flPpii.js +1 -0
  114. data/lib/mxrb/web_ui/assets/cynefin-VYW2F7L2-BIqktTEv.js +1 -0
  115. data/lib/mxrb/web_ui/assets/cynefinDiagram-MW4NZA55-C2d--lut.js +62 -0
  116. data/lib/mxrb/web_ui/assets/cytoscape.esm-B-NFISlW.js +321 -0
  117. data/lib/mxrb/web_ui/assets/dagre-Buvkdvvj.js +1 -0
  118. data/lib/mxrb/web_ui/assets/dagre-VZM6K2ZE-CSz2_tb5.js +4 -0
  119. data/lib/mxrb/web_ui/assets/defaultLocale-BFoDCU3G.js +1 -0
  120. data/lib/mxrb/web_ui/assets/diagram-7IWD3JNH-DCt7u7V_.js +30 -0
  121. data/lib/mxrb/web_ui/assets/diagram-B4RE2ZJO-DqZBqkMu.js +3 -0
  122. data/lib/mxrb/web_ui/assets/diagram-LBJQPF4R-ClIYbIsI.js +24 -0
  123. data/lib/mxrb/web_ui/assets/diagram-Q27KOJAE-DFxhvthJ.js +24 -0
  124. data/lib/mxrb/web_ui/assets/diagram-UB23O5K3-BSUTXptv.js +41 -0
  125. data/lib/mxrb/web_ui/assets/dist-D2qOEbeJ.js +1 -0
  126. data/lib/mxrb/web_ui/assets/domain-mGOZ1KCG.css +1 -0
  127. data/lib/mxrb/web_ui/assets/domain-qsjXhy4v.js +1 -0
  128. data/lib/mxrb/web_ui/assets/ebnfDiagram-BXEA7PRR-B5reICEi.js +1 -0
  129. data/lib/mxrb/web_ui/assets/erDiagram-JOGREHBK-Co5Mxn2p.js +85 -0
  130. data/lib/mxrb/web_ui/assets/eventmodeling-45OFAUF4-C1ylhSks.js +1 -0
  131. data/lib/mxrb/web_ui/assets/flowDiagram-UKHOOZJN-CHXaJIaS.js +1 -0
  132. data/lib/mxrb/web_ui/assets/ganttDiagram-PKOTCBZU-DPPPaWaz.js +292 -0
  133. data/lib/mxrb/web_ui/assets/gitGraph-TEB2WS4Q-qS77ywA9.js +1 -0
  134. data/lib/mxrb/web_ui/assets/gitGraphDiagram-DS77QQ5N-DpAv6-BT.js +106 -0
  135. data/lib/mxrb/web_ui/assets/graphlib-DS17s2tU.js +1 -0
  136. data/lib/mxrb/web_ui/assets/info-DKCQHKI2-C9VD1Y4e.js +1 -0
  137. data/lib/mxrb/web_ui/assets/infoDiagram-6WML65LV-Bk1kbcCy.js +2 -0
  138. data/lib/mxrb/web_ui/assets/init-C-OQMol4.js +1 -0
  139. data/lib/mxrb/web_ui/assets/ishikawaDiagram-WSZJBQD7-0gcISBFR.js +70 -0
  140. data/lib/mxrb/web_ui/assets/journeyDiagram-NVQOT4AX-Dt0RQnlh.js +139 -0
  141. data/lib/mxrb/web_ui/assets/jsx-runtime-DV0a5kSb.js +9 -0
  142. data/lib/mxrb/web_ui/assets/kanban-definition-27J2QSJJ-DIPQM7w9.js +89 -0
  143. data/lib/mxrb/web_ui/assets/katex-CXMH3UgJ.js +257 -0
  144. data/lib/mxrb/web_ui/assets/line-C0rYD-tL.js +1 -0
  145. data/lib/mxrb/web_ui/assets/linear-BPPxWorj.js +1 -0
  146. data/lib/mxrb/web_ui/assets/map-BaFkSB1l.js +1 -0
  147. data/lib/mxrb/web_ui/assets/mermaid-parser.core-B_UPzTxa.js +7 -0
  148. data/lib/mxrb/web_ui/assets/mindmap-definition-FAOFIHXS-CdJRSMuk.js +96 -0
  149. data/lib/mxrb/web_ui/assets/modeler-BNqHthwk.css +1 -0
  150. data/lib/mxrb/web_ui/assets/modeler-CQmqflbg.js +1 -0
  151. data/lib/mxrb/web_ui/assets/ordinal-BDEzSJ7C.js +1 -0
  152. data/lib/mxrb/web_ui/assets/packet-7NZHBO7P-CwQ4NSBs.js +1 -0
  153. data/lib/mxrb/web_ui/assets/path-fybaL0A-.js +1 -0
  154. data/lib/mxrb/web_ui/assets/pegDiagram-VL7TDLO6-D40S7ppx.js +1 -0
  155. data/lib/mxrb/web_ui/assets/pie-RZYD4A2V-CJroHMKh.js +1 -0
  156. data/lib/mxrb/web_ui/assets/pieDiagram-7S7Q4E2Y-QB54__BV.js +39 -0
  157. data/lib/mxrb/web_ui/assets/quadrantDiagram-CIZ2JOQS-DBhDS6ag.js +7 -0
  158. data/lib/mxrb/web_ui/assets/radar-I7S5WNFK-DdIUwd2d.js +1 -0
  159. data/lib/mxrb/web_ui/assets/railroad-3IZDKUUU-B1Lw6Xyq.js +1 -0
  160. data/lib/mxrb/web_ui/assets/railroad-abnf-AHOZXSZD-CQgQoeak.js +1 -0
  161. data/lib/mxrb/web_ui/assets/railroad-ebnf-EBAXGLYW-D7qEQ2x8.js +1 -0
  162. data/lib/mxrb/web_ui/assets/railroad-peg-LSFZ7HO6-C005Vxbb.js +1 -0
  163. data/lib/mxrb/web_ui/assets/railroadDiagram-AXF67PYL-BBP2qk7M.js +1 -0
  164. data/lib/mxrb/web_ui/assets/requirementDiagram-LRYGKXZP-D2cLsAoI.js +84 -0
  165. data/lib/mxrb/web_ui/assets/rough.esm-Dy-Kn_BL.js +1 -0
  166. data/lib/mxrb/web_ui/assets/sankeyDiagram-W5VNT64P-Bpi3FiP2.js +40 -0
  167. data/lib/mxrb/web_ui/assets/sequenceDiagram-SI44F4Z6-DCRcDlVe.js +162 -0
  168. data/lib/mxrb/web_ui/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  169. data/lib/mxrb/web_ui/assets/src-CvxfUak2.js +1 -0
  170. data/lib/mxrb/web_ui/assets/stateDiagram-OKZ733FA-C2GCEoxl.js +1 -0
  171. data/lib/mxrb/web_ui/assets/stateDiagram-v2-UEYNNEHI-D2gWgedh.js +1 -0
  172. data/lib/mxrb/web_ui/assets/swimlanes-SLNWSIFB-CRI9irEW.js +2 -0
  173. data/lib/mxrb/web_ui/assets/swimlanesDiagram-ULZ7WXOC-C5Wb_-hZ.js +8 -0
  174. data/lib/mxrb/web_ui/assets/theme-_mxc7BdY.css +1 -0
  175. data/lib/mxrb/web_ui/assets/timeline-definition-Z64GVDOM-B1-mNg-h.js +120 -0
  176. data/lib/mxrb/web_ui/assets/treeView-QDETBFTQ-7CTvIwKq.js +1 -0
  177. data/lib/mxrb/web_ui/assets/treemap-6X3UGDF4-CtL22pq5.js +1 -0
  178. data/lib/mxrb/web_ui/assets/uml-C3KAFGTq.js +51 -0
  179. data/lib/mxrb/web_ui/assets/uml-Dn-qd01X.css +1 -0
  180. data/lib/mxrb/web_ui/assets/vennDiagram-T6HMQDX7-BzVnUEAy.js +34 -0
  181. data/lib/mxrb/web_ui/assets/wardley-OPB4EBWU-JNi-QNag.js +1 -0
  182. data/lib/mxrb/web_ui/assets/wardleyDiagram-T6FBY63Y-BUwmAQ-B.js +78 -0
  183. data/lib/mxrb/web_ui/assets/xychartDiagram-ELKLHX3M-DEQS8sKp.js +7 -0
  184. data/lib/mxrb/web_ui/domain.html +15 -0
  185. data/lib/mxrb/web_ui/modeler.html +16 -0
  186. data/lib/mxrb/web_ui/uml.html +31 -0
  187. data/lib/mxrb/web_ui.rb +89 -0
  188. data/lib/mxrb/widget_certification.rb +208 -0
  189. data/lib/mxrb/writer.rb +278 -41
  190. data/lib/mxrb.rb +38 -8
  191. metadata +157 -5
@@ -2,8 +2,18 @@
2
2
 
3
3
  **Português** · [English](../en-US/project-structure.md) · [Deutsch](../de-DE/project-structure.md)
4
4
 
5
- A árvore produzida por `mxrb export` separa políticas globais, comportamento
6
- dos módulos, unidades nativas preservadas e assets:
5
+ `mxrb export` possui dois modos explícitos. `--mode mendix` é o padrão e mantém
6
+ a árvore Mendix em DSL por camadas. `--mode ruby` cria uma aplicação Ruby
7
+ convencional e executável com frontend React + Vite.
8
+
9
+ ## Modo Mendix
10
+
11
+ ```sh
12
+ bundle exec mxrb export App.mpr app-source --mode mendix
13
+ ```
14
+
15
+ Essa árvore separa políticas globais, comportamento dos módulos, unidades
16
+ nativas preservadas e assets:
7
17
 
8
18
  ```text
9
19
  project.rb
@@ -29,4 +39,189 @@ manifesto são gravadas.
29
39
  A estrutura suporta Ruby para um Mendix novo, Ruby sobre baseline exportado,
30
40
  Mendix para Ruby editável e Mendix → Ruby → Mendix estruturalmente equivalente.
31
41
 
42
+ ## Modo Ruby
43
+
44
+ O modo Ruby também pode começar sem um projeto Mendix existente:
45
+
46
+ ```sh
47
+ bundle exec mxrb init CustomerPortal --mode ruby
48
+ cd CustomerPortal
49
+ bundle install
50
+ npm install --prefix frontend
51
+ bundle exec mxrb run .
52
+ ```
53
+
54
+ Esse comando cria diretamente a aplicação convencional com `app/models`,
55
+ `app/dtos`, `app/services`, `app/pages` e React + Vite. Um baseline Mendix
56
+ reversível fica isolado em `.mxrb`; ele não determina a organização do código
57
+ que será editado. Para materializar o projeto atual em um MPR:
58
+
59
+ ```sh
60
+ bundle exec mxrb generate project.rb build/CustomerPortal.mpr
61
+ ```
62
+
63
+ Models Ruby novos viram entidades, DTOs viram entidades non-persistent e as
64
+ declarações bidirecionais são sincronizadas no MPR. Código Ruby ou React sem
65
+ representação Mendix nativa permanece incorporado com checksum e reaparece
66
+ intacto no próximo export. A compilação falha explicitamente quando uma mudança
67
+ estrutural não pode ser representada, evitando conversão parcial silenciosa.
68
+
69
+ Para converter um MPR que já existe, use:
70
+
71
+ ```sh
72
+ bundle exec mxrb export App.mpr app-ruby --mode ruby
73
+ ```
74
+
75
+ ```text
76
+ app/
77
+ models/
78
+ dtos/
79
+ services/
80
+ pages/
81
+ config/application.rb
82
+ frontend/
83
+ package.json
84
+ vite.config.ts
85
+ tsconfig.json
86
+ src/{main.tsx,App.tsx,types.ts,nanoflows.ts,app.css}
87
+ project.rb
88
+ .mxrb/
89
+ ruby-app.json
90
+ runtime/App.mpr
91
+ mendix/
92
+ ```
93
+
94
+ Entidades persistentes viram records. Entidades non-persistent viram classes
95
+ DTO e sempre usam o sufixo `_dto.rb`, evitando nomes ambíguos como `_2.rb`.
96
+ Services são classes Ruby comuns e inicialmente delegam ao interpretador nativo
97
+ em Ruby puro. Pages expõem metadados nativos ao frontend React + TypeScript.
98
+ O export gera `types.ts` a partir de entidades, enumerações, páginas, widgets,
99
+ contextos, efeitos e contratos de API; `npm run typecheck` integra o build Vite.
100
+
101
+ Instale as dependências Ruby e do frontend uma vez e depois suba os dois
102
+ processos com um único comando:
103
+
104
+ ```sh
105
+ bundle install
106
+ npm install --prefix frontend
107
+ bundle exec mxrb run .
108
+ ```
109
+
110
+ `mxrb run` supervisiona a API JSON Ruby em loopback, servida pelo Puma 8, e o
111
+ servidor Vite. O Vite
112
+ encaminha `/api` para Ruby. Use `--server-port` para a porta do backend e
113
+ `--client-port` para a porta do frontend. `--no-frontend` inicia somente a API.
114
+ Os nomes antigos `--api-port` e `--port` continuam como aliases compatíveis.
115
+ `--no-progress` é global e opcional; apenas oculta a saída de progresso.
116
+
117
+ Duas stacks opcionais adicionam convenções Ruby conhecidas sem alterar o modo
118
+ Ruby padrão:
119
+
120
+ ```sh
121
+ bundle exec mxrb init ServiceDesk --mode ruby --flymetothemoon
122
+ bundle exec mxrb export App.mpr app-rails --mode ruby --onrails
123
+ ```
124
+
125
+ `--flymetothemoon` adiciona Sinatra, Puma, ActiveRecord, Rake e RSpec.
126
+ `--onrails` adiciona Rails, Puma, ActiveRecord e RSpec. Ambas mantêm React +
127
+ Vite como frontend integrado da aplicação e usam o mesmo comando
128
+ `mxrb run .`. As migrations do ActiveRecord controlam apenas tabelas Ruby; o
129
+ manifesto MXRB continua autoritativo para o domain model Mendix e seus
130
+ round-trips.
131
+
132
+ ## Diagrama do domain model no browser
133
+
134
+ Abra os domain models de um ou mais módulos Mendix em um diagrama ER inspirado
135
+ no DBeaver:
136
+
137
+ ```sh
138
+ bundle exec mxrb diagram-er App.mpr --module Sales
139
+ bundle exec mxrb diagram-er App.mpr --module Sales --module Billing \
140
+ --output build/App-layout.mpr
141
+ ```
142
+
143
+ A barra lateral permite selecionar vários módulos ao mesmo tempo e mostra as
144
+ associações entre eles. A página também oferece busca de entidades,
145
+ posicionamento por drag-and-drop, zoom, ajuste à tela, auto-organização, grade,
146
+ visibilidade de atributos, rotas de relacionamento e pontos de origem/destino
147
+ arrastáveis. Entidades persistentes são azuis, DTOs/non-persistent amarelos e
148
+ OQL views verdes. **Salvar layout no MPR** grava as posições e os pontos das
149
+ associações locais nos campos Mendix nativos; âncoras cross-module, que não têm
150
+ campo BSON nativo, ficam em metadados visuais isolados do MXRB na mesma cópia
151
+ segura. A cópia padrão é `App.domain-layout.mpr`; para substituir uma saída
152
+ existente é necessário `--force`.
153
+
154
+ **Exportar PNG** baixa uma imagem em alta resolução dos módulos selecionados,
155
+ respeitando as cores, a exibição de atributos e as rotas. A exportação não modifica
156
+ o MPR; salve o layout separadamente quando as posições precisarem sobreviver ao
157
+ round-trip.
158
+
159
+ O modo direto continua disponível e ocupa o terminal até `Ctrl+C`. Para manter o
160
+ editor ER em segundo plano, use o lifecycle gerenciado, que preserva a cópia de
161
+ layout ao parar e nunca edita nem remove o MPR de origem:
162
+
163
+ ```sh
164
+ bundle exec mxrb diagram-er up App.mpr --module Sales
165
+ bundle exec mxrb diagram-er status App.mpr
166
+ bundle exec mxrb diagram-er down App.mpr
167
+ bundle exec mxrb diagram-er up App.mpr # retoma a mesma cópia
168
+ bundle exec mxrb diagram-er destroy App.mpr --yes
169
+ ```
170
+
171
+ `destroy` para o servidor e remove somente a cópia e os conteúdos externos que
172
+ esse lifecycle criou. O controle usa um endpoint privado autenticado em loopback;
173
+ estado e token ficam em arquivos locais com permissões restritas.
174
+
175
+ A interface do editor é implementada em React + TypeScript e consome somente as
176
+ APIs do servidor Ruby. O bundle Vite é compilado em `lib/mxrb/web_ui`, incluído
177
+ na gem e servido localmente; portanto Node.js não é necessário para usar o
178
+ editor instalado e nenhum CDN é acessado. Para desenvolver a interface, use
179
+ `npm install`, `npm run typecheck` e `npm run build` em `frontend/modeler`.
180
+ ER, UML, OQL e o backend genérico de `--mode ruby` compartilham o mesmo
181
+ adaptador Puma embutido. `puma ~> 8.0` é dependência direta do MXRB e traz
182
+ `nio4r ~> 2.0` transitivamente; WEBrick não faz parte da pilha HTTP.
183
+
184
+ ## Diagramas UML
185
+
186
+ UML é uma implementação adicional e independente do editor ER. Ela usa a porta
187
+ 4569 e não altera o layout do domain model. O viewer reúne diagramas de classe,
188
+ atividade de microflows e sequência de chamadas, renderizados com Mermaid:
189
+
190
+ O mesmo servidor publica `http://127.0.0.1:4569/modeler`, um catálogo visual
191
+ React + TypeScript para módulos, páginas, microflows e nanoflows, navegação,
192
+ segurança, integrações e configurações. Essa primeira superfície ampliada é
193
+ somente leitura; mutações continuam bloqueadas até terem validação e roundtrip
194
+ fail-closed equivalentes ao editor ER.
195
+
196
+ ```sh
197
+ bundle exec mxrb uml App.mpr
198
+ bundle exec mxrb uml App.mpr --export=class --module Sales
199
+ bundle exec mxrb uml App.mpr --export=activity \
200
+ --microflow=Sales.CreateOrder --format=plantuml
201
+ bundle exec mxrb uml App.mpr --export=sequence \
202
+ --root=Sales.CreateOrder --depth=3
203
+ bundle exec mxrb uml App.mpr --export=sequence --module=Sales
204
+ ```
205
+
206
+ Sem `--export`, o comando abre o viewer unificado em
207
+ `http://127.0.0.1:4569`. A exportação textual usa Mermaid por padrão; selecione
208
+ PlantUML com `--format=plantuml`. Diagramas de sequência aceitam uma raiz com
209
+ profundidade limitada ou todas as chamadas internas de um módulo. O viewer usa
210
+ o mesmo workspace React + TypeScript; Mermaid é empacotado localmente para que a
211
+ renderização também funcione offline.
212
+
213
+ ## Transições de versão e round-trips
214
+
215
+ Os dois modos mantêm IDs estáveis do Mendix e o baseline nativo completo usado
216
+ em upgrades, downgrades e round-trips repetidos. No modo Ruby, declarações de
217
+ models/DTOs são compiladas de volta no MPR. Os corpos Ruby dos services e os
218
+ fontes React são armazenados com SHA-256 em uma tabela MXRB dentro do MPR; uma
219
+ nova exportação `--mode ruby` restaura exatamente os arquivos editados.
220
+
221
+ O comportamento Mendix nativo continua autoritativo para construções que ainda
222
+ não possuem compilador semântico Ruby → Mendix. O manifesto de cobertura deixa
223
+ esse estado explícito em vez de alegar uma conversão silenciosa. O código
224
+ Ruby/React preservado sobrevive ao round-trip mesmo sem representação direta no
225
+ Studio Pro.
226
+
32
227
  [Voltar ao índice](README.md)
@@ -0,0 +1,108 @@
1
+ # Runtime sem Java
2
+
3
+ O modo Ruby executa o backend sem iniciar o Mendix Runtime Java. Ao abrir uma
4
+ aplicação exportada, o MXRB migra automaticamente um banco SQLite por ambiente,
5
+ abre o interpretador de microflows, registra lifecycle hooks, aplica segurança e
6
+ inicia os scheduled events.
7
+
8
+ ```text
9
+ config/environments/
10
+ ├── development.env
11
+ ├── qa.env
12
+ ├── staging.env
13
+ └── production.env
14
+ ```
15
+
16
+ A precedência é `ENV do processo > config/environments/<ambiente>.env >
17
+ .env.<ambiente> > .env`. Selecione o perfil com `--environment qa` ou
18
+ `MXRB_ENV=qa`. `mxrb env . --environment qa` lista somente nomes de chaves e
19
+ fontes; valores nunca são impressos.
20
+
21
+ ```bash
22
+ mxrb run . --environment qa
23
+ mxrb test App.mpr smoke.rb --native --environment qa
24
+ ```
25
+
26
+ Cada perfil usa, por padrão, `.mxrb/runtime/<ambiente>.sqlite3`. O schema deriva
27
+ de entidades, atributos, associações e system members; mudanças aditivas são
28
+ aplicadas de forma idempotente e mudanças incompatíveis usam rebuild
29
+ transacional. Entidades não persistentes continuam somente em memória.
30
+
31
+ A API Ruby oferece login e tokens bearer, sessão, schema, navigation, pages,
32
+ microflows, CRUD e published REST. Regras de página/microflow, access rules de
33
+ entidade, direitos por member e o subconjunto seguro de XPath são verificados em
34
+ cada requisição. Credenciais vêm de `MXRB_USERS_JSON` e `MXRB_AUTH_TOKENS`; use
35
+ arquivos locais ignorados pelo Git ou o secret manager do deployment.
36
+
37
+ Scheduled events usam o scheduler stdlib do MXRB, com intervalos de minuto,
38
+ hora e dia, prevenção de overlap e encerramento supervisionado. Falhas ficam
39
+ disponíveis no scheduler e não derrubam silenciosamente o servidor. Zonas IANA,
40
+ como `America/Boa_Vista`, usam `tzinfo`, inclusive nas transições de horário de
41
+ verão. Zonas desconhecidas geram erro em vez de cair silenciosamente para UTC;
42
+ `UTC`, `local` e offsets numéricos como `-04:00` também são aceitos.
43
+
44
+ Sessões e coordenação do scheduler usam por padrão o SQLite nativo compartilhado
45
+ `.mxrb/runtime/<ambiente>-shared.sqlite3`, sem serviço externo. Múltiplas
46
+ instâncias devem apontar `MXRB_SHARED_STORE_PATH` para o mesmo arquivo. Claims
47
+ idempotentes por evento/janela e leases de sobreposição renovados por heartbeat
48
+ são atômicos; um claim inacabado pode ser retomado após a expiração. O lease
49
+ padrão é de 300 segundos e pode ser alterado com `MXRB_SCHEDULER_LEASE_TTL`.
50
+ Use `:memory:`, `memory` ou `local` para ativar explicitamente o modo por processo.
51
+
52
+ Java Custom Actions não iniciam uma JVM. Cada ação permitida deve ter um adapter
53
+ Ruby explícito, registrado pelo nome qualificado em `config/adapters.rb`:
54
+
55
+ ```ruby
56
+ Mxrb::RubyApp::Registry.register_java_custom_action('Pedidos.CalcularTotal') do |arguments|
57
+ Calculador.call(
58
+ itens: arguments.fetch('Itens'),
59
+ desconto: arguments.fetch('Desconto')
60
+ )
61
+ end
62
+ ```
63
+
64
+ As chaves são os nomes dos parâmetros no modelo Mendix. Valores básicos são
65
+ avaliados no contexto do microflow; referências de entidade, microflow e
66
+ mappings são entregues como nomes qualificados. O retorno alimenta a variável
67
+ de resultado apenas quando `UseReturnVariable` está ativo (ou no formato legado
68
+ que declara somente `ResultVariableName`). Uma ação sem registro falha fechado
69
+ com seu nome e a instrução de registro; não há descoberta de classes, execução
70
+ de JAR nem fallback para a JVM. REST, app services, SOAP, mappings e geração de
71
+ documentos continuam usando os adapters Ruby por tipo. O frontend permanece
72
+ JavaScript/React no navegador, servido pelo backend Ruby sem Runtime Java.
73
+
74
+ ## Certificação Ruby → Mendix → Ruby
75
+
76
+ O cenário reproduzível de certificação fica em
77
+ [`spec/fixtures/flymetothemoon/project.rb`](../../spec/fixtures/flymetothemoon/project.rb).
78
+ Ele modela em Ruby clientes, produtos, pedidos e itens, incluindo enumeração,
79
+ índices, associações, microflows, nanoflow, scheduled event e uma página com
80
+ data grid. O teste
81
+ [`spec/flymetothemoon_roundtrip_spec.rb`](../../spec/flymetothemoon_roundtrip_spec.rb)
82
+ verifica estes casos de uso:
83
+
84
+ - gerar e validar um MPR Mendix 11.12.1 a partir da DSL Ruby;
85
+ - exportar pelo CLI real com `--mode ruby --flymetothemoon`;
86
+ - garantir que o preset contenha Sinatra, Puma, ActiveRecord e RSpec, sem
87
+ arquivos Java, JAR ou bytecode;
88
+ - executar criação, contagem, decisão, CRUD e metadados de página no Runtime
89
+ Ruby com SQLite;
90
+ - recompilar sem alterações e comparar o MPR estruturalmente com a origem;
91
+ - adicionar um atributo e substituir um microflow por Ruby idiomático;
92
+ - exportar novamente e provar que código Ruby e modelo Mendix sobrevivem a um
93
+ segundo round-trip estruturalmente idêntico.
94
+
95
+ Execute o caso isolado com:
96
+
97
+ ```bash
98
+ bundle exec rspec spec/flymetothemoon_roundtrip_spec.rb
99
+ ```
100
+
101
+ Para interfaces geradas, o cenário declarativo
102
+ [`spec/fixtures/frontend_browser/sudoku_full_flow.json`](../../spec/fixtures/frontend_browser/sudoku_full_flow.json)
103
+ é executado pelo runner `script/frontend_browser_acceptance` em Chromium real.
104
+ Ele cobre as posições 73 e 74 do tabuleiro, seleção, preenchimento e troca entre
105
+ Easy, Medium e Hard. Cada clique crítico aguarda a cadeia POST do microflow + GET
106
+ da associação e deve concluir em até 250 ms. A consulta da galeria é filtrada no
107
+ SQLite pelo contexto; objetos carregados pela associação inversa preservam o
108
+ vínculo quando somente atributos são salvos.
@@ -0,0 +1,40 @@
1
+ # Migrações do schema do runtime Ruby
2
+
3
+ `Mxrb::Runtime::SchemaMigrator` identifica entidades, atributos e associações pelo GUID de
4
+ armazenamento Mendix. Renomear um artefato mantendo o GUID preserva a tabela ou coluna e os
5
+ dados existentes.
6
+
7
+ ## Política segura
8
+
9
+ - Criação de tabela e adição de atributo opcional são automáticas e idempotentes.
10
+ - Atributos `required` são criados como `NOT NULL`.
11
+ - Tornar um atributo existente obrigatório reconstrói a tabela dentro de uma transação. Se
12
+ houver `NULL`, a migração usa o valor default declarado; sem default, ela é recusada.
13
+ - Adicionar um atributo obrigatório a uma tabela populada exige default. Em tabela vazia, a
14
+ migração pode reconstruir o schema sem backfill.
15
+ - Alterações compatíveis preservam os dados e as linhas das associações.
16
+ - Remover entidade, atributo ou associação é considerado destrutivo. Por padrão a migração
17
+ lança `Mxrb::Runtime::UnsafeSchemaMigrationError`, com os itens em `error.changes`, e não
18
+ altera o banco.
19
+ - Depois de backup e revisão do plano, a limpeza pode ser autorizada explicitamente com
20
+ `allow_destructive: true`. Somente tabelas e colunas registradas nos metadados do MXRB são
21
+ removidas; tabelas externas não são inferidas nem apagadas.
22
+
23
+ Aplicações Ruby exportadas mantêm essa opção desligada. Para uma execução controlada após o
24
+ backup, configure `MXRB_ALLOW_DESTRUCTIVE_MIGRATIONS=true` no perfil de ambiente. Qualquer
25
+ outro valor, inclusive variável ausente, mantém o modo fail-closed.
26
+
27
+ ```ruby
28
+ database = SQLite3::Database.new('runtime.sqlite3')
29
+ migrator = Mxrb::Runtime::SchemaMigrator.new(
30
+ project,
31
+ database: database,
32
+ allow_destructive: true
33
+ )
34
+ result = migrator.migrate!
35
+ puts migrator.migration_plan.changes
36
+ ```
37
+
38
+ DDL, cópia de dados, atualização dos metadados e limpeza destrutiva pertencem à mesma
39
+ transação SQLite. Qualquer violação de `NOT NULL`, unicidade ou outro erro reverte a migração
40
+ inteira.
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Português** · [English](../en-US/validation-matrix.md) · [Deutsch](../de-DE/validation-matrix.md)
4
4
 
5
- Última atualização: 5 de agosto de 2026.
5
+ Última atualização: 11 de agosto de 2026.
6
6
 
7
7
  O pipeline validado é:
8
8
 
@@ -21,6 +21,22 @@ Os originais nunca são modificados.
21
21
  | TreeviewDemo | 5.21.4 | v1 | passou |
22
22
  | GridViewPlayground | 6.10.8 | v1 | passou |
23
23
 
24
+ Em 11 de agosto, `script/validate_matrix` repetiu a matriz com **6/6 passes**:
25
+ 1.506 units, 1.734 artefatos e 3.388 referências em 16,381 s.
26
+
27
+ ## Inventário adicional local
28
+
29
+ `script/certify_mprs --cycles 2 --repair-hashes` certificou outros sete MPRs
30
+ em 14 roundtrips consecutivos: **7/7 passes**, 2.799 units, 3.238 artefatos e
31
+ 4.819 referências. Foram cobertos LearnNow, SLATaskApp, SLATaskAppNative,
32
+ MyFirstModule, CourseManager, RubyBridgeSandbox e VetClinic.
33
+
34
+ SLATaskApp tinha um hash de conteúdo obsoleto e RubyBridgeSandbox tinha dois.
35
+ O gate reparou somente `Unit.ContentsHash` em cópias temporárias, registrou os
36
+ UUIDs alterados e preservou os bytes BSON originais. Os arquivos-fonte não
37
+ foram modificados. O segundo roundtrip também detectou e corrigiu tipos de
38
+ widgets nativos desserializados como strings.
39
+
24
40
  ## Cobertura profunda editável
25
41
 
26
42
  O comparador cobre metadados, segurança, árvore de units, entidades, access
@@ -55,6 +71,27 @@ todo metamodelo Mendix. Encodings `.mxunit` desconhecidos são rejeitados em vez
55
71
  de adivinhados. A validação exata do 5.21 em Studio Pro/Windows continua sendo
56
72
  um limite explícito.
57
73
 
74
+ ## Certificação de widgets
75
+
76
+ `script/certify_widgets --browser-report REPORT.json App.mpr` é o gate para
77
+ widgets do compilador web nativo e Marketplace realmente usados. Ele exige,
78
+ em conjunto:
79
+
80
+ - compilação sem fallback de todas as páginas e layouts web;
81
+ - resolução de cada ID pluggable para um `.mjs` dentro de MPK, com SHA-256;
82
+ - materialização do modelo e build Rspack nativo da versão Mendix;
83
+ - relatório Chromium aprovado, sem exceção/fallback visível, declarando todos
84
+ os IDs e tipos de widget exercitados pelo cenário.
85
+
86
+ Importar um MPK ou concluir o bundle isoladamente não certifica comportamento.
87
+ Widgets que exigem datasource, atributo ou posição específica — por exemplo,
88
+ filtros dentro de Data Grid/Gallery — só passam quando o cenário os exercita
89
+ nesse contexto válido. Pacotes futuros ou ainda não exercitados falham como
90
+ evidência ausente, em vez de herdarem uma promessa genérica de compatibilidade.
91
+ O frontend React/TypeScript de `--mode ruby` tem uma trilha separada: seu
92
+ relatório Chromium certifica os widgets sem afirmar que os componentes
93
+ pluggable equivalentes também passaram no Runtime Mendix.
94
+
58
95
  ## Índice semântico
59
96
 
60
97
  Os seis MPRs produziram **1.778 artefatos** e **3.387 referências**. Consultas
@@ -63,9 +100,9 @@ sem MDL.
63
100
 
64
101
  ## Avaliações, cobertura e runtime
65
102
 
66
- - 1.039 exemplos, zero falhas;
67
- - 100% das linhas: 17.224/17.224;
68
- - 100% dos branches: 6.811/6.811;
103
+ - 1.329 exemplos, zero falhas;
104
+ - 100% das linhas: 23.771/23.771;
105
+ - 100% dos branches: 9.704/9.704;
69
106
  - avaliação Sudoku: 7/7 checks;
70
107
  - testes funcionais Sudoku: 3/3 localmente em 34,16 s;
71
108
  - testes funcionais Sudoku: 3/3 no Docker em 39,52 s.
@@ -80,7 +117,7 @@ e logout real. Os scaffolds `page --chain` também materializam e passam
80
117
  preflight nos três caminhos suportados; `page --template` foi exercitado em
81
118
  Runtime para dashboard e formulário vertical com CSS computado auditado.
82
119
 
83
- `script/validate_matrix` repetiu os seis round-trips, 1.506 units, em 14,760 s.
120
+ `script/validate_matrix` repetiu os seis round-trips, 1.506 units, em 16,381 s.
84
121
  `script/benchmark` mediu o pipeline Sudoku completo em 6,8463 s. O fuzzing
85
122
  determinístico cobre 250 documentos BSON aninhados e 50 arquivos `.mxunit`
86
123
  atômicos, inclusive valores binários.
@@ -5,6 +5,12 @@
5
5
  `mxrb generate` avalia uma definição Ruby e cria ou atualiza o MPR. Nomes
6
6
  Mendix são chaves estáveis, portanto reaplicar a definição não duplica units.
7
7
 
8
+ Operações demoradas exibem progresso em `stderr` quando executadas em um
9
+ terminal interativo. Quando o total é conhecido, o MXRB mostra barra e
10
+ porcentagem; operações externas sem total confiável mostram spinner e tempo
11
+ decorrido. Pipes, redirecionamentos e saídas `--json` permanecem limpos. Use
12
+ `--no-progress` ou `MXRB_PROGRESS=0` para desativar explicitamente.
13
+
8
14
  Para iniciar em uma pasta vazia:
9
15
 
10
16
  ```sh
@@ -122,6 +128,28 @@ usam `bson_binary`. Alterações nesse Ruby sobrepõem o baseline antes das escr
122
128
  tipadas. Corpos de flow possuem `body_fingerprint`: o grafo nativo é reutilizado
123
129
  quando o Ruby não mudou e regenerado após uma edição.
124
130
 
131
+ Export mappings, import mappings e JSON structures são materializados por
132
+ módulo em `infrastructure/mappings/{exports,imports,json_structures}`. Esses
133
+ arquivos mantêm `UnitID` e container/pasta originais, podem editar toda a
134
+ estrutura profunda em Ruby e têm precedência sobre o baseline durante o
135
+ `generate`.
136
+
137
+ Serviços REST, OData e web services publicados são exportados para
138
+ `infrastructure/endpoints`; recursos, operações, métodos HTTP, paths,
139
+ parâmetros e referências a microflows permanecem no mesmo arquivo Ruby.
140
+ Serviços consumidos são roteados para `infrastructure/integrations`, enquanto
141
+ message definitions e XML schemas ficam em `infrastructure/mappings`.
142
+
143
+ O Domain Model exportado separa entidades persistentes em `domain/entities`,
144
+ DTOs/non-persistent em `domain/dtos` e entidades de OQL View em
145
+ `domain/oql_views`. O arquivo da OQL View também contém seu
146
+ `DomainModels$ViewEntitySourceDocument`, portanto a consulta `Oql` pode ser
147
+ editada no mesmo Ruby sem perder a referência da entidade. Datasets OQL ficam
148
+ em `application/queries/datasets`; enumerations e constants ficam em
149
+ `domain/enumerations` e `domain/constants`. Scheduled events ficam em
150
+ `application/jobs/scheduled_events`. O `domain/model.rb` e o
151
+ `application/application.rb` carregam automaticamente todas essas categorias.
152
+
125
153
  A DSL cobre criação/alteração/retrieve/commit/delete, chamadas de microflow,
126
154
  Java, JavaScript, nanoflow e app service, páginas, REST, listas, decisões,
127
155
  loops, eventos de erro e rescue.