summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--astroid/helpers.py14
-rw-r--r--astroid/interpreter/objectmodel.py75
-rw-r--r--astroid/node_classes.py136
-rw-r--r--astroid/protocols.py6
-rw-r--r--astroid/scoped_nodes.py109
-rw-r--r--astroid/tests/unittest_brain.py85
-rw-r--r--astroid/tests/unittest_builder.py90
-rw-r--r--astroid/tests/unittest_helpers.py12
-rw-r--r--astroid/tests/unittest_inference.py7
-rw-r--r--astroid/tests/unittest_object_model.py63
10 files changed, 147 insertions, 450 deletions
diff --git a/astroid/helpers.py b/astroid/helpers.py
index 26aa07f9..ac5cbd27 100644
--- a/astroid/helpers.py
+++ b/astroid/helpers.py
@@ -9,7 +9,7 @@
Various helper utilities.
"""
-import six
+import builtins
from astroid import bases
from astroid import context as contextmod
@@ -21,7 +21,7 @@ from astroid import scoped_nodes
from astroid import util
-BUILTINS = six.moves.builtins.__name__
+BUILTINS = builtins.__name__
def _build_proxy_class(cls_name, builtins):
@@ -37,15 +37,9 @@ def _function_type(function, builtins):
else:
cls_name = 'function'
elif isinstance(function, bases.BoundMethod):
- if six.PY2:
- cls_name = 'instancemethod'
- else:
- cls_name = 'method'
+ cls_name = 'method'
elif isinstance(function, bases.UnboundMethod):
- if six.PY2:
- cls_name = 'instancemethod'
- else:
- cls_name = 'function'
+ cls_name = 'function'
return _build_proxy_class(cls_name, builtins)
diff --git a/astroid/interpreter/objectmodel.py b/astroid/interpreter/objectmodel.py
index 6a05ed87..096a8939 100644
--- a/astroid/interpreter/objectmodel.py
+++ b/astroid/interpreter/objectmodel.py
@@ -20,17 +20,12 @@ attribute. Thus the model can be viewed as a special part of the lookup
mechanism.
"""
-try:
- from functools import lru_cache
-except ImportError:
- from backports.functools_lru_cache import lru_cache
-
+import builtins
import itertools
import pprint
import os
import types
-
-import six
+from functools import lru_cache
import astroid
from astroid import context as contextmod
@@ -114,18 +109,12 @@ class ObjectModel(object):
class ModuleModel(ObjectModel):
def _builtins(self):
- builtins = astroid.MANAGER.astroid_cache[six.moves.builtins.__name__]
- return builtins.special_attributes.lookup('__dict__')
-
- if six.PY3:
- @property
- def pybuiltins(self):
- return self._builtins()
+ builtins_ast_module = astroid.MANAGER.astroid_cache[builtins.__name__]
+ return builtins_ast_module.special_attributes.lookup('__dict__')
- else:
- @property
- def py__builtin__(self):
- return self._builtins()
+ @property
+ def pybuiltins(self):
+ return self._builtins()
# __path__ is a standard attribute on *packages* not
# non-package modules. The only mention of it in the
@@ -234,8 +223,8 @@ class FunctionModel(ObjectModel):
args = self._instance.args
pair_annotations = itertools.chain(
- six.moves.zip(args.args or [], args.annotations),
- six.moves.zip(args.kwonlyargs, args.kwonlyargs_annotations)
+ zip(args.args or [], args.annotations),
+ zip(args.kwonlyargs, args.kwonlyargs_annotations)
)
annotations = {
@@ -345,15 +334,6 @@ class FunctionModel(ObjectModel):
py__closure__ = py__ne__
py__code__ = py__ne__
- if six.PY2:
- pyfunc_name = py__name__
- pyfunc_doc = py__doc__
- pyfunc_globals = py__globals__
- pyfunc_dict = py__dict__
- pyfunc_defaults = py__defaults__
- pyfunc_code = py__code__
- pyfunc_closure = py__closure__
-
class ClassModel(ObjectModel):
@@ -508,7 +488,7 @@ class GeneratorModel(FunctionModel):
def __new__(cls, *args, **kwargs):
# Append the values from the GeneratorType unto this object.
ret = super(GeneratorModel, cls).__new__(cls, *args, **kwargs)
- generator = astroid.MANAGER.astroid_cache[six.moves.builtins.__name__]['generator']
+ generator = astroid.MANAGER.astroid_cache[builtins.__name__]['generator']
for name, values in generator.locals.items():
method = values[0]
patched = lambda cls, meth=method: meth
@@ -556,21 +536,11 @@ class ExceptionInstanceModel(InstanceModel):
args.postinit((message, ))
return args
- if six.PY3:
- # It's available only on Python 3.
-
- @property
- def py__traceback__(self):
- builtins = astroid.MANAGER.astroid_cache[six.moves.builtins.__name__]
- traceback_type = builtins[types.TracebackType.__name__]
- return traceback_type.instantiate_class()
-
- if six.PY2:
- # It's available only on Python 2.
-
- @property
- def pymessage(self):
- return node_classes.Const('')
+ @property
+ def py__traceback__(self):
+ builtins_ast_module = astroid.MANAGER.astroid_cache[builtins.__name__]
+ traceback_type = builtins_ast_module[types.TracebackType.__name__]
+ return traceback_type.instantiate_class()
class DictModel(ObjectModel):
@@ -599,9 +569,8 @@ class DictModel(ObjectModel):
elems.append(elem)
obj.postinit(elts=elems)
- if six.PY3:
- from astroid import objects
- obj = objects.DictItems(obj)
+ from astroid import objects
+ obj = objects.DictItems(obj)
return self._generic_dict_attribute(obj, 'items')
@@ -611,9 +580,8 @@ class DictModel(ObjectModel):
obj = node_classes.List(parent=self._instance)
obj.postinit(elts=keys)
- if six.PY3:
- from astroid import objects
- obj = objects.DictKeys(obj)
+ from astroid import objects
+ obj = objects.DictKeys(obj)
return self._generic_dict_attribute(obj, 'keys')
@@ -624,8 +592,7 @@ class DictModel(ObjectModel):
obj = node_classes.List(parent=self._instance)
obj.postinit(values)
- if six.PY3:
- from astroid import objects
- obj = objects.DictValues(obj)
+ from astroid import objects
+ obj = objects.DictValues(obj)
return self._generic_dict_attribute(obj, 'values')
diff --git a/astroid/node_classes.py b/astroid/node_classes.py
index dcff3692..59b2349c 100644
--- a/astroid/node_classes.py
+++ b/astroid/node_classes.py
@@ -12,14 +12,11 @@
"""
import abc
+import builtins
+import itertools
import pprint
import warnings
-try:
- from functools import singledispatch as _singledispatch
-except ImportError:
- from singledispatch import singledispatch as _singledispatch
-
-import six
+from functools import singledispatch as _singledispatch
from astroid import as_string
from astroid import bases
@@ -31,7 +28,7 @@ from astroid import mixins
from astroid import util
-BUILTINS = six.moves.builtins.__name__
+BUILTINS = builtins.__name__
MANAGER = manager.AstroidManager()
@@ -891,9 +888,10 @@ class Statement(NodeNG):
return stmts[index -1]
return None
-@six.add_metaclass(abc.ABCMeta)
+
class _BaseContainer(mixins.ParentAssignTypeMixin,
- NodeNG, bases.Instance):
+ NodeNG, bases.Instance,
+ metaclass=abc.ABCMeta):
"""Base class for Set, FrozenSet, Tuple and List."""
_astroid_fields = ('elts',)
@@ -1262,33 +1260,31 @@ class Arguments(mixins.AssignTypeMixin, NodeNG):
>>> node.args
<Arguments l.1 at 0x7effe1db82e8>
"""
- if six.PY3:
- # Python 3.4+ uses a different approach regarding annotations,
- # each argument is a new class, _ast.arg, which exposes an
- # 'annotation' attribute. In astroid though, arguments are exposed
- # as is in the Arguments node and the only way to expose annotations
- # is by using something similar with Python 3.3:
- # - we expose 'varargannotation' and 'kwargannotation' of annotations
- # of varargs and kwargs.
- # - we expose 'annotation', a list with annotations for
- # for each normal argument. If an argument doesn't have an
- # annotation, its value will be None.
-
- _astroid_fields = ('args', 'defaults', 'kwonlyargs',
- 'kw_defaults', 'annotations', 'varargannotation',
- 'kwargannotation', 'kwonlyargs_annotations')
- varargannotation = None
- """The type annotation for the variable length arguments.
+ # Python 3.4+ uses a different approach regarding annotations,
+ # each argument is a new class, _ast.arg, which exposes an
+ # 'annotation' attribute. In astroid though, arguments are exposed
+ # as is in the Arguments node and the only way to expose annotations
+ # is by using something similar with Python 3.3:
+ # - we expose 'varargannotation' and 'kwargannotation' of annotations
+ # of varargs and kwargs.
+ # - we expose 'annotation', a list with annotations for
+ # for each normal argument. If an argument doesn't have an
+ # annotation, its value will be None.
+
+ _astroid_fields = ('args', 'defaults', 'kwonlyargs',
+ 'kw_defaults', 'annotations', 'varargannotation',
+ 'kwargannotation', 'kwonlyargs_annotations')
+ varargannotation = None
+ """The type annotation for the variable length arguments.
- :type: NodeNG
- """
- kwargannotation = None
- """The type annotation for the variable length keyword arguments.
+ :type: NodeNG
+ """
+ kwargannotation = None
+ """The type annotation for the variable length keyword arguments.
+
+ :type: NodeNG
+ """
- :type: NodeNG
- """
- else:
- _astroid_fields = ('args', 'defaults', 'kwonlyargs', 'kw_defaults')
_other_fields = ('vararg', 'kwarg')
def __init__(self, vararg=None, kwarg=None, parent=None):
@@ -1525,7 +1521,7 @@ def _format_args(args, defaults=None, annotations=None):
annotations = []
if defaults is not None:
default_offset = len(args) - len(defaults)
- packed = six.moves.zip_longest(args, annotations)
+ packed = itertools.zip_longest(args, annotations)
for i, (arg, annotation) in enumerate(packed):
if isinstance(arg, Tuple):
values.append('(%s)' % _format_args(arg.elts))
@@ -2246,12 +2242,7 @@ class Const(NodeNG, bases.Instance):
)
try:
- if isinstance(self.value, six.string_types):
- return Const(self.value[index_value])
- if isinstance(self.value, bytes) and six.PY3:
- # Bytes aren't instances of six.string_types
- # on Python 3. Also, indexing them should return
- # integers.
+ if isinstance(self.value, (str, bytes)):
return Const(self.value[index_value])
except IndexError as exc:
util.reraise(exceptions.AstroidIndexError(
@@ -2284,7 +2275,7 @@ class Const(NodeNG, bases.Instance):
:raises TypeError: If this node does not represent something that is iterable.
"""
- if isinstance(self.value, six.string_types):
+ if isinstance(self.value, str):
return self.value
raise TypeError()
@@ -3404,53 +3395,24 @@ class Raise(Statement):
:type: NodeNG or None
"""
- if six.PY2:
- _astroid_fields = ('exc', 'inst', 'tback')
- inst = None
- """The "value" of the exception being raised.
-
- :type: NodeNG or None
- """
- tback = None
- """The traceback object to raise with.
-
- :type: NodeNG or None
- """
+ _astroid_fields = ('exc', 'cause')
+ cause = None
+ """The exception being used to raise this one.
- def postinit(self, exc=None, inst=None, tback=None):
- """Do some setup after initialisation.
+ :type: NodeNG or None
+ """
- :param exc: What is being raised.
- :type exc: NodeNG or None
+ def postinit(self, exc=None, cause=None):
+ """Do some setup after initialisation.
- :param inst: The "value" of the exception being raised.
- :type inst: NodeNG or None
+ :param exc: What is being raised.
+ :type exc: NodeNG or None
- :param tback: The traceback object to raise with.
- :type tback: NodeNG or None
- """
- self.exc = exc
- self.inst = inst
- self.tback = tback
- else:
- _astroid_fields = ('exc', 'cause')
- cause = None
- """The exception being used to raise this one.
-
- :type: NodeNG or None
+ :param cause: The exception being used to raise this one.
+ :type cause: NodeNG or None
"""
-
- def postinit(self, exc=None, cause=None):
- """Do some setup after initialisation.
-
- :param exc: What is being raised.
- :type exc: NodeNG or None
-
- :param cause: The exception being used to raise this one.
- :type cause: NodeNG or None
- """
- self.exc = exc
- self.cause = cause
+ self.exc = exc
+ self.cause = cause
def raises_not_implemented(self):
"""Check if this node raises a :class:`NotImplementedError`.
@@ -4197,11 +4159,7 @@ CONST_CLS = {
def _update_const_classes():
"""update constant classes, so the keys of CONST_CLS can be reused"""
- klasses = (bool, int, float, complex, str)
- if six.PY2:
- # pylint: disable=undefined-variable
- klasses += (unicode, long)
- klasses += (bytes,)
+ klasses = (bool, int, float, complex, str, bytes)
for kls in klasses:
CONST_CLS[kls] = Const
_update_const_classes()
diff --git a/astroid/protocols.py b/astroid/protocols.py
index 00b0736c..30303dec 100644
--- a/astroid/protocols.py
+++ b/astroid/protocols.py
@@ -14,8 +14,6 @@ import collections
import operator as operator_mod
import sys
-import six
-
from astroid import arguments
from astroid import bases
from astroid import context as contextmod
@@ -39,7 +37,7 @@ def _augmented_name(name):
_CONTEXTLIB_MGR = 'contextlib.contextmanager'
BIN_OP_METHOD = {'+': '__add__',
'-': '__sub__',
- '/': '__div__' if six.PY2 else '__truediv__',
+ '/': '__truediv__',
'//': '__floordiv__',
'*': '__mul__',
'**': '__pow__',
@@ -123,7 +121,7 @@ def const_infer_binary_op(self, opnode, operator, other, context, _):
yield util.Uninferable
except TypeError:
yield not_implemented
- elif isinstance(self.value, six.string_types) and operator == '%':
+ elif isinstance(self.value, str) and operator == '%':
# TODO(cpopa): implement string interpolation later on.
yield util.Uninferable
else:
diff --git a/astroid/scoped_nodes.py b/astroid/scoped_nodes.py
index dba9a8e7..40970671 100644
--- a/astroid/scoped_nodes.py
+++ b/astroid/scoped_nodes.py
@@ -14,13 +14,12 @@ new local scope in the language definition : Module, ClassDef, FunctionDef (and
Lambda, GeneratorExp, DictComp and SetComp to some extent).
"""
+import builtins
import sys
import io
import itertools
import warnings
-import six
-
from astroid import bases
from astroid import context as contextmod
from astroid import exceptions
@@ -33,7 +32,7 @@ from astroid import node_classes
from astroid import util
-BUILTINS = six.moves.builtins.__name__
+BUILTINS = builtins.__name__
ITER_METHODS = ('__iter__', '__getitem__')
@@ -96,7 +95,7 @@ def builtin_lookup(name):
return the list of matching statements and the astroid for the builtin
module
"""
- builtin_astroid = MANAGER.ast_from_module(six.moves.builtins)
+ builtin_astroid = MANAGER.ast_from_module(builtins)
if name == '__dict__':
return builtin_astroid, ()
try:
@@ -552,15 +551,7 @@ class Module(LocalsDictNodeNG):
"""
return
- if six.PY2:
- @decorators_mod.cachedproperty
- def _absolute_import_activated(self):
- for stmt in self.locals.get('absolute_import', ()):
- if isinstance(stmt, node_classes.ImportFrom) and stmt.modname == '__future__':
- return True
- return False
- else:
- _absolute_import_activated = True
+ _absolute_import_activated = True
def absolute_import_activated(self):
"""Whether :pep:`328` absolute import behaviour has been enabled.
@@ -675,7 +666,7 @@ class Module(LocalsDictNodeNG):
return default
str_const = lambda node: (isinstance(node, node_classes.Const) and
- isinstance(node.value, six.string_types))
+ isinstance(node.value, str))
for node in explicit.elts:
if str_const(node):
inferred.append(node.value)
@@ -967,33 +958,24 @@ class _ListComp(node_classes.NodeNG):
return util.Uninferable
-if six.PY3:
- class ListComp(_ListComp, ComprehensionScope):
- """Class representing an :class:`ast.ListComp` node.
-
- >>> node = astroid.extract_node('[thing for thing in things if thing]')
- >>> node
- <ListComp l.1 at 0x7f23b2e418d0>
- """
- _other_other_fields = ('locals',)
-
- def __init__(self, lineno=None, col_offset=None, parent=None):
- self.locals = {}
- """A map of the name of a local variable to the node defining it.
+class ListComp(_ListComp, ComprehensionScope):
+ """Class representing an :class:`ast.ListComp` node.
- :type: dict(str, NodeNG)
- """
+ >>> node = astroid.extract_node('[thing for thing in things if thing]')
+ >>> node
+ <ListComp l.1 at 0x7f23b2e418d0>
+ """
+ _other_other_fields = ('locals',)
- super(ListComp, self).__init__(lineno, col_offset, parent)
-else:
- class ListComp(_ListComp):
- """Class representing an :class:`ast.ListComp` node.
+ def __init__(self, lineno=None, col_offset=None, parent=None):
+ self.locals = {}
+ """A map of the name of a local variable to the node defining it.
- >>> node = astroid.extract_node('[thing for thing in things if thing]')
- >>> node
- <ListComp l.1 at 0x7f23b2e418d0>
+ :type: dict(str, NodeNG)
"""
+ super(ListComp, self).__init__(lineno, col_offset, parent)
+
def _infer_decorator_callchain(node):
"""Detect decorator call chaining and see if the end result is a
@@ -1203,11 +1185,8 @@ class FunctionDef(node_classes.Statement, Lambda):
>>> node
<FunctionDef.my_func l.2 at 0x7f23b2e71e10>
"""
- if six.PY3:
- _astroid_fields = ('decorators', 'args', 'returns', 'body')
- returns = None
- else:
- _astroid_fields = ('decorators', 'args', 'body')
+ _astroid_fields = ('decorators', 'args', 'returns', 'body')
+ returns = None
decorators = None
"""The decorators that are applied to this method or function.
@@ -1286,7 +1265,7 @@ class FunctionDef(node_classes.Statement, Lambda):
self.decorators = decorators
self.returns = returns
- if six.PY3 and isinstance(self.parent.frame(), ClassDef):
+ if isinstance(self.parent.frame(), ClassDef):
self.set_local('__class__', self.parent.frame())
@decorators_mod.cachedproperty
@@ -1936,7 +1915,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
def _infer_type_call(self, caller, context):
name_node = next(caller.args[0].infer(context))
if (isinstance(name_node, node_classes.Const) and
- isinstance(name_node.value, six.string_types)):
+ isinstance(name_node.value, str)):
name = name_node.value
else:
return util.Uninferable
@@ -1962,7 +1941,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
if members and isinstance(members, node_classes.Dict):
for attr, value in members.items:
if (isinstance(attr, node_classes.Const) and
- isinstance(attr.value, six.string_types)):
+ isinstance(attr.value, str)):
result.locals[attr.value] = [value]
result.parent = caller.parent
@@ -2001,7 +1980,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
# inside this class.
lookup_upper_frame = (
isinstance(node.parent, node_classes.Decorators) and
- name in MANAGER.astroid_cache[six.moves.builtins.__name__]
+ name in MANAGER.astroid_cache[builtins.__name__]
)
if any(node == base or base.parent_of(node)
for base in self.bases) or lookup_upper_frame:
@@ -2050,10 +2029,9 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
yielded = set([self])
if context is None:
context = contextmod.InferenceContext()
- if six.PY3:
- if not self.bases and self.qname() != 'builtins.object':
- yield builtin_lookup("object")[1][0]
- return
+ if not self.bases and self.qname() != 'builtins.object':
+ yield builtin_lookup("object")[1][0]
+ return
for stmt in self.bases:
with context.restore_path():
@@ -2456,29 +2434,8 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
if node is not util.Uninferable)
except (exceptions.InferenceError, StopIteration):
return None
- if six.PY3:
- return None
-
- if '__metaclass__' in self.locals:
- assignment = self.locals['__metaclass__'][-1]
- elif self.bases:
- return None
- elif '__metaclass__' in self.root().locals:
- assignments = [ass for ass in self.root().locals['__metaclass__']
- if ass.lineno < self.lineno]
- if not assignments:
- return None
- assignment = assignments[-1]
- else:
- return None
- try:
- inferred = next(assignment.infer())
- except exceptions.InferenceError:
- return None
- if inferred is util.Uninferable: # don't expose this
- return None
- return inferred
+ return None
def _find_metaclass(self, seen=None):
if seen is None:
@@ -2551,8 +2508,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
if inferred is util.Uninferable:
continue
if (not isinstance(inferred, node_classes.Const) or
- not isinstance(inferred.value,
- six.string_types)):
+ not isinstance(inferred.value, str)):
continue
if not inferred.value:
continue
@@ -2626,10 +2582,9 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
if context is None:
context = contextmod.InferenceContext()
- if six.PY3:
- if not self.bases and self.qname() != 'builtins.object':
- yield builtin_lookup("object")[1][0]
- return
+ if not self.bases and self.qname() != 'builtins.object':
+ yield builtin_lookup("object")[1][0]
+ return
for stmt in self.bases:
try:
diff --git a/astroid/tests/unittest_brain.py b/astroid/tests/unittest_brain.py
index 3f83f6ba..c01ca3ec 100644
--- a/astroid/tests/unittest_brain.py
+++ b/astroid/tests/unittest_brain.py
@@ -9,6 +9,8 @@
# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
"""Tests for basic functionality in astroid.brain."""
+import queue
+
try:
import multiprocessing # pylint: disable=unused-import
HAS_MULTIPROCESSING = True
@@ -51,8 +53,6 @@ try:
except ImportError:
HAS_ATTR = False
-import six
-
from astroid import MANAGER
from astroid import bases
from astroid import builder
@@ -325,65 +325,35 @@ class SixBrainTest(unittest.TestCase):
''')
http_client = next(ast_nodes[0].infer())
self.assertIsInstance(http_client, nodes.Module)
- self.assertEqual(http_client.name,
- 'http.client' if six.PY3 else 'httplib')
+ self.assertEqual(http_client.name, 'http.client')
urllib_parse = next(ast_nodes[1].infer())
- if six.PY3:
- self.assertIsInstance(urllib_parse, nodes.Module)
- self.assertEqual(urllib_parse.name, 'urllib.parse')
- else:
- # On Python 2, this is a fake module, the same behaviour
- # being mimicked in brain's tip for six.moves.
- self.assertIsInstance(urllib_parse, astroid.Instance)
+ self.assertIsInstance(urllib_parse, nodes.Module)
+ self.assertEqual(urllib_parse.name, 'urllib.parse')
urljoin = next(urllib_parse.igetattr('urljoin'))
urlencode = next(urllib_parse.igetattr('urlencode'))
- if six.PY2:
- # In reality it's a function, but our implementations
- # transforms it into a method.
- self.assertIsInstance(urljoin, astroid.BoundMethod)
- self.assertEqual(urljoin.qname(), 'urlparse.urljoin')
- self.assertIsInstance(urlencode, astroid.BoundMethod)
- self.assertEqual(urlencode.qname(), 'urllib.urlencode')
- else:
- self.assertIsInstance(urljoin, nodes.FunctionDef)
- self.assertEqual(urljoin.qname(), 'urllib.parse.urljoin')
- self.assertIsInstance(urlencode, nodes.FunctionDef)
- self.assertEqual(urlencode.qname(), 'urllib.parse.urlencode')
+ self.assertIsInstance(urljoin, nodes.FunctionDef)
+ self.assertEqual(urljoin.qname(), 'urllib.parse.urljoin')
+ self.assertIsInstance(urlencode, nodes.FunctionDef)
+ self.assertEqual(urlencode.qname(), 'urllib.parse.urlencode')
urllib_error = next(ast_nodes[2].infer())
- if six.PY3:
- self.assertIsInstance(urllib_error, nodes.Module)
- self.assertEqual(urllib_error.name, 'urllib.error')
- else:
- # On Python 2, this is a fake module, the same behaviour
- # being mimicked in brain's tip for six.moves.
- self.assertIsInstance(urllib_error, astroid.Instance)
+ self.assertIsInstance(urllib_error, nodes.Module)
+ self.assertEqual(urllib_error.name, 'urllib.error')
urlerror = next(urllib_error.igetattr('URLError'))
self.assertIsInstance(urlerror, nodes.ClassDef)
content_too_short = next(urllib_error.igetattr('ContentTooShortError'))
self.assertIsInstance(content_too_short, nodes.ClassDef)
urllib_request = next(ast_nodes[3].infer())
- if six.PY3:
- self.assertIsInstance(urllib_request, nodes.Module)
- self.assertEqual(urllib_request.name, 'urllib.request')
- else:
- self.assertIsInstance(urllib_request, astroid.Instance)
+ self.assertIsInstance(urllib_request, nodes.Module)
+ self.assertEqual(urllib_request.name, 'urllib.request')
urlopen = next(urllib_request.igetattr('urlopen'))
urlretrieve = next(urllib_request.igetattr('urlretrieve'))
- if six.PY2:
- # In reality it's a function, but our implementations
- # transforms it into a method.
- self.assertIsInstance(urlopen, astroid.BoundMethod)
- self.assertEqual(urlopen.qname(), 'urllib2.urlopen')
- self.assertIsInstance(urlretrieve, astroid.BoundMethod)
- self.assertEqual(urlretrieve.qname(), 'urllib.urlretrieve')
- else:
- self.assertIsInstance(urlopen, nodes.FunctionDef)
- self.assertEqual(urlopen.qname(), 'urllib.request.urlopen')
- self.assertIsInstance(urlretrieve, nodes.FunctionDef)
- self.assertEqual(urlretrieve.qname(), 'urllib.request.urlretrieve')
+ self.assertIsInstance(urlopen, nodes.FunctionDef)
+ self.assertEqual(urlopen.qname(), 'urllib.request.urlopen')
+ self.assertIsInstance(urlretrieve, nodes.FunctionDef)
+ self.assertEqual(urlretrieve.qname(), 'urllib.request.urlretrieve')
def test_from_imports(self):
ast_node = builder.extract_node('''
@@ -392,14 +362,9 @@ class SixBrainTest(unittest.TestCase):
''')
inferred = next(ast_node.infer())
self.assertIsInstance(inferred, nodes.ClassDef)
- if six.PY3:
- qname = 'http.client.HTTPSConnection'
- else:
- qname = 'httplib.HTTPSConnection'
+ qname = 'http.client.HTTPSConnection'
self.assertEqual(inferred.qname(), qname)
- @unittest.skipIf(six.PY2,
- "The python 2 six brain uses dummy classes")
def test_from_submodule_imports(self):
"""Make sure ulrlib submodules can be imported from
@@ -462,16 +427,15 @@ class MultiprocessingBrainTest(unittest.TestCase):
array = manager.Array()
namespace = manager.Namespace()
""")
- queue = next(module['queue'].infer())
- self.assertEqual(queue.qname(),
- "{}.Queue".format(six.moves.queue.__name__))
+ ast_queue = next(module['queue'].infer())
+ self.assertEqual(ast_queue.qname(), "{}.Queue".format(queue.__name__))
joinable_queue = next(module['joinable_queue'].infer())
self.assertEqual(joinable_queue.qname(),
- "{}.Queue".format(six.moves.queue.__name__))
+ "{}.Queue".format(queue.__name__))
event = next(module['event'].infer())
- event_name = "threading.{}".format("Event" if six.PY3 else "_Event")
+ event_name = "threading.Event"
self.assertEqual(event.qname(), event_name)
rlock = next(module['rlock'].infer())
@@ -479,8 +443,7 @@ class MultiprocessingBrainTest(unittest.TestCase):
self.assertEqual(rlock.qname(), rlock_name)
bounded_semaphore = next(module['bounded_semaphore'].infer())
- semaphore_name = "threading.{}".format(
- "BoundedSemaphore" if six.PY3 else "_BoundedSemaphore")
+ semaphore_name = "threading.BoundedSemaphore"
self.assertEqual(bounded_semaphore.qname(), semaphore_name)
pool = next(module['pool'].infer())
@@ -701,7 +664,7 @@ def streams_are_fine():
class IOBrainTest(unittest.TestCase):
@unittest.skipUnless(
- six.PY3 and streams_are_fine(),
+ streams_are_fine(),
"Needs Python 3 io model / doesn't work with plain pytest."
"use pytest -s for this test to work")
def test_sys_streams(self):
diff --git a/astroid/tests/unittest_builder.py b/astroid/tests/unittest_builder.py
index 01ba856b..f193aa9a 100644
--- a/astroid/tests/unittest_builder.py
+++ b/astroid/tests/unittest_builder.py
@@ -8,12 +8,11 @@
"""tests for the astroid builder and rebuilder module"""
+import builtins
import os
import sys
import unittest
-import six
-
from astroid import builder
from astroid import exceptions
from astroid import manager
@@ -23,7 +22,7 @@ from astroid import util
from astroid.tests import resources
MANAGER = manager.AstroidManager()
-BUILTINS = six.moves.builtins.__name__
+BUILTINS = builtins.__name__
class FromToLineNoTest(unittest.TestCase):
@@ -265,17 +264,6 @@ class BuilderTest(unittest.TestCase):
def test_inspect_build0(self):
"""test astroid tree build from a living object"""
builtin_ast = MANAGER.ast_from_module_name(BUILTINS)
- if six.PY2:
- fclass = builtin_ast['file']
- self.assertIn('name', fclass)
- self.assertIn('mode', fclass)
- self.assertIn('read', fclass)
- self.assertTrue(fclass.newstyle)
- self.assertTrue(fclass.pytype(), '%s.type' % BUILTINS)
- self.assertIsInstance(fclass['read'], nodes.FunctionDef)
- # check builtin function has args.args == None
- dclass = builtin_ast['dict']
- self.assertIsNone(dclass['has_key'].args.args)
# just check type and object are there
builtin_ast.getattr('type')
objectastroid = builtin_ast.getattr('object')[0]
@@ -290,12 +278,8 @@ class BuilderTest(unittest.TestCase):
self.assertIsInstance(builtin_ast['None'], nodes.Const)
self.assertIsInstance(builtin_ast['True'], nodes.Const)
self.assertIsInstance(builtin_ast['False'], nodes.Const)
- if six.PY3:
- self.assertIsInstance(builtin_ast['Exception'], nodes.ClassDef)
- self.assertIsInstance(builtin_ast['NotImplementedError'], nodes.ClassDef)
- else:
- self.assertIsInstance(builtin_ast['Exception'], nodes.ImportFrom)
- self.assertIsInstance(builtin_ast['NotImplementedError'], nodes.ImportFrom)
+ self.assertIsInstance(builtin_ast['Exception'], nodes.ClassDef)
+ self.assertIsInstance(builtin_ast['NotImplementedError'], nodes.ClassDef)
def test_inspect_build1(self):
time_ast = MANAGER.ast_from_module_name('time')
@@ -417,14 +401,9 @@ class BuilderTest(unittest.TestCase):
"new style"
'''
mod_ast = builder.parse(data, __name__)
- if six.PY3:
- self.assertTrue(mod_ast['A'].newstyle)
- self.assertTrue(mod_ast['B'].newstyle)
- self.assertTrue(mod_ast['E'].newstyle)
- else:
- self.assertFalse(mod_ast['A'].newstyle)
- self.assertFalse(mod_ast['B'].newstyle)
- self.assertFalse(mod_ast['E'].newstyle)
+ self.assertTrue(mod_ast['A'].newstyle)
+ self.assertTrue(mod_ast['B'].newstyle)
+ self.assertTrue(mod_ast['E'].newstyle)
self.assertTrue(mod_ast['C'].newstyle)
self.assertTrue(mod_ast['D'].newstyle)
self.assertTrue(mod_ast['F'].newstyle)
@@ -637,10 +616,7 @@ class FileBuildTest(unittest.TestCase):
self.assertEqual(klass.parent.frame(), module)
self.assertEqual(klass.root(), module)
self.assertEqual(klass.basenames, [])
- if six.PY3:
- self.assertTrue(klass.newstyle)
- else:
- self.assertFalse(klass.newstyle)
+ self.assertTrue(klass.newstyle)
def test_class_locals(self):
"""test the 'locals' dictionary of a astroid class"""
@@ -726,56 +702,6 @@ class ModuleBuildTest(resources.SysPathSetup, FileBuildTest):
else:
self.module = abuilder.module_build(data.module, 'data.module')
-@unittest.skipIf(six.PY3, "guess_encoding not used on Python 3")
-class TestGuessEncoding(unittest.TestCase):
- def setUp(self):
- self.guess_encoding = builder._guess_encoding
-
- def testEmacs(self):
- e = self.guess_encoding('# -*- coding: UTF-8 -*-')
- self.assertEqual(e, 'UTF-8')
- e = self.guess_encoding('# -*- coding:UTF-8 -*-')
- self.assertEqual(e, 'UTF-8')
- e = self.guess_encoding('''
- ### -*- coding: ISO-8859-1 -*-
- ''')
- self.assertEqual(e, 'ISO-8859-1')
- e = self.guess_encoding('''
-
- ### -*- coding: ISO-8859-1 -*-
- ''')
- self.assertIsNone(e)
-
- def testVim(self):
- e = self.guess_encoding('# vim:fileencoding=UTF-8')
- self.assertEqual(e, 'UTF-8')
- e = self.guess_encoding('''
- ### vim:fileencoding=ISO-8859-1
- ''')
- self.assertEqual(e, 'ISO-8859-1')
- e = self.guess_encoding('''
-
- ### vim:fileencoding= ISO-8859-1
- ''')
- self.assertIsNone(e)
-
- def test_wrong_coding(self):
- # setting "coding" variable
- e = self.guess_encoding("coding = UTF-8")
- self.assertIsNone(e)
- # setting a dictionary entry
- e = self.guess_encoding("coding:UTF-8")
- self.assertIsNone(e)
- # setting an argument
- e = self.guess_encoding("def do_something(a_word_with_coding=None):")
- self.assertIsNone(e)
-
- def testUTF8(self):
- e = self.guess_encoding('\xef\xbb\xbf any UTF-8 data')
- self.assertEqual(e, 'UTF-8')
- e = self.guess_encoding(' any UTF-8 data \xef\xbb\xbf')
- self.assertIsNone(e)
-
if __name__ == '__main__':
unittest.main()
diff --git a/astroid/tests/unittest_helpers.py b/astroid/tests/unittest_helpers.py
index b61b6aed..4c6afc23 100644
--- a/astroid/tests/unittest_helpers.py
+++ b/astroid/tests/unittest_helpers.py
@@ -6,9 +6,7 @@
import unittest
-
-import six
-from six.moves import builtins
+import builtins
from astroid import builder
from astroid import exceptions
@@ -93,10 +91,10 @@ class TestHelpers(unittest.TestCase):
self.assert_classes_equal(instance_type, cls)
expected_method_types = [
- (ast_nodes[3], 'instancemethod' if six.PY2 else 'function'),
- (ast_nodes[4], 'instancemethod' if six.PY2 else 'method'),
- (ast_nodes[5], 'instancemethod' if six.PY2 else 'method'),
- (ast_nodes[6], 'instancemethod' if six.PY2 else 'method'),
+ (ast_nodes[3], 'function'),
+ (ast_nodes[4], 'method'),
+ (ast_nodes[5], 'method'),
+ (ast_nodes[6], 'method'),
(ast_nodes[7], 'function'),
(ast_nodes[8], 'function'),
(ast_nodes[9], 'generator'),
diff --git a/astroid/tests/unittest_inference.py b/astroid/tests/unittest_inference.py
index 4b1b4f16..f50fa7ec 100644
--- a/astroid/tests/unittest_inference.py
+++ b/astroid/tests/unittest_inference.py
@@ -17,8 +17,6 @@ from functools import partial
import unittest
import warnings
-import six
-
from astroid import InferenceError, builder, nodes
from astroid.builder import parse, extract_node
from astroid.inference import infer_end as inference_infer_end
@@ -732,10 +730,7 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase):
node = extract_node('''b'a'[0]''')
inferred = next(node.infer())
self.assertIsInstance(inferred, nodes.Const)
- if six.PY2:
- self.assertEqual(inferred.value, 'a')
- else:
- self.assertEqual(inferred.value, 97)
+ self.assertEqual(inferred.value, 97)
def test_simple_tuple(self):
module = parse("""
diff --git a/astroid/tests/unittest_object_model.py b/astroid/tests/unittest_object_model.py
index 54b00d3d..962458a3 100644
--- a/astroid/tests/unittest_object_model.py
+++ b/astroid/tests/unittest_object_model.py
@@ -2,11 +2,10 @@
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
+import builtins
import unittest
import xml
-import six
-
import astroid
from astroid import builder
from astroid import exceptions
@@ -15,7 +14,7 @@ from astroid import test_utils
from astroid import objects
-BUILTINS = MANAGER.astroid_cache[six.moves.builtins.__name__]
+BUILTINS = MANAGER.astroid_cache[builtins.__name__]
class InstanceModelTest(unittest.TestCase):
@@ -103,10 +102,7 @@ class UnboundMethodModelTest(unittest.TestCase):
cls = next(ast_nodes[0].infer())
self.assertIsInstance(cls, astroid.ClassDef)
- if six.PY2:
- unbound_name = 'instancemethod'
- else:
- unbound_name = 'function'
+ unbound_name = 'function'
self.assertEqual(cls.name, unbound_name)
@@ -169,16 +165,6 @@ class ClassModelTest(unittest.TestCase):
self.assertIsInstance(inferred.bound, astroid.ClassDef)
self.assertEqual(inferred.bound.name, 'type')
- @unittest.skipUnless(six.PY2, "Needs old style classes")
- def test_old_style_classes_no_mro(self):
- ast_node = builder.extract_node('''
- class A:
- pass
- A.mro #@
- ''')
- with self.assertRaises(exceptions.InferenceError):
- next(ast_node.infer())
-
def test_class_model(self):
ast_nodes = builder.extract_node('''
class A(object):
@@ -499,7 +485,6 @@ class GeneratorModelTest(unittest.TestCase):
class ExceptionModelTest(unittest.TestCase):
- @unittest.skipIf(six.PY2, "needs Python 3")
def test_model_py3(self):
ast_nodes = builder.extract_node('''
try:
@@ -519,25 +504,6 @@ class ExceptionModelTest(unittest.TestCase):
with self.assertRaises(exceptions.InferenceError):
next(ast_nodes[2].infer())
- @unittest.skipUnless(six.PY2, "needs Python 2")
- def test_model_py2(self):
- ast_nodes = builder.extract_node('''
- try:
- x[42]
- except ValueError as err:
- err.args #@
- err.message #@
-
- err.__traceback__ #@
- ''')
- args = next(ast_nodes[0].infer())
- self.assertIsInstance(args, astroid.Tuple)
- message = next(ast_nodes[1].infer())
- self.assertIsInstance(message, astroid.Const)
-
- with self.assertRaises(exceptions.InferenceError):
- next(ast_nodes[2].infer())
-
class DictObjectModelTest(unittest.TestCase):
@@ -557,28 +523,6 @@ class DictObjectModelTest(unittest.TestCase):
inferred = next(node.infer())
self.assertIsInstance(inferred, astroid.BoundMethod)
- @unittest.skipUnless(six.PY2, "needs Python 2")
- def test_concrete_objects_for_dict_methods(self):
- ast_nodes = builder.extract_node('''
- {1:1, 2:3}.values() #@
- {1:1, 2:3}.keys() #@
- {1:1, 2:3}.items() #@
- ''')
- values = next(ast_nodes[0].infer())
- self.assertIsInstance(values, astroid.List)
- self.assertEqual([value.value for value in values.elts], [1, 3])
-
- keys = next(ast_nodes[1].infer())
- self.assertIsInstance(keys, astroid.List)
- self.assertEqual([key.value for key in keys.elts], [1, 2])
-
- items = next(ast_nodes[2].infer())
- self.assertIsInstance(items, astroid.List)
- for expected, elem in zip([(1, 1), (2, 3)], items.elts):
- self.assertIsInstance(elem, astroid.Tuple)
- self.assertEqual(list(expected), [elt.value for elt in elem.elts])
-
- @unittest.skipIf(six.PY2, "needs Python 3")
def test_wrapper_objects_for_dict_methods_python3(self):
ast_nodes = builder.extract_node('''
{1:1, 2:3}.values() #@
@@ -597,7 +541,6 @@ class DictObjectModelTest(unittest.TestCase):
class LruCacheModelTest(unittest.TestCase):
- @unittest.skipIf(six.PY2, "needs Python 3")
def test_lru_cache(self):
ast_nodes = builder.extract_node('''
import functools