wup 0.2.46__tar.gz → 0.2.47__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.
- {wup-0.2.46/wup.egg-info → wup-0.2.47}/PKG-INFO +5 -5
- {wup-0.2.46 → wup-0.2.47}/README.md +4 -4
- {wup-0.2.46 → wup-0.2.47}/pyproject.toml +1 -1
- {wup-0.2.46 → wup-0.2.47}/tests/test_testql_watcher.py +38 -0
- {wup-0.2.46 → wup-0.2.47}/wup/__init__.py +1 -1
- {wup-0.2.46 → wup-0.2.47}/wup/testql_watcher.py +12 -0
- {wup-0.2.46 → wup-0.2.47/wup.egg-info}/PKG-INFO +5 -5
- {wup-0.2.46 → wup-0.2.47}/LICENSE +0 -0
- {wup-0.2.46 → wup-0.2.47}/setup.cfg +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_auto_detection.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_cli_filtering.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_e2e.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_monitoring_manifest.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_service_inference.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_testql_monitor.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_web_client.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/tests/test_wup.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/_ast_detector.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/_base_detector.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/_hash_detector.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/_yaml_detector.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/anomaly_detector.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/anomaly_models.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/assistant.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/bus.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/cli.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/cli_config_generator.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/cli_scanner.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/config.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/core.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/dependency_mapper.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/event_store.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/file_watcher/events/file_events.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/models/__init__.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/models/config.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/monitoring_manifest.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/planfile_reporter.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testing/events/health_events.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testing/events/test_results.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testing/handlers/event_handlers.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testing/handlers/health_handlers.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testing/queries/health_queries.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testql_cli_generator.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testql_discovery.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/testql_monitor.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/visual_diff.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup/web_client.py +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup.egg-info/SOURCES.txt +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup.egg-info/dependency_links.txt +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup.egg-info/entry_points.txt +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup.egg-info/requires.txt +0 -0
- {wup-0.2.46 → wup-0.2.47}/wup.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wup
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.47
|
|
4
4
|
Summary: WUP (What's Up) - Intelligent file watcher for regression testing in large projects
|
|
5
5
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -31,17 +31,17 @@ Dynamic: license-file
|
|
|
31
31
|
|
|
32
32
|
## AI Cost Tracking
|
|
33
33
|
|
|
34
|
-
    
|
|
35
35
|
  
|
|
36
36
|
|
|
37
|
-
- 🤖 **LLM usage:** $3.
|
|
37
|
+
- 🤖 **LLM usage:** $3.4708 (57 commits)
|
|
38
38
|
- 👤 **Human dev:** ~$2304 (23.0h @ $100/h, 30min dedup)
|
|
39
39
|
|
|
40
|
-
Generated on 2026-05-
|
|
40
|
+
Generated on 2026-05-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
-
    
|
|
45
45
|
|
|
46
46
|
**WUP (What's Up)** - Intelligent file watcher for regression testing in large projects.
|
|
47
47
|
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
|
|
4
4
|
## AI Cost Tracking
|
|
5
5
|
|
|
6
|
-
    
|
|
7
7
|
  
|
|
8
8
|
|
|
9
|
-
- 🤖 **LLM usage:** $3.
|
|
9
|
+
- 🤖 **LLM usage:** $3.4708 (57 commits)
|
|
10
10
|
- 👤 **Human dev:** ~$2304 (23.0h @ $100/h, 30min dedup)
|
|
11
11
|
|
|
12
|
-
Generated on 2026-05-
|
|
12
|
+
Generated on 2026-05-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
    
|
|
17
17
|
|
|
18
18
|
**WUP (What's Up)** - Intelligent file watcher for regression testing in large projects.
|
|
19
19
|
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
|
+
import signal
|
|
4
5
|
import tempfile
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from subprocess import CompletedProcess
|
|
7
8
|
from unittest.mock import Mock
|
|
8
9
|
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
9
12
|
from wup.testql_watcher import TestQLWatcher
|
|
10
13
|
from wup.models.config import (
|
|
11
14
|
PlanfileConfig,
|
|
@@ -519,3 +522,38 @@ def test_quick_pass_actions_prefer_config_endpoints_for_visual_diff():
|
|
|
519
522
|
)
|
|
520
523
|
|
|
521
524
|
assert differ.calls == [("backend", ["http://localhost:8101/api/v3/health"])]
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
def test_quick_interrupt_does_not_create_failure_track():
|
|
528
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
529
|
+
root = Path(tmpdir)
|
|
530
|
+
scenario_dir = root / "testql-scenarios"
|
|
531
|
+
scenario_dir.mkdir(parents=True, exist_ok=True)
|
|
532
|
+
(scenario_dir / "connect-config-smoke.testql.toon.yaml").write_text("name: smoke\n", encoding="utf-8")
|
|
533
|
+
|
|
534
|
+
cfg = WupConfig(
|
|
535
|
+
project=ProjectConfig(name="demo"),
|
|
536
|
+
services=[ServiceConfig(name="connect-config", paths=["connect-config/**"])],
|
|
537
|
+
watch=WatchConfig(),
|
|
538
|
+
testql=TestQLConfig(scenario_dir="testql-scenarios"),
|
|
539
|
+
)
|
|
540
|
+
watcher = TestQLWatcher(
|
|
541
|
+
project_root=str(root),
|
|
542
|
+
deps_file=str(root / "deps.json"),
|
|
543
|
+
scenarios_dir="testql-scenarios",
|
|
544
|
+
track_dir=".wup/tracks",
|
|
545
|
+
config=cfg,
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
watcher._run_testql = lambda args, timeout: CompletedProcess( # type: ignore[method-assign]
|
|
549
|
+
args=args,
|
|
550
|
+
returncode=-signal.SIGINT,
|
|
551
|
+
stdout="",
|
|
552
|
+
stderr="",
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
with pytest.raises(KeyboardInterrupt):
|
|
556
|
+
asyncio.run(watcher.run_quick_test("connect-config", []))
|
|
557
|
+
|
|
558
|
+
tracks = list((root / ".wup" / "tracks").glob("*.json"))
|
|
559
|
+
assert tracks == []
|
|
@@ -7,7 +7,7 @@ WUP monitors file changes and runs intelligent regression tests using a 3-layer
|
|
|
7
7
|
3. Detail Layer: Full tests with blame reports (only on failure)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
__version__ = "0.2.
|
|
10
|
+
__version__ = "0.2.47"
|
|
11
11
|
__author__ = "Tom Sapletta"
|
|
12
12
|
|
|
13
13
|
from .config import load_config, save_config, get_default_config
|
|
@@ -6,6 +6,7 @@ import asyncio
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
import re
|
|
9
|
+
import signal
|
|
9
10
|
import subprocess
|
|
10
11
|
import time
|
|
11
12
|
from pathlib import Path
|
|
@@ -405,6 +406,15 @@ class TestQLWatcher(WupWatcher):
|
|
|
405
406
|
stderr=f"Error: TestQL command timed out after {timeout} seconds",
|
|
406
407
|
)
|
|
407
408
|
|
|
409
|
+
@staticmethod
|
|
410
|
+
def _is_interrupted_result(result: subprocess.CompletedProcess) -> bool:
|
|
411
|
+
rc = int(result.returncode)
|
|
412
|
+
if rc in {130, 143}:
|
|
413
|
+
return True
|
|
414
|
+
if rc < 0 and (-rc) in {signal.SIGINT, signal.SIGTERM}:
|
|
415
|
+
return True
|
|
416
|
+
return False
|
|
417
|
+
|
|
408
418
|
def _write_track(self, *, service: str, stage: str, scenario: Optional[Path], result: subprocess.CompletedProcess) -> Path:
|
|
409
419
|
ts = int(time.time())
|
|
410
420
|
safe_service = service.replace("/", "_").replace("\\", "_")
|
|
@@ -465,6 +475,8 @@ class TestQLWatcher(WupWatcher):
|
|
|
465
475
|
result = self._run_testql(args, timeout=self._quick_timeout())
|
|
466
476
|
if result.returncode == 0:
|
|
467
477
|
return True
|
|
478
|
+
if self._is_interrupted_result(result):
|
|
479
|
+
raise KeyboardInterrupt
|
|
468
480
|
|
|
469
481
|
reason = result.stderr.strip() or result.stdout.strip() or "Quick TestQL failed"
|
|
470
482
|
track_path = self._write_track(service=service, stage="quick",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wup
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.47
|
|
4
4
|
Summary: WUP (What's Up) - Intelligent file watcher for regression testing in large projects
|
|
5
5
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -31,17 +31,17 @@ Dynamic: license-file
|
|
|
31
31
|
|
|
32
32
|
## AI Cost Tracking
|
|
33
33
|
|
|
34
|
-
    
|
|
35
35
|
  
|
|
36
36
|
|
|
37
|
-
- 🤖 **LLM usage:** $3.
|
|
37
|
+
- 🤖 **LLM usage:** $3.4708 (57 commits)
|
|
38
38
|
- 👤 **Human dev:** ~$2304 (23.0h @ $100/h, 30min dedup)
|
|
39
39
|
|
|
40
|
-
Generated on 2026-05-
|
|
40
|
+
Generated on 2026-05-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
-
    
|
|
45
45
|
|
|
46
46
|
**WUP (What's Up)** - Intelligent file watcher for regression testing in large projects.
|
|
47
47
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|