Skip to content

Commit

Permalink
PEP621 and hatch scripts (#202)
Browse files Browse the repository at this point in the history
* Switch to PEP621 and hatchling
* Improve spec file & release workflow
* Use hatch scripts
* Switch to dynamic version
* Merge `python-fmf` with `fmf`

Signed-off-by: Cristian Le <[email protected]>
  • Loading branch information
LecrisUT authored Nov 29, 2024
1 parent f4fb82e commit 94c2616
Show file tree
Hide file tree
Showing 13 changed files with 185 additions and 224 deletions.
3 changes: 3 additions & 0 deletions .git_archival.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node: $Format:%H$
node-date: $Format:%cI$
describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.git_archival.txt export-subst
27 changes: 10 additions & 17 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
name: release
name: 🚀 Release

on:
release:
types: [published]
workflow_dispatch:
inputs:
ref:
description: 'Tag to release'
required: true

jobs:
release:
name: 🚀 Release
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/fmf
permissions:
id-token: write # For pypi-publish
steps:
- uses: actions/checkout@v2
if: ${{ github.event_name == 'release' }}
- uses: actions/checkout@v2
if: ${{ github.event_name == 'workflow_dispatch' }}
with:
ref: ${{ github.event.inputs.ref }}
- name: Create dist
run: make wheel
- uses: actions/checkout@v4
- name: Build package
run: pipx hatch build
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
10 changes: 5 additions & 5 deletions .packit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ synced_files:
upstream_package_name: fmf
downstream_package_name: fmf

# Epel9 fails to build because of too old version of setuptools_scm
# Need to create archive with PKG-INFO
actions:
create-archive:
- make tarball
get-current-version:
- make version
- "hatch build -t sdist"
- "sh -c 'echo dist/fmf-*.tar.gz'"

srpm_build_deps:
- make
- python3-docutils
- hatch

jobs:
- job: copr_build
Expand Down
1 change: 0 additions & 1 deletion MANIFEST.in

This file was deleted.

42 changes: 15 additions & 27 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,53 +1,42 @@
# Prepare variables
TMP = $(CURDIR)/tmp
VERSION = $(shell grep ^Version fmf.spec | sed 's/.* //')
COMMIT = $(shell git rev-parse --short HEAD)
REPLACE_VERSION = "s/running from the source/$(VERSION) ($(COMMIT))/"
VERSION = $(shell hatch version)
PACKAGE = fmf-$(VERSION)
FILES = LICENSE README.rst \
Makefile fmf.spec setup.py \
examples fmf bin tests
Makefile fmf.spec pyproject.toml \
examples fmf tests

# Define special targets
all: docs packages
.PHONY: docs hooks
.PHONY: docs hooks tmp

# Temporary directory, include .fmf to prevent exploring tests there
tmp:
mkdir -p $(TMP)/.fmf
mkdir -p $(TMP)/$(PACKAGE)


# Run the test suite, optionally with coverage
test: tmp
pytest tests/unit -c tests/unit/pytest.ini
hatch run test:unit
smoke: tmp
pytest tests/unit/test_smoke.py -c tests/unit/pytest.ini
hatch run test:smoke
coverage: tmp
coverage run --source=fmf,bin -m py.test -c tests/unit/pytest.ini tests
coverage report
coverage annotate
hatch run cov:cov


# Build documentation, prepare man page
docs: man
cd docs && make html
man: source
hatch run docs:html
man: tmp
cp docs/header.txt $(TMP)/man.rst
tail -n+7 README.rst >> $(TMP)/man.rst
rst2man $(TMP)/man.rst > $(TMP)/$(PACKAGE)/fmf.1


# RPM packaging
source: clean tmp
mkdir -p $(TMP)/SOURCES
mkdir -p $(TMP)/$(PACKAGE)
cp -a $(FILES) $(TMP)/$(PACKAGE)
sed -i $(REPLACE_VERSION) $(TMP)/$(PACKAGE)/fmf/__init__.py
tarball: source man
cd $(TMP) && tar cfz SOURCES/$(PACKAGE).tar.gz $(PACKAGE)
@echo ./tmp/SOURCES/$(PACKAGE).tar.gz
version:
@echo "$(VERSION)"
tarball: man
hatch build -t sdist
rpm: tarball
rpmbuild --define '_topdir $(TMP)' -bb fmf.spec
srpm: tarball
Expand All @@ -57,10 +46,9 @@ packages: rpm srpm

# Python packaging
wheel:
python setup.py bdist_wheel
python3 setup.py bdist_wheel
upload:
twine upload dist/*.whl
hatch build -t wheel
upload: wheel tarball
hatch publish


# Vim tags and cleanup
Expand Down
40 changes: 0 additions & 40 deletions bin/fmf

This file was deleted.

72 changes: 27 additions & 45 deletions fmf.spec
Original file line number Diff line number Diff line change
@@ -1,79 +1,61 @@
Name: fmf
Version: 1.4.1
Release: 1%{?dist}
Name: fmf
Version: 0.0.0
Release: 1%{?dist}

Summary: Flexible Metadata Format
License: GPLv2+
BuildArch: noarch
Summary: Flexible Metadata Format
License: GPL-2.0-or-later
BuildArch: noarch

URL: https://github.com/psss/fmf
Source0: https://github.com/psss/fmf/releases/download/%{version}/fmf-%{version}.tar.gz
URL: https://github.com/teemtee/fmf
Source: %{pypi_source fmf}

# Main fmf package requires the Python module
Requires: python%{python3_pkgversion}-%{name} == %{version}-%{release}
BuildRequires: python3-devel
BuildRequires: python3dist(docutils)
BuildRequires: git-core
Requires: git-core

%py_provides python3-fmf

%description
The fmf Python module and command line tool implement a flexible
format for defining metadata in plain text files which can be
stored close to the source code. Thanks to hierarchical structure
with support for inheritance and elasticity it provides an
efficient way to organize data into well-sized text documents.
This package contains the command line tool.

%?python_enable_dependency_generator


%package -n python%{python3_pkgversion}-%{name}
Summary: %{summary}
BuildRequires: python%{python3_pkgversion}-devel
BuildRequires: python%{python3_pkgversion}-setuptools
BuildRequires: python%{python3_pkgversion}-pytest
BuildRequires: python%{python3_pkgversion}-ruamel-yaml
BuildRequires: python%{python3_pkgversion}-filelock
BuildRequires: python%{python3_pkgversion}-jsonschema
BuildRequires: git-core
%{?python_provide:%python_provide python%{python3_pkgversion}-%{name}}
Requires: git-core

%description -n python%{python3_pkgversion}-%{name}
The fmf Python module and command line tool implement a flexible
format for defining metadata in plain text files which can be
stored close to the source code. Thanks to hierarchical structure
with support for inheritance and elasticity it provides an
efficient way to organize data into well-sized text documents.
This package contains the Python 3 module.
%prep
%autosetup -p1 -n fmf-%{version}


%prep
%autosetup
%generate_buildrequires
%pyproject_buildrequires -x tests %{?epel:-w}


%build
%py3_build
%pyproject_wheel
cp docs/header.txt man.rst
tail -n+7 README.rst >> man.rst
rst2man man.rst > fmf.1


%install
%py3_install
%pyproject_install
%pyproject_save_files fmf

mkdir -p %{buildroot}%{_mandir}/man1
install -pm 644 fmf.1* %{buildroot}%{_mandir}/man1


%check
%{__python3} -m pytest -vv -c tests/unit/pytest.ini -m 'not web'

%pyproject_check_import

%{!?_licensedir:%global license %%doc}

%files
%files -f %{pyproject_files}
%{_mandir}/man1/*
%{_bindir}/%{name}
%doc README.rst examples
%license LICENSE

%files -n python%{python3_pkgversion}-%{name}
%{python3_sitelib}/%{name}/
%{python3_sitelib}/%{name}-*.egg-info
%license LICENSE


%changelog
Expand Down
15 changes: 9 additions & 6 deletions fmf/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
""" Flexible Metadata Format """

# Version is replaced before building the package
__version__ = 'running from the source'
from __future__ import annotations

import importlib.metadata

from fmf.base import Tree
from fmf.context import Context
from fmf.utils import filter

__version__ = importlib.metadata.version("fmf")

__all__ = [
"Context",
"Tree",
"filter",
]

from fmf.base import Tree
from fmf.context import Context
from fmf.utils import filter
10 changes: 10 additions & 0 deletions fmf/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,13 @@ def main(arguments=None, path=None):
""" Parse options, do what is requested """
parser = Parser(arguments, path)
return parser.output


def cli_entry():
try:
main()
except fmf.utils.GeneralError as error:
if "--debug" not in sys.argv:
fmf.utils.log.error(error)
raise SystemExit(1)
raise
Loading

0 comments on commit 94c2616

Please sign in to comment.