From 0082df86946a2bc730925b818f844d7a8a4f57ae Mon Sep 17 00:00:00 2001 From: Ryan May Date: Wed, 17 Jan 2024 18:53:41 -0700 Subject: [PATCH] MNT: Update version detection Try to avoid pulling in setuptools_scm for better import time by directly checking for a pip file that indicates whether the install is editable and only using the git-based version in that case; otherwise, depend on the distribution metadata. --- src/metpy/_version.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/metpy/_version.py b/src/metpy/_version.py index 1497d3af88d..0efdb69c18b 100644 --- a/src/metpy/_version.py +++ b/src/metpy/_version.py @@ -8,16 +8,29 @@ def get_version(): """Get MetPy's version. Either get it from package metadata, or get it using version control information if - a development install. + an editable installation. """ + from importlib.metadata import distribution, PackageNotFoundError + 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: - return 'Unknown' + dist = distribution(__package__) + + # First see if we can find this file from pip to check for an editable install + if direct := dist.read_text('direct_url.json'): + import json + + # Parse file and look for editable key + info = json.loads(direct) + if info.get('dir_info', {}).get('editable'): + import contextlib + + # If editable try to get version using setuptools_scm + with contextlib.suppress(ImportError, LookupError): + from setuptools_scm import get_version + return get_version(root='../..', relative_to=__file__, + version_scheme='post-release') + + # With any error or not an editable install, we use the version from the metadata + return dist.version + except PackageNotFoundError: + return 'Unknown'