fensu-cli 0.4.0__tar.gz → 0.4.1__tar.gz
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.
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/Cargo.lock +1 -1
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/PKG-INFO +1 -1
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/Cargo.toml +1 -1
- fensu_cli-0.4.1/crates/fensu-cli/src/command/constants.rs +19 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/map_parsing.rs +14 -2
- fensu_cli-0.4.1/crates/fensu-cli/src/command/main/help.rs +3 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/constants.rs +2 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/execution.rs +7 -2
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/tree_policy.inc +230 -9
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/models.rs +8 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/rendering.rs +1 -1
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/mapping/commands.inc +153 -2
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/mapping/helpers.rs +29 -1
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/pyproject.toml +1 -1
- fensu_cli-0.4.0/crates/fensu-cli/src/command/constants.rs +0 -19
- fensu_cli-0.4.0/crates/fensu-cli/src/command/main/help.rs +0 -3
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/Cargo.toml +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/README.md +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/assets/catalogue.json +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/assets/python.gitignore +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/assets/skills_invariant.json +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/build.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_execution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_graph_rendering.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_help.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_human_rendering.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_parsing.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_structured_rendering.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/memory_values.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/check.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/init.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/map.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/rule.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/run_cli.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/main/skills.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/command/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/discovery.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/exceptions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/loading.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/parsing.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/helpers/validation.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/main/custom_rules.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/main/load.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/main/load_optional.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/configuration/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/cache.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/check_cleanup.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/check_evaluation.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/check_execution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/check_policy.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/check_project.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/init.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/process.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/render.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/helpers/rule.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/lib.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/main.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/cache.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/decoding.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/identity.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/project.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/render.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/helpers/tree.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/main/map.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/mapping/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/command/execution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/command/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/discovery.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/fingerprint.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/sections.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/build.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/exceptions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/identity.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/options.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/context/selection.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/filesystem.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/freshness.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/install.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/plan.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/publication.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/installation/transaction.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/main/catalogue.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/main/core_freshness.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/main/execute.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/main/skills.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command/check_cleanup.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command/check_policy.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command/commands.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/command.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/mapping/commands.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/mapping.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/skills/commands.inc +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/skills/commands.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/skills/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/skills/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/tests/skills.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/Cargo.toml +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/annotations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/contracts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/declarations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/harness.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/hygiene.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/mapping.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/references.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/rule_authoring.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/conversion/state.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/gateway/bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/gateway/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/gateway/model_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/gateway/repository_bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/gateway/rule_authoring_bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/main/register_module.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/extension/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/annotations/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/annotations/visitor.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/contracts/category.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/contracts/display.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/contracts/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/contracts/returns.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/contracts/rows.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/control/conditionals.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/control/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/declarations/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/declarations/rows.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/harness/calls.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/harness/dimensions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/harness/functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/harness/imports.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/harness/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/hygiene/checks.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/hygiene/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/metrics/functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/metrics/lookups.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/metrics/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/metrics/mutations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/naming/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/naming/names.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/project/calls.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/project/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/references/events.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/references/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/references/test_shape.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/rule_authoring/literals.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/rule_authoring/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/rule_authoring/mutations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/rule_authoring/ownership.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/rule_authoring/references.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/breadth.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/children.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/expression_children.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/nodes.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/spans.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/shape/statement_children.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/state/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/state/resolution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/state/scopes.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/wording/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/helpers/wording/text.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/enumerate_nodes.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_annotations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_class_declarations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_comments.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_control_flow.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_dataclasses.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_evaluate_rule_calls.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_function_contracts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_hygiene.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_module_declarations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_outer_state_mutations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_parameter_mutation_occurrences.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_parameter_mutations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_project_facts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_references.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_rule_calls.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_rule_references.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_test_functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/extract_test_module.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/classes.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/expressions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/extraction.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/functions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/imports.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/main/extract_mapping_declarations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/main/extract_mapping_facts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mapping/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/facts/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/lib.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/helpers/failures.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/main/parse_expression_strict.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/main/parse_strict.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/parsing/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/helpers/line_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/main/index_lines.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/main/locate_offset.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/positions/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/helpers/matching.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/helpers/observation_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/helpers/repository_observation_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/helpers/repository_paths.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/main/build_repository_observation_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/main/hash_files.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/main/walk_python_files.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/src/snapshot/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/facts/enumerate.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/facts/mapping.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/facts/rule_authoring.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/facts/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/facts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/parsing/strict.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/parsing/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/parsing.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/positions/locate.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/positions/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/positions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot/hashing.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot/observations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot/walk.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-facts/tests/snapshot.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/Cargo.toml +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/helpers/loading.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/main/load_discovered_memory_corpus.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/main/load_memory_corpus.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/corpus/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/errors.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/archival/archive.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/archival/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/database.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/documents.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/lists.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/references.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/sections.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/skills.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/streaming.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/publication/values.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/graph_loading.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/graphs.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/overviews.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/queries.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/querying/query_values.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/diagnostics.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/schema_core.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/schema_markdown.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/schema_metadata.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/schema_skill_view.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/schema_views.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/summaries.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/helpers/reporting/synchronization.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/archive_memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/check_memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/memory_overview.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/memory_relation_schema.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/memory_schema.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/memory_schema_sql.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/probe_dependencies.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/query_memory_graph.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/query_memory_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/rebuild_memory_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/summarize_memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/main/sync_memory_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/engine/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/cycles.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/dependencies.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/document_targets.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/heading_targets.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/link_resolution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/main/resolve_memory_graph.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/graph/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/lib.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/assembly.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/blocks.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/headings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/line_index.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/links.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/lists.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/obsidian.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/helpers/text.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/main/parse_markdown.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/markdown/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/bootstrap.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/collisions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/discovery.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/documents.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/filesystem.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/git_tracking.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/skills.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/tree.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/helpers/validation.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/main/bootstrap_memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/main/discover_memory.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/src/source/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/corpus/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/corpus/loading.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/corpus/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/corpus.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/archive.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/bootstrap.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/check.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/dependencies.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/graph_query.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/list_batch/list_batches.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/list_batch/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/overview.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/performance.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/query.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/schema.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/streaming/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/streaming.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/summary.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/sync.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/engine.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/graph/dependencies.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/graph/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/graph/resolution.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/graph/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/graph.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown/code_blocks.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown/links.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown/lists.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown/structure.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/markdown.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/collisions.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/discovery.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/git_worktrees.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/symlinks.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-memory/tests/source.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/Cargo.toml +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/database.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/generation.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/publication.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/publication_merge.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/records.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/replay.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/schema.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/schema_values.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/helpers/storage.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/main/register_cache.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/main/replay_generation.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/tests/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/tests/records.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/tests/storage.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/tests/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/tests.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/cache/types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/core_rule_bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/execution_planning.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/memory_bindings.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/memory_conversion.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/memory_registration.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/main/register_module.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/extension/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/lib.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/constants.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/annotations/annotations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/hygiene/hygiene.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/layers/layers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/layers/local.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/layers/project.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/naming/naming.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/naming_globs/naming_globs.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/project_queries/project_queries.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/declarations.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/paths.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/project_layout.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/project_layout_paths.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/project_layout_queries.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/roles.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/roles/surfaces.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/shape/shape.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/tests/layout.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/tests/names.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/helpers/tests/tests.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/main/evaluate_core_rules.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/main/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/main/plan_core_rule_queries.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/mod.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/src/rules/models.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/extension/memory_conversion.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/extension/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/rules/contracts.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/rules/helpers.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/rules/test_types.rs +0 -0
- {fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-native/tests/rules.rs +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
pub(crate) const MEMORY_SCHEMA_PREFIX: &str = "memory.";
|
|
2
|
+
pub(crate) const OPTION_TERMINATOR: &str = "--";
|
|
3
|
+
pub(crate) const MAP_SHORT_HELP: &str = "-h";
|
|
4
|
+
pub(crate) const LONG_OPTION_PREFIX: &str = "--";
|
|
5
|
+
pub(crate) const QUERY_FORMAT_LONG: &str = "long";
|
|
6
|
+
pub(crate) const QUERY_FORMAT_TABLE: &str = "table";
|
|
7
|
+
pub(crate) const QUERY_FORMAT_JSON: &str = "json";
|
|
8
|
+
pub(crate) const QUERY_FORMAT_CSV: &str = "csv";
|
|
9
|
+
pub(crate) const RELATION_KIND_TABLE: &str = "table";
|
|
10
|
+
pub(crate) const RELATION_KIND_VIEW: &str = "view";
|
|
11
|
+
pub(crate) const ARCHIVE_STATE_ARCHIVED: &str = "archived";
|
|
12
|
+
pub(crate) const RESOLUTION_STATUS_RESOLVED: &str = "resolved";
|
|
13
|
+
pub(crate) const DEFAULT_QUERY_LIMIT: usize = 20;
|
|
14
|
+
pub(crate) const MAX_QUERY_LIMIT: usize = 1000;
|
|
15
|
+
pub(crate) const MAP_USAGE: &str = "usage: fensu map [-h] [--direction {downstream,upstream}] [--depth DEPTH]\n [--root ROOTS] [--paths {absolute,relative,compact,none}]\n [--color {auto,always,never}] [--cache | --no-cache]\n [--cache-stats]\n symbol";
|
|
16
|
+
pub(crate) const MAP_HELP: &str = "usage: fensu map [-h] [--direction {downstream,upstream}] [--depth DEPTH]\n [--root ROOTS] [--paths {absolute,relative,compact,none}]\n [--color {auto,always,never}] [--cache | --no-cache]\n [--cache-stats]\n symbol\n\npositional arguments:\n symbol bare, dotted, or path::function project symbol\n\noptions:\n -h, --help show this help message and exit\n --direction {downstream,upstream}\n --depth DEPTH maximum call depth\n --root ROOTS Python import root to map; repeat for multiple roots\n --paths {absolute,relative,compact,none}\n path display style\n --color {auto,always,never}\n ANSI color behavior\n --cache enable map index caching\n --no-cache disable map index caching\n --cache-stats write map cache operation counts to stderr\n";
|
|
17
|
+
pub(crate) const DEFAULT_GRAPH_DEPTH: usize = 2;
|
|
18
|
+
pub(crate) const DEFAULT_GRAPH_NODES: usize = 50;
|
|
19
|
+
pub(crate) const DEFAULT_GRAPH_EDGES: usize = 100;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
use crate::command::constants::{LONG_OPTION_PREFIX, MAP_SHORT_HELP, MAP_USAGE, OPTION_TERMINATOR};
|
|
2
|
-
use crate::mapping::
|
|
2
|
+
use crate::mapping::constants::{MAP_DIRECTION_DOWNSTREAM, MAP_DIRECTION_UPSTREAM};
|
|
3
|
+
use crate::mapping::models::{MapDirection, MapOptions, PathMode};
|
|
3
4
|
|
|
4
5
|
const LONG_OPTIONS: &[&str] = &[
|
|
5
6
|
"--help",
|
|
@@ -15,6 +16,7 @@ const LONG_OPTIONS: &[&str] = &[
|
|
|
15
16
|
|
|
16
17
|
pub(crate) fn parse(arguments: &[String]) -> Result<Option<MapOptions>, String> {
|
|
17
18
|
let mut symbol = None;
|
|
19
|
+
let mut direction = MapDirection::Downstream;
|
|
18
20
|
let mut depth = 3;
|
|
19
21
|
let mut roots = Vec::new();
|
|
20
22
|
let mut path_mode = PathMode::Relative;
|
|
@@ -49,7 +51,16 @@ pub(crate) fn parse(arguments: &[String]) -> Result<Option<MapOptions>, String>
|
|
|
49
51
|
"-h" | "--help" => return Ok(None),
|
|
50
52
|
"--direction" => {
|
|
51
53
|
let value = option_value(arguments, &mut position, resolved, inline)?;
|
|
52
|
-
choice(
|
|
54
|
+
choice(
|
|
55
|
+
resolved,
|
|
56
|
+
value,
|
|
57
|
+
&[MAP_DIRECTION_DOWNSTREAM, MAP_DIRECTION_UPSTREAM],
|
|
58
|
+
)?;
|
|
59
|
+
direction = if value == MAP_DIRECTION_UPSTREAM {
|
|
60
|
+
MapDirection::Upstream
|
|
61
|
+
} else {
|
|
62
|
+
MapDirection::Downstream
|
|
63
|
+
};
|
|
53
64
|
}
|
|
54
65
|
"--depth" => {
|
|
55
66
|
let value = option_value(arguments, &mut position, resolved, inline)?;
|
|
@@ -117,6 +128,7 @@ pub(crate) fn parse(arguments: &[String]) -> Result<Option<MapOptions>, String>
|
|
|
117
128
|
symbol.ok_or_else(|| parser_error("the following arguments are required: symbol"))?;
|
|
118
129
|
Ok(Some(MapOptions {
|
|
119
130
|
symbol,
|
|
131
|
+
direction,
|
|
120
132
|
depth,
|
|
121
133
|
roots,
|
|
122
134
|
path_mode,
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
pub(crate) fn help() -> String {
|
|
2
|
+
"Usage: fensu {init,check,rule,map,skills,memory} ...\n\nCommands:\n init Initialize Fensu configuration for a repository.\n check Evaluate repository architecture rules.\n rule Show details for one rule.\n map Render a directional project call map.\n skills Generate and install agent guidance.\n memory Synchronize, inspect, and query persistent repository memory.\n\nRun `fensu <command> --help` for command-specific options.\n".to_owned()
|
|
3
|
+
}
|
|
@@ -5,6 +5,8 @@ pub(crate) const EXPRESSION_STRING: &str = "string";
|
|
|
5
5
|
pub(crate) const EXPRESSION_SUBSCRIPT: &str = "subscript";
|
|
6
6
|
pub(crate) const INIT_MODULE_FILE: &str = "__init__.py";
|
|
7
7
|
pub(crate) const INIT_MODULE: &str = "__init__";
|
|
8
|
+
pub(crate) const MAP_DIRECTION_DOWNSTREAM: &str = "downstream";
|
|
9
|
+
pub(crate) const MAP_DIRECTION_UPSTREAM: &str = "upstream";
|
|
8
10
|
pub(crate) const SELF_RECEIVER: &str = "self";
|
|
9
11
|
pub(crate) const CLASS_RECEIVER: &str = "cls";
|
|
10
12
|
pub(crate) const MAX_COMPACT_PATH_PARTS: usize = 4;
|
|
@@ -3,7 +3,9 @@ use std::io::{self, IsTerminal};
|
|
|
3
3
|
use std::path::Path;
|
|
4
4
|
|
|
5
5
|
use crate::mapping::helpers::{cache, index, project, render, tree};
|
|
6
|
-
use crate::mapping::models::{
|
|
6
|
+
use crate::mapping::models::{
|
|
7
|
+
MapCacheStats, MapDirection, MapOptions, ProjectIndex, SourceSnapshot,
|
|
8
|
+
};
|
|
7
9
|
use crate::models::CliOutput;
|
|
8
10
|
|
|
9
11
|
pub(crate) fn execute(options: MapOptions) -> Result<CliOutput, String> {
|
|
@@ -19,7 +21,10 @@ pub(crate) fn execute(options: MapOptions) -> Result<CliOutput, String> {
|
|
|
19
21
|
(index::build(&snapshots)?, None)
|
|
20
22
|
};
|
|
21
23
|
let root = index::select(&project_index.functions, &options.symbol)?;
|
|
22
|
-
let call_tree =
|
|
24
|
+
let call_tree = match options.direction {
|
|
25
|
+
MapDirection::Downstream => tree::build_tree(root, &project_index, options.depth),
|
|
26
|
+
MapDirection::Upstream => tree::build_upstream_tree(root, &project_index, options.depth),
|
|
27
|
+
};
|
|
23
28
|
let use_color = env::var_os("NO_COLOR").is_none()
|
|
24
29
|
&& match options.color.as_str() {
|
|
25
30
|
"always" => true,
|
|
@@ -10,8 +10,16 @@ use crate::mapping::models::{
|
|
|
10
10
|
MappingExpression, MappingStatement, ProjectIndex, ResolvedCallable, UnresolvedCall,
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
type
|
|
13
|
+
type CallableStateKey = (String, Option<String>);
|
|
14
|
+
type MethodCache = BTreeMap<(String, String, bool), Option<String>>;
|
|
14
15
|
type ReceiverState = BTreeMap<String, Option<String>>;
|
|
16
|
+
type IncomingCallers = BTreeMap<CallableStateKey, BTreeMap<CallableStateKey, CallableState>>;
|
|
17
|
+
|
|
18
|
+
#[derive(Clone)]
|
|
19
|
+
struct CallableState {
|
|
20
|
+
definition_key: String,
|
|
21
|
+
dispatch_class_key: Option<String>,
|
|
22
|
+
}
|
|
15
23
|
|
|
16
24
|
pub(crate) fn build_tree(
|
|
17
25
|
root: FunctionDefinition,
|
|
@@ -32,6 +40,216 @@ pub(crate) fn build_tree(
|
|
|
32
40
|
)
|
|
33
41
|
}
|
|
34
42
|
|
|
43
|
+
pub(crate) fn build_upstream_tree(
|
|
44
|
+
root: FunctionDefinition,
|
|
45
|
+
index: &ProjectIndex,
|
|
46
|
+
depth: usize,
|
|
47
|
+
) -> CallMapNode {
|
|
48
|
+
let dispatch = root
|
|
49
|
+
.owning_class
|
|
50
|
+
.as_deref()
|
|
51
|
+
.map(|class| build_class_key(&root.module_name, class));
|
|
52
|
+
let callers = incoming_callers(index);
|
|
53
|
+
build_upstream_node(
|
|
54
|
+
root,
|
|
55
|
+
dispatch,
|
|
56
|
+
index,
|
|
57
|
+
&callers,
|
|
58
|
+
depth,
|
|
59
|
+
&BTreeSet::new(),
|
|
60
|
+
true,
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fn build_upstream_node(
|
|
65
|
+
definition: FunctionDefinition,
|
|
66
|
+
dispatch_class_key: Option<String>,
|
|
67
|
+
index: &ProjectIndex,
|
|
68
|
+
callers: &IncomingCallers,
|
|
69
|
+
remaining_depth: usize,
|
|
70
|
+
ancestors: &BTreeSet<CallableStateKey>,
|
|
71
|
+
aggregate_dispatch: bool,
|
|
72
|
+
) -> CallMapNode {
|
|
73
|
+
let key = (definition.key(), dispatch_class_key.clone());
|
|
74
|
+
let dispatch_class_name =
|
|
75
|
+
dispatch_class_name(&definition, dispatch_class_key.as_deref(), index);
|
|
76
|
+
if ancestors.contains(&key) {
|
|
77
|
+
return CallMapNode {
|
|
78
|
+
definition,
|
|
79
|
+
entries: Vec::new(),
|
|
80
|
+
dispatch_class_name,
|
|
81
|
+
cycle: true,
|
|
82
|
+
truncated: false,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
let incoming = incoming_states(&key, callers, aggregate_dispatch);
|
|
86
|
+
if remaining_depth == 0 {
|
|
87
|
+
return CallMapNode {
|
|
88
|
+
definition,
|
|
89
|
+
entries: Vec::new(),
|
|
90
|
+
dispatch_class_name,
|
|
91
|
+
cycle: false,
|
|
92
|
+
truncated: !incoming.is_empty(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
let mut next_ancestors = ancestors.clone();
|
|
96
|
+
next_ancestors.insert(key);
|
|
97
|
+
let entries = incoming
|
|
98
|
+
.into_iter()
|
|
99
|
+
.filter_map(|caller| {
|
|
100
|
+
let caller_definition = index.functions.get(&caller.definition_key)?.clone();
|
|
101
|
+
Some(CallMapEntry::Node(Box::new(build_upstream_node(
|
|
102
|
+
caller_definition,
|
|
103
|
+
caller.dispatch_class_key.clone(),
|
|
104
|
+
index,
|
|
105
|
+
callers,
|
|
106
|
+
remaining_depth - 1,
|
|
107
|
+
&next_ancestors,
|
|
108
|
+
false,
|
|
109
|
+
))))
|
|
110
|
+
})
|
|
111
|
+
.collect();
|
|
112
|
+
CallMapNode {
|
|
113
|
+
definition,
|
|
114
|
+
entries,
|
|
115
|
+
dispatch_class_name,
|
|
116
|
+
cycle: false,
|
|
117
|
+
truncated: false,
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
fn incoming_states<'a>(
|
|
122
|
+
target: &CallableStateKey,
|
|
123
|
+
callers: &'a IncomingCallers,
|
|
124
|
+
aggregate_dispatch: bool,
|
|
125
|
+
) -> Vec<&'a CallableState> {
|
|
126
|
+
let mut states = BTreeMap::new();
|
|
127
|
+
if aggregate_dispatch {
|
|
128
|
+
for ((definition_key, _), incoming) in callers {
|
|
129
|
+
if definition_key == &target.0 {
|
|
130
|
+
states.extend(incoming.iter().map(|(key, state)| (key.clone(), state)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} else if let Some(incoming) = callers.get(target) {
|
|
134
|
+
states.extend(incoming.iter().map(|(key, state)| (key.clone(), state)));
|
|
135
|
+
}
|
|
136
|
+
states.into_values().collect()
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
fn incoming_callers(index: &ProjectIndex) -> IncomingCallers {
|
|
140
|
+
let mut callers = IncomingCallers::new();
|
|
141
|
+
let mut method_cache = MethodCache::new();
|
|
142
|
+
for caller in callable_states(index, &mut method_cache) {
|
|
143
|
+
let Some(definition) = index.functions.get(&caller.definition_key) else {
|
|
144
|
+
continue;
|
|
145
|
+
};
|
|
146
|
+
for entry in call_entries(
|
|
147
|
+
definition,
|
|
148
|
+
caller.dispatch_class_key.as_deref(),
|
|
149
|
+
index,
|
|
150
|
+
&mut method_cache,
|
|
151
|
+
) {
|
|
152
|
+
let PendingEntry::Resolved(target) = entry else {
|
|
153
|
+
continue;
|
|
154
|
+
};
|
|
155
|
+
let target_key = (target.definition.key(), target.dispatch_class_key);
|
|
156
|
+
let caller_key = (
|
|
157
|
+
caller.definition_key.clone(),
|
|
158
|
+
caller.dispatch_class_key.clone(),
|
|
159
|
+
);
|
|
160
|
+
callers
|
|
161
|
+
.entry(target_key)
|
|
162
|
+
.or_default()
|
|
163
|
+
.insert(caller_key, caller.clone());
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
callers
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fn callable_states(index: &ProjectIndex, method_cache: &mut MethodCache) -> Vec<CallableState> {
|
|
170
|
+
let descendants = inheritance_descendants(index);
|
|
171
|
+
let mut states = BTreeMap::new();
|
|
172
|
+
for definition in index.functions.values() {
|
|
173
|
+
let Some(owner) = definition.owning_class.as_deref() else {
|
|
174
|
+
let state = CallableState {
|
|
175
|
+
definition_key: definition.key(),
|
|
176
|
+
dispatch_class_key: None,
|
|
177
|
+
};
|
|
178
|
+
states.insert((definition.key(), None), state);
|
|
179
|
+
continue;
|
|
180
|
+
};
|
|
181
|
+
let owner_key = build_class_key(&definition.module_name, owner);
|
|
182
|
+
for class_key in descendants.get(&owner_key).into_iter().flatten() {
|
|
183
|
+
let Some(class) = index.classes.get(class_key) else {
|
|
184
|
+
continue;
|
|
185
|
+
};
|
|
186
|
+
let resolved = method_definition(
|
|
187
|
+
class,
|
|
188
|
+
&definition.name,
|
|
189
|
+
index,
|
|
190
|
+
method_cache,
|
|
191
|
+
&mut BTreeSet::new(),
|
|
192
|
+
false,
|
|
193
|
+
);
|
|
194
|
+
if resolved.as_ref().map(FunctionDefinition::key) != Some(definition.key()) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
let dispatch_class_key = Some(class.key());
|
|
198
|
+
states.insert(
|
|
199
|
+
(definition.key(), dispatch_class_key.clone()),
|
|
200
|
+
CallableState {
|
|
201
|
+
definition_key: definition.key(),
|
|
202
|
+
dispatch_class_key,
|
|
203
|
+
},
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
states.into_values().collect()
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
fn inheritance_descendants(index: &ProjectIndex) -> BTreeMap<String, BTreeSet<String>> {
|
|
211
|
+
let mut descendants = index
|
|
212
|
+
.classes
|
|
213
|
+
.keys()
|
|
214
|
+
.map(|key| (key.clone(), BTreeSet::from([key.clone()])))
|
|
215
|
+
.collect::<BTreeMap<_, _>>();
|
|
216
|
+
for class_key in index.classes.keys() {
|
|
217
|
+
let mut ancestors = BTreeSet::new();
|
|
218
|
+
collect_class_ancestors(
|
|
219
|
+
class_key,
|
|
220
|
+
index,
|
|
221
|
+
&mut BTreeSet::new(),
|
|
222
|
+
&mut ancestors,
|
|
223
|
+
);
|
|
224
|
+
for ancestor in ancestors {
|
|
225
|
+
descendants
|
|
226
|
+
.entry(ancestor)
|
|
227
|
+
.or_default()
|
|
228
|
+
.insert(class_key.clone());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
descendants
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
fn collect_class_ancestors(
|
|
235
|
+
class_key: &str,
|
|
236
|
+
index: &ProjectIndex,
|
|
237
|
+
active: &mut BTreeSet<String>,
|
|
238
|
+
ancestors: &mut BTreeSet<String>,
|
|
239
|
+
) {
|
|
240
|
+
if !active.insert(class_key.to_owned()) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if let Some(class) = index.classes.get(class_key) {
|
|
244
|
+
for base_key in &class.base_keys {
|
|
245
|
+
if index.classes.contains_key(base_key) && ancestors.insert(base_key.clone()) {
|
|
246
|
+
collect_class_ancestors(base_key, index, active, ancestors);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
active.remove(class_key);
|
|
251
|
+
}
|
|
252
|
+
|
|
35
253
|
fn build_node(
|
|
36
254
|
definition: FunctionDefinition,
|
|
37
255
|
dispatch_class_key: Option<String>,
|
|
@@ -416,7 +634,10 @@ fn method_definition(
|
|
|
416
634
|
) -> Option<FunctionDefinition> {
|
|
417
635
|
let cache_key = (class.key(), method_name.to_owned(), exclude_protocol_bases);
|
|
418
636
|
if let Some(cached) = cache.get(&cache_key) {
|
|
419
|
-
return cached
|
|
637
|
+
return cached
|
|
638
|
+
.as_deref()
|
|
639
|
+
.and_then(|key| index.functions.get(key))
|
|
640
|
+
.cloned();
|
|
420
641
|
}
|
|
421
642
|
let active_key = (class.key(), method_name.to_owned());
|
|
422
643
|
if !active.insert(active_key.clone()) {
|
|
@@ -424,11 +645,11 @@ fn method_definition(
|
|
|
424
645
|
}
|
|
425
646
|
let direct_key = build_function_key(&class.module_name, method_name, Some(&class.name));
|
|
426
647
|
if let Some(direct) = index.functions.get(&direct_key).cloned() {
|
|
427
|
-
cache.insert(cache_key, Some(
|
|
648
|
+
cache.insert(cache_key, Some(direct_key));
|
|
428
649
|
active.remove(&active_key);
|
|
429
650
|
return Some(direct);
|
|
430
651
|
}
|
|
431
|
-
let mut candidates =
|
|
652
|
+
let mut candidates = BTreeSet::new();
|
|
432
653
|
for base in &class.bases {
|
|
433
654
|
let owner = class_as_function(class);
|
|
434
655
|
let Some(base_class) = resolve_class_expression(base, &owner, index, false) else {
|
|
@@ -445,15 +666,15 @@ fn method_definition(
|
|
|
445
666
|
active,
|
|
446
667
|
exclude_protocol_bases,
|
|
447
668
|
) {
|
|
448
|
-
candidates.insert(inherited.key()
|
|
669
|
+
candidates.insert(inherited.key());
|
|
449
670
|
}
|
|
450
671
|
}
|
|
451
672
|
active.remove(&active_key);
|
|
452
|
-
let
|
|
453
|
-
.then(|| candidates.
|
|
673
|
+
let result_key = (candidates.len() == 1)
|
|
674
|
+
.then(|| candidates.into_iter().next())
|
|
454
675
|
.flatten();
|
|
455
|
-
cache.insert(cache_key,
|
|
456
|
-
|
|
676
|
+
cache.insert(cache_key, result_key.clone());
|
|
677
|
+
result_key.and_then(|key| index.functions.get(&key).cloned())
|
|
457
678
|
}
|
|
458
679
|
|
|
459
680
|
fn resolve_class_expression(
|
|
@@ -184,6 +184,13 @@ pub(crate) enum PathMode {
|
|
|
184
184
|
None,
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
+
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
|
188
|
+
pub(crate) enum MapDirection {
|
|
189
|
+
#[default]
|
|
190
|
+
Downstream,
|
|
191
|
+
Upstream,
|
|
192
|
+
}
|
|
193
|
+
|
|
187
194
|
#[derive(Clone, Copy, Debug, Default)]
|
|
188
195
|
pub(crate) struct MapCacheStats {
|
|
189
196
|
pub(crate) manifest_hit: bool,
|
|
@@ -197,6 +204,7 @@ pub(crate) struct MapCacheStats {
|
|
|
197
204
|
#[derive(Debug)]
|
|
198
205
|
pub(crate) struct MapOptions {
|
|
199
206
|
pub(crate) symbol: String,
|
|
207
|
+
pub(crate) direction: MapDirection,
|
|
200
208
|
pub(crate) depth: usize,
|
|
201
209
|
pub(crate) roots: Vec<String>,
|
|
202
210
|
pub(crate) path_mode: PathMode,
|
{fensu_cli-0.4.0 → fensu_cli-0.4.1}/crates/fensu-cli/src/skills/helpers/content/rendering.rs
RENAMED
|
@@ -47,7 +47,7 @@ pub(crate) fn generate(context: &SkillContext) -> Result<String, String> {
|
|
|
47
47
|
String::new(),
|
|
48
48
|
"- Run `fensu check` after architecture-relevant changes.".to_owned(),
|
|
49
49
|
"- Run `fensu rule <CODE>` to inspect a diagnostic and its remediation.".to_owned(),
|
|
50
|
-
"- Run `fensu map <SYMBOL>` for
|
|
50
|
+
"- Run `fensu map <SYMBOL>` for proven callees, or add `--direction upstream` for proven callers.".to_owned(),
|
|
51
51
|
"- Run `fensu skills` after changing rule selection or custom rules.".to_owned(),
|
|
52
52
|
String::new(),
|
|
53
53
|
];
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
use std::fs;
|
|
2
2
|
|
|
3
|
-
use crate::helpers::{
|
|
3
|
+
use crate::helpers::{
|
|
4
|
+
ambiguous_protocol_project, basic_project, method_project, run, run_colored,
|
|
5
|
+
sibling_method_project, text, write, write_bytes,
|
|
6
|
+
};
|
|
4
7
|
|
|
5
8
|
#[test]
|
|
6
9
|
fn given_native_map_when_python_is_missing_then_direct_calls_cycles_and_depth_are_deterministic() {
|
|
@@ -15,16 +18,163 @@ fn given_native_map_when_python_is_missing_then_direct_calls_cycles_and_depth_ar
|
|
|
15
18
|
repository.path(),
|
|
16
19
|
&["pkg.entry.run", "--depth", "3", "--no-cache"],
|
|
17
20
|
);
|
|
21
|
+
let explicit = run(
|
|
22
|
+
repository.path(),
|
|
23
|
+
&[
|
|
24
|
+
"pkg.entry.run",
|
|
25
|
+
"--direction",
|
|
26
|
+
"downstream",
|
|
27
|
+
"--depth",
|
|
28
|
+
"3",
|
|
29
|
+
"--no-cache",
|
|
30
|
+
],
|
|
31
|
+
);
|
|
18
32
|
let stdout = text(&first.stdout);
|
|
19
33
|
|
|
20
34
|
assert_eq!(first.status.code(), Some(0), "{}", text(&first.stderr));
|
|
21
35
|
assert_eq!(first.stdout, second.stdout);
|
|
36
|
+
assert_eq!(first.stdout, explicit.stdout);
|
|
22
37
|
assert!(stdout.ends_with('\n'));
|
|
23
38
|
assert!(stdout.contains("step(...) src/pkg/steps.py:3"));
|
|
24
39
|
assert!(stdout.contains("callback(...) src/pkg/entry.py:5 (unresolved parameter call)"));
|
|
25
40
|
assert!(stdout.contains("run(...) src/pkg/entry.py:3 (cycle)"));
|
|
26
41
|
}
|
|
27
42
|
|
|
43
|
+
#[test]
|
|
44
|
+
fn given_upstream_direction_when_mapping_then_proven_callers_cycles_and_depth_are_deterministic() {
|
|
45
|
+
let repository = tempfile::tempdir().expect("temporary repository");
|
|
46
|
+
basic_project(repository.path());
|
|
47
|
+
|
|
48
|
+
let output = run(
|
|
49
|
+
repository.path(),
|
|
50
|
+
&[
|
|
51
|
+
"pkg.steps.step",
|
|
52
|
+
"--direction",
|
|
53
|
+
"upstream",
|
|
54
|
+
"--depth",
|
|
55
|
+
"3",
|
|
56
|
+
"--no-cache",
|
|
57
|
+
],
|
|
58
|
+
);
|
|
59
|
+
let stdout = text(&output.stdout);
|
|
60
|
+
|
|
61
|
+
assert_eq!(output.status.code(), Some(0), "{}", text(&output.stderr));
|
|
62
|
+
assert_eq!(
|
|
63
|
+
stdout,
|
|
64
|
+
"step(...) src/pkg/steps.py:3\n└── run(...) src/pkg/entry.py:3\n └── finish(...) src/pkg/finish.py:3\n └── step(...) src/pkg/steps.py:3 (cycle)\n"
|
|
65
|
+
);
|
|
66
|
+
assert!(!stdout.contains("callback"));
|
|
67
|
+
|
|
68
|
+
let limited = run(
|
|
69
|
+
repository.path(),
|
|
70
|
+
&[
|
|
71
|
+
"pkg.steps.step",
|
|
72
|
+
"--direction",
|
|
73
|
+
"upstream",
|
|
74
|
+
"--depth",
|
|
75
|
+
"1",
|
|
76
|
+
"--no-cache",
|
|
77
|
+
],
|
|
78
|
+
);
|
|
79
|
+
assert!(text(&limited.stdout).contains("run(...) src/pkg/entry.py:3 (depth limit)"));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
#[test]
|
|
83
|
+
fn given_inherited_method_dispatch_when_mapping_upstream_then_concrete_callers_are_preserved() {
|
|
84
|
+
let repository = tempfile::tempdir().expect("temporary repository");
|
|
85
|
+
method_project(repository.path());
|
|
86
|
+
|
|
87
|
+
let output = run(
|
|
88
|
+
repository.path(),
|
|
89
|
+
&[
|
|
90
|
+
"methods.workers.Worker.hook",
|
|
91
|
+
"--direction",
|
|
92
|
+
"upstream",
|
|
93
|
+
"--depth",
|
|
94
|
+
"3",
|
|
95
|
+
"--no-cache",
|
|
96
|
+
],
|
|
97
|
+
);
|
|
98
|
+
let stdout = text(&output.stdout);
|
|
99
|
+
|
|
100
|
+
assert_eq!(output.status.code(), Some(0), "{}", text(&output.stderr));
|
|
101
|
+
assert!(stdout.contains("Worker.hook(...)"));
|
|
102
|
+
assert!(stdout.contains("Worker.run(...)"));
|
|
103
|
+
assert!(stdout.contains("Worker.execute(...)"));
|
|
104
|
+
assert!(stdout.contains("run(...) src/methods/entry.py:4"));
|
|
105
|
+
assert!(!stdout.contains("dynamic.execute"));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#[test]
|
|
109
|
+
fn given_sibling_method_dispatch_when_mapping_upstream_then_callers_do_not_cross_subclasses() {
|
|
110
|
+
let repository = tempfile::tempdir().expect("temporary repository");
|
|
111
|
+
sibling_method_project(repository.path());
|
|
112
|
+
|
|
113
|
+
let output = run(
|
|
114
|
+
repository.path(),
|
|
115
|
+
&[
|
|
116
|
+
"siblings.workers.ChildA.hook",
|
|
117
|
+
"--direction",
|
|
118
|
+
"upstream",
|
|
119
|
+
"--depth",
|
|
120
|
+
"2",
|
|
121
|
+
"--no-cache",
|
|
122
|
+
],
|
|
123
|
+
);
|
|
124
|
+
let stdout = text(&output.stdout);
|
|
125
|
+
|
|
126
|
+
assert_eq!(output.status.code(), Some(0), "{}", text(&output.stderr));
|
|
127
|
+
assert!(stdout.contains("ChildA.run(...)"));
|
|
128
|
+
assert!(stdout.contains("call_a(...)"));
|
|
129
|
+
assert!(!stdout.contains("ChildB.run(...)"));
|
|
130
|
+
assert!(!stdout.contains("call_b(...)"));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
#[test]
|
|
134
|
+
fn given_unique_protocol_dispatch_when_mapping_upstream_then_proven_protocol_caller_is_included() {
|
|
135
|
+
let repository = tempfile::tempdir().expect("temporary repository");
|
|
136
|
+
method_project(repository.path());
|
|
137
|
+
|
|
138
|
+
let output = run(
|
|
139
|
+
repository.path(),
|
|
140
|
+
&[
|
|
141
|
+
"methods.workers.Worker.execute",
|
|
142
|
+
"--direction",
|
|
143
|
+
"upstream",
|
|
144
|
+
"--depth",
|
|
145
|
+
"1",
|
|
146
|
+
"--no-cache",
|
|
147
|
+
],
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
assert_eq!(output.status.code(), Some(0), "{}", text(&output.stderr));
|
|
151
|
+
assert!(text(&output.stdout).contains("run_protocol(...)"));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#[test]
|
|
155
|
+
fn given_ambiguous_protocol_dispatch_when_mapping_upstream_then_caller_is_not_invented() {
|
|
156
|
+
let repository = tempfile::tempdir().expect("temporary repository");
|
|
157
|
+
ambiguous_protocol_project(repository.path());
|
|
158
|
+
|
|
159
|
+
let output = run(
|
|
160
|
+
repository.path(),
|
|
161
|
+
&[
|
|
162
|
+
"protocols.workers.First.execute",
|
|
163
|
+
"--direction",
|
|
164
|
+
"upstream",
|
|
165
|
+
"--depth",
|
|
166
|
+
"2",
|
|
167
|
+
"--no-cache",
|
|
168
|
+
],
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
assert_eq!(output.status.code(), Some(0), "{}", text(&output.stderr));
|
|
172
|
+
assert_eq!(
|
|
173
|
+
text(&output.stdout),
|
|
174
|
+
"First.execute(...) src/protocols/workers.py:4\n"
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
28
178
|
#[test]
|
|
29
179
|
fn given_selector_forms_when_mapping_then_full_partial_path_and_ambiguity_match_contract() {
|
|
30
180
|
let repository = tempfile::tempdir().expect("temporary repository");
|
|
@@ -239,10 +389,11 @@ fn given_map_help_and_invalid_arguments_when_parsing_then_argparse_surface_is_pr
|
|
|
239
389
|
let help = run(repository.path(), &["--help"]);
|
|
240
390
|
assert_eq!(help.status.code(), Some(0));
|
|
241
391
|
assert!(text(&help.stdout).contains("--cache | --no-cache"));
|
|
392
|
+
assert!(text(&help.stdout).contains("--direction {downstream,upstream}"));
|
|
242
393
|
for arguments in [
|
|
243
394
|
vec![],
|
|
244
395
|
vec!["run", "--depth", "-1"],
|
|
245
|
-
vec!["run", "--direction", "
|
|
396
|
+
vec!["run", "--direction", "sideways"],
|
|
246
397
|
vec!["run", "--cache", "--no-cache"],
|
|
247
398
|
] {
|
|
248
399
|
let output = run(repository.path(), &arguments);
|
|
@@ -66,7 +66,35 @@ pub(crate) fn method_project(root: &Path) {
|
|
|
66
66
|
);
|
|
67
67
|
write(
|
|
68
68
|
root.join("src/methods/entry.py"),
|
|
69
|
-
"from methods.contracts import Runner\nfrom methods.workers import Worker, make\n\ndef run(runner: Runner, dynamic) -> None:\n worker = Worker()\n worker.execute()\n make().execute()\n runner.execute()\n dynamic.execute()\n",
|
|
69
|
+
"from methods.contracts import Runner\nfrom methods.workers import Worker, make\n\ndef run(runner: Runner, dynamic) -> None:\n worker = Worker()\n worker.execute()\n make().execute()\n runner.execute()\n dynamic.execute()\n\ndef run_protocol(runner: Runner) -> None:\n runner.execute()\n",
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
pub(crate) fn sibling_method_project(root: &Path) {
|
|
74
|
+
write(root.join("fensu.toml"), "roots = [\"src/siblings\"]\n");
|
|
75
|
+
write(
|
|
76
|
+
root.join("src/siblings/workers.py"),
|
|
77
|
+
"class Base:\n def run(self) -> None:\n self.hook()\n\nclass ChildA(Base):\n def hook(self) -> None:\n return None\n\nclass ChildB(Base):\n def hook(self) -> None:\n return None\n",
|
|
78
|
+
);
|
|
79
|
+
write(
|
|
80
|
+
root.join("src/siblings/entry.py"),
|
|
81
|
+
"from siblings.workers import ChildA, ChildB\n\ndef call_a() -> None:\n ChildA().run()\n\ndef call_b() -> None:\n ChildB().run()\n",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
pub(crate) fn ambiguous_protocol_project(root: &Path) {
|
|
86
|
+
write(root.join("fensu.toml"), "roots = [\"src/protocols\"]\n");
|
|
87
|
+
write(
|
|
88
|
+
root.join("src/protocols/contracts.py"),
|
|
89
|
+
"from typing import Protocol\n\nclass Runner(Protocol):\n def execute(self) -> None:\n ...\n",
|
|
90
|
+
);
|
|
91
|
+
write(
|
|
92
|
+
root.join("src/protocols/workers.py"),
|
|
93
|
+
"from protocols.contracts import Runner\n\nclass First(Runner):\n def execute(self) -> None:\n return None\n\nclass Second(Runner):\n def execute(self) -> None:\n return None\n",
|
|
94
|
+
);
|
|
95
|
+
write(
|
|
96
|
+
root.join("src/protocols/entry.py"),
|
|
97
|
+
"from protocols.contracts import Runner\n\ndef run(runner: Runner) -> None:\n runner.execute()\n",
|
|
70
98
|
);
|
|
71
99
|
}
|
|
72
100
|
|