brut 0.1.0 → 0.2.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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile.lock +1 -1
  4. data/brutrb.com/.vitepress/config.mjs +4 -2
  5. data/brutrb.com/.vitepress/theme/style.css +16 -38
  6. data/brutrb.com/adrs.md +15 -0
  7. data/brutrb.com/dev-environment.md +6 -1
  8. data/brutrb.com/doc-conventions.md +1 -2
  9. data/brutrb.com/images/DevEnvironment.graffle +0 -0
  10. data/brutrb.com/images/DevEnvironment.png +0 -0
  11. data/brutrb.com/index.md +0 -3
  12. data/brutrb.com/overview.md +2 -2
  13. data/brutrb.com/roadmap.md +57 -0
  14. data/brutrb.com/tutorial.md +5 -1
  15. data/docs/404.html +4 -4
  16. data/docs/{not-released.html → adrs.html} +8 -8
  17. data/docs/ai.html +6 -6
  18. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  19. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  20. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  21. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  22. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  23. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  24. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  25. data/docs/api/Brut/BackEnd.html +1 -1
  26. data/docs/api/Brut/CLI/App.html +1 -1
  27. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  28. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  29. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  40. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  47. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +3 -3
  48. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  50. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  52. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  53. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  54. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  55. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  58. data/docs/api/Brut/CLI/Apps/Test/JS.html +6 -6
  59. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  60. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  61. data/docs/api/Brut/CLI/Apps.html +1 -1
  62. data/docs/api/Brut/CLI/Command.html +3 -3
  63. data/docs/api/Brut/CLI/Error.html +1 -1
  64. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  65. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  66. data/docs/api/Brut/CLI/Executor.html +1 -1
  67. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  68. data/docs/api/Brut/CLI/Options.html +1 -1
  69. data/docs/api/Brut/CLI/Output.html +1 -1
  70. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  71. data/docs/api/Brut/CLI.html +1 -1
  72. data/docs/api/Brut/FactoryBot.html +1 -1
  73. data/docs/api/Brut/Framework/App.html +1 -1
  74. data/docs/api/Brut/Framework/Config.html +1 -1
  75. data/docs/api/Brut/Framework/Container.html +1 -1
  76. data/docs/api/Brut/Framework/Error.html +1 -1
  77. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  78. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  79. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  80. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  81. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  82. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  83. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  84. data/docs/api/Brut/Framework/Errors.html +1 -1
  85. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  86. data/docs/api/Brut/Framework/MCP.html +1 -1
  87. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  88. data/docs/api/Brut/Framework.html +1 -1
  89. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  90. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  91. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  92. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  93. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  99. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +3 -3
  100. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Form.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  122. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  130. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  131. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  132. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  133. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  134. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  135. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  136. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  143. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  144. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  145. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  146. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  147. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  153. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  154. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  155. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  156. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  163. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  164. data/docs/api/Brut/FrontEnd.html +1 -1
  165. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  166. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  167. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  168. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  169. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  170. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  171. data/docs/api/Brut/I18n.html +1 -1
  172. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  173. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  174. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  175. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  176. data/docs/api/Brut/Instrumentation.html +1 -1
  177. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  178. data/docs/api/Brut/SinatraHelpers.html +1 -1
  179. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  180. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  181. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  182. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  183. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  184. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  185. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  186. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  188. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  189. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  190. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  191. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  192. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  193. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  199. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  200. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  201. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  202. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  203. data/docs/api/Brut/SpecSupport.html +1 -1
  204. data/docs/api/Brut.html +1 -1
  205. data/docs/api/Clock.html +1 -1
  206. data/docs/api/RichString.html +150 -343
  207. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  208. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  209. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  210. data/docs/api/Sequel/Extensions.html +1 -1
  211. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  212. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  213. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  214. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  215. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  216. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  217. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  218. data/docs/api/Sequel/Plugins.html +1 -1
  219. data/docs/api/Sequel.html +1 -1
  220. data/docs/api/_index.html +5 -5
  221. data/docs/api/class_list.html +1 -1
  222. data/docs/api/file.README.html +1 -1
  223. data/docs/api/index.html +1 -1
  224. data/docs/api/method_list.html +281 -313
  225. data/docs/api/top-level-namespace.html +1 -1
  226. data/docs/assets/DevEnvironment.DaFcVfwP.png +0 -0
  227. data/docs/assets/adrs.md.JRxZ5uYE.js +1 -0
  228. data/docs/assets/adrs.md.JRxZ5uYE.lean.js +1 -0
  229. data/docs/assets/{app.ClaS47Ru.js → app.Dm3x-DQc.js} +1 -1
  230. data/docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js +1 -0
  231. data/docs/assets/chunks/{VPLocalSearchBox.DtgDfde2.js → VPLocalSearchBox.DL6bnqee.js} +1 -1
  232. data/docs/assets/chunks/{theme.B45bvibT.js → theme.BXdlf6e8.js} +2 -2
  233. data/docs/assets/{components.md.DatoNgFo.js → components.md.Pg_Lo35G.js} +3 -3
  234. data/docs/assets/{configuration.md.DeyhpqEx.js → configuration.md.BfeGnEci.js} +1 -1
  235. data/docs/assets/dev-environment.md.Dy6EldaM.js +16 -0
  236. data/docs/assets/dev-environment.md.Dy6EldaM.lean.js +1 -0
  237. data/docs/assets/doc-conventions.md.DOkAuXlt.js +1 -0
  238. data/docs/assets/{forms.md.C2Dizvzq.js → forms.md.BQZlCwvi.js} +1 -1
  239. data/docs/assets/{getting-started.md.C93e0odB.js → getting-started.md.BcXnNuD6.js} +2 -2
  240. data/docs/assets/index.md.Bn9e0sRJ.js +1 -0
  241. data/docs/assets/index.md.Bn9e0sRJ.lean.js +1 -0
  242. data/docs/assets/{overview.md.Bdq4qt3L.js → overview.md.iMnwLO4x.js} +1 -1
  243. data/docs/assets/roadmap.md.C6PRi0DX.js +1 -0
  244. data/docs/assets/roadmap.md.C6PRi0DX.lean.js +1 -0
  245. data/docs/assets/{style.prAgp4yQ.css → style.B1z60PPQ.css} +1 -1
  246. data/docs/assets/tutorial.md.BYXj4cOu.js +1 -0
  247. data/docs/assets/tutorial.md.BYXj4cOu.lean.js +1 -0
  248. data/docs/assets.html +6 -6
  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 +6 -6
  304. data/docs/business-logic.html +6 -6
  305. data/docs/cli.html +6 -6
  306. data/docs/components.html +10 -10
  307. data/docs/configuration.html +7 -7
  308. data/docs/css.html +6 -6
  309. data/docs/custom-element-tests.html +6 -6
  310. data/docs/database-access.html +6 -6
  311. data/docs/database-schema.html +6 -6
  312. data/docs/deployment.html +6 -6
  313. data/docs/dev-environment.html +12 -7
  314. data/docs/dir-structure.html +6 -6
  315. data/docs/doc-conventions.html +7 -7
  316. data/docs/end-to-end-tests.html +6 -6
  317. data/docs/features.html +6 -6
  318. data/docs/flash-and-session.html +6 -6
  319. data/docs/form-constraints.html +6 -6
  320. data/docs/forms.html +8 -8
  321. data/docs/getting-started.html +9 -9
  322. data/docs/handlers.html +6 -6
  323. data/docs/hashmap.json +1 -1
  324. data/docs/hooks.html +6 -6
  325. data/docs/i18n.html +6 -6
  326. data/docs/index.html +7 -7
  327. data/docs/instrumentation.html +6 -6
  328. data/docs/javascript.html +6 -6
  329. data/docs/jobs.html +6 -6
  330. data/docs/keyword-injection.html +6 -6
  331. data/docs/layouts.html +6 -6
  332. data/docs/lsp.html +6 -6
  333. data/docs/markdown-examples.html +6 -6
  334. data/docs/middleware.html +6 -6
  335. data/docs/overview.html +7 -7
  336. data/docs/pages.html +6 -6
  337. data/docs/recipes/alternate-layouts.html +6 -6
  338. data/docs/recipes/authentication.html +6 -6
  339. data/docs/recipes/blank-layouts.html +6 -6
  340. data/docs/recipes/custom-flash.html +6 -6
  341. data/docs/recipes/indexed-forms.html +6 -6
  342. data/docs/recipes/text-field-component.html +6 -6
  343. data/docs/roadmap.html +29 -0
  344. data/docs/routes.html +6 -6
  345. data/docs/security.html +6 -6
  346. data/docs/seed-data.html +6 -6
  347. data/docs/space-time-continuum.html +6 -6
  348. data/docs/tutorial.html +7 -7
  349. data/docs/unit-tests.html +6 -6
  350. data/docs/why.html +6 -6
  351. data/lib/brut/cli/apps/test.rb +1 -1
  352. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +2 -2
  353. data/lib/brut/junk_drawer.rb +48 -9
  354. data/lib/brut/version.rb +1 -1
  355. data/specs/brut/junk_drawer.spec.rb +75 -0
  356. metadata +37 -31
  357. data/brutrb.com/images/logo-300.png +0 -0
  358. data/brutrb.com/images/logo.png +0 -0
  359. data/brutrb.com/not-released.md +0 -5
  360. data/docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js +0 -1
  361. data/docs/assets/dev-env-overview.Gj7NWM8-.png +0 -0
  362. data/docs/assets/dev-environment.md.BroAOLhF.js +0 -11
  363. data/docs/assets/dev-environment.md.BroAOLhF.lean.js +0 -1
  364. data/docs/assets/doc-conventions.md.BzmSrTEW.js +0 -1
  365. data/docs/assets/index.md.CAMqGBJE.js +0 -1
  366. data/docs/assets/index.md.CAMqGBJE.lean.js +0 -1
  367. data/docs/assets/not-released.md.BBy28McC.js +0 -1
  368. data/docs/assets/not-released.md.BBy28McC.lean.js +0 -1
  369. data/docs/assets/tutorial.md.a4a0eVOy.js +0 -1
  370. data/docs/assets/tutorial.md.a4a0eVOy.lean.js +0 -1
  371. /data/docs/assets/{components.md.DatoNgFo.lean.js → components.md.Pg_Lo35G.lean.js} +0 -0
  372. /data/docs/assets/{configuration.md.DeyhpqEx.lean.js → configuration.md.BfeGnEci.lean.js} +0 -0
  373. /data/docs/assets/{doc-conventions.md.BzmSrTEW.lean.js → doc-conventions.md.DOkAuXlt.lean.js} +0 -0
  374. /data/docs/assets/{forms.md.C2Dizvzq.lean.js → forms.md.BQZlCwvi.lean.js} +0 -0
  375. /data/docs/assets/{getting-started.md.C93e0odB.lean.js → getting-started.md.BcXnNuD6.lean.js} +0 -0
  376. /data/docs/assets/{overview.md.Bdq4qt3L.lean.js → overview.md.iMnwLO4x.lean.js} +0 -0
