brut 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Dockerfile.dx +8 -1
  5. data/Gemfile.lock +33 -1
  6. data/bin/ci +9 -5
  7. data/bin/docs +1 -1
  8. data/bin/generate-and-run-rubocop +52 -0
  9. data/bin/rubocop +27 -0
  10. data/bin/setup +46 -0
  11. data/bin/test +18 -0
  12. data/brut-css/bin/publish +1 -1
  13. data/brut-css/package-lock.json +2 -2
  14. data/brut-css/package.json +1 -1
  15. data/brut-js/bin/publish +1 -1
  16. data/brut-js/package-lock.json +2 -2
  17. data/brut-js/package.json +1 -1
  18. data/brut.gemspec +32 -26
  19. data/brutrb.com/.vitepress/config.mjs +3 -0
  20. data/brutrb.com/database-schema.md +1 -1
  21. data/brutrb.com/recipes/migrations.md +1 -1
  22. data/docker-compose.dx.yml +3 -0
  23. data/docs/404.html +2 -2
  24. data/docs/adrs.html +3 -3
  25. data/docs/ai.html +3 -3
  26. data/docs/api/Brut/BackEnd/SeedData.html +2 -2
  27. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +2 -2
  28. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +2 -2
  29. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +2 -2
  30. data/docs/api/Brut/BackEnd/Sidekiq.html +2 -2
  31. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +2 -2
  32. data/docs/api/Brut/BackEnd/Validators.html +2 -2
  33. data/docs/api/Brut/BackEnd.html +2 -2
  34. data/docs/api/Brut/CLI/App.html +2 -2
  35. data/docs/api/Brut/CLI/AppRunner.html +2 -2
  36. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
  37. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
  38. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  39. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
  40. data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
  41. data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
  42. data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
  43. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +2 -2
  44. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +2 -2
  45. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
  46. data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
  47. data/docs/api/Brut/CLI/Apps/DB/Status.html +2 -2
  48. data/docs/api/Brut/CLI/Apps/DB.html +2 -2
  49. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +2 -2
  50. data/docs/api/Brut/CLI/Apps/DeployBase.html +2 -2
  51. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +3 -3
  52. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +2 -2
  53. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +2 -2
  54. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
  55. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
  56. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
  57. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +2 -2
  58. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
  59. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
  60. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +2 -2
  61. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  62. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +2 -2
  63. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +3 -3
  64. data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
  65. data/docs/api/Brut/CLI/Apps/Test/Audit.html +2 -2
  66. data/docs/api/Brut/CLI/Apps/Test/E2e.html +2 -2
  67. data/docs/api/Brut/CLI/Apps/Test/JS.html +2 -2
  68. data/docs/api/Brut/CLI/Apps/Test/Run.html +2 -2
  69. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  70. data/docs/api/Brut/CLI/Apps.html +2 -2
  71. data/docs/api/Brut/CLI/Command.html +2 -2
  72. data/docs/api/Brut/CLI/Error.html +2 -2
  73. data/docs/api/Brut/CLI/ExecutionResults/Result.html +2 -2
  74. data/docs/api/Brut/CLI/ExecutionResults.html +2 -2
  75. data/docs/api/Brut/CLI/Executor.html +2 -2
  76. data/docs/api/Brut/CLI/InvalidOption.html +2 -2
  77. data/docs/api/Brut/CLI/Options.html +80 -2
  78. data/docs/api/Brut/CLI/Output.html +2 -2
  79. data/docs/api/Brut/CLI/SystemExecError.html +2 -2
  80. data/docs/api/Brut/CLI.html +2 -2
  81. data/docs/api/Brut/FactoryBot.html +3 -3
  82. data/docs/api/Brut/Framework/App.html +3 -3
  83. data/docs/api/Brut/Framework/Config.html +25 -3
  84. data/docs/api/Brut/Framework/Container.html +2 -2
  85. data/docs/api/Brut/Framework/Error.html +2 -2
  86. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +2 -2
  87. data/docs/api/Brut/Framework/Errors/Bug.html +2 -2
  88. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +2 -2
  89. data/docs/api/Brut/Framework/Errors/MissingParameter.html +2 -2
  90. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +2 -2
  91. data/docs/api/Brut/Framework/Errors/NotFound.html +2 -2
  92. data/docs/api/Brut/Framework/Errors/NotImplemented.html +2 -2
  93. data/docs/api/Brut/Framework/Errors.html +2 -2
  94. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +2 -2
  95. data/docs/api/Brut/Framework/MCP.html +21 -11
  96. data/docs/api/Brut/Framework/ProjectEnvironment.html +2 -2
  97. data/docs/api/Brut/Framework.html +2 -2
  98. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +2 -2
  99. data/docs/api/Brut/FrontEnd/Component/Helpers.html +2 -2
  100. data/docs/api/Brut/FrontEnd/Component.html +2 -2
  101. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +2 -2
  102. data/docs/api/Brut/FrontEnd/Components/FormTag.html +4 -4
  103. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +2 -2
  104. data/docs/api/Brut/FrontEnd/Components/Input.html +2 -2
  105. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +2 -2
  106. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +2 -2
  107. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +2 -2
  108. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +2 -2
  109. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +2 -2
  110. data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
  111. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +2 -2
  112. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +2 -2
  113. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +2 -2
  114. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +2 -2
  115. data/docs/api/Brut/FrontEnd/Components.html +2 -2
  116. data/docs/api/Brut/FrontEnd/CsrfProtector.html +250 -0
  117. data/docs/api/Brut/FrontEnd/Download.html +2 -2
  118. data/docs/api/Brut/FrontEnd/Flash.html +2 -2
  119. data/docs/api/Brut/FrontEnd/Form.html +6 -6
  120. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +2 -2
  121. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +2 -2
  122. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +2 -2
  123. data/docs/api/Brut/FrontEnd/Forms/Input.html +2 -2
  124. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +2 -2
  125. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +2 -2
  126. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +2 -2
  127. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +2 -2
  128. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +2 -2
  129. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +2 -2
  130. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +2 -2
  131. data/docs/api/Brut/FrontEnd/Forms.html +2 -2
  132. data/docs/api/Brut/FrontEnd/GenericResponse.html +2 -2
  133. data/docs/api/Brut/FrontEnd/Handler.html +2 -2
  134. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +2 -2
  135. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +2 -2
  136. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +2 -2
  137. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +2 -2
  138. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  139. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +2 -2
  140. data/docs/api/Brut/FrontEnd/Handlers.html +2 -2
  141. data/docs/api/Brut/FrontEnd/HandlingResults.html +2 -2
  142. data/docs/api/Brut/FrontEnd/HttpMethod.html +2 -2
  143. data/docs/api/Brut/FrontEnd/HttpStatus.html +2 -2
  144. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +2 -2
  145. data/docs/api/Brut/FrontEnd/Layout.html +2 -2
  146. data/docs/api/Brut/FrontEnd/Middleware.html +2 -2
  147. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +2 -2
  148. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +2 -2
  149. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +2 -2
  150. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +2 -2
  151. data/docs/api/Brut/FrontEnd/Middlewares.html +2 -2
  152. data/docs/api/Brut/FrontEnd/Page.html +2 -2
  153. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  154. data/docs/api/Brut/FrontEnd/Pages.html +2 -2
  155. data/docs/api/Brut/FrontEnd/RequestContext.html +2 -2
  156. data/docs/api/Brut/FrontEnd/RouteHook.html +2 -2
  157. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +2 -2
  158. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +2 -2
  159. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +2 -2
  160. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +2 -2
  161. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +2 -2
  162. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +2 -2
  163. data/docs/api/Brut/FrontEnd/RouteHooks.html +2 -2
  164. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +2 -2
  165. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +2 -2
  166. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +2 -2
  167. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +2 -2
  168. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +2 -2
  169. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +2 -2
  170. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +2 -2
  171. data/docs/api/Brut/FrontEnd/Routing/Route.html +2 -2
  172. data/docs/api/Brut/FrontEnd/Routing.html +2 -2
  173. data/docs/api/Brut/FrontEnd/Session.html +2 -2
  174. data/docs/api/Brut/FrontEnd.html +3 -3
  175. data/docs/api/Brut/I18n/BaseMethods.html +3 -3
  176. data/docs/api/Brut/I18n/ForBackEnd.html +2 -2
  177. data/docs/api/Brut/I18n/ForCLI.html +2 -2
  178. data/docs/api/Brut/I18n/ForHTML.html +2 -2
  179. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +2 -2
  180. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +2 -2
  181. data/docs/api/Brut/I18n.html +2 -2
  182. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +2 -2
  183. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +2 -2
  184. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +2 -2
  185. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +2 -2
  186. data/docs/api/Brut/Instrumentation.html +2 -2
  187. data/docs/api/Brut/RubocopConfig.html +237 -0
  188. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +2 -2
  189. data/docs/api/Brut/SinatraHelpers.html +2 -2
  190. data/docs/api/Brut/SpecSupport/ClockSupport.html +2 -2
  191. data/docs/api/Brut/SpecSupport/ComponentSupport.html +7 -13
  192. data/docs/api/Brut/SpecSupport/E2ETestServer.html +2 -2
  193. data/docs/api/Brut/SpecSupport/E2eSupport.html +2 -2
  194. data/docs/api/Brut/SpecSupport/EnhancedNode.html +2 -2
  195. data/docs/api/Brut/SpecSupport/FlashSupport.html +2 -2
  196. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +2 -2
  197. data/docs/api/Brut/SpecSupport/GeneralSupport.html +2 -2
  198. data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
  199. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +2 -2
  200. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +2 -2
  201. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +2 -2
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +2 -2
  203. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +2 -2
  204. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +2 -2
  205. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +2 -2
  206. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +2 -2
  207. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +2 -2
  208. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +2 -2
  209. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +2 -2
  210. data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
  211. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +2 -2
  212. data/docs/api/Brut/SpecSupport/RSpecSetup.html +4 -4
  213. data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
  214. data/docs/api/Brut/SpecSupport.html +2 -2
  215. data/docs/api/Brut.html +128 -12
  216. data/docs/api/Clock.html +2 -2
  217. data/docs/api/ModuleName.html +28 -28
  218. data/docs/api/RichString.html +22 -22
  219. data/docs/api/SemanticLogger/Appender/Async.html +2 -2
  220. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +2 -2
  221. data/docs/api/Sequel/Extensions/BrutMigrations.html +2 -2
  222. data/docs/api/Sequel/Extensions.html +2 -2
  223. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +2 -2
  224. data/docs/api/Sequel/Plugins/CreatedAt.html +2 -2
  225. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +2 -2
  226. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +2 -2
  227. data/docs/api/Sequel/Plugins/ExternalId.html +2 -2
  228. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +2 -2
  229. data/docs/api/Sequel/Plugins/FindBang.html +2 -2
  230. data/docs/api/Sequel/Plugins.html +2 -2
  231. data/docs/api/Sequel.html +2 -2
  232. data/docs/api/_index.html +16 -2
  233. data/docs/api/class_list.html +1 -1
  234. data/docs/api/file.README.html +28 -2
  235. data/docs/api/index.html +28 -2
  236. data/docs/api/method_list.html +192 -168
  237. data/docs/api/top-level-namespace.html +2 -2
  238. data/docs/assets/{app.DyQLb4Ot.js → app.CmkhEsw7.js} +1 -1
  239. data/docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js +1 -0
  240. data/docs/assets/chunks/{VPLocalSearchBox.T1iA-eJx.js → VPLocalSearchBox.CDh583Oj.js} +1 -1
  241. data/docs/assets/chunks/{theme.ChwsbWjK.js → theme.B0_7GeW8.js} +2 -2
  242. data/docs/assets/{components.md.DHh-NwKs.js → components.md.-22ecBxM.js} +3 -3
  243. data/docs/assets/{configuration.md.D8Wz3oJU.js → configuration.md.CLKL1lFf.js} +1 -1
  244. data/docs/assets/{database-schema.md.C5gXexJi.js → database-schema.md.LpmBPVEU.js} +1 -1
  245. data/docs/assets/{forms.md.BRE85eju.js → forms.md.CBI5--o2.js} +1 -1
  246. data/docs/assets/{getting-started.md.2ioiTe-B.js → getting-started.md.D5nzBZ4J.js} +2 -2
  247. data/docs/assets/{recipes_migrations.md.DPN3gQE3.js → recipes_migrations.md.CTcnWDJF.js} +1 -1
  248. data/docs/assets.html +3 -3
  249. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  250. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  251. data/docs/brut-js/api/Autosubmit.html +1 -1
  252. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  253. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  254. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  255. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  256. data/docs/brut-js/api/BufferedLogger.html +1 -1
  257. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  258. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  259. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  260. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  261. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  262. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  263. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  264. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  265. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  266. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  267. data/docs/brut-js/api/Form.html +1 -1
  268. data/docs/brut-js/api/Form.js.html +1 -1
  269. data/docs/brut-js/api/I18nTranslation.html +1 -1
  270. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  271. data/docs/brut-js/api/LocaleDetection.html +1 -1
  272. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  273. data/docs/brut-js/api/Logger.html +1 -1
  274. data/docs/brut-js/api/Logger.js.html +1 -1
  275. data/docs/brut-js/api/Message.html +1 -1
  276. data/docs/brut-js/api/Message.js.html +1 -1
  277. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  278. data/docs/brut-js/api/RichString.html +1 -1
  279. data/docs/brut-js/api/RichString.js.html +1 -1
  280. data/docs/brut-js/api/Tabs.html +1 -1
  281. data/docs/brut-js/api/Tabs.js.html +1 -1
  282. data/docs/brut-js/api/Tracing.html +1 -1
  283. data/docs/brut-js/api/Tracing.js.html +1 -1
  284. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  285. data/docs/brut-js/api/external-Performance.html +1 -1
  286. data/docs/brut-js/api/external-Promise.html +1 -1
  287. data/docs/brut-js/api/external-ValidityState.html +1 -1
  288. data/docs/brut-js/api/external-Window.html +1 -1
  289. data/docs/brut-js/api/external-fetch.html +1 -1
  290. data/docs/brut-js/api/global.html +1 -1
  291. data/docs/brut-js/api/index.html +1 -1
  292. data/docs/brut-js/api/index.js.html +1 -1
  293. data/docs/brut-js/api/module-testing.html +1 -1
  294. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  295. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  296. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  297. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  298. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  299. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  300. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  301. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  302. data/docs/brut-js/api/testing_index.js.html +1 -1
  303. data/docs/brut-js.html +3 -3
  304. data/docs/business-logic.html +3 -3
  305. data/docs/cli.html +3 -3
  306. data/docs/components.html +7 -7
  307. data/docs/configuration.html +5 -5
  308. data/docs/css.html +3 -3
  309. data/docs/custom-element-tests.html +3 -3
  310. data/docs/database-access.html +3 -3
  311. data/docs/database-schema.html +5 -5
  312. data/docs/deployment.html +3 -3
  313. data/docs/dev-environment.html +3 -3
  314. data/docs/dir-structure.html +3 -3
  315. data/docs/doc-conventions.html +3 -3
  316. data/docs/end-to-end-tests.html +3 -3
  317. data/docs/features.html +3 -3
  318. data/docs/flash-and-session.html +3 -3
  319. data/docs/form-constraints.html +3 -3
  320. data/docs/forms.html +5 -5
  321. data/docs/getting-started.html +6 -6
  322. data/docs/handlers.html +3 -3
  323. data/docs/hashmap.json +1 -1
  324. data/docs/hooks.html +3 -3
  325. data/docs/i18n.html +3 -3
  326. data/docs/index.html +3 -3
  327. data/docs/instrumentation.html +3 -3
  328. data/docs/javascript.html +3 -3
  329. data/docs/jobs.html +3 -3
  330. data/docs/keyword-injection.html +3 -3
  331. data/docs/layouts.html +3 -3
  332. data/docs/lsp.html +3 -3
  333. data/docs/markdown-examples.html +3 -3
  334. data/docs/middleware.html +3 -3
  335. data/docs/overview.html +3 -3
  336. data/docs/pages.html +3 -3
  337. data/docs/recipes/alternate-layouts.html +3 -3
  338. data/docs/recipes/authentication.html +3 -3
  339. data/docs/recipes/blank-layouts.html +3 -3
  340. data/docs/recipes/custom-flash.html +3 -3
  341. data/docs/recipes/indexed-forms.html +3 -3
  342. data/docs/recipes/migrations.html +5 -5
  343. data/docs/recipes/text-field-component.html +3 -3
  344. data/docs/roadmap.html +3 -3
  345. data/docs/routes.html +3 -3
  346. data/docs/security.html +3 -3
  347. data/docs/seed-data.html +3 -3
  348. data/docs/space-time-continuum.html +3 -3
  349. data/docs/tutorial.html +3 -3
  350. data/docs/unit-tests.html +3 -3
  351. data/docs/why.html +3 -3
  352. data/dx/build +45 -9
  353. data/lib/brut/cli/app.rb +1 -1
  354. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
  355. data/lib/brut/cli/apps/scaffold.rb +1 -1
  356. data/lib/brut/cli/options.rb +4 -0
  357. data/lib/brut/factory_bot.rb +1 -1
  358. data/lib/brut/framework/app.rb +1 -1
  359. data/lib/brut/framework/config.rb +11 -0
  360. data/lib/brut/framework/mcp.rb +12 -7
  361. data/lib/brut/front_end/csrf_protector.rb +30 -0
  362. data/lib/brut/front_end/form.rb +4 -4
  363. data/lib/brut/front_end/page.rb +1 -1
  364. data/lib/brut/front_end/routing.rb +1 -1
  365. data/lib/brut/front_end.rb +1 -0
  366. data/lib/brut/i18n/base_methods.rb +1 -1
  367. data/lib/brut/instrumentation/logger_span_exporter.rb +1 -1
  368. data/lib/brut/junk_drawer.rb +3 -1
  369. data/lib/brut/rubocop_config.rb +123 -0
  370. data/lib/brut/spec_support/component_support.rb +0 -3
  371. data/lib/brut/spec_support/rspec_setup.rb +2 -2
  372. data/lib/brut/version.rb +1 -1
  373. data/mkbrut/Gemfile.lock +1 -1
  374. data/mkbrut/dx +1 -0
  375. data/mkbrut/lib/mkbrut/app.rb +1 -1
  376. data/mkbrut/lib/mkbrut/cli.rb +1 -1
  377. data/mkbrut/lib/mkbrut/segments/heroku.rb +1 -1
  378. data/mkbrut/lib/mkbrut/version.rb +1 -1
  379. data/mkbrut/mkbrut.gemspec +3 -1
  380. data/mkbrut/templates/Base/app/config/i18n/en/1_defaults.rb +2 -2
  381. data/mkbrut/templates/Base/app/config/i18n/en/2_app.rb +1 -1
  382. data/mkbrut/templates/Base/bin/setup +1 -1
  383. data/mkbrut/templates/segments/Demo/app/src/front_end/components/flash_component.rb +1 -1
  384. data/specs/brut/junk_drawer.spec.rb +4 -0
  385. metadata +70 -33
  386. data/.rspec +0 -3
  387. data/docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js +0 -1
  388. /data/docs/assets/{components.md.DHh-NwKs.lean.js → components.md.-22ecBxM.lean.js} +0 -0
  389. /data/docs/assets/{configuration.md.D8Wz3oJU.lean.js → configuration.md.CLKL1lFf.lean.js} +0 -0
  390. /data/docs/assets/{database-schema.md.C5gXexJi.lean.js → database-schema.md.LpmBPVEU.lean.js} +0 -0
  391. /data/docs/assets/{forms.md.BRE85eju.lean.js → forms.md.CBI5--o2.lean.js} +0 -0
  392. /data/docs/assets/{getting-started.md.2ioiTe-B.lean.js → getting-started.md.D5nzBZ4J.lean.js} +0 -0
  393. /data/docs/assets/{recipes_migrations.md.DPN3gQE3.lean.js → recipes_migrations.md.CTcnWDJF.lean.js} +0 -0
