brut 0.1.0 → 0.2.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 (375) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/brutrb.com/.vitepress/config.mjs +4 -2
  4. data/brutrb.com/.vitepress/theme/style.css +16 -38
  5. data/brutrb.com/adrs.md +15 -0
  6. data/brutrb.com/dev-environment.md +6 -1
  7. data/brutrb.com/doc-conventions.md +1 -2
  8. data/brutrb.com/images/DevEnvironment.graffle +0 -0
  9. data/brutrb.com/images/DevEnvironment.png +0 -0
  10. data/brutrb.com/index.md +0 -3
  11. data/brutrb.com/overview.md +2 -2
  12. data/brutrb.com/roadmap.md +57 -0
  13. data/brutrb.com/tutorial.md +5 -1
  14. data/docs/404.html +4 -4
  15. data/docs/{not-released.html → adrs.html} +8 -8
  16. data/docs/ai.html +6 -6
  17. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  18. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  19. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  20. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  21. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  22. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  23. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  24. data/docs/api/Brut/BackEnd.html +1 -1
  25. data/docs/api/Brut/CLI/App.html +1 -1
  26. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  27. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  28. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  29. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  40. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +3 -3
  47. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  48. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
  50. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  52. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  53. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  54. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  55. data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Test/JS.html +6 -6
  58. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  59. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  60. data/docs/api/Brut/CLI/Apps.html +1 -1
  61. data/docs/api/Brut/CLI/Command.html +3 -3
  62. data/docs/api/Brut/CLI/Error.html +1 -1
  63. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  64. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  65. data/docs/api/Brut/CLI/Executor.html +1 -1
  66. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  67. data/docs/api/Brut/CLI/Options.html +1 -1
  68. data/docs/api/Brut/CLI/Output.html +1 -1
  69. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  70. data/docs/api/Brut/CLI.html +1 -1
  71. data/docs/api/Brut/FactoryBot.html +1 -1
  72. data/docs/api/Brut/Framework/App.html +1 -1
  73. data/docs/api/Brut/Framework/Config.html +1 -1
  74. data/docs/api/Brut/Framework/Container.html +1 -1
  75. data/docs/api/Brut/Framework/Error.html +1 -1
  76. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  77. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  78. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  79. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  80. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  81. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  82. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  83. data/docs/api/Brut/Framework/Errors.html +1 -1
  84. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  85. data/docs/api/Brut/Framework/MCP.html +1 -1
  86. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  87. data/docs/api/Brut/Framework.html +1 -1
  88. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  89. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  90. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  91. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  92. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  93. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +3 -3
  99. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Form.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  121. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  130. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  131. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  132. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  133. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  134. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  135. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  136. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  143. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  144. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  145. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  146. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  147. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  153. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  154. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  155. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  156. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  163. data/docs/api/Brut/FrontEnd.html +1 -1
  164. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  165. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  166. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  167. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  168. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  169. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  170. data/docs/api/Brut/I18n.html +1 -1
  171. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  172. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  173. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  174. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  175. data/docs/api/Brut/Instrumentation.html +1 -1
  176. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  177. data/docs/api/Brut/SinatraHelpers.html +1 -1
  178. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  179. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  180. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  181. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  182. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  183. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  184. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  185. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  186. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  188. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  189. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  190. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  191. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  192. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  193. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  199. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  200. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  201. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  202. data/docs/api/Brut/SpecSupport.html +1 -1
  203. data/docs/api/Brut.html +1 -1
  204. data/docs/api/Clock.html +1 -1
  205. data/docs/api/RichString.html +150 -343
  206. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  207. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  208. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  209. data/docs/api/Sequel/Extensions.html +1 -1
  210. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  211. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  212. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  213. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  214. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  215. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  216. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  217. data/docs/api/Sequel/Plugins.html +1 -1
  218. data/docs/api/Sequel.html +1 -1
  219. data/docs/api/_index.html +5 -5
  220. data/docs/api/class_list.html +1 -1
  221. data/docs/api/file.README.html +1 -1
  222. data/docs/api/index.html +1 -1
  223. data/docs/api/method_list.html +281 -313
  224. data/docs/api/top-level-namespace.html +1 -1
  225. data/docs/assets/DevEnvironment.DaFcVfwP.png +0 -0
  226. data/docs/assets/adrs.md.JRxZ5uYE.js +1 -0
  227. data/docs/assets/adrs.md.JRxZ5uYE.lean.js +1 -0
  228. data/docs/assets/{app.ClaS47Ru.js → app.Dm3x-DQc.js} +1 -1
  229. data/docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js +1 -0
  230. data/docs/assets/chunks/{VPLocalSearchBox.DtgDfde2.js → VPLocalSearchBox.DL6bnqee.js} +1 -1
  231. data/docs/assets/chunks/{theme.B45bvibT.js → theme.BXdlf6e8.js} +2 -2
  232. data/docs/assets/{components.md.DatoNgFo.js → components.md.Pg_Lo35G.js} +3 -3
  233. data/docs/assets/{configuration.md.DeyhpqEx.js → configuration.md.BfeGnEci.js} +1 -1
  234. data/docs/assets/dev-environment.md.Dy6EldaM.js +16 -0
  235. data/docs/assets/dev-environment.md.Dy6EldaM.lean.js +1 -0
  236. data/docs/assets/doc-conventions.md.DOkAuXlt.js +1 -0
  237. data/docs/assets/{forms.md.C2Dizvzq.js → forms.md.BQZlCwvi.js} +1 -1
  238. data/docs/assets/{getting-started.md.C93e0odB.js → getting-started.md.BcXnNuD6.js} +2 -2
  239. data/docs/assets/index.md.Bn9e0sRJ.js +1 -0
  240. data/docs/assets/index.md.Bn9e0sRJ.lean.js +1 -0
  241. data/docs/assets/{overview.md.Bdq4qt3L.js → overview.md.iMnwLO4x.js} +1 -1
  242. data/docs/assets/roadmap.md.C6PRi0DX.js +1 -0
  243. data/docs/assets/roadmap.md.C6PRi0DX.lean.js +1 -0
  244. data/docs/assets/{style.prAgp4yQ.css → style.B1z60PPQ.css} +1 -1
  245. data/docs/assets/tutorial.md.BYXj4cOu.js +1 -0
  246. data/docs/assets/tutorial.md.BYXj4cOu.lean.js +1 -0
  247. data/docs/assets.html +6 -6
  248. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  249. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  250. data/docs/brut-js/api/Autosubmit.html +1 -1
  251. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  252. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  253. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  254. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  255. data/docs/brut-js/api/BufferedLogger.html +1 -1
  256. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  257. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  258. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  259. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  260. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  261. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  262. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  263. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  264. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  265. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  266. data/docs/brut-js/api/Form.html +1 -1
  267. data/docs/brut-js/api/Form.js.html +1 -1
  268. data/docs/brut-js/api/I18nTranslation.html +1 -1
  269. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  270. data/docs/brut-js/api/LocaleDetection.html +1 -1
  271. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  272. data/docs/brut-js/api/Logger.html +1 -1
  273. data/docs/brut-js/api/Logger.js.html +1 -1
  274. data/docs/brut-js/api/Message.html +1 -1
  275. data/docs/brut-js/api/Message.js.html +1 -1
  276. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  277. data/docs/brut-js/api/RichString.html +1 -1
  278. data/docs/brut-js/api/RichString.js.html +1 -1
  279. data/docs/brut-js/api/Tabs.html +1 -1
  280. data/docs/brut-js/api/Tabs.js.html +1 -1
  281. data/docs/brut-js/api/Tracing.html +1 -1
  282. data/docs/brut-js/api/Tracing.js.html +1 -1
  283. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  284. data/docs/brut-js/api/external-Performance.html +1 -1
  285. data/docs/brut-js/api/external-Promise.html +1 -1
  286. data/docs/brut-js/api/external-ValidityState.html +1 -1
  287. data/docs/brut-js/api/external-Window.html +1 -1
  288. data/docs/brut-js/api/external-fetch.html +1 -1
  289. data/docs/brut-js/api/global.html +1 -1
  290. data/docs/brut-js/api/index.html +1 -1
  291. data/docs/brut-js/api/index.js.html +1 -1
  292. data/docs/brut-js/api/module-testing.html +1 -1
  293. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  294. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  295. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  296. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  297. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  298. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  299. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  300. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  301. data/docs/brut-js/api/testing_index.js.html +1 -1
  302. data/docs/brut-js.html +6 -6
  303. data/docs/business-logic.html +6 -6
  304. data/docs/cli.html +6 -6
  305. data/docs/components.html +10 -10
  306. data/docs/configuration.html +7 -7
  307. data/docs/css.html +6 -6
  308. data/docs/custom-element-tests.html +6 -6
  309. data/docs/database-access.html +6 -6
  310. data/docs/database-schema.html +6 -6
  311. data/docs/deployment.html +6 -6
  312. data/docs/dev-environment.html +12 -7
  313. data/docs/dir-structure.html +6 -6
  314. data/docs/doc-conventions.html +7 -7
  315. data/docs/end-to-end-tests.html +6 -6
  316. data/docs/features.html +6 -6
  317. data/docs/flash-and-session.html +6 -6
  318. data/docs/form-constraints.html +6 -6
  319. data/docs/forms.html +8 -8
  320. data/docs/getting-started.html +9 -9
  321. data/docs/handlers.html +6 -6
  322. data/docs/hashmap.json +1 -1
  323. data/docs/hooks.html +6 -6
  324. data/docs/i18n.html +6 -6
  325. data/docs/index.html +7 -7
  326. data/docs/instrumentation.html +6 -6
  327. data/docs/javascript.html +6 -6
  328. data/docs/jobs.html +6 -6
  329. data/docs/keyword-injection.html +6 -6
  330. data/docs/layouts.html +6 -6
  331. data/docs/lsp.html +6 -6
  332. data/docs/markdown-examples.html +6 -6
  333. data/docs/middleware.html +6 -6
  334. data/docs/overview.html +7 -7
  335. data/docs/pages.html +6 -6
  336. data/docs/recipes/alternate-layouts.html +6 -6
  337. data/docs/recipes/authentication.html +6 -6
  338. data/docs/recipes/blank-layouts.html +6 -6
  339. data/docs/recipes/custom-flash.html +6 -6
  340. data/docs/recipes/indexed-forms.html +6 -6
  341. data/docs/recipes/text-field-component.html +6 -6
  342. data/docs/roadmap.html +29 -0
  343. data/docs/routes.html +6 -6
  344. data/docs/security.html +6 -6
  345. data/docs/seed-data.html +6 -6
  346. data/docs/space-time-continuum.html +6 -6
  347. data/docs/tutorial.html +7 -7
  348. data/docs/unit-tests.html +6 -6
  349. data/docs/why.html +6 -6
  350. data/lib/brut/cli/apps/test.rb +1 -1
  351. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +2 -2
  352. data/lib/brut/junk_drawer.rb +48 -9
  353. data/lib/brut/version.rb +1 -1
  354. data/specs/brut/junk_drawer.spec.rb +75 -0
  355. metadata +36 -31
  356. data/brutrb.com/images/logo-300.png +0 -0
  357. data/brutrb.com/images/logo.png +0 -0
  358. data/brutrb.com/not-released.md +0 -5
  359. data/docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js +0 -1
  360. data/docs/assets/dev-env-overview.Gj7NWM8-.png +0 -0
  361. data/docs/assets/dev-environment.md.BroAOLhF.js +0 -11
  362. data/docs/assets/dev-environment.md.BroAOLhF.lean.js +0 -1
  363. data/docs/assets/doc-conventions.md.BzmSrTEW.js +0 -1
  364. data/docs/assets/index.md.CAMqGBJE.js +0 -1
  365. data/docs/assets/index.md.CAMqGBJE.lean.js +0 -1
  366. data/docs/assets/not-released.md.BBy28McC.js +0 -1
  367. data/docs/assets/not-released.md.BBy28McC.lean.js +0 -1
  368. data/docs/assets/tutorial.md.a4a0eVOy.js +0 -1
  369. data/docs/assets/tutorial.md.a4a0eVOy.lean.js +0 -1
  370. /data/docs/assets/{components.md.DatoNgFo.lean.js → components.md.Pg_Lo35G.lean.js} +0 -0
  371. /data/docs/assets/{configuration.md.DeyhpqEx.lean.js → configuration.md.BfeGnEci.lean.js} +0 -0
  372. /data/docs/assets/{doc-conventions.md.BzmSrTEW.lean.js → doc-conventions.md.DOkAuXlt.lean.js} +0 -0
  373. /data/docs/assets/{forms.md.C2Dizvzq.lean.js → forms.md.BQZlCwvi.lean.js} +0 -0
  374. /data/docs/assets/{getting-started.md.C93e0odB.lean.js → getting-started.md.BcXnNuD6.lean.js} +0 -0
  375. /data/docs/assets/{overview.md.Bdq4qt3L.lean.js → overview.md.iMnwLO4x.lean.js} +0 -0
