brut 0.16.0 → 0.17.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 (444) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -0
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile.lock +4 -1
  5. data/bin/docs +7 -0
  6. data/brut-css/package-lock.json +2 -2
  7. data/brut-css/package.json +1 -1
  8. data/brut-js/package-lock.json +2 -2
  9. data/brut-js/package.json +1 -1
  10. data/brut.gemspec +2 -0
  11. data/docs/404.html +2 -2
  12. data/docs/adrs.html +3 -3
  13. data/docs/ai.html +3 -3
  14. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  15. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  16. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  17. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  18. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  19. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  20. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  21. data/docs/api/Brut/BackEnd.html +1 -1
  22. data/docs/api/Brut/CLI/App.html +1 -1
  23. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  24. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  25. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  26. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +2 -2
  27. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  28. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  29. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +2 -2
  40. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  47. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
  48. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +1 -1
  50. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  52. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  53. data/docs/api/Brut/CLI/Apps/Test/Audit.html +10 -6
  54. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  55. data/docs/api/Brut/CLI/Apps/Test/JS.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Test.html +1 -1
  58. data/docs/api/Brut/CLI/Apps.html +1 -1
  59. data/docs/api/Brut/CLI/Command.html +1 -1
  60. data/docs/api/Brut/CLI/Error.html +1 -1
  61. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  62. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  63. data/docs/api/Brut/CLI/Executor.html +1 -1
  64. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  65. data/docs/api/Brut/CLI/Options.html +1 -1
  66. data/docs/api/Brut/CLI/Output.html +1 -1
  67. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  68. data/docs/api/Brut/CLI.html +1 -1
  69. data/docs/api/Brut/FactoryBot.html +1 -1
  70. data/docs/api/Brut/Framework/App.html +1 -1
  71. data/docs/api/Brut/Framework/Config.html +1 -1
  72. data/docs/api/Brut/Framework/Container.html +1 -1
  73. data/docs/api/Brut/Framework/Error.html +1 -1
  74. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  75. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  76. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  77. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  78. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  79. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  80. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  81. data/docs/api/Brut/Framework/Errors.html +1 -1
  82. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  83. data/docs/api/Brut/Framework/MCP.html +1 -1
  84. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  85. data/docs/api/Brut/Framework.html +1 -1
  86. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  87. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  88. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  89. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  90. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  91. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  92. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  93. data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  99. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  105. data/docs/api/Brut/FrontEnd/CsrfProtector.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/Button.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  123. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  130. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  131. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  132. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  133. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  134. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  135. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  136. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  143. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  144. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
  145. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  146. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  147. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  153. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  154. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  155. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  156. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  163. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  164. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  165. data/docs/api/Brut/FrontEnd.html +1 -1
  166. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  167. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  168. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  169. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  170. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  171. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  172. data/docs/api/Brut/I18n.html +1 -1
  173. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  174. data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +1 -1
  175. data/docs/api/Brut/Instrumentation/Methods.html +1 -1
  176. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  177. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  178. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  179. data/docs/api/Brut/Instrumentation.html +1 -1
  180. data/docs/api/Brut/RubocopConfig.html +1 -1
  181. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  182. data/docs/api/Brut/SinatraHelpers.html +1 -1
  183. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  184. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  185. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  186. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  188. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  189. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  190. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  191. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  192. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  193. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  199. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  200. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  201. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  203. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  204. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  205. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  206. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  207. data/docs/api/Brut/SpecSupport.html +1 -1
  208. data/docs/api/Brut/TUI/AnsiEscapeCode/Mod.html +409 -0
  209. data/docs/api/Brut/TUI/AnsiEscapeCode.html +426 -0
  210. data/docs/api/Brut/TUI/EventLoop/Deque.html +531 -0
  211. data/docs/api/Brut/TUI/EventLoop.html +676 -0
  212. data/docs/api/Brut/TUI/Events/BaseEvent.html +449 -0
  213. data/docs/api/Brut/TUI/Events/EventBus.html +485 -0
  214. data/docs/api/Brut/TUI/Events/EventLoopStarted.html +211 -0
  215. data/docs/api/Brut/TUI/Events/Exception.html +523 -0
  216. data/docs/api/Brut/TUI/Events/Tick.html +294 -0
  217. data/docs/api/Brut/TUI/Events.html +131 -0
  218. data/docs/api/Brut/TUI/MarkupString.html +537 -0
  219. data/docs/api/Brut/TUI/Script/BlockStep.html +300 -0
  220. data/docs/api/Brut/TUI/Script/Events/CommandExecutionFailed.html +252 -0
  221. data/docs/api/Brut/TUI/Script/Events/CommandExecutionSucceeded.html +163 -0
  222. data/docs/api/Brut/TUI/Script/Events/CommandStdErr.html +163 -0
  223. data/docs/api/Brut/TUI/Script/Events/CommandStdOut.html +300 -0
  224. data/docs/api/Brut/TUI/Script/Events/ExecutingCommand.html +298 -0
  225. data/docs/api/Brut/TUI/Script/Events/Message.html +345 -0
  226. data/docs/api/Brut/TUI/Script/Events/PhaseCompleted.html +229 -0
  227. data/docs/api/Brut/TUI/Script/Events/PhaseStarted.html +350 -0
  228. data/docs/api/Brut/TUI/Script/Events/ScriptCompleted.html +282 -0
  229. data/docs/api/Brut/TUI/Script/Events/ScriptStarted.html +343 -0
  230. data/docs/api/Brut/TUI/Script/Events/StepCompleted.html +163 -0
  231. data/docs/api/Brut/TUI/Script/Events/StepStarted.html +346 -0
  232. data/docs/api/Brut/TUI/Script/Events.html +115 -0
  233. data/docs/api/Brut/TUI/Script/ExecStep/ProcessStatusFailed.html +210 -0
  234. data/docs/api/Brut/TUI/Script/ExecStep.html +493 -0
  235. data/docs/api/Brut/TUI/Script/LoggingSubscriber.html +914 -0
  236. data/docs/api/Brut/TUI/Script/PutsSubscriber.html +783 -0
  237. data/docs/api/Brut/TUI/Script/Step.html +313 -0
  238. data/docs/api/Brut/TUI/Script.html +1250 -0
  239. data/docs/api/Brut/TUI/Terminal.html +593 -0
  240. data/docs/api/Brut/TUI/TerminalTheme.html +1403 -0
  241. data/docs/api/Brut/TUI/Themes/Dark.html +706 -0
  242. data/docs/api/Brut/TUI/Themes/Light.html +804 -0
  243. data/docs/api/Brut/TUI/Themes/None.html +218 -0
  244. data/docs/api/Brut/TUI/Themes.html +115 -0
  245. data/docs/api/Brut/TUI.html +129 -0
  246. data/docs/api/Brut.html +3 -3
  247. data/docs/api/Clock.html +1 -1
  248. data/docs/api/ModuleName.html +1 -1
  249. data/docs/api/RichString.html +1 -1
  250. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  251. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  252. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  253. data/docs/api/Sequel/Extensions.html +1 -1
  254. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  255. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  256. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  257. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  258. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  259. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  260. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  261. data/docs/api/Sequel/Plugins.html +1 -1
  262. data/docs/api/Sequel.html +1 -1
  263. data/docs/api/SpecSupport/Matchers/BeABug.html +143 -0
  264. data/docs/api/_index.html +246 -1
  265. data/docs/api/class_list.html +1 -1
  266. data/docs/api/file.README.html +1 -1
  267. data/docs/api/index.html +1 -1
  268. data/docs/api/method_list.html +1551 -431
  269. data/docs/api/top-level-namespace.html +1 -1
  270. data/docs/assets/{app.CovevI7X.js → app.B8jAEB7R.js} +1 -1
  271. data/docs/assets/chunks/@localSearchIndexroot.DJ8mocCj.js +1 -0
  272. data/docs/assets/chunks/{VPLocalSearchBox.CrvLAvKW.js → VPLocalSearchBox.gF-Po_fz.js} +1 -1
  273. data/docs/assets/chunks/{theme.BAi5_yQI.js → theme.BjPAOJkz.js} +2 -2
  274. data/docs/assets/{components.md.9sqJ27Oc.js → components.md.Ber8UBM0.js} +3 -3
  275. data/docs/assets/{configuration.md.Cb_oAR8Z.js → configuration.md.DrJ6YVoZ.js} +1 -1
  276. data/docs/assets/{forms.md.BdpYpNIk.js → forms.md.RK0zkhm0.js} +2 -2
  277. data/docs/assets/{forms.md.BdpYpNIk.lean.js → forms.md.RK0zkhm0.lean.js} +1 -1
  278. data/docs/assets/{getting-started.md.CKpNGvno.js → getting-started.md.CGJ44juQ.js} +2 -2
  279. data/docs/assets/{tutorials_02-dialog.md.Z_DOF2mU.js → tutorials_02-dialog.md.DE5WfCXI.js} +1 -1
  280. data/docs/assets.html +3 -3
  281. data/docs/brut-css/brut.css +1 -0
  282. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  283. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  284. data/docs/brut-js/api/Autosubmit.html +1 -1
  285. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  286. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  287. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  288. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  289. data/docs/brut-js/api/BufferedLogger.html +1 -1
  290. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  291. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  292. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  293. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  294. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  295. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  296. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  297. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  298. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  299. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  300. data/docs/brut-js/api/Form.html +1 -1
  301. data/docs/brut-js/api/Form.js.html +1 -1
  302. data/docs/brut-js/api/I18nTranslation.html +1 -1
  303. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  304. data/docs/brut-js/api/LocaleDetection.html +1 -1
  305. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  306. data/docs/brut-js/api/Logger.html +1 -1
  307. data/docs/brut-js/api/Logger.js.html +1 -1
  308. data/docs/brut-js/api/Message.html +1 -1
  309. data/docs/brut-js/api/Message.js.html +1 -1
  310. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  311. data/docs/brut-js/api/RichString.html +1 -1
  312. data/docs/brut-js/api/RichString.js.html +1 -1
  313. data/docs/brut-js/api/Tabs.html +1 -1
  314. data/docs/brut-js/api/Tabs.js.html +1 -1
  315. data/docs/brut-js/api/Toast.html +1 -1
  316. data/docs/brut-js/api/Toast.js.html +1 -1
  317. data/docs/brut-js/api/Tracing.html +1 -1
  318. data/docs/brut-js/api/Tracing.js.html +1 -1
  319. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  320. data/docs/brut-js/api/external-Performance.html +1 -1
  321. data/docs/brut-js/api/external-Promise.html +1 -1
  322. data/docs/brut-js/api/external-ValidityState.html +1 -1
  323. data/docs/brut-js/api/external-Window.html +1 -1
  324. data/docs/brut-js/api/external-fetch.html +1 -1
  325. data/docs/brut-js/api/global.html +1 -1
  326. data/docs/brut-js/api/index.html +1 -1
  327. data/docs/brut-js/api/index.js.html +1 -1
  328. data/docs/brut-js/api/module-testing.html +1 -1
  329. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  330. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  331. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  332. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  333. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  334. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  335. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  336. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  337. data/docs/brut-js/api/testing_index.js.html +1 -1
  338. data/docs/brut-js.html +3 -3
  339. data/docs/business-logic.html +3 -3
  340. data/docs/cli.html +3 -3
  341. data/docs/components.html +7 -7
  342. data/docs/configuration.html +5 -5
  343. data/docs/css.html +3 -3
  344. data/docs/custom-element-tests.html +3 -3
  345. data/docs/database-access.html +3 -3
  346. data/docs/database-schema.html +3 -3
  347. data/docs/deployment.html +3 -3
  348. data/docs/dev-environment.html +3 -3
  349. data/docs/dir-structure.html +3 -3
  350. data/docs/doc-conventions.html +3 -3
  351. data/docs/end-to-end-tests.html +3 -3
  352. data/docs/features.html +3 -3
  353. data/docs/flash-and-session.html +3 -3
  354. data/docs/form-constraints.html +3 -3
  355. data/docs/forms.html +5 -5
  356. data/docs/getting-started.html +6 -6
  357. data/docs/handlers.html +3 -3
  358. data/docs/hashmap.json +1 -1
  359. data/docs/hooks.html +3 -3
  360. data/docs/i18n.html +3 -3
  361. data/docs/index.html +3 -3
  362. data/docs/instrumentation.html +3 -3
  363. data/docs/javascript.html +3 -3
  364. data/docs/jobs.html +3 -3
  365. data/docs/keyword-injection.html +3 -3
  366. data/docs/layouts.html +3 -3
  367. data/docs/lsp.html +3 -3
  368. data/docs/markdown-examples.html +3 -3
  369. data/docs/middleware.html +3 -3
  370. data/docs/overview.html +3 -3
  371. data/docs/pages.html +3 -3
  372. data/docs/recipes/alternate-layouts.html +3 -3
  373. data/docs/recipes/authentication.html +3 -3
  374. data/docs/recipes/custom-flash.html +3 -3
  375. data/docs/recipes/dev-env-secrets.html +3 -3
  376. data/docs/recipes/form-errors.html +3 -3
  377. data/docs/recipes/indexed-forms.html +3 -3
  378. data/docs/recipes/migrations.html +3 -3
  379. data/docs/recipes/text-field-component.html +3 -3
  380. data/docs/roadmap.html +3 -3
  381. data/docs/routes.html +3 -3
  382. data/docs/security.html +3 -3
  383. data/docs/seed-data.html +3 -3
  384. data/docs/space-time-continuum.html +3 -3
  385. data/docs/tutorial.html +3 -3
  386. data/docs/tutorials/01-intro.html +3 -3
  387. data/docs/tutorials/02-dialog.html +5 -5
  388. data/docs/unit-tests.html +3 -3
  389. data/docs/why.html +3 -3
  390. data/lib/brut/cli/apps/build_assets.rb +1 -1
  391. data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
  392. data/lib/brut/cli/apps/test.rb +6 -4
  393. data/lib/brut/tui/ansi_escape_code.rb +104 -0
  394. data/lib/brut/tui/event_loop.rb +168 -0
  395. data/lib/brut/tui/events/base_event.rb +29 -0
  396. data/lib/brut/tui/events/event_bus.rb +73 -0
  397. data/lib/brut/tui/events/event_loop_started.rb +5 -0
  398. data/lib/brut/tui/events/exception.rb +24 -0
  399. data/lib/brut/tui/events/tick.rb +12 -0
  400. data/lib/brut/tui/events.rb +7 -0
  401. data/lib/brut/tui/markup_string.rb +68 -0
  402. data/lib/brut/tui/script/block_step.rb +17 -0
  403. data/lib/brut/tui/script/events/command_execution_failed.rb +4 -0
  404. data/lib/brut/tui/script/events/command_execution_succeeded.rb +3 -0
  405. data/lib/brut/tui/script/events/command_std_err.rb +3 -0
  406. data/lib/brut/tui/script/events/command_std_out.rb +13 -0
  407. data/lib/brut/tui/script/events/executing_command.rb +12 -0
  408. data/lib/brut/tui/script/events/message.rb +15 -0
  409. data/lib/brut/tui/script/events/phase_completed.rb +4 -0
  410. data/lib/brut/tui/script/events/phase_started.rb +14 -0
  411. data/lib/brut/tui/script/events/script_completed.rb +5 -0
  412. data/lib/brut/tui/script/events/script_started.rb +12 -0
  413. data/lib/brut/tui/script/events/step_completed.rb +3 -0
  414. data/lib/brut/tui/script/events/step_started.rb +12 -0
  415. data/lib/brut/tui/script/events.rb +14 -0
  416. data/lib/brut/tui/script/exec_step.rb +60 -0
  417. data/lib/brut/tui/script/logging_subscriber.rb +98 -0
  418. data/lib/brut/tui/script/puts_subscriber.rb +109 -0
  419. data/lib/brut/tui/script/step.rb +13 -0
  420. data/lib/brut/tui/script.rb +211 -0
  421. data/lib/brut/tui/terminal.rb +74 -0
  422. data/lib/brut/tui/terminal_theme.rb +140 -0
  423. data/lib/brut/tui/themes/dark.rb +14 -0
  424. data/lib/brut/tui/themes/light.rb +17 -0
  425. data/lib/brut/tui/themes/none.rb +9 -0
  426. data/lib/brut/tui/themes.rb +5 -0
  427. data/lib/brut/tui.rb +15 -0
  428. data/lib/brut/version.rb +1 -1
  429. data/lib/brut.rb +1 -0
  430. data/mkbrut/Gemfile.lock +1 -1
  431. data/mkbrut/lib/mkbrut/version.rb +1 -1
  432. data/specs/brut/tui/ansi_escape_code.spec.rb +30 -0
  433. data/specs/brut/tui/event_loop.spec.rb +70 -0
  434. data/specs/brut/tui/events/base_event.spec.rb +26 -0
  435. data/specs/brut/tui/events/event_bus.spec.rb +141 -0
  436. data/specs/brut/tui/events/exception.spec.rb +19 -0
  437. data/specs/brut/tui/events/test_event.rb +5 -0
  438. data/specs/spec_helper.rb +4 -0
  439. metadata +124 -15
  440. data/docs/assets/chunks/@localSearchIndexroot.BiNc3tFI.js +0 -1
  441. /data/docs/assets/{components.md.9sqJ27Oc.lean.js → components.md.Ber8UBM0.lean.js} +0 -0
  442. /data/docs/assets/{configuration.md.Cb_oAR8Z.lean.js → configuration.md.DrJ6YVoZ.lean.js} +0 -0
  443. /data/docs/assets/{getting-started.md.CKpNGvno.lean.js → getting-started.md.CGJ44juQ.lean.js} +0 -0
  444. /data/docs/assets/{tutorials_02-dialog.md.Z_DOF2mU.lean.js → tutorials_02-dialog.md.DE5WfCXI.lean.js} +0 -0
