atr/metadata.py (29 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
def _get_undefined() -> tuple[str, str]:
return "undefined", "undefined"
def _get_version_from_git() -> tuple[str, str] | None:
"""Returns the version when within a development environment."""
try:
import dunamai
except ImportError:
# dunamai is not installed, so probably we are not in
# a development environment.
return None
try:
# We start in state/, so we need to go up one level
version = dunamai.Version.from_git()
if version.distance > 0:
dirty = "+dirty" if version.dirty else ""
# The development version number should reflect the next release that is going to be cut,
# indicating how many commits have already going into that since the last release.
# e.g. v0.2.0.dev100-abcdef means that there have been already 100 commits since the last release
# (which presumably was 0.1.x). We explicitly bump the minor version for the next release.
# The commit hash is added to the version string for convenience reasons.
return f"{version.bump(1).serialize(format='v{base}.dev{distance}-{commit}')}{dirty}", version.serialize(
format="{commit}"
)
# another option is to do a format like "v0.1.0+100.abcdef" which indicates that that version
# is 100 commits past the last release which was "v0.1.0".
# return version.serialize(format="v{base}+{distance}.{commit}"), version.serialize(
# format="{commit}"
# )
else:
return version.serialize(format="v{base}"), version.serialize(format="{commit}")
except RuntimeError:
return None
def _get_version_from_version_module() -> tuple[str, str] | None:
"""Returns the version from _version module if it exists."""
try:
import atr.version as version
return version.ATR_VERSION, version.ATR_COMMIT
except ImportError:
return None
# Try to determine the version from a development environment first.
# If this fails, try to get it from environment variables that are set when building a docker image.
# We don't use __version__ and __commit__ as these are not reserved words in Python
version, commit = _get_version_from_git() or _get_version_from_version_module() or _get_undefined()
if __name__ == "__main__":
"""Will output version / commit info from git tags if available."""
version, commit = _get_version_from_git() or _get_undefined()
print(f"""
ATR_VERSION = '{version}'
ATR_COMMIT = '{commit}'
""")