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,723 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mxrb
4
+ module Scaffold
5
+ # Source templates used by artifact scaffolds.
6
+ # rubocop:disable Metrics/ModuleLength
7
+ module Templates
8
+ module_function
9
+
10
+ ENTITY_GUIDE = 'https://github.com/lucamykael/mxrb/blob/main/docs/pt-BR/entity-dsl.md'
11
+
12
+ def render(kind, module_name: nil, name: nil, **options)
13
+ public_send(kind, module_name, name, **options)
14
+ end
15
+
16
+ def entity(_module_name, name)
17
+ <<~RUBY
18
+ # frozen_string_literal: true
19
+
20
+ # Entity DSL reference: #{ENTITY_GUIDE}
21
+ entity :#{name} do
22
+ end
23
+ RUBY
24
+ end
25
+
26
+ def enumeration(_module_name, name)
27
+ <<~RUBY
28
+ # frozen_string_literal: true
29
+
30
+ enumeration :#{name} do
31
+ # value :Example, caption: "Example"
32
+ end
33
+ RUBY
34
+ end
35
+
36
+ def use_case(_module_name, name) = flow(name, 'Application use case', entry_point: true)
37
+ def validation(_module_name, name) = flow(name, 'Application validation')
38
+
39
+ def query(_module_name, name)
40
+ <<~RUBY
41
+ # frozen_string_literal: true
42
+
43
+ query :#{name} do
44
+ mark_as_used
45
+ end
46
+ RUBY
47
+ end
48
+
49
+ def page(module_name, name)
50
+ <<~RUBY
51
+ # frozen_string_literal: true
52
+
53
+ page :#{name} do
54
+ title "#{humanize(name)}"
55
+ layout "#{module_name}.ApplicationLayout"
56
+ # allowed_roles "Module.User"
57
+
58
+ container :pageHeader, class_name: "mxrb-page-header" do
59
+ text :pageTitle, caption: "#{humanize(name)}"
60
+ end
61
+ end
62
+ RUBY
63
+ end
64
+
65
+ def nanoflow(_module_name, name)
66
+ <<~RUBY
67
+ # frozen_string_literal: true
68
+
69
+ nanoflow :#{name} do
70
+ mark_as_used
71
+ end
72
+ RUBY
73
+ end
74
+
75
+ def page_chain_entity(_module_name, name)
76
+ <<~RUBY
77
+ # frozen_string_literal: true
78
+
79
+ # Executable vertical slice generated by `mxrb page --chain`.
80
+ entity :#{name} do
81
+ string :Reference, length: 80
82
+ decimal :Total, default: 0
83
+ boolean :Active, default: true
84
+ end
85
+ RUBY
86
+ end
87
+
88
+ def page_chain_loader(module_name, name)
89
+ feature = name.to_s.delete_prefix('ACT_Load')
90
+ <<~RUBY
91
+ # frozen_string_literal: true
92
+
93
+ microflow :#{name} do
94
+ mark_as_used
95
+ return_type :#{feature}
96
+ create_object "#{module_name}.#{feature}", as: :record,
97
+ set: { Reference: "'NEW'", Total: 0, Active: true }
98
+ return_value :record
99
+ end
100
+ RUBY
101
+ end
102
+
103
+ def page_chain_action(_module_name, name)
104
+ feature = name.to_s.delete_prefix('ACT_Refresh')
105
+ <<~RUBY
106
+ # frozen_string_literal: true
107
+
108
+ microflow :#{name} do
109
+ mark_as_used
110
+ log_message "#{humanize(feature)} refreshed from the page scaffold"
111
+ end
112
+ RUBY
113
+ end
114
+
115
+ def page_chain_nanoflow(_module_name, name)
116
+ feature = name.to_s.delete_prefix('NAN_Refresh')
117
+ <<~RUBY
118
+ # frozen_string_literal: true
119
+
120
+ nanoflow :#{name} do
121
+ mark_as_used
122
+ show_message "#{humanize(feature)} refreshed", type: :information
123
+ end
124
+ RUBY
125
+ end
126
+
127
+ def page_chain_client_server(module_name, name)
128
+ feature = name.to_s.delete_prefix('NAN_Refresh')
129
+ <<~RUBY
130
+ # frozen_string_literal: true
131
+
132
+ nanoflow :#{name} do
133
+ mark_as_used
134
+ call_microflow "#{module_name}.ACT_Refresh#{feature}"
135
+ show_message "#{humanize(feature)} refreshed", type: :information
136
+ end
137
+ RUBY
138
+ end
139
+
140
+ def page_from_template(module_name, name, template:, refresh_action: nil)
141
+ public_send("page_template_#{template.tr('-', '_')}", module_name, name, refresh_action)
142
+ end
143
+
144
+ def page_template_starter(module_name, name, refresh_action)
145
+ <<~RUBY
146
+ # frozen_string_literal: true
147
+
148
+ page :#{name} do
149
+ title "#{humanize(name)}"
150
+ layout "#{module_name}.ApplicationLayout"
151
+
152
+ container :pageHeader, class_name: "mxrb-page-header" do
153
+ text :pageTitle, caption: "#{humanize(name)}"
154
+ text :pageSubtitle, caption: "Page generated from the starter template"
155
+ end
156
+ #{refresh_button(refresh_action)}
157
+ end
158
+ RUBY
159
+ end
160
+
161
+ def page_template_blank(module_name, name, refresh_action)
162
+ <<~RUBY
163
+ # frozen_string_literal: true
164
+
165
+ page :#{name} do
166
+ title "#{humanize(name)}"
167
+ layout "#{module_name}.ApplicationLayout"
168
+
169
+ container :content, class_name: "mxrb-page-content" do
170
+ #{refresh_button(refresh_action, indentation: 4)}
171
+ end
172
+ end
173
+ RUBY
174
+ end
175
+
176
+ def page_template_dashboard(module_name, name, refresh_action)
177
+ <<~RUBY
178
+ # frozen_string_literal: true
179
+
180
+ page :#{name} do
181
+ title "#{humanize(name)}"
182
+ layout "#{module_name}.ApplicationLayout"
183
+
184
+ container :pageHeader, class_name: "mxrb-page-header" do
185
+ text :pageTitle, caption: "#{humanize(name)}"
186
+ text :pageSubtitle, caption: "Dashboard overview"
187
+ end
188
+
189
+ container :dashboard, class_name: "mxrb-dashboard-grid" do
190
+ container(:primaryMetric, class_name: "mxrb-card") do
191
+ text :primaryLabel, caption: "PRIMARY"
192
+ text :primaryValue, caption: "0"
193
+ text :primaryHelp, caption: "Connect this card to your domain data."
194
+ end
195
+ container(:secondaryMetric, class_name: "mxrb-card") do
196
+ text :secondaryLabel, caption: "SECONDARY"
197
+ text :secondaryValue, caption: "0"
198
+ text :secondaryHelp, caption: "Replace this metric with a business signal."
199
+ end
200
+ container(:activityMetric, class_name: "mxrb-card") do
201
+ text :activityLabel, caption: "ACTIVITY"
202
+ text :activityValue, caption: "Ready"
203
+ text :activityHelp, caption: "Add charts, lists or actions here."
204
+ end
205
+ end
206
+ #{refresh_button(refresh_action)}
207
+ end
208
+ RUBY
209
+ end
210
+
211
+ def page_template_form_vertical(module_name, name, refresh_action)
212
+ <<~RUBY
213
+ # frozen_string_literal: true
214
+
215
+ page :#{name} do
216
+ title "#{humanize(name)}"
217
+ layout "#{module_name}.ApplicationLayout"
218
+ data_source microflow: "#{module_name}.ACT_Load#{name}"
219
+
220
+ container :pageHeader, class_name: "mxrb-page-header" do
221
+ text :pageTitle, caption: "#{humanize(name)}"
222
+ text :pageSubtitle, caption: "Executable page scaffold"
223
+ end
224
+
225
+ container :form, class_name: "mxrb-card" do
226
+ text_box :reference, attribute: :Reference, caption: "Reference"
227
+ number_input :total, attribute: :Total, caption: "Total"
228
+ check_box :active, attribute: :Active, caption: "Active"
229
+
230
+ button :save, caption: "Save" do
231
+ on_click action: :save_changes
232
+ end
233
+ button :cancel, caption: "Cancel" do
234
+ on_click action: :cancel_changes
235
+ end
236
+ #{refresh_button(refresh_action, indentation: 4)}
237
+ end
238
+ end
239
+ RUBY
240
+ end
241
+
242
+ def refresh_button(action, indentation: 2)
243
+ return '' unless action
244
+
245
+ indent = ' ' * indentation
246
+ <<~RUBY.lines.map { "#{indent}#{_1}" }.join.rstrip
247
+ button :refresh, caption: "Refresh" do
248
+ on_click #{action}
249
+ end
250
+ RUBY
251
+ end
252
+
253
+ def page_chain_navigation(module_name, name)
254
+ <<~RUBY
255
+ # frozen_string_literal: true
256
+
257
+ item "#{humanize(name)}", page: "#{module_name}.#{name}", icon: "file"
258
+ RUBY
259
+ end
260
+
261
+ def repository(module_name, name)
262
+ <<~RUBY
263
+ # frozen_string_literal: true
264
+
265
+ repository :#{name}, implementation: "#{module_name}.#{name}Implementation"
266
+ RUBY
267
+ end
268
+
269
+ def repository_implementation(_module_name, name)
270
+ flow("#{name}Implementation", 'Infrastructure repository adapter', entry_point: true)
271
+ end
272
+
273
+ def security(module_name, _name)
274
+ <<~RUBY
275
+ # frozen_string_literal: true
276
+
277
+ module_role :User, description: "Application user"
278
+ module_role :Administrator, description: "Module administrator"
279
+
280
+ # Add access_rule declarations inside each entity.
281
+ # Example: access_rule "#{module_name}.User", read: :all
282
+ RUBY
283
+ end
284
+
285
+ def project_security(module_name, _name)
286
+ <<~RUBY
287
+ security do
288
+ security_level "CheckEverything"
289
+ user_role :User, module_roles: ["#{module_name}.User"]
290
+ user_role :Administrator,
291
+ module_roles: ["#{module_name}.Administrator"], admin: true
292
+ end
293
+ RUBY
294
+ end
295
+
296
+ def scheduled_event(module_name, name)
297
+ <<~RUBY
298
+ # frozen_string_literal: true
299
+
300
+ microflow :#{name} do
301
+ end
302
+
303
+ scheduled_event :#{name}, microflow: "#{module_name}.#{name}",
304
+ interval: 1, unit: :days, enabled: true
305
+ RUBY
306
+ end
307
+
308
+ def constant(_module_name, name)
309
+ <<~RUBY
310
+ # frozen_string_literal: true
311
+
312
+ constant :#{name}, type: :string, value: ""
313
+ RUBY
314
+ end
315
+
316
+ def integration(_module_name, name) = flow(name, 'Infrastructure integration adapter', entry_point: true)
317
+
318
+ def published_rest(_module_name, name)
319
+ <<~RUBY
320
+ # frozen_string_literal: true
321
+
322
+ # Handler scaffold. Publishing the REST document currently remains a
323
+ # native Studio Pro/baseline operation; this microflow is editable Ruby.
324
+ microflow :#{name}, kind: :infrastructure, public: true do
325
+ documentation "Published REST handler #{humanize(name)}"
326
+ mark_as_used
327
+ end
328
+ RUBY
329
+ end
330
+
331
+ def consumed_rest(_module_name, name)
332
+ <<~RUBY
333
+ # frozen_string_literal: true
334
+
335
+ microflow :#{name}, kind: :infrastructure do
336
+ mark_as_used
337
+ # call_rest method: :get, location: "https://api.example.test/resource"
338
+ end
339
+ RUBY
340
+ end
341
+
342
+ def java_action(_module_name, name)
343
+ <<~RUBY
344
+ # frozen_string_literal: true
345
+
346
+ # Adapter scaffold. Define the Java Action in the native baseline,
347
+ # then uncomment and qualify the call below.
348
+ microflow :#{name}, kind: :infrastructure do
349
+ mark_as_used
350
+ # call_java "Module.JavaActionName"
351
+ end
352
+ RUBY
353
+ end
354
+
355
+ def functional_test(module_name, name)
356
+ <<~RUBY
357
+ # frozen_string_literal: true
358
+
359
+ microflow "#{humanize(name)}",
360
+ call: "#{module_name}.#{name}",
361
+ expect: {}
362
+ RUBY
363
+ end
364
+
365
+ def evaluation(_module_name, name)
366
+ <<~RUBY
367
+ # frozen_string_literal: true
368
+
369
+ no_call_cycles
370
+ no_missing_internal_references
371
+
372
+ check "#{humanize(name)}" do |_project|
373
+ true
374
+ end
375
+ RUBY
376
+ end
377
+
378
+ def design_system(_module_name, _name)
379
+ <<~RUBY
380
+ # frozen_string_literal: true
381
+
382
+ design_system do
383
+ # color :primary, value: "#1a1a1a"
384
+ # spacing :medium, value: "1rem"
385
+ forbid_literal_colors false
386
+ end
387
+ RUBY
388
+ end
389
+
390
+ def theme_main(_module_name, _name)
391
+ <<~SCSS + theme_compiled(nil, nil)
392
+ @import "custom-variables";
393
+
394
+ SCSS
395
+ end
396
+
397
+ def theme_compiled(_module_name, _name)
398
+ <<~SCSS
399
+ :root {
400
+ color: #17324d;
401
+ background: #f4f7fb;
402
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
403
+ }
404
+
405
+ body {
406
+ margin: 0;
407
+ background: #f4f7fb;
408
+ }
409
+
410
+ *, *::before, *::after {
411
+ box-sizing: border-box;
412
+ }
413
+
414
+ button,
415
+ input,
416
+ select,
417
+ textarea {
418
+ font: inherit;
419
+ }
420
+
421
+ .btn,
422
+ .mx-button {
423
+ display: inline-flex;
424
+ align-items: center;
425
+ justify-content: center;
426
+ min-height: 42px;
427
+ margin: 8px 8px 0 0;
428
+ padding: 10px 18px;
429
+ border: 0;
430
+ border-radius: 10px;
431
+ color: #fff;
432
+ background: #087f8c;
433
+ font-weight: 700;
434
+ cursor: pointer;
435
+ }
436
+
437
+ input,
438
+ select,
439
+ textarea,
440
+ .form-control {
441
+ width: 100%;
442
+ min-height: 42px;
443
+ margin-top: 6px;
444
+ padding: 10px 12px;
445
+ border: 1px solid #cbd8e2;
446
+ border-radius: 10px;
447
+ color: #17324d;
448
+ background: #fff;
449
+ }
450
+
451
+ label,
452
+ .control-label {
453
+ display: block;
454
+ margin-top: 14px;
455
+ color: #36546c;
456
+ font-weight: 650;
457
+ }
458
+
459
+ .mxrb-application-shell {
460
+ min-height: 100vh;
461
+ }
462
+
463
+ .region-topbar {
464
+ z-index: 20;
465
+ border-bottom: 1px solid rgb(23 50 77 / 10%);
466
+ background: rgb(255 255 255 / 92%);
467
+ box-shadow: 0 8px 28px rgb(23 50 77 / 8%);
468
+ backdrop-filter: blur(16px);
469
+ }
470
+
471
+ .mxrb-topbar {
472
+ display: flex;
473
+ height: 100%;
474
+ align-items: center;
475
+ gap: 16px;
476
+ padding: 0 24px;
477
+ }
478
+
479
+ .mxrb-sidebar-toggle.btn {
480
+ min-width: auto;
481
+ padding: 9px 14px;
482
+ border: 0;
483
+ border-radius: 10px;
484
+ background: #087f8c;
485
+ }
486
+
487
+ .mxrb-brand {
488
+ font-size: 1.125rem;
489
+ font-weight: 750;
490
+ letter-spacing: -0.025em;
491
+ }
492
+
493
+ .region-sidebar {
494
+ color: #dceaf0;
495
+ background: linear-gradient(180deg, #102f42, #092331);
496
+ box-shadow: 12px 0 36px rgb(9 35 49 / 16%);
497
+ }
498
+
499
+ .mxrb-navigation {
500
+ padding: 20px 14px;
501
+ }
502
+
503
+ .mxrb-navigation ul {
504
+ margin: 0;
505
+ padding: 0;
506
+ list-style: none;
507
+ }
508
+
509
+ .mxrb-navigation .navbar-inner > ul > li > a {
510
+ display: block;
511
+ margin: 4px 0;
512
+ padding: 12px 16px;
513
+ color: #dceaf0;
514
+ border-radius: 12px;
515
+ font-weight: 650;
516
+ }
517
+
518
+ .mxrb-navigation .navbar-inner > ul > li > a:hover,
519
+ .mxrb-navigation .navbar-inner > ul > li.active > a {
520
+ color: #fff;
521
+ background: rgb(255 255 255 / 12%);
522
+ }
523
+
524
+ .region-content {
525
+ box-sizing: border-box;
526
+ background: #f4f7fb;
527
+ }
528
+
529
+ .region-content > .mx-scrollcontainer-wrapper {
530
+ padding: clamp(24px, 4vw, 48px);
531
+ }
532
+
533
+ .region-content .mx-page {
534
+ box-sizing: border-box;
535
+ width: 100%;
536
+ max-width: 1120px;
537
+ margin: 0 auto;
538
+ }
539
+
540
+ .mxrb-page-header {
541
+ box-sizing: border-box;
542
+ flex: 0 0 auto !important;
543
+ width: 100%;
544
+ min-height: 0;
545
+ margin-bottom: 24px;
546
+ padding: 28px 32px;
547
+ color: #fff;
548
+ border-radius: 20px;
549
+ background: linear-gradient(135deg, #087f8c, #0b5d75);
550
+ box-shadow: 0 16px 40px rgb(20 73 94 / 18%);
551
+ }
552
+
553
+ .mxrb-page-header .mx-text,
554
+ .mxrb-page-header > span {
555
+ display: block;
556
+ }
557
+
558
+ .mxrb-page-header .mx-text:first-child,
559
+ .mxrb-page-header > span:first-of-type {
560
+ font-size: clamp(2rem, 5vw, 3rem);
561
+ font-weight: 750;
562
+ letter-spacing: -0.04em;
563
+ }
564
+
565
+ .mxrb-page-header .mx-text + .mx-text,
566
+ .mxrb-page-header > span + span {
567
+ max-width: 680px;
568
+ margin-top: 8px;
569
+ color: rgb(255 255 255 / 82%);
570
+ font-size: 1rem;
571
+ }
572
+
573
+ .mxrb-dashboard-grid {
574
+ display: grid;
575
+ grid-template-columns: repeat(3, minmax(0, 1fr));
576
+ gap: 20px;
577
+ }
578
+
579
+ .mxrb-card {
580
+ box-sizing: border-box;
581
+ min-height: 190px;
582
+ padding: 24px;
583
+ border: 1px solid rgb(23 50 77 / 8%);
584
+ border-radius: 18px;
585
+ background: #fff;
586
+ box-shadow: 0 12px 32px rgb(23 50 77 / 8%);
587
+ }
588
+
589
+ .mxrb-card .mx-text,
590
+ .mxrb-card > span {
591
+ display: block;
592
+ }
593
+
594
+ .mxrb-card .mx-text:first-child,
595
+ .mxrb-card > span:first-of-type {
596
+ margin-bottom: 14px;
597
+ color: #087f8c;
598
+ font-size: 0.75rem;
599
+ font-weight: 800;
600
+ letter-spacing: 0.12em;
601
+ }
602
+
603
+ .mxrb-card .mx-text:nth-child(2),
604
+ .mxrb-card > span:nth-of-type(2) {
605
+ margin-bottom: 10px;
606
+ color: #17324d;
607
+ font-size: 1.25rem;
608
+ font-weight: 750;
609
+ }
610
+
611
+ .mxrb-card .mx-text:nth-child(3),
612
+ .mxrb-card > span:nth-of-type(3) {
613
+ color: #60768a;
614
+ line-height: 1.6;
615
+ }
616
+
617
+ @media (max-width: 767px) {
618
+ .mxrb-dashboard-grid {
619
+ grid-template-columns: 1fr;
620
+ }
621
+
622
+ .region-content > .mx-scrollcontainer-wrapper {
623
+ padding: 20px 16px;
624
+ }
625
+
626
+ .mxrb-page-header {
627
+ padding: 24px;
628
+ border-radius: 16px;
629
+ }
630
+ }
631
+ SCSS
632
+ end
633
+
634
+ def theme_custom_variables(_module_name, _name)
635
+ <<~SCSS
636
+ // Project-specific Sass variables belong here. When Atlas Core is
637
+ // installed, mxrb marketplace adds its legacy variable definitions.
638
+ SCSS
639
+ end
640
+
641
+ def theme_settings(_module_name, _name)
642
+ <<~JSON
643
+ {
644
+ "cssFiles": ["theme.compiled.css"]
645
+ }
646
+ JSON
647
+ end
648
+
649
+ def theme_exclusion_variables(_module_name, _name)
650
+ <<~SCSS
651
+ // Atlas Core imports this file. Add Sass variables here to exclude
652
+ // optional Atlas components from the compiled theme.
653
+ SCSS
654
+ end
655
+
656
+ def github_workflow(_module_name, _name)
657
+ <<~YAML
658
+ name: MXRB
659
+
660
+ on:
661
+ push:
662
+ pull_request:
663
+
664
+ jobs:
665
+ test:
666
+ runs-on: ubuntu-latest
667
+ steps:
668
+ - uses: actions/checkout@v4
669
+ - uses: ruby/setup-ruby@v1
670
+ with:
671
+ ruby-version: "4.0"
672
+ bundler-cache: true
673
+ - run: bundle exec rspec
674
+ - run: bundle exec rubocop
675
+ - run: bundle exec ruby project.rb
676
+ YAML
677
+ end
678
+
679
+ def presentation(_module_name, _name)
680
+ <<~RUBY
681
+ # frozen_string_literal: true
682
+
683
+ layout :ApplicationLayout
684
+
685
+ evaluate_dir File.join(__dir__, "pages")
686
+ evaluate_dir File.join(__dir__, "client_actions")
687
+ RUBY
688
+ end
689
+
690
+ def infrastructure(_module_name, _name)
691
+ <<~RUBY
692
+ # frozen_string_literal: true
693
+
694
+ evaluate_dir File.join(__dir__, "repositories")
695
+ evaluate_dir File.join(__dir__, "integrations")
696
+ evaluate_dir File.join(__dir__, "endpoints")
697
+ evaluate_dir File.join(__dir__, "actions")
698
+ RUBY
699
+ end
700
+
701
+ def flow(name, description, entry_point: false)
702
+ <<~RUBY
703
+ # frozen_string_literal: true
704
+
705
+ # #{description}
706
+ microflow :#{name} do
707
+ #{entry_point ? ' mark_as_used' : ''}
708
+ end
709
+ RUBY
710
+ end
711
+
712
+ def humanize(name)
713
+ name.to_s.gsub(/_+/, ' ').gsub(/([a-z\d])([A-Z])/, '\\1 \\2').strip
714
+ end
715
+
716
+ def snake_case(value)
717
+ value.gsub(/([A-Z]+)([A-Z][a-z])/, '\\1_\\2')
718
+ .gsub(/([a-z\d])([A-Z])/, '\\1_\\2').tr('-', '_').downcase
719
+ end
720
+ end
721
+ # rubocop:enable Metrics/ModuleLength
722
+ end
723
+ end