pyobs-gui 2.0.0.dev22__tar.gz → 2.0.1__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.
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/PKG-INFO +2 -2
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/__init__.py +4 -1
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/_nuitka_astropy_patch.py +59 -5
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyproject.toml +2 -2
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/uv.lock +29 -29
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.claude/skills/verify/SKILL.md +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.github/dependabot.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.github/workflows/dependabot-automerge.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.github/workflows/pypi.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.github/workflows/pyrefly.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.github/workflows/ruff.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.gitignore +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.pre-commit-config.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/.readthedocs.yml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/CHANGELOG.rst +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/LICENSE +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/README.md +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/bin/mypyuic5 +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/Makefile +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/make.bat +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/requirements.txt +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/source/_static/pyobs.gif +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/source/conf.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/docs/source/index.rst +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/mypy.ini +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/__main__.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/accounts.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/acquisitionwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/autofocuswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/autoguidingwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/base.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/camerawidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/commandinputwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/compassmovewidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/coolingwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/datadisplaywidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/eventswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/filterwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/fitsheaderswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/focuswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/gui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/login.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/loginwindow.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/logmodel.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/mainwindow.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/modewidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/modifiedmixin.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/modulegui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/__init__.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/acquisitionwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/acquisitionwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/autofocuswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/autofocuswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/autoguidingwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/autoguidingwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/camerawidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/camerawidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/compassmoveplugin.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/compassmovewidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/compassmovewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/compassmovewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/compile.sh +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/coolingwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/coolingwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/datadisplayplugin.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/datadisplaywidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/datadisplaywidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/designer.sh +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/eventswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/eventswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/filterwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/filterwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/fitsheaderswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/fitsheaderswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/focuswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/focuswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/mainwindow.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/mainwindow_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/modewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/modewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-down-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-left-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-right-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-up-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-up-right-from-square-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrows-to-eye-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/chart-line-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/circle-question-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/cloud-sun-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/edit-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/search-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/undo-solid.svg +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources.qrc +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources_rc.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/roofwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/roofwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/shellwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/shellwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/spectrographwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/spectrographwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/telescopewidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/telescopewidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/temperaturesplotwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/temperaturesplotwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/temperatureswidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/temperatureswidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/videowidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/videowidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/weatherwidget.ui +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/weatherwidget_ui.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/roofwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/shellwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/spectrographwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/statuswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/telescopewidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/temperaturesplotwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/temperatureswidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/utils.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/videowidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/watchedlabel.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/weatherwidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pysidedeploy.spec +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/specs/2026-08-20-gui-remote-call-error-handling.md +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/specs/2026-08-21-gui-widget-startup-responsiveness.md +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/specs/index.md +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/spike_standalone/main.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/spike_standalone/pysidedeploy.spec +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/acquisition.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/autofocus.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/camera.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/full.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/guiding.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/mode.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/roof.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/spectrograph.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/telescope.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/telescope_acl.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/telescope_acl_denied.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/test/video.yaml +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/__init__.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/conftest.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/test_accounts.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/test_camerawidget.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/test_loginwindow.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/test_mainwindow_startup.py +0 -0
- {pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/tests/test_videowidget.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pyobs-gui
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: A remote GUI for pyobs
|
|
5
5
|
Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -11,7 +11,7 @@ Requires-Dist: astropy<8,>=7.0.1
|
|
|
11
11
|
Requires-Dist: colour<0.2,>=0.1.5
|
|
12
12
|
Requires-Dist: keyring<26,>=25.7.0
|
|
13
13
|
Requires-Dist: matplotlib<4,>=3.10.1
|
|
14
|
-
Requires-Dist: pyobs-core<3,>=2.0.0
|
|
14
|
+
Requires-Dist: pyobs-core<3,>=2.0.0
|
|
15
15
|
Requires-Dist: pyside6>=6.10.1
|
|
16
16
|
Requires-Dist: qasync<0.29,>=0.27.1
|
|
17
17
|
Requires-Dist: qfitswidget>=0.13.1
|
|
@@ -6,7 +6,10 @@ __title__ = "GUI"
|
|
|
6
6
|
|
|
7
7
|
from ._nuitka_astropy_patch import patch_generic_unit_parser
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
# Only relevant in the Nuitka-compiled standalone binary: under a regular interpreter the
|
|
10
|
+
# patch must not install, or it breaks astropy's unit/coordinate parsing (issue #151). The
|
|
11
|
+
# marker is evaluated here because pyobs_gui/__init__.py is guaranteed compiled in the binary.
|
|
12
|
+
patch_generic_unit_parser(compiled="__compiled__" in globals())
|
|
10
13
|
|
|
11
14
|
from .gui import GUI
|
|
12
15
|
from .camerawidget import CameraWidget
|
|
@@ -34,6 +34,23 @@ unconditionally at startup. astropy's cds/ogip/vounit formats and astropy.coordi
|
|
|
34
34
|
the same PLY pattern and would need the identical treatment if/when they're actually exercised in
|
|
35
35
|
the compiled binary.
|
|
36
36
|
|
|
37
|
+
Two caveats learned the hard way (pyobs-gui issue #151):
|
|
38
|
+
|
|
39
|
+
- **The patch must be a strict no-op under a regular interpreter.** The wrapper functions below
|
|
40
|
+
add one stack frame, which shifts astropy's frame-level bookkeeping: ``astropy.utils.parsing``
|
|
41
|
+
calls ``get_caller_module_dict(2)`` directly, and its own ``_patch_ply_module`` wrapper adds two
|
|
42
|
+
more levels, so the extra frame makes the walk land on astropy's parsing wrapper instead of the
|
|
43
|
+
grammar-defining frame -- the fallback fired on plain CPython and corrupted unit/coordinate
|
|
44
|
+
parsing when running from source ("Invalid coordinates" in the Telescope widget, astropy units
|
|
45
|
+
failing to import). Therefore the patched functions step one level deeper (``levels + 1``) to
|
|
46
|
+
restore the original frame targeting, and ``patch_generic_unit_parser`` only installs at all
|
|
47
|
+
when running under Nuitka (``"__compiled__" in globals()``); otherwise it returns immediately.
|
|
48
|
+
- **The vendored grammar must be a *registered* module.** PLY validates p-functions with
|
|
49
|
+
``inspect.getmodule()``/``getsourcefile()``, which resolve the function's ``__module__`` through
|
|
50
|
+
``sys.modules`` and want a real source file. ``_build_generic_grammar_namespace`` therefore
|
|
51
|
+
registers the namespace under its name and materializes its ``__file__`` stub; without that the
|
|
52
|
+
parser rebuild dies with "Unable to build parser" (``TypeError ... got NoneType``).
|
|
53
|
+
|
|
37
54
|
Must run before ``astropy.units`` is imported anywhere, i.e. as the first thing in
|
|
38
55
|
``pyobs_gui/__init__.py``.
|
|
39
56
|
"""
|
|
@@ -41,6 +58,7 @@ Must run before ``astropy.units`` is imported anywhere, i.e. as the first thing
|
|
|
41
58
|
from __future__ import annotations
|
|
42
59
|
|
|
43
60
|
import re
|
|
61
|
+
import sys
|
|
44
62
|
import tempfile
|
|
45
63
|
import types
|
|
46
64
|
from fractions import Fraction
|
|
@@ -76,6 +94,18 @@ def _build_generic_grammar_namespace() -> types.ModuleType:
|
|
|
76
94
|
ns.__file__ = str(stub_dir / "generic.py")
|
|
77
95
|
ns.tokens = tokens
|
|
78
96
|
|
|
97
|
+
# Register the namespace under its own name and materialize its __file__ so PLY's
|
|
98
|
+
# grammar validation can resolve it: ParserReflect.get_pfunctions() calls
|
|
99
|
+
# inspect.getmodule() on every p_* function (which looks the function's __module__ up
|
|
100
|
+
# in sys.modules), and validate_pfunctions() calls inspect.getsourcefile() on the
|
|
101
|
+
# result -- both need a real, registered module or the rebuild dies with
|
|
102
|
+
# "Unable to build parser" / "TypeError: ... got NoneType".
|
|
103
|
+
sys.modules.setdefault(ns.__name__, ns)
|
|
104
|
+
(stub_dir / "generic.py").write_text(
|
|
105
|
+
"# pyobs-gui: vendored astropy.units.format.generic PLY grammar (Nuitka workaround).\n",
|
|
106
|
+
encoding="utf-8",
|
|
107
|
+
)
|
|
108
|
+
|
|
79
109
|
ns.t_COMMA = r"\,"
|
|
80
110
|
ns.t_PRODUCT = "[*.]"
|
|
81
111
|
ns.t_DIVISION = "/"
|
|
@@ -410,12 +440,23 @@ def _namespace_pdict(ns: types.ModuleType) -> dict[str, Any]:
|
|
|
410
440
|
return {k: getattr(ns, k) for k in dir(ns)}
|
|
411
441
|
|
|
412
442
|
|
|
413
|
-
def patch_generic_unit_parser() -> None:
|
|
443
|
+
def patch_generic_unit_parser(*, compiled: bool | None = None) -> None:
|
|
414
444
|
"""Patch astropy.extern.ply's frame-walking helpers to fall back to our vendored grammar.
|
|
415
445
|
|
|
416
|
-
|
|
417
|
-
original frame walk always
|
|
446
|
+
Only intended for the Nuitka-compiled standalone binary. Under a regular interpreter the
|
|
447
|
+
original frame walk always finds the grammar, and installing the wrapper would *shift* the
|
|
448
|
+
walk by one stack frame and break astropy's parsing (see module docstring / pyobs-gui issue
|
|
449
|
+
#151), so unless ``compiled`` is true this is a strict no-op.
|
|
450
|
+
|
|
451
|
+
Pass ``compiled`` as ``"__compiled__" in globals()`` evaluated in the entry package
|
|
452
|
+
(``pyobs_gui/__init__.py``), which is guaranteed to be compiled in the binary. When left as
|
|
453
|
+
None the marker is checked in this module's own globals instead.
|
|
418
454
|
"""
|
|
455
|
+
if compiled is None:
|
|
456
|
+
compiled = "__compiled__" in globals()
|
|
457
|
+
if not compiled:
|
|
458
|
+
return
|
|
459
|
+
|
|
419
460
|
from astropy.extern.ply import lex as ply_lex
|
|
420
461
|
from astropy.extern.ply import yacc as ply_yacc
|
|
421
462
|
|
|
@@ -423,6 +464,14 @@ def patch_generic_unit_parser() -> None:
|
|
|
423
464
|
original_lex_dict = ply_lex.get_caller_module_dict
|
|
424
465
|
|
|
425
466
|
def _fallback_pdict(pdict: dict[str, Any] | None) -> dict[str, Any]:
|
|
467
|
+
# Only the *generic unit* format's grammar is vendored here. astropy's other PLY
|
|
468
|
+
# grammars (angle/cds/ogip/vounit) would need the identical treatment, and feeding
|
|
469
|
+
# them the generic grammar would silently parse with the wrong productions (that is
|
|
470
|
+
# exactly how the binary's coordinate parsing broke: the angle parser got the unit
|
|
471
|
+
# grammar). For any other grammar return the broken-locals pdict unchanged so the
|
|
472
|
+
# build fails loudly instead of corrupting results.
|
|
473
|
+
if pdict is not None and pdict.get("__name__") != "astropy.units.format.generic":
|
|
474
|
+
return dict(pdict)
|
|
426
475
|
# Keep whatever the real (possibly broken-locals) pdict already has -- __file__/
|
|
427
476
|
# __package__/__name__ are module globals and come through fine even on a compiled
|
|
428
477
|
# frame -- and only supplement the missing tokens/p_*/t_* grammar entries. Replacing
|
|
@@ -435,7 +484,12 @@ def patch_generic_unit_parser() -> None:
|
|
|
435
484
|
|
|
436
485
|
def patched_yacc_dict(levels: int) -> dict[str, Any]:
|
|
437
486
|
try:
|
|
438
|
-
|
|
487
|
+
# Our wrapper adds one frame compared with the unpatched call chain (the original
|
|
488
|
+
# walk is now called from here instead of directly from astropy's parsing.yacc /
|
|
489
|
+
# _patch_ply_module wrapper), so step one level deeper to land on the same frame
|
|
490
|
+
# the original walk would have inspected. Without this the fallback fires under
|
|
491
|
+
# plain CPython and astropy's parsing breaks (pyobs-gui issue #151).
|
|
492
|
+
pdict = original_yacc_dict(levels + 1)
|
|
439
493
|
except Exception:
|
|
440
494
|
return _fallback_pdict(None)
|
|
441
495
|
if "tokens" not in pdict:
|
|
@@ -444,7 +498,7 @@ def patch_generic_unit_parser() -> None:
|
|
|
444
498
|
|
|
445
499
|
def patched_lex_dict(levels: int) -> dict[str, Any]:
|
|
446
500
|
try:
|
|
447
|
-
pdict = original_lex_dict(levels)
|
|
501
|
+
pdict = original_lex_dict(levels + 1)
|
|
448
502
|
except Exception:
|
|
449
503
|
return _fallback_pdict(None)
|
|
450
504
|
if "tokens" not in pdict:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pyobs-gui"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.1"
|
|
4
4
|
description = "A remote GUI for pyobs"
|
|
5
5
|
authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -12,7 +12,7 @@ dependencies = [
|
|
|
12
12
|
"sunpy[all]>=7.0.1",
|
|
13
13
|
"QtAwesome>=1.4.0,<2",
|
|
14
14
|
"qfitswidget>=0.13.1",
|
|
15
|
-
"pyobs-core>=2.0.0
|
|
15
|
+
"pyobs-core>=2.0.0,<3",
|
|
16
16
|
"pyside6>=6.10.1",
|
|
17
17
|
"astroplan>=0.10.1",
|
|
18
18
|
"astropy>=7.0.1,<8",
|
|
@@ -3256,7 +3256,7 @@ wheels = [
|
|
|
3256
3256
|
|
|
3257
3257
|
[[package]]
|
|
3258
3258
|
name = "pyobs-core"
|
|
3259
|
-
version = "2.0.0
|
|
3259
|
+
version = "2.0.0"
|
|
3260
3260
|
source = { registry = "https://pypi.org/simple" }
|
|
3261
3261
|
dependencies = [
|
|
3262
3262
|
{ name = "aiohttp" },
|
|
@@ -3288,14 +3288,14 @@ dependencies = [
|
|
|
3288
3288
|
{ name = "tenacity" },
|
|
3289
3289
|
{ name = "typing-extensions" },
|
|
3290
3290
|
]
|
|
3291
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
3291
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/35/57654254c92f7264454a527abc317742995189ee7d7a2d9c6c5b32c90fc5/pyobs_core-2.0.0.tar.gz", hash = "sha256:87b77406f907a9fecb4630a45c002e354134e3c8b11a51e436289489bbb18fe6", size = 374158, upload-time = "2026-08-26T11:44:08.181Z" }
|
|
3292
3292
|
wheels = [
|
|
3293
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3293
|
+
{ url = "https://files.pythonhosted.org/packages/35/11/e8af2e0f099a16808ef1f42d398af73bc6c3935501f08a83f6628503e679/pyobs_core-2.0.0-py3-none-any.whl", hash = "sha256:3e97cc12d653978c3d963d41b984702a3169914776ef970d0fa21619d5cb3df6", size = 596861, upload-time = "2026-08-26T11:44:06.642Z" },
|
|
3294
3294
|
]
|
|
3295
3295
|
|
|
3296
3296
|
[[package]]
|
|
3297
3297
|
name = "pyobs-gui"
|
|
3298
|
-
version = "2.0.
|
|
3298
|
+
version = "2.0.1"
|
|
3299
3299
|
source = { editable = "." }
|
|
3300
3300
|
dependencies = [
|
|
3301
3301
|
{ name = "astroplan" },
|
|
@@ -3339,7 +3339,7 @@ requires-dist = [
|
|
|
3339
3339
|
{ name = "colour", specifier = ">=0.1.5,<0.2" },
|
|
3340
3340
|
{ name = "keyring", specifier = ">=25.7.0,<26" },
|
|
3341
3341
|
{ name = "matplotlib", specifier = ">=3.10.1,<4" },
|
|
3342
|
-
{ name = "pyobs-core", specifier = ">=2.0.0
|
|
3342
|
+
{ name = "pyobs-core", specifier = ">=2.0.0,<3" },
|
|
3343
3343
|
{ name = "pyside6", specifier = ">=6.10.1" },
|
|
3344
3344
|
{ name = "qasync", specifier = ">=0.27.1,<0.29" },
|
|
3345
3345
|
{ name = "qfitswidget", specifier = ">=0.13.1" },
|
|
@@ -3396,7 +3396,7 @@ wheels = [
|
|
|
3396
3396
|
|
|
3397
3397
|
[[package]]
|
|
3398
3398
|
name = "pyside6"
|
|
3399
|
-
version = "6.11.
|
|
3399
|
+
version = "6.11.2"
|
|
3400
3400
|
source = { registry = "https://pypi.org/simple" }
|
|
3401
3401
|
dependencies = [
|
|
3402
3402
|
{ name = "pyside6-addons" },
|
|
@@ -3404,42 +3404,42 @@ dependencies = [
|
|
|
3404
3404
|
{ name = "shiboken6" },
|
|
3405
3405
|
]
|
|
3406
3406
|
wheels = [
|
|
3407
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3408
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3409
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3410
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3411
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3407
|
+
{ url = "https://files.pythonhosted.org/packages/ae/b5/99ff75f604d69eda1c5d1fe85cc43fb697d95eabc30ba86af099c2ddcd96/pyside6-6.11.2-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:13a3c79816879d9743672a669f1988f74459a78f89a97a2624fae4fe059ffa3a", size = 571875, upload-time = "2026-08-18T06:37:27.794Z" },
|
|
3408
|
+
{ url = "https://files.pythonhosted.org/packages/b2/fe/968844def58150a41568b505edca0d68df6901b20ea4222ccb0c069cc703/pyside6-6.11.2-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:dc6d03990489a5085842770718392ef5de36352d8f608d9a9fe03e60af4d7b66", size = 572120, upload-time = "2026-08-18T06:37:30.298Z" },
|
|
3409
|
+
{ url = "https://files.pythonhosted.org/packages/5e/5c/f4ecc6defaec645e5ac3ca2f99e3da286a28d1c647c2d10b584e0392b94c/pyside6-6.11.2-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:57fe867a6c93821a085d74e8a26f863fc2363516848181c466032595b33b1729", size = 572121, upload-time = "2026-08-18T06:37:32.383Z" },
|
|
3410
|
+
{ url = "https://files.pythonhosted.org/packages/94/fe/4aea9d30300fff4cda9bb729c1363b9e1095a8544e0d6b57065465e16599/pyside6-6.11.2-cp310-abi3-win_amd64.whl", hash = "sha256:3201d67e3c10be2eaedd3910ff0f02351eca7e88c95a291cde5e7f2f55ef207f", size = 578382, upload-time = "2026-08-18T06:37:34.385Z" },
|
|
3411
|
+
{ url = "https://files.pythonhosted.org/packages/26/b0/8e2fb01e9ee15ad29fe10d0dd2d37f503e4aa3714c9fbb07aca380618de7/pyside6-6.11.2-cp310-abi3-win_arm64.whl", hash = "sha256:0444ac71d0791a19bded35f6d9a94515941f23a6eb7098ca45a1b64a338be697", size = 561768, upload-time = "2026-08-18T06:37:36.437Z" },
|
|
3412
3412
|
]
|
|
3413
3413
|
|
|
3414
3414
|
[[package]]
|
|
3415
3415
|
name = "pyside6-addons"
|
|
3416
|
-
version = "6.11.
|
|
3416
|
+
version = "6.11.2"
|
|
3417
3417
|
source = { registry = "https://pypi.org/simple" }
|
|
3418
3418
|
dependencies = [
|
|
3419
3419
|
{ name = "pyside6-essentials" },
|
|
3420
3420
|
{ name = "shiboken6" },
|
|
3421
3421
|
]
|
|
3422
3422
|
wheels = [
|
|
3423
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3424
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3425
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3426
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3427
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3423
|
+
{ url = "https://files.pythonhosted.org/packages/e3/91/339fe9f7c94163815004ccd6b5c58b926b2dfb4e51c3b5563d412eab151f/pyside6_addons-6.11.2-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:354c574a839f7d0751960ba03f33bec87c95e0f2796dca3287f54d03abe97dac", size = 332047075, upload-time = "2026-08-18T06:35:33.037Z" },
|
|
3424
|
+
{ url = "https://files.pythonhosted.org/packages/28/cd/ce470e20f68901f4dfa5f742d6a3a58ba865684a232e4b87d5a1a2179cc0/pyside6_addons-6.11.2-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a8b00956925fbdeffc7052cf933506391289f35ac4f3f71a0a167ec195cd47b4", size = 175062576, upload-time = "2026-08-18T06:35:45.583Z" },
|
|
3425
|
+
{ url = "https://files.pythonhosted.org/packages/11/bd/f725a8984703612c72cd17d0871d047132bacaccc13fc0d288a5e8a37dad/pyside6_addons-6.11.2-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a2ca3c73e5f060d4aca49451abd9fba68dd0e1c66ff40cea3a1fe0415def579a", size = 170827254, upload-time = "2026-08-18T06:35:56.675Z" },
|
|
3426
|
+
{ url = "https://files.pythonhosted.org/packages/fb/c1/08bf6594101b42fc88834009f1dac59a983c5b6805c62c5081f077d09b4a/pyside6_addons-6.11.2-cp310-abi3-win_amd64.whl", hash = "sha256:f449ea4431da20e7b86752cca8d166f93434516fe417f981c27e5f8e1b554407", size = 168208836, upload-time = "2026-08-18T06:36:07.295Z" },
|
|
3427
|
+
{ url = "https://files.pythonhosted.org/packages/26/60/e4b7f09343e9f29e565f488fb44c4f1fe260db481ba2c08ad8a1a7d48216/pyside6_addons-6.11.2-cp310-abi3-win_arm64.whl", hash = "sha256:d5606af369484b862b4d5741cfc179e19d2b8819c3e04d210b8188e0c9f85988", size = 35807245, upload-time = "2026-08-18T06:36:12.485Z" },
|
|
3428
3428
|
]
|
|
3429
3429
|
|
|
3430
3430
|
[[package]]
|
|
3431
3431
|
name = "pyside6-essentials"
|
|
3432
|
-
version = "6.11.
|
|
3432
|
+
version = "6.11.2"
|
|
3433
3433
|
source = { registry = "https://pypi.org/simple" }
|
|
3434
3434
|
dependencies = [
|
|
3435
3435
|
{ name = "shiboken6" },
|
|
3436
3436
|
]
|
|
3437
3437
|
wheels = [
|
|
3438
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3439
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3440
|
-
{ url = "https://files.pythonhosted.org/packages/4c/
|
|
3441
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3442
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3438
|
+
{ url = "https://files.pythonhosted.org/packages/6f/16/0b7ecf89ebada82ed0430be33809ff325761ece83104f8635b1bd101fcd0/pyside6_essentials-6.11.2-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:77795c145202e65a78d88f7cd409d186e3ba23d159bdb3ba2dcd159ae5e5f0d9", size = 110800753, upload-time = "2026-08-18T06:36:33.674Z" },
|
|
3439
|
+
{ url = "https://files.pythonhosted.org/packages/0e/1a/84a84bbc75835ee88abdcb66eb875b8e1a21834af9b833bc1893f2c1bfaf/pyside6_essentials-6.11.2-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:aaf9f25f0f324874085fa5b26a610318db8a8e243cf85bb3e5400595191c7778", size = 80108947, upload-time = "2026-08-18T06:36:40.637Z" },
|
|
3440
|
+
{ url = "https://files.pythonhosted.org/packages/60/4c/d92b08a2151d095b9a3725fa0e71b215ec686d40bbd5d8b702d21a9b5eaa/pyside6_essentials-6.11.2-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:d3ec6e1885c46e57f16364f38ea8040ffc5dc0b18341058f608fede3ba930567", size = 79575497, upload-time = "2026-08-18T06:36:46.97Z" },
|
|
3441
|
+
{ url = "https://files.pythonhosted.org/packages/dc/09/d2662684aee4d3f027ff9b1e965f22301bc28ffc5b7f167658508e4475dc/pyside6_essentials-6.11.2-cp310-abi3-win_amd64.whl", hash = "sha256:c8a29def77032773a30879f7f24415b5395ad08592d147c170824ef4c735dfc1", size = 76913043, upload-time = "2026-08-18T06:36:54.038Z" },
|
|
3442
|
+
{ url = "https://files.pythonhosted.org/packages/cd/87/4dd2a6468cea600da1fcf9c7f02bc248eeaa98cdc75658e48e669d95326a/pyside6_essentials-6.11.2-cp310-abi3-win_arm64.whl", hash = "sha256:fadd75c5c20800d64dd0a586ea8cb337c5e630aa2246df0e5105738afa46e02c", size = 58125520, upload-time = "2026-08-18T06:36:59.073Z" },
|
|
3443
3443
|
]
|
|
3444
3444
|
|
|
3445
3445
|
[[package]]
|
|
@@ -4035,14 +4035,14 @@ wheels = [
|
|
|
4035
4035
|
|
|
4036
4036
|
[[package]]
|
|
4037
4037
|
name = "shiboken6"
|
|
4038
|
-
version = "6.11.
|
|
4038
|
+
version = "6.11.2"
|
|
4039
4039
|
source = { registry = "https://pypi.org/simple" }
|
|
4040
4040
|
wheels = [
|
|
4041
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4042
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4043
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4044
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4045
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4041
|
+
{ url = "https://files.pythonhosted.org/packages/47/44/11bf71c36e71936ab4e923e5dd23599dab527c4488b01860b0f689ce9947/shiboken6-6.11.2-cp310-abi3-macosx_13_0_universal2.whl", hash = "sha256:53659683b1f7a08e9f87eff9b1065f1ceb7110cd7a4bc09fdf5efe43d286604d", size = 476674, upload-time = "2026-08-18T06:37:11.526Z" },
|
|
4042
|
+
{ url = "https://files.pythonhosted.org/packages/a5/9a/f41bea4316d0c1bec4800842dcb4bd8fd3e29d6a79c496bc32e1aec42583/shiboken6-6.11.2-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7a7a0a72a9ed26c9bf77d42246b1c736486befb8f31aa2fb29957ea4cdd1c1c2", size = 272435, upload-time = "2026-08-18T06:37:13.397Z" },
|
|
4043
|
+
{ url = "https://files.pythonhosted.org/packages/56/05/79ed0697515d4fc7435459e4ed4c4a3b5621a55b7c91d0f3f2cc3d617aa0/shiboken6-6.11.2-cp310-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:4bbbd6fa4d7cff5ec5e12bc4c10e1d845fa30c89457ecb13cc64f7bddb77f6f9", size = 270668, upload-time = "2026-08-18T06:37:15.025Z" },
|
|
4044
|
+
{ url = "https://files.pythonhosted.org/packages/ce/6b/fee1b4814317e4664e318644c9c007676c65a71e5b2b9d3ac4121a94dc0a/shiboken6-6.11.2-cp310-abi3-win_amd64.whl", hash = "sha256:6ab0eba1c904455df621f9a6df3ca2bb896bab8670572d2bc4e37804ae91f19a", size = 1226578, upload-time = "2026-08-18T06:37:18.002Z" },
|
|
4045
|
+
{ url = "https://files.pythonhosted.org/packages/4d/b5/80c4e5aafeb8ac777cf5a1becfe87ac7197c35051df00b5f7819787e09d5/shiboken6-6.11.2-cp310-abi3-win_arm64.whl", hash = "sha256:97c49432488df958f0308736f3d15b6915d8826fc380af17bb4b9ec5c4a5e81b", size = 1784669, upload-time = "2026-08-18T06:37:21.046Z" },
|
|
4046
4046
|
]
|
|
4047
4047
|
|
|
4048
4048
|
[[package]]
|
|
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
|
|
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
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-down-solid.svg
RENAMED
|
File without changes
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-left-solid.svg
RENAMED
|
File without changes
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-right-solid.svg
RENAMED
|
File without changes
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/pyobs_gui/qt/resources/arrow-alt-circle-up-solid.svg
RENAMED
|
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
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/specs/2026-08-20-gui-remote-call-error-handling.md
RENAMED
|
File without changes
|
{pyobs_gui-2.0.0.dev22 → pyobs_gui-2.0.1}/specs/2026-08-21-gui-widget-startup-responsiveness.md
RENAMED
|
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
|