@@ -63,7 +63,7 @@ class Brut::FrontEnd::Components::Inputs::SelectTagWithOptions < Brut::FrontEnd:
63
63
  @html_attributes = default_html_attributes.merge(html_attributes)
64
64
  @html_attributes[:name] = name
65
65
 
66
- if input_value.nil?
66
+ if input_value.nil? || input_value.to_s.strip == ""
67
67
  @selected_value = nil # explicitly nothing is selected
68
68
  else
69
69
  if input_value.kind_of?(Array)
@@ -73,7 +73,7 @@ class Brut::FrontEnd::Components::Inputs::SelectTagWithOptions < Brut::FrontEnd:
73
73
  input_value == option.send(@value_attribute)
74
74
  }
75
75
  if option.nil?
76
- raise ArgumentError, "selected_value #{input_value} was not the value for #{value_attribute} on any of the options: #{options.map { |option| option.send(value_attribute) }.join(', ')}"
76
+ raise ArgumentError, "selected_value #{input_value}/#{input_value.class} was not the value for #{value_attribute} on any of the options: #{options.map { |option| option.send(value_attribute) }.join(', ')}"
77
77
  end
78
78
  @selected_value = option.send(@value_attribute)
79
79
  end
@@ -51,29 +51,64 @@ class Clock
51
51
  end
