hecks 2.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +50 -7
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +32 -100
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +31 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +19 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +47 -108
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +22 -584
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +154 -400
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +52 -90
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -5,48 +5,25 @@ module Hecks
|
|
|
5
5
|
module Bluebook
|
|
6
6
|
Invariant = Struct.new(:description, :canonical, :predicate, :ast, keyword_init: true)
|
|
7
7
|
|
|
8
|
-
# A value object
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# calls `.new` on one — coercion builds `Runtime::Value` wrappers, and
|
|
13
|
-
# invariants run as canonical text through the Evaluator. The runtime
|
|
14
|
-
# reaches a shape through `aggregate.value_object(name)`, the IR's own
|
|
15
|
-
# finder ; there is no constant nesting and no second index.
|
|
16
|
-
#
|
|
17
|
-
# `to_h` does not move. It is a byte-for-byte contract pinned by the
|
|
18
|
-
# golden fixtures, so it keeps spelling the short declared name, which
|
|
19
|
-
# is what `hecks_name` carries. Declarations in the graph, strings in the
|
|
20
|
-
# export.
|
|
8
|
+
# A value object: a declaration holder, never instantiated.
|
|
9
|
+
# `ValueObjectBuilder` returns a subclass carrying attributes, invariants and members;
|
|
10
|
+
# reach one through `aggregate.value_object(name)`.
|
|
11
|
+
# `to_h` spells the short declared name (`hecks_name`), a contract pinned by golden fixtures.
|
|
21
12
|
class ValueObject
|
|
22
13
|
extend Construct
|
|
23
|
-
# Extended, not included
|
|
24
|
-
# emission is a class method. See Hecks::IR's own note on
|
|
25
|
-
# the two shapes.
|
|
14
|
+
# Extended, not included: this construct is a class, so emission is a class method.
|
|
26
15
|
extend Hecks::IR
|
|
27
16
|
extend Behaviour::ValueObject
|
|
28
17
|
|
|
29
18
|
emits_ir(
|
|
30
19
|
name: :hecks_name,
|
|
31
20
|
attributes: many(:attributes),
|
|
32
|
-
# `ast
|
|
33
|
-
#
|
|
34
|
-
# replacing it (`canonical` stays the human-facing/doctest-facing
|
|
35
|
-
# form; parsing it back would just re-derive what `ast` already
|
|
36
|
-
# states directly). Ground truth and the full reasoning:
|
|
37
|
-
# `Expression::AstJson`'s own header — built for `rust/host`'s
|
|
38
|
-
# own mint-time invariant check (`reference_validate.rs`), which
|
|
39
|
-
# has no kernel crate to parse `canonical` with.
|
|
21
|
+
# `ast` sits beside `canonical` because rust/host's mint-time invariant check
|
|
22
|
+
# has no kernel crate to parse `canonical` with (see `Expression::AstJson`).
|
|
40
23
|
invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
41
24
|
closed_set: :closed_set?,
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
# (`StatementFrequency#retention_months`, statements.bluebook), not
|
|
45
|
-
# only `String` — and stringifying it on the way out would erase
|
|
46
|
-
# that: `84` and `"84"` (a member some other row might legitimately
|
|
47
|
-
# spell as text) would become indistinguishable once they reached
|
|
48
|
-
# `to_h`. The declared name still moves (`field.to_s`) — that half
|
|
49
|
-
# was never a Ruby object with a type to lose.
|
|
25
|
+
# Only the field name is stringified: a member value can be an Integer, and
|
|
26
|
+
# stringifying it would make `84` and `"84"` indistinguishable in `to_h`.
|
|
50
27
|
members: -> { members.map { |member| member.map { |field, value| [field.to_s, value] } } }
|
|
51
28
|
)
|
|
52
29
|
|
|
@@ -57,10 +34,8 @@ module Hecks
|
|
|
57
34
|
# the bluebook declares and the thing Ruby holds are one object.
|
|
58
35
|
#
|
|
59
36
|
# @param name [String, Symbol] the value object's declared type name
|
|
60
|
-
# @param attributes [Array<Bluebook::Attribute>] the value object's declared
|
|
61
|
-
#
|
|
62
|
-
# @param invariants [Array<Bluebook::Invariant>] the rules checked against every
|
|
63
|
-
# instance of this value object
|
|
37
|
+
# @param attributes [Array<Bluebook::Attribute>] the value object's declared fields
|
|
38
|
+
# @param invariants [Array<Bluebook::Invariant>] the rules checked against every instance
|
|
64
39
|
# @param members [Array<Hash{Symbol => Object}>] the declared `one_of` members, one
|
|
65
40
|
# row of field values per member
|
|
66
41
|
# @param closed_set [Boolean] whether a `one_of` was declared, even with no
|
data/lib/hecks/bluebook.rb
CHANGED
|
@@ -1,36 +1,19 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Everything a .bluebook file becomes on its way to running: the expression
|
|
4
|
-
# language (expression/), the model itself (the chapter class plus
|
|
5
|
-
# everything it declares), the assembly that turns
|
|
6
|
-
# declarations back into that graph (assembly.rb + assembly/), the authoring
|
|
7
|
-
# DSL (dsl/), and the meta-validator that judges a chapter against the
|
|
8
|
-
# language's own grammar (meta_validator.rb + meta_validator/).
|
|
9
|
-
#
|
|
10
|
-
# The require order below matters: expression and IR load first (pure
|
|
11
|
-
# declarations), assembly's collaborators load before its face, and the DSL
|
|
12
|
-
# loads before the meta-validator that its builders call at build time.
|
|
1
|
+
# Everything a .bluebook file becomes on its way to running: expression language, model,
|
|
2
|
+
# assembly, authoring DSL and meta-validator.
|
|
13
3
|
|
|
14
4
|
module Hecks
|
|
15
|
-
#
|
|
16
|
-
# chapter (bluebook/chapter.rb carries its body). Everything a chapter
|
|
17
|
-
# declares nests under it, as do the ways to build one (`DSL`) and to
|
|
18
|
-
# judge one (`MetaValidator`). Reopening this anywhere must say `class`.
|
|
5
|
+
# `Hecks::Bluebook` is a class defined in bluebook/chapter.rb; reopen it with `class`.
|
|
19
6
|
module Bluebook
|
|
20
7
|
end
|
|
21
8
|
end
|
|
22
9
|
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
# because those files' contents are frozen and cannot say so themselves.
|
|
10
|
+
# Required here because the chapter's frozen files lean on these at class-body level.
|
|
11
|
+
# Load order: expression and IR first, assembly's collaborators before its face, DSL last.
|
|
26
12
|
require_relative "construct"
|
|
27
13
|
require_relative "literal"
|
|
28
14
|
require_relative "query_specification"
|
|
29
15
|
|
|
30
16
|
require_relative "bluebook/expression"
|
|
31
|
-
# **The model itself** — the chapter class's own body first, then everything
|
|
32
|
-
# a chapter declares. Order matters only for reading: each is a bag of
|
|
33
|
-
# declarations with no load-time cross-references.
|
|
34
17
|
require_relative "bluebook/chapter"
|
|
35
18
|
require_relative "bluebook/reference"
|
|
36
19
|
require_relative "bluebook/attribute"
|
data/lib/hecks/cache_dir.rb
CHANGED
|
@@ -3,30 +3,11 @@ require "fileutils"
|
|
|
3
3
|
require "tmpdir"
|
|
4
4
|
|
|
5
5
|
module Hecks
|
|
6
|
-
# The one place the runtime's own scratch files live, outside the gem
|
|
6
|
+
# The one place the runtime's own scratch files live, outside the gem: an
|
|
7
|
+
# installed gem is read-only, and a checkout's `tmp/` isn't this library's to assume.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# installed gem is read-only, and a checkout's `tmp/` is not a place a
|
|
11
|
-
# library gets to assume. Both ask this module for a subdirectory instead.
|
|
12
|
-
#
|
|
13
|
-
# ## Where the root is
|
|
14
|
-
#
|
|
15
|
-
# The first of these that can be made a private directory wins:
|
|
16
|
-
#
|
|
17
|
-
# 1. `$XDG_CACHE_HOME/hecks`, when `XDG_CACHE_HOME` is set to an absolute path
|
|
18
|
-
# 2. `~/.cache/hecks`
|
|
19
|
-
# 3. `<system temp dir>/hecks-<uid>`
|
|
20
|
-
#
|
|
21
|
-
# ## Private, or not used
|
|
22
|
-
#
|
|
23
|
-
# The syntax-boot cache is read back with `Marshal.load`, so a directory
|
|
24
|
-
# another account can write to is a way to run code as this one. A
|
|
25
|
-
# candidate is accepted only if it is owned by the current user and
|
|
26
|
-
# writable by nobody else; the shared temp directory in particular is
|
|
27
|
-
# where a predictable name can be planted by someone else. When no candidate
|
|
28
|
-
# qualifies, a fresh per-process directory stands in: the cache still
|
|
29
|
-
# works within the process and is never shared with a stranger.
|
|
9
|
+
# A candidate root is used only if it is private to the current user, since the
|
|
10
|
+
# syntax-boot cache it holds is read back with `Marshal.load`.
|
|
30
11
|
module CacheDir
|
|
31
12
|
module_function
|
|
32
13
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
# A JSON document with every object's keys sorted. Key order is not semantics, so a diff a person
|
|
7
|
+
# reads should not have to notice it moved.
|
|
8
|
+
module CanonicalJson
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
# Sorts every Hash's keys within a parsed JSON document, recursively.
|
|
12
|
+
#
|
|
13
|
+
# @param node [Object] a value from `JSON.parse`: a `Hash`, an `Array`, or a JSON scalar
|
|
14
|
+
# @return [Object] the same shape with every nested `Hash`'s keys sorted by their string form
|
|
15
|
+
def sort_deep(node)
|
|
16
|
+
case node
|
|
17
|
+
when Hash then node.sort_by { |key, _| key.to_s }.to_h { |key, value| [key, sort_deep(value)] }
|
|
18
|
+
when Array then node.map { |item| sort_deep(item) }
|
|
19
|
+
else node
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @param text [String] a JSON document
|
|
24
|
+
# @return [String] the document pretty-printed with its keys in order
|
|
25
|
+
# @raise [JSON::ParserError] if the text is not JSON
|
|
26
|
+
def pretty(text)
|
|
27
|
+
JSON.pretty_generate(sort_deep(JSON.parse(text)))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require_relative "naming"
|
|
2
|
+
require_relative "runtime/registry"
|
|
3
|
+
require_relative "bluebook/meta_validator"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
# The chapters the gem carries that a hecksagon can attach by name (ADR 0080): the language
|
|
7
|
+
# declared in itself, Expression, Tenancy, Deploy and QualityControl. Framework members stay in
|
|
8
|
+
# `Framework`.
|
|
9
|
+
#
|
|
10
|
+
# A chapter is named by the `Hecks.bluebook "Name"` header of its files, and may span several.
|
|
11
|
+
# Beside its bluebook a chapter may carry what every hecksagon attaching it needs, whatever
|
|
12
|
+
# its store: `<snake_name>.ports.hecksagon` (the ports it declares, as a `Hecks.hecksagon`
|
|
13
|
+
# block that merges into the attaching one) and `adapters/*.adapter` (the adapters binding them).
|
|
14
|
+
module Chapters
|
|
15
|
+
# Where attachable chapters live, relative to `lib/hecks/`.
|
|
16
|
+
GLOBS = %w[language/**/*.bluebook grammar/expression.bluebook tenancy/bluebook/*.bluebook
|
|
17
|
+
deploy/bluebook/*.bluebook quality_control/*.bluebook].freeze
|
|
18
|
+
|
|
19
|
+
# Every attachable chapter, by name, with the files that declare it.
|
|
20
|
+
#
|
|
21
|
+
# @return [Hash{String => Array<String>}] chapter name to its files' absolute paths, sorted
|
|
22
|
+
def self.index
|
|
23
|
+
@index ||= GLOBS.flat_map { |glob| Dir.glob(File.join(__dir__, glob)) }.sort
|
|
24
|
+
.group_by { |path| chapter_name(path) }
|
|
25
|
+
.reject { |name, _| name.nil? }
|
|
26
|
+
.freeze
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Loads a chapter's files into the current registry, unless it already holds the chapter.
|
|
30
|
+
#
|
|
31
|
+
# The files load together inside `MetaValidator.defer`, so a chapter spread over several files
|
|
32
|
+
# is judged once, whole. The chapter's ports file and adapters load after it, since a port
|
|
33
|
+
# names the chapter's aggregates.
|
|
34
|
+
#
|
|
35
|
+
# @param name [String] the chapter's name, such as `"Deploy"`
|
|
36
|
+
# @return [Boolean, nil] true when this call loaded the chapter, nil when it was already held
|
|
37
|
+
# @raise [Runtime::WiringError] if no attachable chapter has that name
|
|
38
|
+
def self.load!(name)
|
|
39
|
+
paths = index.fetch(name.to_s) do
|
|
40
|
+
raise Runtime::WiringError,
|
|
41
|
+
"no attachable chapter named #{name.inspect} — known: #{index.keys.join(', ')}"
|
|
42
|
+
end
|
|
43
|
+
registry = Hecks.current_registry or
|
|
44
|
+
raise Runtime::WiringError, "attaches #{name.to_s.inspect} outside a boot: no registry is open"
|
|
45
|
+
return refuse_own_chapter(registry, name.to_s) if registry.bluebook(name.to_s)
|
|
46
|
+
|
|
47
|
+
load_atomically(registry, name.to_s, paths)
|
|
48
|
+
true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Loads a chapter whole or not at all: a raise anywhere leaves the registry as it was, so a
|
|
52
|
+
# retry loads the chapter again instead of finding a half-built one already held.
|
|
53
|
+
def self.load_atomically(registry, name, paths)
|
|
54
|
+
queued = Bluebook::MetaValidator.deferred_chapters.dup
|
|
55
|
+
ports = registry.ports.keys
|
|
56
|
+
adapters = registry.adapters.keys
|
|
57
|
+
Bluebook::MetaValidator.defer { paths.each { |path| Kernel.load(path) } }
|
|
58
|
+
Bluebook::MetaValidator.judge_deferred!(registry)
|
|
59
|
+
load_wiring(name, paths)
|
|
60
|
+
rescue Exception # rubocop:disable Lint/RescueException -- rolls back, then re-raises
|
|
61
|
+
registry.forget_chapter(name)
|
|
62
|
+
Bluebook::MetaValidator.deferred_chapters.replace(queued)
|
|
63
|
+
registry.ports.delete_if { |key, _| !ports.include?(key) }
|
|
64
|
+
registry.adapters.delete_if { |key, _| !adapters.include?(key) }
|
|
65
|
+
raise
|
|
66
|
+
end
|
|
67
|
+
private_class_method :load_atomically
|
|
68
|
+
|
|
69
|
+
# Returns nil for a chapter this gem already loaded; raises for a chapter of the same name
|
|
70
|
+
# that a user's own file declared, which `attaches` would otherwise silently take for the
|
|
71
|
+
# gem's.
|
|
72
|
+
def self.refuse_own_chapter(registry, name)
|
|
73
|
+
foreign = Array(registry.bluebook_sources[name]).compact
|
|
74
|
+
.reject { |path| File.expand_path(path).start_with?("#{__dir__}/") }
|
|
75
|
+
return if foreign.empty?
|
|
76
|
+
|
|
77
|
+
raise Runtime::WiringError,
|
|
78
|
+
"attaches #{name.inspect}, but a chapter named #{name.inspect} is already declared in " \
|
|
79
|
+
"#{foreign.join(', ')} — rename it, since the gem's own #{name} chapter cannot merge into it"
|
|
80
|
+
end
|
|
81
|
+
private_class_method :refuse_own_chapter
|
|
82
|
+
|
|
83
|
+
# Loads what a chapter ships beside its bluebook: its ports file, then its adapters.
|
|
84
|
+
#
|
|
85
|
+
# @param name [String] the chapter's name
|
|
86
|
+
# @param paths [Array<String>] the chapter's bluebook files
|
|
87
|
+
# @return [void]
|
|
88
|
+
def self.load_wiring(name, paths)
|
|
89
|
+
directory = File.dirname(paths.first)
|
|
90
|
+
ports = File.join(directory, "#{Naming.snake(name)}.ports.hecksagon")
|
|
91
|
+
Kernel.load(ports) if File.file?(ports)
|
|
92
|
+
Dir.glob(File.join(directory, "adapters", "*.adapter")).each { |adapter| Kernel.load(adapter) }
|
|
93
|
+
end
|
|
94
|
+
private_class_method :load_wiring
|
|
95
|
+
|
|
96
|
+
# The name a file's `Hecks.bluebook "Name"` header declares, or nil for a file without one.
|
|
97
|
+
def self.chapter_name(path)
|
|
98
|
+
File.foreach(path) { |line| return Regexp.last_match(1) if line =~ /\A\s*Hecks\.bluebook\s+"([^"]+)"/ }
|
|
99
|
+
nil
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require_relative "../../hecks"
|
|
2
|
+
require_relative "../behaviors"
|
|
3
|
+
|
|
4
|
+
module Hecks
|
|
5
|
+
module CLI
|
|
6
|
+
# The command behind `hecks run_behaviors` and Custodian's `Operation.RunBehaviors`: runs
|
|
7
|
+
# `.behaviors` files and reports pass, fail or error per test (docs/guides/behaviors.md).
|
|
8
|
+
module Behaviors
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
# Runs one `.behaviors` file, or every one under a directory, and exits with the verdict.
|
|
12
|
+
#
|
|
13
|
+
# @param argv [Array<String>] the file or directory to run
|
|
14
|
+
# @param program [String] the name the usage message calls this command by
|
|
15
|
+
# @return [void]
|
|
16
|
+
# @raise [SystemExit] always: 0 when every test passed, 1 when any failed, errored or did
|
|
17
|
+
# not parse, or when a directory holds no `.behaviors` file
|
|
18
|
+
def call(argv, program:)
|
|
19
|
+
target = argv.first or abort "usage: #{program} <file.behaviors | directory>"
|
|
20
|
+
abort "no such file or directory: #{target}" unless File.exist?(target)
|
|
21
|
+
|
|
22
|
+
if File.directory?(target)
|
|
23
|
+
sweep = Hecks::Behaviors.run_all(target)
|
|
24
|
+
abort "no .behaviors files under #{target}" if sweep.files_swept.zero?
|
|
25
|
+
|
|
26
|
+
sweep.files.each { |file| report_file(file) }
|
|
27
|
+
summary = sweep.summary
|
|
28
|
+
puts
|
|
29
|
+
puts "#{sweep.files_swept} file(s) swept — #{summary[:total]} test(s): " \
|
|
30
|
+
"#{summary[:passed]} passed, #{summary[:failed]} failed, #{summary[:errored]} errored, " \
|
|
31
|
+
"#{summary[:parse_errors]} file(s) failed to parse"
|
|
32
|
+
else
|
|
33
|
+
result = Hecks::Behaviors.run(target)
|
|
34
|
+
report_file(result)
|
|
35
|
+
summary = Hecks::Behaviors.summarize([result])
|
|
36
|
+
end
|
|
37
|
+
exit(bad?(summary) ? 1 : 0)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @api private
|
|
41
|
+
def report_file(result)
|
|
42
|
+
puts result.path
|
|
43
|
+
if result.parse_error
|
|
44
|
+
puts " PARSE ERROR — #{result.parse_error}"
|
|
45
|
+
return
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
result.runs.each do |run|
|
|
49
|
+
marker = { pass: "ok", fail: "FAIL", error: "ERROR" }.fetch(run.status)
|
|
50
|
+
puts " #{marker.ljust(5)} #{run.description}"
|
|
51
|
+
puts " #{run.message}" if run.message
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @api private
|
|
56
|
+
def bad?(summary)
|
|
57
|
+
((summary[:failed] || 0) + (summary[:errored] || 0) + (summary[:parse_errors] || 0)).positive?
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../canonical_json"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module CLI
|
|
7
|
+
# The command behind `hecks canonicalise`: prints a JSON document with every object's keys
|
|
8
|
+
# sorted, recursively. Key order is not semantics, so a diff a person reads should not have
|
|
9
|
+
# to notice it moved.
|
|
10
|
+
module Canonicalise
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
# Prints the document at the path in `argv`, canonicalised.
|
|
14
|
+
#
|
|
15
|
+
# @param argv [Array<String>] the path of the JSON file, first
|
|
16
|
+
# @param out [IO] where the document goes
|
|
17
|
+
# @return [Integer] the exit status, always 0
|
|
18
|
+
# @raise [IndexError] when no path is given
|
|
19
|
+
def call(argv, out: $stdout)
|
|
20
|
+
out.puts Hecks::CanonicalJson.pretty(File.read(argv.fetch(0)))
|
|
21
|
+
0
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../hecks"
|
|
4
|
+
require_relative "../engine_agreement"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `hecks check_engine_agreement`: fails when a query engine re-grows its
|
|
9
|
+
# own comparator dispatch, or when a declared comparator lacks a shared `Comparison` case or
|
|
10
|
+
# a cross-engine agreement spec. Grep-based.
|
|
11
|
+
module CheckEngineAgreement
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
# Checks the tree and prints the verdict.
|
|
15
|
+
#
|
|
16
|
+
# @param root [String] the repository root to check
|
|
17
|
+
# @param out [IO] where a clean verdict goes
|
|
18
|
+
# @param err [IO] where the problems go
|
|
19
|
+
# @return [Integer] 0 when clean, 1 with problems
|
|
20
|
+
def call(root:, out: $stdout, err: $stderr)
|
|
21
|
+
finding = Hecks::EngineAgreement.check(root: root)
|
|
22
|
+
if finding.problems.empty?
|
|
23
|
+
out.puts Hecks::EngineAgreement.clean_line(finding)
|
|
24
|
+
return 0
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
err.puts Hecks::EngineAgreement.problem_lines(finding)
|
|
28
|
+
1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require_relative "../ports/persistence/plugins/era/expected_era"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module CLI
|
|
5
|
+
# The command behind `hecks check_era` and Custodian's `Host.CheckEra`: asks a running host
|
|
6
|
+
# which era it reports and compares it with an allow-list file. Read-only: one GET, no writes.
|
|
7
|
+
module CheckEra
|
|
8
|
+
USAGE = "usage: hecks check_era <url> <expected-era-file> [--timeout=<seconds>]".freeze
|
|
9
|
+
|
|
10
|
+
# What a check found.
|
|
11
|
+
#
|
|
12
|
+
# @!attribute [r] verdict
|
|
13
|
+
# @return [Runtime::EraCheck::ExpectedEra::Verdict] the era compared with the list
|
|
14
|
+
# @!attribute [r] version
|
|
15
|
+
# @return [String] the gem version the host reports, empty when it reports none
|
|
16
|
+
# @!attribute [r] line
|
|
17
|
+
# @return [String] the sentence `hecks check_era` prints for this finding
|
|
18
|
+
Finding = Struct.new(:verdict, :version, :line)
|
|
19
|
+
|
|
20
|
+
module_function
|
|
21
|
+
|
|
22
|
+
# Fetches the host's `/version` and compares its era with the allow-list file.
|
|
23
|
+
#
|
|
24
|
+
# @param url [String] the host's base URL, or its `/version` URL
|
|
25
|
+
# @param file [String] path of the allow-list file
|
|
26
|
+
# @param timeout [Numeric] seconds allowed for connecting and for reading
|
|
27
|
+
# @return [Finding] the comparison, whether or not the era is listed
|
|
28
|
+
# @raise [Errno::ENOENT, Errno::EACCES] if the file cannot be read
|
|
29
|
+
# @raise [Runtime::EraCheck::ExpectedEra::Unreachable] if the host cannot be reached
|
|
30
|
+
# @raise [Runtime::EraCheck::ExpectedEra::BadResponse] if it answers no era
|
|
31
|
+
def assess(url, file, timeout: 10)
|
|
32
|
+
expected = Runtime::EraCheck::ExpectedEra
|
|
33
|
+
allowed = expected.parse(File.read(file))
|
|
34
|
+
document = expected.fetch_version(url, timeout: timeout)
|
|
35
|
+
verdict = expected.verdict(document.fetch("era"), allowed)
|
|
36
|
+
Finding.new(verdict, document.fetch("version"), sentence(verdict, file))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Runs `hecks check_era`: prints the finding and answers the exit status.
|
|
40
|
+
#
|
|
41
|
+
# @param argv [Array<String>] the url, the allow-list file and an optional `--timeout=N`
|
|
42
|
+
# @param out [IO] where a finding goes
|
|
43
|
+
# @param err [IO] where a refusal goes
|
|
44
|
+
# @return [Integer] 0 when the era is expected or unlisted, 1 on a mismatch, 2 on bad
|
|
45
|
+
# usage or an unreadable file, 3 when the host cannot be reached or answers no era
|
|
46
|
+
def run(argv, out: $stdout, err: $stderr)
|
|
47
|
+
timeout = 10
|
|
48
|
+
args = argv.reject do |arg|
|
|
49
|
+
next false unless arg.start_with?("--timeout=")
|
|
50
|
+
|
|
51
|
+
timeout = arg.delete_prefix("--timeout=").to_f
|
|
52
|
+
true
|
|
53
|
+
end
|
|
54
|
+
url, file = args
|
|
55
|
+
return usage(err) unless url && file && args.size == 2 && timeout.positive?
|
|
56
|
+
|
|
57
|
+
finding = assess(url, file, timeout: timeout)
|
|
58
|
+
(finding.verdict.ok? ? out : err).puts(finding.line)
|
|
59
|
+
finding.verdict.ok? ? 0 : 1
|
|
60
|
+
rescue Errno::ENOENT, Errno::EACCES => e
|
|
61
|
+
err.puts("cannot read #{file}: #{e.message}")
|
|
62
|
+
2
|
|
63
|
+
rescue Runtime::EraCheck::ExpectedEra::Unreachable, Runtime::EraCheck::ExpectedEra::BadResponse => e
|
|
64
|
+
err.puts("era check failed: #{e.message}")
|
|
65
|
+
3
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @param verdict [Runtime::EraCheck::ExpectedEra::Verdict] the comparison
|
|
69
|
+
# @param file [String] the allow-list file, named in the sentence
|
|
70
|
+
# @return [String] the one line that says what the comparison found
|
|
71
|
+
def sentence(verdict, file)
|
|
72
|
+
case verdict.status
|
|
73
|
+
when :match
|
|
74
|
+
"era #{verdict.era} is expected (#{verdict.allowed.join(', ')})"
|
|
75
|
+
when :unlisted
|
|
76
|
+
"host reports era #{verdict.era}; #{file} lists no era, so nothing was compared"
|
|
77
|
+
else
|
|
78
|
+
"host reports era #{verdict.era}, which is not in #{file} (expected: #{verdict.allowed.join(', ')})"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def usage(err)
|
|
83
|
+
err.puts(USAGE)
|
|
84
|
+
2
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require_relative "../../hecks"
|
|
2
|
+
require "irb"
|
|
3
|
+
# The era/lineage subsystem is a persistence plugin core does not require by default (ADR 0033);
|
|
4
|
+
# a domain passed to the console may bind it.
|
|
5
|
+
require_relative "../ports/persistence/plugins/era"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module CLI
|
|
9
|
+
# The command behind `hecks console` and Custodian's `Operation.OpenConsole`: boots a domain
|
|
10
|
+
# (pizzas on Memory by default) and drops into IRB with its door installed, for dispatching a
|
|
11
|
+
# real command by hand. No argument needs no database (ADR 0073); a domain directory boots as
|
|
12
|
+
# it is wired, which may bind PostgresEra.
|
|
13
|
+
module Console
|
|
14
|
+
PIZZAS = File.expand_path("../../../examples/pizzas", __dir__)
|
|
15
|
+
|
|
16
|
+
DEFAULT_FILES = [
|
|
17
|
+
File.join(PIZZAS, "bluebook/pizzas.bluebook"),
|
|
18
|
+
File.join(PIZZAS, "pizzas_behaviors.hecksagon")
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
# Boots the domain, prints what it declares, and starts IRB; returns when the session ends.
|
|
24
|
+
#
|
|
25
|
+
# @param domain [String, nil] a domain directory; the bundled pizzas domain when nil
|
|
26
|
+
# @param launcher [#call] starts the interactive session; IRB unless a caller stands in
|
|
27
|
+
# @return [Runtime] the runtime the session ran against
|
|
28
|
+
def call(domain = nil, launcher: -> { IRB.start(__FILE__) })
|
|
29
|
+
runtime = domain ? Hecks.boot(domain) : Hecks.boot_files(DEFAULT_FILES)
|
|
30
|
+
puts overview(runtime)
|
|
31
|
+
puts banner
|
|
32
|
+
launcher.call
|
|
33
|
+
runtime
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param runtime [Runtime] a booted domain
|
|
37
|
+
# @return [String] each chapter's vision and its aggregates' commands
|
|
38
|
+
def overview(runtime)
|
|
39
|
+
runtime.registry.bluebooks.each_value.map do |bluebook|
|
|
40
|
+
aggregates = bluebook.aggregates.map do |aggregate|
|
|
41
|
+
commands = aggregate.commands.map { |command| "#{Naming.snake(command.hecks_name)}!" }.sort.join(", ")
|
|
42
|
+
" #{aggregate.name}: #{commands}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
"\n #{bluebook.name} — #{bluebook.vision}\n#{aggregates.join("\n")}\n"
|
|
46
|
+
end.join
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @return [String] the version and a first session to try against the pizzas domain
|
|
50
|
+
def banner
|
|
51
|
+
<<~BANNER
|
|
52
|
+
|
|
53
|
+
hecks #{Hecks::VERSION}
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
order = Order.create_pizza!(name: { value: "Margherita" }, pizza: { price_cents: { cents: 1200 }, size: { value: "large" } })
|
|
57
|
+
order.add_topping!(topping: { value: "Basil" }, amount: { value: 3 })
|
|
58
|
+
order.purchase!(customer_name: { value: "Chris" }, amount: { cents: 1200 })
|
|
59
|
+
order.status
|
|
60
|
+
order.events.last
|
|
61
|
+
|
|
62
|
+
BANNER
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "optparse"
|
|
4
|
+
require_relative "../projections/deploy/template_diff"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `hecks deploy diff` and `hecks deploy diff`: compares two
|
|
9
|
+
# CloudFormation templates offline and reports differences by logical id; `--strict` also
|
|
10
|
+
# counts cosmetic differences (comments, key order).
|
|
11
|
+
module DeployTemplateDiff
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
# Prints the comparison and answers the exit status.
|
|
15
|
+
#
|
|
16
|
+
# @param argv [Array<String>] `<before.yaml> <after.yaml> [--json] [--strict]`
|
|
17
|
+
# @param program [String] the name the usage message calls this command by
|
|
18
|
+
# @return [Integer] 0 when the templates match, 1 when they differ, 2 for bad input
|
|
19
|
+
# @raise [SystemExit] when there are not exactly two templates
|
|
20
|
+
def call(argv, program: "hecks deploy diff")
|
|
21
|
+
options = { json: false, strict: false }
|
|
22
|
+
parser = OptionParser.new do |opts|
|
|
23
|
+
opts.banner = "usage: #{program} <before.yaml> <after.yaml> [--json] [--strict]"
|
|
24
|
+
opts.on("--json", "write the report as JSON") { options[:json] = true }
|
|
25
|
+
opts.on("--strict", "count cosmetic differences too") { options[:strict] = true }
|
|
26
|
+
end
|
|
27
|
+
files = parser.parse(argv)
|
|
28
|
+
abort parser.banner unless files.size == 2
|
|
29
|
+
|
|
30
|
+
diff = Hecks::Projections::Deploy::TemplateDiff
|
|
31
|
+
report = diff.diff_files(files[0], files[1], strict: options[:strict])
|
|
32
|
+
puts(options[:json] ? diff.render_json(report) : diff.render(report))
|
|
33
|
+
report.different? ? 1 : 0
|
|
34
|
+
rescue ArgumentError => e
|
|
35
|
+
warn e.message
|
|
36
|
+
2
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../hecks"
|
|
4
|
+
require_relative "../doc/reference"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `hecks measure_doc_coverage`: refuses unless every live word in
|
|
9
|
+
# `docs/implemented/reference/` has prose and a running example. It checks that an example
|
|
10
|
+
# exists; `spec/reference_doctest_spec.rb` checks that it passes. `ruby skip` fences and
|
|
11
|
+
# hidden `<!-- doctest:boot -->` blocks do not count as examples.
|
|
12
|
+
module DocCoverage
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
# Prints the coverage report.
|
|
16
|
+
#
|
|
17
|
+
# @param root [String] the repository root
|
|
18
|
+
# @param out [IO] where the report goes
|
|
19
|
+
# @param err [IO] where the refusal goes
|
|
20
|
+
# @return [Integer] 0 when every word is covered, 1 otherwise
|
|
21
|
+
def call(root:, out: $stdout, err: $stderr)
|
|
22
|
+
clean, report = Hecks::Doc::Reference.coverage_report(File.join(root, "docs/implemented/reference"))
|
|
23
|
+
out.puts report
|
|
24
|
+
return 0 if clean
|
|
25
|
+
|
|
26
|
+
err.puts "docs/implemented/reference/ is behind the language. " \
|
|
27
|
+
"Regenerate with hecks project_reference to see the words in place."
|
|
28
|
+
1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|