@@ -0,0 +1,141 @@
1
+ require "spec_helper"
2
+ require "brut/tui"
3
+ require_relative "test_event"
4
+
5
+ RSpec.describe Brut::TUI::Events::EventBus do
6
+ class OtherTestEvent < Brut::TUI::Events::BaseEvent
7
+ def self.handler_method_name
8
+ :on_other_test_event
9
+ end
10
+ end
11
+
12
+ class SubscriberToTestEvent
13
+ def notified = @notified
14
+ def notified_method = @notified_method
15
+ def on_test_event(event)
16
+ @notified = event
17
+ @notified_method = :on_test_event
18
+ end
19
+ end
20
+ class SubscriberToAnyEventOnly
21
+ def notified = @notified
22
+ def notified_method = @notified_method
23
+ def on_any_event(event)
24
+ @notified = event
25
+ @notified_method = :on_any_event
26
+ end
27
+ end
28
+ class SubscriberToTestEventAndAnyEvent
29
+ def notified = @notified
30
+ def notified_method = @notified_method
31
+ def on_test_event(event)
32
+ @notified = event
33
+ @notified_method = :on_test_event
34
+ end
35
+ def on_any_event(event)
36
+ @notified = event
37
+ @notified_method = :on_any_event
38
+ end
39
+ end
40
+
41
+ class RaisesErrorInTestEvent
42
+ def on_test_event(event)
43
+ raise "Error in on_test_event"
44
+ end
45
+ end
46
+
47
+ class RaisesErrorInAnyEvent
48
+ def on_any_event(event)
49
+ raise "Error in on_any_event"
50
+ end
51
+ end
52
+
53
+ subject(:event_bus) { described_class.new }
54
+
55
+ describe "#subscribe" do
56
+ context "subscriber implements the handler method" do
57
+ it "is notified" do
58
+ subscriber = SubscriberToTestEvent.new
59
+ event_bus.subscribe(SpecSupport::TestEvent, subscriber)
60
+ event = SpecSupport::TestEvent.new
61
+
62
+ errors = event_bus.notify(event)
63
+
64
+ expect(errors).to eq([])
65
+ expect(subscriber.notified).to eq(event)
66
+ expect(subscriber.notified_method).to eq(:on_test_event)
67
+ end
68
+ end
69
+ context "subscriber does not implement the handler method" do
70
+ it "is raises when subscribing" do
71
+ subscriber = SubscriberToAnyEventOnly.new
72
+ expect {
73
+ event_bus.subscribe(SpecSupport::TestEvent, subscriber)
74
+ }.to raise_error(ArgumentError, /does not implement handler method/)
75
+ end
76
+ end
77
+ end
78
+ describe "#subscribe_to_all" do
79
+ context "subscriber implements the handler method" do
80
+ it "is notified via that method" do
81
+ subscriber = SubscriberToTestEventAndAnyEvent.new
82
+ event_bus.subscribe_to_all(subscriber)
83
+ event = SpecSupport::TestEvent.new
84
+
85
+ errors = event_bus.notify(event)
86
+
87
+ expect(errors).to eq([])
88
+ expect(subscriber.notified).to eq(event)
89
+ expect(subscriber.notified_method).to eq(:on_test_event)
90
+ end
91
+ end
92
+ context "subscriber does not implement the handler method" do
93
+ context "subscriber implements on_any_event" do
94
+ it "calls on_any_event when notified" do
95
+ subscriber = SubscriberToAnyEventOnly.new
96
+ event_bus.subscribe_to_all(subscriber)
97
+ event = SpecSupport::TestEvent.new
98
+
99
+ errors = event_bus.notify(event)
100
+
101
+ expect(errors).to eq([])
102
+ expect(subscriber.notified).to eq(event)
103
+ expect(subscriber.notified_method).to eq(:on_any_event)
104
+ end
105
+ end
106
+ context "subscriber does not implement on_any_event" do
107
+ it "nothing happens" do
108
+ subscriber = SubscriberToTestEvent.new
109
+ event_bus.subscribe_to_all(subscriber)
110
+ event = OtherTestEvent.new
111
+
112
+ errors = event_bus.notify(event)
113
+
114
+ expect(errors).to eq([])
115
+ expect(subscriber.notified).to eq(nil)
116
+ expect(subscriber.notified_method).to eq(nil)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ describe "#notify" do
122
+
123
+ # some of this method's behavior is covered by the tests above
124
+
125
+ context "when subscribers raise errors" do
126
+ it "returns them as an array" do
127
+ event_bus.subscribe(SpecSupport::TestEvent, RaisesErrorInTestEvent.new)
128
+ event_bus.subscribe_to_all(RaisesErrorInAnyEvent.new)
129
+ event_bus.subscribe_to_all(SubscriberToAnyEventOnly.new)
130
+
131
+ event = SpecSupport::TestEvent.new
132
+
133
+ errors = event_bus.notify(event)
134
+
135
+ expect(errors.length).to eq(2)
136
+ expect(errors.map(&:message)).to include("Error in on_test_event")
137
+ expect(errors.map(&:message)).to include("Error in on_any_event")
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+ require "brut/tui"
3
+
4
+ RSpec.describe Brut::TUI::Events::Exception do
5
+
6
+ describe ":#exit?" do
7
+ it "is true" do
8
+ event = described_class.new(StandardError.new("Test exception"))
9
+ expect(event.exit?).to eq(true)
10
+ end
11
+ end
12
+ describe ":#drain_then_exit?" do
13
+ it "is false" do
14
+ event = described_class.new(StandardError.new("Test exception"))
15
+ expect(event.drain_then_exit?).to eq(false)
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,5 @@
1
+ module SpecSupport
2
+ class TestEvent < Brut::TUI::Events::BaseEvent
3
+ def self.handler_method_name = :on_test_event
4
+ end
5
+ end
data/specs/spec_helper.rb CHANGED
@@ -1,7 +1,11 @@
1
1
  require "brut"