@@ -0,0 +1,30 @@
1
+ # Base for custom logic around CSRF protection. Brut configures `Rack::Protection::AuthenticityToken` for all requests, and
2
+ # this happens early in the request. The idea is that no real POST should be missing a CSRF token. That said, there are times
3
+ # when it must be skipped, such as for webhooks. In that case, you can extend this class and configure it via
4
+ # `Brut.container.override("csrf_protector", YourCustomCsrfProtector.new)` in your `App` class' initializer.
5
+ #
6
+ # @example
7
+ # class CsrfProtector < Brut::FrontEnd::CsrfProtector
8
+ # def allowed?(env)
9
+ # !!env["PATH_INFO"].to_s.match?(/^\/webhooks\//)
10
+ # end
11
+ # end
12
+ # # Then, in app.rb
13
+ # class App < Brut::Framework::App
14
+ # def id = "some-id"
15
+ # def organization = "some-org"
16
+ #
17
+ # def initialize
18
+ # Brut.container.override("csrf_protector") do
19
+ # CsrfProtector.new
20
+ # end
21
+ #
22
+ # # ...
23
+ #
24
+ class Brut::FrontEnd::CsrfProtector
25
+
26
+ # Return true if the request should be allowed without a CSRF token. This implementation returns false.
27
+ def allowed?(env)
28
+ false
29
+ end
30
+ end
@@ -73,7 +73,7 @@ class Brut::FrontEnd::Form
73
73
  }
