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.
Files changed (40) hide show
  1. comfy_test-0.0.36/.github/workflows/publish.yml +74 -0
  2. comfy_test-0.0.36/.github/workflows/test-matrix-local.yml +236 -0
  3. comfy_test-0.0.36/.github/workflows/test-matrix.yml +218 -0
  4. comfy_test-0.0.6/pyproject.toml → comfy_test-0.0.36/.ipynb_checkpoints/pyproject-checkpoint.toml +1 -1
  5. {comfy_test-0.0.6 → comfy_test-0.0.36}/PKG-INFO +80 -2
  6. {comfy_test-0.0.6 → comfy_test-0.0.36}/README.md +76 -1
  7. comfy_test-0.0.36/bin/act +0 -0
  8. comfy_test-0.0.36/pyproject.toml +49 -0
  9. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/__init__.py +5 -1
  10. comfy_test-0.0.36/src/comfy_test/cli.py +617 -0
  11. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/api.py +18 -0
  12. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/server.py +62 -5
  13. comfy_test-0.0.36/src/comfy_test/comfyui/validator.py +616 -0
  14. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/workflow.py +58 -15
  15. comfy_test-0.0.36/src/comfy_test/comfyui/workflow_converter.py +1313 -0
  16. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/errors.py +11 -0
  17. comfy_test-0.0.36/src/comfy_test/screenshot.py +468 -0
  18. comfy_test-0.0.36/src/comfy_test/screenshot_cache.py +332 -0
  19. comfy_test-0.0.36/src/comfy_test/test/comfy_env.py +75 -0
  20. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/config.py +100 -10
  21. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/config_file.py +87 -27
  22. comfy_test-0.0.36/src/comfy_test/test/manager.py +1000 -0
  23. comfy_test-0.0.36/src/comfy_test/test/node_discovery.py +231 -0
  24. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/__init__.py +5 -0
  25. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/base.py +18 -0
  26. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/linux.py +73 -9
  27. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/windows.py +65 -6
  28. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/test/platform/windows_portable.py +78 -5
  29. comfy_test-0.0.6/.github/workflows/publish.yml +0 -30
  30. comfy_test-0.0.6/.github/workflows/test-matrix.yml +0 -99
  31. comfy_test-0.0.6/CLAUDE.md +0 -58
  32. comfy_test-0.0.6/examples/basic_node/comfy-test.toml +0 -11
  33. comfy_test-0.0.6/src/comfy_test/cli.py +0 -277
  34. comfy_test-0.0.6/src/comfy_test/test/manager.py +0 -197
  35. {comfy_test-0.0.6 → comfy_test-0.0.36}/.gitignore +0 -0
  36. {comfy_test-0.0.6 → comfy_test-0.0.36}/LICENSE +0 -0
  37. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/comfyui/__init__.py +0 -0
  38. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/github/__init__.py +0 -0
  39. {comfy_test-0.0.6 → comfy_test-0.0.36}/src/comfy_test/runner.py +0 -0
  40. {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
  [project]
2
2
  name = "comfy-test"
3
- version = "0.0.6"
3
+ version = "0.0.10"
4
4
  description = "Installation testing infrastructure for ComfyUI custom nodes"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: comfy-test
3
- Version: 0.0.6
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. **Execute** - Runs your test workflow, verifies it completes without errors
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