2
+ require "confidence_check/for_rspec"
3
+
2
4
  require_relative "support"
3
5
 
4
6
  RSpec.configure do |config|
7
+ config.include ConfidenceCheck::ForRSpec
8
+
5
9
  config.expect_with :rspec do |expectations|
6
10
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
7
11
  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.16.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -247,6 +247,20 @@ dependencies:
247
247
  - - ">="
248
248
  - !ruby/object:Gem::Version
249
249
  version: '0'
250
+ - !ruby/object:Gem::Dependency
251
+ name: unicode-display_width
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ type: :runtime
258
+ prerelease: false
259
+ version_requirements: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
250
264
  - !ruby/object:Gem::Dependency
251
265
  name: activesupport
252
266
  requirement: !ruby/object:Gem::Requirement
@@ -275,6 +289,20 @@ dependencies:
275
289
  - - ">="
276
290
  - !ruby/object:Gem::Version
277
291
  version: '0'
292
+ - !ruby/object:Gem::Dependency
293
+ name: confidence-check
294
+ requirement: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ type: :development
300
+ prerelease: false
301
+ version_requirements: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - ">="
304
+ - !ruby/object:Gem::Version
305
+ version: '0'
278
306
  - !ruby/object:Gem::Dependency
279
307
  name: dotenv