74
74
  else
75
75
  [
76
- input_definition.make_input(value:, index: nil)
76
+ input_definition.make_input(value:, index: nil),
77
77
  ]
78
78
  end
79
79
 
@@ -109,7 +109,7 @@ class Brut::FrontEnd::Form
109
109
  # @return [Brut::FrontEnd::Forms::Input]
110
110
  def inputs(input_name)
111
111
  @inputs.fetch(input_name.to_s)
112
- rescue KeyError => ex
112
+ rescue KeyError
113
113
  raise Brut::Framework::Errors::Bug, "Form does not define the input '#{input_name}'. You must add this to your form. Found these inputs: #{@inputs.keys.join(', ')}"
114
114
  end
115
115
 
@@ -164,8 +164,8 @@ class Brut::FrontEnd::Form
164
164
  true
165
165
  end
166
166
  },
167
- index
168
- ]
167
+ index,
168
+ ],
169
169
  ]
170
170
  end
171
171
  }.compact
@@ -86,7 +86,7 @@ private
86
86
  layout_class = Module.const_get(
87
87
  layout_class = RichString.new([
88
88
  self.layout,
89
- "layout"
89
+ "layout",
90
90
  ].join("_")).camelize
91
91
  )
92
92
  Brut.container.instrumentation.add_prefixed_attributes("brut", layout_class: layout_class)
