brut 0.13.0 → 0.15.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/CHANGELOG.md +28 -0
- data/Gemfile.lock +1 -1
- data/brut-css/package-lock.json +57 -106
- data/brut-css/package.json +1 -1
- data/brut-js/package-lock.json +50 -50
- data/brut-js/package.json +1 -1
- data/brut-js/specs/Toast.spec.js +34 -0
- data/brut-js/src/I18nTranslation.js +3 -0
- data/brut-js/src/Message.js +9 -3
- data/brut-js/src/RichString.js +4 -1
- data/brut-js/src/Toast.js +102 -0
- data/brut-js/src/index.js +3 -0
- data/brutrb.com/.vitepress/config.mjs +0 -1
- data/brutrb.com/brut-js.md +1 -0
- data/brutrb.com/layouts.md +70 -12
- data/brutrb.com/package-lock.json +428 -381
- data/docs/404.html +3 -3
- data/docs/adrs.html +7 -7
- data/docs/ai.html +7 -7
- data/docs/api/Brut/BackEnd/SeedData.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
- data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
- data/docs/api/Brut/BackEnd/Validators.html +1 -1
- data/docs/api/Brut/BackEnd.html +1 -1
- data/docs/api/Brut/CLI/App.html +1 -1
- data/docs/api/Brut/CLI/AppRunner.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/JS.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test.html +1 -1
- data/docs/api/Brut/CLI/Apps.html +1 -1
- data/docs/api/Brut/CLI/Command.html +1 -1
- data/docs/api/Brut/CLI/Error.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
- data/docs/api/Brut/CLI/Executor.html +1 -1
- data/docs/api/Brut/CLI/InvalidOption.html +1 -1
- data/docs/api/Brut/CLI/Options.html +1 -1
- data/docs/api/Brut/CLI/Output.html +1 -1
- data/docs/api/Brut/CLI/SystemExecError.html +1 -1
- data/docs/api/Brut/CLI.html +1 -1
- data/docs/api/Brut/FactoryBot.html +1 -1
- data/docs/api/Brut/Framework/App.html +1 -1
- data/docs/api/Brut/Framework/Config.html +1 -1
- data/docs/api/Brut/Framework/Container.html +1 -1
- data/docs/api/Brut/Framework/Error.html +1 -1
- data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
- data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
- data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
- data/docs/api/Brut/Framework/Errors.html +1 -1
- data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
- data/docs/api/Brut/Framework/MCP.html +1 -1
- data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
- data/docs/api/Brut/Framework.html +1 -1
- data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
- data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
- data/docs/api/Brut/FrontEnd/Component.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +37 -18
- data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
- data/docs/api/Brut/FrontEnd/Components.html +1 -1
- data/docs/api/Brut/FrontEnd/CsrfProtector.html +1 -1
- data/docs/api/Brut/FrontEnd/Download.html +1 -1
- data/docs/api/Brut/FrontEnd/Flash.html +1 -1
- data/docs/api/Brut/FrontEnd/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Button.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms.html +1 -1
- data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
- data/docs/api/Brut/FrontEnd/Handler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
- data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
- data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
- data/docs/api/Brut/FrontEnd/Layout.html +171 -3
- data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
- data/docs/api/Brut/FrontEnd/Page.html +1 -1
- data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
- data/docs/api/Brut/FrontEnd/Pages.html +1 -1
- data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing.html +1 -1
- data/docs/api/Brut/FrontEnd/Session.html +1 -1
- data/docs/api/Brut/FrontEnd.html +1 -1
- data/docs/api/Brut/I18n/BaseMethods.html +1 -1
- data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
- data/docs/api/Brut/I18n/ForCLI.html +1 -1
- data/docs/api/Brut/I18n/ForHTML.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
- data/docs/api/Brut/I18n.html +1 -1
- data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
- data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +1 -1
- data/docs/api/Brut/Instrumentation/Methods.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
- data/docs/api/Brut/Instrumentation.html +1 -1
- data/docs/api/Brut/RubocopConfig.html +1 -1
- data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
- data/docs/api/Brut/SinatraHelpers.html +1 -1
- data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
- data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
- data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
- data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
- data/docs/api/Brut/SpecSupport.html +1 -1
- data/docs/api/Brut.html +1 -1
- data/docs/api/Clock.html +1 -1
- data/docs/api/ModuleName.html +1 -1
- data/docs/api/RichString.html +1 -1
- data/docs/api/SemanticLogger/Appender/Async.html +1 -1
- data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
- data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
- data/docs/api/Sequel/Extensions.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang.html +1 -1
- data/docs/api/Sequel/Plugins.html +1 -1
- data/docs/api/Sequel.html +1 -1
- data/docs/api/_index.html +1 -1
- data/docs/api/file.README.html +1 -1
- data/docs/api/index.html +1 -1
- data/docs/api/method_list.html +157 -141
- data/docs/api/top-level-namespace.html +1 -1
- data/docs/assets/adrs.md.YglbWtQe.js +1 -0
- data/docs/assets/adrs.md.YglbWtQe.lean.js +1 -0
- data/docs/assets/ai.md.ChLnvDAX.js +1 -0
- data/docs/assets/ai.md.ChLnvDAX.lean.js +1 -0
- data/docs/assets/{app.BDtsVxyd.js → app.B0X8upRm.js} +1 -1
- data/docs/assets/{assets.md.7C3HWkga.js → assets.md.BEF6Oz6K.js} +2 -2
- data/docs/assets/assets.md.BEF6Oz6K.lean.js +1 -0
- data/docs/assets/{brut-js.md.B4GYxQVw.js → brut-js.md.CbJAe2Ky.js} +2 -2
- data/docs/assets/brut-js.md.CbJAe2Ky.lean.js +1 -0
- data/docs/assets/business-logic.md.DbuaOYGU.js +1 -0
- data/docs/assets/business-logic.md.DbuaOYGU.lean.js +1 -0
- data/docs/assets/chunks/@localSearchIndexroot.C0s1k0UQ.js +1 -0
- data/docs/assets/chunks/VPLocalSearchBox.jLmhant1.js +8 -0
- data/docs/assets/chunks/framework.C4nOkCZI.js +18 -0
- data/docs/assets/chunks/{theme.DZKmijwi.js → theme.CtVUdCdt.js} +2 -2
- data/docs/assets/{cli.md.CjsktgFz.js → cli.md.DDMar_51.js} +2 -2
- data/docs/assets/cli.md.DDMar_51.lean.js +1 -0
- data/docs/assets/{components.md.rMhQ0WdZ.js → components.md.C6nWgDP0.js} +5 -5
- data/docs/assets/components.md.C6nWgDP0.lean.js +1 -0
- data/docs/assets/{configuration.md.BK42Yjp_.js → configuration.md.CpbYHWPb.js} +2 -2
- data/docs/assets/configuration.md.CpbYHWPb.lean.js +1 -0
- data/docs/assets/{css.md.CltvJqAa.js → css.md.K5rOCOQY.js} +2 -2
- data/docs/assets/css.md.K5rOCOQY.lean.js +1 -0
- data/docs/assets/{custom-element-tests.md.B_rbta32.js → custom-element-tests.md.DiLe-eFw.js} +2 -2
- data/docs/assets/custom-element-tests.md.DiLe-eFw.lean.js +1 -0
- data/docs/assets/{database-access.md.gnluu54N.js → database-access.md.Dc8l2Plf.js} +2 -2
- data/docs/assets/database-access.md.Dc8l2Plf.lean.js +1 -0
- data/docs/assets/{database-schema.md.LpmBPVEU.js → database-schema.md.BJ_JhXmO.js} +2 -2
- data/docs/assets/database-schema.md.BJ_JhXmO.lean.js +1 -0
- data/docs/assets/{deployment.md.BLseERGV.js → deployment.md.C1u5ep0g.js} +2 -2
- data/docs/assets/deployment.md.C1u5ep0g.lean.js +1 -0
- data/docs/assets/{dev-environment.md.DRH2D2-O.js → dev-environment.md.B1S9p5ZK.js} +2 -2
- data/docs/assets/{dev-environment.md.DRH2D2-O.lean.js → dev-environment.md.B1S9p5ZK.lean.js} +1 -1
- data/docs/assets/{dir-structure.md.CWir1pic.js → dir-structure.md.D1T2kGwj.js} +2 -2
- data/docs/assets/dir-structure.md.D1T2kGwj.lean.js +1 -0
- data/docs/assets/doc-conventions.md.CDnWaEFg.js +1 -0
- data/docs/assets/doc-conventions.md.CDnWaEFg.lean.js +1 -0
- data/docs/assets/{end-to-end-tests.md.DzqRpZ43.js → end-to-end-tests.md.BJJdNDYL.js} +2 -2
- data/docs/assets/end-to-end-tests.md.BJJdNDYL.lean.js +1 -0
- data/docs/assets/{features.md.DPFXsy0z.js → features.md.BDWxnyNO.js} +2 -2
- data/docs/assets/features.md.BDWxnyNO.lean.js +1 -0
- data/docs/assets/{flash-and-session.md.nPvUpnUx.js → flash-and-session.md.CUsMxoNl.js} +2 -2
- data/docs/assets/flash-and-session.md.CUsMxoNl.lean.js +1 -0
- data/docs/assets/{form-constraints.md.KTv5cdR4.js → form-constraints.md.KlfXSKm2.js} +2 -2
- data/docs/assets/form-constraints.md.KlfXSKm2.lean.js +1 -0
- data/docs/assets/{forms.md.v9qIbmUM.js → forms.md.Bii91k3E.js} +3 -3
- data/docs/assets/forms.md.Bii91k3E.lean.js +1 -0
- data/docs/assets/{getting-started.md.DTOl4c2g.js → getting-started.md.ChAvueK7.js} +4 -4
- data/docs/assets/getting-started.md.ChAvueK7.lean.js +1 -0
- data/docs/assets/{handlers.md.h84MMB1R.js → handlers.md.C5tUwmmo.js} +2 -2
- data/docs/assets/handlers.md.C5tUwmmo.lean.js +1 -0
- data/docs/assets/{hooks.md.Jmb5VOLA.js → hooks.md.CoiYCKRc.js} +2 -2
- data/docs/assets/hooks.md.CoiYCKRc.lean.js +1 -0
- data/docs/assets/{i18n.md.BAm9t9JJ.js → i18n.md.DxkCKhUw.js} +2 -2
- data/docs/assets/i18n.md.DxkCKhUw.lean.js +1 -0
- data/docs/assets/{index.md.Bn9e0sRJ.js → index.md.DnphWyQd.js} +1 -1
- data/docs/assets/{index.md.Bn9e0sRJ.lean.js → index.md.DnphWyQd.lean.js} +1 -1
- data/docs/assets/{instrumentation.md._lNSriEZ.js → instrumentation.md.BcxjC4jd.js} +2 -2
- data/docs/assets/instrumentation.md.BcxjC4jd.lean.js +1 -0
- data/docs/assets/{javascript.md.DzrMxUmI.js → javascript.md.D6fxhaQb.js} +2 -2
- data/docs/assets/javascript.md.D6fxhaQb.lean.js +1 -0
- data/docs/assets/jobs.md.Bc7Y1YpK.js +1 -0
- data/docs/assets/jobs.md.Bc7Y1YpK.lean.js +1 -0
- data/docs/assets/{keyword-injection.md.95Zgh2eN.js → keyword-injection.md.CqLnnzIz.js} +2 -2
- data/docs/assets/keyword-injection.md.CqLnnzIz.lean.js +1 -0
- data/docs/assets/layouts.md.HEbeK7Jr.js +68 -0
- data/docs/assets/layouts.md.HEbeK7Jr.lean.js +1 -0
- data/docs/assets/lsp.md.bE9dW8n9.js +1 -0
- data/docs/assets/lsp.md.bE9dW8n9.lean.js +1 -0
- data/docs/assets/{markdown-examples.md.CCFEQO44.js → markdown-examples.md.BPmtHlc-.js} +2 -2
- data/docs/assets/markdown-examples.md.BPmtHlc-.lean.js +1 -0
- data/docs/assets/{middleware.md.Czz_UlJN.js → middleware.md.BhOIsg59.js} +2 -2
- data/docs/assets/middleware.md.BhOIsg59.lean.js +1 -0
- data/docs/assets/overview.md.BpWAgPFH.js +1 -0
- data/docs/assets/overview.md.BpWAgPFH.lean.js +1 -0
- data/docs/assets/{pages.md.B7Hc-i6H.js → pages.md.B3sQXpEd.js} +2 -2
- data/docs/assets/pages.md.B3sQXpEd.lean.js +1 -0
- data/docs/assets/{recipes_alternate-layouts.md.BwEytl59.js → recipes_alternate-layouts.md.C1QzVkA7.js} +2 -2
- data/docs/assets/recipes_alternate-layouts.md.C1QzVkA7.lean.js +1 -0
- data/docs/assets/{recipes_authentication.md.nwO6F7Ou.js → recipes_authentication.md.CyvoIW82.js} +2 -2
- data/docs/assets/recipes_authentication.md.CyvoIW82.lean.js +1 -0
- data/docs/assets/{recipes_custom-flash.md.CrQbI5eH.js → recipes_custom-flash.md.6gFqf2uL.js} +2 -2
- data/docs/assets/recipes_custom-flash.md.6gFqf2uL.lean.js +1 -0
- data/docs/assets/{recipes_form-errors.md.Bv5RCKqH.js → recipes_form-errors.md.B5ptSzMO.js} +2 -2
- data/docs/assets/recipes_form-errors.md.B5ptSzMO.lean.js +1 -0
- data/docs/assets/{recipes_indexed-forms.md.CstYyOSo.js → recipes_indexed-forms.md.BYYQGW2C.js} +2 -2
- data/docs/assets/recipes_indexed-forms.md.BYYQGW2C.lean.js +1 -0
- data/docs/assets/{recipes_migrations.md.CTcnWDJF.js → recipes_migrations.md.Cid7-3cu.js} +2 -2
- data/docs/assets/recipes_migrations.md.Cid7-3cu.lean.js +1 -0
- data/docs/assets/{recipes_text-field-component.md.H4wLAK0Z.js → recipes_text-field-component.md.VhOsCtKI.js} +2 -2
- data/docs/assets/recipes_text-field-component.md.VhOsCtKI.lean.js +1 -0
- data/docs/assets/roadmap.md.CJsbUmK_.js +1 -0
- data/docs/assets/roadmap.md.CJsbUmK_.lean.js +1 -0
- data/docs/assets/{routes.md.BD6y2i-f.js → routes.md.C1dgIBtD.js} +2 -2
- data/docs/assets/routes.md.C1dgIBtD.lean.js +1 -0
- data/docs/assets/security.md.Jn4SY1uK.js +1 -0
- data/docs/assets/security.md.Jn4SY1uK.lean.js +1 -0
- data/docs/assets/{seed-data.md.BvFZlqIk.js → seed-data.md.UZW0WxYN.js} +2 -2
- data/docs/assets/seed-data.md.UZW0WxYN.lean.js +1 -0
- data/docs/assets/space-time-continuum.md.D9rYGDFH.js +1 -0
- data/docs/assets/space-time-continuum.md.D9rYGDFH.lean.js +1 -0
- data/docs/assets/{tutorial.md.BM40jnoq.js → tutorial.md.BX6f6l00.js} +2 -2
- data/docs/assets/tutorial.md.BX6f6l00.lean.js +1 -0
- data/docs/assets/{tutorials_01-intro.md.B4sUBY3X.js → tutorials_01-intro.md.CzZ3kpF_.js} +2 -2
- data/docs/assets/{tutorials_01-intro.md.B4sUBY3X.lean.js → tutorials_01-intro.md.CzZ3kpF_.lean.js} +1 -1
- data/docs/assets/{tutorials_02-dialog.md.CPNK1SC_.js → tutorials_02-dialog.md.De6iTsWX.js} +2 -2
- data/docs/assets/{tutorials_02-dialog.md.CPNK1SC_.lean.js → tutorials_02-dialog.md.De6iTsWX.lean.js} +1 -1
- data/docs/assets/{unit-tests.md.DUGrnLj5.js → unit-tests.md.vDsdBbO_.js} +2 -2
- data/docs/assets/unit-tests.md.vDsdBbO_.lean.js +1 -0
- data/docs/assets/why.md.4WpxdrQ2.js +1 -0
- data/docs/assets/why.md.4WpxdrQ2.lean.js +1 -0
- data/docs/assets.html +7 -7
- 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/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 +7 -7
- data/docs/business-logic.html +7 -7
- data/docs/cli.html +7 -7
- data/docs/components.html +10 -10
- data/docs/configuration.html +7 -7
- data/docs/css.html +7 -7
- data/docs/custom-element-tests.html +7 -7
- data/docs/database-access.html +7 -7
- data/docs/database-schema.html +7 -7
- data/docs/deployment.html +7 -7
- data/docs/dev-environment.html +7 -7
- data/docs/dir-structure.html +7 -7
- data/docs/doc-conventions.html +7 -7
- data/docs/end-to-end-tests.html +7 -7
- data/docs/features.html +7 -7
- data/docs/flash-and-session.html +7 -7
- data/docs/form-constraints.html +7 -7
- data/docs/forms.html +8 -8
- data/docs/getting-started.html +9 -9
- data/docs/handlers.html +7 -7
- data/docs/hashmap.json +1 -1
- data/docs/hooks.html +7 -7
- data/docs/i18n.html +7 -7
- data/docs/index.html +6 -6
- data/docs/instrumentation.html +7 -7
- data/docs/javascript.html +7 -7
- data/docs/jobs.html +7 -7
- data/docs/keyword-injection.html +7 -7
- data/docs/layouts.html +42 -12
- data/docs/lsp.html +7 -7
- data/docs/markdown-examples.html +7 -7
- data/docs/middleware.html +7 -7
- data/docs/overview.html +7 -7
- data/docs/pages.html +7 -7
- data/docs/recipes/alternate-layouts.html +8 -8
- data/docs/recipes/authentication.html +7 -7
- data/docs/recipes/custom-flash.html +8 -8
- data/docs/recipes/form-errors.html +7 -7
- data/docs/recipes/indexed-forms.html +7 -7
- data/docs/recipes/migrations.html +7 -7
- data/docs/recipes/text-field-component.html +7 -7
- data/docs/roadmap.html +7 -7
- data/docs/routes.html +7 -7
- data/docs/security.html +7 -7
- data/docs/seed-data.html +7 -7
- data/docs/space-time-continuum.html +7 -7
- data/docs/tutorial.html +7 -7
- data/docs/tutorials/01-intro.html +7 -7
- data/docs/tutorials/02-dialog.html +7 -7
- data/docs/unit-tests.html +7 -7
- data/docs/why.html +7 -7
- data/lib/brut/front_end/components/page_identifier.rb +7 -4
- data/lib/brut/front_end/layout.rb +11 -0
- data/lib/brut/front_end/page.rb +1 -1
- data/lib/brut/version.rb +1 -1
- data/mkbrut/Gemfile.lock +1 -1
- data/mkbrut/lib/mkbrut/version.rb +1 -1
- data/mkbrut/templates/Base/app/src/front_end/layouts/blank_layout.rb +11 -0
- data/mkbrut/templates/Base/app/src/front_end/layouts/default_layout.rb.erb +3 -6
- metadata +115 -116
- data/brutrb.com/recipes/blank-layouts.md +0 -22
- data/docs/assets/adrs.md.BxjHi9-8.js +0 -1
- data/docs/assets/adrs.md.BxjHi9-8.lean.js +0 -1
- data/docs/assets/ai.md.Cy9GWnER.js +0 -1
- data/docs/assets/ai.md.Cy9GWnER.lean.js +0 -1
- data/docs/assets/assets.md.7C3HWkga.lean.js +0 -1
- data/docs/assets/brut-js.md.B4GYxQVw.lean.js +0 -1
- data/docs/assets/business-logic.md.BY4hGy0m.js +0 -1
- data/docs/assets/business-logic.md.BY4hGy0m.lean.js +0 -1
- data/docs/assets/chunks/@localSearchIndexroot.BWVzhs5N.js +0 -1
- data/docs/assets/chunks/VPLocalSearchBox.DCJk5nAW.js +0 -8
- data/docs/assets/chunks/framework.1L-BeKqY.js +0 -18
- data/docs/assets/cli.md.CjsktgFz.lean.js +0 -1
- data/docs/assets/components.md.rMhQ0WdZ.lean.js +0 -1
- data/docs/assets/configuration.md.BK42Yjp_.lean.js +0 -1
- data/docs/assets/css.md.CltvJqAa.lean.js +0 -1
- data/docs/assets/custom-element-tests.md.B_rbta32.lean.js +0 -1
- data/docs/assets/database-access.md.gnluu54N.lean.js +0 -1
- data/docs/assets/database-schema.md.LpmBPVEU.lean.js +0 -1
- data/docs/assets/deployment.md.BLseERGV.lean.js +0 -1
- data/docs/assets/dir-structure.md.CWir1pic.lean.js +0 -1
- data/docs/assets/doc-conventions.md.DOkAuXlt.js +0 -1
- data/docs/assets/doc-conventions.md.DOkAuXlt.lean.js +0 -1
- data/docs/assets/end-to-end-tests.md.DzqRpZ43.lean.js +0 -1
- data/docs/assets/features.md.DPFXsy0z.lean.js +0 -1
- data/docs/assets/flash-and-session.md.nPvUpnUx.lean.js +0 -1
- data/docs/assets/form-constraints.md.KTv5cdR4.lean.js +0 -1
- data/docs/assets/forms.md.v9qIbmUM.lean.js +0 -1
- data/docs/assets/getting-started.md.DTOl4c2g.lean.js +0 -1
- data/docs/assets/handlers.md.h84MMB1R.lean.js +0 -1
- data/docs/assets/hooks.md.Jmb5VOLA.lean.js +0 -1
- data/docs/assets/i18n.md.BAm9t9JJ.lean.js +0 -1
- data/docs/assets/instrumentation.md._lNSriEZ.lean.js +0 -1
- data/docs/assets/javascript.md.DzrMxUmI.lean.js +0 -1
- data/docs/assets/jobs.md.S-2amAYp.js +0 -1
- data/docs/assets/jobs.md.S-2amAYp.lean.js +0 -1
- data/docs/assets/keyword-injection.md.95Zgh2eN.lean.js +0 -1
- data/docs/assets/layouts.md.CVGl9xIO.js +0 -38
- data/docs/assets/layouts.md.CVGl9xIO.lean.js +0 -1
- data/docs/assets/lsp.md.Dn1rIiW0.js +0 -1
- data/docs/assets/lsp.md.Dn1rIiW0.lean.js +0 -1
- data/docs/assets/markdown-examples.md.CCFEQO44.lean.js +0 -1
- data/docs/assets/middleware.md.Czz_UlJN.lean.js +0 -1
- data/docs/assets/overview.md.DlKiRRG_.js +0 -1
- data/docs/assets/overview.md.DlKiRRG_.lean.js +0 -1
- data/docs/assets/pages.md.B7Hc-i6H.lean.js +0 -1
- data/docs/assets/recipes_alternate-layouts.md.BwEytl59.lean.js +0 -1
- data/docs/assets/recipes_authentication.md.nwO6F7Ou.lean.js +0 -1
- data/docs/assets/recipes_blank-layouts.md.fyAUJyJR.js +0 -15
- data/docs/assets/recipes_blank-layouts.md.fyAUJyJR.lean.js +0 -1
- data/docs/assets/recipes_custom-flash.md.CrQbI5eH.lean.js +0 -1
- data/docs/assets/recipes_form-errors.md.Bv5RCKqH.lean.js +0 -1
- data/docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js +0 -1
- data/docs/assets/recipes_migrations.md.CTcnWDJF.lean.js +0 -1
- data/docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js +0 -1
- data/docs/assets/roadmap.md.C6PRi0DX.js +0 -1
- data/docs/assets/roadmap.md.C6PRi0DX.lean.js +0 -1
- data/docs/assets/routes.md.BD6y2i-f.lean.js +0 -1
- data/docs/assets/security.md.C0G_AZR-.js +0 -1
- data/docs/assets/security.md.C0G_AZR-.lean.js +0 -1
- data/docs/assets/seed-data.md.BvFZlqIk.lean.js +0 -1
- data/docs/assets/space-time-continuum.md.xl44xDos.js +0 -1
- data/docs/assets/space-time-continuum.md.xl44xDos.lean.js +0 -1
- data/docs/assets/tutorial.md.BM40jnoq.lean.js +0 -1
- data/docs/assets/unit-tests.md.DUGrnLj5.lean.js +0 -1
- data/docs/assets/why.md.C-hk5xgJ.js +0 -1
- data/docs/assets/why.md.C-hk5xgJ.lean.js +0 -1
- data/docs/recipes/blank-layouts.html +0 -43
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brut
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Bryant Copeland
|
@@ -591,6 +591,7 @@ files:
|
|
591
591
|
- brut-js/specs/Message.spec.js
|
592
592
|
- brut-js/specs/SpecHelper.js
|
593
593
|
- brut-js/specs/Tabs.spec.js
|
594
|
+
- brut-js/specs/Toast.spec.js
|
594
595
|
- brut-js/specs/config/asset_metadata.json
|
595
596
|
- brut-js/src/AjaxSubmit.js
|
596
597
|
- brut-js/src/Autosubmit.js
|
@@ -607,6 +608,7 @@ files:
|
|
607
608
|
- brut-js/src/Message.js
|
608
609
|
- brut-js/src/RichString.js
|
609
610
|
- brut-js/src/Tabs.js
|
611
|
+
- brut-js/src/Toast.js
|
610
612
|
- brut-js/src/Tracing.js
|
611
613
|
- brut-js/src/appForTestingOnly.js
|
612
614
|
- brut-js/src/index.js
|
@@ -703,7 +705,6 @@ files:
|
|
703
705
|
- brutrb.com/public/favicon.ico
|
704
706
|
- brutrb.com/recipes/alternate-layouts.md
|
705
707
|
- brutrb.com/recipes/authentication.md
|
706
|
-
- brutrb.com/recipes/blank-layouts.md
|
707
708
|
- brutrb.com/recipes/custom-flash.md
|
708
709
|
- brutrb.com/recipes/form-errors.md
|
709
710
|
- brutrb.com/recipes/indexed-forms.md
|
@@ -960,132 +961,130 @@ files:
|
|
960
961
|
- docs/assets/DevEnvironment.DaFcVfwP.png
|
961
962
|
- docs/assets/LogoStop.Gb3tDhL1.png
|
962
963
|
- docs/assets/OverviewMetro.DUS-5fUZ.png
|
963
|
-
- docs/assets/adrs.md.
|
964
|
-
- docs/assets/adrs.md.
|
965
|
-
- docs/assets/ai.md.
|
966
|
-
- docs/assets/ai.md.
|
967
|
-
- docs/assets/app.
|
968
|
-
- docs/assets/assets.md.
|
969
|
-
- docs/assets/assets.md.
|
964
|
+
- docs/assets/adrs.md.YglbWtQe.js
|
965
|
+
- docs/assets/adrs.md.YglbWtQe.lean.js
|
966
|
+
- docs/assets/ai.md.ChLnvDAX.js
|
967
|
+
- docs/assets/ai.md.ChLnvDAX.lean.js
|
968
|
+
- docs/assets/app.B0X8upRm.js
|
969
|
+
- docs/assets/assets.md.BEF6Oz6K.js
|
970
|
+
- docs/assets/assets.md.BEF6Oz6K.lean.js
|
970
971
|
- docs/assets/basic-form-with-violations.Cv6Y9-Q_.png
|
971
972
|
- docs/assets/basic-form.DbHnu0oW.png
|
972
|
-
- docs/assets/brut-js.md.
|
973
|
-
- docs/assets/brut-js.md.
|
974
|
-
- docs/assets/business-logic.md.
|
975
|
-
- docs/assets/business-logic.md.
|
976
|
-
- docs/assets/chunks/@localSearchIndexroot.
|
977
|
-
- docs/assets/chunks/VPLocalSearchBox.
|
978
|
-
- docs/assets/chunks/framework.
|
979
|
-
- docs/assets/chunks/theme.
|
980
|
-
- docs/assets/cli.md.
|
981
|
-
- docs/assets/cli.md.
|
982
|
-
- docs/assets/components.md.
|
983
|
-
- docs/assets/components.md.
|
984
|
-
- docs/assets/configuration.md.
|
985
|
-
- docs/assets/configuration.md.
|
986
|
-
- docs/assets/css.md.
|
987
|
-
- docs/assets/css.md.
|
988
|
-
- docs/assets/custom-element-tests.md.
|
989
|
-
- docs/assets/custom-element-tests.md.
|
990
|
-
- docs/assets/database-access.md.
|
991
|
-
- docs/assets/database-access.md.
|
992
|
-
- docs/assets/database-schema.md.
|
993
|
-
- docs/assets/database-schema.md.
|
994
|
-
- docs/assets/deployment.md.
|
995
|
-
- docs/assets/deployment.md.
|
973
|
+
- docs/assets/brut-js.md.CbJAe2Ky.js
|
974
|
+
- docs/assets/brut-js.md.CbJAe2Ky.lean.js
|
975
|
+
- docs/assets/business-logic.md.DbuaOYGU.js
|
976
|
+
- docs/assets/business-logic.md.DbuaOYGU.lean.js
|
977
|
+
- docs/assets/chunks/@localSearchIndexroot.C0s1k0UQ.js
|
978
|
+
- docs/assets/chunks/VPLocalSearchBox.jLmhant1.js
|
979
|
+
- docs/assets/chunks/framework.C4nOkCZI.js
|
980
|
+
- docs/assets/chunks/theme.CtVUdCdt.js
|
981
|
+
- docs/assets/cli.md.DDMar_51.js
|
982
|
+
- docs/assets/cli.md.DDMar_51.lean.js
|
983
|
+
- docs/assets/components.md.C6nWgDP0.js
|
984
|
+
- docs/assets/components.md.C6nWgDP0.lean.js
|
985
|
+
- docs/assets/configuration.md.CpbYHWPb.js
|
986
|
+
- docs/assets/configuration.md.CpbYHWPb.lean.js
|
987
|
+
- docs/assets/css.md.K5rOCOQY.js
|
988
|
+
- docs/assets/css.md.K5rOCOQY.lean.js
|
989
|
+
- docs/assets/custom-element-tests.md.DiLe-eFw.js
|
990
|
+
- docs/assets/custom-element-tests.md.DiLe-eFw.lean.js
|
991
|
+
- docs/assets/database-access.md.Dc8l2Plf.js
|
992
|
+
- docs/assets/database-access.md.Dc8l2Plf.lean.js
|
993
|
+
- docs/assets/database-schema.md.BJ_JhXmO.js
|
994
|
+
- docs/assets/database-schema.md.BJ_JhXmO.lean.js
|
995
|
+
- docs/assets/deployment.md.C1u5ep0g.js
|
996
|
+
- docs/assets/deployment.md.C1u5ep0g.lean.js
|
996
997
|
- docs/assets/dev-env-protocol.DysDAtnz.png
|
997
|
-
- docs/assets/dev-environment.md.
|
998
|
-
- docs/assets/dev-environment.md.
|
999
|
-
- docs/assets/dir-structure.md.
|
1000
|
-
- docs/assets/dir-structure.md.
|
1001
|
-
- docs/assets/doc-conventions.md.
|
1002
|
-
- docs/assets/doc-conventions.md.
|
1003
|
-
- docs/assets/end-to-end-tests.md.
|
1004
|
-
- docs/assets/end-to-end-tests.md.
|
1005
|
-
- docs/assets/features.md.
|
1006
|
-
- docs/assets/features.md.
|
1007
|
-
- docs/assets/flash-and-session.md.
|
1008
|
-
- docs/assets/flash-and-session.md.
|
1009
|
-
- docs/assets/form-constraints.md.
|
1010
|
-
- docs/assets/form-constraints.md.
|
1011
|
-
- docs/assets/forms.md.
|
1012
|
-
- docs/assets/forms.md.
|
1013
|
-
- docs/assets/getting-started.md.
|
1014
|
-
- docs/assets/getting-started.md.
|
1015
|
-
- docs/assets/handlers.md.
|
1016
|
-
- docs/assets/handlers.md.
|
1017
|
-
- docs/assets/hooks.md.
|
1018
|
-
- docs/assets/hooks.md.
|
1019
|
-
- docs/assets/i18n.md.
|
1020
|
-
- docs/assets/i18n.md.
|
1021
|
-
- docs/assets/index.md.
|
1022
|
-
- docs/assets/index.md.
|
998
|
+
- docs/assets/dev-environment.md.B1S9p5ZK.js
|
999
|
+
- docs/assets/dev-environment.md.B1S9p5ZK.lean.js
|
1000
|
+
- docs/assets/dir-structure.md.D1T2kGwj.js
|
1001
|
+
- docs/assets/dir-structure.md.D1T2kGwj.lean.js
|
1002
|
+
- docs/assets/doc-conventions.md.CDnWaEFg.js
|
1003
|
+
- docs/assets/doc-conventions.md.CDnWaEFg.lean.js
|
1004
|
+
- docs/assets/end-to-end-tests.md.BJJdNDYL.js
|
1005
|
+
- docs/assets/end-to-end-tests.md.BJJdNDYL.lean.js
|
1006
|
+
- docs/assets/features.md.BDWxnyNO.js
|
1007
|
+
- docs/assets/features.md.BDWxnyNO.lean.js
|
1008
|
+
- docs/assets/flash-and-session.md.CUsMxoNl.js
|
1009
|
+
- docs/assets/flash-and-session.md.CUsMxoNl.lean.js
|
1010
|
+
- docs/assets/form-constraints.md.KlfXSKm2.js
|
1011
|
+
- docs/assets/form-constraints.md.KlfXSKm2.lean.js
|
1012
|
+
- docs/assets/forms.md.Bii91k3E.js
|
1013
|
+
- docs/assets/forms.md.Bii91k3E.lean.js
|
1014
|
+
- docs/assets/getting-started.md.ChAvueK7.js
|
1015
|
+
- docs/assets/getting-started.md.ChAvueK7.lean.js
|
1016
|
+
- docs/assets/handlers.md.C5tUwmmo.js
|
1017
|
+
- docs/assets/handlers.md.C5tUwmmo.lean.js
|
1018
|
+
- docs/assets/hooks.md.CoiYCKRc.js
|
1019
|
+
- docs/assets/hooks.md.CoiYCKRc.lean.js
|
1020
|
+
- docs/assets/i18n.md.DxkCKhUw.js
|
1021
|
+
- docs/assets/i18n.md.DxkCKhUw.lean.js
|
1022
|
+
- docs/assets/index.md.DnphWyQd.js
|
1023
|
+
- docs/assets/index.md.DnphWyQd.lean.js
|
1023
1024
|
- docs/assets/initial-home-page.DNIaYmgP.png
|
1024
|
-
- docs/assets/instrumentation.md.
|
1025
|
-
- docs/assets/instrumentation.md.
|
1026
|
-
- docs/assets/javascript.md.
|
1027
|
-
- docs/assets/javascript.md.
|
1028
|
-
- docs/assets/jobs.md.
|
1029
|
-
- docs/assets/jobs.md.
|
1030
|
-
- docs/assets/keyword-injection.md.
|
1031
|
-
- docs/assets/keyword-injection.md.
|
1032
|
-
- docs/assets/layouts.md.
|
1033
|
-
- docs/assets/layouts.md.
|
1034
|
-
- docs/assets/lsp.md.
|
1035
|
-
- docs/assets/lsp.md.
|
1036
|
-
- docs/assets/markdown-examples.md.
|
1037
|
-
- docs/assets/markdown-examples.md.
|
1038
|
-
- docs/assets/middleware.md.
|
1039
|
-
- docs/assets/middleware.md.
|
1025
|
+
- docs/assets/instrumentation.md.BcxjC4jd.js
|
1026
|
+
- docs/assets/instrumentation.md.BcxjC4jd.lean.js
|
1027
|
+
- docs/assets/javascript.md.D6fxhaQb.js
|
1028
|
+
- docs/assets/javascript.md.D6fxhaQb.lean.js
|
1029
|
+
- docs/assets/jobs.md.Bc7Y1YpK.js
|
1030
|
+
- docs/assets/jobs.md.Bc7Y1YpK.lean.js
|
1031
|
+
- docs/assets/keyword-injection.md.CqLnnzIz.js
|
1032
|
+
- docs/assets/keyword-injection.md.CqLnnzIz.lean.js
|
1033
|
+
- docs/assets/layouts.md.HEbeK7Jr.js
|
1034
|
+
- docs/assets/layouts.md.HEbeK7Jr.lean.js
|
1035
|
+
- docs/assets/lsp.md.bE9dW8n9.js
|
1036
|
+
- docs/assets/lsp.md.bE9dW8n9.lean.js
|
1037
|
+
- docs/assets/markdown-examples.md.BPmtHlc-.js
|
1038
|
+
- docs/assets/markdown-examples.md.BPmtHlc-.lean.js
|
1039
|
+
- docs/assets/middleware.md.BhOIsg59.js
|
1040
|
+
- docs/assets/middleware.md.BhOIsg59.lean.js
|
1040
1041
|
- docs/assets/new-post-editor.DrHr-5oh.png
|
1041
1042
|
- docs/assets/new-post-home-page.Bm34lyMg.png
|
1042
|
-
- docs/assets/overview.md.
|
1043
|
-
- docs/assets/overview.md.
|
1044
|
-
- docs/assets/pages.md.
|
1045
|
-
- docs/assets/pages.md.
|
1046
|
-
- docs/assets/recipes_alternate-layouts.md.
|
1047
|
-
- docs/assets/recipes_alternate-layouts.md.
|
1048
|
-
- docs/assets/recipes_authentication.md.
|
1049
|
-
- docs/assets/recipes_authentication.md.
|
1050
|
-
- docs/assets/
|
1051
|
-
- docs/assets/
|
1052
|
-
- docs/assets/
|
1053
|
-
- docs/assets/
|
1054
|
-
- docs/assets/
|
1055
|
-
- docs/assets/
|
1056
|
-
- docs/assets/
|
1057
|
-
- docs/assets/
|
1058
|
-
- docs/assets/
|
1059
|
-
- docs/assets/
|
1060
|
-
- docs/assets/
|
1061
|
-
- docs/assets/
|
1062
|
-
- docs/assets/
|
1063
|
-
- docs/assets/
|
1064
|
-
- docs/assets/
|
1065
|
-
- docs/assets/
|
1066
|
-
- docs/assets/
|
1067
|
-
- docs/assets/
|
1068
|
-
- docs/assets/seed-data.md.BvFZlqIk.js
|
1069
|
-
- docs/assets/seed-data.md.BvFZlqIk.lean.js
|
1043
|
+
- docs/assets/overview.md.BpWAgPFH.js
|
1044
|
+
- docs/assets/overview.md.BpWAgPFH.lean.js
|
1045
|
+
- docs/assets/pages.md.B3sQXpEd.js
|
1046
|
+
- docs/assets/pages.md.B3sQXpEd.lean.js
|
1047
|
+
- docs/assets/recipes_alternate-layouts.md.C1QzVkA7.js
|
1048
|
+
- docs/assets/recipes_alternate-layouts.md.C1QzVkA7.lean.js
|
1049
|
+
- docs/assets/recipes_authentication.md.CyvoIW82.js
|
1050
|
+
- docs/assets/recipes_authentication.md.CyvoIW82.lean.js
|
1051
|
+
- docs/assets/recipes_custom-flash.md.6gFqf2uL.js
|
1052
|
+
- docs/assets/recipes_custom-flash.md.6gFqf2uL.lean.js
|
1053
|
+
- docs/assets/recipes_form-errors.md.B5ptSzMO.js
|
1054
|
+
- docs/assets/recipes_form-errors.md.B5ptSzMO.lean.js
|
1055
|
+
- docs/assets/recipes_indexed-forms.md.BYYQGW2C.js
|
1056
|
+
- docs/assets/recipes_indexed-forms.md.BYYQGW2C.lean.js
|
1057
|
+
- docs/assets/recipes_migrations.md.Cid7-3cu.js
|
1058
|
+
- docs/assets/recipes_migrations.md.Cid7-3cu.lean.js
|
1059
|
+
- docs/assets/recipes_text-field-component.md.VhOsCtKI.js
|
1060
|
+
- docs/assets/recipes_text-field-component.md.VhOsCtKI.lean.js
|
1061
|
+
- docs/assets/roadmap.md.CJsbUmK_.js
|
1062
|
+
- docs/assets/roadmap.md.CJsbUmK_.lean.js
|
1063
|
+
- docs/assets/routes.md.C1dgIBtD.js
|
1064
|
+
- docs/assets/routes.md.C1dgIBtD.lean.js
|
1065
|
+
- docs/assets/security.md.Jn4SY1uK.js
|
1066
|
+
- docs/assets/security.md.Jn4SY1uK.lean.js
|
1067
|
+
- docs/assets/seed-data.md.UZW0WxYN.js
|
1068
|
+
- docs/assets/seed-data.md.UZW0WxYN.lean.js
|
1070
1069
|
- docs/assets/spa.qejUdp-5.png
|
1071
|
-
- docs/assets/space-time-continuum.md.
|
1072
|
-
- docs/assets/space-time-continuum.md.
|
1070
|
+
- docs/assets/space-time-continuum.md.D9rYGDFH.js
|
1071
|
+
- docs/assets/space-time-continuum.md.D9rYGDFH.lean.js
|
1073
1072
|
- docs/assets/style.B1z60PPQ.css
|
1074
1073
|
- docs/assets/styled-form-with-server-side-violations.Bjxd8Dpv.png
|
1075
1074
|
- docs/assets/styled-form-with-violations.Bv_sa9tg.png
|
1076
1075
|
- docs/assets/styled-home-page-with-posts.Dd4kG89D.png
|
1077
1076
|
- docs/assets/styled-home-page.BzdI7dWz.png
|
1078
|
-
- docs/assets/tutorial.md.
|
1079
|
-
- docs/assets/tutorial.md.
|
1080
|
-
- docs/assets/tutorials_01-intro.md.
|
1081
|
-
- docs/assets/tutorials_01-intro.md.
|
1082
|
-
- docs/assets/tutorials_02-dialog.md.
|
1083
|
-
- docs/assets/tutorials_02-dialog.md.
|
1084
|
-
- docs/assets/unit-tests.md.
|
1085
|
-
- docs/assets/unit-tests.md.
|
1077
|
+
- docs/assets/tutorial.md.BX6f6l00.js
|
1078
|
+
- docs/assets/tutorial.md.BX6f6l00.lean.js
|
1079
|
+
- docs/assets/tutorials_01-intro.md.CzZ3kpF_.js
|
1080
|
+
- docs/assets/tutorials_01-intro.md.CzZ3kpF_.lean.js
|
1081
|
+
- docs/assets/tutorials_02-dialog.md.De6iTsWX.js
|
1082
|
+
- docs/assets/tutorials_02-dialog.md.De6iTsWX.lean.js
|
1083
|
+
- docs/assets/unit-tests.md.vDsdBbO_.js
|
1084
|
+
- docs/assets/unit-tests.md.vDsdBbO_.lean.js
|
1086
1085
|
- docs/assets/welcome-to-brut.VSWzl17-.png
|
1087
|
-
- docs/assets/why.md.
|
1088
|
-
- docs/assets/why.md.
|
1086
|
+
- docs/assets/why.md.4WpxdrQ2.js
|
1087
|
+
- docs/assets/why.md.4WpxdrQ2.lean.js
|
1089
1088
|
- docs/assets/workspace-protocol.C0gXsoDb.png
|
1090
1089
|
- docs/brut-css/brut.css
|
1091
1090
|
- docs/brut-css/brut.max.css
|
@@ -1214,7 +1213,6 @@ files:
|
|
1214
1213
|
- docs/pages.html
|
1215
1214
|
- docs/recipes/alternate-layouts.html
|
1216
1215
|
- docs/recipes/authentication.html
|
1217
|
-
- docs/recipes/blank-layouts.html
|
1218
1216
|
- docs/recipes/custom-flash.html
|
1219
1217
|
- docs/recipes/form-errors.html
|
1220
1218
|
- docs/recipes/indexed-forms.html
|
@@ -1475,6 +1473,7 @@ files:
|
|
1475
1473
|
- mkbrut/templates/Base/app/src/front_end/images/icon.png
|
1476
1474
|
- mkbrut/templates/Base/app/src/front_end/images/mkicons.sh
|
1477
1475
|
- mkbrut/templates/Base/app/src/front_end/js/index.js
|
1476
|
+
- mkbrut/templates/Base/app/src/front_end/layouts/blank_layout.rb
|
1478
1477
|
- mkbrut/templates/Base/app/src/front_end/layouts/default_layout.rb.erb
|
1479
1478
|
- mkbrut/templates/Base/app/src/front_end/pages/app_page.rb
|
1480
1479
|
- mkbrut/templates/Base/app/src/front_end/pages/home_page.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# Blank or No Layout
|
2
|
-
|
3
|
-
If you don't want a layout, you are encouraged to create a blank layout, for example:
|
4
|
-
|
5
|
-
```ruby
|
6
|
-
class BlankLayout < Brut::FrontEnd::Layout
|
7
|
-
def view_template
|
8
|
-
yield
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# use like so:
|
13
|
-
|
14
|
-
class NakedPage < AppPage
|
15
|
-
def layout = "blank"
|
16
|
-
|
17
|
-
def page_template
|
18
|
-
# ...
|
19
|
-
end
|
20
|
-
end
|
21
|
-
```
|
22
|
-
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as a,c as r,o as t,ag as d}from"./chunks/framework.1L-BeKqY.js";const _=JSON.parse('{"title":"Architecture Decision Records","description":"","frontmatter":{},"headers":[],"relativePath":"adrs.md","filePath":"adrs.md"}'),s={name:"adrs.md"};function l(o,e,i,c,n,h){return t(),r("div",null,e[0]||(e[0]=[d('<h1 id="architecture-decision-records" tabindex="-1">Architecture Decision Records <a class="header-anchor" href="#architecture-decision-records" aria-label="Permalink to "Architecture Decision Records""></a></h1><p>The decisions here aren't <em>all</em> the architectural decisions I made, but are some of them, and mostly hold up.</p><p><code>adrs.cloud</code> is a Brut app.</p><ul><li><a href="https://adrs.cloud/shared_adrs/padr_b6920f0df907886b8a9207e9e2c9c2a2" target="_blank" rel="noreferrer">Rely on Web Standards and MDN Baseline</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_57f2397009a8aaf2c6083813ca588d73" target="_blank" rel="noreferrer">The Core Abstraction is the Plain Old Class</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_cdfcbe6b116b80a4f3d53fb3a6ed44b2" target="_blank" rel="noreferrer">Pages and Forms are First-Class Abstractions…not REST</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_01810ba90a92ec6c081a81affe212fb2" target="_blank" rel="noreferrer">Sequel will provide the data layer and its models will only model the database</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_f318e74925cb3e9d7e0eda329d085c4a" target="_blank" rel="noreferrer">There will be no controllers. Purpose-built classes will support pages, forms, and components.</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_e7078d29f00710848ebbe43aea6094a6" target="_blank" rel="noreferrer">Brut will not provider mailers, cloud storage, or background jobs</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_03b5cf8e34bb7900a38f6de27e50adaa" target="_blank" rel="noreferrer">Requiring files should not execute code</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_9529a5ada671254b5e5865b45abde92d" target="_blank" rel="noreferrer">Phlex will be used for HTML templating</a></li><li><a href="https://adrs.cloud/shared_adrs/padr_724a65340d734970ea222593a4a2760f" target="_blank" rel="noreferrer">RSpec is the default testing framework</a></li></ul>',4)]))}const p=a(s,[["render",l]]);export{_ as __pageData,p as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as a,c as r,o as t,ag as d}from"./chunks/framework.1L-BeKqY.js";const _=JSON.parse('{"title":"Architecture Decision Records","description":"","frontmatter":{},"headers":[],"relativePath":"adrs.md","filePath":"adrs.md"}'),s={name:"adrs.md"};function l(o,e,i,c,n,h){return t(),r("div",null,e[0]||(e[0]=[d("",4)]))}const p=a(s,[["render",l]]);export{_ as __pageData,p as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as t,c as o,o as a,ag as i}from"./chunks/framework.1L-BeKqY.js";const b=JSON.parse('{"title":"AI Declaration and Notes","description":"","frontmatter":{},"headers":[],"relativePath":"ai.md","filePath":"ai.md"}'),s={name:"ai.md"};function r(n,e,l,d,h,c){return a(),o("div",null,e[0]||(e[0]=[i('<h1 id="ai-declaration-and-notes" tabindex="-1">AI Declaration and Notes <a class="header-anchor" href="#ai-declaration-and-notes" aria-label="Permalink to "AI Declaration and Notes""></a></h1><p>LLMs and AI tools are a current fact of life. We feel it's important to be realistic and up front about how they affect this project.</p><h2 id="levels-of-ai-use" tabindex="-1">Levels of AI Use <a class="header-anchor" href="#levels-of-ai-use" aria-label="Permalink to "Levels of AI Use""></a></h2><p>I created <a href="https://declare-ai.org/" target="_blank" rel="noreferrer">declare-ai.org</a> to allow precise documentation of how AI is used in a project. It defines four levels of AI use:</p><ol><li>No involvement at all.</li><li>Non-create assistance, such as the completions GitHub Copilot may make while you are typing.</li><li>Creative assistance, where an AI generated a large amount of code that you then modified. An example would be using a tool like Cursor to write code for your review.</li><li>Completely Produced by an AI, for example if you used Stable Diffusion to create your icon.</li></ol><h2 id="code" tabindex="-1">Code <a class="header-anchor" href="#code" aria-label="Permalink to "Code""></a></h2><p>The entirety of Brut's codebase could be grouped into three parts:</p><ul><li>The library code developers use. This is, roughly, the code in <code>lib</code>, <code>brut-js/src</code>, and <code>brut-css/src</code>.</li><li>Tests of the library code.</li><li>Tools used to manage the library code, such as what's in <code>bin/</code>, <code>brut-js/bin</code>, <code>brut-css/bin</code>, etc.</li></ul><h3 id="library-code-should-be-written-by-a-person" tabindex="-1">Library Code Should Be Written By a Person <a class="header-anchor" href="#library-code-should-be-written-by-a-person" aria-label="Permalink to "Library Code Should Be Written By a Person""></a></h3><p>We want the library code written by a person, i.e. it should have level 1 AI assistance: none. As of this writing—June 17, 2025—all library code was written by a person.</p><p>If some code is level 2—non-creative assistance—that is probably fine.</p><h3 id="tests-should-not-be-totally-written-by-ai" tabindex="-1">Tests Should Not Be Totally Written by AI <a class="header-anchor" href="#tests-should-not-be-totally-written-by-ai" aria-label="Permalink to "Tests Should Not Be Totally Written by AI""></a></h3><p>As of this writing—June 17, 2025—the library has no automated tests. The <code>adrs.cloud</code> app serves as the test suite.</p><p>That said, as tests are developed, they must never be written entirely by an AI without human review (level 4). Our preference is that all tests comply with level 1 or level 2, however we are open to creative assistance for tests as might be provided by a tool like Cursor.</p><p>In any case, the author of a test should understand it and the maintainers must be able to understand and modify all tests without the use of AI tools.</p><h3 id="management-tools-should-not-be-totally-written-by-ai" tabindex="-1">Management Tools Should Not Be Totally Written by AI <a class="header-anchor" href="#management-tools-should-not-be-totally-written-by-ai" aria-label="Permalink to "Management Tools Should Not Be Totally Written by AI""></a></h3><p>Like tests, management tools must be comprehensible by a person and the creator of the code must understand it. That said, some of the tools were created with level 3 AI assistance, and we expect these tools may continue to be created this way.</p><p>Nevertheless, this code must be reviewed and understood by a person.</p><h2 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to "Documentation""></a></h2><p>We strive to have all documentation written by a real person. None of this documentation, or the API documentation, is produced by a machine, although spelling and grammar corrections will certainly have been suggested by automated tools.</p><p>We expect an LLM to be able to digest this documentation and source code and provide alternate analysis of how Brut works and how to use it. We hope such analysis is correct and useful, however that cannot be guaranteed, so this documentation is the second best source of truth, the source code being the best.</p><h2 id="logos" tabindex="-1">Logos <a class="header-anchor" href="#logos" aria-label="Permalink to "Logos""></a></h2><p>While the various logos look like someone typed "make me a logo in the style of the Washington, DC Metro", if you look closely, you will see the telltale sings that they were made by a person…a person who is not a professional designer.</p><p>As such, these are all Level 1.</p><h2 id="ai-information-about-brut-should-be-viewed-with-skepticism" tabindex="-1">AI Information about Brut Should Be Viewed with Skepticism <a class="header-anchor" href="#ai-information-about-brut-should-be-viewed-with-skepticism" aria-label="Permalink to "AI Information about Brut Should Be Viewed with Skepticism""></a></h2><ul><li><strong>Answers from an LLM about Brut are likely incorrect.</strong> LLMs will certainly not have been trained on information about Brut, since it is new.</li><li><strong>Code Completions of Brut Code are suspect.</strong> I have observed that e.g. GitHub CoPilot is capable for properly completing Brut code if there is enough context, but it is not capable of, say, creating a component from scratch. <strong>Review all Code Completions Carefully</strong>.</li></ul>',26)]))}const p=t(s,[["render",r]]);export{b as __pageData,p as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as t,c as o,o as a,ag as i}from"./chunks/framework.1L-BeKqY.js";const b=JSON.parse('{"title":"AI Declaration and Notes","description":"","frontmatter":{},"headers":[],"relativePath":"ai.md","filePath":"ai.md"}'),s={name:"ai.md"};function r(n,e,l,d,h,c){return a(),o("div",null,e[0]||(e[0]=[i("",26)]))}const p=t(s,[["render",r]]);export{b as __pageData,p as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as e,c as a,o as i,ag as t}from"./chunks/framework.1L-BeKqY.js";const u=JSON.parse('{"title":"Assets","description":"","frontmatter":{},"headers":[],"relativePath":"assets.md","filePath":"assets.md"}'),n={name:"assets.md"};function o(h,s,l,r,p,d){return i(),a("div",null,s[0]||(s[0]=[t("",39)]))}const k=e(n,[["render",o]]);export{u as __pageData,k as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as t,c as a,o as s,ag as o}from"./chunks/framework.1L-BeKqY.js";const i="/assets/spa.qejUdp-5.png",m=JSON.parse('{"title":"BrutJS","description":"","frontmatter":{},"headers":[],"relativePath":"brut-js.md","filePath":"brut-js.md"}'),n={name:"brut-js.md"};function r(l,e,d,h,c,p){return s(),a("div",null,e[0]||(e[0]=[o("",35)]))}const g=t(n,[["render",r]]);export{m as __pageData,g as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as o,c as a,o as s,ag as t}from"./chunks/framework.1L-BeKqY.js";const m=JSON.parse('{"title":"Business or Domain Logic","description":"","frontmatter":{},"headers":[],"relativePath":"business-logic.md","filePath":"business-logic.md"}'),n={name:"business-logic.md"};function i(c,e,r,d,l,u){return s(),a("div",null,e[0]||(e[0]=[t('<h1 id="business-or-domain-logic" tabindex="-1">Business or Domain Logic <a class="header-anchor" href="#business-or-domain-logic" aria-label="Permalink to "Business or Domain Logic""></a></h1><p>Since business and domain logic is not required, nor encouraged, to go in your data models, where does it go?</p><p>It can go anywhere you like - Brut is not currently prescriptive.</p><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to "Overview""></a></h2><p>It's recommended that you place classes in <code>app/src/back_end</code>. Any directory created in there will be auto-loaded by Brut/Zeitwerk based on its rules. This means that classes in any directory in <code>app/src/back_end</code> should not be namespaced.</p><p>For example, if you have <em>commands</em> and <em>queries</em>, you may want them in <code>app/src/back_end/commands</code> and <code>app/src/back_end/queries</code>, respectively. In this case, <code>NewOrganizationCommand</code> would go in <code>app/src/back_end/commands/new_organization_command.rb</code> and <code>AccountQuery</code> would go in <code>app/src/back_end/queries/account_query.rb</code></p><p>Or, you could could organize them into <code>app/src/back_end/business_logic/commands</code> and <code>app/src/back_end/business_logic/queries</code>. In that case, <code>Commands::NewOrganization</code> would be expected in <code>app/src/back_end/business_logic/commands/new_organization.rb</code> and <code>Queries::Account</code> would be expected in <code>app/src/back_end/business_logic/queries/account.rb</code>.</p><p>How you organize it is up to you.</p><h2 id="testing" tabindex="-1">Testing <a class="header-anchor" href="#testing" aria-label="Permalink to "Testing""></a></h2><p>Tests can be written using RSpec in the usual way. Spec files should be in <code>specs/back_end/path/to/class.spec.rb</code>. Note that Brut expects Spec files to end in <code>.spec.rb</code> and <em>not</em><code>_spec.rb</code>.</p><p>There is nothing special about the tests for your domain logic. Write them however you need to.</p><h2 id="recomended-practices" tabindex="-1">Recomended Practices <a class="header-anchor" href="#recomended-practices" aria-label="Permalink to "Recomended Practices""></a></h2><p>This could be an entire series of books. The main recommendation is to take a light approach and don't immediately install complex frameworks or libraries unless you know you need them.</p><p>Something somewhere in your business logic will need to interface with your front-end. The simplest way to do that is to allow form objects to be passed into your back-end. The second simplest way is to pass form values into your back-end.</p><p>You are strongly discouraged from having your front-end locate data models and pass those to your back-end. This can be done while prototyping and for fast iteration on a concept, but generally you do not want to query your database from your handlers or pages just to pass the results into a back-end class.</p><p>Exposing data models to the front-end is generally OK, as that is sometimes what you need to do.</p><h2 id="technical-notes" tabindex="-1">Technical Notes <a class="header-anchor" href="#technical-notes" aria-label="Permalink to "Technical Notes""></a></h2><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p>Technical Notes are for deeper understanding and debugging. While we will try to keep them up-to-date with changes to Brut's internals, the source code is always more correct.</p></div><p><em>Last Updated May 7, 2025</em></p><p>Creating universal abstractions from business logic is difficult. Brut is unlikely to do this. If it does, it will be after much analysis of exsiting patterns and <em>only</em> if it helps avoid mistakes and increases developer throughput.</p>',20)]))}const h=o(n,[["render",i]]);export{m as __pageData,h as default};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{_ as o,c as a,o as s,ag as t}from"./chunks/framework.1L-BeKqY.js";const m=JSON.parse('{"title":"Business or Domain Logic","description":"","frontmatter":{},"headers":[],"relativePath":"business-logic.md","filePath":"business-logic.md"}'),n={name:"business-logic.md"};function i(c,e,r,d,l,u){return s(),a("div",null,e[0]||(e[0]=[t("",20)]))}const h=o(n,[["render",i]]);export{m as __pageData,h as default};
|