brut 0.3.1 → 0.4.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 (369) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/Gemfile.lock +1 -1
  4. data/brut-js/CHANGELOG.md +5 -0
  5. data/brut-js/package-lock.json +2 -2
  6. data/brut-js/package.json +1 -1
  7. data/brut-js/specs/ConstraintViolationMessage.spec.js +1 -1
  8. data/brut-js/specs/ConstraintViolationMessages.spec.js +2 -2
  9. data/brut-js/specs/Form.spec.js +5 -5
  10. data/brut-js/src/ConstraintViolationMessage.js +3 -3
  11. data/brut-js/src/ConstraintViolationMessages.js +2 -2
  12. data/brutrb.com/database-schema.md +22 -2
  13. data/brutrb.com/dev-environment.md +1 -0
  14. data/brutrb.com/form-constraints.md +2 -2
  15. data/brutrb.com/handlers.md +1 -1
  16. data/brutrb.com/i18n.md +2 -2
  17. data/brutrb.com/layouts.md +1 -1
  18. data/docs/404.html +2 -2
  19. data/docs/adrs.html +3 -3
  20. data/docs/ai.html +3 -3
  21. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  22. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  23. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  24. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  25. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  26. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  27. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  28. data/docs/api/Brut/BackEnd.html +1 -1
  29. data/docs/api/Brut/CLI/App.html +1 -1
  30. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  32. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +6 -6
  33. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +6 -6
  35. data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
  36. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +6 -2
  40. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/DB/Status.html +9 -9
  43. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  47. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  48. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +8 -12
  50. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +5 -5
  52. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +384 -0
  53. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  54. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +5 -5
  55. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +36 -36
  58. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  59. data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
  60. data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
  61. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  62. data/docs/api/Brut/CLI/Apps/Test/JS.html +1 -1
  63. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  64. data/docs/api/Brut/CLI/Apps/Test.html +1 -1
  65. data/docs/api/Brut/CLI/Apps.html +1 -1
  66. data/docs/api/Brut/CLI/Command.html +29 -31
  67. data/docs/api/Brut/CLI/Error.html +1 -1
  68. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  69. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  70. data/docs/api/Brut/CLI/Executor.html +1 -1
  71. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  72. data/docs/api/Brut/CLI/Options.html +1 -1
  73. data/docs/api/Brut/CLI/Output.html +1 -1
  74. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  75. data/docs/api/Brut/CLI.html +1 -1
  76. data/docs/api/Brut/FactoryBot.html +1 -1
  77. data/docs/api/Brut/Framework/App.html +1 -1
  78. data/docs/api/Brut/Framework/Config.html +16 -2
  79. data/docs/api/Brut/Framework/Container.html +1 -1
  80. data/docs/api/Brut/Framework/Error.html +1 -1
  81. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  82. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  83. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  84. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  85. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  86. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  87. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  88. data/docs/api/Brut/Framework/Errors.html +1 -1
  89. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  90. data/docs/api/Brut/Framework/MCP.html +1 -1
  91. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  92. data/docs/api/Brut/Framework.html +1 -1
  93. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +3 -3
  97. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +10 -14
  99. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +3 -3
  104. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Form.html +92 -20
  114. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  126. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  130. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  131. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  132. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  133. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  134. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  135. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  136. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  137. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  138. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  143. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  144. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  145. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  146. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  147. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
  148. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  153. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  154. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  155. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  156. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  157. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  163. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  164. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  165. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  166. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  167. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  168. data/docs/api/Brut/FrontEnd.html +1 -1
  169. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  170. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  171. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  172. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  173. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  174. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  175. data/docs/api/Brut/I18n.html +1 -1
  176. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  177. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  178. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  179. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  180. data/docs/api/Brut/Instrumentation.html +1 -1
  181. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  182. data/docs/api/Brut/SinatraHelpers.html +1 -1
  183. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  184. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  185. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  186. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  188. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  189. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  190. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  191. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  192. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  193. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  199. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  200. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  201. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  203. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  204. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  205. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  206. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  207. data/docs/api/Brut/SpecSupport.html +1 -1
  208. data/docs/api/Brut.html +1 -1
  209. data/docs/api/Clock.html +1 -1
  210. data/docs/api/ModuleName.html +595 -0
  211. data/docs/api/RichString.html +1 -1
  212. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  213. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  214. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  215. data/docs/api/Sequel/Extensions.html +1 -1
  216. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  217. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  218. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  219. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  220. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  221. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  222. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  223. data/docs/api/Sequel/Plugins.html +1 -1
  224. data/docs/api/Sequel.html +1 -1
  225. data/docs/api/_index.html +24 -12
  226. data/docs/api/class_list.html +1 -1
  227. data/docs/api/file.README.html +1 -1
  228. data/docs/api/index.html +1 -1
  229. data/docs/api/method_list.html +478 -406
  230. data/docs/api/top-level-namespace.html +2 -2
  231. data/docs/assets/{app.C0n_5kBs.js → app.AkS4fHzI.js} +1 -1
  232. data/docs/assets/chunks/@localSearchIndexroot.C9FqcQxD.js +1 -0
  233. data/docs/assets/chunks/{VPLocalSearchBox.yICoU-Ly.js → VPLocalSearchBox.By6un1FD.js} +1 -1
  234. data/docs/assets/chunks/{theme.gMVDgzXI.js → theme.DwiUPdci.js} +2 -2
  235. data/docs/assets/{components.md.DGVPNB9a.js → components.md.BfeWD9sX.js} +3 -3
  236. data/docs/assets/{configuration.md.DK3YrtYn.js → configuration.md.DoSBNc0H.js} +1 -1
  237. data/docs/assets/{database-schema.md.CSYk6E6v.js → database-schema.md.C5gXexJi.js} +10 -3
  238. data/docs/assets/{database-schema.md.CSYk6E6v.lean.js → database-schema.md.C5gXexJi.lean.js} +1 -1
  239. data/docs/assets/{dev-environment.md.Dy6EldaM.js → dev-environment.md.DRH2D2-O.js} +3 -3
  240. data/docs/assets/dev-environment.md.DRH2D2-O.lean.js +1 -0
  241. data/docs/assets/{form-constraints.md.x5tNpTTI.js → form-constraints.md.DK5adCgM.js} +2 -2
  242. data/docs/assets/{forms.md.DwdQGwOK.js → forms.md.DFveP5g_.js} +1 -1
  243. data/docs/assets/{getting-started.md.DuiTvmpG.js → getting-started.md.DZWjCVC0.js} +3 -3
  244. data/docs/assets/{getting-started.md.DuiTvmpG.lean.js → getting-started.md.DZWjCVC0.lean.js} +1 -1
  245. data/docs/assets/{handlers.md.Chyri6KA.js → handlers.md.h84MMB1R.js} +1 -1
  246. data/docs/assets/{i18n.md.xQhiGo1G.js → i18n.md.BAm9t9JJ.js} +1 -1
  247. data/docs/assets/{layouts.md.CJGDFY-m.js → layouts.md.CVGl9xIO.js} +1 -1
  248. data/docs/assets.html +3 -3
  249. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  250. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  251. data/docs/brut-js/api/Autosubmit.html +1 -1
  252. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  253. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  254. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  255. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  256. data/docs/brut-js/api/BufferedLogger.html +1 -1
  257. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  258. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  259. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  260. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  261. data/docs/brut-js/api/ConstraintViolationMessage.html +2 -2
  262. data/docs/brut-js/api/ConstraintViolationMessage.js.html +4 -4
  263. data/docs/brut-js/api/ConstraintViolationMessages.html +3 -3
  264. data/docs/brut-js/api/ConstraintViolationMessages.js.html +3 -3
  265. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  266. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  267. data/docs/brut-js/api/Form.html +1 -1
  268. data/docs/brut-js/api/Form.js.html +1 -1
  269. data/docs/brut-js/api/I18nTranslation.html +1 -1
  270. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  271. data/docs/brut-js/api/LocaleDetection.html +1 -1
  272. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  273. data/docs/brut-js/api/Logger.html +1 -1
  274. data/docs/brut-js/api/Logger.js.html +1 -1
  275. data/docs/brut-js/api/Message.html +1 -1
  276. data/docs/brut-js/api/Message.js.html +1 -1
  277. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  278. data/docs/brut-js/api/RichString.html +1 -1
  279. data/docs/brut-js/api/RichString.js.html +1 -1
  280. data/docs/brut-js/api/Tabs.html +1 -1
  281. data/docs/brut-js/api/Tabs.js.html +1 -1
  282. data/docs/brut-js/api/Tracing.html +1 -1
  283. data/docs/brut-js/api/Tracing.js.html +1 -1
  284. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  285. data/docs/brut-js/api/external-Performance.html +1 -1
  286. data/docs/brut-js/api/external-Promise.html +1 -1
  287. data/docs/brut-js/api/external-ValidityState.html +1 -1
  288. data/docs/brut-js/api/external-Window.html +1 -1
  289. data/docs/brut-js/api/external-fetch.html +1 -1
  290. data/docs/brut-js/api/global.html +1 -1
  291. data/docs/brut-js/api/index.html +1 -1
  292. data/docs/brut-js/api/index.js.html +1 -1
  293. data/docs/brut-js/api/module-testing.html +1 -1
  294. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  295. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  296. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  297. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  298. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  299. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  300. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  301. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  302. data/docs/brut-js/api/testing_index.js.html +1 -1
  303. data/docs/brut-js.html +3 -3
  304. data/docs/business-logic.html +3 -3
  305. data/docs/cli.html +3 -3
  306. data/docs/components.html +7 -7
  307. data/docs/configuration.html +5 -5
  308. data/docs/css.html +3 -3
  309. data/docs/custom-element-tests.html +3 -3
  310. data/docs/database-access.html +3 -3
  311. data/docs/database-schema.html +12 -5
  312. data/docs/deployment.html +3 -3
  313. data/docs/dev-environment.html +5 -5
  314. data/docs/dir-structure.html +3 -3
  315. data/docs/doc-conventions.html +3 -3
  316. data/docs/end-to-end-tests.html +3 -3
  317. data/docs/features.html +3 -3
  318. data/docs/flash-and-session.html +3 -3
  319. data/docs/form-constraints.html +6 -6
  320. data/docs/forms.html +5 -5
  321. data/docs/getting-started.html +6 -6
  322. data/docs/handlers.html +5 -5
  323. data/docs/hashmap.json +1 -1
  324. data/docs/hooks.html +3 -3
  325. data/docs/i18n.html +5 -5
  326. data/docs/index.html +3 -3
  327. data/docs/instrumentation.html +3 -3
  328. data/docs/javascript.html +3 -3
  329. data/docs/jobs.html +3 -3
  330. data/docs/keyword-injection.html +3 -3
  331. data/docs/layouts.html +5 -5
  332. data/docs/lsp.html +3 -3
  333. data/docs/markdown-examples.html +3 -3
  334. data/docs/middleware.html +3 -3
  335. data/docs/overview.html +3 -3
  336. data/docs/pages.html +3 -3
  337. data/docs/recipes/alternate-layouts.html +3 -3
  338. data/docs/recipes/authentication.html +3 -3
  339. data/docs/recipes/blank-layouts.html +3 -3
  340. data/docs/recipes/custom-flash.html +3 -3
  341. data/docs/recipes/indexed-forms.html +3 -3
  342. data/docs/recipes/migrations.html +3 -3
  343. data/docs/recipes/text-field-component.html +3 -3
  344. data/docs/roadmap.html +3 -3
  345. data/docs/routes.html +3 -3
  346. data/docs/security.html +3 -3
  347. data/docs/seed-data.html +3 -3
  348. data/docs/space-time-continuum.html +3 -3
  349. data/docs/tutorial.html +3 -3
  350. data/docs/unit-tests.html +3 -3
  351. data/docs/why.html +3 -3
  352. data/lib/brut/cli/apps/scaffold.rb +77 -0
  353. data/lib/brut/cli/command.rb +1 -2
  354. data/lib/brut/framework/config.rb +7 -0
  355. data/lib/brut/front_end/components/constraint_violations.rb +2 -2
  356. data/lib/brut/front_end/components/i18n_translations.rb +6 -10
  357. data/lib/brut/front_end/form.rb +5 -2
  358. data/lib/brut/junk_drawer.rb +53 -0
  359. data/lib/brut/version.rb +1 -1
  360. metadata +28 -25
  361. data/docs/assets/chunks/@localSearchIndexroot.BF2caq1f.js +0 -1
  362. data/docs/assets/dev-environment.md.Dy6EldaM.lean.js +0 -1
  363. /data/docs/assets/{components.md.DGVPNB9a.lean.js → components.md.BfeWD9sX.lean.js} +0 -0
  364. /data/docs/assets/{configuration.md.DK3YrtYn.lean.js → configuration.md.DoSBNc0H.lean.js} +0 -0
  365. /data/docs/assets/{form-constraints.md.x5tNpTTI.lean.js → form-constraints.md.DK5adCgM.lean.js} +0 -0
  366. /data/docs/assets/{forms.md.DwdQGwOK.lean.js → forms.md.DFveP5g_.lean.js} +0 -0
  367. /data/docs/assets/{handlers.md.Chyri6KA.lean.js → handlers.md.h84MMB1R.lean.js} +0 -0
  368. /data/docs/assets/{i18n.md.xQhiGo1G.lean.js → i18n.md.BAm9t9JJ.lean.js} +0 -0
  369. /data/docs/assets/{layouts.md.CJGDFY-m.lean.js → layouts.md.CVGl9xIO.lean.js} +0 -0