@@ -276,7 +276,7 @@ private
276
276
  }
277
277
  part_names[-1] += suffix
278
278
  begin
279
- part_names.inject(Module) { |mod,path_element|
279
+ part_names.reduce(Module) { |mod,path_element|
280
280
  mod.const_get(path_element,mod == Module)
281
281
  }
282
282
  rescue NameError => ex
@@ -9,6 +9,7 @@ module Brut::FrontEnd
9
9
  autoload(:AssetPathResolver, "brut/front_end/asset_path_resolver")
10
10
  autoload(:Component, "brut/front_end/component")
11
11
  autoload(:Components, "brut/front_end/component")
12
+ autoload(:CsrfProtector, "brut/front_end/csrf_protector")
12
13
  autoload(:Download, "brut/front_end/download")
13
14
  autoload(:Flash, "brut/front_end/flash")
14
15
  autoload(:Form, "brut/front_end/form")
@@ -211,7 +211,7 @@ module Brut::I18n::BaseMethods
211
211
  block_contents = safe(capture(&block))
212
212
  interpolated_values[:block] = block_contents
213
213
  end
214
- t_direct(keys_to_check,**interpolated_values.merge(key_given: key))
214
+ t_direct(keys_to_check,**interpolated_values, key_given: key)
215
215
  rescue I18n::MissingInterpolationArgument => ex
216
216
  if ex.key.to_s == "block"
217
217
  raise ArgumentError,"One of the keys #{key.join(", ")} contained a %{block} interpolation value: '#{ex.string}'. This means you must yield a block to `t`"
@@ -58,7 +58,7 @@ private
58
58
  (span.events || []).each do |event|
59
59
  event_message = (" " * (indent + 2)) + "event:#{event.name}"
60
60
  event_params = {
61
- timing: ((event.timestamp - previous_timestamp)/1_000.0).to_i/1_000.0
61
+ timing: ((event.timestamp - previous_timestamp)/1_000.0).to_i/1_000.0,
62
62
  }.merge(event.attributes).merge(synthetic_attributes)
63
63
  SemanticLogger[self.class].info(event_message,event_params)
64
64
  previous_timestamp = event.timestamp
@@ -96,7 +96,9 @@ class RichString
96
96
  }.
