brut 0.8.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 (393) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Dockerfile.dx +8 -1
  5. data/Gemfile.lock +33 -1
  6. data/bin/ci +9 -5
  7. data/bin/docs +1 -1
  8. data/bin/generate-and-run-rubocop +52 -0
  9. data/bin/rubocop +27 -0
  10. data/bin/setup +46 -0
  11. data/bin/test +18 -0
  12. data/brut-css/bin/publish +1 -1
  13. data/brut-css/package-lock.json +2 -2
  14. data/brut-css/package.json +1 -1
  15. data/brut-js/bin/publish +1 -1
  16. data/brut-js/package-lock.json +2 -2
  17. data/brut-js/package.json +1 -1
  18. data/brut.gemspec +32 -26
  19. data/brutrb.com/.vitepress/config.mjs +3 -0
  20. data/brutrb.com/database-schema.md +1 -1
  21. data/brutrb.com/recipes/migrations.md +1 -1
  22. data/docker-compose.dx.yml +3 -0
  23. data/docs/404.html +2 -2
  24. data/docs/adrs.html +3 -3
  25. data/docs/ai.html +3 -3
  26. data/docs/api/Brut/BackEnd/SeedData.html +2 -2
  27. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +2 -2
  28. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +2 -2
  29. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +2 -2
  30. data/docs/api/Brut/BackEnd/Sidekiq.html +2 -2
  31. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +2 -2
  32. data/docs/api/Brut/BackEnd/Validators.html +2 -2
  33. data/docs/api/Brut/BackEnd.html +2 -2
  34. data/docs/api/Brut/CLI/App.html +2 -2
  35. data/docs/api/Brut/CLI/AppRunner.html +2 -2
  36. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  37. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
  38. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  39. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
  40. data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
  41. data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
  42. data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
  43. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +2 -2
  44. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +2 -2
  45. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
  46. data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
  47. data/docs/api/Brut/CLI/Apps/DB/Status.html +2 -2
  48. data/docs/api/Brut/CLI/Apps/DB.html +2 -2
  49. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +2 -2
  50. data/docs/api/Brut/CLI/Apps/DeployBase.html +2 -2
  51. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +3 -3
  52. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +2 -2
  53. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +2 -2
  54. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
  55. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
  56. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
  57. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +2 -2
  58. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
  59. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
  60. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +2 -2
  61. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  62. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +2 -2
  63. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +3 -3
  64. data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
  65. data/docs/api/Brut/CLI/Apps/Test/Audit.html +2 -2
  66. data/docs/api/Brut/CLI/Apps/Test/E2e.html +2 -2
  67. data/docs/api/Brut/CLI/Apps/Test/JS.html +2 -2
  68. data/docs/api/Brut/CLI/Apps/Test/Run.html +2 -2
  69. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  70. data/docs/api/Brut/CLI/Apps.html +2 -2
  71. data/docs/api/Brut/CLI/Command.html +2 -2
  72. data/docs/api/Brut/CLI/Error.html +2 -2
  73. data/docs/api/Brut/CLI/ExecutionResults/Result.html +2 -2
  74. data/docs/api/Brut/CLI/ExecutionResults.html +2 -2
  75. data/docs/api/Brut/CLI/Executor.html +2 -2
  76. data/docs/api/Brut/CLI/InvalidOption.html +2 -2
  77. data/docs/api/Brut/CLI/Options.html +80 -2
  78. data/docs/api/Brut/CLI/Output.html +2 -2
  79. data/docs/api/Brut/CLI/SystemExecError.html +2 -2
  80. data/docs/api/Brut/CLI.html +2 -2
  81. data/docs/api/Brut/FactoryBot.html +3 -3
  82. data/docs/api/Brut/Framework/App.html +3 -3
  83. data/docs/api/Brut/Framework/Config.html +25 -3
  84. data/docs/api/Brut/Framework/Container.html +2 -2
  85. data/docs/api/Brut/Framework/Error.html +2 -2
  86. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +2 -2
  87. data/docs/api/Brut/Framework/Errors/Bug.html +2 -2
  88. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +2 -2
  89. data/docs/api/Brut/Framework/Errors/MissingParameter.html +2 -2
  90. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +2 -2
  91. data/docs/api/Brut/Framework/Errors/NotFound.html +2 -2
  92. data/docs/api/Brut/Framework/Errors/NotImplemented.html +2 -2
  93. data/docs/api/Brut/Framework/Errors.html +2 -2
  94. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +2 -2
  95. data/docs/api/Brut/Framework/MCP.html +21 -11
  96. data/docs/api/Brut/Framework/ProjectEnvironment.html +2 -2
  97. data/docs/api/Brut/Framework.html +2 -2
  98. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +2 -2
  99. data/docs/api/Brut/FrontEnd/Component/Helpers.html +2 -2
  100. data/docs/api/Brut/FrontEnd/Component.html +2 -2
  101. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +2 -2
  102. data/docs/api/Brut/FrontEnd/Components/FormTag.html +4 -4
  103. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +2 -2
  104. data/docs/api/Brut/FrontEnd/Components/Input.html +2 -2
  105. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +2 -2
  106. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +2 -2
  107. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +2 -2
  108. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +2 -2
  109. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +2 -2
  110. data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
  111. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +2 -2
  112. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +2 -2
  113. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +2 -2
  114. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +2 -2
  115. data/docs/api/Brut/FrontEnd/Components.html +2 -2
  116. data/docs/api/Brut/FrontEnd/CsrfProtector.html +250 -0
  117. data/docs/api/Brut/FrontEnd/Download.html +2 -2
  118. data/docs/api/Brut/FrontEnd/Flash.html +2 -2
  119. data/docs/api/Brut/FrontEnd/Form.html +6 -6
  120. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +2 -2
  121. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +2 -2
  122. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +2 -2
  123. data/docs/api/Brut/FrontEnd/Forms/Input.html +2 -2
  124. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +2 -2
  125. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +2 -2
  126. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +2 -2
  127. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +2 -2
  128. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +2 -2
  129. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +2 -2
  130. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +2 -2
  131. data/docs/api/Brut/FrontEnd/Forms.html +2 -2
  132. data/docs/api/Brut/FrontEnd/GenericResponse.html +2 -2
  133. data/docs/api/Brut/FrontEnd/Handler.html +2 -2
  134. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +2 -2
  135. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +2 -2
  136. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +2 -2
  137. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +2 -2
  138. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  139. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +2 -2
  140. data/docs/api/Brut/FrontEnd/Handlers.html +2 -2
  141. data/docs/api/Brut/FrontEnd/HandlingResults.html +2 -2
  142. data/docs/api/Brut/FrontEnd/HttpMethod.html +2 -2
  143. data/docs/api/Brut/FrontEnd/HttpStatus.html +2 -2
  144. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +2 -2
  145. data/docs/api/Brut/FrontEnd/Layout.html +2 -2
  146. data/docs/api/Brut/FrontEnd/Middleware.html +2 -2
  147. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +2 -2
  148. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +2 -2
  149. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +2 -2
  150. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +2 -2
  151. data/docs/api/Brut/FrontEnd/Middlewares.html +2 -2
  152. data/docs/api/Brut/FrontEnd/Page.html +2 -2
  153. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  154. data/docs/api/Brut/FrontEnd/Pages.html +2 -2
  155. data/docs/api/Brut/FrontEnd/RequestContext.html +2 -2
  156. data/docs/api/Brut/FrontEnd/RouteHook.html +2 -2
  157. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +2 -2
  158. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +2 -2
  159. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +2 -2
  160. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +2 -2
  161. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +2 -2
  162. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +2 -2
  163. data/docs/api/Brut/FrontEnd/RouteHooks.html +2 -2
  164. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +2 -2
  165. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +2 -2
  166. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +2 -2
  167. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +2 -2
  168. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +2 -2
  169. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +2 -2
  170. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +2 -2
  171. data/docs/api/Brut/FrontEnd/Routing/Route.html +2 -2
  172. data/docs/api/Brut/FrontEnd/Routing.html +2 -2
  173. data/docs/api/Brut/FrontEnd/Session.html +2 -2
  174. data/docs/api/Brut/FrontEnd.html +3 -3
  175. data/docs/api/Brut/I18n/BaseMethods.html +3 -3
  176. data/docs/api/Brut/I18n/ForBackEnd.html +2 -2
  177. data/docs/api/Brut/I18n/ForCLI.html +2 -2
  178. data/docs/api/Brut/I18n/ForHTML.html +2 -2
  179. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +2 -2
  180. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +2 -2
  181. data/docs/api/Brut/I18n.html +2 -2
  182. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +2 -2
  183. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +2 -2
  184. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +2 -2
  185. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +2 -2
  186. data/docs/api/Brut/Instrumentation.html +2 -2
  187. data/docs/api/Brut/RubocopConfig.html +237 -0
  188. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +2 -2
  189. data/docs/api/Brut/SinatraHelpers.html +2 -2
  190. data/docs/api/Brut/SpecSupport/ClockSupport.html +2 -2
  191. data/docs/api/Brut/SpecSupport/ComponentSupport.html +7 -13
  192. data/docs/api/Brut/SpecSupport/E2ETestServer.html +2 -2
  193. data/docs/api/Brut/SpecSupport/E2eSupport.html +2 -2
  194. data/docs/api/Brut/SpecSupport/EnhancedNode.html +2 -2
  195. data/docs/api/Brut/SpecSupport/FlashSupport.html +2 -2
  196. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +2 -2
  197. data/docs/api/Brut/SpecSupport/GeneralSupport.html +2 -2
  198. data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
  199. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +2 -2
  200. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +2 -2
  201. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +2 -2
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +2 -2
  203. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +2 -2
  204. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +2 -2
  205. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +2 -2
  206. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +2 -2
  207. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +2 -2
  208. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +2 -2
  209. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +2 -2
  210. data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
  211. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +2 -2
  212. data/docs/api/Brut/SpecSupport/RSpecSetup.html +4 -4
  213. data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
  214. data/docs/api/Brut/SpecSupport.html +2 -2
  215. data/docs/api/Brut.html +128 -12
  216. data/docs/api/Clock.html +2 -2
  217. data/docs/api/ModuleName.html +28 -28
  218. data/docs/api/RichString.html +22 -22
  219. data/docs/api/SemanticLogger/Appender/Async.html +2 -2
  220. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +2 -2
  221. data/docs/api/Sequel/Extensions/BrutMigrations.html +2 -2
  222. data/docs/api/Sequel/Extensions.html +2 -2
  223. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +2 -2
  224. data/docs/api/Sequel/Plugins/CreatedAt.html +2 -2
  225. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +2 -2
  226. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +2 -2
  227. data/docs/api/Sequel/Plugins/ExternalId.html +2 -2
  228. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +2 -2
  229. data/docs/api/Sequel/Plugins/FindBang.html +2 -2
  230. data/docs/api/Sequel/Plugins.html +2 -2
  231. data/docs/api/Sequel.html +2 -2
  232. data/docs/api/_index.html +16 -2
  233. data/docs/api/class_list.html +1 -1
  234. data/docs/api/file.README.html +28 -2
  235. data/docs/api/index.html +28 -2
  236. data/docs/api/method_list.html +192 -168
  237. data/docs/api/top-level-namespace.html +2 -2
  238. data/docs/assets/{app.DyQLb4Ot.js → app.CmkhEsw7.js} +1 -1
  239. data/docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js +1 -0
  240. data/docs/assets/chunks/{VPLocalSearchBox.T1iA-eJx.js → VPLocalSearchBox.CDh583Oj.js} +1 -1
  241. data/docs/assets/chunks/{theme.ChwsbWjK.js → theme.B0_7GeW8.js} +2 -2
  242. data/docs/assets/{components.md.DHh-NwKs.js → components.md.-22ecBxM.js} +3 -3
  243. data/docs/assets/{configuration.md.D8Wz3oJU.js → configuration.md.CLKL1lFf.js} +1 -1
  244. data/docs/assets/{database-schema.md.C5gXexJi.js → database-schema.md.LpmBPVEU.js} +1 -1
  245. data/docs/assets/{forms.md.BRE85eju.js → forms.md.CBI5--o2.js} +1 -1
  246. data/docs/assets/{getting-started.md.2ioiTe-B.js → getting-started.md.D5nzBZ4J.js} +2 -2
  247. data/docs/assets/{recipes_migrations.md.DPN3gQE3.js → recipes_migrations.md.CTcnWDJF.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 +1 -1
  262. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  263. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  264. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  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 +5 -5
  312. data/docs/deployment.html +3 -3
  313. data/docs/dev-environment.html +3 -3
  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 +3 -3
  320. data/docs/forms.html +5 -5
  321. data/docs/getting-started.html +6 -6
  322. data/docs/handlers.html +3 -3
  323. data/docs/hashmap.json +1 -1
  324. data/docs/hooks.html +3 -3
  325. data/docs/i18n.html +3 -3
  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 +3 -3
  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 +5 -5
  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/dx/build +45 -9
  353. data/lib/brut/cli/app.rb +1 -1
  354. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
  355. data/lib/brut/cli/apps/scaffold.rb +1 -1
  356. data/lib/brut/cli/options.rb +4 -0
  357. data/lib/brut/factory_bot.rb +1 -1
  358. data/lib/brut/framework/app.rb +1 -1
  359. data/lib/brut/framework/config.rb +11 -0
  360. data/lib/brut/framework/mcp.rb +12 -7
  361. data/lib/brut/front_end/csrf_protector.rb +30 -0
  362. data/lib/brut/front_end/form.rb +4 -4
  363. data/lib/brut/front_end/page.rb +1 -1
  364. data/lib/brut/front_end/routing.rb +1 -1
  365. data/lib/brut/front_end.rb +1 -0
  366. data/lib/brut/i18n/base_methods.rb +1 -1
  367. data/lib/brut/instrumentation/logger_span_exporter.rb +1 -1
  368. data/lib/brut/junk_drawer.rb +3 -1
  369. data/lib/brut/rubocop_config.rb +123 -0
  370. data/lib/brut/spec_support/component_support.rb +0 -3
  371. data/lib/brut/spec_support/rspec_setup.rb +2 -2
  372. data/lib/brut/version.rb +1 -1
  373. data/mkbrut/Gemfile.lock +1 -1
  374. data/mkbrut/dx +1 -0
  375. data/mkbrut/lib/mkbrut/app.rb +1 -1
  376. data/mkbrut/lib/mkbrut/cli.rb +1 -1
  377. data/mkbrut/lib/mkbrut/segments/heroku.rb +1 -1
  378. data/mkbrut/lib/mkbrut/version.rb +1 -1
  379. data/mkbrut/mkbrut.gemspec +3 -1
  380. data/mkbrut/templates/Base/app/config/i18n/en/1_defaults.rb +2 -2
  381. data/mkbrut/templates/Base/app/config/i18n/en/2_app.rb +1 -1
  382. data/mkbrut/templates/Base/bin/setup +1 -1
  383. data/mkbrut/templates/segments/Demo/app/src/front_end/components/flash_component.rb +1 -1
  384. data/specs/brut/junk_drawer.spec.rb +4 -0
  385. metadata +70 -33
  386. data/.rspec +0 -3
  387. data/docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js +0 -1
  388. /data/docs/assets/{components.md.DHh-NwKs.lean.js → components.md.-22ecBxM.lean.js} +0 -0
  389. /data/docs/assets/{configuration.md.D8Wz3oJU.lean.js → configuration.md.CLKL1lFf.lean.js} +0 -0
  390. /data/docs/assets/{database-schema.md.C5gXexJi.lean.js → database-schema.md.LpmBPVEU.lean.js} +0 -0
  391. /data/docs/assets/{forms.md.BRE85eju.lean.js → forms.md.CBI5--o2.lean.js} +0 -0
  392. /data/docs/assets/{getting-started.md.2ioiTe-B.lean.js → getting-started.md.D5nzBZ4J.lean.js} +0 -0
  393. /data/docs/assets/{recipes_migrations.md.DPN3gQE3.lean.js → recipes_migrations.md.CTcnWDJF.lean.js} +0 -0
@@ -749,7 +749,7 @@ not <code>nil</code>, this value is highly likely to be 500.</p>
749
749
  <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Your error handler block may only accept exception: and http_status_code: as required keyword parameters. The following parameters were found:\n </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_messages'>messages</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
750
750
  <span class='kw'>end</span>
751
751
  <span class='kw'>if</span> <span class='ivar'>@error_blocks</span><span class='lbracket'>[</span><span class='id identifier rubyid_condition'>condition</span><span class='rbracket'>]</span>
752
- <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You have already configured error handling for condition &#39;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_condition'>condition</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39;</span><span class='tstring_end'>&quot;</span></span>
752
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You have already configured error handling for condition &#39;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_condition'>condition</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39;</span><span class='tstring_end'>&quot;</span></span>
753
753
  <span class='kw'>end</span>
754
754
  <span class='ivar'>@error_blocks</span><span class='lbracket'>[</span><span class='id identifier rubyid_condition'>condition</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_block'>block</span>
755
755
  <span class='kw'>end</span></pre>
@@ -1087,9 +1087,9 @@ actions where an app needs to exist inside some organizational context.</p>
1087
1087
  </div>
1088
1088
 
1089
1089
  <div id="footer">
1090
- Generated on Mon Jul 21 18:28:17 2025 by
1090
+ Generated on Thu Aug 7 21:05:54 2025 by
1091
1091
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1092
- 0.9.37 (ruby-3.4.4).
1092
+ 0.9.37 (ruby-3.4.5).
1093
1093
  </div>
1094
1094
 
1095
1095
  </div>
@@ -609,7 +609,18 @@ connection to your database.</p>
609
609
  433
610
610
  434
611
611
  435
612
- 436</pre>
612
+ 436
613
+ 437
614
+ 438
615
+ 439
616
+ 440
617
+ 441
618
+ 442
619
+ 443
620
+ 444
621
+ 445
622
+ 446
623
+ 447</pre>
613
624
  </td>
614
625
  <td>
615
626
  <pre class="code"><span class="info file"># File 'lib/brut/framework/config.rb', line 12</span>
@@ -924,6 +935,17 @@ connection to your database.</p>
924
935
  <span class='label'>allow_app_override:</span> <span class='kw'>true</span><span class='comma'>,</span>
925
936
  <span class='rparen'>)</span>
926
937
 
938
+ <span class='id identifier rubyid_c'>c</span><span class='period'>.</span><span class='id identifier rubyid_store'>store</span><span class='lparen'>(</span>
939
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>csrf_protector</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
940
+ <span class='const'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../FrontEnd.html" title="Brut::FrontEnd (module)">FrontEnd</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../FrontEnd/CsrfProtector.html" title="Brut::FrontEnd::CsrfProtector (class)">CsrfProtector</a></span></span><span class='comma'>,</span>
941
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Object to allow custom logic related to CSRF protection</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
942
+ <span class='label'>allow_app_override:</span> <span class='kw'>true</span>
943
+ <span class='rparen'>)</span> <span class='kw'>do</span>
944
+ <span class='const'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../FrontEnd.html" title="Brut::FrontEnd (module)">FrontEnd</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../FrontEnd/CsrfProtector.html" title="Brut::FrontEnd::CsrfProtector (class)">CsrfProtector</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
945
+ <span class='kw'>end</span>
946
+
947
+
948
+
927
949
  <span class='id identifier rubyid_c'>c</span><span class='period'>.</span><span class='id identifier rubyid_store'>store</span><span class='lparen'>(</span>
928
950
  <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>semantic_logger_appenders</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
929
951
  <span class='lbrace'>{</span> <span class='const'>Hash</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>if only one appender is needed</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='const'>Array</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>to configure multiple appenders</span><span class='tstring_end'>&quot;</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
@@ -1049,9 +1071,9 @@ connection to your database.</p>
1049
1071
  </div>
1050
1072
 
1051
1073
  <div id="footer">
1052
- Generated on Mon Jul 21 18:28:17 2025 by
1074
+ Generated on Thu Aug 7 21:05:54 2025 by
1053
1075
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1054
- 0.9.37 (ruby-3.4.4).
1076
+ 0.9.37 (ruby-3.4.5).
1055
1077
  </div>
1056
1078
 
1057
1079
  </div>
@@ -1450,9 +1450,9 @@ The names of the parameters must match the name of another configuration value.<
1450
1450
  </div>
1451
1451
 
1452
1452
  <div id="footer">
1453
- Generated on Mon Jul 21 18:28:18 2025 by
1453
+ Generated on Thu Aug 7 21:05:55 2025 by
1454
1454
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1455
- 0.9.37 (ruby-3.4.4).
1455
+ 0.9.37 (ruby-3.4.5).
1456
1456
  </div>
1457
1457
 
1458
1458
  </div>
@@ -130,9 +130,9 @@ for Brut-specific error conditions.</p>
130
130
  </div>
131
131
 
132
132
  <div id="footer">
133
- Generated on Mon Jul 21 18:28:17 2025 by
133
+ Generated on Thu Aug 7 21:05:54 2025 by
134
134
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
135
- 0.9.37 (ruby-3.4.4).
135
+ 0.9.37 (ruby-3.4.5).
136
136
  </div>
137
137
 
138
138
  </div>
@@ -222,9 +222,9 @@ makes sense.</p>
222
222
  </div>
223
223
 
224
224
  <div id="footer">
225
- Generated on Mon Jul 21 18:28:18 2025 by
225
+ Generated on Thu Aug 7 21:05:55 2025 by
226
226
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
227
- 0.9.37 (ruby-3.4.4).
227
+ 0.9.37 (ruby-3.4.5).
228
228
  </div>
229
229
 
230
230
  </div>
@@ -224,9 +224,9 @@ prevented</p>
224
224
  </div>
225
225
 
226
226
  <div id="footer">
227
- Generated on Mon Jul 21 18:28:18 2025 by
227
+ Generated on Thu Aug 7 21:05:55 2025 by
228
228
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
229
- 0.9.37 (ruby-3.4.4).
229
+ 0.9.37 (ruby-3.4.5).
230
230
  </div>
231
231
 
232
232
  </div>
@@ -247,9 +247,9 @@ have not been set.</p>
247
247
  </div>
248
248
 
249
249
  <div id="footer">
250
- Generated on Mon Jul 21 18:28:18 2025 by
250
+ Generated on Thu Aug 7 21:05:55 2025 by
251
251
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
252
- 0.9.37 (ruby-3.4.4).
252
+ 0.9.37 (ruby-3.4.5).
253
253
  </div>
254
254
 
255
255
  </div>
@@ -263,9 +263,9 @@ the one provided by standard library exceptions like <code>KeyError</code></p>
263
263
  </div>
264
264
 
265
265
  <div id="footer">
266
- Generated on Mon Jul 21 18:28:18 2025 by
266
+ Generated on Thu Aug 7 21:05:55 2025 by
267
267
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
268
- 0.9.37 (ruby-3.4.4).
268
+ 0.9.37 (ruby-3.4.5).
269
269
  </div>
270
270
 
271
271
  </div>
@@ -461,9 +461,9 @@
461
461
  </div>
462
462
 
463
463
  <div id="footer">
464
- Generated on Mon Jul 21 18:28:18 2025 by
464
+ Generated on Thu Aug 7 21:05:55 2025 by
465
465
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
466
- 0.9.37 (ruby-3.4.4).
466
+ 0.9.37 (ruby-3.4.5).
467
467
  </div>
468
468
 
469
469
  </div>
@@ -298,9 +298,9 @@
298
298
  </div>
299
299
 
300
300
  <div id="footer">
301
- Generated on Mon Jul 21 18:28:18 2025 by
301
+ Generated on Thu Aug 7 21:05:55 2025 by
302
302
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
303
- 0.9.37 (ruby-3.4.4).
303
+ 0.9.37 (ruby-3.4.5).
304
304
  </div>
305
305
 
306
306
  </div>
@@ -224,9 +224,9 @@ support the same features, but for technical reasons one of the APIs does not.</
224
224
  </div>
225
225
 
226
226
  <div id="footer">
227
- Generated on Mon Jul 21 18:28:18 2025 by
227
+ Generated on Thu Aug 7 21:05:55 2025 by
228
228
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
229
- 0.9.37 (ruby-3.4.4).
229
+ 0.9.37 (ruby-3.4.5).
230
230
  </div>
231
231
 
232
232
  </div>
@@ -341,9 +341,9 @@ state of the system is such that it would never be misused.</p>
341
341
  </div>
342
342
 
343
343
  <div id="footer">
344
- Generated on Mon Jul 21 18:28:17 2025 by
344
+ Generated on Thu Aug 7 21:05:54 2025 by
345
345
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
346
- 0.9.37 (ruby-3.4.4).
346
+ 0.9.37 (ruby-3.4.5).
347
347
  </div>
348
348
 
349
349
  </div>
@@ -382,9 +382,9 @@ For example, if you accept a string but know it should be a number, pass in <cod
382
382
  </div>
383
383
 
384
384
  <div id="footer">
385
- Generated on Mon Jul 21 18:28:17 2025 by
385
+ Generated on Thu Aug 7 21:05:54 2025 by
386
386
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
387
- 0.9.37 (ruby-3.4.4).
387
+ 0.9.37 (ruby-3.4.5).
388
388
  </div>
389
389
 
390
390
  </div>
@@ -618,7 +618,12 @@ to external resources.</p>
618
618
  286
619
619
  287
620
620
  288
621
- 289</pre>
621
+ 289
622
+ 290
623
+ 291
624
+ 292
625
+ 293
626
+ 294</pre>
622
627
  </td>
623
628
  <td>
624
629
  <pre class="code"><span class="info file"># File 'lib/brut/framework/mcp.rb', line 72</span>
@@ -685,9 +690,9 @@ to external resources.</p>
685
690
  <span class='label'>exception:</span> <span class='id identifier rubyid_ex'>ex</span><span class='rparen'>)</span>
686
691
  <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_ex2'>ex2</span>
687
692
  <span class='gvar'>$stderr</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'>While handling an error recording an exception, we get another error from SemanticLogger.</span><span class='tstring_end'>&quot;</span></span> <span class='op'>+</span> <span class='lbracket'>[</span>
688
- <span class='lbracket'>[</span> <span class='symbol'>:original_exception</span><span class='comma'>,</span> <span class='id identifier rubyid_exception'>exception</span><span class='comma'>,</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
689
- <span class='lbracket'>[</span> <span class='symbol'>:exception_from_recording_exception</span><span class='comma'>,</span> <span class='id identifier rubyid_ex'>ex</span><span class='comma'>,</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
690
- <span class='lbracket'>[</span> <span class='symbol'>:exception_from_semantic_logger</span><span class='comma'>,</span> <span class='id identifier rubyid_ex2'>ex2</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
693
+ <span class='lbracket'>[</span> <span class='symbol'>:original_exception</span><span class='comma'>,</span> <span class='id identifier rubyid_exception'>exception</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
694
+ <span class='lbracket'>[</span> <span class='symbol'>:exception_from_recording_exception</span><span class='comma'>,</span> <span class='id identifier rubyid_ex'>ex</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
695
+ <span class='lbracket'>[</span> <span class='symbol'>:exception_from_semantic_logger</span><span class='comma'>,</span> <span class='id identifier rubyid_ex2'>ex2</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>: </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
691
696
 
692
697
  <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>, </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
693
698
  <span class='kw'>end</span>
@@ -728,7 +733,7 @@ to external resources.</p>
728
733
  <span class='kw'>end</span>
729
734
 
730
735
  <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='kw'>if</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_project_env'>project_env</span><span class='period'>.</span><span class='id identifier rubyid_development?'>development?</span>
731
- <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Form submission did not include an authenticity token. All forms must include one. To add one, use the `form_tag` helper, or include Brut::FrontEnd::Components::Inputs::CsrfToken somewhere inside your &lt;form&gt; tag</span><span class='tstring_end'>&quot;</span></span>
736
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Form submission did not include an authenticity token. All forms must include one. To add one, use the `Brut::FrontEnd::Components::FormTag` component, or include Brut::FrontEnd::Components::Inputs::CsrfToken somewhere inside your &lt;form&gt; tag</span><span class='tstring_end'>&quot;</span></span>
732
737
  <span class='kw'>else</span>
733
738
  <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Forbidden</span><span class='tstring_end'>&quot;</span></span>
734
739
  <span class='kw'>end</span>
@@ -740,10 +745,15 @@ to external resources.</p>
740
745
  <span class='const'>Rack</span><span class='op'>::</span><span class='const'>Protection</span><span class='op'>::</span><span class='const'>AuthenticityToken</span><span class='comma'>,</span>
741
746
  <span class='lbracket'>[</span>
742
747
  <span class='lbrace'>{</span>
743
- <span class='label'>allow_if:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_env'>env</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_env'>env</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>brut.owned_path</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span> <span class='rbrace'>}</span><span class='comma'>,</span>
748
+ <span class='label'>allow_if:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_env'>env</span><span class='rparen'>)</span> <span class='tlambeg'>{</span>
749
+ <span class='id identifier rubyid_brut_owned_path'>brut_owned_path</span> <span class='op'>=</span> <span class='id identifier rubyid_env'>env</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>brut.owned_path</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span>
750
+ <span class='id identifier rubyid_app_allowed'>app_allowed</span> <span class='op'>=</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_csrf_protector'>csrf_protector</span><span class='period'>.</span><span class='id identifier rubyid_tap'>tap</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid__'>_</span><span class='op'>|</span> <span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid__'>_</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_allowed?'>allowed?</span><span class='lparen'>(</span><span class='id identifier rubyid_env'>env</span><span class='rparen'>)</span>
751
+
752
+ <span class='id identifier rubyid_brut_owned_path'>brut_owned_path</span> <span class='op'>||</span> <span class='id identifier rubyid_app_allowed'>app_allowed</span>
753
+ <span class='rbrace'>}</span><span class='comma'>,</span>
744
754
  <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span><span class='comma'>,</span>
745
- <span class='rbrace'>}</span>
746
- <span class='rbracket'>]</span>
755
+ <span class='rbrace'>}</span><span class='comma'>,</span>
756
+ <span class='rbracket'>]</span><span class='comma'>,</span>
747
757
  <span class='rbracket'>]</span><span class='comma'>,</span>
748
758
  <span class='rbracket'>]</span>
749
759
  <span class='kw'>if</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_auto_reload_classes?'>auto_reload_classes?</span>
@@ -829,7 +839,7 @@ to external resources.</p>
829
839
  <span class='kw'>in</span> <span class='const'>TrueClass</span>
830
840
  <span class='kw'>nil</span>
831
841
  <span class='kw'>else</span>
832
- <span class='id identifier rubyid_raise'>raise</span> <span class='const'>NoMatchingPatternError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Result from </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_method'>method</span><span class='embexpr_end'>}</span><span class='tstring_content'> hook </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_klass'>klass</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39;s </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_method'>method</span><span class='embexpr_end'>}</span><span class='tstring_content'> method was a </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='embexpr_end'>}</span><span class='tstring_content'> (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='embexpr_end'>}</span><span class='tstring_content'> as a string), which cannot be used to understand the response to generate. Return nil or true if processing should proceed</span><span class='tstring_end'>&quot;</span></span>
842
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>NoMatchingPatternError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Result from </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_method'>method</span><span class='embexpr_end'>}</span><span class='tstring_content'> hook </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_klass'>klass</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39;s </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_method'>method</span><span class='embexpr_end'>}</span><span class='tstring_content'> method was a </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='embexpr_end'>}</span><span class='tstring_content'> (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_result'>result</span><span class='embexpr_end'>}</span><span class='tstring_content'> as a string), which cannot be used to understand the response to generate. Return nil or true if processing should proceed</span><span class='tstring_end'>&quot;</span></span>
833
843
  <span class='kw'>end</span>
