hecks 2.8.0 → 2.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/exe/hecks +4 -6
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +17 -98
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +4 -30
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres.rb +145 -134
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +7 -30
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +5 -48
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +31 -141
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +10 -48
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +14 -63
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -194
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +19 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +37 -660
- data/lib/hecks/bluebook/hexagon.rb +5 -28
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +43 -305
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +79 -349
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +100 -597
- data/lib/hecks/bluebook/pattern_subset.rb +11 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +9 -48
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +8 -98
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/cli/document.rb +3 -21
- data/lib/hecks/cli/ir.rb +3 -5
- data/lib/hecks/cli/mcp.rb +2 -3
- data/lib/hecks/cli/mcp_door.rb +19 -114
- data/lib/hecks/cli/model_check.rb +18 -85
- data/lib/hecks/cli/project_cli.rb +7 -40
- data/lib/hecks/cli/project_diagrams.rb +0 -7
- data/lib/hecks/cli/run.rb +12 -58
- data/lib/hecks/cli/smoke_test.rb +2 -16
- data/lib/hecks/cli/stores.rb +1 -2
- data/lib/hecks/cli.rb +18 -24
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +4 -71
- data/lib/hecks/facade/cli_door.rb +24 -106
- data/lib/hecks/facade/cli_runner.rb +28 -172
- data/lib/hecks/facade/command_request.rb +13 -33
- data/lib/hecks/facade/handle.rb +34 -121
- data/lib/hecks/facade/json_door.rb +31 -146
- data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
- data/lib/hecks/facade/surface/chapter.rb +10 -54
- data/lib/hecks/facade/surface.rb +8 -23
- data/lib/hecks/facade.rb +10 -25
- data/lib/hecks/forms/app.rb +15 -70
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +30 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +12 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +82 -197
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_door_scope.rb +9 -90
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +23 -103
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projections/bootstrap_table.rb +11 -43
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +35 -202
- data/lib/hecks/projections/deploy/lambda.rb +150 -678
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +2 -58
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +47 -146
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +20 -582
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +15 -42
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +9 -28
- data/lib/hecks/projections/reference.rb +2 -15
- data/lib/hecks/projections/rust_vocabulary.rb +12 -250
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +60 -375
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +3 -6
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/gem_publisher.rb +2 -3
- data/lib/hecks/release/runner/npm_publisher.rb +6 -20
- data/lib/hecks/release/runner/preflight.rb +4 -19
- data/lib/hecks/release/runner/tagger.rb +2 -9
- data/lib/hecks/release/runner.rb +3 -32
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +12 -36
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +30 -102
- data/lib/hecks/runtime/dispatcher.rb +82 -241
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +11 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +48 -186
- data/lib/hecks/runtime/outbox.rb +38 -261
- data/lib/hecks/runtime/policy_interpreter.rb +38 -200
- data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
- data/lib/hecks/runtime/query_interpreter.rb +45 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +8 -89
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +52 -225
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +99 -244
- data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +155 -641
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value.rb +12 -84
- data/lib/hecks/runtime.rb +17 -65
- data/lib/hecks/storehouse.rb +141 -568
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +26 -81
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- metadata +3 -2
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module Bluebook
|
|
3
3
|
module DSL
|
|
4
|
-
# A
|
|
5
|
-
#
|
|
6
|
-
# dynamic extent of a block, so a bare, not-yet-declared constant
|
|
7
|
-
# inside a DSL block (a bareword type, `Domain::Aggregate`, ...)
|
|
8
|
-
# resolves to whatever that DSL context needs (a name, a
|
|
9
|
-
# `BindingProxy`, a `ScopedConstant`) instead of raising `NameError`.
|
|
4
|
+
# A `const_missing` bridge: `.with(resolver) { ... }` lets bare, undeclared constants in a
|
|
5
|
+
# DSL block resolve through the resolver instead of raising `NameError`.
|
|
10
6
|
module ConstShim
|
|
11
7
|
class << self
|
|
12
8
|
attr_accessor :resolver
|
|
@@ -33,24 +29,8 @@ module Hecks
|
|
|
33
29
|
def active? = !@resolver.nil?
|
|
34
30
|
end
|
|
35
31
|
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
# `admits: Account::LedgerDirection` could never resolve past
|
|
39
|
-
# their first segment while `Account` returned a bare Symbol
|
|
40
|
-
# (`resolver = ->(const) { const }`, bluebook_builder.rb's own
|
|
41
|
-
# comment on why that was right for a bare name): Ruby's `::`
|
|
42
|
-
# operator raises `TypeError` on the returned value before any
|
|
43
|
-
# DSL code runs at all, unless that value is itself a Module.
|
|
44
|
-
#
|
|
45
|
-
# A real `Module` subclass, not a decorated Symbol, for exactly
|
|
46
|
-
# that reason — nothing else answers `::`. Every consumer of a
|
|
47
|
-
# bareword type keeps working duck-typed: `Attribute#spell`'s
|
|
48
|
-
# `type.is_a?(Module)` branch fires for one of these where a
|
|
49
|
-
# bare Symbol falls to `type.to_s`, and `Naming.demodulise`
|
|
50
|
-
# (`path.split("::").last`) gives the identical string either
|
|
51
|
-
# way for a single segment — the two branches are equivalent
|
|
52
|
-
# for a name with no `::` in it, which is every unscoped
|
|
53
|
-
# bareword.
|
|
32
|
+
# Answers `::` on a bareword: a Symbol raises `TypeError` there, only a Module can chain.
|
|
33
|
+
# A Module subclass so `Account::Debit` resolves; `to_s` matches the bare-name spelling.
|
|
54
34
|
class ScopedConstant < Module
|
|
55
35
|
# Wraps a constant path, the form a `ConstShim` resolver hands back for a bareword.
|
|
56
36
|
#
|
|
@@ -65,13 +45,7 @@ module Hecks
|
|
|
65
45
|
end
|
|
66
46
|
|
|
67
47
|
# Extends the path by one segment, so `Account::Debit` resolves past `Account`.
|
|
68
|
-
#
|
|
69
|
-
# One more segment, the same way an unresolved const anywhere
|
|
70
|
-
# else does — `Account::Debit::Anything` keeps chaining rather
|
|
71
|
-
# than refusing, since nothing here knows how deep a reference
|
|
72
|
-
# is meant to go; the DSL keyword that finally reads `.to_s`
|
|
73
|
-
# is the one place that does.
|
|
74
|
-
#
|
|
48
|
+
# Chains without limit: nothing here knows how deep a reference goes.
|
|
75
49
|
# @param name [Symbol] the segment written after `::`
|
|
76
50
|
# @return [Bluebook::DSL::ConstShim::ScopedConstant] a new constant for the longer path
|
|
77
51
|
def const_missing(name) = ScopedConstant.for("#{@path}::#{name}")
|
|
@@ -80,8 +54,7 @@ module Hecks
|
|
|
80
54
|
def to_sym = @path.to_sym
|
|
81
55
|
def inspect = @path
|
|
82
56
|
|
|
83
|
-
# Exposes the raw path
|
|
84
|
-
# two scoped constants without going through `to_s`.
|
|
57
|
+
# Exposes the raw path so `==` can compare two scoped constants without `to_s`.
|
|
85
58
|
#
|
|
86
59
|
# @return [String] the `::`-joined path, such as `"Account::Debit"`
|
|
87
60
|
def hecks_path = @path
|
|
@@ -91,14 +64,8 @@ module Hecks
|
|
|
91
64
|
def hash = @path.hash
|
|
92
65
|
end
|
|
93
66
|
|
|
94
|
-
#
|
|
95
|
-
#
|
|
96
|
-
# Module (so that `Vocabulary::QueryComparator` reaches a second
|
|
97
|
-
# `const_missing`) was tried and cannot be made to hold : `Facade::
|
|
98
|
-
# Surface` installs every aggregate name as a top-level constant, so
|
|
99
|
-
# once any facade is built, `Vocabulary` resolves to that real module
|
|
100
|
-
# and never reaches this hook at all. A spelling that works only
|
|
101
|
-
# before a facade exists is worse than one that always works.
|
|
67
|
+
# Scoped names are written as text, not constant paths (see `admits:`): once a facade
|
|
68
|
+
# installs aggregate names as top-level constants, `Vocabulary` never reaches this hook.
|
|
102
69
|
module Hook
|
|
103
70
|
# Answers an undeclared top-level constant from the active resolver, if there is one.
|
|
104
71
|
#
|
|
@@ -2,33 +2,15 @@ require_relative "word_gate"
|
|
|
2
2
|
module Hecks
|
|
3
3
|
module Bluebook
|
|
4
4
|
module DSL
|
|
5
|
-
# Parses a `domain_port "Name" do ... end` block into a `DomainPort`
|
|
6
|
-
#
|
|
7
|
-
# domain exchanges with the outside world. Falls back to building a
|
|
8
|
-
# plain `Port` (the same object `PortBuilder` builds) when the block is
|
|
9
|
-
# bare-verb shaped instead, so an existing top-level `.port` file can
|
|
10
|
-
# migrate to being parsed by this builder — see `legacy_bare_port:`'s
|
|
11
|
-
# own comment on `#initialize`.
|
|
5
|
+
# Parses a `domain_port "Name" do ... end` block into a `DomainPort` of inbound (`tells`)
|
|
6
|
+
# and outbound (`asks`) operations, or a plain `Port` when the body is bare-verb shaped.
|
|
12
7
|
class DomainPortBuilder
|
|
13
8
|
GRAMMAR_CONTEXT = "DomainPort".freeze
|
|
14
9
|
|
|
15
10
|
include WordGate
|
|
16
11
|
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
# an empty build (no verb, no signal, nothing) — `Port.new(verb:
|
|
20
|
-
# nil, signal: :reply)` is a real, allowed shape dsl_spec.rb's own
|
|
21
|
-
# "a port" tests rely on (`signal`-only, no `verb` at all). The
|
|
22
|
-
# aggregate-scoped (`BindingProxy#port`) and hecksagon-root
|
|
23
|
-
# (`HecksagonBuilder#port_impl`) callers both reach this same
|
|
24
|
-
# class with `owner: nil` too when they're building the bare-verb
|
|
25
|
-
# shape (`port_impl`'s own root-level port can be either shape,
|
|
26
|
-
# decided only after `build` returns) — so `owner.nil?` cannot be
|
|
27
|
-
# the discriminator between "old Hecks.port semantics" and "real
|
|
28
|
-
# DomainPort semantics"; those two callers correctly want the
|
|
29
|
-
# stricter "declares no verb and no operations" refusal `build`
|
|
30
|
-
# already raises below, unchanged. Only the literal top-level
|
|
31
|
-
# `.port` file caller wants the older, looser rule.
|
|
12
|
+
# Only the top-level `Hecks.port` passes `legacy_bare_port: true`, so its empty body builds
|
|
13
|
+
# a verbless `Port`. Aggregate-scoped and hecksagon-root callers keep the stricter refusal.
|
|
32
14
|
#
|
|
33
15
|
# @param name [String] the port's name
|
|
34
16
|
# @param owner [String, nil] name of the aggregate the port is declared on, handed to
|
|
@@ -46,18 +28,7 @@ module Hecks
|
|
|
46
28
|
|
|
47
29
|
# Declares an inbound operation: a fact the outside world delivers to this domain.
|
|
48
30
|
#
|
|
49
|
-
#
|
|
50
|
-
# into this domain's own word for it. Spelled `operation` or `tells`;
|
|
51
|
-
# `operation` stays because the corpus is full of it, and renaming
|
|
52
|
-
# a word costs every chapter that uses it for no gain a reader can
|
|
53
|
-
# feel.
|
|
54
|
-
#
|
|
55
|
-
# Answers both words — item #13's full metaprogrammed dispatch
|
|
56
|
-
# (slice 4c). `operation`/`tells` are two separate Keyword rows
|
|
57
|
-
# (a word admitting two forms) that both name `calls: "tells_impl"`
|
|
58
|
-
# — the routing between the two spellings lives in the table,
|
|
59
|
-
# not in a Ruby `alias`. Not bootstrap-reachable (checked
|
|
60
|
-
# directly), so its `BOOTSTRAP_CALLS_FALLBACK` row is never consulted.
|
|
31
|
+
# Spelled `operation` or `tells`; both route here through the keyword table.
|
|
61
32
|
#
|
|
62
33
|
# @param name [String] the operation's name, such as `"PaymentSettled"`
|
|
63
34
|
# @param to [Symbol, String, Module, nil] the aggregate the operation routes to, written
|
|
@@ -73,21 +44,11 @@ module Hecks
|
|
|
73
44
|
|
|
74
45
|
# Declares an outbound operation: a question this domain puts to the outside world.
|
|
75
46
|
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
# like any other port operation, so
|
|
79
|
-
# a `policy` can trigger it off an event, and it comes back as one of
|
|
80
|
-
# the two events it named — which is what makes the outside world
|
|
81
|
-
# something the model can reason about rather than a place exceptions
|
|
82
|
-
# come from.
|
|
83
|
-
#
|
|
84
|
-
# Answers the `asks` word through the table's `calls:` column — item
|
|
85
|
-
# #13's full metaprogrammed dispatch (slice 4c), same reasoning as
|
|
86
|
-
# `tells_impl` above.
|
|
47
|
+
# Dispatched like any port operation, so a `policy` can trigger it off an event; it comes
|
|
48
|
+
# back as one of the two events it named.
|
|
87
49
|
#
|
|
88
50
|
# @param name [String] the operation's name
|
|
89
|
-
# @param to [Symbol, String, Module, nil] the aggregate the operation routes to,
|
|
90
|
-
# as a bare constant; nil leaves routing to the operation's own attributes
|
|
51
|
+
# @param to [Symbol, String, Module, nil] the aggregate the operation routes to, or nil
|
|
91
52
|
# @yield the operation body (`attribute`, `answers`, `refuses`), evaluated against a
|
|
92
53
|
# `PortOperationBuilder`
|
|
93
54
|
# @return [Array<Bluebook::PortOperation>] every operation declared so far, this one last
|
|
@@ -97,34 +58,8 @@ module Hecks
|
|
|
97
58
|
@operations << PortOperationBuilder.build(name, to: to, owner: @owner, direction: :outbound, &)
|
|
98
59
|
end
|
|
99
60
|
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
# channel back to a caller beyond the events it emits. `verb` is the
|
|
103
|
-
# opposite direction: the domain calling out to a swappable adapter
|
|
104
|
-
# and getting a real value back (a checkout URL, a fetched document),
|
|
105
|
-
# exactly what `Hecks.port "name" do verb "x" end` already builds —
|
|
106
|
-
# this is that same `Port`, reached from the same `port` call
|
|
107
|
-
# `operation` already lives under, so a project's own resource ports
|
|
108
|
-
# read next to their binding instead of in a separate file. One port,
|
|
109
|
-
# one shape or the other — never both.
|
|
110
|
-
# `verb` — item #13's full metaprogrammed dispatch, slice 1
|
|
111
|
-
# (whole-project table-unification survey): a bare, kind-driven
|
|
112
|
-
# coerce-and-assign with nothing else, now executed by
|
|
113
|
-
# `GenericDispatch`.
|
|
114
|
-
|
|
115
|
-
# Names the verb aggregates call this port by, which makes it a driven `Port` rather than
|
|
116
|
-
# a `DomainPort` of operations.
|
|
117
|
-
#
|
|
118
|
-
# `Hecks.port "x" do verb "y"; signal :effect end`'s own two words,
|
|
119
|
-
# reachable here too — a bare-verb `DomainPortBuilder.build` falls
|
|
120
|
-
# back to the same `Port` object `PortBuilder` produces (`build`,
|
|
121
|
-
# below), so any `.port` file can migrate to being parsed by this
|
|
122
|
-
# builder with zero change to its own text, or to any caller that
|
|
123
|
-
# reads `.verb`/`.signal` off the `Port` it gets back. Ordinary
|
|
124
|
-
# `def`s, exactly like `PortBuilder`'s own — `WordGate`'s own
|
|
125
|
-
# header is explicit that a word answered this way never reaches
|
|
126
|
-
# its `method_missing`, so no new self-hosted grammar row is
|
|
127
|
-
# needed for either word under this context.
|
|
61
|
+
# Names the verb aggregates call this port by, making it a driven `Port` rather than a
|
|
62
|
+
# `DomainPort` of operations. A port is one shape or the other, never both.
|
|
128
63
|
#
|
|
129
64
|
# @param value [String, Symbol] the verb, such as `"charged_by"`
|
|
130
65
|
# @return [String] the verb as stored
|
|
@@ -138,16 +73,7 @@ module Hecks
|
|
|
138
73
|
def signal(value) = @signal = value.to_sym
|
|
139
74
|
|
|
140
75
|
# Declares one method an adapter bound to a verb-shaped port must respond to.
|
|
141
|
-
#
|
|
142
|
-
# **The method contract** — `PortBuilder#answers`'s own twin: a
|
|
143
|
-
# `.port` file parsed through this builder (the repoint
|
|
144
|
-
# `lib/hecks.rb#port`'s own comment describes) can declare one
|
|
145
|
-
# (`extraction.port`'s own
|
|
146
|
-
# `answers :canonical`, real, live corpus text) — this builder's
|
|
147
|
-
# bare-verb fallback needs to carry it through to the same `Port`
|
|
148
|
-
# object `PortBuilder` itself would have built, or the migration
|
|
149
|
-
# would silently drop a method-contract check for any `.port`
|
|
150
|
-
# file that uses this word.
|
|
76
|
+
# The bare-verb fallback carries it onto the `Port`, as `PortBuilder#answers` does.
|
|
151
77
|
#
|
|
152
78
|
# @param name [Symbol, String] the method name, such as `:canonical`
|
|
153
79
|
# @return [Array<Symbol>] every method declared so far, this one last
|
|
@@ -178,8 +104,7 @@ module Hecks
|
|
|
178
104
|
# Evaluates a `port` block against a fresh builder and returns whichever shape it declared.
|
|
179
105
|
#
|
|
180
106
|
# @param name [String] the port's name
|
|
181
|
-
# @param owner [String, nil]
|
|
182
|
-
# root-level or top-level port
|
|
107
|
+
# @param owner [String, nil] the aggregate the port is declared on, or nil
|
|
183
108
|
# @param legacy_bare_port [Boolean] true only for `Hecks.port`, which lets an empty body
|
|
184
109
|
# build a verbless `Port`
|
|
185
110
|
# @yield the port body, evaluated with the builder as `self`; may be omitted
|