@@ -72,8 +72,8 @@ class Brut::FrontEnd::Components::Inputs::SelectTagWithOptions < Brut::FrontEnd:
72
72
  option = options.detect { |option|
73
73
  input_value == option.send(@value_attribute)
74
74
  }
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(', ')}"
75
+ if option.nil? && option.to_s.strip != ""
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.0"
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.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -581,6 +581,7 @@ files:
581
581
  - brutrb.com/.vitepress/theme/custom.css
582
582
  - brutrb.com/.vitepress/theme/index.js
583
583
  - brutrb.com/.vitepress/theme/style.css
584
+ - brutrb.com/adrs.md
584
585
  - brutrb.com/ai.md
585
586
  - brutrb.com/assets.md
586
587
  - brutrb.com/bin/build
@@ -610,6 +611,8 @@ files:
610
611
  - brutrb.com/handlers.md
611
612
  - brutrb.com/hooks.md
612
613
  - brutrb.com/i18n.md
614
+ - brutrb.com/images/DevEnvironment.graffle
615
+ - brutrb.com/images/DevEnvironment.png
613
616
  - brutrb.com/images/LogoPylon.png
614
617
  - brutrb.com/images/LogoSquare.png
615
618
  - brutrb.com/images/LogoStop.png
@@ -621,8 +624,6 @@ files:
621
624
  - brutrb.com/images/dev-env-overview.png