data/docs/ai.html CHANGED
@@ -9,8 +9,8 @@
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.C0n_5kBs.js"></script>
13
- <link rel="modulepreload" href="/assets/chunks/theme.gMVDgzXI.js">
12
+ <script type="module" src="/assets/app.AkS4fHzI.js"></script>
13
+ <link rel="modulepreload" href="/assets/chunks/theme.DwiUPdci.js">
14
14
  <link rel="modulepreload" href="/assets/chunks/framework.1L-BeKqY.js">
15
15
  <link rel="modulepreload" href="/assets/ai.md.Cy9GWnER.lean.js">
16
16
  <link rel="icon" href="/favicon.ico">
@@ -23,7 +23,7 @@
23
23
  </head>
24
24
  <body>
25
25
  <div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!----><span data-v-9f43907a>Brut RB</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Home</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Getting Started</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/overview.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Overview</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/api/index.html" target="_self" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Brut API</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/brut-js/api/index.html" target="_self" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>BrutJS</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/brut-css/index.html" target="_self" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>BrutCSS</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/thirdtank/brut" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/thirdtank/brut" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Overview</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/getting-started.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Getting Started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/overview.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Concepts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/features.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Features</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/dir-structure.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Directory Structure</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/dev-environment.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Dev Environment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/tutorial.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Tutorial</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/doc-conventions.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Documentation Conventions</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Front-End</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/routes.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Routes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/pages.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Pages</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/layouts.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Layouts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/forms.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Forms</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/form-constraints.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Form Constraints</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/handlers.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Handlers and Actions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/components.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Components</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/flash-and-session.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Flash and Session</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/space-time-continuum.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Space/Time Continuum</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/javascript.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>JavaScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/css.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>CSS</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/assets.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Assets</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/brut-js.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>BrutJS</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Back-End</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/database-schema.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Database Schema</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/database-access.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Database Access</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/seed-data.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Seed Data</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/jobs.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Jobs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/business-logic.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Business Logic</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Framework</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/configuration.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Configuration</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/keyword-injection.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Keyword Injection</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/i18n.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>I18n</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/cli.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>CLI / Tasks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/deployment.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Deployment</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Testing</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/unit-tests.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Unit Tests</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/end-to-end-tests.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>End-to-End Tests</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/custom-element-tests.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Testing Custom Elements</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Advanced Topics</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/hooks.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Route Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/middleware.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Middleware</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/instrumentation.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Instrumentation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/security.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Security</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/lsp.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>LSP Support</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible collapsed" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Recipes</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/migrations.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Migration Basics</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/authentication.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Authentication</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/alternate-layouts.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Alternate Layouts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/blank-layouts.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Blank Layouts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/custom-flash.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Custom Flash Class</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/indexed-forms.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Indexed Form Elements</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/recipes/text-field-component.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Text Field Component</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 collapsible has-active" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Meta</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0009425e><span class="vpi-chevron-right caret-icon" data-v-0009425e></span></div></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/why.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Why?!</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/adrs.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>ADRs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/roadmap.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Roadmap to 1.0</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/ai.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>AI Declaration</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _ai" data-v-e6f2a212><div><h1 id="ai-declaration-and-notes" tabindex="-1">AI Declaration and Notes <a class="header-anchor" href="#ai-declaration-and-notes" aria-label="Permalink to &quot;AI Declaration and Notes&quot;">​</a></h1><p>LLMs and AI tools are a current fact of life. We feel it&#39;s important to be realistic and up front about how they affect this project.</p><h2 id="levels-of-ai-use" tabindex="-1">Levels of AI Use <a class="header-anchor" href="#levels-of-ai-use" aria-label="Permalink to &quot;Levels of AI Use&quot;">​</a></h2><p>I created <a href="https://declare-ai.org/" target="_blank" rel="noreferrer">declare-ai.org</a> to allow precise documentation of how AI is used in a project. It defines four levels of AI use:</p><ol><li>No involvement at all.</li><li>Non-create assistance, such as the completions GitHub Copilot may make while you are typing.</li><li>Creative assistance, where an AI generated a large amount of code that you then modified. An example would be using a tool like Cursor to write code for your review.</li><li>Completely Produced by an AI, for example if you used Stable Diffusion to create your icon.</li></ol><h2 id="code" tabindex="-1">Code <a class="header-anchor" href="#code" aria-label="Permalink to &quot;Code&quot;">​</a></h2><p>The entirety of Brut&#39;s codebase could be grouped into three parts:</p><ul><li>The library code developers use. This is, roughly, the code in <code>lib</code>, <code>brut-js/src</code>, and <code>brut-css/src</code>.</li><li>Tests of the library code.</li><li>Tools used to manage the library code, such as what&#39;s in <code>bin/</code>, <code>brut-js/bin</code>, <code>brut-css/bin</code>, etc.</li></ul><h3 id="library-code-should-be-written-by-a-person" tabindex="-1">Library Code Should Be Written By a Person <a class="header-anchor" href="#library-code-should-be-written-by-a-person" aria-label="Permalink to &quot;Library Code Should Be Written By a Person&quot;">​</a></h3><p>We want the library code written by a person, i.e. it should have level 1 AI assistance: none. As of this writing—June 17, 2025—all library code was written by a person.</p><p>If some code is level 2—non-creative assistance—that is probably fine.</p><h3 id="tests-should-not-be-totally-written-by-ai" tabindex="-1">Tests Should Not Be Totally Written by AI <a class="header-anchor" href="#tests-should-not-be-totally-written-by-ai" aria-label="Permalink to &quot;Tests Should Not Be Totally Written by AI&quot;">​</a></h3><p>As of this writing—June 17, 2025—the library has no automated tests. The <code>adrs.cloud</code> app serves as the test suite.</p><p>That said, as tests are developed, they must never be written entirely by an AI without human review (level 4). Our preference is that all tests comply with level 1 or level 2, however we are open to creative assistance for tests as might be provided by a tool like Cursor.</p><p>In any case, the author of a test should understand it and the maintainers must be able to understand and modify all tests without the use of AI tools.</p><h3 id="management-tools-should-not-be-totally-written-by-ai" tabindex="-1">Management Tools Should Not Be Totally Written by AI <a class="header-anchor" href="#management-tools-should-not-be-totally-written-by-ai" aria-label="Permalink to &quot;Management Tools Should Not Be Totally Written by AI&quot;">​</a></h3><p>Like tests, management tools must be comprehensible by a person and the creator of the code must understand it. That said, some of the tools were created with level 3 AI assistance, and we expect these tools may continue to be created this way.</p><p>Nevertheless, this code must be reviewed and understood by a person.</p><h2 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to &quot;Documentation&quot;">​</a></h2><p>We strive to have all documentation written by a real person. None of this documentation, or the API documentation, is produced by a machine, although spelling and grammar corrections will certainly have been suggested by automated tools.</p><p>We expect an LLM to be able to digest this documentation and source code and provide alternate analysis of how Brut works and how to use it. We hope such analysis is correct and useful, however that cannot be guaranteed, so this documentation is the second best source of truth, the source code being the best.</p><h2 id="logos" tabindex="-1">Logos <a class="header-anchor" href="#logos" aria-label="Permalink to &quot;Logos&quot;">​</a></h2><p>While the various logos look like someone typed &quot;make me a logo in the style of the Washington, DC Metro&quot;, if you look closely, you will see the telltale sings that they were made by a person…a person who is not a professional designer.</p><p>As such, these are all Level 1.</p><h2 id="ai-information-about-brut-should-be-viewed-with-skepticism" tabindex="-1">AI Information about Brut Should Be Viewed with Skepticism <a class="header-anchor" href="#ai-information-about-brut-should-be-viewed-with-skepticism" aria-label="Permalink to &quot;AI Information about Brut Should Be Viewed with Skepticism&quot;">​</a></h2><ul><li><strong>Answers from an LLM about Brut are likely incorrect.</strong> LLMs will certainly not have been trained on information about Brut, since it is new.</li><li><strong>Code Completions of Brut Code are suspect.</strong> I have observed that e.g. GitHub CoPilot is capable for properly completing Brut code if there is enough context, but it is not capable of, say, creating a component from scratch. <strong>Review all Code Completions Carefully</strong>.</li></ul></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/roadmap.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Previous page</span><span class="title" data-v-1bcd8184>Roadmap to 1.0</span><!--]--></a></div><div class="pager" data-v-1bcd8184><!----></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
