brut 0.8.0 → 0.9.1

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 (420) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Dockerfile.dx +8 -1
  5. data/Gemfile.lock +101 -63
  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-js/specs/ConfirmSubmit.spec.js +32 -1
  19. data/brut-js/src/ConfirmSubmit.js +28 -7
  20. data/brut.gemspec +32 -26
  21. data/brutrb.com/.vitepress/config.mjs +3 -0
  22. data/brutrb.com/database-schema.md +1 -1
  23. data/brutrb.com/images/tutorial/basic-form-with-violations.png +0 -0
  24. data/brutrb.com/images/tutorial/basic-form.png +0 -0
  25. data/brutrb.com/images/tutorial/initial-home-page.png +0 -0
  26. data/brutrb.com/images/tutorial/new-post-editor.png +0 -0
  27. data/brutrb.com/images/tutorial/new-post-home-page.png +0 -0
  28. data/brutrb.com/images/tutorial/styled-form-with-server-side-violations.png +0 -0
  29. data/brutrb.com/images/tutorial/styled-form-with-violations.png +0 -0
  30. data/brutrb.com/images/tutorial/styled-home-page-with-posts.png +0 -0
  31. data/brutrb.com/images/tutorial/styled-home-page.png +0 -0
  32. data/brutrb.com/images/tutorial/welcome-to-brut.png +0 -0
  33. data/brutrb.com/recipes/migrations.md +1 -1
  34. data/brutrb.com/tutorial.md +1728 -3
  35. data/docker-compose.dx.yml +3 -0
  36. data/docs/404.html +2 -2
  37. data/docs/adrs.html +3 -3
  38. data/docs/ai.html +3 -3
  39. data/docs/api/Brut/BackEnd/SeedData.html +2 -2
  40. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +2 -2
  41. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +2 -2
  42. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +2 -2
  43. data/docs/api/Brut/BackEnd/Sidekiq.html +2 -2
  44. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +2 -2
  45. data/docs/api/Brut/BackEnd/Validators.html +2 -2
  46. data/docs/api/Brut/BackEnd.html +2 -2
  47. data/docs/api/Brut/CLI/App.html +2 -2
  48. data/docs/api/Brut/CLI/AppRunner.html +2 -2
  49. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  50. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
  51. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  52. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
  53. data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
  54. data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
  55. data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
  56. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +2 -2
  57. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +2 -2
  58. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
  59. data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
  60. data/docs/api/Brut/CLI/Apps/DB/Status.html +2 -2
  61. data/docs/api/Brut/CLI/Apps/DB.html +2 -2
  62. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +2 -2
  63. data/docs/api/Brut/CLI/Apps/DeployBase.html +2 -2
  64. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +3 -3
  65. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +2 -2
  66. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +2 -2
  67. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
  68. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
  69. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
  70. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +2 -2
  71. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
  72. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
  73. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +2 -2
  74. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  75. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +2 -2
  76. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +3 -3
  77. data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
  78. data/docs/api/Brut/CLI/Apps/Test/Audit.html +2 -2
  79. data/docs/api/Brut/CLI/Apps/Test/E2e.html +2 -2
  80. data/docs/api/Brut/CLI/Apps/Test/JS.html +2 -2
  81. data/docs/api/Brut/CLI/Apps/Test/Run.html +2 -2
  82. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  83. data/docs/api/Brut/CLI/Apps.html +2 -2
  84. data/docs/api/Brut/CLI/Command.html +2 -2
  85. data/docs/api/Brut/CLI/Error.html +2 -2
  86. data/docs/api/Brut/CLI/ExecutionResults/Result.html +2 -2
  87. data/docs/api/Brut/CLI/ExecutionResults.html +2 -2
  88. data/docs/api/Brut/CLI/Executor.html +2 -2
  89. data/docs/api/Brut/CLI/InvalidOption.html +2 -2
  90. data/docs/api/Brut/CLI/Options.html +80 -2
  91. data/docs/api/Brut/CLI/Output.html +2 -2
  92. data/docs/api/Brut/CLI/SystemExecError.html +2 -2
  93. data/docs/api/Brut/CLI.html +2 -2
  94. data/docs/api/Brut/FactoryBot.html +3 -3
  95. data/docs/api/Brut/Framework/App.html +3 -3
  96. data/docs/api/Brut/Framework/Config.html +27 -15
  97. data/docs/api/Brut/Framework/Container.html +2 -2
  98. data/docs/api/Brut/Framework/Error.html +2 -2
  99. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +2 -2
  100. data/docs/api/Brut/Framework/Errors/Bug.html +2 -2
  101. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +2 -2
  102. data/docs/api/Brut/Framework/Errors/MissingParameter.html +2 -2
  103. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +2 -2
  104. data/docs/api/Brut/Framework/Errors/NotFound.html +2 -2
  105. data/docs/api/Brut/Framework/Errors/NotImplemented.html +2 -2
  106. data/docs/api/Brut/Framework/Errors.html +2 -2
  107. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +2 -2
  108. data/docs/api/Brut/Framework/MCP.html +21 -11
  109. data/docs/api/Brut/Framework/ProjectEnvironment.html +2 -2
  110. data/docs/api/Brut/Framework.html +2 -2
  111. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +2 -2
  112. data/docs/api/Brut/FrontEnd/Component/Helpers.html +2 -2
  113. data/docs/api/Brut/FrontEnd/Component.html +2 -2
  114. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +2 -2
  115. data/docs/api/Brut/FrontEnd/Components/FormTag.html +4 -4
  116. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +2 -2
  117. data/docs/api/Brut/FrontEnd/Components/Input.html +2 -2
  118. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +2 -2
  119. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +2 -2
  120. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +2 -2
  121. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +2 -2
  122. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +2 -2
  123. data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
  124. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +2 -2
  125. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +2 -2
  126. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +2 -2
  127. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +2 -2
  128. data/docs/api/Brut/FrontEnd/Components.html +2 -2
  129. data/docs/api/Brut/FrontEnd/CsrfProtector.html +250 -0
  130. data/docs/api/Brut/FrontEnd/Download.html +2 -2
  131. data/docs/api/Brut/FrontEnd/Flash.html +2 -2
  132. data/docs/api/Brut/FrontEnd/Form.html +6 -6
  133. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +2 -2
  134. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +2 -2
  135. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +2 -2
  136. data/docs/api/Brut/FrontEnd/Forms/Input.html +2 -2
  137. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +2 -2
  138. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +2 -2
  139. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +2 -2
  140. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +2 -2
  141. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +2 -2
  142. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +2 -2
  143. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +2 -2
  144. data/docs/api/Brut/FrontEnd/Forms.html +2 -2
  145. data/docs/api/Brut/FrontEnd/GenericResponse.html +2 -2
  146. data/docs/api/Brut/FrontEnd/Handler.html +2 -2
  147. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +2 -2
  148. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +2 -2
  149. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +2 -2
  150. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +2 -2
  151. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  152. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +2 -2
  153. data/docs/api/Brut/FrontEnd/Handlers.html +2 -2
  154. data/docs/api/Brut/FrontEnd/HandlingResults.html +2 -2
  155. data/docs/api/Brut/FrontEnd/HttpMethod.html +2 -2
  156. data/docs/api/Brut/FrontEnd/HttpStatus.html +2 -2
  157. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +2 -2
  158. data/docs/api/Brut/FrontEnd/Layout.html +2 -2
  159. data/docs/api/Brut/FrontEnd/Middleware.html +2 -2
  160. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +2 -2
  161. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +2 -2
  162. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +2 -2
  163. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +2 -2
  164. data/docs/api/Brut/FrontEnd/Middlewares.html +2 -2
  165. data/docs/api/Brut/FrontEnd/Page.html +2 -2
  166. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  167. data/docs/api/Brut/FrontEnd/Pages.html +2 -2
  168. data/docs/api/Brut/FrontEnd/RequestContext.html +2 -2
  169. data/docs/api/Brut/FrontEnd/RouteHook.html +2 -2
  170. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +2 -2
  171. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +2 -2
  172. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +2 -2
  173. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +2 -2
  174. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +2 -2
  175. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +2 -2
  176. data/docs/api/Brut/FrontEnd/RouteHooks.html +2 -2
  177. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +2 -2
  178. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +2 -2
  179. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +2 -2
  180. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +2 -2
  181. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +2 -2
  182. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +2 -2
  183. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +2 -2
  184. data/docs/api/Brut/FrontEnd/Routing/Route.html +2 -2
  185. data/docs/api/Brut/FrontEnd/Routing.html +2 -2
  186. data/docs/api/Brut/FrontEnd/Session.html +2 -2
  187. data/docs/api/Brut/FrontEnd.html +3 -3
  188. data/docs/api/Brut/I18n/BaseMethods.html +3 -3
  189. data/docs/api/Brut/I18n/ForBackEnd.html +2 -2
  190. data/docs/api/Brut/I18n/ForCLI.html +2 -2
  191. data/docs/api/Brut/I18n/ForHTML.html +2 -2
  192. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +2 -2
  193. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +2 -2
  194. data/docs/api/Brut/I18n.html +2 -2
  195. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +2 -2
  196. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +2 -2
  197. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +2 -2
  198. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +2 -2
  199. data/docs/api/Brut/Instrumentation.html +2 -2
  200. data/docs/api/Brut/RubocopConfig.html +237 -0
  201. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +2 -2
  202. data/docs/api/Brut/SinatraHelpers.html +2 -2
  203. data/docs/api/Brut/SpecSupport/ClockSupport.html +2 -2
  204. data/docs/api/Brut/SpecSupport/ComponentSupport.html +7 -13
  205. data/docs/api/Brut/SpecSupport/E2ETestServer.html +2 -2
  206. data/docs/api/Brut/SpecSupport/E2eSupport.html +2 -2
  207. data/docs/api/Brut/SpecSupport/EnhancedNode.html +2 -2
  208. data/docs/api/Brut/SpecSupport/FlashSupport.html +2 -2
  209. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +2 -2
  210. data/docs/api/Brut/SpecSupport/GeneralSupport.html +2 -2
  211. data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
  212. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +2 -2
  213. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +2 -2
  214. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +2 -2
  215. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +2 -2
  216. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +2 -2
  217. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +2 -2
  218. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +2 -2
  219. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +2 -2
  220. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +2 -2
  221. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +2 -2
  222. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +2 -2
  223. data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
  224. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +2 -2
  225. data/docs/api/Brut/SpecSupport/RSpecSetup.html +4 -4
  226. data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
  227. data/docs/api/Brut/SpecSupport.html +2 -2
  228. data/docs/api/Brut.html +128 -12
  229. data/docs/api/Clock.html +2 -2
  230. data/docs/api/ModuleName.html +28 -28
  231. data/docs/api/RichString.html +22 -22
  232. data/docs/api/SemanticLogger/Appender/Async.html +2 -2
  233. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +2 -2
  234. data/docs/api/Sequel/Extensions/BrutMigrations.html +2 -2
  235. data/docs/api/Sequel/Extensions.html +2 -2
  236. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +2 -2
  237. data/docs/api/Sequel/Plugins/CreatedAt.html +2 -2
  238. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +2 -2
  239. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +2 -2
  240. data/docs/api/Sequel/Plugins/ExternalId.html +2 -2
  241. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +2 -2
  242. data/docs/api/Sequel/Plugins/FindBang.html +2 -2
  243. data/docs/api/Sequel/Plugins.html +2 -2
  244. data/docs/api/Sequel.html +2 -2
  245. data/docs/api/_index.html +16 -2
  246. data/docs/api/class_list.html +1 -1
  247. data/docs/api/file.README.html +28 -2
  248. data/docs/api/index.html +28 -2
  249. data/docs/api/method_list.html +192 -168
  250. data/docs/api/top-level-namespace.html +2 -2
  251. data/docs/assets/{app.DyQLb4Ot.js → app.BuBdZoUg.js} +1 -1
  252. data/docs/assets/basic-form-with-violations.Cv6Y9-Q_.png +0 -0
  253. data/docs/assets/basic-form.DbHnu0oW.png +0 -0
  254. data/docs/assets/chunks/@localSearchIndexroot.BZ_a3X0T.js +1 -0
  255. data/docs/assets/chunks/{VPLocalSearchBox.T1iA-eJx.js → VPLocalSearchBox.UtnyvkX-.js} +1 -1
  256. data/docs/assets/chunks/{theme.ChwsbWjK.js → theme.DqwvuBEK.js} +2 -2
  257. data/docs/assets/{components.md.DHh-NwKs.js → components.md.Bu80E2Nr.js} +3 -3
  258. data/docs/assets/{configuration.md.D8Wz3oJU.js → configuration.md.CuIxVsSf.js} +1 -1
  259. data/docs/assets/{database-schema.md.C5gXexJi.js → database-schema.md.LpmBPVEU.js} +1 -1
  260. data/docs/assets/{forms.md.BRE85eju.js → forms.md.DnLbzVDa.js} +1 -1
  261. data/docs/assets/{getting-started.md.2ioiTe-B.js → getting-started.md.DdQLmU3C.js} +2 -2
  262. data/docs/assets/initial-home-page.DNIaYmgP.png +0 -0
  263. data/docs/assets/new-post-editor.DrHr-5oh.png +0 -0
  264. data/docs/assets/new-post-home-page.Bm34lyMg.png +0 -0
  265. data/docs/assets/{recipes_migrations.md.DPN3gQE3.js → recipes_migrations.md.CTcnWDJF.js} +1 -1
  266. data/docs/assets/styled-form-with-server-side-violations.Bjxd8Dpv.png +0 -0
  267. data/docs/assets/styled-form-with-violations.Bv_sa9tg.png +0 -0
  268. data/docs/assets/styled-home-page-with-posts.Dd4kG89D.png +0 -0
  269. data/docs/assets/styled-home-page.BzdI7dWz.png +0 -0
  270. data/docs/assets/tutorial.md.C4zR5XPG.js +728 -0
  271. data/docs/assets/tutorial.md.C4zR5XPG.lean.js +1 -0
  272. data/docs/assets/welcome-to-brut.VSWzl17-.png +0 -0
  273. data/docs/assets.html +3 -3
  274. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  275. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  276. data/docs/brut-js/api/Autosubmit.html +1 -1
  277. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  278. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  279. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  280. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  281. data/docs/brut-js/api/BufferedLogger.html +1 -1
  282. data/docs/brut-js/api/ConfirmSubmit.html +18 -10
  283. data/docs/brut-js/api/ConfirmSubmit.js.html +29 -8
  284. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  285. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  286. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  287. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  288. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  289. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  290. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  291. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  292. data/docs/brut-js/api/Form.html +1 -1
  293. data/docs/brut-js/api/Form.js.html +1 -1
  294. data/docs/brut-js/api/I18nTranslation.html +1 -1
  295. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  296. data/docs/brut-js/api/LocaleDetection.html +1 -1
  297. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  298. data/docs/brut-js/api/Logger.html +1 -1
  299. data/docs/brut-js/api/Logger.js.html +1 -1
  300. data/docs/brut-js/api/Message.html +1 -1
  301. data/docs/brut-js/api/Message.js.html +1 -1
  302. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  303. data/docs/brut-js/api/RichString.html +1 -1
  304. data/docs/brut-js/api/RichString.js.html +1 -1
  305. data/docs/brut-js/api/Tabs.html +1 -1
  306. data/docs/brut-js/api/Tabs.js.html +1 -1
  307. data/docs/brut-js/api/Tracing.html +1 -1
  308. data/docs/brut-js/api/Tracing.js.html +1 -1
  309. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  310. data/docs/brut-js/api/external-Performance.html +1 -1
  311. data/docs/brut-js/api/external-Promise.html +1 -1
  312. data/docs/brut-js/api/external-ValidityState.html +1 -1
  313. data/docs/brut-js/api/external-Window.html +1 -1
  314. data/docs/brut-js/api/external-fetch.html +1 -1
  315. data/docs/brut-js/api/global.html +1 -1
  316. data/docs/brut-js/api/index.html +1 -1
  317. data/docs/brut-js/api/index.js.html +1 -1
  318. data/docs/brut-js/api/module-testing.html +1 -1
  319. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  320. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  321. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  322. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  323. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  324. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  325. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  326. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  327. data/docs/brut-js/api/testing_index.js.html +1 -1
  328. data/docs/brut-js.html +3 -3
  329. data/docs/business-logic.html +3 -3
  330. data/docs/cli.html +3 -3
  331. data/docs/components.html +7 -7
  332. data/docs/configuration.html +5 -5
  333. data/docs/css.html +3 -3
  334. data/docs/custom-element-tests.html +3 -3
  335. data/docs/database-access.html +3 -3
  336. data/docs/database-schema.html +5 -5
  337. data/docs/deployment.html +3 -3
  338. data/docs/dev-environment.html +3 -3
  339. data/docs/dir-structure.html +3 -3
  340. data/docs/doc-conventions.html +3 -3
  341. data/docs/end-to-end-tests.html +3 -3
  342. data/docs/features.html +3 -3
  343. data/docs/flash-and-session.html +3 -3
  344. data/docs/form-constraints.html +3 -3
  345. data/docs/forms.html +5 -5
  346. data/docs/getting-started.html +6 -6
  347. data/docs/handlers.html +3 -3
  348. data/docs/hashmap.json +1 -1
  349. data/docs/hooks.html +3 -3
  350. data/docs/i18n.html +3 -3
  351. data/docs/index.html +3 -3
  352. data/docs/instrumentation.html +3 -3
  353. data/docs/javascript.html +3 -3
  354. data/docs/jobs.html +3 -3
  355. data/docs/keyword-injection.html +3 -3
  356. data/docs/layouts.html +3 -3
  357. data/docs/lsp.html +3 -3
  358. data/docs/markdown-examples.html +3 -3
  359. data/docs/middleware.html +3 -3
  360. data/docs/overview.html +3 -3
  361. data/docs/pages.html +3 -3
  362. data/docs/recipes/alternate-layouts.html +3 -3
  363. data/docs/recipes/authentication.html +3 -3
  364. data/docs/recipes/blank-layouts.html +3 -3
  365. data/docs/recipes/custom-flash.html +3 -3
  366. data/docs/recipes/indexed-forms.html +3 -3
  367. data/docs/recipes/migrations.html +5 -5
  368. data/docs/recipes/text-field-component.html +3 -3
  369. data/docs/roadmap.html +3 -3
  370. data/docs/routes.html +3 -3
  371. data/docs/security.html +3 -3
  372. data/docs/seed-data.html +3 -3
  373. data/docs/space-time-continuum.html +3 -3
  374. data/docs/tutorial.html +732 -5
  375. data/docs/unit-tests.html +3 -3
  376. data/docs/why.html +3 -3
  377. data/dx/build +45 -9
  378. data/lib/brut/cli/app.rb +1 -1
  379. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
  380. data/lib/brut/cli/apps/scaffold.rb +1 -1
  381. data/lib/brut/cli/options.rb +4 -0
  382. data/lib/brut/factory_bot.rb +1 -1
  383. data/lib/brut/framework/app.rb +1 -1
  384. data/lib/brut/framework/config.rb +18 -12
  385. data/lib/brut/framework/mcp.rb +12 -7
  386. data/lib/brut/front_end/csrf_protector.rb +30 -0
  387. data/lib/brut/front_end/form.rb +4 -4
  388. data/lib/brut/front_end/page.rb +1 -1
  389. data/lib/brut/front_end/routing.rb +1 -1
  390. data/lib/brut/front_end.rb +1 -0
  391. data/lib/brut/i18n/base_methods.rb +1 -1
  392. data/lib/brut/instrumentation/logger_span_exporter.rb +1 -1
  393. data/lib/brut/junk_drawer.rb +3 -1
  394. data/lib/brut/rubocop_config.rb +123 -0
  395. data/lib/brut/spec_support/component_support.rb +0 -3
  396. data/lib/brut/spec_support/rspec_setup.rb +2 -2
  397. data/lib/brut/version.rb +1 -1
  398. data/mkbrut/Gemfile.lock +1 -1
  399. data/mkbrut/dx +1 -0
  400. data/mkbrut/lib/mkbrut/app.rb +1 -1
  401. data/mkbrut/lib/mkbrut/cli.rb +1 -1
  402. data/mkbrut/lib/mkbrut/segments/heroku.rb +1 -1
  403. data/mkbrut/lib/mkbrut/version.rb +1 -1
  404. data/mkbrut/mkbrut.gemspec +3 -1
  405. data/mkbrut/templates/Base/app/config/i18n/en/1_defaults.rb +2 -2
  406. data/mkbrut/templates/Base/app/config/i18n/en/2_app.rb +1 -1
  407. data/mkbrut/templates/Base/bin/setup +1 -1
  408. data/mkbrut/templates/segments/Demo/app/src/front_end/components/flash_component.rb +1 -1
  409. data/specs/brut/junk_drawer.spec.rb +4 -0
  410. metadata +92 -35
  411. data/.rspec +0 -3
  412. data/docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js +0 -1
  413. data/docs/assets/tutorial.md.BIb7XT6j.js +0 -1
  414. data/docs/assets/tutorial.md.BIb7XT6j.lean.js +0 -1
  415. /data/docs/assets/{components.md.DHh-NwKs.lean.js → components.md.Bu80E2Nr.lean.js} +0 -0
  416. /data/docs/assets/{configuration.md.D8Wz3oJU.lean.js → configuration.md.CuIxVsSf.lean.js} +0 -0
  417. /data/docs/assets/{database-schema.md.C5gXexJi.lean.js → database-schema.md.LpmBPVEU.lean.js} +0 -0
  418. /data/docs/assets/{forms.md.BRE85eju.lean.js → forms.md.DnLbzVDa.lean.js} +0 -0
  419. /data/docs/assets/{getting-started.md.2ioiTe-B.lean.js → getting-started.md.DdQLmU3C.lean.js} +0 -0
  420. /data/docs/assets/{recipes_migrations.md.DPN3gQE3.lean.js → recipes_migrations.md.CTcnWDJF.lean.js} +0 -0
