brut 0.16.0.pre.pre → 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.
- checksums.yaml +4 -4
- data/.gitignore +6 -0
- data/CHANGELOG.md +9 -3
- data/Gemfile.lock +44 -34
- data/bin/docs +7 -0
- data/brut-css/package-lock.json +2 -2
- data/brut-css/package.json +1 -1
- data/brut-js/package-lock.json +311 -2
- data/brut-js/package.json +2 -1
- data/brut.gemspec +2 -0
- data/brutrb.com/jobs.md +1 -1
- data/docs/404.html +2 -2
- data/docs/adrs.html +4 -4
- data/docs/ai.html +4 -4
- data/docs/api/Brut/BackEnd/SeedData.html +2 -2
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +2 -2
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +2 -2
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +2 -2
- data/docs/api/Brut/BackEnd/Sidekiq.html +2 -2
- data/docs/api/Brut/BackEnd/Validators/FormValidator.html +2 -2
- data/docs/api/Brut/BackEnd/Validators.html +2 -2
- data/docs/api/Brut/BackEnd.html +2 -2
- data/docs/api/Brut/CLI/App.html +2 -2
- data/docs/api/Brut/CLI/AppRunner.html +2 -2
- data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +2 -2
- data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +2 -2
- data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +3 -3
- data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +2 -2
- data/docs/api/Brut/CLI/Apps/BuildAssets.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Create.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Drop.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Migrate.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Seed.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB/Status.html +2 -2
- data/docs/api/Brut/CLI/Apps/DB.html +2 -2
- data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +2 -2
- data/docs/api/Brut/CLI/Apps/DeployBase.html +2 -2
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +8 -6
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
- data/docs/api/Brut/CLI/Apps/Test/Audit.html +15 -7
- data/docs/api/Brut/CLI/Apps/Test/E2e.html +2 -2
- data/docs/api/Brut/CLI/Apps/Test/JS.html +2 -2
- data/docs/api/Brut/CLI/Apps/Test/Run.html +2 -2
- data/docs/api/Brut/CLI/Apps/Test.html +2 -2
- data/docs/api/Brut/CLI/Apps.html +2 -2
- data/docs/api/Brut/CLI/Command.html +2 -2
- data/docs/api/Brut/CLI/Error.html +2 -2
- data/docs/api/Brut/CLI/ExecutionResults/Result.html +2 -2
- data/docs/api/Brut/CLI/ExecutionResults.html +2 -2
- data/docs/api/Brut/CLI/Executor.html +2 -2
- data/docs/api/Brut/CLI/InvalidOption.html +2 -2
- data/docs/api/Brut/CLI/Options.html +2 -2
- data/docs/api/Brut/CLI/Output.html +2 -2
- data/docs/api/Brut/CLI/SystemExecError.html +2 -2
- data/docs/api/Brut/CLI.html +2 -2
- data/docs/api/Brut/FactoryBot.html +2 -2
- data/docs/api/Brut/Framework/App.html +2 -2
- data/docs/api/Brut/Framework/Config.html +2 -2
- data/docs/api/Brut/Framework/Container.html +11 -7
- data/docs/api/Brut/Framework/Error.html +2 -2
- data/docs/api/Brut/Framework/Errors/AbstractMethod.html +2 -2
- data/docs/api/Brut/Framework/Errors/Bug.html +2 -2
- data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +2 -2
- data/docs/api/Brut/Framework/Errors/MissingParameter.html +2 -2
- data/docs/api/Brut/Framework/Errors/NoClassForPath.html +2 -2
- data/docs/api/Brut/Framework/Errors/NotFound.html +2 -2
- data/docs/api/Brut/Framework/Errors/NotImplemented.html +2 -2
- data/docs/api/Brut/Framework/Errors.html +2 -2
- data/docs/api/Brut/Framework/FussyTypeEnforcement.html +2 -2
- data/docs/api/Brut/Framework/MCP.html +3 -3
- data/docs/api/Brut/Framework/ProjectEnvironment.html +2 -2
- data/docs/api/Brut/Framework.html +2 -2
- data/docs/api/Brut/FrontEnd/AssetPathResolver.html +2 -2
- data/docs/api/Brut/FrontEnd/Component/Helpers.html +2 -2
- data/docs/api/Brut/FrontEnd/Component.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/FormTag.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Input.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/TimeTag.html +2 -2
- data/docs/api/Brut/FrontEnd/Components/Traceparent.html +2 -2
- data/docs/api/Brut/FrontEnd/Components.html +2 -2
- data/docs/api/Brut/FrontEnd/CsrfProtector.html +2 -2
- data/docs/api/Brut/FrontEnd/Download.html +2 -2
- data/docs/api/Brut/FrontEnd/Flash.html +2 -2
- data/docs/api/Brut/FrontEnd/Form.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/Button.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/Input.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +2 -2
- data/docs/api/Brut/FrontEnd/Forms.html +2 -2
- data/docs/api/Brut/FrontEnd/GenericResponse.html +2 -2
- data/docs/api/Brut/FrontEnd/Handler.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +2 -2
- data/docs/api/Brut/FrontEnd/Handlers.html +2 -2
- data/docs/api/Brut/FrontEnd/HandlingResults.html +2 -2
- data/docs/api/Brut/FrontEnd/HttpMethod.html +2 -2
- data/docs/api/Brut/FrontEnd/HttpStatus.html +2 -2
- data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +2 -2
- data/docs/api/Brut/FrontEnd/Layout.html +2 -2
- data/docs/api/Brut/FrontEnd/Middleware.html +2 -2
- data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +2 -2
- data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +2 -2
- data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +2 -2
- data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +2 -2
- data/docs/api/Brut/FrontEnd/Middlewares.html +2 -2
- data/docs/api/Brut/FrontEnd/Page.html +2 -2
- data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
- data/docs/api/Brut/FrontEnd/Pages.html +2 -2
- data/docs/api/Brut/FrontEnd/RequestContext.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHook.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +2 -2
- data/docs/api/Brut/FrontEnd/RouteHooks.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing/Route.html +2 -2
- data/docs/api/Brut/FrontEnd/Routing.html +2 -2
- data/docs/api/Brut/FrontEnd/Session.html +2 -2
- data/docs/api/Brut/FrontEnd.html +2 -2
- data/docs/api/Brut/I18n/BaseMethods.html +2 -2
- data/docs/api/Brut/I18n/ForBackEnd.html +2 -2
- data/docs/api/Brut/I18n/ForCLI.html +2 -2
- data/docs/api/Brut/I18n/ForHTML.html +2 -2
- data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +2 -2
- data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +2 -2
- data/docs/api/Brut/I18n.html +2 -2
- data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +2 -2
- data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +2 -2
- data/docs/api/Brut/Instrumentation/Methods.html +2 -2
- data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +2 -2
- data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +2 -2
- data/docs/api/Brut/Instrumentation/OpenTelemetry.html +2 -2
- data/docs/api/Brut/Instrumentation.html +2 -2
- data/docs/api/Brut/RubocopConfig.html +2 -2
- data/docs/api/Brut/SinatraHelpers/ClassMethods.html +2 -2
- data/docs/api/Brut/SinatraHelpers.html +2 -2
- data/docs/api/Brut/SpecSupport/ClockSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/ComponentSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/E2ETestServer.html +2 -2
- data/docs/api/Brut/SpecSupport/E2eSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/EnhancedNode.html +2 -2
- data/docs/api/Brut/SpecSupport/FlashSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +2 -2
- data/docs/api/Brut/SpecSupport/GeneralSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/HandlerSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +2 -2
- data/docs/api/Brut/SpecSupport/Matchers.html +2 -2
- data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +2 -2
- data/docs/api/Brut/SpecSupport/RSpecSetup.html +2 -2
- data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
- data/docs/api/Brut/SpecSupport.html +2 -2
- data/docs/api/Brut/TUI/AnsiEscapeCode/Mod.html +409 -0
- data/docs/api/Brut/TUI/AnsiEscapeCode.html +426 -0
- data/docs/api/Brut/TUI/EventLoop/Deque.html +531 -0
- data/docs/api/Brut/TUI/EventLoop.html +676 -0
- data/docs/api/Brut/TUI/Events/BaseEvent.html +449 -0
- data/docs/api/Brut/TUI/Events/EventBus.html +485 -0
- data/docs/api/Brut/TUI/Events/EventLoopStarted.html +211 -0
- data/docs/api/Brut/TUI/Events/Exception.html +523 -0
- data/docs/api/Brut/TUI/Events/Tick.html +294 -0
- data/docs/api/Brut/TUI/Events.html +131 -0
- data/docs/api/Brut/TUI/MarkupString.html +537 -0
- data/docs/api/Brut/TUI/Script/BlockStep.html +300 -0
- data/docs/api/Brut/TUI/Script/Events/CommandExecutionFailed.html +252 -0
- data/docs/api/Brut/TUI/Script/Events/CommandExecutionSucceeded.html +163 -0
- data/docs/api/Brut/TUI/Script/Events/CommandStdErr.html +163 -0
- data/docs/api/Brut/TUI/Script/Events/CommandStdOut.html +300 -0
- data/docs/api/Brut/TUI/Script/Events/ExecutingCommand.html +298 -0
- data/docs/api/Brut/TUI/Script/Events/Message.html +345 -0
- data/docs/api/Brut/TUI/Script/Events/PhaseCompleted.html +229 -0
- data/docs/api/Brut/TUI/Script/Events/PhaseStarted.html +350 -0
- data/docs/api/Brut/TUI/Script/Events/ScriptCompleted.html +282 -0
- data/docs/api/Brut/TUI/Script/Events/ScriptStarted.html +343 -0
- data/docs/api/Brut/TUI/Script/Events/StepCompleted.html +163 -0
- data/docs/api/Brut/TUI/Script/Events/StepStarted.html +346 -0
- data/docs/api/Brut/TUI/Script/Events.html +115 -0
- data/docs/api/Brut/TUI/Script/ExecStep/ProcessStatusFailed.html +210 -0
- data/docs/api/Brut/TUI/Script/ExecStep.html +493 -0
- data/docs/api/Brut/TUI/Script/LoggingSubscriber.html +914 -0
- data/docs/api/Brut/TUI/Script/PutsSubscriber.html +783 -0
- data/docs/api/Brut/TUI/Script/Step.html +313 -0
- data/docs/api/Brut/TUI/Script.html +1250 -0
- data/docs/api/Brut/TUI/Terminal.html +593 -0
- data/docs/api/Brut/TUI/TerminalTheme.html +1403 -0
- data/docs/api/Brut/TUI/Themes/Dark.html +706 -0
- data/docs/api/Brut/TUI/Themes/Light.html +804 -0
- data/docs/api/Brut/TUI/Themes/None.html +218 -0
- data/docs/api/Brut/TUI/Themes.html +115 -0
- data/docs/api/Brut/TUI.html +129 -0
- data/docs/api/Brut.html +4 -4
- data/docs/api/Clock.html +2 -2
- data/docs/api/ModuleName.html +2 -2
- data/docs/api/RichString.html +2 -2
- data/docs/api/SemanticLogger/Appender/Async.html +2 -2
- data/docs/api/Sequel/Extensions/BrutInstrumentation.html +2 -2
- data/docs/api/Sequel/Extensions/BrutMigrations.html +2 -2
- data/docs/api/Sequel/Extensions.html +2 -2
- data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +2 -2
- data/docs/api/Sequel/Plugins/CreatedAt.html +2 -2
- data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +2 -2
- data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +2 -2
- data/docs/api/Sequel/Plugins/ExternalId.html +2 -2
- data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +2 -2
- data/docs/api/Sequel/Plugins/FindBang.html +2 -2
- data/docs/api/Sequel/Plugins.html +2 -2
- data/docs/api/Sequel.html +2 -2
- data/docs/api/_index.html +247 -2
- data/docs/api/class_list.html +1 -1
- data/docs/api/file.README.html +2 -2
- data/docs/api/index.html +2 -2
- data/docs/api/method_list.html +1551 -431
- data/docs/api/top-level-namespace.html +2 -2
- data/docs/assets/{app.Dm7v_ouO.js → app.B8jAEB7R.js} +1 -1
- data/docs/assets/chunks/@localSearchIndexroot.DJ8mocCj.js +1 -0
- data/docs/assets/chunks/{VPLocalSearchBox.DQK6jQou.js → VPLocalSearchBox.gF-Po_fz.js} +1 -1
- data/docs/assets/chunks/{theme.BuExsdM9.js → theme.BjPAOJkz.js} +2 -2
- data/docs/assets/{components.md.Dfd3w6UW.js → components.md.Ber8UBM0.js} +3 -3
- data/docs/assets/{configuration.md.DTYoV2Ea.js → configuration.md.DrJ6YVoZ.js} +1 -1
- data/docs/assets/{deployment.md.C1u5ep0g.js → deployment.md.CHTx2eTR.js} +10 -3
- data/docs/assets/{deployment.md.C1u5ep0g.lean.js → deployment.md.CHTx2eTR.lean.js} +1 -1
- data/docs/assets/{forms.md.DEkmJUvb.js → forms.md.RK0zkhm0.js} +2 -2
- data/docs/assets/{forms.md.DEkmJUvb.lean.js → forms.md.RK0zkhm0.lean.js} +1 -1
- data/docs/assets/{getting-started.md.DO-4eoGW.js → getting-started.md.CGJ44juQ.js} +2 -2
- data/docs/assets/jobs.md.Bi3qb3v6.js +25 -0
- data/docs/assets/jobs.md.Bi3qb3v6.lean.js +1 -0
- data/docs/assets/recipes_dev-env-secrets.md.DC_jVY9U.js +12 -0
- data/docs/assets/recipes_dev-env-secrets.md.DC_jVY9U.lean.js +1 -0
- data/docs/assets/roadmap.md.DqC1Y7Zt.js +1 -0
- data/docs/assets/{roadmap.md.CJsbUmK_.lean.js → roadmap.md.DqC1Y7Zt.lean.js} +1 -1
- data/docs/assets/{tutorials_02-dialog.md.D2vSjDVf.js → tutorials_02-dialog.md.DE5WfCXI.js} +1 -1
- data/docs/assets.html +4 -4
- data/docs/brut-js/api/AjaxSubmit.html +1 -1
- data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
- data/docs/brut-js/api/Autosubmit.html +1 -1
- data/docs/brut-js/api/Autosubmit.js.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
- data/docs/brut-js/api/BrutCustomElements.html +1 -1
- data/docs/brut-js/api/BufferedLogger.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
- data/docs/brut-js/api/Form.html +1 -1
- data/docs/brut-js/api/Form.js.html +1 -1
- data/docs/brut-js/api/I18nTranslation.html +1 -1
- data/docs/brut-js/api/I18nTranslation.js.html +1 -1
- data/docs/brut-js/api/LocaleDetection.html +1 -1
- data/docs/brut-js/api/LocaleDetection.js.html +1 -1
- data/docs/brut-js/api/Logger.html +1 -1
- data/docs/brut-js/api/Logger.js.html +1 -1
- data/docs/brut-js/api/Message.html +1 -1
- data/docs/brut-js/api/Message.js.html +1 -1
- data/docs/brut-js/api/PrefixedLogger.html +1 -1
- data/docs/brut-js/api/RichString.html +1 -1
- data/docs/brut-js/api/RichString.js.html +1 -1
- data/docs/brut-js/api/Tabs.html +1 -1
- data/docs/brut-js/api/Tabs.js.html +1 -1
- data/docs/brut-js/api/Toast.html +1 -1
- data/docs/brut-js/api/Toast.js.html +1 -1
- data/docs/brut-js/api/Tracing.html +1 -1
- data/docs/brut-js/api/Tracing.js.html +1 -1
- data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
- data/docs/brut-js/api/external-Performance.html +1 -1
- data/docs/brut-js/api/external-Promise.html +1 -1
- data/docs/brut-js/api/external-ValidityState.html +1 -1
- data/docs/brut-js/api/external-Window.html +1 -1
- data/docs/brut-js/api/external-fetch.html +1 -1
- data/docs/brut-js/api/global.html +1 -1
- data/docs/brut-js/api/index.html +1 -1
- data/docs/brut-js/api/index.js.html +1 -1
- data/docs/brut-js/api/module-testing.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
- data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
- data/docs/brut-js/api/testing.DOMCreator.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
- data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
- data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
- data/docs/brut-js/api/testing_index.js.html +1 -1
- data/docs/brut-js.html +4 -4
- data/docs/business-logic.html +4 -4
- data/docs/cli.html +4 -4
- data/docs/components.html +8 -8
- data/docs/configuration.html +5 -5
- data/docs/css.html +4 -4
- data/docs/custom-element-tests.html +4 -4
- data/docs/database-access.html +4 -4
- data/docs/database-schema.html +4 -4
- data/docs/deployment.html +13 -6
- data/docs/dev-environment.html +4 -4
- data/docs/dir-structure.html +4 -4
- data/docs/doc-conventions.html +4 -4
- data/docs/end-to-end-tests.html +4 -4
- data/docs/features.html +4 -4
- data/docs/flash-and-session.html +4 -4
- data/docs/form-constraints.html +4 -4
- data/docs/forms.html +6 -6
- data/docs/getting-started.html +7 -7
- data/docs/handlers.html +4 -4
- data/docs/hashmap.json +1 -1
- data/docs/hooks.html +4 -4
- data/docs/i18n.html +4 -4
- data/docs/index.html +3 -3
- data/docs/instrumentation.html +4 -4
- data/docs/javascript.html +4 -4
- data/docs/jobs.html +29 -5
- data/docs/keyword-injection.html +4 -4
- data/docs/layouts.html +4 -4
- data/docs/lsp.html +4 -4
- data/docs/markdown-examples.html +4 -4
- data/docs/middleware.html +4 -4
- data/docs/overview.html +4 -4
- data/docs/pages.html +4 -4
- data/docs/recipes/alternate-layouts.html +5 -5
- data/docs/recipes/authentication.html +5 -5
- data/docs/recipes/custom-flash.html +5 -5
- data/docs/recipes/dev-env-secrets.html +40 -0
- data/docs/recipes/form-errors.html +5 -5
- data/docs/recipes/indexed-forms.html +5 -5
- data/docs/recipes/migrations.html +5 -5
- data/docs/recipes/text-field-component.html +5 -5
- data/docs/roadmap.html +5 -5
- data/docs/routes.html +4 -4
- data/docs/security.html +4 -4
- data/docs/seed-data.html +4 -4
- data/docs/space-time-continuum.html +4 -4
- data/docs/tutorial.html +4 -4
- data/docs/tutorials/01-intro.html +4 -4
- data/docs/tutorials/02-dialog.html +5 -5
- data/docs/unit-tests.html +4 -4
- data/docs/why.html +4 -4
- data/lib/brut/cli/apps/build_assets.rb +1 -1
- data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
- data/lib/brut/cli/apps/test.rb +6 -4
- data/lib/brut/tui/ansi_escape_code.rb +104 -0
- data/lib/brut/tui/event_loop.rb +168 -0
- data/lib/brut/tui/events/base_event.rb +29 -0
- data/lib/brut/tui/events/event_bus.rb +73 -0
- data/lib/brut/tui/events/event_loop_started.rb +5 -0
- data/lib/brut/tui/events/exception.rb +24 -0
- data/lib/brut/tui/events/tick.rb +12 -0
- data/lib/brut/tui/events.rb +7 -0
- data/lib/brut/tui/markup_string.rb +68 -0
- data/lib/brut/tui/script/block_step.rb +17 -0
- data/lib/brut/tui/script/events/command_execution_failed.rb +4 -0
- data/lib/brut/tui/script/events/command_execution_succeeded.rb +3 -0
- data/lib/brut/tui/script/events/command_std_err.rb +3 -0
- data/lib/brut/tui/script/events/command_std_out.rb +13 -0
- data/lib/brut/tui/script/events/executing_command.rb +12 -0
- data/lib/brut/tui/script/events/message.rb +15 -0
- data/lib/brut/tui/script/events/phase_completed.rb +4 -0
- data/lib/brut/tui/script/events/phase_started.rb +14 -0
- data/lib/brut/tui/script/events/script_completed.rb +5 -0
- data/lib/brut/tui/script/events/script_started.rb +12 -0
- data/lib/brut/tui/script/events/step_completed.rb +3 -0
- data/lib/brut/tui/script/events/step_started.rb +12 -0
- data/lib/brut/tui/script/events.rb +14 -0
- data/lib/brut/tui/script/exec_step.rb +60 -0
- data/lib/brut/tui/script/logging_subscriber.rb +98 -0
- data/lib/brut/tui/script/puts_subscriber.rb +109 -0
- data/lib/brut/tui/script/step.rb +13 -0
- data/lib/brut/tui/script.rb +211 -0
- data/lib/brut/tui/terminal.rb +74 -0
- data/lib/brut/tui/terminal_theme.rb +140 -0
- data/lib/brut/tui/themes/dark.rb +14 -0
- data/lib/brut/tui/themes/light.rb +17 -0
- data/lib/brut/tui/themes/none.rb +9 -0
- data/lib/brut/tui/themes.rb +5 -0
- data/lib/brut/tui.rb +15 -0
- data/lib/brut/version.rb +1 -1
- data/lib/brut.rb +1 -0
- data/mkbrut/Gemfile.lock +2 -1
- data/mkbrut/lib/mkbrut/version.rb +1 -1
- data/mkbrut/templates/segments/Heroku/deploy/Dockerfile +9 -7
- data/mkbrut/templates/segments/Heroku/deploy/heroku_config.rb +2 -2
- data/specs/brut/tui/ansi_escape_code.spec.rb +30 -0
- data/specs/brut/tui/event_loop.spec.rb +70 -0
- data/specs/brut/tui/events/base_event.spec.rb +26 -0
- data/specs/brut/tui/events/event_bus.spec.rb +141 -0
- data/specs/brut/tui/events/exception.spec.rb +19 -0
- data/specs/brut/tui/events/test_event.rb +5 -0
- data/specs/spec_helper.rb +4 -0
- metadata +131 -21
- data/docs/assets/chunks/@localSearchIndexroot.BiNFswvo.js +0 -1
- data/docs/assets/jobs.md.Bc7Y1YpK.js +0 -1
- data/docs/assets/jobs.md.Bc7Y1YpK.lean.js +0 -1
- data/docs/assets/roadmap.md.CJsbUmK_.js +0 -1
- /data/docs/assets/{components.md.Dfd3w6UW.lean.js → components.md.Ber8UBM0.lean.js} +0 -0
- /data/docs/assets/{configuration.md.DTYoV2Ea.lean.js → configuration.md.DrJ6YVoZ.lean.js} +0 -0
- /data/docs/assets/{getting-started.md.DO-4eoGW.lean.js → getting-started.md.CGJ44juQ.lean.js} +0 -0
- /data/docs/assets/{tutorials_02-dialog.md.D2vSjDVf.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
|
+
— 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> »
|
|
40
|
+
<span class='title'><span class='object_link'><a href="../../Brut.html" title="Brut (module)">Brut</a></span></span> » <span class='title'><span class='object_link'><a href="../TUI.html" title="Brut::TUI (module)">TUI</a></span></span>
|
|
41
|
+
»
|
|
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="#<< (instance method)">#<strong><<</strong>(event) ⇒ 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) ⇒ 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> ⇒ 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) ⇒ 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) ⇒ 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) ⇒ <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
|
+
—
|
|
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'><<</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><<</strong>(event) ⇒ <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
|
+
—
|
|
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'><<</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'><<</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> ⇒ <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'>"</span><span class='tstring_content'>EventLoop: starting</span><span class='tstring_end'>"</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'>"</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'>"</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'>"</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'>"</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'>"</span><span class='tstring_content'>EventLoop: exiting</span><span class='tstring_end'>"</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'>"</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'>"</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'>"</span><span class='tstring_content'>EventLoop: exiting</span><span class='tstring_end'>"</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) ⇒ <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
|
+
—
|
|
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
|
+
—
|
|
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) ⇒ <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
|
+
—
|
|
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>
|