97
97
  join.gsub("-","_").
98
98
  gsub(/[_]+/,"_").
99
- gsub(/^_+/,"").
99
+ split(/::/).
100
+ map { |it| it.gsub(/^_+/,"") }.
101
+ join("/").
100
102
  gsub(/_+$/,"")
101
103
  )
102
104
  end
@@ -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.0"
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.0)
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.0"
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.0
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
@@ -770,6 +800,7 @@ files:
770
800
  - docs/api/Brut/FrontEnd/Components/PageIdentifier.html
771
801
  - docs/api/Brut/FrontEnd/Components/TimeTag.html
772
802
  - docs/api/Brut/FrontEnd/Components/Traceparent.html
803
+ - docs/api/Brut/FrontEnd/CsrfProtector.html
773
804
  - docs/api/Brut/FrontEnd/Download.html
774
805
  - docs/api/Brut/FrontEnd/Flash.html
775
806
  - docs/api/Brut/FrontEnd/Form.html
@@ -839,6 +870,7 @@ files:
839
870
  - docs/api/Brut/Instrumentation/OpenTelemetry.html
840
871
  - docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html
841
872
  - docs/api/Brut/Instrumentation/OpenTelemetry/Span.html
873
+ - docs/api/Brut/RubocopConfig.html
842
874
  - docs/api/Brut/SinatraHelpers.html