834
844
  <span class='kw'>end</span>
835
845
  <span class='kw'>end</span>
@@ -851,9 +861,9 @@ to external resources.</p>
851
861
  </div>
852
862
 
853
863
  <div id="footer">
854
- Generated on Mon Jul 21 18:28:17 2025 by
864
+ Generated on Thu Aug 7 21:05:54 2025 by
855
865
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
856
- 0.9.37 (ruby-3.4.4).
866
+ 0.9.37 (ruby-3.4.5).
857
867
  </div>
858
868
 
859
869
  </div>
@@ -638,9 +638,9 @@ to the configuration values. But, you do you.</p>
638
638
  </div>
639
639
 
640
640
  <div id="footer">
641
- Generated on Mon Jul 21 18:28:18 2025 by
641
+ Generated on Thu Aug 7 21:05:55 2025 by
642
642
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
643
- 0.9.37 (ruby-3.4.4).
643
+ 0.9.37 (ruby-3.4.5).
644
644
  </div>
645
645
 
646
646
  </div>
@@ -119,9 +119,9 @@
119
119
  </div>
120
120
 
121
121
  <div id="footer">
122
- Generated on Mon Jul 21 18:28:17 2025 by
122
+ Generated on Thu Aug 7 21:05:54 2025 by
123
123
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
124
- 0.9.37 (ruby-3.4.4).
124
+ 0.9.37 (ruby-3.4.5).
125
125
  </div>