52
52
 
53
53
  # A wrapper around a string to avoid adding a ton of methods to `String`.
54
+ #
55
+ # This may not survive to 1.0 - use at your own risk.
54
56
  class RichString
57
+ # Create a RichString, return `nil` instead for blank strings or nil
58
+ # @param [String|nil] string the string to convert.
59
+ # @param [true|false] blank_is_nil if true, a blank string or nil is considered
60
+ # nil and nil is returned.
61
+ # @return [RichString|nil] a RichString containing the string or nil if the
62
+ # string is blank or nil, accounting for `blank_is_nil:`
55
63
  def self.from_string(string,blank_is_nil:true)
64
+ if string.nil?
65
+ return nil
66
+ end
56
67
  if string.to_s.strip == "" && blank_is_nil
57
68
  return nil
58
69
  end
59
70
  self.new(string)
60
71
  end
72
+
73
+ # Create a RichString. This calls `to_s` on its argument.
74
+ #
75
+ # @param [String|Object] string the string to wrap. `to_s` is called, so be sure
76
+ # that's what you want.
61
77
  def initialize(string)
62
78
  @string = string.to_s
63
79
  end
64
80
 
81
+ # Return a snake_case version of the string. This will convert dashes to
82
+ # underscores, and use A-Z to know where to insert underscores. Repeated
83
+ # underscores are coalesced into one, and there will be no leading or trailing
84
+ # underscores in the string.
85
+ # @visibility private
65
86
  def underscorized
