Skip to content

Instantly share code, notes, and snippets.

@mpkocher
Last active July 9, 2019 17:16
Show Gist options
  • Save mpkocher/c2f558353ff0b4f63d542c94782fdf56 to your computer and use it in GitHub Desktop.
Save mpkocher/c2f558353ff0b4f63d542c94782fdf56 to your computer and use it in GitHub Desktop.
Pacbio SemVer Scratch Pad
(core)c2f558353ff0b4f63d542c94782fdf56 $> ipython -i semver_pad.py
Python 2.7.10 (default, Jul 13 2015, 12:05:58)
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: run_demo()
1.2.5+55b157e
{'major': 1, 'prerelease': None, 'build': '55b157e', 'minor': 2, 'patch': 5}
1.2.4+432.55b157e
{'major': 1, 'prerelease': None, 'build': '432.55b157e', 'minor': 2, 'patch': 4}
1.2.4-rc1+999.55b157e
{'major': 1, 'prerelease': 'rc1', 'build': '999.55b157e', 'minor': 2, 'patch': 4}
1.2.4-SNAPSHOT+432.55b157e
{'major': 1, 'prerelease': 'SNAPSHOT', 'build': '432.55b157e', 'minor': 2, 'patch': 4}
import semver as S
def to_v(major, minor, patch, git_sha, build_number=None, prerelease_tag=None):
"""
The bamboo build number shouldn't be required. It's optional (specifically
for secondary tools that are built outside of bamboo (e.g., locally, from
Github)
The "pacbio" build metadata contains {bamboo_build_number}.{short_sha}.
This enables determining what the newest build is and communicates the
fundamental git data. The git branch could be encoded as
{bamboo_build_number}.{short_sha}.{branch_name}
However, the branch name would probably requires restrictions on the name
to be compliant with the semver spec of the metadata. Given that branches
are light weight and often deleted, the usefulness might be only limited
to intergration builds that leverage artifacts.
Note, that Semver only provides a mechanism for adding metadata using "+",
semver doesn't provide a standardized mechanism for determining if versions
are greater or less than other versions using the metadata. For this
semver, uses the prerelease tag + major, minor, patch for comparision.
This makes sense. it's not obvious how to compare version from a loose
metadata model.
"""
base = ".".join(str(i) for i in (major, minor, patch))
prerelease = "" if prerelease_tag is None else "-{}".format(prerelease_tag)
# need the trailing . as the sep for the other metadata
number = "" if build_number is None else str(build_number) + "."
metadata = "+{b}{s}".format(b=number, s=git_sha[:7])
return "{b}{p}{m}".format(b=base, p=prerelease, m=metadata)
def get_demo_data():
"""Get Example versions"""
git_sha = "55b157ebbdde45546e33e5c4521ec644e95c8e12"
versions = []
def to_vs(*args, **kwargs):
v = to_v(*args, **kwargs)
versions.append(v)
return v
# for secondary, some tools might be built outside of bamboo.
to_vs(1, 2, 5, git_sha)
# Vanilla tools that are built from bamboo
to_vs(1, 2, 4, git_sha, build_number=432)
# example of using prereleases. SemVer relies heavily on this to determine
# if versions are greater than or less than other versions
to_vs(1, 2, 4, git_sha, build_number=999, prerelease_tag="rc1")
# scala/java prerelease style which impacts now maven and local repos work
to_vs(1, 2, 4, git_sha, build_number=432, prerelease_tag="SNAPSHOT")
return versions
def run_demo():
versions = get_demo_data()
for v in versions:
print v
print S.parse(v)
print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment