brut 0.0.26 → 0.0.28

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/brutrb.com/.vitepress/config.mjs +2 -0
  4. data/brutrb.com/ai.md +6 -1
  5. data/brutrb.com/components.md +1 -1
  6. data/brutrb.com/dev-environment.md +6 -5
  7. data/brutrb.com/doc-conventions.md +1 -1
  8. data/brutrb.com/forms.md +22 -26
  9. data/brutrb.com/getting-started.md +94 -23
  10. data/brutrb.com/instrumentation.md +12 -0
  11. data/brutrb.com/layouts.md +130 -0
  12. data/brutrb.com/lsp.md +23 -0
  13. data/docs/404.html +2 -2
  14. data/docs/ai.html +5 -5
  15. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  16. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  17. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  18. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  19. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  20. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  21. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  22. data/docs/api/Brut/BackEnd.html +1 -1
  23. data/docs/api/Brut/CLI/App.html +38 -13
  24. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  25. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  26. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
  27. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  28. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
  29. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
  31. data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
  32. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +9 -3
  33. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +11 -11
  34. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
  35. data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
  36. data/docs/api/Brut/CLI/Apps/DB/Status.html +12 -12
  37. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +270 -0
  39. data/docs/api/Brut/CLI/Apps/DeployBase.html +257 -0
  40. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +585 -0
  41. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +196 -0
  42. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
  44. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
  45. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
  46. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
  47. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
  48. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  50. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +2 -2
  52. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  53. data/docs/api/Brut/CLI/Apps/Test/Audit.html +12 -10
  54. data/docs/api/Brut/CLI/Apps/Test/E2e.html +8 -8
  55. data/docs/api/Brut/CLI/Apps/Test/JS.html +9 -9
  56. data/docs/api/Brut/CLI/Apps/Test/Run.html +18 -18
  57. data/docs/api/Brut/CLI/Apps/Test.html +1 -1
  58. data/docs/api/Brut/CLI/Apps.html +2 -2
  59. data/docs/api/Brut/CLI/Command.html +113 -28
  60. data/docs/api/Brut/CLI/Error.html +1 -1
  61. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  62. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  63. data/docs/api/Brut/CLI/Executor.html +169 -38
  64. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  65. data/docs/api/Brut/CLI/Options.html +68 -19
  66. data/docs/api/Brut/CLI/Output.html +1 -1
  67. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  68. data/docs/api/Brut/CLI.html +1 -1
  69. data/docs/api/Brut/FactoryBot.html +1 -1
  70. data/docs/api/Brut/Framework/App.html +1 -1
  71. data/docs/api/Brut/Framework/Config.html +1 -1
  72. data/docs/api/Brut/Framework/Container.html +110 -29
  73. data/docs/api/Brut/Framework/Error.html +1 -1
  74. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +89 -1
  75. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  76. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  77. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  78. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  79. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  80. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  81. data/docs/api/Brut/Framework/Errors.html +31 -8
  82. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  83. data/docs/api/Brut/Framework/MCP.html +1 -1
  84. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  85. data/docs/api/Brut/Framework.html +1 -1
  86. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  87. data/docs/api/Brut/FrontEnd/Component/Helpers.html +36 -26
  88. data/docs/api/Brut/FrontEnd/Component.html +7 -7
  89. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  90. data/docs/api/Brut/FrontEnd/Components/FormTag.html +37 -29
  91. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  92. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  93. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +20 -117
  95. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +25 -23
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +73 -380
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +22 -138
  98. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  99. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components.html +23 -2
  104. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Form.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +24 -68
  108. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +4 -4
  110. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +72 -22
  116. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  117. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  126. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  127. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  128. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  129. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  130. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  131. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  132. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  133. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  134. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  135. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +6 -2
  136. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  140. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  141. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  142. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  143. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  144. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  145. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  146. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  147. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  149. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  150. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  151. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  152. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  153. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  154. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  155. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  156. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  159. data/docs/api/Brut/FrontEnd.html +1 -1
  160. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  161. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  162. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  163. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  164. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  165. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  166. data/docs/api/Brut/I18n.html +1 -1
  167. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  168. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  169. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  170. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  171. data/docs/api/Brut/Instrumentation.html +1 -1
  172. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  173. data/docs/api/Brut/SinatraHelpers.html +1 -1
  174. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  175. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  176. data/docs/api/Brut/SpecSupport/E2ETestServer.html +20 -20
  177. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  178. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  179. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  180. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  181. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  182. data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
  183. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +142 -0
  184. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +142 -0
  185. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +155 -0
  186. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +55 -25
  187. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +149 -0
  188. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +46 -19
  189. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +149 -0
  190. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +149 -0
  191. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +165 -0
  192. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +158 -0
  193. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +156 -0
  194. data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
  195. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +24 -24
  196. data/docs/api/Brut/SpecSupport/RSpecSetup.html +55 -20
  197. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  198. data/docs/api/Brut/SpecSupport.html +1 -1
  199. data/docs/api/Brut.html +1 -1
  200. data/docs/api/Clock.html +1 -1
  201. data/docs/api/RichString.html +1 -1
  202. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  203. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +5 -1
  204. data/docs/api/Sequel/Extensions/BrutMigrations.html +36 -28
  205. data/docs/api/Sequel/Extensions.html +1 -1
  206. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  207. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  208. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  209. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  210. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  211. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  212. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  213. data/docs/api/Sequel/Plugins.html +1 -1
  214. data/docs/api/Sequel.html +1 -1
  215. data/docs/api/SpecSupport/Matchers/BeABug.html +143 -0
  216. data/docs/api/_index.html +92 -1
  217. data/docs/api/class_list.html +1 -1
  218. data/docs/api/file.README.html +1 -1
  219. data/docs/api/index.html +1 -1
  220. data/docs/api/method_list.html +392 -336
  221. data/docs/api/top-level-namespace.html +1 -1
  222. data/docs/assets/{ai.md.tZrjP9im.js → ai.md._6HCDL6d.js} +1 -1
  223. data/docs/assets/ai.md._6HCDL6d.lean.js +1 -0
  224. data/docs/assets/{app.D_yaTITQ.js → app.BX81XO4N.js} +1 -1
  225. data/docs/assets/chunks/@localSearchIndexroot.CoYzciVi.js +1 -0
  226. data/docs/assets/chunks/{VPLocalSearchBox.B2-ZzyTY.js → VPLocalSearchBox.gABXcTWp.js} +1 -1
  227. data/docs/assets/chunks/{theme.CfGFVRvE.js → theme.DwUXXAL3.js} +2 -2
  228. data/docs/assets/{components.md.eCttGlN-.js → components.md.CRUMdRoN.js} +1 -1
  229. data/docs/assets/{configuration.md.BRriU0cL.js → configuration.md.BGHl8oRC.js} +1 -1
  230. data/docs/assets/{dev-environment.md.BNc8AYiK.js → dev-environment.md.GZv6xvi9.js} +1 -1
  231. data/docs/assets/doc-conventions.md.-kN3Xo5C.js +1 -0
  232. data/docs/assets/{doc-conventions.md.DCfRXXi-.lean.js → doc-conventions.md.-kN3Xo5C.lean.js} +1 -1
  233. data/docs/assets/{forms.md.CBTYQ_Cz.js → forms.md.B-koVgyw.js} +23 -23
  234. data/docs/assets/{forms.md.CBTYQ_Cz.lean.js → forms.md.B-koVgyw.lean.js} +1 -1
  235. data/docs/assets/getting-started.md.Ciz82L0m.js +25 -0
  236. data/docs/assets/getting-started.md.Ciz82L0m.lean.js +1 -0
  237. data/docs/assets/{instrumentation.md.CL6ax7nT.js → instrumentation.md.a9Pjps4P.js} +2 -2
  238. data/docs/assets/{instrumentation.md.CL6ax7nT.lean.js → instrumentation.md.a9Pjps4P.lean.js} +1 -1
  239. data/docs/assets/layouts.md.cPnh3NId.js +51 -0
  240. data/docs/assets/layouts.md.cPnh3NId.lean.js +1 -0
  241. data/docs/assets/lsp.md.Bsu-f6VU.js +1 -0
  242. data/docs/assets/lsp.md.Bsu-f6VU.lean.js +1 -0
  243. data/docs/assets/{overview.md.CDalkuxV.js → overview.md.C5wlBcR5.js} +3 -3
  244. data/docs/assets/recipes_authentication.md.CAsXf7hk.js +1 -0
  245. data/docs/assets/recipes_authentication.md.CAsXf7hk.lean.js +1 -0
  246. data/docs/assets.html +4 -4
  247. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  248. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  249. data/docs/brut-js/api/Autosubmit.html +1 -1
  250. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  251. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  252. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  253. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  254. data/docs/brut-js/api/BufferedLogger.html +1 -1
  255. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  256. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  257. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  258. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  259. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  260. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  261. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  262. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  263. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  264. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  265. data/docs/brut-js/api/Form.html +1 -1
  266. data/docs/brut-js/api/Form.js.html +1 -1
  267. data/docs/brut-js/api/I18nTranslation.html +1 -1
  268. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  269. data/docs/brut-js/api/LocaleDetection.html +1 -1
  270. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  271. data/docs/brut-js/api/Logger.html +1 -1
  272. data/docs/brut-js/api/Logger.js.html +1 -1
  273. data/docs/brut-js/api/Message.html +1 -1
  274. data/docs/brut-js/api/Message.js.html +1 -1
  275. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  276. data/docs/brut-js/api/RichString.html +1 -1
  277. data/docs/brut-js/api/RichString.js.html +1 -1
  278. data/docs/brut-js/api/Tabs.html +1 -1
  279. data/docs/brut-js/api/Tabs.js.html +1 -1
  280. data/docs/brut-js/api/Tracing.html +1 -1
  281. data/docs/brut-js/api/Tracing.js.html +1 -1
  282. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  283. data/docs/brut-js/api/external-Performance.html +1 -1
  284. data/docs/brut-js/api/external-Promise.html +1 -1
  285. data/docs/brut-js/api/external-ValidityState.html +1 -1
  286. data/docs/brut-js/api/external-Window.html +1 -1
  287. data/docs/brut-js/api/external-fetch.html +1 -1
  288. data/docs/brut-js/api/global.html +1 -1
  289. data/docs/brut-js/api/index.html +1 -1
  290. data/docs/brut-js/api/index.js.html +1 -1
  291. data/docs/brut-js/api/module-testing.html +1 -1
  292. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  293. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  294. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  295. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  296. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  297. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  298. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  299. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  300. data/docs/brut-js/api/testing_index.js.html +1 -1
  301. data/docs/brut-js.html +4 -4
  302. data/docs/business-logic.html +4 -4
  303. data/docs/cli.html +4 -4
  304. data/docs/components.html +6 -6
  305. data/docs/configuration.html +5 -5
  306. data/docs/css.html +4 -4
  307. data/docs/custom-element-tests.html +4 -4
  308. data/docs/database-access.html +4 -4
  309. data/docs/database-schema.html +4 -4
  310. data/docs/deployment.html +4 -4
  311. data/docs/dev-environment.html +5 -5
  312. data/docs/doc-conventions.html +5 -5
  313. data/docs/end-to-end-tests.html +4 -4
  314. data/docs/flash-and-session.html +4 -4
  315. data/docs/forms.html +27 -27
  316. data/docs/getting-started.html +29 -6
  317. data/docs/handlers.html +4 -4
  318. data/docs/hashmap.json +1 -1
  319. data/docs/hooks.html +4 -4
  320. data/docs/i18n.html +4 -4
  321. data/docs/index.html +3 -3
  322. data/docs/instrumentation.html +5 -5
  323. data/docs/javascript.html +4 -4
  324. data/docs/jobs.html +4 -4
  325. data/docs/keyword-injection.html +4 -4
  326. data/docs/layouts.html +74 -0
  327. data/docs/lsp.html +24 -0
  328. data/docs/markdown-examples.html +4 -4
  329. data/docs/middleware.html +4 -4
  330. data/docs/not-released.html +4 -4
  331. data/docs/overview.html +8 -8
  332. data/docs/pages.html +5 -5
  333. data/docs/recipes/authentication.html +24 -0
  334. data/docs/routes.html +4 -4
  335. data/docs/security.html +4 -4
  336. data/docs/seed-data.html +4 -4
  337. data/docs/space-time-continuum.html +4 -4
  338. data/docs/tutorial.html +4 -4
  339. data/docs/unit-tests.html +4 -4
  340. data/lib/brut/cli/app.rb +7 -2
  341. data/lib/brut/cli/apps/deploy_base.rb +86 -0
  342. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +194 -0
  343. data/lib/brut/cli/apps/test.rb +2 -1
  344. data/lib/brut/cli/command.rb +7 -13
  345. data/lib/brut/cli/executor.rb +31 -5
  346. data/lib/brut/cli/options.rb +4 -0
  347. data/lib/brut/cli.rb +4 -3
  348. data/lib/brut/framework/container.rb +25 -7
  349. data/lib/brut/framework/errors/abstract_method.rb +7 -0
  350. data/lib/brut/framework/errors.rb +4 -2
  351. data/lib/brut/front_end/component.rb +33 -9
  352. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +16 -74
  353. data/lib/brut/front_end/forms/constraint_violation.rb +2 -18
  354. data/lib/brut/front_end/forms/input.rb +8 -8
  355. data/lib/brut/front_end/forms/input_declarations.rb +3 -3
  356. data/lib/brut/front_end/forms/radio_button_group_input.rb +1 -1
  357. data/lib/brut/front_end/forms/select_input.rb +1 -1
  358. data/lib/brut/front_end/forms/validity_state.rb +23 -0
  359. data/lib/brut/front_end/middlewares/reload_app.rb +2 -0
  360. data/lib/brut/spec_support/handler_support.rb +1 -1
  361. data/lib/brut/spec_support/matcher.rb +1 -1
  362. data/lib/brut/spec_support/matchers/be_a_bug.rb +11 -0
  363. data/lib/brut/spec_support/matchers/be_page_for.rb +10 -0
  364. data/lib/brut/spec_support/matchers/be_routing_for.rb +18 -0
  365. data/lib/brut/spec_support/matchers/have_constraint_violation.rb +10 -0
  366. data/lib/brut/spec_support/matchers/have_generated.rb +28 -0
  367. data/lib/brut/spec_support/matchers/have_html_attribute.rb +10 -0
  368. data/lib/brut/spec_support/matchers/have_i18n_string.rb +13 -0
  369. data/lib/brut/spec_support/matchers/have_link_to.rb +15 -0
  370. data/lib/brut/spec_support/matchers/have_redirected_to.rb +23 -0
  371. data/lib/brut/spec_support/matchers/have_returned_http_status.rb +20 -0
  372. data/lib/brut/spec_support/matchers/have_returned_rack_response.rb +22 -0
  373. data/lib/brut/spec_support/rspec_setup.rb +42 -2
  374. data/lib/brut/version.rb +1 -1
  375. data/lib/sequel/extensions/brut_instrumentation.rb +4 -0
  376. metadata +51 -24
  377. data/docs/assets/ai.md.tZrjP9im.lean.js +0 -1
  378. data/docs/assets/chunks/@localSearchIndexroot.BsN5i0Fi.js +0 -1
  379. data/docs/assets/doc-conventions.md.DCfRXXi-.js +0 -1
  380. data/docs/assets/getting-started.md.Bz2s1Vjb.js +0 -2
  381. data/docs/assets/getting-started.md.Bz2s1Vjb.lean.js +0 -1
  382. data/lib/brut/spec_support/matchers/have_rendered.rb +0 -14
  383. /data/docs/assets/{components.md.eCttGlN-.lean.js → components.md.CRUMdRoN.lean.js} +0 -0
  384. /data/docs/assets/{configuration.md.BRriU0cL.lean.js → configuration.md.BGHl8oRC.lean.js} +0 -0
  385. /data/docs/assets/{dev-environment.md.BNc8AYiK.lean.js → dev-environment.md.GZv6xvi9.lean.js} +0 -0
  386. /data/docs/assets/{overview.md.CDalkuxV.lean.js → overview.md.C5wlBcR5.lean.js} +0 -0
