From f117b582d9e6c6f5b29056e552906e50002132eb Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 6 Jun 2025 12:22:15 -0300 Subject: [PATCH 1/6] MNT: remove pkg_resources. --- pyqt-apps/siriushla/util.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pyqt-apps/siriushla/util.py b/pyqt-apps/siriushla/util.py index 7305ec7a1..eac303fb1 100644 --- a/pyqt-apps/siriushla/util.py +++ b/pyqt-apps/siriushla/util.py @@ -1,25 +1,22 @@ """Util module.""" import os as _os -import time as _time import subprocess as _subprocess -import pkg_resources as _pkg_resources +import time as _time from functools import partial as _part -from qtpy.QtCore import QFile as _QFile, Signal as _Signal, QThread as _QThread -from qtpy.QtGui import QColor -from qtpy.QtWidgets import QPushButton, QAction, QApplication, QDialog, \ - QHBoxLayout, QLabel import qtawesome as qta from pydm.utilities.stylesheet import _get_style_data as pydm_get_style_data - +from qtpy.QtCore import QFile as _QFile, QThread as _QThread, Signal as _Signal +from qtpy.QtGui import QColor +from qtpy.QtWidgets import QAction, QApplication, QDialog, QHBoxLayout, \ + QLabel, QPushButton THREAD = None def get_package_version(): - fname = _pkg_resources.resource_filename(__name__, 'VERSION') - with open(fname, 'r') as _f: - version = _f.read().strip() + """Return siriushla version string.""" + from siriushla import __version__ as version return version From 3a0c64822d68b423082a6ebdfa7b4e35bc236e1e Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 6 Jun 2025 12:57:44 -0300 Subject: [PATCH 2/6] MNT: Modernize install. --- pyqt-apps/pyproject.toml | 177 +++++++++++++++++++++++++++++++++++++++ pyqt-apps/setup.py | 19 +++-- 2 files changed, 191 insertions(+), 5 deletions(-) create mode 100644 pyqt-apps/pyproject.toml diff --git a/pyqt-apps/pyproject.toml b/pyqt-apps/pyproject.toml new file mode 100644 index 000000000..b44cb62b6 --- /dev/null +++ b/pyqt-apps/pyproject.toml @@ -0,0 +1,177 @@ +[build-system] +requires = ["setuptools>=44"] +build-backend = "setuptools.build_meta" + +[project] +name = "siriushla" +authors = [{ name = "lnls-sirius" } ] +maintainers = [ + {name = "Ana Oliveira", email = "ana.clara@lnls.br"}, + {name = "Ximenes Resende", email = "xresende@gmail.com"}, + {name = "Fernando H. de Sá", email = "fernandohds564@gmail.com"}, + {name = "Murilo Barbosa Alves", email= "murilo.alves@lnls.br"} +] +description = "Client Applications for Sirius" +readme = "README.md" +dynamic = ["version", "dependencies"] +requires-python = ">=3.6" +classifiers = [ + "Intended Audience :: Science/Research", + "Programming Language :: Python", + "Topic :: Scientific/Engineering", +] +keywords = ["SIRIUS", "python", "EPICS"] + +license = "GPL-3.0" +license-files= [ "LICENSE", ] + +[project.urls] +Homepage = "https://github.com/lnls-sirius/hla" +Download = "https://github.com/lnls-sirius/hla" +Repository = "https://github.com/lnls-sirius/hla" +Issues = "https://github.com/lnls-sirius/hla/issues" + +# --- Setuptools specific configurations --- +[tool.setuptools] +include-package-data = true +# NOTE: This is not the standard way of defining scripts. +# Once we abandon phython3.6 and the setup.py file, we should +# consider using the table [projec.scripts], defining valid entrypoints. +script-files = [ + "scripts/sirius-hla-as-ap-configdb.py", + "scripts/sirius-hla-as-ap-effmon.py", + "scripts/sirius-hla-as-ap-energybutton.py", + "scripts/sirius-hla-as-ap-injection.py", + "scripts/sirius-hla-as-ap-launcher.py", + "scripts/sirius-hla-as-ap-macreport.py", + "scripts/sirius-hla-as-ap-magoffconv.py", + "scripts/sirius-hla-as-ap-monitor.py", + "scripts/sirius-hla-as-ap-pvsconfigs.py", + "scripts/sirius-hla-as-ap-pvsconfigs-save.py", + "scripts/sirius-hla-as-ap-pvsconfigs-load.py", + "scripts/sirius-hla-as-ap-rabpmmon.py", + "scripts/sirius-hla-as-ap-radmon.py", + "scripts/sirius-hla-as-di-bpm.py", + "scripts/sirius-hla-as-di-dcct.py", + "scripts/sirius-hla-as-di-scrn.py", + "scripts/sirius-hla-as-ps-commands.py", + "scripts/sirius-hla-as-ps-cycle.py", + "scripts/sirius-hla-as-ps-detail.py", + "scripts/sirius-hla-as-ps-diag.py", + "scripts/sirius-hla-as-ps-graphmon.py", + "scripts/sirius-hla-as-ps-monitor.py", + "scripts/sirius-hla-as-pu-control.py", + "scripts/sirius-hla-as-pu-detail.py", + "scripts/sirius-hla-as-ti-afc.py", + "scripts/sirius-hla-as-ti-control.py", + "scripts/sirius-hla-as-ti-eve.py", + "scripts/sirius-hla-as-ti-evg.py", + "scripts/sirius-hla-as-ti-evr.py", + "scripts/sirius-hla-as-ti-fout.py", + "scripts/sirius-hla-bl-ap-imgproc.py", + "scripts/sirius-hla-bo-ap-chargemon.py", + "scripts/sirius-hla-bo-ap-chromcorr.py", + "scripts/sirius-hla-bo-ap-injcontrol.py", + "scripts/sirius-hla-bo-ap-ramp.py", + "scripts/sirius-hla-bo-ap-sofb.py", + "scripts/sirius-hla-bo-ap-tunecorr.py", + "scripts/sirius-hla-bo-di-tune.py", + "scripts/sirius-hla-bo-di-vlight.py", + "scripts/sirius-hla-bo-offconfig.py", + "scripts/sirius-hla-bo-ps-control.py", + "scripts/sirius-hla-bo-ps-wfmerror.py", + "scripts/sirius-hla-bo-pu-control.py", + "scripts/sirius-hla-bo-rf-control.py", + "scripts/sirius-hla-it-di-vlight.py", + "scripts/sirius-hla-it-eg-control.py", + "scripts/sirius-hla-it-ps-control.py", + "scripts/sirius-hla-it-ti-control.py", + "scripts/sirius-hla-li-ap-emittance.py", + "scripts/sirius-hla-li-ap-energy.py", + "scripts/sirius-hla-li-ap-mpscon.py", + "scripts/sirius-hla-li-ap-mpsmon.py", + "scripts/sirius-hla-li-di-bpms.py", + "scripts/sirius-hla-li-di-scrns.py", + "scripts/sirius-hla-li-eg-control.py", + "scripts/sirius-hla-li-ps-control.py", + "scripts/sirius-hla-li-pu-modltr.py", + "scripts/sirius-hla-li-rf-llrf.py", + "scripts/sirius-hla-li-va-control.py", + "scripts/sirius-hla-as-cr-control.py", + "scripts/sirius-hla-si-ap-chromcorr.py", + "scripts/sirius-hla-si-ap-currlt.py", + "scripts/sirius-hla-si-ap-fofb.py", + "scripts/sirius-hla-si-ap-genstatus.py", + "scripts/sirius-hla-si-ap-idff.py", + "scripts/sirius-hla-si-ap-orbintlk.py", + "scripts/sirius-hla-si-ap-sofb.py", + "scripts/sirius-hla-si-ap-tunecorr.py", + "scripts/sirius-hla-si-bs-fofbsysid.py", + "scripts/sirius-hla-si-di-bbb.py", + "scripts/sirius-hla-si-di-equalize_bpms_switching.py", + "scripts/sirius-hla-si-di-fpmosc.py", + "scripts/sirius-hla-si-di-scraps.py", + "scripts/sirius-hla-si-di-tune.py", + "scripts/sirius-hla-si-di-vlight.py", + "scripts/sirius-hla-si-id-control.py", + "scripts/sirius-hla-si-offconfig.py", + "scripts/sirius-hla-si-ps-control.py", + "scripts/sirius-hla-si-ps-fastcorracq.py", + "scripts/sirius-hla-si-pu-control.py", + "scripts/sirius-hla-si-rf-control.py", + "scripts/sirius-hla-tb-ap-control.py", + "scripts/sirius-hla-tb-ap-emittance.py", + "scripts/sirius-hla-tb-ap-posang.py", + "scripts/sirius-hla-tb-ap-sofb.py", + "scripts/sirius-hla-tb-di-icts.py", + "scripts/sirius-hla-tb-di-slits.py", + "scripts/sirius-hla-tb-ps-control.py", + "scripts/sirius-hla-tb-pu-control.py", + "scripts/sirius-hla-ts-ap-control.py", + "scripts/sirius-hla-ts-ap-posang.py", + "scripts/sirius-hla-ts-ap-sofb.py", + "scripts/sirius-hla-ts-di-icts.py", + "scripts/sirius-hla-ts-ps-control.py", + "scripts/sirius-hla-ts-pu-control.py", +] + +[tool.setuptools.dynamic] +version = { file = "VERSION" } +dependencies = { file = "requirements.txt" } + +[tool.setuptools.package-data] +siriushla = ["VERSION"] +"siriushla.si_di_bbb" = ["*.png", ] +"siriushla.si_id_control" = ["*.gif", ] + +# --- linter and formatter configurations --- +[tool.ruff] +select = [ + "W", "E", "A", "B", "C90", "D", "I002", "N", "F", "G", "ARG", "S", "NPY"] +ignore = [ + "D203", "D204", "D213", "D215", "D400", "D401", "D404", "D406", "D407", + "D408", "D409", "D413", "E203", "E226"] +ignore-init-module-imports = true +preview = true +line-length = 79 +fix = true + +[tool.ruff.extend-per-file-ignores] +"__init__.py" = ["F401", "F821"] + +[tool.ruff.format] +skip-magic-trailing-comma = true + +[tool.ruff.lint.isort] +split-on-trailing-comma = false +combine-as-imports = true + +[tool.isort] +split_on_trailing_comma = false +combine_as_imports = true +combine_star = true +multi_line_output = "HANGING_INDENT" +order_by_type = false + +[tool.black] +line-length = 79 diff --git a/pyqt-apps/setup.py b/pyqt-apps/setup.py index 65a27cd39..6c2d9fed7 100755 --- a/pyqt-apps/setup.py +++ b/pyqt-apps/setup.py @@ -2,9 +2,11 @@ """HLA Setup.""" -from setuptools import setup, find_packages +import pathlib import unittest +from setuptools import find_packages, setup + def my_test_suite(): """.""" @@ -13,19 +15,26 @@ def my_test_suite(): return test_suite -with open('VERSION', 'r') as _f: - __version__ = _f.read().strip() +def get_abs_path(relative): + """.""" + return str(pathlib.Path(__file__).parent / relative) -with open('requirements.txt', 'r') as _f: - _requirements = _f.read().strip().split('\n') +with open(get_abs_path("README.md"), "r") as _f: + _long_description = _f.read().strip() + +with open(get_abs_path("VERSION"), "r") as _f: + __version__ = _f.read().strip() +with open(get_abs_path("requirements.txt"), "r") as _f: + _requirements = _f.read().strip().split("\n") setup( name='siriushla', version=__version__, author='lnls-sirius', description='Client Applications for Sirius', + long_description=_long_description, url='https://github.com/lnls-sirius/hla/pyqt-apps', download_url='https://github.com/lnls-sirius/hla', license='GNU GPLv3', From ec29ed52b381454dbfa27fe7e2f9b470325dcb0d Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 6 Jun 2025 12:58:33 -0300 Subject: [PATCH 3/6] MNT: add Makefile entry for tests, to be independent of setup.py. --- pyqt-apps/Makefile | 5 +++++ pyqt-apps/tests/run_tests.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 pyqt-apps/tests/run_tests.py diff --git a/pyqt-apps/Makefile b/pyqt-apps/Makefile index e2cf095f0..90b2c0581 100644 --- a/pyqt-apps/Makefile +++ b/pyqt-apps/Makefile @@ -4,9 +4,11 @@ INSTALL_DESIGNER_DIR ?= /usr/local/share/Qt/designer PACKAGE=siriushla PREFIX ?= PIP ?= pip +PYTHON ?= python ifeq ($(CONDA_PREFIX),) PREFIX=sudo -H PIP=pip-sirius + PYTHON=python-sirius endif install-designer: @@ -27,3 +29,6 @@ develop-install: develop-uninstall develop-uninstall: $(PIP) uninstall -y $(PACKAGE) + +run-tests: + $(PYTHON) tests/run_tests.py diff --git a/pyqt-apps/tests/run_tests.py b/pyqt-apps/tests/run_tests.py new file mode 100644 index 000000000..a90166916 --- /dev/null +++ b/pyqt-apps/tests/run_tests.py @@ -0,0 +1,14 @@ +"""Run all tests.""" + +import unittest + + +def main(): + test_loader = unittest.TestLoader() + test_suite = test_loader.discover('tests', pattern='test_*.py') + runner = unittest.TextTestRunner() + runner.run(test_suite) + + +if __name__ == "__main__": + main() From 2b42de1626c1e798a0abf9cf2d4e9791a48f16f2 Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 6 Jun 2025 13:09:09 -0300 Subject: [PATCH 4/6] MNT: Update @murilobalves email. --- pyqt-apps/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyqt-apps/pyproject.toml b/pyqt-apps/pyproject.toml index b44cb62b6..d2fdd2a9a 100644 --- a/pyqt-apps/pyproject.toml +++ b/pyqt-apps/pyproject.toml @@ -9,7 +9,7 @@ maintainers = [ {name = "Ana Oliveira", email = "ana.clara@lnls.br"}, {name = "Ximenes Resende", email = "xresende@gmail.com"}, {name = "Fernando H. de Sá", email = "fernandohds564@gmail.com"}, - {name = "Murilo Barbosa Alves", email= "murilo.alves@lnls.br"} + {name = "Murilo Barbosa Alves", email= "alvesb.murilo@gmail.com"} ] description = "Client Applications for Sirius" readme = "README.md" From 10f409659b29ac3a054658fd0bcd349df4690bb9 Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 6 Jun 2025 15:10:15 -0300 Subject: [PATCH 5/6] MNT: update pyproject.toml. --- pyqt-apps/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyqt-apps/pyproject.toml b/pyqt-apps/pyproject.toml index d2fdd2a9a..d31ffb6f7 100644 --- a/pyqt-apps/pyproject.toml +++ b/pyqt-apps/pyproject.toml @@ -28,7 +28,7 @@ license-files= [ "LICENSE", ] [project.urls] Homepage = "https://github.com/lnls-sirius/hla" Download = "https://github.com/lnls-sirius/hla" -Repository = "https://github.com/lnls-sirius/hla" +Repository = "https://github.com/lnls-sirius/hla.git" Issues = "https://github.com/lnls-sirius/hla/issues" # --- Setuptools specific configurations --- From 74e1b27789255bd53abcd88e5d3fda14b76220f5 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 12 Jun 2025 17:11:16 -0300 Subject: [PATCH 6/6] BUG: fix util.check_window_by_pid in case wmctrl fail to run. --- pyqt-apps/siriushla/as_ap_launcher/menu.py | 6 ++++-- pyqt-apps/siriushla/util.py | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pyqt-apps/siriushla/as_ap_launcher/menu.py b/pyqt-apps/siriushla/as_ap_launcher/menu.py index e8ae660f9..80784b3c3 100755 --- a/pyqt-apps/siriushla/as_ap_launcher/menu.py +++ b/pyqt-apps/siriushla/as_ap_launcher/menu.py @@ -193,7 +193,9 @@ def _create_tool_menu(self): try: host = _sbp.getoutput('hostname') - exist_xrandr = not bool(_sbp.getoutput('xrandr | grep missing')) + exist_xrandr = not bool( + _sbp.getoutput('xrandr | grep missing') + ) hosts = {'lnls449-linux', 'lnls451-linux', 'lnls454-linux'} except Exception: return menu @@ -985,7 +987,7 @@ def _change_resolution(self): disps = [o for o in out if ' connected' in o] ds_names = [d.split(' ')[0] for d in disps] - reg = '[0-9]{4}x[0-9]{4}\+([0-9]{1,4})\+[0-9]{1,4}' + reg = r'[0-9]{4}x[0-9]{4}\+([0-9]{1,4})\+[0-9]{1,4}' ds_pos = [ _re.findall(reg, d)[0] for di in disps for d in di.split(' ') if _re.match(reg, d)] diff --git a/pyqt-apps/siriushla/util.py b/pyqt-apps/siriushla/util.py index eac303fb1..618854ace 100644 --- a/pyqt-apps/siriushla/util.py +++ b/pyqt-apps/siriushla/util.py @@ -121,10 +121,12 @@ def check_process(cmd, is_window=True, is_pydm=False): def check_window_by_pid(pid, comm): if 'edm' in comm: - wind = _subprocess.getoutput('wmctrl -lpx | grep edm | grep SIRIUS') + sts, wind = _subprocess.getstatusoutput( + 'wmctrl -lpx | grep edm | grep SIRIUS' + ) else: - wind = _subprocess.getoutput('wmctrl -lpx | grep ' + pid) - if not wind: + sts, wind = _subprocess.getstatusoutput('wmctrl -lpx | grep ' + pid) + if sts or not wind: return '' window = wind.split('\n')[0].split()[0] return window @@ -134,7 +136,8 @@ def run_newprocess(cmd, is_window=True, is_pydm=False, **kwargs): pid, window = check_process(cmd, is_window=is_window, is_pydm=is_pydm) if window: _subprocess.run( - "wmctrl -iR " + window, stdin=_subprocess.PIPE, shell=True) + "wmctrl -iR " + window, stdin=_subprocess.PIPE, shell=True + ) elif not pid: _subprocess.Popen(cmd, **kwargs)