@@ -0,0 +1,123 @@
1
+ require "pathname"
2
+ require "yaml"
3
+ # Not here:
4
+ # - prevent use of postfix conditonals entirely
5
+ module Brut
6
+ IM_NOT_CALLING_THEM_COPS = {
7
+ "Gemspec/AddRuntimeDependency" => true,
8
+ "Lint/AmbiguousAssignment" => true,
9
+ "Lint/AmbiguousOperator" => true,
10
+ "Lint/AmbiguousOperatorPrecedence" => true,
11
+ "Lint/AmbiguousRange" => true,
12
+ "Lint/AmbiguousRegexpLiteral" => true,
13
+ "Lint/DuplicateCaseCondition" => true,
14
+ "Lint/DuplicateElsifCondition" => true,
15
+ "Lint/Loop" => true,
16
+ "Lint/RedundantSplatExpansion" => true,
17
+ "Lint/RedundantStringCoercion" => true,
18
+ "Lint/RedundantTypeConversion" => true,
19
+ "Lint/ToJSON" => true,
20
+ "Style/ColonMethodDefinition" => true,
21
+ "Style/DefWithParentheses" => true,
22
+ "Style/InvertibleUnlessCondition" => true,
23
+ "Style/KeywordArgumentsMerging" => true,
24
+ "Style/MethodDefParentheses" => true,
25
+ "Style/MissingRespondToMissing" => true,
26
+ "Style/MultilineTernaryOperator" => true,
27
+ "Style/NegatedUnless" => true,
28
+ "Style/NestedTernaryOperator" => true,
29
+ "Style/PreferredHashMethods" => true,
30
+ "Style/UnlessElse" => true,
31
+ "Style/UnlessLogicalOperators" => true,
32
+ "Layout/DotPosition" => {
33
+ "EnforcedStyle" => "trailing",
34
+ },
35
+ "Lint/AssignmentInCondition" => {
36
+ "AllowSafeAssignment" => "false",
37
+ },
38
+ "Style/ClassMethodsDefinitions" => {
39
+ "EnforcedStyle" => "def_self",
40
+ },
41
+ "Style/CollectionMethods" => {
42
+ "PreferredMethods" => {
43
+ "find" => "detect",
44
+ "collect" => "map",
45
+ "find_all" => "select",
46
+ "member?" => "include?",
47
+ },
48
+ },
49
+ "Style/EndlessMethod" => {
50
+ "EnforcedStyle" => "allow_single_line",
51
+ },
52
+ "Style/For" => {
53
+ "EnforcedStyle" => "each",
54
+ },
55
+ "Style/YodaCondition" => {
56
+ "EnforcedStyle" => "forbid_for_all_comparison_operators",
57
+ },
58
+ "Style/DisableSyntax" => {
59
+ "DisableSyntax" => [
60
+ "unless",
61
+ "and_or_not",
62
+ "until",
63
+ ],
64
+ },
65
+ "Style/TrailingCommaInArrayLiteral" => {
66
+ "EnforcedStyleForMultiline" => "consistent_comma",
67
+ },
68
+ "Style/TrailingCommaInHashLiteral" => {
69
+ "EnforcedStyleForMultiline" => "consistent_comma",
70
+ },
71
+ # Documented, but nonexistent
72
+ #"Style/ItBlockParameter" => {
73
+ # "EnforcedStyle" => "allow_single_line",
74
+ #},
75
+ }
76
+ PREAMBLE = {
77
+ "inherit_mode" => {
78
+ "merge" => [ "Exclude" ],
79
+ },
80
+ "plugins" => [
81
+ "rubocop-disable_syntax",
82
+ ],
83
+ "AllCops" => {
84
+ "DisabledByDefault" => true,
85
+ "TargetRubyVersion" => RUBY_VERSION.split(".")[0..1].join("."),
86
+ "SuggestExtensions" => false,
87
+ "Exclude" => [
88
+ "local-gems/**/*",
89
+ "**/local-gems/**/*",
90
+ "node_modules/**/*",
91
+ "**/node_modules/**/*",
92
+ ],
93
+ },
94
+ }
95
+ class RubocopConfig
96
+ def create_ridiculous_yaml
97
+ if !ARGV[0]
98
+ raise "You must supply the file where the config will be written"
99
+ end
100
+ filename = Pathname(ARGV[0])
101
+ my_big_yaml_hash_of_doom = {}.merge(PREAMBLE)
102
+ IM_NOT_CALLING_THEM_COPS.each do |not_a_cop, config|
103
+ body = case config
104
+ when Hash
105
+ config
106
+ when Array
107
+ config
108
+ when true
109
+ {}
110
+ else
111
+ raise "#{config.class}/#{config} is not handled by this contraption"
112
+ end
113
+ body["Enabled"] = true
114
+ my_big_yaml_hash_of_doom[not_a_cop] = body
115
+ end
116
+ File.open(filename,"w") do |file|
117
+ file.puts "# This file is generated! DO NOT EDIT (not that you'd want to - it's YAML!)"
118
+ file.puts "# The configuration is canonically stored in lib/brut/rubocop_config.rb"
119
+ file.puts my_big_yaml_hash_of_doom.to_yaml
120
+ end
121
+ end
122
+ end
123
+ end
@@ -51,9 +51,6 @@ module Brut::SpecSupport::ComponentSupport
51
51
  # result = generate_and_parse(HeaderComponent.new(title: "Hello!")
52
52
  # expect(result.e!("h1").text).to eq("Hello!")
53
53
  #
54
- # @example Using context
55
- # result = generate_and_parse(TableRow.new([ "one", "two" ]), context: "tbody")
56
- #
57
54
  # @param [Brut::FrontEnd::Component] component the component instance you wish to generate. This should be set up to simulate the test
58
55
  # you are running.
59
56
  # @yield if the component requires or accepts a yielded block, this is how you do that in the test.
@@ -100,10 +100,10 @@ class Brut::SpecSupport::RSpecSetup
100
100
  if needs_request_context
101
101
  session = {
102
102
  "session_id" => "test-session-id",
103
- "csrf" => "test-csrf-token"
103
+ "csrf" => "test-csrf-token",
104
104
  }
105
105
  env = {
106
- "rack.session" => session
106
+ "rack.session" => session,
107
107
  }
108
108
  app_session = Brut.container.session_class.new(rack_session: session)
109
109
  request_context = Brut::FrontEnd::RequestContext.new(
data/lib/brut/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Brut
2
2
  # @!visibility private
3
- VERSION = "0.8.0"
3
+ VERSION = "0.9.1"
4
4
  end
data/mkbrut/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mkbrut (0.8.0)
4
+ mkbrut (0.9.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/mkbrut/dx ADDED
@@ -0,0 +1 @@
1
+ ../dx
@@ -34,7 +34,7 @@ module MKBrut
34
34
  app_options:,
35
35
  current_dir:,
36
36
  templates_dir:,
37
- )
37
+ ),
38
38
  ]