@@ -32,7 +32,7 @@ class Brut::FrontEnd::Forms::RadioButtonGroupInput
32
32
  end
33
33
 
34
34
  @validity_state = Brut::FrontEnd::Forms::ValidityState.new(
35
- value_missing: missing,
35
+ valueMissing: missing,
36
36
  )
37
37
  @value = new_value
38
38
  end
@@ -30,7 +30,7 @@ class Brut::FrontEnd::Forms::SelectInput
30
30
  end
31
31
 
32
32
  @validity_state = Brut::FrontEnd::Forms::ValidityState.new(
33
- value_missing: missing,
33
+ valueMissing: missing,
34
34
  )
35
35
  @value = new_value
36
36
  end
@@ -3,6 +3,11 @@
3
3
  # In a sense, this is a wrapper for one or more {Brut::FrontEnd::Forms::ConstraintViolation} instances in the
4
4
  # context of an input.
5
5
  #
6
+ # This class also holds the logic related to client- vs. server-side constraint
7
+ # violations. As such, {.KEYS} is the list of known client-side
8
+ # constraint violation keys, as defined by browser's `ValidityState` class. These
9
+ # are left as camel-case to make this clear.
10
+ #
6
11
  # @see https://developer.mozilla.org/en-US/docs/Web/API/ValidityState