622
625
  - brutrb.com/images/dev-env-protocol.dot
623
626
  - brutrb.com/images/dev-env-protocol.png
624
- - brutrb.com/images/logo-300.png
625
- - brutrb.com/images/logo.png
626
627
  - brutrb.com/images/overview.graffle
627
628
  - brutrb.com/images/overview.png
628
629
  - brutrb.com/images/spa.dot
@@ -638,7 +639,6 @@ files:
638
639
  - brutrb.com/lsp.md
639
640
  - brutrb.com/markdown-examples.md
640
641
  - brutrb.com/middleware.md
641
- - brutrb.com/not-released.md
642
642
  - brutrb.com/overview.md
643
643
  - brutrb.com/package-lock.json
644
644
  - brutrb.com/package.json
@@ -651,6 +651,7 @@ files:
651
651
  - brutrb.com/recipes/custom-flash.md
652
652
  - brutrb.com/recipes/indexed-forms.md
653
653
  - brutrb.com/recipes/text-field-component.md
654
+ - brutrb.com/roadmap.md
654
655
  - brutrb.com/routes.md
655
656
  - brutrb.com/security.md
656
657
  - brutrb.com/seed-data.md
@@ -663,6 +664,7 @@ files:
663
664
  - docs/404.html
664
665
  - docs/CNAME
