comfy-test 0.0.6__tar.gz → 0.0.36__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.
- comfy_test-0.0.36/.github/workflows/publish.yml +74 -0
- comfy_test-0.0.36/.github/workflows/test-matrix-local.yml +236 -0
- comfy_test-0.0.36/.github/workflows/test-matrix.yml +218 -0
- comfy_test-0.0.6/pyproject.toml → comfy_test-0.0.36/.ipynb_checkpoints/pyproject-checkpoint.toml +1 -1
- {comfy_test-0.0.6 → comfy_test-0.0.36}/PKG-INFO +80 -2
- {comfy_test-0.0.6 → comfy_test-0.0.36}/README.md +76 -1
- comfy_test-0.0.36/bin/act +0 -0
- comfy_test-0.0.36/pyproject.toml +49 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/__init__.py +5 -1
- comfy_test-0.0.36/src/comfy_test/cli.py +617 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/api.py +18 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/server.py +62 -5
- comfy_test-0.0.36/src/comfy_test/comfyui/validator.py +616 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/workflow.py +58 -15
- comfy_test-0.0.36/src/comfy_test/comfyui/workflow_converter.py +1313 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/errors.py +11 -0
- comfy_test-0.0.36/src/comfy_test/screenshot.py +468 -0
- comfy_test-0.0.36/src/comfy_test/screenshot_cache.py +332 -0
- comfy_test-0.0.36/src/comfy_test/test/comfy_env.py +75 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/config.py +100 -10
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/config_file.py +87 -27
- comfy_test-0.0.36/src/comfy_test/test/manager.py +1000 -0
- comfy_test-0.0.36/src/comfy_test/test/node_discovery.py +231 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/__init__.py +5 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/base.py +18 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/linux.py +73 -9
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/windows.py +65 -6
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/windows_portable.py +78 -5
- comfy_test-0.0.6/.github/workflows/publish.yml +0 -30
- comfy_test-0.0.6/.github/workflows/test-matrix.yml +0 -99
- comfy_test-0.0.6/CLAUDE.md +0 -58
- comfy_test-0.0.6/examples/basic_node/comfy-test.toml +0 -11
- comfy_test-0.0.6/src/comfy_test/cli.py +0 -277
- comfy_test-0.0.6/src/comfy_test/test/manager.py +0 -197
- {comfy_test-0.0.6 → comfy_test-0.0.36}/.gitignore +0 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/LICENSE +0 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/__init__.py +0 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/github/__init__.py +0 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/runner.py +0 -0
- {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/__init__.py +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: Bump Version & Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
workflow_call:
|
|
9
|
+
inputs:
|
|
10
|
+
python-version:
|
|
11
|
+
description: 'Python version to use'
|
|
12
|
+
required: false
|
|
13
|
+
default: '3.10'
|
|
14
|
+
type: string
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
bump-and-publish:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
environment: pypi
|
|
20
|
+
permissions:
|
|
21
|
+
contents: write
|
|
22
|
+
id-token: write
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
27
|
+
|
|
28
|
+
- name: Setup Python
|
|
29
|
+
uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ inputs.python-version || '3.10' }}
|
|
32
|
+
|
|
33
|
+
- name: Get current version
|
|
34
|
+
id: get_version
|
|
35
|
+
run: |
|
|
36
|
+
current=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/' | tr -d '\r')
|
|
37
|
+
echo "current=$current" >> $GITHUB_OUTPUT
|
|
38
|
+
|
|
39
|
+
- name: Bump patch version
|
|
40
|
+
id: bump_version
|
|
41
|
+
run: |
|
|
42
|
+
current="${{ steps.get_version.outputs.current }}"
|
|
43
|
+
IFS='.' read -r major minor patch <<< "$current"
|
|
44
|
+
new_patch=$((patch + 1))
|
|
45
|
+
new_version="${major}.${minor}.${new_patch}"
|
|
46
|
+
sed -i "s/^version = \".*\"/version = \"${new_version}\"/" pyproject.toml
|
|
47
|
+
echo "new_version=$new_version" >> $GITHUB_OUTPUT
|
|
48
|
+
echo "Bumped version: $current -> $new_version"
|
|
49
|
+
|
|
50
|
+
- name: Commit version bump
|
|
51
|
+
run: |
|
|
52
|
+
git config user.name "github-actions[bot]"
|
|
53
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
54
|
+
git add pyproject.toml
|
|
55
|
+
git commit -m "Bump version to ${{ steps.bump_version.outputs.new_version }} [skip ci]"
|
|
56
|
+
git tag "v${{ steps.bump_version.outputs.new_version }}"
|
|
57
|
+
git push origin main --tags
|
|
58
|
+
|
|
59
|
+
- name: Install build tools
|
|
60
|
+
run: pip install build
|
|
61
|
+
|
|
62
|
+
- name: Build package
|
|
63
|
+
run: python -m build
|
|
64
|
+
|
|
65
|
+
- name: Create GitHub Release
|
|
66
|
+
uses: softprops/action-gh-release@v1
|
|
67
|
+
with:
|
|
68
|
+
tag_name: v${{ steps.bump_version.outputs.new_version }}
|
|
69
|
+
name: v${{ steps.bump_version.outputs.new_version }}
|
|
70
|
+
generate_release_notes: true
|
|
71
|
+
files: dist/*
|
|
72
|
+
|
|
73
|
+
- name: Publish to PyPI
|
|
74
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# LOCAL VERSION - For testing with act
|
|
2
|
+
# This file has local mount overrides for comfy-test and comfy-env
|
|
3
|
+
# Use test-matrix.yml for GitHub Actions CI
|
|
4
|
+
|
|
5
|
+
name: ComfyUI Installation Test Matrix (Local)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
workflow_call:
|
|
9
|
+
inputs:
|
|
10
|
+
node-path:
|
|
11
|
+
description: "Path to custom node directory"
|
|
12
|
+
type: string
|
|
13
|
+
default: "."
|
|
14
|
+
config-file:
|
|
15
|
+
description: "Path to comfy-test.toml config file"
|
|
16
|
+
type: string
|
|
17
|
+
default: "comfy-test.toml"
|
|
18
|
+
python-version:
|
|
19
|
+
description: "Python version for testing"
|
|
20
|
+
type: string
|
|
21
|
+
default: "3.10"
|
|
22
|
+
comfy-test-ref:
|
|
23
|
+
description: "Git ref for comfy-test (branch, tag, or SHA)"
|
|
24
|
+
type: string
|
|
25
|
+
default: "main"
|
|
26
|
+
timeout-minutes:
|
|
27
|
+
description: "Job timeout in minutes (default: 60)"
|
|
28
|
+
type: number
|
|
29
|
+
default: 60
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
test-linux:
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
35
|
+
steps:
|
|
36
|
+
- name: Free disk space
|
|
37
|
+
run: |
|
|
38
|
+
sudo rm -rf /usr/share/dotnet &
|
|
39
|
+
sudo rm -rf /usr/local/lib/android &
|
|
40
|
+
sudo rm -rf /opt/ghc &
|
|
41
|
+
sudo rm -rf /opt/hostedtoolcache/CodeQL &
|
|
42
|
+
sudo apt-get clean &
|
|
43
|
+
wait
|
|
44
|
+
|
|
45
|
+
- name: Checkout node
|
|
46
|
+
uses: actions/checkout@v4
|
|
47
|
+
|
|
48
|
+
- name: Checkout comfy-test
|
|
49
|
+
if: ${{ !env.COMFY_TEST_LOCAL }}
|
|
50
|
+
uses: actions/checkout@v4
|
|
51
|
+
with:
|
|
52
|
+
repository: PozzettiAndrea/comfy-test
|
|
53
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
54
|
+
path: .comfy-test-src
|
|
55
|
+
|
|
56
|
+
- name: Setup Python
|
|
57
|
+
uses: actions/setup-python@v5
|
|
58
|
+
with:
|
|
59
|
+
python-version: ${{ inputs.python-version }}
|
|
60
|
+
|
|
61
|
+
- name: Install uv
|
|
62
|
+
run: pip install uv
|
|
63
|
+
|
|
64
|
+
- name: Install comfy-test
|
|
65
|
+
run: |
|
|
66
|
+
if [ -d "/local-comfy-test" ]; then
|
|
67
|
+
echo "Installing comfy-test from local mount: /local-comfy-test"
|
|
68
|
+
pip install /local-comfy-test
|
|
69
|
+
else
|
|
70
|
+
pip install ./.comfy-test-src
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
- name: Install local comfy-env
|
|
74
|
+
run: |
|
|
75
|
+
if [ -d "/local-comfy-env" ]; then
|
|
76
|
+
echo "Installing comfy-env from local mount: /local-comfy-env"
|
|
77
|
+
pip install /local-comfy-env
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
- name: Syntax
|
|
81
|
+
id: syntax
|
|
82
|
+
run: comfy-test run --platform linux --only-level syntax -c ${{ inputs.config-file }}
|
|
83
|
+
|
|
84
|
+
- name: Install
|
|
85
|
+
id: install
|
|
86
|
+
if: always()
|
|
87
|
+
run: comfy-test run --platform linux --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
88
|
+
|
|
89
|
+
- name: Registration
|
|
90
|
+
id: registration
|
|
91
|
+
if: always() && steps.install.outcome == 'success'
|
|
92
|
+
run: comfy-test run --platform linux --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
93
|
+
|
|
94
|
+
- name: Instantiation
|
|
95
|
+
id: instantiation
|
|
96
|
+
if: always() && steps.install.outcome == 'success'
|
|
97
|
+
run: comfy-test run --platform linux --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
98
|
+
|
|
99
|
+
- name: Validation
|
|
100
|
+
id: validation
|
|
101
|
+
if: always() && steps.install.outcome == 'success'
|
|
102
|
+
run: comfy-test run --platform linux --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
103
|
+
|
|
104
|
+
- name: Execution
|
|
105
|
+
id: execution
|
|
106
|
+
if: always() && steps.install.outcome == 'success'
|
|
107
|
+
run: comfy-test run --platform linux --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
108
|
+
|
|
109
|
+
- name: Upload logs
|
|
110
|
+
if: always()
|
|
111
|
+
uses: actions/upload-artifact@v4
|
|
112
|
+
with:
|
|
113
|
+
name: test-logs-linux
|
|
114
|
+
path: .comfy-test/
|
|
115
|
+
if-no-files-found: ignore
|
|
116
|
+
|
|
117
|
+
test-windows:
|
|
118
|
+
runs-on: windows-latest
|
|
119
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
120
|
+
steps:
|
|
121
|
+
- name: Checkout node
|
|
122
|
+
uses: actions/checkout@v4
|
|
123
|
+
|
|
124
|
+
- name: Checkout comfy-test
|
|
125
|
+
uses: actions/checkout@v4
|
|
126
|
+
with:
|
|
127
|
+
repository: PozzettiAndrea/comfy-test
|
|
128
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
129
|
+
path: .comfy-test-src
|
|
130
|
+
|
|
131
|
+
- name: Setup Python
|
|
132
|
+
uses: actions/setup-python@v5
|
|
133
|
+
with:
|
|
134
|
+
python-version: ${{ inputs.python-version }}
|
|
135
|
+
|
|
136
|
+
- name: Install uv
|
|
137
|
+
run: pip install uv
|
|
138
|
+
|
|
139
|
+
- name: Install comfy-test
|
|
140
|
+
run: pip install ./.comfy-test-src
|
|
141
|
+
|
|
142
|
+
- name: Syntax
|
|
143
|
+
id: syntax
|
|
144
|
+
run: comfy-test run --platform windows --only-level syntax -c ${{ inputs.config-file }}
|
|
145
|
+
|
|
146
|
+
- name: Install
|
|
147
|
+
id: install
|
|
148
|
+
if: always()
|
|
149
|
+
run: comfy-test run --platform windows --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
150
|
+
|
|
151
|
+
- name: Registration
|
|
152
|
+
id: registration
|
|
153
|
+
if: always() && steps.install.outcome == 'success'
|
|
154
|
+
run: comfy-test run --platform windows --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
155
|
+
|
|
156
|
+
- name: Instantiation
|
|
157
|
+
id: instantiation
|
|
158
|
+
if: always() && steps.install.outcome == 'success'
|
|
159
|
+
run: comfy-test run --platform windows --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
160
|
+
|
|
161
|
+
- name: Validation
|
|
162
|
+
id: validation
|
|
163
|
+
if: always() && steps.install.outcome == 'success'
|
|
164
|
+
run: comfy-test run --platform windows --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
165
|
+
|
|
166
|
+
- name: Execution
|
|
167
|
+
id: execution
|
|
168
|
+
if: always() && steps.install.outcome == 'success'
|
|
169
|
+
run: comfy-test run --platform windows --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
170
|
+
|
|
171
|
+
- name: Upload logs
|
|
172
|
+
if: always()
|
|
173
|
+
uses: actions/upload-artifact@v4
|
|
174
|
+
with:
|
|
175
|
+
name: test-logs-windows
|
|
176
|
+
path: .comfy-test/
|
|
177
|
+
if-no-files-found: ignore
|
|
178
|
+
|
|
179
|
+
test-windows-portable:
|
|
180
|
+
runs-on: windows-latest
|
|
181
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
182
|
+
steps:
|
|
183
|
+
- name: Checkout node
|
|
184
|
+
uses: actions/checkout@v4
|
|
185
|
+
|
|
186
|
+
- name: Checkout comfy-test
|
|
187
|
+
uses: actions/checkout@v4
|
|
188
|
+
with:
|
|
189
|
+
repository: PozzettiAndrea/comfy-test
|
|
190
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
191
|
+
path: .comfy-test-src
|
|
192
|
+
|
|
193
|
+
- name: Setup Python
|
|
194
|
+
uses: actions/setup-python@v5
|
|
195
|
+
with:
|
|
196
|
+
python-version: ${{ inputs.python-version }}
|
|
197
|
+
|
|
198
|
+
- name: Install comfy-test
|
|
199
|
+
run: pip install ./.comfy-test-src
|
|
200
|
+
|
|
201
|
+
- name: Syntax
|
|
202
|
+
id: syntax
|
|
203
|
+
run: comfy-test run --platform windows-portable --only-level syntax -c ${{ inputs.config-file }}
|
|
204
|
+
|
|
205
|
+
- name: Install
|
|
206
|
+
id: install
|
|
207
|
+
if: always()
|
|
208
|
+
run: comfy-test run --platform windows-portable --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
209
|
+
|
|
210
|
+
- name: Registration
|
|
211
|
+
id: registration
|
|
212
|
+
if: always() && steps.install.outcome == 'success'
|
|
213
|
+
run: comfy-test run --platform windows-portable --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
214
|
+
|
|
215
|
+
- name: Instantiation
|
|
216
|
+
id: instantiation
|
|
217
|
+
if: always() && steps.install.outcome == 'success'
|
|
218
|
+
run: comfy-test run --platform windows-portable --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
219
|
+
|
|
220
|
+
- name: Validation
|
|
221
|
+
id: validation
|
|
222
|
+
if: always() && steps.install.outcome == 'success'
|
|
223
|
+
run: comfy-test run --platform windows-portable --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
224
|
+
|
|
225
|
+
- name: Execution
|
|
226
|
+
id: execution
|
|
227
|
+
if: always() && steps.install.outcome == 'success'
|
|
228
|
+
run: comfy-test run --platform windows-portable --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
229
|
+
|
|
230
|
+
- name: Upload logs
|
|
231
|
+
if: always()
|
|
232
|
+
uses: actions/upload-artifact@v4
|
|
233
|
+
with:
|
|
234
|
+
name: test-logs-windows-portable
|
|
235
|
+
path: .comfy-test/
|
|
236
|
+
if-no-files-found: ignore
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
name: ComfyUI Installation Test Matrix
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
inputs:
|
|
6
|
+
node-path:
|
|
7
|
+
description: "Path to custom node directory"
|
|
8
|
+
type: string
|
|
9
|
+
default: "."
|
|
10
|
+
config-file:
|
|
11
|
+
description: "Path to comfy-test.toml config file"
|
|
12
|
+
type: string
|
|
13
|
+
default: "comfy-test.toml"
|
|
14
|
+
python-version:
|
|
15
|
+
description: "Python version for testing"
|
|
16
|
+
type: string
|
|
17
|
+
default: "3.10"
|
|
18
|
+
comfy-test-ref:
|
|
19
|
+
description: "Git ref for comfy-test (branch, tag, or SHA)"
|
|
20
|
+
type: string
|
|
21
|
+
default: "main"
|
|
22
|
+
timeout-minutes:
|
|
23
|
+
description: "Job timeout in minutes (default: 60)"
|
|
24
|
+
type: number
|
|
25
|
+
default: 60
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
test-linux:
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
31
|
+
steps:
|
|
32
|
+
- name: Free disk space
|
|
33
|
+
run: |
|
|
34
|
+
sudo rm -rf /usr/share/dotnet &
|
|
35
|
+
sudo rm -rf /usr/local/lib/android &
|
|
36
|
+
sudo rm -rf /opt/ghc &
|
|
37
|
+
sudo rm -rf /opt/hostedtoolcache/CodeQL &
|
|
38
|
+
sudo apt-get clean &
|
|
39
|
+
wait
|
|
40
|
+
|
|
41
|
+
- name: Checkout node
|
|
42
|
+
uses: actions/checkout@v4
|
|
43
|
+
|
|
44
|
+
- name: Checkout comfy-test
|
|
45
|
+
uses: actions/checkout@v4
|
|
46
|
+
with:
|
|
47
|
+
repository: PozzettiAndrea/comfy-test
|
|
48
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
49
|
+
path: .comfy-test-src
|
|
50
|
+
|
|
51
|
+
- name: Setup Python
|
|
52
|
+
uses: actions/setup-python@v5
|
|
53
|
+
with:
|
|
54
|
+
python-version: ${{ inputs.python-version }}
|
|
55
|
+
|
|
56
|
+
- name: Install uv
|
|
57
|
+
run: pip install uv
|
|
58
|
+
|
|
59
|
+
- name: Install comfy-test
|
|
60
|
+
run: pip install ./.comfy-test-src
|
|
61
|
+
|
|
62
|
+
- name: Syntax
|
|
63
|
+
id: syntax
|
|
64
|
+
run: comfy-test run --platform linux --only-level syntax -c ${{ inputs.config-file }}
|
|
65
|
+
|
|
66
|
+
- name: Install
|
|
67
|
+
id: install
|
|
68
|
+
if: always()
|
|
69
|
+
run: comfy-test run --platform linux --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
70
|
+
|
|
71
|
+
- name: Registration
|
|
72
|
+
id: registration
|
|
73
|
+
if: always() && steps.install.outcome == 'success'
|
|
74
|
+
run: comfy-test run --platform linux --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
75
|
+
|
|
76
|
+
- name: Instantiation
|
|
77
|
+
id: instantiation
|
|
78
|
+
if: always() && steps.install.outcome == 'success'
|
|
79
|
+
run: comfy-test run --platform linux --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
80
|
+
|
|
81
|
+
- name: Validation
|
|
82
|
+
id: validation
|
|
83
|
+
if: always() && steps.install.outcome == 'success'
|
|
84
|
+
run: comfy-test run --platform linux --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
85
|
+
|
|
86
|
+
- name: Execution
|
|
87
|
+
id: execution
|
|
88
|
+
if: always() && steps.install.outcome == 'success'
|
|
89
|
+
run: comfy-test run --platform linux --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
90
|
+
|
|
91
|
+
- name: Upload logs
|
|
92
|
+
if: always()
|
|
93
|
+
uses: actions/upload-artifact@v4
|
|
94
|
+
with:
|
|
95
|
+
name: test-logs-linux
|
|
96
|
+
path: .comfy-test/
|
|
97
|
+
if-no-files-found: ignore
|
|
98
|
+
|
|
99
|
+
test-windows:
|
|
100
|
+
runs-on: windows-latest
|
|
101
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
102
|
+
steps:
|
|
103
|
+
- name: Checkout node
|
|
104
|
+
uses: actions/checkout@v4
|
|
105
|
+
|
|
106
|
+
- name: Checkout comfy-test
|
|
107
|
+
uses: actions/checkout@v4
|
|
108
|
+
with:
|
|
109
|
+
repository: PozzettiAndrea/comfy-test
|
|
110
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
111
|
+
path: .comfy-test-src
|
|
112
|
+
|
|
113
|
+
- name: Setup Python
|
|
114
|
+
uses: actions/setup-python@v5
|
|
115
|
+
with:
|
|
116
|
+
python-version: ${{ inputs.python-version }}
|
|
117
|
+
|
|
118
|
+
- name: Install uv
|
|
119
|
+
run: pip install uv
|
|
120
|
+
|
|
121
|
+
- name: Install comfy-test
|
|
122
|
+
run: pip install ./.comfy-test-src
|
|
123
|
+
|
|
124
|
+
- name: Syntax
|
|
125
|
+
id: syntax
|
|
126
|
+
run: comfy-test run --platform windows --only-level syntax -c ${{ inputs.config-file }}
|
|
127
|
+
|
|
128
|
+
- name: Install
|
|
129
|
+
id: install
|
|
130
|
+
if: always()
|
|
131
|
+
run: comfy-test run --platform windows --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
132
|
+
|
|
133
|
+
- name: Registration
|
|
134
|
+
id: registration
|
|
135
|
+
if: always() && steps.install.outcome == 'success'
|
|
136
|
+
run: comfy-test run --platform windows --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
137
|
+
|
|
138
|
+
- name: Instantiation
|
|
139
|
+
id: instantiation
|
|
140
|
+
if: always() && steps.install.outcome == 'success'
|
|
141
|
+
run: comfy-test run --platform windows --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
142
|
+
|
|
143
|
+
- name: Validation
|
|
144
|
+
id: validation
|
|
145
|
+
if: always() && steps.install.outcome == 'success'
|
|
146
|
+
run: comfy-test run --platform windows --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
147
|
+
|
|
148
|
+
- name: Execution
|
|
149
|
+
id: execution
|
|
150
|
+
if: always() && steps.install.outcome == 'success'
|
|
151
|
+
run: comfy-test run --platform windows --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
152
|
+
|
|
153
|
+
- name: Upload logs
|
|
154
|
+
if: always()
|
|
155
|
+
uses: actions/upload-artifact@v4
|
|
156
|
+
with:
|
|
157
|
+
name: test-logs-windows
|
|
158
|
+
path: .comfy-test/
|
|
159
|
+
if-no-files-found: ignore
|
|
160
|
+
|
|
161
|
+
test-windows-portable:
|
|
162
|
+
runs-on: windows-latest
|
|
163
|
+
timeout-minutes: ${{ inputs.timeout-minutes }}
|
|
164
|
+
steps:
|
|
165
|
+
- name: Checkout node
|
|
166
|
+
uses: actions/checkout@v4
|
|
167
|
+
|
|
168
|
+
- name: Checkout comfy-test
|
|
169
|
+
uses: actions/checkout@v4
|
|
170
|
+
with:
|
|
171
|
+
repository: PozzettiAndrea/comfy-test
|
|
172
|
+
ref: ${{ inputs.comfy-test-ref }}
|
|
173
|
+
path: .comfy-test-src
|
|
174
|
+
|
|
175
|
+
- name: Setup Python
|
|
176
|
+
uses: actions/setup-python@v5
|
|
177
|
+
with:
|
|
178
|
+
python-version: ${{ inputs.python-version }}
|
|
179
|
+
|
|
180
|
+
- name: Install comfy-test
|
|
181
|
+
run: pip install ./.comfy-test-src
|
|
182
|
+
|
|
183
|
+
- name: Syntax
|
|
184
|
+
id: syntax
|
|
185
|
+
run: comfy-test run --platform windows-portable --only-level syntax -c ${{ inputs.config-file }}
|
|
186
|
+
|
|
187
|
+
- name: Install
|
|
188
|
+
id: install
|
|
189
|
+
if: always()
|
|
190
|
+
run: comfy-test run --platform windows-portable --only-level install --work-dir .comfy-test-env -c ${{ inputs.config-file }}
|
|
191
|
+
|
|
192
|
+
- name: Registration
|
|
193
|
+
id: registration
|
|
194
|
+
if: always() && steps.install.outcome == 'success'
|
|
195
|
+
run: comfy-test run --platform windows-portable --only-level registration --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
196
|
+
|
|
197
|
+
- name: Instantiation
|
|
198
|
+
id: instantiation
|
|
199
|
+
if: always() && steps.install.outcome == 'success'
|
|
200
|
+
run: comfy-test run --platform windows-portable --only-level instantiation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
201
|
+
|
|
202
|
+
- name: Validation
|
|
203
|
+
id: validation
|
|
204
|
+
if: always() && steps.install.outcome == 'success'
|
|
205
|
+
run: comfy-test run --platform windows-portable --only-level validation --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
206
|
+
|
|
207
|
+
- name: Execution
|
|
208
|
+
id: execution
|
|
209
|
+
if: always() && steps.install.outcome == 'success'
|
|
210
|
+
run: comfy-test run --platform windows-portable --only-level execution --work-dir .comfy-test-env --skip-setup -c ${{ inputs.config-file }}
|
|
211
|
+
|
|
212
|
+
- name: Upload logs
|
|
213
|
+
if: always()
|
|
214
|
+
uses: actions/upload-artifact@v4
|
|
215
|
+
with:
|
|
216
|
+
name: test-logs-windows-portable
|
|
217
|
+
path: .comfy-test/
|
|
218
|
+
if-no-files-found: ignore
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: comfy-test
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.36
|
|
4
4
|
Summary: Installation testing infrastructure for ComfyUI custom nodes
|
|
5
5
|
Project-URL: Homepage, https://github.com/PozzettiAndrea/comfy-test
|
|
6
6
|
Project-URL: Repository, https://github.com/PozzettiAndrea/comfy-test
|
|
@@ -25,6 +25,9 @@ Provides-Extra: dev
|
|
|
25
25
|
Requires-Dist: mypy; extra == 'dev'
|
|
26
26
|
Requires-Dist: pytest; extra == 'dev'
|
|
27
27
|
Requires-Dist: ruff; extra == 'dev'
|
|
28
|
+
Provides-Extra: screenshot
|
|
29
|
+
Requires-Dist: pillow>=10.0.0; extra == 'screenshot'
|
|
30
|
+
Requires-Dist: playwright>=1.40.0; extra == 'screenshot'
|
|
28
31
|
Description-Content-Type: text/markdown
|
|
29
32
|
|
|
30
33
|
# comfy-test
|
|
@@ -73,7 +76,82 @@ A minimal ComfyUI workflow that uses your nodes. Export from ComfyUI.
|
|
|
73
76
|
1. **Setup** - Clones ComfyUI, creates environment, installs dependencies
|
|
74
77
|
2. **Install** - Copies your node, runs `install.py`, installs `requirements.txt`
|
|
75
78
|
3. **Verify** - Starts ComfyUI, checks your nodes appear in `/object_info`
|
|
76
|
-
4. **
|
|
79
|
+
4. **Validate** - Runs 4-level workflow validation (see below)
|
|
80
|
+
5. **Execute** - Runs your test workflow, verifies it completes without errors
|
|
81
|
+
|
|
82
|
+
## Workflow Validation (4 Levels)
|
|
83
|
+
|
|
84
|
+
When a workflow file is configured, comfy-test runs comprehensive validation before execution:
|
|
85
|
+
|
|
86
|
+
| Level | Name | What It Checks |
|
|
87
|
+
|-------|------|----------------|
|
|
88
|
+
| 1 | **Schema** | Widget values match allowed enums, types, and ranges |
|
|
89
|
+
| 2 | **Graph** | Connections are valid, all referenced nodes exist |
|
|
90
|
+
| 3 | **Introspection** | Node definitions are well-formed (INPUT_TYPES, RETURN_TYPES, FUNCTION) |
|
|
91
|
+
| 4 | **Partial Execution** | Runs non-CUDA nodes to verify they work |
|
|
92
|
+
|
|
93
|
+
### Level 1: Schema Validation
|
|
94
|
+
|
|
95
|
+
Validates widget values in your workflow against node schemas from `/object_info`:
|
|
96
|
+
|
|
97
|
+
- **Enum values** - Checks dropdown selections are in the allowed list
|
|
98
|
+
- **INT/FLOAT ranges** - Validates numbers are within min/max bounds
|
|
99
|
+
- **Type checking** - Ensures STRING, BOOLEAN, INT, FLOAT values have correct types
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
[schema] Node 5 (LoadTrellis2Models): 'attn_backend': 'auto' not in allowed values ['flash_attn', 'xformers', 'sdpa', 'sageattn']
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Level 2: Graph Validation
|
|
106
|
+
|
|
107
|
+
Validates the workflow graph structure:
|
|
108
|
+
|
|
109
|
+
- **Node existence** - All linked nodes actually exist
|
|
110
|
+
- **Connection types** - Output types match input types (IMAGE → IMAGE)
|
|
111
|
+
- **Slot validity** - Input/output slot indices are valid
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
[graph] Node 12 (SaveImage): Type mismatch: KSampler outputs LATENT, but SaveImage expects IMAGE
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Level 3: Node Introspection
|
|
118
|
+
|
|
119
|
+
Validates node definitions from the ComfyUI API:
|
|
120
|
+
|
|
121
|
+
- **INPUT_TYPES** - Returns valid dict with required/optional structure
|
|
122
|
+
- **RETURN_TYPES** - Is a list matching RETURN_NAMES length
|
|
123
|
+
- **FUNCTION** - Method name is defined
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
[introspection] Node 3 (BrokenNode): Node has no FUNCTION defined
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Level 4: Partial Execution
|
|
130
|
+
|
|
131
|
+
Executes the "prefix" of your workflow - nodes that don't require CUDA:
|
|
132
|
+
|
|
133
|
+
- Identifies nodes that don't depend on CUDA packages
|
|
134
|
+
- Converts workflow to ComfyUI prompt format
|
|
135
|
+
- Submits partial workflow to the API
|
|
136
|
+
- Reports which nodes executed successfully
|
|
137
|
+
|
|
138
|
+
This catches runtime errors in non-GPU code paths (file loading, preprocessing, etc.) even on CPU-only CI.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
[Step 3c/4] Partial execution (3 non-CUDA nodes)...
|
|
142
|
+
Executed 3 nodes successfully
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Detecting CUDA Nodes
|
|
146
|
+
|
|
147
|
+
To mark nodes as requiring CUDA (so they're excluded from partial execution), list them in your `comfy-test.toml`:
|
|
148
|
+
|
|
149
|
+
```toml
|
|
150
|
+
[test.validation]
|
|
151
|
+
cuda_node_types = ["KSampler", "VAEDecode", "MyGPUNode"]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Or use `comfy-env.toml` to specify CUDA packages - any node importing those packages will be detected automatically.
|
|
77
155
|
|
|
78
156
|
## Configuration Reference
|
|
79
157
|
|