Skip to content

Commit

Permalink
Merge pull request #360 from duckinator/self-release
Browse files Browse the repository at this point in the history
  • Loading branch information
duckinator authored Aug 1, 2024
2 parents 7f3351c + 393a0cb commit 1a567ee
Show file tree
Hide file tree
Showing 12 changed files with 360 additions and 144 deletions.
6 changes: 3 additions & 3 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Lint_task:
- pip install .
- pip install .[lint] .[test]
script:
- pylint --version
- ruff --version
- mypy --version
- bork run lint

Expand Down Expand Up @@ -170,8 +170,8 @@ Release_task:
only_if: "changesInclude('bork/version.py') && $BRANCH == 'main' && $CIRRUS_CRON == ''"
depends_on: [CI success]
env:
TWINE_USERNAME: "__token__"
TWINE_PASSWORD: ENCRYPTED[00007524e18bea7b59efea288653efa57b1dbd235ed8af00cc325febfc9076631a2bf58ed330d8fa7ca057adb81579b0]
BORK_PYPI_USERNAME: "__token__"
BORK_PYPI_PASSWORD: ENCRYPTED[00007524e18bea7b59efea288653efa57b1dbd235ed8af00cc325febfc9076631a2bf58ed330d8fa7ca057adb81579b0]
BORK_GITHUB_TOKEN: ENCRYPTED[29eac4d276e1e86020bbc415c04ce91136508e5bdeacd756310c32ebdd3fb7f910c6ed3159f08765915d9e656964e8f5]
container:
image: python:3.11-slim
Expand Down
33 changes: 0 additions & 33 deletions .pylintrc

This file was deleted.

12 changes: 12 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
bork = {editable = true, path = "."}

[dev-packages]

[requires]
python_version = "3.11"
65 changes: 65 additions & 0 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 24 additions & 29 deletions bork/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,11 @@ def aliases():

def build():
"""Build the project."""
try:
builder.dist()
builder.zipapp()

except FileNotFoundError as e:
if e.filename != 'pyproject.toml':
raise e

def setup(ext):
return Path.cwd() / f"setup.{ext}"

if setup("cfg").exists() or setup("py").exists():
msg = """If you use setuptools, the following should be sufficient:
[build-system]
requires = ["setuptools > 42", "wheel"]
build-backend = "setuptools.build_meta" """

else:
msg = "Please refer to your build system's documentation."
builder.dist()

logger().error(
"You need a 'pyproject.toml' file describing which buildsystem to "
"use, per PEP 517. %s", msg
)

raise e
def build_zipapp(zipapp_main=None):
"""Build the project as a ZipApp."""
builder.zipapp(zipapp_main)


def clean():
Expand Down Expand Up @@ -113,7 +91,7 @@ def download(package, release_tag, file_pattern, directory):
downloader.download(package, release_tag, file_pattern, directory) # type:ignore


def release(repository_name, dry_run):
def release(repository_name, dry_run, github_release_override=None, pypi_release_override=None):
"""Uploads build artifacts to a PyPi instance or GitHub, as configured
in pyproject.toml.
Expand All @@ -123,12 +101,23 @@ def release(repository_name, dry_run):
dry_run:
If True, don't actually release, just show what a release would do.
github_release_override:
If True, enable GitHub releases; if False, disable GitHub releases;
if None, respect the configuration in pyproject.toml.
py_release_override:
If True, enable PyPi releases; if False, disable PyPi releases;
if None, respect the configuration in pyproject.toml.
"""
pyproject = load_pyproject()
bork_config = pyproject.get('tool', {}).get('bork', {})
release_config = bork_config.get('release', {})
github_token = os.environ.get('BORK_GITHUB_TOKEN', None)
version = builder.version_from_bdist_file()
try:
version = builder.version_from_bdist_file()
except builder.NeedsBuildError:
raise RuntimeError("No wheel files found. Please run 'bork build' first.")

project_name = pyproject.get('project', {}).get('name', None)

Expand All @@ -138,8 +127,14 @@ def release(repository_name, dry_run):
release_to_github = release_config.get('github', False)
release_to_pypi = release_config.get('pypi', True)

if github_release_override is not None:
release_to_github = github_release_override

if pypi_release_override is not None:
release_to_pypi = pypi_release_override

