From 13262031a6dbbaa8aea5ed66a4337877a7a06c61 Mon Sep 17 00:00:00 2001 From: akrherz Date: Wed, 17 Jan 2024 15:13:03 -0600 Subject: [PATCH 1/2] perf: use package metadata before scm --- src/metpy/_version.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/metpy/_version.py b/src/metpy/_version.py index 1497d3af88d..53a6c2acafe 100644 --- a/src/metpy/_version.py +++ b/src/metpy/_version.py @@ -2,21 +2,30 @@ # Distributed under the terms of the BSD 3-Clause License. # SPDX-License-Identifier: BSD-3-Clause """Tools for versioning.""" +import os +from importlib.metadata import PackageNotFoundError, version def get_version(): """Get MetPy's version. - Either get it from package metadata, or get it using version control information if - a development install. + If the package is installed (read: metpy is in site-packages), use package + metadata. If not, use what is provided by setuptools_scm and default to + package data if that also fails. """ + # Inspect where this file's parent directory is located + moddirname = os.path.dirname(os.path.dirname(__file__)) + # If we're in site-packages, try using package metadata + if moddirname.endswith('site-packages'): + try: + return version(__package__) + except PackageNotFoundError: + pass try: from setuptools_scm import get_version return get_version(root='../..', relative_to=__file__, version_scheme='post-release') except (ImportError, LookupError): - from importlib.metadata import PackageNotFoundError, version - try: return version(__package__) except PackageNotFoundError: From 65769d28c49f3db9ffa7bbb6de7763ddc3d89026 Mon Sep 17 00:00:00 2001 From: akrherz Date: Wed, 17 Jan 2024 18:31:15 -0600 Subject: [PATCH 2/2] add tests --- tests/test_version.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/test_version.py diff --git a/tests/test_version.py b/tests/test_version.py new file mode 100644 index 00000000000..b4d6f2c9a20 --- /dev/null +++ b/tests/test_version.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 MetPy Developers. +# Distributed under the terms of the BSD 3-Clause License. +# SPDX-License-Identifier: BSD-3-Clause +"""Test package version.""" +import importlib +from importlib.metadata import PackageNotFoundError +from unittest.mock import patch + +import metpy + +def test_version(): + """Test that MetPy version is not None.""" + assert metpy.__version__ is not None + + +def test_version_installed_with_importlib_metadata_failure(): + """Test that version works when importlib_metadata is not available.""" + with patch('importlib.metadata.version', side_effect=PackageNotFoundError): + importlib.reload(metpy) + assert metpy.__version__ != 'Unknown' + + +def test_version_notinstalled(): + """Test that version works when not installed.""" + with patch('os.path.dirname', return_value='/bogus/bogus/bogus'): + importlib.reload(metpy) + assert metpy.__version__ != 'Unknown'