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
|
@@ -2,7 +2,7 @@ require_relative "../projector"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Projections
|
|
5
|
-
# A
|
|
5
|
+
# A domain's own declared facts, projected as plain english sentences
|
|
6
6
|
# — one atomic, independently-checkable statement per fact, not a
|
|
7
7
|
# flowing document (`Projections::Reference`/`DocsProjector` already
|
|
8
8
|
# do that job well; this is a flat list a caller can iterate, diff,
|
|
@@ -10,27 +10,30 @@ module Hecks
|
|
|
10
10
|
# a sanity check that the domain still says what someone thinks it
|
|
11
11
|
# says).
|
|
12
12
|
#
|
|
13
|
-
#
|
|
14
|
-
# discipline, held here too: a relationship's sentence is built
|
|
15
|
-
# MECHANICALLY from its own declared shape (holder, target,
|
|
16
|
-
# relationship kind — the same facts `Projections::Diagrams`'s own
|
|
17
|
-
# relationship_edge already reads), and an invariant's sentence IS
|
|
18
|
-
# the domain author's own `description`, capitalized and
|
|
19
|
-
# punctuated, never paraphrased. If a fact has no author-written
|
|
20
|
-
# description and no unambiguous mechanical phrasing, it doesn't
|
|
21
|
-
# get a sentence here — a wrong sentence is worse than a missing
|
|
22
|
-
# one.
|
|
13
|
+
# ## Never invents a sentence from nothing
|
|
23
14
|
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
# `
|
|
15
|
+
# `DocsProjector`'s own discipline, held here too: a relationship's
|
|
16
|
+
# sentence is built mechanically from its own declared shape (holder,
|
|
17
|
+
# target, relationship kind — the same facts `Projections::Diagrams`'s
|
|
18
|
+
# own relationship_edge already reads), and an invariant's sentence is
|
|
19
|
+
# the domain author's own `description`, capitalized and punctuated,
|
|
20
|
+
# never paraphrased. If a fact has no author-written description and
|
|
21
|
+
# no unambiguous mechanical phrasing, it doesn't get a sentence here —
|
|
22
|
+
# a wrong sentence is worse than a missing one.
|
|
23
|
+
#
|
|
24
|
+
# ## Reachable like any projection
|
|
25
|
+
#
|
|
26
|
+
# No new facade wiring needed: `Pizzas.project(Projections::Statements)`
|
|
27
|
+
# — `Facade::Surface::Chapter#project`'s own comment already settled
|
|
27
28
|
# this ("anything genuinely needing the graph is a projector, and a
|
|
28
29
|
# projector is given it"). `bin/statements` is a thin, optional
|
|
29
30
|
# convenience for reaching the same call from a shell.
|
|
30
31
|
#
|
|
31
|
-
# MVP
|
|
32
|
-
#
|
|
33
|
-
#
|
|
32
|
+
# ## MVP scope
|
|
33
|
+
#
|
|
34
|
+
# "has many"/"has a"/"belongs to"/"references" sentences for every
|
|
35
|
+
# list or relationship attribute, and every invariant's own
|
|
36
|
+
# description (aggregate-level and every nested value object's),
|
|
34
37
|
# verbatim. Lifecycle transitions and command given/ensures read the
|
|
35
38
|
# same way and are the natural next sentences — not built yet.
|
|
36
39
|
module Statements
|
|
@@ -40,17 +43,35 @@ module Hecks
|
|
|
40
43
|
|
|
41
44
|
module_function
|
|
42
45
|
|
|
46
|
+
# Projects every reachable fact in the chapter into its flat sentence list.
|
|
47
|
+
#
|
|
48
|
+
# @param bluebook [Bluebook::Chapter] the chapter being projected
|
|
49
|
+
# @param options [Hash{Symbol => Object}] ignored; present to satisfy the
|
|
50
|
+
# `Projector::Target` calling convention
|
|
51
|
+
# @return [Array<String>] one sentence per attribute relationship and invariant,
|
|
52
|
+
# in holder order
|
|
43
53
|
def call(bluebook:, options: {})
|
|
44
54
|
holders(bluebook).flat_map { |holder| statements_for(holder) }
|
|
45
55
|
end
|
|
46
56
|
|
|
57
|
+
# Every construct that can carry its own attributes and invariants — an
|
|
58
|
+
# aggregate and each of its entities.
|
|
59
|
+
#
|
|
60
|
+
# @param bluebook [Bluebook::Chapter] the chapter being walked
|
|
61
|
+
# @return [Array<Bluebook::Aggregate, Bluebook::Entity>] every aggregate followed
|
|
62
|
+
# by its own entities, in declaration order
|
|
47
63
|
def holders(bluebook) = bluebook.aggregates.flat_map { |aggregate| [aggregate, *aggregate.entities] }
|
|
48
64
|
|
|
65
|
+
# All of one holder's sentences: its attribute relationships, then its invariants.
|
|
66
|
+
#
|
|
67
|
+
# @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct being
|
|
68
|
+
# projected
|
|
69
|
+
# @return [Array<String>] the holder's sentences
|
|
49
70
|
def statements_for(holder)
|
|
50
71
|
attribute_statements(holder) + invariant_statements(holder)
|
|
51
72
|
end
|
|
52
73
|
|
|
53
|
-
# "MANY"
|
|
74
|
+
# "MANY" reads the same way regardless of what's behind it — a
|
|
54
75
|
# `has_many` relationship to another aggregate and a plain
|
|
55
76
|
# `list_of(Topping)` value-object attribute are the same idea to
|
|
56
77
|
# someone reading the domain in English ("an Order has many
|
|
@@ -60,10 +81,24 @@ module Hecks
|
|
|
60
81
|
# name, because the field's own name is what the domain author
|
|
61
82
|
# actually chose to call the collection — "toppings", not
|
|
62
83
|
# "Topping".
|
|
84
|
+
# Projects every one of a holder's attributes that says something in plain
|
|
85
|
+
# English — a list, or a named relationship.
|
|
86
|
+
#
|
|
87
|
+
# @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct whose
|
|
88
|
+
# attributes are being read
|
|
89
|
+
# @return [Array<String>] one sentence per list or relationship attribute; a
|
|
90
|
+
# plain scalar attribute contributes none
|
|
63
91
|
def attribute_statements(holder)
|
|
64
92
|
holder.attributes.filter_map { |attribute| attribute_statement(holder, attribute) }
|
|
65
93
|
end
|
|
66
94
|
|
|
95
|
+
# Projects one attribute's relationship, if it has one worth stating.
|
|
96
|
+
#
|
|
97
|
+
# @param holder [Bluebook::Aggregate, Bluebook::Entity] the attribute's owning
|
|
98
|
+
# construct, named as the sentence's subject
|
|
99
|
+
# @param attribute [Bluebook::Attribute] the attribute being projected
|
|
100
|
+
# @return [String, nil] the sentence, or `nil` if `attribute` is neither a list
|
|
101
|
+
# nor a `has_one`/`belongs_to`/`reference_to` relationship
|
|
67
102
|
def attribute_statement(holder, attribute)
|
|
68
103
|
subject = "#{article(holder.hecks_name)} #{holder.hecks_name}"
|
|
69
104
|
return "#{subject} has many #{attribute.name}." if attribute.list?
|
|
@@ -77,29 +112,41 @@ module Hecks
|
|
|
77
112
|
end
|
|
78
113
|
end
|
|
79
114
|
|
|
80
|
-
# "
|
|
115
|
+
# "An account", not "A ACCOUNT" — every subject/object noun here is
|
|
81
116
|
# a bare construct name (`ATMCard`, `ExternalTransfer`, `Account`),
|
|
82
117
|
# never free text, so the ordinary "starts with a vowel LETTER"
|
|
83
118
|
# heuristic is safe: this language's own naming never produces the
|
|
84
119
|
# English exceptions that heuristic gets wrong (an "hour", a
|
|
85
120
|
# "university") because a construct name is always spelled as a
|
|
86
121
|
# plain word, never an abbreviation read letter-by-letter or a
|
|
87
|
-
# word starting with a consonant
|
|
122
|
+
# word starting with a consonant letter but a vowel sound.
|
|
123
|
+
#
|
|
124
|
+
# @param word [String] a construct name to prefix
|
|
125
|
+
# @return [String] `"An"` if `word` starts with a vowel letter, `"A"` otherwise
|
|
88
126
|
def article(word) = word.to_s.match?(/\A[AEIOUaeiou]/) ? "An" : "A"
|
|
89
127
|
|
|
90
|
-
#
|
|
128
|
+
# Invariants live in two places — directly on the holder (an
|
|
91
129
|
# aggregate-level rule, checked after every command) and on every
|
|
92
130
|
# value object nested inside it — `DocsProjector#rules_of`'s own
|
|
93
131
|
# `value_object_for` lookup is the precedent for walking both.
|
|
132
|
+
#
|
|
133
|
+
# @param holder [Bluebook::Aggregate, Bluebook::Entity] the construct whose
|
|
134
|
+
# invariants, and whose value objects' invariants, are being read
|
|
135
|
+
# @return [Array<String>] one sentence per invariant, the holder's own first,
|
|
136
|
+
# then each nested value object's
|
|
94
137
|
def invariant_statements(holder)
|
|
95
138
|
own = Array(holder.respond_to?(:invariants) ? holder.invariants : [])
|
|
96
139
|
nested = Array(holder.respond_to?(:value_objects) ? holder.value_objects : []).flat_map(&:invariants)
|
|
97
140
|
(own + nested).map { |invariant| invariant_statement(invariant) }
|
|
98
141
|
end
|
|
99
142
|
|
|
100
|
-
#
|
|
143
|
+
# The domain author's own words, capitalized and punctuated —
|
|
101
144
|
# nothing else. `invariant("a pizza is named")` already reads as
|
|
102
145
|
# a sentence; this is the entire transformation.
|
|
146
|
+
#
|
|
147
|
+
# @param invariant [Bluebook::Invariant] the invariant being projected
|
|
148
|
+
# @return [String] the invariant's `description`, capitalized, ending with `.`,
|
|
149
|
+
# `!` or `?`
|
|
103
150
|
def invariant_statement(invariant)
|
|
104
151
|
text = invariant.description.to_s.strip
|
|
105
152
|
text = "#{text[0].upcase}#{text[1..]}" if text[0]
|
|
@@ -2,20 +2,20 @@ require_relative "../projector"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Projections
|
|
5
|
-
#
|
|
5
|
+
# **The closed sets, projected** — lib/hecks/vocabulary.rb rendered
|
|
6
6
|
# from whichever chapter declares a `Vocabulary` aggregate, which in
|
|
7
7
|
# practice is the language projecting its own tables.
|
|
8
8
|
#
|
|
9
9
|
# Projector.call(:vocabulary, bluebook: <the Bluebook chapter>)
|
|
10
10
|
#
|
|
11
|
-
# A
|
|
11
|
+
# A projection rather than a bin/ script, and that correction is the
|
|
12
12
|
# point of it. This was first written as its own program with its own
|
|
13
13
|
# call shape, beside `bin/project_parser_table`, `bin/reference` and
|
|
14
14
|
# `bin/expression_projection` — four tools doing "canonical IR in,
|
|
15
15
|
# external artifact out" four different ways, which is the exact
|
|
16
16
|
# thing the projector registry exists to stop.
|
|
17
17
|
#
|
|
18
|
-
# Reads the chapter's
|
|
18
|
+
# Reads the chapter's judged IR, so what is written out is what the
|
|
19
19
|
# language actually holds rather than what a builder happened to
|
|
20
20
|
# produce.
|
|
21
21
|
module Vocabulary
|
|
@@ -24,10 +24,10 @@ module Hecks
|
|
|
24
24
|
projects_as :vocabulary, declares: "Vocabulary"
|
|
25
25
|
|
|
26
26
|
HEADER = <<~RUBY.freeze
|
|
27
|
-
#
|
|
27
|
+
# Generated — projected from the language's own Vocabulary aggregate
|
|
28
28
|
# (lib/hecks/language/bluebook/vocabulary.bluebook).
|
|
29
29
|
#
|
|
30
|
-
#
|
|
30
|
+
# Do not edit. spec/vocabulary_table_spec.rb re-projects this in memory
|
|
31
31
|
# and refuses a diff, so an edit here fails the ordinary suite.
|
|
32
32
|
#
|
|
33
33
|
# Plain data on purpose — no requires, no dependency on the model —
|
|
@@ -40,22 +40,39 @@ module Hecks
|
|
|
40
40
|
|
|
41
41
|
# The projector protocol. `options` is unused: a vocabulary table
|
|
42
42
|
# has nothing to vary.
|
|
43
|
+
#
|
|
44
|
+
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
|
|
45
|
+
# Vocabulary aggregate to project
|
|
46
|
+
# @param options [Hash] unused; accepted to satisfy the registry's call shape
|
|
47
|
+
# @return [String] the rendered `lib/hecks/vocabulary.rb` source
|
|
43
48
|
def call(bluebook:, options: {}) = render(bluebook)
|
|
44
49
|
|
|
45
|
-
#
|
|
50
|
+
# Full rows, not just the first field of each.
|
|
46
51
|
#
|
|
47
|
-
# Most vocabularies
|
|
52
|
+
# Most vocabularies are one-field lists and the field is the term.
|
|
48
53
|
# Several are not: `Comparison` declares the algebra each operator
|
|
49
54
|
# computes with, `RefusalTemplate` an error plus its key and text.
|
|
50
55
|
# Taking the first field of those produced a list of thirty-nine
|
|
51
56
|
# duplicated error names — well-formed and meaningless. So rows are
|
|
52
57
|
# carried whole, and the terms are derived from them.
|
|
58
|
+
#
|
|
59
|
+
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
|
|
60
|
+
# Vocabulary aggregate to read
|
|
61
|
+
# @return [Hash{String => Array<Hash{String => String}>}] each closed set's name,
|
|
62
|
+
# mapped to its member rows with every field stringified
|
|
53
63
|
def tables(bluebook)
|
|
54
64
|
bluebook.aggregate("Vocabulary").value_objects.to_h do |vo|
|
|
55
65
|
[vo.hecks_name, vo.members.map { |row| row.to_h.transform_keys(&:to_s).transform_values(&:to_s) }]
|
|
56
66
|
end
|
|
57
67
|
end
|
|
58
68
|
|
|
69
|
+
# Renders `lib/hecks/vocabulary.rb`'s full source: the frozen `TABLES`
|
|
70
|
+
# and `TERMS` constants and the `fetch`/`rows`/`symbols`/`names` reader
|
|
71
|
+
# methods, built from `bluebook`'s declared closed sets.
|
|
72
|
+
#
|
|
73
|
+
# @param bluebook [Bluebook::Behaviour::Chapter] the chapter declaring the
|
|
74
|
+
# Vocabulary aggregate to render
|
|
75
|
+
# @return [String] the generated Ruby source, ready to write to disk
|
|
59
76
|
def render(bluebook)
|
|
60
77
|
rows = tables(bluebook).sort_by(&:first).map do |name, members|
|
|
61
78
|
" #{name.inspect} => [\n#{members.map { |row| " #{row.inspect}.freeze" }.join(",\n")}\n ].freeze"
|
|
@@ -69,8 +86,8 @@ module Hecks
|
|
|
69
86
|
#{rows.join(",\n")}
|
|
70
87
|
}.freeze
|
|
71
88
|
|
|
72
|
-
#
|
|
73
|
-
# one-field vocabulary is the whole of it. Derived
|
|
89
|
+
# The terms — the first field of each row, which for a
|
|
90
|
+
# one-field vocabulary is the whole of it. Derived once and
|
|
74
91
|
# frozen rather than mapped per call: these are constant
|
|
75
92
|
# tables, and a constant that allocates a new array every
|
|
76
93
|
# time it is read is not one.
|
data/lib/hecks/projections.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "projector"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
4
|
+
# The targets a domain can be projected into, as constants rather than
|
|
5
5
|
# bare symbols — `Pizzas.project(Projections::OIDC)`.
|
|
6
6
|
#
|
|
7
7
|
# A constant is worth the namespace for two reasons a Symbol cannot
|
|
@@ -10,9 +10,9 @@ module Hecks
|
|
|
10
10
|
# carry its own documentation and defaults.
|
|
11
11
|
#
|
|
12
12
|
# Namespaced rather than top-level because `IR` is already taken —
|
|
13
|
-
# `Hecks::Bluebook` is the
|
|
13
|
+
# `Hecks::Bluebook` is the model (`Bluebook::Command`, and the
|
|
14
14
|
# chapter class itself).
|
|
15
|
-
# `Projections::IR` is the projection
|
|
15
|
+
# `Projections::IR` is the projection of that model, a different thing
|
|
16
16
|
# that would be genuinely confusing under the same bare name.
|
|
17
17
|
#
|
|
18
18
|
# `include Hecks::Projections` gets the short spelling where the
|
|
@@ -26,6 +26,8 @@ require_relative "projections/shape"
|
|
|
26
26
|
require_relative "projections/oidc"
|
|
27
27
|
require_relative "projections/vocabulary"
|
|
28
28
|
require_relative "projections/parser_table"
|
|
29
|
+
require_relative "projections/bootstrap_table"
|
|
30
|
+
require_relative "projections/rust_vocabulary"
|
|
29
31
|
require_relative "projections/reference"
|
|
30
32
|
require_relative "projections/model"
|
|
31
33
|
require_relative "projections/diagrams"
|