brut 0.5.0 → 0.9.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 (564) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +13 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Dockerfile.dx +27 -1
  5. data/Gemfile.lock +33 -1
  6. data/README.md +19 -0
  7. data/assets/YouTubeThumb.pxd +0 -0
  8. data/bin/build +86 -0
  9. data/bin/ci +40 -0
  10. data/bin/docs +40 -10
  11. data/bin/generate-and-run-rubocop +52 -0
  12. data/bin/publish +61 -0
  13. data/bin/rubocop +27 -0
  14. data/bin/setup +52 -0
  15. data/bin/test +18 -0
  16. data/brut-css/bin/build +19 -0
  17. data/brut-css/bin/ci +19 -0
  18. data/brut-css/bin/docs +19 -0
  19. data/brut-css/bin/publish +21 -0
  20. data/brut-css/bin/setup +1 -0
  21. data/brut-css/package-lock.json +2 -2
  22. data/brut-css/package.json +1 -1
  23. data/brut-js/bin/build +15 -6
  24. data/brut-js/bin/docs +25 -0
  25. data/brut-js/bin/publish +21 -0
  26. data/brut-js/bin/setup +1 -0
  27. data/brut-js/dx +1 -0
  28. data/brut-js/package-lock.json +2 -2
  29. data/brut-js/package.json +1 -1
  30. data/brut.gemspec +34 -28
  31. data/brutrb.com/.vitepress/config.mjs +3 -0
  32. data/brutrb.com/bin/setup +1 -0
  33. data/brutrb.com/database-schema.md +1 -1
  34. data/brutrb.com/getting-started.md +3 -0
  35. data/brutrb.com/overview.md +6 -0
  36. data/brutrb.com/recipes/migrations.md +1 -1
  37. data/brutrb.com/tutorial.md +7 -3
  38. data/docker-compose.dx.yml +3 -0
  39. data/docs/404.html +2 -2
  40. data/docs/adrs.html +3 -3
  41. data/docs/ai.html +3 -3
  42. data/docs/api/Brut/BackEnd/SeedData.html +2 -2
  43. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +2 -2
  44. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +2 -2
  45. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +2 -2
  46. data/docs/api/Brut/BackEnd/Sidekiq.html +2 -2
  47. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +2 -2
  48. data/docs/api/Brut/BackEnd/Validators.html +2 -2
  49. data/docs/api/Brut/BackEnd.html +2 -2
  50. data/docs/api/Brut/CLI/App.html +2 -2
  51. data/docs/api/Brut/CLI/AppRunner.html +2 -2
  52. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  53. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
  54. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  55. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
  56. data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
  57. data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
  58. data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
  59. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +2 -2
  60. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +2 -2
  61. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
  62. data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
  63. data/docs/api/Brut/CLI/Apps/DB/Status.html +2 -2
  64. data/docs/api/Brut/CLI/Apps/DB.html +2 -2
  65. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +2 -2
  66. data/docs/api/Brut/CLI/Apps/DeployBase.html +2 -2
  67. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +3 -3
  68. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +2 -2
  69. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +2 -2
  70. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
  71. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
  72. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
  73. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +2 -2
  74. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
  75. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
  76. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +2 -2
  77. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  78. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +2 -2
  79. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +3 -3
  80. data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
  81. data/docs/api/Brut/CLI/Apps/Test/Audit.html +2 -2
  82. data/docs/api/Brut/CLI/Apps/Test/E2e.html +2 -2
  83. data/docs/api/Brut/CLI/Apps/Test/JS.html +2 -2
  84. data/docs/api/Brut/CLI/Apps/Test/Run.html +2 -2
  85. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  86. data/docs/api/Brut/CLI/Apps.html +2 -2
  87. data/docs/api/Brut/CLI/Command.html +2 -2
  88. data/docs/api/Brut/CLI/Error.html +2 -2
  89. data/docs/api/Brut/CLI/ExecutionResults/Result.html +2 -2
  90. data/docs/api/Brut/CLI/ExecutionResults.html +2 -2
  91. data/docs/api/Brut/CLI/Executor.html +2 -2
  92. data/docs/api/Brut/CLI/InvalidOption.html +2 -2
  93. data/docs/api/Brut/CLI/Options.html +80 -2
  94. data/docs/api/Brut/CLI/Output.html +2 -2
  95. data/docs/api/Brut/CLI/SystemExecError.html +2 -2
  96. data/docs/api/Brut/CLI.html +2 -2
  97. data/docs/api/Brut/FactoryBot.html +3 -3
  98. data/docs/api/Brut/Framework/App.html +3 -3
  99. data/docs/api/Brut/Framework/Config.html +25 -3
  100. data/docs/api/Brut/Framework/Container.html +2 -2
  101. data/docs/api/Brut/Framework/Error.html +2 -2
  102. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +2 -2
  103. data/docs/api/Brut/Framework/Errors/Bug.html +2 -2
  104. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +2 -2
  105. data/docs/api/Brut/Framework/Errors/MissingParameter.html +2 -2
  106. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +2 -2
  107. data/docs/api/Brut/Framework/Errors/NotFound.html +2 -2
  108. data/docs/api/Brut/Framework/Errors/NotImplemented.html +2 -2
  109. data/docs/api/Brut/Framework/Errors.html +2 -2
  110. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +2 -2
  111. data/docs/api/Brut/Framework/MCP.html +21 -11
  112. data/docs/api/Brut/Framework/ProjectEnvironment.html +2 -2
  113. data/docs/api/Brut/Framework.html +2 -2
  114. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +2 -2
  115. data/docs/api/Brut/FrontEnd/Component/Helpers.html +2 -2
  116. data/docs/api/Brut/FrontEnd/Component.html +2 -2
  117. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +2 -2
  118. data/docs/api/Brut/FrontEnd/Components/FormTag.html +4 -4
  119. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +2 -2
  120. data/docs/api/Brut/FrontEnd/Components/Input.html +2 -2
  121. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +2 -2
  122. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +2 -2
  123. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +2 -2
  124. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +2 -2
  125. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +2 -2
  126. data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
  127. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +2 -2
  128. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +2 -2
  129. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +2 -2
  130. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +2 -2
  131. data/docs/api/Brut/FrontEnd/Components.html +2 -2
  132. data/docs/api/Brut/FrontEnd/CsrfProtector.html +250 -0
  133. data/docs/api/Brut/FrontEnd/Download.html +2 -2
  134. data/docs/api/Brut/FrontEnd/Flash.html +2 -2
  135. data/docs/api/Brut/FrontEnd/Form.html +6 -6
  136. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +2 -2
  137. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +2 -2
  138. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +2 -2
  139. data/docs/api/Brut/FrontEnd/Forms/Input.html +2 -2
  140. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +2 -2
  141. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +2 -2
  142. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +2 -2
  143. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +2 -2
  144. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +2 -2
  145. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +2 -2
  146. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +2 -2
  147. data/docs/api/Brut/FrontEnd/Forms.html +2 -2
  148. data/docs/api/Brut/FrontEnd/GenericResponse.html +2 -2
  149. data/docs/api/Brut/FrontEnd/Handler.html +2 -2
  150. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +2 -2
  151. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +2 -2
  152. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +2 -2
  153. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +2 -2
  154. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  155. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +2 -2
  156. data/docs/api/Brut/FrontEnd/Handlers.html +2 -2
  157. data/docs/api/Brut/FrontEnd/HandlingResults.html +2 -2
  158. data/docs/api/Brut/FrontEnd/HttpMethod.html +2 -2
  159. data/docs/api/Brut/FrontEnd/HttpStatus.html +2 -2
  160. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +2 -2
  161. data/docs/api/Brut/FrontEnd/Layout.html +2 -2
  162. data/docs/api/Brut/FrontEnd/Middleware.html +2 -2
  163. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +2 -2
  164. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +2 -2
  165. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +2 -2
  166. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +2 -2
  167. data/docs/api/Brut/FrontEnd/Middlewares.html +2 -2
  168. data/docs/api/Brut/FrontEnd/Page.html +2 -2
  169. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  170. data/docs/api/Brut/FrontEnd/Pages.html +2 -2
  171. data/docs/api/Brut/FrontEnd/RequestContext.html +2 -2
  172. data/docs/api/Brut/FrontEnd/RouteHook.html +2 -2
  173. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +2 -2
  174. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +2 -2
  175. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +2 -2
  176. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +2 -2
  177. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +2 -2
  178. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +2 -2
  179. data/docs/api/Brut/FrontEnd/RouteHooks.html +2 -2
  180. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +2 -2
  181. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +2 -2
  182. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +2 -2
  183. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +2 -2
  184. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +2 -2
  185. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +2 -2
  186. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +2 -2
  187. data/docs/api/Brut/FrontEnd/Routing/Route.html +2 -2
  188. data/docs/api/Brut/FrontEnd/Routing.html +2 -2
  189. data/docs/api/Brut/FrontEnd/Session.html +2 -2
  190. data/docs/api/Brut/FrontEnd.html +3 -3
  191. data/docs/api/Brut/I18n/BaseMethods.html +3 -3
  192. data/docs/api/Brut/I18n/ForBackEnd.html +2 -2
  193. data/docs/api/Brut/I18n/ForCLI.html +2 -2
  194. data/docs/api/Brut/I18n/ForHTML.html +2 -2
  195. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +2 -2
  196. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +2 -2
  197. data/docs/api/Brut/I18n.html +2 -2
  198. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +2 -2
  199. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +2 -2
  200. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +2 -2
  201. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +2 -2
  202. data/docs/api/Brut/Instrumentation.html +2 -2
  203. data/docs/api/Brut/RubocopConfig.html +237 -0
  204. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +2 -2
  205. data/docs/api/Brut/SinatraHelpers.html +2 -2
  206. data/docs/api/Brut/SpecSupport/ClockSupport.html +2 -2
  207. data/docs/api/Brut/SpecSupport/ComponentSupport.html +7 -13
  208. data/docs/api/Brut/SpecSupport/E2ETestServer.html +2 -2
  209. data/docs/api/Brut/SpecSupport/E2eSupport.html +2 -2
  210. data/docs/api/Brut/SpecSupport/EnhancedNode.html +2 -2
  211. data/docs/api/Brut/SpecSupport/FlashSupport.html +2 -2
  212. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +2 -2
  213. data/docs/api/Brut/SpecSupport/GeneralSupport.html +2 -2
  214. data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
  215. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +2 -2
  216. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +2 -2
  217. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +2 -2
  218. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +2 -2
  219. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +2 -2
  220. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +2 -2
  221. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +2 -2
  222. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +2 -2
  223. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +2 -2
  224. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +2 -2
  225. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +2 -2
  226. data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
  227. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +2 -2
  228. data/docs/api/Brut/SpecSupport/RSpecSetup.html +4 -4
  229. data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
  230. data/docs/api/Brut/SpecSupport.html +2 -2
  231. data/docs/api/Brut.html +128 -12
  232. data/docs/api/Clock.html +2 -2
  233. data/docs/api/ModuleName.html +28 -28
  234. data/docs/api/RichString.html +22 -22
  235. data/docs/api/SemanticLogger/Appender/Async.html +2 -2
  236. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +2 -2
  237. data/docs/api/Sequel/Extensions/BrutMigrations.html +2 -2
  238. data/docs/api/Sequel/Extensions.html +2 -2
  239. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +2 -2
  240. data/docs/api/Sequel/Plugins/CreatedAt.html +2 -2
  241. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +2 -2
  242. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +2 -2
  243. data/docs/api/Sequel/Plugins/ExternalId.html +2 -2
  244. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +2 -2
  245. data/docs/api/Sequel/Plugins/FindBang.html +2 -2
  246. data/docs/api/Sequel/Plugins.html +2 -2
  247. data/docs/api/Sequel.html +2 -2
  248. data/docs/api/_index.html +16 -2
  249. data/docs/api/class_list.html +1 -1
  250. data/docs/api/file.README.html +28 -2
  251. data/docs/api/index.html +28 -2
  252. data/docs/api/method_list.html +192 -168
  253. data/docs/api/top-level-namespace.html +2 -2
  254. data/docs/assets/{app.D6BuVHo9.js → app.CmkhEsw7.js} +1 -1
  255. data/docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js +1 -0
  256. data/docs/assets/chunks/{VPLocalSearchBox.BpvHMbx6.js → VPLocalSearchBox.CDh583Oj.js} +1 -1
  257. data/docs/assets/chunks/{theme.wlAOvi2f.js → theme.B0_7GeW8.js} +2 -2
  258. data/docs/assets/{components.md.iLiv2E9X.js → components.md.-22ecBxM.js} +3 -3
  259. data/docs/assets/{configuration.md.DmuAdsli.js → configuration.md.CLKL1lFf.js} +1 -1
  260. data/docs/assets/{database-schema.md.C5gXexJi.js → database-schema.md.LpmBPVEU.js} +1 -1
  261. data/docs/assets/{forms.md.D8aa_qI-.js → forms.md.CBI5--o2.js} +1 -1
  262. data/docs/assets/{getting-started.md.DLplsDUd.js → getting-started.md.D5nzBZ4J.js} +6 -3
  263. data/docs/assets/{getting-started.md.DLplsDUd.lean.js → getting-started.md.D5nzBZ4J.lean.js} +1 -1
  264. data/docs/assets/overview.md.DlKiRRG_.js +1 -0
  265. data/docs/assets/overview.md.DlKiRRG_.lean.js +1 -0
  266. data/docs/assets/{recipes_migrations.md.DPN3gQE3.js → recipes_migrations.md.CTcnWDJF.js} +1 -1
  267. data/docs/assets/tutorial.md.BIb7XT6j.js +1 -0
  268. data/docs/assets/tutorial.md.BIb7XT6j.lean.js +1 -0
  269. data/docs/assets.html +3 -3
  270. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  271. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  272. data/docs/brut-js/api/Autosubmit.html +1 -1
  273. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  274. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  275. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  276. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  277. data/docs/brut-js/api/BufferedLogger.html +1 -1
  278. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  279. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  280. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  281. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  282. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  283. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  284. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  285. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  286. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  287. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  288. data/docs/brut-js/api/Form.html +1 -1
  289. data/docs/brut-js/api/Form.js.html +1 -1
  290. data/docs/brut-js/api/I18nTranslation.html +1 -1
  291. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  292. data/docs/brut-js/api/LocaleDetection.html +1 -1
  293. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  294. data/docs/brut-js/api/Logger.html +1 -1
  295. data/docs/brut-js/api/Logger.js.html +1 -1
  296. data/docs/brut-js/api/Message.html +1 -1
  297. data/docs/brut-js/api/Message.js.html +1 -1
  298. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  299. data/docs/brut-js/api/RichString.html +1 -1
  300. data/docs/brut-js/api/RichString.js.html +1 -1
  301. data/docs/brut-js/api/Tabs.html +1 -1
  302. data/docs/brut-js/api/Tabs.js.html +1 -1
  303. data/docs/brut-js/api/Tracing.html +1 -1
  304. data/docs/brut-js/api/Tracing.js.html +1 -1
  305. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  306. data/docs/brut-js/api/external-Performance.html +1 -1
  307. data/docs/brut-js/api/external-Promise.html +1 -1
  308. data/docs/brut-js/api/external-ValidityState.html +1 -1
  309. data/docs/brut-js/api/external-Window.html +1 -1
  310. data/docs/brut-js/api/external-fetch.html +1 -1
  311. data/docs/brut-js/api/global.html +1 -1
  312. data/docs/brut-js/api/index.html +1 -1
  313. data/docs/brut-js/api/index.js.html +1 -1
  314. data/docs/brut-js/api/module-testing.html +1 -1
  315. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  316. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  317. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  318. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  319. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  320. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  321. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  322. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  323. data/docs/brut-js/api/testing_index.js.html +1 -1
  324. data/docs/brut-js.html +3 -3
  325. data/docs/business-logic.html +3 -3
  326. data/docs/cli.html +3 -3
  327. data/docs/components.html +7 -7
  328. data/docs/configuration.html +5 -5
  329. data/docs/css.html +3 -3
  330. data/docs/custom-element-tests.html +3 -3
  331. data/docs/database-access.html +3 -3
  332. data/docs/database-schema.html +5 -5
  333. data/docs/deployment.html +3 -3
  334. data/docs/dev-environment.html +3 -3
  335. data/docs/dir-structure.html +3 -3
  336. data/docs/doc-conventions.html +3 -3
  337. data/docs/end-to-end-tests.html +3 -3
  338. data/docs/features.html +3 -3
  339. data/docs/flash-and-session.html +3 -3
  340. data/docs/form-constraints.html +3 -3
  341. data/docs/forms.html +5 -5
  342. data/docs/getting-started.html +9 -6
  343. data/docs/handlers.html +3 -3
  344. data/docs/hashmap.json +1 -1
  345. data/docs/hooks.html +3 -3
  346. data/docs/i18n.html +3 -3
  347. data/docs/index.html +3 -3
  348. data/docs/instrumentation.html +3 -3
  349. data/docs/javascript.html +3 -3
  350. data/docs/jobs.html +3 -3
  351. data/docs/keyword-injection.html +3 -3
  352. data/docs/layouts.html +3 -3
  353. data/docs/lsp.html +3 -3
  354. data/docs/markdown-examples.html +3 -3
  355. data/docs/middleware.html +3 -3
  356. data/docs/overview.html +5 -5
  357. data/docs/pages.html +3 -3
  358. data/docs/recipes/alternate-layouts.html +3 -3
  359. data/docs/recipes/authentication.html +3 -3
  360. data/docs/recipes/blank-layouts.html +3 -3
  361. data/docs/recipes/custom-flash.html +3 -3
  362. data/docs/recipes/indexed-forms.html +3 -3
  363. data/docs/recipes/migrations.html +5 -5
  364. data/docs/recipes/text-field-component.html +3 -3
  365. data/docs/roadmap.html +3 -3
  366. data/docs/routes.html +3 -3
  367. data/docs/security.html +3 -3
  368. data/docs/seed-data.html +3 -3
  369. data/docs/space-time-continuum.html +3 -3
  370. data/docs/tutorial.html +5 -5
  371. data/docs/unit-tests.html +3 -3
  372. data/docs/why.html +3 -3
  373. data/dx/build +45 -9
  374. data/lib/brut/cli/app.rb +1 -1
  375. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
  376. data/lib/brut/cli/apps/scaffold.rb +1 -1
  377. data/lib/brut/cli/options.rb +4 -0
  378. data/lib/brut/factory_bot.rb +1 -1
  379. data/lib/brut/framework/app.rb +1 -1
  380. data/lib/brut/framework/config.rb +11 -0
  381. data/lib/brut/framework/mcp.rb +13 -8
  382. data/lib/brut/front_end/components/form_tag.rb +2 -2
  383. data/lib/brut/front_end/csrf_protector.rb +30 -0
  384. data/lib/brut/front_end/form.rb +4 -4
  385. data/lib/brut/front_end/page.rb +1 -1
  386. data/lib/brut/front_end/routing.rb +1 -1
  387. data/lib/brut/front_end.rb +1 -0
  388. data/lib/brut/i18n/base_methods.rb +1 -1
  389. data/lib/brut/instrumentation/logger_span_exporter.rb +1 -1
  390. data/lib/brut/junk_drawer.rb +3 -1
  391. data/lib/brut/rubocop_config.rb +123 -0
  392. data/lib/brut/spec_support/component_support.rb +0 -3
  393. data/lib/brut/spec_support/rspec_setup.rb +2 -2
  394. data/lib/brut/version.rb +1 -1
  395. data/mkbrut/.gitignore +16 -0
  396. data/mkbrut/CODE_OF_CONDUCT.txt +100 -0
  397. data/mkbrut/Gemfile +3 -0
  398. data/mkbrut/Gemfile.lock +19 -0
  399. data/mkbrut/LICENSE.txt +370 -0
  400. data/mkbrut/README.md +145 -0
  401. data/mkbrut/Rakefile +2 -0
  402. data/mkbrut/bin/build +36 -0
  403. data/mkbrut/bin/ci +19 -0
  404. data/mkbrut/bin/docs +19 -0
  405. data/mkbrut/bin/publish +129 -0
  406. data/mkbrut/bin/rake +16 -0
  407. data/mkbrut/bin/setup +30 -0
  408. data/mkbrut/brut-welcome.png +0 -0
  409. data/mkbrut/deploy/.dockerignore +2 -0
  410. data/mkbrut/deploy/Dockerfile +25 -0
  411. data/mkbrut/dx +1 -0
  412. data/mkbrut/exe/mkbrut +5 -0
  413. data/mkbrut/lib/mkbrut/app.rb +79 -0
  414. data/mkbrut/lib/mkbrut/app_id.rb +8 -0
  415. data/mkbrut/lib/mkbrut/app_name.rb +29 -0
  416. data/mkbrut/lib/mkbrut/app_options.rb +36 -0
  417. data/mkbrut/lib/mkbrut/base.rb +57 -0
  418. data/mkbrut/lib/mkbrut/cli.rb +107 -0
  419. data/mkbrut/lib/mkbrut/erb_binding_delegate.rb +20 -0
  420. data/mkbrut/lib/mkbrut/internet_identifier.rb +32 -0
  421. data/mkbrut/lib/mkbrut/invalid_identifier.rb +4 -0
  422. data/mkbrut/lib/mkbrut/ops/add_css_import.rb +42 -0
  423. data/mkbrut/lib/mkbrut/ops/add_i18n_message.rb +74 -0
  424. data/mkbrut/lib/mkbrut/ops/add_method.rb +48 -0
  425. data/mkbrut/lib/mkbrut/ops/append_to_file.rb +20 -0
  426. data/mkbrut/lib/mkbrut/ops/base_op.rb +21 -0
  427. data/mkbrut/lib/mkbrut/ops/copy_file.rb +12 -0
  428. data/mkbrut/lib/mkbrut/ops/insert_code_in_method.rb +58 -0
  429. data/mkbrut/lib/mkbrut/ops/insert_route.rb +52 -0
  430. data/mkbrut/lib/mkbrut/ops/mkdir.rb +13 -0
  431. data/mkbrut/lib/mkbrut/ops/prism_parsing_op.rb +70 -0
  432. data/mkbrut/lib/mkbrut/ops/render_template.rb +26 -0
  433. data/mkbrut/lib/mkbrut/ops/skip_file.rb +10 -0
  434. data/mkbrut/lib/mkbrut/ops.rb +16 -0
  435. data/mkbrut/lib/mkbrut/organization.rb +5 -0
  436. data/mkbrut/lib/mkbrut/prefix.rb +26 -0
  437. data/mkbrut/lib/mkbrut/prefixed_io.rb +16 -0
  438. data/mkbrut/lib/mkbrut/segments/bare_bones.rb +185 -0
  439. data/mkbrut/lib/mkbrut/segments/demo.rb +121 -0
  440. data/mkbrut/lib/mkbrut/segments/heroku.rb +30 -0
  441. data/mkbrut/lib/mkbrut/segments/sidekiq.rb +3 -0
  442. data/mkbrut/lib/mkbrut/segments.rb +8 -0
  443. data/mkbrut/lib/mkbrut/version.rb +3 -0
  444. data/mkbrut/lib/mkbrut/versions.rb +13 -0
  445. data/mkbrut/lib/mkbrut.rb +18 -0
  446. data/mkbrut/mkbrut.gemspec +34 -0
  447. data/mkbrut/templates/Base/.dockerignore +25 -0
  448. data/mkbrut/templates/Base/.env.development.erb +60 -0
  449. data/mkbrut/templates/Base/.env.test.erb +8 -0
  450. data/mkbrut/templates/Base/.gitignore +31 -0
  451. data/mkbrut/templates/Base/.projections.json +59 -0
  452. data/mkbrut/templates/Base/Dockerfile.dx +205 -0
  453. data/mkbrut/templates/Base/Gemfile.erb +53 -0
  454. data/mkbrut/templates/Base/Procfile.development +5 -0
  455. data/mkbrut/templates/Base/Procfile.test +1 -0
  456. data/mkbrut/templates/Base/README.md +4 -0
  457. data/mkbrut/templates/Base/README.md.erb +40 -0
  458. data/mkbrut/templates/Base/app/bootstrap.rb +61 -0
  459. data/mkbrut/templates/Base/app/config/i18n/en/1_defaults.rb +128 -0
  460. data/mkbrut/templates/Base/app/config/i18n/en/2_app.rb +24 -0
  461. data/mkbrut/templates/Base/app/public/static/manifest.json.erb +33 -0
  462. data/mkbrut/templates/Base/app/src/app.rb.erb +37 -0
  463. data/mkbrut/templates/Base/app/src/back_end/data_models/app_data_model.rb +5 -0
  464. data/mkbrut/templates/Base/app/src/back_end/data_models/db.rb +19 -0
  465. data/mkbrut/templates/Base/app/src/back_end/data_models/migrations/20240101130000_citext.rb +6 -0
  466. data/mkbrut/templates/Base/app/src/back_end/data_models/seed/seed_data.rb +9 -0
  467. data/mkbrut/templates/Base/app/src/front_end/components/app_component.rb +8 -0
  468. data/mkbrut/templates/Base/app/src/front_end/components/custom_element_registration.rb.erb +7 -0
  469. data/mkbrut/templates/Base/app/src/front_end/css/index.css +2 -0
  470. data/mkbrut/templates/Base/app/src/front_end/css/svgs.css +12 -0
  471. data/mkbrut/templates/Base/app/src/front_end/forms/app_form.rb +4 -0
  472. data/mkbrut/templates/Base/app/src/front_end/handlers/app_handler.rb +4 -0
  473. data/mkbrut/templates/Base/app/src/front_end/images/LogoPylon.png +0 -0
  474. data/mkbrut/templates/Base/app/src/front_end/images/LogoTransit.png +0 -0
  475. data/mkbrut/templates/Base/app/src/front_end/images/apple-touch-icon-120x120.png +0 -0
  476. data/mkbrut/templates/Base/app/src/front_end/images/apple-touch-icon-152x152.png +0 -0
  477. data/mkbrut/templates/Base/app/src/front_end/images/apple-touch-icon-167x167.png +0 -0
  478. data/mkbrut/templates/Base/app/src/front_end/images/apple-touch-icon-180x180.png +0 -0
  479. data/mkbrut/templates/Base/app/src/front_end/images/favicon.ico +0 -0
  480. data/mkbrut/templates/Base/app/src/front_end/images/icon.png +0 -0
  481. data/mkbrut/templates/Base/app/src/front_end/images/mkicons.sh +6 -0
  482. data/mkbrut/templates/Base/app/src/front_end/js/index.js +6 -0
  483. data/mkbrut/templates/Base/app/src/front_end/layouts/default_layout.rb.erb +73 -0
  484. data/mkbrut/templates/Base/app/src/front_end/pages/app_page.rb +11 -0
  485. data/mkbrut/templates/Base/app/src/front_end/pages/home_page.rb +62 -0
  486. data/mkbrut/templates/Base/app/src/front_end/support/app_session.rb +6 -0
  487. data/mkbrut/templates/Base/app/src/front_end/svgs/README.md +5 -0
  488. data/mkbrut/templates/Base/app/src/front_end/svgs/comment-button.svg +59 -0
  489. data/mkbrut/templates/Base/bin/README.md.erb +5 -0
  490. data/mkbrut/templates/Base/bin/build-assets +7 -0
  491. data/mkbrut/templates/Base/bin/ci +39 -0
  492. data/mkbrut/templates/Base/bin/console +31 -0
  493. data/mkbrut/templates/Base/bin/db +9 -0
  494. data/mkbrut/templates/Base/bin/dbconsole +51 -0
  495. data/mkbrut/templates/Base/bin/dev +25 -0
  496. data/mkbrut/templates/Base/bin/release +26 -0
  497. data/mkbrut/templates/Base/bin/run +86 -0
  498. data/mkbrut/templates/Base/bin/scaffold +9 -0
  499. data/mkbrut/templates/Base/bin/setup +256 -0
  500. data/mkbrut/templates/Base/bin/startup-message +65 -0
  501. data/mkbrut/templates/Base/bin/test +9 -0
  502. data/mkbrut/templates/Base/bin/test-server +29 -0
  503. data/mkbrut/templates/Base/bin/watch-and-build-assets +37 -0
  504. data/mkbrut/templates/Base/config.ru +16 -0
  505. data/mkbrut/templates/Base/docker-compose.dx.yml +92 -0
  506. data/mkbrut/templates/Base/dx/README.md +28 -0
  507. data/mkbrut/templates/Base/dx/bash_customizations +12 -0
  508. data/mkbrut/templates/Base/dx/bash_customizations.local +8 -0
  509. data/mkbrut/templates/Base/dx/build +107 -0
  510. data/mkbrut/templates/Base/dx/docker-compose.env.erb +25 -0
  511. data/mkbrut/templates/Base/dx/dx.sh.lib +137 -0
  512. data/mkbrut/templates/Base/dx/exec +68 -0
  513. data/mkbrut/templates/Base/dx/prune +19 -0
  514. data/mkbrut/templates/Base/dx/show-help-in-app-container-then-wait.sh +38 -0
  515. data/mkbrut/templates/Base/dx/start +30 -0
  516. data/mkbrut/templates/Base/dx/stop +23 -0
  517. data/mkbrut/templates/Base/package.json.erb +37 -0
  518. data/mkbrut/templates/Base/puma.config.rb +53 -0
  519. data/mkbrut/templates/Base/specs/e2e/home_page.spec.rb.erb +23 -0
  520. data/mkbrut/templates/Base/specs/front_end/js/SpecHelper.js +24 -0
  521. data/mkbrut/templates/Base/specs/front_end/pages/home_page.spec.rb +22 -0
  522. data/mkbrut/templates/Base/specs/lint_factories.spec.rb +7 -0
  523. data/mkbrut/templates/Base/specs/spec_helper.rb +78 -0
  524. data/mkbrut/templates/Base/specs/support.rb +2 -0
  525. data/mkbrut/templates/segments/BareBones/app/src/front_end/handlers/trigger_exception_handler.rb +24 -0
  526. data/mkbrut/templates/segments/BareBones/app/src/front_end/js/Example.js.erb +49 -0
  527. data/mkbrut/templates/segments/BareBones/specs/front_end/handlers/trigger_exception_handler.spec.rb +41 -0
  528. data/mkbrut/templates/segments/BareBones/specs/front_end/js/Example.spec.js.erb +38 -0
  529. data/mkbrut/templates/segments/Demo/app/src/back_end/data_models/db/guestbook_message.rb +3 -0
  530. data/mkbrut/templates/segments/Demo/app/src/back_end/data_models/migrations/20250628194124_guestbook.rb +14 -0
  531. data/mkbrut/templates/segments/Demo/app/src/front_end/components/flash_component.rb +36 -0
  532. data/mkbrut/templates/segments/Demo/app/src/front_end/css/constraint-violations.css +18 -0
  533. data/mkbrut/templates/segments/Demo/app/src/front_end/css/fonts.css +19 -0
  534. data/mkbrut/templates/segments/Demo/app/src/front_end/fonts/monaspace-xenon.ttf +0 -0
  535. data/mkbrut/templates/segments/Demo/app/src/front_end/forms/guestbook_message_form.rb +4 -0
  536. data/mkbrut/templates/segments/Demo/app/src/front_end/handlers/guestbook_message_handler.rb +64 -0
  537. data/mkbrut/templates/segments/Demo/app/src/front_end/pages/guestbook_page/message_component.rb +41 -0
  538. data/mkbrut/templates/segments/Demo/app/src/front_end/pages/guestbook_page.rb +43 -0
  539. data/mkbrut/templates/segments/Demo/app/src/front_end/pages/new_guestbook_message_page.rb +64 -0
  540. data/mkbrut/templates/segments/Demo/specs/back_end/data_models/db/guestbook_message.spec.rb +5 -0
  541. data/mkbrut/templates/segments/Demo/specs/e2e/guest_message.spec.rb +54 -0
  542. data/mkbrut/templates/segments/Demo/specs/factories/db/guestbook_message.factory.rb +7 -0
  543. data/mkbrut/templates/segments/Demo/specs/front_end/components/flash_component.spec.rb +5 -0
  544. data/mkbrut/templates/segments/Demo/specs/front_end/handlers/guestbook_message_handler.spec.rb +122 -0
  545. data/mkbrut/templates/segments/Demo/specs/front_end/pages/guestbook_page/message_component.spec.rb +5 -0
  546. data/mkbrut/templates/segments/Demo/specs/front_end/pages/guestbook_page.spec.rb +52 -0
  547. data/mkbrut/templates/segments/Demo/specs/front_end/pages/new_guestbook_message_page.spec.rb +5 -0
  548. data/mkbrut/templates/segments/Heroku/bin/deploy +11 -0
  549. data/mkbrut/templates/segments/Heroku/deploy/Dockerfile +125 -0
  550. data/mkbrut/templates/segments/Heroku/deploy/docker-entrypoint +15 -0
  551. data/mkbrut/templates/segments/Heroku/deploy/heroku_config.rb +26 -0
  552. data/specs/brut/junk_drawer.spec.rb +4 -0
  553. metadata +242 -41
  554. data/.rspec +0 -3
  555. data/docs/assets/chunks/@localSearchIndexroot.COP2Bcmp.js +0 -1
  556. data/docs/assets/overview.md.iMnwLO4x.js +0 -1
  557. data/docs/assets/overview.md.iMnwLO4x.lean.js +0 -1
  558. data/docs/assets/tutorial.md.BYXj4cOu.js +0 -1
  559. data/docs/assets/tutorial.md.BYXj4cOu.lean.js +0 -1
  560. /data/docs/assets/{components.md.iLiv2E9X.lean.js → components.md.-22ecBxM.lean.js} +0 -0
  561. /data/docs/assets/{configuration.md.DmuAdsli.lean.js → configuration.md.CLKL1lFf.lean.js} +0 -0
  562. /data/docs/assets/{database-schema.md.C5gXexJi.lean.js → database-schema.md.LpmBPVEU.lean.js} +0 -0
  563. /data/docs/assets/{forms.md.D8aa_qI-.lean.js → forms.md.CBI5--o2.lean.js} +0 -0
  564. /data/docs/assets/{recipes_migrations.md.DPN3gQE3.lean.js → recipes_migrations.md.CTcnWDJF.lean.js} +0 -0
