Fail with a meaningful error msg on old-style classes
This commit is contained in:
parent
01cdff398f
commit
a44357ad83
|
@ -160,6 +160,8 @@ def attributes(maybe_cl=None, these=None,
|
||||||
:type no_init: bool
|
:type no_init: bool
|
||||||
"""
|
"""
|
||||||
def wrap(cl):
|
def wrap(cl):
|
||||||
|
if getattr(cl, "__class__", None) is None:
|
||||||
|
raise TypeError("attrs only works with new-style classes.")
|
||||||
_transform_attrs(cl, these)
|
_transform_attrs(cl, these)
|
||||||
if not no_repr:
|
if not no_repr:
|
||||||
cl = _add_repr(cl)
|
cl = _add_repr(cl)
|
||||||
|
@ -172,12 +174,11 @@ def attributes(maybe_cl=None, these=None,
|
||||||
return cl
|
return cl
|
||||||
|
|
||||||
# attrs_or class type depends on the usage of the decorator. It's a class
|
# attrs_or class type depends on the usage of the decorator. It's a class
|
||||||
# if it's used as `@attributes` but ``None`` (or a value passed) if used
|
# if it's used as `@attributes` but ``None`` if used # as `@attributes()`.
|
||||||
# as `@attributes()`.
|
if maybe_cl is None:
|
||||||
if isinstance(maybe_cl, type):
|
|
||||||
return wrap(maybe_cl)
|
|
||||||
else:
|
|
||||||
return wrap
|
return wrap
|
||||||
|
else:
|
||||||
|
return wrap(maybe_cl)
|
||||||
|
|
||||||
|
|
||||||
def _attrs_to_tuple(obj, attrs):
|
def _attrs_to_tuple(obj, attrs):
|
||||||
|
|
|
@ -9,6 +9,7 @@ from __future__ import absolute_import, division, print_function
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from . import simple_attr
|
from . import simple_attr
|
||||||
|
from attr._compat import PY3
|
||||||
from attr._make import (
|
from attr._make import (
|
||||||
Attribute,
|
Attribute,
|
||||||
NOTHING,
|
NOTHING,
|
||||||
|
@ -117,6 +118,17 @@ class TestAttributes(object):
|
||||||
"""
|
"""
|
||||||
Tests for the `attributes` class decorator.
|
Tests for the `attributes` class decorator.
|
||||||
"""
|
"""
|
||||||
|
@pytest.mark.skipif(PY3, reason="No old-style classes in Py3")
|
||||||
|
def test_catches_old_style(self):
|
||||||
|
"""
|
||||||
|
Raises TypeError on old-style classes.
|
||||||
|
"""
|
||||||
|
with pytest.raises(TypeError) as e:
|
||||||
|
@attributes
|
||||||
|
class C:
|
||||||
|
pass
|
||||||
|
assert ("attrs only works with new-style classes.",) == e.value.args
|
||||||
|
|
||||||
def test_sets_attrs(self):
|
def test_sets_attrs(self):
|
||||||
"""
|
"""
|
||||||
Sets the `__attrs_attrs__` class attribute with a list of `Attribute`s.
|
Sets the `__attrs_attrs__` class attribute with a list of `Attribute`s.
|
||||||
|
|
Loading…
Reference in New Issue