280
308
  requirement: !ruby/object:Gem::Requirement
@@ -923,6 +951,44 @@ files:
923
951
  - docs/api/Brut/SpecSupport/RSpecSetup.html
924
952
  - docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html
925
953
  - docs/api/Brut/SpecSupport/SessionSupport.html
954
+ - docs/api/Brut/TUI.html
955
+ - docs/api/Brut/TUI/AnsiEscapeCode.html
956
+ - docs/api/Brut/TUI/AnsiEscapeCode/Mod.html
957
+ - docs/api/Brut/TUI/EventLoop.html
958
+ - docs/api/Brut/TUI/EventLoop/Deque.html
959
+ - docs/api/Brut/TUI/Events.html
960
+ - docs/api/Brut/TUI/Events/BaseEvent.html
961
+ - docs/api/Brut/TUI/Events/EventBus.html
962
+ - docs/api/Brut/TUI/Events/EventLoopStarted.html
963
+ - docs/api/Brut/TUI/Events/Exception.html
964
+ - docs/api/Brut/TUI/Events/Tick.html
965
+ - docs/api/Brut/TUI/MarkupString.html
966
+ - docs/api/Brut/TUI/Script.html
967
+ - docs/api/Brut/TUI/Script/BlockStep.html
968
+ - docs/api/Brut/TUI/Script/Events.html
969
+ - docs/api/Brut/TUI/Script/Events/CommandExecutionFailed.html
970
+ - docs/api/Brut/TUI/Script/Events/CommandExecutionSucceeded.html
971
+ - docs/api/Brut/TUI/Script/Events/CommandStdErr.html
972
+ - docs/api/Brut/TUI/Script/Events/CommandStdOut.html
973
+ - docs/api/Brut/TUI/Script/Events/ExecutingCommand.html
974
+ - docs/api/Brut/TUI/Script/Events/Message.html
975
+ - docs/api/Brut/TUI/Script/Events/PhaseCompleted.html
976
+ - docs/api/Brut/TUI/Script/Events/PhaseStarted.html
977
+ - docs/api/Brut/TUI/Script/Events/ScriptCompleted.html
978
+ - docs/api/Brut/TUI/Script/Events/ScriptStarted.html
979
+ - docs/api/Brut/TUI/Script/Events/StepCompleted.html
980
+ - docs/api/Brut/TUI/Script/Events/StepStarted.html
981
+ - docs/api/Brut/TUI/Script/ExecStep.html
982
+ - docs/api/Brut/TUI/Script/ExecStep/ProcessStatusFailed.html
983
+ - docs/api/Brut/TUI/Script/LoggingSubscriber.html
984
+ - docs/api/Brut/TUI/Script/PutsSubscriber.html
985
+ - docs/api/Brut/TUI/Script/Step.html
986
+ - docs/api/Brut/TUI/Terminal.html
987
+ - docs/api/Brut/TUI/TerminalTheme.html
988
+ - docs/api/Brut/TUI/Themes.html
989
+ - docs/api/Brut/TUI/Themes/Dark.html
990
+ - docs/api/Brut/TUI/Themes/Light.html
991
+ - docs/api/Brut/TUI/Themes/None.html
926
992
  - docs/api/Clock.html