665
666
  - docs/SocialImage.png
667
+ - docs/adrs.html
666
668
  - docs/ai.html
667
669
  - docs/api/Brut.html
668
670
  - docs/api/Brut/BackEnd.html
@@ -882,27 +884,30 @@ files:
882
884
  - docs/api/method_list.html
883
885
  - docs/api/top-level-namespace.html
884
886
  - docs/assets.html
887
+ - docs/assets/DevEnvironment.DaFcVfwP.png
885
888
  - docs/assets/LogoStop.Gb3tDhL1.png
886
889
  - docs/assets/OverviewMetro.DUS-5fUZ.png
890
+ - docs/assets/adrs.md.JRxZ5uYE.js
891
+ - docs/assets/adrs.md.JRxZ5uYE.lean.js
887
892
  - docs/assets/ai.md.Cy9GWnER.js
888
893
  - docs/assets/ai.md.Cy9GWnER.lean.js
889
- - docs/assets/app.ClaS47Ru.js
894
+ - docs/assets/app.Dm3x-DQc.js
890
895
  - docs/assets/assets.md.7C3HWkga.js
891
896
  - docs/assets/assets.md.7C3HWkga.lean.js
892
897
  - docs/assets/brut-js.md.B4GYxQVw.js
893
898
  - docs/assets/brut-js.md.B4GYxQVw.lean.js