39
39
  if app_options.demo?
40
40
  @segments << MKBrut::Segments::Demo.new(
@@ -100,7 +100,7 @@ module MKBrut
100
100
  options[:app_name] = MKBrut::AppName.new(args.first)
101
101
  options[:app_id] = options[:'app-id']
102
102
  options[:dry_run] = !!options[:'dry-run']
103
- MKBrut::AppOptions.new(**options.merge(versions:))
103
+ MKBrut::AppOptions.new(**options, versions:)
104
104
  end
105
105
 
106
106
  end
@@ -24,7 +24,7 @@ class MKBrut::Segments::Heroku < MKBrut::Base
24
24
  # These are generated by bin/deploy
25
25
  deploy/Dockerfile.*
26
26
  }
27
- )
27
+ ),
28
28
  ]
29
29
  end
30
30
  end
@@ -1,3 +1,3 @@
1
1
  module MKBrut
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -1,5 +1,7 @@
1
1
  lib = File.expand_path("../lib", __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
2
+ if !$LOAD_PATH.include?(lib)
3
+ $LOAD_PATH.unshift(lib)
4
+ end
3
5
  require "mkbrut/version"
4
6
  Gem::Specification.new do |spec|
5
7
  spec.name = "mkbrut"
@@ -114,7 +114,7 @@
114
114
  has_interpolations: "Test %{interp} Test",
115
115
  has_pluralizations: {
116
116
  one: "Once!",
117
- other: "More than once!"
117
+ other: "More than once!",
118
118
  },
119
119
  has_pluralizations_and_zero: {
120
120
  zero: "ZERO",
@@ -123,6 +123,6 @@
123
123
  },
124
124
  simple1: "SIMPLE1",
125
125
  simple2: "SIMPLE2",
126
- }
126
+ },
127
127
  },