927
993
  - docs/api/ModuleName.html
928
994
  - docs/api/RichString.html
@@ -939,6 +1005,7 @@ files:
939
1005
  - docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html
940
1006
  - docs/api/Sequel/Plugins/FindBang.html
941
1007
  - docs/api/Sequel/Plugins/FindBang/ClassMethods.html
1008
+ - docs/api/SpecSupport/Matchers/BeABug.html
942
1009
  - docs/api/_index.html
943
1010
  - docs/api/class_list.html
944
1011
  - docs/api/css/common.css
@@ -965,7 +1032,7 @@ files:
965
1032
  - docs/assets/adrs.md.YglbWtQe.lean.js
966
1033
  - docs/assets/ai.md.ChLnvDAX.js
967
1034
  - docs/assets/ai.md.ChLnvDAX.lean.js
968
- - docs/assets/app.CovevI7X.js
1035
+ - docs/assets/app.B8jAEB7R.js
969
1036
  - docs/assets/assets.md.BEF6Oz6K.js
970
1037
  - docs/assets/assets.md.BEF6Oz6K.lean.js
971
1038
  - docs/assets/basic-form-with-violations.Cv6Y9-Q_.png
@@ -974,16 +1041,16 @@ files:
974
1041
  - docs/assets/brut-js.md.BMz0X1Rz.lean.js