7
12
  class Brut::FrontEnd::Forms::ValidityState
8
13
  include Enumerable
@@ -46,5 +51,23 @@ class Brut::FrontEnd::Forms::ValidityState
46
51
  end
47
52
  end
48
53
 
54
+
55
+ # These are the attributes of the browser's `ValidityState`'s properties.
56
+ # They are left as camel-case to clearly indicate they come from the browser.
57
+ #
58
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/ValidityState
59
+ KEYS = [
60
+ "badInput",
61
+ "customError",
62
+ "patternMismatch",
63
+ "rangeOverflow",
64
+ "rangeUnderflow",
65
+ "stepMismatch",
66
+ "tooLong",
67
+ "tooShort",
68
+ "typeMismatch",
69
+ "valueMissing",
70
+ ]
71
+
49
72
  end
50
73
 
@@ -28,6 +28,8 @@ class Brut::FrontEnd::Middlewares::ReloadApp < Brut::FrontEnd::Middleware
28
28
  span.add_event("Routing reloaded")
29
29
  Brut.container.asset_path_resolver.reload
30
30
  span.add_event("Asset Path Resolver reloaded")
31
+ Brut.container.reload
32
+ span.add_event("Brut.container reloaded")
31
33
  ::I18n.reload!
32
34
  span.add_event("I18n reloaded")