66
- return self unless /[A-Z-]|::/.match?(@string)
67
- word = @string.gsub("::", "/")
68
- word.gsub!(/(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-z\d])(?=[A-Z])/, "_")
69
- word.tr!("-", "_")
70
- word.downcase!
71
- RichString.new(word)
87
+ RichString.new(
88
+ self.to_s.split(/([A-Z])/).
89
+ select { it.length > 0 }.
90
+ map { |part|
91
+ if part == part.upcase
92
+ "_#{part.downcase}"
93
+ else
94
+ part
95
+ end
96
+ }.
97
+ join.gsub("-","_").
98
+ gsub(/[_]+/,"_").
99
+ gsub(/^_+/,"").
100
+ gsub(/_+$/,"")
101
+ )
72
102
  end
73
103
 
104
+ # Turn a string into CamelCase by captializing any
105
+ # letter that is preceded by an underscore or dash.
106
+ # @visibility private
74
107
  def camelize
75
- @string.to_s.split(/[_-]/).map { |part|
76
- RichString.new(part).capitalize(:first_only).to_s
108
+ @string.to_s.split(/[_-]/).select {
109
+ it.strip.length > 0
110
+ }.map {
111
+ RichString.new(it).capitalize(:first_only).to_s
77
112
  }.join("")
78
113
  end
79
114
 
@@ -85,6 +120,7 @@ class RichString
85
120
  #
86
121
  # @param [Array] options options suitable for Ruby's built-in `String#capitalize` method
87
122
  # @return [RichString] a new string where the wrapped string has been capitalized
123
+ # @visibility private
88
124
  def capitalize(*options)
89
125
  if options.include?(:first_only)
90
126
  options.delete(:first_only)
@@ -94,6 +130,9 @@ class RichString
94
130
  end
95
131
  end
96
132
 
133
+ # Takes a snake_case_or-kebab-case-string and returns it with the underscores
134
+ # and dashes replaced with spaces.
135
+ # @visibility private
97
136
  def humanized
98
137
  RichString.new(@string.tr("_-"," "))
99
138
  end
@@ -102,7 +141,7 @@ class RichString
102
141
  def to_str = self.to_s
103
142
  def length = to_s.length
104
143
 
105
- def to_s_or_nil = @string.empty? ? nil : self.to_s
144
+ def to_s_or_nil = @string.to_s.strip.empty? ? nil : self.to_s
106
145
 
107
146
  def ==(other)
108
147
  if other.kind_of?(RichString)
data/lib/brut/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Brut
2
2
  # @!visibility private
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.1"
4
4
  end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "RichString" do
4
+ describe ".from_string" do
5
+ context "nil" do
6
+ it "returns nil when blank_is_nil is true" do
7
+ expect(RichString.from_string(nil)).to eq(nil)
8
+ end
9
+ it "returns nil when blank_is_nil is false" do
10
+ expect(RichString.from_string(nil, blank_is_nil: false)).to eq(nil)
11
+ end
12
+ end
13
+ context "empty string" do
14
+ it "returns nil when blank_is_nil is true" do
15
+ expect(RichString.from_string(" ")).to eq(nil)
16
+ end
17
+ it "returns the string when blank_is_nil is false" do
18
+ expect(RichString.from_string(" ", blank_is_nil: false)).to eq(" ")
19
+ end
20
+ end
21
+ context "non-empty string" do
22
+ it "returns a RichString containing the string" do
23
+ rich_string = RichString.from_string(" foo ")
24
+ expect(rich_string.to_str).to eq(" foo ")
25
+ end
26
+ end
27
+ end
28
+ describe "#underscorized" do
29
+ it "returns self if there's nothing to convert" do
30
+ rich_string = RichString.new("alreadydone")
31
+ expect(rich_string.underscorized).to eq(rich_string)
32
+ end
33
+ it "splits up CamelCase, turns - into _ and downcases everything" do
34
+ rich_string = RichString.new("DashBoardPage")
35
+ expect(rich_string.underscorized.to_s).to eq("dash_board_page")
36
+ end
37
+ it "handles weird situations" do
38
+ rich_string = RichString.new("Dash--BoardHTMLPage---")
39
+ expect(rich_string.underscorized.to_s).to eq("dash_board_h_t_m_l_page")
40
+ end
41
+ end
42
+ describe "#camelize" do
43
+ it "splits on _ and -, captializes each part and joins them" do
44
+ expect(RichString.new("a-normal-base-case").camelize).to eq("ANormalBaseCase")
45
+ expect(RichString.new("an__odd-_-----_one").camelize).to eq("AnOddOne")
46
+ expect(RichString.new("Somewhat-Close").camelize).to eq("SomewhatClose")
47
+ expect(RichString.new("AlreadyDone").camelize).to eq("AlreadyDone")
48
+ end
49
+ end
50
+ describe "#capitalize" do
51
+ context "first_only" do
52
+ it "capitalizes the first letter, but does not affect the case of remaining letters" do
53
+ expect(RichString.new("this is a String").capitalize(:first_only).to_s).to eq("This is a String")
54
+ end
55
+ end
56
+ context "no first_only" do
57
+ it "behaves as Ruby's stdlib does, which is to capitalize the first letter and downcase the rest" do
58
+ expect(RichString.new("this is a String").capitalize.to_s).to eq("This is a string")
59
+ end
60
+ end
61
+ end
62
+ describe "#humanized" do
63
+ it "replaces - and _ with spaces" do
64
+ expect(RichString.new("this-is-a-string").humanized).to eq("this is a string")
65
+ end
66
+ end
67
+ describe "#to_s_or_nil" do
68
+ it "returns nil if the string is empty" do
69
+ expect(RichString.new(" ").to_s_or_nil).to eq(nil)
70
+ end
71
+ it "returns the string if the string is not empty" do
72
+ expect(RichString.new(" foo ").to_s_or_nil).to eq(" foo ")
73
+ end
74
+ end
75
+ end
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.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -398,6 +398,7 @@ files:
398
398
  - ".nvim.lua"
399
399
  - ".projections.json"
400
400
  - ".rspec"
401
+ - CHANGELOG.md
401
402
  - CODE_OF_CONDUCT.txt
402
403
  - Dockerfile.dx
403
404
  - Gemfile
@@ -581,6 +582,7 @@ files:
581
582
  - brutrb.com/.vitepress/theme/custom.css
582
583
  - brutrb.com/.vitepress/theme/index.js
583
584
  - brutrb.com/.vitepress/theme/style.css
585
+ - brutrb.com/adrs.md
584
586
  - brutrb.com/ai.md
585
587
  - brutrb.com/assets.md
586
588
  - brutrb.com/bin/build
@@ -610,6 +612,8 @@ files:
610
612
  - brutrb.com/handlers.md
611
613
  - brutrb.com/hooks.md
612
614
  - brutrb.com/i18n.md
615
+ - brutrb.com/images/DevEnvironment.graffle
616
+ - brutrb.com/images/DevEnvironment.png
613
617
  - brutrb.com/images/LogoPylon.png
614
618
  - brutrb.com/images/LogoSquare.png
615
619
  - brutrb.com/images/LogoStop.png
@@ -621,8 +625,6 @@ files:
621
625
  - brutrb.com/images/dev-env-overview.png
622
626
  - brutrb.com/images/dev-env-protocol.dot
623
627
  - brutrb.com/images/dev-env-protocol.png
624
- - brutrb.com/images/logo-300.png
625
- - brutrb.com/images/logo.png
626
628
  - brutrb.com/images/overview.graffle
627
629
  - brutrb.com/images/overview.png
628
630
  - brutrb.com/images/spa.dot
@@ -638,7 +640,6 @@ files:
638
640
  - brutrb.com/lsp.md
639
641
  - brutrb.com/markdown-examples.md
640
642
  - brutrb.com/middleware.md
641
- - brutrb.com/not-released.md
642
643
  - brutrb.com/overview.md
643
644
  - brutrb.com/package-lock.json
644
645
  - brutrb.com/package.json
@@ -651,6 +652,7 @@ files:
651
652
  - brutrb.com/recipes/custom-flash.md
652
653
  - brutrb.com/recipes/indexed-forms.md
653
654
  - brutrb.com/recipes/text-field-component.md
655
+ - brutrb.com/roadmap.md
654
656
  - brutrb.com/routes.md
655
657
  - brutrb.com/security.md
656
658
  - brutrb.com/seed-data.md
@@ -663,6 +665,7 @@ files:
663
665
  - docs/404.html
664
666
  - docs/CNAME
665
667
  - docs/SocialImage.png
668
+ - docs/adrs.html
666
669
  - docs/ai.html
667
670
  - docs/api/Brut.html
668
671
  - docs/api/Brut/BackEnd.html
@@ -882,27 +885,30 @@ files:
882
885
  - docs/api/method_list.html
883
886
  - docs/api/top-level-namespace.html
884
887
  - docs/assets.html
888
+ - docs/assets/DevEnvironment.DaFcVfwP.png
885
889
  - docs/assets/LogoStop.Gb3tDhL1.png
886
890
  - docs/assets/OverviewMetro.DUS-5fUZ.png
891
+ - docs/assets/adrs.md.JRxZ5uYE.js
892
+ - docs/assets/adrs.md.JRxZ5uYE.lean.js
887
893
  - docs/assets/ai.md.Cy9GWnER.js
888
894
  - docs/assets/ai.md.Cy9GWnER.lean.js
889
- - docs/assets/app.ClaS47Ru.js
895
+ - docs/assets/app.Dm3x-DQc.js
890
896
  - docs/assets/assets.md.7C3HWkga.js
891
897
  - docs/assets/assets.md.7C3HWkga.lean.js
892
898
  - docs/assets/brut-js.md.B4GYxQVw.js
893
899
  - docs/assets/brut-js.md.B4GYxQVw.lean.js
894
900
  - docs/assets/business-logic.md.BY4hGy0m.js
895
901
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
896
- - docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js
897
- - docs/assets/chunks/VPLocalSearchBox.DtgDfde2.js
902
+ - docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js
903
+ - docs/assets/chunks/VPLocalSearchBox.DL6bnqee.js
898
904
  - docs/assets/chunks/framework.1L-BeKqY.js
899
- - docs/assets/chunks/theme.B45bvibT.js
905
+ - docs/assets/chunks/theme.BXdlf6e8.js
900
906
  - docs/assets/cli.md.CjsktgFz.js
901
907
  - docs/assets/cli.md.CjsktgFz.lean.js
902
- - docs/assets/components.md.DatoNgFo.js
903
- - docs/assets/components.md.DatoNgFo.lean.js
904
- - docs/assets/configuration.md.DeyhpqEx.js
905
- - docs/assets/configuration.md.DeyhpqEx.lean.js
908
+ - docs/assets/components.md.Pg_Lo35G.js
909
+ - docs/assets/components.md.Pg_Lo35G.lean.js
910
+ - docs/assets/configuration.md.BfeGnEci.js
911
+ - docs/assets/configuration.md.BfeGnEci.lean.js
906
912
  - docs/assets/css.md.CltvJqAa.js
907
913
  - docs/assets/css.md.CltvJqAa.lean.js
908
914
  - docs/assets/custom-element-tests.md.B_rbta32.js
@@ -913,14 +919,13 @@ files:
913
919
  - docs/assets/database-schema.md.CSYk6E6v.lean.js
914
920
  - docs/assets/deployment.md.BLseERGV.js
915
921
  - docs/assets/deployment.md.BLseERGV.lean.js
916
- - docs/assets/dev-env-overview.Gj7NWM8-.png
917
922
  - docs/assets/dev-env-protocol.DysDAtnz.png
918
- - docs/assets/dev-environment.md.BroAOLhF.js
919
- - docs/assets/dev-environment.md.BroAOLhF.lean.js
923
+ - docs/assets/dev-environment.md.Dy6EldaM.js
924
+ - docs/assets/dev-environment.md.Dy6EldaM.lean.js
920
925
  - docs/assets/dir-structure.md.CWir1pic.js
921
926
  - docs/assets/dir-structure.md.CWir1pic.lean.js
922
- - docs/assets/doc-conventions.md.BzmSrTEW.js
923
- - docs/assets/doc-conventions.md.BzmSrTEW.lean.js
927
+ - docs/assets/doc-conventions.md.DOkAuXlt.js
928
+ - docs/assets/doc-conventions.md.DOkAuXlt.lean.js
924
929
  - docs/assets/end-to-end-tests.md.DzqRpZ43.js
925
930
  - docs/assets/end-to-end-tests.md.DzqRpZ43.lean.js
926
931
  - docs/assets/features.md.DPFXsy0z.js
@@ -929,18 +934,18 @@ files:
929
934
  - docs/assets/flash-and-session.md.nPvUpnUx.lean.js
930
935
  - docs/assets/form-constraints.md.x5tNpTTI.js
931
936
  - docs/assets/form-constraints.md.x5tNpTTI.lean.js
932
- - docs/assets/forms.md.C2Dizvzq.js
933
- - docs/assets/forms.md.C2Dizvzq.lean.js
934
- - docs/assets/getting-started.md.C93e0odB.js
935
- - docs/assets/getting-started.md.C93e0odB.lean.js
937
+ - docs/assets/forms.md.BQZlCwvi.js
938
+ - docs/assets/forms.md.BQZlCwvi.lean.js
939
+ - docs/assets/getting-started.md.BcXnNuD6.js
940
+ - docs/assets/getting-started.md.BcXnNuD6.lean.js
936
941
  - docs/assets/handlers.md.Chyri6KA.js
937
942
  - docs/assets/handlers.md.Chyri6KA.lean.js
938
943
  - docs/assets/hooks.md.Jmb5VOLA.js
939
944
  - docs/assets/hooks.md.Jmb5VOLA.lean.js
940
945
  - docs/assets/i18n.md.xQhiGo1G.js
941
946
  - docs/assets/i18n.md.xQhiGo1G.lean.js
942
- - docs/assets/index.md.CAMqGBJE.js
943
- - docs/assets/index.md.CAMqGBJE.lean.js
947
+ - docs/assets/index.md.Bn9e0sRJ.js
948
+ - docs/assets/index.md.Bn9e0sRJ.lean.js
944
949
  - docs/assets/instrumentation.md.BgcaGVYH.js
945
950
  - docs/assets/instrumentation.md.BgcaGVYH.lean.js
946
951
  - docs/assets/javascript.md.DzrMxUmI.js
@@ -957,10 +962,8 @@ files:
957
962
  - docs/assets/markdown-examples.md.CCFEQO44.lean.js
958
963
  - docs/assets/middleware.md.Czz_UlJN.js
959
964
  - docs/assets/middleware.md.Czz_UlJN.lean.js
960
- - docs/assets/not-released.md.BBy28McC.js
961
- - docs/assets/not-released.md.BBy28McC.lean.js
962
- - docs/assets/overview.md.Bdq4qt3L.js
963
- - docs/assets/overview.md.Bdq4qt3L.lean.js
965
+ - docs/assets/overview.md.iMnwLO4x.js
966
+ - docs/assets/overview.md.iMnwLO4x.lean.js
964
967
  - docs/assets/pages.md.B7Hc-i6H.js
965
968
  - docs/assets/pages.md.B7Hc-i6H.lean.js
966
969
  - docs/assets/recipes_alternate-layouts.md.BwEytl59.js
@@ -975,6 +978,8 @@ files:
975
978
  - docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js
976
979
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.js
977
980
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js
981
+ - docs/assets/roadmap.md.C6PRi0DX.js
982
+ - docs/assets/roadmap.md.C6PRi0DX.lean.js
978
983
  - docs/assets/routes.md.B8kfUPHU.js
979
984
  - docs/assets/routes.md.B8kfUPHU.lean.js
980
985
  - docs/assets/security.md.C0G_AZR-.js
@@ -984,9 +989,9 @@ files:
984
989
  - docs/assets/spa.qejUdp-5.png
985
990
  - docs/assets/space-time-continuum.md.xl44xDos.js
986
991
  - docs/assets/space-time-continuum.md.xl44xDos.lean.js
987
- - docs/assets/style.prAgp4yQ.css
988
- - docs/assets/tutorial.md.a4a0eVOy.js
989
- - docs/assets/tutorial.md.a4a0eVOy.lean.js
992
+ - docs/assets/style.B1z60PPQ.css
993
+ - docs/assets/tutorial.md.BYXj4cOu.js
994
+ - docs/assets/tutorial.md.BYXj4cOu.lean.js
990
995
  - docs/assets/unit-tests.md.DUGrnLj5.js
991
996
  - docs/assets/unit-tests.md.DUGrnLj5.lean.js
992
997
  - docs/assets/why.md.C-hk5xgJ.js
@@ -1115,7 +1120,6 @@ files:
1115
1120
  - docs/lsp.html
1116
1121
  - docs/markdown-examples.html
1117
1122
  - docs/middleware.html
1118
- - docs/not-released.html
1119
1123
  - docs/overview.html
1120
1124
  - docs/pages.html
1121
1125
  - docs/recipes/alternate-layouts.html
@@ -1124,6 +1128,7 @@ files:
1124
1128
  - docs/recipes/custom-flash.html
1125
1129
  - docs/recipes/indexed-forms.html
1126
1130
  - docs/recipes/text-field-component.html
1131
+ - docs/roadmap.html
1127
1132
  - docs/routes.html
1128
1133
  - docs/security.html
1129
1134
  - docs/seed-data.html
@@ -1285,6 +1290,7 @@ files:
1285
1290
  - specs/brut/front_end/forms/input.spec.rb
1286
1291
  - specs/brut/front_end/forms/radio_button_group_input.spec.rb
1287
1292
  - specs/brut/front_end/forms/select_input.spec.rb
1293
+ - specs/brut/junk_drawer.spec.rb
1288
1294
  - specs/spec_helper.rb
1289
1295
  - specs/support.rb
1290
1296
  - specs/support/matchers.rb
Binary file
Binary file
@@ -1,5 +0,0 @@
1
- # Brut is Not Released Software
2
-
3
- > [!WARNING]
4
- > Brut is not considered released. It is still in development and some of what is in this doc
5
- > site is inaccurate.