126
126
 
127
127
  </div>
@@ -307,9 +307,9 @@
307
307
  </div>
308
308
 
309
309
  <div id="footer">
310
- Generated on Mon Jul 21 18:28:18 2025 by
310
+ Generated on Thu Aug 7 21:05:55 2025 by
311
311
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
312
- 0.9.37 (ruby-3.4.4).
312
+ 0.9.37 (ruby-3.4.5).
313
313
  </div>
314
314
 
315
315
  </div>
@@ -410,9 +410,9 @@ looking</p>
410
410
  </div>
411
411
 
412
412
  <div id="footer">
413
- Generated on Mon Jul 21 18:28:17 2025 by
413
+ Generated on Thu Aug 7 21:05:54 2025 by
414
414
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
415
- 0.9.37 (ruby-3.4.4).
415
+ 0.9.37 (ruby-3.4.5).
416
416
  </div>
417
417
 
418
418
  </div>
@@ -424,9 +424,9 @@ method <span class='object_link'><a href="#component_name-class_method" title="B
424
424
  </div>
425
425
 
426
426
  <div id="footer">
427
- Generated on Mon Jul 21 18:28:18 2025 by
427
+ Generated on Thu Aug 7 21:05:55 2025 by
428
428
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
429
- 0.9.37 (ruby-3.4.4).
429
+ 0.9.37 (ruby-3.4.5).
430
430
  </div>