33
35
  rescue => ex
@@ -6,7 +6,7 @@ require_relative "session_support"
6
6
  #
7
7
  #
8
8
  # * `have_redirected_to` to check that the handler redirected to a give URI
9
- # * `have_rendered` to check that the handler rendered a specific page
9
+ # * `have_generated` to check that the handler rendered a specific page
10
10
  # * `have_returned_http_status` to check that the handler returned an HTTP status
11
11
  module Brut::SpecSupport::HandlerSupport
12
12
  include Brut::SpecSupport::FlashSupport
@@ -8,7 +8,7 @@ require_relative "matchers/have_constraint_violation"
8
8
  require_relative "matchers/have_html_attribute"
9
9
  require_relative "matchers/have_i18n_string"
10
10
  require_relative "matchers/have_redirected_to"
11
- require_relative "matchers/have_rendered"
11
+ require_relative "matchers/have_generated"
12
12
  require_relative "matchers/have_returned_http_status"
13
13
  require_relative "matchers/have_returned_rack_response"
14
14
  require_relative "matchers/have_link_to"
@@ -12,3 +12,14 @@ RSpec::Matchers.define :be_a_bug do
12
12
 
13
13
  supports_block_expectations
14
14
  end
15
+
16
+ # Block-based matcher that expects the blog to
17
+ # raise a {Brut::Framework::Errors::Bug}.
18
+ #
19
+ # @example
20
+ # expect {
21
+ # SomeClass.new(value: :invalid)
22
+ # }.to be_a_bug
23
+ #
24
+ class Brut::SpecSupport::Matchers::BeABug
25
+ end
@@ -14,3 +14,13 @@ RSpec::Matchers.define :be_page_for do |klass|
14
14
  end
15
15
  end
16
16
  end
17
+
18
+ # Matcher for end-to-end tests to assert that the current page
19
+ # is the page you expect it to be. This is based on the
20
+ # {Brut::FrontEnd::Components::PageIdentifier} component, which must
21
+ # be included on the page for this matcher to work.
22
+ #
23
+ # @example
24
+ # expect(page).to be_page_for(HomePage)
25
+ class Brut::SpecSupport::Matchers::BePageFor
26
+ end
@@ -9,3 +9,21 @@ RSpec::Matchers.define :be_routing_for do |klass,**args|
9
9
  end
10
10
 
11
11
  end
12
+
13
+ # Matcher used for handlers (or any code that returns a `URI`)
14
+ # to assert that the URI is for a given page with the given set of parameters
15
+ #
16
+ # @example
17
+ # result = handler.handle
18
+ # expect(result).to be_routing_for(HomePage)
19
+ #
20
+ # @example with parameters
21
+ # result = handler.handle
22
+ # expect(result).to be_routing_for(WidgetsByWidgetIdPage, id: widget.external_id)
23
+ #
24
+ # @example with anchor
25
+ # result = handler.handle
26
+ # expect(result).to be_routing_for(MessagesPage, anchor: "latest_message")
27
+ #
28
+ class Brut::SpecSupport::Matchers::BeRoutingFor
29
+ end
@@ -29,6 +29,16 @@ RSpec::Matchers.define :have_constraint_violation do |field,key:,index:nil|
29
29
  end
30
30
  end
31
31
 
32
+ # Matcher to check that a from has a specific constraint violation.
33
+ #
34
+ # @example
35
+ # expect(form).to have_constraint_violation(:email, key: :required)
36
+ #
37
+ # @example Index fields (requires that the third email field have a constraint violation)
38
+ # expect(form).to have_constraint_violation(:email, key: :required, index: 2)
39
+ #
40
+ # @example Negated
41
+ # expect(form).not_to have_constraint_violation(:email, key: :required)
32
42
  class Brut::SpecSupport::Matchers::HaveConstraintViolation
