|
129 | 129 | year = 2007
|
130 | 130 | }"""
|
131 | 131 |
|
| 132 | +# modelled after sys.version_info |
| 133 | +_VersionInfo = namedtuple('_VersionInfo', |
| 134 | + 'major, minor, micro, releaselevel, serial') |
132 | 135 |
|
133 |
| -def __getattr__(name): |
134 |
| - if name == "__version__": |
| 136 | + |
| 137 | +def _parse_to_version_info(version_str): |
| 138 | + """ |
| 139 | + Parse a version string to a namedtuple analogous to sys.version_info. |
| 140 | +
|
| 141 | + See: |
| 142 | + https://packaging.pypa.io/en/latest/version.html#packaging.version.parse |
| 143 | + https://docs.python.org/3/library/sys.html#sys.version_info |
| 144 | + """ |
| 145 | + v = parse_version(version_str) |
| 146 | + if v.pre is None and v.post is None and v.dev is None: |
| 147 | + return _VersionInfo(v.major, v.minor, v.micro, 'final', 0) |
| 148 | + elif v.dev is not None: |
| 149 | + return _VersionInfo(v.major, v.minor, v.micro, 'alpha', v.dev) |
| 150 | + elif v.pre is not None: |
| 151 | + releaselevel = { |
| 152 | + 'a': 'alpha', |
| 153 | + 'b': 'beta', |
| 154 | + 'rc': 'candidate'}.get(v.pre[0], 'alpha') |
| 155 | + return _VersionInfo(v.major, v.minor, v.micro, releaselevel, v.pre[1]) |
| 156 | + else: |
| 157 | + # fallback for v.post: guess-next-dev scheme from setuptools_scm |
| 158 | + return _VersionInfo(v.major, v.minor, v.micro + 1, 'alpha', v.post) |
| 159 | + |
| 160 | + |
| 161 | +def _get_version(): |
| 162 | + """Return the version string used for __version__.""" |
| 163 | + # Only shell out to a git subprocess if really needed, and not on a |
| 164 | + # shallow clone, such as those used by CI, as the latter would trigger |
| 165 | + # a warning from setuptools_scm. |
| 166 | + root = Path(__file__).resolve().parents[2] |
| 167 | + if (root / ".git").exists() and not (root / ".git/shallow").exists(): |
135 | 168 | import setuptools_scm
|
| 169 | + return setuptools_scm.get_version( |
| 170 | + root=root, |
| 171 | + version_scheme="post-release", |
| 172 | + local_scheme="node-and-date", |
| 173 | + fallback_version=_version.version, |
| 174 | + ) |
| 175 | + else: # Get the version from the _version.py setuptools_scm file. |
| 176 | + return _version.version |
| 177 | + |
| 178 | + |
| 179 | +def __getattr__(name): |
| 180 | + if name in ("__version__", "__version_info__"): |
136 | 181 | global __version__ # cache it.
|
137 |
| - # Only shell out to a git subprocess if really needed, and not on a |
138 |
| - # shallow clone, such as those used by CI, as the latter would trigger |
139 |
| - # a warning from setuptools_scm. |
140 |
| - root = Path(__file__).resolve().parents[2] |
141 |
| - if (root / ".git").exists() and not (root / ".git/shallow").exists(): |
142 |
| - __version__ = setuptools_scm.get_version( |
143 |
| - root=root, |
144 |
| - version_scheme="post-release", |
145 |
| - local_scheme="node-and-date", |
146 |
| - fallback_version=_version.version, |
147 |
| - ) |
148 |
| - else: # Get the version from the _version.py setuptools_scm file. |
149 |
| - __version__ = _version.version |
150 |
| - return __version__ |
| 182 | + __version__ = _get_version() |
| 183 | + global __version__info__ # cache it. |
| 184 | + __version_info__ = _parse_to_version_info(__version__) |
| 185 | + return __version__ if name == "__version__" else __version_info__ |
151 | 186 | raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
152 | 187 |
|
153 | 188 |
|
|
0 commit comments