hecks 1.3.0 → 1.5.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/lib/hecks/adapters/driven/claude_code.rb +72 -7
- data/lib/hecks/adapters/driven/d1.rb +187 -23
- data/lib/hecks/adapters/driven/folder.rb +83 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +33 -12
- data/lib/hecks/adapters/driven/governance_authorization.rb +87 -18
- data/lib/hecks/adapters/driven/heki/journal.rb +13 -4
- data/lib/hecks/adapters/driven/heki/saga_store.rb +56 -10
- data/lib/hecks/adapters/driven/heki/snapshot.rb +1 -1
- data/lib/hecks/adapters/driven/heki.rb +106 -9
- data/lib/hecks/adapters/driven/identity_registry.rb +12 -2
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +25 -3
- data/lib/hecks/adapters/driven/in_process_key_vault.adapter +3 -0
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +53 -0
- data/lib/hecks/adapters/driven/lambda/client.rb +67 -14
- data/lib/hecks/adapters/driven/lambda.rb +82 -35
- data/lib/hecks/adapters/driven/local_storage.rb +83 -10
- data/lib/hecks/adapters/driven/memory.rb +205 -9
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +21 -1
- data/lib/hecks/adapters/driven/postgres/codec.rb +27 -11
- data/lib/hecks/adapters/driven/postgres/outbox.rb +40 -2
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +23 -7
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +14 -14
- data/lib/hecks/adapters/driven/postgres.rb +175 -28
- data/lib/hecks/adapters/driven/prism.rb +50 -11
- data/lib/hecks/adapters/driven/secure_random_identity.rb +3 -0
- data/lib/hecks/adapters/driven/sql_query_builder.rb +34 -22
- data/lib/hecks/adapters/driven/sqlite/codec.rb +38 -10
- data/lib/hecks/adapters/driven/sqlite/projection.rb +60 -32
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +12 -12
- data/lib/hecks/adapters/driven/sqlite.rb +181 -21
- data/lib/hecks/adapters/driven/system_clock.rb +3 -0
- data/lib/hecks/adapters/driven/tenant_provisioner.adapter +3 -0
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +66 -0
- data/lib/hecks/adapters/driven.rb +6 -4
- data/lib/hecks/adapters/driving/github_webhook.rb +31 -18
- data/lib/hecks/behaviors/dsl.rb +60 -2
- data/lib/hecks/behaviors/expectations.rb +190 -29
- data/lib/hecks/behaviors/ir.rb +12 -1
- data/lib/hecks/behaviors/rspec.rb +9 -1
- data/lib/hecks/behaviors/runner.rb +21 -2
- data/lib/hecks/behaviors.rb +9 -1
- data/lib/hecks/bluebook/aggregate.rb +43 -13
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +17 -10
- data/lib/hecks/bluebook/assembly/build.rb +26 -5
- data/lib/hecks/bluebook/assembly/contract.rb +98 -23
- data/lib/hecks/bluebook/assembly/contracts.rb +59 -52
- data/lib/hecks/bluebook/assembly/marks.rb +159 -30
- data/lib/hecks/bluebook/assembly/specializer.rb +38 -21
- data/lib/hecks/bluebook/assembly.rb +32 -14
- data/lib/hecks/bluebook/attribute.rb +26 -12
- data/lib/hecks/bluebook/behaviour/aggregate.rb +43 -11
- data/lib/hecks/bluebook/behaviour/attribute.rb +18 -5
- data/lib/hecks/bluebook/behaviour/chapter.rb +76 -5
- data/lib/hecks/bluebook/behaviour/command.rb +55 -25
- data/lib/hecks/bluebook/behaviour/domain_port.rb +27 -7
- data/lib/hecks/bluebook/behaviour/entity.rb +20 -8
- data/lib/hecks/bluebook/behaviour/hexagon.rb +30 -4
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +27 -6
- data/lib/hecks/bluebook/behaviour/policy.rb +42 -17
- data/lib/hecks/bluebook/behaviour/process_manager.rb +39 -8
- data/lib/hecks/bluebook/behaviour/query.rb +6 -1
- data/lib/hecks/bluebook/behaviour/read_model.rb +29 -8
- data/lib/hecks/bluebook/behaviour/traits.rb +48 -12
- data/lib/hecks/bluebook/behaviour/value_object.rb +21 -9
- data/lib/hecks/bluebook/capabilities.rb +27 -0
- data/lib/hecks/bluebook/chapter.rb +51 -9
- data/lib/hecks/bluebook/command.rb +62 -17
- data/lib/hecks/bluebook/domain_port.rb +34 -9
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +24 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +49 -49
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +282 -123
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +112 -75
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +81 -2
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +486 -117
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +179 -47
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +284 -122
- data/lib/hecks/bluebook/dsl/const_shim.rb +46 -15
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +90 -25
- data/lib/hecks/bluebook/dsl/entity_builder.rb +191 -61
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +130 -30
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +38 -21
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
- data/lib/hecks/bluebook/dsl/policy_builder.rb +86 -36
- data/lib/hecks/bluebook/dsl/port_builder.rb +38 -7
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +56 -22
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +111 -47
- data/lib/hecks/bluebook/dsl/query_builder.rb +37 -8
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +127 -52
- data/lib/hecks/bluebook/dsl/rule_reference.rb +97 -43
- data/lib/hecks/bluebook/dsl/translation_builder.rb +150 -44
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +68 -20
- data/lib/hecks/bluebook/dsl/word_gate.rb +59 -53
- data/lib/hecks/bluebook/dsl/world_builder.rb +51 -8
- data/lib/hecks/bluebook/entity.rb +40 -11
- data/lib/hecks/bluebook/expression/ast_json.rb +128 -36
- data/lib/hecks/bluebook/expression/ast_reader.rb +32 -3
- data/lib/hecks/bluebook/expression/canonical_form.rb +55 -16
- data/lib/hecks/bluebook/expression/evaluator.rb +221 -43
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +54 -18
- data/lib/hecks/bluebook/expression/resolver.rb +369 -128
- data/lib/hecks/bluebook/hexagon.rb +35 -1
- data/lib/hecks/bluebook/lifecycle.rb +12 -1
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/judge.rb +126 -108
- data/lib/hecks/bluebook/meta_validator/plan.rb +81 -46
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +3 -2
- data/lib/hecks/bluebook/meta_validator/readings.rb +200 -50
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +68 -41
- data/lib/hecks/bluebook/meta_validator/shapes.rb +166 -21
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +286 -46
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +11 -10
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -5
- data/lib/hecks/bluebook/meta_validator.rb +235 -139
- data/lib/hecks/bluebook/model_check.rb +434 -104
- data/lib/hecks/bluebook/pattern_subset.rb +32 -10
- data/lib/hecks/bluebook/policy.rb +15 -13
- data/lib/hecks/bluebook/process_manager.rb +27 -14
- data/lib/hecks/bluebook/project_discovery.rb +5 -0
- data/lib/hecks/bluebook/project_loader.rb +40 -0
- data/lib/hecks/bluebook/project_register.rb +50 -6
- data/lib/hecks/bluebook/query.rb +31 -4
- data/lib/hecks/bluebook/read_model.rb +35 -15
- data/lib/hecks/bluebook/reference.rb +26 -13
- data/lib/hecks/bluebook/smoke_test.rb +46 -23
- data/lib/hecks/bluebook/synthesizer.rb +46 -12
- data/lib/hecks/bluebook/translation.rb +34 -5
- data/lib/hecks/bluebook/value_object.rb +29 -11
- data/lib/hecks/bluebook.rb +5 -6
- data/lib/hecks/codemod.rb +138 -50
- data/lib/hecks/construct.rb +21 -7
- data/lib/hecks/corpus.rb +438 -0
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +19 -0
- data/lib/hecks/doc/reference.rb +200 -31
- data/lib/hecks/embryonaut_bluebook.rb +38 -15
- data/lib/hecks/facade/cli_door.rb +69 -10
- data/lib/hecks/facade/cli_runner.rb +105 -24
- data/lib/hecks/facade/command_request.rb +23 -0
- data/lib/hecks/facade/handle.rb +155 -35
- data/lib/hecks/facade/json_door.rb +106 -25
- data/lib/hecks/facade/surface/aggregate_door.rb +50 -27
- data/lib/hecks/facade/surface/chapter.rb +26 -17
- data/lib/hecks/facade/surface.rb +16 -3
- data/lib/hecks/facade.rb +15 -4
- data/lib/hecks/forms/app.rb +46 -30
- data/lib/hecks/forms/command_form_renderer.rb +70 -9
- data/lib/hecks/forms/field_renderer.rb +142 -6
- data/lib/hecks/forms/field_shape.rb +183 -19
- data/lib/hecks/forms/html.rb +51 -7
- data/lib/hecks/forms/index_renderer.rb +14 -2
- data/lib/hecks/forms/page.rb +14 -0
- data/lib/hecks/forms/params.rb +120 -23
- data/lib/hecks/forms/port_argument.rb +14 -2
- data/lib/hecks/forms/query_form_renderer.rb +65 -2
- data/lib/hecks/forms/record_renderer.rb +60 -2
- data/lib/hecks/forms/record_table.rb +28 -1
- data/lib/hecks/forms/reference_options.rb +24 -0
- data/lib/hecks/forms/value_object_shape.rb +13 -3
- data/lib/hecks/forms.rb +24 -4
- data/lib/hecks/fqn.rb +59 -1
- data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
- data/lib/hecks/framework/bluebook/privacy.bluebook +155 -0
- data/lib/hecks/framework/oidc.json +15 -0
- data/lib/hecks/framework.rb +79 -25
- data/lib/hecks/freezer.rb +27 -11
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +241 -106
- data/lib/hecks/fuzzing/combination_miner.rb +178 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +241 -45
- data/lib/hecks/fuzzing/coverage_campaign.rb +161 -0
- data/lib/hecks/fuzzing/differential.rb +192 -0
- data/lib/hecks/fuzzing/domain_generator.rb +871 -0
- data/lib/hecks/fuzzing/era_boundary.rb +68 -19
- data/lib/hecks/fuzzing/form_census.rb +121 -20
- data/lib/hecks/fuzzing/generated_domain_check.rb +171 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +45 -6
- data/lib/hecks/fuzzing/isolated_boot.rb +137 -80
- data/lib/hecks/fuzzing/nondeterministic.rb +79 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +111 -21
- data/lib/hecks/fuzzing/properties/corrections.rb +34 -9
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +300 -51
- data/lib/hecks/fuzzing/properties/guards.rb +86 -42
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +80 -32
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +40 -35
- data/lib/hecks/fuzzing/properties/outbox.rb +70 -32
- data/lib/hecks/fuzzing/properties/querying.rb +82 -28
- data/lib/hecks/fuzzing/properties.rb +84 -51
- data/lib/hecks/fuzzing/qa_settings.rb +164 -0
- data/lib/hecks/fuzzing/replay.rb +241 -133
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -28
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +139 -0
- data/lib/hecks/fuzzing/self_consistency.rb +315 -137
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +46 -40
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +18 -11
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +13 -12
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +21 -12
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +59 -32
- data/lib/hecks/fuzzing/sequence_generator.rb +158 -23
- data/lib/hecks/fuzzing/shrinker.rb +309 -0
- data/lib/hecks/fuzzing/structural_skips.rb +37 -130
- data/lib/hecks/fuzzing/sweep_depth.rb +12 -4
- data/lib/hecks/fuzzing/target_capabilities.rb +107 -29
- data/lib/hecks/fuzzing/value_generator.rb +110 -22
- data/lib/hecks/fuzzing.rb +5 -0
- data/lib/hecks/grammar/evolve.rb +188 -12
- data/lib/hecks/grammar.rb +53 -7
- data/lib/hecks/ir.rb +51 -20
- data/lib/hecks/language/bluebook/bluebook.bluebook +41 -0
- data/lib/hecks/language/bluebook/policy.bluebook +11 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +348 -13
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +11 -0
- data/lib/hecks/language/oidc.json +5 -0
- data/lib/hecks/literal.rb +41 -9
- data/lib/hecks/naming.rb +112 -31
- data/lib/hecks/ports/access_control.rb +53 -2
- data/lib/hecks/ports/agent/answers.rb +83 -6
- data/lib/hecks/ports/agent.rb +119 -35
- data/lib/hecks/ports/authentication.rb +44 -4
- data/lib/hecks/ports/authorization.rb +50 -11
- data/lib/hecks/ports/clock.rb +42 -23
- data/lib/hecks/ports/extraction.rb +16 -0
- data/lib/hecks/ports/identity_assignment.rb +23 -2
- data/lib/hecks/ports/identity_generation.rb +17 -3
- data/lib/hecks/ports/identity_resolution.rb +17 -1
- data/lib/hecks/ports/key_vault.port +6 -0
- data/lib/hecks/ports/key_vault.rb +58 -0
- data/lib/hecks/ports/loading.rb +4 -0
- data/lib/hecks/ports/persistence/append_only.rb +172 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +34 -0
- data/lib/hecks/ports/persistence/codec_boundary.rb +178 -0
- data/lib/hecks/ports/persistence/execution.rb +4 -0
- data/lib/hecks/ports/persistence/null_saga_store.rb +12 -1
- data/lib/hecks/ports/persistence/plugin.rb +42 -4
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +218 -25
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +77 -9
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +81 -24
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +29 -18
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +144 -60
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +103 -8
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +98 -23
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +282 -109
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +63 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +118 -66
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +51 -28
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +34 -5
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +25 -12
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +129 -34
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +51 -6
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +33 -9
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +16 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +95 -6
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +314 -90
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +68 -10
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +9 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +9 -2
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +48 -8
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +36 -5
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +23 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +58 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +96 -5
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +15 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +9 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -2
- data/lib/hecks/ports/persistence/plugins/era.rb +12 -2
- data/lib/hecks/ports/persistence/remote_runtime.rb +9 -2
- data/lib/hecks/ports/persistence/repository_factory.rb +23 -3
- data/lib/hecks/ports/persistence/state_codec.rb +319 -0
- data/lib/hecks/ports/persistence.rb +36 -1
- data/lib/hecks/ports/projection.rb +61 -7
- data/lib/hecks/ports/query/in_memory.rb +41 -8
- data/lib/hecks/ports/query/ordering.rb +21 -6
- data/lib/hecks/ports/query.rb +35 -0
- data/lib/hecks/ports.rb +1 -0
- data/lib/hecks/projections/bootstrap_table.rb +147 -0
- data/lib/hecks/projections/diagrams.rb +315 -79
- data/lib/hecks/projections/glossary/html.rb +91 -3
- data/lib/hecks/projections/glossary/markdown.rb +50 -3
- data/lib/hecks/projections/glossary/mermaid.rb +49 -1
- data/lib/hecks/projections/glossary/sections.rb +1 -1
- data/lib/hecks/projections/glossary/sentences.rb +110 -5
- data/lib/hecks/projections/glossary.rb +173 -31
- data/lib/hecks/projections/ir.rb +1 -1
- data/lib/hecks/projections/model/deviations.rb +62 -17
- data/lib/hecks/projections/model.rb +75 -21
- data/lib/hecks/projections/oidc.rb +45 -8
- data/lib/hecks/projections/parser_table.rb +53 -12
- data/lib/hecks/projections/reference.rb +15 -3
- data/lib/hecks/projections/rust_vocabulary.rb +646 -0
- data/lib/hecks/projections/shape.rb +10 -2
- data/lib/hecks/projections/statements.rb +69 -22
- data/lib/hecks/projections/vocabulary.rb +26 -9
- data/lib/hecks/projections.rb +5 -3
- data/lib/hecks/projector/cli_projector.rb +245 -37
- data/lib/hecks/projector/docs_projector.rb +154 -28
- data/lib/hecks/projector/exporter.rb +104 -29
- data/lib/hecks/projector/ir_projector.rb +7 -1
- data/lib/hecks/projector/narrate_projector.rb +144 -23
- data/lib/hecks/projector/target.rb +42 -18
- data/lib/hecks/projector.rb +86 -18
- data/lib/hecks/query_ir.rb +94 -47
- data/lib/hecks/query_specification/common/comparators.rb +19 -3
- data/lib/hecks/query_specification/common/comparison.rb +109 -27
- data/lib/hecks/query_specification/common/dsl.rb +65 -9
- data/lib/hecks/query_specification/common/null_policy.rb +61 -15
- data/lib/hecks/query_specification/common/null_semantics.rb +4 -0
- data/lib/hecks/query_specification/common/options.rb +25 -0
- data/lib/hecks/query_specification/field_path.rb +69 -15
- data/lib/hecks/query_specification/hop_path.rb +57 -20
- data/lib/hecks/query_specification/read_model/specification.rb +4 -0
- data/lib/hecks/rendering.rb +9 -3
- data/lib/hecks/router/namespace_installer.rb +16 -3
- data/lib/hecks/router.rb +56 -1
- data/lib/hecks/runtime/aggregate_lock.rb +20 -11
- data/lib/hecks/runtime/boot_gates.rb +21 -3
- data/lib/hecks/runtime/caller.rb +40 -8
- data/lib/hecks/runtime/capability_graph.rb +13 -2
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +40 -41
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +45 -67
- data/lib/hecks/runtime/command_interpreter.rb +195 -113
- data/lib/hecks/runtime/command_rules/admissibility.rb +231 -80
- data/lib/hecks/runtime/command_rules/arithmetic.rb +154 -96
- data/lib/hecks/runtime/command_rules/authorization.rb +38 -17
- data/lib/hecks/runtime/command_rules/emission.rb +18 -1
- data/lib/hecks/runtime/command_rules/references.rb +145 -55
- data/lib/hecks/runtime/command_rules.rb +3 -0
- data/lib/hecks/runtime/dependency_planning.rb +56 -11
- data/lib/hecks/runtime/dispatcher.rb +263 -92
- data/lib/hecks/runtime/entity_element.rb +304 -67
- data/lib/hecks/runtime/entity_interpreter.rb +149 -88
- data/lib/hecks/runtime/errors.rb +37 -23
- data/lib/hecks/runtime/event.rb +15 -10
- data/lib/hecks/runtime/identity.rb +91 -23
- data/lib/hecks/runtime/instance.rb +103 -18
- data/lib/hecks/runtime/interpreting.rb +24 -16
- data/lib/hecks/runtime/invocation.rb +358 -0
- data/lib/hecks/runtime/loader.rb +105 -19
- data/lib/hecks/runtime/outbox.rb +164 -26
- data/lib/hecks/runtime/policy_interpreter.rb +73 -60
- data/lib/hecks/runtime/port_operation_interpreter.rb +42 -19
- data/lib/hecks/runtime/query_interpreter.rb +93 -74
- data/lib/hecks/runtime/reaction_invocation.rb +73 -28
- data/lib/hecks/runtime/read_model_interpreter.rb +60 -44
- data/lib/hecks/runtime/rebuild_sweep.rb +32 -4
- data/lib/hecks/runtime/reference_hop.rb +48 -6
- data/lib/hecks/runtime/refusal_wording.rb +142 -115
- data/lib/hecks/runtime/registry/saga_persistence.rb +32 -21
- data/lib/hecks/runtime/registry/verification.rb +153 -28
- data/lib/hecks/runtime/registry.rb +202 -32
- data/lib/hecks/runtime/remote_dispatcher.rb +125 -24
- data/lib/hecks/runtime/routing.rb +36 -154
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +25 -27
- data/lib/hecks/runtime/saga_interpreter.rb +90 -76
- data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
- data/lib/hecks/runtime/tenant_check.rb +33 -13
- data/lib/hecks/runtime/tenant_scope.rb +23 -5
- data/lib/hecks/runtime/value/admission.rb +75 -30
- data/lib/hecks/runtime/value/coercion.rb +555 -142
- data/lib/hecks/runtime/value/entity_list_coercion.rb +132 -60
- data/lib/hecks/runtime/value.rb +71 -21
- data/lib/hecks/runtime.rb +39 -7
- data/lib/hecks/storehouse.rb +368 -72
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +130 -0
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +32 -0
- data/lib/hecks/version.rb +3 -3
- data/lib/hecks/vocabulary.rb +205 -4
- data/lib/hecks.rb +91 -11
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +19 -11
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +24 -12
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +38 -14
- metadata +28 -2
data/lib/hecks/ports/query.rb
CHANGED
|
@@ -6,10 +6,34 @@ module Hecks
|
|
|
6
6
|
# fallback engine for stores with no query engine of their own) are
|
|
7
7
|
# its collaborators — query/ordering.rb and query/in_memory.rb.
|
|
8
8
|
module Query
|
|
9
|
+
# A declared query the chosen adapter cannot honour as written — refused
|
|
10
|
+
# by `validate!` before the adapter runs it.
|
|
9
11
|
class Unsupported < StandardError; end
|
|
10
12
|
|
|
11
13
|
module_function
|
|
12
14
|
|
|
15
|
+
# Runs a declared query through the adapter's own `query` hook, if it has one.
|
|
16
|
+
#
|
|
17
|
+
# A nil answer means "no native engine here", and the caller falls back to the shared
|
|
18
|
+
# interpreter or to `InMemory.execute`; it never means "no rows", which is `[]`.
|
|
19
|
+
#
|
|
20
|
+
# @param repository [Persistence::AppendOnly, Object] the repository whose `adapter` is
|
|
21
|
+
# asked, or a bare persistence adapter (anything that does not answer `adapter`)
|
|
22
|
+
# @param specification [QuerySpecification::Common::Options] the declared query: a
|
|
23
|
+
# `Bluebook::Query`, a read-model specification, or a delegator wrapping one
|
|
24
|
+
# @param args [Hash{Symbol => Object}] the caller's arguments, which a where-clause,
|
|
25
|
+
# limit or offset written as a Symbol reads its value from
|
|
26
|
+
# @param context [Hash{Symbol => Object}] passed through to the adapter: `domain:`,
|
|
27
|
+
# `aggregate:` and, where a comparator needs one, `registry:`
|
|
28
|
+
# @return [Array<Runtime::Instance>, nil] the matching records, filtered, ordered and
|
|
29
|
+
# paged by the adapter (`[]` when none match); nil if the adapter has no `query`
|
|
30
|
+
# method
|
|
31
|
+
# @raise [Ports::Query::Unsupported] if the specification combines cursor and offset
|
|
32
|
+
# pagination, or asks for inspection the adapter cannot provide
|
|
33
|
+
# @raise [Runtime::WiringError] if a where-clause names an operation no comparator
|
|
34
|
+
# handles (raised by the in-memory engine behind `Memory`, `Heki` and the like)
|
|
35
|
+
# @raise [ArgumentError] if a SQL-backed adapter cannot compile a where-clause's
|
|
36
|
+
# operator
|
|
13
37
|
def execute(repository, specification, args = {}, context: {})
|
|
14
38
|
adapter = repository.respond_to?(:adapter) ? repository.adapter : repository
|
|
15
39
|
return nil unless adapter.respond_to?(:query)
|
|
@@ -18,6 +42,17 @@ module Hecks
|
|
|
18
42
|
adapter.query(specification, args, context: context)
|
|
19
43
|
end
|
|
20
44
|
|
|
45
|
+
# Refuses a specification the adapter about to run it cannot honour.
|
|
46
|
+
#
|
|
47
|
+
# Inspection is honoured by an adapter with an `inspect_query` method, or, for the
|
|
48
|
+
# `"sql"` mode alone, by any adapter with a native `query`.
|
|
49
|
+
#
|
|
50
|
+
# @param specification [QuerySpecification::Common::Options] the declared query to check
|
|
51
|
+
# @param adapter [Object] the persistence adapter that would run it; only what it
|
|
52
|
+
# responds to (`inspect_query`, `query`) is read
|
|
53
|
+
# @return [void]
|
|
54
|
+
# @raise [Ports::Query::Unsupported] if the specification declares both a cursor and
|
|
55
|
+
# an offset, or asks for inspection the adapter cannot provide
|
|
21
56
|
def validate!(specification, adapter)
|
|
22
57
|
raise Unsupported, "a query cannot combine cursor and offset pagination" if specification.cursor && specification.offset
|
|
23
58
|
|
data/lib/hecks/ports.rb
CHANGED
|
@@ -20,6 +20,7 @@ require_relative "ports/query"
|
|
|
20
20
|
require_relative "ports/projection"
|
|
21
21
|
require_relative "ports/extraction"
|
|
22
22
|
require_relative "ports/identity_generation"
|
|
23
|
+
require_relative "ports/key_vault"
|
|
23
24
|
require_relative "ports/authorization"
|
|
24
25
|
require_relative "ports/identity_resolution"
|
|
25
26
|
require_relative "ports/authentication"
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require_relative "../projector"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Projections
|
|
5
|
+
# **The bootstrap-window fallbacks, projected** — lib/hecks/bluebook/dsl/
|
|
6
|
+
# bootstrap_table.rb rendered from the chapter's own Keyword rows.
|
|
7
|
+
#
|
|
8
|
+
# Projector.call(:bootstrap_table, bluebook: <the Bluebook chapter>)
|
|
9
|
+
#
|
|
10
|
+
# While `MetaValidator.bootstrapping?` the grammar table does not exist
|
|
11
|
+
# yet, so `WordGate#method_missing` and `RuleReference#lookup` cannot
|
|
12
|
+
# read `calls:`/`resolves_via:`/`disambiguator:` off it — this table is
|
|
13
|
+
# what they read instead.
|
|
14
|
+
#
|
|
15
|
+
# A partition, not a filter: every live row lands in the table, not only
|
|
16
|
+
# the ones a bootstrap chapter happens to call. Picking a subset by
|
|
17
|
+
# grepping which words the core chapters use during bootstrap would risk
|
|
18
|
+
# quietly dropping any word a chapter starts using later. Including
|
|
19
|
+
# every row instead costs nothing: a builder with its own `def` never
|
|
20
|
+
# reaches `method_missing` at all, so a row no bootstrap chapter calls
|
|
21
|
+
# is simply never read.
|
|
22
|
+
#
|
|
23
|
+
# The table cannot be built at boot for the same reason it exists: it
|
|
24
|
+
# is read before the grammar it comes from has been assembled. So it is
|
|
25
|
+
# committed, like lib/hecks/vocabulary.rb, and spec/bootstrap_table_
|
|
26
|
+
# spec.rb re-projects it in memory and refuses a diff.
|
|
27
|
+
module BootstrapTable
|
|
28
|
+
extend Projector::Target
|
|
29
|
+
|
|
30
|
+
projects_as :bootstrap_table, declares: "Syntax"
|
|
31
|
+
|
|
32
|
+
class Conflict < StandardError; end
|
|
33
|
+
|
|
34
|
+
HEADER = <<~RUBY.freeze
|
|
35
|
+
# Generated — projected from the language's own Keyword rows (the
|
|
36
|
+
# `calls:`, `resolves_via:` and `disambiguator:` columns of every
|
|
37
|
+
# KeywordSeed under lib/hecks/language/).
|
|
38
|
+
#
|
|
39
|
+
# Do not edit. spec/bootstrap_table_spec.rb re-projects this in memory
|
|
40
|
+
# and refuses a diff — run bin/project_bootstrap_table instead.
|
|
41
|
+
#
|
|
42
|
+
# Plain data, no requires: this is read while the grammar table it was
|
|
43
|
+
# projected from is still being built (`MetaValidator.bootstrapping?`).
|
|
44
|
+
RUBY
|
|
45
|
+
|
|
46
|
+
module_function
|
|
47
|
+
|
|
48
|
+
# Projects the bootstrap fallback table — the only real work this projector
|
|
49
|
+
# does, `bluebook` unused because the table is the whole language's grammar,
|
|
50
|
+
# not any one chapter's.
|
|
51
|
+
#
|
|
52
|
+
# @param bluebook [Bluebook::Chapter] ignored; present to satisfy the
|
|
53
|
+
# `Projector::Target` calling convention
|
|
54
|
+
# @param options [Hash{Symbol => Object}] ignored; present to satisfy the
|
|
55
|
+
# `Projector::Target` calling convention
|
|
56
|
+
# @return [String] the rendered `lib/hecks/bluebook/dsl/bootstrap_table.rb` source
|
|
57
|
+
def call(bluebook:, options: {}) = render(bluebook)
|
|
58
|
+
|
|
59
|
+
# Retired rows are out of the language; admitted and deprecated rows
|
|
60
|
+
# still dispatch — the same `status != "retired"` reading
|
|
61
|
+
# `GenericDispatch.shape_for` gives the live table.
|
|
62
|
+
#
|
|
63
|
+
# @return [Array<Hash{Symbol => String}>] every non-retired keyword row, each with
|
|
64
|
+
# at least `:context`, `:word`, `:status`, `:calls`, `:resolves_via` and
|
|
65
|
+
# `:disambiguator`, values stringified
|
|
66
|
+
def live_keywords
|
|
67
|
+
Bluebook::MetaValidator::SyntaxBoot.call[:keywords].reject { |row| row[:status] == "retired" }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# `[context, word] => :method` — WordGate's own key order.
|
|
71
|
+
#
|
|
72
|
+
# An overloaded word has one row per argument shape, and they all
|
|
73
|
+
# name the same method. Two that don't would make the table keep
|
|
74
|
+
# whichever came last, so that is refused instead.
|
|
75
|
+
#
|
|
76
|
+
# @param rows [Array<Hash{Symbol => String}>] the keyword rows to build from,
|
|
77
|
+
# defaulting to every live one
|
|
78
|
+
# @return [Hash{Array(String, String) => Symbol}] each `calls:`-declaring row's
|
|
79
|
+
# `[context, word]` mapped to the method name it dispatches to
|
|
80
|
+
# @raise [Projections::BootstrapTable::Conflict] if two rows sharing a
|
|
81
|
+
# `[context, word]` name different methods
|
|
82
|
+
def calls(rows = live_keywords)
|
|
83
|
+
rows.reject { |row| row[:calls].to_s.empty? }
|
|
84
|
+
.group_by { |row| [row[:context], row[:word]] }
|
|
85
|
+
.to_h do |key, same_word|
|
|
86
|
+
targets = same_word.map { |row| row[:calls] }.uniq
|
|
87
|
+
raise Conflict, "#{key.inspect} names more than one method: #{targets.join(', ')}" if targets.size > 1
|
|
88
|
+
|
|
89
|
+
[key, targets.first.to_sym]
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# `[word, context] => { resolves_via:, disambiguator: }` —
|
|
94
|
+
# RuleReference's own key order, blank columns omitted, the same
|
|
95
|
+
# shape its live `lookup` answers.
|
|
96
|
+
#
|
|
97
|
+
# @param rows [Array<Hash{Symbol => String}>] the keyword rows to build from,
|
|
98
|
+
# defaulting to every live one
|
|
99
|
+
# @return [Hash{Array(String, String) => Hash{Symbol => String}}] each
|
|
100
|
+
# `resolves_via:`-declaring row's `[word, context]` mapped to its rule Hash,
|
|
101
|
+
# with any blank `resolves_via`/`disambiguator` column omitted
|
|
102
|
+
def resolves(rows = live_keywords)
|
|
103
|
+
rows.reject { |row| row[:resolves_via].to_s.empty? }.to_h do |row|
|
|
104
|
+
rule = { resolves_via: row[:resolves_via], disambiguator: row[:disambiguator] }
|
|
105
|
+
[[row[:word], row[:context]], rule.reject { |_, value| value.to_s.empty? }]
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Renders the bootstrap table as committable Ruby source — `CALLS` and
|
|
110
|
+
# `RESOLVES` frozen Hash literals under the generated-file header.
|
|
111
|
+
#
|
|
112
|
+
# @param _bluebook [Bluebook::Chapter] ignored; the table draws from the whole
|
|
113
|
+
# language's grammar, not this argument
|
|
114
|
+
# @return [String] the full `lib/hecks/bluebook/dsl/bootstrap_table.rb` source,
|
|
115
|
+
# ready to write to disk
|
|
116
|
+
def render(_bluebook)
|
|
117
|
+
rows = live_keywords
|
|
118
|
+
calls_lines = calls(rows).map { |key, target| " #{key.inspect} => #{target.inspect}" }
|
|
119
|
+
resolves_lines = resolves(rows).map do |key, rule|
|
|
120
|
+
fields = rule.map { |name, value| "#{name}: #{value.inspect}" }.join(", ")
|
|
121
|
+
" #{key.inspect} => { #{fields} }.freeze"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
<<~RUBY
|
|
125
|
+
#{HEADER}
|
|
126
|
+
module Hecks
|
|
127
|
+
module Bluebook
|
|
128
|
+
module DSL
|
|
129
|
+
module BootstrapTable
|
|
130
|
+
# [context, word] => the method a word's whole call forwards to.
|
|
131
|
+
CALLS = {
|
|
132
|
+
#{calls_lines.join(",\n")}
|
|
133
|
+
}.freeze
|
|
134
|
+
|
|
135
|
+
# [word, context] => the RuleReference primitive a bare reference resolves through.
|
|
136
|
+
RESOLVES = {
|
|
137
|
+
#{resolves_lines.join(",\n")}
|
|
138
|
+
}.freeze
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
RUBY
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|