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,676 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Class: Brut::TUI::EventLoop
8
+
9
+ &mdash; Documentation by YARD 0.9.37
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../../css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="../../css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "Brut::TUI::EventLoop";
19
+ relpath = '../../';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="../../js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="../../js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="../../class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="../../_index.html">Index (E)</a> &raquo;
40
+ <span class='title'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../TUI.html" title="Brut::TUI (module)">TUI</a></span></span>
41
+ &raquo;
42
+ <span class="title">EventLoop</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="../../class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Class: Brut::TUI::EventLoop
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+ <dl>
70
+ <dt>Inherits:</dt>
71
+ <dd>
72
+ <span class="inheritName">Object</span>
73
+
74
+ <ul class="fullTree">
75
+ <li>Object</li>
76
+
77
+ <li class="next">Brut::TUI::EventLoop</li>
78
+
79
+ </ul>
80
+ <a href="#" class="inheritanceTree">show all</a>
81
+
82
+ </dd>
83
+ </dl>
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ <dl>
96
+ <dt>Defined in:</dt>
97
+ <dd>lib/brut/tui/event_loop.rb</dd>
98
+ </dl>
99
+
100
+ </div>
101
+
102
+ <h2>Overview</h2><div class="docstring">
103
+ <div class="discussion">
104
+ <p>An event loop used to power any TUI, including those that just print
105
+ out messages. This is intended to be used across multiple threads, with this running on the "main" thread
106
+ that is allowed to write to the screen.</p>
107
+
108
+
109
+ </div>
110
+ </div>
111
+ <div class="tags">
112
+
113
+
114
+ </div>
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+ <h2>
123
+ Instance Method Summary
124
+ <small><a href="#" class="summary_toggle">collapse</a></small>
125
+ </h2>
126
+
127
+ <ul class="summary">
128
+
129
+ <li class="public ">
130
+ <span class="summary_signature">
131
+
132
+ <a href="#<<-instance_method" title="#&lt;&lt; (instance method)">#<strong>&lt;&lt;</strong>(event) &#x21d2; Object </a>
133
+
134
+
135
+
136
+ </span>
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+ <span class="summary_desc"><div class='inline'><p>Queue an event for later processing.</p>
147
+ </div></span>
148
+
149
+ </li>
150
+
151
+
152
+ <li class="public ">
153
+ <span class="summary_signature">
154
+
155
+ <a href="#initialize-instance_method" title="#initialize (instance method)">#<strong>initialize</strong>(tick: true) &#x21d2; EventLoop </a>
156
+
157
+
158
+
159
+ </span>
160
+
161
+
162
+ <span class="note title constructor">constructor</span>
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+ <span class="summary_desc"><div class='inline'><p>Create a new EventLoop.</p>
172
+ </div></span>
173
+
174
+ </li>
175
+
176
+
177
+ <li class="public ">
178
+ <span class="summary_signature">
179
+
180
+ <a href="#run-instance_method" title="#run (instance method)">#<strong>run</strong> &#x21d2; Object </a>
181
+
182
+
183
+
184
+ </span>
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+ <span class="summary_desc"><div class='inline'><p>Start the event loop.</p>
195
+ </div></span>
196
+
197
+ </li>
198
+
199
+
200
+ <li class="public ">
201
+ <span class="summary_signature">
202
+
203
+ <a href="#subscribe-instance_method" title="#subscribe (instance method)">#<strong>subscribe</strong>(event_class, subscriber) &#x21d2; Object </a>
204
+
205
+
206
+
207
+ </span>
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+ <span class="summary_desc"><div class='inline'><p>Subscribe to a specific event.</p>
218
+ </div></span>
219
+
220
+ </li>
221
+
222
+
223
+ <li class="public ">
224
+ <span class="summary_signature">
225
+
226
+ <a href="#subscribe_to_all-instance_method" title="#subscribe_to_all (instance method)">#<strong>subscribe_to_all</strong>(subscriber) &#x21d2; Object </a>
227
+
228
+
229
+
230
+ </span>
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+ <span class="summary_desc"><div class='inline'><p>Subscribe to all events.</p>
241
+ </div></span>
242
+
243
+ </li>
244
+
245
+
246
+ </ul>
247
+
248
+
249
+ <div id="constructor_details" class="method_details_list">
250
+ <h2>Constructor Details</h2>
251
+
252
+ <div class="method_details first">
253
+ <h3 class="signature first" id="initialize-instance_method">
254
+
255
+ #<strong>initialize</strong>(tick: true) &#x21d2; <tt><span class='object_link'><a href="" title="Brut::TUI::EventLoop (class)">EventLoop</a></span></tt>
256
+
257
+
258
+
259
+
260
+
261
+ </h3><div class="docstring">
262
+ <div class="discussion">
263
+ <p>Create a new EventLoop.</p>
264
+
265
+
266
+ </div>
267
+ </div>
268
+ <div class="tags">
269
+ <p class="tag_title">Parameters:</p>
270
+ <ul class="param">
271
+
272
+ <li>
273
+
274
+ <span class='name'>tick</span>
275
+
276
+
277
+ <span class='type'>(<tt>true|false</tt>)</span>
278
+
279
+
280
+ <em class="default">(defaults to: <tt>true</tt>)</em>
281
+
282
+
283
+ &mdash;
284
+ <div class='inline'><p>if true, a "tick" event is fired every 50ms to allow progress spinners to animate.</p>
285
+ </div>
286
+
287
+ </li>
288
+
289
+ </ul>
290
+
291
+
292
+ </div><table class="source_code">
293
+ <tr>
294
+ <td>
295
+ <pre class="lines">
296
+
297
+
298
+ 9
299
+ 10
300
+ 11
301
+ 12
302
+ 13
303
+ 14
304
+ 15
305
+ 16
306
+ 17</pre>
307
+ </td>
308
+ <td>
309
+ <pre class="code"><span class="info file"># File 'lib/brut/tui/event_loop.rb', line 9</span>
310
+
311
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='label'>tick:</span> <span class='kw'>true</span><span class='rparen'>)</span>
312
+
313
+ <span class='ivar'>@queue</span> <span class='op'>=</span> <span class='const'>Deque</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
314
+
315
+ <span class='ivar'>@queue</span> <span class='op'>&lt;&lt;</span> <span class='const'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../TUI.html" title="Brut::TUI (module)">TUI</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Events.html" title="Brut::TUI::Events (class)">Events</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Events/EventLoopStarted.html" title="Brut::TUI::Events::EventLoopStarted (class)">EventLoopStarted</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
316
+
317
+ <span class='ivar'>@event_bus</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../TUI.html" title="Brut::TUI (module)">TUI</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Events.html" title="Brut::TUI::Events (class)">Events</a></span></span><span class='op'>::</span><span class='const'>EventBus</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
318
+ <span class='ivar'>@tick</span> <span class='op'>=</span> <span class='id identifier rubyid_tick'>tick</span>
319
+ <span class='kw'>end</span></pre>
320
+ </td>
321
+ </tr>
322
+ </table>
323
+ </div>
324
+
325
+ </div>
326
+
327
+
328
+ <div id="instance_method_details" class="method_details_list">
329
+ <h2>Instance Method Details</h2>
330
+
331
+
332
+ <div class="method_details first">
333
+ <h3 class="signature first" id="<<-instance_method">
334
+
335
+ #<strong>&lt;&lt;</strong>(event) &#x21d2; <tt>Object</tt>
336
+
337
+
338
+
339
+
340
+
341
+ </h3><div class="docstring">
342
+ <div class="discussion">
343
+ <p>Queue an event for later processing. This is safe to do from another thread.</p>
344
+
345
+
346
+ </div>
347
+ </div>
348
+ <div class="tags">
349
+ <p class="tag_title">Parameters:</p>
350
+ <ul class="param">
351
+
352
+ <li>
353
+
354
+ <span class='name'>event</span>
355
+
356
+
357
+ <span class='type'>(<tt><span class='object_link'><a href="Events/BaseEvent.html" title="Brut::TUI::Events::BaseEvent (class)">Brut::TUI::Events::BaseEvent</a></span></tt>)</span>
358
+
359
+
360
+
361
+ &mdash;
362
+ <div class='inline'><p>the event to queue.</p>
363
+ </div>
364
+
365
+ </li>
366
+
367
+ </ul>
368
+
369
+
370
+ </div><table class="source_code">
371
+ <tr>
372
+ <td>
373
+ <pre class="lines">
374
+
375
+
376
+ 22
377
+ 23
378
+ 24</pre>
379
+ </td>
380
+ <td>
381
+ <pre class="code"><span class="info file"># File 'lib/brut/tui/event_loop.rb', line 22</span>
382
+
383
+ <span class='kw'>def</span> <span class='op'>&lt;&lt;</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
384
+ <span class='ivar'>@queue</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_event'>event</span>
385
+ <span class='kw'>end</span></pre>
386
+ </td>
387
+ </tr>
388
+ </table>
389
+ </div>
390
+
391
+ <div class="method_details ">
392
+ <h3 class="signature " id="run-instance_method">
393
+
394
+ #<strong>run</strong> &#x21d2; <tt>Object</tt>
395
+
396
+
397
+
398
+
399
+
400
+ </h3><div class="docstring">
401
+ <div class="discussion">
402
+ <p>Start the event loop. Don't call this more than once. It will block and continue running
403
+ until an event is received that returns true for <span class='object_link'><a href="Events/BaseEvent.html#exit%3F-instance_method" title="Brut::TUI::Events::BaseEvent#exit? (method)">Brut::TUI::Events::BaseEvent#exit?</a></span>
404
+ or <span class='object_link'><a href="Events/BaseEvent.html#drain_then_exit%3F-instance_method" title="Brut::TUI::Events::BaseEvent#drain_then_exit? (method)">Brut::TUI::Events::BaseEvent#drain_then_exit?</a></span>.</p>
405
+
406
+ <p>If <span class='object_link'><a href="Events/BaseEvent.html#exit%3F-instance_method" title="Brut::TUI::Events::BaseEvent#exit? (method)">Brut::TUI::Events::BaseEvent#exit?</a></span> returns true, the loop is exited and any events left
407
+ in the queue are unprocessed, essentially ignored/discarded.</p>
408
+
409
+ <p>If <span class='object_link'><a href="Events/BaseEvent.html#drain_then_exit%3F-instance_method" title="Brut::TUI::Events::BaseEvent#drain_then_exit? (method)">Brut::TUI::Events::BaseEvent#drain_then_exit?</a></span>
410
+ returns true, anything currently in the queue is processed before exiting. If any subscriber adds events to the queue
411
+ they will not be processed. If no event handler produces errors, the CLI should exit cleanly. If, however, any
412
+ of the event handlers themselves produce errors, those errors will be handled, but the script will exit nonzero.</p>
413
+
414
+
415
+ </div>
416
+ </div>
417
+ <div class="tags">
418
+
419
+
420
+ </div><table class="source_code">
421
+ <tr>
422
+ <td>
423
+ <pre class="lines">
424
+
425
+
426
+ 67
427
+ 68
428
+ 69
429
+ 70
430
+ 71
431
+ 72
432
+ 73
433
+ 74
434
+ 75
435
+ 76
436
+ 77
437
+ 78
438
+ 79
439
+ 80
440
+ 81
441
+ 82
442
+ 83
443
+ 84
444
+ 85
445
+ 86
446
+ 87
447
+ 88
448
+ 89
449
+ 90
450
+ 91
451
+ 92
452
+ 93
453
+ 94
454
+ 95
455
+ 96
456
+ 97
457
+ 98
458
+ 99
459
+ 100
460
+ 101
461
+ 102
462
+ 103
463
+ 104
464
+ 105</pre>
465
+ </td>
466
+ <td>
467
+ <pre class="code"><span class="info file"># File 'lib/brut/tui/event_loop.rb', line 67</span>
468
+
469
+ <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
470
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop: starting</span><span class='tstring_end'>&quot;</span></span>
471
+ <span class='id identifier rubyid_start'>start</span> <span class='op'>=</span> <span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_now'>now</span>
472
+ <span class='id identifier rubyid_loop'>loop</span> <span class='kw'>do</span>
473
+ <span class='id identifier rubyid_event'>event</span> <span class='op'>=</span> <span class='ivar'>@queue</span><span class='period'>.</span><span class='id identifier rubyid_pop'>pop</span><span class='lparen'>(</span><span class='label'>timeout:</span> <span class='float'>0.05</span><span class='rparen'>)</span>
474
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop: got event </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'>\n </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
475
+ <span class='kw'>if</span> <span class='id identifier rubyid_event'>event</span>
476
+ <span class='id identifier rubyid_errors'>errors</span> <span class='op'>=</span> <span class='ivar'>@event_bus</span><span class='period'>.</span><span class='id identifier rubyid_notify'>notify</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
477
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop: notified subscribers of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'>, got </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_errors'>errors</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span><span class='embexpr_end'>}</span><span class='tstring_content'> errors</span><span class='tstring_end'>&quot;</span></span>
478
+
479
+ <span class='comment'># future screen rendering here
480
+ </span>
481
+ <span class='id identifier rubyid_handle_errors_from_notify'>handle_errors_from_notify</span><span class='lparen'>(</span><span class='id identifier rubyid_errors'>errors</span><span class='rparen'>)</span>
482
+
483
+ <span class='kw'>if</span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_drain_then_exit?'>drain_then_exit?</span>
484
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop: exiting</span><span class='tstring_end'>&quot;</span></span>
485
+ <span class='id identifier rubyid_all_errors'>all_errors</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
486
+ <span class='ivar'>@queue</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span><span class='period'>.</span><span class='id identifier rubyid_times'>times</span> <span class='kw'>do</span>
487
+ <span class='id identifier rubyid_event'>event</span> <span class='op'>=</span> <span class='ivar'>@queue</span><span class='period'>.</span><span class='id identifier rubyid_pop'>pop</span><span class='lparen'>(</span><span class='label'>timeout:</span> <span class='float'>0.05</span><span class='rparen'>)</span>
488
+ <span class='kw'>if</span> <span class='id identifier rubyid_event'>event</span>
489
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop (exiting): got event </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'>\n </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
490
+ <span class='id identifier rubyid_errors'>errors</span> <span class='op'>=</span> <span class='ivar'>@event_bus</span><span class='period'>.</span><span class='id identifier rubyid_notify'>notify</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
491
+ <span class='id identifier rubyid_all_errors'>all_errors</span> <span class='op'>=</span> <span class='id identifier rubyid_all_errors'>all_errors</span> <span class='op'>+</span> <span class='id identifier rubyid_errors'>errors</span>
492
+ <span class='comment'># future screen rendering here
493
+ </span> <span class='kw'>end</span>
494
+ <span class='kw'>end</span>
495
+ <span class='id identifier rubyid_handle_errors_from_notify'>handle_errors_from_notify</span><span class='lparen'>(</span><span class='id identifier rubyid_all_errors'>all_errors</span><span class='comma'>,</span> <span class='label'>immediate:</span> <span class='kw'>true</span><span class='rparen'>)</span>
496
+ <span class='kw'>break</span>
497
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_exit?'>exit?</span>
498
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>EventLoop: exiting</span><span class='tstring_end'>&quot;</span></span>
499
+ <span class='kw'>break</span>
500
+ <span class='kw'>end</span>
501
+ <span class='kw'>end</span>
502
+ <span class='kw'>if</span> <span class='ivar'>@tick</span>
503
+ <span class='id identifier rubyid_errors'>errors</span> <span class='op'>=</span> <span class='ivar'>@event_bus</span><span class='period'>.</span><span class='id identifier rubyid_notify'>notify</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../TUI.html" title="Brut::TUI (module)">TUI</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Events.html" title="Brut::TUI::Events (class)">Events</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Events/Tick.html" title="Brut::TUI::Events::Tick (class)">Tick</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Events/Tick.html#initialize-instance_method" title="Brut::TUI::Events::Tick#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_now'>now</span> <span class='op'>-</span> <span class='id identifier rubyid_start'>start</span><span class='rparen'>)</span><span class='rparen'>)</span>
504
+ <span class='id identifier rubyid_handle_errors_from_notify'>handle_errors_from_notify</span><span class='lparen'>(</span><span class='id identifier rubyid_errors'>errors</span><span class='rparen'>)</span>
505
+ <span class='kw'>end</span>
506
+ <span class='kw'>end</span>
507
+ <span class='kw'>end</span></pre>
508
+ </td>
509
+ </tr>
510
+ </table>
511
+ </div>
512
+
513
+ <div class="method_details ">
514
+ <h3 class="signature " id="subscribe-instance_method">
515
+
516
+ #<strong>subscribe</strong>(event_class, subscriber) &#x21d2; <tt>Object</tt>
517
+
518
+
519
+
520
+
521
+
522
+ </h3><div class="docstring">
523
+ <div class="discussion">
524
+ <p>Subscribe to a specific event. This requires that <code>subscriber</code> implement the handler method
525
+ exposed by <span class='object_link'><a href="Events/BaseEvent.html#handler_method_name-class_method" title="Brut::TUI::Events::BaseEvent.handler_method_name (method)">Brut::TUI::Events::BaseEvent.handler_method_name</a></span>. The method's arguments must be
526
+ one of three forms:</p>
527
+
528
+ <ul>
529
+ <li>no-args (or a single <code>:rest</code> arg, like <code>(*)</code>) - the method is called when the event occurs, no arguments are passed, thus no information about the event is available.</li>
530
+ <li>single required arg (e.g. <code>(event)</code>) - the event instance is passed.</li>
531
+ <li>keyword args (e.g. <code>(description:, command:)</code>) - the event is splatted via <code>deconstruct_keys</code> and passed in for any keyword arg. If
532
+ required keyword args aren't available from the event, an exception is raised. If optional keyword args aren't available from the event,
533
+ their default values are provided. Each event should document what keyword args are available.</li>
534
+ </ul>
535
+
536
+
537
+ <p>In all cases, if the method raises an exception, it is captured and sent as a <span class='object_link'><a href="Events/Exception.html" title="Brut::TUI::Events::Exception (class)">Brut::TUI::Events::Exception</a></span> event, potentially to be
538
+ handled by other subscribers. See <code>#run</code> for how this interacts with the loop.</p>
539
+
540
+
541
+ </div>
542
+ </div>
543
+ <div class="tags">
544
+ <p class="tag_title">Parameters:</p>
545
+ <ul class="param">
546
+
547
+ <li>
548
+
549
+ <span class='name'>event_class</span>
550
+
551
+
552
+ <span class='type'>(<tt>Class</tt>)</span>
553
+
554
+
555
+
556
+ &mdash;
557
+ <div class='inline'><p>the event <code>subscriber</code> should be notified about. This should be a subclass of <span class='object_link'><a href="Events/BaseEvent.html" title="Brut::TUI::Events::BaseEvent (class)">Brut::TUI::Events::BaseEvent</a></span>.</p>
558
+ </div>
559
+
560
+ </li>
561
+
562
+ <li>
563
+
564
+ <span class='name'>subscriber</span>
565
+
566
+
567
+ <span class='type'>(<tt>Object</tt>)</span>
568
+
569
+
570
+
571
+ &mdash;
572
+ <div class='inline'><p>object to be notified about the given event.</p>
573
+ </div>
574
+
575
+ </li>
576
+
577
+ </ul>
578
+
579
+
580
+ </div><table class="source_code">
581
+ <tr>
582
+ <td>
583
+ <pre class="lines">
584
+
585
+
586
+ 41
587
+ 42
588
+ 43</pre>
589
+ </td>
590
+ <td>
591
+ <pre class="code"><span class="info file"># File 'lib/brut/tui/event_loop.rb', line 41</span>
592
+
593
+ <span class='kw'>def</span> <span class='id identifier rubyid_subscribe'>subscribe</span><span class='lparen'>(</span><span class='id identifier rubyid_event_class'>event_class</span><span class='comma'>,</span> <span class='id identifier rubyid_subscriber'>subscriber</span><span class='rparen'>)</span>
594
+ <span class='ivar'>@event_bus</span><span class='period'>.</span><span class='id identifier rubyid_subscribe'>subscribe</span><span class='lparen'>(</span><span class='id identifier rubyid_event_class'>event_class</span><span class='comma'>,</span> <span class='id identifier rubyid_subscriber'>subscriber</span><span class='rparen'>)</span>
595
+ <span class='kw'>end</span></pre>
596
+ </td>
597
+ </tr>
598
+ </table>
599
+ </div>
600
+
601
+ <div class="method_details ">
602
+ <h3 class="signature " id="subscribe_to_all-instance_method">
603
+
604
+ #<strong>subscribe_to_all</strong>(subscriber) &#x21d2; <tt>Object</tt>
605
+
606
+
607
+
608
+
609
+
610
+ </h3><div class="docstring">
611
+ <div class="discussion">
612
+ <p>Subscribe to all events. <code>subscriber</code> will only be notified if it
613
+ implements an event's <span class='object_link'><a href="Events/BaseEvent.html#handler_method_name-class_method" title="Brut::TUI::Events::BaseEvent.handler_method_name (method)">Brut::TUI::Events::BaseEvent.handler_method_name</a></span> <em>or</em> if the subscriber implements
614
+ <code>on_any_event</code>. If both are implemented, only the more specific method is called. See <code>#subscribe</code> for a description of
615
+ how the method is invoked. If a specific method is not provided, <code>on_any_event</code> is invoked with
616
+ the event instance. There is no keyword splatting in this case.</p>
617
+
618
+
619
+ </div>
620
+ </div>
621
+ <div class="tags">
622
+ <p class="tag_title">Parameters:</p>
623
+ <ul class="param">
624
+
625
+ <li>
626
+
627
+ <span class='name'>subscriber</span>
628
+
629
+
630
+ <span class='type'>(<tt>Object</tt>)</span>
631
+
632
+
633
+
634
+ &mdash;
635
+ <div class='inline'><p>object to be notified about the given event.</p>
636
+ </div>
637
+
638
+ </li>
639
+
640
+ </ul>
641
+
642
+
643
+ </div><table class="source_code">
644
+ <tr>
645
+ <td>
646
+ <pre class="lines">
647
+
648
+
649
+ 52
650
+ 53
651
+ 54</pre>
652
+ </td>
653
+ <td>
654
+ <pre class="code"><span class="info file"># File 'lib/brut/tui/event_loop.rb', line 52</span>
655
+
656
+ <span class='kw'>def</span> <span class='id identifier rubyid_subscribe_to_all'>subscribe_to_all</span><span class='lparen'>(</span><span class='id identifier rubyid_subscriber'>subscriber</span><span class='rparen'>)</span>
657
+ <span class='ivar'>@event_bus</span><span class='period'>.</span><span class='id identifier rubyid_subscribe_to_all'>subscribe_to_all</span><span class='lparen'>(</span><span class='id identifier rubyid_subscriber'>subscriber</span><span class='rparen'>)</span>
658
+ <span class='kw'>end</span></pre>
659
+ </td>
660
+ </tr>
661
+ </table>
662
+ </div>
663
+
664
+ </div>
665
+
666
+ </div>
667
+
668
+ <div id="footer">
669
+ Generated on Sun Nov 30 20:50:11 2025 by
670
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
671
+ 0.9.37 (ruby-3.4.6).
672
+ </div>
673
+
674
+ </div>
675
+ </body>
676
+ </html>