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,134 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Bluebook
|
|
3
|
+
class Assembly
|
|
4
|
+
# One head, built from its declaration.
|
|
5
|
+
#
|
|
6
|
+
# The fields come from the contract like every other construct's. What is here
|
|
7
|
+
# is the part no field table can say: which construct holds which, and how a
|
|
8
|
+
# head's references become able to resolve.
|
|
9
|
+
#
|
|
10
|
+
# It DECIDES NOTHING. Whether a declaration is admissible was settled on the
|
|
11
|
+
# way in, by the language.
|
|
12
|
+
class AggregateAssembly
|
|
13
|
+
def initialize(row)
|
|
14
|
+
@row = row
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def aggregate
|
|
18
|
+
shapes = Array(@row[:value_objects]).map { |shape| value_object(shape) }
|
|
19
|
+
commands = Array(@row[:commands]).map { |verb| Build.call("Command", verb) }
|
|
20
|
+
entities = Array(@row[:entities]).map { |piece| entity(piece) }
|
|
21
|
+
asks = Array(@row[:queries]).map { |ask| Build.call("Query", ask) }
|
|
22
|
+
|
|
23
|
+
fields = Array(@row[:attributes]).map { |field| Marks.attribute(field) }
|
|
24
|
+
|
|
25
|
+
ir = Build.call(
|
|
26
|
+
"Aggregate", @row,
|
|
27
|
+
value_objects: shapes,
|
|
28
|
+
commands: commands,
|
|
29
|
+
entities: entities,
|
|
30
|
+
queries: asks,
|
|
31
|
+
lifecycle: lifecycle_of(@row),
|
|
32
|
+
# A policy declared inside a head is HOISTED onto the chapter by the
|
|
33
|
+
# builder, and `Aggregate#to_h` never carried it — so the language does
|
|
34
|
+
# not record which head a chapter-level policy was written in. The
|
|
35
|
+
# chapter holds them all, which is what `PolicyInterpreter` reads.
|
|
36
|
+
policies: [],
|
|
37
|
+
reference_targets: reference_targets(fields)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
stamp_references(ir)
|
|
41
|
+
ir
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
# What this head points at with an aggregate-level `reference_to`. NOT the
|
|
47
|
+
# self-references its verbs carry — the first version read
|
|
48
|
+
# `commands.filter_map(&:references)` and gave Pizza two targets of "Pizza",
|
|
49
|
+
# its own verbs pointing at itself, where the builder recorded none. An
|
|
50
|
+
# aggregate-level `reference_to X` leaves a reference ATTRIBUTE behind, so
|
|
51
|
+
# the attributes are where the answer is.
|
|
52
|
+
def reference_targets(fields)
|
|
53
|
+
fields.select(&:reference?).map { |field| field.type.target_name }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def value_object(row)
|
|
57
|
+
Build.call("ValueObject", row)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# S17, ADR 0026 — RECURSES. "That is what `entity` is for, and
|
|
61
|
+
# `entity` is declared by the language and used zero times in it"
|
|
62
|
+
# — Dispatch, inside Handler, is the first use, so `row[:entities]`
|
|
63
|
+
# is built the same way `row` itself was reached: through this
|
|
64
|
+
# same method, one level deeper each time. Nothing here assumes
|
|
65
|
+
# it stops at one level of nesting.
|
|
66
|
+
def entity(row)
|
|
67
|
+
Build.call(
|
|
68
|
+
"Entity", row,
|
|
69
|
+
commands: Array(row[:commands]).map { |verb| Build.call("Command", verb) },
|
|
70
|
+
queries: Array(row[:queries]).map { |ask| Build.call("Query", ask) },
|
|
71
|
+
entities: Array(row[:entities]).map { |piece| entity(piece) },
|
|
72
|
+
lifecycle: lifecycle_of(row)
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Every reference learns which head declares it, so it can reach the chapter
|
|
77
|
+
# and resolve. Deliberately across every list that can carry one — a
|
|
78
|
+
# reference the walk misses resolves to nil, and a nil target is SKIPPED
|
|
79
|
+
# rather than refused, so the guarantee would go quiet instead of red.
|
|
80
|
+
def stamp_references(ir)
|
|
81
|
+
lists = [ir.attributes, *ir.commands.map(&:attributes), *ir.queries.map(&:attributes)]
|
|
82
|
+
entity_reference_lists(ir.entities, lists)
|
|
83
|
+
|
|
84
|
+
lists.flatten.select(&:reference?).each { |field| field.type.declared_in = ir }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# S17, ADR 0026 — walks NESTED entities too (Dispatch, inside
|
|
88
|
+
# Handler), not only an aggregate's own direct ones.
|
|
89
|
+
def entity_reference_lists(entities, lists)
|
|
90
|
+
entities.each do |piece|
|
|
91
|
+
lists << piece.attributes
|
|
92
|
+
lists.concat(piece.commands.map(&:attributes))
|
|
93
|
+
lists.concat(piece.queries.map(&:attributes))
|
|
94
|
+
entity_reference_lists(piece.entities, lists)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# THREE LANGUAGE FIELDS, ONE IR OBJECT. `state_field`, `state_start` and
|
|
99
|
+
# `transitions` are separate declarations; the IR keeps one Lifecycle. The
|
|
100
|
+
# contract names them derived, and this is what derives them.
|
|
101
|
+
def lifecycle_of(row)
|
|
102
|
+
declared = row[:lifecycle]
|
|
103
|
+
return nil unless declared
|
|
104
|
+
|
|
105
|
+
Lifecycle.new(
|
|
106
|
+
field: declared[:field],
|
|
107
|
+
default: declared[:default],
|
|
108
|
+
transitions: transitions(Array(declared[:transitions]))
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# A lifecycle holds [command, StateTransition] pairs and `to_h` expands one
|
|
113
|
+
# pair whose `from` is a list into several rows. Grouped back by command AND
|
|
114
|
+
# TARGET, because one declared pair has exactly one target and may have many
|
|
115
|
+
# froms — grouping by command alone would fuse two declarations that move the
|
|
116
|
+
# same verb to different states.
|
|
117
|
+
def transitions(rows)
|
|
118
|
+
rows.group_by { |move| [move[:command], move[:to_state]] }
|
|
119
|
+
.map do |(command, target), moves|
|
|
120
|
+
froms = moves.filter_map { |move| move[:from_state] }
|
|
121
|
+
[command.to_s, StateTransition.new(target: target, from: from_of(froms))]
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def from_of(froms)
|
|
126
|
+
return nil if froms.empty?
|
|
127
|
+
return froms.first if froms.size == 1
|
|
128
|
+
|
|
129
|
+
froms
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Bluebook
|
|
3
|
+
class Assembly
|
|
4
|
+
# ONE WAY TO BUILD A CONSTRUCT, for every construct.
|
|
5
|
+
#
|
|
6
|
+
# There used to be a method per category here — `value_object(row)`,
|
|
7
|
+
# `command(row)`, `policy(row)` — each one gathering the same keywords the
|
|
8
|
+
# contract already names. This reads the contract instead, so adding a field
|
|
9
|
+
# to the language and forgetting to assemble it is caught by the coverage gate
|
|
10
|
+
# rather than by nobody.
|
|
11
|
+
#
|
|
12
|
+
# `make` is the only branch, and it is a real one: a construct that became a
|
|
13
|
+
# class is `.declare`d, an instance is `.new`ed. That is the boundary
|
|
14
|
+
# `Query` sits on, and it is a fact about Ruby rather than about the
|
|
15
|
+
# domain.
|
|
16
|
+
module Build
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
def call(category, row, extra = {})
|
|
20
|
+
contract = Assembly.contract(category)
|
|
21
|
+
keywords = contract.fields.to_h { |keyword, (key, reader)| [keyword, read(reader, row[key])] }
|
|
22
|
+
|
|
23
|
+
holder(contract).public_send(contract.make, **keywords.merge(extra))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def holder(contract)
|
|
27
|
+
contract.holder or raise ArgumentError, "#{contract} holds nothing that can be built"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# A reader is a Marks method, a list of them, or one of three spellings that
|
|
31
|
+
# need no decoding at all.
|
|
32
|
+
def read(reader, value)
|
|
33
|
+
case reader
|
|
34
|
+
when :plain then value
|
|
35
|
+
when :identity then value&.to_sym
|
|
36
|
+
when :flag then value ? true : false
|
|
37
|
+
when Array
|
|
38
|
+
# [:each, reader] maps a list ; [:option, name] reads one named option,
|
|
39
|
+
# which needs its name as well as its value.
|
|
40
|
+
reader.first == :each ? Array(value).map { |held| Marks.public_send(reader.last, held) }
|
|
41
|
+
: Marks.option(reader.last, value)
|
|
42
|
+
else Marks.public_send(reader, value)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Bluebook
|
|
3
|
+
class Assembly
|
|
4
|
+
# WHAT A CONSTRUCT NEEDS THAT THE LANGUAGE CANNOT SAY, and how a claim that a
|
|
5
|
+
# field needs no assembling is CHECKED.
|
|
6
|
+
#
|
|
7
|
+
# `derived:` used to be a list of names, and a list of names is a promise with
|
|
8
|
+
# nobody holding it. The coverage gate only asked whether a field was accounted
|
|
9
|
+
# for — so writing `derived: %i[version]` would have satisfied it while dropping
|
|
10
|
+
# a chapter's version in silence, which is the exact shape of every defect this
|
|
11
|
+
# arc has found. Naming a field derived is a CLAIM, and a claim needs a kind:
|
|
12
|
+
#
|
|
13
|
+
# :parent the containment tree supplies it — a `*_id`, or one of
|
|
14
|
+
# the named pointers below. Checked against the name.
|
|
15
|
+
# :children it is assembled as child constructs. Checked against the
|
|
16
|
+
# language: a category must exist whose parent is this one.
|
|
17
|
+
# [:computed, :m] the holder works it out. Checked: it must answer to `m`.
|
|
18
|
+
# [:folded, keys] several language fields are one thing in the IR, or one
|
|
19
|
+
# is spread across several. Checked: every key must appear
|
|
20
|
+
# in a real reconstructed declaration.
|
|
21
|
+
# :elsewhere not a fact about this construct at all. Allow-listed one
|
|
22
|
+
# by one, because it is the kind with no other check.
|
|
23
|
+
#
|
|
24
|
+
# Every one of those can FAIL. That is the whole difference.
|
|
25
|
+
Contract = Struct.new(:holder, :make, :fields, :derived, :rows, :reads, keyword_init: true) do
|
|
26
|
+
# How a declaration key is read back off a ROW. Absent means the default —
|
|
27
|
+
# `text(row[key])`, a single cell — which is most of them ; present names the
|
|
28
|
+
# shape, because a list needs a reader per element and a folded field is
|
|
29
|
+
# gathered rather than fetched. Same pattern as `rows`, in the other
|
|
30
|
+
# direction: declare the exceptions, default the rest.
|
|
31
|
+
def reader(key) = Hash(reads)[key.to_sym]
|
|
32
|
+
|
|
33
|
+
# How an appendable LIST becomes rows the walk can offer. A list absent from
|
|
34
|
+
# here reads straight off the node ; one that is present names the shaper,
|
|
35
|
+
# because the IR keeps a shape the language does not — a transition whose
|
|
36
|
+
# `from` is a list is several rows, an append binds several fields at once,
|
|
37
|
+
# an open map is one row per entry.
|
|
38
|
+
def shaper(list) = Hash(rows)[list.to_sym]
|
|
39
|
+
|
|
40
|
+
def declares?(field) = fields.key?(field) || derived.key?(field)
|
|
41
|
+
|
|
42
|
+
def kind_of(field) = derived[field]
|
|
43
|
+
|
|
44
|
+
# WHERE A FOLDED FIELD ACTUALLY LIVES, as [object, member].
|
|
45
|
+
#
|
|
46
|
+
# `[:folded, :lifecycle, :field]` says the language's `state_field` is the
|
|
47
|
+
# `field` of the IR's one Lifecycle. That is the same fact `Readings` used to
|
|
48
|
+
# state a second time as `node.lifecycle&.field` — so saying it once here
|
|
49
|
+
# drives BOTH directions: the walk reads the member on the way in, and the
|
|
50
|
+
# reconstruction gathers the members back into the object on the way out.
|
|
51
|
+
#
|
|
52
|
+
# A nil member means the fold has no single member to name — `rows` is a
|
|
53
|
+
# count of what `closed_set` and `members` hold between them, and `options`
|
|
54
|
+
# spreads across eight keys. Those keep their own code, and the gate still
|
|
55
|
+
# checks the object they name is real.
|
|
56
|
+
def folded(field)
|
|
57
|
+
kind = derived[field]
|
|
58
|
+
return nil unless kind.is_a?(Array) && kind.first == :folded
|
|
59
|
+
|
|
60
|
+
[kind[1], kind[2]]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# COMPUTED means worked out, not merely answerable.
|
|
64
|
+
#
|
|
65
|
+
# Asking only whether the holder responds was too weak, and measurably so:
|
|
66
|
+
# `[:computed, :version]` passed, because `Bluebook` does answer to
|
|
67
|
+
# `version` — it just answers with what the constructor was handed. A field
|
|
68
|
+
# the constructor TAKES is stored, and calling it computed is how a chapter's
|
|
69
|
+
# version would have gone missing while the gate said yes.
|
|
70
|
+
#
|
|
71
|
+
# So a computed field is one the holder answers AND the constructor does not
|
|
72
|
+
# accept. `query_name` qualifies (`Naming.snake(name)`) ; `version` cannot.
|
|
73
|
+
def computes?(method)
|
|
74
|
+
return false unless holder
|
|
75
|
+
return false unless answers?(method)
|
|
76
|
+
|
|
77
|
+
!accepts?(method)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def answers?(method)
|
|
81
|
+
make == :declare ? holder.respond_to?(method) : holder.instance_methods.include?(method)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def accepts?(keyword)
|
|
85
|
+
builder = make == :declare ? holder.method(:declare) : holder.instance_method(:initialize)
|
|
86
|
+
|
|
87
|
+
builder.parameters.any? { |kind, name| %i[key keyreq].include?(kind) && name == keyword }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# The fields that hold a parent's id without being spelled `*_id`. An entity is
|
|
92
|
+
# declared in an aggregate, a member on a value object, a dispatch inside a
|
|
93
|
+
# handler, and each names its parent with a word rather than a suffix.
|
|
94
|
+
PARENT_POINTERS = %i[owner shape handler].freeze
|
|
95
|
+
|
|
96
|
+
# The only fields allowed to claim they describe something other than the
|
|
97
|
+
# construct they hang off, each with the reason spelled out.
|
|
98
|
+
#
|
|
99
|
+
# normalisations the canonical-form table belongs to the expression grammar.
|
|
100
|
+
# A chapter's rules are canonicalised on the way in, so the
|
|
101
|
+
# language models the table — but no chapter STORES one, and
|
|
102
|
+
# `Bluebook#to_h` splices it in from Expression.
|
|
103
|
+
ELSEWHERE = {
|
|
104
|
+
Bluebook: %i[normalisations]
|
|
105
|
+
}.freeze
|
|
106
|
+
|
|
107
|
+
def self.elsewhere?(category, field)
|
|
108
|
+
Array(ELSEWHERE[category.to_sym]).include?(field)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|