33
43
  attr_reader :fields_found
34
44
  attr_reader :keys_on_field_found
@@ -0,0 +1,28 @@
1
+ # Handler
2
+ RSpec::Matchers.define :have_generated do |component_or_page|
3
+ match do |result|
4
+ result.class.ancestors.include?(component_or_page)
5
+ end
6
+
7
+ failure_message do |result|
8
+ "Expected a #{component_or_page} to be generated, but got #{result}"
9
+ end
10
+ failure_message_when_negated do |result|
11
+ "Got #{component_or_page} when not expected"
12
+ end
13
+
14
+ end
15
+
16
+ # Matcher to check that a handler generated a specific page
17
+ # (as opposed to redirected to a page). This works for components
18
+ # as well, in the case of Ajax requests.
19
+ #
20
+ # @example
21
+ # result = handler.handle(form:)
22
+ # expect(result).to have_generated(NewWidgetPage)
23
+ #
24
+ # @example Ajax request
25
+ # result = handler.handle(form:, xhr: true)
26
+ # expect(result).to have_generated(WidgetResponseComponent)
27
+ class Brut::SpecSupport::Matchers::HaveGenerated
28
+ end
@@ -25,6 +25,16 @@ RSpec::Matchers.define :have_html_attribute do |attribute|
25
25
  end
26
26
  end
27
27
 
28
+ # Used in component or page specs to check that a given node
29
+ # has a particular HTML attribnute, or an attribute with a speecific value.
30
+ #
31
+ # @example
32
+ # result = generate_and_parse(page)
33
+ # expect(result.e!("blockquote")).to have_html_attribute(:id)
34
+ #
35
+ # @example Expecting a value as well
36
+ # result = generate_and_parse(page)
37
+ # expect(result.e!("blockquote")).to have_html_attribute(id: "foo")
28
38
  class Brut::SpecSupport::Matchers::HaveHTMLAttribute
29
39
 
30
40
  attr_reader :error
@@ -24,3 +24,16 @@ RSpec::Matchers.define :have_i18n_string do |key,**args|
24
24
  end
25
25
  end
26
26
 
27
+ # Used in component or page specs to check if a Nokogiri node's
28
+ # text contains a specific i18n string, without you having
29
+ # to use `t` to look it up.
30
+ #
31
+ # @example
32
+ # result = generate_and_parse(page)
33
+ # expect(result.e!("h3")).to have_i18n_string(:greeting)
34
+ #
35
+ # @example I18n string with parameters
36
+ # result = generate_and_parse(page)
37
+ # expect(result.e!("h3")).to have_i18n_string(:user_greeting, email: account.email)
38
+ class Brut::SpecSupport::Matchers::HaveI18nString
39
+ end
@@ -13,3 +13,18 @@ RSpec::Matchers.define :have_link_to do |page_klass,**args|
13
13
  "Did not expect to find link to #{page_klass.routing(**args)}."
14
14
  end
15
15
  end
16
+
17
+ # Used on a component/page spec to check that there is a link
18
+ # to a specific routing. This handles creating a CSS selector
19
+ # like `[href="#{page_klass.routing(**args)}"]`.
20
+ #
21
+ # @example
22
+ # result = generate_and_parse(page)
23
+ # expect(result.e!("nav")).to have_link_to(HomePage)
24
+ #
25
+ # @example link with parameters
26
+ # result = generate_and_parse(page)
27
+ # expect(result.e!("nav")).to have_link_to(WidgetsByWidgetIdPage, id: widget.id)
28
+ #
29
+ class Brut::SpecSupport::Matchers::HaveLinkTo
30
+ end
@@ -37,5 +37,28 @@ RSpec::Matchers.define :have_redirected_to do |page_or_uri,**page_params|
37
37
  failure_message_when_negated do |result|
38
38
  "Got a redirect when it wasn't expected"
39
39
  end
40
+ end
40
41
 
42
+ # Used on handler specs to check that a response has
43
+ # redirected to a page or URI. Can also be used
44
+ # with {Brut::SpecSupport::ComponentSupport#generate_result} to
45
+ # check that a Page's {Brut::FrontEnd::Page#before_generate} method
46
+ # did what you expect
47
+ #
48
+ # @example
49
+ # result = handler.handle
50
+ # expect(result).to have_redirected_to(HomePage)
51
+ #
52
+ # @example with parameters
53
+ # result = handler.handle
54
+ # expect(result).to have_redirected_to(WidgetsByWidgetIdPage, id: widget.id)
55
+ #
56
+ # @example arbitrary URI
57
+ # result = handler.handle
58
+ # expect(result).to have_redirected_to("http://kagi.com")
59
+ #
60
+ # @example testing a `before_generate` method
61
+ # result = generate_result(page)
62
+ # expect(result).to have_redirected_to(LoginPage)
63
+ class Brut::SpecSupport::Matchers::HaveRedirectedTo
41
64
  end
@@ -31,5 +31,25 @@ RSpec::Matchers.define :have_returned_http_status do |http_status=nil|
31
31
  "Got #{http_status} when not expected (#{result.class} was returned)"
32
32
  end
33
33
  end
34
+ end
34
35
 
36
+ # Used on handler specs to check that a response returned
37
+ # a particular HTTP status code. Can also be used
38
+ # with {Brut::SpecSupport::ComponentSupport#generate_result} to
39
+ # check that a Page's {Brut::FrontEnd::Page#before_generate} method
40
+ # did what you expect
41
+ #
42
+ # @example
43
+ # result = handler.handle
44
+ # expect(result).to have_returned_http_status(404)
45
+ #
46
+ # @example dont' care what status, just that one was returned instead of a page generation
47
+ # result = handler.handle
48
+ # expect(result).to have_returned_http_status
49
+ #
50
+ #
51
+ # @example testing a `before_generate` method
52
+ # result = generate_result(page)
53
+ # expect(result).to have_returned_http_status(403)
54
+ class Brut::SpecSupport::Matchers::HaveReturnedHttpStatus
35
55
  end