data/brut-css/bin/build CHANGED
@@ -1,5 +1,23 @@
1
+ #!/usr/bin/env bash
1
2
  set -e
2
3
 
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " Build CSS for distribution"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
20
+
3
21
  echo "[ bin/docs ] Building brut.css"
4
22
  node src/js/build.js \
5
23
  -m config/media-queries-all.css \
@@ -17,6 +35,7 @@ node src/js/build.js \
17
35
  -p config/pseudo-classes-all.css \
18
36
  -i src/css/index.css \
19
37
  -o dist/brut-ns-only.max.css
38
+
20
39
  echo "[ bin/docs ] Removing comments and minifying brut-ns-only.css"
21
40
  npx postcss --config config dist/brut-ns-only.max.css -o dist/brut-ns-only.css
22
41
  rm dist/brut-ns-only.max.css
data/brut-css/bin/ci ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " No-op to comply with workspace protocol"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
data/brut-css/bin/docs CHANGED
@@ -1,5 +1,24 @@
1
+ #!/usr/bin/env bash
2
+
1
3
  set -e
2
4
 
5
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
6
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
7
+
8
+ usage() {
9
+ echo "Usage: $0"
10
+ echo
11
+ echo " Build CSS docs into the brutrb.com location"
12
+ echo
13
+ }
14
+
15
+ for arg in "$@"; do
16
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
17
+ usage
18
+ exit 0
19
+ fi
20
+ done
21
+
3
22
  echo "[ bin/docs ] Building brut.css and docs"
