===================
astroid's ChangeLog
===================


What's New in astroid 3.3.0?
============================
Release date: TBA



What's New in astroid 3.2.1?
============================
Release date: TBA



What's New in astroid 3.2.0?
============================
Release date: 2024-05-07

* ``.pyi`` stub files are now preferred over ``.py`` files when resolving imports, (except for numpy).

  Closes pylint-dev/#9185

* ``igetattr()`` returns the last same-named function in a class (instead of
  the first). This avoids false positives in pylint with ``@overload``.

  Closes #1015
  Refs pylint-dev/pylint#4696

* Adds ``module_denylist`` to ``AstroidManager`` for modules to be skipped during AST
  generation. Modules in this list will cause an ``AstroidImportError`` to be raised
  when an AST for them is requested.

  Refs pylint-dev/pylint#9442

* Make ``astroid.interpreter._import.util.is_namespace`` only consider modules
  using a loader set to ``NamespaceLoader`` or ``None`` as namespaces.
  This fixes a problem that ``six.moves`` brain was not effective if ``six.moves``
  was already imported.

  Closes #1107


What's New in astroid 3.1.0?
============================
Release date: 2024-02-23

* Include PEP 695 (Python 3.12) generic type syntax nodes in ``get_children()``,
  allowing checkers to visit them.

  Refs pylint-dev/pylint#9193

* Add ``__main__`` as a possible inferred value for ``__name__`` to improve
  control flow inference around ``if __name__ == "__main__":`` guards.

  Closes #2071

* Following a deprecation period, the ``names`` arg to the ``Import`` constructor and
  the ``op`` arg to the ``BoolOp`` constructor are now required, and the ``doc`` args
  to the ``PartialFunction`` and ``Property`` constructors have been removed (call
  ``postinit(doc_node=...)`` instead.)

* Following a deprecation announced in astroid 1.5.0, the alias ``AstroidBuildingException`` is removed in favor of ``AstroidBuildingError``.

* Include modname in AST warnings. Useful for ``invalid escape sequence`` warnings
  with Python 3.12.

* ``RecursionError`` is now trapped and logged out as ``UserWarning`` during astroid node transformations with instructions about raising the system recursion limit.

  Closes pylint-dev/pylint#8842

* Suppress ``SyntaxWarning`` for invalid escape sequences on Python 3.12 when parsing modules.

  Closes pylint-dev/pylint#9322


What's New in astroid 3.0.3?
============================
Release date: 2024-02-04

* Fix type of ``UnicodeDecodeError.object`` inferred as ``str`` instead of ``bytes``.

  Closes pylint-dev/pylint#9342

* Fix ``no-member`` false positives for ``args`` and ``kwargs`` on ``ParamSpec`` under Python 3.12.

  Closes pylint-dev/pylint#9401


What's New in astroid 3.0.2?
============================
Release date: 2023-12-12

* Avoid duplicate inference results for some uses of ``typing.X`` constructs like
  ``Tuple[Optional[int], ...]``. This was causing pylint to occasionally omit
  messages like ``deprecated-typing-alias``.

  Closes pylint-dev/pylint#9220


What's New in astroid 3.0.1?
============================
Release date: 2023-10-15

* Fix crashes linting code using PEP 695 (Python 3.12) generic type syntax.

  Closes pylint-dev/pylint#9098


What's New in astroid 3.0.0?
=============================
Release date: 2023-09-26

* Add support for Python 3.12, including PEP 695 type parameter syntax.

  Closes #2201

* Remove support for Python 3.7.

  Refs #2137

* Use the global inference cache when inferring, even without an explicit
  ``InferenceContext``. This is a significant performance improvement given how
  often methods default to ``None`` for the context argument. (Linting ``astroid``
  itself now takes ~5% less time on Python 3.12; other projects requiring more
  complex inference calculations will see greater speedups.)

  Refs #529

* Following a deprecation period starting in astroid 2.7.0, the ``astroid.node_classes``
  and ``astroid.scoped_nodes`` modules have been removed in favor of ``astroid.nodes.node_classes``
  and ``astroid.nodes.scoped_nodes``.

  Closes #1072

* Following a deprecation period starting in astroid 2.12.0, the ``astroid.mixins`` module
  has been removed in favor of ``astroid.nodes._base_nodes`` (private).

  Refs #1633

* Return all existing arguments when calling ``Arguments.arguments()``. This also means ``find_argname`` will now
  use the whole list of arguments for its search.

  Closes #2213

* Exclude class attributes from the ``__members__`` container of an ``Enum`` class when they are
  ``nodes.AnnAssign`` nodes with no assigned value.

  Refs pylint-dev/pylint#7402

* Remove ``@cached`` and ``@cachedproperty`` decorator (just use ``@cached_property`` from the stdlib).

  Closes #1780
  Refs #2140

* Remove the ``inference`` module. Node inference methods are now in the module
  defining the node, rather than being associated to the node afterward.

  Closes #679

* Move ``LookupMixIn`` to ``astroid.nodes._base_nodes`` and make it private.

* Remove the shims for ``OperationError``, ``BinaryOperationError``, and ``UnaryOperationError``
  in ``exceptions``. They were moved to ``util`` in astroid 1.5.0.

* Move ``safe_infer()`` from ``helpers`` to ``util``. This avoids some circular imports.

* Reduce file system access in ``ast_from_file()``.

* Reduce time to ``import astroid`` by delaying ``astroid_bootstrapping()`` until
  the first instantiation of ``AstroidBuilder``.

  Closes #2161

* Make ``igetattr()`` idempotent. This addresses some reports of varying results
  when running pylint with ``--jobs``.

  Closes pylint-dev/pylint#4356
  Refs #7

* Fix incorrect cache keys for inference results, thereby correctly inferring types
  for calls instantiating types dynamically.

  Closes #1828
  Closes pylint-dev/pylint#7464
  Closes pylint-dev/pylint#8074

* Fix interrupted ``InferenceContext`` call chains, thereby addressing performance
  problems when linting ``sqlalchemy``.

  Closes pylint-dev/pylint#8150

* ``nodes.FunctionDef`` no longer inherits from ``nodes.Lambda``.
  This is a breaking change but considered a bug fix as the nodes did not share the same
  API and were not interchangeable.

  We have tried to minimize the amount of breaking changes caused by this change
  but some are unavoidable.

* ``infer_call_result`` now shares the same interface across all implementations. Namely:
  ```python
  def infer_call_result(
                self,
                caller: SuccessfulInferenceResult | None,
                context: InferenceContext | None = None,
            ) -> Iterator[InferenceResult]:
  ```

  This is a breaking change for ``nodes.FunctionDef`` where previously ``caller`` had a default of
  ``None``. Passing ``None`` again will not create a behaviour change.
  The breaking change allows us to better type and re-use the method within ``astroid``.

* Improved signature of the ``__init__`` and ``__postinit__`` methods of most nodes.
  This includes making ``lineno``, ``col_offset``, ``end_lineno``, ``end_col_offset`` and ``parent``
  required arguments for ``nodes.NodeNG`` and its subclasses.
  For most other nodes, arguments of their ``__postinit__`` methods have been made required to better
  represent how they would normally be constructed by the standard library ``ast`` module.
  The following nodes were changed or updated:
  - ``nodes.AnnAssign``
  - ``nodes.Arguments``
  - ``nodes.Assign``
  - ``nodes.AssignAttr``
  - ``nodes.AssignName``
  - ``nodes.Attribute``
  - ``nodes.AugAssign``
  - ``nodes.Await``
  - ``nodes.BaseContainer``
  - ``nodes.BinOp``
  - ``nodes.Call``
  - ``nodes.ClassDef``
  - ``nodes.Compare``
  - ``nodes.Comprehension``
  - ``nodes.Decorators``
  - ``nodes.Delete``
  - ``nodes.DelAttr``
  - ``nodes.DelName``
  - ``nodes.Dict``
  - ``nodes.DictComp``
  - ``nodes.ExceptHandler``
  - ``nodes.Expr``
  - ``nodes.For``
  - ``nodes.FunctionDef``
  - ``nodes.GeneratorExp``
  - ``nodes.If``
  - ``nodes.IfExp``
  - ``nodes.Keyword``
  - ``nodes.Lambda``
  - ``nodes.ListComp``
  - ``nodes.Module``
  - ``nodes.Name``
  - ``nodes.NodeNG``
  - ``nodes.Raise``
  - ``nodes.Return``
  - ``nodes.SetComp``
  - ``nodes.Slice``
  - ``nodes.Starred``
  - ``objects.Super``, we also added the ``call`` parameter to its ``__init__`` method.
  - ``nodes.Subscript``
  - ``nodes.UnaryOp``
  - ``nodes.While``
  - ``nodes.Yield``

  These changes involve breaking changes to their API but should be considered bug fixes. We
  now make arguments required when they are instead of always providing defaults.

* ``nodes.If.self.is_orelse`` has been removed as it was never set correctly and therefore
  provided a false value.

* Remove dependency on ``wrapt``.

* Remove dependency on ``lazy_object_proxy``. This includes the removal
  of the associated ``lazy_import``, ``lazy_descriptor`` and ``proxy_alias`` utility functions.

* ``CallSite._unpack_args`` and ``CallSite._unpack_keywords`` now use ``safe_infer()`` for
  better inference and fewer false positives.

  Closes pylint-dev/pylint#8544

* Add ``attr.Factory`` to the recognized class attributes for classes decorated with ``attrs``.

  Closes pylint-dev/pylint#4341

* ``infer_property()`` now observes the same property-specific workaround as ``infer_functiondef``.

  Refs #1490

* Remove unused and / or deprecated constants:
  - ``astroid.bases.BOOL_SPECIAL_METHOD``
  - ``astroid.bases.BUILTINS``
  - ``astroid.const.BUILTINS``
  - ``astroid.const.PY38_PLUS``
  - ``astroid.const.Load``
  - ``astroid.const.Store``
  - ``astroid.const.Del``

  Refs #2141

* ``frame()`` raises ``ParentMissingError`` and ``statement()`` raises ``StatementMissing`` for
  missing parents regardless of the value of the ``future`` argument (which gave this behavior
  already).

  The ``future`` argument to each method is deprecated and will be removed in astroid 4.0.

  Refs #1217

* Remove deprecated ``Ellipsis``, ``ExtSlice``, ``Index`` nodes.

  Refs #2152

* Remove deprecated ``is_sys_guard`` and ``is_typing_guard`` methods.

  Refs #2153

* Remove deprecated ``doc`` attribute for ``Module``, ``ClassDef``, and ``FunctionDef``.
  Use the ``doc_node`` attribute instead.

  Refs #2154

* Add new ``nodes.Try`` to better match Python AST. Replaces the ``TryExcept``
  and ``TryFinally`` nodes which have been removed.

* Publicize ``NodeNG.repr_name()`` to facilitate finding a node's nice name.

  Refs pylint-dev/pylint#8598

* Fix false positives for ``no-member`` and ``invalid-name`` when using the ``_name_``, ``_value_`` and ``_ignore_`` sunders in Enums.

  Closes pylint-dev/pylint#9015


What's New in astroid 2.15.8?
=============================
Release date: 2023-09-26

* Fix a regression in 2.15.7 for ``unsubscriptable-object``.

  Closes #2305
  Closes pylint-dev/pylint#9069

* Fix a regression in 2.15.7 for ``unsubscriptable-object``.

  Closes #2305
  Closes pylint-dev/pylint#9069


What's New in astroid 2.15.7?
=============================
Release date: 2023-09-23

* Fix a crash when inferring a ``typing.TypeVar`` call.

  Closes pylint-dev/pylint#8802

* Infer user-defined enum classes by checking if the class is a subtype of ``enum.Enum``.

  Closes pylint-dev/pylint#8897

* Fix inference of functions with ``@functools.lru_cache`` decorators without
  parentheses.

  Closes pylint-dev/pylint#8868