@@ -42,3 +42,25 @@ RSpec::Matchers.define :have_returned_rack_response do |http_status: :any, heade
42
42
  end
43
43
 
44
44
  end
45
+
46
+ # Used on handler specs to check that a response returned
47
+ # a Rack response. Can also be used
48
+ # with {Brut::SpecSupport::ComponentSupport#generate_result} to
49
+ # check that a Page's {Brut::FrontEnd::Page#before_generate} method
50
+ # did what you expect
51
+ #
52
+ # The matcher expects these keyword arguments:
53
+ #
54
+ # * `http_status:` - the expected HTTP status code as a number, or `:any` (the default), if it's not relevant to the test.
55
+ # * `headers:` - the expected headers as a Hash of Strings to Strings, or `:any` (the default), if they are not relevant to the test.
56
+ # * `body:` - the expected body, or `:any` (the default), if it is not relevant to the test.
57
+ #
58
+ # @example
59
+ # result = handler.handle
60
+ # expect(result).to have_returned_rack_response(
61
+ # http_status: 200,
62
+ # headers: { "Content-Type" => "text/html" }
63
+ # )
64
+ #
65
+ class Brut::SpecSupport::Matchers::HaveReturnedRackResponse
66
+ end
@@ -43,8 +43,16 @@ class Brut::SpecSupport::RSpecSetup
43
43
  # Create the setup with the given RSpec configuration.
44
44
  #
45
45
  # @param [RSpec::Core::Configuration] rspec_config yielded from `RSpec.configure`
46
- def initialize(rspec_config:)
47
- @config = rspec_config
46
+ # @param [boolean] monkey_patch_summary_notification if true (the default),
47
+ # RSpec's Notifications::SumaryNotification will be monkey-patched to show
48
+ # `bin/test` in the summary instead of `./rspec`, as that is how you would
49
+ # re-run a test. But, it's still monkey-patching.
50
+ def initialize(rspec_config:,
51
+ monkey_patch_summary_notification: true)
52
+
53
+ @config = rspec_config
54
+ @monkey_patch_summary_notification = monkey_patch_summary_notification
55
+
48
56
  SemanticLogger.default_level = ENV.fetch("LOGGER_LEVEL_FOR_TESTS","warn")
49
57
  end
50
58
 
@@ -155,6 +163,9 @@ class Brut::SpecSupport::RSpecSetup
155
163
  @config.after(:suite) do
156
164
  Brut::SpecSupport::E2ETestServer.instance.stop
157
165
  end
166
+ if @monkey_patch_summary_notification
167
+ monkey_patch_summary_notification!
168
+ end
158
169
  end
159
170
 
160
171
  class OptionalSidekiqSupport
@@ -181,4 +192,33 @@ class Brut::SpecSupport::RSpecSetup
181
192
  end
182
193
  end
183
194
 
195
+ private
196
+
197
+ def monkey_patch_summary_notification!
198
+ require "rspec/core/notifications"
199
+ klass = RSpec::Core::Notifications::SummaryNotification
200
+ if !klass.instance_variable_get("@_brut_has_monkeypatched")
201
+ klass.class_eval do
202
+ # Slightly reformatted, but the only line that's different
203
+ # is the one that said to use './rspec'. Now it says 'bin/test run'
204
+ def colorized_rerun_commands(colorizer=::RSpec::Core::Formatters::ConsoleCodes)
205
+ "\nFailed examples:\n\n" +
206
+ failed_examples.map do |example|
207
+ rerun_argument = rerun_argument_for(example)
208
+ colorizer.wrap(
209
+ "bin/test run #{rerun_argument}", # <--- this is the only difference
210
+ RSpec.configuration.failure_color
211
+ ) +
212
+ " " +
213
+ colorizer.wrap(
214
+ "# #{example.full_description}",
215
+ RSpec.configuration.detail_color
216
+ )
217
+ end.join("\n")
218
+ end
219
+ end
220
+ klass.instance_variable_set("@_brut_has_monkeypatched",true)
221
+ end
222
+ end
184
223
  end
224
+
data/lib/brut/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Brut
2
2
  # @!visibility private
3
- VERSION = "0.0.26"
3
+ VERSION = "0.0.28"
4
4
  end
@@ -1,6 +1,10 @@
1
1
  module Sequel
2
2
  module Extensions
3
3
  # Instruments all SQL executions.
4
+ #
5
+ # *NOTE* this will include the actual SQL query text in the
6
+ # span, so any literal values in the query will be in the observability
7
+ # platforms.
4
8
  module BrutInstrumentation
5
9
  # @!visibility private
