1. 13 Oct, 2020 1 commit
    • Cecil Curry's avatar
      NumPy auto-object array deprecations x 3. · 1b2e32a8
      Cecil Curry authored
      This commit is the next in a commit chain resolving numerous violations
      of `numpy.VisibleDeprecationWarning` sprinkled throughout the codebase,
      all induced by NumPy's recent deprecation of **auto-object arrays**
      (i.e., the implicit creation of one-dimensional NumPy arrays of Python
      `list` objects when passed ragged `list` of `list` objects with *no*
      uniform length). Specifically, this commit resolves the third such
      violation during discrete exterior calculus (DEC) mesh creation and
      documents a significant instance variable of that mesh creation
      pertaining to that violation. (Pickled juice in a sickle-celled spruce!)
      1b2e32a8
  2. 09 Oct, 2020 1 commit
    • Cecil Curry's avatar
      NumPy auto-object array deprecations x 2. · 63186f2b
      Cecil Curry authored
      This commit is the first in a commit chain resolving numerous violations
      of `numpy.VisibleDeprecationWarning` sprinkled throughout the codebase,
      all induced by NumPy's recent deprecation of **auto-object arrays**
      (i.e., the implicit creation of one-dimensional NumPy arrays of Python
      `list` objects when passed ragged `list` of `list` objects with *no*
      uniform length). Specifically, this commit resolves the second such
      violation during discrete exterior calculus (DEC) mesh creation and
      documents a significant instance variable of that mesh creation
      pertaining to that violation. (Extant instantiation on mendicant medication!)
      63186f2b
  3. 07 Oct, 2020 1 commit
    • Cecil Curry's avatar
      Python 3.5 -> Python 3.9. · 330485ea
      Cecil Curry authored
      This commit last-rites (i.e., drops support for) Python 3.5, which
      recently hit its tragic End of Life (EOL) in mid-September and thus now
      constitutes a demonstrable security risk, as well as adding support for
      Python 3.9, which recently released. Specifically, this commit removes
      Python 3.5 from all testing matrices *and* all conditional logic
      specific to Python 3.5 from the main codebase as well as adding Python
      3.9 to these testing matrices..
      
      ## Features Added
      
      * **Python 3.9 support.** This release adds support for Python 3.9,
        which recently released its first stable version.
      
      ## Compatibility Broken
      
      * **Python 3.5 unsupported.** This release drops support for Python 3.5,
        which recently hit its End of Life (EOL) in mid-September and thus now
        constitutes a demonstrable security risk.
      
      (Titrated detritus extrudes intentional rudeness!)
      330485ea
  4. 11 Sep, 2020 1 commit
    • Cecil Curry's avatar
      NumPy auto-object array deprecations x 1. · 98fb5f12
      Cecil Curry authored
      This commit is the first in a commit chain resolving numerous violations
      of `numpy.VisibleDeprecationWarning` sprinkled throughout the codebase,
      all induced by NumPy's recent deprecation of **auto-object arrays**
      (i.e., the implicit creation of one-dimensional NumPy arrays of Python
      `list` objects when passed ragged `list` of `list` objects with *no*
      uniform length). Specifically, this commit resolves the first such
      violation during discrete exterior calculus (DEC) mesh creation and
      documents a significant instance variable of that mesh creation
      pertaining to that violation.
      
      ## Issue Resolved.
      
      * **NumPy auto-object array deprecations.** All currently non-fatal
        `numpy.VisibleDeprecationWarning` warnings resulting from NumPy's
        recent deprecation of **auto-object arrays** (i.e., the implicit
        creation of one-dimensional NumPy arrays of Python `list` objects when
        passed ragged `list` of `list` objects with *no* uniform length) have
        been resolved. Where possible, these arrays have been reverted to
        standard non-NumPy `list` of `list` objects; in all other cases, these
        arrays have been explicitly coerced into non-auto object arrays.
      
      (Indisputable sputterings of the pusillanimous litmus isthmus!)
      98fb5f12
  5. 10 Sep, 2020 2 commits
    • Cecil Curry's avatar
      Pytest integration improved. · 2a5e4d3b
      Cecil Curry authored
      This commit resolves a critical failure in our test-time monkey-patch of
      the private `_pytest.capture` submodule as well as deferring to pytest's
      warnings filters, preventing BETSE's custom warnings filters from
      silently overwriting pytest's. Unrelatedly, this commit also documents
      but does *not* yet resolve a non-fatal "numpy.VisibleDeprecationWarning"
      emitted from our newly implanted discrete exterior calculus (DEC) logic.
      
      ## Dependencies Bumped.
      
      * **`pytest` >= 5.4.0,** which refactored the previously defined private
        `_pytest.capture.CaptureManager._getcapture()` method into the newly
        defined `private _pytest.capture._getmulticapture()` function, which
        the `betse.lib.setuptools.command.supcmdtest` submodule necessarily
        monkey-patches at test time to sanitize captured output for
        long-running tests.
      
      ## Tests Improved
      
      * **pytest warnings filters.** BETSE now defers to pytest's warnings
        filters when detected as running under pytest at test-time, preventing
        BETSE's custom warnings filters from silently overwriting pytest's.
        Most test harnesses (including pytest) define sane default warnings
        filters as well as enabling users to externally configure warnings
        filters from project-wide configuration files. Ergo, the current
        harness knows better than we do.
      
      (Florid imprecations of torrid impactions create creolin interactions!)
      2a5e4d3b
    • Cecil Curry's avatar
      Resolve pypa/setuptools#2353 and pypa/pip#6264. · c45925ef
      Cecil Curry authored
      This commit resolves recent catastrophic upstream breakage introduced by
      setuptools 50.0 and pip 22.2.0, the newest stable release of everyone's
      least favourite build tools. Sadly, doing so requires temporarily
      disabling project-wide support for the tooling-agnostic "pyproject.toml"
      file -- which setuptools and pip continually demonstrate that they are
      unwilling to sanely support.
      
      ## Issues Resolved
      
      * #2, detailed above.
      * #3, detailed below.
      * pypa/setuptools#2353 and pypa/pip#6264, resolving recent catastrophic
        upstream breakage introduced by setuptools 50.0 and pip 22.2.0, the
        newest stable release of everyone's least favourite build tools.
        Sadly, doing so requires temporarily disabling project-wide support
        for the tooling-agnostic `pyproject.toml` file -- which setuptools and
        pip continually demonstrate that they are unwilling to sanely support.
      
      (Unctuous tempestuousness of pestilence!)
      c45925ef
  6. 14 May, 2020 1 commit
    • Cecil Curry's avatar
      Pytest warning resolved. · 57d259ae
      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.
      Unrelatedly, documentation and commentary throughout the codebase has
      been marginally improved for consistency and readability. (Humongous humours!)
      57d259ae
  7. 21 Feb, 2020 1 commit
    • Cecil Curry's avatar
      "tox" venv isolation validation generalized. · 89764a74
      Cecil Curry authored
      This commit significantly improves "tox"-specific validation of whether
      the test suite is safely isolated to a virtual environment (venv),
      avoiding spurious test failures with otherwise valid pipelines.
      Specifically, this commit:
      
      * API generalized:
        * Generalized the top-level py.test-specific "conftest.py" plugin:
          * Refactored the existing private _clean_imports() function to:
            * Treat zipfiles on "sys.path" *NOT* isolated to the current "tox"
              venv as effectively isolated anyway, as zipfiles are effectively
              isolated from filesystem modification -- notably, ``pip``- and
              ``setuptools``-based package installation.
            * Reorder "sys.path" so as to shift import paths *NOT* isolated to
              the current "tox" venv to the end of this list, thus
              deprioritizing (but *NOT* removing) these paths.
          * Removed the obsolete private _print_metadata() function, most of
            which now resides in the _clean_imports() function.
      
      (Incurable curations of deep-set infatuation infesting an unsteeped nestling!)
      89764a74
  8. 19 Feb, 2020 1 commit
    • Cecil Curry's avatar
      PIL (Pillow) >= 7.0.0 compatibility. · 803b9a47
      Cecil Curry authored
      This commit mildly refactors the codebase for forward-compatibility with
      PIL (Pillow) >= 7.0.0, rendering the codebase unavoidably incompatible
      with Pillow < 5.3.0. Specifically, this commit:
      
      * Dependencies bumped:
        * PIL (Pillow) >= 5.3.0, which introduced the standard
          "pillow.__version__" attribute and deprecated the non-standard
          "pillow.PILLOW_VERSION" attribute.
      
      (Tremendous inundations of overstimulated foundations tremulate emulations on emulsive hoverings!)
      803b9a47
  9. 04 Feb, 2020 1 commit
    • Cecil Curry's avatar
      PIL (Pillow) >= 7.0.0 compatibility. · a8025e28
      Cecil Curry authored
      This commit mildly refactors the codebase for forward-compatibility with
      PIL (Pillow) >= 7.0.0, rendering the codebase unavoidably incompatible
      with Pillow < 6.0.0. Specifically, this commit:
      
      * Dependencies bumped:
        * PIL (Pillow) >= 6.0.0, which introduced the standard
          "pillow.__version__" attribute and deprecated the non-standard
          "pillow.PILLOW_VERSION" attribute.
      * API generalized:
        * Generalized the "betse.util.py.module.pymodname" submodule:
          * Removed the non-standard "PIL: 'PILLOW_VERSION'" entry from the
            global "MODULE_NAME_TO_VERSION_ATTR_NAME" dictionary.
      
      (Unimaginable secretions of secretive elations undulating perfidious perfumes, perforce!)
      a8025e28
  10. 01 Feb, 2020 1 commit
    • Cecil Curry's avatar
      Dependency resolution improved. · 48a8e1bb
      Cecil Curry authored
      This commit significantly improves dependency resolution (i.e., runtime
      validation of whether optional and mandatory application
      dependencies satisfy application requirements) by manually validating
      dependency versions before deferring to increasingly unreliable
      setuptools-specific logic for doing so. Specifically, this commit:
      
      * API generalized:
        * Generalized the "betse.lib.setuptools.setuptool" submodule:
          * Refactored the die_unless_requirement() validator and
            is_requirement() tester to manually validate dependency versions
            before deferring to setuptools-specific logic for doing so.
          * Revised documentation for the
            get_requirement_distribution_or_none() getter to note that this
            function should only be called as a latch-ditch fallback.
      
      Unrelatedly, this commit also bumps all copyright notices embedded
      throughout the codebase. (Deplorable depredations of predatory statutes!)
      48a8e1bb
  11. 29 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI configuration refined. · 9fb46d20
      Cecil Curry authored
      This commit negligibly refines our existing GitLab-CI configuration to
      comply with recent improvements to BETSEE's GitLab-CI configuration.
      Specifically, this commit:
      
      * Issues resolved:
        * 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 configuration refined. 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.
      
      (Innate nativity virally exposes positional chirality!)
      9fb46d20
  12. 28 Nov, 2019 1 commit
    • Cecil Curry's avatar
      API generalizations x 1. · 7e3bf370
      Cecil Curry authored
      This commit is the first in a probably commit chain generalizing various
      negligible aspects of the codebase, including:
      
      * Testing improved:
        * GitLab CI configuration streamlined. Extraneous references to
          low-level Matplotlib caching (e.g., via the "${MPLCONFIGDIR}"
          environment variable) have now been removed in favour of the
          higher-level XDG standard (e.g., via the "${XDG_CACHE_HOME}"
          environment variable), which supercedes the former.
      * API generalized:
        * Generalized the "betse.lib.libs" submodule:
          * Generalized the private _iter_requirement_commands() iterator to
            accept items of the "REQUIREMENT_NAME_TO_COMMANDS" as
            codebase-agnostic "tuple" instances rather than codebase-specific
            "betse.metadata.RequirementCommand" instances.
      
      (Supernal biorhythms of the diurnal forestal forestalls unremediated inundation!)
      7e3bf370
  13. 27 Nov, 2019 2 commits
    • Cecil Curry's avatar
      BETSE 1.1.2 (Nicest Nestor) started. · 11082938
      Cecil Curry authored
      11082938
    • Cecil Curry's avatar
      BETSE 1.1.1 (Nicer Nestor) released. · be211275
      Cecil Curry authored
      Significant changes include:
      
      * Dependencies bumped:
        * setuptools >= 38.2.0. The same version of setuptools required by
          BETSEE is now required by BETSE, ensuring parity between the two
          codebases and avoiding painful dependency conflicts. For uniformity,
          this dependency is repeated in both the top-level "pyproject.toml"
          and "tox.ini" configuration files.
      * Issues resolved:
        * 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").
      * 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.
            * 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-pip.txt" file, which was
            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 BETSE under the
            two most popular platform-agnostic package managers: pip
            (recommeded) and Anaconda.
          * "INSTALL.rst" added. A new "doc/rst/INSTALL.rst" file providing
            verbose platform-specific instructions for installing BETSE under
            each supported platform (i.e., Linux, macOS, Windows) as
            well as Git-based development and Docker-based containerization
            has now been added.
          * "INSTALL.md" obsoleted. The "doc/md/INSTALL.md" file has been
            removed in favor of the new "doc/rst/INSTALL.rst" file, whose
            underlying reStructuredText is significantly easier to maintain.
          * The sub-level "doc/rst/INSTALL.rst" file
        * 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").
        * Extraneous files removed. All irrelevant image masks have now been
          pruned from the "doc/yaml/paper" subdirectory. Doing so reduces the
          filesize of release tarballs, minimizes the maintenance burden, and
          presumably eliminates bitrot.
      * 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:
        * Renamed:
          * The "betse.util.path.command" subpackage to
            "betse.util.os.command".
          * The "betse.util.test.tests" submodule to
            "betse.util.test.tsttest".
        * Generalized the top-level py.test-specific "conftest.py" plugin:
          * Defined a new private _clean_imports() function to perform the
            following when the active Python interpreter is isolated to a venv
            (e.g., due to being exercised by "tox"):
            1. If the top-level directory for this project is listed in the
               global list of all import directories (i.e., "sys.path"),
               remove this directory from this list. Doing so prevents this
               test session from accidentally importing from modules not
               isolated to this venv, including this project being tested.
            2. If the first directory on this list is not isolated to this
               venv, raise an exception. This condition implies that modules
               will be imported from outside this venv, which entirely defeats
               the purpose of isolating tests with "tox" to a venv.
            3. If the top-level "betse" package is not isolated to this venv,
               raise an exception. This condition implies that this project
               has been imported from outside this venv.
          * Refactored the pytest_sessionstart() hook run at test session
            startup to sanitize import directories by calling the newly
            defined _clean_imports() function. Specifically, if this session
            is isolated to a venv, this hook now removes all import
            directories not isolated to this venv from "sys.path" -- as
            required for sane "tox"-based testing. (See above.)
        * Generalized the top-level "setup.py" script:
          * Called the newly defined
            betse_setup.buputil.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.
        * Generalized the "betse.exceptions" submodule:
          * Defined new "BetseFunctionUnimplementedException",
            "BetseProcessException", and "BetseProcessNotFoundException"
            classes.
          * Renamed the "BetseOSShellEnvException" class to
            "BetseShellEnvException".
        * Generalized the "betse.metadeps" submodule:
          * Defined a new "SETUPTOOLS_VERSION_MIN" global, providing the
            minimum version of "setuptools" required at both install- and
            runtime. Previously, this global was inaccessibly hardcoded into
            the coarse-grained "RUNTIME_MANDATORY" global.
        * Generalized the "betse.lib.setuptools.command.supcommand" submodule:
          * Defined a new "SetuptoolsCommandDistributionTypes" global tuple of
            all distribution types commonly passed to methods called by the
            "setuptools.command.easy_install.easy_install" class, suitable for
            use in type checking.
        * Defined a new "betse.lib.setuptools.command.supcmdbuild" submodule,
          preserving the most critical of the contents of the prior
          implementation of the "betse_setup.bupbuild" submodule:
          * For safety, this submodule now safely monkey patches
            "easy_install" in an application-local manner.
          * For reusability, this submodule is now generically applicable to
            arbitrary applications -- including both BETSE and downstream
            consumers thereof (e.g., BETSEE).
          * Refactored the _scriptwriter_get_args_patched() class method to:
            * Accept any "ScriptWriter" or "VersionlessRequirement" instance
              as the passed "distribution" parameter.
            * Silently defer to the default ScriptWriter.get_args() method
              under non-WSL Windows variants (i.e., vanilla, Cygwin Windows).
        * Generalized the "betse.util.cli.cliabc" submodule:
          * Improved the CLIABC._options_top() method to print human-readable
            version specifiers when the "-V" and "--version" options are
            passed, complete with optional human-readable codename (e.g.,
            "BETSE 1.1.0 (Nice Nestor)").
        * Defined a new "betse.util.os.process" subpackage:
          * Defined a new "betse.util.os.process.prctest" submodule:
            * Defined a new is_process_command() tester, returning true only
              if the parent process of the active Python interpreter is
              running an external command with the passed basename. This
              function currently requires the optional "psutil" dependency --
              but could theoretically be expanded with platform-specific
              implementations circumventing this requirement.
        * Generalized the "betse.util.os.shell.shellenv" submodule:
          * Refactored the to_str() converter in terms of the
            mappings.to_str_flat() converter.
        * Defined a new "betse.util.py.module.pyimport" submodule:
          * Renamed the prior betse.util.py.pys.add_import_dirname() function
            to register_dir() for brevity and clarity.
          * Defined a new to_str_modules_imported_name() converter, returning
            a human-readable string of the fully-qualified names of all
            previously imported modules.
        * Defined a new "betse.util.py.pyvenv" submodule:
          * Defined a new is_venv() tester, returning true only if the active
            Python interpreter is isolated to a venv.
          * Defined a new get_system_prefix() getter, returning the absolute
            dirname of the top-level directory containing the system-wide
            Python interpreter.
        * Generalized the "betse.util.type.cls.classes" submodule:
          * Revised the die_unless_subclass() docstring to note that all
            classes are considered to be subclasses of themselves within the
            context of this function, complete with a minimal length example
            (MLE) demonstrating this.
        * Generalized the "betse.util.type.iterable.mapping.mappings"
          submodule:
          * Defined a new to_str_flat() converter, flattening the passed
            string-keyed and -valued dictionary into a human-readable string.
        * Refactored the "betse_setup.bupbuild" submodule to defer to the
          new "betse.lib.setuptools.command.supcmdbuild" submodule.
        * Generalized the "betse.lib.setuptools.command.supcmdtest" submodule:
          * Refactored the "test" subclass to inherit the test suite-specific
            "setuptools.command.test.test" superclass rather than the generic
            "setuptools.Command" superclass.
        * Generalized the "betse.util.path.dirs" submodule:
          * Renamed for disambiguity:
            * copy() to copy_dir().
            * copy_into_dir() to copy_dir_into_dir().
          * Defined a new die_if_subdir() function, raising an exception if
            the second passed directory is a subdirectory of the first passed
            directory.
          * Defined a new is_subdir() function, returning true if the second
            passed directory is a subdirectory of the first passed directory.
          * Defined a new remove_dir() function, recursively removing the
            passed directory after logging a warning and waiting several
            seconds for user intervention.
          * Revised docstrings for various existing functions.
        * Generalized the "betse.util.path.files" submodule:
          * Renamed for disambiguity:
            * remove() to remove_file().
            * remove_if_found() to remove_file_if_found().
        * Generalized the "betse.util.path.paths" submodule:
          * Renamed for disambiguity:
            * move() to move_path().
          * Defined a new remove_path() function, either recursively removing
            the passed path if a directory or non-recursively removing this
            path if a file.
        * Generalized the "betse.util.type.obj.objtest" submodule:
          * Defined a new die_unless_is() validator, raising an exception if
            any passed object is not identical to every passed object.
        * Refactored the "betse_setup.bupbuild" submodule to defer to the
          new "betse.lib.setuptools.command.supcmdbuild" submodule.
        * Generalized the "betse_setup.buputil" 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,
            copied verbatim from the "betsee.beuputil" submodule.
          * 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.
        * Debugged the "betse_test.func.sim.test_sim" submodule:
          * Improved the test_cli_sim_compat() functional test to squelch
            (i.e., silence) warnings emitted by matplotlib during this test.
            Specifically, interactive visualizations are now disabled during
            this test by enabling the "betse_cli_sim_compat" fixture to
            overwrite the old simulation configuration required by this test.
      
      (Bituminous arbiter delicately dangles the provocative invocation!)
      be211275
  14. 23 Nov, 2019 2 commits
    • Cecil Curry's avatar
      GitLab-CI + tox x 7. · 9e13804f
      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 improvements:
        * GitLab-CI "tox" configuration. The top-level ".gitlab-ci.yml" file
          has been improved to prefer non-slim Docker Python images 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").
      
      (Piddly lipids basking formidably on malformed lips of malefic pods!)
      9e13804f
    • Cecil Curry's avatar
      GitLab-CI + tox x 6. · e370d0c3
      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 improvements:
        * GitLab-CI "tox" configuration. The top-level ".gitlab-ci.yml" file
          has been improved to create an initial package cache before
          attempting to install system-wide packages requiring this cache.
      
      (Magnanimous œuvre of the scarlet starlet ascertains mauve uncertainties!)
      e370d0c3
  15. 22 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 5. · eb87f621
      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 improvements:
        * GitLab-CI "tox" configuration. The top-level ".gitlab-ci.yml" file
          has been fundamentally rewritten to test all supported Python 3.x
          versions (rather than merely the most recent stable Python 3.x
          version) and leverage industry standards, including:
          * The official slim versioned Docker Python images rather than the
            third-party non-slim non-versioned "continuumio/anaconda3" image.
          * The Debian-based "apt" package manager rather than the
            Anaconda-based "conda" package manager.
          * 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.
      * Generalized the "betse.util.cli.cliabc" submodule:
        * Improved the CLIABC._options_top() method to print human-readable
          version specifiers when the "-V" and "--version" options are passed,
          complete with optional codename (e.g., "BETSE 1.1.0 (Nice Nestor)").
      * Removed the top-level "requirements-pip.txt" file, which was always
        frankly superfluous.
      
      (Ocular gesticulations of an occipital occupation masticate ablutions!)
      eb87f621
  16. 21 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 5. · b9eb0cb9
      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:
      
      * Issue resolved:
        * tox-dev/tox#765, a "tox"-specific issue induced by bundling an
          obsolete version of "virtualenv" itself bundling obsolete versions
          of both "pip" and "setuptools". Our "tox.ini" configuration resolves
          this issue by instructing "tox" to manually update both "setuptools"
          and "virtualenv" to their most recent stable releases.
      * Generalized the top-level "tox.ini" script:
        * Added the "all" extra to the "extras" list, installing all optional
          runtime dependencies for maximum test coverage.
      * Generalized the top-level pytest-specific "conftest.py" plugin:
        * Refactored the private _clean_imports() function to perform the
          following when the active Python interpreter is isolated to a venv
            (e.g., due to being exercised by "tox"):
          1. If the top-level directory for this project is listed in the
             global list of all import directories (i.e., "sys.path"), remove
             this directory from this list. Doing so prevents this test
             session from accidentally importing from modules *NOT* isolated
             to this venv, including this project being tested.
          2. If the first directory on this list is *NOT* isolated to this
             venv, raise an exception. This condition implies that modules
             will be imported from outside this venv, which entirely defeats
             the purpose of isolating tests with "tox" to a venv.
          3. If the top-level "betse" package is *NOT* isolated to this venv,
             raise an exception. This condition implies that this project has
             been imported from outside this venv.
      
      (Retracing regret, inflammable Margraves ignite passionless graves!)
      b9eb0cb9
  17. 16 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 4. · 7e10d934
      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:
      
      * 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.
      * Generalized the top-level "tox.ini" script:
        * Replaced the prior "deps" setting with a new "extras" setting,
          avoiding duplication of mandatory testing requirements.
      * Generalized the "betse.metadeps" submodule:
        * Added "setuptools" to the "TESTING_MANDATORY" list, enabling the
          top-level "setup.py" script to inform "tox" of this requirement.
      
      (Efficacious spaciousness exceeds the ugliest slug-bred breed!)
      7e10d934
  18. 15 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 3. · b1fffa08
      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:
      
      * Generalized the top-level py.test-specific "conftest" module:
        * Refactored the pytest_sessionstart() hook called at test session
          startup to sanitize import directories. Specifically, if session is
          isolated to a venv, this hook now removes all import directories
          *not* isolated to this venv from "sys.path" -- required for sane
          "tox"-based testing.
      
      (Miserable immiseration serrates pro-rated inseparable susurrations!)
      b1fffa08
  19. 14 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 2. · be08d9fa
      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:
      
      * Optionally dependencies added:
        * "psutil" > 5.3.0, providing platform-portable access to
          platform-specific process internals.
      * Generalized the "betse.exceptions" submodule:
        * Defined new "BetseFunctionUnimplementedException",
          "BetseProcessException", and "BetseProcessNotFoundException"
          classes.
        * Renamed the "BetseOSShellEnvException" class to
          "BetseShellEnvException".
      * Renamed the "betse.util.path.command" subpackage to
        "betse.util.os.command" for sanity.
      * Defined a new "betse.util.os.process" subpackage:
        * Defined a new "betse.util.os.process.prctest" submodule:
          * Defined a new is_process_command() tester, returning true only if
            the parent process of the active Python interpreter is running an
            external command with the passed basename. This function currently
            requires the optional "psutil" dependency -- but could
            theoretically be expanded with platform-specific implementations
            circumventing this requirement.
      
      (Inalienable alienations of notional votives optionally deprived despotically!)
      be08d9fa
  20. 13 Nov, 2019 1 commit
    • Cecil Curry's avatar
      GitLab-CI + tox x 1. · 4af04f0a
      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:
      
      * Renamed the "betse.util.test.tests" submodule to
        "betse.util.test.tsttest" for disambiguity.
      * Defined a new "betse.util.py.pyvenv" submodule:
        * Defined a new is_venv() tester, returning true only if the active
          Python interpreter is isolated to a venv.
        * Defined a new get_system_prefix() getter, returning the absolute
          dirname of the top-level directory containing the system-wide
          Python interpreter.
      * Generalized the "betse.util.os.shell.shellenv" submodule:
        * Refactored the to_str() converter in terms of the
          mappings.to_str_flat() converter.
      * Generalized the "betse.util.py.module.pyimport" submodule:
        * Defined a new to_str_modules_imported_name() converter, returning a
          human-readable string of the fully-qualified names of all previously
          imported modules.
      * Generalized the "betse.util.type.iterable.mapping.mappings" submodule:
        * Defines a new to_str_flat() converter, flattening the passed
          string-keyed and -valued dictionary into a human-readable string.
      
      (Ad-hoc expostulation of the ostentatious righteousness, slighted!)
      4af04f0a
  21. 08 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions rewrite x 5. · 7c578bd0
      Cecil Curry authored
      This commit is the last in a commit chain fundamentally rewriting our
      installation instructions for simplicity, consistency, and with an
      increased emphasis on the standard "pip" ecosystem rather than the
      increasingly non-standard Anaconda ecosystem. (Inordinate exhortations!)
      7c578bd0
  22. 06 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions rewrite x 4. · d834efe1
      Cecil Curry authored
      This commit is the next in a commit chain fundamentally rewriting our
      installation instructions for simplicity, consistency, and with an
      increased emphasis on the standard "pip" ecosystem rather than the
      increasingly non-standard Anaconda ecosystem. (Dominant codeterminant!)
      d834efe1
  23. 02 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions rewrite x 3. · 3bda9d07
      Cecil Curry authored
      This commit is the next in a commit chain fundamentally rewriting our
      installation instructions for simplicity, consistency, and with an
      increased emphasis on the standard "pip" ecosystem rather than the
      increasingly non-standard Anaconda ecosystem.
      
      Unrelatedly, this commit also relaxes validation of requisite setuptools
      versions at insallation time to recognize recent non-standard setuptools
      version strings. Specifically, this commit:
      
      * Generalized the "betse_setup.buputil" 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.
      
      (Reductive induction inundates the farcical calyx forthwith!)
      3bda9d07
  24. 01 Nov, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions rewrite x 2. · 14d89f68
      Cecil Curry authored
      This commit is the next in a commit chain fundamentally rewriting our
      installation instructions for simplicity, consistency, and with an
      increased emphasis on the standard "pip" ecosystem rather than the
      increasingly non-standard Anaconda ecosystem. (Extraneous extrusions!)
      14d89f68
  25. 31 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Installation instructions rewrite x 1. · 0f021b48
      Cecil Curry authored
      This commit is the first in a commit chain fundamentally rewriting our
      installation instructions for simplicity, consistency, and with an
      increased emphasis on the standard "pip" ecosystem rather than the
      increasingly non-standard Anaconda ecosystem.
      
      Unrelatedly, this commit also adds an untested (and hence presumably
      non-working) "tox" configuration. The eventual intention here is to
      refactor existing YAML-formatted continuous integration (CI)
      configurations to invoke "tox" rather than "pytest", as the higher-level
      nature of the former substantially reduces repetitious boilerplate.
      
      (Supernal insubordination ordains inordinate prestidigitation!)
      0f021b48
  26. 24 Oct, 2019 1 commit
    • Cecil Curry's avatar
      test_cli_sim_compat() warnings squelched. · 5a162c9f
      Cecil Curry authored
      This commit squelches (i.e., silences) warnings emitted by matplotlib
      from the test_cli_sim_compat() functional test exercising backward
      compatibility. Specifically, this commit disables interactive
      visualizations during this test by enabling the "betse_cli_sim_compat"
      fixture to overwrite the obsoleted simulation configuration leveraged
      by this test. (Mundane curmudgeons besmirched the contemptible tempest!)
      5a162c9f
  27. 18 Oct, 2019 4 commits
    • Cecil Curry's avatar
      Windows entry point installation resolved x 6. · b24e243a
      Cecil Curry authored
      This commit is the next in a commit chain attempting to resolve a
      Windows-specific issue pertaining to installation of entry point wrapper
      scripts recently unveiled by AppVeyor-based continuous integration (CI).
      Specifically, this commit generalizes prior references to the hardcoded
      "ScriptWriter" superclass to the passed "cls" instead. (Instantaneous temerity!)
      b24e243a
    • Cecil Curry's avatar
      Windows entry point installation resolved x 5. · 568093b8
      Cecil Curry authored
      This commit is the next in a commit chain attempting to resolve a
      Windows-specific issue pertaining to installation of entry point wrapper
      scripts recently unveiled by AppVeyor-based continuous integration (CI).
      Specifically, this commit reverts the prior commit's temporary
      restoration of deprecated monkey-patching that unsurprisingly had no
      substantive effect and:
      
      * API generalized:
        * Generalized the "betse.lib.setuptools.command.supcmdbuild"
          submodule:
          * Refactored the _scriptwriter_get_args_patched() class method to
            silently defer to the default ScriptWriter.get_args() method under
            non-WSL Windows variants (i.e., vanilla or Cygwin Windows).
      
      (Lackluster lackeys of the lustrous monstrosity upend a mulched tumult!)
      568093b8
    • Cecil Curry's avatar
      Windows entry point installation resolved x 4. · 59572284
      Cecil Curry authored
      This commit is the next in a commit chain attempting to resolve a
      Windows-specific issue pertaining to installation of entry point wrapper
      scripts recently unveiled by AppVeyor-based continuous integration (CI).
      Specifically, this commit reverts the prior commit's temporary disabling
      of our custom monkey patching of setuptool's default entry point
      behaviour, temporarily restores deprecated monkey-patching that should
      (in theory) have no substantive effect, and:
      
      * API generalized:
        * Generalized the "betse.lib.setuptools.command.supcommand" submodule:
          * Define a new "SetuptoolsCommandDistributionTypes" tuple of all
            distribution types commonly passed to methods called by the
            ":setuptools.command.easy_install.easy_install" class, suitable
            for usage in type checking.
      
      (Inconsistent constancy unveils the inveterate veteran of brachiating vertebrates!)
      59572284
    • Cecil Curry's avatar
      Windows entry point installation resolved x 3. · 4f333272
      Cecil Curry authored
      This commit is the next in a commit chain attempting to resolve a
      Windows-specific issue pertaining to installation of entry point wrapper
      scripts recently unveiled by AppVeyor-based continuous integration (CI).
      Specifically, this commit temporarily disables our custom monkey
      patching of setuptool's default entry point behaviour. (Interminable minion!)
      4f333272
  28. 17 Oct, 2019 2 commits
    • Cecil Curry's avatar
      Windows entry point installation resolved x 2. · 21b3cf91
      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:
      
      * API generalized:
        * Generalized the "betse.util.type.cls.classes" submodule:
          * Revised the die_unless_subclass() docstring to note that all
            classes are considered to be subclasses of themselves within the
            context of this function, complete with a minimal length example
            (MLE) demonstrating this.
      
      (Extrusive intrusions by the bygone backwater's byway!)
      21b3cf91
    • Cecil Curry's avatar
      Windows entry point installation resolved. · 06eb2185
      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:
      
      * Generalized the "betse.lib.setuptools.command.supcmdbuild" submodule:
        * Refactored the _scriptwriter_get_args_patched() class method to
          accept any instance of a "ScriptWriter" subclass rather than of the
          "ScriptWriter" class itself.
      
      (Genuflection is a presumptuous prenuptial in indiscrete connection!)
      06eb2185
  29. 16 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Resolve pypa/pip#6163 and pypa/pip#6434. · dd59afe6
      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:
      
      * Mandatory dependencies bumped:
        * setuptools >= 38.2.0. The same version of setuptools required by
          BETSEE is now required by BETSE, ensuring parity between the two
          codebases and avoiding painful dependency conflicts. For safety,
          this dependency is repeated in the top-level "pyproject.toml" file.
      * 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:
        * 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 application.
        * "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").
      * API generalized:
        * Defined a new "betse.util.py.module.pyimport" submodule:
          * Renamed the prior betse.util.py.pys.add_import_dirname() function
            to register_dir() for brevity and clarity.
      * Git maintenance:
        * Ignored all top-level pip-specific temporary directories (e.g.,
          "pip-wheel-metadata") with respect to Git tracking.
      
      (Contemptible contusions of the combustible dirigible!)
      dd59afe6
  30. 15 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Critical setuptools issue resolved x 3. · b00bae5e
      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:
      
      * Mandatory dependencies bumped:
        * setuptools >= 36.7.2. A recent version of setuptools is now
          required, as this application requires the
          setuptools.command.easy_install.ScriptWriter.get_args() class
          method and thus the oldest version of setuptools with this method.
          Since official setuptools documentation fails to specify the exact
          version that first defined this method, we fallback to a
          sufficiently old version from 2017 known to do so.
      * Generalized the "setup.py" submodule:
        * Called the newly defined
          betse_setup.buputil.die_unless_setuptools_version_at_least()
          validator to ensure the currently installed version of setuptools
          satisfies all installation-time requirements.
      * Generalized the "betse.metadeps" submodule:
        * Defined a new "SETUPTOOLS_VERSION_MIN" global, providing the minimum
          version of "setuptools"required at both install- and runtime.
          Previously, this global was inaccessibly hardcoded into the
          coarse-grained "RUNTIME_MANDATORY" global.
      * Generalized the "betse_setup.buputil" submodule.
        * Defined a new die_unless_setuptools_version_at_least() validator,
          copied verbatim from the "betsee.beuputil" submodule.
        * Minimized this submodule to the smallest set of requisite functions
          required by the top-level "setup.py" script.
      b00bae5e
  31. 12 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Critical setuptools issue resolved x 2. · f05ba129
      Cecil Curry authored
      This commit generalizes 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:
      
      * Generalizes the "betse.lib.setuptools.command.supcmdbuild" submodule:
        * Generalizes the init() function by renaming the "package_name"
          parameter to "package_names" and refactoring the type of this
          parameter from "str" to "SetType".
        * Generalizes the _scriptwriter_get_args_patched() class method to
          additionally accept
          "setuptools.command.develop.VersionlessRequirement" instances as
          values of the passed "distribution" parameter.
      
      (Incorrigible codified codgers!)
      f05ba129
  32. 11 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Critical setuptools issue resolved. · 8ea43531
      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:
      
      * Implemented the newly defined
        "betse.lib.setuptools.command.supcmdbuild" submodule to safely monkey
        patch "easy_install" in an application-local manner.
      * Refactored the "betse_setup.bupbuild" submodule to defer to the
        new "betse.lib.setuptools.command.supcmdbuild" submodule.
      * Generalized the "betse.lib.setuptools.command.supcmdtest" submodule:
        * Refactored the "test" subclass to inherit the test suite-specific
          "setuptools.command.test.test" superclass rather than the generic
          "setuptools.Command" superclass.
      * Generalized the "betse.util.type.obj.objtest" submodule:
        * Defined a new die_unless_is() validator, raising an exception if any
          passed object is not identical to every passed object.
      
      (Massive missives by the furlough's furlong!)
      8ea43531
  33. 10 Oct, 2019 1 commit
    • Cecil Curry's avatar
      Path utilities. · f661bce8
      Cecil Curry authored
      This commit generalizes the path API with additional support for
      subdirectory detection and recursive directory removal. Specifically:
      
      * Defined a new "betse.lib.setuptools.command.supcmdbuild" submodule, to
        which most of the contents of the existing "betse_setup.bupbuild"
        submodule will be relocated.
      * Generalized the "betse.util.path.dirs" submodule:
        * Renamed for disambiguity:
          * copy() to copy_dir().
          * copy_into_dir() to copy_dir_into_dir().
        * Defined a new die_if_subdir() function, raising an exception if the
          second passed directory is a subdirectory of the first passed
          directory.
        * Defined a new is_subdir() function, returning true if the second
          passed directory is a subdirectory of the first passed directory.
        * Defined a new remove_dir() function, recursively removing the
          passed directory after logging a warning and waiting several
          seconds for user intervention.
        * Revised docstrings for various existing functions.
      * Generalized the "betse.util.path.files" submodule:
        * Renamed for disambiguity:
          * remove() to remove_file().
          * remove_if_found() to remove_file_if_found().
      * Generalized the "betse.util.path.paths" submodule:
        * Renamed for disambiguity:
          * move() to move_path().
        * Defined a new remove_path() function, either recursively removing
          the passed path if a directory or non-recursively removing this path
          if a file.
      * Truncated the "betse_setup.buputil" submodule, removing superfluous
        functions now relocated to the main codebase.
      
      (Willful admonitions of the premonition's unabashedly effulgent lash!)
      f661bce8