26
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"JRxZ5uYE\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"DGVPNB9a\",\"configuration.md\":\"DK3YrtYn\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"CSYk6E6v\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"Dy6EldaM\",\"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\":\"x5tNpTTI\",\"forms.md\":\"DwdQGwOK\",\"getting-started.md\":\"DuiTvmpG\",\"handlers.md\":\"Chyri6KA\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"xQhiGo1G\",\"index.md\":\"Bn9e0sRJ\",\"instrumentation.md\":\"BgcaGVYH\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CJGDFY-m\",\"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>
26
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"JRxZ5uYE\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"BfeWD9sX\",\"configuration.md\":\"DoSBNc0H\",\"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\":\"DFveP5g_\",\"getting-started.md\":\"DZWjCVC0\",\"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>
27
27
 
28
28
  </body>
29
29
  </html>
@@ -483,7 +483,7 @@ extends this one. Do not override this method.</p>
483
483
  </div>
484
484
 
485
485
  <div id="footer">
486
- Generated on Thu Jul 10 13:41:04 2025 by
486
+ Generated on Sat Jul 12 21:25:21 2025 by
487
487
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
488
488
  0.9.37 (ruby-3.4.4).
489
489
  </div>
@@ -204,7 +204,7 @@ job executions. Do not enable in production.</p>
204
204
  </div>
