CI: update test report and coverage files

This commit is contained in:
ci-bot
2025-08-12 20:44:37 +00:00
parent 570f67ef4d
commit 422b908f00
3 changed files with 244 additions and 16 deletions
+18 -15
View File
@@ -1,8 +1,8 @@
# 🧪 Test Report
*Generated on 2025-08-12 22:35:01 CEST*
*Generated on 2025-08-12 22:44:37 CEST*
## 🧾 General Info
- **duration**: 4.7898876667022705
- **duration**: 5.115946292877197
- **root**: /workspace/tligui_y/slic
- **environment**: {}
@@ -29,7 +29,7 @@
**duration:**
```python
0.0004974203184247017
0.00039944564923644066
```
**outcome:**
@@ -43,7 +43,7 @@
**duration:**
```python
0.13467674795538187
0.14373651891946793
```
**outcome:**
@@ -56,15 +56,15 @@
```python
path: /workspace/tligui_y/slic/tests/test_utils_sendmail.py
lineno: 53
message: NameError: name 'msg' is not defined
lineno: 56
message: NameError: name 'from_addr' is not defined
```
**traceback:**
```python
- path: tests/test_utils_sendmail.py
lineno: 53
lineno: 56
message: NameError
```
@@ -82,7 +82,7 @@
body = "Hello from pytest/local!"
# Send the email using the function under test
sendmail(to_addr, from_addr=f"{user}@localhost", subject=subject, body=body)
msg = sendmail(to_addr, from_addr=f"{user}@localhost", subject=subject, body=body)
# Path to the Maildir 'new' folder for this user
maildir_new = os.path.expanduser("~/Maildir/new")
@@ -110,10 +110,13 @@
assert subject in content, "Email subject not found in delivered message"
assert body in content, "Email body not found in delivered message"
> repr_str = repr(msg)
E NameError: name 'msg' is not defined
repr_str = repr(msg)
assert isinstance(repr_str, str), "__repr__() must return str"
assert f"To: {to_addr}" in repr_str, "To header missing from __repr__()"
> assert f"From: {from_addr}" in repr_str, "From header missing from __repr__()"
E NameError: name 'from_addr' is not defined
tests/test_utils_sendmail.py:53: NameError
tests/test_utils_sendmail.py:56: NameError
```
**_*📌 Teardown phase*_**
@@ -121,7 +124,7 @@
**duration:**
```python
0.00036546308547258377
0.00039704982191324234
```
**outcome:**
@@ -149,7 +152,7 @@
**duration:**
```python
0.00042511802166700363
0.00048598507419228554
```
**outcome:**
@@ -163,7 +166,7 @@
**duration:**
```python
0.0009083142504096031
0.0009725349955260754
```
**outcome:**
@@ -177,7 +180,7 @@
**duration:**
```python
0.00017098616808652878
0.00017899135127663612
```
**outcome:**
+225
View File
@@ -15780,3 +15780,228 @@
| slic/utils/utils.py | 17 | 8 | 53% |
| slic/utils/xrange.py | 33 | 30 | 9% |
| **TOTAL** | **9529** | **6953** | **27%** |
| Name | Stmts | Miss | Cover |
|----------------------------------------------- | -------: | -------: | ------: |
| slic/\_\_init\_\_.py | 20 | 2 | 90% |
| slic/core/\_\_init\_\_.py | 5 | 0 | 100% |
| slic/core/acquisition/\_\_init\_\_.py | 7 | 0 | 100% |
| slic/core/acquisition/acquisition.py | 56 | 42 | 25% |
| slic/core/acquisition/baseacquisition.py | 5 | 1 | 80% |
| slic/core/acquisition/broker/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/core/acquisition/broker/brokerclient.py | 104 | 80 | 23% |
| slic/core/acquisition/broker/brokerconfig.py | 102 | 87 | 15% |
| slic/core/acquisition/broker/pedestal.py | 66 | 57 | 14% |
| slic/core/acquisition/broker/pids.py | 17 | 12 | 29% |
| slic/core/acquisition/broker/post\_retrieve.py | 120 | 120 | 0% |
| slic/core/acquisition/broker/requeststatus.py | 77 | 73 | 5% |
| slic/core/acquisition/broker/restapi.py | 147 | 107 | 27% |
| slic/core/acquisition/broker/tools.py | 52 | 18 | 65% |
| slic/core/acquisition/bsacquisition.py | 10 | 3 | 70% |
| slic/core/acquisition/bschannels.py | 30 | 19 | 37% |
| slic/core/acquisition/channels.py | 51 | 30 | 41% |
| slic/core/acquisition/dbacquisition.py | 19 | 12 | 37% |
| slic/core/acquisition/detcfg.py | 82 | 35 | 57% |
| slic/core/acquisition/diaacquisition.py | 111 | 111 | 0% |
| slic/core/acquisition/diaconfig.py | 36 | 36 | 0% |
| slic/core/acquisition/dummyacquisition.py | 12 | 12 | 0% |
| slic/core/acquisition/fakeacquisition.py | 76 | 53 | 30% |
| slic/core/acquisition/pedestals.py | 69 | 69 | 0% |
| slic/core/acquisition/pvacquisition.py | 60 | 47 | 22% |
| slic/core/acquisition/pvchannels.py | 13 | 7 | 46% |
| slic/core/acquisition/sfacquisition.py | 159 | 129 | 19% |
| slic/core/acquisition/sfpaths.py | 23 | 19 | 17% |
| slic/core/acquisition/spreadsheet.py | 45 | 45 | 0% |
| slic/core/adjustable/\_\_init\_\_.py | 11 | 0 | 100% |
| slic/core/adjustable/adjustable.py | 50 | 30 | 40% |
| slic/core/adjustable/baseadjustable.py | 28 | 18 | 36% |
| slic/core/adjustable/collection.py | 22 | 14 | 36% |
| slic/core/adjustable/combined.py | 15 | 8 | 47% |
| slic/core/adjustable/convenience.py | 35 | 20 | 43% |
| slic/core/adjustable/converted.py | 16 | 10 | 38% |
| slic/core/adjustable/dummyadjustable.py | 41 | 30 | 27% |
| slic/core/adjustable/error.py | 2 | 0 | 100% |
| slic/core/adjustable/genericadjustable.py | 32 | 24 | 25% |
| slic/core/adjustable/limited.py | 29 | 18 | 38% |
| slic/core/adjustable/linked.py | 22 | 15 | 32% |
| slic/core/adjustable/pvadjustable.py | 119 | 91 | 24% |
| slic/core/adjustable/pvchangemon.py | 77 | 56 | 27% |
| slic/core/adjustable/pvenumadjustable.py | 38 | 22 | 42% |
| slic/core/adjustable/scaler.py | 22 | 16 | 27% |
| slic/core/condition/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/core/condition/basecondition.py | 8 | 2 | 75% |
| slic/core/condition/condition.py | 107 | 79 | 26% |
| slic/core/condition/pvcondition.py | 21 | 12 | 43% |
| slic/core/condition/valuecondition.py | 22 | 15 | 32% |
| slic/core/device/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/core/device/auto.py | 12 | 12 | 0% |
| slic/core/device/basedevice.py | 2 | 0 | 100% |
| slic/core/device/device.py | 46 | 35 | 24% |
| slic/core/device/filtered.py | 23 | 23 | 0% |
| slic/core/device/simpledevice.py | 6 | 2 | 67% |
| slic/core/scanner/\_\_init\_\_.py | 1 | 0 | 100% |
| slic/core/scanner/runname.py | 36 | 23 | 36% |
| slic/core/scanner/scanbackend.py | 232 | 197 | 15% |
| slic/core/scanner/scaninfo.py | 45 | 35 | 22% |
| slic/core/scanner/scanner.py | 136 | 89 | 35% |
| slic/core/sensor/\_\_init\_\_.py | 8 | 0 | 100% |
| slic/core/sensor/basesensor.py | 12 | 3 | 75% |
| slic/core/sensor/bscombined.py | 9 | 5 | 44% |
| slic/core/sensor/bsmonitor.py | 102 | 73 | 28% |
| slic/core/sensor/bsnorm.py | 12 | 7 | 42% |
| slic/core/sensor/bssensor.py | 6 | 2 | 67% |
| slic/core/sensor/combined.py | 31 | 20 | 35% |
| slic/core/sensor/monitor.py | 62 | 51 | 18% |
| slic/core/sensor/norm.py | 9 | 5 | 44% |
| slic/core/sensor/pvsensor.py | 32 | 20 | 38% |
| slic/core/sensor/remoteplot.py | 15 | 10 | 33% |
| slic/core/sensor/sensor.py | 60 | 42 | 30% |
| slic/core/task/\_\_init\_\_.py | 4 | 0 | 100% |
| slic/core/task/basetask.py | 11 | 3 | 73% |
| slic/core/task/daqtask.py | 23 | 16 | 30% |
| slic/core/task/loop.py | 57 | 40 | 30% |
| slic/core/task/producer.py | 25 | 18 | 28% |
| slic/core/task/task.py | 62 | 46 | 26% |
| slic/devices/\_\_init\_\_.py | 7 | 0 | 100% |
| slic/devices/cameras/\_\_init\_\_.py | 4 | 0 | 100% |
| slic/devices/cameras/basler.py | 8 | 4 | 50% |
| slic/devices/cameras/camera\_bs.py | 13 | 8 | 38% |
| slic/devices/cameras/camera\_ca.py | 34 | 19 | 44% |
| slic/devices/cameras/camerabase.py | 17 | 12 | 29% |
| slic/devices/cameras/screenpanel.py | 31 | 21 | 32% |
| slic/devices/endstations/\_\_init\_\_.py | 3 | 0 | 100% |
| slic/devices/endstations/alvra\_flex.py | 10 | 5 | 50% |
| slic/devices/endstations/alvra\_huber.py | 8 | 4 | 50% |
| slic/devices/endstations/alvra\_prime.py | 48 | 34 | 29% |
| slic/devices/endstations/alvra\_xtg.py | 8 | 8 | 0% |
| slic/devices/endstations/bernina\_cameras.py | 33 | 33 | 0% |
| slic/devices/endstations/bernina\_platform.py | 46 | 46 | 0% |
| slic/devices/general/\_\_init\_\_.py | 4 | 0 | 100% |
| slic/devices/general/delay\_compensation.py | 13 | 13 | 0% |
| slic/devices/general/delay\_stage.py | 57 | 30 | 47% |
| slic/devices/general/detectors/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/devices/general/detectors/buffer.py | 66 | 35 | 47% |
| slic/devices/general/detectors/digitizer.py | 13 | 7 | 46% |
| slic/devices/general/detectors/pvdatastream.py | 33 | 24 | 27% |
| slic/devices/general/detectors/timer.py | 15 | 9 | 40% |
| slic/devices/general/micosstage.py | 7 | 7 | 0% |
| slic/devices/general/motor.py | 128 | 88 | 31% |
| slic/devices/general/shutter.py | 22 | 12 | 45% |
| slic/devices/general/shutterctx.py | 18 | 7 | 61% |
| slic/devices/general/smaract.py | 169 | 125 | 26% |
| slic/devices/loptics/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/devices/loptics/alvra\_explaser.py | 29 | 21 | 28% |
| slic/devices/loptics/bernina\_explaser.py | 28 | 28 | 0% |
| slic/devices/loptics/lasershutter.py | 22 | 14 | 36% |
| slic/devices/timing/\_\_init\_\_.py | 0 | 0 | 100% |
| slic/devices/timing/events/\_\_init\_\_.py | 3 | 3 | 0% |
| slic/devices/timing/events/codes.py | 5 | 5 | 0% |
| slic/devices/timing/events/ctaseq.py | 190 | 190 | 0% |
| slic/devices/timing/events/evr.py | 37 | 37 | 0% |
| slic/devices/timing/events/tma.py | 40 | 40 | 0% |
| slic/devices/timing/lasertiming.py | 253 | 184 | 27% |
| slic/devices/xdiagnostics/\_\_init\_\_.py | 2 | 0 | 100% |
| slic/devices/xdiagnostics/intensitymonitor.py | 124 | 92 | 26% |
| slic/devices/xdiagnostics/profilemonitor.py | 19 | 9 | 53% |
| slic/devices/xdiagnostics/timetools.py | 48 | 48 | 0% |
| slic/devices/xoptics/\_\_init\_\_.py | 7 | 0 | 100% |
| slic/devices/xoptics/aramis\_attenuator.py | 96 | 66 | 31% |
| slic/devices/xoptics/aramis\_reflaser.py | 23 | 15 | 35% |
| slic/devices/xoptics/dcm.py | 211 | 162 | 23% |
| slic/devices/xoptics/kb.py | 30 | 18 | 40% |
| slic/devices/xoptics/offsetmirrors.py | 9 | 5 | 44% |
| slic/devices/xoptics/pulsepicker.py | 56 | 34 | 39% |
| slic/devices/xoptics/slits/\_\_init\_\_.py | 5 | 0 | 100% |
| slic/devices/xoptics/slits/slitblades.py | 66 | 48 | 27% |
| slic/devices/xoptics/slits/slittwinunit.py | 12 | 6 | 50% |
| slic/devices/xoptics/slits/slitunit.py | 14 | 8 | 43% |
| slic/devices/xoptics/slits/slitunitcw.py | 7 | 3 | 57% |
| slic/devices/xoptics/slits/slitunitjj.py | 8 | 5 | 38% |
| slic/gui/\_\_init\_\_.py | 1 | 0 | 100% |
| slic/gui/daqframe.py | 75 | 54 | 28% |
| slic/gui/daqpanels/\_\_init\_\_.py | 6 | 0 | 100% |
| slic/gui/daqpanels/config.py | 98 | 80 | 18% |
| slic/gui/daqpanels/goto.py | 92 | 76 | 17% |
| slic/gui/daqpanels/run.py | 56 | 46 | 18% |
| slic/gui/daqpanels/scan2d.py | 77 | 66 | 14% |
| slic/gui/daqpanels/scan.py | 63 | 54 | 14% |
| slic/gui/daqpanels/sfx.py | 77 | 60 | 22% |
| slic/gui/daqpanels/special.py | 63 | 54 | 14% |
| slic/gui/daqpanels/static.py | 46 | 37 | 20% |
| slic/gui/daqpanels/tools.py | 140 | 114 | 19% |
| slic/gui/daqpanels/tweak.py | 149 | 127 | 15% |
| slic/gui/gui.py | 16 | 10 | 38% |
| slic/gui/icon.py | 8 | 4 | 50% |
| slic/gui/persist.py | 68 | 48 | 29% |
| slic/gui/widgets/\_\_init\_\_.py | 11 | 0 | 100% |
| slic/gui/widgets/alarm.py | 21 | 9 | 57% |
| slic/gui/widgets/alternative.py | 51 | 40 | 22% |
| slic/gui/widgets/boxes.py | 33 | 26 | 21% |
| slic/gui/widgets/checkbox.py | 8 | 4 | 50% |
| slic/gui/widgets/completers.py | 27 | 19 | 30% |
| slic/gui/widgets/dyncombo.py | 49 | 49 | 0% |
| slic/gui/widgets/entries.py | 253 | 195 | 23% |
| slic/gui/widgets/exc2warn.py | 15 | 13 | 13% |
| slic/gui/widgets/fname.py | 60 | 47 | 22% |
| slic/gui/widgets/jfcfg.py | 290 | 230 | 21% |
| slic/gui/widgets/jfmodcoords.py | 88 | 70 | 20% |
| slic/gui/widgets/labeled.py | 19 | 7 | 63% |
| slic/gui/widgets/lists.py | 96 | 73 | 24% |
| slic/gui/widgets/mods.py | 25 | 17 | 32% |
| slic/gui/widgets/nope.py | 26 | 19 | 27% |
| slic/gui/widgets/plotting.py | 68 | 47 | 31% |
| slic/gui/widgets/tools.py | 11 | 7 | 36% |
| slic/gui/widgets/twobuttons.py | 43 | 30 | 30% |
| slic/gui/wxdebug.py | 15 | 7 | 53% |
| slic/utils/\_\_init\_\_.py | 24 | 0 | 100% |
| slic/utils/argfwd.py | 53 | 14 | 74% |
| slic/utils/ask\_yes\_no.py | 27 | 20 | 26% |
| slic/utils/channels.py | 17 | 12 | 29% |
| slic/utils/config.py | 5 | 2 | 60% |
| slic/utils/cprint.py | 41 | 16 | 61% |
| slic/utils/dbusnotify.py | 40 | 25 | 38% |
| slic/utils/debug.py | 16 | 12 | 25% |
| slic/utils/dictext.py | 30 | 19 | 37% |
| slic/utils/dotdir.py | 10 | 1 | 90% |
| slic/utils/duo.py | 77 | 45 | 42% |
| slic/utils/elog.py | 31 | 21 | 32% |
| slic/utils/eval.py | 49 | 37 | 24% |
| slic/utils/exceptions.py | 22 | 14 | 36% |
| slic/utils/get\_adj.py | 17 | 11 | 35% |
| slic/utils/hastyepics.py | 37 | 25 | 32% |
| slic/utils/ioc/\_\_init\_\_.py | 1 | 1 | 0% |
| slic/utils/ioc/adjdrv.py | 31 | 31 | 0% |
| slic/utils/ioc/ioc.py | 63 | 63 | 0% |
| slic/utils/ipy.py | 22 | 15 | 32% |
| slic/utils/jsonext.py | 24 | 16 | 33% |
| slic/utils/lazypv.py | 12 | 12 | 0% |
| slic/utils/logcfg.py | 52 | 2 | 96% |
| slic/utils/logign.py | 22 | 14 | 36% |
| slic/utils/marker.py | 48 | 31 | 35% |
| slic/utils/metaclasses.py | 8 | 0 | 100% |
| slic/utils/namespace.py | 5 | 1 | 80% |
| slic/utils/npy.py | 71 | 56 | 21% |
| slic/utils/opmsg.py | 122 | 122 | 0% |
| slic/utils/path.py | 32 | 24 | 25% |
| slic/utils/picklio.py | 7 | 3 | 57% |
| slic/utils/printing.py | 77 | 61 | 21% |
| slic/utils/pv.py | 30 | 20 | 33% |
| slic/utils/pvpreload.py | 50 | 19 | 62% |
| slic/utils/pyepics.py | 64 | 39 | 39% |
| slic/utils/rangebar.py | 92 | 61 | 34% |
| slic/utils/readable.py | 12 | 9 | 25% |
| slic/utils/registry.py | 33 | 19 | 42% |
| slic/utils/reprate.py | 55 | 42 | 24% |
| slic/utils/richcfg.py | 21 | 11 | 48% |
| slic/utils/run\_later.py | 64 | 64 | 0% |
| slic/utils/screenshot.py | 30 | 21 | 30% |
| slic/utils/sendmail.py | 49 | 2 | 96% |
| slic/utils/sendsms.py | 5 | 5 | 0% |
| slic/utils/shortcut.py | 38 | 20 | 47% |
| slic/utils/snapshot.py | 6 | 3 | 50% |
| slic/utils/termtitle.py | 3 | 0 | 100% |
| slic/utils/tqdm\_mod.py | 28 | 18 | 36% |
| slic/utils/trinary.py | 4 | 2 | 50% |
| slic/utils/typecast.py | 19 | 19 | 0% |
| slic/utils/utils.py | 17 | 8 | 53% |
| slic/utils/xrange.py | 33 | 30 | 9% |
| **TOTAL** | **9529** | **6952** | **27%** |
+1 -1
View File
@@ -1 +1 @@
{"created": 1755030900.0678556, "duration": 4.7898876667022705, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"failed": 1, "passed": 1, "total": 2, "collected": 2}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_sendmail.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "type": "Function", "lineno": 59}]}], "tests": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "lineno": 13, "outcome": "failed", "keywords": ["test_sendmail_local_delivery", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.0004974203184247017, "outcome": "passed"}, "call": {"duration": 0.13467674795538187, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/tests/test_utils_sendmail.py", "lineno": 53, "message": "NameError: name 'msg' is not defined"}, "traceback": [{"path": "tests/test_utils_sendmail.py", "lineno": 53, "message": "NameError"}], "longrepr": "def test_sendmail_local_delivery():\n \n # Get the current system user\n user = getpass.getuser()\n \n # Define the recipient and email content\n to_addr = f\"{user}@localhost\"\n subject = \"Local sendmail test\"\n body = \"Hello from pytest/local!\"\n \n # Send the email using the function under test\n sendmail(to_addr, from_addr=f\"{user}@localhost\", subject=subject, body=body)\n \n # Path to the Maildir 'new' folder for this user\n maildir_new = os.path.expanduser(\"~/Maildir/new\")\n \n # Clean up the mail\n for f in glob.glob(os.path.join(maildir_new, \"*\")):\n os.remove(f)\n \n # Wait a short time for delivery\n files = []\n for _ in range(50): # Try for ~5 seconds\n time.sleep(0.1)\n files = sorted(glob.glob(os.path.join(maildir_new, \"*\")))\n if files:\n break\n \n # Assert that at least one mail file was delivered\n assert files, f\"No email was delivered to {maildir_new}\"\n \n # Read the most recent mail file\n with open(files[-1], \"r\", encoding=\"utf-8\", errors=\"replace\") as f:\n content = f.read()\n \n # Assert that both the subject and body appear in the delivered email\n assert subject in content, \"Email subject not found in delivered message\"\n assert body in content, \"Email body not found in delivered message\"\n \n> repr_str = repr(msg)\nE NameError: name 'msg' is not defined\n\ntests/test_utils_sendmail.py:53: NameError"}, "teardown": {"duration": 0.00036546308547258377, "outcome": "passed"}}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "lineno": 59, "outcome": "passed", "keywords": ["test_sendmail_raises_on_sendmail_failure", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00042511802166700363, "outcome": "passed"}, "call": {"duration": 0.0009083142504096031, "outcome": "passed"}, "teardown": {"duration": 0.00017098616808652878, "outcome": "passed"}}], "warnings": [{"message": "invalid escape sequence \\-", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py", "lineno": 207}, {"message": "The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py", "lineno": 97}]}
{"created": 1755031475.5235498, "duration": 5.115946292877197, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"failed": 1, "passed": 1, "total": 2, "collected": 2}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_sendmail.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "type": "Function", "lineno": 13}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "type": "Function", "lineno": 59}]}], "tests": [{"nodeid": "tests/test_utils_sendmail.py::test_sendmail_local_delivery", "lineno": 13, "outcome": "failed", "keywords": ["test_sendmail_local_delivery", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00039944564923644066, "outcome": "passed"}, "call": {"duration": 0.14373651891946793, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/tests/test_utils_sendmail.py", "lineno": 56, "message": "NameError: name 'from_addr' is not defined"}, "traceback": [{"path": "tests/test_utils_sendmail.py", "lineno": 56, "message": "NameError"}], "longrepr": "def test_sendmail_local_delivery():\n \n # Get the current system user\n user = getpass.getuser()\n \n # Define the recipient and email content\n to_addr = f\"{user}@localhost\"\n subject = \"Local sendmail test\"\n body = \"Hello from pytest/local!\"\n \n # Send the email using the function under test\n msg = sendmail(to_addr, from_addr=f\"{user}@localhost\", subject=subject, body=body)\n \n # Path to the Maildir 'new' folder for this user\n maildir_new = os.path.expanduser(\"~/Maildir/new\")\n \n # Clean up the mail\n for f in glob.glob(os.path.join(maildir_new, \"*\")):\n os.remove(f)\n \n # Wait a short time for delivery\n files = []\n for _ in range(50): # Try for ~5 seconds\n time.sleep(0.1)\n files = sorted(glob.glob(os.path.join(maildir_new, \"*\")))\n if files:\n break\n \n # Assert that at least one mail file was delivered\n assert files, f\"No email was delivered to {maildir_new}\"\n \n # Read the most recent mail file\n with open(files[-1], \"r\", encoding=\"utf-8\", errors=\"replace\") as f:\n content = f.read()\n \n # Assert that both the subject and body appear in the delivered email\n assert subject in content, \"Email subject not found in delivered message\"\n assert body in content, \"Email body not found in delivered message\"\n \n repr_str = repr(msg)\n assert isinstance(repr_str, str), \"__repr__() must return str\"\n assert f\"To: {to_addr}\" in repr_str, \"To header missing from __repr__()\"\n> assert f\"From: {from_addr}\" in repr_str, \"From header missing from __repr__()\"\nE NameError: name 'from_addr' is not defined\n\ntests/test_utils_sendmail.py:56: NameError"}, "teardown": {"duration": 0.00039704982191324234, "outcome": "passed"}}, {"nodeid": "tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure", "lineno": 59, "outcome": "passed", "keywords": ["test_sendmail_raises_on_sendmail_failure", "test_utils_sendmail.py", "tests", "slic", ""], "setup": {"duration": 0.00048598507419228554, "outcome": "passed"}, "call": {"duration": 0.0009725349955260754, "outcome": "passed"}, "teardown": {"duration": 0.00017899135127663612, "outcome": "passed"}}], "warnings": [{"message": "invalid escape sequence \\-", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py", "lineno": 207}, {"message": "The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py", "lineno": 97}]}