6
10
  def log_connection_yield(sql,conn,args=nil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.26
4
+ version: 0.0.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -614,6 +614,8 @@ files:
614
614
  - brutrb.com/javascript.md
615
615
  - brutrb.com/jobs.md
616
616
  - brutrb.com/keyword-injection.md
617
+ - brutrb.com/layouts.md
618
+ - brutrb.com/lsp.md
617
619
  - brutrb.com/markdown-examples.md
618
620
  - brutrb.com/middleware.md
619
621
  - brutrb.com/not-released.md
@@ -661,6 +663,10 @@ files:
661
663
  - docs/api/Brut/CLI/Apps/DB/Rebuild.html
662
664
  - docs/api/Brut/CLI/Apps/DB/Seed.html
663
665
  - docs/api/Brut/CLI/Apps/DB/Status.html
666
+ - docs/api/Brut/CLI/Apps/DeployBase.html
667
+ - docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html
668
+ - docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html
669
+ - docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html
664
670
  - docs/api/Brut/CLI/Apps/Scaffold.html
665
671
  - docs/api/Brut/CLI/Apps/Scaffold/Action.html
666
672
  - docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html
@@ -802,8 +808,17 @@ files:
802
808
  - docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html
803
809
  - docs/api/Brut/SpecSupport/HandlerSupport.html
804
810
  - docs/api/Brut/SpecSupport/Matchers.html
811
+ - docs/api/Brut/SpecSupport/Matchers/BeABug.html
812
+ - docs/api/Brut/SpecSupport/Matchers/BePageFor.html
813
+ - docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html
805
814
  - docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html
815
+ - docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html
806
816
  - docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html
817
+ - docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html
818
+ - docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html
819
+ - docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html
820
+ - docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html
821
+ - docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html
807
822
  - docs/api/Brut/SpecSupport/RSpecSetup.html
808
823
  - docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html
809
824
  - docs/api/Brut/SpecSupport/SessionSupport.html
@@ -822,6 +837,7 @@ files:
822
837
  - docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html
823
838
  - docs/api/Sequel/Plugins/FindBang.html
824
839
  - docs/api/Sequel/Plugins/FindBang/ClassMethods.html
840
+ - docs/api/SpecSupport/Matchers/BeABug.html
825
841
  - docs/api/_index.html
826
842
  - docs/api/class_list.html
827
843
  - docs/api/css/common.css
@@ -837,25 +853,25 @@ files:
837
853
  - docs/api/method_list.html
838
854
  - docs/api/top-level-namespace.html
839
855
  - docs/assets.html
840
- - docs/assets/ai.md.tZrjP9im.js
841
- - docs/assets/ai.md.tZrjP9im.lean.js
842
- - docs/assets/app.D_yaTITQ.js
856
+ - docs/assets/ai.md._6HCDL6d.js
857
+ - docs/assets/ai.md._6HCDL6d.lean.js
858
+ - docs/assets/app.BX81XO4N.js
843
859
  - docs/assets/assets.md.D3wunzLx.js
844
860
  - docs/assets/assets.md.D3wunzLx.lean.js
845
861
  - docs/assets/brut-js.md.o2DAO2s2.js
846
862
  - docs/assets/brut-js.md.o2DAO2s2.lean.js
847
863
  - docs/assets/business-logic.md.BY4hGy0m.js
848
864
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
849
- - docs/assets/chunks/@localSearchIndexroot.BsN5i0Fi.js
850
- - docs/assets/chunks/VPLocalSearchBox.B2-ZzyTY.js
865
+ - docs/assets/chunks/@localSearchIndexroot.CoYzciVi.js
866
+ - docs/assets/chunks/VPLocalSearchBox.gABXcTWp.js
851
867
  - docs/assets/chunks/framework.1L-BeKqY.js
852
- - docs/assets/chunks/theme.CfGFVRvE.js
868
+ - docs/assets/chunks/theme.DwUXXAL3.js
853
869
  - docs/assets/cli.md.RmeA2b0i.js
854
870
  - docs/assets/cli.md.RmeA2b0i.lean.js
855
- - docs/assets/components.md.eCttGlN-.js
856
- - docs/assets/components.md.eCttGlN-.lean.js
857
- - docs/assets/configuration.md.BRriU0cL.js
858
- - docs/assets/configuration.md.BRriU0cL.lean.js
871
+ - docs/assets/components.md.CRUMdRoN.js
872
+ - docs/assets/components.md.CRUMdRoN.lean.js
873
+ - docs/assets/configuration.md.BGHl8oRC.js
874
+ - docs/assets/configuration.md.BGHl8oRC.lean.js
859
875
  - docs/assets/css.md.DJgj2clw.js
860
876
  - docs/assets/css.md.DJgj2clw.lean.js
861
877
  - docs/assets/custom-element-tests.md.BrYJQEl3.js
@@ -868,18 +884,18 @@ files:
868
884
  - docs/assets/deployment.md.Dbka4OTr.lean.js
869
885
  - docs/assets/dev-env-overview.Gj7NWM8-.png
870
886
  - docs/assets/dev-env-protocol.DysDAtnz.png
871
- - docs/assets/dev-environment.md.BNc8AYiK.js
872
- - docs/assets/dev-environment.md.BNc8AYiK.lean.js
873
- - docs/assets/doc-conventions.md.DCfRXXi-.js
874
- - docs/assets/doc-conventions.md.DCfRXXi-.lean.js
887
+ - docs/assets/dev-environment.md.GZv6xvi9.js
888
+ - docs/assets/dev-environment.md.GZv6xvi9.lean.js
889
+ - docs/assets/doc-conventions.md.-kN3Xo5C.js
890
+ - docs/assets/doc-conventions.md.-kN3Xo5C.lean.js
875
891
  - docs/assets/end-to-end-tests.md.yfQHC0b5.js
876
892
  - docs/assets/end-to-end-tests.md.yfQHC0b5.lean.js
877
893
  - docs/assets/flash-and-session.md.BXY8RvT0.js
878
894
  - docs/assets/flash-and-session.md.BXY8RvT0.lean.js
879
- - docs/assets/forms.md.CBTYQ_Cz.js
880
- - docs/assets/forms.md.CBTYQ_Cz.lean.js
881
- - docs/assets/getting-started.md.Bz2s1Vjb.js
882
- - docs/assets/getting-started.md.Bz2s1Vjb.lean.js
895
+ - docs/assets/forms.md.B-koVgyw.js
896
+ - docs/assets/forms.md.B-koVgyw.lean.js
897
+ - docs/assets/getting-started.md.Ciz82L0m.js
898
+ - docs/assets/getting-started.md.Ciz82L0m.lean.js
883
899
  - docs/assets/handlers.md.089DVD3v.js
884
900
  - docs/assets/handlers.md.089DVD3v.lean.js
885
901
  - docs/assets/hooks.md.C4-moMny.js
@@ -888,14 +904,18 @@ files:
888
904
  - docs/assets/i18n.md.Do9i1qWl.lean.js
889
905
  - docs/assets/index.md.B28EwVpq.js
890
906
  - docs/assets/index.md.B28EwVpq.lean.js
891
- - docs/assets/instrumentation.md.CL6ax7nT.js
892
- - docs/assets/instrumentation.md.CL6ax7nT.lean.js
907
+ - docs/assets/instrumentation.md.a9Pjps4P.js
908
+ - docs/assets/instrumentation.md.a9Pjps4P.lean.js
893
909
  - docs/assets/javascript.md.GWbhRS51.js
894
910
  - docs/assets/javascript.md.GWbhRS51.lean.js
895
911
  - docs/assets/jobs.md.S-2amAYp.js
896
912
  - docs/assets/jobs.md.S-2amAYp.lean.js
897
913
  - docs/assets/keyword-injection.md.Dt2tKREs.js
898
914
  - docs/assets/keyword-injection.md.Dt2tKREs.lean.js
915
+ - docs/assets/layouts.md.cPnh3NId.js
916
+ - docs/assets/layouts.md.cPnh3NId.lean.js
917
+ - docs/assets/lsp.md.Bsu-f6VU.js
918
+ - docs/assets/lsp.md.Bsu-f6VU.lean.js
899
919
  - docs/assets/markdown-examples.md.CCFEQO44.js
900
920
  - docs/assets/markdown-examples.md.CCFEQO44.lean.js
901
921
  - docs/assets/middleware.md.Czz_UlJN.js
@@ -903,10 +923,12 @@ files:
903
923
  - docs/assets/not-released.md.BBy28McC.js
904
924
  - docs/assets/not-released.md.BBy28McC.lean.js
905
925
  - docs/assets/overview.Da81cB9R.png
906
- - docs/assets/overview.md.CDalkuxV.js
907
- - docs/assets/overview.md.CDalkuxV.lean.js
926
+ - docs/assets/overview.md.C5wlBcR5.js
927
+ - docs/assets/overview.md.C5wlBcR5.lean.js
908
928
  - docs/assets/pages.md.BE3kfOc5.js
909
929
  - docs/assets/pages.md.BE3kfOc5.lean.js
930
+ - docs/assets/recipes_authentication.md.CAsXf7hk.js
931
+ - docs/assets/recipes_authentication.md.CAsXf7hk.lean.js
910
932
  - docs/assets/routes.md.BMM7peut.js
911
933
  - docs/assets/routes.md.BMM7peut.lean.js
912
934
  - docs/assets/security.md.C668yXCi.js
@@ -1039,11 +1061,14 @@ files:
1039
1061
  - docs/javascript.html
1040
1062
  - docs/jobs.html
1041
1063
  - docs/keyword-injection.html
1064
+ - docs/layouts.html
1065
+ - docs/lsp.html
1042
1066
  - docs/markdown-examples.html
1043
1067
  - docs/middleware.html
1044
1068
  - docs/not-released.html
1045
1069
  - docs/overview.html
1046
1070
  - docs/pages.html
1071
+ - docs/recipes/authentication.html
1047
1072
  - docs/routes.html
1048
1073
  - docs/security.html
1049
1074
  - docs/seed-data.html
@@ -1074,6 +1099,8 @@ files:
1074
1099
  - lib/brut/cli/app_runner.rb
1075
1100
  - lib/brut/cli/apps/build_assets.rb
1076
1101
  - lib/brut/cli/apps/db.rb
1102
+ - lib/brut/cli/apps/deploy_base.rb
1103
+ - lib/brut/cli/apps/heroku_container_based_deploy.rb
1077
1104
  - lib/brut/cli/apps/scaffold.rb
1078
1105
  - lib/brut/cli/apps/test.rb
1079
1106
  - lib/brut/cli/command.rb
@@ -1182,11 +1209,11 @@ files:
1182
1209
  - lib/brut/spec_support/matchers/be_page_for.rb
1183
1210
  - lib/brut/spec_support/matchers/be_routing_for.rb
1184
1211
  - lib/brut/spec_support/matchers/have_constraint_violation.rb
1212
+ - lib/brut/spec_support/matchers/have_generated.rb
1185
1213
  - lib/brut/spec_support/matchers/have_html_attribute.rb
1186
1214
  - lib/brut/spec_support/matchers/have_i18n_string.rb
1187
1215
  - lib/brut/spec_support/matchers/have_link_to.rb
1188
1216
  - lib/brut/spec_support/matchers/have_redirected_to.rb
1189
- - lib/brut/spec_support/matchers/have_rendered.rb
1190
1217
  - lib/brut/spec_support/matchers/have_returned_http_status.rb
1191
1218
  - lib/brut/spec_support/matchers/have_returned_rack_response.rb
1192
1219
  - lib/brut/spec_support/rspec_setup.rb
@@ -1 +0,0 @@
1
- import{_ as t,c as o,o as a,ag as s}from"./chunks/framework.1L-BeKqY.js";const b=JSON.parse('{"title":"AI Declaration and Notes","description":"","frontmatter":{},"headers":[],"relativePath":"ai.md","filePath":"ai.md"}'),r={name:"ai.md"};function n(i,e,l,d,h,u){return a(),o("div",null,e[0]||(e[0]=[s("",26)]))}const p=t(r,[["render",n]]);export{b as __pageData,p as default};