hecks 0.2.0 → 0.3.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 +403 -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 +62 -0
- data/lib/hecks/adapters/driven/heki/journal.rb +51 -0
- data/lib/hecks/adapters/driven/heki/saga_store.rb +0 -0
- data/lib/hecks/adapters/driven/heki/snapshot.rb +38 -0
- data/lib/hecks/adapters/driven/heki.adapter +4 -0
- data/lib/hecks/adapters/driven/heki.rb +148 -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 +131 -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 +80 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +168 -0
- data/lib/hecks/adapters/driven/postgres.adapter +5 -0
- data/lib/hecks/adapters/driven/postgres.rb +391 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +171 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/field_cache.rb +190 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/head_compiler.rb +429 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +166 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +286 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/resumable_backfill.rb +168 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/tail_merge.rb +163 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/transform_installer.rb +114 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage.rb +137 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +89 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +82 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +132 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +74 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +6 -0
- data/lib/hecks/adapters/driven/postgres_era.rb +671 -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 +63 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +105 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +180 -0
- data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
- data/lib/hecks/adapters/driven/sqlite.rb +285 -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 +36 -0
- data/lib/hecks/adapters.rb +6 -0
- data/lib/hecks/behaviors/dsl.rb +96 -0
- data/lib/hecks/behaviors/expectations.rb +280 -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 +409 -0
- data/lib/hecks/bluebook/assembly/marks.rb +227 -0
- data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
- data/lib/hecks/bluebook/assembly.rb +78 -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 +51 -0
- data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
- data/lib/hecks/bluebook/behaviour/process_manager.rb +38 -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 +68 -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 +906 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +327 -0
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1018 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +626 -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 +305 -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 +120 -0
- data/lib/hecks/bluebook/dsl/port_builder.rb +30 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +207 -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 +172 -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 +221 -0
- data/lib/hecks/bluebook/dsl/world_builder.rb +77 -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 +55 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +261 -0
- data/lib/hecks/bluebook/expression/projection.json +170 -0
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
- data/lib/hecks/bluebook/expression/resolver.rb +630 -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 +559 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +47 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +350 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +312 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +246 -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 +452 -0
- data/lib/hecks/bluebook/model_check.rb +318 -0
- data/lib/hecks/bluebook/pattern_subset.rb +120 -0
- data/lib/hecks/bluebook/policy.rb +41 -0
- data/lib/hecks/bluebook/process_manager.rb +86 -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 +58 -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 +389 -0
- data/lib/hecks/embryonaut_bluebook.rb +75 -0
- data/lib/hecks/facade/cli_door.rb +116 -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 +154 -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 +300 -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 +170 -0
- data/lib/hecks/forms/field_shape.rb +232 -0
- data/lib/hecks/forms/html.rb +53 -0
- data/lib/hecks/forms/index_renderer.rb +35 -0
- data/lib/hecks/forms/page.rb +157 -0
- data/lib/hecks/forms/params.rb +132 -0
- data/lib/hecks/forms/query_form_renderer.rb +114 -0
- data/lib/hecks/forms/record_renderer.rb +115 -0
- data/lib/hecks/forms/record_table.rb +63 -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 +130 -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/invalid_value_generator.rb +86 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +92 -0
- data/lib/hecks/fuzzing/properties.rb +1146 -0
- data/lib/hecks/fuzzing/replay.rb +635 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +54 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +185 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +130 -0
- data/lib/hecks/fuzzing/value_generator.rb +177 -0
- data/lib/hecks/fuzzing.rb +12 -0
- data/lib/hecks/grammar/evolve.rb +291 -0
- data/lib/hecks/grammar/expression.bluebook +417 -0
- data/lib/hecks/grammar/expression_operators.json +1152 -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 +437 -0
- data/lib/hecks/language/bluebook/entity.bluebook +316 -0
- data/lib/hecks/language/bluebook/policy.bluebook +172 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +264 -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 +447 -0
- data/lib/hecks/language/bluebook/vocabulary.bluebook +364 -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 +313 -0
- data/lib/hecks/language/port.bluebook +92 -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 +121 -0
- data/lib/hecks/ports/access_control.port +4 -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 +4 -0
- data/lib/hecks/ports/agent.rb +167 -0
- data/lib/hecks/ports/authentication.port +4 -0
- data/lib/hecks/ports/authentication.rb +50 -0
- data/lib/hecks/ports/authorization.port +4 -0
- data/lib/hecks/ports/authorization.rb +59 -0
- data/lib/hecks/ports/clock.port +4 -0
- data/lib/hecks/ports/clock.rb +62 -0
- data/lib/hecks/ports/extraction.port +4 -0
- data/lib/hecks/ports/extraction.rb +37 -0
- data/lib/hecks/ports/identity_assignment.port +4 -0
- data/lib/hecks/ports/identity_assignment.rb +45 -0
- data/lib/hecks/ports/identity_generation.port +4 -0
- data/lib/hecks/ports/identity_generation.rb +49 -0
- data/lib/hecks/ports/identity_resolution.port +4 -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 +102 -0
- data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
- data/lib/hecks/ports/persistence/execution.rb +18 -0
- data/lib/hecks/ports/persistence/lineage.rb +277 -0
- data/lib/hecks/ports/persistence/null_saga_store.rb +25 -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 +76 -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 +413 -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 +31 -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 +437 -0
- data/lib/hecks/projector/docs_projector.rb +321 -0
- data/lib/hecks/projector/exporter.rb +141 -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 +392 -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 +80 -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 +89 -0
- data/lib/hecks/query_specification/hop_path.rb +130 -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/caller.rb +50 -0
- data/lib/hecks/runtime/capability_graph.rb +44 -0
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +124 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +248 -0
- data/lib/hecks/runtime/command_interpreter.rb +413 -0
- data/lib/hecks/runtime/command_rules/admissibility.rb +307 -0
- data/lib/hecks/runtime/command_rules/arithmetic.rb +254 -0
- data/lib/hecks/runtime/command_rules/authorization.rb +64 -0
- data/lib/hecks/runtime/command_rules/emission.rb +34 -0
- data/lib/hecks/runtime/command_rules/references.rb +181 -0
- data/lib/hecks/runtime/command_rules.rb +28 -0
- data/lib/hecks/runtime/dependency_planning.rb +231 -0
- data/lib/hecks/runtime/dispatcher.rb +286 -0
- data/lib/hecks/runtime/entity_element.rb +253 -0
- data/lib/hecks/runtime/entity_interpreter.rb +228 -0
- data/lib/hecks/runtime/era_check.rb +136 -0
- data/lib/hecks/runtime/era_guard/shape_diff.rb +128 -0
- data/lib/hecks/runtime/era_guard.rb +193 -0
- data/lib/hecks/runtime/era_tamper.rb +61 -0
- data/lib/hecks/runtime/errors.rb +100 -0
- data/lib/hecks/runtime/event.rb +51 -0
- data/lib/hecks/runtime/identity.rb +128 -0
- data/lib/hecks/runtime/instance.rb +120 -0
- data/lib/hecks/runtime/interpreting.rb +69 -0
- data/lib/hecks/runtime/loader.rb +143 -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 +254 -0
- data/lib/hecks/runtime/reaction_invocation.rb +245 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +266 -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 +124 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +70 -0
- data/lib/hecks/runtime/registry/verification.rb +158 -0
- data/lib/hecks/runtime/registry.rb +218 -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 +301 -0
- data/lib/hecks/runtime/storage_shape.rb +120 -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 +112 -0
- data/lib/hecks/runtime/value/coercion.rb +500 -0
- data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
- data/lib/hecks/runtime/value.rb +125 -0
- data/lib/hecks/runtime.rb +95 -0
- data/lib/hecks/translation/audit/approval_digest.rb +31 -0
- data/lib/hecks/translation/audit/layer_one.rb +37 -0
- data/lib/hecks/translation/audit/layer_two.rb +77 -0
- data/lib/hecks/translation/audit/unfed_report.rb +42 -0
- data/lib/hecks/translation/audit.rb +70 -0
- data/lib/hecks/translation/reattest.rb +72 -0
- data/lib/hecks/translation/rule_compiler.rb +120 -0
- data/lib/hecks/translation/scaffold/differ.rb +183 -0
- data/lib/hecks/translation/scaffold/renderer.rb +41 -0
- data/lib/hecks/translation/scaffold/writer.rb +28 -0
- data/lib/hecks/translation/scaffold.rb +30 -0
- data/lib/hecks/translation.rb +11 -0
- data/lib/hecks/version.rb +16 -0
- data/lib/hecks/vocabulary.rb +213 -0
- data/lib/hecks.rb +118 -6
- metadata +401 -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,39 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Ports
|
|
3
|
+
module Persistence
|
|
4
|
+
NAME = "persistence"
|
|
5
|
+
VERB = "persisted_by"
|
|
6
|
+
DEFAULT_ADAPTER = "Memory"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
require_relative "persistence/binding_policy"
|
|
12
|
+
require_relative "persistence/lineage"
|
|
13
|
+
require_relative "persistence/repository_factory"
|
|
14
|
+
require_relative "persistence/append_only"
|
|
15
|
+
require_relative "persistence/execution"
|
|
16
|
+
require_relative "persistence/remote_runtime"
|
|
17
|
+
require_relative "persistence/null_saga_store"
|
|
18
|
+
|
|
19
|
+
module Hecks
|
|
20
|
+
module Ports
|
|
21
|
+
module Persistence
|
|
22
|
+
module_function
|
|
23
|
+
|
|
24
|
+
# The public persistence port owns only authoritative aggregate heads.
|
|
25
|
+
def repository(registry, domain, aggregate)
|
|
26
|
+
authoritative = BindingPolicy.resolve(registry, domain, aggregate)
|
|
27
|
+
RepositoryFactory.build(registry, domain, aggregate, authoritative)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def binds_for(registry, domain, aggregate)
|
|
31
|
+
[BindingPolicy.resolve(registry, domain, aggregate), []]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def bind_for(registry, domain, aggregate)
|
|
35
|
+
binds_for(registry, domain, aggregate).first
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require_relative "persistence"
|
|
2
|
+
require_relative "persistence/repository_factory"
|
|
3
|
+
require_relative "../runtime/registry"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Ports
|
|
7
|
+
# Projection is a read-side port. Its stores are rebuildable consumers of
|
|
8
|
+
# authoritative entries and never participate in command decisions.
|
|
9
|
+
module Projection
|
|
10
|
+
NAME = "projection"
|
|
11
|
+
VERB = "projected_by"
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
def binds_for(registry, domain, aggregate)
|
|
16
|
+
registry.hecksagon(domain)&.binds_for(aggregate.hecks_name, VERB) || []
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def worker(registry, domain, aggregate, policy: :refresh)
|
|
20
|
+
bind = binds_for(registry, domain, aggregate).first
|
|
21
|
+
return unless bind
|
|
22
|
+
|
|
23
|
+
authoritative = Persistence.repository(registry, domain, aggregate)
|
|
24
|
+
target = Persistence::RepositoryFactory.build(registry, domain, aggregate, bind,
|
|
25
|
+
recover: true, settings_verb: VERB)
|
|
26
|
+
Worker.new(authoritative, target, policy: policy)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Worker
|
|
30
|
+
attr_reader :projection
|
|
31
|
+
|
|
32
|
+
def initialize(authoritative, projection, policy: :refresh)
|
|
33
|
+
@authoritative = authoritative
|
|
34
|
+
@projection = projection
|
|
35
|
+
@policy = policy.to_sym
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Invoke from a separate process or scheduler. The command-side write
|
|
39
|
+
# path never calls this method.
|
|
40
|
+
def catch_up!
|
|
41
|
+
entries = Queue.new(@authoritative).entries
|
|
42
|
+
present = @projection.entries
|
|
43
|
+
if @policy == :refresh
|
|
44
|
+
@projection.reset!
|
|
45
|
+
present = []
|
|
46
|
+
end
|
|
47
|
+
unless consistent?(entries, present)
|
|
48
|
+
raise Runtime::WiringError, "projection history does not match its authoritative history" if @policy == :strict
|
|
49
|
+
end
|
|
50
|
+
entries.drop(present.length).each { |entry| @projection.append(entry); @projection.project(entry) }
|
|
51
|
+
@projection
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def checkpoint = @projection.entries.length
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def same_entry?(left, right) = left.operation == right.operation && left.id == right.id && left.state == right.state
|
|
59
|
+
|
|
60
|
+
def consistent?(entries, present)
|
|
61
|
+
present.length <= entries.length && entries.first(present.length).zip(present).all? { |left, right|
|
|
62
|
+
same_entry?(left, right)
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# The authoritative append-only journal is the durable projection queue.
|
|
68
|
+
# It is committed before a worker sees it; projection entries are the
|
|
69
|
+
# worker's durable checkpoint, so delivery is at-least-once and safe to replay.
|
|
70
|
+
class Queue
|
|
71
|
+
def initialize(authoritative) = @authoritative = authoritative
|
|
72
|
+
def entries = @authoritative.entries
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require_relative "ordering"
|
|
2
|
+
require_relative "../../runtime/value"
|
|
3
|
+
require_relative "../../query_specification/field_path"
|
|
4
|
+
require_relative "../../query_specification/common/comparison"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Ports
|
|
8
|
+
module Query
|
|
9
|
+
module InMemory
|
|
10
|
+
FieldPath = QuerySpecification::FieldPath
|
|
11
|
+
Comparison = QuerySpecification::Common::Comparison
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
def execute(records, declared, args = {}, registry: nil)
|
|
16
|
+
matched = records.select do |record|
|
|
17
|
+
declared.wheres.all? { |clause|
|
|
18
|
+
holds?(clause, comparable(FieldPath.dig(record, clause.field)), args, registry: registry)
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
field = declared.order_by&.field
|
|
22
|
+
matched = Ordering.apply(matched, declared.order_by, declared.null_semantics,
|
|
23
|
+
identity: ->(record) { record.id.to_s }) { |record| comparable(FieldPath.dig(record, field)) }
|
|
24
|
+
# OFFSET FIRST, THEN LIMIT — the order SQL means by `LIMIT n
|
|
25
|
+
# OFFSET m`, which is what `SqlQueryBuilder` emits and therefore
|
|
26
|
+
# what every SQL-backed aggregate already answers. Written the
|
|
27
|
+
# other way round here, and the two engines disagreed on the
|
|
28
|
+
# same declaration: `limit 2, offset 1` over three rows is rows
|
|
29
|
+
# two and three in Postgres and Sqlite, and was row two alone in
|
|
30
|
+
# memory. Silently — a short page reads exactly like a page that
|
|
31
|
+
# ran out of rows.
|
|
32
|
+
#
|
|
33
|
+
# It gets worse the further you page, which is the case nobody
|
|
34
|
+
# writing the first page ever sees: at `limit 10, offset 10`,
|
|
35
|
+
# taking ten and then dropping ten leaves NOTHING, so page two
|
|
36
|
+
# of a memory-backed query came back empty however many rows
|
|
37
|
+
# were really there.
|
|
38
|
+
matched = matched.drop(resolve(declared.offset.value, args).to_i) if declared.offset
|
|
39
|
+
matched = matched.first(resolve(declared.limit.value, args).to_i) if declared.limit
|
|
40
|
+
matched
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# The comparator table itself lives in
|
|
44
|
+
# QuerySpecification::Common::Comparison — this module and
|
|
45
|
+
# Runtime::QueryInterpreter used to carry a copy each, and the two
|
|
46
|
+
# drifted (see that file's own comment for what it cost). What
|
|
47
|
+
# stays here is how a value is REACHED for this path: a registry
|
|
48
|
+
# arrives as an argument rather than as instance state, and the
|
|
49
|
+
# field is dug through FieldPath before it arrives.
|
|
50
|
+
def holds?(clause, held, args, registry: nil)
|
|
51
|
+
Comparison.holds?(clause.op, held, comparable(resolve(clause.value, args)), registry: registry)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def resolve(value, args) = value.is_a?(Symbol) ? args[value] : value
|
|
55
|
+
|
|
56
|
+
def comparable(value) = Comparison.comparable(value)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_relative "../../query_specification/common/null_policy"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Ports
|
|
5
|
+
module Query
|
|
6
|
+
# What order an ask ANSWERS IN — the meaning of the ask, not a property
|
|
7
|
+
# of the store that happens to hold it. Declared here once so an adapter
|
|
8
|
+
# may satisfy it natively but never redefine it : SQLite pushes both
|
|
9
|
+
# tiers into SQL (NullPolicy.sql_order renders `field DIR, id DIR`),
|
|
10
|
+
# while Heki and Memory have no query engine and delegate straight back
|
|
11
|
+
# to InMemory.
|
|
12
|
+
#
|
|
13
|
+
# Two tiers, in this order : the DECLARED order_by when there is one,
|
|
14
|
+
# then IDENTITY, always. The identity tier is what makes an ask total.
|
|
15
|
+
# Without it, an ask with no order_by — or a declared order with tied
|
|
16
|
+
# keys — hands back whatever order the store happened to hold, and
|
|
17
|
+
# store order was quietly standing in for a rule while every
|
|
18
|
+
# hand-written query in the corpus stayed green : not one of them
|
|
19
|
+
# had a tie for store order to decide.
|
|
20
|
+
#
|
|
21
|
+
# An adapter that pushes ordering down MUST push limit down with it.
|
|
22
|
+
# Re-ordering a page the store already cut would be a top-N of the
|
|
23
|
+
# wrong N — the one way this can be got quietly, expensively wrong.
|
|
24
|
+
module Ordering
|
|
25
|
+
module_function
|
|
26
|
+
|
|
27
|
+
def apply(rows, order_by, null_semantics = nil, identity:, &value_of)
|
|
28
|
+
# STABLE, because sort_by is not : two rows whose identity ties would
|
|
29
|
+
# otherwise swap arbitrarily, and a tier meant to REMOVE store-dependence
|
|
30
|
+
# would be adding a coin flip of its own.
|
|
31
|
+
rows = rows.each_with_index.sort_by { |row, index| [identity.call(row), index] }.map(&:first)
|
|
32
|
+
return rows unless order_by
|
|
33
|
+
|
|
34
|
+
QuerySpecification::Common::NullPolicy.order(
|
|
35
|
+
rows, direction: order_by.direction, policy: null_semantics, &value_of
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Ports
|
|
3
|
+
# Common query execution boundary. Adapters expose one optional native
|
|
4
|
+
# hook; all other query behavior remains in the shared interpreter.
|
|
5
|
+
# Ordering (the meaning of an ask's answer order) and InMemory (the
|
|
6
|
+
# fallback engine for stores with no query engine of their own) are
|
|
7
|
+
# its collaborators — query/ordering.rb and query/in_memory.rb.
|
|
8
|
+
module Query
|
|
9
|
+
class Unsupported < StandardError; end
|
|
10
|
+
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def execute(repository, specification, args = {}, context: {})
|
|
14
|
+
adapter = repository.respond_to?(:adapter) ? repository.adapter : repository
|
|
15
|
+
return nil unless adapter.respond_to?(:query)
|
|
16
|
+
|
|
17
|
+
validate!(specification, adapter)
|
|
18
|
+
adapter.query(specification, args, context: context)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def validate!(specification, adapter)
|
|
22
|
+
if specification.cursor && specification.offset
|
|
23
|
+
raise Unsupported, "a query cannot combine cursor and offset pagination"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
return if specification.inspection.nil? || adapter.respond_to?(:inspect_query)
|
|
27
|
+
return if specification.inspection.mode.to_s == "sql" && adapter.respond_to?(:query)
|
|
28
|
+
|
|
29
|
+
raise Unsupported, "#{adapter.class} cannot inspect generated queries"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
require_relative "query/ordering"
|
|
36
|
+
require_relative "query/in_memory"
|
data/lib/hecks/ports.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Hecks::Ports
|
|
2
|
+
#
|
|
3
|
+
# The runtime's named boundaries. Each port is a file beside this one —
|
|
4
|
+
# `ports/persistence.rb`, `ports/query.rb`, … — and a port with supporting
|
|
5
|
+
# cast keeps it in a same-named directory (`ports/persistence/` holds the
|
|
6
|
+
# binding policy, the journal-translation lineage, the repository factory).
|
|
7
|
+
# The `.port` files beside them are the DSL declarations the meta-validator
|
|
8
|
+
# and the Folder adapter load as data.
|
|
9
|
+
|
|
10
|
+
module Hecks
|
|
11
|
+
module Ports
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
require_relative "ports/loading"
|
|
16
|
+
require_relative "ports/persistence"
|
|
17
|
+
require_relative "ports/query"
|
|
18
|
+
require_relative "ports/projection"
|
|
19
|
+
require_relative "ports/extraction"
|
|
20
|
+
require_relative "ports/identity_generation"
|
|
21
|
+
require_relative "ports/authorization"
|
|
22
|
+
require_relative "ports/identity_resolution"
|
|
23
|
+
require_relative "ports/authentication"
|
|
24
|
+
require_relative "ports/access_control"
|
|
25
|
+
require_relative "ports/identity_assignment"
|
|
26
|
+
require_relative "ports/agent"
|
|
27
|
+
require_relative "ports/clock"
|