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
63 lines
2.6 KiB
TOML
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"]
|