Skip to content

Commit

Permalink
Changes to use pyproject.toml (ForensicArtifacts#584)
Browse files Browse the repository at this point in the history
  • Loading branch information
joachimmetz authored Oct 29, 2023
1 parent 36fb328 commit ed1b303
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 260 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
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 = artifacts
version = 20230506
description = ForensicArtifacts.com Artifact Repository.
long_description = A free, community-sourced, machine-readable knowledge base of forensic artifacts that the world can use both as an information source and within other tools.
url = https://github.com/ForensicArtifacts/artifacts
maintainer = Forensic artifacts
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 =
artifacts = artifacts
packages = find:
python_requires = >=3.7

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

[bdist_rpm]
release = 1
packager = Forensic artifacts <[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

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

import glob
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 artifacts so that we can get the version.
sys.path.insert(0, '.')

import artifacts # 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 = [
'%files -n %{name}-data',
'%defattr(644,root,root,755)',
'%license LICENSE',
'%doc ACKNOWLEDGEMENTS AUTHORS README',
'%{_datadir}/%{name}/*',
'',
f'%files -n {python_package:s}-%{{name}}',
'%defattr(644,root,root,755)',
'%license LICENSE',
'%doc ACKNOWLEDGEMENTS AUTHORS README']

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

python_spec_file.extend(lines)
break

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

python_spec_file.extend([
'%package -n %{name}-data',
f'Summary: Data files for {summary:s}',
'',
'%description -n %{name}-data'])

python_spec_file.extend(description)

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

python_spec_file.extend([
f'Requires: artifacts-data >= %{{version}} {requires:s}',
f'Summary: {python_summary:s}',
'',
f'%description -n {python_package:s}-%{{name}}'])

python_spec_file.extend(description)

python_spec_file.extend([
'%package -n %{name}-tools',
f'Requires: {python_package:s}-artifacts >= %{{version}}',
f'Summary: Tools for {summary:s}',
'',
'%description -n %{name}-tools'])

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)

python_spec_file.extend([
'',
'%files -n %{name}-tools',
'%{_bindir}/*.py'])

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


artifacts_description = (
'ForensicArtifacts.com Artifact Repository.')

artifacts_long_description = (
'A free, community-sourced, machine-readable knowledge base of forensic '
'artifacts that the world can use both as an information source and within'
' other tools.')

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

setup(
name='artifacts',
version=artifacts.__version__,
description=artifacts_description,
long_description=artifacts_long_description,
long_description_content_type='text/plain',
license='Apache License, Version 2.0',
url='https://github.com/ForensicArtifacts/artifacts',
maintainer='Forensic artifacts',
maintainer_email='[email protected]',
cmdclass=command_classes,
classifiers=[
'Development Status :: 3 - Alpha',
'Environment :: Console',
'Operating System :: OS Independent',
'Programming Language :: Python',
],
packages=find_packages('.', exclude=[
'docs', 'tests', 'tests.*', 'tools', 'utils']),
package_dir={
'artifacts': 'artifacts'
},
scripts=glob.glob(os.path.join('tools', '[a-z]*.py')),
data_files=[
('share/artifacts', glob.glob(
os.path.join('data', '*'))),
('share/doc/artifacts', [
'ACKNOWLEDGEMENTS', 'AUTHORS', 'LICENSE', 'README']),
],
install_requires=parse_requirements_from_file('requirements.txt'),
tests_require=parse_requirements_from_file('test_requirements.txt'),
)
setup()
59 changes: 32 additions & 27 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,49 +1,54 @@
[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
wheel
commands =
py3{7,8,9,10,11}: ./run_tests.py
coverage: coverage erase
coverage: coverage run --source=artifacts --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=artifacts --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 artifacts tests tools
yamllint -c .yamllint.yaml data test_data
pylint --version
yamllint -v
pylint --rcfile=.pylintrc artifacts setup.py tests tools
yamllint -c .yamllint.yaml data test_data

0 comments on commit ed1b303

Please sign in to comment.