mirror of
https://github.com/drewcassidy/yaclog.git
synced 2024-09-01 14:58:58 +00:00
Compare commits
23 Commits
1.1.1
...
1f01bda2f4
Author | SHA1 | Date | |
---|---|---|---|
1f01bda2f4 | |||
629d931979 | |||
d2296fb926 | |||
80e35de136 | |||
d6da31b6ff | |||
d4f477a544 | |||
a392f09a51 | |||
683ccbf916 | |||
2a67f6edc7 | |||
c4be5d2420 | |||
30947769e1 | |||
6589a91d7e | |||
802633b9a7 | |||
47d4b595f8 | |||
fdf30bc14c | |||
72126c8dca | |||
0666f7f593 | |||
51e28e4ef0 | |||
a7cbacb687 | |||
3fa529a05c | |||
396960fae0 | |||
c661be05dc | |||
2f4124c0fc |
32
.github/workflows/python-publish.yml
vendored
32
.github/workflows/python-publish.yml
vendored
@ -9,14 +9,14 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [ "3.8", "3.9", "3.10" ]
|
||||
click-version: [ "click~=7.0", "click~=8.0" ]
|
||||
python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
|
||||
click-version: [ "click~=8.0" ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v4.2.0
|
||||
uses: actions/setup-python@v5.1.1
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
@ -40,23 +40,22 @@ jobs:
|
||||
run: python -m unittest -v
|
||||
|
||||
deploy:
|
||||
needs: test
|
||||
# needs: test
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||
# if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4.2.0
|
||||
uses: actions/setup-python@v5.1.1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
python-version: '>=3.8'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install setuptools wheel twine
|
||||
python -m pip install . # Self hosting!
|
||||
|
||||
- name: Install pypa/build
|
||||
run: python -m pip install build --user
|
||||
@ -64,10 +63,9 @@ jobs:
|
||||
- name: Build a binary wheel and source tarball
|
||||
run: python -m build --sdist --wheel --outdir dist/
|
||||
|
||||
- name: Get version name and body
|
||||
run: |
|
||||
echo "VERSION_TILE=$(yaclog show -n)" >> $GITHUB_ENV
|
||||
echo "$(yaclog show -mb)" >> RELEASE.md
|
||||
- name: Get version info
|
||||
id: yaclog-show
|
||||
uses: ./
|
||||
|
||||
- name: Publish to PyPI
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
@ -75,10 +73,10 @@ jobs:
|
||||
password: ${{ secrets.PYPI_API_TOKEN }}
|
||||
|
||||
- name: Publish to Github
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: dist/*
|
||||
name: ${{ env.VERSION_TITLE }}
|
||||
body_path: RELEASE.md
|
||||
name: ${{ steps.yaclog-show.outputs.name }}
|
||||
body_path: ${{ steps.yaclog-show.outputs.body_file }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@ -5,6 +5,12 @@
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Set the OS, Python version and other tools you might need
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.12"
|
||||
|
||||
# Build documentation in the docs/ directory with Sphinx
|
||||
sphinx:
|
||||
configuration: docs/conf.py
|
||||
@ -16,7 +22,6 @@ formats:
|
||||
|
||||
# Optionally set the version of Python and requirements required to build your docs
|
||||
python:
|
||||
version: 3.8
|
||||
install:
|
||||
- method: pip
|
||||
path: .
|
||||
|
27
CHANGELOG.md
27
CHANGELOG.md
@ -2,6 +2,33 @@
|
||||
|
||||
All notable changes to this project will be documented in this file
|
||||
|
||||
## Version 1.3.0 - 2024-08-08
|
||||
|
||||
### Added
|
||||
|
||||
- added a `--version` option to `yaclog show` that prints just the version number
|
||||
|
||||
### Changed
|
||||
|
||||
- removed support for Click 7 as a dependency
|
||||
|
||||
|
||||
## Version 1.2.0 - 2024-04-16
|
||||
|
||||
### Added
|
||||
|
||||
- added the `-s` option to `yaclog release` to increment arbitrary version segments
|
||||
- added the `-n` option to `yaclog release` to create a new release instead of releasing a new one
|
||||
- added the `-y` option to `yaclog release` to answer "yes" to all confirmation dialogs. Use with caution!
|
||||
|
||||
|
||||
## Version 1.1.2 - 2022-12-29
|
||||
|
||||
### Changed
|
||||
|
||||
- yaclog now only tries to use git when invoked with a command that needs it, meaning most sub commands can now be used on systems without git
|
||||
|
||||
|
||||
## Version 1.1.1 - 2022-08-15
|
||||
|
||||
### Fixed
|
||||
|
87
action.yaml
Normal file
87
action.yaml
Normal file
@ -0,0 +1,87 @@
|
||||
name: 'Yaclog'
|
||||
description: 'Get version information from a changelog, and optionally create a new release'
|
||||
branding:
|
||||
icon: file-text
|
||||
color: blue
|
||||
|
||||
inputs:
|
||||
markdown:
|
||||
description: If outputs should be in markdown format or not
|
||||
default: 'true'
|
||||
|
||||
release:
|
||||
description: >
|
||||
Creates a new release and commits it if set. Directly passed to the arguments of `yaclog release`.
|
||||
Can be a version number or an increment tag like `--major`, `--minor`, or `--patch`.
|
||||
The resulting commit and tag will be pushed back to the repo, but the workflow must have write permissions.
|
||||
Add
|
||||
```yaml
|
||||
permissions:
|
||||
contents: write
|
||||
```
|
||||
to your workflow to allow this.
|
||||
|
||||
outputs:
|
||||
name:
|
||||
description: "The current version name. For example, `Version 1.3.0`"
|
||||
value: ${{ steps.yaclog-show.outputs.name}}
|
||||
header:
|
||||
description: "The entire header for the current version. For example, `Version 1.3.0 - 2024-08-08`"
|
||||
value: ${{ steps.yaclog-show.outputs.header }}
|
||||
version:
|
||||
description: "The current version number. For example, `1.3.0`"
|
||||
value: ${{ steps.yaclog-show.outputs.version }}
|
||||
body_file:
|
||||
description: "Path to a temporary file containing the version body"
|
||||
value: ${{ steps.yaclog-show.outputs.body_file }}
|
||||
changelog:
|
||||
description: "Path to the entire changelog file."
|
||||
value: ${{ steps.yaclog-show.outputs.changelog }}
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- id: setup-python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
update-environment: 'false'
|
||||
|
||||
- name: Setup Yaclog
|
||||
shell: bash
|
||||
run: |
|
||||
${{ steps.setup-python.outputs.python-path }} -m pip install ${{ github.action_path }}
|
||||
# now make it available in $PATH
|
||||
# this whole rigamarole is because we are using a python root that isnt in $PATH as to not step over other actions
|
||||
mkdir -p "$GITHUB_ACTION_PATH/bin"
|
||||
echo '${{ steps.setup-python.outputs.python-path }} -m yaclog.cli $@' > "$GITHUB_ACTION_PATH/bin/yaclog"
|
||||
chmod +x "$GITHUB_ACTION_PATH/bin/yaclog"
|
||||
echo "$GITHUB_ACTION_PATH/bin" > "$GITHUB_PATH"
|
||||
|
||||
- name: Create New Release
|
||||
shell: bash
|
||||
if: ${{ inputs.release }}
|
||||
run: yaclog release --yes --commit ${{ inputs.release }}
|
||||
|
||||
- name: Get Version Information
|
||||
id: yaclog-show
|
||||
shell: bash
|
||||
run: |
|
||||
yaclog show ---gh-actions ${{ inputs.markdown && '--markdown' }} >> "$GITHUB_OUTPUT"
|
||||
# output like so:
|
||||
# name=Version 1.3.0
|
||||
# header=Version 1.3.0 - 2024-08-08
|
||||
# version=1.3.0
|
||||
# body_file={path to file containing version body}
|
||||
# changelog={path to changelog}
|
||||
|
||||
- name: Push Changes
|
||||
if: ${{ inputs.release }}
|
||||
shell: bash
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
git config --global user.name "github-actions"
|
||||
git config --global user.email "github-actions@github.com"
|
||||
git push
|
||||
git push --tags
|
@ -1,7 +1,7 @@
|
||||
[build-system]
|
||||
requires = [
|
||||
"setuptools>=61",
|
||||
"setuptools_scm>=6.2",
|
||||
"setuptools>=64",
|
||||
"setuptools_scm>=8",
|
||||
"wheel"
|
||||
]
|
||||
build-backend = "setuptools.build_meta"
|
||||
@ -29,7 +29,7 @@ classifiers = [
|
||||
|
||||
requires-python = ">= 3.8"
|
||||
dependencies = [
|
||||
"Click >= 7.0",
|
||||
"Click >= 8.0",
|
||||
"GitPython >= 3",
|
||||
"packaging >= 20",
|
||||
"tomlkit >= 0.11"
|
||||
|
@ -153,6 +153,11 @@ class TestRelease(unittest.TestCase):
|
||||
self.assertEqual(yaclog.read(location).versions[0].name, '1.0.1')
|
||||
self.assertIn('1.0.1', result.output)
|
||||
|
||||
result = runner.invoke(cli, ['release', '-y', '-s', 2])
|
||||
check_result(self, result)
|
||||
self.assertEqual(yaclog.read(location).versions[0].name, '1.0.2')
|
||||
self.assertIn('1.0.2', result.output)
|
||||
|
||||
runner.invoke(cli, ['entry', '-b', 'entry number 3'])
|
||||
|
||||
result = runner.invoke(cli, ['release', '-m'])
|
||||
@ -194,6 +199,12 @@ class TestRelease(unittest.TestCase):
|
||||
self.assertEqual(yaclog.read(location).versions[0].name, '3.0.0')
|
||||
self.assertIn('3.0.0', result.output)
|
||||
|
||||
result = runner.invoke(cli, ['release', '-p', '-n'])
|
||||
check_result(self, result)
|
||||
self.assertEqual(yaclog.read(location).versions[0].name, '3.0.1')
|
||||
self.assertEqual(yaclog.read(location).versions[1].name, '3.0.0')
|
||||
self.assertIn('3.0.1', result.output)
|
||||
|
||||
def test_commit(self):
|
||||
"""Test committing and tagging releases"""
|
||||
runner = CliRunner()
|
||||
|
@ -16,10 +16,8 @@
|
||||
|
||||
import datetime
|
||||
import os.path
|
||||
from ..cli import cargo_toml
|
||||
|
||||
import click
|
||||
import git
|
||||
|
||||
import yaclog.version
|
||||
from yaclog.changelog import Changelog
|
||||
@ -52,7 +50,7 @@ def init(obj: Changelog):
|
||||
click.echo(f'Created new changelog file at {obj.path}')
|
||||
|
||||
|
||||
@cli.command('format') # dont accidentally hide the `format` python builtin
|
||||
@cli.command('format') # don't accidentally hide the `format` python builtin
|
||||
@click.pass_obj
|
||||
def reformat(obj: Changelog):
|
||||
"""Reformat the changelog file."""
|
||||
@ -72,9 +70,12 @@ def reformat(obj: Changelog):
|
||||
help='Show only the version body.')
|
||||
@click.option('--header', '-h', 'mode', flag_value='header',
|
||||
help='Show only the version header.')
|
||||
@click.option('--version', '-v', 'mode', flag_value='version', help='Show only the version number. If the current version is unreleased, '
|
||||
'this is inferred by incrementing the patch number of the last released version')
|
||||
@click.option('---gh-actions', 'gh_actions', is_flag=True, hidden=True)
|
||||
@click.argument('version_names', metavar='VERSIONS', type=str, nargs=-1)
|
||||
@click.pass_obj
|
||||
def show(obj: Changelog, all_versions, markdown, mode, version_names):
|
||||
def show(obj: Changelog, all_versions, markdown, mode, version_names, gh_actions):
|
||||
"""
|
||||
Show the changes for VERSIONS.
|
||||
|
||||
@ -86,15 +87,22 @@ def show(obj: Changelog, all_versions, markdown, mode, version_names):
|
||||
'name': (lambda v, k: v.name),
|
||||
'body': (lambda v, k: v.body(**k)),
|
||||
'header': (lambda v, k: v.header(**k)),
|
||||
'version': (lambda v, k: str(v.version))
|
||||
}
|
||||
|
||||
str_func = functions[mode]
|
||||
kwargs = {'md': markdown, 'color': True}
|
||||
|
||||
try:
|
||||
if all_versions:
|
||||
versions = obj.versions
|
||||
elif len(version_names) == 0:
|
||||
versions = [obj.current_version()]
|
||||
if mode == 'version' and versions[0].name == 'Unreleased':
|
||||
latest = obj.current_version(released=True).version
|
||||
inferred = yaclog.version.increment_version(str(latest), 2, '')
|
||||
print(str(inferred))
|
||||
return
|
||||
else:
|
||||
versions = [obj.get_version(name) for name in version_names]
|
||||
except KeyError as k:
|
||||
@ -102,9 +110,21 @@ def show(obj: Changelog, all_versions, markdown, mode, version_names):
|
||||
except ValueError as v:
|
||||
raise click.ClickException(str(v))
|
||||
|
||||
kwargs = {'md': markdown, 'color': True}
|
||||
|
||||
sep = '\n\n' if mode == 'body' or mode == 'full' else '\n'
|
||||
|
||||
if gh_actions:
|
||||
import tempfile
|
||||
|
||||
all_modes = [ 'name', 'header', 'version' ]
|
||||
outputs = [f'{mode}={sep.join([functions[mode](v, kwargs) for v in versions])}' for mode in all_modes]
|
||||
click.echo('\n'.join(outputs))
|
||||
body_fd, body_file = tempfile.mkstemp(text=True)
|
||||
with os.fdopen(body_fd, 'w') as f:
|
||||
f.write(sep.join([functions['body'](v, kwargs) for v in versions]))
|
||||
click.echo(f'body_file={body_file}')
|
||||
click.echo(f'changelog={obj.path}')
|
||||
return
|
||||
|
||||
click.echo(sep.join([str_func(v, kwargs) for v in versions]))
|
||||
|
||||
|
||||
@ -189,6 +209,8 @@ def entry(obj: Changelog, bullets, paragraphs, section_name, version_name):
|
||||
help='Increment minor version number.')
|
||||
@click.option('-p', '--patch', 'rel_seg', flag_value=2, type=int,
|
||||
help='Increment patch number.')
|
||||
@click.option('-s', '--segment', 'rel_seg', type=int,
|
||||
help='Increment nth segment of the version. For example, `--segment 2` is equivalent to `--patch`')
|
||||
@click.option('-a', '--alpha', 'pre_seg', flag_value='a', type=str, default=None,
|
||||
help='Increment alpha version number.')
|
||||
@click.option('-b', '--beta', 'pre_seg', flag_value='b', type=str,
|
||||
@ -202,9 +224,13 @@ def entry(obj: Changelog, bullets, paragraphs, section_name, version_name):
|
||||
'If there are no changes to commit, the current commit will be tagged instead.')
|
||||
@click.option('-C', '--cargo', '-🦀', is_flag=True,
|
||||
help='Update the version in a Rust cargo.toml manifest file.')
|
||||
@click.option('-y', '--yes', is_flag=True,
|
||||
help='Answer "yes" to all confirmation dialogs')
|
||||
@click.option('-n', '--new', is_flag=True,
|
||||
help = 'Create a new version instead of renaming an existing one')
|
||||
@click.argument('version_name', metavar='VERSION', type=str, default=None, required=False)
|
||||
@click.pass_obj
|
||||
def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo, yes, new):
|
||||
"""
|
||||
Release VERSION, or a version incremented from the last release.
|
||||
|
||||
@ -220,7 +246,10 @@ def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
click.echo('Nothing to release!')
|
||||
raise click.Abort
|
||||
|
||||
cur_version = obj.current_version()
|
||||
if new:
|
||||
cur_version = obj.add_version()
|
||||
else:
|
||||
cur_version = obj.current_version()
|
||||
old_name = cur_version.name
|
||||
|
||||
if version_name:
|
||||
@ -237,11 +266,11 @@ def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
new_name = yaclog.version.increment_version(new_name, rel_seg, pre_seg)
|
||||
|
||||
if new_name != old_name:
|
||||
if yaclog.version.is_release(old_name):
|
||||
if yaclog.version.is_release(old_name) and not yes:
|
||||
click.confirm(
|
||||
f"Rename release version {click.style(old_name, fg='blue')} "
|
||||
f"to {click.style(new_name, fg='blue')}?",
|
||||
abort=True)
|
||||
f"Rename release version {click.style(old_name, fg='blue')} "
|
||||
f"to {click.style(new_name, fg='blue')}?",
|
||||
abort=True)
|
||||
|
||||
cur_version.name = new_name
|
||||
cur_version.date = datetime.datetime.utcnow().date()
|
||||
@ -254,10 +283,12 @@ def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
short_version = cur_version.name.replace(' ', '-')
|
||||
|
||||
if cargo:
|
||||
from ..cli import cargo_toml
|
||||
cargo_toml.set_version("Cargo.toml", str(short_version))
|
||||
click.echo("Updated Cargo.toml")
|
||||
|
||||
if commit:
|
||||
import git
|
||||
repo = git.Repo(os.curdir)
|
||||
|
||||
if repo.bare:
|
||||
@ -283,7 +314,8 @@ def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
f"You have {untracked} untracked file{'s'[:untracked]} that will not be included!",
|
||||
fg='red', bold=True))
|
||||
|
||||
click.confirm(' '.join(message), abort=True)
|
||||
if not yes:
|
||||
click.confirm(' '.join(message), abort=True)
|
||||
|
||||
if tracked > 0:
|
||||
commit = repo.index.commit(f'Release {cur_version.name}\n\n{cur_version.body()}')
|
||||
@ -291,6 +323,7 @@ def release(obj: Changelog, version_name, rel_seg, pre_seg, commit, cargo):
|
||||
else:
|
||||
commit = repo.head.commit
|
||||
|
||||
# noinspection PyTypeChecker
|
||||
repo_tag = repo.create_tag(short_version, ref=commit, message=cur_version.body(False))
|
||||
click.echo(f"Created tag {click.style(repo_tag.name, fg='green')}.")
|
||||
|
||||
|
Reference in New Issue
Block a user