843
875
  - docs/api/Brut/SinatraHelpers/ClassMethods.html
844
876
  - docs/api/Brut/SpecSupport.html
@@ -905,31 +937,31 @@ files:
905
937
  - docs/assets/adrs.md.BxjHi9-8.lean.js
906
938
  - docs/assets/ai.md.Cy9GWnER.js
907
939
  - docs/assets/ai.md.Cy9GWnER.lean.js
908
- - docs/assets/app.DyQLb4Ot.js
940
+ - docs/assets/app.CmkhEsw7.js
909
941
  - docs/assets/assets.md.7C3HWkga.js
910
942
  - docs/assets/assets.md.7C3HWkga.lean.js
911
943
  - docs/assets/brut-js.md.B4GYxQVw.js
912
944
  - docs/assets/brut-js.md.B4GYxQVw.lean.js
913
945
  - docs/assets/business-logic.md.BY4hGy0m.js
914
946
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
915
- - docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js
916
- - docs/assets/chunks/VPLocalSearchBox.T1iA-eJx.js
947
+ - docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js
948
+ - docs/assets/chunks/VPLocalSearchBox.CDh583Oj.js
917
949
  - docs/assets/chunks/framework.1L-BeKqY.js
918
- - docs/assets/chunks/theme.ChwsbWjK.js
950
+ - docs/assets/chunks/theme.B0_7GeW8.js
919
951
  - docs/assets/cli.md.CjsktgFz.js