if not release_to_github and not release_to_pypi:
print('Configured to release to neither PyPi nor GitHub?')
raise RuntimeError('Configured to release to neither PyPi nor GitHub?')

if release_to_github:
github_repository = release_config.get('github_repository', None)
Expand Down
73 changes: 45 additions & 28 deletions bork/builder.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,40 @@
import configparser
from .filesystem import load_pyproject, try_delete
from .log import logger
import build
import contextlib
from pathlib import Path
import subprocess
import sys
import tempfile
# Slight kludge so we can have a function named zipapp().
import zipapp as Zipapp # noqa: N812

import build
# When Python 3.8 and 3.9 support is dropped, drop the importlib_metadata backport.
if sys.version_info[:2] >= (3, 10):
from importlib import metadata as importlib_metadata
else:
import importlib_metadata

from .filesystem import load_pyproject, try_delete
# from .log import logger
class NeedsBuildError(Exception):
pass


# The "proper" way to handle the default would be to check python_requires
# in setup.cfg. But, since Bork needs Python 3, there's no point.
# in pyproject.toml. But, since Bork needs Python 3, there's no point.
DEFAULT_PYTHON_INTERPRETER = '/usr/bin/env python3'

@contextlib.contextmanager
def prepared_environment(srcdir, outdir):
"""Usage:
with prepared_environment(".", "./dist") as (env, builder):
# ...
"""
with build.env.DefaultIsolatedEnv() as env:
builder = build.ProjectBuilder.from_isolated_env(env, srcdir)
# Install deps from `project.build_system_requires`
env.install(builder.build_system_requires)
# Yield env and builder.
yield (env, builder)

def dist(backend_settings=None):
"""Build the sdist and wheel distributions.
Expand All @@ -41,28 +61,28 @@ def dist(backend_settings=None):
return results


def _setup_cfg_package_name():
setup_cfg = configparser.ConfigParser()
setup_cfg.read('setup.cfg')

if 'metadata' not in setup_cfg or 'name' not in setup_cfg['metadata']:
raise RuntimeError(
"You need to set project.name in pyproject.toml OR metadata.name in setup.cfg"
)

return setup_cfg['metadata']['name']
def metadata():
srcdir = "."
outdir = "./dist"

with prepared_environment(srcdir, outdir) as (env, builder):
with tempfile.TemporaryDirectory() as tmpdir:
path = Path(builder.metadata_path(tmpdir))
return importlib_metadata.Distribution.at(path).metadata

def _python_interpreter(config):
# To override the default interpreter, add this to your project's setup.cfg:
# To override the default interpreter, add this to your project's pyproject.toml:
#
# [bork]
# python_interpreter = /path/to/python
return config.get('python_interpreter', DEFAULT_PYTHON_INTERPRETER)


def _bdist_file():
return max(Path.cwd().glob('dist/*.whl'))
files = list(Path.cwd().glob('dist/*.whl'))
if not files:
raise NeedsBuildError
return max(files)


def _prepare_zipapp(dest, bdist_file):
Expand All @@ -78,29 +98,25 @@ def version_from_bdist_file():
return _bdist_file().name.replace('.tar.gz', '').split('-')[1]


def zipapp():
def zipapp(zipapp_main):
"""
Build a zipapp for the project.
dist() should be called before zipapp().
"""

log = logger()

log.info("Building ZipApp.")

pyproject = load_pyproject()
config = pyproject.get('tool', {}).get('bork', {})
zipapp_cfg = config.get('zipapp', {})
want_zipapp = zipapp_cfg.get('enabled', False)

if not want_zipapp:
return

# If the project name is specified in pyproject.toml, use it.
# Otherwise, try getting it from setup.cfg.
name = pyproject.get('project', {}).get('name', None)
if name is None:
name = _setup_cfg_package_name()
name = metadata()['name']
dest = str(Path('build', 'zipapp'))
version = version_from_bdist_file()
main = zipapp_cfg['main']
main = zipapp_main or zipapp_cfg['main']

# Output file is dist/<package name>-<package version>.pyz.
target = f"dist/{name}-{version}.pyz"
Expand All @@ -111,3 +127,4 @@ def zipapp():
compressed=True)
if not Path(target).exists():
raise RuntimeError(f"Failed to build zipapp: {target}")
log.info("Finished building ZipApp.")
Loading

0 comments on commit 1a567ee

Please sign in to comment.