128
128
  }
@@ -12,7 +12,7 @@
12
12
  pages: { # Page-specific messages - this key is relied-upon by Brut to exist
13
13
  HomePage: {
14
14
  title: "Welcome!",
15
- }
15
+ },
16
16
  },
17
17
  components: { # Component-specific messages - this key is relied-upon by Brut to exist
18
18
  },
@@ -82,7 +82,7 @@ def setup(update_gems:,update_node:)
82
82
  help
83
83
  end
84
84
 
85
- def setup_dot_env_local()
85
+ def setup_dot_env_local
86
86
 
87
87
  dot_env = ROOT_DIR / ".env.development"
88
88
  if !File.exist?(dot_env)
@@ -12,7 +12,7 @@ class FlashComponent < AppComponent
12
12
  "pa-3",
13
13
  "ba",
14
14
  "br-3",
15
- "tc"
15
+ "tc",
16
16
  ]
17
17
  COLORS = [
18
18
  "%{color}-300",
@@ -38,6 +38,10 @@ RSpec.describe "RichString" do
38
38
  rich_string = RichString.new("Dash--BoardHTMLPage---")
39
39
  expect(rich_string.underscorized.to_s).to eq("dash_board_h_t_m_l_page")
40
40
  end
41
+ it "handles namespaces" do
42
+ rich_string = RichString.new("WebHooks::Stripe")
43
+ expect(rich_string.underscorized.to_s).to eq("web_hooks/stripe")
44
+ end
41
45
  end
42
46
  describe "#camelize" do
43
47
  it "splits on _ and -, captializes each part and joins them" do
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.8.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -262,21 +262,21 @@ dependencies:
262
262
  - !ruby/object:Gem::Version
263
263
  version: '0'
264
264
  - !ruby/object:Gem::Dependency
265
- name: rspec
265
+ name: bundler
266
266
  requirement: !ruby/object:Gem::Requirement
267
267
  requirements:
268
- - - "~>"
268
+ - - ">="
269
269
  - !ruby/object:Gem::Version
270
- version: '3.0'
270
+ version: '0'
271
271
  type: :development
272
272
  prerelease: false
273
273
  version_requirements: !ruby/object:Gem::Requirement
274
274
  requirements:
275
- - - "~>"
275
+ - - ">="
276
276
  - !ruby/object:Gem::Version
277
- version: '3.0'
277
+ version: '0'
278
278
  - !ruby/object:Gem::Dependency
279
- name: bundler
279
+ name: dotenv
280
280
  requirement: !ruby/object:Gem::Requirement
281
281
  requirements:
282
282
  - - ">="
@@ -290,7 +290,7 @@ dependencies:
290
290
  - !ruby/object:Gem::Version
291
291
  version: '0'
292
292
  - !ruby/object:Gem::Dependency
293
- name: rake
293
+ name: factory_bot
294
294
  requirement: !ruby/object:Gem::Requirement
295
295
  requirements:
296
296
  - - ">="
@@ -304,7 +304,21 @@ dependencies:
304
304
  - !ruby/object:Gem::Version
305
305
  version: '0'
306
306
  - !ruby/object:Gem::Dependency
307
- name: yard
307
+ name: faker
308
+ requirement: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - ">="
311
+ - !ruby/object:Gem::Version
312
+ version: '0'
313
+ type: :development
314
+ prerelease: false
315
+ version_requirements: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - ">="
318
+ - !ruby/object:Gem::Version
319
+ version: '0'
320
+ - !ruby/object:Gem::Dependency
321
+ name: rake
308
322
  requirement: !ruby/object:Gem::Requirement
309
323
  requirements:
310
324
  - - ">="
@@ -346,7 +360,7 @@ dependencies:
346
360
  - !ruby/object:Gem::Version
347
361
  version: '0'
348
362
  - !ruby/object:Gem::Dependency
349
- name: dotenv
363
+ name: rubocop
350
364
  requirement: !ruby/object:Gem::Requirement
351
365
  requirements:
352
366
  - - ">="
@@ -360,7 +374,7 @@ dependencies:
360
374
  - !ruby/object:Gem::Version
361
375
  version: '0'
362
376
  - !ruby/object:Gem::Dependency
363
- name: factory_bot
377
+ name: rubocop-disable_syntax
364
378
  requirement: !ruby/object:Gem::Requirement
365
379
  requirements:
366
380
  - - ">="
@@ -374,7 +388,21 @@ dependencies:
374
388
  - !ruby/object:Gem::Version
375
389
  version: '0'
376
390
  - !ruby/object:Gem::Dependency
377
- name: faker
391
+ name: rspec
392
+ requirement: !ruby/object:Gem::Requirement
393
+ requirements:
394
+ - - "~>"
395
+ - !ruby/object:Gem::Version
396
+ version: '3.0'
397
+ type: :development
398
+ prerelease: false
399
+ version_requirements: !ruby/object:Gem::Requirement
400
+ requirements:
401
+ - - "~>"
402
+ - !ruby/object:Gem::Version
403
+ version: '3.0'
404
+ - !ruby/object:Gem::Dependency
405
+ name: yard
378
406
  requirement: !ruby/object:Gem::Requirement
379
407
  requirements:
380
408
  - - ">="
@@ -397,7 +425,6 @@ files:
397
425
  - ".gitignore"
398
426
  - ".nvim.lua"
399
427
  - ".projections.json"
400
- - ".rspec"
401
428
  - CHANGELOG.md
402
429
  - CODE_OF_CONDUCT.txt
403
430
  - Dockerfile.dx
@@ -420,10 +447,13 @@ files:
420
447
  - bin/ci
421
448
  - bin/dev
422
449
  - bin/docs
450
+ - bin/generate-and-run-rubocop
423
451
  - bin/publish
424
452
  - bin/rake
425
453
  - bin/rspec
454
+ - bin/rubocop
426
455
  - bin/setup
456
+ - bin/test
427
457
  - brut-css/.nvim.lua
428
458
  - brut-css/README.md
429
459
  - brut-css/bin/build
@@ -639,6 +669,16 @@ files:
639
669
  - brutrb.com/images/overview.png
640
670
  - brutrb.com/images/spa.dot
641
671
  - brutrb.com/images/spa.png
672
+ - brutrb.com/images/tutorial/basic-form-with-violations.png
673
+ - brutrb.com/images/tutorial/basic-form.png
674
+ - brutrb.com/images/tutorial/initial-home-page.png
675
+ - brutrb.com/images/tutorial/new-post-editor.png
676
+ - brutrb.com/images/tutorial/new-post-home-page.png
677
+ - brutrb.com/images/tutorial/styled-form-with-server-side-violations.png
678
+ - brutrb.com/images/tutorial/styled-form-with-violations.png
679
+ - brutrb.com/images/tutorial/styled-home-page-with-posts.png
680
+ - brutrb.com/images/tutorial/styled-home-page.png
681
+ - brutrb.com/images/tutorial/welcome-to-brut.png
642
682
  - brutrb.com/images/workspace-protocol.dot
643
683
  - brutrb.com/images/workspace-protocol.png
644
684
  - brutrb.com/index.md
@@ -770,6 +810,7 @@ files:
770
810
  - docs/api/Brut/FrontEnd/Components/PageIdentifier.html
771
811
  - docs/api/Brut/FrontEnd/Components/TimeTag.html
772
812
  - docs/api/Brut/FrontEnd/Components/Traceparent.html
813
+ - docs/api/Brut/FrontEnd/CsrfProtector.html
773
814
  - docs/api/Brut/FrontEnd/Download.html
774
815
  - docs/api/Brut/FrontEnd/Flash.html
775
816
  - docs/api/Brut/FrontEnd/Form.html
@@ -839,6 +880,7 @@ files:
839
880
  - docs/api/Brut/Instrumentation/OpenTelemetry.html
840
881
  - docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html
841
882
  - docs/api/Brut/Instrumentation/OpenTelemetry/Span.html
883
+ - docs/api/Brut/RubocopConfig.html
842
884
  - docs/api/Brut/SinatraHelpers.html
843
885
  - docs/api/Brut/SinatraHelpers/ClassMethods.html
844
886
  - docs/api/Brut/SpecSupport.html
@@ -905,31 +947,33 @@ files:
905
947
  - docs/assets/adrs.md.BxjHi9-8.lean.js
906
948
  - docs/assets/ai.md.Cy9GWnER.js
907
949
  - docs/assets/ai.md.Cy9GWnER.lean.js
908
- - docs/assets/app.DyQLb4Ot.js
950
+ - docs/assets/app.BuBdZoUg.js
909
951
  - docs/assets/assets.md.7C3HWkga.js
910
952
  - docs/assets/assets.md.7C3HWkga.lean.js
953
+ - docs/assets/basic-form-with-violations.Cv6Y9-Q_.png
954
+ - docs/assets/basic-form.DbHnu0oW.png
911
955
  - docs/assets/brut-js.md.B4GYxQVw.js
912
956
  - docs/assets/brut-js.md.B4GYxQVw.lean.js
913
957
  - docs/assets/business-logic.md.BY4hGy0m.js
914
958
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
915
- - docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js
916
- - docs/assets/chunks/VPLocalSearchBox.T1iA-eJx.js
959
+ - docs/assets/chunks/@localSearchIndexroot.BZ_a3X0T.js
960
+ - docs/assets/chunks/VPLocalSearchBox.UtnyvkX-.js
917
961
  - docs/assets/chunks/framework.1L-BeKqY.js
918
- - docs/assets/chunks/theme.ChwsbWjK.js
962
+ - docs/assets/chunks/theme.DqwvuBEK.js
919
963
  - docs/assets/cli.md.CjsktgFz.js
920
964
  - docs/assets/cli.md.CjsktgFz.lean.js
921
- - docs/assets/components.md.DHh-NwKs.js
922
- - docs/assets/components.md.DHh-NwKs.lean.js
923
- - docs/assets/configuration.md.D8Wz3oJU.js
924
- - docs/assets/configuration.md.D8Wz3oJU.lean.js
965
+ - docs/assets/components.md.Bu80E2Nr.js
966
+ - docs/assets/components.md.Bu80E2Nr.lean.js
967
+ - docs/assets/configuration.md.CuIxVsSf.js
968
+ - docs/assets/configuration.md.CuIxVsSf.lean.js
925
969
  - docs/assets/css.md.CltvJqAa.js
926
970
  - docs/assets/css.md.CltvJqAa.lean.js
927
971
  - docs/assets/custom-element-tests.md.B_rbta32.js
928
972
  - docs/assets/custom-element-tests.md.B_rbta32.lean.js
929
973
  - docs/assets/database-access.md.gnluu54N.js
930
974
  - docs/assets/database-access.md.gnluu54N.lean.js
931
- - docs/assets/database-schema.md.C5gXexJi.js
932
- - docs/assets/database-schema.md.C5gXexJi.lean.js
975
+ - docs/assets/database-schema.md.LpmBPVEU.js
976
+ - docs/assets/database-schema.md.LpmBPVEU.lean.js
933
977
  - docs/assets/deployment.md.BLseERGV.js
934
978
  - docs/assets/deployment.md.BLseERGV.lean.js
935
979
  - docs/assets/dev-env-protocol.DysDAtnz.png
@@ -947,10 +991,10 @@ files:
947
991
  - docs/assets/flash-and-session.md.nPvUpnUx.lean.js
948
992
  - docs/assets/form-constraints.md.DK5adCgM.js
949
993
  - docs/assets/form-constraints.md.DK5adCgM.lean.js
950
- - docs/assets/forms.md.BRE85eju.js
951
- - docs/assets/forms.md.BRE85eju.lean.js
952
- - docs/assets/getting-started.md.2ioiTe-B.js
953
- - docs/assets/getting-started.md.2ioiTe-B.lean.js
994
+ - docs/assets/forms.md.DnLbzVDa.js
995
+ - docs/assets/forms.md.DnLbzVDa.lean.js
996
+ - docs/assets/getting-started.md.DdQLmU3C.js
997
+ - docs/assets/getting-started.md.DdQLmU3C.lean.js
954
998
  - docs/assets/handlers.md.h84MMB1R.js
955
999
  - docs/assets/handlers.md.h84MMB1R.lean.js
956
1000
  - docs/assets/hooks.md.Jmb5VOLA.js
@@ -959,6 +1003,7 @@ files:
959
1003
  - docs/assets/i18n.md.BAm9t9JJ.lean.js
960
1004
  - docs/assets/index.md.Bn9e0sRJ.js
961
1005
  - docs/assets/index.md.Bn9e0sRJ.lean.js
1006
+ - docs/assets/initial-home-page.DNIaYmgP.png
962
1007
  - docs/assets/instrumentation.md.BgcaGVYH.js
963
1008
  - docs/assets/instrumentation.md.BgcaGVYH.lean.js
964
1009
  - docs/assets/javascript.md.DzrMxUmI.js
@@ -975,6 +1020,8 @@ files:
975
1020
  - docs/assets/markdown-examples.md.CCFEQO44.lean.js
976
1021
  - docs/assets/middleware.md.Czz_UlJN.js
977
1022
  - docs/assets/middleware.md.Czz_UlJN.lean.js
1023
+ - docs/assets/new-post-editor.DrHr-5oh.png
1024
+ - docs/assets/new-post-home-page.Bm34lyMg.png
978
1025
  - docs/assets/overview.md.DlKiRRG_.js
979
1026
  - docs/assets/overview.md.DlKiRRG_.lean.js
980
1027
  - docs/assets/pages.md.B7Hc-i6H.js
@@ -989,8 +1036,8 @@ files:
989
1036
  - docs/assets/recipes_custom-flash.md.CrQbI5eH.lean.js
990
1037
  - docs/assets/recipes_indexed-forms.md.CstYyOSo.js
991
1038
  - docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js
992
- - docs/assets/recipes_migrations.md.DPN3gQE3.js
993
- - docs/assets/recipes_migrations.md.DPN3gQE3.lean.js
1039
+ - docs/assets/recipes_migrations.md.CTcnWDJF.js
1040
+ - docs/assets/recipes_migrations.md.CTcnWDJF.lean.js
994
1041
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.js
995
1042
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js
996
1043
  - docs/assets/roadmap.md.C6PRi0DX.js
@@ -1005,10 +1052,15 @@ files:
1005
1052
  - docs/assets/space-time-continuum.md.xl44xDos.js
1006
1053
  - docs/assets/space-time-continuum.md.xl44xDos.lean.js
1007
1054
  - docs/assets/style.B1z60PPQ.css
1008
- - docs/assets/tutorial.md.BIb7XT6j.js
1009
- - docs/assets/tutorial.md.BIb7XT6j.lean.js
1055
+ - docs/assets/styled-form-with-server-side-violations.Bjxd8Dpv.png
1056
+ - docs/assets/styled-form-with-violations.Bv_sa9tg.png
1057
+ - docs/assets/styled-home-page-with-posts.Dd4kG89D.png
1058
+ - docs/assets/styled-home-page.BzdI7dWz.png
1059
+ - docs/assets/tutorial.md.C4zR5XPG.js
1060
+ - docs/assets/tutorial.md.C4zR5XPG.lean.js
1010
1061
  - docs/assets/unit-tests.md.DUGrnLj5.js
1011
1062
  - docs/assets/unit-tests.md.DUGrnLj5.lean.js
1063
+ - docs/assets/welcome-to-brut.VSWzl17-.png
1012
1064
  - docs/assets/why.md.C-hk5xgJ.js
1013
1065
  - docs/assets/why.md.C-hk5xgJ.lean.js
1014
1066
  - docs/assets/workspace-protocol.C0gXsoDb.png
@@ -1221,6 +1273,7 @@ files:
1221
1273
  - lib/brut/front_end/components/page_identifier.rb
1222
1274
  - lib/brut/front_end/components/time_tag.rb
1223
1275
  - lib/brut/front_end/components/traceparent.rb
1276
+ - lib/brut/front_end/csrf_protector.rb
1224
1277
  - lib/brut/front_end/download.rb
1225
1278
  - lib/brut/front_end/flash.rb
1226
1279
  - lib/brut/front_end/form.rb
@@ -1272,6 +1325,7 @@ files:
1272
1325
  - lib/brut/instrumentation/logger_span_exporter.rb
1273
1326
  - lib/brut/instrumentation/open_telemetry.rb
1274
1327
  - lib/brut/junk_drawer.rb
1328
+ - lib/brut/rubocop_config.rb
1275
1329
  - lib/brut/sinatra_helpers.rb
1276
1330
  - lib/brut/spec_support.rb
1277
1331
  - lib/brut/spec_support/clock_support.rb
@@ -1319,6 +1373,7 @@ files:
1319
1373
  - mkbrut/brut-welcome.png
1320
1374
  - mkbrut/deploy/.dockerignore
1321
1375
  - mkbrut/deploy/Dockerfile
1376
+ - mkbrut/dx
1322
1377
  - mkbrut/exe/mkbrut
1323
1378
  - mkbrut/lib/mkbrut.rb
1324
1379
  - mkbrut/lib/mkbrut/app.rb
@@ -1467,13 +1522,15 @@ files:
1467
1522
  - specs/support.rb
1468
1523
  - specs/support/matchers.rb
1469
1524
  - specs/support/matchers/have_constraint_violation.rb
1470
- homepage: https://naildrivin5.com
1525
+ homepage: https://brutrb.com
1471
1526
  licenses: []
1472
1527
  metadata:
1473
1528
  allowed_push_host: https://rubygems.org
1474
- homepage_uri: https://naildrivin5.com
1475
- source_code_uri: https://naildrivin5.com
1476
- changelog_uri: https://naildrivin5.com
1529
+ homepage_uri: https://brutrb.com
1530
+ source_code_uri: https://github.com/thirdtank/brut
1531
+ changelog_uri: https://github.com/thirdtank/brut/blob/main/CHANGELOG.md
1532
+ documentation_uri: https://brutrb.com/
1533
+ rubygems_mfa_required: 'true'
1477
1534
  rdoc_options: []
1478
1535
  require_paths:
1479
1536
  - lib
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- -I specs
2
- --require spec_helper
3
- -P "specs/**/*.spec.rb"