diff --git a/check50/__main__.py b/check50/__main__.py index b95ed94..b7d5869 100644 --- a/check50/__main__.py +++ b/check50/__main__.py @@ -1,5 +1,6 @@ import argparse import contextlib +import dataclasses import enum import gettext import importlib @@ -15,7 +16,6 @@ import tempfile import time -import attr import lib50 import packaging import requests @@ -449,7 +449,7 @@ def main(): check_results = check_runner.run(args.target) results = { "slug": internal.slug, - "results": [attr.asdict(result) for result in check_results], + "results": [dataclasses.asdict(result) for result in check_results], "version": __version__ } diff --git a/check50/runner.py b/check50/runner.py index ab321c6..811f2c0 100644 --- a/check50/runner.py +++ b/check50/runner.py @@ -1,6 +1,7 @@ import collections from contextlib import contextmanager import concurrent.futures as futures +import dataclasses import functools import inspect import importlib @@ -14,7 +15,6 @@ import tempfile import traceback -import attr import lib50 from . import internal, _exceptions, __version__ @@ -23,16 +23,16 @@ _check_names = [] -@attr.s(slots=True) +@dataclasses.dataclass(slots=True) class CheckResult: """Record returned by each check""" - name = attr.ib() - description = attr.ib() - passed = attr.ib(default=None) - log = attr.ib(default=attr.Factory(list)) - cause = attr.ib(default=None) - data = attr.ib(default=attr.Factory(dict)) - dependency = attr.ib(default=None) + name: str + description: str + passed: bool | None = None + log: list[str] = dataclasses.field(default_factory=list) + cause: dict | None = None + data: dict = dataclasses.field(default_factory=dict) + dependency: str | None = None @classmethod def from_check(cls, check, *args, **kwargs): @@ -48,8 +48,7 @@ def from_check(cls, check, *args, **kwargs): def from_dict(cls, d): """Create a CheckResult given a dict. Dict must contain at least the fields in the CheckResult. Throws a KeyError if not.""" - return cls(**{field.name: d[field.name] for field in attr.fields(cls)}) - + return cls(**{field.name: d[field.name] for field in dataclasses.fields(cls)}) class Timeout(Failure): diff --git a/setup.py b/setup.py index 7c3d64c..704f585 100644 --- a/setup.py +++ b/setup.py @@ -18,14 +18,14 @@ message_extractors = { 'check50': [('**.py', 'python', None),], }, - install_requires=["attrs>=18", "beautifulsoup4>=0", "lib50>=3,<4", "packaging", "pexpect>=4.6", "pyyaml>6,<7", "requests>=2.19", "setuptools", "termcolor>=1.1", "jinja2>=2.10"], + install_requires=["beautifulsoup4>=0", "lib50>=3,<4", "packaging", "pexpect>=4.6", "pyyaml>6,<7", "requests>=2.19", "setuptools", "termcolor>=1.1", "jinja2>=2.10"], extras_require = { "develop": ["sphinx", "sphinx-autobuild", "sphinx_rtd_theme"] }, keywords=["check", "check50"], name="check50", packages=["check50", "check50.renderer", "check50.assertions"], - python_requires=">= 3.8", + python_requires=">= 3.10", entry_points={ "console_scripts": ["check50=check50.__main__:main"] },