975
1042
  - docs/assets/business-logic.md.DbuaOYGU.js
976
1043
  - docs/assets/business-logic.md.DbuaOYGU.lean.js
977
- - docs/assets/chunks/@localSearchIndexroot.BiNc3tFI.js
978
- - docs/assets/chunks/VPLocalSearchBox.CrvLAvKW.js
1044
+ - docs/assets/chunks/@localSearchIndexroot.DJ8mocCj.js
1045
+ - docs/assets/chunks/VPLocalSearchBox.gF-Po_fz.js
979
1046
  - docs/assets/chunks/framework.C4nOkCZI.js
980
- - docs/assets/chunks/theme.BAi5_yQI.js
1047
+ - docs/assets/chunks/theme.BjPAOJkz.js
981
1048
  - docs/assets/cli.md.DDMar_51.js
982
1049
  - docs/assets/cli.md.DDMar_51.lean.js
983
- - docs/assets/components.md.9sqJ27Oc.js
984
- - docs/assets/components.md.9sqJ27Oc.lean.js
985
- - docs/assets/configuration.md.Cb_oAR8Z.js
986
- - docs/assets/configuration.md.Cb_oAR8Z.lean.js
1050
+ - docs/assets/components.md.Ber8UBM0.js
1051
+ - docs/assets/components.md.Ber8UBM0.lean.js
1052
+ - docs/assets/configuration.md.DrJ6YVoZ.js
1053
+ - docs/assets/configuration.md.DrJ6YVoZ.lean.js
987
1054
  - docs/assets/css.md.K5rOCOQY.js