205
205
 
206
206
  <div id="footer">
207
- Generated on Thu Jul 10 13:41:05 2025 by
207
+ Generated on Sat Jul 12 21:25:22 2025 by
208
208
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
209
209
  0.9.37 (ruby-3.4.4).
210
210
  </div>
@@ -115,7 +115,7 @@
115
115
  </div>
116
116
 
117
117
  <div id="footer">
118
- Generated on Thu Jul 10 13:41:03 2025 by
118
+ Generated on Sat Jul 12 21:25:21 2025 by
119
119
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
120
120
  0.9.37 (ruby-3.4.4).
121
121
  </div>
@@ -115,7 +115,7 @@
115
115
  </div>
116
116
 
117
117
  <div id="footer">
118
- Generated on Thu Jul 10 13:41:03 2025 by
118
+ Generated on Sat Jul 12 21:25:21 2025 by
119
119
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
120
120
  0.9.37 (ruby-3.4.4).
121
121
  </div>
@@ -115,7 +115,7 @@
115
115
  </div>
116
116
 
117
117
  <div id="footer">
118
- Generated on Thu Jul 10 13:41:03 2025 by
118
+ Generated on Sat Jul 12 21:25:20 2025 by
119
119
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
120
120
  0.9.37 (ruby-3.4.4).