431
431
 
432
432
  </div>
@@ -460,9 +460,9 @@
460
460
  </div>
461
461
 
462
462
  <div id="footer">
463
- Generated on Mon Jul 21 18:28:18 2025 by
463
+ Generated on Thu Aug 7 21:05:55 2025 by
464
464
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
465
- 0.9.37 (ruby-3.4.4).
465
+ 0.9.37 (ruby-3.4.5).
466
466
  </div>
467
467
 
468
468
  </div>
@@ -425,10 +425,10 @@ If the form's action is GET, it will not.</p>
425
425
  <span class='id identifier rubyid_form_class'>form_class</span> <span class='op'>=</span> <span class='id identifier rubyid_form_class'>form_class</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span>
426
426
  <span class='kw'>end</span>
427
427
  <span class='kw'>if</span> <span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:action</span><span class='rbracket'>]</span>
428
- <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You cannot specify both for: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_form_class'>form_class</span><span class='embexpr_end'>}</span><span class='tstring_content'>) and and action: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:action</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'>) to a form_tag</span><span class='tstring_end'>&quot;</span></span>
428
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You cannot specify both for: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_form_class'>form_class</span><span class='embexpr_end'>}</span><span class='tstring_content'>) and and action: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:action</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'>) to </span><span class='embexpr_beg'>#{</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
429
429
  <span class='kw'>end</span>
