hecks 1.2.0 → 1.4.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 +7 -7
- data/lib/hecks/adapters/driven/d1.rb +187 -23
- data/lib/hecks/adapters/driven/folder.rb +10 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +8 -8
- data/lib/hecks/adapters/driven/governance_authorization.rb +31 -13
- data/lib/hecks/adapters/driven/heki/journal.rb +60 -2
- data/lib/hecks/adapters/driven/heki/saga_store.rb +5 -5
- data/lib/hecks/adapters/driven/heki.rb +13 -7
- data/lib/hecks/adapters/driven/identity_registry.rb +2 -2
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +3 -3
- data/lib/hecks/adapters/driven/lambda/client.rb +34 -9
- data/lib/hecks/adapters/driven/lambda.rb +39 -33
- data/lib/hecks/adapters/driven/local_storage.rb +17 -10
- data/lib/hecks/adapters/driven/memory.rb +205 -9
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +1 -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/postgres_era.adapter +5 -0
- data/lib/hecks/adapters/driven/prism.rb +4 -4
- 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.rb +4 -4
- data/lib/hecks/adapters/driving/github_webhook.rb +145 -0
- data/lib/hecks/behaviors/dsl.rb +2 -2
- data/lib/hecks/behaviors/expectations.rb +51 -23
- data/lib/hecks/behaviors/ir.rb +1 -1
- data/lib/hecks/behaviors/rspec.rb +1 -1
- data/lib/hecks/behaviors/runner.rb +2 -2
- data/lib/hecks/behaviors.rb +1 -1
- data/lib/hecks/bluebook/aggregate.rb +13 -13
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +10 -10
- data/lib/hecks/bluebook/assembly/build.rb +1 -1
- data/lib/hecks/bluebook/assembly/contract.rb +39 -16
- data/lib/hecks/bluebook/assembly/contracts.rb +40 -38
- data/lib/hecks/bluebook/assembly/marks.rb +18 -18
- data/lib/hecks/bluebook/assembly/specializer.rb +19 -21
- data/lib/hecks/bluebook/assembly.rb +9 -9
- data/lib/hecks/bluebook/attribute.rb +9 -9
- data/lib/hecks/bluebook/behaviour/aggregate.rb +11 -11
- data/lib/hecks/bluebook/behaviour/attribute.rb +5 -5
- data/lib/hecks/bluebook/behaviour/chapter.rb +23 -5
- data/lib/hecks/bluebook/behaviour/command.rb +23 -23
- data/lib/hecks/bluebook/behaviour/domain_port.rb +27 -3
- data/lib/hecks/bluebook/behaviour/entity.rb +8 -8
- data/lib/hecks/bluebook/behaviour/hexagon.rb +4 -4
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +5 -5
- data/lib/hecks/bluebook/behaviour/policy.rb +12 -12
- data/lib/hecks/bluebook/behaviour/process_manager.rb +7 -7
- data/lib/hecks/bluebook/behaviour/query.rb +1 -1
- data/lib/hecks/bluebook/behaviour/read_model.rb +8 -8
- data/lib/hecks/bluebook/behaviour/traits.rb +12 -12
- data/lib/hecks/bluebook/behaviour/value_object.rb +6 -6
- data/lib/hecks/bluebook/capabilities.rb +27 -0
- data/lib/hecks/bluebook/chapter.rb +28 -9
- data/lib/hecks/bluebook/command.rb +12 -12
- data/lib/hecks/bluebook/domain_port.rb +9 -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 +96 -96
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +41 -41
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +22 -2
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +111 -74
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +48 -30
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +116 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +103 -103
- 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 +56 -56
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +148 -132
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +89 -30
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +17 -17
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +27 -4
- data/lib/hecks/bluebook/dsl/policy_builder.rb +30 -21
- 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 +35 -35
- data/lib/hecks/bluebook/dsl/query_builder.rb +5 -5
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +34 -34
- data/lib/hecks/bluebook/dsl/rule_reference.rb +41 -39
- data/lib/hecks/bluebook/dsl/translation_builder.rb +9 -9
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +16 -16
- 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 +11 -11
- data/lib/hecks/bluebook/expression/ast_json.rb +20 -20
- data/lib/hecks/bluebook/expression/ast_reader.rb +3 -3
- data/lib/hecks/bluebook/expression/canonical_form.rb +9 -9
- data/lib/hecks/bluebook/expression/evaluator.rb +18 -18
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +18 -18
- data/lib/hecks/bluebook/expression/resolver.rb +60 -62
- data/lib/hecks/bluebook/hexagon.rb +1 -1
- data/lib/hecks/bluebook/lifecycle.rb +1 -1
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -1
- data/lib/hecks/bluebook/meta_validator/judge.rb +122 -86
- data/lib/hecks/bluebook/meta_validator/plan.rb +39 -39
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -2
- data/lib/hecks/bluebook/meta_validator/readings.rb +43 -43
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +44 -37
- data/lib/hecks/bluebook/meta_validator/shapes.rb +25 -21
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +145 -31
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +6 -6
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +5 -5
- data/lib/hecks/bluebook/meta_validator.rb +70 -70
- data/lib/hecks/bluebook/model_check.rb +301 -84
- data/lib/hecks/bluebook/pattern_subset.rb +9 -9
- data/lib/hecks/bluebook/policy.rb +15 -13
- data/lib/hecks/bluebook/process_manager.rb +14 -14
- data/lib/hecks/bluebook/project_register.rb +6 -6
- data/lib/hecks/bluebook/query.rb +4 -4
- data/lib/hecks/bluebook/read_model.rb +14 -14
- data/lib/hecks/bluebook/reference.rb +8 -8
- data/lib/hecks/bluebook/smoke_test.rb +19 -19
- data/lib/hecks/bluebook/synthesizer.rb +12 -12
- data/lib/hecks/bluebook/translation.rb +4 -4
- data/lib/hecks/bluebook/value_object.rb +6 -6
- data/lib/hecks/bluebook.rb +2 -2
- data/lib/hecks/codemod/legacy_dispatch_args.rb +299 -0
- data/lib/hecks/codemod/legacy_dispatch_recorder.rb +186 -0
- data/lib/hecks/codemod.rb +36 -35
- data/lib/hecks/construct.rb +6 -6
- data/lib/hecks/corpus.rb +317 -0
- data/lib/hecks/deprecation.rb +95 -0
- data/lib/hecks/doc/reference.rb +19 -19
- data/lib/hecks/embryonaut_bluebook.rb +11 -11
- 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 +79 -32
- data/lib/hecks/facade/json_door.rb +106 -25
- data/lib/hecks/facade/surface/aggregate_door.rb +42 -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 -20
- data/lib/hecks/forms/html.rb +51 -7
- data/lib/hecks/forms/index_renderer.rb +14 -2
- data/lib/hecks/forms/params.rb +120 -23
- data/lib/hecks/forms/port_argument.rb +2 -2
- data/lib/hecks/forms/query_form_renderer.rb +2 -2
- data/lib/hecks/forms/record_renderer.rb +2 -2
- data/lib/hecks/forms/record_table.rb +1 -1
- data/lib/hecks/forms/value_object_shape.rb +3 -3
- data/lib/hecks/forms.rb +24 -4
- data/lib/hecks/fqn.rb +1 -1
- data/lib/hecks/framework/bluebook/governance.bluebook +9 -0
- data/lib/hecks/framework.rb +48 -17
- data/lib/hecks/freezer.rb +11 -11
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +90 -90
- data/lib/hecks/fuzzing/combination_miner.rb +119 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +361 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +118 -0
- data/lib/hecks/fuzzing/differential.rb +158 -0
- data/lib/hecks/fuzzing/domain_generator.rb +694 -0
- data/lib/hecks/fuzzing/era_boundary.rb +124 -0
- data/lib/hecks/fuzzing/form_census.rb +199 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +95 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +6 -6
- data/lib/hecks/fuzzing/isolated_boot.rb +226 -38
- data/lib/hecks/fuzzing/nondeterministic.rb +67 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +161 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +100 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +321 -41
- data/lib/hecks/fuzzing/properties/guards.rb +129 -26
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +32 -32
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +31 -11
- data/lib/hecks/fuzzing/properties/outbox.rb +142 -0
- data/lib/hecks/fuzzing/properties/querying.rb +17 -17
- data/lib/hecks/fuzzing/properties.rb +84 -39
- data/lib/hecks/fuzzing/qa_settings.rb +152 -0
- data/lib/hecks/fuzzing/replay.rb +224 -114
- data/lib/hecks/fuzzing/rotation_priority.rb +94 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +113 -0
- data/lib/hecks/fuzzing/self_consistency.rb +676 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +526 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +101 -30
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +55 -8
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +31 -11
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +123 -32
- data/lib/hecks/fuzzing/sequence_generator.rb +152 -31
- data/lib/hecks/fuzzing/shrinker.rb +197 -0
- data/lib/hecks/fuzzing/structural_skips.rb +39 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +53 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +180 -0
- data/lib/hecks/fuzzing/value_generator.rb +66 -14
- data/lib/hecks/fuzzing.rb +11 -0
- data/lib/hecks/grammar/evolve.rb +10 -10
- data/lib/hecks/grammar.rb +7 -7
- data/lib/hecks/ir.rb +13 -13
- 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 +365 -15
- data/lib/hecks/language/oidc.json +5 -0
- data/lib/hecks/literal.rb +9 -9
- data/lib/hecks/naming.rb +89 -21
- data/lib/hecks/ports/access_control.rb +58 -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 +53 -11
- data/lib/hecks/ports/clock.rb +42 -23
- data/lib/hecks/ports/extraction.rb +16 -0
- data/lib/hecks/ports/identity_assignment.rb +24 -2
- data/lib/hecks/ports/identity_generation.rb +17 -3
- data/lib/hecks/ports/identity_resolution.rb +18 -1
- 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 +160 -58
- 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 +28 -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 +44 -6
- 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 +57 -4
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +25 -2
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +338 -83
- 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 +42 -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 +18 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +5 -5
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +1 -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 +29 -6
- 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 +3 -3
- data/lib/hecks/ports/query/ordering.rb +6 -6
- data/lib/hecks/ports/query.rb +35 -0
- data/lib/hecks/projections/bootstrap_table.rb +112 -0
- data/lib/hecks/projections/diagrams.rb +75 -75
- data/lib/hecks/projections/glossary/html.rb +250 -0
- data/lib/hecks/projections/glossary/markdown.rb +105 -0
- data/lib/hecks/projections/glossary/mermaid.rb +110 -0
- data/lib/hecks/projections/glossary/page.css +271 -0
- data/lib/hecks/projections/glossary/page.js +72 -0
- data/lib/hecks/projections/glossary/sections.rb +17 -0
- data/lib/hecks/projections/glossary/sentences.rb +205 -0
- data/lib/hecks/projections/glossary.rb +214 -286
- data/lib/hecks/projections/ir.rb +1 -1
- data/lib/hecks/projections/model/deviations.rb +18 -17
- data/lib/hecks/projections/model.rb +25 -21
- data/lib/hecks/projections/oidc.rb +7 -7
- data/lib/hecks/projections/parser_table.rb +5 -5
- data/lib/hecks/projections/reference.rb +3 -3
- data/lib/hecks/projections/rust_vocabulary.rb +443 -0
- data/lib/hecks/projections/shape.rb +2 -2
- data/lib/hecks/projections/statements.rb +11 -11
- data/lib/hecks/projections/vocabulary.rb +9 -9
- data/lib/hecks/projections.rb +5 -3
- data/lib/hecks/projector/cli_projector.rb +29 -29
- data/lib/hecks/projector/docs_projector.rb +13 -13
- data/lib/hecks/projector/exporter.rb +42 -21
- data/lib/hecks/projector/ir_projector.rb +1 -1
- data/lib/hecks/projector/narrate_projector.rb +15 -22
- data/lib/hecks/projector/target.rb +13 -13
- data/lib/hecks/projector.rb +15 -15
- data/lib/hecks/query_ir.rb +47 -47
- data/lib/hecks/query_specification/common/comparators.rb +19 -3
- data/lib/hecks/query_specification/common/comparison.rb +132 -24
- data/lib/hecks/query_specification/common/dsl.rb +65 -9
- data/lib/hecks/query_specification/common/null_policy.rb +57 -13
- 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 +3 -3
- data/lib/hecks/router/namespace_installer.rb +3 -3
- data/lib/hecks/router.rb +1 -1
- data/lib/hecks/runtime/aggregate_lock.rb +11 -11
- data/lib/hecks/runtime/boot_gates.rb +3 -3
- data/lib/hecks/runtime/caller.rb +8 -8
- data/lib/hecks/runtime/capability_graph.rb +2 -2
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +22 -25
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +64 -67
- data/lib/hecks/runtime/command_interpreter.rb +159 -102
- data/lib/hecks/runtime/command_rules/admissibility.rb +69 -69
- data/lib/hecks/runtime/command_rules/arithmetic.rb +137 -91
- 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 +94 -19
- data/lib/hecks/runtime/command_rules.rb +3 -0
- data/lib/hecks/runtime/dependency_planning.rb +11 -11
- data/lib/hecks/runtime/dispatcher.rb +283 -90
- data/lib/hecks/runtime/entity_element.rb +282 -46
- data/lib/hecks/runtime/entity_interpreter.rb +160 -69
- data/lib/hecks/runtime/errors.rb +19 -19
- data/lib/hecks/runtime/event.rb +6 -6
- data/lib/hecks/runtime/identity.rb +22 -22
- data/lib/hecks/runtime/instance.rb +39 -14
- data/lib/hecks/runtime/interpreting.rb +12 -12
- data/lib/hecks/runtime/invocation.rb +276 -0
- data/lib/hecks/runtime/loader.rb +14 -14
- data/lib/hecks/runtime/outbox.rb +23 -23
- data/lib/hecks/runtime/policy_interpreter.rb +54 -54
- data/lib/hecks/runtime/port_operation_interpreter.rb +22 -19
- data/lib/hecks/runtime/query_interpreter.rb +111 -56
- data/lib/hecks/runtime/reaction_invocation.rb +76 -9
- data/lib/hecks/runtime/read_model_interpreter.rb +40 -40
- data/lib/hecks/runtime/rebuild_sweep.rb +4 -4
- data/lib/hecks/runtime/reference_hop.rb +6 -6
- data/lib/hecks/runtime/refusal_wording.rb +92 -112
- data/lib/hecks/runtime/registry/saga_persistence.rb +21 -21
- data/lib/hecks/runtime/registry/verification.rb +36 -26
- data/lib/hecks/runtime/registry.rb +56 -27
- data/lib/hecks/runtime/remote_dispatcher.rb +38 -23
- data/lib/hecks/runtime/routing.rb +10 -88
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +17 -17
- data/lib/hecks/runtime/saga_interpreter.rb +93 -56
- data/lib/hecks/runtime/saga_pending_dispatch.rb +12 -12
- data/lib/hecks/runtime/tenant_check.rb +9 -9
- data/lib/hecks/runtime/tenant_scope.rb +5 -5
- data/lib/hecks/runtime/value/admission.rb +75 -30
- data/lib/hecks/runtime/value/coercion.rb +379 -226
- data/lib/hecks/runtime/value/entity_list_coercion.rb +248 -0
- data/lib/hecks/runtime/value.rb +28 -23
- data/lib/hecks/runtime.rb +7 -7
- data/lib/hecks/storehouse.rb +64 -64
- data/lib/hecks/version.rb +3 -3
- data/lib/hecks/vocabulary.rb +207 -5
- data/lib/hecks.rb +13 -11
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +11 -11
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +14 -12
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +11 -11
- metadata +43 -2
data/lib/hecks/vocabulary.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Generated — projected from the language's own Vocabulary aggregate
|
|
2
2
|
# (lib/hecks/language/bluebook/vocabulary.bluebook).
|
|
3
3
|
#
|
|
4
|
-
#
|
|
4
|
+
# Do not edit. spec/vocabulary_table_spec.rb re-projects this in memory
|
|
5
5
|
# and refuses a diff, so an edit here fails the ordinary suite.
|
|
6
6
|
#
|
|
7
7
|
# Plain data on purpose — no requires, no dependency on the model —
|
|
@@ -13,6 +13,7 @@ module Hecks
|
|
|
13
13
|
module Vocabulary
|
|
14
14
|
TABLES = {
|
|
15
15
|
"AggregateDispatchOrder" => [
|
|
16
|
+
{"step"=>"decode_arguments"}.freeze,
|
|
16
17
|
{"step"=>"refuse_unknown_arguments"}.freeze,
|
|
17
18
|
{"step"=>"refuse_absent_arguments"}.freeze,
|
|
18
19
|
{"step"=>"normalize_args"}.freeze,
|
|
@@ -30,6 +31,24 @@ module Hecks
|
|
|
30
31
|
{"step"=>"save"}.freeze,
|
|
31
32
|
{"step"=>"emit"}.freeze
|
|
32
33
|
].freeze,
|
|
34
|
+
"CargoReservedName" => [
|
|
35
|
+
{"name"=>"name"}.freeze,
|
|
36
|
+
{"name"=>"version"}.freeze,
|
|
37
|
+
{"name"=>"edition"}.freeze,
|
|
38
|
+
{"name"=>"path"}.freeze,
|
|
39
|
+
{"name"=>"authors"}.freeze,
|
|
40
|
+
{"name"=>"license"}.freeze,
|
|
41
|
+
{"name"=>"description"}.freeze,
|
|
42
|
+
{"name"=>"default"}.freeze,
|
|
43
|
+
{"name"=>"features"}.freeze,
|
|
44
|
+
{"name"=>"package"}.freeze,
|
|
45
|
+
{"name"=>"lib"}.freeze,
|
|
46
|
+
{"name"=>"bin"}.freeze,
|
|
47
|
+
{"name"=>"dependencies"}.freeze,
|
|
48
|
+
{"name"=>"dev-dependencies"}.freeze,
|
|
49
|
+
{"name"=>"build-dependencies"}.freeze,
|
|
50
|
+
{"name"=>"workspace"}.freeze
|
|
51
|
+
].freeze,
|
|
33
52
|
"Comparison" => [
|
|
34
53
|
{"symbol"=>">=", "compares_less_than"=>"true", "compares_equal"=>"false", "negated"=>"true"}.freeze,
|
|
35
54
|
{"symbol"=>"<=", "compares_less_than"=>"true", "compares_equal"=>"true", "negated"=>"false"}.freeze,
|
|
@@ -56,6 +75,7 @@ module Hecks
|
|
|
56
75
|
{"name"=>"UnknownVerb"}.freeze
|
|
57
76
|
].freeze,
|
|
58
77
|
"EntityDispatchOrder" => [
|
|
78
|
+
{"step"=>"decode_arguments"}.freeze,
|
|
59
79
|
{"step"=>"refuse_unknown_arguments"}.freeze,
|
|
60
80
|
{"step"=>"refuse_absent_arguments"}.freeze,
|
|
61
81
|
{"step"=>"normalize_args"}.freeze,
|
|
@@ -123,6 +143,136 @@ module Hecks
|
|
|
123
143
|
{"name"=>"contains"}.freeze,
|
|
124
144
|
{"name"=>"none_in_state"}.freeze
|
|
125
145
|
].freeze,
|
|
146
|
+
"RefusalSiteArgument" => [
|
|
147
|
+
{"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
148
|
+
{"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
149
|
+
{"refusal"=>"NotFound", "site"=>"creating_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
150
|
+
{"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
151
|
+
{"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
152
|
+
{"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
153
|
+
{"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
154
|
+
{"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
155
|
+
{"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
156
|
+
{"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
157
|
+
{"refusal"=>"AlreadyExists", "site"=>"entity_duplicate", "argument"=>"offered", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
158
|
+
{"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
159
|
+
{"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
160
|
+
{"refusal"=>"NotFound", "site"=>"acting_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
161
|
+
{"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
162
|
+
{"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
163
|
+
{"refusal"=>"NotFound", "site"=>"record_missing", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
164
|
+
{"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
165
|
+
{"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
166
|
+
{"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
167
|
+
{"refusal"=>"NotFound", "site"=>"entity_parent_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
168
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_unknown", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
169
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_unknown", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
170
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
171
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
172
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_no_identity", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
173
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
174
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"identity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
175
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"wants", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
176
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
177
|
+
{"refusal"=>"NotFound", "site"=>"entity_element_missing", "argument"=>"parent_id", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
178
|
+
{"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
179
|
+
{"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"heads", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
180
|
+
{"refusal"=>"NotFound", "site"=>"reference_target_missing", "argument"=>"key", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
181
|
+
{"refusal"=>"NotFound", "site"=>"read_model_reference_missing", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
182
|
+
{"refusal"=>"NotFound", "site"=>"read_model_reference_missing", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
183
|
+
{"refusal"=>"TypeMismatch", "site"=>"read_model_object_reference", "argument"=>"query", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
184
|
+
{"refusal"=>"TypeMismatch", "site"=>"read_model_object_reference", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
185
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_query", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
186
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_query", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
187
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_query_missing", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
188
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_query_missing", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
189
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_holds_no_list", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
190
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_holds_no_list", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
191
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_no_command", "argument"=>"entity", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
192
|
+
{"refusal"=>"UnknownVerb", "site"=>"entity_no_command", "argument"=>"command", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
193
|
+
{"refusal"=>"UnknownVerb", "site"=>"aggregate_no_command", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
194
|
+
{"refusal"=>"UnknownVerb", "site"=>"aggregate_no_command", "argument"=>"command", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
195
|
+
{"refusal"=>"UnknownVerb", "site"=>"port_no_operation", "argument"=>"port", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
196
|
+
{"refusal"=>"UnknownVerb", "site"=>"port_no_operation", "argument"=>"operation", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
197
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_domain", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
198
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_domain", "argument"=>"verb", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
199
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_read_model", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
200
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_read_model", "argument"=>"query", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
201
|
+
{"refusal"=>"UnknownVerb", "site"=>"not_fully_qualified", "argument"=>"verb", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
202
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_aggregate", "argument"=>"domain", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
203
|
+
{"refusal"=>"UnknownVerb", "site"=>"no_aggregate", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"inspect", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
204
|
+
{"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
205
|
+
{"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
206
|
+
{"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"current", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
207
|
+
{"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "argument"=>"allowed", "shape"=>"list", "quoting"=>"inspect", "separator"=>" or ", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
208
|
+
{"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
209
|
+
{"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
210
|
+
{"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
211
|
+
{"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
212
|
+
{"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"attribute", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
213
|
+
{"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
214
|
+
{"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "argument"=>"known_by", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
215
|
+
{"refusal"=>"TypeMismatch", "site"=>"multi_field_scalar", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
216
|
+
{"refusal"=>"TypeMismatch", "site"=>"composite_identity", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
217
|
+
{"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
218
|
+
{"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
219
|
+
{"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"expected", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
220
|
+
{"refusal"=>"TypeMismatch", "site"=>"numeric_field", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
221
|
+
{"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
222
|
+
{"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
223
|
+
{"refusal"=>"TypeMismatch", "site"=>"non_finite_field", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
224
|
+
{"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
225
|
+
{"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
226
|
+
{"refusal"=>"TypeMismatch", "site"=>"integer_range", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
227
|
+
{"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
228
|
+
{"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
229
|
+
{"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"pattern", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
230
|
+
{"refusal"=>"TypeMismatch", "site"=>"pattern_mismatch", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
231
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
232
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
233
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_amount", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
234
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
235
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
236
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_current", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
237
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_shared_field", "argument"=>"op", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
238
|
+
{"refusal"=>"TypeMismatch", "site"=>"arithmetic_shared_field", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
239
|
+
{"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
240
|
+
{"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"unknown", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"true", "when_empty"=>""}.freeze,
|
|
241
|
+
{"refusal"=>"UnknownArgument", "site"=>"unknown_args", "argument"=>"declared", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>"none"}.freeze,
|
|
242
|
+
{"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
243
|
+
{"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"absent", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"true", "when_empty"=>""}.freeze,
|
|
244
|
+
{"refusal"=>"AbsentArgument", "site"=>"absent_args", "argument"=>"declared", "shape"=>"list", "quoting"=>"none", "separator"=>", ", "sorted"=>"false", "when_empty"=>"none"}.freeze,
|
|
245
|
+
{"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"type", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
246
|
+
{"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"admitted", "shape"=>"list", "quoting"=>"inspect", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
247
|
+
{"refusal"=>"InvariantViolation", "site"=>"closed_set_member", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
248
|
+
{"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
249
|
+
{"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"description", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
250
|
+
{"refusal"=>"InvariantViolation", "site"=>"value_object_invariant", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
251
|
+
{"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
252
|
+
{"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"admits", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
253
|
+
{"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"admitted", "shape"=>"list", "quoting"=>"inspect", "separator"=>", ", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
254
|
+
{"refusal"=>"InvariantViolation", "site"=>"admits_declared_set", "argument"=>"offered", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
255
|
+
{"refusal"=>"InvariantViolation", "site"=>"undeclared_set", "argument"=>"name", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
256
|
+
{"refusal"=>"InvariantViolation", "site"=>"undeclared_set", "argument"=>"admits", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
257
|
+
{"refusal"=>"Unauthorized", "site"=>"tenant_required", "argument"=>"query", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
258
|
+
{"refusal"=>"Unauthorized", "site"=>"tenant_required", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
259
|
+
{"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"command", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
260
|
+
{"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"role", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
261
|
+
{"refusal"=>"Unauthorized", "site"=>"role_mismatch", "argument"=>"caller_role", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
262
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
263
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
264
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"tenant", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
265
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"attribute", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
266
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"target", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
267
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"target_field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
268
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "argument"=>"other", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
269
|
+
{"refusal"=>"AttributeAbsent", "site"=>"absent_read", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
270
|
+
{"refusal"=>"AttributeAbsent", "site"=>"absent_read", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
271
|
+
{"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"aggregate", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
272
|
+
{"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
273
|
+
{"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"reference", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze,
|
|
274
|
+
{"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "argument"=>"remote_field", "shape"=>"scalar", "quoting"=>"none", "separator"=>"", "sorted"=>"false", "when_empty"=>""}.freeze
|
|
275
|
+
].freeze,
|
|
126
276
|
"RefusalTemplate" => [
|
|
127
277
|
{"refusal"=>"NotFound", "site"=>"creating_no_identity", "template"=>"{command} creates a {aggregate} — pass {identity}:"}.freeze,
|
|
128
278
|
{"refusal"=>"AlreadyExists", "site"=>"creating_duplicate", "template"=>"{command} creates a {aggregate} that already exists — {identity} {offered}"}.freeze,
|
|
@@ -148,7 +298,7 @@ module Hecks
|
|
|
148
298
|
{"refusal"=>"UnknownVerb", "site"=>"no_aggregate", "template"=>"{domain} has no aggregate {aggregate}"}.freeze,
|
|
149
299
|
{"refusal"=>"LifecycleRefused", "site"=>"transition_blocked", "template"=>"{command} refused — {field} is {current}, and {command} moves it only from {allowed}"}.freeze,
|
|
150
300
|
{"refusal"=>"TypeMismatch", "site"=>"value_object_shape", "template"=>"{name} is a {type} — pass its fields as an object, not {offered}"}.freeze,
|
|
151
|
-
{"refusal"=>"TypeMismatch", "site"=>"
|
|
301
|
+
{"refusal"=>"TypeMismatch", "site"=>"reference_wrong_shape", "template"=>"{command} refused — a reference is an id, and {attribute} arrived as {offered}{known_by}"}.freeze,
|
|
152
302
|
{"refusal"=>"TypeMismatch", "site"=>"multi_field_scalar", "template"=>"{type} has multiple fields and cannot stand in for a scalar"}.freeze,
|
|
153
303
|
{"refusal"=>"TypeMismatch", "site"=>"composite_identity", "template"=>"{type} is a composite identity — an identity must have exactly one field"}.freeze,
|
|
154
304
|
{"refusal"=>"TypeMismatch", "site"=>"numeric_field", "template"=>"{type}.{field} expects {expected}, got {offered}"}.freeze,
|
|
@@ -166,9 +316,61 @@ module Hecks
|
|
|
166
316
|
{"refusal"=>"InvariantViolation", "site"=>"undeclared_set", "template"=>"{name} admits {admits}, which this chapter does not declare — a closed set is named Aggregate::SetName, and it must be one the bluebook actually holds"}.freeze,
|
|
167
317
|
{"refusal"=>"Unauthorized", "site"=>"tenant_required", "template"=>"{query} declares authorize with tenant: {field} — pass {field}: to name which {field} this ask is scoped to"}.freeze,
|
|
168
318
|
{"refusal"=>"Unauthorized", "site"=>"role_mismatch", "template"=>"{command} refused — role: {role}, and the caller stated {caller_role}"}.freeze,
|
|
319
|
+
{"refusal"=>"Unauthorized", "site"=>"cross_tenant_reference", "template"=>"{aggregate} {field} is {tenant}, but {attribute} names a {target} whose own {target_field} is {other} — a cross-tenant reference"}.freeze,
|
|
169
320
|
{"refusal"=>"AttributeAbsent", "site"=>"absent_read", "template"=>"{aggregate} {field} is absent on this record — declared, not optional, and added since it was written. Backfill it in a translation (backfill :{field}, default: ...), or declare it optional: true"}.freeze,
|
|
170
321
|
{"refusal"=>"ProjectionAbsent", "site"=>"absent_read", "template"=>"{aggregate} {field} is not yet projected on this record — declared via projects :{field}, but no rebuild sweep has populated it. Run the sweep, or read {reference}.{remote_field} directly if this rule cannot wait"}.freeze
|
|
171
322
|
].freeze,
|
|
323
|
+
"RustReservedWord" => [
|
|
324
|
+
{"word"=>"as"}.freeze,
|
|
325
|
+
{"word"=>"break"}.freeze,
|
|
326
|
+
{"word"=>"const"}.freeze,
|
|
327
|
+
{"word"=>"continue"}.freeze,
|
|
328
|
+
{"word"=>"crate"}.freeze,
|
|
329
|
+
{"word"=>"dyn"}.freeze,
|
|
330
|
+
{"word"=>"else"}.freeze,
|
|
331
|
+
{"word"=>"enum"}.freeze,
|
|
332
|
+
{"word"=>"extern"}.freeze,
|
|
333
|
+
{"word"=>"false"}.freeze,
|
|
334
|
+
{"word"=>"fn"}.freeze,
|
|
335
|
+
{"word"=>"for"}.freeze,
|
|
336
|
+
{"word"=>"if"}.freeze,
|
|
337
|
+
{"word"=>"impl"}.freeze,
|
|
338
|
+
{"word"=>"in"}.freeze,
|
|
339
|
+
{"word"=>"let"}.freeze,
|
|
340
|
+
{"word"=>"loop"}.freeze,
|
|
341
|
+
{"word"=>"match"}.freeze,
|
|
342
|
+
{"word"=>"mod"}.freeze,
|
|
343
|
+
{"word"=>"move"}.freeze,
|
|
344
|
+
{"word"=>"mut"}.freeze,
|
|
345
|
+
{"word"=>"pub"}.freeze,
|
|
346
|
+
{"word"=>"ref"}.freeze,
|
|
347
|
+
{"word"=>"return"}.freeze,
|
|
348
|
+
{"word"=>"self"}.freeze,
|
|
349
|
+
{"word"=>"Self"}.freeze,
|
|
350
|
+
{"word"=>"static"}.freeze,
|
|
351
|
+
{"word"=>"struct"}.freeze,
|
|
352
|
+
{"word"=>"super"}.freeze,
|
|
353
|
+
{"word"=>"trait"}.freeze,
|
|
354
|
+
{"word"=>"true"}.freeze,
|
|
355
|
+
{"word"=>"type"}.freeze,
|
|
356
|
+
{"word"=>"unsafe"}.freeze,
|
|
357
|
+
{"word"=>"use"}.freeze,
|
|
358
|
+
{"word"=>"where"}.freeze,
|
|
359
|
+
{"word"=>"while"}.freeze,
|
|
360
|
+
{"word"=>"abstract"}.freeze,
|
|
361
|
+
{"word"=>"become"}.freeze,
|
|
362
|
+
{"word"=>"box"}.freeze,
|
|
363
|
+
{"word"=>"do"}.freeze,
|
|
364
|
+
{"word"=>"final"}.freeze,
|
|
365
|
+
{"word"=>"macro"}.freeze,
|
|
366
|
+
{"word"=>"override"}.freeze,
|
|
367
|
+
{"word"=>"priv"}.freeze,
|
|
368
|
+
{"word"=>"typeof"}.freeze,
|
|
369
|
+
{"word"=>"unsized"}.freeze,
|
|
370
|
+
{"word"=>"virtual"}.freeze,
|
|
371
|
+
{"word"=>"yield"}.freeze,
|
|
372
|
+
{"word"=>"try"}.freeze
|
|
373
|
+
].freeze,
|
|
172
374
|
"SignTest" => [
|
|
173
375
|
{"name"=>"positive?", "compares_via"=>">"}.freeze,
|
|
174
376
|
{"name"=>"negative?", "compares_via"=>"<"}.freeze,
|
|
@@ -195,8 +397,8 @@ module Hecks
|
|
|
195
397
|
].freeze
|
|
196
398
|
}.freeze
|
|
197
399
|
|
|
198
|
-
#
|
|
199
|
-
# one-field vocabulary is the whole of it. Derived
|
|
400
|
+
# The terms — the first field of each row, which for a
|
|
401
|
+
# one-field vocabulary is the whole of it. Derived once and
|
|
200
402
|
# frozen rather than mapped per call: these are constant
|
|
201
403
|
# tables, and a constant that allocates a new array every
|
|
202
404
|
# time it is read is not one.
|
data/lib/hecks.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative "hecks/version"
|
|
2
|
+
require_relative "hecks/deprecation"
|
|
2
3
|
# The closed sets the runtime computes with, generated from
|
|
3
4
|
# vocabulary.bluebook. Plain data, required first, because some of
|
|
4
5
|
# them are read while a bluebook is still being parsed.
|
|
@@ -22,16 +23,17 @@ require_relative "hecks/router"
|
|
|
22
23
|
require_relative "hecks/runtime"
|
|
23
24
|
require_relative "hecks/adapters"
|
|
24
25
|
require_relative "hecks/projector"
|
|
25
|
-
#
|
|
26
|
-
# every target registers itself as it loads, so this require
|
|
26
|
+
# After the projector registry and its `Target` mixin are both real —
|
|
27
|
+
# every target registers itself as it loads, so this require is the
|
|
27
28
|
# installation of them.
|
|
28
29
|
require_relative "hecks/projections"
|
|
29
|
-
#
|
|
30
|
+
# After `Projector` (dispatches against the `:cli` projection) and
|
|
30
31
|
# `Ports::Clock` (fills a staleness rule's `now` at the door) both exist.
|
|
31
32
|
require_relative "hecks/facade/cli_door"
|
|
32
33
|
require_relative "hecks/facade/cli_runner"
|
|
33
34
|
require_relative "hecks/storehouse"
|
|
34
35
|
require_relative "hecks/framework"
|
|
36
|
+
require_relative "hecks/corpus"
|
|
35
37
|
require_relative "hecks/embryonaut_bluebook"
|
|
36
38
|
|
|
37
39
|
# The root namespace and public facade of the whole DSL/runtime: `Hecks.boot`/
|
|
@@ -44,14 +46,14 @@ module Hecks
|
|
|
44
46
|
class LoadOutsideBoot < StandardError; end
|
|
45
47
|
|
|
46
48
|
class << self
|
|
47
|
-
# The loading words below collect into the registry the
|
|
49
|
+
# The loading words below collect into the registry the runtime is
|
|
48
50
|
# holding open ; booting and that ambient state belong to the runtime
|
|
49
51
|
# layer, so this module is their facade and Hecks::Runtime is where
|
|
50
52
|
# they live.
|
|
51
53
|
# `install_facade:` — see Runtime::Loader.boot. Defaults on; a caller
|
|
52
54
|
# that only dispatches by FQN string can skip the global sugar.
|
|
53
55
|
#
|
|
54
|
-
# `environment:` —
|
|
56
|
+
# `environment:` — recovered, not new: this parameter (and the
|
|
55
57
|
# `environments/<name>.hecksagon` / `.world` overlay it loads —
|
|
56
58
|
# see Adapters::Folder#load_domain) existed on a prior commit of
|
|
57
59
|
# this repo (933d1dd), was vendored out to a real consumer
|
|
@@ -86,14 +88,14 @@ module Hecks
|
|
|
86
88
|
# default), a command's role stays exactly what it is without this:
|
|
87
89
|
# decoration.
|
|
88
90
|
#
|
|
89
|
-
# `actor_id` is
|
|
91
|
+
# `actor_id` is optional — a caller naming only a role is checked by
|
|
90
92
|
# string equality against the command's own `role`, exactly as
|
|
91
|
-
# before. A caller that also names
|
|
93
|
+
# before. A caller that also names who it is lets the check run
|
|
92
94
|
# against a real Governance `RoleAssignment` instead, once the
|
|
93
95
|
# command's domain has Governance attached — see
|
|
94
96
|
# `CommandRules::Authorization`'s own header.
|
|
95
97
|
#
|
|
96
|
-
# `as_of` and `scope` are
|
|
98
|
+
# `as_of` and `scope` are optional too, same shape — see
|
|
97
99
|
# `Runtime.as_caller`'s own header for what each does.
|
|
98
100
|
def as_caller(role:, actor_id: nil, as_of: nil, scope: nil, &)
|
|
99
101
|
Runtime.as_caller(role: role, actor_id: actor_id, as_of: as_of, scope: scope, &)
|
|
@@ -104,7 +106,7 @@ module Hecks
|
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
def hecksagon(name, &) = collect(:add_hecksagon, Bluebook::DSL::HecksagonBuilder.build(name, &))
|
|
107
|
-
#
|
|
109
|
+
# Repointed to DomainPortBuilder — the migration DomainPort's own
|
|
108
110
|
# class comment names as its goal, now landed for the top-level
|
|
109
111
|
# `.port` file callers too (the aggregate-scoped `Thing.port(...)`,
|
|
110
112
|
# binding_proxy.rb, already went through this builder). Every real
|
|
@@ -115,12 +117,12 @@ module Hecks
|
|
|
115
117
|
# identity check) — a pure repoint, no behavior change for any
|
|
116
118
|
# existing caller reading `.verb`/`.signal` off what comes back.
|
|
117
119
|
#
|
|
118
|
-
# `legacy_bare_port: true` — the
|
|
120
|
+
# `legacy_bare_port: true` — the one real semantic gap this repoint
|
|
119
121
|
# would otherwise open: `PortBuilder#build` never refused a
|
|
120
122
|
# completely empty build (no verb, no signal even), a real shape
|
|
121
123
|
# dsl_spec.rb's own "a port" tests exercise (`signal`-only, no
|
|
122
124
|
# `verb`). `DomainPortBuilder`'s own "declares no verb and no
|
|
123
|
-
# operations" refusal is real and correct for its
|
|
125
|
+
# operations" refusal is real and correct for its other two callers
|
|
124
126
|
# (`BindingProxy#port`, `HecksagonBuilder#port_impl`) — only this,
|
|
125
127
|
# the literal top-level `.port` file entry point, keeps the older,
|
|
126
128
|
# looser rule (see `DomainPortBuilder#initialize`'s own comment).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
module RuboCop
|
|
2
2
|
module Cop
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
4
|
+
# Flags the exact shape behind 8+ real bugs already fixed one at a
|
|
5
5
|
# time across this codebase (Tiers 1-5): `holder[a] || holder[b]` —
|
|
6
|
-
# the
|
|
6
|
+
# the same receiver looked up by two different keys, falling back to
|
|
7
7
|
# the second lookup whenever the first is falsy. `||` cannot tell a
|
|
8
|
-
# genuinely
|
|
8
|
+
# genuinely stored `false` from a missing key — both are falsy in
|
|
9
9
|
# Ruby — so a real `false` sitting at `holder[a]` is silently
|
|
10
10
|
# discarded and `holder[b]` (usually absent, so `nil`) is returned
|
|
11
11
|
# instead. Every one of those 8+ instances was the identical
|
|
@@ -13,26 +13,26 @@ module RuboCop
|
|
|
13
13
|
# `h[k.to_sym] || h[k]`, reading a value that could arrive keyed
|
|
14
14
|
# either by symbol or by string off the wire).
|
|
15
15
|
#
|
|
16
|
-
#
|
|
16
|
+
# The fix this codebase already converged on — see
|
|
17
17
|
# `lib/hecks/query_specification/field_path.rb#read`, the shared
|
|
18
18
|
# digger this whole bug class got consolidated behind: check
|
|
19
|
-
# `key?`
|
|
19
|
+
# `key?` first, never fall back through `||`.
|
|
20
20
|
#
|
|
21
21
|
# sym = segment.to_sym
|
|
22
22
|
# return current.key?(sym) ? current[sym] : current[segment]
|
|
23
23
|
#
|
|
24
24
|
# That method's own comment says it plainly: "`key?` first, never
|
|
25
25
|
# `||`, because `||` falls through a genuinely-stored `false` to
|
|
26
|
-
# the
|
|
27
|
-
# This cop exists so the
|
|
26
|
+
# the other spelling (usually absent) and returns `nil` instead."
|
|
27
|
+
# This cop exists so the next `holder[a] || holder[b]` gets caught
|
|
28
28
|
# mechanically, before it becomes bug #9, rather than found by
|
|
29
29
|
# hand again in a future audit.
|
|
30
30
|
#
|
|
31
|
-
#
|
|
31
|
+
# Scoped to the `[]`/`[]` shape only, deliberately — a receiver
|
|
32
32
|
# method-call is compared by AST structure (`==`, which ignores
|
|
33
33
|
# source location), so `hash[a] || hash[b]` is flagged whether
|
|
34
34
|
# `hash` is a local variable, a method call, or a constant, but
|
|
35
|
-
# `a[k] || b[k]` (
|
|
35
|
+
# `a[k] || b[k]` (different receivers) and `value || default`
|
|
36
36
|
# (an ordinary default, not a second lookup at all) are both left
|
|
37
37
|
# alone — neither one can silently drop a stored `false` the way
|
|
38
38
|
# a same-receiver double-lookup can.
|
|
@@ -65,11 +65,11 @@ module RuboCop
|
|
|
65
65
|
rhs_receiver, rhs_key = bracket_lookup(node.rhs)
|
|
66
66
|
return unless rhs_receiver
|
|
67
67
|
|
|
68
|
-
#
|
|
68
|
+
# **The structural equality check** — `==` on an AST node (from the
|
|
69
69
|
# `ast` gem `Node` this compiles down to) compares `type` and
|
|
70
70
|
# `children` recursively and ignores source location, so
|
|
71
71
|
# `hash[a] || hash[b]` matches even though the two `hash`
|
|
72
|
-
# sub-nodes are two distinct node
|
|
72
|
+
# sub-nodes are two distinct node objects parsed from two
|
|
73
73
|
# different source ranges. A different receiver on each side
|
|
74
74
|
# (`a[k] || b[k]`) fails this check and is correctly left alone.
|
|
75
75
|
return unless lhs_receiver == rhs_receiver
|
|
@@ -1,47 +1,48 @@
|
|
|
1
1
|
module RuboCop
|
|
2
2
|
module Cop
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
5
|
-
# both
|
|
4
|
+
# Flags `hash[new] = hash.delete(old)` inside a loop — a method that
|
|
5
|
+
# both reads and writes the same hash across a loop's iterations,
|
|
6
6
|
# in the specific rename/permutation shape this codebase has
|
|
7
7
|
# already lost real data to once.
|
|
8
8
|
#
|
|
9
|
-
#
|
|
9
|
+
# The bug this is the mechanical follow-up to (M27,
|
|
10
10
|
# docs/audits/2026-08-10-main-bug-audit.md,
|
|
11
11
|
# docs/audits/2026-08-11-bug-triage.md; fixed in
|
|
12
12
|
# `Hecks::Ports::Persistence::Lineage#apply_renames`,
|
|
13
13
|
# lib/hecks/ports/persistence/plugins/era/lineage.rb): a rename
|
|
14
14
|
# rule set applied one rule at a time, `state[new_name] =
|
|
15
|
-
# state.delete(old_name)` per rule, against the
|
|
15
|
+
# state.delete(old_name)` per rule, against the same hash it was
|
|
16
16
|
# reading from — so a swap (`rename :a, to: :b` alongside `rename
|
|
17
17
|
# :b, to: :a`) on `{a: 1, b: 2}` collapsed to `{a: 1}`. The first
|
|
18
18
|
# rule wrote `b: 1` (clobbering the real `b: 2`) before the second
|
|
19
19
|
# rule ever got a chance to read the value that was supposed to
|
|
20
20
|
# move to `:a` — sequential edits stepping on each other, not the
|
|
21
21
|
# simultaneous permutation a rename set actually means. The same
|
|
22
|
-
# shape loses data identically for
|
|
22
|
+
# shape loses data identically for any chain longer than one link
|
|
23
23
|
# (`a->b->c->a`), not just a two-element swap.
|
|
24
24
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
25
|
+
# **The fix this cop points at** — snapshot every old key's value
|
|
26
|
+
# first, delete all old keys, then write all new keys, so no
|
|
27
27
|
# rename in the pass ever reads a key this same pass has already
|
|
28
28
|
# written:
|
|
29
29
|
#
|
|
30
|
-
# snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
|
|
30
|
+
# snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
|
|
31
|
+
# if state.key?(old_name) }
|
|
31
32
|
# snapshot.each { |old_name, _new_name, _value| state.delete(old_name) }
|
|
32
33
|
# snapshot.each { |_old_name, new_name, value| state[new_name] = value }
|
|
33
34
|
#
|
|
34
|
-
#
|
|
35
|
+
# **What this cop does not attempt** — the general checklist item is
|
|
35
36
|
# broader than any AST pattern can safely automate ("any method
|
|
36
37
|
# that both reads and writes the same collection across a loop"
|
|
37
38
|
# covers plenty of correct code too — accumulating into a result
|
|
38
39
|
# hash, memoizing into a cache). This cop stays narrow and
|
|
39
|
-
# precise: only the
|
|
40
|
+
# precise: only the exact `recv[x] = recv.delete(y)` shape, same
|
|
40
41
|
# receiver both sides, inside something that iterates. A single
|
|
41
42
|
# rename outside any loop is not this bug (nothing else can have
|
|
42
43
|
# run first); `hash.store(...)` instead of `hash[...] =`, or
|
|
43
44
|
# `hash.delete(...)` whose result is not immediately written back
|
|
44
|
-
# into the
|
|
45
|
+
# into the same hash, are not this shape either and are left to
|
|
45
46
|
# the broader code-review checklist item, not this cop.
|
|
46
47
|
#
|
|
47
48
|
# @example
|
|
@@ -51,7 +52,8 @@ module RuboCop
|
|
|
51
52
|
# end
|
|
52
53
|
#
|
|
53
54
|
# # good — snapshot first, then delete, then write: one permutation
|
|
54
|
-
# snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
|
|
55
|
+
# snapshot = renames.filter_map { |old_name, new_name| [old_name, new_name, state[old_name]]
|
|
56
|
+
# if state.key?(old_name) }
|
|
55
57
|
# snapshot.each { |old_name, _new_name, _value| state.delete(old_name) }
|
|
56
58
|
# snapshot.each { |_old_name, new_name, value| state[new_name] = value }
|
|
57
59
|
class SequentialHashRenameInLoop < Base
|