brut 0.8.0 → 0.9.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 +9 -0
- data/CHANGELOG.md +7 -0
- data/Dockerfile.dx +8 -1
- data/Gemfile.lock +33 -1
- data/bin/ci +9 -5
- data/bin/docs +1 -1
- data/bin/generate-and-run-rubocop +52 -0
- data/bin/rubocop +27 -0
- data/bin/setup +46 -0
- data/bin/test +18 -0
- data/brut-css/bin/publish +1 -1
- data/brut-css/package-lock.json +2 -2
- data/brut-css/package.json +1 -1
- data/brut-js/bin/publish +1 -1
- data/brut-js/package-lock.json +2 -2
- data/brut-js/package.json +1 -1
- data/brut.gemspec +32 -26
- data/brutrb.com/.vitepress/config.mjs +3 -0
- data/brutrb.com/database-schema.md +1 -1
- data/brutrb.com/recipes/migrations.md +1 -1
- data/docker-compose.dx.yml +3 -0
- data/docs/404.html +2 -2
- data/docs/adrs.html +3 -3
- data/docs/ai.html +3 -3
- 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 +2 -2
- 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 +3 -3
- 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 +3 -3
- data/docs/api/Brut/CLI/Apps/Scaffold.html +2 -2
- data/docs/api/Brut/CLI/Apps/Test/Audit.html +2 -2
- 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 +80 -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 +3 -3
- data/docs/api/Brut/Framework/App.html +3 -3
- data/docs/api/Brut/Framework/Config.html +25 -3
- data/docs/api/Brut/Framework/Container.html +2 -2
- 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 +21 -11
- 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 +4 -4
- 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/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 +250 -0
- 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 +6 -6
- 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 +3 -3
- data/docs/api/Brut/I18n/BaseMethods.html +3 -3
- 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/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 +237 -0
- 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 +7 -13
- 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 +4 -4
- data/docs/api/Brut/SpecSupport/SessionSupport.html +2 -2
- data/docs/api/Brut/SpecSupport.html +2 -2
- data/docs/api/Brut.html +128 -12
- data/docs/api/Clock.html +2 -2
- data/docs/api/ModuleName.html +28 -28
- data/docs/api/RichString.html +22 -22
- 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 +16 -2
- data/docs/api/class_list.html +1 -1
- data/docs/api/file.README.html +28 -2
- data/docs/api/index.html +28 -2
- data/docs/api/method_list.html +192 -168
- data/docs/api/top-level-namespace.html +2 -2
- data/docs/assets/{app.DyQLb4Ot.js → app.CmkhEsw7.js} +1 -1
- data/docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js +1 -0
- data/docs/assets/chunks/{VPLocalSearchBox.T1iA-eJx.js → VPLocalSearchBox.CDh583Oj.js} +1 -1
- data/docs/assets/chunks/{theme.ChwsbWjK.js → theme.B0_7GeW8.js} +2 -2
- data/docs/assets/{components.md.DHh-NwKs.js → components.md.-22ecBxM.js} +3 -3
- data/docs/assets/{configuration.md.D8Wz3oJU.js → configuration.md.CLKL1lFf.js} +1 -1
- data/docs/assets/{database-schema.md.C5gXexJi.js → database-schema.md.LpmBPVEU.js} +1 -1
- data/docs/assets/{forms.md.BRE85eju.js → forms.md.CBI5--o2.js} +1 -1
- data/docs/assets/{getting-started.md.2ioiTe-B.js → getting-started.md.D5nzBZ4J.js} +2 -2
- data/docs/assets/{recipes_migrations.md.DPN3gQE3.js → recipes_migrations.md.CTcnWDJF.js} +1 -1
- data/docs/assets.html +3 -3
- 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 +3 -3
- data/docs/business-logic.html +3 -3
- data/docs/cli.html +3 -3
- data/docs/components.html +7 -7
- data/docs/configuration.html +5 -5
- data/docs/css.html +3 -3
- data/docs/custom-element-tests.html +3 -3
- data/docs/database-access.html +3 -3
- data/docs/database-schema.html +5 -5
- data/docs/deployment.html +3 -3
- data/docs/dev-environment.html +3 -3
- data/docs/dir-structure.html +3 -3
- data/docs/doc-conventions.html +3 -3
- data/docs/end-to-end-tests.html +3 -3
- data/docs/features.html +3 -3
- data/docs/flash-and-session.html +3 -3
- data/docs/form-constraints.html +3 -3
- data/docs/forms.html +5 -5
- data/docs/getting-started.html +6 -6
- data/docs/handlers.html +3 -3
- data/docs/hashmap.json +1 -1
- data/docs/hooks.html +3 -3
- data/docs/i18n.html +3 -3
- data/docs/index.html +3 -3
- data/docs/instrumentation.html +3 -3
- data/docs/javascript.html +3 -3
- data/docs/jobs.html +3 -3
- data/docs/keyword-injection.html +3 -3
- data/docs/layouts.html +3 -3
- data/docs/lsp.html +3 -3
- data/docs/markdown-examples.html +3 -3
- data/docs/middleware.html +3 -3
- data/docs/overview.html +3 -3
- data/docs/pages.html +3 -3
- data/docs/recipes/alternate-layouts.html +3 -3
- data/docs/recipes/authentication.html +3 -3
- data/docs/recipes/blank-layouts.html +3 -3
- data/docs/recipes/custom-flash.html +3 -3
- data/docs/recipes/indexed-forms.html +3 -3
- data/docs/recipes/migrations.html +5 -5
- data/docs/recipes/text-field-component.html +3 -3
- data/docs/roadmap.html +3 -3
- data/docs/routes.html +3 -3
- data/docs/security.html +3 -3
- data/docs/seed-data.html +3 -3
- data/docs/space-time-continuum.html +3 -3
- data/docs/tutorial.html +3 -3
- data/docs/unit-tests.html +3 -3
- data/docs/why.html +3 -3
- data/dx/build +45 -9
- data/lib/brut/cli/app.rb +1 -1
- data/lib/brut/cli/apps/heroku_container_based_deploy.rb +1 -1
- data/lib/brut/cli/apps/scaffold.rb +1 -1
- data/lib/brut/cli/options.rb +4 -0
- data/lib/brut/factory_bot.rb +1 -1
- data/lib/brut/framework/app.rb +1 -1
- data/lib/brut/framework/config.rb +11 -0
- data/lib/brut/framework/mcp.rb +12 -7
- data/lib/brut/front_end/csrf_protector.rb +30 -0
- data/lib/brut/front_end/form.rb +4 -4
- data/lib/brut/front_end/page.rb +1 -1
- data/lib/brut/front_end/routing.rb +1 -1
- data/lib/brut/front_end.rb +1 -0
- data/lib/brut/i18n/base_methods.rb +1 -1
- data/lib/brut/instrumentation/logger_span_exporter.rb +1 -1
- data/lib/brut/junk_drawer.rb +3 -1
- data/lib/brut/rubocop_config.rb +123 -0
- data/lib/brut/spec_support/component_support.rb +0 -3
- data/lib/brut/spec_support/rspec_setup.rb +2 -2
- data/lib/brut/version.rb +1 -1
- data/mkbrut/Gemfile.lock +1 -1
- data/mkbrut/dx +1 -0
- data/mkbrut/lib/mkbrut/app.rb +1 -1
- data/mkbrut/lib/mkbrut/cli.rb +1 -1
- data/mkbrut/lib/mkbrut/segments/heroku.rb +1 -1
- data/mkbrut/lib/mkbrut/version.rb +1 -1
- data/mkbrut/mkbrut.gemspec +3 -1
- data/mkbrut/templates/Base/app/config/i18n/en/1_defaults.rb +2 -2
- data/mkbrut/templates/Base/app/config/i18n/en/2_app.rb +1 -1
- data/mkbrut/templates/Base/bin/setup +1 -1
- data/mkbrut/templates/segments/Demo/app/src/front_end/components/flash_component.rb +1 -1
- data/specs/brut/junk_drawer.spec.rb +4 -0
- metadata +70 -33
- data/.rspec +0 -3
- data/docs/assets/chunks/@localSearchIndexroot.CmtZyrFA.js +0 -1
- /data/docs/assets/{components.md.DHh-NwKs.lean.js → components.md.-22ecBxM.lean.js} +0 -0
- /data/docs/assets/{configuration.md.D8Wz3oJU.lean.js → configuration.md.CLKL1lFf.lean.js} +0 -0
- /data/docs/assets/{database-schema.md.C5gXexJi.lean.js → database-schema.md.LpmBPVEU.lean.js} +0 -0
- /data/docs/assets/{forms.md.BRE85eju.lean.js → forms.md.CBI5--o2.lean.js} +0 -0
- /data/docs/assets/{getting-started.md.2ioiTe-B.lean.js → getting-started.md.D5nzBZ4J.lean.js} +0 -0
- /data/docs/assets/{recipes_migrations.md.DPN3gQE3.lean.js → recipes_migrations.md.CTcnWDJF.lean.js} +0 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# Base for custom logic around CSRF protection. Brut configures `Rack::Protection::AuthenticityToken` for all requests, and
|
2
|
+
# this happens early in the request. The idea is that no real POST should be missing a CSRF token. That said, there are times
|
3
|
+
# when it must be skipped, such as for webhooks. In that case, you can extend this class and configure it via
|
4
|
+
# `Brut.container.override("csrf_protector", YourCustomCsrfProtector.new)` in your `App` class' initializer.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# class CsrfProtector < Brut::FrontEnd::CsrfProtector
|
8
|
+
# def allowed?(env)
|
9
|
+
# !!env["PATH_INFO"].to_s.match?(/^\/webhooks\//)
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# # Then, in app.rb
|
13
|
+
# class App < Brut::Framework::App
|
14
|
+
# def id = "some-id"
|
15
|
+
# def organization = "some-org"
|
16
|
+
#
|
17
|
+
# def initialize
|
18
|
+
# Brut.container.override("csrf_protector") do
|
19
|
+
# CsrfProtector.new
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # ...
|
23
|
+
#
|
24
|
+
class Brut::FrontEnd::CsrfProtector
|
25
|
+
|
26
|
+
# Return true if the request should be allowed without a CSRF token. This implementation returns false.
|
27
|
+
def allowed?(env)
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
data/lib/brut/front_end/form.rb
CHANGED
@@ -73,7 +73,7 @@ class Brut::FrontEnd::Form
|
|
73
73
|
}
|
74
74
|
else
|
75
75
|
[
|
76
|
-
input_definition.make_input(value:, index: nil)
|
76
|
+
input_definition.make_input(value:, index: nil),
|
77
77
|
]
|
78
78
|
end
|
79
79
|
|
@@ -109,7 +109,7 @@ class Brut::FrontEnd::Form
|
|
109
109
|
# @return [Brut::FrontEnd::Forms::Input]
|
110
110
|
def inputs(input_name)
|
111
111
|
@inputs.fetch(input_name.to_s)
|
112
|
-
rescue KeyError
|
112
|
+
rescue KeyError
|
113
113
|
raise Brut::Framework::Errors::Bug, "Form does not define the input '#{input_name}'. You must add this to your form. Found these inputs: #{@inputs.keys.join(', ')}"
|
114
114
|
end
|
115
115
|
|
@@ -164,8 +164,8 @@ class Brut::FrontEnd::Form
|
|
164
164
|
true
|
165
165
|
end
|
166
166
|
},
|
167
|
-
index
|
168
|
-
|
167
|
+
index,
|
168
|
+
],
|
169
169
|
]
|
170
170
|
end
|
171
171
|
}.compact
|
data/lib/brut/front_end/page.rb
CHANGED
data/lib/brut/front_end.rb
CHANGED
@@ -9,6 +9,7 @@ module Brut::FrontEnd
|
|
9
9
|
autoload(:AssetPathResolver, "brut/front_end/asset_path_resolver")
|
10
10
|
autoload(:Component, "brut/front_end/component")
|
11
11
|
autoload(:Components, "brut/front_end/component")
|
12
|
+
autoload(:CsrfProtector, "brut/front_end/csrf_protector")
|
12
13
|
autoload(:Download, "brut/front_end/download")
|
13
14
|
autoload(:Flash, "brut/front_end/flash")
|
14
15
|
autoload(:Form, "brut/front_end/form")
|
@@ -211,7 +211,7 @@ module Brut::I18n::BaseMethods
|
|
211
211
|
block_contents = safe(capture(&block))
|
212
212
|
interpolated_values[:block] = block_contents
|
213
213
|
end
|
214
|
-
t_direct(keys_to_check,**interpolated_values
|
214
|
+
t_direct(keys_to_check,**interpolated_values, key_given: key)
|
215
215
|
rescue I18n::MissingInterpolationArgument => ex
|
216
216
|
if ex.key.to_s == "block"
|
217
217
|
raise ArgumentError,"One of the keys #{key.join(", ")} contained a %{block} interpolation value: '#{ex.string}'. This means you must yield a block to `t`"
|
@@ -58,7 +58,7 @@ private
|
|
58
58
|
(span.events || []).each do |event|
|
59
59
|
event_message = (" " * (indent + 2)) + "event:#{event.name}"
|
60
60
|
event_params = {
|
61
|
-
timing: ((event.timestamp - previous_timestamp)/1_000.0).to_i/1_000.0
|
61
|
+
timing: ((event.timestamp - previous_timestamp)/1_000.0).to_i/1_000.0,
|
62
62
|
}.merge(event.attributes).merge(synthetic_attributes)
|
63
63
|
SemanticLogger[self.class].info(event_message,event_params)
|
64
64
|
previous_timestamp = event.timestamp
|
data/lib/brut/junk_drawer.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
require "pathname"
|
2
|
+
require "yaml"
|
3
|
+
# Not here:
|
4
|
+
# - prevent use of postfix conditonals entirely
|
5
|
+
module Brut
|
6
|
+
IM_NOT_CALLING_THEM_COPS = {
|
7
|
+
"Gemspec/AddRuntimeDependency" => true,
|
8
|
+
"Lint/AmbiguousAssignment" => true,
|
9
|
+
"Lint/AmbiguousOperator" => true,
|
10
|
+
"Lint/AmbiguousOperatorPrecedence" => true,
|
11
|
+
"Lint/AmbiguousRange" => true,
|
12
|
+
"Lint/AmbiguousRegexpLiteral" => true,
|
13
|
+
"Lint/DuplicateCaseCondition" => true,
|
14
|
+
"Lint/DuplicateElsifCondition" => true,
|
15
|
+
"Lint/Loop" => true,
|
16
|
+
"Lint/RedundantSplatExpansion" => true,
|
17
|
+
"Lint/RedundantStringCoercion" => true,
|
18
|
+
"Lint/RedundantTypeConversion" => true,
|
19
|
+
"Lint/ToJSON" => true,
|
20
|
+
"Style/ColonMethodDefinition" => true,
|
21
|
+
"Style/DefWithParentheses" => true,
|
22
|
+
"Style/InvertibleUnlessCondition" => true,
|
23
|
+
"Style/KeywordArgumentsMerging" => true,
|
24
|
+
"Style/MethodDefParentheses" => true,
|
25
|
+
"Style/MissingRespondToMissing" => true,
|
26
|
+
"Style/MultilineTernaryOperator" => true,
|
27
|
+
"Style/NegatedUnless" => true,
|
28
|
+
"Style/NestedTernaryOperator" => true,
|
29
|
+
"Style/PreferredHashMethods" => true,
|
30
|
+
"Style/UnlessElse" => true,
|
31
|
+
"Style/UnlessLogicalOperators" => true,
|
32
|
+
"Layout/DotPosition" => {
|
33
|
+
"EnforcedStyle" => "trailing",
|
34
|
+
},
|
35
|
+
"Lint/AssignmentInCondition" => {
|
36
|
+
"AllowSafeAssignment" => "false",
|
37
|
+
},
|
38
|
+
"Style/ClassMethodsDefinitions" => {
|
39
|
+
"EnforcedStyle" => "def_self",
|
40
|
+
},
|
41
|
+
"Style/CollectionMethods" => {
|
42
|
+
"PreferredMethods" => {
|
43
|
+
"find" => "detect",
|
44
|
+
"collect" => "map",
|
45
|
+
"find_all" => "select",
|
46
|
+
"member?" => "include?",
|
47
|
+
},
|
48
|
+
},
|
49
|
+
"Style/EndlessMethod" => {
|
50
|
+
"EnforcedStyle" => "allow_single_line",
|
51
|
+
},
|
52
|
+
"Style/For" => {
|
53
|
+
"EnforcedStyle" => "each",
|
54
|
+
},
|
55
|
+
"Style/YodaCondition" => {
|
56
|
+
"EnforcedStyle" => "forbid_for_all_comparison_operators",
|
57
|
+
},
|
58
|
+
"Style/DisableSyntax" => {
|
59
|
+
"DisableSyntax" => [
|
60
|
+
"unless",
|
61
|
+
"and_or_not",
|
62
|
+
"until",
|
63
|
+
],
|
64
|
+
},
|
65
|
+
"Style/TrailingCommaInArrayLiteral" => {
|
66
|
+
"EnforcedStyleForMultiline" => "consistent_comma",
|
67
|
+
},
|
68
|
+
"Style/TrailingCommaInHashLiteral" => {
|
69
|
+
"EnforcedStyleForMultiline" => "consistent_comma",
|
70
|
+
},
|
71
|
+
# Documented, but nonexistent
|
72
|
+
#"Style/ItBlockParameter" => {
|
73
|
+
# "EnforcedStyle" => "allow_single_line",
|
74
|
+
#},
|
75
|
+
}
|
76
|
+
PREAMBLE = {
|
77
|
+
"inherit_mode" => {
|
78
|
+
"merge" => [ "Exclude" ],
|
79
|
+
},
|
80
|
+
"plugins" => [
|
81
|
+
"rubocop-disable_syntax",
|
82
|
+
],
|
83
|
+
"AllCops" => {
|
84
|
+
"DisabledByDefault" => true,
|
85
|
+
"TargetRubyVersion" => RUBY_VERSION.split(".")[0..1].join("."),
|
86
|
+
"SuggestExtensions" => false,
|
87
|
+
"Exclude" => [
|
88
|
+
"local-gems/**/*",
|
89
|
+
"**/local-gems/**/*",
|
90
|
+
"node_modules/**/*",
|
91
|
+
"**/node_modules/**/*",
|
92
|
+
],
|
93
|
+
},
|
94
|
+
}
|
95
|
+
class RubocopConfig
|
96
|
+
def create_ridiculous_yaml
|
97
|
+
if !ARGV[0]
|
98
|
+
raise "You must supply the file where the config will be written"
|
99
|
+
end
|
100
|
+
filename = Pathname(ARGV[0])
|
101
|
+
my_big_yaml_hash_of_doom = {}.merge(PREAMBLE)
|
102
|
+
IM_NOT_CALLING_THEM_COPS.each do |not_a_cop, config|
|
103
|
+
body = case config
|
104
|
+
when Hash
|
105
|
+
config
|
106
|
+
when Array
|
107
|
+
config
|
108
|
+
when true
|
109
|
+
{}
|
110
|
+
else
|
111
|
+
raise "#{config.class}/#{config} is not handled by this contraption"
|
112
|
+
end
|
113
|
+
body["Enabled"] = true
|
114
|
+
my_big_yaml_hash_of_doom[not_a_cop] = body
|
115
|
+
end
|
116
|
+
File.open(filename,"w") do |file|
|
117
|
+
file.puts "# This file is generated! DO NOT EDIT (not that you'd want to - it's YAML!)"
|
118
|
+
file.puts "# The configuration is canonically stored in lib/brut/rubocop_config.rb"
|
119
|
+
file.puts my_big_yaml_hash_of_doom.to_yaml
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -51,9 +51,6 @@ module Brut::SpecSupport::ComponentSupport
|
|
51
51
|
# result = generate_and_parse(HeaderComponent.new(title: "Hello!")
|
52
52
|
# expect(result.e!("h1").text).to eq("Hello!")
|
53
53
|
#
|
54
|
-
# @example Using context
|
55
|
-
# result = generate_and_parse(TableRow.new([ "one", "two" ]), context: "tbody")
|
56
|
-
#
|
57
54
|
# @param [Brut::FrontEnd::Component] component the component instance you wish to generate. This should be set up to simulate the test
|
58
55
|
# you are running.
|
59
56
|
# @yield if the component requires or accepts a yielded block, this is how you do that in the test.
|
@@ -100,10 +100,10 @@ class Brut::SpecSupport::RSpecSetup
|
|
100
100
|
if needs_request_context
|
101
101
|
session = {
|
102
102
|
"session_id" => "test-session-id",
|
103
|
-
"csrf" => "test-csrf-token"
|
103
|
+
"csrf" => "test-csrf-token",
|
104
104
|
}
|
105
105
|
env = {
|
106
|
-
"rack.session" => session
|
106
|
+
"rack.session" => session,
|
107
107
|
}
|
108
108
|
app_session = Brut.container.session_class.new(rack_session: session)
|
109
109
|
request_context = Brut::FrontEnd::RequestContext.new(
|
data/lib/brut/version.rb
CHANGED
data/mkbrut/Gemfile.lock
CHANGED
data/mkbrut/dx
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
../dx
|
data/mkbrut/lib/mkbrut/app.rb
CHANGED
data/mkbrut/lib/mkbrut/cli.rb
CHANGED
@@ -100,7 +100,7 @@ module MKBrut
|
|
100
100
|
options[:app_name] = MKBrut::AppName.new(args.first)
|
101
101
|
options[:app_id] = options[:'app-id']
|
102
102
|
options[:dry_run] = !!options[:'dry-run']
|
103
|
-
MKBrut::AppOptions.new(**options
|
103
|
+
MKBrut::AppOptions.new(**options, versions:)
|
104
104
|
end
|
105
105
|
|
106
106
|
end
|
data/mkbrut/mkbrut.gemspec
CHANGED
@@ -114,7 +114,7 @@
|
|
114
114
|
has_interpolations: "Test %{interp} Test",
|
115
115
|
has_pluralizations: {
|
116
116
|
one: "Once!",
|
117
|
-
other: "More than once!"
|
117
|
+
other: "More than once!",
|
118
118
|
},
|
119
119
|
has_pluralizations_and_zero: {
|
120
120
|
zero: "ZERO",
|
@@ -123,6 +123,6 @@
|
|
123
123
|
},
|
124
124
|
simple1: "SIMPLE1",
|
125
125
|
simple2: "SIMPLE2",
|
126
|
-
}
|
126
|
+
},
|
127
127
|
},
|
128
128
|
}
|
@@ -38,6 +38,10 @@ RSpec.describe "RichString" do
|
|
38
38
|
rich_string = RichString.new("Dash--BoardHTMLPage---")
|
39
39
|
expect(rich_string.underscorized.to_s).to eq("dash_board_h_t_m_l_page")
|
40
40
|
end
|
41
|
+
it "handles namespaces" do
|
42
|
+
rich_string = RichString.new("WebHooks::Stripe")
|
43
|
+
expect(rich_string.underscorized.to_s).to eq("web_hooks/stripe")
|
44
|
+
end
|
41
45
|
end
|
42
46
|
describe "#camelize" do
|
43
47
|
it "splits on _ and -, captializes each part and joins them" do
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Bryant Copeland
|
@@ -262,21 +262,21 @@ dependencies:
|
|
262
262
|
- !ruby/object:Gem::Version
|
263
263
|
version: '0'
|
264
264
|
- !ruby/object:Gem::Dependency
|
265
|
-
name:
|
265
|
+
name: bundler
|
266
266
|
requirement: !ruby/object:Gem::Requirement
|
267
267
|
requirements:
|
268
|
-
- - "
|
268
|
+
- - ">="
|
269
269
|
- !ruby/object:Gem::Version
|
270
|
-
version: '
|
270
|
+
version: '0'
|
271
271
|
type: :development
|
272
272
|
prerelease: false
|
273
273
|
version_requirements: !ruby/object:Gem::Requirement
|
274
274
|
requirements:
|
275
|
-
- - "
|
275
|
+
- - ">="
|
276
276
|
- !ruby/object:Gem::Version
|
277
|
-
version: '
|
277
|
+
version: '0'
|
278
278
|
- !ruby/object:Gem::Dependency
|
279
|
-
name:
|
279
|
+
name: dotenv
|
280
280
|
requirement: !ruby/object:Gem::Requirement
|
281
281
|
requirements:
|
282
282
|
- - ">="
|
@@ -290,7 +290,7 @@ dependencies:
|
|
290
290
|
- !ruby/object:Gem::Version
|
291
291
|
version: '0'
|
292
292
|
- !ruby/object:Gem::Dependency
|
293
|
-
name:
|
293
|
+
name: factory_bot
|
294
294
|
requirement: !ruby/object:Gem::Requirement
|
295
295
|
requirements:
|
296
296
|
- - ">="
|
@@ -304,7 +304,21 @@ dependencies:
|
|
304
304
|
- !ruby/object:Gem::Version
|
305
305
|
version: '0'
|
306
306
|
- !ruby/object:Gem::Dependency
|
307
|
-
name:
|
307
|
+
name: faker
|
308
|
+
requirement: !ruby/object:Gem::Requirement
|
309
|
+
requirements:
|
310
|
+
- - ">="
|
311
|
+
- !ruby/object:Gem::Version
|
312
|
+
version: '0'
|
313
|
+
type: :development
|
314
|
+
prerelease: false
|
315
|
+
version_requirements: !ruby/object:Gem::Requirement
|
316
|
+
requirements:
|
317
|
+
- - ">="
|
318
|
+
- !ruby/object:Gem::Version
|
319
|
+
version: '0'
|
320
|
+
- !ruby/object:Gem::Dependency
|
321
|
+
name: rake
|
308
322
|
requirement: !ruby/object:Gem::Requirement
|
309
323
|
requirements:
|
310
324
|
- - ">="
|
@@ -346,7 +360,7 @@ dependencies:
|
|
346
360
|
- !ruby/object:Gem::Version
|
347
361
|
version: '0'
|
348
362
|
- !ruby/object:Gem::Dependency
|
349
|
-
name:
|
363
|
+
name: rubocop
|
350
364
|
requirement: !ruby/object:Gem::Requirement
|
351
365
|
requirements:
|
352
366
|
- - ">="
|
@@ -360,7 +374,7 @@ dependencies:
|
|
360
374
|
- !ruby/object:Gem::Version
|
361
375
|
version: '0'
|
362
376
|
- !ruby/object:Gem::Dependency
|
363
|
-
name:
|
377
|
+
name: rubocop-disable_syntax
|
364
378
|
requirement: !ruby/object:Gem::Requirement
|
365
379
|
requirements:
|
366
380
|
- - ">="
|
@@ -374,7 +388,21 @@ dependencies:
|
|
374
388
|
- !ruby/object:Gem::Version
|
375
389
|
version: '0'
|
376
390
|
- !ruby/object:Gem::Dependency
|
377
|
-
name:
|
391
|
+
name: rspec
|
392
|
+
requirement: !ruby/object:Gem::Requirement
|
393
|
+
requirements:
|
394
|
+
- - "~>"
|
395
|
+
- !ruby/object:Gem::Version
|
396
|
+
version: '3.0'
|
397
|
+
type: :development
|
398
|
+
prerelease: false
|
399
|
+
version_requirements: !ruby/object:Gem::Requirement
|
400
|
+
requirements:
|
401
|
+
- - "~>"
|
402
|
+
- !ruby/object:Gem::Version
|
403
|
+
version: '3.0'
|
404
|
+
- !ruby/object:Gem::Dependency
|
405
|
+
name: yard
|
378
406
|
requirement: !ruby/object:Gem::Requirement
|
379
407
|
requirements:
|
380
408
|
- - ">="
|
@@ -397,7 +425,6 @@ files:
|
|
397
425
|
- ".gitignore"
|
398
426
|
- ".nvim.lua"
|
399
427
|
- ".projections.json"
|
400
|
-
- ".rspec"
|
401
428
|
- CHANGELOG.md
|
402
429
|
- CODE_OF_CONDUCT.txt
|
403
430
|
- Dockerfile.dx
|
@@ -420,10 +447,13 @@ files:
|
|
420
447
|
- bin/ci
|
421
448
|
- bin/dev
|
422
449
|
- bin/docs
|
450
|
+
- bin/generate-and-run-rubocop
|
423
451
|
- bin/publish
|
424
452
|
- bin/rake
|
425
453
|
- bin/rspec
|
454
|
+
- bin/rubocop
|
426
455
|
- bin/setup
|
456
|
+
- bin/test
|
427
457
|
- brut-css/.nvim.lua
|
428
458
|
- brut-css/README.md
|
429
459
|
- brut-css/bin/build
|
@@ -770,6 +800,7 @@ files:
|
|
770
800
|
- docs/api/Brut/FrontEnd/Components/PageIdentifier.html
|
771
801
|
- docs/api/Brut/FrontEnd/Components/TimeTag.html
|
772
802
|
- docs/api/Brut/FrontEnd/Components/Traceparent.html
|
803
|
+
- docs/api/Brut/FrontEnd/CsrfProtector.html
|
773
804
|
- docs/api/Brut/FrontEnd/Download.html
|
774
805
|
- docs/api/Brut/FrontEnd/Flash.html
|
775
806
|
- docs/api/Brut/FrontEnd/Form.html
|
@@ -839,6 +870,7 @@ files:
|
|
839
870
|
- docs/api/Brut/Instrumentation/OpenTelemetry.html
|
840
871
|
- docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html
|
841
872
|
- docs/api/Brut/Instrumentation/OpenTelemetry/Span.html
|
873
|
+
- docs/api/Brut/RubocopConfig.html
|
842
874
|
- docs/api/Brut/SinatraHelpers.html
|
843
875
|
- docs/api/Brut/SinatraHelpers/ClassMethods.html
|
844
876
|
- docs/api/Brut/SpecSupport.html
|
@@ -905,31 +937,31 @@ files:
|
|
905
937
|
- docs/assets/adrs.md.BxjHi9-8.lean.js
|
906
938
|
- docs/assets/ai.md.Cy9GWnER.js
|
907
939
|
- docs/assets/ai.md.Cy9GWnER.lean.js
|
908
|
-
- docs/assets/app.
|
940
|
+
- docs/assets/app.CmkhEsw7.js
|
909
941
|
- docs/assets/assets.md.7C3HWkga.js
|
910
942
|
- docs/assets/assets.md.7C3HWkga.lean.js
|
911
943
|
- docs/assets/brut-js.md.B4GYxQVw.js
|
912
944
|
- docs/assets/brut-js.md.B4GYxQVw.lean.js
|
913
945
|
- docs/assets/business-logic.md.BY4hGy0m.js
|
914
946
|
- docs/assets/business-logic.md.BY4hGy0m.lean.js
|
915
|
-
- docs/assets/chunks/@localSearchIndexroot.
|
916
|
-
- docs/assets/chunks/VPLocalSearchBox.
|
947
|
+
- docs/assets/chunks/@localSearchIndexroot.DUha-mf5.js
|
948
|
+
- docs/assets/chunks/VPLocalSearchBox.CDh583Oj.js
|
917
949
|
- docs/assets/chunks/framework.1L-BeKqY.js
|
918
|
-
- docs/assets/chunks/theme.
|
950
|
+
- docs/assets/chunks/theme.B0_7GeW8.js
|
919
951
|
- docs/assets/cli.md.CjsktgFz.js
|
920
952
|
- docs/assets/cli.md.CjsktgFz.lean.js
|
921
|
-
- docs/assets/components.md.
|
922
|
-
- docs/assets/components.md.
|
923
|
-
- docs/assets/configuration.md.
|
924
|
-
- docs/assets/configuration.md.
|
953
|
+
- docs/assets/components.md.-22ecBxM.js
|
954
|
+
- docs/assets/components.md.-22ecBxM.lean.js
|
955
|
+
- docs/assets/configuration.md.CLKL1lFf.js
|
956
|
+
- docs/assets/configuration.md.CLKL1lFf.lean.js
|
925
957
|
- docs/assets/css.md.CltvJqAa.js
|
926
958
|
- docs/assets/css.md.CltvJqAa.lean.js
|
927
959
|
- docs/assets/custom-element-tests.md.B_rbta32.js
|
928
960
|
- docs/assets/custom-element-tests.md.B_rbta32.lean.js
|
929
961
|
- docs/assets/database-access.md.gnluu54N.js
|
930
962
|
- docs/assets/database-access.md.gnluu54N.lean.js
|
931
|
-
- docs/assets/database-schema.md.
|
932
|
-
- docs/assets/database-schema.md.
|
963
|
+
- docs/assets/database-schema.md.LpmBPVEU.js
|
964
|
+
- docs/assets/database-schema.md.LpmBPVEU.lean.js
|
933
965
|
- docs/assets/deployment.md.BLseERGV.js
|
934
966
|
- docs/assets/deployment.md.BLseERGV.lean.js
|
935
967
|
- docs/assets/dev-env-protocol.DysDAtnz.png
|
@@ -947,10 +979,10 @@ files:
|
|
947
979
|
- docs/assets/flash-and-session.md.nPvUpnUx.lean.js
|
948
980
|
- docs/assets/form-constraints.md.DK5adCgM.js
|
949
981
|
- docs/assets/form-constraints.md.DK5adCgM.lean.js
|
950
|
-
- docs/assets/forms.md.
|
951
|
-
- docs/assets/forms.md.
|
952
|
-
- docs/assets/getting-started.md.
|
953
|
-
- docs/assets/getting-started.md.
|
982
|
+
- docs/assets/forms.md.CBI5--o2.js
|
983
|
+
- docs/assets/forms.md.CBI5--o2.lean.js
|
984
|
+
- docs/assets/getting-started.md.D5nzBZ4J.js
|
985
|
+
- docs/assets/getting-started.md.D5nzBZ4J.lean.js
|
954
986
|
- docs/assets/handlers.md.h84MMB1R.js
|
955
987
|
- docs/assets/handlers.md.h84MMB1R.lean.js
|
956
988
|
- docs/assets/hooks.md.Jmb5VOLA.js
|
@@ -989,8 +1021,8 @@ files:
|
|
989
1021
|
- docs/assets/recipes_custom-flash.md.CrQbI5eH.lean.js
|
990
1022
|
- docs/assets/recipes_indexed-forms.md.CstYyOSo.js
|
991
1023
|
- docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js
|
992
|
-
- docs/assets/recipes_migrations.md.
|
993
|
-
- docs/assets/recipes_migrations.md.
|
1024
|
+
- docs/assets/recipes_migrations.md.CTcnWDJF.js
|
1025
|
+
- docs/assets/recipes_migrations.md.CTcnWDJF.lean.js
|
994
1026
|
- docs/assets/recipes_text-field-component.md.H4wLAK0Z.js
|
995
1027
|
- docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js
|
996
1028
|
- docs/assets/roadmap.md.C6PRi0DX.js
|
@@ -1221,6 +1253,7 @@ files:
|
|
1221
1253
|
- lib/brut/front_end/components/page_identifier.rb
|
1222
1254
|
- lib/brut/front_end/components/time_tag.rb
|
1223
1255
|
- lib/brut/front_end/components/traceparent.rb
|
1256
|
+
- lib/brut/front_end/csrf_protector.rb
|
1224
1257
|
- lib/brut/front_end/download.rb
|
1225
1258
|
- lib/brut/front_end/flash.rb
|
1226
1259
|
- lib/brut/front_end/form.rb
|
@@ -1272,6 +1305,7 @@ files:
|
|
1272
1305
|
- lib/brut/instrumentation/logger_span_exporter.rb
|
1273
1306
|
- lib/brut/instrumentation/open_telemetry.rb
|
1274
1307
|
- lib/brut/junk_drawer.rb
|
1308
|
+
- lib/brut/rubocop_config.rb
|
1275
1309
|
- lib/brut/sinatra_helpers.rb
|
1276
1310
|
- lib/brut/spec_support.rb
|
1277
1311
|
- lib/brut/spec_support/clock_support.rb
|
@@ -1319,6 +1353,7 @@ files:
|
|
1319
1353
|
- mkbrut/brut-welcome.png
|
1320
1354
|
- mkbrut/deploy/.dockerignore
|
1321
1355
|
- mkbrut/deploy/Dockerfile
|
1356
|
+
- mkbrut/dx
|
1322
1357
|
- mkbrut/exe/mkbrut
|
1323
1358
|
- mkbrut/lib/mkbrut.rb
|
1324
1359
|
- mkbrut/lib/mkbrut/app.rb
|
@@ -1467,13 +1502,15 @@ files:
|
|
1467
1502
|
- specs/support.rb
|
1468
1503
|
- specs/support/matchers.rb
|
1469
1504
|
- specs/support/matchers/have_constraint_violation.rb
|
1470
|
-
homepage: https://
|
1505
|
+
homepage: https://brutrb.com
|
1471
1506
|
licenses: []
|
1472
1507
|
metadata:
|
1473
1508
|
allowed_push_host: https://rubygems.org
|
1474
|
-
homepage_uri: https://
|
1475
|
-
source_code_uri: https://
|
1476
|
-
changelog_uri: https://
|
1509
|
+
homepage_uri: https://brutrb.com
|
1510
|
+
source_code_uri: https://github.com/thirdtank/brut
|
1511
|
+
changelog_uri: https://github.com/thirdtank/brut/blob/main/CHANGELOG.md
|
1512
|
+
documentation_uri: https://brutrb.com/
|
1513
|
+
rubygems_mfa_required: 'true'
|
1477
1514
|
rdoc_options: []
|
1478
1515
|
require_paths:
|
1479
1516
|
- lib
|
data/.rspec
DELETED