894
899
  - docs/assets/business-logic.md.BY4hGy0m.js
895
900
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
896
- - docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js
897
- - docs/assets/chunks/VPLocalSearchBox.DtgDfde2.js
901
+ - docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js
902
+ - docs/assets/chunks/VPLocalSearchBox.DL6bnqee.js
898
903
  - docs/assets/chunks/framework.1L-BeKqY.js
899
- - docs/assets/chunks/theme.B45bvibT.js
904
+ - docs/assets/chunks/theme.BXdlf6e8.js
900
905
  - docs/assets/cli.md.CjsktgFz.js
901
906
  - 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
907
+ - docs/assets/components.md.Pg_Lo35G.js
908
+ - docs/assets/components.md.Pg_Lo35G.lean.js
909
+ - docs/assets/configuration.md.BfeGnEci.js
910
+ - docs/assets/configuration.md.BfeGnEci.lean.js
906
911
  - docs/assets/css.md.CltvJqAa.js
907
912
  - docs/assets/css.md.CltvJqAa.lean.js
908
913
  - docs/assets/custom-element-tests.md.B_rbta32.js
@@ -913,14 +918,13 @@ files:
913
918
  - docs/assets/database-schema.md.CSYk6E6v.lean.js
914
919
  - docs/assets/deployment.md.BLseERGV.js
915
920
  - docs/assets/deployment.md.BLseERGV.lean.js
916
- - docs/assets/dev-env-overview.Gj7NWM8-.png
917
921
  - docs/assets/dev-env-protocol.DysDAtnz.png
918
- - docs/assets/dev-environment.md.BroAOLhF.js
919
- - docs/assets/dev-environment.md.BroAOLhF.lean.js
922
+ - docs/assets/dev-environment.md.Dy6EldaM.js
923
+ - docs/assets/dev-environment.md.Dy6EldaM.lean.js
920
924
  - docs/assets/dir-structure.md.CWir1pic.js
921
925
  - 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
926
+ - docs/assets/doc-conventions.md.DOkAuXlt.js
927
+ - docs/assets/doc-conventions.md.DOkAuXlt.lean.js
924
928
  - docs/assets/end-to-end-tests.md.DzqRpZ43.js
925
929
  - docs/assets/end-to-end-tests.md.DzqRpZ43.lean.js
926
930
  - docs/assets/features.md.DPFXsy0z.js
@@ -929,18 +933,18 @@ files:
929
933
  - docs/assets/flash-and-session.md.nPvUpnUx.lean.js
930
934
  - docs/assets/form-constraints.md.x5tNpTTI.js
931
935
  - 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
936
+ - docs/assets/forms.md.BQZlCwvi.js
937
+ - docs/assets/forms.md.BQZlCwvi.lean.js
938
+ - docs/assets/getting-started.md.BcXnNuD6.js
939
+ - docs/assets/getting-started.md.BcXnNuD6.lean.js
936
940
  - docs/assets/handlers.md.Chyri6KA.js
