BETSE 1.2.1
BETSE 1.2.0 released.
This minor release resolves a growing cacophony of compatibility issues that have accrued in the two-and-a-half years since BETSE's last prior stable release (i.e., BETSE 1.1.1 (Nicer Nestor) in the pre-pandemic twilight of November, 2019). BETSE authors gratefully thank Dr. Levin at the Levin Lab, Tufts University for his continued patronage of BETSE.
Noteworthy changes include:
Hosting Improved
- GitLab -> GitHub. BETSE's
git
repository has been officially migrated from our prior host at GitLab to our new host at GitHub, mostly so as to centralize the maintenance burden of continuous integration (CI) workflows across this and the upstream @beartype project. Specifically:- Our prior GitLab-specific GitLab-CI and Windows-specific Appveyor CI configurations have been supplanted wholesale with our standard GitHub-specific GitHub Actions CI workflows for both package testing and publication.
- Our front-facing
README.rst
documentation has been trivially revised to reference GitHub rather than GitLab. - Our prior GitLab-specific
tox.ini
configuration and `doc/rst/RELEASE.rst documentation have been supplanted wholesale with actively maintained and more GitHub-friendly equivalents liberally harvested from our upstream @beartype project.
Compatibility Improved
- Python >= 3.9.0. BETSE now officially supports both the Python 3.9.x and 3.10.x series.
- macOS Aqua detection. BETSE now detects the macOS-specific Aqua display server with significantly more robust logic. Previously, that detection unexpectedly raised exceptions under continuous integration (CI) workflows hosted by GitHub Actions. Now, that detection has been generalized to be resilient against edge cases – including:
- The absence of the core macOS
/System/Library/Frameworks/Security.framework/Security
library. - The absence of the
OSError
-specificstrerror
instance variable on low-level exceptions raised during this detection.
- The absence of the core macOS
- Windows environment variable detection. BETSE now circumvents erroneous Windows-specific shell environments produced by the GitHub Actions Windows runner, which fails to define the critical
%LOCALAPPDATA%
,%APPDATA%
, or%HOME
shell environment variables. Specifically:- The
betse.util.app.meta.AppMetaABC.dot_dirname()
method now leverages the first of the following shell environment variables exported to the active Windows process via trivial iteration:%LOCALAPPDATA%
,%APPDATA%
, and our standardget_home_dirname()
getter. Insanely, the GitHub Actions Windows runner fails to export the former two shell environment variables as well as the otherwise standard%HOME%
shell environment variable, which doesn't leave BETSE with terribly many options in CI environments.
- The
- Windows subdirectory detection. BETSE now circumvents the erroneous Windows-specific implementation of the standard
os.path.commonpath()
function, which unsafely raises an exception rather than safely returningFalse
when passed two pathnames residing on different Windows drives (e.g.,C:/
,D:/
). Ourbetse.util.path.dirs.is_subdir()
tester now catches and coerces that unsafe exception into a safe return value ofFalse
.
Compatibility Broken
- Python < 3.8.0. This release officially breaks backward compatibility by dropping support for the Python 3.5.x, 3.6.x, and 3.7.x series. The former two have officially hit their End-of-Life (EOL); the latter is a half-year away from doing so and no longer worth officially supporting.
- PIL (Pillow) < 7.0.0. This release officially breaks backward compatibility by dropping support for PIL (Pillow) < 7.0.0. See below.
Dependencies Bumped
- NumPy ≥ 1.22.0. BETSE now requires NumPy ≥ 1.22.0, which dramatically modified the (admittedly private) install-time
numpy.distutils.__config__
API describing how NumPy was linked against various external third-party shared libraries (e.g., BLAS, LAPACK) at install-time. Ourbetse.lib.numpy.numpys
submodule now accesses that private NumPy API much more carefully – with robust future-proofing against predicted breakage by future NumPy releases breaking that API yet again. - PIL (Pillow) ≥ 7.0.0. BETSE now requires PIL (Pillow) ≥ 7.0.0, which introduced the standard
pillow.__version__
attribute and deprecated the non-standardpillow.PILLOW_VERSION
attribute. Doing so renders the codebase incompatible with PIL (Pillow) < 7.0.0. Relatedly, Thebetse.util.py.module.pymodname.MODULE_NAME_TO_VERSION_ATTR_NAME
dictionary has removed the non-standardPIL: 'PILLOW_VERSION'
entry. pytest
≥ 5.4.0, which refactored the previously defined private_pytest.capture.CaptureManager._getcapture()
method into the newly definedprivate _pytest.capture._getmulticapture()
function, which thebetse.lib.setuptools.command.supcmdtest
submodule necessarily monkey-patches at test time to sanitize captured output for long-running tests.
Features Improved.
- Runtime dependency validation. BETSE now validates whether optional and mandatory dependencies satisfy requirements at application startup by manually validating dependency versions before deferring to increasingly unreliable
setuptools
-specific logic for doing so. Specifically:- The private
betse.lib.libs._iter_requirement_commands()
iterator has been generalized to accept items of theREQUIREMENT_NAME_TO_COMMANDS
dictionary as codebase-agnostic tuples rather than codebase-specificbetse.metadata.RequirementCommand
instances. - In the
betse.lib.setuptools.setuptool
submodule:- The
die_unless_requirement(
) validator andis_requirement()
tester have been generalized to manually validate dependency versions before deferring tosetuptools
-specific logic for doing so. - The
get_requirement_distribution_or_none()
getter docstring has been revised to note that that getter should only be called as a latch-ditch fallback.
- The
- The private
- Traceback handling. BETSE now drastically simplifies its handling of exception tracebacks. Previously, BETSE only printed tracebacks (i.e., call stack traces) for uncaught exceptions when explicitly passed either the
-v
or--verbose
options at the command line. Clearly, this was bad. While admittedly non-human-readable and thus unsightly, tracebacks yield mission-critical insights into critical breakage. Tracebacks are often the only means that devs have of debugging issues in cloud-hosted continuous integration (CI) workflows providing no convenient filesystem (and hence logfile) access; likewise, tracebacks are the only means that end users have of forwarding tracebacks to devs for subsequent debugging. BETSE now always prints tracebacks to standard error (stderr) regardless of options passed at the command line or defined in a configuration file.
Issues Resolved.
- Matplotlib stream plotting exception. An exception previously raised by Matplotlib on animating streamplots has been 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 Pythonlist
objects when passed raggedlist
oflist
objects with no uniform length) have been resolved. Where possible, these arrays have been reverted to standard non-NumPylist
oflist
objects; in all other cases, these arrays have been explicitly coerced into non-auto object arrays. - Widespread deprecations. A slew of other currently non-fatal deprecation warnings emitted by various third-party dependencies of BETSE have similarly been resolved.
Installation Improved
- 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 introducedpython_requires
setup(
) key in our top-levelsetup.py
installer. - pypa/setuptools#2353 and pypa/pip#6264. This release resolves recent catastrophic upstream breakage introduced by
setuptools
50.0 andpip
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-agnosticpyproject.toml
file -- whichsetuptools
andpip
continually demonstrate that they are unwilling to sanely support. setuptools
entry point. Thebetse
command installed by our top-levelsetup.py
installer now correctly runs. Previously, our installer inadvertently produced a brokenbetse
command by incorrectly monkey-patching thesetuptools
installation process.
Tests Improved
pytest
warning resolved. BETSE's test suite no longer issues a non-fatal warning under recentpytest
versions. Specifically, our top-levelpytest.ini
configuration file now explicitly lists all custompytest
marks applied by our test suite.pytest
warnings filters. BETSE now defers topytest
warnings filters when detected as running underpytest
at test-time, preventing BETSE's custom warnings filters from silently overwriting those predefined bypytest
. Most test harnesses (includingpytest
) define sane default warnings filters as well as enabling users to externally configure warnings filters from project-wide configuration files. Ergo, thepytest
harness knows better than we do.tox
venv isolation validation. BETSE's test suite now sports significantly improvedtox
-specific validation of whether this suite is safely isolated to a virtual environment (venv), avoiding spurious test failures with otherwise valid pipelines. Specifically:- The top-level
pytest
-specificconftest.py
plugin has been generalized by:- Refactoring the existing private
_clean_imports()
function to:- Treat zipfiles on
sys.path
not isolated to the currenttox
venv as effectively isolated anyway, as zipfiles are effectively isolated from filesystem modification -- notably,pip
- andsetuptools
-based package installation. - Reorder
sys.path
so as to shift import paths not isolated to the currenttox
venv to the end of this list, thus deprioritizing (but not removing) these paths.
- Treat zipfiles on
- Removed the obsolete private
_print_metadata()
function, most of which now resides in the_clean_imports()
function.
- Refactoring the existing private
- The top-level
- PyPy testing disabled. BETSE's test suite has (hopefully temporarily) disabled all testing of PyPy. Sadly, scientific dependencies (including NumPy) are not sanely installable under macOS + PyPy. macOS ships with Accelerate, blatantly broken macOS-specific BLAS and LAPACK shared libraries that fundamentally break NumPy on installation. Since NumPy fails to ship macOS + PyPy wheels, NumPy installation under macOS + PyPy requires building NumPy from source against Accelerate, which then painfully fails. For now, disabling PyPy testing entirely is the only sensible choice.
- macOS test compatibility, including:
- The mostly incidental
test_dirs_get_mtime_newest()
unit test is now skipped under Apple macOS – due to what appear to be inconsistencies in the handling of nanosecond-resolution path timestamps under the macOS-specific HFS+ filesystem.
- The mostly incidental
(Infallible infancy bellows the fancy libel!)