hecks 2.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +50 -7
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +32 -100
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +31 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +19 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +47 -108
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +22 -584
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +154 -400
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +52 -90
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -4,44 +4,16 @@ require_relative "../../runtime/value"
|
|
|
4
4
|
module Hecks
|
|
5
5
|
module QuerySpecification
|
|
6
6
|
module Common
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
# aggregate query actually runs) and `Runtime::QueryInterpreter`
|
|
10
|
-
# (entity/sub-list queries, and any adapter implementing no `:query`)
|
|
11
|
-
# — plus a third partial reading of `comparable` inside
|
|
12
|
-
# `SqlQueryBuilder#query_value`.
|
|
13
|
-
#
|
|
14
|
-
# Two copies of one rule is not a style complaint here; it has cost
|
|
15
|
-
# real bugs twice already, both recorded in the comments those files
|
|
16
|
-
# carried. `none_in_state` was added to one copy only, so an ordinary
|
|
17
|
-
# Memory query's `none_in_state` clause fell to the `else` branch and
|
|
18
|
-
# silently excluded every row. And `comparable` diverged without
|
|
19
|
-
# anyone noticing: one copy took the first numeric member of a value
|
|
20
|
-
# object, the other only unwrapped when there was exactly one — so a
|
|
21
|
-
# value object with two numeric members compared as a number on one
|
|
22
|
-
# path and as a whole Hash on the other.
|
|
23
|
-
#
|
|
24
|
-
# The callers still differ in how they reach a value — one takes a
|
|
25
|
-
# registry argument, the other closes over `@registry`; one digs the
|
|
26
|
-
# field through `FieldPath`, the other is handed it — so they keep
|
|
27
|
-
# their own resolution and share only the comparison itself.
|
|
7
|
+
# The one comparator table shared by `Ports::Query::InMemory` and
|
|
8
|
+
# `Runtime::QueryInterpreter`, so every engine reads a where-clause identically.
|
|
28
9
|
module Comparison
|
|
29
10
|
module_function
|
|
30
11
|
|
|
31
12
|
# Unwraps a value object to the one scalar a comparison can mean.
|
|
32
13
|
#
|
|
33
|
-
#
|
|
34
|
-
# is
|
|
35
|
-
#
|
|
36
|
-
# Anything else is returned unchanged rather than guessed at — two
|
|
37
|
-
# numeric members give no reason to prefer either, and picking the
|
|
38
|
-
# first silently compares a field the author never named.
|
|
39
|
-
#
|
|
40
|
-
# A declaration naming an ambiguous value object is refused when
|
|
41
|
-
# the bluebook loads (`AggregateBuilder`'s own query-field seal),
|
|
42
|
-
# so this branch is a backstop rather than the primary guard: which
|
|
43
|
-
# member is meant is knowable at declaration time, and a refusal
|
|
44
|
-
# naming the candidates is worth more than any runtime reading.
|
|
14
|
+
# Only a sole numeric member, or a sole member of any type, is unambiguous; anything
|
|
15
|
+
# else is returned unchanged rather than guessed at. Ambiguous declarations are refused
|
|
16
|
+
# at load, so this is a backstop.
|
|
45
17
|
#
|
|
46
18
|
# @param value [Runtime::Value, Hash, Object, nil] a held or wanted value; a
|
|
47
19
|
# `Runtime::Value` is read through its `to_h`
|
|
@@ -58,9 +30,8 @@ module Hecks
|
|
|
58
30
|
value
|
|
59
31
|
end
|
|
60
32
|
|
|
61
|
-
# Lists the members a value object offers a scalar comparison, for a
|
|
62
|
-
#
|
|
63
|
-
# unambiguous — nothing to report.
|
|
33
|
+
# Lists the members a value object offers a scalar comparison, for a refusal
|
|
34
|
+
# that can name them. Empty when the value object is unambiguous.
|
|
64
35
|
#
|
|
65
36
|
# @param value_object [Class<Bluebook::ValueObject>] the declared shape (a subclass
|
|
66
37
|
# minted by `Bluebook::ValueObject.declare`, closed sets included) a query field names
|
|
@@ -76,34 +47,19 @@ module Hecks
|
|
|
76
47
|
|
|
77
48
|
NUMERIC_TYPES = %w[Integer Float Numeric].freeze
|
|
78
49
|
|
|
79
|
-
# Decides whether one where-clause comparison holds between the value
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
# A `case` over a closed, declared set (`Vocabulary::QueryComparator`,
|
|
83
|
-
# held equal to this list by spec/vocabulary_table_spec — see the
|
|
84
|
-
# `else` branch's own comment) is the whole point of the one
|
|
85
|
-
# comparator table this file's header describes: one place naming
|
|
86
|
-
# every comparator, not one method per comparator scattered across
|
|
87
|
-
# a module.
|
|
50
|
+
# Decides whether one where-clause comparison holds between the value a record
|
|
51
|
+
# holds and the value the query wants.
|
|
88
52
|
#
|
|
89
|
-
# @param operation [Symbol, String]
|
|
90
|
-
# `
|
|
91
|
-
# @param held [Object, nil] the record's own value for the field
|
|
92
|
-
#
|
|
93
|
-
#
|
|
94
|
-
# @
|
|
95
|
-
#
|
|
96
|
-
# @param registry [Runtime::Registry, nil] used only by `none_in_state` to look the
|
|
97
|
-
# target aggregate up; `nil` makes that comparator hold
|
|
98
|
-
# @return [Boolean] whether the comparison holds; an ordered comparator over a
|
|
99
|
-
# non-`Numeric` operand is `false`
|
|
100
|
-
# @raise [Runtime::WiringError] if `operation` names no comparator in this table, or
|
|
101
|
-
# `none_in_state`'s target aggregate has no repository that can be wired
|
|
53
|
+
# @param operation [Symbol, String] `eq`, `ne`, `lt`, `lte`, `gt`, `gte`, `in`,
|
|
54
|
+
# `contains` or `none_in_state`
|
|
55
|
+
# @param held [Object, nil] the record's own value for the field
|
|
56
|
+
# @param want [Object, nil] the value compared against
|
|
57
|
+
# @param registry [Runtime::Registry, nil] used only by `none_in_state`
|
|
58
|
+
# @return [Boolean] whether the comparison holds
|
|
59
|
+
# @raise [Runtime::WiringError] if `operation` names no comparator in this table
|
|
102
60
|
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
103
61
|
def holds?(operation, held, want, registry: nil)
|
|
104
|
-
# A NULL satisfies no comparison
|
|
105
|
-
# the rule and the reasoning, including why `none_in_state` is
|
|
106
|
-
# exempt from it.
|
|
62
|
+
# A NULL satisfies no comparison (`none_in_state` is exempt); see NullPolicy.
|
|
107
63
|
return false if NullPolicy.unmatchable?(operation, held, want)
|
|
108
64
|
|
|
109
65
|
case operation.to_s
|
|
@@ -117,24 +73,15 @@ module Hecks
|
|
|
117
73
|
when "contains" then contains?(held, want)
|
|
118
74
|
when "none_in_state" then none_in_state?(held, want, registry)
|
|
119
75
|
else
|
|
120
|
-
#
|
|
121
|
-
# QueryComparator, held equal to this list by
|
|
122
|
-
# spec/vocabulary_table_spec) — this is not a real runtime
|
|
123
|
-
# path today, only a backstop against the day a tenth
|
|
124
|
-
# comparator reaches the grammar and this method doesn't
|
|
125
|
-
# grow to match. Silently reading an unrecognized comparator
|
|
126
|
-
# as `eq` is exactly the failure this table already shipped
|
|
127
|
-
# once (see this file's own header) — an operator this
|
|
128
|
-
# method can't evaluate must refuse, not guess.
|
|
76
|
+
# Backstop: an unrecognized comparator must refuse, never read as `eq`.
|
|
129
77
|
raise Runtime::WiringError, "no comparator handles #{operation.to_s.inspect} — add one before declaring it"
|
|
130
78
|
end
|
|
131
79
|
end
|
|
132
80
|
|
|
133
81
|
# Checks that both operands of an ordered comparison are numbers.
|
|
134
82
|
#
|
|
135
|
-
#
|
|
136
|
-
#
|
|
137
|
-
# predates the extraction (lt was already exactly this permissive).
|
|
83
|
+
# Ordered comparators are numeric-only and silently false otherwise; a where-clause
|
|
84
|
+
# never raises.
|
|
138
85
|
#
|
|
139
86
|
# @param held [Object, nil] the record's own value for the field
|
|
140
87
|
# @param want [Object, nil] the value compared against
|
|
@@ -143,12 +90,8 @@ module Hecks
|
|
|
143
90
|
|
|
144
91
|
# Reads a comparator's list operand as the Strings membership is tested against.
|
|
145
92
|
#
|
|
146
|
-
# `in`
|
|
147
|
-
#
|
|
148
|
-
# serialisation), each element unwrapped the same way a scalar
|
|
149
|
-
# field is. This is `in`'s reading of its argument (a caller may
|
|
150
|
-
# legitimately pass "a,b,c" meaning "any of these") — unrelated to
|
|
151
|
-
# `contains`, which reads the stored field. See `contains?`.
|
|
93
|
+
# `in` accepts an Array or a comma-separated String; `contains` reads the stored
|
|
94
|
+
# field instead (see `contains?`).
|
|
152
95
|
#
|
|
153
96
|
# @param value [Array, String, Object, nil] an Array of elements, or anything whose
|
|
154
97
|
# `to_s` is a comma-separated list such as `"a, b,c"`
|
|
@@ -164,12 +107,6 @@ module Hecks
|
|
|
164
107
|
# Answers `in`: whether the held value, or any element of a held Array,
|
|
165
108
|
# occurs in the wanted list.
|
|
166
109
|
#
|
|
167
|
-
# A folded reference hop asks whether the locally-held identity is
|
|
168
|
-
# among the matching target identities. A has_many relationship holds
|
|
169
|
-
# several identities, so the same question becomes an intersection:
|
|
170
|
-
# does any held identity occur in the wanted set? Scalar `in` retains
|
|
171
|
-
# its existing one-candidate behavior.
|
|
172
|
-
#
|
|
173
110
|
# @param held [Array, Object] the record's own value; an Array contributes each
|
|
174
111
|
# element as a candidate, anything else is the single candidate
|
|
175
112
|
# @param want [Array, String, Object] the wanted set, read through `members`
|
|
@@ -182,19 +119,10 @@ module Hecks
|
|
|
182
119
|
candidates.any? { |candidate| wanted.include?(comparable(candidate).to_s) }
|
|
183
120
|
end
|
|
184
121
|
|
|
185
|
-
# Answers `contains`: element membership for a held Array, substring
|
|
186
|
-
# for anything else.
|
|
122
|
+
# Answers `contains`: element membership for a held Array, substring for anything else.
|
|
187
123
|
#
|
|
188
|
-
#
|
|
189
|
-
#
|
|
190
|
-
# arrives already, one element one member, nothing to split), and
|
|
191
|
-
# plain substring for anything else. The scalar case deliberately
|
|
192
|
-
# stays out of `members`' comma-split: that silently reads a
|
|
193
|
-
# free-text field's own comma as a separator — which the SQL
|
|
194
|
-
# side's `instr`/`position` never does, so the two disagree the
|
|
195
|
-
# moment a scalar's real content holds a comma. Matching SQL's
|
|
196
|
-
# substring reading here keeps every engine answering `contains`
|
|
197
|
-
# identically for the same declared field.
|
|
124
|
+
# A scalar is not comma-split, so free text containing a comma matches the way
|
|
125
|
+
# SQL's `instr`/`position` does.
|
|
198
126
|
#
|
|
199
127
|
# @param held [Array, Object] the record's own value; anything but an Array is
|
|
200
128
|
# read through `to_s`
|
|
@@ -206,29 +134,17 @@ module Hecks
|
|
|
206
134
|
held.to_s.include?(want.to_s)
|
|
207
135
|
end
|
|
208
136
|
|
|
209
|
-
# Answers `none_in_state` by looking the held identity up in another
|
|
210
|
-
#
|
|
137
|
+
# Answers `none_in_state` by looking the held identity up in another aggregate's
|
|
138
|
+
# repository and reading that record's state.
|
|
211
139
|
#
|
|
212
|
-
#
|
|
213
|
-
# "
|
|
214
|
-
# keyed by this record's own field value, is in the named state.
|
|
215
|
-
# No registry — no way to look the target up — reads as "not
|
|
216
|
-
# excluded", the same graceful default a missing record already
|
|
217
|
-
# falls back to. The target is searched by bare name across every
|
|
218
|
-
# loaded domain; ambiguity (two domains declaring one name) picks
|
|
219
|
-
# the first match rather than refusing, since a where-clause never
|
|
220
|
-
# raises (see `ordered?`).
|
|
140
|
+
# Holds when no such record is in the named state. No registry, aggregate or record
|
|
141
|
+
# reads as "not excluded". The target is found by bare name; the first match wins.
|
|
221
142
|
#
|
|
222
|
-
# @param held [Object, nil] this record's own field value,
|
|
223
|
-
#
|
|
224
|
-
# @param
|
|
225
|
-
#
|
|
226
|
-
# @
|
|
227
|
-
# aggregate and its repository in
|
|
228
|
-
# @return [Boolean] `false` only when the target record exists and its lifecycle
|
|
229
|
-
# field (or `:state`, absent a lifecycle) equals the named state; `true` when
|
|
230
|
-
# there is no registry, no such aggregate or no such record
|
|
231
|
-
# @raise [Runtime::WiringError] if the target aggregate's repository cannot be wired
|
|
143
|
+
# @param held [Object, nil] this record's own field value, the target record's identity
|
|
144
|
+
# @param want [String, Symbol] `"Aggregate:state"`, split on the first colon
|
|
145
|
+
# @param registry [Runtime::Registry, nil] the booted registry
|
|
146
|
+
# @return [Boolean] `false` only when the target record is in the named state
|
|
147
|
+
# @raise [Runtime::WiringError] if the target's repository cannot be wired
|
|
232
148
|
def none_in_state?(held, want, registry)
|
|
233
149
|
return true unless registry
|
|
234
150
|
|
|
@@ -240,31 +156,7 @@ module Hecks
|
|
|
240
156
|
record = registry.repository(target_domain, target_ir).find(held)
|
|
241
157
|
return true unless record
|
|
242
158
|
|
|
243
|
-
# The
|
|
244
|
-
# declaration — not assumed to be literally named `state`. Every
|
|
245
|
-
# `none_in_state` fixture this comparator originally shipped
|
|
246
|
-
# with (spec/query_none_in_state_*_spec.rb) happens to declare a
|
|
247
|
-
# plain `attribute :state, ...` rather than a real `lifecycle`,
|
|
248
|
-
# which is how the previous hardcoded `record.state[:state]`
|
|
249
|
-
# passed every one of them while being wrong for the shape this
|
|
250
|
-
# whole comparator exists to answer about: a real state machine.
|
|
251
|
-
# `lifecycle :field, default: ... do ... end` stores its state
|
|
252
|
-
# under `field` (`Instance#assign_creation_attributes`'s own
|
|
253
|
-
# `state[aggregate.lifecycle.field.to_sym] = ...`), and this
|
|
254
|
-
# codebase's own convention overwhelmingly names that field
|
|
255
|
-
# `status`, not `state` (`QualityControl::Clearance`'s own
|
|
256
|
-
# `lifecycle :status` among many others) — so the hardcoded key
|
|
257
|
-
# silently read `nil` from every real lifecycle-backed target,
|
|
258
|
-
# comparable(nil) != state was true unconditionally, and
|
|
259
|
-
# `none_in_state` against any lifecycle aggregate answered
|
|
260
|
-
# "not excluded" for every row, always, no matter its actual
|
|
261
|
-
# state. Found chasing `QualityControl::Bug.AwaitingClearance`
|
|
262
|
-
# (qa/bluebook/quality_control.bluebook), which is exactly this
|
|
263
|
-
# shape: `Clearance:green`/`Clearance:red` against a `lifecycle
|
|
264
|
-
# :status` aggregate. Falls back to `:state` when the target
|
|
265
|
-
# declares no lifecycle at all, so every existing fixture (a
|
|
266
|
-
# plain attribute literally named `state`) keeps answering
|
|
267
|
-
# exactly as before.
|
|
159
|
+
# The state lives on the target's lifecycle field, else on `:state`.
|
|
268
160
|
field = target_ir.lifecycle&.field || :state
|
|
269
161
|
comparable(record.state[field]) != state
|
|
270
162
|
end
|
|
@@ -11,33 +11,17 @@ require_relative "where_clause"
|
|
|
11
11
|
module Hecks
|
|
12
12
|
module QuerySpecification
|
|
13
13
|
module Common
|
|
14
|
-
#
|
|
15
|
-
# `
|
|
16
|
-
# bluebook DSL words, mixed into both QueryBuilder and
|
|
17
|
-
# ReadModelBuilder so the two specification kinds parse the same
|
|
18
|
-
# clauses identically rather than each carrying its own copy.
|
|
14
|
+
# Builder methods for the `where`/`order_by`/`limit`/`offset`/`cursor`/`authorize`/
|
|
15
|
+
# `nulls`/`inspect_query` DSL words, shared by QueryBuilder and ReadModelBuilder.
|
|
19
16
|
module DSL
|
|
20
|
-
# Records one `WhereClause` per `field => value` pair
|
|
21
|
-
# `where` DSL word forwards to.
|
|
17
|
+
# Records one `WhereClause` per `field => value` pair (the `where` DSL word).
|
|
22
18
|
#
|
|
23
|
-
# `where`/`order_by
|
|
24
|
-
#
|
|
25
|
-
# the grammar table rather than defined as methods: both the Query
|
|
26
|
-
# and the ReadModel Keyword rows name the `_impl` method in
|
|
27
|
-
# `calls:`, the same shape `attribute_impl` has, and a shared mixin
|
|
28
|
-
# means one method each. `where`/`order_by` are bootstrap-reachable
|
|
29
|
-
# (every core chapter's own `read_model` filters its roster with
|
|
30
|
-
# them), so they must resolve through
|
|
31
|
-
# `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK` while the grammar
|
|
32
|
-
# table is still being built.
|
|
19
|
+
# `where`/`order_by` resolve through `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`
|
|
20
|
+
# while the grammar table is being built.
|
|
33
21
|
#
|
|
34
|
-
# @param clauses [Hash{Symbol => Object}] field name
|
|
35
|
-
# one
|
|
36
|
-
#
|
|
37
|
-
# value means `eq`
|
|
38
|
-
# @return [void]
|
|
39
|
-
# @raise [ArgumentError] if a Hash value does not have exactly one pair, or names a
|
|
40
|
-
# comparator outside `COMPARATORS`
|
|
22
|
+
# @param clauses [Hash{Symbol => Object}] field name to a literal, a query argument
|
|
23
|
+
# Symbol, or a one-pair Hash such as `{ gte: :minimum }`; a bare value means `eq`
|
|
24
|
+
# @raise [ArgumentError] if a Hash value is not one known `COMPARATORS` pair
|
|
41
25
|
def where_impl(clauses)
|
|
42
26
|
@wheres ||= []
|
|
43
27
|
clauses.each do |field, value|
|
|
@@ -1,37 +1,23 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module QuerySpecification
|
|
3
3
|
module Common
|
|
4
|
-
# Null
|
|
5
|
-
#
|
|
6
|
-
# which comparators a null value can never satisfy (#unmatchable?,
|
|
7
|
-
# #sql_predicate) — kept in one place because Memory, Postgres and
|
|
8
|
-
# SQLite each default nulls differently and must be made to agree
|
|
9
|
-
# explicitly rather than leaking their own native behavior.
|
|
4
|
+
# Null handling shared by the in-memory and SQL query engines: null-aware ordering
|
|
5
|
+
# and the comparators a null can never satisfy, so every adapter agrees.
|
|
10
6
|
module NullPolicy
|
|
11
7
|
module_function
|
|
12
8
|
|
|
13
9
|
# Sorts records in memory by one key, placing the null-keyed ones where
|
|
14
10
|
# the policy says and keeping ties in their incoming order.
|
|
15
11
|
#
|
|
16
|
-
# Stable on purpose
|
|
17
|
-
#
|
|
18
|
-
# rather than store-dependent. A plain sort_by is not stable in Ruby, so
|
|
19
|
-
# equal keys would shuffle and the identity tier would be lost exactly
|
|
20
|
-
# where it is needed. Descending reverses both partitions, so a tie reads
|
|
21
|
-
# identity-descending too — the same total order sql_order renders as
|
|
22
|
-
# `field DESC, id DESC`.
|
|
12
|
+
# Stable on purpose: rows arrive in identity order, which makes ties deterministic.
|
|
13
|
+
# Descending reverses both partitions, matching `sql_order`'s `field DESC, id DESC`.
|
|
23
14
|
#
|
|
24
15
|
# @param records [Array<Object>] the rows to order, already in identity order
|
|
25
|
-
# @param direction [Symbol, String] `desc`
|
|
26
|
-
#
|
|
27
|
-
# @param policy [NullSemantics, nil] where nulls go: mode `first` or `last`; `nil` or
|
|
28
|
-
# any other mode (`native`) puts nulls first ascending and last descending
|
|
29
|
-
# @yield reads the sort key out of one record
|
|
16
|
+
# @param direction [Symbol, String] `desc` sorts descending; anything else ascending
|
|
17
|
+
# @param policy [NullSemantics, nil] mode `first` or `last`; otherwise `native`
|
|
30
18
|
# @yieldparam record [Object] one element of `records`
|
|
31
|
-
# @yieldreturn [Comparable, nil] the key
|
|
32
|
-
#
|
|
33
|
-
# @return [Array<Object>] a new Array holding every record in the requested order
|
|
34
|
-
# @raise [ArgumentError] if two non-nil keys cannot be compared with each other
|
|
19
|
+
# @yieldreturn [Comparable, nil] the sort key; `nil` marks the record null-keyed
|
|
20
|
+
# @return [Array<Object>] a new Array in the requested order
|
|
35
21
|
def order(records, direction:, policy: nil, &key)
|
|
36
22
|
descending = direction.to_s.downcase == "desc"
|
|
37
23
|
null_rows, valued_rows = records.partition { |record| key.call(record).nil? }
|
|
@@ -50,27 +36,13 @@ module Hecks
|
|
|
50
36
|
# Renders the `ORDER BY` terms for one expression, with an explicit
|
|
51
37
|
# `NULLS FIRST`/`NULLS LAST` and an `id` tiebreak in the same direction.
|
|
52
38
|
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
# default to decide: Postgres puts nulls last on ASC (and first
|
|
56
|
-
# on DESC), while `#order` above — this same "native" default,
|
|
57
|
-
# for Memory — puts nulls first on ASC (and last on DESC), the
|
|
58
|
-
# SQLite convention. Same query, same data, different row order
|
|
59
|
-
# depending only on which adapter ran it. Rendered explicitly
|
|
60
|
-
# here instead, so an undeclared policy means the same total
|
|
61
|
-
# order everywhere rather than "whatever this store already does"
|
|
62
|
-
# — matching `#order`'s own default rather than the other way
|
|
63
|
-
# round, since that default is unconditional (Memory/Heki have no
|
|
64
|
-
# dialect to defer to) and SQLite already agrees with it natively.
|
|
39
|
+
# An undeclared (`native`) policy still renders `NULLS ...`, because dialects
|
|
40
|
+
# differ (Postgres puts nulls last on ASC); this matches `#order`'s default.
|
|
65
41
|
#
|
|
66
|
-
# @param expression [String] the SQL expression
|
|
67
|
-
#
|
|
68
|
-
# @param
|
|
69
|
-
#
|
|
70
|
-
# @param policy [NullSemantics, nil] mode `first` or `last` pins the nulls; `nil` or
|
|
71
|
-
# any other mode renders `NULLS FIRST` ascending and `NULLS LAST` descending
|
|
72
|
-
# @return [String] the terms without the `ORDER BY` keyword, such as
|
|
73
|
-
# `"price ASC NULLS FIRST, id ASC"`
|
|
42
|
+
# @param expression [String] the SQL expression, interpolated as is
|
|
43
|
+
# @param direction [Symbol, String] `desc` renders `DESC`; anything else `ASC`
|
|
44
|
+
# @param policy [NullSemantics, nil] mode `first` or `last` pins the nulls
|
|
45
|
+
# @return [String] the terms without `ORDER BY`, such as `"price ASC NULLS FIRST, id ASC"`
|
|
74
46
|
def sql_order(expression, direction, policy)
|
|
75
47
|
direction = direction.to_s.downcase == "desc" ? "DESC" : "ASC"
|
|
76
48
|
nulls = case policy&.mode.to_s
|
|
@@ -81,34 +53,13 @@ module Hecks
|
|
|
81
53
|
"#{expression} #{direction}#{nulls}, id #{direction}"
|
|
82
54
|
end
|
|
83
55
|
|
|
84
|
-
#
|
|
85
|
-
# `sql_predicate` below. That one answers "the value compared to is
|
|
86
|
-
# null" (`eq: nil` -> IS NULL, `ne: nil` -> IS NOT NULL, a real
|
|
87
|
-
# convention both adapters already shared). This one answers the
|
|
88
|
-
# case nothing covered: the row's own value is null and the value
|
|
89
|
-
# compared to is not.
|
|
56
|
+
# Comparators a NULL row value can never satisfy.
|
|
90
57
|
#
|
|
91
|
-
# SQL
|
|
92
|
-
# is
|
|
93
|
-
# two adapters therefore answered the same query on the same data
|
|
94
|
-
# differently — Memory returning a row SQLite omitted — which is
|
|
95
|
-
# not a difference of opinion a caller can plan around.
|
|
96
|
-
#
|
|
97
|
-
# Resolved toward SQL, and not because SQL is the store: an absent
|
|
98
|
-
# or null field is unknown, not a value, and a comparison against
|
|
99
|
-
# unknown is unknown rather than true. Making SQL match Ruby
|
|
100
|
-
# instead would mean compiling every `ne:` to
|
|
101
|
-
# `(col <> $1 OR col IS NULL)` — more to get right in two
|
|
102
|
-
# dialects, and a reliable way to lose an index — to make a real
|
|
103
|
-
# query engine agree with an in-memory one.
|
|
104
|
-
#
|
|
105
|
-
# `none_in_state` is deliberately not here: it is a 9th, vendored
|
|
106
|
-
# comparator whose `held` is a reference id, and a row holding no
|
|
107
|
-
# reference is genuinely "not in that state" rather than unknown.
|
|
58
|
+
# SQL treats `NULL <> 'red'` as unknown, so the row is dropped; Memory follows SQL.
|
|
59
|
+
# `none_in_state` is excluded: a row with no reference is not in that state.
|
|
108
60
|
NULL_UNMATCHABLE = %w[eq ne lt lte gt gte in contains].freeze
|
|
109
61
|
|
|
110
|
-
# Decides whether a comparison is lost
|
|
111
|
-
# own value is null — the rule `NULL_UNMATCHABLE`'s comment argues for.
|
|
62
|
+
# Decides whether a comparison is lost because the row's own value is null.
|
|
112
63
|
#
|
|
113
64
|
# @param operation [Symbol, String] the comparator name, such as `:ne`
|
|
114
65
|
# @param held [Object, nil] the row's own value for the field
|
|
@@ -119,9 +70,8 @@ module Hecks
|
|
|
119
70
|
held.nil? && !want.nil? && NULL_UNMATCHABLE.include?(operation.to_s)
|
|
120
71
|
end
|
|
121
72
|
|
|
122
|
-
# Renders the SQL for a comparison against a null value
|
|
123
|
-
#
|
|
124
|
-
# `NULL` parameter to `=` or `<>`.
|
|
73
|
+
# Renders the SQL for a comparison against a null value (`IS NULL`/`IS NOT NULL`),
|
|
74
|
+
# so an adapter never binds a `NULL` parameter to `=` or `<>`.
|
|
125
75
|
#
|
|
126
76
|
# @param expression [String] the SQL expression for the field, interpolated as is
|
|
127
77
|
# @param operation [Symbol, String] the comparator name
|
|
@@ -3,12 +3,8 @@ require_relative "null_semantics"
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module QuerySpecification
|
|
5
5
|
module Common
|
|
6
|
-
# The attribute set every query-shaped construct shares
|
|
7
|
-
#
|
|
8
|
-
# inspection mode — plus `options_to_h`/`extra_options_to_h` for
|
|
9
|
-
# serializing it. Both Bluebook::Query and
|
|
10
|
-
# QuerySpecification::ReadModel::Specification subclass this
|
|
11
|
-
# rather than each declaring the same fields twice.
|
|
6
|
+
# The attribute set every query-shaped construct shares, plus `options_to_h` and
|
|
7
|
+
# `extra_options_to_h` for serializing it.
|
|
12
8
|
class Options
|
|
13
9
|
attr_reader :wheres, :order_by, :limit, :offset, :cursor,
|
|
14
10
|
:authorization, :null_semantics, :inspection
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
module Hecks
|
|
2
2
|
module QuerySpecification
|
|
3
3
|
module Common
|
|
4
|
-
# `target`
|
|
5
|
-
#
|
|
6
|
-
# `ReadModelBuilder#where_impl`). Always `nil` for a plain `Query`'s
|
|
7
|
-
# own `where` (that builder never overrides `where_impl` to accept
|
|
8
|
-
# `on:`), and `nil` for a `read_model` with a single many-side head,
|
|
9
|
-
# where naming one is unnecessary. `to_h` omits the key entirely
|
|
10
|
-
# rather than emitting `target: nil` — the same "absent, not null"
|
|
11
|
-
# convention `count`/`median_field` already established
|
|
12
|
-
# (`lib/hecks/bluebook/read_model.rb`), so every read model that
|
|
13
|
-
# never uses `on:` keeps its existing wire shape byte-identical.
|
|
4
|
+
# One filter clause. `target` names the many-side `include`d aggregate on a
|
|
5
|
+
# `read_model` with several (ADR 0055); `to_h` omits it when `nil`.
|
|
14
6
|
WhereClause = Struct.new(:field, :op, :value, :target, keyword_init: true) do
|
|
15
7
|
def to_h
|
|
16
8
|
base = { field: field.to_s, op: op.to_s, value: QuerySpecification.render_value(value) }
|