920
952
  - 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
953
+ - docs/assets/components.md.-22ecBxM.js
954
+ - docs/assets/components.md.-22ecBxM.lean.js
955
+ - docs/assets/configuration.md.CLKL1lFf.js
956
+ - docs/assets/configuration.md.CLKL1lFf.lean.js
925
957
  - docs/assets/css.md.CltvJqAa.js
926
958
  - docs/assets/css.md.CltvJqAa.lean.js
927
959
  - docs/assets/custom-element-tests.md.B_rbta32.js
928
960
  - docs/assets/custom-element-tests.md.B_rbta32.lean.js
929
961
  - docs/assets/database-access.md.gnluu54N.js
930
962
  - 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
963
+ - docs/assets/database-schema.md.LpmBPVEU.js
964
+ - docs/assets/database-schema.md.LpmBPVEU.lean.js
933
965
  - docs/assets/deployment.md.BLseERGV.js
934
966
  - docs/assets/deployment.md.BLseERGV.lean.js
935
967
  - docs/assets/dev-env-protocol.DysDAtnz.png
@@ -947,10 +979,10 @@ files:
947
979
  - docs/assets/flash-and-session.md.nPvUpnUx.lean.js
948
980
  - docs/assets/form-constraints.md.DK5adCgM.js
949
981
  - 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
