mxrb 0.1.3 → 0.1.5

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 (181) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mxrb +455 -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/oql-sql.md +41 -0
  17. data/docs/pt-BR/project-structure.md +197 -2
  18. data/docs/pt-BR/runtime-ruby.md +108 -0
  19. data/docs/pt-BR/runtime-schema-migrations.md +40 -0
  20. data/docs/pt-BR/validation-matrix.md +42 -5
  21. data/lib/mxrb/cli/help.rb +426 -0
  22. data/lib/mxrb/cli/release.rb +137 -0
  23. data/lib/mxrb/compiler/compatibility_analyzer.rb +1 -1
  24. data/lib/mxrb/compiler/data_grid_bundle_compiler.rb +8 -1
  25. data/lib/mxrb/compiler/domain_document_compiler.rb +3 -0
  26. data/lib/mxrb/compiler/gallery_bundle_compiler.rb +11 -1
  27. data/lib/mxrb/compiler/generic_widget_bundle_compiler.rb +76 -19
  28. data/lib/mxrb/compiler/legacy_custom_widget_compiler.rb +159 -0
  29. data/lib/mxrb/compiler/legacy_data_grid_compiler.rb +43 -7
  30. data/lib/mxrb/compiler/legacy_page_builder.rb +1248 -23
  31. data/lib/mxrb/compiler/page_bundle_compiler.rb +13 -4
  32. data/lib/mxrb/compiler/web_bundle_builder.rb +5 -1
  33. data/lib/mxrb/compiler/web_shell_materializer.rb +42 -2
  34. data/lib/mxrb/compiler/widget_package_extractor.rb +3 -0
  35. data/lib/mxrb/domain_diagram/lifecycle.rb +272 -0
  36. data/lib/mxrb/domain_diagram.rb +409 -0
  37. data/lib/mxrb/dsl/builder.rb +43 -9
  38. data/lib/mxrb/environment.rb +226 -0
  39. data/lib/mxrb/exporter.rb +89 -15
  40. data/lib/mxrb/http/server.rb +107 -0
  41. data/lib/mxrb/initializer.rb +80 -9
  42. data/lib/mxrb/integrity/validator.rb +14 -0
  43. data/lib/mxrb/io/bson_codec.rb +42 -1
  44. data/lib/mxrb/io/mpr_file.rb +146 -3
  45. data/lib/mxrb/model/attribute.rb +3 -0
  46. data/lib/mxrb/model/entity.rb +28 -2
  47. data/lib/mxrb/model/microflow.rb +3 -1
  48. data/lib/mxrb/model/page.rb +257 -17
  49. data/lib/mxrb/model/project.rb +3 -0
  50. data/lib/mxrb/modeler/catalog.rb +178 -0
  51. data/lib/mxrb/oql/reverse_translator.rb +394 -0
  52. data/lib/mxrb/oql/server.rb +4 -8
  53. data/lib/mxrb/oql.rb +23 -1
  54. data/lib/mxrb/project_lifecycle.rb +5 -2
  55. data/lib/mxrb/ruby_app/exporter.rb +2508 -0
  56. data/lib/mxrb/ruby_app/preset.rb +506 -0
  57. data/lib/mxrb/ruby_app/session_manager.rb +122 -0
  58. data/lib/mxrb/ruby_app.rb +1369 -0
  59. data/lib/mxrb/runtime/access_control.rb +408 -0
  60. data/lib/mxrb/runtime/native.rb +1015 -93
  61. data/lib/mxrb/runtime/scheduler.rb +396 -0
  62. data/lib/mxrb/runtime/schema_migrator.rb +598 -0
  63. data/lib/mxrb/runtime/shared_store.rb +335 -0
  64. data/lib/mxrb/runtime/sqlite_store.rb +729 -0
  65. data/lib/mxrb/scaffold/generator.rb +11 -3
  66. data/lib/mxrb/uml/activity_diagram.rb +118 -0
  67. data/lib/mxrb/uml/class_diagram.rb +118 -0
  68. data/lib/mxrb/uml/sequence_diagram.rb +112 -0
  69. data/lib/mxrb/uml/server.rb +146 -0
  70. data/lib/mxrb/uml/support.rb +35 -0
  71. data/lib/mxrb/version.rb +1 -1
  72. data/lib/mxrb/web_ui/assets/abnfDiagram-N423BO3Z-C4JD3cEC.js +1 -0
  73. data/lib/mxrb/web_ui/assets/arc-3Z53kgFp.js +1 -0
  74. data/lib/mxrb/web_ui/assets/architecture-TIHT7OUA-BStBTLea.js +1 -0
  75. data/lib/mxrb/web_ui/assets/architectureDiagram-T3A2C74G-DBwqnM4J.js +36 -0
  76. data/lib/mxrb/web_ui/assets/array-BifhSqXX.js +1 -0
  77. data/lib/mxrb/web_ui/assets/blockDiagram-VBNYF7ZC-DLtuHt-j.js +132 -0
  78. data/lib/mxrb/web_ui/assets/c4Diagram-5PPSVZJV-ConSk_pe.js +10 -0
  79. data/lib/mxrb/web_ui/assets/channel-BhPvD7Dt.js +1 -0
  80. data/lib/mxrb/web_ui/assets/chunk-2GRJ4B5K-D2HpWsf_.js +1 -0
  81. data/lib/mxrb/web_ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  82. data/lib/mxrb/web_ui/assets/chunk-4I5QYGJK-CiIdNwaF.js +1 -0
  83. data/lib/mxrb/web_ui/assets/chunk-5RXB4S5H-Bu_AaEkE.js +231 -0
  84. data/lib/mxrb/web_ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  85. data/lib/mxrb/web_ui/assets/chunk-6Q2QTUOP-wQkNmt_X.js +88 -0
  86. data/lib/mxrb/web_ui/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  87. data/lib/mxrb/web_ui/assets/chunk-GF5L2VYU-G8MmiBzU.js +206 -0
  88. data/lib/mxrb/web_ui/assets/chunk-I66GZJ75-CulcrLPh.js +127 -0
  89. data/lib/mxrb/web_ui/assets/chunk-JQJVKLGR-ukjzcdlL.js +156 -0
  90. data/lib/mxrb/web_ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  91. data/lib/mxrb/web_ui/assets/chunk-KBJHAD2P-Wm35lYov.js +1 -0
  92. data/lib/mxrb/web_ui/assets/chunk-KEIR6QF5-BICK3FdT.js +161 -0
  93. data/lib/mxrb/web_ui/assets/chunk-NSK5VX7P-D2nYrCY4.js +2 -0
  94. data/lib/mxrb/web_ui/assets/chunk-QR6OTTB3-BrdIzg4Q.js +62 -0
  95. data/lib/mxrb/web_ui/assets/chunk-RYQCIY6F-CCfZMcW6.js +1 -0
  96. data/lib/mxrb/web_ui/assets/chunk-UBXNYLIW-BPEVYsFK.js +1 -0
  97. data/lib/mxrb/web_ui/assets/chunk-W5SLKNZC-2E6OPhA4.js +1 -0
  98. data/lib/mxrb/web_ui/assets/chunk-WRU74C26-CBIvOyWp.js +70 -0
  99. data/lib/mxrb/web_ui/assets/chunk-XXDRQBXY-pH58XAyl.js +1 -0
  100. data/lib/mxrb/web_ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  101. data/lib/mxrb/web_ui/assets/classDiagram-JCYQIIEL-xiqo4D89.js +1 -0
  102. data/lib/mxrb/web_ui/assets/classDiagram-v2-OCEON4UE-xiqo4D89.js +1 -0
  103. data/lib/mxrb/web_ui/assets/cose-bilkent-JH36ORCC-t_flPpii.js +1 -0
  104. data/lib/mxrb/web_ui/assets/cynefin-VYW2F7L2-BIqktTEv.js +1 -0
  105. data/lib/mxrb/web_ui/assets/cynefinDiagram-MW4NZA55-C2d--lut.js +62 -0
  106. data/lib/mxrb/web_ui/assets/cytoscape.esm-B-NFISlW.js +321 -0
  107. data/lib/mxrb/web_ui/assets/dagre-Buvkdvvj.js +1 -0
  108. data/lib/mxrb/web_ui/assets/dagre-VZM6K2ZE-CSz2_tb5.js +4 -0
  109. data/lib/mxrb/web_ui/assets/defaultLocale-BFoDCU3G.js +1 -0
  110. data/lib/mxrb/web_ui/assets/diagram-7IWD3JNH-DCt7u7V_.js +30 -0
  111. data/lib/mxrb/web_ui/assets/diagram-B4RE2ZJO-DqZBqkMu.js +3 -0
  112. data/lib/mxrb/web_ui/assets/diagram-LBJQPF4R-ClIYbIsI.js +24 -0
  113. data/lib/mxrb/web_ui/assets/diagram-Q27KOJAE-DFxhvthJ.js +24 -0
  114. data/lib/mxrb/web_ui/assets/diagram-UB23O5K3-BSUTXptv.js +41 -0
  115. data/lib/mxrb/web_ui/assets/dist-D2qOEbeJ.js +1 -0
  116. data/lib/mxrb/web_ui/assets/domain-mGOZ1KCG.css +1 -0
  117. data/lib/mxrb/web_ui/assets/domain-qsjXhy4v.js +1 -0
  118. data/lib/mxrb/web_ui/assets/ebnfDiagram-BXEA7PRR-B5reICEi.js +1 -0
  119. data/lib/mxrb/web_ui/assets/erDiagram-JOGREHBK-Co5Mxn2p.js +85 -0
  120. data/lib/mxrb/web_ui/assets/eventmodeling-45OFAUF4-C1ylhSks.js +1 -0
  121. data/lib/mxrb/web_ui/assets/flowDiagram-UKHOOZJN-CHXaJIaS.js +1 -0
  122. data/lib/mxrb/web_ui/assets/ganttDiagram-PKOTCBZU-DPPPaWaz.js +292 -0
  123. data/lib/mxrb/web_ui/assets/gitGraph-TEB2WS4Q-qS77ywA9.js +1 -0
  124. data/lib/mxrb/web_ui/assets/gitGraphDiagram-DS77QQ5N-DpAv6-BT.js +106 -0
  125. data/lib/mxrb/web_ui/assets/graphlib-DS17s2tU.js +1 -0
  126. data/lib/mxrb/web_ui/assets/info-DKCQHKI2-C9VD1Y4e.js +1 -0
  127. data/lib/mxrb/web_ui/assets/infoDiagram-6WML65LV-Bk1kbcCy.js +2 -0
  128. data/lib/mxrb/web_ui/assets/init-C-OQMol4.js +1 -0
  129. data/lib/mxrb/web_ui/assets/ishikawaDiagram-WSZJBQD7-0gcISBFR.js +70 -0
  130. data/lib/mxrb/web_ui/assets/journeyDiagram-NVQOT4AX-Dt0RQnlh.js +139 -0
  131. data/lib/mxrb/web_ui/assets/jsx-runtime-DV0a5kSb.js +9 -0
  132. data/lib/mxrb/web_ui/assets/kanban-definition-27J2QSJJ-DIPQM7w9.js +89 -0
  133. data/lib/mxrb/web_ui/assets/katex-CXMH3UgJ.js +257 -0
  134. data/lib/mxrb/web_ui/assets/line-C0rYD-tL.js +1 -0
  135. data/lib/mxrb/web_ui/assets/linear-BPPxWorj.js +1 -0
  136. data/lib/mxrb/web_ui/assets/map-BaFkSB1l.js +1 -0
  137. data/lib/mxrb/web_ui/assets/mermaid-parser.core-B_UPzTxa.js +7 -0
  138. data/lib/mxrb/web_ui/assets/mindmap-definition-FAOFIHXS-CdJRSMuk.js +96 -0
  139. data/lib/mxrb/web_ui/assets/modeler-BNqHthwk.css +1 -0
  140. data/lib/mxrb/web_ui/assets/modeler-CQmqflbg.js +1 -0
  141. data/lib/mxrb/web_ui/assets/ordinal-BDEzSJ7C.js +1 -0
  142. data/lib/mxrb/web_ui/assets/packet-7NZHBO7P-CwQ4NSBs.js +1 -0
  143. data/lib/mxrb/web_ui/assets/path-fybaL0A-.js +1 -0
  144. data/lib/mxrb/web_ui/assets/pegDiagram-VL7TDLO6-D40S7ppx.js +1 -0
  145. data/lib/mxrb/web_ui/assets/pie-RZYD4A2V-CJroHMKh.js +1 -0
  146. data/lib/mxrb/web_ui/assets/pieDiagram-7S7Q4E2Y-QB54__BV.js +39 -0
  147. data/lib/mxrb/web_ui/assets/quadrantDiagram-CIZ2JOQS-DBhDS6ag.js +7 -0
  148. data/lib/mxrb/web_ui/assets/radar-I7S5WNFK-DdIUwd2d.js +1 -0
  149. data/lib/mxrb/web_ui/assets/railroad-3IZDKUUU-B1Lw6Xyq.js +1 -0
  150. data/lib/mxrb/web_ui/assets/railroad-abnf-AHOZXSZD-CQgQoeak.js +1 -0
  151. data/lib/mxrb/web_ui/assets/railroad-ebnf-EBAXGLYW-D7qEQ2x8.js +1 -0
  152. data/lib/mxrb/web_ui/assets/railroad-peg-LSFZ7HO6-C005Vxbb.js +1 -0
  153. data/lib/mxrb/web_ui/assets/railroadDiagram-AXF67PYL-BBP2qk7M.js +1 -0
  154. data/lib/mxrb/web_ui/assets/requirementDiagram-LRYGKXZP-D2cLsAoI.js +84 -0
  155. data/lib/mxrb/web_ui/assets/rough.esm-Dy-Kn_BL.js +1 -0
  156. data/lib/mxrb/web_ui/assets/sankeyDiagram-W5VNT64P-Bpi3FiP2.js +40 -0
  157. data/lib/mxrb/web_ui/assets/sequenceDiagram-SI44F4Z6-DCRcDlVe.js +162 -0
  158. data/lib/mxrb/web_ui/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  159. data/lib/mxrb/web_ui/assets/src-CvxfUak2.js +1 -0
  160. data/lib/mxrb/web_ui/assets/stateDiagram-OKZ733FA-C2GCEoxl.js +1 -0
  161. data/lib/mxrb/web_ui/assets/stateDiagram-v2-UEYNNEHI-D2gWgedh.js +1 -0
  162. data/lib/mxrb/web_ui/assets/swimlanes-SLNWSIFB-CRI9irEW.js +2 -0
  163. data/lib/mxrb/web_ui/assets/swimlanesDiagram-ULZ7WXOC-C5Wb_-hZ.js +8 -0
  164. data/lib/mxrb/web_ui/assets/theme-_mxc7BdY.css +1 -0
  165. data/lib/mxrb/web_ui/assets/timeline-definition-Z64GVDOM-B1-mNg-h.js +120 -0
  166. data/lib/mxrb/web_ui/assets/treeView-QDETBFTQ-7CTvIwKq.js +1 -0
  167. data/lib/mxrb/web_ui/assets/treemap-6X3UGDF4-CtL22pq5.js +1 -0
  168. data/lib/mxrb/web_ui/assets/uml-C3KAFGTq.js +51 -0
  169. data/lib/mxrb/web_ui/assets/uml-Dn-qd01X.css +1 -0
  170. data/lib/mxrb/web_ui/assets/vennDiagram-T6HMQDX7-BzVnUEAy.js +34 -0
  171. data/lib/mxrb/web_ui/assets/wardley-OPB4EBWU-JNi-QNag.js +1 -0
  172. data/lib/mxrb/web_ui/assets/wardleyDiagram-T6FBY63Y-BUwmAQ-B.js +78 -0
  173. data/lib/mxrb/web_ui/assets/xychartDiagram-ELKLHX3M-DEQS8sKp.js +7 -0
  174. data/lib/mxrb/web_ui/domain.html +15 -0
  175. data/lib/mxrb/web_ui/modeler.html +16 -0
  176. data/lib/mxrb/web_ui/uml.html +31 -0
  177. data/lib/mxrb/web_ui.rb +89 -0
  178. data/lib/mxrb/widget_certification.rb +208 -0
  179. data/lib/mxrb/writer.rb +200 -24
  180. data/lib/mxrb.rb +26 -1
  181. metadata +156 -5
@@ -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.337 exemplos, zero falhas;
104
+ - 100% das linhas: 24.082/24.082;
105
+ - 100% dos branches: 9.883/9.883;
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.