430
430
  <span class='kw'>if</span> <span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:method</span><span class='rbracket'>]</span>
431
- <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You cannot specify both for: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_form_class'>form_class</span><span class='embexpr_end'>}</span><span class='tstring_content'>) and and method: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:method</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'>) to a form_tag</span><span class='tstring_end'>&quot;</span></span>
431
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>You cannot specify both for: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_form_class'>form_class</span><span class='embexpr_end'>}</span><span class='tstring_content'>) and and method: (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_html_attributes'>html_attributes</span><span class='lbracket'>[</span><span class='symbol'>:method</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'>) to </span><span class='embexpr_beg'>#{</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
432
432
  <span class='kw'>end</span>
433
433
  <span class='kw'>begin</span>
434
434
  <span class='id identifier rubyid_route'>route</span> <span class='op'>=</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_routing'>routing</span><span class='period'>.</span><span class='id identifier rubyid_route'>route</span><span class='lparen'>(</span><span class='id identifier rubyid_form_class'>form_class</span><span class='rparen'>)</span>
@@ -516,9 +516,9 @@ If the form's action is GET, it will not.</p>
516
516
  </div>
517
517
 
518
518
  <div id="footer">
519
- Generated on Mon Jul 21 18:28:18 2025 by
519
+ Generated on Thu Aug 7 21:05:55 2025 by
520
520
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
521
- 0.9.37 (ruby-3.4.4).
521
+ 0.9.37 (ruby-3.4.5).
522
522
  </div>
523
523
 
524
524
  </div>
@@ -303,9 +303,9 @@ client side <code>ValidityState</code> returns true for, say, <code>badInput</co
303
303
  </div>
304
304
 
305
305
  <div id="footer">
306
- Generated on Mon Jul 21 18:28:18 2025 by
306
+ Generated on Thu Aug 7 21:05:55 2025 by
307
307
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
308
- 0.9.37 (ruby-3.4.4).
308
+ 0.9.37 (ruby-3.4.5).
309
309
  </div>
310
310
 
311
311
  </div>
@@ -185,9 +185,9 @@
185
185
  </div>
186
186
 
187
187
  <div id="footer">
188
- Generated on Mon Jul 21 18:28:18 2025 by
188
+ Generated on Thu Aug 7 21:05:55 2025 by
189
189
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
190
- 0.9.37 (ruby-3.4.4).
190
+ 0.9.37 (ruby-3.4.5).
191
191
  </div>
192
192
 
193
193
  </div>
@@ -329,9 +329,9 @@ to use this directly if you are building a form without <span class='object_link
329
329
  </div>
330
330
 
331
331
  <div id="footer">
332
- Generated on Mon Jul 21 18:28:18 2025 by
332
+ Generated on Thu Aug 7 21:05:55 2025 by
333
333
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
334
- 0.9.37 (ruby-3.4.4).
334
+ 0.9.37 (ruby-3.4.5).
335
335
  </div>
336
336
 
337
337
  </div>
@@ -553,9 +553,9 @@ Generally, you want to use this method over the initializer.</p>
553
553
  </div>
554
554
 
555
555
  <div id="footer">
556
- Generated on Mon Jul 21 18:28:18 2025 by
556
+ Generated on Thu Aug 7 21:05:55 2025 by
557
557
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
558
- 0.9.37 (ruby-3.4.4).
558
+ 0.9.37 (ruby-3.4.5).
559
559
  </div>
560
560
 
561
561
  </div>
@@ -409,9 +409,9 @@ method once for each radio button in the group.</p>
409
409
  </div>
410
410
 
411
411
  <div id="footer">
412
- Generated on Mon Jul 21 18:28:18 2025 by
412
+ Generated on Thu Aug 7 21:05:55 2025 by
413
413
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
414
- 0.9.37 (ruby-3.4.4).
414
+ 0.9.37 (ruby-3.4.5).
415
415
  </div>
416
416
 
417
417
  </div>
@@ -601,9 +601,9 @@ to be used as the <code>value</code> attribute and option text content, respecti
601
601
  </div>
602
602
 
603
603
  <div id="footer">
604
- Generated on Mon Jul 21 18:28:19 2025 by
604
+ Generated on Thu Aug 7 21:05:56 2025 by
605
605
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
606
- 0.9.37 (ruby-3.4.4).
606
+ 0.9.37 (ruby-3.4.5).
607
607
  </div>
608
608
 
609
609
  </div>
@@ -525,9 +525,9 @@ Generally, you want to use this method over the initializer.</p>
525
525
  </div>
526
526
 
527
527
  <div id="footer">
528
- Generated on Mon Jul 21 18:28:18 2025 by
528
+ Generated on Thu Aug 7 21:05:55 2025 by
529
529
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
530
- 0.9.37 (ruby-3.4.4).
530
+ 0.9.37 (ruby-3.4.5).
531
531
  </div>
532
532
 
533
533
  </div>
@@ -115,9 +115,9 @@
115
115
  </div>
116
116
 
117
117
  <div id="footer">
118
- Generated on Mon Jul 21 18:28:17 2025 by
118
+ Generated on Thu Aug 7 21:05:54 2025 by
119
119
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
120
- 0.9.37 (ruby-3.4.4).
120
+ 0.9.37 (ruby-3.4.5).
121
121
  </div>
122
122
 
123
123
  </div>
@@ -357,9 +357,9 @@ ask the browser to send it, or not.</p>
357
357
  </div>
358
358
 
359
359
  <div id="footer">
360
- Generated on Mon Jul 21 18:28:18 2025 by
360
+ Generated on Thu Aug 7 21:05:55 2025 by
361
361
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
362
- 0.9.37 (ruby-3.4.4).
362
+ 0.9.37 (ruby-3.4.5).
363
363
  </div>
364
364
 
365
365
  </div>
@@ -326,9 +326,9 @@
326
326
  </div>
327
327
 
328
328
  <div id="footer">
329
- Generated on Mon Jul 21 18:28:18 2025 by
329
+ Generated on Thu Aug 7 21:05:55 2025 by
330
330
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
331
- 0.9.37 (ruby-3.4.4).
331
+ 0.9.37 (ruby-3.4.5).
332
332
  </div>
333
333
 
334
334
  </div>
@@ -645,9 +645,9 @@ you would like to be accessible. If omitted, the tag's contents will be the for
645
645
  </div>
646
646
 
647
647
  <div id="footer">
648
- Generated on Mon Jul 21 18:28:18 2025 by
648
+ Generated on Thu Aug 7 21:05:55 2025 by
649
649
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
650
- 0.9.37 (ruby-3.4.4).
650
+ 0.9.37 (ruby-3.4.5).
651
651
  </div>
652
652
 
653
653
  </div>
@@ -342,9 +342,9 @@
342
342
  </div>
343
343
 
344
344
  <div id="footer">
345
- Generated on Mon Jul 21 18:28:18 2025 by
345
+ Generated on Thu Aug 7 21:05:55 2025 by
346
346
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
347
- 0.9.37 (ruby-3.4.4).
347
+ 0.9.37 (ruby-3.4.5).
348
348
  </div>
349
349
 
350
350
  </div>