Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add miniver to simplify development branch descriptions #726

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ jobs:
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand All @@ -42,6 +45,9 @@ jobs:
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down Expand Up @@ -80,6 +86,9 @@ jobs:
pyversion: '3.11'
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python ${{ matrix.pyversion }}
uses: actions/setup-python@v4
with:
Expand All @@ -103,6 +112,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand All @@ -113,7 +125,7 @@ jobs:
pip install .[dev]
- name: Unit tests
run: |
pytest -v pygfx/__pyinstaller
pytest -vx pygfx/__pyinstaller

test-examples-build:
name: Test examples
Expand All @@ -122,6 +134,9 @@ jobs:
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down Expand Up @@ -155,6 +170,9 @@ jobs:
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down Expand Up @@ -194,6 +212,9 @@ jobs:
if: success() && startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/screenshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ jobs:
runs-on: 'ubuntu-latest'
steps:
- uses: actions/checkout@v3
with:
# https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
fetch-depth: 0
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down
5 changes: 3 additions & 2 deletions pygfx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@

del pylinalg

__version__ = "0.1.18"
version_info = tuple(map(int, __version__.split(".")))
from ._version import __version__

version_info = tuple(map(int, __version__.split(".")[:3]))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what behavior you want from this version_info tuple. I don't have such constructs in my code.

I typically use

from packaging import Version

for all my comparisons.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's do this:

Suggested change
version_info = tuple(map(int, __version__.split(".")[:3]))
version_info = tuple(int(v) if v.isnumeric() else v for v in __version__.split("."))


__wgpu_version_range__ = "0.14.1", "0.16.0"
__pylinalg_version_range__ = "0.4.1", "0.5.0"
Expand Down
130 changes: 130 additions & 0 deletions pygfx/_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# -*- coding: utf-8 -*-
# This file is part of 'miniver': https://github.com/jbweston/miniver
#
from collections import namedtuple
import os

Version = namedtuple("Version", ("release", "post", "labels"))

# No public API
__all__ = []

package_root = os.path.dirname(os.path.realpath(__file__))
package_name = os.path.basename(package_root)
STATIC_VERSION_FILE = "_static_version.py"


def get_version():
version = get_version_from_git()
if not version:
version = Version("unknown", None, None)
return pep440_format(version)


def pep440_format(version_info):
release, post, labels = version_info

version_parts = [release]
if post:
if release.endswith("-post") or release.endswith(".post"):
version_parts.append(post)
else: # prefer PEP440 over strict adhesion to semver
version_parts.append(".post{}".format(post))

if labels:
version_parts.append("+")
version_parts.append(".".join(labels))

return "".join(version_parts)


def get_version_from_git():
import subprocess

# git describe --first-parent does not take into account tags from branches
# that were merged-in. The '--long' flag gets us the 'post' version and
# git hash, '--always' returns the git hash even if there are no tags.
for opts in [["--first-parent"], []]:
try:
p = subprocess.Popen(
["git", "describe", "--long", "--always", "--tags", "--dirty"] + opts,
Comment on lines +49 to +50
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIUC this means that if someone obtains pygfx in another way than via a package manager or git repo, the version cannot be established.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct. There become some "edge cases" that you have to start taking into account when people "receive" the source code.

I just checked my project for example, the version downloaded from pypi burns things in due to the modifications to the setup.py but the archive from github would make it pretty difficult for people to use.

image

cwd=package_root,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
except OSError:
return
if p.wait() == 0:
break
else:
return

description = (
p.communicate()[0]
.decode()
.lstrip("v") # Tags can have a leading 'v', but the version should not
.rstrip("\n")
.rsplit("-") # Split the latest tag, commits since tag, and hash, and dirty
)

try:
release, post, git = description[:3]
except ValueError: # No tags, only the git hash
# prepend 'g' to match with format returned by 'git describe'
git = "g{}".format(*description)
release = "nodescription"
post = None

labels = []
if post == "0":
post = None
else:
labels.append(git)

if description[-1] == "dirty":
labels.append("dirty")

return Version(release, post, labels)


__version__ = get_version()


# The following section defines a 'get_cmdclass' function
# that can be used from setup.py. The '__version__' module
# global is used (but not modified).


def _write_version(fname):
# This could be a hard link, so try to delete it first. Is there any way
# to do this atomically together with opening?
try:
os.remove(fname)
except OSError:
pass
with open(fname, "w") as f:
f.write(f"__version__ = '{__version__}'")


def get_cmdclass(pkg_source_path):
from setuptools.command.build_py import build_py as build_py_orig
from setuptools.command.sdist import sdist as sdist_orig

class _build_py(build_py_orig): # noqa
def run(self):
super().run()

src_marker = "".join(["src", os.path.sep])

if pkg_source_path.startswith(src_marker):
path = pkg_source_path[len(src_marker) :]
else:
path = pkg_source_path
_write_version(os.path.join(self.build_lib, path, "_version.py"))

class _sdist(sdist_orig): # noqa
def make_release_tree(self, base_dir, files):
super().make_release_tree(base_dir, files)
_write_version(os.path.join(base_dir, pkg_source_path, "_version.py"))

return dict(sdist=_sdist, build_py=_build_py)
20 changes: 18 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,24 @@
from setuptools import find_packages, setup


def get_version_and_cmdclass():
"""Load version.py module without importing the whole package.

Template code from miniver
"""
import os
from importlib.util import module_from_spec, spec_from_file_location

spec = spec_from_file_location("version", os.path.join("pygfx", "_version.py"))
module = module_from_spec(spec)
spec.loader.exec_module(module)
return module.__version__, getattr(module, "get_cmdclass", lambda x: {})("pygfx")


version, cmdclass = get_version_and_cmdclass()

with open("pygfx/__init__.py", "rb") as fh:
init_text = fh.read().decode()
VERSION = re.search(r"__version__ = \"(.*?)\"", init_text).group(1)
match = re.search(r"__wgpu_version_range__ = \"(.*?)\", \"(.*?)\"", init_text)
wgpu_min_ver, wgpu_max_ver = match.group(1), match.group(2)
match = re.search(r"__pylinalg_version_range__ = \"(.*?)\", \"(.*?)\"", init_text)
Expand Down Expand Up @@ -65,7 +80,8 @@

setup(
name="pygfx",
version=VERSION,
version=version,
cmdclass=cmdclass,
packages=find_packages(
exclude=["tests", "tests.*", "examples", "examples.*", "exp", "exp.*"]
),
Expand Down
Loading