121
121
  </div>
@@ -404,7 +404,7 @@ Your subclass of this class is a standalone object that will operate on a form.<
404
404
  </div>
405
405
 
406
406
  <div id="footer">
407
- Generated on Thu Jul 10 13:41:05 2025 by
407
+ Generated on Sat Jul 12 21:25:22 2025 by
408
408
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
409
409
  0.9.37 (ruby-3.4.4).
410
410
  </div>
@@ -118,7 +118,7 @@ data integrity, use your databases constraints and other features.</p>
118
118
  </div>
119
119
 
120
120
  <div id="footer">
121
- Generated on Thu Jul 10 13:41:03 2025 by
121
+ Generated on Sat Jul 12 21:25:20 2025 by
122
122
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
123
123
  0.9.37 (ruby-3.4.4).
124
124
  </div>
@@ -122,7 +122,7 @@ that than it is the front end.</p>
122
122
  </div>
123
123
 
124
124
  <div id="footer">
125
- Generated on Thu Jul 10 13:41:03 2025 by
125
+ Generated on Sat Jul 12 21:25:20 2025 by
126
126
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
127
127
  0.9.37 (ruby-3.4.4).
128
128
  </div>
@@ -1591,7 +1591,7 @@ caused execution to be aborted.</p>
1591
1591
  </div>
1592
1592
 
1593
1593
  <div id="footer">
1594
- Generated on Thu Jul 10 13:41:03 2025 by
1594
+ Generated on Sat Jul 12 21:25:21 2025 by
1595
1595
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1596
1596
  0.9.37 (ruby-3.4.4).
1597
1597
  </div>
@@ -481,7 +481,7 @@
481
481
  </div>
482
482
 
483
483
  <div id="footer">
484
- Generated on Thu Jul 10 13:41:04 2025 by
484
+ Generated on Sat Jul 12 21:25:21 2025 by
485
485
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
486
486
  0.9.37 (ruby-3.4.4).
487
487
  </div>
@@ -242,7 +242,7 @@
242
242
  <span class='id identifier rubyid_out'>out</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Removing </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_asset_metadata_file'>asset_metadata_file</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
243
243
  <span class='const'>FileUtils</span><span class='period'>.</span><span class='id identifier rubyid_rm_f'>rm_f</span><span class='lparen'>(</span><span class='id identifier rubyid_asset_metadata_file'>asset_metadata_file</span><span class='rparen'>)</span>
244
244
  <span class='kw'>end</span>
245
- <span class='id identifier rubyid_delegate_to_commands'>delegate_to_commands</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Images.html" title="Brut::CLI::Apps::BuildAssets::Images (class)">Images</a></span></span><span class='comma'>,</span> <span class='const'><span class='object_link'><a href="JS.html" title="Brut::CLI::Apps::BuildAssets::JS (class)">JS</a></span></span><span class='comma'>,</span> <span class='const'><span class='object_link'><a href="CSS.html" title="Brut::CLI::Apps::BuildAssets::CSS (class)">CSS</a></span></span><span class='rparen'>)</span>
245
+ <span class='id identifier rubyid_delegate_to_commands'>delegate_to_commands</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Images.html" title="Brut::CLI::Apps::BuildAssets::Images (class)">Images</a></span></span><span class='comma'>,</span> <span class='const'><span class='object_link'><a href="Js.html" title="Brut::CLI::Apps::BuildAssets::Js (class)">Js</a></span></span><span class='comma'>,</span> <span class='const'><span class='object_link'><a href="Css.html" title="Brut::CLI::Apps::BuildAssets::Css (class)">Css</a></span></span><span class='rparen'>)</span>
246
246
  <span class='kw'>end</span></pre>
247
247
  </td>
248
248
  </tr>
@@ -254,7 +254,7 @@
254
254
  </div>
255
255
 
256
256
  <div id="footer">
257
- Generated on Thu Jul 10 13:41:04 2025 by
257
+ Generated on Sat Jul 12 21:25:21 2025 by
258
258
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
259
259
  0.9.37 (ruby-3.4.4).
260
260
  </div>
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>
7
- Class: Brut::CLI::Apps::BuildAssets::CSS
7
+ Class: Brut::CLI::Apps::BuildAssets::Css
8
8
 
9
9
  &mdash; Documentation by YARD 0.9.37
10
10
 
@@ -15,7 +15,7 @@
15
15
  <link rel="stylesheet" href="../../../../css/common.css" type="text/css" />
16
16
 
17
17
  <script type="text/javascript">
18
- pathId = "Brut::CLI::Apps::BuildAssets::CSS";
18
+ pathId = "Brut::CLI::Apps::BuildAssets::Css";
19
19
  relpath = '../../../../';
20
20
  </script>
21
21
 
@@ -39,7 +39,7 @@
39
39
  <a href="../../../../_index.html">Index (C)</a> &raquo;
40
40
  <span class='title'><span class='object_link'><a href="../../../../Brut.html" title="Brut (module)">Brut</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../../CLI.html" title="Brut::CLI (module)">CLI</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../Apps.html" title="Brut::CLI::Apps (module)">Apps</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../BuildAssets.html" title="Brut::CLI::Apps::BuildAssets (class)">BuildAssets</a></span></span>
41
41
  &raquo;
42
- <span class="title">CSS</span>
42
+ <span class="title">Css</span>
43
43
 
44
44
  </div>
45
45
 
@@ -59,7 +59,7 @@
59
59
  <div class="clear"></div>
60
60
  </div>
61
61
 
62
- <div id="content"><h1>Class: Brut::CLI::Apps::BuildAssets::CSS
62
+ <div id="content"><h1>Class: Brut::CLI::Apps::BuildAssets::Css
63
63
 
64
64
 
65
65
 
@@ -76,7 +76,7 @@
76
76
 
77
77
  <li class="next"><span class='object_link'><a href="../../Command.html" title="Brut::CLI::Command (class)">Command</a></span></li>
78
78
 
79
- <li class="next">Brut::CLI::Apps::BuildAssets::CSS</li>
79
+ <li class="next">Brut::CLI::Apps::BuildAssets::Css</li>
80
80
 
81
81
  </ul>
82
82
  <a href="#" class="inheritanceTree">show all</a>
@@ -296,7 +296,7 @@
296
296
  </div>
297
297
 
298
298
  <div id="footer">
299
- Generated on Thu Jul 10 13:41:04 2025 by
299
+ Generated on Sat Jul 12 21:25:21 2025 by
300
300
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
301
301
  0.9.37 (ruby-3.4.4).
302
302
  </div>
@@ -252,7 +252,7 @@
252
252
  </div>
253
253
 
254
254
  <div id="footer">
255
- Generated on Thu Jul 10 13:41:04 2025 by
255
+ Generated on Sat Jul 12 21:25:21 2025 by
256
256
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
257
257
  0.9.37 (ruby-3.4.4).
258
258
  </div>
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>
7
- Class: Brut::CLI::Apps::BuildAssets::JS
7
+ Class: Brut::CLI::Apps::BuildAssets::Js
8
8
 
9
9
  &mdash; Documentation by YARD 0.9.37
10
10
 
@@ -15,7 +15,7 @@
15
15
  <link rel="stylesheet" href="../../../../css/common.css" type="text/css" />
16
16
 
17
17
  <script type="text/javascript">
18
- pathId = "Brut::CLI::Apps::BuildAssets::JS";
18
+ pathId = "Brut::CLI::Apps::BuildAssets::Js";
19
19
  relpath = '../../../../';
20
20
  </script>
21
21
 
@@ -39,7 +39,7 @@
39
39
  <a href="../../../../_index.html">Index (J)</a> &raquo;
40
40
  <span class='title'><span class='object_link'><a href="../../../../Brut.html" title="Brut (module)">Brut</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../../CLI.html" title="Brut::CLI (module)">CLI</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../Apps.html" title="Brut::CLI::Apps (module)">Apps</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../BuildAssets.html" title="Brut::CLI::Apps::BuildAssets (class)">BuildAssets</a></span></span>
41
41
  &raquo;
42
- <span class="title">JS</span>
42
+ <span class="title">Js</span>
43
43
 
44
44
  </div>
45
45
 
@@ -59,7 +59,7 @@
59
59
  <div class="clear"></div>
60
60
  </div>
61
61
 
62
- <div id="content"><h1>Class: Brut::CLI::Apps::BuildAssets::JS
62
+ <div id="content"><h1>Class: Brut::CLI::Apps::BuildAssets::Js
63
63
 
64
64
 
65
65
 
@@ -76,7 +76,7 @@
76
76
 
77
77
  <li class="next"><span class='object_link'><a href="../../Command.html" title="Brut::CLI::Command (class)">Command</a></span></li>
78
78
 
79
- <li class="next">Brut::CLI::Apps::BuildAssets::JS</li>
79
+ <li class="next">Brut::CLI::Apps::BuildAssets::Js</li>
80
80
 
81
81
  </ul>
82
82
  <a href="#" class="inheritanceTree">show all</a>
@@ -304,7 +304,7 @@
304
304
  </div>
305
305
 
306
306
  <div id="footer">
307
- Generated on Thu Jul 10 13:41:04 2025 by
307
+ Generated on Sat Jul 12 21:25:21 2025 by
308
308
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
309
309
  0.9.37 (ruby-3.4.4).
310
310
  </div>
@@ -107,7 +107,7 @@
107
107
 
108
108
 
109
109
 
110
- <strong class="classes">Classes:</strong> <span class='object_link'><a href="BuildAssets/All.html" title="Brut::CLI::Apps::BuildAssets::All (class)">All</a></span>, <span class='object_link'><a href="BuildAssets/CSS.html" title="Brut::CLI::Apps::BuildAssets::CSS (class)">CSS</a></span>, <span class='object_link'><a href="BuildAssets/Images.html" title="Brut::CLI::Apps::BuildAssets::Images (class)">Images</a></span>, <span class='object_link'><a href="BuildAssets/JS.html" title="Brut::CLI::Apps::BuildAssets::JS (class)">JS</a></span>
110
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="BuildAssets/All.html" title="Brut::CLI::Apps::BuildAssets::All (class)">All</a></span>, <span class='object_link'><a href="BuildAssets/Css.html" title="Brut::CLI::Apps::BuildAssets::Css (class)">Css</a></span>, <span class='object_link'><a href="BuildAssets/Images.html" title="Brut::CLI::Apps::BuildAssets::Images (class)">Images</a></span>, <span class='object_link'><a href="BuildAssets/Js.html" title="Brut::CLI::Apps::BuildAssets::Js (class)">Js</a></span>
111
111
 
112
112
 
113
113
  </p>
@@ -173,7 +173,7 @@
173
173
  </div>
174
174
 
175
175
  <div id="footer">
176
- Generated on Thu Jul 10 13:41:04 2025 by
176
+ Generated on Sat Jul 12 21:25:21 2025 by
177
177
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
178
178
  0.9.37 (ruby-3.4.4).
179
179
  </div>
@@ -355,7 +355,7 @@
355
355
  </div>
356
356
 
357
357
  <div id="footer">
358
- Generated on Thu Jul 10 13:41:03 2025 by
358
+ Generated on Sat Jul 12 21:25:21 2025 by
359
359
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
360
360
  0.9.37 (ruby-3.4.4).
361
361
  </div>
@@ -347,7 +347,7 @@
347
347
  </div>
348
348
 
349
349
  <div id="footer">
350
- Generated on Thu Jul 10 13:41:03 2025 by
350
+ Generated on Sat Jul 12 21:25:21 2025 by
351
351
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
352
352
  0.9.37 (ruby-3.4.4).
353
353
  </div>
@@ -379,7 +379,7 @@
379
379
  </div>
380
380
 
381
381
  <div id="footer">
382
- Generated on Thu Jul 10 13:41:03 2025 by
382
+ Generated on Sat Jul 12 21:25:21 2025 by
383
383
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
384
384
  0.9.37 (ruby-3.4.4).
385
385
  </div>
@@ -293,7 +293,9 @@
293
293
  221
294
294
  222
295
295
  223
296
- 224</pre>
296
+ 224
297
+ 225
298
+ 226</pre>
297
299
  </td>