4
23
  node src/js/build.js \
5
24
  --media-query-config config/media-queries-all.css \
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " Publish node module"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
20
+
21
+ npm publish
data/brut-css/bin/setup CHANGED
@@ -2,4 +2,5 @@
2
2
 
3
3
  set -e
4
4
 
5
+ echo "[ brut-css/bin/setup ] Setting up BrutCSS"
5
6
  npm install
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "brut-css",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "brut-css",
9
- "version": "0.5.0",
9
+ "version": "0.9.0",
10
10
  "license": "Hippocratic-2.1",
11
11
  "devDependencies": {
12
12
  "comment-parser": "^1.4.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brut-css",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "description": "Utility CSS Library for Full Stack Developers",
5
5
  "keywords": [
6
6
  "css"
data/brut-js/bin/build CHANGED
@@ -1,10 +1,19 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  set -e
4
- SCRIPT_DIR=$(dirname "$0")
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
5
  ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
- cd ${ROOT_DIR}/docs
7
- npx jsdoc --configure ${ROOT_DIR}/docs/jsdoc.config.json \
8
- --readme ${ROOT_DIR}/README.md \
9
- --destination ${ROOT_DIR}/../brutrb.com/public/brut-js/api \
10
- --recurse ${ROOT_DIR}/src/
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " No-op to comply with workspace protocol"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
data/brut-js/bin/docs ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " Build JSDoc into the brutrb.com location"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
20
+
21
+ cd ${ROOT_DIR}/docs
22
+ npx jsdoc --configure ${ROOT_DIR}/docs/jsdoc.config.json \
23
+ --readme ${ROOT_DIR}/README.md \
24
+ --destination ${ROOT_DIR}/../brutrb.com/public/brut-js/api \
25
+ --recurse ${ROOT_DIR}/src/
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ SCRIPT_DIR=$( cd -- "$( dirname -- "${0}" )" > /dev/null 2>&1 && pwd )
5
+ ROOT_DIR=$(realpath "$SCRIPT_DIR/..")
6
+
7
+ usage() {
8
+ echo "Usage: $0"
9
+ echo
10
+ echo " Publish node module"
11
+ echo
12
+ }
13
+
14
+ for arg in "$@"; do
15
+ if [ "${arg}" = "-h" ] || [ "${arg}" = "--help" ] || [ "${arg}" = "help" ]; then
16
+ usage
17
+ exit 0
18
+ fi
19
+ done
20
+
21
+ npm publish
data/brut-js/bin/setup CHANGED
@@ -2,4 +2,5 @@
2
2
 
3
3
  set -e
4
4
 
5
+ echo "[ brut-js/bin/setup ] Setting up BrutJS"
5
6
  npm install
data/brut-js/dx ADDED
@@ -0,0 +1 @@
1
+ ../dx
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "brut-js",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "brut-js",
9
- "version": "0.5.0",
9
+ "version": "0.9.0",
10
10
  "license": "Hippocratic-2.1",
11
11
  "devDependencies": {
12
12
  "esbuild": "^0.24.0",
data/brut-js/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brut-js",
3
- "version": "0.5.0",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "keywords": [ "WebComponents", "Custom Elements" ],
6
6
  "bugs": {
data/brut.gemspec CHANGED
@@ -1,5 +1,7 @@
1
1
  lib = File.expand_path("../lib", __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
2
+ if !$LOAD_PATH.include?(lib)
3
+ $LOAD_PATH.unshift(lib)
4
+ end
3
5
  require "brut/version"
4
6
 
5
7
  Gem::Specification.new do |spec|
@@ -8,9 +10,9 @@ Gem::Specification.new do |spec|
8
10
  spec.authors = ["David Bryant Copeland"]
9
11
  spec.email = ["davec@thirdtank.com"]
10
12
 
11
- spec.summary = %q{NOT YET RELEASED - Web Framework Built around Ruby, Web Standards, Simplicity, and Object-Orientation}
12
- spec.description = %q{NOT YET RELEASED - An opinionated web framework build on web standards}
13
- spec.homepage = "https://naildrivin5.com"
13
+ spec.summary = %q{Web Framework Built around Ruby, Web Standards, Simplicity, and Object-Orientation}
14
+ spec.description = %q{An opinionated web framework build on web standards}
15
+ spec.homepage = "https://brutrb.com"
14
16
 
15
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -18,8 +20,10 @@ Gem::Specification.new do |spec|
18
20
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
19
21
 
20
22
  spec.metadata["homepage_uri"] = spec.homepage
21
- spec.metadata["source_code_uri"] = "https://naildrivin5.com"
22
- spec.metadata["changelog_uri"] = "https://naildrivin5.com"
23
+ spec.metadata["source_code_uri"] = "https://github.com/thirdtank/brut"
24
+ spec.metadata["changelog_uri"] = "https://github.com/thirdtank/brut/blob/main/CHANGELOG.md"
25
+ spec.metadata["documentation_uri"] = "https://brutrb.com/"
26
+ spec.metadata["rubygems_mfa_required"] = "true"
23
27
  else
24
28
  raise "RubyGems 2.0 or newer is required to protect against " \
25
29
  "public gem pushes."
@@ -34,32 +38,34 @@ Gem::Specification.new do |spec|
34
38
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
39
  spec.require_paths = ["lib"]
36
40
 
37
- spec.add_runtime_dependency "irb"
38
- spec.add_runtime_dependency "ostruct" # squelch some warning - this is not used
39
- spec.add_runtime_dependency "concurrent-ruby"
40
- spec.add_runtime_dependency "i18n"
41
- spec.add_runtime_dependency "nokogiri"
42
- spec.add_runtime_dependency "phlex"
43
- spec.add_runtime_dependency "prism"
44
- spec.add_runtime_dependency "rack-protection"
45
- spec.add_runtime_dependency "rackup"
46
- spec.add_runtime_dependency "semantic_logger"
47
- spec.add_runtime_dependency "sequel"
48
- spec.add_runtime_dependency "sinatra"
49
- spec.add_runtime_dependency "tzinfo"
50
- spec.add_runtime_dependency "tzinfo-data"
51
- spec.add_runtime_dependency "zeitwerk"
52
- spec.add_runtime_dependency "opentelemetry-sdk"
53
- spec.add_runtime_dependency "opentelemetry-exporter-otlp"
41
+ spec.add_dependency "irb"
42
+ spec.add_dependency "ostruct" # squelch some warning - this is not used
43
+ spec.add_dependency "concurrent-ruby"
44
+ spec.add_dependency "i18n"
45
+ spec.add_dependency "nokogiri"
46
+ spec.add_dependency "phlex"
47
+ spec.add_dependency "prism"
48
+ spec.add_dependency "rack-protection"
49
+ spec.add_dependency "rackup"
50
+ spec.add_dependency "semantic_logger"
51
+ spec.add_dependency "sequel"
52
+ spec.add_dependency "sinatra"
53
+ spec.add_dependency "tzinfo"
54
+ spec.add_dependency "tzinfo-data"
55
+ spec.add_dependency "zeitwerk"
56
+ spec.add_dependency "opentelemetry-sdk"
57
+ spec.add_dependency "opentelemetry-exporter-otlp"
54
58
 
55
59
  spec.add_development_dependency "activesupport"
56
- spec.add_development_dependency "rspec", "~> 3.0"
57
60
  spec.add_development_dependency "bundler"
58
- spec.add_development_dependency "rake"
59
- spec.add_development_dependency "yard"
60
- spec.add_development_dependency "rdiscount"
61
- spec.add_development_dependency "rdoc"
62
61
  spec.add_development_dependency "dotenv"
63
62
  spec.add_development_dependency "factory_bot"
64
63
  spec.add_development_dependency "faker"
64
+ spec.add_development_dependency "rake"
65
+ spec.add_development_dependency "rdiscount"
66
+ spec.add_development_dependency "rdoc"
67
+ spec.add_development_dependency "rubocop"
68
+ spec.add_development_dependency "rubocop-disable_syntax"
69
+ spec.add_development_dependency "rspec", "~> 3.0"
70
+ spec.add_development_dependency "yard"
65
71
  end
@@ -6,6 +6,9 @@ import jsdocLinker from './plugins/jsdocLinker'
6
6
  export default defineConfig({
7
7
  title: "Brut RB",
8
8
  description: "Documentation for the Brut.RB web framework.",
9
+ ignoreDeadLinks: [
10
+ /^https?:\/\/localhost/,
11
+ ],
9
12
  head: [
10
13
  ["link", { rel: "icon", href: "/favicon.ico" }],
11
14
  [
data/brutrb.com/bin/setup CHANGED
@@ -2,4 +2,5 @@
2
2
 
3
3
  set -e
4
4
 
5
+ echo "[ brutrb.com/bin/setup ] Setting up BrutJS"
5
6
  npm install
@@ -142,7 +142,7 @@ unique keys is trivial, so Brut provides a way to do that.
142
142
  > A **key** simply uniquely identifies a row or is a unique constraint on a table.
143
143
  > Tables have only one primary key, but potentially many keys. Brut uses
144
144
  > *synthetic* (sometimes called *surrogate*) keys as primary keys. This means
145
- > they have no business meaning and can be safely used for foreighn keys
145
+ > they have no business meaning and can be safely used for foreign keys
146
146
  > and other cases without conflating them with domain concepts.
147
147
 
148
148
 
@@ -11,6 +11,7 @@ The simplest way to use `mkbrut` is to use an existing [Docker image](https://hu
11
11
  docker run \
12
12
  -v "$PWD":"$PWD" \
13
13
  -w "$PWD" \
14
+ -u $(id -u):$(id -g) \
14
15
  -it \
15
16
  thirdtank/mkbrut \
16
17
  mkbrut my-new-app
@@ -34,6 +35,7 @@ For now:
34
35
  docker run \
35
36
  -v "$PWD":"$PWD" \
36
37
  -w "$PWD" \
38
+ -u $(id -u):$(id -g) \
37
39
  -it \
38
40
  thirdtank/mkbrut \
39
41
  mkbrut my-new-app
@@ -55,6 +57,7 @@ To create your app without the demo components:
55
57
  docker run \
56
58
  -v "$PWD":"$PWD" \
57
59
  -w "$PWD" \
60
+ -u $(id -u):$(id -g) \
58
61
  -it \
59
62
  thirdtank/mkbrut \
60
63
  mkbrut my-new-app --no-demo
@@ -20,6 +20,12 @@ more aestheticly pleasing form. You already need to know CSS, HTML, the Web
20
20
  Platform, and SQL, so there's little to gain by requiring you to learn a different
21
21
  way to use them.
22
22
 
23
+ ## Yes, You Can Build a Blog in 15 Minutes
24
+
25
+ <iframe title="Make a Blog App in 15(ish) minutes With BrutRB - A New Ruby Web Framework" width="560" height="315" src="https://video.hardlimit.com/videos/embed/ae7EMhwjDq9kSH5dqQ9swV" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
26
+
27
+ [Check out the source code](https://github.com/thirdtank/blog-demo) if you want to dive right in.
28
+
23
29
  ## Basic Elements
24
30
 
25
31
  Brut organizes its code and behavior around four basic concepts:
@@ -66,7 +66,7 @@ bin/db migrate
66
66
  > [!IMPORTANT]
67
67
  > This only applied migrations to the dev database. `bin/ci` and `bin/test e2e`
68
68
  > will apply them to the test database, but you may need to do it yourself via
69
- > `bin/db migration -e test`
69
+ > `bin/db migrate -e test`
70
70
 
71
71
  > [!NOTE]
72
72
  > There is no down migration. If you need to change and re-apply this before
@@ -2,6 +2,10 @@
2
2
 
3
3
  A real tutorial will appear here eventually.
4
4
 
5
- In the mean time, [ADRs.cloud](https://github.com/thirdtank/adrs.cloud) is a
6
- full-fledge Brut app you can examine to see how things work. You can be running it
7
- locally in minutes, once you install Docker.
5
+ There are two apps you can check out in the mean time:
6
+
7
+ * [A 15-minute Blog](https://github.com/thirdtank/blog-demo) (see [demo video on how this is made](https://video.hardlimit.com/w/ae7EMhwjDq9kSH5dqQ9swV))
8
+ * [ADRs.cloud](https://github.com/thirdtank/adrs.cloud), which is a more realistic app that has
9
+ mulitple database tables, progressively-enhanced UI, and background jobs.
10
+
11
+ You can be running either of these locally in minutes as long as you have Docker installed.
@@ -12,6 +12,9 @@ services:
12
12
  - type: bind
13
13
  source: ${GIT_CONFIG}
14
14
  target: "/home/appuser/.gitconfig"
15
+ - type: bind
16
+ source: "/var/run/docker.sock"
17
+ target: "/var/run/docker.sock"
15
18
  command: /home/appuser/show-help-in-app-container-then-wait.sh
16
19
  working_dir: ${PWD}
17
20
  environment:
data/docs/404.html CHANGED
@@ -9,7 +9,7 @@
9
9
  <link rel="preload stylesheet" href="/assets/style.B1z60PPQ.css" as="style">
10
10
  <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/assets/app.D6BuVHo9.js"></script>
12
+ <script type="module" src="/assets/app.CmkhEsw7.js"></script>
13
13
  <link rel="icon" href="/favicon.ico">
14
14
  <meta property="og:title" content="BrutRB Documentation">
15
15
  <meta property="og:type" content="website">
@@ -20,7 +20,7 @@
20
20
  </head>
21
21
  <body>
22
22
  <div id="app"></div>
23
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"BxjHi9-8\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"iLiv2E9X\",\"configuration.md\":\"DmuAdsli\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"C5gXexJi\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"DRH2D2-O\",\"dir-structure.md\":\"CWir1pic\",\"doc-conventions.md\":\"DOkAuXlt\",\"end-to-end-tests.md\":\"DzqRpZ43\",\"features.md\":\"DPFXsy0z\",\"flash-and-session.md\":\"nPvUpnUx\",\"form-constraints.md\":\"DK5adCgM\",\"forms.md\":\"D8aa_qI-\",\"getting-started.md\":\"DLplsDUd\",\"handlers.md\":\"h84MMB1R\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"BAm9t9JJ\",\"index.md\":\"Bn9e0sRJ\",\"instrumentation.md\":\"BgcaGVYH\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CVGl9xIO\",\"lsp.md\":\"Dn1rIiW0\",\"markdown-examples.md\":\"CCFEQO44\",\"middleware.md\":\"Czz_UlJN\",\"overview.md\":\"iMnwLO4x\",\"pages.md\":\"B7Hc-i6H\",\"recipes_alternate-layouts.md\":\"BwEytl59\",\"recipes_authentication.md\":\"Dzvi_g69\",\"recipes_blank-layouts.md\":\"fyAUJyJR\",\"recipes_custom-flash.md\":\"CrQbI5eH\",\"recipes_indexed-forms.md\":\"CstYyOSo\",\"recipes_migrations.md\":\"DPN3gQE3\",\"recipes_text-field-component.md\":\"H4wLAK0Z\",\"roadmap.md\":\"C6PRi0DX\",\"routes.md\":\"BD6y2i-f\",\"security.md\":\"C0G_AZR-\",\"seed-data.md\":\"BvFZlqIk\",\"space-time-continuum.md\":\"xl44xDos\",\"tutorial.md\":\"BYXj4cOu\",\"unit-tests.md\":\"DUGrnLj5\",\"why.md\":\"C-hk5xgJ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Brut RB\",\"description\":\"Documentation for the Brut.RB web framework.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Overview\",\"link\":\"/overview\"},{\"text\":\"Brut API\",\"link\":\"/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutCSS\",\"link\":\"/brut-css/index.html\",\"target\":\"_self\"}],\"outline\":[2,3],\"sidebar\":[{\"text\":\"Overview\",\"collapsed\":false,\"items\":[{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Concepts\",\"link\":\"/overview\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Directory Structure\",\"link\":\"/dir-structure\"},{\"text\":\"Dev Environment\",\"link\":\"/dev-environment\"},{\"text\":\"Tutorial\",\"link\":\"/tutorial\"},{\"text\":\"Documentation Conventions\",\"link\":\"/doc-conventions\"}]},{\"text\":\"Front-End\",\"collapsed\":false,\"items\":[{\"text\":\"Routes\",\"link\":\"/routes\"},{\"text\":\"Pages\",\"link\":\"/pages\"},{\"text\":\"Layouts\",\"link\":\"/layouts\"},{\"text\":\"Forms\",\"link\":\"/forms\"},{\"text\":\"Form Constraints\",\"link\":\"/form-constraints\"},{\"text\":\"Handlers and Actions\",\"link\":\"/handlers\"},{\"text\":\"Components\",\"link\":\"/components\"},{\"text\":\"Flash and Session\",\"link\":\"/flash-and-session\"},{\"text\":\"Space/Time Continuum\",\"link\":\"/space-time-continuum\"},{\"text\":\"JavaScript\",\"link\":\"/javascript\"},{\"text\":\"CSS\",\"link\":\"/css\"},{\"text\":\"Assets\",\"link\":\"/assets\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js\"}]},{\"text\":\"Back-End\",\"collapsed\":false,\"items\":[{\"text\":\"Database Schema\",\"link\":\"/database-schema\"},{\"text\":\"Database Access\",\"link\":\"/database-access\"},{\"text\":\"Seed Data\",\"link\":\"/seed-data\"},{\"text\":\"Jobs\",\"link\":\"/jobs\"},{\"text\":\"Business Logic\",\"link\":\"/business-logic\"}]},{\"text\":\"Framework\",\"collapsed\":false,\"items\":[{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"Keyword Injection\",\"link\":\"/keyword-injection\"},{\"text\":\"I18n\",\"link\":\"/i18n\"},{\"text\":\"CLI / Tasks\",\"link\":\"/cli\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"}]},{\"text\":\"Testing\",\"collapsed\":false,\"items\":[{\"text\":\"Unit Tests\",\"link\":\"/unit-tests\"},{\"text\":\"End-to-End Tests\",\"link\":\"/end-to-end-tests\"},{\"text\":\"Testing Custom Elements\",\"link\":\"/custom-element-tests\"}]},{\"text\":\"Advanced Topics\",\"collapsed\":true,\"items\":[{\"text\":\"Route Hooks\",\"link\":\"/hooks\"},{\"text\":\"Middleware\",\"link\":\"/middleware\"},{\"text\":\"Instrumentation\",\"link\":\"/instrumentation\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"LSP Support\",\"link\":\"/lsp\"}]},{\"text\":\"Recipes\",\"collapsed\":true,\"items\":[{\"text\":\"Migration Basics\",\"link\":\"/recipes/migrations\"},{\"text\":\"Authentication\",\"link\":\"/recipes/authentication\"},{\"text\":\"Alternate Layouts\",\"link\":\"/recipes/alternate-layouts\"},{\"text\":\"Blank Layouts\",\"link\":\"/recipes/blank-layouts\"},{\"text\":\"Custom Flash Class\",\"link\":\"/recipes/custom-flash\"},{\"text\":\"Indexed Form Elements\",\"link\":\"/recipes/indexed-forms\"},{\"text\":\"Text Field Component\",\"link\":\"/recipes/text-field-component\"}]},{\"text\":\"Meta\",\"collapsed\":false,\"items\":[{\"text\":\"Why?!\",\"link\":\"/why\"},{\"text\":\"ADRs\",\"link\":\"/adrs\"},{\"text\":\"Roadmap to 1.0\",\"link\":\"/roadmap\"},{\"text\":\"AI Declaration\",\"link\":\"/ai\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/thirdtank/brut\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
23
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"BxjHi9-8\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"-22ecBxM\",\"configuration.md\":\"CLKL1lFf\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"LpmBPVEU\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"DRH2D2-O\",\"dir-structure.md\":\"CWir1pic\",\"doc-conventions.md\":\"DOkAuXlt\",\"end-to-end-tests.md\":\"DzqRpZ43\",\"features.md\":\"DPFXsy0z\",\"flash-and-session.md\":\"nPvUpnUx\",\"form-constraints.md\":\"DK5adCgM\",\"forms.md\":\"CBI5--o2\",\"getting-started.md\":\"D5nzBZ4J\",\"handlers.md\":\"h84MMB1R\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"BAm9t9JJ\",\"index.md\":\"Bn9e0sRJ\",\"instrumentation.md\":\"BgcaGVYH\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CVGl9xIO\",\"lsp.md\":\"Dn1rIiW0\",\"markdown-examples.md\":\"CCFEQO44\",\"middleware.md\":\"Czz_UlJN\",\"overview.md\":\"DlKiRRG_\",\"pages.md\":\"B7Hc-i6H\",\"recipes_alternate-layouts.md\":\"BwEytl59\",\"recipes_authentication.md\":\"Dzvi_g69\",\"recipes_blank-layouts.md\":\"fyAUJyJR\",\"recipes_custom-flash.md\":\"CrQbI5eH\",\"recipes_indexed-forms.md\":\"CstYyOSo\",\"recipes_migrations.md\":\"CTcnWDJF\",\"recipes_text-field-component.md\":\"H4wLAK0Z\",\"roadmap.md\":\"C6PRi0DX\",\"routes.md\":\"BD6y2i-f\",\"security.md\":\"C0G_AZR-\",\"seed-data.md\":\"BvFZlqIk\",\"space-time-continuum.md\":\"xl44xDos\",\"tutorial.md\":\"BIb7XT6j\",\"unit-tests.md\":\"DUGrnLj5\",\"why.md\":\"C-hk5xgJ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Brut RB\",\"description\":\"Documentation for the Brut.RB web framework.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Overview\",\"link\":\"/overview\"},{\"text\":\"Brut API\",\"link\":\"/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutCSS\",\"link\":\"/brut-css/index.html\",\"target\":\"_self\"}],\"outline\":[2,3],\"sidebar\":[{\"text\":\"Overview\",\"collapsed\":false,\"items\":[{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Concepts\",\"link\":\"/overview\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Directory Structure\",\"link\":\"/dir-structure\"},{\"text\":\"Dev Environment\",\"link\":\"/dev-environment\"},{\"text\":\"Tutorial\",\"link\":\"/tutorial\"},{\"text\":\"Documentation Conventions\",\"link\":\"/doc-conventions\"}]},{\"text\":\"Front-End\",\"collapsed\":false,\"items\":[{\"text\":\"Routes\",\"link\":\"/routes\"},{\"text\":\"Pages\",\"link\":\"/pages\"},{\"text\":\"Layouts\",\"link\":\"/layouts\"},{\"text\":\"Forms\",\"link\":\"/forms\"},{\"text\":\"Form Constraints\",\"link\":\"/form-constraints\"},{\"text\":\"Handlers and Actions\",\"link\":\"/handlers\"},{\"text\":\"Components\",\"link\":\"/components\"},{\"text\":\"Flash and Session\",\"link\":\"/flash-and-session\"},{\"text\":\"Space/Time Continuum\",\"link\":\"/space-time-continuum\"},{\"text\":\"JavaScript\",\"link\":\"/javascript\"},{\"text\":\"CSS\",\"link\":\"/css\"},{\"text\":\"Assets\",\"link\":\"/assets\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js\"}]},{\"text\":\"Back-End\",\"collapsed\":false,\"items\":[{\"text\":\"Database Schema\",\"link\":\"/database-schema\"},{\"text\":\"Database Access\",\"link\":\"/database-access\"},{\"text\":\"Seed Data\",\"link\":\"/seed-data\"},{\"text\":\"Jobs\",\"link\":\"/jobs\"},{\"text\":\"Business Logic\",\"link\":\"/business-logic\"}]},{\"text\":\"Framework\",\"collapsed\":false,\"items\":[{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"Keyword Injection\",\"link\":\"/keyword-injection\"},{\"text\":\"I18n\",\"link\":\"/i18n\"},{\"text\":\"CLI / Tasks\",\"link\":\"/cli\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"}]},{\"text\":\"Testing\",\"collapsed\":false,\"items\":[{\"text\":\"Unit Tests\",\"link\":\"/unit-tests\"},{\"text\":\"End-to-End Tests\",\"link\":\"/end-to-end-tests\"},{\"text\":\"Testing Custom Elements\",\"link\":\"/custom-element-tests\"}]},{\"text\":\"Advanced Topics\",\"collapsed\":true,\"items\":[{\"text\":\"Route Hooks\",\"link\":\"/hooks\"},{\"text\":\"Middleware\",\"link\":\"/middleware\"},{\"text\":\"Instrumentation\",\"link\":\"/instrumentation\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"LSP Support\",\"link\":\"/lsp\"}]},{\"text\":\"Recipes\",\"collapsed\":true,\"items\":[{\"text\":\"Migration Basics\",\"link\":\"/recipes/migrations\"},{\"text\":\"Authentication\",\"link\":\"/recipes/authentication\"},{\"text\":\"Alternate Layouts\",\"link\":\"/recipes/alternate-layouts\"},{\"text\":\"Blank Layouts\",\"link\":\"/recipes/blank-layouts\"},{\"text\":\"Custom Flash Class\",\"link\":\"/recipes/custom-flash\"},{\"text\":\"Indexed Form Elements\",\"link\":\"/recipes/indexed-forms\"},{\"text\":\"Text Field Component\",\"link\":\"/recipes/text-field-component\"}]},{\"text\":\"Meta\",\"collapsed\":false,\"items\":[{\"text\":\"Why?!\",\"link\":\"/why\"},{\"text\":\"ADRs\",\"link\":\"/adrs\"},{\"text\":\"Roadmap to 1.0\",\"link\":\"/roadmap\"},{\"text\":\"AI Declaration\",\"link\":\"/ai\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/thirdtank/brut\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
24
24
 
25
25
  </body>
26
26
  </html>