From 5aa7e7177faab345f8a2dd3df6a5f134740a749c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Mon, 2 Oct 2023 11:47:58 +0200 Subject: [PATCH] Add conda build, __version__, and license (#33) --- .github/workflows/build.yaml | 34 ++++++++++++++++++++++++++++++++++ .gitignore | 1 + LICENSE.txt | 30 ++++++++++++++++++++++++++++++ conda/build.sh | 10 ++++++++++ conda/recipe/meta.yaml | 30 ++++++++++++++++++++++++++++++ holonote/__init__.py | 18 ++++++++++++++++++ pyproject.toml | 19 ++++++++++++++++--- 7 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 LICENSE.txt create mode 100755 conda/build.sh create mode 100644 conda/recipe/meta.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f7265ef..e4a8760 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -21,3 +21,37 @@ jobs: - name: Publish if: github.event_name == 'release' && github.event.action == 'published' run: hatch publish --user __token__ --auth ${{ secrets.pypi_password }} + conda-build: + runs-on: ubuntu-latest + env: + CONDA_UPLOAD_TOKEN: ${{ secrets.CONDA_UPLOAD_TOKEN }} + defaults: + run: + shell: bash -el {0} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Set output + id: vars + run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT + - uses: conda-incubator/setup-miniconda@v2 + with: + python-version: "3.10" + channels: pyviz/label/dev,conda-forge + - name: Install packages + run: | + conda install -y conda-build hatch anaconda-client + - name: Build conda package + run: | + hatch run conda:build + - name: Publish conda dev + if: (github.event_name == 'release' && github.event.action == 'published' && (contains(steps.vars.outputs.tag, 'a') || contains(steps.vars.outputs.tag, 'b') || contains(steps.vars.outputs.tag, 'rc'))) + run: | + FILE="$CONDA_PREFIX/conda-bld/noarch/holonote-$(hatch version)-py_0.tar.bz2" + anaconda --token $CONDA_UPLOAD_TOKEN upload --user pyviz --label=dev $FILE + - name: Publish conda main + if: (github.event_name == 'release' && github.event.action == 'published' && !(contains(steps.vars.outputs.tag, 'a') || contains(steps.vars.outputs.tag, 'b') || contains(steps.vars.outputs.tag, 'rc'))) + run: | + FILE="$CONDA_PREFIX/conda-bld/noarch/holonote-$(hatch version)-py_0.tar.bz2" + # anaconda --token $CONDA_UPLOAD_TOKEN upload --user pyviz --label=dev --label=main $FILE diff --git a/.gitignore b/.gitignore index 5c9216a..559abd4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__/ .pytest_cache dist scratch/ +holonote/_version.py diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..a81cb8c --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,30 @@ +Copyright (c) 2023, HoloViz team (holoviz.org). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/conda/build.sh b/conda/build.sh new file mode 100755 index 0000000..029a69f --- /dev/null +++ b/conda/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +git status + +hatch build --clean + +export VERSION="$(hatch version)" +conda build conda/recipe --no-test --no-anaconda-upload --no-verify diff --git a/conda/recipe/meta.yaml b/conda/recipe/meta.yaml new file mode 100644 index 0000000..d651ede --- /dev/null +++ b/conda/recipe/meta.yaml @@ -0,0 +1,30 @@ +{% set data = load_file_data('../../pyproject.toml', from_recipe_dir=True) %} + + +package: + name: holonote + version: {{ VERSION }} + +source: + url: ../../dist/holonote-{{ VERSION }}-py3-none-any.whl + +build: + noarch: python + script: + - {{ PYTHON }} -m pip install -vv holonote-{{ VERSION }}-py3-none-any.whl + +requirements: + host: + - python {{ data['project']['requires-python']}} + + run: + - python {{ data['project']['requires-python']}} + + {% for dep in data['project']['dependencies'] %} + - {{ dep.lower() }} + {% endfor %} + +about: + license: BSD-3-Clause + summary: {{ data['project']['description'] }} + description: {{ data['project']['readme'] }} diff --git a/holonote/__init__.py b/holonote/__init__.py index b9583f1..ee82fb1 100644 --- a/holonote/__init__.py +++ b/holonote/__init__.py @@ -1,3 +1,21 @@ from __future__ import annotations from . import annotate, editor # noqa: F401 + +# Define '__version__' +try: + # If setuptools_scm is installed (e.g. in a development environment with + # an editable install), then use it to determine the version dynamically. + from setuptools_scm import get_version + + # This will fail with LookupError if the package is not installed in + # editable mode or if Git is not installed. + __version__ = get_version(root="..", relative_to=__file__) +except (ImportError, LookupError): + # As a fallback, use the version that is hard-coded in the file. + try: + from ._version import __version__ + except ModuleNotFoundError: + # The user is probably trying to run this without having installed + # the package. + __version__ = "0.0.0+unknown" diff --git a/pyproject.toml b/pyproject.toml index a25fb90..42cb56e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ name = "holonote" readme = "README.md" description = "Annotate your data" requires-python = ">=3.9" +license = { file = "LICENSE.txt" } keywords = ["annotation", "holoviews", "tools"] dynamic = ["version"] classifiers = [ @@ -17,8 +18,20 @@ classifiers = [ ] dependencies = ["holoviews >=1.18.0a1", "pandas <2.1"] -[tool.hatch.version] -source = "vcs" +[project.optional-dependencies] +dev = [ + "pre-commit", + "setuptools_scm", + "pytest", +] + +[tool.hatch] +version.source = "vcs" +build.hooks.vcs.version-file = "holonote/_version.py" + +[tool.hatch.envs.conda] +detached = true +scripts.build = "bash conda/build.sh" [tool.hatch.envs.test] dependencies = ["pytest"] @@ -26,7 +39,7 @@ scripts.run = "python -m pytest holonote/tests" matrix = [{ python = ["3.9", "3.10", "3.11"] }] [tool.hatch.envs.fmt] -dependencies = ["pre-commit"] +detached = true scripts.run = "pre-commit run --all" scripts.update = "pre-commit autoupdate"