937
941
  - docs/assets/handlers.md.Chyri6KA.lean.js
938
942
  - docs/assets/hooks.md.Jmb5VOLA.js
939
943
  - docs/assets/hooks.md.Jmb5VOLA.lean.js
940
944
  - docs/assets/i18n.md.xQhiGo1G.js
941
945
  - docs/assets/i18n.md.xQhiGo1G.lean.js
942
- - docs/assets/index.md.CAMqGBJE.js
943
- - docs/assets/index.md.CAMqGBJE.lean.js
946
+ - docs/assets/index.md.Bn9e0sRJ.js
947
+ - docs/assets/index.md.Bn9e0sRJ.lean.js
944
948
  - docs/assets/instrumentation.md.BgcaGVYH.js
945
949
  - docs/assets/instrumentation.md.BgcaGVYH.lean.js
946
950
  - docs/assets/javascript.md.DzrMxUmI.js
@@ -957,10 +961,8 @@ files:
957
961
  - docs/assets/markdown-examples.md.CCFEQO44.lean.js
958
962
  - docs/assets/middleware.md.Czz_UlJN.js
959
963
  - 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
964
+ - docs/assets/overview.md.iMnwLO4x.js
965
+ - docs/assets/overview.md.iMnwLO4x.lean.js
964
966
  - docs/assets/pages.md.B7Hc-i6H.js
965
967
  - docs/assets/pages.md.B7Hc-i6H.lean.js
966
968
  - docs/assets/recipes_alternate-layouts.md.BwEytl59.js
@@ -975,6 +977,8 @@ files:
975
977
  - docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js
976
978
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.js
977
979
  - docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js
980
+ - docs/assets/roadmap.md.C6PRi0DX.js
981
+ - docs/assets/roadmap.md.C6PRi0DX.lean.js
978
982
  - docs/assets/routes.md.B8kfUPHU.js
979
983
  - docs/assets/routes.md.B8kfUPHU.lean.js
980
984
  - docs/assets/security.md.C0G_AZR-.js
@@ -984,9 +988,9 @@ files:
984
988
  - docs/assets/spa.qejUdp-5.png
985
989
  - docs/assets/space-time-continuum.md.xl44xDos.js
986
990
  - 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
991
+ - docs/assets/style.B1z60PPQ.css
992
+ - docs/assets/tutorial.md.BYXj4cOu.js
993
+ - docs/assets/tutorial.md.BYXj4cOu.lean.js
990
994
  - docs/assets/unit-tests.md.DUGrnLj5.js
991
995
  - docs/assets/unit-tests.md.DUGrnLj5.lean.js
992
996
  - docs/assets/why.md.C-hk5xgJ.js
@@ -1115,7 +1119,6 @@ files:
1115
1119
  - docs/lsp.html
1116
1120
  - docs/markdown-examples.html
1117
1121
  - docs/middleware.html
1118
- - docs/not-released.html
1119
1122
  - docs/overview.html
1120
1123
  - docs/pages.html
1121
1124
  - docs/recipes/alternate-layouts.html
@@ -1124,6 +1127,7 @@ files:
1124
1127
  - docs/recipes/custom-flash.html
1125
1128
  - docs/recipes/indexed-forms.html
1126
1129
  - docs/recipes/text-field-component.html
1130
+ - docs/roadmap.html
1127
1131
  - docs/routes.html
1128
1132
  - docs/security.html
1129
1133
  - docs/seed-data.html
@@ -1285,6 +1289,7 @@ files:
1285
1289
  - specs/brut/front_end/forms/input.spec.rb
1286
1290
  - specs/brut/front_end/forms/radio_button_group_input.spec.rb
1287
1291
  - specs/brut/front_end/forms/select_input.spec.rb
1292
+ - specs/brut/junk_drawer.spec.rb
1288
1293
  - specs/spec_helper.rb
1289
1294
  - specs/support.rb
1290
1295
  - 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.