982
+ - docs/assets/forms.md.CBI5--o2.js
983
+ - docs/assets/forms.md.CBI5--o2.lean.js
984
+ - docs/assets/getting-started.md.D5nzBZ4J.js
985
+ - docs/assets/getting-started.md.D5nzBZ4J.lean.js
954
986
  - docs/assets/handlers.md.h84MMB1R.js
955
987
  - docs/assets/handlers.md.h84MMB1R.lean.js
956
988
  - docs/assets/hooks.md.Jmb5VOLA.js
@@ -989,8 +1021,8 @@ files:
989
1021
  - docs/assets/recipes_custom-flash.md.CrQbI5eH.lean.js
990
1022
  - docs/assets/recipes_indexed-forms.md.CstYyOSo.js
991
1023
  - 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
1024
+ - docs/assets/recipes_migrations.md.CTcnWDJF.js
1025
+ - docs/assets/recipes_migrations.md.CTcnWDJF.lean.js
994
1026
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.js
995
1027
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js
996
1028
  - docs/assets/roadmap.md.C6PRi0DX.js
@@ -1221,6 +1253,7 @@ files:
1221
1253
  - lib/brut/front_end/components/page_identifier.rb
1222
1254
  - lib/brut/front_end/components/time_tag.rb
1223
1255
  - lib/brut/front_end/components/traceparent.rb
1256
+ - lib/brut/front_end/csrf_protector.rb
1224
1257
  - lib/brut/front_end/download.rb
1225
1258
  - lib/brut/front_end/flash.rb
1226
1259
  - lib/brut/front_end/form.rb
@@ -1272,6 +1305,7 @@ files:
1272
1305
  - lib/brut/instrumentation/logger_span_exporter.rb
1273
1306
  - lib/brut/instrumentation/open_telemetry.rb
1274
1307
  - lib/brut/junk_drawer.rb
1308
+ - lib/brut/rubocop_config.rb
1275
1309
  - lib/brut/sinatra_helpers.rb
1276
1310
  - lib/brut/spec_support.rb
1277
1311
  - lib/brut/spec_support/clock_support.rb
@@ -1319,6 +1353,7 @@ files:
1319
1353
  - mkbrut/brut-welcome.png
1320
1354
  - mkbrut/deploy/.dockerignore
1321
1355
  - mkbrut/deploy/Dockerfile
1356
+ - mkbrut/dx
1322
1357
  - mkbrut/exe/mkbrut
1323
1358
  - mkbrut/lib/mkbrut.rb
1324
1359
  - mkbrut/lib/mkbrut/app.rb
@@ -1467,13 +1502,15 @@ files:
1467
1502
  - specs/support.rb
1468
1503
  - specs/support/matchers.rb
1469
1504
  - specs/support/matchers/have_constraint_violation.rb
1470
- homepage: https://naildrivin5.com
1505
+ homepage: https://brutrb.com
1471
1506
  licenses: []
1472
1507
  metadata:
1473
1508
  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
1509
+ homepage_uri: https://brutrb.com
1510
+ source_code_uri: https://github.com/thirdtank/brut
1511
+ changelog_uri: https://github.com/thirdtank/brut/blob/main/CHANGELOG.md
1512
+ documentation_uri: https://brutrb.com/
1513
+ rubygems_mfa_required: 'true'
1477
1514
  rdoc_options: []
1478
1515
  require_paths:
1479
1516
  - lib
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- -I specs
2
- --require spec_helper
3
- -P "specs/**/*.spec.rb"