1. 14 May, 2020 1 commit
    • Cecil Curry's avatar
      Pytest warning resolved. · 776dffa1
      Cecil Curry authored
      This commit resolves a non-fatal warning emitted by recent pytest
      versions by explicitly listing all custom pytest marks applied by our
      test suite in the top-level "pytest.ini" configuration file. (Delectable selections!)
      776dffa1
  2. 12 May, 2020 1 commit
    • Cecil Curry's avatar
      PySide2 >= 5.14.0 compatibility. · 83abaec3
      Cecil Curry authored
      The PySide2 5.14.x removed the "qApp" singleton from the
      "PySide2.QtWidgets" namespace, instead adding that singleton to Python's
      builtins after the first import from the "PySide2" package. This commit
      resolves this critical issue as well as bumping mandatory dependencies.
      83abaec3
  3. 04 Feb, 2020 1 commit
    • Cecil Curry's avatar
      PySide2 >= 5.14.0 compatibility. · a652ebcd
      Cecil Curry authored
      This commit mildly refactors the codebase for forward-compatibility with
      PySide2 >= 5.14.0, rendering the codebase unavoidably incompatible with
      prior PySide2 versions. Specifically, this commit:
      
      * Dependencies bumped:
        * PySide2 >= 5.14.0, which removed the requisite "pyside2-uic" and
          "pyside2-rcc" commands in favour of the "uic --generate python" and
          "rcc --generate python" commands provided by both the optional
          "pyside2-tools" dependency and mandatory C++ Qt dependencies. Ergo,
          "pyside2-tools" is mostly no longer required at runtime.
      * API generalized:
        * Generalized the "betse.lib.pyside2.cache.guipsdcacheqrc" submodule:
          * Generalized the _cache_py_qrc_file() cacher to reference the
            requisite "rcc" rather than obsolete "pyside2-rcc" command.
        * Generalized the "betse.lib.pyside2.cache.guipsdcacheqrc" submodule:
          * Generalized the convert_qrc_to_py_file() converter to call the
            requisite "rcc" rather than obsolete "pyside2-rcc" command with
            requisite Python 3.x parameters (e.g., "--generate python").
      
      Unrelatedly, this commit also bumps all copyright notices embedded
      throughout the codebase. (Unitarian utilitarianism militates illiterate totalitarianism!)
      a652ebcd
  4. 04 Dec, 2019 2 commits
    • Cecil Curry's avatar
      BETSEE 1.1.2.0 (Nicest Nestor) started. · be5aeebb
      Cecil Curry authored
      be5aeebb
    • Cecil Curry's avatar
      BETSEE 1.1.1.0 (Nicer Nestor) released. · 5ce7795b
      Cecil Curry authored
      Significant changes include:
      
      * Dependencies bumped:
        * PySide2 >= 5.12.3, the first official stable release of PySide2.
          This release is now supported by both the pip and conda packaging
          ecosystems and hence safely referenceable in this project.
      * Issues resolved:
        * Python 3.8 temporarily blacklisted. As discussed at upstream issue
          PYSIDE-939, PySide2 and thus BETSEE as well is currently
          incompatible with Python 3.8.
        * Install-time Python version enforced. The minimum mandatory version
          of Python required by this project is now enforced at
          setuptools-based install time via the recently introduced
          "python_requires" setup() key in our top-level "setup.py" installer.
        * pypa/pip#6163 and pypa/pip#6434. This commit circumvents a countably
          infinite number of issues introduced by both pip 19.0.0 and 19.1.0 -
          all pertaining to PEP 517 and 518, which is to say "pyproject.toml".
          The mere existence of a "pyproject.toml" file fundamentally breaks
          pip in inexplicable and horrifying ways: a significantly worse state
          of affairs than the pre-PEP 517 and 518 days of setuptools yore. Say
          what you will of setuptools ("...so much hate"), but at least it
          sorta worked. The same cannot be said of recent pip versions, which
          absolutely do not work whatsoever. "Die, pip! Die!" Specifically:
          * pypa/pip#6163 resolved. All files and subdirectories of the
            project directory containing the top-level "setup.py" script are
            now safely registered to be importable modules and packages.
            Technically, this should not be needed. The current build
            framework (e.g., pip, setuptools) should implicitly guarantee this
            to be the case. Indeed, the obsolete setuptools-based
            "easy_install" script does so. Sadly, pip >= 19.0.0 fails to do so
            for projects defining a top-level "pyproject.toml" file. Although
            upstream purports to have resolved this, the most recent stable
            release of pip continues to suffer this. This is suffering.
          * pypa/pip#6434 resolved. The top-level "pyproject.toml" file now
            explicitly declares a default value for the "build-backend" key.
            Doing so safeguards backward compatibility with pip 19.1.0, which
            erroneously violated PEP 51{7,8} by failing to fallback to a sane
            default value in the absence of this key. If this key is left
            undeclared, pip 19.1.0 fails on attempting to perform an editable
            (i.e., developer-specific) installation of this project.
        * tox-dev/tox#765 resolved. "tox" bundles an obsolete version of
          "virtualenv" itself bundling obsolete versions of both "pip" and
          "setuptools", which obstructs sanity. Our "tox.ini" configuration
          resolves this issue by instructing "tox" to manually update both
          "setuptools" and "virtualenv" to their most recent stable releases.
        * Entry points (i.e., wrapper scripts) resolved. Specifically:
          * Windows-specific entry points installable. Entry points yet again
            install as expected under non-WSL Windows variants (i.e., vanilla,
            Cygwin Windows).
          * Dependency entry points preserved. Long-standing issues with a
            custom monkey patch applied by our top-level "setup.py" script at
            setuptools-based application installation time have now been
            resolved. Previously, this patch globally applied to all
            dependencies installed by "easy_install" (but neither "pip" nor
            "conda", which fortuitously remain unaffected). Now, this monkey
            patch only locally applies to this project and downstream
            consumers of this project (e.g., BETSEE).
        * Setuptools validation relaxed. Validation of the currently installed
          version of setuptools has been relaxed to accept recent non-standard
          version strings (e.g., "41.6.0.post20191029").
        * "all" extras installable. The "all" extra listing the set of all
          optional dependencies required by this project is now safely
          installable, as required for "tox" integration.
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * Rewrote the top-level ".gitlab-ci.yml" file from the ground up to
            test both installation and runtime on all supported Python 3.x
            versions (rather than runtime on the most recent stable Python 3.x
            version) and leverage industry standards, including:
            * A test matrix exercising all official Python version-tagged
              Docker images rather than a single unofficial Python
              version-agnostic Docker image (i.e., "continuumio/anaconda3").
              Non-slim images are currently preferred to slim variants with
              names suffixed by "-slim" (e.g., "python:3.8-slim"), as the
              latter fail to include C and C++ compilers required to build and
              install wheels for Python packages both lacking official wheels
              and containing mandatory C extensions (e.g., "psutil").
            * The Python-specific "pip" and Debian-based "apt" package
              managers rather than the Anaconda-based "conda" package manager.
              An initial "apt" package cache is now explicitly created before
              attempting to install system-wide packages requiring this cache,
              including:
              * "libgl1-mesa-glx", providing the standard "libGL.so.1" shared
                library implicitly required by PySide2 Linux wheels.
            * The high-level "tox" wrapper rather than the lower-level
              "pytest" test harness.
            * The standard "virtualenv" package rather than GitLab-CI
              internals for isolating test results between different Python
              3.x versions.
            * YAML anchor-based key mapping interpolation rather than external
              scripts for resolving DRY between different Python 3.x versions.
          * Defined a top-level "tox.ini" configuration file, installing all
            optional runtime dependencies to maximize test coverage.
          * Removed the top-level "requirements-conda.txt" and
            "requirements-pip.txt" files, which were frankly superfluous.
      * Documentation revised:
        * Installation instructions rewritten. These instructions have been
          revised from the ground up for simplicity, consistency, and with an
          increased emphasis on the standard pip ecosystem rather than the
          increasingly non-standard Anaconda ecosystem. Specifically:
          * "README.rst" truncated. The top-level "README.rst" file now
            provides only minimal instructions for installing BETSEE under the
            two most popular platform-agnostic package managers: pip
            (recommeded) and Anaconda.
        * pip-based editable installation. The top-level "README.rst" file now
          advises developers to leverage pip rather than setuptools when
          performing an editable installation of this project.
        * "setup.cfg"-based PyPI documentation. The top-level "setup.cfg" file
          now transcludes the contents of the top-level "README.rst" file, a
          substantial improvement over the prior code-based approach strewn
          throughout the codebase (e.g., "setup.py", "betse_setup.buputil").
      * Git maintenance:
        * pip directories untracked. All top-level pip-specific temporary
          directories (e.g., "pip-wheel-metadata") are now ignored with
          respect to Git tracking.
      * API generalized:
        * Generalized the top-level "setup.py" script:
          * Called the newly defined
            betsee_setup.beuputil.die_unless_setuptools_version_at_least()
            validator to ensure the currently installed version of setuptools
            satisfies all installation-time requirements.
          * Added a new "test" key-value pair to the setuptools-specific
            "extras_require" dictionary, enabling "tox" to install all
            mandatory testing requirements of this application without
            duplicating those requirements in the top-level "tox.ini" file.
        * Refactored the "betsee_setup.beupbuild" submodule to defer to the
          new "betse.lib.setuptools.command.supcmdbuild" submodule.
        * Generalized the "betsee_setup.beuputil" submodule:
          * Minimized this submodule to the smallest set of requisite
            functions required by the top-level "setup.py" script.
          * Defined a new die_unless_setuptools_version_at_least() validator.
          * Generalized the die_unless_setuptools_version_at_least() function
            to use the general-purpose "distutils.version.LooseVersion" class
            rather than the strict "distutils.version.StrictVersion" class.
        * Defined a new placeholder "betsee_test.unit.test_noop" submodule,
          defining a single placeholder test_noop() unit test guaranteed to
          pass. This submodule will be removed after defining the first
          non-placeholder test submodule, but is currently required to avoid
          "tox" test-time failures.
      
      (Distortional contortionism exhibits surfactant bifurcations, unfurled!)
      5ce7795b
  5. 30 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions truncated. · 91e03ca5
      Cecil Curry authored
      Installation instructions in the top-level "README.rst" file has been
      truncated to trivial one-liners for simplicity, readability, and parity
      with comparable instructions in the same file under BETSE. Specifically,
      this commit:
      
      * Documentation revised:
        * Installation instructions rewritten. These instructions have been
          revised from the ground up for simplicity, consistency, and with an
          increased emphasis on the standard pip ecosystem rather than the
          increasingly non-standard Anaconda ecosystem. Specifically:
          * "README.rst" truncated. The top-level "README.rst" file now
            provides only minimal instructions for installing BETSE under the
            two most popular platform-agnostic package managers: pip
            (recommended) and Anaconda.
      
      (Further longings of the longest farthing!)
      91e03ca5
  6. 29 Nov, 2019 4 commits
    • Cecil Curry's avatar
      GitLab-CI + tox x 4. · b6921028
      Cecil Curry authored
      This commit is the next in a commit chain refactoring our existing
      GitLab-CI configuration to leverage the higher-level "tox" harness
      wrapper rather than the lower-level "pytest" harness. Specifically, this
      commit:
      
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * Python 3.8 temporarily blacklisted. (See prior commit.)
      
      (Incoherent mutterings of the inchoate stuttering: a blurst turntable!)
      b6921028
    • Cecil Curry's avatar
      GitLab-CI + tox x 3. · 8c62d982
      Cecil Curry authored
      This commit is the next in a commit chain refactoring our existing
      GitLab-CI configuration to leverage the higher-level "tox" harness
      wrapper rather than the lower-level "pytest" harness. Specifically, this
      commit:
      
      * Issues resolved:
        * Python 3.8 temporarily blacklisted. As discussed at upstream issue
          PYSIDE-939, PySide2 and thus BETSEE by extension is currently
          incompatible with Python 3.8. Specifically, importing from PySide2
          under Python 3.8 induces an exception whose message resembles:
              "TypeError: 'Shiboken.ObjectType' object is not iterable"
        * Install-time Python version enforced. The minimum mandatory version
          of Python required by this project is now enforced at
          setuptools-based install time via the recently introduced
          "python_requires" setup() key in our top-level "setup.py" installer.
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * "libGL.so.1" importation error resolved. The Linux-specific
            PySide2 wheel implicitly requires the default Linux shared library
            stack and the "libGL.so.1" library, installed by this commit by
            installing the system-wide "libgl1-mesa-glx" package via apt.
      
      (Acidic lamination of the acrimonious lacrimation!)
      8c62d982
    • Cecil Curry's avatar
      GitLab-CI + tox x 3. · 8fef62ff
      Cecil Curry authored
      This commit is the next in a commit chain refactoring our existing
      GitLab-CI configuration to leverage the higher-level "tox" harness
      wrapper rather than the lower-level "pytest" harness. Specifically, this
      commit:
      
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * APT package installation resolved. System-wide packages installed
            via APT are now specified with a newly defined private environment
            variable ${_APT_PACKAGE_NAMES}, eliminating unpleasant conflicts
            between obscure YAML parsing and Bash-based line continuations.
      
      (Gargantuan native gnats garnish unnaturally gnarled snares!)
      8fef62ff
    • Cecil Curry's avatar
      GitLab-CI + tox x 2. · 2e019ed0
      Cecil Curry authored
      This commit is the next in a commit chain refactoring our existing
      GitLab-CI configuration to leverage the higher-level "tox" harness
      wrapper rather than the lower-level "pytest" harness. Specifically, this
      commit:
      
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * "libGL.so.1" importation error resolved. The Linux-specific
            PySide2 wheel implicitly requires the default Linux shared library
            stack and the "libGL.so.1" library, installed by this commit by
            installing the system-wide "libgl1-mesa-glx" package via apt.
      
      (Obsequious non sequitor reviles the villainous village!)
      2e019ed0
  7. 28 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 1. · 407a0654
      Cecil Curry authored
      This commit is the first in a commit chain refactoring our existing
      GitLab-CI configuration to leverage the higher-level "tox" harness
      wrapper rather than the lower-level "pytest" harness. Specifically, this
      commit:
      
      * Dependencies bumped:
        * PySide2 >= 5.12.3, the first official stable release of PySide2.
          This release is now supported by both the pip and conda packaging
          ecosystems and hence safely referenceable by this project.
      * Issues resolved:
        * "all" extras installable. The "all" extra listing the set of all
          optional dependencies required by this project is now safely
          installable, as required for "tox" integration.
      * Testing improved:
        * GitLab CI + "tox". Specifically:
          * Duplicated the top-level ".gitlab-ci.yml" file from the BETSE
            codebase to test both installation and runtime on all supported
            Python 3.x versions (rather than runtime on the most recent stable
            Python 3.x version) and leverage industry standards.
          * Defined a top-level "tox.ini" configuration file, installing all
            optional runtime dependencies to maximize test coverage.
          * Removed the top-level "requirements-conda.txt" and
            "requirements-pip.txt" files.
      * API generalized:
        * Generalized the top-level "setup.py" script:
          * Added a new "test" key-value pair to the setuptools-specific
            "extras_require" dictionary, enabling "tox" to install all
            mandatory testing requirements of this application without
            duplicating those requirements in the top-level "tox.ini" file.
        * Defined a new placeholder "betsee_test.unit.test_noop" submodule,
          defining a single placeholder test_noop() unit test guaranteed to
          pass. This submodule will be removed after defining the first
          non-placeholder test submodule, but is currently required to avoid
          "tox" test-time failures.
      
      (Anathemic anlace bereaves the gravid ardour's greaved frame!)
      407a0654
  8. 02 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Setuptools version validation relaxed. · f2dd39a6
      Cecil Curry authored
      This commit relaxes validation of requisite setuptools versions at
      insallation time to recognize recent non-standard setuptools version
      strings. Specifically, this commit:
      
      * Generalized the "betsee_setup.beuputil" submodule:
        * Generalized the die_unless_setuptools_version_at_least() function to
          utilize the general-purpose "distutils.version.LooseVersion" class
          rather than the less useful "distutils.version.StrictVersion" class.
      
      (Distraught distractions of vast tractable tracts of Vishnu-snubbed substandards!)
      f2dd39a6
  9. 19 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Windows entry point installation resolved. · 4591b274
      Cecil Curry authored
      This commit resolves a Windows-specific issue pertaining to installation
      of entry point wrapper scripts recently unveiled by AppVeyor-based
      continuous integration (CI). Specifically, this commit effectively
      copies the contents of the "betse_setup.bupbuild" submodule, which
      already resolved this issue, into those of the "betsee_setup.beupbuild"
      submodule, which had yet to resolve this issue. (Contemptible tempestuousness!)
      4591b274
  10. 16 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Resolve pypa/pip#6163 and pypa/pip#6434. · 87f51f79
      Cecil Curry authored
      This commit circumvents a countably infinite number of issues introduced
      by both pip 19.0.0 and 19.1.0 - all pertaining to PEP 517 and 518, which
      is to say "pyproject.toml". The mere existence of a "pyproject.toml"
      file fundamentally breaks pip in inexplicable, horrifying ways: a
      significantly worse state of affairs than the pre-PEP 517 and 518 days
      of setuptools yore. Say what you will of setuptools ("...so much hate"),
      but at least it sort of fundamentally worked. The same cannot be said of
      recent pip versions, which absolutely do not work whatsoever. Die, pip!
      
      Specifically, this commit:
      
      * Installation improved:
        * pypa/pip#6163 resolved. All files and subdirectories of the project
          directory containing the top-level "setup.py" script are now safely
          registered to be importable modules and packages. Technically, this
          should not be required. The current build framework (e.g., pip,
          setuptools) should implicitly guarantee this to be the case. Indeed,
          the obsolete setuptools-based "easy_install" script does so. Sadly,
          pip >= 19.0.0 fails to do so for projects defining a top-level
          "pyproject.toml" file. Upstream purports to have resolved this, but
          the most recent stable release of pip continues to suffer this.
        * pypa/pip#6434 resolved. The top-level "pyproject.toml" file now
          explicitly declares a default value for the "build-backend" key.
          Doing so safeguards backward compatibility with pip 19.1.0, which
          erroneously violated PEP 51{7,8} by failing to fallback to a sane
          default value in the absence of this key. If this key is left
          undeclared, pip 19.1.0 fails on attempting to perform an editable
          (i.e., developer-specific) installation of this application.
      * Documentation revised:
        * "setup.cfg"-based PyPI documentation. The top-level "setup.cfg" file
          now transcludes the contents of the top-level "README.rst" file, a
          substantial improvement over the prior code-based approach strewn
          throughout the codebase (e.g., "setup.py", "betse_setup.buputil").
      * Git maintenance:
        * Ignored all top-level pip-specific temporary directories (e.g.,
          "pip-wheel-metadata") with respect to Git tracking.
      
      (Instantaneous morphemes of the mephitic dendrite stick it up bathetically!)
      87f51f79
  11. 15 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Critical setuptools issue resolved x 3. · 5cc0af6c
      Cecil Curry authored
      This commit finalizes the resolution applied by the prior commit to
      both the "develop" and "install" setuptools subcommands. Previously,
      this resolution applied to only the latter.
      
      Specifically, this commit:
      
      * Generalized the "betse.metadeps" submodule:
        * Embedded the fine-grained "SETUPTOOLS_VERSION_MIN" global in the
          coarse-grained "RUNTIME_MANDATORY" global, validating the minimum
          version of "setuptools" required at runtime.
      * Generalized the "betse_setup.buputil" submodule.
        * Minimized this submodule to the smallest set of requisite functions
          required by the top-level "setup.py" script.
      
      (Obstreperous leprosy of the prodigious prestidigitations preface roseate prose!)
      5cc0af6c
  12. 12 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Critical setuptools issue resolved. · 79a5214c
      Cecil Curry authored
      This commit resolves a long-standing (albeit hitherto unrecognized)
      issue with a custom monkey patch applied by our top-level "setup.py"
      script at setuptools-based application installation time. Previously,
      this monkey patch globally applied to all mandatory dependencies
      installed by "easy_install" (but neither "pip" nor "conda", which
      fortuitously remain unaffected) at installation time. Now, this monkey
      patch only locally applies to this application itself.
      
      Specifically, this commit:
      
      * Refactored the "betsee_setup.beupbuild" submodule to defer to the
        new "betse.lib.setuptools.command.supcmdbuild" submodule.
      
      (Objective conniptions of connective contraptions in jocular orations!)
      79a5214c
  13. 28 Sep, 2019 1 commit
  14. 27 Sep, 2019 2 commits
    • Cecil Curry's avatar
      BETSEE 1.1.0.0 (Nice Nestor) released. · 7fabd480
      Cecil Curry authored
      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).
      7fabd480
    • Cecil Curry's avatar
      Resolve PYSIDE-1092. · b65d8b33
      Cecil Curry authored
      This commit resolves an upstream issue recently introduced by
      pyside2uic >= 5.13.0. Specifically, pyside2uic 5.13.0 broke backward API
      compatilibity 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. See
      also, for further details:
          https://bugreports.qt.io/browse/PYSIDE-1092
      
      (Unstable lability affects the unsavoury savour's untenable ability!)
      b65d8b33
  15. 22 Aug, 2019 1 commit
    • Cecil Curry's avatar
      Application shutdown fatal exception fixed. · 9e7f998a
      Cecil Curry authored
      This commit resolves a fatal (albeit technically innocuous) exception
      raised at application shutdown introduced by recent general-purpose
      "improvements" to the shutdown process -- notably, the guaranteed
      closure of previously open logfile handles. Specifically, this commit:
      
      * Shifts the call to the
        betsee.util.app.guiappwindow.unset_main_window() function (which
        effectively garbage collects the entire Qt object stack) from the
        early-time and thus unsafe
        betsee.gui.window.guiwindow.QBetseeMainWindow.closeEvent() method to
        the late-time and thus safe betsee.guiappmeta.BetseeAppMeta.deinit()
        method.
      * Generalizes the "betsee.util.io.log.guiloghandle.LogHandlerSignal"
        subclass (which integrates the Python logging API with the Qt signals
        and slots API) as follows:
        * Overrides the standard logging.Handler.close() method to explicitly
          nullify the signal to which this subclass forwards logging messages.
        * Overrides 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).
      
      (Excruciated limbs contorting limbic excoriations excrete contusions!)
      9e7f998a
  16. 21 Aug, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 8. · 410950a0
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably minor improvements to the YAML file API.
      (Indicative fluctuations of the ministerial pageant inundate a fluxion!)
      410950a0
  17. 20 Aug, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 7. · 7c392e69
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably minor improvements to the YAML file API.
      (Curative curation of the inundated undulations dilate striated streets!)
      7c392e69
  18. 17 Aug, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 6. · 7dcc09f7
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably minor improvements to the YAML file API.
      (Indicative education inundates my dulcimer at dulcet dawn!)
      7dcc09f7
  19. 01 Aug, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 5. · 7220ea34
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably significant improvements to the family
      of logging APIs. (Redundant hindrances of an entranced hinterland!)
      7220ea34
  20. 12 Jul, 2019 1 commit
    • Cecil Curry's avatar
      PySide2 5.12.3 compliance. · fece888d
      Cecil Curry authored
      This commit regenerates all cached Python submodules against the
      implementations of "pyside2-uic" and "pyside2-rcc" bundled with the
      recently released first official stable version of PySide2: PySide2
      5.12.3.
      
      Unrelatedly, this commit also improves compliance with recent
      refactorings in the live BETSE 1.0.1 codebase -- notably, minor
      improvements to the YAML API.
      
      (Onerous stagecraft ruffles oneiric drafts downwind of truffles!)
      fece888d
  21. 27 Jun, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 4. · 48451c21
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably significant improvements to the
      application metadata APIs. This commit restores the BETSEE codebase to
      superficial worky, after an unreasonable period of blatant broky.
      
      (Dilapidated chondrocyte of uncertain chords in citational cadence!)
      48451c21
  22. 31 May, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 3. · 785e49bc
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably significant improvements to the
      application metadata APIs. (Despondent correspondence transpires pyres!)
      785e49bc
  23. 22 May, 2019 1 commit
    • Cecil Curry's avatar
      Script wrapper deprecation warning resolved. · 083343d6
      Cecil Curry authored
      This commit resolves a deprecation warning raised by the "betsee" script
      wrapper installed at setuptools installation time. Unrelatedly, this
      commit also:
      
      * Generalizes detection of platforms natively supporting high-DPI
        scaling by leveraging the newly defined
        betse.util.os.displays.is_dpi_scaling() tester.
      * Introduces a first-draft GitLab CI configuration. Note that this
        configuration currently lacks "pytest-xvfb" and "pytest-qt" support
        and hence is effectively broken.
      
      (Distemperate contrivances of the Vancian conveniences!)
      083343d6
  24. 17 May, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance x 2. · 985d5826
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably significant improvements to the CLI
      APIs. (Fallacious fallows of the gravid ravenousness ravish venous flight!)
      985d5826
  25. 14 May, 2019 1 commit
    • Cecil Curry's avatar
      BETSE 1.0.1 compliance. · e3e384c6
      Cecil Curry authored
      This commit improves compliance with recent refactorings in the live
      BETSE 1.0.1 codebase -- notably significant improvements to the CLI
      APIs. (Unrequited requirements beg a bedraggled boondoggle!)
      e3e384c6
  26. 03 May, 2019 1 commit
    • Cecil Curry's avatar
      Top-level testing script added. · 891b03cf
      Cecil Curry authored
      This commit copies the top-level "test" shell script verbatim from BETSE
      into BETSEE in preparation for eventual continuous integration (CI). (Jury-rigged jerkin!)
      891b03cf
  27. 18 Apr, 2019 3 commits
    • Cecil Curry's avatar
      Badges removed from front-facing documentation. · 7c3feed4
      Cecil Curry authored
      The top-level "README.rst" file no longer references only tangentially
      related BETSE-specific continuous integration badges, due both to PyPI
      failing to properly display these badges on BETSEE's project page and to
      their obsolescence by GitLab's newly minted badge support. (Fully awful!)
      7c3feed4
    • Cecil Curry's avatar
      BETSEE 1.0.0.1 (Mightier Maxwell) started. · 1c331339
      Cecil Curry authored
      1c331339
    • Cecil Curry's avatar
      BETSEE 1.0.0.0 (Mighty Maxwell) released. · e831b6d7
      Cecil Curry authored
      Significant changes include:
      
      * Custom tissue profiles. Users may now define an arbitrary number of
        custom tissue profiles (i.e., contiguous regions of the cell cluster),
        each of which assigns all cells residing in that region the same
        simulation configuration settings -- including membrane diffusion
        constants for all available ions (e.g., sodium, potassium, chloride).
      * Custom exports. Users may define an arbitrary number of custom exports
        (i.e., files saved to disk when one or more checkboxes beneath the
        "Export?" column in the "Phase Playlist" section are checked). For
        usability, the top-level tree widget now sports a nested subtree of
        export-specific tree items, complete with suitable vector-based
        iconography and human-readable tooltips. This includes:
        * Comma-separated value (CSV) files.
        * Cell cluster animations (i.e., compressed videos visualizing a
          single measurable quantity across the entire cell cluster at all
          simulation time steps).
        * Cell cluster plots (i.e., single images visualizing a single
          measurable quantity across the entire cell cluster at the last
          simulation time step).
        * Single cell plots (i.e., single images visualizing a single
          measurable quantity isolated to a single cell at all simulation time
          steps), where the cell to be visualized is selected by its uniquely
          identifying 0-based index in the currently generated cell cluster.
      * Global export settings. The top-level "Export" item enables settings
        globally applicable to all custom exports to be trivially configured,
        including:
        * Cell index-centric settings,  enabling end users to configure
          whether cell indices are displayed in cell cluster visuals and the
          index of the cell to be displayed in single cell plots.
        * Matplotlib colormaps. The matplotlib-specific colormaps used to
          associate measurable quantities visualized by plots and animations
          (e.g., transmembrane potential) with color values are now globally
          configurable. This includes the default colormaps for intrinsically
          diverging, sequential, streamline, and network data.
      * User-configurable tree list items. Predesignated parent items of the
        top-level tree widget (e.g., "Space/Tissue") now act as dynamically
        resizable lists of child items, each of which is associated with the
        same stacked widget page (e.g., "Custom Tissue Profile"). Likewise,
        end users may interactively add an arbitrary number of new child items
        and remove existing child items from such parent items. Additionally:
        * Automatic prepopulation and depopulation. Child tree items of such
          parent items are now dynamically added (i.e., prepopulated) and
          removed (i.e., depopulated) on opening and closing simulation
          configurations respectively.
        * Guaranteed success. Actions permitting users to append and remove
          child items to and from these lists are conditionally enabled and
          disabled, guaranteeing these actions to always succeed if enabled.
      * Issue resolutions, including:
        * Infinite recursion on pushing undo commands from editable widgets.
        * Overflow error raised by "libshoken" in relation to undo command
          request handling.
        * Erroneous exceptions raised on pushing the "Browse..." buttons
          associated with all dirnames edited by the "Paths" stacked widget
          page.
        * Exceptions with empty messages, which are now displayed in a mildly
          more meaningful manner.
        * "--sim-conf-file" failures. To do so, the newly defined
          QBetseeSimConf.unload() method now provides an orthogonal analogue
          to the existing QBetseeSimConf.load() method, eliminating numerous
          awkward edge cases and subtle chiken-and-egg issues throughout the
          codebase.
      * API generalizations, including:
        * The existing "betsee.gui.simconf.guisimconfundo" submodule, whose
          QBetseeSimConfUndoStack.push_undo_cmd_if_safe() method prevents undo
          commands from being pushed to this stack if no simulation
          configuration is currently open.
        * The existing "betsee.gui.simconf.stack.page" subpackage, which has
          been restructed for maintainability by:
          * Splitting all spatial-centric stacked widget pages into a new
            "betsee.gui.simconf.stack.page.space" subpackage.
          * Splitting all export-centric stacked widget pages into a new
            "betsee.gui.simconf.stack.page.export" subpackage.
        * The existing
          "betsee.gui.simconf.stack.page.space.guisimconfpagertis" submodule,
          which now defines a "QBetseeSimConfPagerTissueABC" superclass
          generally applicable to both default and custom tissue profile
          stacked widget pages.
        * The existing "betsee.gui.simconf.stack.widget.guisimconfcombobox"
          submodule. Notable new classes include:
          * "QBetseeSimConfComboBoxABC", the abstract base class of all
            simulation configuration-specific combo box subclasses.
          * "QBetseeSimConfComboBoxSequence", the concrete subclass of all
            simulation configuration-specific combo boxes backed by a simple
            sequence of raw strings.
        * The existing "betsee.gui.simconf.tree.guisimconftree" submodule,
          whose QBetseeSimConfTreeWidget._init_items() method efficiently and
          explicitly initializes all containers containing tree items,
          including those internally required by the corresponding
          "QBetseeSimConfStackedWidget" instance. This method obsoletes the
          the removed QBetseeSimConfStackedWidget._init_tree_to_stack() and
          QBetseeSimConfTreeWidget._init_items_list_root() methods.
        * The existing "betsee.util.widget.mixin.guiwdg" submodule, whose
          QBetseeObjectMixin.init() method now accepts an optional
          "is_reinitable" parameter permitting application-specific Qt objects
          to be reinitialized in a general-purpose manner. (This is strictly
          required for reinitializing each stacked widget page associated with
          a child tree item providing a dynamic list item immediately before
          that page is displayed on selecting that child tree item.)
        * The existing "betsee.util.widget.stock.tree.guitreewdg" submodule,
          whose "QBetseeTreeWidget" superclass now defines:
          * A get_item_current() method safely retrieving the currently
            selected tree item if any.
        * A new "betsee.gui.data.guidataicon" submodule, serving as an
          application-wide icon store efficiently caching instantiated icons.
          Notable functions include:
          * get_icon_dot(), caching a general-purpose bullet point icon.
        * A new "betsee.util.io.image.guiicon" submodule, providing a seamless
          cache for transparent creation, caching, and retrieval of SVG-based
          "QIcon" objects from arbitrary URIs. Notable functions include:
          * make_icon(), instantiating such icons.
        * A new "betsee.util.widget.abc.control" subpackage containing:
          * The prior "guicontrolabc" submodule, shifted for maintainability.
          * The new "guictlpagerabc" submodule, defining abstract base classes
            and mixins specific to pagers (i.e., stacked widget page
            controllers) -- all of which now subclass these abstract base
            classes and mixins as appropriate.
        * A new "betsee.util.widget.mixin.guiwdgedit" submodule, containing
          the "QBetseeEditWidgetMixin" superclass previously contained within
          the "betsee.util.widget.mixin.guiwdg" submodule. Subclasses of this
          superclass are now required to override the recursion-safe
          _init_safe() method rather than the recursion-unsafe init() method.
        * A new "betsee.util.widget.stock.guicombobox" submodule, whose
          "QBetseeComboBox" superclass generalizes the stock "QComboBox" API
          with improved Pythonics.
        * A new "betsee.util.widget.stock.tree.guitreeitem" submodule
          implementing a high-level tree widget item API encapsulating Qt's
          considerably lower-level "QTreeWidgetItem" API. Notable functions
          include:
          * get_child_item_with_text_path(), enabling callers to obtain
            arbitrary tree items via their absolute first-column text paths
            (i.e., the unique sequence of the first-column text of all items
            leading to the desired tree item, including itself).
          * get_item_preceding_or_none(), contextually retrieving the tree
            item preceding any arbitrary tree item.
        * A new "betsee.util.path.guipathenum" submodule, defining one global
          integer bit mask constant for each Qt-specific "QFileDialog::Option"
          enumeration member, enabling the codebase to trivially enable path
          dialag options in a Pythonic manner. Notably, the
          "betsee.util.path.guidir" and "betsee.util.path.guipath" submodules
          now leverage these constants.
      e831b6d7
  28. 17 Apr, 2019 1 commit
    • Cecil Curry's avatar
      BETSEE 1.0.0.0 (Mighty Maxwell) finalization x 3. · 9090bc55
      Cecil Curry authored
      This is the honestly last small-scale commit anticipated for the release
      of BETSEE 1.0.0.0 (Mighty Maxwell). This commit resolves a breaking
      issue with the "Browse..." buttons associated with all dirnames edited
      by the "Paths" stacked widget page by:
      
      * Defining a new "betsee.util.path.guipathenum" submodule containing one
        global integer bit mask constant for each
        Qt-specific "QFileDialog::Option" enumeration member, enabling the
        codebase to trivially enable path dialag options in a Pythonic manner.
      * Leveraging constants defined by this submodule in the
        "betsee.util.path.guidir" and "betsee.util.path.guipath" submodules,
        which erroneously leveraged Qt-specific enumeration members instead.
      
      (Entrained entrails of the rainless Renaissance!)
      9090bc55
  29. 14 Apr, 2019 1 commit
    • Cecil Curry's avatar
      BETSEE 1.0.0.0 (Mighty Maxwell) finalization x 2. · ad0fbc66
      Cecil Curry authored
      This is the last small-scale commit anticipated for the release of
      BETSEE 1.0.0.0 (Mighty Maxwell). Specifically, this commit resolves a
      subtle issue with the "File" -> "Save As..." action such that this
      action now successfully repopulates the contents of the top-level tree
      widget after relocating the current simulation configuration. (Agonizing antagonist!)
      ad0fbc66
  30. 13 Apr, 2019 1 commit
    • Cecil Curry's avatar
      BETSEE 1.0.0.0 (Mighty Maxwell) finalization. · 2ce7dee0
      Cecil Curry authored
      This is the last large-scale commit anticipated for the release of
      BETSEE 1.0.0.0 (Mighty Maxwell). Specifically, this commit:
      
      * Adds cell indices-centric editable widgets to the stack widget page
        for exports, enabling end users to configure whether cell indices are
        displayed in cell cluster visuals and the index of the cell to be
        displayed in single cell visuals.
      * Resolves a non-trivial overflow error raised by "libshoken" in
        relation to undo command request handling.
      * Improves display of edge case exceptions (e.g., exceptions lacking
        messages).
      
      (Inchoate exhortations of the horticultural incoherence!)
      2ce7dee0
  31. 09 Apr, 2019 1 commit
    • Cecil Curry's avatar
      Export stacked widget pages x 15. · b499f8b0
      Cecil Curry authored
      This is the last in a commit chain defining stacked widget pages for
      the newly defined export-specific tree items. Specifically, this commit
      now implements all controllers controlling the editable widgets
      contained on these pages. "Huzzah!", shrieked the beatific gnomes.
      b499f8b0
  32. 06 Apr, 2019 1 commit
    • Cecil Curry's avatar
      Export stacked widget pages x 14. · be148ae7
      Cecil Curry authored
      This is the next in a commit chain defining stacked widget pages for
      the newly defined export-specific tree items. Specifically, this commit
      completes the implementation of the
      QBetseeSimConfTreeWidget._init_items() method -- which now correctly
      informs the top-level stacked widget of mappings between items of the
      top-level tree widget and page widgets of this stacked widget. (Toboggan noggin!)
      be148ae7
  33. 05 Apr, 2019 1 commit
    • Cecil Curry's avatar
      Export stacked widget pages x 13. · 20da44ea
      Cecil Curry authored
      This is the next in a commit chain defining stacked widget pages for
      the newly defined export-specific tree items. Specifically, this commit:
      
      * Defines a new QBetseeSimConfTreeWidget._init_items() that efficiently
        and explicitly initializes all containers containing tree items,
        including containers internally required by the corresponding
        "QBetseeSimConfStackedWidget" instance.
      * Excises the prior QBetseeSimConfStackedWidget._init_tree_to_stack()
        and QBetseeSimConfTreeWidget._init_items_list_root() methods, which
        have both now been superceded by the dramatically superior
        QBetseeSimConfTreeWidget._init_items() method.
      
      (Dramatic damsels seldom wield dominating parasols!)
      20da44ea