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
|
@@ -2,126 +2,27 @@ require_relative "generic_dispatch"
|
|
|
2
2
|
module Hecks
|
|
3
3
|
module Bluebook
|
|
4
4
|
module DSL
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
# gate refuses a mistyped/inadmissible word directly, at the
|
|
8
|
-
# moment it reads a line of `.bluebook` source text, before any
|
|
9
|
-
# per-construct parsing runs. Ruby never lexes source text — a
|
|
10
|
-
# `.bluebook` file is Ruby, so `given("x")` is already a real
|
|
11
|
-
# method call by the time any of this code runs, and Ruby's own
|
|
12
|
-
# method dispatch already refuses an arity mismatch on an
|
|
13
|
-
# existing method for free. What Ruby's own dispatch does not do
|
|
14
|
-
# is consult the self-hosted grammar table at all — a mistyped
|
|
15
|
-
# word (`giv3n("x")`) or a word used in the wrong context
|
|
16
|
-
# (`identified_by` inside a `command` block) just raises Ruby's
|
|
17
|
-
# own generic `NoMethodError`, naming nothing about what the
|
|
18
|
-
# language actually admits. This module closes that gap.
|
|
5
|
+
# Checks undefined DSL words against the self-hosted grammar table, dispatching admitted ones
|
|
6
|
+
# through `GenericDispatch` and refusing the rest with the table's own message.
|
|
19
7
|
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
# `method_missing`/`respond_to_missing?` only — a word this
|
|
23
|
-
# builder class already answers with an ordinary `def` (or a
|
|
24
|
-
# method a shared mixin such as `AttributeCollector` defines) never
|
|
25
|
-
# reaches this module at all; Ruby's own method lookup finds it
|
|
26
|
-
# first, and not every word has had its hand-written method
|
|
27
|
-
# removed. A word the grammar admits whose builder has no
|
|
28
|
-
# hand-written method executes for real here, via `GenericDispatch`
|
|
29
|
-
# (item #13's full metaprogrammed dispatch, whole-project
|
|
30
|
-
# table-unification survey) — see that module's own header for
|
|
31
|
-
# exactly which ones, and the full account of what was verified
|
|
32
|
-
# before each was migrated. A mistyped or wrongly-contexted word
|
|
33
|
-
# gets the same real, helpful, table-driven refusal Rust's own
|
|
34
|
-
# `word_gate` already gives, instead of Ruby's own generic
|
|
35
|
-
# `NoMethodError`.
|
|
36
|
-
#
|
|
37
|
-
# ## `GRAMMAR_CONTEXT`
|
|
38
|
-
#
|
|
39
|
-
# `self.class::GRAMMAR_CONTEXT` — each including class names which
|
|
40
|
-
# row of the self-hosted `Context` closed set it corresponds to
|
|
41
|
-
# (`AggregateBuilder::GRAMMAR_CONTEXT = "Aggregate"`, etc.) — the
|
|
42
|
-
# same string `word_gate`'s own `context` parameter already is on
|
|
43
|
-
# the Rust side, read off the identical table.
|
|
44
|
-
#
|
|
45
|
-
# ## Bootstrapping
|
|
46
|
-
#
|
|
47
|
-
# Bootstrapping gated, the same reason `RuleReference#lookup`
|
|
48
|
-
# already is (`rule_reference.rb`'s own comment has the full
|
|
49
|
-
# story) — the meta-domain's own bootstrap calls dozens of
|
|
50
|
-
# keywords on itself before its own grammar table exists to
|
|
51
|
-
# check them against. For most words, this module steps aside
|
|
52
|
-
# entirely during bootstrap (`super`, Ruby's own ordinary
|
|
53
|
-
# `NoMethodError`) — the exact behavior every builder already had
|
|
54
|
-
# before this module existed, and (unlike `RuleReference`) there
|
|
55
|
-
# is deliberately no fallback covering the whole ~200-row table —
|
|
56
|
-
# that would defeat the entire point.
|
|
57
|
-
#
|
|
58
|
-
# One narrow exception (item #13's full metaprogrammed dispatch,
|
|
59
|
-
# slice 3, whole-project table-unification survey):
|
|
60
|
-
# `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK`, an explicit table
|
|
61
|
-
# naming the same (context, word) -> method pairs the real
|
|
62
|
-
# `calls:` column carries, projected ahead of time into the
|
|
63
|
-
# committed `bootstrap_table.rb` — it matters only for words both
|
|
64
|
-
# migrated to the `calls:` shape and bootstrap-reachable
|
|
65
|
-
# (`attribute`, for one). This is the one place in this whole arc a
|
|
66
|
-
# bootstrap fallback was worth building despite `RuleReference`'s
|
|
67
|
-
# own precedent against it: it duplicates no logic, only a method
|
|
68
|
-
# name — `attribute_impl`'s own real, hand-written body is called
|
|
69
|
-
# either way, bootstrap or not, so there is nothing here that can
|
|
70
|
-
# drift the way a full behavioral duplicate could.
|
|
71
|
-
#
|
|
72
|
-
# ## `word_gate_dispatch` and the type-position fallback
|
|
73
|
-
#
|
|
74
|
-
# Two further pieces, both slice 5:
|
|
75
|
-
# - `word_gate_dispatch` is the same admission+dispatch logic
|
|
76
|
-
# `method_missing` below runs, factored out so a class with
|
|
77
|
-
# its own class-level `method_missing` (`HecksagonBuilder`'s/
|
|
78
|
-
# `WorldBuilder`'s genuinely open-ended verb vocabulary) can
|
|
79
|
-
# call it directly and fall back to its own open-verb handling
|
|
80
|
-
# only when this returns `NOT_ADMITTED` — a class-level `def`
|
|
81
|
-
# always wins over an included module's in Ruby's own method
|
|
82
|
-
# resolution, so their own `method_missing` is the only one
|
|
83
|
-
# that ever runs for them, and this is what lets a real,
|
|
84
|
-
# closed-set word (`port`/`realm`/`latest`) still reach
|
|
85
|
-
# `GenericDispatch` despite that.
|
|
86
|
-
# - the "Type"-position fallback inside `word_gate_dispatch`
|
|
87
|
-
# itself, for `one_of`/`list_of` — called inside an
|
|
88
|
-
# attribute's own type argument, with `self` as whatever
|
|
89
|
-
# builder is currently `instance_eval`ing, never a dedicated
|
|
90
|
-
# "Type" builder `self.class::GRAMMAR_CONTEXT` could ever
|
|
91
|
-
# name. See that method's own comment.
|
|
8
|
+
# Each including class names its grammar row in `GRAMMAR_CONTEXT`. While the meta-domain
|
|
9
|
+
# boots there is no table, so only `GenericDispatch::BOOTSTRAP_CALLS_FALLBACK` applies.
|
|
92
10
|
module WordGate
|
|
93
|
-
#
|
|
94
|
-
#
|
|
95
|
-
# own header) checks for this to tell "not a word the grammar
|
|
96
|
-
# admits at all" apart from every other outcome below (a real
|
|
97
|
-
# dispatch, or a raised refusal) — never raised itself, so a
|
|
98
|
-
# caller can fall through to its own open-ended handling instead.
|
|
11
|
+
# Returned by `word_gate_dispatch` for a word no grammar row admits, so a caller with
|
|
12
|
+
# its own `method_missing` can fall back to open-ended handling.
|
|
99
13
|
NOT_ADMITTED = Object.new.freeze
|
|
100
14
|
|
|
101
|
-
# Private
|
|
102
|
-
#
|
|
103
|
-
# style: `spec/syntax_conformance_spec.rb`'s "declares every
|
|
104
|
-
# word X answers" check walks `public_instance_methods`, and a
|
|
105
|
-
# public `method_missing`/`respond_to_missing?` would show up
|
|
106
|
-
# there as two more "answered words" no row of the grammar ever
|
|
107
|
-
# declares, on every builder this module touches.
|
|
15
|
+
# Private like Object's own; public ones would appear as extra "answered words" in
|
|
16
|
+
# spec/syntax_conformance_spec.rb, which walks `public_instance_methods`.
|
|
108
17
|
|
|
109
18
|
private
|
|
110
19
|
|
|
111
20
|
def method_missing(word, *args, **kwargs, &block)
|
|
112
21
|
if MetaValidator.bootstrapping?
|
|
113
22
|
fallback = GenericDispatch::BOOTSTRAP_CALLS_FALLBACK
|
|
114
|
-
# Own context first, "Type"
|
|
115
|
-
# ordinary (non-bootstrapping) `word_gate_dispatch` path
|
|
116
|
-
# below checks them in, for the same reason: `list_of`/
|
|
117
|
-
# `one_of` used in an attribute's own type position never
|
|
118
|
-
# arrive with `self.class::GRAMMAR_CONTEXT == "Type"`.
|
|
23
|
+
# Own context first, then "Type", as in `word_gate_dispatch`.
|
|
119
24
|
own_key = [self.class::GRAMMAR_CONTEXT, word.to_s]
|
|
120
25
|
type_key = ["Type", word.to_s]
|
|
121
|
-
# key? first, never `||` — a target method name is never
|
|
122
|
-
# actually stored as `false`, but the fallback lookup itself
|
|
123
|
-
# must not silently prefer "Type" over this class's own
|
|
124
|
-
# context on the strength of a falsy-looking value.
|
|
125
26
|
found = fallback.key?(own_key) || fallback.key?(type_key)
|
|
126
27
|
target = fallback.key?(own_key) ? fallback[own_key] : fallback[type_key]
|
|
127
28
|
return send(target, *args, **kwargs, &block) if found
|
|
@@ -135,31 +36,8 @@ module Hecks
|
|
|
135
36
|
result
|
|
136
37
|
end
|
|
137
38
|
|
|
138
|
-
#
|
|
139
|
-
# `
|
|
140
|
-
# (slice 5, whole-project table-unification survey) — so a
|
|
141
|
-
# class with its own class-level `method_missing`
|
|
142
|
-
# (`HecksagonBuilder`'s/`WorldBuilder`'s genuinely open-ended
|
|
143
|
-
# verb vocabulary, `persisted_by "Heki"`/`posted_by "Carrier"`,
|
|
144
|
-
# can never be a closed table) can still route a word the
|
|
145
|
-
# grammar admits through here first, falling back to its own
|
|
146
|
-
# open-verb handling only for what this doesn't recognize at
|
|
147
|
-
# all — unblocking `Hecksagon#port`/`World#realm`/`World#latest`,
|
|
148
|
-
# each a real, closed-set word that happened to sit on a class
|
|
149
|
-
# whose own `method_missing` a class-level `def` always wins
|
|
150
|
-
# over Ruby's own module-inclusion order.
|
|
151
|
-
#
|
|
152
|
-
# Never raises "not admitted" — returns `NOT_ADMITTED` instead,
|
|
153
|
-
# so the caller (this module's own `method_missing`, or one of
|
|
154
|
-
# the two above) decides what that means for it. Does still
|
|
155
|
-
# raise the richer, table-driven refusals below once a word is
|
|
156
|
-
# admitted-but-unimplemented, or admitted-somewhere-else-only —
|
|
157
|
-
# those are real, useful refusals regardless of which
|
|
158
|
-
# `method_missing` is asking.
|
|
159
|
-
# One ordered admission-then-dispatch pipeline (own context, then
|
|
160
|
-
# "Type" fallback, then admitted-elsewhere check, then dispatch) —
|
|
161
|
-
# see this method's own header comment above for the full,
|
|
162
|
-
# order-dependent account of why each check runs where it does.
|
|
39
|
+
# Admission then dispatch: own context, "Type" fallback, admitted-elsewhere check,
|
|
40
|
+
# `GenericDispatch`. Returns `NOT_ADMITTED` for an unknown word rather than raising.
|
|
163
41
|
# rubocop:disable-next Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
164
42
|
def word_gate_dispatch(word, args, kwargs, block)
|
|
165
43
|
context = self.class::GRAMMAR_CONTEXT
|
|
@@ -167,19 +45,9 @@ module Hecks
|
|
|
167
45
|
keywords = rows[:keywords]
|
|
168
46
|
admitted = keywords.select { |row| row[:context] == context && (row[:word] == word.to_s || row[:was] == word.to_s) }
|
|
169
47
|
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
# one_of("a","b")`), run with `self` as whatever builder is
|
|
174
|
-
# currently instance_eval'ing — there is no dedicated "Type"
|
|
175
|
-
# builder of its own; every attribute()-taking builder answers
|
|
176
|
-
# these identically, through the shared `AttributeCollector`
|
|
177
|
-
# mixin. `self.class::GRAMMAR_CONTEXT` can never actually be
|
|
178
|
-
# "Type", so a word admitted only there would otherwise look
|
|
179
|
-
# inadmissible everywhere. Checked only once this context has
|
|
180
|
-
# already come up empty, so a context with its own same-named
|
|
181
|
-
# row (`ValueObject`'s own `one_of`, the block-wrapper form)
|
|
182
|
-
# keeps using that instead, unaffected.
|
|
48
|
+
# `one_of`/`list_of` in an attribute's type position run on whichever builder is
|
|
49
|
+
# evaluating, whose context is never "Type". Try "Type" only when its own context has
|
|
50
|
+
# no row, so a same-named row of its own (ValueObject's `one_of`) still wins.
|
|
183
51
|
if admitted.empty?
|
|
184
52
|
type_admitted = keywords.select { |row| row[:context] == "Type" && row[:word] == word.to_s }
|
|
185
53
|
unless type_admitted.empty?
|
|
@@ -196,13 +64,6 @@ module Hecks
|
|
|
196
64
|
"'#{word}' is not a word #{context} admits — legal words here: #{legal.join(', ')}"
|
|
197
65
|
end
|
|
198
66
|
|
|
199
|
-
# Item #13's full metaprogrammed dispatch — the word is
|
|
200
|
-
# admitted here, and this builder has no hand-written method
|
|
201
|
-
# left for it; before falling through to the "not yet
|
|
202
|
-
# implemented" refusal every word without one still gets,
|
|
203
|
-
# offer it to GenericDispatch — the safe, verified subset of
|
|
204
|
-
# words whose whole behavior is now executed off this same
|
|
205
|
-
# table, not just checked against it.
|
|
206
67
|
dispatched = GenericDispatch.try(self, context, word.to_s, args, kwargs, block, rows)
|
|
207
68
|
return dispatched unless dispatched.equal?(GenericDispatch::NOT_HANDLED)
|
|
208
69
|
|
|
@@ -221,15 +82,8 @@ module Hecks
|
|
|
221
82
|
super
|
|
222
83
|
end
|
|
223
84
|
|
|
224
|
-
#
|
|
225
|
-
#
|
|
226
|
-
# module's own richer refusal — `method_missing` fires for
|
|
227
|
-
# every typo in the whole codebase (this class's own genuinely
|
|
228
|
-
# private helper methods included), not just DSL keyword calls;
|
|
229
|
-
# only raise the rich, table-driven message when the word is at
|
|
230
|
-
# least something the grammar knows about, anywhere, so an
|
|
231
|
-
# unrelated Ruby-level typo inside a builder's own private code
|
|
232
|
-
# keeps its own ordinary, unconfusing `NoMethodError`.
|
|
85
|
+
# `method_missing` fires for every typo in a builder, so only words the grammar knows
|
|
86
|
+
# anywhere get the rich refusal; other typos keep Ruby's ordinary `NoMethodError`.
|
|
233
87
|
def admitted_anywhere?(rows, word)
|
|
234
88
|
rows.any? { |row| row[:word] == word.to_s || row[:was] == word.to_s }
|
|
235
89
|
end
|
|
@@ -2,22 +2,13 @@ require_relative "word_gate"
|
|
|
2
2
|
module Hecks
|
|
3
3
|
module Bluebook
|
|
4
4
|
module DSL
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
# on it inside the block is recorded verbatim by name, with no fixed
|
|
8
|
-
# vocabulary of its own; `WorldBuilder#record_binding` reads `#to_h`
|
|
9
|
-
# back out.
|
|
5
|
+
# Records every keyword call made inside a bind's settings block, by name, with
|
|
6
|
+
# no fixed vocabulary of its own.
|
|
10
7
|
class SettingsCollector
|
|
11
|
-
# Starts with no settings recorded.
|
|
12
8
|
def initialize = @values = {}
|
|
13
9
|
|
|
14
|
-
# A call with a block records
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
# @param key [Symbol] the setting's name, recorded verbatim
|
|
18
|
-
# @param args [Array] the setting's value: one argument is kept as is, several as an array
|
|
19
|
-
# @param block [Proc, nil] a nested settings block, evaluated on a fresh collector
|
|
20
|
-
# @return [Object] the value recorded under `key`
|
|
10
|
+
# A call with a block records its own settings as a nested Hash; a bare call
|
|
11
|
+
# keeps a single argument as is, several as an array.
|
|
21
12
|
def method_missing(key, *args, &block)
|
|
22
13
|
@values[key.to_sym] =
|
|
23
14
|
if block
|
|
@@ -34,30 +25,15 @@ module Hecks
|
|
|
34
25
|
def to_h = @values
|
|
35
26
|
end
|
|
36
27
|
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
# same bind line the sibling `.hecksagon` file already writes
|
|
40
|
-
# (`HecksagonBuilder`'s own `BindingProxy`), but `IR::World#for_verb`/
|
|
41
|
-
# `#for_binding` key purely by verb and adapter name — the aggregate
|
|
42
|
-
# qualifier is never read back out, it exists only for that visual
|
|
43
|
-
# mirroring. So unlike `BindingProxy`, nothing here needs to hold onto
|
|
44
|
-
# the resolved constant chain at all: every verb call, qualified or
|
|
45
|
-
# not, has to land in the exact same `@settings` write path
|
|
46
|
-
# (`WorldBuilder#record_binding`).
|
|
28
|
+
# Stands in for a bare aggregate constant inside a `.world` block, so a bind line
|
|
29
|
+
# can visually mirror its sibling `.hecksagon` spelling; the qualifier is never read back out.
|
|
47
30
|
class WorldConstProxy
|
|
48
|
-
# Mints the stand-in module a bare domain constant resolves to inside a `.world` block.
|
|
49
|
-
#
|
|
50
|
-
# @param builder [Bluebook::DSL::WorldBuilder] the builder every verb called through the
|
|
51
|
-
# module's proxies records its settings on
|
|
52
|
-
# @return [Module] an anonymous module whose `const_missing` answers a `WorldConstProxy`,
|
|
53
|
-
# whatever aggregate name follows `::`
|
|
54
31
|
def self.namespace(builder)
|
|
55
32
|
Module.new do
|
|
56
33
|
define_singleton_method(:const_missing) { |_aggregate| WorldConstProxy.new(builder) }
|
|
57
34
|
end
|
|
58
35
|
end
|
|
59
36
|
|
|
60
|
-
# @param builder [Bluebook::DSL::WorldBuilder] the builder verb calls are recorded on
|
|
61
37
|
def initialize(builder) = @builder = builder
|
|
62
38
|
|
|
63
39
|
def method_missing(verb, *args, **kwargs, &block) = @builder.record_binding(verb, args, kwargs, block)
|
|
@@ -65,76 +41,36 @@ module Hecks
|
|
|
65
41
|
def respond_to_missing?(_name, _include_private = false) = true
|
|
66
42
|
end
|
|
67
43
|
|
|
68
|
-
# Parses a `.world` file's top-level DSL block into a `World` — a
|
|
69
|
-
#
|
|
70
|
-
# settings, one entry per `verb("Adapter") do ... end` call (whether
|
|
71
|
-
# written bare or aggregate-qualified through `WorldConstProxy`'s
|
|
72
|
-
# visual mirror of a sibling `.hecksagon` file's own bind).
|
|
44
|
+
# Parses a `.world` file's top-level DSL block into a `World` — a domain's own
|
|
45
|
+
# `realm`/`latest` markers plus its adapter bind settings.
|
|
73
46
|
class WorldBuilder
|
|
74
47
|
GRAMMAR_CONTEXT = "World".freeze
|
|
75
48
|
|
|
76
49
|
include WordGate
|
|
77
50
|
|
|
78
|
-
# @param domain [String] name of the domain whose world this is
|
|
79
51
|
def initialize(domain)
|
|
80
52
|
@domain = domain
|
|
81
53
|
@settings = {}
|
|
82
54
|
end
|
|
83
55
|
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
# `realm_impl`/`latest_impl` answer the `realm`/`latest` words
|
|
87
|
-
# through the table's `calls:` column — item #13's full
|
|
88
|
-
# metaprogrammed dispatch (slice 5). Neither bootstrap-reachable
|
|
89
|
-
# (checked directly). Reached through `WordGate`'s
|
|
90
|
-
# `word_gate_dispatch`, called explicitly below since
|
|
91
|
-
# `WorldBuilder`'s own class-level `method_missing` (the
|
|
92
|
-
# open-verb catch-all beneath this) always wins over the
|
|
93
|
-
# module's — see `word_gate.rb`'s own header for the full
|
|
94
|
-
# mechanism.
|
|
95
|
-
#
|
|
96
|
-
# @param value [String, Symbol] the realm's name; blankness is judged by the world
|
|
97
|
-
# language at `build`, not here
|
|
98
|
-
# @return [String] the realm as stored
|
|
56
|
+
# Reached through `WordGate`'s `word_gate_dispatch`, called explicitly since this
|
|
57
|
+
# class's own `method_missing` would otherwise always win over the module's.
|
|
99
58
|
def realm_impl(value)
|
|
100
59
|
@realm = required(value, "realm")
|
|
101
60
|
end
|
|
102
61
|
|
|
103
|
-
#
|
|
104
|
-
# with the bluebook's own declared `version`.
|
|
105
|
-
#
|
|
106
|
-
# @param value [String, Symbol, Numeric] the version marker; blankness is judged by the
|
|
107
|
-
# world language at `build`, not here
|
|
108
|
-
# @return [String] the version as stored
|
|
62
|
+
# `ProjectRegister` compares this against the bluebook's own declared `version`.
|
|
109
63
|
def latest_impl(value)
|
|
110
64
|
@latest = required(value, "latest version")
|
|
111
65
|
end
|
|
112
66
|
|
|
113
|
-
#
|
|
114
|
-
# unless that chapter's own world settings name one.
|
|
115
|
-
#
|
|
116
|
-
# Answers the `default_database` word through the table's `calls:` column, the
|
|
117
|
-
# same way `realm_impl` does. A chapter's own
|
|
118
|
-
# `persisted_by("Adapter") { database ... }` still wins for that adapter.
|
|
119
|
-
#
|
|
120
|
-
# @param value [String] the connection, such as a database URL; blankness is
|
|
121
|
-
# judged by the world language at `build`, not here
|
|
122
|
-
# @return [String] the connection as stored
|
|
67
|
+
# A chapter's own `persisted_by("Adapter") { database ... }` still wins for that adapter.
|
|
123
68
|
def default_database_impl(value)
|
|
124
69
|
@default_database = required(value, "default database")
|
|
125
70
|
end
|
|
126
71
|
|
|
127
|
-
#
|
|
128
|
-
#
|
|
129
|
-
#
|
|
130
|
-
# Answers the `default_adapter` word through the table's `calls:` column, the same
|
|
131
|
-
# way `realm_impl` does. Sits between an explicit bind and the framework's
|
|
132
|
-
# in-memory fallback; whether the adapter really is a persistence adapter is
|
|
133
|
-
# judged at boot, where adapters are known.
|
|
134
|
-
#
|
|
135
|
-
# @param value [String, Symbol] the adapter's declared name, such as `"PostgresEra"`;
|
|
136
|
-
# blankness is judged by the world language at `build`, not here
|
|
137
|
-
# @return [String] the adapter name as stored
|
|
72
|
+
# Sits between an explicit bind and the framework's in-memory fallback; whether the
|
|
73
|
+
# adapter really is a persistence adapter is judged at boot, where adapters are known.
|
|
138
74
|
def default_adapter_impl(value)
|
|
139
75
|
@default_adapter = required(value, "default adapter")
|
|
140
76
|
end
|
|
@@ -148,20 +84,8 @@ module Hecks
|
|
|
148
84
|
|
|
149
85
|
def respond_to_missing?(_name, _include_private = false) = true
|
|
150
86
|
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
# A method of its own, apart from `method_missing` (#143), so
|
|
154
|
-
# `WorldConstProxy`'s own aggregate-qualified verb calls
|
|
155
|
-
# (`Pizzas::Order.charged_by(...)`) write into the exact same
|
|
156
|
-
# place the bare top-level spelling (`charged_by(...)`) already
|
|
157
|
-
# does — one write path, two spellings.
|
|
158
|
-
#
|
|
159
|
-
# @param verb [Symbol, String] the bind verb, such as `:persisted_by`
|
|
160
|
-
# @param args [Array<Object>] the call's positional arguments; the first names the adapter
|
|
161
|
-
# @param kwargs [Hash{Symbol => Object}] settings given inline as keyword arguments
|
|
162
|
-
# @param block [Proc, nil] a settings block, evaluated against a `SettingsCollector`
|
|
163
|
-
# @return [Hash{Symbol => Object}] the settings just recorded: `:adapter` (a String),
|
|
164
|
-
# then the keyword arguments, then the block's settings, later ones winning
|
|
87
|
+
# A method of its own, apart from `method_missing`, so `WorldConstProxy`'s
|
|
88
|
+
# aggregate-qualified verb calls write into the same place the bare spelling does.
|
|
165
89
|
def record_binding(verb, args, kwargs, block)
|
|
166
90
|
collector = SettingsCollector.new
|
|
167
91
|
collector.instance_eval(&block) if block
|
|
@@ -170,11 +94,6 @@ module Hecks
|
|
|
170
94
|
@settings["#{verb}:#{args.first.to_s.downcase}"] = value
|
|
171
95
|
end
|
|
172
96
|
|
|
173
|
-
# Assembles the realm, version marker and bind settings, judged by the world language.
|
|
174
|
-
#
|
|
175
|
-
# @return [Bluebook::World] the world, returned once the language accepts it
|
|
176
|
-
# @raise [Bluebook::DSL::Malformed] if the world language refuses the declaration, such
|
|
177
|
-
# as a blank `realm`
|
|
178
97
|
def build
|
|
179
98
|
MetaValidator.call_world(
|
|
180
99
|
World.new(domain: @domain, realm: @realm, latest: @latest, settings: @settings,
|
|
@@ -182,30 +101,46 @@ module Hecks
|
|
|
182
101
|
)
|
|
183
102
|
end
|
|
184
103
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
104
|
+
class << self
|
|
105
|
+
# The builder whose block is being evaluated, so an aggregate door a facade already
|
|
106
|
+
# installed (a repeat boot in one process) can record a qualified bind into it.
|
|
107
|
+
#
|
|
108
|
+
# @return [Bluebook::DSL::WorldBuilder, nil] nil outside a `.world` block
|
|
109
|
+
attr_reader :current
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Wraps `instance_eval` in `ConstShim`'s resolver: without it, an aggregate-qualified
|
|
113
|
+
# verb call raises `NameError`, since the bare constant has nothing to resolve to.
|
|
114
|
+
# A bare name resolves to a namespace whose `::` reaches the proxy; a qualified path
|
|
115
|
+
# (`Pizzas::Order`, handed over by an installed facade chapter's `const_missing`)
|
|
116
|
+
# is already the aggregate, so it resolves to the proxy itself.
|
|
193
117
|
#
|
|
194
|
-
# @param domain [String]
|
|
195
|
-
# @yield the world
|
|
118
|
+
# @param domain [String] the domain the world belongs to
|
|
119
|
+
# @yield the world's DSL block
|
|
196
120
|
# @return [Bluebook::World] the judged world
|
|
197
|
-
# @raise [Bluebook::DSL::Malformed] if the world language refuses the declaration
|
|
198
121
|
def self.build(domain, &block)
|
|
199
122
|
builder = new(domain)
|
|
200
|
-
resolver =
|
|
201
|
-
|
|
123
|
+
resolver = lambda do |name|
|
|
124
|
+
name.to_s.include?("::") ? WorldConstProxy.new(builder) : WorldConstProxy.namespace(builder)
|
|
125
|
+
end
|
|
126
|
+
evaluate(builder, resolver, &block) if block
|
|
202
127
|
builder.build
|
|
203
128
|
end
|
|
204
129
|
|
|
130
|
+
# @api private
|
|
131
|
+
def self.evaluate(builder, resolver, &block)
|
|
132
|
+
previous = @current
|
|
133
|
+
@current = builder
|
|
134
|
+
ConstShim.with(resolver) { builder.instance_eval(&block) }
|
|
135
|
+
ensure
|
|
136
|
+
@current = previous
|
|
137
|
+
end
|
|
138
|
+
private_class_method :evaluate
|
|
139
|
+
|
|
205
140
|
private
|
|
206
141
|
|
|
207
142
|
def required(value, _label)
|
|
208
|
-
#
|
|
143
|
+
# Validation lives in the world language (world.bluebook), not here.
|
|
209
144
|
value.to_s
|
|
210
145
|
end
|
|
211
146
|
end
|
|
@@ -3,28 +3,11 @@ require_relative "expression/ast_json"
|
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
5
|
module Bluebook
|
|
6
|
-
# An entity
|
|
7
|
-
# of
|
|
8
|
-
#
|
|
9
|
-
# Crossing over closes the owner chain. An entity declares commands, and
|
|
10
|
-
# until now those commands had no owner that could state an identity: an
|
|
11
|
-
# entity was an IR object, not a construct, so `Construct#hecks_fqn` refused
|
|
12
|
-
# rather than answering "Deposit" and looking right. Four of banking's
|
|
13
|
-
# commands were in that state. They can say what they are now —
|
|
14
|
-
# `Banking::Account.Ledger.Deposit` — which is the id the judge already mints
|
|
15
|
-
# for them.
|
|
16
|
-
#
|
|
17
|
-
# Not const_set, for the same reason a command is not: a name inside one
|
|
18
|
-
# aggregate can denote more than one kind of thing, so the constant tree
|
|
19
|
-
# cannot index it.
|
|
20
|
-
#
|
|
21
|
-
# It must stay structurally interchangeable with an aggregate — the runtime
|
|
22
|
-
# builds `Instance.new(aggregate: entity)` and `CommandRules` takes either as
|
|
23
|
-
# `declaring` — so it answers `hecks_name`, `attributes`, `attribute`,
|
|
24
|
-
# `identified_by` and `lifecycle` exactly as an aggregate does. And it must
|
|
25
|
-
# keep not answering `value_object`: `Value.for_attribute` sniffs for that
|
|
26
|
-
# method to tell a piece from a head.
|
|
6
|
+
# An entity as a Ruby class: a piece of an aggregate that has an identity of its own.
|
|
7
|
+
# Not const_set, because a name inside one aggregate can denote more than one kind of thing.
|
|
27
8
|
class Entity
|
|
9
|
+
# Stays interchangeable with an aggregate (`Instance.new(aggregate: entity)`, `CommandRules`
|
|
10
|
+
# `declaring`) but must not answer `value_object`, which `Value.for_attribute` sniffs for.
|
|
28
11
|
extend Construct
|
|
29
12
|
extend Hecks::IR
|
|
30
13
|
extend Behaviour::Entity
|
|
@@ -36,32 +19,12 @@ module Hecks
|
|
|
36
19
|
attributes: many(:attributes),
|
|
37
20
|
commands: many(:commands),
|
|
38
21
|
queries: many(:queries),
|
|
39
|
-
# S17, ADR 0026 — "That is what `entity` is for, and `entity` is
|
|
40
|
-
# declared by the language and used zero times in it" (the ADR's
|
|
41
|
-
# own words). Dispatch nests inside Handler, so an entity's own
|
|
42
|
-
# nested entities are part of its wire shape now, the same way
|
|
43
|
-
# an aggregate's always were — the field the ADR names as
|
|
44
|
-
# declared-but-unused until this slice.
|
|
45
22
|
entities: many(:entities),
|
|
46
|
-
#
|
|
47
|
-
# `
|
|
48
|
-
# row, identical). A precondition shared across this piece's own
|
|
49
|
-
# commands, declared once — a command references it back by
|
|
50
|
-
# name; the resolved text still lands on each referencing
|
|
51
|
-
# command's own `givens` either way, so this field is read-only
|
|
52
|
-
# documentation of what the piece itself declared, the same
|
|
53
|
-
# relationship `Aggregate.preconditions` already has to its own
|
|
54
|
-
# commands.
|
|
23
|
+
# Read-only record of the piece's own `given`; resolved text lands on each command's
|
|
24
|
+
# `givens`.
|
|
55
25
|
preconditions: -> { preconditions.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
56
|
-
#
|
|
57
|
-
#
|
|
58
|
-
# invariants' own recursive walk) — the same relationship
|
|
59
|
-
# `ValueObject#invariants` already has to its own instances,
|
|
60
|
-
# one level up the construct tree. Not a separate enforcement
|
|
61
|
-
# boundary; still checked at the same two points (after every
|
|
62
|
-
# mutation, before save) the aggregate's own invariants always
|
|
63
|
-
# were — see that method's own comment for why this does not
|
|
64
|
-
# contradict "there is no separate entity invariant."
|
|
26
|
+
# Checked against every instance of this piece, at the same points as an aggregate's
|
|
27
|
+
# invariants.
|
|
65
28
|
invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
66
29
|
lifecycle: one(:lifecycle)
|
|
67
30
|
)
|
|
@@ -73,20 +36,11 @@ module Hecks
|
|
|
73
36
|
# Mints a new piece class for one declared entity and absorbs its fields into it.
|
|
74
37
|
#
|
|
75
38
|
# @param name [String, Symbol] the entity's declared name
|
|
76
|
-
# @param description [String, nil] the entity's declared prose description
|
|
77
39
|
# @param identified_by [String, Symbol, Array<String, Symbol>, nil] the identity
|
|
78
40
|
# path(s) this entity is addressed by
|
|
79
|
-
# @param
|
|
80
|
-
# @param
|
|
81
|
-
#
|
|
82
|
-
# @param queries [Array<Bluebook::Query>] the queries declared on this entity
|
|
83
|
-
# @param entities [Array<Class>] the entity classes (`Bluebook::Entity` subclasses)
|
|
84
|
-
# nested directly under this entity
|
|
85
|
-
# @param preconditions [Array<Bluebook::Given>] this entity's own named `given`s
|
|
86
|
-
# @param invariants [Array<Bluebook::Invariant>] the rules checked against every
|
|
87
|
-
# instance of this entity
|
|
88
|
-
# @param lifecycle [Bluebook::Lifecycle, nil] the entity's declared state machine,
|
|
89
|
-
# or `nil` if it declares none
|
|
41
|
+
# @param commands [Array<Class>] the command classes declared on this entity
|
|
42
|
+
# @param entities [Array<Class>] the entity classes nested directly under this entity
|
|
43
|
+
# @param lifecycle [Bluebook::Lifecycle, nil] the declared state machine, or `nil`
|
|
90
44
|
# @return [Class] the minted piece class (a `Bluebook::Entity` subclass)
|
|
91
45
|
def declare(name:, description: nil, identified_by: nil, attributes: [],
|
|
92
46
|
commands: [], queries: [], entities: [], preconditions: [], invariants: [], lifecycle: nil)
|
|
@@ -100,20 +54,8 @@ module Hecks
|
|
|
100
54
|
piece
|
|
101
55
|
end
|
|
102
56
|
|
|
103
|
-
# Assigns
|
|
104
|
-
#
|
|
105
|
-
# indexes, neither of which the declaration states.
|
|
106
|
-
#
|
|
107
|
-
# @param description [String, nil] see `declare`
|
|
108
|
-
# @param identified_by [String, Symbol, Array<String, Symbol>, nil] see `declare`
|
|
109
|
-
# @param attributes [Array<Bluebook::Attribute>] see `declare`
|
|
110
|
-
# @param commands [Array<Class>] see `declare`
|
|
111
|
-
# @param queries [Array<Bluebook::Query>] see `declare`
|
|
112
|
-
# @param entities [Array<Class>] see `declare`
|
|
113
|
-
# @param preconditions [Array<Bluebook::Given>] see `declare`
|
|
114
|
-
# @param invariants [Array<Bluebook::Invariant>] see `declare`
|
|
115
|
-
# @param lifecycle [Bluebook::Lifecycle, nil] see `declare`
|
|
116
|
-
# @return [Class] this piece's own class, self, once identity and indexes are derived
|
|
57
|
+
# Assigns the declared fields, then lets the behaviour's `settle` derive identity and
|
|
58
|
+
# indexes.
|
|
117
59
|
def absorb(description:, identified_by:, attributes:, commands:, queries:, entities:, preconditions:, invariants:,
|
|
118
60
|
lifecycle:)
|
|
119
61
|
@description = description
|