Files
wildminder-ComfyUI-KEEP/pyproject.toml
T
WildAi fcbfcce3a6 plan(P3): address review findings
Five review findings of the P3 phase, each fixed at its root:

1. (medium) The P3.7 metadata test imported `tomllib` at module level: the
   **3.10 CI job** (the declared `requires-python >=3.10` minimum) died
   during collection, so the registry-metadata assertions never ran on 3.10.
   The parser import is now guarded (`tomllib` -> `tomli`, the package the
   3.10 job installs); without any parser the module *skips* instead of
   dying. `pyproject.toml` gained the test extra
   `tomli>=2.0; python_version < '3.11'`.
   Proof: a 3.10 simulation (the stdlib `tomllib` refused for the test
   module, `tomli` on sys.path) -> 6 passed; the control without `tomli`
   -> 6 skipped (no collection error).

2. (medium) The P3.5 "primary-root-first multi-root" resolution was not
   wired into the production load path: `resolve_model_file` (the only
   `get_full_path_or_raise` caller) was used by tests only, so a weight in
   a secondary model root was downloaded into the primary root again.
   `src/keep_paths.py` now has `find_model_file()` (the multi-root lookup
   through `folder_paths.get_full_path_or_raise`) and `resolve_model_root()`
   (the root the weights really live in); `load_file_from_url_comfy()` - the
   production path of `src/keep_model_loader.py:107` - uses the lookup, and
   the facelib root follows the weights (the facelib helper builds its
   paths from a single root). New tests prove that the production path
   uses a weight of an extra model root and that the primary root wins.
   The `models_dir` grep guard is no longer a blanket exemption: only the
   registration in `src/keep_paths.py` may use the attribute.

3. (low) `[tool.comfy].Icon` was an empty string and the test only checked
   that the key exists. The preview asset **is** committed
   (`git cat-file -s HEAD:assets/keep-preview.png` -> 93279 bytes); only the
   working copy was missing (an uncommitted local deletion, restored from
   HEAD - no asset change is in this commit). The key now points at
   `assets/keep-preview.png` and the test asserts that the value is not
   empty and names a file that is really in the repository.

4. (low) `tests/test_package_entrypoint.py` hard-coded the V1 state and
   would have gone red (not xfail) when P4.4 flips the root `__init__.py`
   to `comfy_entrypoint`. The assertions now follow the entry point that is
   really there: exactly **one** mapping style (V1 XOR V3). The mocked
   smoke test of `tests/test_package_import.py` got the same treatment; the
   headless variant is P4.4's job (its test list names it).

5. (low) The plan's §3 rule ("`comfy.*` imports inside `src/` are lazy
   (function-level) so the pack imports without a ComfyUI server") was
   violated and unguarded. The `comfy` imports of `src/keep_model_loader.py`
   and `src/keep_processor.py` are function-level now; the vendored facelib
   helper (which imports `comfy` itself) is imported lazily through a module
   `__getattr__` (PEP 562), so `loader.FaceRestoreHelper` still resolves to
   the vendored class. Structure **guard (f)** (`tests/test_structure.py`)
   forbids a module-level `comfy`/`comfy_api` import in `src/**` (with the
   self-test the guards file demands), and the new
   `tests/test_lazy_imports.py` proves at runtime that the engines import
   while every `comfy` import is blocked.

Gate after the commit:
  python.exe -m pytest -q tests -m "unit or mock_integration"
    -> 153 passed, 1 skipped, 5 deselected, 3 xfailed
  COMFYUI_ROOT=C:/_Dev/ComfyUI_dev/ComfyUI-source/ComfyUI python.exe
    -m pytest -q tests -m "unit or mock_integration or headless"
    -> 158 passed, 1 skipped, 3 xfailed

Details: docs/2026-10-23-p3-review-findings.md
2026-10-23 20:34:51 +03:00

63 lines
2.6 KiB
TOML

[project]
name = "ComfyUI-KEEP"
description = "Kalman-Inspired Feature Propagation for Video Face Super-Resolution"
version = "2.0.0"
license = {file = "LICENSE"}
requires-python = ">=3.10"
# The true runtime set of the pack (P2.6) - it is derived from the pruned
# runtime closure of the vendored tree and matches requirements.txt.
dependencies = ["torch", "torchvision", "numpy", "opencv-python", "Pillow", "einops", "scipy", "tqdm", "pyyaml", "requests"]
# The test-only dependencies. ``tomli`` is the ``tomllib`` parser of
# Python 3.10 (the minimum of ``requires-python``) - the metadata test
# imports it when the standard library has no ``tomllib`` yet.
[project.optional-dependencies]
test = ["tomli>=2.0; python_version < '3.11'"]
[project.urls]
Repository = "https://github.com/wildminder/ComfyUI-KEEP"
# Used by Comfy Registry https://comfyregistry.org
[tool.comfy]
PublisherId = "wildai"
DisplayName = "KEEP"
# The preview asset of the registry entry. The file is committed in the
# repository (``assets/keep-preview.png``); P6.5 may replace the image, but
# the key must keep pointing at a file that exists.
Icon = "assets/keep-preview.png"
requires-comfyui = ">=0.28.0"
# P1.1 - pytest harness configuration.
# The four markers are the tiers of the modernization plan (section 4):
# unit - pure logic, no ComfyUI dependency
# mock_integration - node execute paths against the root conftest mocks
# headless - real ComfyUI source tree on sys.path, no server
# gpu_acceptance - opt-in real-weight run (RUN_KEEP_E2E + KEEP_MODEL_DIR)
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-v --tb=short --import-mode=importlib"
consider_namespace_packages = true
pythonpath = ["."]
markers = [
"unit: Pure unit test (no ComfyUI dependency)",
"mock_integration: Mock-based integration test (node execute paths against the conftest mocks)",
"headless: Requires the real ComfyUI source tree on sys.path (no server)",
"gpu_acceptance: Opt-in real-weight run (RUN_KEEP_E2E=1 and KEEP_MODEL_DIR)",
]
# P1.5 - the lint gate of .github/workflows/tests.yml.
# Scope decision (same as the reference pack ComfyUI-DyPE): the gate covers the
# *correctness* rules (pyflakes F + syntax errors E9). The vendored
# third-party tree (modules/deps) is excluded - it is upstream code, not ours.
[tool.ruff]
target-version = "py310"
line-length = 120
extend-exclude = ["modules/deps"]
[tool.ruff.lint]
select = ["E9", "F"]
# F401 (unused import) and F541 (f-string without placeholders) are style
# findings in the *existing* production code; they are cleaned up in the
# production phases (P4.7), not in the test-infrastructure phase.
ignore = ["F401", "F541"]