BETSEE 1.1.0.0 (Nice Nestor) released. Significant changes include: * Installation improvements: * BETSE 1.1.0 required. Each version of BETSEE now requires the same version of BETSE, excluding the trailing patch number of that version of BETSEE (e.g., BETSEE 1.1.0.0 and 1.1.0.1 both require BETSE 1.1.0). Since newer versions of BETSE typically break backward compatibility with older versions of BETSEE, this does not extend to newer versions of BETSE. Prior versions of BETSEE erroneously pretended to support arbitrary versions of BETSE. * Runtime improvements: * High-DPI scaling detection. Platforms natively supporting high-DPI scaling are now implicitly detected at application startup, thanks to the newly defined betse.util.os.displays.is_dpi_scaling() tester. * Testing improvements: * Top-level "test" shell script. This script has been imported verbatim from the BETSE codebase in preparation for eventual continuous integration (CI). * GitLab CI configuration. A first-draft implementation of a ".gitlab-ci.yml" file has been added to the repository. Note that this configuration lacks "pytest-xvfb" and "pytest-qt" support and hence is currently broken. * Fatal errors resolved: * PYSIDE-1092. pyside2uic 5.13.0 broke backward API compatibility by requiring that the public pyside2uic.Compiler.compiler.UICompiler.__init__() method now be passed a new mandatory "all_pyside2_modules" parameter. Since the pyside2uic.__init__.compileUi() function defaults this parameter to simply "PySide2.__all__" (i.e., the list of all compiled PySide2 C extensions), it would have been trivial for Qt engineers to render this parameter optional via the same default. They did not; ergo, we do. For further details, see also: https://bugreports.qt.io/browse/PYSIDE-1092 * Application shutdown exception. A fatal (albeit technically innocuous) exception raised at application shutdown caused by the now-guaranteed closure of previously open logfile handles has been summarily resolved. * Deprecation warnings resolved: * A deprecation from the "betsee" script wrapper. * API generalizations: * Generalized the "betsee.guiappmeta" submodule: * Overrode the late-time and thus safe BetseeAppMeta.deinit() method to call the betsee.util.app.guiappwindow.unset_main_window() function (which effectively garbage collects the entire Qt object stack), previously called by the early-time and thus unsafe betsee.gui.window.guiwindow.QBetseeMainWindow.closeEvent() method. * Generalized the "betsee.util.io.log.guiloghandle" submodule: * Refactored the "LogHandlerSignal" subclass integrating the Python logging API with the Qt signals and slots API: * Overrode the standard logging.Handler.close() method to explicitly nullify the signal to which this subclass forwards logging messages. * Overrode the standard logging.Handler.emit() method to silently reduce to a noop when this signal is nullified (i.e., when the close() method has been called at least once).