988
1055
  - docs/assets/css.md.K5rOCOQY.lean.js
989
1056
  - docs/assets/custom-element-tests.md.DiLe-eFw.js
@@ -1009,10 +1076,10 @@ files:
1009
1076
  - docs/assets/flash-and-session.md.CUsMxoNl.lean.js
1010
1077
  - docs/assets/form-constraints.md.KlfXSKm2.js
1011
1078
  - docs/assets/form-constraints.md.KlfXSKm2.lean.js
1012
- - docs/assets/forms.md.BdpYpNIk.js
1013
- - docs/assets/forms.md.BdpYpNIk.lean.js
1014
- - docs/assets/getting-started.md.CKpNGvno.js
1015
- - docs/assets/getting-started.md.CKpNGvno.lean.js
1079
+ - docs/assets/forms.md.RK0zkhm0.js
1080
+ - docs/assets/forms.md.RK0zkhm0.lean.js
1081
+ - docs/assets/getting-started.md.CGJ44juQ.js
1082
+ - docs/assets/getting-started.md.CGJ44juQ.lean.js
1016
1083
  - docs/assets/handlers.md.C5tUwmmo.js
1017
1084
  - docs/assets/handlers.md.C5tUwmmo.lean.js
1018
1085
  - docs/assets/hooks.md.CoiYCKRc.js
@@ -1080,14 +1147,15 @@ files:
1080
1147
  - docs/assets/tutorial.md.BX6f6l00.lean.js
