hecks 0.2.0 → 1.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 +5 -5
- data/lib/hecks/adapters/driven/claude_code.adapter +3 -0
- data/lib/hecks/adapters/driven/claude_code.rb +127 -0
- data/lib/hecks/adapters/driven/d1.adapter +12 -0
- data/lib/hecks/adapters/driven/d1.rb +427 -0
- data/lib/hecks/adapters/driven/folder.adapter +3 -0
- data/lib/hecks/adapters/driven/folder.rb +199 -0
- data/lib/hecks/adapters/driven/google_authentication.adapter +3 -0
- data/lib/hecks/adapters/driven/google_authentication.rb +100 -0
- data/lib/hecks/adapters/driven/governance_authorization.adapter +3 -0
- data/lib/hecks/adapters/driven/governance_authorization.rb +101 -0
- data/lib/hecks/adapters/driven/heki/journal.rb +56 -0
- data/lib/hecks/adapters/driven/heki/saga_store.rb +99 -0
- data/lib/hecks/adapters/driven/heki/snapshot.rb +65 -0
- data/lib/hecks/adapters/driven/heki.adapter +4 -0
- data/lib/hecks/adapters/driven/heki.rb +179 -0
- data/lib/hecks/adapters/driven/identity_registry.adapter +3 -0
- data/lib/hecks/adapters/driven/identity_registry.rb +26 -0
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +51 -0
- data/lib/hecks/adapters/driven/lambda/client.rb +63 -0
- data/lib/hecks/adapters/driven/lambda.adapter +4 -0
- data/lib/hecks/adapters/driven/lambda.rb +145 -0
- data/lib/hecks/adapters/driven/memory.adapter +3 -0
- data/lib/hecks/adapters/driven/memory.rb +103 -0
- data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +3 -0
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +28 -0
- data/lib/hecks/adapters/driven/postgres/codec.rb +88 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +207 -0
- data/lib/hecks/adapters/driven/postgres.adapter +5 -0
- data/lib/hecks/adapters/driven/postgres.rb +438 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +17 -0
- data/lib/hecks/adapters/driven/prism.adapter +3 -0
- data/lib/hecks/adapters/driven/prism.rb +80 -0
- data/lib/hecks/adapters/driven/secure_random_identity.adapter +3 -0
- data/lib/hecks/adapters/driven/secure_random_identity.rb +14 -0
- data/lib/hecks/adapters/driven/sql_query_builder.rb +221 -0
- data/lib/hecks/adapters/driven/sqlite/codec.rb +80 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +172 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +192 -0
- data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
- data/lib/hecks/adapters/driven/sqlite.rb +306 -0
- data/lib/hecks/adapters/driven/system_clock.adapter +3 -0
- data/lib/hecks/adapters/driven/system_clock.rb +14 -0
- data/lib/hecks/adapters/driven.rb +54 -0
- data/lib/hecks/adapters.rb +6 -0
- data/lib/hecks/behaviors/dsl.rb +125 -0
- data/lib/hecks/behaviors/expectations.rb +340 -0
- data/lib/hecks/behaviors/ir.rb +31 -0
- data/lib/hecks/behaviors/rspec.rb +42 -0
- data/lib/hecks/behaviors/runner.rb +96 -0
- data/lib/hecks/behaviors.rb +25 -0
- data/lib/hecks/bluebook/aggregate.rb +108 -0
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +134 -0
- data/lib/hecks/bluebook/assembly/build.rb +48 -0
- data/lib/hecks/bluebook/assembly/contract.rb +112 -0
- data/lib/hecks/bluebook/assembly/contracts.rb +438 -0
- data/lib/hecks/bluebook/assembly/marks.rb +228 -0
- data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
- data/lib/hecks/bluebook/assembly.rb +91 -0
- data/lib/hecks/bluebook/attribute.rb +96 -0
- data/lib/hecks/bluebook/behaviour/aggregate.rb +83 -0
- data/lib/hecks/bluebook/behaviour/attribute.rb +27 -0
- data/lib/hecks/bluebook/behaviour/chapter.rb +72 -0
- data/lib/hecks/bluebook/behaviour/command.rb +116 -0
- data/lib/hecks/bluebook/behaviour/domain_port.rb +25 -0
- data/lib/hecks/bluebook/behaviour/entity.rb +59 -0
- data/lib/hecks/bluebook/behaviour/hexagon.rb +50 -0
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +68 -0
- data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
- data/lib/hecks/bluebook/behaviour/process_manager.rb +51 -0
- data/lib/hecks/bluebook/behaviour/query.rb +10 -0
- data/lib/hecks/bluebook/behaviour/read_model.rb +29 -0
- data/lib/hecks/bluebook/behaviour/traits.rb +81 -0
- data/lib/hecks/bluebook/behaviour/value_object.rb +33 -0
- data/lib/hecks/bluebook/chapter.rb +78 -0
- data/lib/hecks/bluebook/command.rb +124 -0
- data/lib/hecks/bluebook/domain_port.rb +102 -0
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +34 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +1018 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +348 -0
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1087 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +714 -0
- data/lib/hecks/bluebook/dsl/const_shim.rb +81 -0
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +79 -0
- data/lib/hecks/bluebook/dsl/entity_builder.rb +430 -0
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +366 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +163 -0
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +191 -0
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +44 -0
- data/lib/hecks/bluebook/dsl/malformed.rb +7 -0
- data/lib/hecks/bluebook/dsl/policy_builder.rb +135 -0
- data/lib/hecks/bluebook/dsl/port_builder.rb +39 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +306 -0
- data/lib/hecks/bluebook/dsl/query_builder.rb +113 -0
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +233 -0
- data/lib/hecks/bluebook/dsl/rule_reference.rb +173 -0
- data/lib/hecks/bluebook/dsl/translation_builder.rb +243 -0
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +178 -0
- data/lib/hecks/bluebook/dsl/word_gate.rb +228 -0
- data/lib/hecks/bluebook/dsl/world_builder.rb +117 -0
- data/lib/hecks/bluebook/dsl.rb +45 -0
- data/lib/hecks/bluebook/entity.rb +103 -0
- data/lib/hecks/bluebook/expression/canonical_form.rb +123 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +304 -0
- data/lib/hecks/bluebook/expression/projection.json +218 -0
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
- data/lib/hecks/bluebook/expression/resolver.rb +781 -0
- data/lib/hecks/bluebook/expression.rb +13 -0
- data/lib/hecks/bluebook/hexagon.rb +60 -0
- data/lib/hecks/bluebook/lifecycle.rb +42 -0
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +54 -0
- data/lib/hecks/bluebook/meta_validator/judge.rb +621 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +51 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +360 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +351 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +266 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +255 -0
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +138 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +78 -0
- data/lib/hecks/bluebook/meta_validator.rb +542 -0
- data/lib/hecks/bluebook/model_check.rb +445 -0
- data/lib/hecks/bluebook/pattern_subset.rb +184 -0
- data/lib/hecks/bluebook/policy.rb +41 -0
- data/lib/hecks/bluebook/process_manager.rb +128 -0
- data/lib/hecks/bluebook/project_discovery.rb +30 -0
- data/lib/hecks/bluebook/project_loader.rb +40 -0
- data/lib/hecks/bluebook/project_register.rb +82 -0
- data/lib/hecks/bluebook/query.rb +61 -0
- data/lib/hecks/bluebook/read_model.rb +109 -0
- data/lib/hecks/bluebook/reference.rb +74 -0
- data/lib/hecks/bluebook/smoke_test.rb +166 -0
- data/lib/hecks/bluebook/synthesizer.rb +95 -0
- data/lib/hecks/bluebook/translation.rb +92 -0
- data/lib/hecks/bluebook/value_object.rb +66 -0
- data/lib/hecks/bluebook.rb +74 -0
- data/lib/hecks/codemod.rb +342 -0
- data/lib/hecks/construct.rb +71 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +219 -0
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +4 -0
- data/lib/hecks/deploy/oidc.json +18 -0
- data/lib/hecks/doc/reference.rb +410 -0
- data/lib/hecks/embryonaut_bluebook.rb +75 -0
- data/lib/hecks/facade/cli_door.rb +119 -0
- data/lib/hecks/facade/cli_runner.rb +190 -0
- data/lib/hecks/facade/command_request.rb +105 -0
- data/lib/hecks/facade/handle.rb +173 -0
- data/lib/hecks/facade/json_door.rb +166 -0
- data/lib/hecks/facade/surface/aggregate_door.rb +185 -0
- data/lib/hecks/facade/surface/chapter.rb +107 -0
- data/lib/hecks/facade/surface.rb +48 -0
- data/lib/hecks/facade.rb +44 -0
- data/lib/hecks/forms/app.rb +341 -0
- data/lib/hecks/forms/command_form_renderer.rb +113 -0
- data/lib/hecks/forms/examples/banking_console.bluebook +3 -0
- data/lib/hecks/forms/field_renderer.rb +177 -0
- data/lib/hecks/forms/field_shape.rb +232 -0
- data/lib/hecks/forms/html.rb +84 -0
- data/lib/hecks/forms/index_renderer.rb +35 -0
- data/lib/hecks/forms/page.rb +157 -0
- data/lib/hecks/forms/params.rb +161 -0
- data/lib/hecks/forms/port_argument.rb +46 -0
- data/lib/hecks/forms/query_form_renderer.rb +114 -0
- data/lib/hecks/forms/record_renderer.rb +119 -0
- data/lib/hecks/forms/record_table.rb +68 -0
- data/lib/hecks/forms/reference_options.rb +30 -0
- data/lib/hecks/forms/value_object_shape.rb +46 -0
- data/lib/hecks/forms.rb +54 -0
- data/lib/hecks/fqn.rb +94 -0
- data/lib/hecks/framework/bluebook/compliance.bluebook +1 -0
- data/lib/hecks/framework/bluebook/console_settings.bluebook +489 -0
- data/lib/hecks/framework/bluebook/framework.hecksagon +32 -0
- data/lib/hecks/framework/bluebook/governance.bluebook +145 -0
- data/lib/hecks/framework/bluebook/identity.bluebook +90 -0
- data/lib/hecks/framework/oidc.json +39 -0
- data/lib/hecks/framework.rb +90 -0
- data/lib/hecks/freezer.rb +67 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +527 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +86 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +286 -0
- data/lib/hecks/fuzzing/properties.rb +1192 -0
- data/lib/hecks/fuzzing/replay.rb +668 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +80 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +250 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +131 -0
- data/lib/hecks/fuzzing/value_generator.rb +200 -0
- data/lib/hecks/fuzzing.rb +12 -0
- data/lib/hecks/grammar/evolve.rb +324 -0
- data/lib/hecks/grammar/expression.bluebook +420 -0
- data/lib/hecks/grammar/expression_operators.json +1648 -0
- data/lib/hecks/grammar/grammar.hecksagon +20 -0
- data/lib/hecks/grammar/oidc.json +69 -0
- data/lib/hecks/grammar/translation.bluebook +203 -0
- data/lib/hecks/grammar.rb +178 -0
- data/lib/hecks/ir.rb +126 -0
- data/lib/hecks/language/adapter.bluebook +116 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +581 -0
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +76 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +256 -0
- data/lib/hecks/language/bluebook/bluebook.hecksagon +24 -0
- data/lib/hecks/language/bluebook/command.bluebook +471 -0
- data/lib/hecks/language/bluebook/entity.bluebook +392 -0
- data/lib/hecks/language/bluebook/policy.bluebook +189 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +381 -0
- data/lib/hecks/language/bluebook/projection.bluebook +267 -0
- data/lib/hecks/language/bluebook/query.bluebook +245 -0
- data/lib/hecks/language/bluebook/shape.bluebook +292 -0
- data/lib/hecks/language/bluebook/syntax.bluebook +448 -0
- data/lib/hecks/language/bluebook/vocabulary.bluebook +379 -0
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +51 -0
- data/lib/hecks/language/hecksagon/domain_port.bluebook +76 -0
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +131 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +102 -0
- data/lib/hecks/language/oidc.json +333 -0
- data/lib/hecks/language/port.bluebook +120 -0
- data/lib/hecks/language/translation/translation.bluebook +110 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +267 -0
- data/lib/hecks/language/world/wiring.bluebook +62 -0
- data/lib/hecks/language/world/world.bluebook +84 -0
- data/lib/hecks/literal.rb +125 -0
- data/lib/hecks/naming.rb +174 -0
- data/lib/hecks/ports/access_control.port +9 -0
- data/lib/hecks/ports/access_control.rb +62 -0
- data/lib/hecks/ports/agent/answers.rb +104 -0
- data/lib/hecks/ports/agent.port +8 -0
- data/lib/hecks/ports/agent.rb +167 -0
- data/lib/hecks/ports/authentication.port +6 -0
- data/lib/hecks/ports/authentication.rb +50 -0
- data/lib/hecks/ports/authorization.port +7 -0
- data/lib/hecks/ports/authorization.rb +62 -0
- data/lib/hecks/ports/clock.port +5 -0
- data/lib/hecks/ports/clock.rb +62 -0
- data/lib/hecks/ports/extraction.port +5 -0
- data/lib/hecks/ports/extraction.rb +37 -0
- data/lib/hecks/ports/identity_assignment.port +5 -0
- data/lib/hecks/ports/identity_assignment.rb +45 -0
- data/lib/hecks/ports/identity_generation.port +5 -0
- data/lib/hecks/ports/identity_generation.rb +49 -0
- data/lib/hecks/ports/identity_resolution.port +5 -0
- data/lib/hecks/ports/identity_resolution.rb +40 -0
- data/lib/hecks/ports/loading.port +4 -0
- data/lib/hecks/ports/loading.rb +13 -0
- data/lib/hecks/ports/persistence/append_only.rb +138 -0
- data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
- data/lib/hecks/ports/persistence/execution.rb +23 -0
- data/lib/hecks/ports/persistence/null_saga_store.rb +25 -0
- data/lib/hecks/ports/persistence/plugin.rb +54 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +169 -0
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +128 -0
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +161 -0
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +304 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +171 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +190 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +478 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +166 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +314 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +168 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +170 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +134 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +137 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +89 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +85 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +132 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +758 -0
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +31 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +46 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +102 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +46 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +70 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +72 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +183 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +41 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +28 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +30 -0
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +11 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +48 -0
- data/lib/hecks/ports/persistence/remote_runtime.rb +42 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +30 -0
- data/lib/hecks/ports/persistence.port +4 -0
- data/lib/hecks/ports/persistence.rb +39 -0
- data/lib/hecks/ports/projection.port +4 -0
- data/lib/hecks/ports/projection.rb +96 -0
- data/lib/hecks/ports/query/in_memory.rb +60 -0
- data/lib/hecks/ports/query/ordering.rb +41 -0
- data/lib/hecks/ports/query.rb +36 -0
- data/lib/hecks/ports.rb +27 -0
- data/lib/hecks/projections/diagrams.rb +642 -0
- data/lib/hecks/projections/ir.rb +18 -0
- data/lib/hecks/projections/model/deviations.rb +98 -0
- data/lib/hecks/projections/model.rb +145 -0
- data/lib/hecks/projections/oidc.rb +110 -0
- data/lib/hecks/projections/parser_table.rb +159 -0
- data/lib/hecks/projections/reference.rb +38 -0
- data/lib/hecks/projections/shape.rb +44 -0
- data/lib/hecks/projections/statements.rb +110 -0
- data/lib/hecks/projections/vocabulary.rb +100 -0
- data/lib/hecks/projections.rb +32 -0
- data/lib/hecks/projector/cli_projector.rb +446 -0
- data/lib/hecks/projector/docs_projector.rb +321 -0
- data/lib/hecks/projector/exporter.rb +158 -0
- data/lib/hecks/projector/ir_projector.rb +18 -0
- data/lib/hecks/projector/narrate_projector.rb +243 -0
- data/lib/hecks/projector/target.rb +97 -0
- data/lib/hecks/projector.rb +186 -0
- data/lib/hecks/query_ir.rb +411 -0
- data/lib/hecks/query_specification/common/authorization_spec.rb +9 -0
- data/lib/hecks/query_specification/common/comparators.rb +25 -0
- data/lib/hecks/query_specification/common/comparison.rb +174 -0
- data/lib/hecks/query_specification/common/cursor_spec.rb +9 -0
- data/lib/hecks/query_specification/common/dsl.rb +58 -0
- data/lib/hecks/query_specification/common/inspection_spec.rb +9 -0
- data/lib/hecks/query_specification/common/limit_spec.rb +9 -0
- data/lib/hecks/query_specification/common/null_policy.rb +92 -0
- data/lib/hecks/query_specification/common/null_semantics.rb +11 -0
- data/lib/hecks/query_specification/common/offset_spec.rb +9 -0
- data/lib/hecks/query_specification/common/options.rb +32 -0
- data/lib/hecks/query_specification/common/order_by.rb +9 -0
- data/lib/hecks/query_specification/common/specification.rb +10 -0
- data/lib/hecks/query_specification/common/where_clause.rb +9 -0
- data/lib/hecks/query_specification/field_path.rb +107 -0
- data/lib/hecks/query_specification/hop_path.rb +132 -0
- data/lib/hecks/query_specification/read_model/specification.rb +18 -0
- data/lib/hecks/query_specification.rb +14 -0
- data/lib/hecks/rendering.rb +48 -0
- data/lib/hecks/router/namespace_installer.rb +157 -0
- data/lib/hecks/router.rb +70 -0
- data/lib/hecks/runtime/aggregate_lock.rb +45 -0
- data/lib/hecks/runtime/boot_gates.rb +41 -0
- data/lib/hecks/runtime/caller.rb +66 -0
- data/lib/hecks/runtime/capability_graph.rb +44 -0
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +135 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +260 -0
- data/lib/hecks/runtime/command_interpreter.rb +497 -0
- data/lib/hecks/runtime/command_rules/admissibility.rb +357 -0
- data/lib/hecks/runtime/command_rules/arithmetic.rb +260 -0
- data/lib/hecks/runtime/command_rules/authorization.rb +65 -0
- data/lib/hecks/runtime/command_rules/emission.rb +34 -0
- data/lib/hecks/runtime/command_rules/references.rb +189 -0
- data/lib/hecks/runtime/command_rules.rb +28 -0
- data/lib/hecks/runtime/dependency_planning.rb +245 -0
- data/lib/hecks/runtime/dispatcher.rb +301 -0
- data/lib/hecks/runtime/entity_element.rb +253 -0
- data/lib/hecks/runtime/entity_interpreter.rb +299 -0
- data/lib/hecks/runtime/errors.rb +122 -0
- data/lib/hecks/runtime/event.rb +51 -0
- data/lib/hecks/runtime/identity.rb +156 -0
- data/lib/hecks/runtime/instance.rb +175 -0
- data/lib/hecks/runtime/interpreting.rb +90 -0
- data/lib/hecks/runtime/loader.rb +184 -0
- data/lib/hecks/runtime/policy_interpreter.rb +366 -0
- data/lib/hecks/runtime/port_operation_interpreter.rb +210 -0
- data/lib/hecks/runtime/query_interpreter.rb +286 -0
- data/lib/hecks/runtime/reaction_invocation.rb +253 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +341 -0
- data/lib/hecks/runtime/rebuild_sweep.rb +74 -0
- data/lib/hecks/runtime/reference_hop.rb +99 -0
- data/lib/hecks/runtime/refusal_wording.rb +126 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +142 -0
- data/lib/hecks/runtime/registry/verification.rb +246 -0
- data/lib/hecks/runtime/registry.rb +279 -0
- data/lib/hecks/runtime/remote_dispatcher.rb +143 -0
- data/lib/hecks/runtime/routing.rb +96 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +97 -0
- data/lib/hecks/runtime/saga_interpreter.rb +503 -0
- data/lib/hecks/runtime/saga_pending_dispatch.rb +45 -0
- data/lib/hecks/runtime/tenant_check.rb +84 -0
- data/lib/hecks/runtime/tenant_scope.rb +55 -0
- data/lib/hecks/runtime/value/admission.rb +130 -0
- data/lib/hecks/runtime/value/coercion.rb +565 -0
- data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
- data/lib/hecks/runtime/value.rb +125 -0
- data/lib/hecks/runtime.rb +107 -0
- data/lib/hecks/storehouse.rb +632 -0
- data/lib/hecks/version.rb +16 -0
- data/lib/hecks/vocabulary.rb +218 -0
- data/lib/hecks.rb +123 -6
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +90 -0
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +128 -0
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +160 -0
- metadata +412 -222
- data/bin/hecks +0 -7
- data/bin/hecks-package +0 -65
- data/bin/hecks_console +0 -12
- data/bin/hecks_serverless +0 -6
- data/lib/cli/build.rb +0 -14
- data/lib/cli/command_runner.rb +0 -28
- data/lib/cli/console.rb +0 -10
- data/lib/cli/generate.rb +0 -37
- data/lib/cli/hecks-cli.rb +0 -27
- data/lib/cli/test.rb +0 -57
- data/lib/console/commands.rb +0 -8
- data/lib/console/hecks-console.rb +0 -1
- data/lib/packager/README.md +0 -0
- data/lib/packager/app_runner.rb +0 -21
- data/lib/packager/args.rb +0 -26
- data/lib/packager/compatibility/fixnum.rb +0 -6
- data/lib/packager/hecks.rb +0 -39
- data/lib/packager/query_runner.rb +0 -21
- data/lib/packager/resources/Dockerfile +0 -11
- data/lib/packager/resources/app_binary +0 -7
- data/lib/packager/resources/bundle_config +0 -3
- data/lib/packager/resources/traveling-ruby-20150715-2.2.2-linux-x86_64.tar.gz +0 -0
- data/lib/packager/resources/traveling-ruby-20150715-2.2.2-osx.tar.gz +0 -0
- data/lib/serverless/Domain +0 -32
- data/lib/serverless/cli.rb +0 -75
- data/lib/serverless/resources/command_name.js +0 -5
- data/lib/serverless/resources/environment.js +0 -7
- data/lib/serverless/resources/handler.js.tt +0 -28
- data/lib/serverless/resources/run_binary.js +0 -22
- data/lib/serverless/resources/serverless.yml +0 -20
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
require_relative "../value"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Runtime
|
|
5
|
+
class CommandInterpreter
|
|
6
|
+
# How a command's declared mutations land on the instance in hand —
|
|
7
|
+
# set, append (with value-object or entity elements), and the
|
|
8
|
+
# arithmetic pair.
|
|
9
|
+
module MutationApplier
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def assign_creation_attributes(instance, aggregate, command, args)
|
|
13
|
+
command.attributes.each do |attr|
|
|
14
|
+
next unless aggregate.attribute(attr.name)
|
|
15
|
+
next unless args.key?(attr.name)
|
|
16
|
+
|
|
17
|
+
instance[attr.name] = Value.for(aggregate, attr.name, args[attr.name])
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def apply(instance, aggregate, mutation, args)
|
|
22
|
+
case mutation.op
|
|
23
|
+
when :set
|
|
24
|
+
value = mutation.source.is_a?(StateRef) ? instance[mutation.source.name] : @rules.resolve_source(mutation.source, args)
|
|
25
|
+
instance[mutation.target] = Value.for(aggregate, mutation.target, value)
|
|
26
|
+
when :append
|
|
27
|
+
instance[mutation.target] = appended(instance, aggregate, mutation, args)
|
|
28
|
+
when :increment, :decrement
|
|
29
|
+
amount = @rules.resolve_source(mutation.source, args)
|
|
30
|
+
attribute = aggregate.attribute(mutation.target)
|
|
31
|
+
current = instance[mutation.target]
|
|
32
|
+
# Vendored fix, not (yet) upstream hecks (migration plan
|
|
33
|
+
# task 9): see #rewrap_arithmetic_result's own comment below
|
|
34
|
+
# -- `amount` is wrapped ONLY when `current` already is, not
|
|
35
|
+
# merely because the target attribute exists.
|
|
36
|
+
amount = Value.for_attribute(aggregate, attribute, amount) if attribute && current.is_a?(Value)
|
|
37
|
+
result = @rules.arithmetic(current, amount, mutation.target, @rules.sign_of(mutation.op))
|
|
38
|
+
instance[mutation.target] = rewrap_arithmetic_result(aggregate, attribute, current, result)
|
|
39
|
+
# Vendored addition, not (yet) upstream hecks (migration
|
|
40
|
+
# plan task 4): remove -- the list-removal counterpart to
|
|
41
|
+
# append, matching an element by value (plan.bluebook's
|
|
42
|
+
# RemoveDependency/DeactivateSprint: "a concurrent Add can
|
|
43
|
+
# never be lost").
|
|
44
|
+
when :remove
|
|
45
|
+
instance[mutation.target] = removed(instance, aggregate, mutation, args)
|
|
46
|
+
# Vendored addition, not (yet) upstream hecks (migration
|
|
47
|
+
# plan task 4, i106): multiply/clamp, the scale/bound pair
|
|
48
|
+
# alongside increment/decrement's add/subtract pair -- see
|
|
49
|
+
# CommandRules::Arithmetic#multiply/#clamp's own comments.
|
|
50
|
+
when :multiply
|
|
51
|
+
amount = @rules.resolve_source(mutation.source, args)
|
|
52
|
+
attribute = aggregate.attribute(mutation.target)
|
|
53
|
+
current = instance[mutation.target]
|
|
54
|
+
amount = Value.for_attribute(aggregate, attribute, amount) if attribute && current.is_a?(Value)
|
|
55
|
+
result = @rules.multiply(current, amount, mutation.target)
|
|
56
|
+
instance[mutation.target] = rewrap_arithmetic_result(aggregate, attribute, current, result)
|
|
57
|
+
# Vendored addition, not (yet) upstream hecks (migration
|
|
58
|
+
# plan task 4, i106): clamp -- bounds the current value into
|
|
59
|
+
# [min, max]. mutation.source is always a literal [min, max]
|
|
60
|
+
# pair, never an argument reference -- resolve_source would be
|
|
61
|
+
# a no-op for an Array (it only special-cases Symbol), so it's
|
|
62
|
+
# read straight.
|
|
63
|
+
when :clamp
|
|
64
|
+
instance[mutation.target] = @rules.clamp(instance[mutation.target], mutation.source, mutation.target)
|
|
65
|
+
# `delegates_to` — CommandBuilder#delegates_to's own comment gives
|
|
66
|
+
# the full reasoning for storing it as a mutation at all. A REAL
|
|
67
|
+
# no-op here, not a gap: it targets no field on THIS instance —
|
|
68
|
+
# `CommandInterpreter#step_delegate_to_entity`, a LATER step in
|
|
69
|
+
# the same dispatch, is what actually applies it, against the
|
|
70
|
+
# target entity element `EntityElement.apply_to_element` reaches,
|
|
71
|
+
# never through this method.
|
|
72
|
+
when :delegate
|
|
73
|
+
nil
|
|
74
|
+
# `corrects` — CommandBuilder#corrects_impl's own comment gives
|
|
75
|
+
# the full reasoning for storing it as a mutation at all. A REAL
|
|
76
|
+
# no-op here too: it targets no field on THIS instance either —
|
|
77
|
+
# its own event name, and whether THIS record has actually
|
|
78
|
+
# emitted it, is checked once, up front, by
|
|
79
|
+
# CommandRules::Admissibility#enforce_correction_target, not
|
|
80
|
+
# here. Whatever field this correction actually changes is an
|
|
81
|
+
# ORDINARY declared (or, for `reverses: true`, derived — see
|
|
82
|
+
# AggregateBuilder#seal_correction_targets) mutation of its own,
|
|
83
|
+
# applied by one of the branches above like any other.
|
|
84
|
+
when :corrects
|
|
85
|
+
nil
|
|
86
|
+
else
|
|
87
|
+
# Every declared op has a `when` above — this is not a real
|
|
88
|
+
# runtime path today, only a backstop against the day one
|
|
89
|
+
# more mutation kind reaches the grammar and this method,
|
|
90
|
+
# unlike every other one it could reach, does not: applying
|
|
91
|
+
# nothing and refusing nothing would be the one silent
|
|
92
|
+
# no-op in a language that otherwise refuses what it cannot
|
|
93
|
+
# check.
|
|
94
|
+
raise Runtime::WiringError, "no mutation applier handles :#{mutation.op} — add one before declaring it"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# A CALLER-SUPPLIED ARG, FIRST -- an append's own field can also
|
|
99
|
+
# name something the SUBJECT ALREADY KNOWS about itself, falling
|
|
100
|
+
# back to the AGGREGATE'S OWN CURRENT FIELD when it isn't one — a
|
|
101
|
+
# caller appending at the end without computing or supplying a
|
|
102
|
+
# position (`position: :next_position`, a field the command never
|
|
103
|
+
# declares as an argument at all). `args.key?`, not a truthiness
|
|
104
|
+
# check on the value — an explicitly-nil argument still counts as
|
|
105
|
+
# "the caller named it," same distinction `assign_creation_attributes`
|
|
106
|
+
# already draws.
|
|
107
|
+
#
|
|
108
|
+
# Extracted to its own method (pure refactor, ternary -> early
|
|
109
|
+
# return, no behavior change) alongside `remove`'s own addition
|
|
110
|
+
# below, purely for readability at this point in the file.
|
|
111
|
+
def resolve_append_source(source, instance, args)
|
|
112
|
+
# `state(:field)` — the record's own value, never an argument
|
|
113
|
+
# (`Literal::StateRef`'s own comment).
|
|
114
|
+
return instance[source.name] if source.is_a?(StateRef)
|
|
115
|
+
return source unless source.is_a?(Symbol)
|
|
116
|
+
return args[source] if args.key?(source)
|
|
117
|
+
|
|
118
|
+
instance[source]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def appended(instance, aggregate, mutation, args)
|
|
122
|
+
fields = mutation.source.transform_values { |source| resolve_append_source(source, instance, args) }
|
|
123
|
+
element_type = aggregate.attribute(mutation.target)&.type
|
|
124
|
+
value_object = aggregate.value_object(element_type)
|
|
125
|
+
if value_object
|
|
126
|
+
value_object.attributes.each do |attribute|
|
|
127
|
+
held = fields[attribute.name]
|
|
128
|
+
# A SINGLE-FIELD VALUE unwraps to its scalar so it bridges
|
|
129
|
+
# into the element's own (differently named) wrapper; a
|
|
130
|
+
# MULTI-FIELD one (a `state(:en_passant_square)` Square
|
|
131
|
+
# copied off the record) has no scalar to stand in for it
|
|
132
|
+
# and is handed across whole — `Value.for_attribute` keeps a
|
|
133
|
+
# value of the element field's own type as it is.
|
|
134
|
+
fields[attribute.name] = Value.scalar(held) if held.is_a?(Value) && held.to_h.size == 1
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
element = value_object ? Value.build(value_object, fields,
|
|
138
|
+
aggregate) : entity_element(aggregate, element_type, instance[mutation.target],
|
|
139
|
+
fields)
|
|
140
|
+
|
|
141
|
+
# FROZEN, like every other value the domain hands back. An
|
|
142
|
+
# appended list used to come back mutable, so a caller could
|
|
143
|
+
# push straight into an aggregate's own state after the
|
|
144
|
+
# dispatch had finished.
|
|
145
|
+
Freezer.deep(Array(instance[mutation.target]) + [element])
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Vendored addition, not (yet) upstream hecks (migration plan
|
|
149
|
+
# task 4): the removal counterpart to #appended -- matches by
|
|
150
|
+
# VALUE EQUALITY, element-wise, no read-modify-write (plan.
|
|
151
|
+
# bluebook's own words: "so a concurrent Add can never be lost").
|
|
152
|
+
# `mutation.source` is a single field reference (`:dependency`),
|
|
153
|
+
# unlike append's field-map -- resolved and Value-coerced the
|
|
154
|
+
# SAME way increment/decrement already coerce their own amount,
|
|
155
|
+
# so the comparison is against a like-shaped Value, not a raw
|
|
156
|
+
# scalar against a wrapped one.
|
|
157
|
+
def removed(instance, aggregate, mutation, args)
|
|
158
|
+
value = @rules.resolve_source(mutation.source, args)
|
|
159
|
+
attribute = aggregate.attribute(mutation.target)
|
|
160
|
+
value = Value.for_attribute(aggregate, attribute, value) if attribute
|
|
161
|
+
Array(instance[mutation.target]).reject { |element| element == value }
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Vendored fix, not (yet) upstream hecks (migration plan
|
|
165
|
+
# task 9): #apply's `:increment`/`:decrement`/`:multiply`
|
|
166
|
+
# branches used to wrap `amount` into a `Value` unconditionally
|
|
167
|
+
# whenever the target attribute existed, never checking whether
|
|
168
|
+
# `current` (the field's OWN existing value, read straight off
|
|
169
|
+
# `instance[mutation.target]`) was ALSO wrapped -- the two sides
|
|
170
|
+
# of the same arithmetic call could disagree on Value-ness. On a
|
|
171
|
+
# PHANTOM-CREATED field this is the common case, not an edge
|
|
172
|
+
# one: `Instance.defaults`/`#default_for` leaves a VO-typed
|
|
173
|
+
# attribute with no declared `default:` genuinely absent (nil),
|
|
174
|
+
# and `CommandRules::Arithmetic#arithmetic`/`#multiply`'s own
|
|
175
|
+
# `current ||= 0` then turns that nil into a RAW, unwrapped
|
|
176
|
+
# Integer `0` -- so `current.is_a?(Value) && amount.is_a?(Value)`
|
|
177
|
+
# read false even though `amount` (correctly wrapped by the old
|
|
178
|
+
# unconditional line) genuinely held a valid, correctly-typed
|
|
179
|
+
# number, and the primitive path's `unless amount.is_a?(Numeric)`
|
|
180
|
+
# guard refused it as a TYPE MISMATCH the caller never made --
|
|
181
|
+
# an artifact of this method's own asymmetric wrapping, not bad
|
|
182
|
+
# input.
|
|
183
|
+
#
|
|
184
|
+
# Fixed at the call site (above) by wrapping `amount` ONLY when
|
|
185
|
+
# `current` is ALREADY a `Value` -- so an established VO-typed
|
|
186
|
+
# field (a multi-field Money balance, say, already hydrated from
|
|
187
|
+
# a prior save) keeps going through
|
|
188
|
+
# `Arithmetic#arithmetic_value_object` exactly as before (the
|
|
189
|
+
# "already-Value-wrapped field still mutates correctly" case
|
|
190
|
+
# this fix must not regress), while a phantom field's raw
|
|
191
|
+
# `current` and raw `amount` both take the plain-Numeric path
|
|
192
|
+
# together. This method closes the other half: the plain-Numeric
|
|
193
|
+
# path returns a bare Ruby number, and if the attribute is
|
|
194
|
+
# itself VO-typed (the norm), that raw result needs the SAME
|
|
195
|
+
# wrap `:set` already gives its own resolved value (`Value.for`)
|
|
196
|
+
# before it's stored, so a field's stored shape doesn't depend
|
|
197
|
+
# on which dispatch happened to mutate it first. A no-op
|
|
198
|
+
# whenever `current` was already a Value (the VO branch already
|
|
199
|
+
# returns one) or the mutation targets no declared attribute at
|
|
200
|
+
# all.
|
|
201
|
+
def rewrap_arithmetic_result(aggregate, attribute, current, result)
|
|
202
|
+
return result if current.is_a?(Value) || attribute.nil? || result.is_a?(Value)
|
|
203
|
+
|
|
204
|
+
Value.for_attribute(aggregate, attribute, result)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def entity_element(aggregate, element_type, current, fields)
|
|
208
|
+
entity = aggregate.entities.find { |piece| piece.hecks_name == element_type.to_s }
|
|
209
|
+
return fields unless entity
|
|
210
|
+
|
|
211
|
+
entity.attributes.each do |attribute|
|
|
212
|
+
next unless fields.key?(attribute.name)
|
|
213
|
+
|
|
214
|
+
fields[attribute.name] = Value.for_attribute(aggregate, attribute, fields[attribute.name])
|
|
215
|
+
end
|
|
216
|
+
if entity.identified_by && !fields.key?(entity.identified_by)
|
|
217
|
+
attribute = entity.attribute(entity.identified_by)
|
|
218
|
+
fields[entity.identified_by] = Value.from_identifier(aggregate, attribute, Array(current).size + 1)
|
|
219
|
+
else
|
|
220
|
+
check_entity_collision(aggregate, entity, current, fields)
|
|
221
|
+
end
|
|
222
|
+
fields[entity.lifecycle.field] ||= entity.lifecycle.default if entity.lifecycle
|
|
223
|
+
fields
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# THE SAME CHECK #hydrate GIVES EVERY CREATING AGGREGATE COMMAND
|
|
227
|
+
# (`repository.find(id)`, above this file in command_interpreter.rb),
|
|
228
|
+
# one level down. Reached only on the two branches #entity_element
|
|
229
|
+
# does NOT auto-mint: a CALLER-SUPPLIED identity (the field is
|
|
230
|
+
# already in the append's own field map, so the `if` above skips
|
|
231
|
+
# it) or a COMPOSITE one (`entity.identified_by` is nil for those —
|
|
232
|
+
# Runtime::Identified#derive_identity — so the `if` above is false
|
|
233
|
+
# unconditionally). Neither used to check the sibling list at all:
|
|
234
|
+
# a second LogVisit with the same date+sequence, or a second
|
|
235
|
+
# IssueKey with the same serial, appended a silent duplicate — worse
|
|
236
|
+
# than an ordinary duplicate row, because EntityInterpreter#element_of's
|
|
237
|
+
# `find_index` always matches the FIRST match, so the second becomes
|
|
238
|
+
# permanently unaddressable by any later command.
|
|
239
|
+
#
|
|
240
|
+
# Auto-minted entities never reach here — `identity_heads` for them
|
|
241
|
+
# is still checked at mint time by construction (`current.size + 1`
|
|
242
|
+
# can only repeat if something `remove:`s from the list between
|
|
243
|
+
# mints, which no real domain does today), so they can't be flagged
|
|
244
|
+
# by mistake.
|
|
245
|
+
def check_entity_collision(aggregate, entity, current, fields)
|
|
246
|
+
heads = entity.identity_heads
|
|
247
|
+
return if heads.empty?
|
|
248
|
+
|
|
249
|
+
collision = Array(current).find { |element| heads.all? { |head| element[head] == fields[head] } }
|
|
250
|
+
return unless collision
|
|
251
|
+
|
|
252
|
+
raise(AlreadyExists, RefusalWording.render("AlreadyExists", "entity_duplicate",
|
|
253
|
+
entity: entity.hecks_name, aggregate: aggregate.hecks_name,
|
|
254
|
+
identity: Identity.reading(entity),
|
|
255
|
+
offered: heads.map { |head| Rendering.describe(fields[head]) }.join(", ")))
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|