Skip to content

Commit

Permalink
Changes to use pyproject.toml
Browse files Browse the repository at this point in the history
  • Loading branch information
joachimmetz committed Sep 23, 2023
1 parent 81b2aec commit 1fa1f78
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 231 deletions.
12 changes: 7 additions & 5 deletions .github/workflows/test_tox.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@ jobs:
matrix:
include:
- python-version: '3.7'
toxenv: 'py37'
toxenv: 'py37,wheel'
- python-version: '3.8'
toxenv: 'py38'
toxenv: 'py38,wheel'
- python-version: '3.9'
toxenv: 'py39'
toxenv: 'py39,wheel'
- python-version: '3.10'
toxenv: 'py310'
toxenv: 'py310,wheel'
- python-version: '3.11'
toxenv: 'py311'
toxenv: 'py311,wheel'
- python-version: '3.12'
toxenv: 'py312,wheel'
container:
image: ubuntu:22.04
steps:
Expand Down
1 change: 1 addition & 0 deletions acstore.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[project]
name: acstore
name_description: ACStore
status: alpha
maintainer: Log2Timeline maintainers <[email protected]>
homepage_url: https://github.com/log2timeline/acstore
description_short: Attribute Container Storage (ACStore).
Expand Down
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
pip >= 7.0.0
PyYAML >= 3.10
45 changes: 38 additions & 7 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,16 +1,47 @@
[metadata]
license_files = LICENSE
name = acstore
version = 20230506
description = Attribute Container Storage (ACStore).
long_description = ACStore, or Attribute Container Storage, provides a stand-alone implementation to read and write attribute container storage files.
url = https://github.com/log2timeline/acstore
maintainer = Log2Timeline maintainers
maintainer_email = [email protected]
license = Apache License, Version 2.0
license_files =
ACKNOWLEDGEMENTS
AUTHORS
LICENSE
README
classifiers =
Development Status :: 3 - Alpha
Programming Language :: Python

[options]
install_requires = file:requirements.txt
package_dir =
acstore = acstore
packages = find:
python_requires = >=3.7

[options.packages.find]
exclude =
docs
tests
tests.*
utils
where = .

[bdist_rpm]
release = 1
packager = Log2Timeline maintainers <[email protected]>
doc_files = ACKNOWLEDGEMENTS
AUTHORS
LICENSE
README
doc_files =
ACKNOWLEDGEMENTS
AUTHORS
LICENSE
README
build_requires = python3-setuptools
requires = python3-pyyaml >= 3.10
requires =
python3-pyyaml >= 3.10

[bdist_wheel]
universal = 1

193 changes: 2 additions & 191 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,196 +2,7 @@
# -*- coding: utf-8 -*-
"""Installation and deployment script."""

import os
import pkg_resources
import sys
from setuptools import setup

try:
from setuptools import find_packages, setup
except ImportError:
from distutils.core import find_packages, setup

try:
from distutils.command.bdist_rpm import bdist_rpm
except ImportError:
bdist_rpm = None

version_tuple = (sys.version_info[0], sys.version_info[1])
if version_tuple < (3, 7):
print(f'Unsupported Python version: {sys.version:s}, version 3.7 or higher '
f'required.')
sys.exit(1)

# Change PYTHONPATH to include acstore so that we can get the version.
sys.path.insert(0, '.')

import acstore # pylint: disable=wrong-import-position


if not bdist_rpm:
BdistRPMCommand = None
else:
class BdistRPMCommand(bdist_rpm):
"""Custom handler for the bdist_rpm command."""

# pylint: disable=invalid-name
def _make_spec_file(self):
"""Generates the text of an RPM spec file.
Returns:
list[str]: lines of the RPM spec file.
"""
# Note that bdist_rpm can be an old style class.
if issubclass(BdistRPMCommand, object):
spec_file = super(BdistRPMCommand, self)._make_spec_file()
else:
spec_file = bdist_rpm._make_spec_file(self)

python_package = 'python3'

description = []
requires = ''
summary = ''
in_description = False

python_spec_file = []
for line in iter(spec_file):
if line.startswith('Summary: '):
summary = line[9:]

elif line.startswith('BuildRequires: '):
line = (f'BuildRequires: {python_package:s}-setuptools, '
f'{python_package:s}-devel')

elif line.startswith('Requires: '):
requires = line[10:]
continue

elif line.startswith('%description'):
in_description = True

elif line.startswith('python setup.py build'):
if python_package == 'python3':
line = '%py3_build'
else:
line = '%py2_build'

elif line.startswith('python setup.py install'):
if python_package == 'python3':
line = '%py3_install'
else:
line = '%py2_install'

elif line.startswith('%files'):
lines = [
f'%files -n {python_package:s}-%{{name}}',
'%defattr(644,root,root,755)',
'%license LICENSE',
'%doc ACKNOWLEDGEMENTS AUTHORS README']