1081
1148
  - docs/assets/tutorials_01-intro.md.CzZ3kpF_.js
1082
1149
  - docs/assets/tutorials_01-intro.md.CzZ3kpF_.lean.js
1083
- - docs/assets/tutorials_02-dialog.md.Z_DOF2mU.js
1084
- - docs/assets/tutorials_02-dialog.md.Z_DOF2mU.lean.js
1150
+ - docs/assets/tutorials_02-dialog.md.DE5WfCXI.js
1151
+ - docs/assets/tutorials_02-dialog.md.DE5WfCXI.lean.js
1085
1152
  - docs/assets/unit-tests.md.vDsdBbO_.js
1086
1153
  - docs/assets/unit-tests.md.vDsdBbO_.lean.js
1087
1154
  - docs/assets/welcome-to-brut.VSWzl17-.png
1088
1155
  - docs/assets/why.md.4WpxdrQ2.js
1089
1156
  - docs/assets/why.md.4WpxdrQ2.lean.js
1090
1157
  - docs/assets/workspace-protocol.C0gXsoDb.png
1158
+ - docs/brut-css/brut.css
1091
1159
  - docs/brut-css/brut.max.css
1092
1160
  - docs/brut-css/classes/appearances.html
1093
1161
  - docs/brut-css/classes/background-colors.html
@@ -1383,6 +1451,41 @@ files:
1383
1451
  - lib/brut/spec_support/matchers/have_returned_rack_response.rb
1384
1452
  - lib/brut/spec_support/rspec_setup.rb
1385
1453
  - lib/brut/spec_support/session_support.rb
1454
+ - lib/brut/tui.rb
1455
+ - lib/brut/tui/ansi_escape_code.rb
1456
+ - lib/brut/tui/event_loop.rb
1457
+ - lib/brut/tui/events.rb
1458
+ - lib/brut/tui/events/base_event.rb
1459
+ - lib/brut/tui/events/event_bus.rb
1460
+ - lib/brut/tui/events/event_loop_started.rb
1461
+ - lib/brut/tui/events/exception.rb
1462
+ - lib/brut/tui/events/tick.rb
1463
+ - lib/brut/tui/markup_string.rb
1464
+ - lib/brut/tui/script.rb
1465
+ - lib/brut/tui/script/block_step.rb
1466
+ - lib/brut/tui/script/events.rb
1467
+ - lib/brut/tui/script/events/command_execution_failed.rb
1468
+ - lib/brut/tui/script/events/command_execution_succeeded.rb
1469
+ - lib/brut/tui/script/events/command_std_err.rb
1470
+ - lib/brut/tui/script/events/command_std_out.rb
1471
+ - lib/brut/tui/script/events/executing_command.rb
1472
+ - lib/brut/tui/script/events/message.rb
1473
+ - lib/brut/tui/script/events/phase_completed.rb
1474
+ - lib/brut/tui/script/events/phase_started.rb
1475
+ - lib/brut/tui/script/events/script_completed.rb
1476
+ - lib/brut/tui/script/events/script_started.rb
1477
+ - lib/brut/tui/script/events/step_completed.rb
1478
+ - lib/brut/tui/script/events/step_started.rb
1479
+ - lib/brut/tui/script/exec_step.rb
1480
+ - lib/brut/tui/script/logging_subscriber.rb
1481
+ - lib/brut/tui/script/puts_subscriber.rb
1482
+ - lib/brut/tui/script/step.rb
1483
+ - lib/brut/tui/terminal.rb
1484
+ - lib/brut/tui/terminal_theme.rb
1485
+ - lib/brut/tui/themes.rb
1486
+ - lib/brut/tui/themes/dark.rb
1487
+ - lib/brut/tui/themes/light.rb
1488
+ - lib/brut/tui/themes/none.rb
1386
1489
  - lib/brut/version.rb
1387
1490
  - lib/sequel/extensions/brut_instrumentation.rb
1388
1491
  - lib/sequel/extensions/brut_migrations.rb
@@ -1565,6 +1668,12 @@ files:
1565
1668
  - specs/brut/front_end/forms/select_input.spec.rb
1566
1669
  - specs/brut/instrumentation/methods.spec.rb
1567
1670
  - specs/brut/junk_drawer.spec.rb
1671
+ - specs/brut/tui/ansi_escape_code.spec.rb
1672
+ - specs/brut/tui/event_loop.spec.rb
1673
+ - specs/brut/tui/events/base_event.spec.rb
1674
+ - specs/brut/tui/events/event_bus.spec.rb
1675
+ - specs/brut/tui/events/exception.spec.rb
1676
+ - specs/brut/tui/events/test_event.rb
1568
1677
  - specs/spec_helper.rb
1569
1678
  - specs/support.rb
1570
1679
  - specs/support/matchers.rb