From 3731ce275df3061d84a6014ec732747e5ae5819e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20=C4=8Cerm=C3=A1k?= Date: Tue, 13 Aug 2019 11:57:09 +0200 Subject: [PATCH 5/5] Drop dependency on attrs - replace tags.Tag with a custom implementation instead of using @attr.s - add a sanity check for __hash__() - drop attrs from setup.py This fixes #178 --- packaging/tags.py | 37 ++++++++++++++++++++++++++++++------- setup.py | 2 +- tests/test_tags.py | 6 ++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packaging/tags.py b/packaging/tags.py index c472b58..c9b5119 100644 --- a/packaging/tags.py +++ b/packaging/tags.py @@ -11,8 +11,6 @@ import sys import sysconfig import warnings -import attr - INTERPRETER_SHORT_NAMES = { "python": "py", # Generic. @@ -26,14 +24,39 @@ INTERPRETER_SHORT_NAMES = { _32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32 -@attr.s(frozen=True, repr=False) class Tag(object): - interpreter = attr.ib(converter=str.lower) - abi = attr.ib(converter=str.lower) - platform = attr.ib(converter=str.lower) + + __slots__ = ["_interpreter", "_abi", "_platform"] + + def __init__(self, interpreter, abi, platform): + self._interpreter = str.lower(interpreter) + self._abi = str.lower(abi) + self._platform = str.lower(platform) + + @property + def interpreter(self): + return self._interpreter + + @property + def abi(self): + return self._abi + + @property + def platform(self): + return self._platform + + def __eq__(self, other): + return ( + (self.platform == other.platform) + and (self.abi == other.abi) + and (self.interpreter == other.interpreter) + ) + + def __hash__(self): + return hash((self._interpreter, self._abi, self._platform)) def __str__(self): - return "{}-{}-{}".format(self.interpreter, self.abi, self.platform) + return "{}-{}-{}".format(self._interpreter, self._abi, self._platform) def __repr__(self): return "<{self} @ {self_id}>".format(self=self, self_id=id(self)) diff --git a/setup.py b/setup.py index 874512b..23007c7 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,7 @@ setup( author=about["__author__"], author_email=about["__email__"], python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", - install_requires=["attrs", "pyparsing>=2.0.2", "six"], # Needed to avoid issue #91 + install_requires=["pyparsing>=2.0.2", "six"], # Needed to avoid issue #91 classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", diff --git a/tests/test_tags.py b/tests/test_tags.py index 0bb4fd6..a6d50f3 100644 --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -43,6 +43,12 @@ def test_tag_hashing(example_tag): assert example_tag in tags +def test_tag_hash_equality(example_tag): + equal_tag = tags.Tag("py3", "none", "any") + assert example_tag == equal_tag + assert example_tag.__hash__() == equal_tag.__hash__() + + def test_tag_str(example_tag): assert str(example_tag) == "py3-none-any" -- 2.22.0