* Make ``sys.argv`` uninferable because it never is. (It's impossible to infer
  the value it will have outside of static analysis where it's our own value.)

  Refs pylint-dev/pylint#7710


What's New in astroid 2.15.6?
=============================
Release date: 2023-07-08

* Harden ``get_module_part()`` against ``"."``.

  Closes pylint-dev/pylint#8749

* Allow ``AsStringVisitor`` to visit ``objects.PartialFunction``.

  Closes pylint-dev/pylint#8881

* Avoid expensive list/tuple multiplication operations that would result in ``MemoryError``.

  Closes pylint-dev/pylint#8748

* Fix a regression in 2.12.0 where settings in AstroidManager would be ignored.
  Most notably this addresses pylint-dev/pylint#7433.

  Refs #2204


What's New in astroid 2.15.5?
=============================
Release date: 2023-05-14

* Handle ``objects.Super`` in ``helpers.object_type()``.

  Refs pylint-dev/pylint#8554

* Recognize stub ``pyi`` Python files.

  Refs pylint-dev/pylint#4987


What's New in astroid 2.15.4?
=============================
Release date: 2023-04-24

* Add visitor function for ``TryStar`` to ``AsStringVisitor`` and
  add ``TryStar`` to ``astroid.nodes.ALL_NODE_CLASSES``.

  Refs #2142


What's New in astroid 2.15.3?
=============================
Release date: 2023-04-16

* Fix ``infer_call_result()`` crash on methods called ``with_metaclass()``.

  Closes #1735

* Suppress ``UserWarning`` when finding module specs.

  Closes pylint-dev/pylint#7906


What's New in astroid 2.15.2?
=============================
Release date: 2023-04-03

* Support more possible usages of ``attrs`` decorators.

  Closes pylint-dev/pylint#7884


What's New in astroid 2.15.1?
=============================
Release date: 2023-03-26

* Restore behavior of setting a Call as a base for classes created using ``six.with_metaclass()``,
  and harden support for using enums as metaclasses in this case.

  Reverts #1622
  Refs pylint-dev/pylint#5935
  Refs pylint-dev/pylint#7506


What's New in astroid 2.15.0?
=============================
Release date: 2023-03-06

* astroid now supports ``TryStar`` nodes from python 3.11 and should be fully compatible with python 3.11.

  Closes #2028

* ``Formattedvalue.postinit`` is now keyword only. This is to allow correct typing of the
  ``Formattedvalue`` class.

  Refs #1516

* ``Astroid`` now supports custom import hooks.

  Refs pylint-dev/pylint#7306

* ``astroid`` now infers return values from match cases.

  Refs pylint-dev/pylint#5288

* ``AstroidManager.clear_cache`` now also clears the inference context cache.

  Refs #1780

* ``max_inferable_values`` can now be set on ``AstroidManager`` instances, e.g. ``astroid.MANAGER``
  besides just the ``AstroidManager`` class itself.

  Closes #2280

* ``Astroid`` now retrieves the default values of keyword only arguments and sets them on
  ``Arguments.kw_defaults``.

* ``Uninferable`` now has the type ``UninferableBase``. This is to facilitate correctly type annotating
  code that uses this singleton.

  Closes #1680

* Deprecate ``modutils.is_standard_module()``. It will be removed in the next minor release.
  Functionality has been replaced by two new functions,
  ``modutils.is_stdlib_module()`` and ``modutils.module_in_path()``.

  Closes #2012


* Fix ``are_exclusive`` function when a walrus operator is used inside ``IfExp.test`` field.

  Closes #2022

What's New in astroid 2.14.2?
=============================
Release date: 2023-02-12

* '_infer_str_format_call' won't crash anymore when the string it analyses are uninferable.

  Closes pylint-dev/pylint#8109


What's New in astroid 2.14.1?
=============================
Release date: 2023-01-31

* Revert ``CallContext`` change as it caused a ``RecursionError`` regression.


What's New in astroid 2.14.0?
=============================
Release date: 2023-01-31

* Add support for inferring binary union types added in Python 3.10.

  Refs pylint-dev/pylint#8119

* Capture and log messages emitted when inspecting a module for astroid.

  Closes #1904


What's New in astroid 2.13.5?
=============================
Release date: 2023-01-31

* Revert ``CallContext`` change as it caused a ``RecursionError`` regression.


What's New in astroid 2.13.4?
=============================
Release date: 2023-01-31

* Fix issues with ``typing_extensions.TypeVar``.

* Fix ``ClassDef.fromlino`` for PyPy 3.8 (v7.3.11) if class is wrapped by a decorator.

* Preserve parent CallContext when inferring nested functions.

  Closes pylint-dev/pylint#8074

* Add ``Lock`` to the ``multiprocessing`` brain.

  Closes pylint-dev/pylint#3313


What's New in astroid 2.13.3?
=============================
Release date: 2023-01-20

* Fix a regression in 2.13.2 where a RunTimeError could be raised unexpectedly.

  Closes #1958

* Fix overwritten attributes in inherited dataclasses not being ordered correctly.

  Closes pylint-dev/pylint#7881

* Fix a false positive when an attribute named ``Enum`` was confused with ``enum.Enum``.
  Calls to ``Enum`` are now inferred & the qualified name is checked.

  Refs pylint-dev/pylint#5719

* Remove unnecessary typing_extensions dependency on Python 3.11 and newer

What's New in astroid 2.13.2?
=============================
Release date: 2023-01-08

* Removed version conditions on typing_extensions dependency. Removed typing_extensions from
  our tests requirements as it was preventing issues to appear in our continuous integration.

  Closes #1945


What's New in astroid 2.13.1?
=============================
Release date: 2023-01-08

* Bumping typing_extensions to 4.0.0 that is required when using ``Self``

  Closes #1942

What's New in astroid 2.13.0?
=============================
Release date: 2023-01-07

* Fixed importing of modules that have the same name as the file that is importing.
  ``astroid`` will now correctly handle an ``import math`` statement in a file called ``math.py``
  by relying on the import system.

  Refs pylint-dev/pylint#5151

* Create ``ContextManagerModel`` and let ``GeneratorModel`` inherit from it.

  Refs pylint-dev/pylint#2567

* Added a ``regex`` brain.

  Refs pylint-dev/pylint#1911

* Support "is None" constraints from if statements during inference.

  Ref #791
  Ref pylint-dev/pylint#157
  Ref pylint-dev/pylint#1472
  Ref pylint-dev/pylint#2016
  Ref pylint-dev/pylint#2631
  Ref pylint-dev/pylint#2880

What's New in astroid 2.12.14?
==============================
Release date: 2023-01-06

* Handle the effect of properties on the ``__init__`` of a dataclass correctly.

  Closes pylint-dev/pylint#5225

* Handle the effect of ``kw_only=True`` in dataclass fields correctly.

  Closes pylint-dev/pylint#7623

* Handle the effect of ``init=False`` in dataclass fields correctly.

  Closes pylint-dev/pylint#7291

* Fix crash if ``numpy`` module doesn't have ``version`` attribute.

  Refs pylint-dev/pylint#7868

* Handle ``AttributeError`` during ``str.format`` template inference tip evaluation

  Closes pylint-dev/pylint#1902

* Add the ``masked_invalid`` function in the ``numpy.ma`` brain.

  Closes pylint-dev/pylint#5715

What's New in astroid 2.12.13?
==============================
Release date: 2022-11-19

* Prevent returning an empty list for ``ClassDef.slots()`` when the mro list contains one class & it is not ``object``.

  Refs pylint-dev/pylint#5099

* Prevent a crash when inferring calls to ``str.format`` with inferred arguments
  that would be invalid.

  Closes #1856

* Infer the `length` argument of the ``random.sample`` function.

  Refs pylint-dev/pylint#7706

* Catch ``ValueError`` when indexing some builtin containers and sequences during inference.

  Closes #1843

What's New in astroid 2.12.12?
==============================
Release date: 2022-10-19

* Add the ``length`` parameter to ``hash.digest`` & ``hash.hexdigest`` in the ``hashlib`` brain.

  Refs pylint-dev/pylint#4039

* Prevent a crash when a module's ``__path__`` attribute is unexpectedly missing.

  Refs pylint-dev/pylint#7592

* Fix inferring attributes with empty annotation assignments if parent
  class contains valid assignment.

  Refs pylint-dev/pylint#7631


What's New in astroid 2.12.11?
==============================
Release date: 2022-10-10

* Add ``_value2member_map_`` member to the ``enum`` brain.

  Refs pylint-dev/pylint#3941

* Improve detection of namespace packages for the modules with ``__spec__`` set to None.

  Closes pylint-dev/pylint#7488.

* Fixed a regression in the creation of the ``__init__`` of dataclasses with
  multiple inheritance.

  Closes pylint-dev/pylint#7434


What's New in astroid 2.12.10?
==============================
Release date: 2022-09-17


* Fixed a crash when introspecting modules compiled by `cffi`.

  Closes #1776
  Closes pylint-dev/pylint#7399

* ``decorators.cached`` now gets its cache cleared by calling ``AstroidManager.clear_cache``.

  Refs #1780

What's New in astroid 2.12.9?
=============================
Release date: 2022-09-07

* Fixed creation of the ``__init__`` of ``dataclassess`` with multiple inheritance.

  Closes pylint-dev/pylint#7427

* Fixed a crash on ``namedtuples`` that use ``typename`` to specify their name.

  Closes pylint-dev/pylint#7429



What's New in astroid 2.12.8?
=============================
Release date: 2022-09-06

* Fixed a crash in the ``dataclass`` brain for ``InitVars`` without subscript typing.

  Closes pylint-dev/pylint#7422

* Fixed parsing of default values in ``dataclass`` attributes.

  Closes pylint-dev/pylint#7425

What's New in astroid 2.12.7?
=============================
Release date: 2022-09-06

* Fixed a crash in the ``dataclass`` brain for uninferable bases.

  Closes pylint-dev/pylint#7418


What's New in astroid 2.12.6?
=============================
Release date: 2022-09-05

* Fix a crash involving ``Uninferable`` arguments to ``namedtuple()``.

  Closes pylint-dev/pylint#7375

* The ``dataclass`` brain now understands the ``kw_only`` keyword in dataclass decorators.

  Closes pylint-dev/pylint#7290


What's New in astroid 2.12.5?
=============================
Release date: 2022-08-29

* Prevent first-party imports from being resolved to `site-packages`.

  Refs pylint-dev/pylint#7365

* Fix ``astroid.interpreter._import.util.is_namespace()`` incorrectly
  returning ``True`` for frozen stdlib modules on PyPy.

  Closes #1755


What's New in astroid 2.12.4?
=============================
Release date: 2022-08-25

* Fixed a crash involving non-standard type comments such as ``# type: # any comment``.

  Refs pylint-dev/pylint#7347


What's New in astroid 2.12.3?
=============================
Release date: 2022-08-23

* Fixed crash in ``ExplicitNamespacePackageFinder`` involving ``_SixMetaPathImporter``.

  Closes #1708

* Fix unhandled `FutureWarning` from pandas import in cython modules

  Closes #1717

* Fix false positive with inference of type-annotated Enum classes.

  Refs pylint-dev/pylint#7265

* Fix crash with inference of type-annotated Enum classes where the member has no value.

* Fix a crash inferring invalid old-style string formatting with `%`.

  Closes #1737

* Fix false positive with inference of ``http`` module when iterating ``HTTPStatus``.

  Refs pylint-dev/pylint#7307

* Bumped minimum requirement of ``wrapt`` to 1.14 on Python 3.11.


* Don't add dataclass fields annotated with ``KW_ONLY`` to the list of fields.

  Refs pylint-dev/pylint#5767

What's New in astroid 2.12.2?
=============================
Release date: 2022-07-12

* Fixed crash in modulo operations for divisions by zero.

  Closes #1700

* Fixed crash with recursion limits during inference.

  Closes #1646

What's New in astroid 2.12.1?
=============================
Release date: 2022-07-10

* Fix a crash when inferring old-style string formatting (``%``) using tuples.

* Fix a crash when ``None`` (or a value inferred as ``None``) participates in a
  ``**`` expression.

* Fix a crash involving properties within ``if`` blocks.


What's New in astroid 2.12.0?
=============================
Release date: 2022-07-09

* Fix signal has no ``connect`` member for PySide2 5.15.2+ and PySide6

  Closes #4040, #5378

* ``astroid`` now requires Python 3.7.2 to run.

* Avoid setting a Call as a base for classes created using ``six.with_metaclass()``.

  Refs pylint-dev/pylint#5935

* Fix detection of builtins on ``PyPy`` 3.9.

* Fix ``re`` brain on Python ``3.11``. The flags now come from ``re._compile``.

* Build ``nodes.Module`` for frozen modules which have location information in their
  ``ModuleSpec``.

  Closes #1512

* The ``astroid.mixins`` module has been deprecated and marked for removal in 3.0.0.

  Closes #1633

* Capture and log messages emitted by C extensions when importing them.
  This prevents contaminating programmatic output, e.g. pylint's JSON reporter.

  Closes pylint-dev/pylint#3518

* Calls to ``str.format`` are now correctly inferred.

  Closes #104, Closes #1611

* ``__new__`` and ``__init__`` have been added to the ``ObjectModel`` and are now
  inferred as ``BoundMethods``.

* Old style string formatting (using ``%`` operators) is now correctly inferred.

  Closes #151

* Adds missing enums from ``ssl`` module.

  Closes pylint-dev/pylint#3691

* Remove dependency on ``pkg_resources`` from ``setuptools``.

  Closes #1103

* Allowed ``AstroidManager.clear_cache`` to reload necessary brain plugins.

* Fixed incorrect inferences after rebuilding the builtins module, e.g. by calling
  ``AstroidManager.clear_cache``.

  Closes #1559

* ``Arguments.defaults`` is now ``None`` for uninferable signatures.

* On Python versions >= 3.9, ``astroid`` now understands subscripting
  builtin classes such as ``enumerate`` or ``staticmethod``.

* Fixed inference of ``Enums`` when they are imported under an alias.

  Closes pylint-dev/pylint#5776

* Rename ``ModuleSpec`` -> ``module_type`` constructor parameter to match attribute
  name and improve typing. Use ``type`` instead.

* ``ObjectModel`` and ``ClassModel`` now know about their ``__new__`` and ``__call__`` attributes.

* Fixed pylint ``not-callable`` false positive with nested-tuple assignment in a for-loop.

  Refs pylint-dev/pylint#5113

* Instances of builtins created with ``__new__(cls, value)`` are now inferred.

* Infer the return value of the ``.copy()`` method on ``dict``, ``list``, ``set``,
  and ``frozenset``.

  Closes #1403

* Fixed inference of elements of living container objects such as tuples and sets in the
  ``sys`` and ``ssl`` modules.

* Add ``pathlib`` brain to handle ``pathlib.PurePath.parents`` inference.

  Closes pylint-dev/pylint#5783

* Avoid inferring the results of ``**`` operations involving values greater than ``1e5``
  to avoid expensive computation.

  Closes pylint-dev/pylint#6745

* Fix test for Python ``3.11``. In some instances ``err.__traceback__`` will
  be uninferable now.

* Add brain for numpy core module ``einsumfunc``.

  Closes pylint-dev/pylint#5821

* Infer the ``DictUnpack`` value for ``Dict.getitem`` calls.

  Closes #1195

* Fix a crash involving properties within ``try ... except`` blocks.

  Closes pylint-dev/pylint#6592

* Prevent creating ``Instance`` objects that proxy other ``Instance``s when there is
  ambiguity (or user error) in calling ``__new__(cls)``.

  Refs pylint-dev/pylint#7109

What's New in astroid 2.11.7?
=============================
Release date: 2022-07-09

* Added support for ``usedforsecurity`` keyword to ``hashlib`` constructors.

  Closes pylint-dev/pylint#6017

* Updated the stdlib brain for ``subprocess.Popen`` to accommodate Python 3.9+.

  Closes pylint-dev/pylint#7092

What's New in astroid 2.11.6?
=============================
Release date: 2022-06-13

* The Qt brain now correctly treats calling ``.disconnect()`` (with no
  arguments) on a slot as valid.

* The argparse brain no longer incorrectly adds ``"Namespace"`` to the locals
  of functions that return an ``argparse.Namespace`` object.

  Refs pylint-dev/pylint#6895

What's New in astroid 2.11.5?
=============================
Release date: 2022-05-09

* Fix crash while obtaining ``object_type()`` of an ``Unknown`` node.

  Refs pylint-dev/pylint#6539

* Fix a bug where in attempting to handle the patching of ``distutils`` by ``virtualenv``,
  library submodules called ``distutils`` (e.g. ``numpy.distutils``) were included also.

  Refs pylint-dev/pylint#6497

What's New in astroid 2.11.4?
=============================
Release date: 2022-05-02

* Fix ``col_offset`` attribute for nodes involving ``with`` on ``PyPy``.

* Fixed a crash involving two starred expressions: one inside a comprehension,
  both inside a call.

  Refs pylint-dev/pylint#6372

* Made ``FunctionDef.implicit_parameters`` return 1 for methods by making
  ``FunctionDef.is_bound`` return ``True``, as it does for class methods.

  Closes pylint-dev/pylint#6464

* Fixed a crash when ``_filter_stmts`` encounters an ``EmptyNode``.

  Closes pylint-dev/pylint#6438


What's New in astroid 2.11.3?
=============================
Release date: 2022-04-19

* Fixed an error in the Qt brain when building ``instance_attrs``.

  Closes pylint-dev/pylint#6221

* Fixed a crash in the ``gi`` brain.

  Closes pylint-dev/pylint#6371


What's New in astroid 2.11.2?
=============================
Release date: 2022-03-26

* Avoided adding the name of a parent namedtuple to its child's locals.

  Refs pylint-dev/pylint#5982


What's New in astroid 2.11.1?
=============================
Release date: 2022-03-22

* Promoted ``getattr()`` from ``astroid.scoped_nodes.FunctionDef`` to its parent
  ``astroid.scoped_nodes.Lambda``.

* Fixed crash on direct inference via ``nodes.FunctionDef._infer``.

  Closes #817


What's New in astroid 2.11.0?
=============================
Release date: 2022-03-12

* Add new (optional) ``doc_node`` attribute to ``nodes.Module``, ``nodes.ClassDef``,
  and ``nodes.FunctionDef``.

* Accessing the ``doc`` attribute of ``nodes.Module``, ``nodes.ClassDef``, and
  ``nodes.FunctionDef`` has been deprecated in favour of the ``doc_node`` attribute.
  Note: ``doc_node`` is an (optional) ``nodes.Const`` whereas ``doc`` was an (optional) ``str``.

* Passing the ``doc`` argument to the ``__init__`` of ``nodes.Module``, ``nodes.ClassDef``,
  and ``nodes.FunctionDef`` has been deprecated in favour of the ``postinit`` ``doc_node`` attribute.
  Note: ``doc_node`` is an (optional) ``nodes.Const`` whereas ``doc`` was an (optional) ``str``.

* Replace custom ``cachedproperty`` with ``functools.cached_property`` and deprecate it
  for Python 3.8+.

  Closes #1410

* Set ``end_lineno`` and ``end_col_offset`` attributes to ``None`` for all nodes
  with PyPy 3.8. PyPy 3.8 assigns these attributes inconsistently which could lead
  to unexpected errors. Overwriting them with ``None`` will cause a fallback
  to the already supported way of PyPy 3.7.

* Add missing ``shape`` parameter to numpy ``zeros_like``, ``ones_like``,
  and ``full_like`` methods.

  Closes pylint-dev/pylint#5871

* Only pin ``wrapt`` on the major version.


What's New in astroid 2.10.0?
=============================
Release date: 2022-02-27


* Fixed inference of ``self`` in binary operations in which ``self``
  is part of a list or tuple.

  Closes pylint-dev/pylint#4826

* Fixed builtin inference on `property` calls not calling the `postinit` of the new node, which
  resulted in instance arguments missing on these nodes.

* Fixed a crash on ``Super.getattr`` when the attribute was previously uninferable due to a cache
  limit size. This limit can be hit when the inheritance pattern of a class (and therefore of the
  ``__init__`` attribute) is very large.

  Closes pylint-dev/pylint#5679

* Include names of keyword-only arguments in ``astroid.scoped_nodes.Lambda.argnames``.

  Closes pylint-dev/pylint#5771

* Fixed a crash inferring on a ``NewType`` named with an f-string.

  Closes pylint-dev/pylint#5770

* Add support for [attrs v21.3.0](https://github.com/python-attrs/attrs/releases/tag/21.3.0) which
  added a new `attrs` module alongside the existing `attr`.

  Closes #1330

* Use the ``end_lineno`` attribute for the ``NodeNG.tolineno`` property
  when it is available.

  Closes #1350

* Add ``is_dataclass`` attribute to ``ClassDef`` nodes.

* Use ``sysconfig`` instead of ``distutils`` to determine the location of
  python stdlib files and packages.

  Related pull requests: #1322, #1323, #1324
  Closes #1282
  Ref #1103

* Fixed crash with recursion error for inference of class attributes that referenced
  the class itself.

  Closes pylint-dev/pylint#5408

* Fixed crash when trying to infer ``items()`` on the ``__dict__``
  attribute of an imported module.

  Closes #1085

* Add optional ``NodeNG.position`` attribute.
  Used for block nodes to highlight position of keyword(s) and name
  in cases where the AST doesn't provide good enough positional information.
  E.g. ``nodes.ClassDef``, ``nodes.FunctionDef``.

* Fix ``ClassDef.fromlineno``. For Python < 3.8 the ``lineno`` attribute includes decorators.
  ``fromlineno`` should return the line of the ``class`` statement itself.

* Performance improvements. Only run expensive decorator functions when
  non-default Deprecation warnings are enabled, eg. during a Pytest run.

  Closes #1383


What's New in astroid 2.9.3?
============================
Release date: 2022-01-09

* Fixed regression where packages without a ``__init__.py`` file were
  not recognized or imported correctly.

  Closes #1327

What's New in astroid 2.9.2?
============================
Release date: 2022-01-04

* Fixed regression in ``astroid.scoped_nodes`` where ``_is_metaclass``
  was not accessible anymore.

Closes #1325

What's New in astroid 2.9.1?
============================
Release date: 2021-12-31

* ``NodeNG.frame()`` and ``NodeNG.statement()`` will start raising ``ParentMissingError``
  instead of ``AttributeError`` in astroid 3.0. This behaviour can already be triggered
  by passing ``future=True`` to a ``frame()`` or ``statement()`` call.

* Prefer the module loader get_source() method in AstroidBuilder's
  module_build() when possible to avoid assumptions about source
  code being available on a filesystem.  Otherwise the source cannot
  be found and application behavior changes when running within an
  embedded hermetic interpreter environment (pyoxidizer, etc.).

* Require Python 3.6.2 to use astroid.

* Removed custom ``distutils`` handling for resolving paths to submodules.

  Ref #1321

* Restore custom ``distutils`` handling for resolving paths to submodules.

  Closes pylint-dev/pylint#5645

* Fix ``deque.insert()`` signature in ``collections`` brain.

  Closes #1260

* Fix ``Module`` nodes not having a ``col_offset``, ``end_lineno``, and ``end_col_offset``
  attributes.

* Fix typing and update explanation for ``Arguments.args`` being ``None``.

* Fix crash if a variable named ``type`` is accessed with an index operator (``[]``)
  in a generator expression.

  Closes pylint-dev/pylint#5461

* Enable inference of dataclass import from marshmallow_dataclass.
  This allows the dataclasses brain to recognize dataclasses annotated by marshmallow_dataclass.

* Resolve symlinks in the import path
  Fixes inference error when the import path includes symlinks (e.g. Python
  installed on macOS via Homebrew).

  Closes #823
  Closes pylint-dev/pylint#3499
  Closes pylint-dev/pylint#4302
  Closes pylint-dev/pylint#4798
  Closes pylint-dev/pylint#5081

What's New in astroid 2.9.0?
============================
Release date: 2021-11-21

* Add ``end_lineno`` and ``end_col_offset`` attributes to astroid nodes.

* Always treat ``__class_getitem__`` as a classmethod.

* Add missing ``as_string`` visitor method for ``Unknown`` node.

  Closes #1264


What's New in astroid 2.8.6?
============================
Release date: 2021-11-21

* Fix crash on inference of subclasses created from ``Class().__subclasses__``

  Closes pylint-dev/pylint#4982

* Fix bug with Python 3.7.0 / 3.7.1 and ``typing.NoReturn``.

  Closes #1239


What's New in astroid 2.8.5?
============================
Release date: 2021-11-12

* Use more permissive versions for the ``typed-ast`` dependency (<2.0 instead of <1.5)

  Closes #1237

* Fix crash on inference of ``__len__``.

  Closes pylint-dev/pylint#5244

* Added missing ``kind`` (for ``Const``) and ``conversion`` (for ``FormattedValue``) fields to repr.

* Fix crash with assignment expressions, nested if expressions and filtering of statements

  Closes pylint-dev/pylint#5178

* Fix incorrect filtering of assignment expressions statements


What's New in astroid 2.8.4?
============================
Release date: 2021-10-25

* Fix the ``scope()`` and ``frame()`` methods of ``NamedExpr`` nodes.
  When these nodes occur in ``Arguments``, ``Keyword``  or ``Comprehension`` nodes these
  methods now correctly point to the outer-scope of the ``FunctionDef``,
  ``ClassDef``, or ``Comprehension``.

* Fix the ``set_local`` function for ``NamedExpr`` nodes.
  When these nodes occur in ``Arguments``, ``Keyword``, or ``Comprehension`` nodes these
  nodes are now correctly added to the locals of the ``FunctionDef``,
  ``ClassDef``, or ``Comprehension``.


What's New in astroid 2.8.3?
============================
Release date: 2021-10-17

* Add support for wrapt 1.13

* Fixes handling of nested partial functions

  Closes pylint-dev/pylint#2462
  Closes #1208

* Fix regression with the import resolver

  Closes pylint-dev/pylint#5131

* Fix crash with invalid dataclass field call

  Closes pylint-dev/pylint#5153


What's New in astroid 2.8.2?
============================
Release date: 2021-10-07

Same content than 2.8.2-dev0 / 2.8.1, released in order to fix a
mistake when creating the tag.


What's New in astroid 2.8.1?
============================
Release date: 2021-10-06

* Adds support of type hints inside numpy's brains.

  Closes pylint-dev/pylint#4326

* Enable inference of dataclass import from pydantic.dataclasses.
  This allows the dataclasses brain to recognize pydantic dataclasses.

  Closes pylint-dev/pylint#4899

* Fix regression on ClassDef inference

  Closes pylint-dev/pylint#5030
  Closes pylint-dev/pylint#5036

* Fix regression on Compare node inference

  Closes pylint-dev/pylint#5048

* Extended attrs brain to support the provisional APIs

* Astroid does not trigger it's own deprecation warning anymore.

* Improve brain for ``typing.Callable`` and ``typing.Type``.

* Fix bug with importing namespace packages with relative imports

  Closes pylint-dev/pylint#5059

* The ``is_typing_guard`` and ``is_sys_guard`` functions are deprecated and will
  be removed in 3.0.0. They are complex meta-inference functions that are better
  suited for pylint. Import them from ``pylint.checkers.utils`` instead
  (requires pylint ``2.12``).

* Suppress the conditional between applied brains and dynamic import authorized
  modules. (Revert the "The transforms related to a module are applied only if this
  module has not been explicitly authorized to be imported" of version 2.7.3)

* Adds a brain to infer the ``numpy.ma.masked_where`` function.

  Closes pylint-dev/pylint#3342


What's New in astroid 2.8.0?
============================
Release date: 2021-09-14

* Add additional deprecation warnings in preparation for astroid 3.0

  * Require attributes for some node classes with ``__init__`` call.

    * ``name`` (``str``) for ``Name``, ``AssignName``, ``DelName``
    * ``attrname`` (``str``) for ``Attribute``, ``AssignAttr``, ``DelAttr``
    * ``op`` (``str``) for ``AugAssign``, ``BinOp``, ``BoolOp``, ``UnaryOp``
    * ``names`` (``list[tuple[str, str | None]]``) for ``Import``

* Support pyz imports

  Closes pylint-dev/pylint#3887

* Add ``node_ancestors`` method to ``NodeNG`` for obtaining the ancestors of nodes.

* It's now possible to infer the value of comparison nodes

  Closes #846

* Fixed bug in inference of dataclass field calls.

  Closes pylint-dev/pylint#4963


What's New in astroid 2.7.3?
============================
Release date: 2021-08-30

* The transforms related to a module are applied only if this module has not been explicitly authorized to be imported
  (i.e is not in AstroidManager.extension_package_whitelist). Solves the following issues if numpy is authorized to be imported
  through the `extension-pkg-allow-list` option.

  Closes pylint-dev/pylint#3342
  Closes pylint-dev/pylint#4326

* Fixed bug in attribute inference from inside method calls.

    Closes pylint-dev/pylint#400

* Fixed bug in inference for superclass instance methods called
  from the class rather than an instance.

    Closes #1008
    Closes pylint-dev/pylint#4377

* Fixed bug in inference of chained attributes where a subclass
  had an attribute that was an instance of its superclass.

    Closes pylint-dev/pylint#4220

* Adds a brain for the ctypes module.

  Closes pylint-dev/pylint#4896

* When processing dataclass attributes, exclude the same type hints from abc.collections
  as from typing.

  Closes pylint-dev/pylint#4895

* Apply dataclass inference to pydantic's dataclasses.

  Closes pylint-dev/pylint#4899


What's New in astroid 2.7.2?
============================
Release date: 2021-08-20

* ``BaseContainer`` is now public, and will replace ``_BaseContainer`` completely in astroid 3.0.
* The call cache used by inference functions produced by ``inference_tip``
  can now be cleared via ``clear_inference_tip_cache``.

* ``astroid.const.BUILTINS`` and ``astroid.bases.BUILTINS`` are not used internally anymore
  and will be removed in astroid 3.0. Simply replace this by the string 'builtins' for better
  performances and clarity.

* Add inference for dataclass initializer method.

    Closes pylint-dev/pylint#3201

What's New in astroid 2.7.1?
============================
Release date: 2021-08-16

* When processing dataclass attributes, only do typing inference on collection types.
  Support for instantiating other typing types is left for the future, if desired.

  Closes #1129

* Fixed LookupMixIn missing from ``astroid.node_classes``.


What's New in astroid 2.7.0?
============================
Release date: 2021-08-15

* Import from ``astroid.node_classes`` and ``astroid.scoped_nodes`` has been deprecated in favor of
  ``astroid.nodes``. Only the imports from ``astroid.nodes`` will work in astroid 3.0.0.

* Add support for arbitrary Enum subclass hierarchies

  Closes pylint-dev/pylint#533
  Closes pylint-dev/pylint#2224
  Closes pylint-dev/pylint#2626

* Add inference tips for dataclass attributes, including dataclasses.field calls.
  Also add support for InitVar.

  Closes pylint-dev/pylint#2600
  Closes pylint-dev/pylint#2698
  Closes pylint-dev/pylint#3405
  Closes pylint-dev/pylint#3794

* Adds a brain that deals with dynamic import of `IsolatedAsyncioTestCase` class of the `unittest` module.

  Closes pylint-dev/pylint#4060


What's New in astroid 2.6.6?
============================
Release date: 2021-08-03

* Added support to infer return type of ``typing.cast()``

* Fix variable lookup handling of exclusive statements

  Closes pylint-dev/pylint#3711

* Fix variable lookup handling of function parameters

  Closes pylint-dev/astroid#180

* Fix variable lookup's handling of except clause variables

* Fix handling of classes with duplicated bases with the same name

  Closes pylint-dev/astroid#1088

What's New in astroid 2.6.5?
============================
Release date: 2021-07-21

* Fix a crash when there would be a 'TypeError object does not support
  item assignment' in the code we parse.

  Closes pylint-dev/pylint#4439

* Fix a crash when a AttributeInferenceError was raised when
  failing to find the real name in infer_import_from.

  Closes pylint-dev/pylint#4692


What's New in astroid 2.6.4?
============================
Release date: 2021-07-19

* Fix a crash when a StopIteration was raised when inferring
  a faulty function in a context manager.

  Closes pylint-dev/pylint#4723

What's New in astroid 2.6.3?
============================
Release date: 2021-07-19

* Added ``If.is_sys_guard`` and ``If.is_typing_guard`` helper methods

* Fix a bad inference type for yield values inside of a derived class.

  Closes pylint-dev/astroid#1090

* Fix a crash when the node is a 'Module' in the brain builtin inference

  Closes pylint-dev/pylint#4671

* Fix issues when inferring match variables

  Closes pylint-dev/pylint#4685

* Fix lookup for nested non-function scopes

* Fix issue that ``TypedDict`` instance wasn't callable.

  Closes pylint-dev/pylint#4715

* Add dependency on setuptools and a guard to prevent related exceptions.


What's New in astroid 2.6.2?
============================
Release date: 2021-06-30

* Fix a crash when the inference of the length of a node failed

  Closes pylint-dev/pylint#4633

* Fix unhandled StopIteration during inference, following the implementation
  of PEP479 in python 3.7+

  Closes pylint-dev/pylint#4631
  Closes #1080


What's New in astroid 2.6.1?
============================
Release date: 2021-06-29

* Fix issue with ``TypedDict`` for Python 3.9+

  Closes pylint-dev/pylint#4610


What's New in astroid 2.6.0?
============================
Release date: 2021-06-22

* Appveyor and travis are no longer used in the continuous integration

* ``setuptools_scm`` has been removed and replaced by ``tbump`` in order to not
  have hidden runtime dependencies to setuptools

* ``NodeNg``, the base node class, is now accessible from ``astroid`` or
  ``astroid.nodes`` as it can be used for typing.

* Update enum brain to improve inference of .name and .value dynamic class
  attributes

  Closes pylint-dev/pylint#1932
  Closes pylint-dev/pylint#2062
  Closes pylint-dev/pylint#2306

* Removed ``Repr``, ``Exec``, and ``Print`` nodes as the ``ast`` nodes
  they represented have been removed with the change to Python 3

* Deprecate ``Ellipsis`` node. It will be removed with the next minor release.
  Checkers that already support Python 3.8+ work without issues. It's only
  necessary to remove all references to the ``astroid.Ellipsis`` node.
  This changes will make development of checkers easier as the resulting tree for Ellipsis
  will no longer depend on the python version. **Background**: With Python 3.8 the
  ``ast.Ellipsis`` node, along with ``ast.Str``, ``ast.Bytes``, ``ast.Num``,
  and ``ast.NamedConstant`` were merged into ``ast.Constant``.

* Deprecated ``Index`` and ``ExtSlice`` nodes. They will be removed with the
  next minor release. Both are now part of the ``Subscript`` node.
  Checkers that already support Python 3.9+ work without issues.
  It's only necessary to remove all references to the ``astroid.Index`` and
  ``astroid.ExtSlice`` nodes. This change will make development of checkers
  easier as the resulting tree for ``ast.Subscript`` nodes will no longer
  depend on the python version. **Background**: With Python 3.9 ``ast.Index``
  and ``ast.ExtSlice`` were merged into the ``ast.Subscript`` node.

* Updated all Match nodes to be internally consistent.

* Add ``Pattern`` base class.


What's New in astroid 2.5.8?
============================
Release date: 2021-06-07

* Improve support for Pattern Matching

* Add lineno and col_offset for ``Keyword`` nodes and Python 3.9+

* Add global inference cache to speed up inference of long statement blocks

* Add a limit to the total number of nodes inferred indirectly as a result
  of inferring some node


What's New in astroid 2.5.7?
============================
Release date: 2021-05-09

* Fix six.with_metaclass transformation so it doesn't break user defined transformations.

* Fix detection of relative imports.
  Closes #930
  Closes pylint-dev/pylint#4186

* Fix inference of instance attributes defined in base classes

  Closes #932

* Update `infer_named_tuple` brain to reject namedtuple definitions
  that would raise ValueError

  Closes #920

* Do not set instance attributes on builtin object()

 Closes #945
 Closes pylint-dev/pylint#4232
 Closes pylint-dev/pylint#4221
 Closes pylint-dev/pylint#3970
 Closes pylint-dev/pylint#3595

* Fix some spurious cycles detected in ``context.path`` leading to more cases
  that can now be inferred

  Closes #926

* Add ``kind`` field to ``Const`` nodes, matching the structure of the built-in ast Const.
  The kind field is "u" if the literal is a u-prefixed string, and ``None`` otherwise.

  Closes #898

* Fix property inference in class contexts for properties defined on the metaclass

  Closes #940

* Update enum brain to fix definition of __members__ for subclass-defined Enums

  Closes pylint-dev/pylint#3535
  Closes pylint-dev/pylint#4358

* Update random brain to fix a crash with inference of some sequence elements

  Closes #922

* Fix inference of attributes defined in a base class that is an inner class

  Closes #904

* Allow inferring a return value of None for non-abstract empty functions and
  functions with no return statements (implicitly returning None)

  Closes #485

* scm_setuptools has been added to the packaging.

* Astroid's tags are now the standard form ``vX.Y.Z`` and not ``astroid-X.Y.Z`` anymore.

* Add initial support for Pattern Matching in Python 3.10

What's New in astroid 2.5.6?
============================
Release date: 2021-04-25

* Fix retro-compatibility issues with old version of pylint
  Closes pylint-dev/pylint#4402

What's New in astroid 2.5.5?
============================
Release date: 2021-04-24

* Fixes the discord link in the project urls of the package.
  Closes pylint-dev/pylint#4393

What's New in astroid 2.5.4?
============================
Release date: 2021-04-24

* The packaging is now done via setuptools exclusively. ``doc``, ``tests``, and ``Changelog`` are
  not packaged anymore - reducing the size of the package greatly.

* Debian packaging is now  (officially) done in https://salsa.debian.org/python-team/packages/astroid.

* ``__pkginfo__`` now  only contain ``__version__`` (also accessible with ``astroid.__version__``),
  other meta-information are still accessible with ``import importlib;metadata.metadata('astroid')``.

* Added inference tip for ``typing.Tuple`` alias

* Fix crash when evaluating ``typing.NamedTuple``

  Closes pylint-dev/pylint#4383

* COPYING was removed in favor of COPYING.LESSER and the latter was renamed to LICENSE to make more apparent
  that the code is licensed under LGPLv2 or later.

* Moved from appveyor and travis to Github Actions for continuous integration.

What's New in astroid 2.5.3?
============================
Release date: 2021-04-10

* Takes into account the fact that subscript inferring for a ClassDef may involve __class_getitem__ method

* Reworks the ``collections`` and ``typing`` brain so that pylint`s acceptance tests are fine.

  Closes pylint-dev/pylint#4206

* Use ``inference_tip`` for ``typing.TypedDict`` brain.

* Fix mro for classes that inherit from typing.Generic

* Add inference tip for typing.Generic and typing.Annotated with ``__class_getitem__``

  Closes pylint-dev/pylint#2822


What's New in astroid 2.5.2?
============================
Release date: 2021-03-28

* Detects `import numpy` as a valid `numpy` import.

  Closes pylint-dev/pylint#3974

* Iterate over ``Keywords`` when using ``ClassDef.get_children``

  Closes pylint-dev/pylint#3202

What's New in astroid 2.5.1?
============================
Release date: 2021-02-28

* The ``context.path`` is reverted to a set because otherwise it leads to false positives
  for non `numpy` functions.

  Closes #895 #899

* Don't transform dataclass ClassVars

* Improve typing.TypedDict inference

* Fix the `Duplicates found in MROs` false positive.

  Closes #905
  Closes pylint-dev/pylint#2717
  Closes pylint-dev/pylint#3247
  Closes pylint-dev/pylint#4093
  Closes pylint-dev/pylint#4131
  Closes pylint-dev/pylint#4145


What's New in astroid 2.5?
============================
Release date: 2021-02-15

* Adds `attr_fset` in the `PropertyModel` class.

  Fixes pylint-dev/pylint#3480

* Remove support for Python 3.5.
* Remove the runtime dependency on ``six``. The ``six`` brain remains in
  astroid.

  Fixes pylint-dev/astroid#863

* Enrich the ``brain_collection`` module so that ``__class_getitem__`` method is added to `deque` for
  ``python`` version above 3.9.

* The ``context.path`` is now a ``dict`` and the ``context.push`` method
  returns ``True`` if the node has been visited a certain amount of times.

  Close #669

* Adds a brain for type object so that it is possible to write `type[int]` in annotation.

  Fixes pylint-dev/pylint#4001

* Add ``__class_getitem__`` method to ``subprocess.Popen`` brain under Python 3.9 so that it is seen as subscriptable by pylint.

  Fixes pylint-dev/pylint#4034


* Adds `degrees`, `radians`, which are `numpy ufunc` functions, in the `numpy` brain. Adds `random` function in the `numpy.random` brain.

  Fixes pylint-dev/pylint#3856

* Fix deprecated importlib methods

  Closes #703

* Fix a crash in inference caused by `Uninferable` container elements

  Close #866

* Add `python 3.9` support.

* The flat attribute of ``numpy.ndarray`` is now inferred as an ``numpy.ndarray`` itself.
  It should be a ``numpy.flatiter`` instance, but this class is not yet available in the numpy brain.

  Fixes pylint-dev/pylint#3640

* Fix a bug for dunder methods inference of function objects

  Fixes #819

* Fixes a bug in the signature of the ``ndarray.__or__`` method,
  in the ``brain_numpy_ndarray.py`` module.

  Fixes #815

* Fixes a to-list cast bug in ``starred_assigned_stmts`` method, in the
  ``protocols.py`` module.

* Added a brain for ``hypothesis.strategies.composite``

* The transpose of a ``numpy.ndarray`` is also a ``numpy.ndarray``

  Fixes pylint-dev/pylint#3387

* Added a brain for ``sqlalchemy.orm.session``

* Separate string and bytes classes patching

  Fixes pylint-dev/pylint#3599

* Prevent recursion error for self referential length calls

  Close #777

* Added missing methods to the brain for ``mechanize``, to fix pylint false positives

  Close #793

* Added more supported parameters to ``subprocess.check_output``

* Fix recursion errors with pandas

  Fixes pylint-dev/pylint#2843
  Fixes pylint-dev/pylint#2811

* Added exception inference for `UnicodeDecodeError`

  Close pylint-dev/pylint#3639

* `FunctionDef.is_generator` properly handles `yield` nodes in `If` tests

  Close pylint-dev/pylint#3583

* Fixed exception-chaining error messages.

* Fix failure to infer base class type with multiple inheritance and qualified names

  Fixes #843

* Fix interpretation of ``six.with_metaclass`` class definitions.

  Fixes #713

* Reduce memory usage of astroid's module cache.

* Remove dependency on `imp`.

  Close #594
  Close #681

* Do not crash when encountering starred assignments in enums.

  Close #835

* Fix a crash in functools.partial inference when the arguments cannot be determined

  Close pylint-dev/pylint#3776

* Fix a crash caused by a lookup of a monkey-patched method

  Close pylint-dev/pylint#3686

* ``is_generator`` correctly considers `Yield` nodes in `AugAssign` nodes

  This fixes a false positive with the `assignment-from-no-return` pylint check.

  Close pylint-dev/pylint#3904

* Corrected the parent of function type comment nodes.

  These nodes used to be parented to their original ast.FunctionDef parent
  but are now correctly parented to their astroid.FunctionDef parent.

  Close pylint-dev/astroid#851


What's New in astroid 2.4.2?
============================
Release date: 2020-06-08

* `FunctionDef.is_generator` properly handles `yield` nodes in `While` tests

  Close pylint-dev/pylint#3519

* Properly construct the arguments of inferred property descriptors

  Close pylint-dev/pylint#3648


What's New in astroid 2.4.1?
============================
Release date: 2020-05-05

* Handle the case where the raw builder fails to retrieve the ``__all__`` attribute

  Close #772

* Restructure the AST parsing heuristic to always pick the same module

  Close pylint-dev/pylint#3540
  Close #773

* Changed setup.py to work with [distlib](https://pypi.org/project/distlib)

  Close #779

* Do not crash with SyntaxError when parsing namedtuples with invalid label

  Close pylint-dev/pylint#3549

* Protect against ``infer_call_result`` failing with `InferenceError` in `Super.getattr()`

  Close pylint-dev/pylint#3529


What's New in astroid 2.4.0?
============================
Release date: 2020-04-27

* Expose a ast_from_string method in AstroidManager, which will accept
  source code as a string and return the corresponding astroid object

  Closes pylint-dev/astroid#725

* ``BoundMethod.implicit_parameters`` returns a proper value for ``__new__``

  Close pylint-dev/pylint#2335

* Allow slots added dynamically to a class to still be inferred

  Close pylint-dev/pylint#2334

* Allow `FunctionDef.getattr` to look into both instance attrs and special attributes

  Close pylint-dev/pylint#1078

* Infer qualified ``classmethod`` as a classmethod.

  Close pylint-dev/pylint#3417

* Prevent a recursion error to happen when inferring the declared metaclass of a class

  Close #749

* Raise ``AttributeInferenceError`` when ``getattr()`` receives an empty name

  Close pylint-dev/pylint#2991

* Prevent a recursion error for self reference variables and `type()` calls.

  Close #199

* Do not infer the first argument of a staticmethod in a metaclass as the class itself

  Close pylint-dev/pylint#3032

* ``NodeNG.bool_value()`` gained an optional ``context`` parameter

  We need to pass an inference context downstream when inferring the boolean
  value of a node in order to prevent recursion errors and double inference.

  This fix prevents a recursion error with dask library.

  Close pylint-dev/pylint#2985

* Pass a context argument to ``astroid.Arguments`` to prevent recursion errors

  Close pylint-dev/pylint#3414

* Better inference of class and static methods decorated with custom methods

  Close pylint-dev/pylint#3209

* Reverse the order of decorators for `infer_subscript`

  `path_wrapper` needs to come first, followed by `raise_if_nothing_inferred`,
  otherwise we won't handle `StopIteration` correctly.

  Close #762

* Prevent a recursion error when inferring self-referential variables without definition

  Close pylint-dev/pylint#1285

* Numpy `datetime64.astype` return value is inferred as a `ndarray`.

  Close pylint-dev/pylint#3332

* Skip non ``Assign`` and ``AnnAssign`` nodes from enum reinterpretation

  Closes pylint-dev/pylint#3365

* Numpy ``ndarray`` attributes ``imag`` and ``real`` are now inferred as ``ndarray``.

  Close pylint-dev/pylint#3322

* Added a call to ``register_transform`` for all functions of the ``brain_numpy_core_multiarray``
  module in case the current node is an instance of ``astroid.Name``

  Close #666

* Use the parent of the node when inferring aug assign nodes instead of the statement

  Close pylint-dev/pylint#2911
  Close pylint-dev/pylint#3214

* Added some functions to the ``brain_numpy_core_umath`` module

  Close pylint-dev/pylint#3319

* Added some functions of the ``numpy.core.multiarray`` module

  Close pylint-dev/pylint#3208

* All the ``numpy ufunc`` functions derived now from a common class that
  implements the specific ``reduce``, ``accumulate``, ``reduceat``,
  ``outer`` and ``at`` methods.

  Close pylint-dev/pylint#2885

* ``nodes.Const.itered`` returns a list of ``Const`` nodes, not strings

  Close pylint-dev/pylint#3306

* The ``shape`` attribute of a ``numpy ndarray`` is now a ``ndarray``

  Close pylint-dev/pylint#3139

* Don't ignore special methods when inspecting gi classes

  Close #728

* Added transform for ``scipy.gaussian``

* Add support for inferring properties.

* Added a brain for ``responses``

* Allow inferring positional only arguments.

* Retry parsing a module that has invalid type comments

  It is possible for a module to use comments that might be interpreted
  as type comments by the `ast` library. We do not want to completely crash on those
  invalid type comments.

  Close #708

* Scope the inference to the current bound node when inferring instances of classes

  When inferring instances of classes from arguments, such as ``self``
  in a bound method, we could use as a hint the context's ``boundnode``,
  which indicates the instance from which the inference originated.
  As an example, a subclass that uses a parent's method which returns
  ``self``, will override the ``self`` to point to it instead of pointing
  to the parent class.

  Close pylint-dev/pylint#3157

* Add support for inferring exception instances in all contexts

  We were able to infer exception instances as ``ExceptionInstance``
  only for a handful of cases, but not all. ``ExceptionInstance`` has
  support for better inference of `.args` and other exception related
  attributes that normal instances do not have.
  This additional support should remove certain false positives related
  to ``.args`` and other exception attributes in ``pylint``.

  Close pylint-dev/pylint#2333

* Add more supported parameters to ``subprocess.check_output``

  Close #722

* Infer args unpacking of ``self``

  Certain stdlib modules use ``*args`` to encapsulate
  the ``self`` parameter, which results in uninferable
  instances given we rely on the presence of the ``self``
  argument to figure out the instance where we should be
  setting attributes.

  Close pylint-dev/pylint#3216

* Clean up setup.py

  Make pytest-runner a requirement only if running tests, similar to what was
  done with McCabe.

  Clean up the setup.py file, resolving a handful of minor warnings with it.

* Handle StopIteration error in infer_int.

  Close pylint-dev/pylint#3274

* Can access per argument type comments for positional only and keyword only arguments.

  The comments are accessed through through the new
  ``Arguments.type_comment_posonlyargs`` and
  ``Arguments.type_comment_kwonlyargs`` attributes respectively.

* Relax upper bound on `wrapt`

  Close #755

* Properly analyze CFFI compiled extensions.

What's New in astroid 2.3.2?
============================
Release date: 2019-10-18

* All type comments have as parent the corresponding `astroid` node

  Until now they had as parent the builtin `ast` node which meant
  we were operating with primitive objects instead of our own.

  Close pylint-dev/pylint#3174


* Pass an inference context to `metaclass()` when inferring an object type

  This should prevent a bunch of recursion errors happening in pylint.
  Also refactor the inference of `IfExp` nodes to use separate contexts
  for each potential branch.

  Close pylint-dev/pylint#3152
  Close pylint-dev/pylint#3159


What's New in astroid 2.3.1?
============================
Release date: 2019-09-30

* A transform for the builtin `dataclasses` module was added.

  This should address various `dataclasses` issues that were surfaced
  even more after the release of pylint 2.4.0.
  In the previous versions of `astroid`, annotated assign nodes were
  allowed to be retrieved via `getattr()` but that no longer happens
  with the latest `astroid` release, as those attribute are not actual
  attributes, but rather virtual ones, thus an operation such as `getattr()`
  does not make sense for them.

* Update attr brain to partly understand annotated attributes

  Close #656


What's New in astroid 2.3.0?
============================
Release date: 2019-09-24

* Add a brain tip for ``subprocess.check_output``

  Close #689

* Remove NodeNG.nearest method because of lack of usage in astroid and pylint.

  Close #691

* Allow importing wheel files. Close #541

* Annotated AST follows PEP8 coding style when converted to string.

* Fix a bug where defining a class using type() could cause a DuplicateBasesError.

  Close #644

* Dropped support for Python 3.4.

* Numpy brain support is improved.

  Numpy's fundamental type ``numpy.ndarray`` has its own brain : ``brain_numpy_ndarray`` and
  each numpy module that necessitates brain action has now its own numpy brain :

    - ``numpy.core.numeric``
    - ``numpy.core.function_base``
    - ``numpy.core.multiarray``
    - ``numpy.core.numeric``
    - ``numpy.core.numerictypes``
    - ``numpy.core.umath``
    - ``numpy.random.mtrand``

  Close pylint-dev/pylint#2865
  Close pylint-dev/pylint#2747
  Close pylint-dev/pylint#2721
  Close pylint-dev/pylint#2326
  Close pylint-dev/pylint#2021

* ``assert`` only functions are properly inferred as returning ``None``

  Close #668

* Add support for Python 3.8's `NamedExpr` nodes, which is part of assignment expressions.

  Close #674

* Added support for inferring `IfExp` nodes.

* Instances of exceptions are inferred as such when inferring in non-exception context

  This allows special inference support for exception attributes such as `.args`.

  Close pylint-dev/pylint#2333

* Drop a superfluous and wrong callcontext when inferring the result of a context manager

  Close pylint-dev/pylint#2859

* ``igetattr`` raises ``InferenceError`` on re-inference of the same object

  This prevents ``StopIteration`` from leaking when we encounter the same
  object in the current context, which could result in various ``RuntimeErrors``
  leaking in other parts of the inference.
  Until we get a global context per inference, the solution is sort of a hack,
  as with the suggested global context improvement, we could theoretically
  reuse the same inference object.

  Close #663

* Variable annotations can no longer be retrieved with `ClassDef.getattr`

  Unless they have an attached value, class variable annotations can no longer
  be retrieved with `ClassDef.getattr.`

* Improved builtin inference for ``tuple``, ``set``, ``frozenset``, ``list`` and ``dict``

  We were properly inferring these callables *only* if they had consts as
  values, but that is not the case most of the time. Instead we try to infer
  the values that their arguments can be and use them instead of assuming
  Const nodes all the time.

  Close pylint-dev/pylint#2841

* The last except handler wins when inferring variables bound in an except handler.

  Close pylint-dev/pylint#2777


* ``threading.Lock.locked()`` is properly recognized as a member of ``threading.Lock``

  Close pylint-dev/pylint#2791


* Fix recursion error involving ``len`` and self referential attributes

  Close pylint-dev/pylint#2736
  Close pylint-dev/pylint#2734
  Close pylint-dev/pylint#2740

* Can access per argument type comments through new ``Arguments.type_comment_args`` attribute.

  Close #665

* Fix being unable to access class attributes on a NamedTuple.

  Close pylint-dev/pylint#1628

* Fixed being unable to find distutils submodules by name when in a virtualenv.

  Close pylint-dev/pylint#73

What's New in astroid 2.2.0?
============================
Release date: 2019-02-27


* Fix a bug concerning inference of calls to numpy function that should not return Tuple or List instances.

 Close pylint-dev/pylint#2436

* Fix a bug where a method, which is a lambda built from a function, is not inferred as ``BoundMethod``

  Close pylint-dev/pylint#2594

* ``typed_ast`` gets installed for Python 3.7, meaning type comments can now work on 3.7.

* Fix a bug concerning inference of unary operators on numpy types.

  Close pylint-dev/pylint#2436 (first part)

* Fix a crash with ``typing.NamedTuple`` and empty fields. Close pylint-dev/pylint#2745

* Add a proper ``strerror`` inference to the ``OSError`` exceptions.

  Close pylint-dev/pylint#2553

* Support non-const nodes as values of Enum attributes.

  Close #612

* Fix a crash in the ``enum`` brain tip caused by non-assign members in class definitions.

  Close pylint-dev/pylint#2719

* ``brain_numpy`` returns an undefined type for ``numpy`` methods to avoid ``assignment-from-no-return``

  Close pylint-dev/pylint#2694

* Fix a bug where a call to a function that has been previously called via
  functools.partial was wrongly inferred

  Close pylint-dev/pylint#2588

* Fix a recursion error caused by inferring the ``slice`` builtin.

  Close pylint-dev/pylint#2667

* Remove the restriction that "old style classes" cannot have a MRO.

  This does not make sense any longer given that we run against Python 3
  code.
  Close pylint-dev/pylint#2701

* Added more builtin exceptions attributes. Close #580

* Add a registry for builtin exception models. Close pylint-dev/pylint#1432

* Add brain tips for `http.client`. Close pylint-dev/pylint#2687

* Prevent crashing when processing ``enums`` with mixed single and double quotes.

  Close pylint-dev/pylint#2676

* ``typing`` types have the `__args__` property. Close pylint-dev/pylint#2419

* Fix a bug where an Attribute used as a base class was triggering a crash

  Close #626

* Added special support for `enum.IntFlag`

  Close pylint-dev/pylint#2534

* Extend detection of data classes defined with attr

  Close #628

* Fix typo in description for brain_attrs


What's New in astroid 2.1.0?
============================
Release date: 2018-11-25

   * ``threading.Lock.acquire`` has the ``timeout`` parameter now.

     Close pylint-dev/pylint#2457

   * Pass parameters by keyword name when inferring sequences.

     Close pylint-dev/pylint#2526

   * Correct line numbering for f-strings for complex embedded expressions

     When a f-string contained a complex expression, such as an attribute access,
     we weren't cloning all the subtree of the f-string expression for attaching the correct
     line number. This problem is coming from the builtin AST parser which gives for the f-string
     and for its underlying elements the line number 1, but this is causing all sorts of bugs and
     problems in pylint, which expects correct line numbering.

     Close pylint-dev/pylint#2449

   * Add support for `argparse.Namespace`

     Close pylint-dev/pylint#2413

   * `async` functions are now inferred as `AsyncGenerator` when inferring their call result.

   * Filter out ``Uninferable`` when inferring the call result result of a class with an uninferable ``__call__`` method.

     Close pylint-dev/pylint#2434

   * Make compatible with AST changes in Python 3.8.

   * Subscript inference (e.g. "`a[i]`") now pays attention to multiple inferred values for value
     (e.g. "`a`") and slice (e.g. "`i`")

     Close #614

What's New in astroid 2.0.4?
============================
Release date: 2018-08-10

   * Make sure that assign nodes can find ``yield`` statements in their values

     Close pylint-dev/pylint#2400

What's New in astroid 2.0.3?
============================

Release date: 2018-08-08

   * The environment markers for PyPy were invalid.

What's New in astroid 2.0.2?
============================

Release date: 2018-08-01

   * Stop repeat inference attempt causing a RuntimeError in Python3.7

     Close pylint-dev/pylint#2317

   *  infer_call_result can raise InferenceError so make sure to handle that for the call sites
      where it is used

     infer_call_result started recently to raise InferenceError for objects for which it
     could not find any returns. Previously it was silently raising a StopIteration,
     which was especially leaking when calling builtin methods.
     Since it is after all an inference method, it is expected that it
     could raise an InferenceError rather than returning nothing.

     Close pylint-dev/pylint#2350


What's New in astroid 2.0.1?
============================

Release date: 2018-07-19

   * Released to clear an old wheel package on PyPI


What's New in astroid 2.0?
==========================

Release date: 2018-07-15

   * String representation of nodes takes in account precedence and associativity rules of operators.

   * Fix loading files with `modutils.load_from_module` when
     the path that contains it in `sys.path` is a symlink and
     the file is contained in a symlinked folder.

     Close #583

   * Reworking of the numpy brain dealing with numerictypes
     (use of inspect module to determine the class hierarchy of
     numpy.core.numerictypes module)

     Close pylint-dev/pylint#2140

   * Added inference support for starred nodes in for loops

     Close #146

   * Support unpacking for dicts in assignments

     Close #268

   * Add support for inferring functools.partial

     Close #125

   * Inference support for `dict.fromkeys`

     Close #110

   * `int()` builtin is inferred as returning integers.

     Close #150

   * `str()` builtin is inferred as returning strings.

     Close #148

   * DescriptorBoundMethod has the correct number of arguments defined.

   * Improvement of the numpy numeric types definition.

     Close pylint-dev/pylint#1971

   * Subclasses of *property* are now interpreted as properties

     Close pylint-dev/pylint#1601

   * AsStringRegexpPredicate has been removed.

     Use transform predicates instead of it.

   * Switched to using typed_ast for getting access to type comments

     As a side effect of this change, some nodes gained a new `type_annotation` attribute,
     which, if the type comments were correctly parsed, should contain a node object
     with the corresponding objects from the type comment.

   * typing.X[...] and typing.NewType are inferred as classes instead of instances.

   * Module.__path__ is now a list

     It used to be a string containing the path, but it doesn't reflect the situation
     on Python, where it is actually a list.

   * Fix a bug with namespace package's __path__ attribute.

     Close #528

   * Added brain tips for random.sample

     Part of pylint-dev/pylint#811

   * Add brain tip for `issubclass` builtin

     Close #101.

   * Fix submodule imports from six

     Close pylint-dev/pylint#1640

   * Fix missing __module__ and __qualname__ from class definition locals

     Close pylint-dev/pylint#1753

   * Fix a crash when __annotations__ access a parent's __init__ that does not have arguments

     Close #473

   * Fix multiple objects sharing the same InferenceContext.path causing uninferable results

     Close #483

   * Fix improper modification of col_offset, lineno upon inference of builtin functions

     Close pylint-dev/pylint#1839

   * Subprocess.Popen brain now knows of the args member

     Close pylint-dev/pylint#1860

   * add move_to_end method to collections.OrderedDict brain

     Close pylint-dev/pylint#1872

   * Include new hashlib classes added in python 3.6

   * Fix RecursionError for augmented assign

     Close #437, #447, #313, pylint-dev/pylint#1642, pylint-dev/pylint#1805, pylint-dev/pylint#1854, pylint-dev/pylint#1452

   * Add missing attrs special attribute

     Close pylint-dev/pylint#1884

   * Inference now understands the 'isinstance' builtin

     Close #98

   * Stop duplicate nodes with the same key values
     from appearing in dictionaries from dictionary unpacking.

     Close pylint-dev/pylint#1843

   * Fix ``contextlib.contextmanager`` inference for nested context managers

     Close #1699

   * Implement inference for len builtin

     Close #112

   * Add qname method to Super object preventing potential errors in upstream
     pylint

     Close #533

   * Stop astroid from getting stuck in an infinite loop if a function shares
     its name with its decorator

     Close #375

   * Fix issue with inherited __call__ improperly inferencing self

     Close #pylint-dev/pylint#2199

   * Fix __call__ precedence for classes with custom metaclasses

     Close pylint-dev/pylint#2159

   * Limit the maximum amount of interable result in an NodeNG.infer() call to
     100 by default for performance issues with variables with large amounts of
     possible values.

     The max inferable value can be tuned by setting the `max_inferable_values` flag on
     astroid.MANAGER.


What's New in astroid 1.6.0?
============================

Release date: 2017-12-15


   * When verifying duplicates classes in MRO, ignore on-the-fly generated classes

     Close pylint-dev/pylint#1706

   * Add brain tip for attrs library to prevent unsupported-assignment-operation false positives

	 Close pylint-dev/pylint#1698

   * file_stream was removed, since it was deprecated for three releases

     Instead one should use the .stream() method.

   * Vast improvements to numpy support

   * Add brain tips for curses

     Close pylint-dev/pylint#1703

   * Add brain tips for UUID.int

     Close pylint-dev/pylint#961

   * The result of using object.__new__ as class decorator is correctly inferred as instance

     Close #172

   * Enums created with functional syntax are now iterable

   * Enums created with functional syntax are now subscriptable

   * Don't crash when getting the string representation of BadUnaryOperationMessage

     In some cases, when the operand does not have a .name attribute,
     getting the string representation of a BadUnaryOperationMessage leads
     to a crash.

     Close pylint-dev/pylint#1563

   * Don't raise DuplicateBaseError when classes at different locations are used

     For instance, one can implement a namedtuple base class, which gets reused
     on a class with the same name later on in the file. Until now, we considered
     these two classes as being the same, because they shared the name, but in fact
     they are different, being created at different locations and through different
     means.

     Close pylint-dev/pylint#1458

    * The func form of namedtuples with keywords is now understood

      Close pylint-dev/pylint#1530

    * Fix inference for nested calls

    * Dunder class at method level is now inferred as the class of the method

      Close pylint-dev/pylint#1328

    * Stop most inference tip overwrites from happening by using
		predicates on existing inference_tip transforms.

      Close #472

    * Fix object.__new__(cls) calls in classmethods by using
        a context which has the proper boundnode for the given
        argument

        Close #404

    * Fix Pathlib type inference

        Close pylint-dev/pylint#224
        Close pylint-dev/pylint#1660



What's New in astroid 1.5.3?
============================

Release date: 2017-06-03


    * enum34 dependency is forced to be at least version 1.1.3. Fixes spurious
      bug related to enum classes being falsy in boolean context, which caused
      ``_Inconsistent Hierarchy_`` ``RuntimeError`` in ``singledispatch`` module.

      See links below for details:
        - http://bugs.python.org/issue26748
        - https://bitbucket.org/ambv/singledispatch/issues/8/inconsistent-hierarchy-with-enum
        - https://bitbucket.org/stoneleaf/enum34/commits/da50803651ab644e6fce66ebc85562f1117c344b

    * Do not raise an exception when uninferable value is unpacked in ``with`` statement.

    * Lock objects from ``threading`` module are now correctly recognised
      as context managers.


What's New in astroid 1.5.2?
============================

Release date: 2017-04-17


   * Basic support for the class form of typing.NamedTuple

   * mro() can be computed for classes with old style classes in the hierarchy



What's New in astroid 1.5.0?
============================

Release date: 2017-04-13


    * Arguments node gained a new attribute, ``kwonlyargs_annotations``

      This new attribute holds the annotations for the keyword-only
      arguments.

    * `namedtuple` inference now understands `rename` keyword argument

    * Classes can now know their definition-time arguments.

      Classes can support keyword arguments, which are passed when
      a class is constructed using ``__new__``.

    * Add support for inferring typing.NamedTuple.

    * ClassDef now supports __getitem__ inference through the metaclass.

    * getitem() method accepts nodes now, instead of Python objects.

    * Add support for explicit namespace packages, created with pkg_resources.

    * Add brain tips for _io.TextIOWrapper's buffer and raw attributes.

    * Add `returns` into the proper order in FunctionDef._astroid_fields

      The order is important, since it determines the last child,
      which in turn determines the last line number of a scoped node.

    * Add brain tips for functools.lru_cache.

    * New function, astroid.extract_node, exported out from astroid.test_utils.

    * Stop saving assignment locals in ExceptHandlers, when the context is a store.

      This fixes a tripping case, where the RHS of a ExceptHandler can be redefined
      by the LHS, leading to a local save. For instance, ``except KeyError, exceptions.IndexError``
      could result in a local save for IndexError as KeyError, resulting in potential unexpected
      inferences. Since we don't lose a lot, this syntax gets prohibited.

    * Fix a crash which occurred when the class of a namedtuple could not be inferred.

    * Add support for implicit namespace packages (PEP 420)

      This change involves a couple of modifications. First, we're relying on a
      spec finder protocol, inspired by importlib's ModuleSpec, for finding where
      a file or package is, using importlib's PathFinder as well, which enable
      us to discover namespace packages as well.
      This discovery is the center piece of the namespace package support,
      the other part being the construction of a dummy Module node whenever
      a namespace package root directory is requested during astroid's import
      references.

    * Introduce a special attributes model

      Through this model, astroid starts knowing special attributes of certain Python objects,
      such as functions, classes, super objects and so on. This was previously possible before,
      but now the lookup and the attributes themselves are separated into a new module,
      objectmodel.py, which describes, in a more comprehensive way, the data model of each
      object.

    * Exceptions have their own object model

      Some of exceptions's attributes, such as .args and .message,
      can't be inferred correctly since they are descriptors that get
      transformed into the proper objects at runtime. This can cause issues
      with the static analysis, since they are inferred as different than
      what's expected. Now when we're creating instances of exceptions,
      we're inferring a special object that knows how to transform those
      runtime attributes into the proper objects via a custom object model.
      Closes issue #81

    * dict.values, dict.keys and dict.items are properly
      inferred to their corresponding type, which also
      includes the proper containers for Python 3.

    * Fix a crash which occurred when a method had a same name as a builtin object,
      decorated at the same time by that builtin object ( a property for instance)

    * The inference can handle the case where the attribute is accessed through a subclass
      of a base class and the attribute is defined at the base class's level,
      by taking in consideration a redefinition in the subclass.

      This should fix https://github.com/pylint-dev/pylint/issues/432

    * Calling lambda methods (defined at class level) can be understood.

    * Don't take in consideration invalid assignments, especially when __slots__
      declaration forbids them.

      Close issue #332

    * Functional form of enums support accessing values through __call__.

    * Brain tips for the ssl library.

    * decoratornames() does not leak InferenceError anymore.

    * wildcard_imported_names() got replaced by _public_names()

      Our understanding of wildcard imports through __all__ was
      half baked to say at least, since we couldn't account for
      modifications of the list, which results in tons of false positives.
      Instead, we replaced it with _public_names(), a method which returns
      all the names that are publicly available in a module, that is that
      don't start with an underscore, even though this means that there
      is a possibility for other names to be leaked out even though
      they are not present in the __all__ variable.

      The method is private in 1.4.X.

    * unpack_infer raises InferenceError if it can't operate
      with the given sequences of nodes.

    * Support accessing properties with super().

    * Enforce strong updates per frames.

      When looking up a name in a scope, Scope.lookup will return
      only the values which will be reachable after execution, as seen
      in the following code:

           a = 1
           a = 2

      In this case it doesn't make sense to return two values, but
      only the last one.

    * Add support for inference on threading.Lock

      As a matter of fact, astroid can infer on threading.RLock,
      threading.Semaphore, but can't do it on threading.Lock (because it comes
      from an extension module).

    * pkg_resources brain tips are a bit more specific,
      by specifying proper returns.

    * The slots() method conflates all the slots from the ancestors
      into a list of current and parent slots.

      We're doing this because this is the right semantics of slots,
      they get inherited, as long as each parent defines a __slots__
      entry.

    * Some nodes got a new attribute, 'ctx', which tells in which context
      the said node was used.

      The possible values for the contexts are `Load` ('a'), `Del`
      ('del a'), `Store` ('a = 4') and the nodes that got the new
      attribute are Starred, Subscript, List and Tuple. Closes issue #267.

    * relative_to_absolute_name or methods calling it will now raise
      TooManyLevelsError when a relative import was trying to
      access something beyond the top-level package.

    * AstroidBuildingException is now AstroidBuildingError. The first
      name will exist until astroid 2.0.

    * Add two new exceptions, AstroidImportError and AstroidSyntaxError.
      They are subclasses of AstroidBuildingException and are raised when
      a module can't be imported from various reasons.
      Also do_import_module lets the errors to bubble up without converting
      them to InferenceError. This particular conversion happens only
      during the inference.

    * Revert to using printf-style formatting in as_string, in order
      to avoid a potential problem with encodings when using .format.
      Closes issue #273. Patch by notsqrt.

    * assigned_stmts methods have the same signature from now on.

      They used to have different signatures and each one made
      assumptions about what could be passed to other implementations,
      leading to various possible crashes when one or more arguments
      weren't given. Closes issue #277.

    * Fix metaclass detection, when multiple keyword arguments
      are used in class definition.

    * Add support for annotated variable assignments (PEP 526)

    * Starred expressions are now inferred correctly for tuple,
      list, set, and dictionary literals.

    * Support for asynchronous comprehensions introduced in Python 3.6.

      Fixes #399. See PEP530 for details.


What's New in astroid 1.4.1?
============================

Release date: 2015-11-29


    * Add support for handling Uninferable nodes when calling as_string

      Some object, for instance List or Tuple can have, after inference,
      Uninferable as their elements, happening when their components
      weren't couldn't be inferred properly. This means that as_string
      needs to cope with expecting Uninferable nodes part of the other
      nodes coming for a string transformation. The patch adds a visit
      method in AsString and ``accept`` on Yes / Uninferable nodes.
      Closes issue #270.



What's New in astroid 1.4.0?
============================

Release date: 2015-11-29


    * Class.getattr('__mro__') returns the actual MRO. Closes issue #128.

    * The logilab-common dependency is not needed anymore as the needed code
      was integrated into astroid.

    * Generated enum member stubs now support IntEnum and multiple
      base classes.

    * astroid.builder.AstroidBuilder.string_build and
      astroid.builder.AstroidBuilder.file_build are now raising
      AstroidBuildingException when the parsing of the string raises
      a SyntaxError.

    * Add brain tips for multiprocessing.Manager and
      multiprocessing.managers.SyncManager.

    * Add some fixes which enhances the Jython support.
      The fix mostly includes updates to modutils, which is
      modified in order to properly lookup paths from live objects,
      which ends in $py.class, not pyc as for Python 2,
      Closes issue #83.

    * The Generator objects inferred with `infer_call_result`
      from functions have as parent the function from which they
      are returned.

    * Add brain tips for multiprocessing post Python 3.4+,
      where the module level functions are retrieved with getattr
      from a context object, leading to many no-member errors
      in Pylint.

    * Understand partially the 3-argument form of `type`.
      The only change is that astroid understands members
      passed in as dictionaries as the third argument.

    * .slots() will return an empty list for classes with empty slots.
      Previously it returned None, which is the same value for
      classes without slots at all. This was changed in order
      to better reflect what's actually happening.

    * Improve the inference of Getattr nodes when dealing with
      abstract properties from the abc module.

      In astroid.bases.Instance._wrap_attr we had a detection
      code for properties, which basically inferred whatever
      a property returned, passing the results up the stack,
      to the igetattr() method. It handled only the builtin property
      but the new patch also handles a couple of other properties,
      such as abc.abstractproperty.

    * UnboundMethod.getattr calls the getattr of its _proxied object
      and doesn't call super(...) anymore.

      It previously crashed, since the first ancestor in its mro was
      bases.Proxy and bases.Proxy doesn't implement the .getattr method.
      Closes issue #91.

    * Don't hard fail when calling .mro() on a class which has
      combined both newstyle and old style classes. The class
      in question is actually newstyle (and the __mro__ can be
      retrieved using Python).

      .mro() fallbacks to using .ancestors() in that case.

    * Class.local_attr and Class.local_attr_ancestors uses internally
      a mro lookup, using .mro() method, if they can.

      That means for newstyle classes, when trying to lookup a member
      using one of these functions, the first one according to the
      mro will be returned. This reflects nicely the reality,
      but it can have as a drawback the fact that it is a behaviour
      change (the previous behaviour was incorrect though). Also,
      having bases which can return multiple values when inferred
      will not work with the new approach, because .mro() only
      retrieves the first value inferred from a base.

    * Expose an implicit_metaclass() method in Class. This will return
      a builtins.type instance for newstyle classes.

    * Add two new exceptions for handling MRO error cases. DuplicateBasesError
      is emitted when duplicate bases are found in a class,
      InconsistentMroError is raised when the method resolution is determined
      to be inconsistent. They share a common class, MroError, which
      is a subclass of ResolveError, meaning that this change is backwards
      compatible.

    * Classes aren't marked as interfaces anymore, in the `type` attribute.

    * Class.has_dynamic_getattr doesn't return True for special methods
      which aren't implemented in pure Python, as it is the case for extension modules.

      Since most likely the methods were coming from a live object, this implies
      that all of them will have __getattr__ and __getattribute__ present and it
      is wrong to consider that those methods were actually implemented.

    * Add basic support for understanding context managers.

      Currently, there's no way to understand whatever __enter__ returns in a
      context manager and what it is bound using the ``as`` keyword. With these changes,
      we can understand ``bar`` in ``with foo() as bar``, which will be the result of __enter__.

    * Add a new type of node, called *inference objects*. Inference objects are similar with
      AST nodes, but they can be obtained only after inference, so they can't be found
      inside the original AST tree. Their purpose is to handle at astroid level
      some operations which can't be handled when using brain transforms.
      For instance, the first object added is FrozenSet, which can be manipulated
      at astroid's level (inferred, itered etc). Code such as this 'frozenset((1,2))'
      will not return an Instance of frozenset, without having access to its
      content, but a new objects.FrozenSet, which can be used just as a nodes.Set.

    * Add a new *inference object* called Super, which also adds support for understanding
      super calls. astroid understands the zero-argument form of super, specific to
      Python 3, where the interpreter fills itself the arguments of the call. Also, we
      are understanding the 2-argument form of super, both for bounded lookups
      (super(X, instance)) as well as for unbounded lookups (super(X, Y)),
      having as well support for validating that the object-or-type is a subtype
      of the first argument. The unbounded form of super (one argument) is not
      understood, since it's useless in practice and should be removed from
      Python's specification. Closes issue #89.

    * Add inference support for getattr builtin. Now getattr builtins are
      properly understood. Closes issue #103.

    * Add inference support for hasattr builtin. Closes issue #102.

    * Add 'assert_equals' method in nose.tools's brain plugin.

    * Don't leak StopIteration when inferring invalid UnaryOps (+[], +None etc.).

    * Improve the inference of UnaryOperands.

      When inferring unary operands, astroid looks up the return value
      of __pos__, __neg__ and __invert__ to determine the inferred value
      of ``~node``, ``+node`` or ``-node``.

    * Improve the inference of six.moves, especially when using `from ... import ...`
      syntax. Also, we added a new fail import hook for six.moves, which fixes the
      import-error false positive from pylint. Closes issue #107.

    * Make the first steps towards detecting type errors for unary and binary
      operations.

      In exceptions, one object was added for holding information about a possible
      UnaryOp TypeError, object called `UnaryOperationError`. Even though the name
      suggests it's an exception, it's actually not one. When inferring UnaryOps,
      we use this special object to mark a possible TypeError,
      object which can be interpreted by pylint in order to emit a new warning.
      We are also exposing a new method for UnaryOps, called `type_errors`,
      which returns a list of UnaryOperationsError.

    * A new method was added to the AST nodes, 'bool_value'. It is used to deduce
      the value of a node when used in a boolean context, which is useful
      for both inference, as well as for data flow analysis, where we are interested
      in what branches will be followed when the program will be executed.
      `bool_value` returns True, False or YES, if the node's boolean value can't
      be deduced. The method is used when inferring the unary operand `not`.
      Thus, `not something` will result in calling `something.bool_value` and
      negating the result, if it is a boolean.

    * Add inference support for boolean operations (`and` and `not`).

    * Add inference support for the builtin `callable`.

    * astroid.inspector was moved to pylint.pyreverse, since
      it is the only known client of this module. No other change
      was made to the exported API.

    * astroid.utils.ASTWalker and astroid.utils.LocalsVisitor
      were moved to pylint.pyreverse.utils.

    * Add inference support for the builtin `bool`.

    * Add `igetattr` method to scoped_nodes.Function.

    * Add support for Python 3.5's MatMul operation: see PEP 465 for more
      details.

    * NotImplemented is detected properly now as being part of the
      builtins module. Previously trying to infer the Name(NotImplemented)
      returned an YES object.

    * Add astroid.helpers, a module of various useful utilities which don't
      belong yet into other components. Added *object_type*, a function
      which can be used to obtain the type of almost any astroid object,
      similar to how the builtin *type* works.

    * Understand the one-argument form of the builtin *type*.

      This uses the recently added *astroid.helpers.object_type* in order to
      retrieve the Python type of the first argument of the call.

    * Add helpers.is_supertype and helpers.is_subtype, two functions for
      checking if an object is a super/sub type of another.

    * Improve the inference of binary arithmetic operations (normal
      and augmented).

    * Add support for retrieving TypeErrors for binary arithmetic operations.

      The change is similar to what was added for UnaryOps: a new method
      called *type_errors* for both AugAssign and BinOp, which can be used
      to retrieve type errors occurred during inference. Also, a new
      exception object was added, BinaryOperationError.

    * Lambdas found at class level, which have a `self` argument, are considered
      BoundMethods when accessing them from instances of their class.

    * Add support for multiplication of tuples and lists with instances
      which provides an __index__ returning-int method.

    * Add support for indexing containers with instances which provides
      an __index__ returning-int method.

    * Star unpacking in assignments returns properly a list,
      not the individual components. Closes issue #138.

    * Add annotation support for function.as_string(). Closes issue #37.

    * Add support for indexing bytes on Python 3.

    * Add support for inferring subscript on instances, which will
      use __getitem__. Closes issue #124.

    * Add support for pkg_resources.declare_namespaces.

    * Move pyreverse specific modules and functionality back into pyreverse
      (astroid.manager.Project, astroid.manager.Manager.project_from_files).

    * Understand metaclasses added with six.add_metaclass decorator. Closes issue #129.

    * Add a new convenience API, `astroid.parse`, which can be used to retrieve
      an astroid AST from a source code string, similar to how ast.parse can be
      used to obtain a Python AST from a source string. This is the test_utils.build_module
      promoted to a public API.

    * do_import_module passes the proper relative_only flag if the level is higher
      than 1. This has the side effect that using `from .something import something`
      in a non-package will finally result in an import-error on Pylint's side.
      Until now relative_only was ignored, leading to the import of `something`,
      if it was globally available.

    * Add get_wrapping_class API to scoped_nodes, which can be used to
      retrieve the class that wraps a node.

    * Class.getattr looks by default in the implicit and the explicit metaclasses,
      which is `type` on Python 3.

      Closes issue #114.

    * There's a new separate step for transforms.

      Until now, the transforms were applied at the same time the tree was
      being built. This was problematic if the transform functions were
      using inference, since the inference was executed on a partially
      constructed tree, which led to failures when post-building
      information was needed (such as setting the _from_names
      for the From imports).
      Now there's a separate step for transforms, which are applied
      using transform.TransformVisitor.
      There's a couple of other related changes:

          * astroid.parse and AstroidBuilder gained a new parameter
            `apply_transforms`, which is a boolean flag, which will
            control if the transforms are applied. We do this because
            there are uses when the vanilla tree is wanted, without
            any implicit modification.

          * the transforms are also applied for builtin modules,
            as a side effect of the fact that transform visiting
            was moved in AstroidBuilder._post_build from
            AstroidBuilder._data_build.

      Closes issue #116.

    * Class._explicit_metaclass is now a public API, in the form of
      Class.declared_metaclass.

      Class.mro remains the de facto method for retrieving the metaclass
      of a class, which will also do an evaluation of what declared_metaclass
      returns.

    * Understand slices of tuples, lists, strings and instances with support
      for slices.

      Closes issue #137.

    * Add proper grammatical names for `inferred` and `ass_type` methods,
      namely `inferred` and `assign_type`.

      The old methods will raise PendingDeprecationWarning, being slated
      for removal in astroid 2.0.

    * Add new AST names in order to be similar to the ones
      from the builtin ast module.

      With this change, Getattr becomes Attributes, Backquote becomes
      Repr, Class is ClassDef, Function is FunctionDef,  Discard is Expr,
      CallFunc is Call, From is ImportFrom, AssName is AssignName
      and AssAttr is AssignAttr. The old names are maintained for backwards
      compatibility and they are interchangeable, in the sense that using
      Discard will use Expr under the hood and the implemented visit_discard
      in checkers will be called with Expr nodes instead. The AST does not
      contain the old nodes, only the interoperability between them hides this
      fact. Recommendations to move to the new nodes are emitted accordingly,
      the old names will be removed in astroid 2.0.

    * Add support for understanding class creation using `type.__new__(mcs, name, bases, attrs)``

      Until now, inferring this kind of calls resulted in Instances, not in classes,
      since astroid didn't understand that the presence of the metaclass in the call
      leads to a class creating, not to an instance creation.

    * Understand the `slice` builtin. Closes issue #184.

    * Add brain tips for numpy.core, which should fix Pylint's #453.

    * Add a new node, DictUnpack, which is used to represent the unpacking
      of a dictionary into another dictionary, using PEP 448 specific syntax
      ``({1:2, **{2:3})``

      This is a different approach than what the builtin ast module does,
      since it just uses None to represent this kind of operation,
      which seems conceptually wrong, due to the fact the AST contains
      non-AST nodes. Closes issue #206.




What's New in astroid 1.3.6?
============================

Release date: 2015-03-14


    * Class.slots raises NotImplementedError for old style classes.
      Closes issue #67.

    * Add a new option to AstroidManager, `optimize_ast`, which
      controls if peephole optimizer should be enabled or not.
      This prevents a regression, where the visit_binop method
      wasn't called anymore with astroid 1.3.5, due to the differences
      in the resulting AST. Closes issue #82.



What's New in astroid 1.3.5?
============================

Release date: 2015-03-11


    * Add the ability to optimize small ast subtrees,
      with the first use in the optimization of multiple
      BinOp nodes. This removes recursivity in the rebuilder
      when dealing with a lot of small strings joined by the
      addition operator. Closes issue #59.

    * Obtain the methods for the nose brain tip through an
      unittest.TestCase instance. Closes Pylint issue #457.

    * Fix a crash which occurred when a class was the ancestor
      of itself. Closes issue #78.

    * Improve the scope_lookup method for Classes regarding qualified
      objects, with an attribute name exactly as one provided in the
      class itself.

      For example, a class containing an attribute 'first',
      which was also an import and which had, as a base, a qualified name
      or a Gettattr node, in the form 'module.first', then Pylint would
      have inferred the `first` name as the function from the Class,
      not the import. Closes Pylint issue #466.

    * Implement the assigned_stmts operation for Starred nodes,
      which was omitted when support for Python 3 was added in astroid.
      Closes issue #36.



What's New in astroid 1.3.4?
============================

Release date: 2015-01-17


    * Get the first element from the method list when obtaining
      the functions from nose.tools.trivial. Closes Pylint issue #448.


What's New in astroid 1.3.3?
============================

Release date: 2015-01-16


    * Restore file_stream to a property, but deprecate it in favour of
      the newly added method Module.stream. By using a method instead of a
      property, it will be easier to properly close the file right
      after it is used, which will ensure that no file descriptors are
      leaked. Until now, due to the fact that a module was cached,
      it was not possible to close the file_stream anywhere.
      file_stream will start emitting PendingDeprecationWarnings in
      astroid 1.4, DeprecationWarnings in astroid 1.5 and it will
      be finally removed in astroid 1.6.

    * Add inference tips for 'tuple', 'list', 'dict' and 'set' builtins.

    * Add brain definition for most string and unicode methods

    * Changed the API for Class.slots. It returns None when the class
      doesn't define any slots. Previously, for both the cases where
      the class didn't have slots defined and when it had an empty list
      of slots, Class.slots returned an empty list.

    * Add a new method to Class nodes, 'mro', for obtaining the
      the method resolution order of the class.

    * Add brain tips for six.moves. Closes issue #63.

    * Improve the detection for functions decorated with decorators
      which returns static or class methods.

    * .slots() can contain unicode strings on Python 2.

    * Add inference tips for nose.tools.



What's New in astroid 1.3.2?
============================

Release date: 2014-11-22


    * Fixed a crash with invalid subscript index.

    * Implement proper base class semantics for Python 3, where
      every class derives from object.

    * Allow more fine-grained control over C extension loading
      in the manager.


What's New in astroid 1.3.1?
============================

Release date: 2014-11-21


    * Fixed a crash issue with the pytest brain module.


What's New in astroid 1.3.0?
============================

Release date: 2014-11-20


    * Fix a maximum recursion error occurred during the inference,
      where statements with the same name weren't filtered properly.
      Closes pylint issue #295.

    * Check that EmptyNode has an underlying object in
      EmptyNode.has_underlying_object.

    * Simplify the understanding of enum members.

    * Fix an infinite loop with decorator call chain inference,
      where the decorator returns itself. Closes issue #50.

    * Various speed improvements. Patch by Alex Munroe.

    * Add pytest brain plugin. Patch by Robbie Coomber.

    * Support for Python versions < 2.7 has been dropped, and the
      source has been made compatible with Python 2 and 3. Running
      2to3 on installation for Python 3 is not needed anymore.

    * astroid now depends on six.

    * modutils._module_file opens __init__.py in binary mode.
      Closes issues #51 and #13.

    * Only C extensions from trusted sources (the standard library)
      are loaded into the examining Python process to build an AST
      from the live module.

    * Path names on case-insensitive filesystems are now properly
      handled. This fixes the stdlib detection code on Windows.

    * Metaclass-generating functions like six.with_metaclass
      are now supported via some explicit detection code.

    * astroid.register_module_extender has been added to generalize
      the support for module extenders as used by many brain plugins.

    * brain plugins can now register hooks to handle failed imports,
      as done by the gobject-introspection plugin.

    * The modules have been moved to a separate package directory,
      `setup.py develop` now works correctly.



What's New in astroid 1.2.1?
============================

Release date: 2014-08-24


    * Fix a crash occurred when inferring decorator call chain.
      Closes issue #42.

    * Set the parent of vararg and kwarg nodes when inferring them.
      Closes issue #43.

    * namedtuple inference knows about '_fields' attribute.

    * enum members knows about the methods from the enum class.

    * Name inference will lookup in the parent function
      of the current scope, in case searching in the current scope
      fails.

    * Inference of the functional form of the enums takes into
      consideration the various inputs that enums accepts.

    * The inference engine handles binary operations (add, mul etc.)
      between instances.

    * Fix an infinite loop in the inference, by returning a copy
      of instance attributes, when calling 'instance_attr'.
      Closes issue #34 (patch by Emile Anclin).

    * Don't crash when trying to infer unbound object.__new__ call.
      Closes issue #11.


What's New in astroid 1.2.0?
============================

Release date: 2014-07-25


    * Function nodes can detect decorator call chain and see if they are
      decorated with builtin descriptors (`classmethod` and `staticmethod`).

    * infer_call_result called on a subtype of the builtin type will now
      return a new `Class` rather than an `Instance`.

    * `Class.metaclass()` now handles module-level __metaclass__ declaration
      on python 2, and no longer looks at the __metaclass__ class attribute on
      python 3.

    * Function nodes can detect if they are decorated with subclasses
      of builtin descriptors when determining their type
      (`classmethod` and `staticmethod`).

    * Add `slots` method to `Class` nodes, for retrieving
      the list of valid slots it defines.

    * Expose function annotation to astroid: `Arguments` node
      exposes 'varargannotation', 'kwargannotation' and 'annotations'
      attributes, while `Function` node has the 'returns' attribute.

    * Backported most of the logilab.common.modutils module there, as
      most things there are for pylint/astroid only and we want to be
      able to fix them without requiring a new logilab.common release

    * Fix names grabbed using wildcard import in "absolute import mode"
      (ie with absolute_import activated from the __future__ or with
      python 3). Fix pylint issue #58.

    * Add support in pylint-brain for understanding enum classes.


What's New in astroid 1.1.1?
============================

Release date: 2014-04-30

    * `Class.metaclass()` looks in ancestors when the current class
      does not define explicitly a metaclass.

    * Do not cache modules if a module with the same qname is already
      known, and only return cached modules if both name and filepath
      match. Fixes pylint Bitbucket issue #136.


What's New in astroid 1.1.0?
============================

Release date: 2014-04-18

    * All class nodes are marked as new style classes for Py3k.

    * Add a `metaclass` function to `Class` nodes to
      retrieve their metaclass.

    * Add a new YieldFrom node.

    * Add support for inferring arguments to namedtuple invocations.

    * Make sure that objects returned for namedtuple
      inference have parents.

    * Don't crash when inferring nodes from `with` clauses
      with multiple context managers. Closes #18.

    * Don't crash when a class has some __call__ method that is not
      inferable. Closes #17.

    * Unwrap instances found in `.ancestors()`, by using their _proxied
      class.




What's New in astroid 1.0.1?
============================

Release date: 2013-10-18

    * fix py3k/windows installation issue (issue #4)

    * fix bug with namedtuple inference (issue #3)

    * get back gobject introspection from pylint-brain

    * fix some test failures under pypy and py3.3, though there is one remaining
      in each of these platform (2.7 tests are all green)




What's New in astroid 1.0.0?
=============================

Release date: 2013-07-29

    * Fix some omissions in py2stdlib's version of hashlib and
      add a small test for it.

    * Properly recognize methods annotated with abc.abstract{property,method}
      as abstract.

    * Allow transformation functions on any node, providing a
      ``register_transform`` function on the manager instead of the
      ``register_transformer`` to make it more flexible wrt node selection

    * Use the new transformation API to provide support for namedtuple
      (actually in pylint-brain, closes #8766)

    * Added the test_utils module for building ASTs and
      extracting deeply nested nodes for easier testing.

    * Add support for py3k's keyword only arguments (PEP 3102)

    * RENAME THE PROJECT to astroid




What's New in astroid 0.24.3?
=============================

Release date: 2013-04-16

    * #124360 [py3.3]: Don't crash on 'yield from' nodes

    * #123062 [pylint-brain]: Use correct names for keywords for urlparse

    * #123056 [pylint-brain]: Add missing methods for hashlib

    * #123068: Fix inference for generator methods to correctly handle yields
      in lambdas.

    * #123068: Make sure .as_string() returns valid code for yields in
      expressions.

    * #47957: Set literals are now correctly treated as inference leaves.

    * #123074: Add support for inference of subscript operations on dict
      literals.




What's New in astroid 0.24.2?
=============================

Release date: 2013-02-27

    * pylint-brain: more subprocess.Popen faking (see #46273)

    * #109562 [jython]: java modules have no __doc__, causing crash

    * #120646 [py3]: fix for python3.3 _ast changes which may cause crash

    * #109988 [py3]: test fixes




What's New in astroid 0.24.1?
=============================

Release date: 2012-10-05

    * #106191: fix __future__ absolute import w/ From node

    * #50395: fix function fromlineno when some decorator is splited on
      multiple lines (patch by Mark Gius)

    * #92362: fix pyreverse crash on relative import

    * #104041: fix crash 'module object has no file_encoding attribute'

    * #4294 (pylint-brain): bad inference on mechanize.Browser.open

    * #46273 (pylint-brain): bad inference subprocess.Popen.communicate




What's New in astroid 0.24.0?
=============================

Release date: 2012-07-18

    * include pylint brain extension, describing some stuff not properly understood until then.
      (#100013, #53049, #23986, #72355)

    * #99583: fix raw_building.object_build for pypy implementation

    * use `open` rather than `file` in scoped_nodes as 2to3 miss it




What's New in astroid 0.23.1?
=============================

Release date: 2011-12-08

    * #62295: avoid "OSError: Too many open files" by moving
      .file_stream as a Module property opening the file only when needed

    * Lambda nodes should have a `name` attribute

    * only call transformers if modname specified




What's New in astroid 0.23.0?
=============================

Release date: 2011-10-07

    * #77187: ancestor() only returns the first class when inheriting
      from two classes coming from the same module

    * #76159: putting module's parent directory on the path causes problems
      linting when file names clash

    * #74746: should return empty module when __main__ is imported (patch by
      google)

    * #74748: getitem protocol return constant value instead of a Const node
      (patch by google)

    * #77188: support lgc.decorators.classproperty

    * #77253: provide a way for user code to register astng "transformers"
      using manager.register_transformer(callable) where callable will be
      called after an astng has been built and given the related module node
      as argument




What's New in astroid 0.22.0?
=============================

Release date: 2011-07-18

    * added column offset information on nodes (patch by fawce)

    * #70497: Crash on AttributeError: 'NoneType' object has no attribute '_infer_name'

    * #70381: IndentationError in import causes crash

    * #70565: absolute imports treated as relative (patch by Jacek Konieczny)

    * #70494: fix file encoding detection with python2.x

    * py3k: __builtin__ module renamed to builtins, we should consider this to properly
      build ast for builtin objects




What's New in astroid 0.21.1?
=============================

Release date: 2011-01-11

    * python3: handle file encoding; fix a lot of tests

    * fix #52006: "True" and "False" can be assigned as variable in Python2x

    * fix #8847: pylint doesn't understand function attributes at all

    * fix #8774: iterator / generator / next method

    * fix bad building of ast from living object w/ container classes
      (eg dict, set, list, tuple): contained elements should be turned to
      ast as well (not doing it will much probably cause crash later)

    * somewhat fix #57299 and other similar issue: Exception when
      trying to validate file using PyQt's PyQt4.QtCore module: we can't
      do much about it but at least catch such exception to avoid crash




What's New in astroid 0.21.0?
=============================

Release date: 2010-11-15

    * python3.x: first python3.x release

    * fix #37105: Crash on AttributeError: 'NoneType' object has no attribute '_infer_name'

    * python2.4: drop python < 2.5 support




What's New in astroid 0.20.4?
=============================

Release date: 2010-10-27

    * fix #37868 #37665 #33638 #37909: import problems with absolute_import_activated

    * fix #8969: false positive when importing from zip-safe eggs

    * fix #46131: minimal class decorator support

    * minimal python2.7 support (dict and set comprehension)

    * important progress on Py3k compatibility




What's New in astroid 0.20.3?
=============================

Release date: 2010-09-28

    * restored python 2.3 compatibility

    * fix #45959: AttributeError: 'NoneType' object has no attribute 'frame', due
       to handling of __class__ when importing from living object (because of missing
       source code or C-compiled object)




What's New in astroid 0.20.2?
=============================

Release date: 2010-09-10

    * fix astng building bug: we've to set module.package flag at the node
      creation time otherwise we'll miss this information when inferring relative
      import during the build process (this should fix for instance some problems
      with numpy)

    * added __subclasses__ to special class attribute

    * fix Class.interfaces so that no InferenceError raised on empty __implements__

    * yield YES on multiplication of tuple/list with non valid operand


What's New in astroid 0.20.1?
=============================

Release date: 2010-05-11

    * fix licensing to LGPL

    * add ALL_NODES_CLASSES constant to nodes module

    * nodes redirection cleanup (possible since refactoring)

    * bug fix for python < 2.5: add Delete node on Subscript nodes if we are in a
      del context


What's New in astroid 0.20.0?
=============================

Release date: 2010-03-22

    * fix #20464: raises ?TypeError: '_Yes' object is not iterable? on list inference

    * fix #19882: pylint hangs

    * fix #20759: crash on pyreverse UNARY_OP_METHOD KeyError '~'

    * fix #20760: crash on pyreverse : AttributeError: 'Subscript'
      object has no attribute 'infer_lhs'

    * fix #21980: [Python-modules-team] Bug#573229 : Pylint hangs;
      improving the cache yields a speed improvement on big projects

    * major refactoring: rebuild the tree instead of modify / monkey patching

    * fix #19641: "maximum recursion depth exceeded" messages w/ python 2.6
      this was introduced by a refactoring

    * Ned Batchelder patch to properly import eggs with Windows line
      endings.  This fixes a problem with pylint not being able to
      import setuptools.

    * Winfried Plapper patches fixing .op attribute value for AugAssign nodes,
      visit_ifexp in nodes_as_string

    * Edward K. Ream / Tom Fleck patch closes #19641 (maximum recursion depth
      exceeded" messages w/ python 2.6), see https://bugs.launchpad.net/pylint/+bug/456870




What's New in astroid 0.19.3?
=============================

Release date: 2009-12-18

    * fix name error making 0.19.2 almost useless




What's New in astroid 0.19.2?
=============================

Release date: 2009-12-18

    * fix #18773: inference bug on class member (due to bad handling of instance
      / class nodes "bounded" to method calls)

    * fix #9515: strange message for non-class "Class baz has no egg member" (due to
      bad inference of function call)

    * fix #18953: inference fails with augmented assignment (special case for augmented
      assignment in infer_ass method)

    * fix #13944: false positive for class/instance attributes (Instance.getattr
      should return assign nodes on instance classes as well as instance.

    * include spelling fixes provided by Dotan Barak




What's New in astroid 0.19.1?
=============================

Release date: 2009-08-27

    * fix #8771: crash on yield expression

    * fix #10024: line numbering bug with try/except/finally

    * fix #10020: when building from living object, __name__ may be None

    * fix #9891: help(logilab.astng) throws TypeError

    * fix #9588: false positive E1101 for augmented assignment




What's New in astroid 0.19.0?
=============================

Release date: 2009-03-25

    * fixed python 2.6 issue (tests ok w/ 2.4, 2.5, 2.6. Anyone using 2.2 / 2.3
      to tell us if it works?)

    * some understanding of the __builtin__.property decorator

    * inference: introduce UnboundMethod / rename InstanceMethod to BoundMethod




What's New in astroid 0.18.0?
=============================

Release date: 2009-03-19

    * major api / tree structure changes to make it works with compiler *and*
      python >= 2.5 _ast module

    * cleanup and refactoring on the way




What's New in astroid 0.17.4?
=============================

Release date: 2008-11-19

    * fix #6015: filter statements bug triggering W0631 false positive in pylint

    * fix #5571: Function.is_method() should return False on module level
      functions decorated by staticmethod/classmethod (avoid some crash in pylint)

    * fix #5010: understand python 2.5 explicit relative imports




What's New in astroid 0.17.3?
=============================

Release date: 2008-09-10

    * fix #5889: astng crash on certain pyreverse projects

    * fix bug w/ loop assignment in .lookup

    * apply Maarten patch fixing a crash on TryFinalaly.block_range and fixing
      'else'/'final' block line detection




What's New in astroid 0.17.2?
=============================

Release date: 2008-01-14

    * "with" statement support, patch provided by Brian Hawthorne

    * fixed recursion arguments in nodes_of_class method as notified by
      Dave Borowitz

    * new InstanceMethod node introduced to wrap bound method (e.g. Function
      node), patch provided by Dave Borowitz




What's New in astroid 0.17.1?
=============================

Release date: 2007-06-07

    * fix #3651: crash when callable as default arg

    * fix #3670: subscription inference crash in some cases

    * fix #3673: Lambda instance has no attribute 'pytype'

    * fix crash with chained "import as"

    * fix crash on numpy

    * fix potential InfiniteRecursion error with builtin objects

    * include patch from Marien Zwart fixing some test / py 2.5

    * be more error resilient when accessing living objects from external
      code in the manager




What's New in astroid 0.17.0?
=============================

Release date: 2007-02-22

    * api change to be able to infer using a context (used to infer function call
      result only for now)

    * slightly better inference on astng built from living object by trying to infer
      dummy nodes (able to infer 'help' builtin for instance)

    * external attribute definition support

    * basic math operation inference

    * new pytype method on possibly inferred node (e.g. module, classes, const...)

    * fix a living object astng building bug, which was making "open" uninferable

    * fix lookup of name in method bug (#3289)

    * fix decorator lookup bug (#3261)




What's New in astroid 0.16.3?
=============================

Release date: 2006-11-23

    * enhance inference for the subscription notation (motivated by a patch from Amaury)
      and for unary sub/add




What's New in astroid 0.16.2?
=============================

Release date: 2006-11-15

    * grrr, fixed python 2.3 incompatibility introduced by generator expression
      scope handling

    * upgrade to avoid warnings with logilab-common 0.21.0 (on which now
      depends so)

    * backported astutils module from logilab-common




What's New in astroid 0.16.1?
=============================

Release date: 2006-09-25

    * python 2.5 support, patch provided by Marien Zwart

    * fix [Class|Module].block_range method (this fixes pylint's inline
      disabling of messages on classes/modules)

    * handle class.__bases__ and class.__mro__ (proper metaclass handling
      still needed though)

    * drop python2.2 support: remove code that was working around python2.2

    * fixed generator expression scope bug

    * patch transformer to extract correct line information




What's New in astroid 0.16.0?
=============================

Release date: 2006-04-19

    * fix living object building to consider classes such as property as
      a class instead of a data descriptor

    * fix multiple assignment inference which was discarding some solutions

    * added some line manipulation methods to handle pylint's block messages
      control feature (Node.last_source_line(), None.block_range(lineno)




What's New in astroid 0.15.1?
=============================

Release date: 2006-03-10

    * fix avoiding to load everything from living objects... Thanks Amaury!

    * fix a possible NameError in Instance.infer_call_result




What's New in astroid 0.15.0?
=============================

Release date: 2006-03-06

    * fix possible infinite recursion on global statements (close #10342)
      and in various other cases...

    * fix locals/globals interactions when the global statement is used
      (close #10434)

    * multiple inference related bug fixes

    * associate List, Tuple and Dict and Const nodes to their respective
      classes

    * new .ass_type method on assignment related node, returning the
      assignment type node (Assign, For, ListCompFor, GenExprFor,
      TryExcept)

    * more API refactoring... .resolve method has disappeared, now you
      have .ilookup on every nodes and .getattr/.igetattr on node
      supporting the attribute protocol

    * introduced a YES object that may be returned when there is ambiguity
      on an inference path (typically function call when we don't know
      arguments value)

    * builder try to instantiate builtin exceptions subclasses to get their
      instance attribute




What's New in astroid 0.14.0?
=============================

Release date: 2006-01-10

    * some major inference improvements and refactoring ! The drawback is
      the introduction of some non backward compatible change in the API
      but it's imho much cleaner and powerful now :)

    * new boolean property .newstyle on Class nodes (implements #10073)

    * new .import_module method on Module node to help in .resolve
      refactoring

    * .instance_attrs has list of assignments to instance attribute
      dictionary as value instead of one

    * added missing GenExprIf and GenExprInner nodes, and implements
      as_string for each generator expression related nodes

    * specifically catch KeyboardInterrupt to reraise it in some places

    * fix so that module names are always absolute

    * fix .resolve on package where a subpackage is imported in the
      __init__ file

    * fix a bug regarding construction of Function node from living object
      with earlier version of python 2.4

    * fix a NameError on Import and From self_resolve method

    * fix a bug occurring when building an astng from a living object with
      a property

    * lint fixes




What's New in astroid 0.13.1?
=============================

Release date: 2005-11-07

    * fix bug on building from living module the same object in
      encountered more than once time (e.g. builtins.object) (close #10069)

    * fix bug in Class.ancestors() regarding inner classes (close #10072)

    * fix .self_resolve() on From and Module nodes to handle package
      precedence over module (close #10066)

    * locals dict for package contains __path__ definition (close #10065)

    * astng provide GenExpr and GenExprFor nodes with python >= 2.4
      (close #10063)

    * fix python2.2 compatibility (close #9922)

    * link .__contains__ to .has_key on scoped node to speed up execution

    * remove no more necessary .module_object() method on From and Module
      nodes

    * normalize parser.ParserError to SyntaxError with python 2.2




What's New in astroid 0.13.0?
=============================

Release date: 2005-10-21

    * .locals  and .globals on scoped node handle now a list of references
       to each assignment statements instead of a single reference to the
       first assignment statement.

    * fix bug with manager.astng_from_module_name when a context file is
      given (notably fix ZODB 3.4 crash with pylint/pyreverse)

    * fix Compare.as_string method

    * fix bug with lambda object missing the "type" attribute

    * some minor refactoring

    * This package has been extracted from the logilab-common package, which
      will be kept for some time for backward compatibility but will no
      longer be maintained (this explains that this package is starting with
      the 0.13 version number, since the fork occurs with the version
      released in logilab-common 0.12).