lines.extend([
'%{python3_sitelib}/acstore/*.py',
'%{python3_sitelib}/acstore/*/*.py',
'%{python3_sitelib}/acstore*.egg-info/*',
'',
'%exclude %{_prefix}/share/doc/*',
'%exclude %{python3_sitelib}/acstore/__pycache__/*',
'%exclude %{python3_sitelib}/acstore/*/__pycache__/*'])

python_spec_file.extend(lines)
break

elif line.startswith('%prep'):
in_description = False

python_spec_file.append(f'%package -n {python_package:s}-%{{name}}')
python_summary = f'Python 3 module of {summary:s}'

if requires:
python_spec_file.append(f'Requires: {requires:s}')

python_spec_file.extend([
f'Summary: {python_summary:s}',
'',
f'%description -n {python_package:s}-%{{name}}'])

python_spec_file.extend(description)

elif in_description:
# Ignore leading white lines in the description.
if not description and not line:
continue

description.append(line)

python_spec_file.append(line)

return python_spec_file


def parse_requirements_from_file(path):
"""Parses requirements from a requirements file.
Args:
path (str): path to the requirements file.
Returns:
list[str]: name and optional version information of the required packages.
"""
requirements = []
if os.path.isfile(path):
with open(path, 'r') as file_object:
file_contents = file_object.read()

for requirement in pkg_resources.parse_requirements(file_contents):
try:
name = str(requirement.req)
except AttributeError:
name = str(requirement)

if not name.startswith('pip '):
requirements.append(name)

return requirements


acstore_description = (
'Attribute Container Storage (ACStore).')

acstore_long_description = (
'ACStore, or Attribute Container Storage, provides a stand-alone '
'implementation to read and write attribute container storage files.')

command_classes = {}
if BdistRPMCommand:
command_classes['bdist_rpm'] = BdistRPMCommand

setup(
name='acstore',
version=acstore.__version__,
description=acstore_description,
long_description=acstore_long_description,
long_description_content_type='text/plain',
license='Apache License, Version 2.0',
url='https://github.com/log2timeline/acstore',
maintainer='Log2Timeline maintainers',
maintainer_email='[email protected]',
cmdclass=command_classes,
classifiers=[
'',
'Environment :: Console',
'Operating System :: OS Independent',
'Programming Language :: Python',
],
packages=find_packages('.', exclude=[
'docs', 'tests', 'tests.*', 'utils']),
package_dir={
'acstore': 'acstore'
},
data_files=[
('share/doc/acstore', [
'ACKNOWLEDGEMENTS', 'AUTHORS', 'LICENSE', 'README']),
],
install_requires=parse_requirements_from_file('requirements.txt'),
tests_require=parse_requirements_from_file('test_requirements.txt'),
)
setup()
58 changes: 31 additions & 27 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,49 +1,53 @@
[tox]
envlist = py3{7,8,9,10,11},coverage,docs,lint
envlist = py3{7,8,9,10,11,12},coverage,docs,lint,wheel

[testenv]
allowlist_externals = ./run_tests.py
pip_pre = True
passenv =
CFLAGS
CPPFLAGS
LDFLAGS
CFLAGS
CPPFLAGS
LDFLAGS
setenv =
PYTHONPATH = {toxinidir}
PYTHONPATH = {toxinidir}
deps =
-rrequirements.txt
-rtest_requirements.txt
coverage: coverage
-rrequirements.txt
-rtest_requirements.txt
coverage: coverage
wheel:
build
setuptools
commands =
py3{7,8,9,10,11}: ./run_tests.py
coverage: coverage erase
coverage: coverage run --source=acstore --omit="*_test*,*__init__*,*test_lib*" run_tests.py
coverage: coverage xml
py3{7,8,9,10,11,12}: ./run_tests.py
coverage: coverage erase
coverage: coverage run --source=acstore --omit="*_test*,*__init__*,*test_lib*" run_tests.py
coverage: coverage xml
wheel: python -m build --no-isolation --wheel

[testenv:docs]
usedevelop = True
deps =
-rdocs/requirements.txt
-rdocs/requirements.txt
commands =
sphinx-build -b html -d build/doctrees docs dist/docs
sphinx-build -b linkcheck docs dist/docs
sphinx-build -b html -d build/doctrees docs dist/docs
sphinx-build -b linkcheck docs dist/docs

[testenv:lint]
skipsdist = True
pip_pre = True
passenv =
CFLAGS
CPPFLAGS
LDFLAGS
CFLAGS
CPPFLAGS
LDFLAGS
setenv =
PYTHONPATH = {toxinidir}
PYTHONPATH = {toxinidir}
deps =
-rrequirements.txt
-rtest_requirements.txt
pylint >= 2.17.0, < 2.18.0
yamllint >= 1.26.0
-rrequirements.txt
-rtest_requirements.txt
pylint >= 2.17.0, < 2.18.0
yamllint >= 1.26.0
commands =
pylint --version
yamllint -v
pylint --rcfile=.pylintrc acstore tests
yamllint -c .yamllint.yaml test_data
pylint --version
yamllint -v
pylint --rcfile=.pylintrc acstore setup.py tests
yamllint -c .yamllint.yaml test_data

0 comments on commit 1fa1f78

Please sign in to comment.