hecks 1.3.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 +5 -4
- 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/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 +18 -18
- data/lib/hecks/behaviors/dsl.rb +2 -2
- data/lib/hecks/behaviors/expectations.rb +23 -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 +7 -7
- 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 +101 -87
- 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 +170 -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 +180 -19
- 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 +140 -45
- 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 +37 -18
- data/lib/hecks/fuzzing/form_census.rb +35 -20
- 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 +62 -62
- data/lib/hecks/fuzzing/nondeterministic.rb +67 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +19 -21
- data/lib/hecks/fuzzing/properties/corrections.rb +9 -9
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +154 -49
- data/lib/hecks/fuzzing/properties/guards.rb +42 -42
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +32 -32
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +22 -35
- data/lib/hecks/fuzzing/properties/outbox.rb +24 -24
- data/lib/hecks/fuzzing/properties/querying.rb +17 -17
- data/lib/hecks/fuzzing/properties.rb +64 -40
- data/lib/hecks/fuzzing/qa_settings.rb +152 -0
- data/lib/hecks/fuzzing/replay.rb +114 -114
- data/lib/hecks/fuzzing/rotation_priority.rb +10 -10
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +113 -0
- data/lib/hecks/fuzzing/self_consistency.rb +141 -112
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +35 -35
- 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 +58 -31
- data/lib/hecks/fuzzing/sequence_generator.rb +111 -23
- data/lib/hecks/fuzzing/shrinker.rb +197 -0
- data/lib/hecks/fuzzing/structural_skips.rb +23 -130
- data/lib/hecks/fuzzing/sweep_depth.rb +4 -4
- data/lib/hecks/fuzzing/target_capabilities.rb +49 -18
- data/lib/hecks/fuzzing/value_generator.rb +14 -14
- data/lib/hecks/fuzzing.rb +5 -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 +348 -13
- data/lib/hecks/language/oidc.json +5 -0
- data/lib/hecks/literal.rb +9 -9
- data/lib/hecks/naming.rb +25 -25
- 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 +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 +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 +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 +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 +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 +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 +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 +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 +3 -3
- data/lib/hecks/projections/glossary/markdown.rb +3 -3
- data/lib/hecks/projections/glossary/mermaid.rb +1 -1
- data/lib/hecks/projections/glossary/sections.rb +1 -1
- data/lib/hecks/projections/glossary/sentences.rb +5 -5
- data/lib/hecks/projections/glossary.rb +15 -15
- 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 +11 -11
- 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 +109 -27
- 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 +42 -63
- 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 +35 -35
- 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 +151 -67
- data/lib/hecks/runtime/entity_interpreter.rb +108 -82
- 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 +55 -64
- data/lib/hecks/runtime/reaction_invocation.rb +20 -20
- 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 -115
- 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 +45 -28
- data/lib/hecks/runtime/remote_dispatcher.rb +38 -23
- data/lib/hecks/runtime/routing.rb +10 -153
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +17 -17
- data/lib/hecks/runtime/saga_interpreter.rb +64 -64
- 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 +318 -127
- data/lib/hecks/runtime/value/entity_list_coercion.rb +34 -34
- data/lib/hecks/runtime/value.rb +21 -21
- 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 +205 -4
- 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 +22 -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,
|
|
@@ -170,6 +320,57 @@ module Hecks
|
|
|
170
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,
|
|
171
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
|
|
172
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,
|
|
173
374
|
"SignTest" => [
|
|
174
375
|
{"name"=>"positive?", "compares_via"=>">"}.freeze,
|
|
175
376
|
{"name"=>"negative?", "compares_via"=>"<"}.freeze,
|
|
@@ -196,8 +397,8 @@ module Hecks
|
|
|
196
397
|
].freeze
|
|
197
398
|
}.freeze
|
|
198
399
|
|
|
199
|
-
#
|
|
200
|
-
# 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
|
|
201
402
|
# frozen rather than mapped per call: these are constant
|
|
202
403
|
# tables, and a constant that allocates a new array every
|
|
203
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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module RuboCop
|
|
2
2
|
module Cop
|
|
3
3
|
module Hecks
|
|
4
|
-
#
|
|
4
|
+
# Flags plain `@ivar` mutation inside a class this codebase already
|
|
5
5
|
# knows is a thread-shared singleton — one `Dispatcher`/`Registry`
|
|
6
6
|
# instance lives for the life of a boot and is dispatched through
|
|
7
7
|
# from every thread of a Puma worker pool (or any other multi-
|
|
@@ -9,29 +9,29 @@ module RuboCop
|
|
|
9
9
|
# shared, mutable state with no per-thread or mutex-guarded
|
|
10
10
|
# isolation at all.
|
|
11
11
|
#
|
|
12
|
-
#
|
|
12
|
+
# This is the mechanical follow-up to a real bug already fixed here
|
|
13
13
|
# (see `dispatcher.rb`'s own `#reenter` comment, and
|
|
14
14
|
# `spec/runtime/dispatcher_spec.rb`): `@reaction_depth` used to be a
|
|
15
15
|
# plain ivar on `Dispatcher`, so two threads' concurrent top-level
|
|
16
16
|
# dispatches corrupted each other's view of "how deep into a
|
|
17
17
|
# reaction cascade am I". The fix moved that one ivar to
|
|
18
18
|
# `Thread.current[:hecks_reaction_depth]`. This cop exists so the
|
|
19
|
-
#
|
|
19
|
+
# next plain ivar someone adds to either class gets flagged before
|
|
20
20
|
# it becomes the next instance of the same bug, rather than after.
|
|
21
21
|
#
|
|
22
|
-
#
|
|
22
|
+
# **Scoped narrowly on purpose** — by class name
|
|
23
23
|
# (`Hecks::Runtime::Dispatcher`/`Hecks::Runtime::Registry`), not by
|
|
24
24
|
# blanket-flagging every ivar mutation in the codebase. Most classes
|
|
25
|
-
# in this codebase are
|
|
25
|
+
# in this codebase are not shared across threads (a fresh value
|
|
26
26
|
# object per call, a builder used once at boot) and ivar mutation
|
|
27
27
|
# there is completely ordinary Ruby with no hazard behind it at
|
|
28
28
|
# all — flagging it everywhere would be noise nobody trusts, the
|
|
29
29
|
# same reasoning `.rubocop.yml`'s own header gives for every other
|
|
30
30
|
# cop in this repo.
|
|
31
31
|
#
|
|
32
|
-
#
|
|
32
|
+
# What counts as "PLAIN": `@ivar = ...`, `@ivar ||= ...`, `@ivar +=
|
|
33
33
|
# ...`, `@ivar << ...`, `@ivar[k] = v`. `initialize` is exempt — an
|
|
34
|
-
# ivar being
|
|
34
|
+
# ivar being set up for the first time, before any other thread can
|
|
35
35
|
# possibly hold a reference to this object, is not the hazard (see
|
|
36
36
|
# `Registry#initialize`'s own `@saga_mutex = Mutex.new`, which this
|
|
37
37
|
# cop must not flag). `Thread.current[...]`-backed state and a
|
|
@@ -68,8 +68,8 @@ module RuboCop
|
|
|
68
68
|
RESTRICT_ON_SEND = [:<<, :[]=].freeze
|
|
69
69
|
|
|
70
70
|
def on_ivasgn(node)
|
|
71
|
-
# A
|
|
72
|
-
# children. The commissioner also visits the
|
|
71
|
+
# A plain `@x = 1` parses as `(ivasgn :@x (int 1))` — two
|
|
72
|
+
# children. The commissioner also visits the bare `(ivasgn :@x)`
|
|
73
73
|
# node nested one level inside an `op_asgn`/`or_asgn` (`@x += 1`,
|
|
74
74
|
# `@x ||= 1`) as its own `ivasgn` node with only one child — that
|
|
75
75
|
# one is handled by `on_op_asgn`/`on_or_asgn` below instead, so
|
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
|
81
81
|
|
|
82
82
|
def on_op_asgn(node)
|
|
83
83
|
# `@x += 1` parses as `(op_asgn (ivasgn :@x) :+ (int 1))` — the
|
|
84
|
-
# target is an `ivasgn` node carrying
|
|
84
|
+
# target is an `ivasgn` node carrying just the name (no value
|
|
85
85
|
# child, unlike a plain `@x = 1`), not an `ivar` node.
|
|
86
86
|
ivar_node = node.children.first
|
|
87
87
|
return unless ivar_node.is_a?(RuboCop::AST::Node) && ivar_node.ivasgn_type?
|
|
@@ -99,7 +99,7 @@ module RuboCop
|
|
|
99
99
|
receiver = node.receiver
|
|
100
100
|
return unless receiver
|
|
101
101
|
|
|
102
|
-
# `@ivar << x` — the receiver
|
|
102
|
+
# `@ivar << x` — the receiver is the ivar.
|
|
103
103
|
# `@ivar[k] = v` — the receiver is a `send(@ivar, :[], k)`, whose
|
|
104
104
|
# own receiver is the ivar (`node.receiver.receiver`).
|
|
105
105
|
ivar_node = if receiver.ivar_type?
|