From 30f64d1d454fb8fa413f5c4ef3058b8a7aa42630 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 13:58:08 +0100 Subject: [PATCH 1/6] packaing: rename output executable to DicoGIS-gui or DicoGIS-cli --- builder/pyinstaller_build_ubuntu_cli.py | 11 +---------- builder/pyinstaller_build_ubuntu_gui.py | 11 +---------- builder/pyinstaller_build_windows_cli.py | 10 +--------- builder/pyinstaller_build_windows_gui.py | 10 +--------- 4 files changed, 4 insertions(+), 38 deletions(-) diff --git a/builder/pyinstaller_build_ubuntu_cli.py b/builder/pyinstaller_build_ubuntu_cli.py index 1c69541e..88edf3dc 100644 --- a/builder/pyinstaller_build_ubuntu_cli.py +++ b/builder/pyinstaller_build_ubuntu_cli.py @@ -8,7 +8,6 @@ # ########## Libraries ############# # ################################## -import platform import sys # Standard library @@ -16,7 +15,6 @@ from pathlib import Path # 3rd party -import distro import PyInstaller.__main__ # package @@ -38,14 +36,7 @@ "--collect-submodules=shellingham", "--console", "--log-level={}".format(getenv("PYINSTALLER_LOG_LEVEL", "WARN")), - "--name={}-cli_{}_{}{}_{}_Python{}".format( - __about__.__title_clean__, - __about__.__version__, - distro.id(), - distro.version(), - platform.architecture()[0], - platform.python_version(), - ).replace(".", "-"), + f"--name={__about__.__title_clean__}-cli.bin", "--noconfirm", "--onefile", str(package_folder.joinpath("cli/main.py")), diff --git a/builder/pyinstaller_build_ubuntu_gui.py b/builder/pyinstaller_build_ubuntu_gui.py index 7e5c1ba4..97bb9f25 100644 --- a/builder/pyinstaller_build_ubuntu_gui.py +++ b/builder/pyinstaller_build_ubuntu_gui.py @@ -8,7 +8,6 @@ # ########## Libraries ############# # ################################## -import platform import sys # Standard library @@ -16,7 +15,6 @@ from pathlib import Path # 3rd party -import distro import PyInstaller.__main__ # package @@ -36,14 +34,7 @@ "--add-data=LICENSE:.", "--add-data=README.md:.", "--log-level={}".format(getenv("PYINSTALLER_LOG_LEVEL", "WARN")), - "--name={}-gui_{}_{}{}_{}_Python{}".format( - __about__.__title_clean__, - __about__.__version__, - distro.id(), - distro.version(), - platform.architecture()[0], - platform.python_version(), - ).replace(".", "-"), + f"--name={__about__.__title_clean__}-gui.bin", "--noconfirm", "--noupx", # "--onedir", diff --git a/builder/pyinstaller_build_windows_cli.py b/builder/pyinstaller_build_windows_cli.py index bdabd843..e8b5262a 100644 --- a/builder/pyinstaller_build_windows_cli.py +++ b/builder/pyinstaller_build_windows_cli.py @@ -8,7 +8,6 @@ # ########## Libraries ############# # ################################## -import platform import sys # Standard library @@ -39,14 +38,7 @@ "--icon={}".format((package_folder / "bin/img/DicoGIS.ico").resolve()), "--log-level={}".format(getenv("PYINSTALLER_LOG_LEVEL", "WARN")), "--manifest={}".format((package_folder / "../builder/manifest.xml").resolve()), - "--name={}-cli_{}_{}{}_Python{}-{}".format( - __about__.__title_clean__, - __about__.__version__.replace(".", "-"), - platform.system(), - platform.architecture()[0], - platform.python_version_tuple()[0], - platform.python_version_tuple()[1], - ), + f"--name={__about__.__title_clean__}-gui", "--noconfirm", "--noupx", "--onefile", diff --git a/builder/pyinstaller_build_windows_gui.py b/builder/pyinstaller_build_windows_gui.py index 501af4e2..5da0b266 100644 --- a/builder/pyinstaller_build_windows_gui.py +++ b/builder/pyinstaller_build_windows_gui.py @@ -8,7 +8,6 @@ # ########## Libraries ############# # ################################## -import platform import sys # Standard library @@ -37,14 +36,7 @@ "--icon={}".format((package_folder / "bin/img/DicoGIS.ico").resolve()), "--log-level={}".format(getenv("PYINSTALLER_LOG_LEVEL", "WARN")), "--manifest={}".format((package_folder / "../builder/manifest.xml").resolve()), - "--name={}-gui_{}_{}{}_Python{}-{}".format( - __about__.__title_clean__, - __about__.__version__.replace(".", "-"), - platform.system(), - platform.architecture()[0], - platform.python_version_tuple()[0], - platform.python_version_tuple()[1], - ), + f"--name={__about__.__title_clean__}-gui", "--noconfirm", "--noupx", "--onefile", From f2dddf59c4ab96ce211ec30d47069ee9e4a07805 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 14:00:20 +0100 Subject: [PATCH 2/6] ci: add minimal integration tests using cli --- .github/workflows/builder_releaser.yml | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/builder_releaser.yml b/.github/workflows/builder_releaser.yml index 68653081..011bb299 100644 --- a/.github/workflows/builder_releaser.yml +++ b/.github/workflows/builder_releaser.yml @@ -72,26 +72,32 @@ jobs: - name: Generates executable for command-line version run: | python -O ./builder/pyinstaller_build_ubuntu_cli.py + chmod +x dist/DicoGIS-cli.bin - name: Save CLI binary as artifact uses: actions/upload-artifact@v4 with: name: DicoGIS_executable_ubuntu_CLI - path: dist/DicoGIS-cli_* + path: dist/DicoGIS-cli.bin if-no-files-found: error - name: Generates executable for graphical version run: | python -O ./builder/pyinstaller_build_ubuntu_gui.py + chmod +x dist/DicoGIS-gui.bin - name: Save it as artifact uses: actions/upload-artifact@v4 with: name: DicoGIS_executable_ubuntu_GUI - path: | - dist/DicoGIS-gui_* + path: dist/DicoGIS-gui.bin if-no-files-found: error + - name: Minimal integration test + run: | + ./dist/DicoGIS-cli.bin --help + ./dist/DicoGIS-cli.bin --version + build-windows: name: "🏠 Windows" runs-on: windows-latest @@ -131,7 +137,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: DicoGIS_executable_windows_CLI - path: dist/DicoGIS-cli_* + path: dist/DicoGIS-cli.exe if-no-files-found: error - name: Generates executable for graphical version @@ -142,10 +148,14 @@ jobs: uses: actions/upload-artifact@v4 with: name: DicoGIS_executable_windows_GUI - path: | - dist/DicoGIS-gui_* + path: dist/DicoGIS-gui.exe if-no-files-found: error + - name: Minimal integration test + run: | + ./dist/DicoGIS-cli.exe --help + ./dist/DicoGIS-cli.exe --version + release: name: "🚀 GitHub Release" runs-on: ubuntu-latest From c2dbef8dda9dbc2eaf1921bbdc28311688807c2d Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 14:13:41 +0100 Subject: [PATCH 3/6] fix: typo in output name --- builder/pyinstaller_build_windows_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/pyinstaller_build_windows_cli.py b/builder/pyinstaller_build_windows_cli.py index e8b5262a..fa17674b 100644 --- a/builder/pyinstaller_build_windows_cli.py +++ b/builder/pyinstaller_build_windows_cli.py @@ -38,7 +38,7 @@ "--icon={}".format((package_folder / "bin/img/DicoGIS.ico").resolve()), "--log-level={}".format(getenv("PYINSTALLER_LOG_LEVEL", "WARN")), "--manifest={}".format((package_folder / "../builder/manifest.xml").resolve()), - f"--name={__about__.__title_clean__}-gui", + f"--name={__about__.__title_clean__}-cli", "--noconfirm", "--noupx", "--onefile", From 2b05c54d8cad5b2baa37b960a445f23e5f15d48b Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 17:23:04 +0100 Subject: [PATCH 4/6] refacto: move GUI main windows in a separate folder and change setuptools gui_scrip --- dicogis/ui/main.py | 108 +++++++++++++++++++++ dicogis/{dicogis.py => ui/main_windows.py} | 0 setup.py | 2 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 dicogis/ui/main.py rename dicogis/{dicogis.py => ui/main_windows.py} (100%) diff --git a/dicogis/ui/main.py b/dicogis/ui/main.py new file mode 100644 index 00000000..956bd34b --- /dev/null +++ b/dicogis/ui/main.py @@ -0,0 +1,108 @@ +#! python3 # noqa: E265 + + +""" + DicoGIS + Automatize the creation of a dictionnary of geographic data + contained in a folders structures. + It produces an Excel output file (.xlsx) + + Julien Moura (@geojulien) +""" + +# ############################################################################## +# ########## Libraries ############# +# ################################## + +# standard library +import logging +import sys +from logging.handlers import RotatingFileHandler +from os import getenv +from sys import platform as opersys + +# GUI +from tkinter import TkVersion + +# Project +from dicogis.ui.main_windows import DicoGIS + +# ############################################################################## +# ############ Globals ############ +# ################################# + + +logger = logging.getLogger("DicoGIS") + +# ############################################################################## +# ############ Functions ########### +# ################################## + + +def main_gui_launcher(): + # LOG + + logging.captureWarnings(True) + logger.setLevel(logging.DEBUG) # all errors will be get + log_form = logging.Formatter( + "%(asctime)s || %(levelname)s " + "|| %(module)s - %(lineno)d ||" + " %(funcName)s || %(message)s" + ) + logfile = RotatingFileHandler("LOG_DicoGIS.log", "a", 5000000, 1) + logfile.setLevel(logging.DEBUG) + logfile.setFormatter(log_form) + logger.addHandler(logfile) + + # 3rd party + # condition import + if opersys == "linux": + import distro + + # check Tk version + logger.info(f"{TkVersion=}") + if TkVersion < 8.6: + logger.critical("DicoGIS requires Tkversion >= 8.6.") + sys.exit(1) + + # determine theme depending on operating system and distro + theme = "arc" + if theme_from_env := getenv("DICOGIS_UI_THEME"): + theme = theme_from_env + elif opersys == "darwin": + theme = "breeze" + elif opersys == "linux": + theme = "radiance" + if distro.name().lower() == "ubuntu": + theme = "yaru" + elif opersys == "win32": + theme = "breeze" + else: + logger.warning( + f"Your platform/operating system is not recognized: {opersys}. " + "It may lead to some strange behavior or buggy events." + ) + + logger.info(f"Used theme: {theme}") + + # launch the main UI + try: + app = DicoGIS(theme=theme) + app.set_theme(theme_name=theme) + except Exception as err: + logger.critical( + "Launching DicoGIS UI failed. Did you install the system " + f"requirements? Trace: {err}" + ) + raise (err) + + app.mainloop() + + +# ############################################################################ +# #### Stand alone program ######## +# ################################# + +if __name__ == "__main__": + """standalone execution""" + main_gui_launcher() diff --git a/dicogis/dicogis.py b/dicogis/ui/main_windows.py similarity index 100% rename from dicogis/dicogis.py rename to dicogis/ui/main_windows.py diff --git a/setup.py b/setup.py index 6d62b4c7..6cfa84ef 100644 --- a/setup.py +++ b/setup.py @@ -94,7 +94,7 @@ def load_requirements(requirements_files: Path | list[Path]) -> list: f"{__about__.__package_name__}-cli = dicogis.cli.main:cli_dicogis" ], "gui_scripts": [ - "dicogis = dicogis.DicoGIS:__main__", + f"{__about__.__package_name__}-gui = dicogis.ui.main:main_gui_launcher", ], }, # metadata From 6ddfcccc2c1627062d42418fd1094483056b5ac0 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 19:05:02 +0100 Subject: [PATCH 5/6] refacto: make naming more consistent --- dicogis/cli/main.py | 8 ++++---- dicogis/ui/main.py | 6 +++--- setup.py | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/dicogis/cli/main.py b/dicogis/cli/main.py index 6701f1f6..9de12ca6 100644 --- a/dicogis/cli/main.py +++ b/dicogis/cli/main.py @@ -19,7 +19,7 @@ # ########## Globals ############### # ################################## -cli_dicogis = typer.Typer() +dicogis_cli = typer.Typer() state = {"verbose": False} APP_NAME = __title__ logger = logging.getLogger(__name__) @@ -43,7 +43,7 @@ def version_callback(value: bool): raise typer.Exit() -@cli_dicogis.callback() +@dicogis_cli.callback() def main( verbose: Annotated[ bool, @@ -76,7 +76,7 @@ def main( # integrate subcommands -cli_dicogis.add_typer(cli_list, name="list") +dicogis_cli.add_typer(cli_list, name="list") # ############################################################################ @@ -84,4 +84,4 @@ def main( # ################################# if __name__ == "__main__": """standalone execution""" - cli_dicogis() + dicogis_cli() diff --git a/dicogis/ui/main.py b/dicogis/ui/main.py index 956bd34b..97dfddf9 100644 --- a/dicogis/ui/main.py +++ b/dicogis/ui/main.py @@ -39,9 +39,9 @@ # ################################## -def main_gui_launcher(): +def dicogis_gui(): + """Launch DicoGIS GUI.""" # LOG - logging.captureWarnings(True) logger.setLevel(logging.DEBUG) # all errors will be get log_form = logging.Formatter( @@ -105,4 +105,4 @@ def main_gui_launcher(): if __name__ == "__main__": """standalone execution""" - main_gui_launcher() + dicogis_gui() diff --git a/setup.py b/setup.py index 6cfa84ef..9ae5d215 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def load_requirements(requirements_files: Path | list[Path]) -> list: ), include_package_data=True, # dependencies - python_requires=">=3.9, <4", + python_requires=">=3.10, <4", extras_require={ "dev": load_requirements(HERE / "requirements/development.txt"), "doc": load_requirements(HERE / "requirements/documentation.txt"), @@ -91,10 +91,10 @@ def load_requirements(requirements_files: Path | list[Path]) -> list: # run entry_points={ "console_scripts": [ - f"{__about__.__package_name__}-cli = dicogis.cli.main:cli_dicogis" + f"{__about__.__package_name__}-cli = dicogis.cli.main:dicogis_cli" ], "gui_scripts": [ - f"{__about__.__package_name__}-gui = dicogis.ui.main:main_gui_launcher", + f"{__about__.__package_name__}-gui = dicogis.ui.main:dicogis_gui", ], }, # metadata @@ -103,15 +103,16 @@ def load_requirements(requirements_files: Path | list[Path]) -> list: "Intended Audience :: End Users/Desktop", "Intended Audience :: Information Technology", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Development Status :: 5 - Production/Stable", "Environment :: Win32 (MS Windows)", "License :: OSI Approved :: Apache Software License 2.0", "Operating System :: OS Independent", "Operating System :: Microsoft :: Windows :: Windows 10", + "Operating System :: Microsoft :: Windows :: Windows 11", "Topic :: Scientific/Engineering :: GIS", ], ) From 472b3cce84cc9706d854b67687991310bb3119a4 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 20 Mar 2024 19:09:36 +0100 Subject: [PATCH 6/6] refacto: use new gui module --- builder/pyinstaller_build_ubuntu_gui.py | 2 +- builder/pyinstaller_build_windows_gui.py | 2 +- docs/development/ubuntu.md | 4 +++- docs/development/windows.md | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/builder/pyinstaller_build_ubuntu_gui.py b/builder/pyinstaller_build_ubuntu_gui.py index 97bb9f25..4f8293db 100644 --- a/builder/pyinstaller_build_ubuntu_gui.py +++ b/builder/pyinstaller_build_ubuntu_gui.py @@ -40,6 +40,6 @@ # "--onedir", "--onefile", "--windowed", - str(package_folder / "dicogis.py"), + str(package_folder.joinpath("ui/main.py")), ] ) diff --git a/builder/pyinstaller_build_windows_gui.py b/builder/pyinstaller_build_windows_gui.py index 5da0b266..ec498137 100644 --- a/builder/pyinstaller_build_windows_gui.py +++ b/builder/pyinstaller_build_windows_gui.py @@ -42,6 +42,6 @@ "--onefile", "--version-file={}".format("version_info.txt"), "--windowed", - str(package_folder / "dicogis.py"), + str(package_folder.joinpath("ui/main.py")), ] ) diff --git a/docs/development/ubuntu.md b/docs/development/ubuntu.md index 5718fb07..35ee3e96 100644 --- a/docs/development/ubuntu.md +++ b/docs/development/ubuntu.md @@ -134,7 +134,9 @@ dicogis-cli --help GUI: ```sh -python dicogis/dicogis.py +dicogis-gui +# or +python dicogis/ui/main.py ``` ## Install git hooks diff --git a/docs/development/windows.md b/docs/development/windows.md index 10322dec..a50adee2 100644 --- a/docs/development/windows.md +++ b/docs/development/windows.md @@ -70,7 +70,9 @@ dicogis-cli --help GUI: ```sh -python dicogis/dicogis.py +dicogis-gui +# or +python dicogis/ui/main.py ``` ## Install git hooks