298
300
  <td>
299
301
  <pre class="code"><span class="info file"># File 'lib/brut/cli/apps/db.rb', line 208</span>
@@ -309,6 +311,8 @@
309
311
  <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_open'>open</span><span class='lparen'>(</span><span class='id identifier rubyid_file_name'>file_name</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>w</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_file'>file</span><span class='op'>|</span>
310
312
  <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Sequel.migration do</span><span class='tstring_end'>&quot;</span></span>
311
313
  <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> up do</span><span class='tstring_end'>&quot;</span></span>
314
+ <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> # See https://brutrb.com/recipes/migrations.html</span><span class='tstring_end'>&quot;</span></span>
315
+ <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> # for a recipe on writing migrations</span><span class='tstring_end'>&quot;</span></span>
312
316
  <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> end</span><span class='tstring_end'>&quot;</span></span>
313
317
  <span class='id identifier rubyid_file'>file</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>end</span><span class='tstring_end'>&quot;</span></span>
314
318
  <span class='kw'>end</span>
@@ -325,7 +329,7 @@
325
329
  </div>
326
330
 
327
331
  <div id="footer">
328
- Generated on Thu Jul 10 13:41:03 2025 by
332
+ Generated on Sat Jul 12 21:25:21 2025 by
329
333
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
330
334
  0.9.37 (ruby-3.4.4).
331
335
  </div>
@@ -319,7 +319,7 @@
319
319
  </div>
320
320
 
321
321
  <div id="footer">
322
- Generated on Thu Jul 10 13:41:03 2025 by
322
+ Generated on Sat Jul 12 21:25:21 2025 by
323
323
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
324
324
  0.9.37 (ruby-3.4.4).
325
325
  </div>
@@ -337,7 +337,7 @@
337
337
  </div>
338
338
 
339
339
  <div id="footer">
340
- Generated on Thu Jul 10 13:41:03 2025 by
340
+ Generated on Sat Jul 12 21:25:21 2025 by
341
341
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
342
342
  0.9.37 (ruby-3.4.4).
343
343
  </div>
@@ -247,8 +247,6 @@
247
247
  <pre class="lines">
248
248
 
249
249
 
250
- 255
251
- 256
252
250
  257
253
251
  258
254
252
  259
@@ -267,10 +265,12 @@
267
265
  272
268
266
  273
269
267
  274
270
- 275</pre>
268
+ 275
269
+ 276
270
+ 277</pre>
271
271
  </td>
272
272
  <td>
273
- <pre class="code"><span class="info file"># File 'lib/brut/cli/apps/db.rb', line 255</span>
273
+ <pre class="code"><span class="info file"># File 'lib/brut/cli/apps/db.rb', line 257</span>
274
274
 
275
275
  <span class='kw'>def</span> <span class='id identifier rubyid_execute'>execute</span>
276
276
  <span class='id identifier rubyid_database_name'>database_name</span> <span class='op'>=</span> <span class='const'>URI</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="../../../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='period'>.</span><span class='id identifier rubyid_container'><span class='object_link'><a href="../../../../Brut.html#container-class_method" title="Brut.container (method)">container</a></span></span><span class='period'>.</span><span class='id identifier rubyid_database_url'>database_url</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_path'>path</span>
@@ -313,8 +313,6 @@
313
313
  <pre class="lines">
314
314
 
315
315
 
316
- 231
317
- 232
318
316
  233
319
317
  234
320
318
  235
@@ -335,10 +333,12 @@
335
333
  250
336
334
  251
337
335
  252
338
- 253</pre>
336
+ 253
337
+ 254
338
+ 255</pre>
339
339
  </td>
340
340
  <td>
341
- <pre class="code"><span class="info file"># File 'lib/brut/cli/apps/db.rb', line 231</span>
341
+ <pre class="code"><span class="info file"># File 'lib/brut/cli/apps/db.rb', line 233</span>
342
342
 
343
343
  <span class='kw'>def</span> <span class='id identifier rubyid_handle_bootstrap_exception'>handle_bootstrap_exception</span><span class='lparen'>(</span><span class='id identifier rubyid_ex'>ex</span><span class='rparen'>)</span>
344
344
  <span class='kw'>case</span> <span class='id identifier rubyid_ex'>ex</span>
@@ -373,7 +373,7 @@
373
373
  </div>
374
374
 
375
375
  <div id="footer">
376
- Generated on Thu Jul 10 13:41:03 2025 by
376
+ Generated on Sat Jul 12 21:25:21 2025 by
377
377
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
378
378
  0.9.37 (ruby-3.4.4).
379
379
  </div>
@@ -173,7 +173,7 @@
173
173
  </div>
174
174
 
175
175
  <div id="footer">
176
- Generated on Thu Jul 10 13:41:03 2025 by
176
+ Generated on Sat Jul 12 21:25:21 2025 by
177
177
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
178
178
  0.9.37 (ruby-3.4.4).
179
179
  </div>
@@ -260,7 +260,7 @@
260
260
  </div>
261
261
 
262
262
  <div id="footer">
263
- Generated on Thu Jul 10 13:41:04 2025 by
263
+ Generated on Sat Jul 12 21:25:21 2025 by
264
264
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
265
265
  0.9.37 (ruby-3.4.4).
266
266
  </div>