Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial Update #7430

Merged
merged 9 commits into from
Jun 13, 2020
Merged

Initial Update #7430

merged 9 commits into from
Jun 13, 2020

Conversation

pyup-bot
Copy link
Contributor

This PR sets up pyup.io on this repo and updates all dependencies at once, in a single branch.

Subsequent pull requests will update one dependency at a time, each in their own branch. If you want to start with that right away, simply close this PR.

Update astroid from 2.4.2 to 2.4.2.

Changelog

2.4.2

============================
Release Date: TBA

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

Close PyCQA/pylint3519

* Properly construct the arguments of infered property descriptors

Close PyCQA/pylint3648

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 PyCQA/pylint3540
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 PyCQA/pylint3549

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

Close PyCQA/pylint3529

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 PyCQA/astroid725

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

Close PyCQA/pylint2335

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

Close PyCQA/pylint2334

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

Close PyCQA/pylint1078

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

Close PyCQA/pylint3417

* 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 PyCQA/pylint2991

* 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 PyCQA/pylint3032

* ``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 PyCQA/pylint2985

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

Close PyCQA/pylint3414

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

Close PyCQA/pylint3209

* 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 PyCQA/pylint1285

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

Close PyCQA/pylint3332

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

Closes PyCQA/pylint3365

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

Close PyCQA/pylint3322

* 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 PyCQA/pylint2911
Close PyCQA/pylint3214

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

Close PyCQA/pylint3319

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

Close PyCQA/pylint3208

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

Close PyCQA/pylint2885

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

Close PyCQA/pylint3306

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

Close PyCQA/pylint3139

* Don't ignore special methods when inspecting gi classes

Close 728

* Added transform for ``scipy.gaussian``

* Add suport 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 PyCQA/pylint3157

* 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 PyCQA/pylint2333

* 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 PyCQA/pylint3216

* 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 PyCQA/pylint3274

* 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.

2.3.2

============================
Release Date: TBA

* 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 PyCQA/pylint3174


* 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 PyCQA/pylint3152
Close PyCQA/pylint3159

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

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 PyCQA/pylint2865
Close PyCQA/pylint2747
Close PyCQA/pylint2721
Close PyCQA/pylint2326
Close PyCQA/pylint2021

* ``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 PyCQA/pylint2333

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

Close PyCQA/pylint2859

* ``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 PyCQA/pylint2841

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

Close PyCQA/pylint2777


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

Close PyCQA/pylint2791


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

Close PyCQA/pylint2736
Close PyCQA/pylint2734
Close PyCQA/pylint2740

* 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 PyCQA/pylint1628

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

Close PyCQA/pylint73

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 PyCQA/pylint2436

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

Close PyCQA/pylint2594

* ``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 PyCQA/pylint2436 (first part)

* Fix a crash with ``typing.NamedTuple`` and empty fields. Close PyCQA/pylint2745

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

Close PyCQA/pylint2553

* 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 PyCQA/pylint2719

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

Close PyCQA/pylint2694

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

Close PyCQA/pylint2588

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

Close PyCQA/pylint2667

* 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 PyCQA/pylint2701

* Added more builtin exceptions attributes. Close 580

* Add a registry for builtin exception models. Close PyCQA/pylint1432

* Add brain tips for `http.client`. Close PyCQA/pylint2687

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

Close PyCQA/pylint2676

* ``typing`` types have the `__args__` property. Close PyCQA/pylint2419

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

Close 626

* Added special support for `enum.IntFlag`

Close PyCQA/pylint2534

* Extend detection of data classes defined with attr

Close 628

* Fix typo in description for brain_attrs

2.1.0

============================
Release Date: 2018-11-25

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

  Close PyCQA/pylint2457

* Pass parameters by keyword name when inferring sequences.

  Close PyCQA/pylint2526

* 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 PyCQA/pylint2449

* Add support for `argparse.Namespace`

  Close PyCQA/pylint2413

* `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 PyCQA/pylint2434

* 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

2.0.4

============================
Release Date: 2018-08-10

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

  Close PyCQA/pylint2400

2.0.3

============================

Release Date: 2018-08-08

* The environment markers for PyPy were invalid.

2.0.2

============================

Release Date: 2018-08-01

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

  Close PyCQA/pylint2317

*  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 PyCQA/pylint2350

2.0.1

============================

Release Date: 2018-07-19

* Released to clear an old wheel package on PyPI

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 PyCQA/pylint2140

* 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 PyCQA/pylint1971

* Subclasses of *property* are now interpreted as properties

  Close PyCQA/pylint1601

* 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 PyCQA/pylint811

* Add brain tip for `issubclass` builtin

  Close 101.

* Fix submodule imports from six

  Close PyCQA/pylint1640

* Fix missing __module__ and __qualname__ from class definition locals

  Close PYCQA/pylint1753

* 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 PyCQA/pylint1839

* Subprocess.Popen brain now knows of the args member

  Close PyCQA/pylint1860

* add move_to_end method to collections.OrderedDict brain

  Close PyCQA/pylint1872

* Include new hashlib classes added in python 3.6

* Fix RecursionError for augmented assign

  Close 437, 447, 313, PyCQA/pylint1642, PyCQA/pylint1805, PyCQA/pylint1854, PyCQA/pylint1452

* Add missing attrs special attribute

  Close PyCQA/pylint1884

* Inference now understands the 'isinstance' builtin

  Close 98

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

  Close PyCQA/pylint1843

* 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 PyCQA/pylint2199

* Fix __call__ precedence for classes with custom metaclasses

  Close PyCQA/pylint2159

* 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.

1.6.0

============================

Release Date: 2017-12-15


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

  Close PyCQA/pylint1706

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

  Close PYCQA/pylint1698

* 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 PyCQA/pylint1703

* Add brain tips for UUID.int

  Close PyCQA/pylint961

* 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 PyCQA/pylint1563

* 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 PyCQA/pylint1458

 * The func form of namedtuples with keywords is now understood

   Close PyCQA/pylint1530

 * Fix inference for nested calls

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

   Close PyCQA/pylint1328

 * 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 PyCQA/pylint224
     Close PyCQA/pylint1660

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.

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

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/PyCQA/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.

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.

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 binded 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.

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.

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.

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.

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.

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.

1.3.1

============================

Release Date: 2014-11-21


 * Fixed a crash issue with the pytest brain module.

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.

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.

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.

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.

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.

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)

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

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.

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

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

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

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

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

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

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

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

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

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)

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

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

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] Bug573229 : 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

@vorpal-buildbot
Copy link
Contributor

vorpal-buildbot commented Jun 13, 2020

Changelogs

Warning: 2 is pinned to a specific version.
Warning: 4 is pinned to a specific version.
Warning: 31 is pinned to a specific version.
Warning: 51 is pinned to a specific version.
Warning: 55 is pinned to a specific version.
Warning: 58 is pinned to a specific version.

astroid 2.4.2

============================
Release Date: 2020-06-08

  • FunctionDef.is_generator properly handles yield nodes in While tests

    Close PyCQA/pylint3519

  • Properly construct the arguments of infered property descriptors

    Close PyCQA/pylint3648

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 PyCQA/pylint3540
    Close 773

  • Changed setup.py to work with distlib

    Close 779

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

    Close PyCQA/pylint3549

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

    Close PyCQA/pylint3529

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 PyCQA/astroid725

  • BoundMethod.implicit_parameters returns a proper value for __new__

    Close PyCQA/pylint2335

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

    Close PyCQA/pylint2334

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

    Close PyCQA/pylint1078

  • Infer qualified classmethod as a classmethod.

    Close PyCQA/pylint3417

  • 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 PyCQA/pylint2991

  • 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 PyCQA/pylint3032

  • 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 PyCQA/pylint2985

  • Pass a context argument to astroid.Arguments to prevent recursion errors

    Close PyCQA/pylint3414

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

    Close PyCQA/pylint3209

  • 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 PyCQA/pylint1285

  • Numpy datetime64.astype return value is inferred as a ndarray.

    Close PyCQA/pylint3332

  • Skip non Assign and AnnAssign nodes from enum reinterpretation

    Closes PyCQA/pylint3365

  • Numpy ndarray attributes imag and real are now inferred as ndarray.

    Close PyCQA/pylint3322

  • 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 PyCQA/pylint2911
    Close PyCQA/pylint3214

  • Added some functions to the brain_numpy_core_umath module

    Close PyCQA/pylint3319

  • Added some functions of the numpy.core.multiarray module

    Close PyCQA/pylint3208

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

    Close PyCQA/pylint2885

  • nodes.Const.itered returns a list of Const nodes, not strings

    Close PyCQA/pylint3306

  • The shape attribute of a numpy ndarray is now a ndarray

    Close PyCQA/pylint3139

  • Don't ignore special methods when inspecting gi classes

    Close 728

  • Added transform for scipy.gaussian

  • Add suport 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 PyCQA/pylint3157

  • 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 PyCQA/pylint2333

  • 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 PyCQA/pylint3216

  • 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 PyCQA/pylint3274

  • 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.

astroid 2.3.2

============================
Release Date: TBA

  • 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 PyCQA/pylint3174

  • 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 PyCQA/pylint3152
    Close PyCQA/pylint3159

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

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 PyCQA/pylint2865
    Close PyCQA/pylint2747
    Close PyCQA/pylint2721
    Close PyCQA/pylint2326
    Close PyCQA/pylint2021

  • 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 PyCQA/pylint2333

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

    Close PyCQA/pylint2859

  • 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 PyCQA/pylint2841

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

    Close PyCQA/pylint2777

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

    Close PyCQA/pylint2791

  • Fix recursion error involving len and self referential attributes

    Close PyCQA/pylint2736
    Close PyCQA/pylint2734
    Close PyCQA/pylint2740

  • 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 PyCQA/pylint1628

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

    Close PyCQA/pylint73

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 PyCQA/pylint2436

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

    Close PyCQA/pylint2594

  • 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 PyCQA/pylint2436 (first part)

  • Fix a crash with typing.NamedTuple and empty fields. Close PyCQA/pylint2745

  • Add a proper strerror inference to the OSError exceptions.

    Close PyCQA/pylint2553

  • 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 PyCQA/pylint2719

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

    Close PyCQA/pylint2694

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

    Close PyCQA/pylint2588

  • Fix a recursion error caused by inferring the slice builtin.

    Close PyCQA/pylint2667

  • 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 PyCQA/pylint2701

  • Added more builtin exceptions attributes. Close 580

  • Add a registry for builtin exception models. Close PyCQA/pylint1432

  • Add brain tips for http.client. Close PyCQA/pylint2687

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

    Close PyCQA/pylint2676

  • typing types have the __args__ property. Close PyCQA/pylint2419

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

    Close 626

  • Added special support for enum.IntFlag

    Close PyCQA/pylint2534

  • Extend detection of data classes defined with attr

    Close 628

  • Fix typo in description for brain_attrs

astroid 2.1.0

============================
Release Date: 2018-11-25

  • threading.Lock.acquire has the timeout parameter now.

    Close PyCQA/pylint2457

  • Pass parameters by keyword name when inferring sequences.

    Close PyCQA/pylint2526

  • 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 PyCQA/pylint2449

  • Add support for argparse.Namespace

    Close PyCQA/pylint2413

  • 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 PyCQA/pylint2434

  • 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

astroid 2.0.4

============================
Release Date: 2018-08-10

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

    Close PyCQA/pylint2400

astroid 2.0.3

============================

Release Date: 2018-08-08

  • The environment markers for PyPy were invalid.

astroid 2.0.2

============================

Release Date: 2018-08-01

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

    Close PyCQA/pylint2317

  • 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 PyCQA/pylint2350

astroid 2.0.1

============================

Release Date: 2018-07-19

  • Released to clear an old wheel package on PyPI

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 PyCQA/pylint2140

  • 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 PyCQA/pylint1971

  • Subclasses of property are now interpreted as properties

    Close PyCQA/pylint1601

  • 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 PyCQA/pylint811

  • Add brain tip for issubclass builtin

    Close 101.

  • Fix submodule imports from six

    Close PyCQA/pylint1640

  • Fix missing module and qualname from class definition locals

    Close PYCQA/pylint1753

  • 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 PyCQA/pylint1839

  • Subprocess.Popen brain now knows of the args member

    Close PyCQA/pylint1860

  • add move_to_end method to collections.OrderedDict brain

    Close PyCQA/pylint1872

  • Include new hashlib classes added in python 3.6

  • Fix RecursionError for augmented assign

    Close 437, 447, 313, PyCQA/pylint1642, PyCQA/pylint1805, PyCQA/pylint1854, PyCQA/pylint1452

  • Add missing attrs special attribute

    Close PyCQA/pylint1884

  • Inference now understands the 'isinstance' builtin

    Close 98

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

    Close PyCQA/pylint1843

  • 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 PyCQA/pylint2199

  • Fix call precedence for classes with custom metaclasses

    Close PyCQA/pylint2159

  • 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.

astroid 1.6.0

============================

Release Date: 2017-12-15

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

    Close PyCQA/pylint1706

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

    Close PYCQA/pylint1698

  • 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 PyCQA/pylint1703

  • Add brain tips for UUID.int

    Close PyCQA/pylint961

  • 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 PyCQA/pylint1563

  • 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 PyCQA/pylint1458

* The func form of namedtuples with keywords is now understood

  Close PyCQA/pylint1530

* Fix inference for nested calls

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

  Close PyCQA/pylint1328

* 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 PyCQA/pylint224
    Close PyCQA/pylint1660

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.

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

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/PyCQA/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.

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.

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 binded 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.

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.

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.

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.

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.

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.

astroid 1.3.1

============================

Release Date: 2014-11-21

* Fixed a crash issue with the pytest brain module.

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.

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.

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.

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.

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.

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)

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

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.

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

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

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

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

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

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

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

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

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

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)

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

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

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] Bug573229 : 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

astroid 0.19.3

=============================

Release Date: 2009-12-18

* fix name error making 0.19.2 almost useless

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
  assignement 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

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

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

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

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

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

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

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

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)

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

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

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

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)

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

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

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

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

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).

babel 2.8.0


Improvements


* CLDR: Upgrade to CLDR 36.0 - Aarni Koskela (679)
* Messages: Don't even open files with the "ignore" extraction method - sebleblanc (678)

Bugfixes
~~~~~~~~

* Numbers: Fix formatting very small decimals when quantization is disabled - Lev Lybin, miluChen (662)
* Messages: Attempt to sort all messages – Mario Frasca (651, 606)

Docs
~~~~

* Add years to changelog - Romuald Brunet
* Note that installation requires pytz - Steve (Gadget) Barnes


## babel 2.7.0
-------------

Possibly incompatible changes

These may be backward incompatible in some cases, as some more-or-less internal
APIs have changed. Please feel free to file issues if you bump into anything
strange and we'll try to help!

  • General: Internal uses of babel.util.odict have been replaced with
    collections.OrderedDict from The Python standard library.

Improvements


* CLDR: Upgrade to CLDR 35.1 - Alberto Mardegan, Aarni Koskela (626, 643)
* General: allow anchoring path patterns to the start of a string - Brian Cappello (600)
* General: Bumped version requirement on pytz - chrisbrake (592)
* Messages: `pybabel compile`: exit with code 1 if errors were encountered - Aarni Koskela (647)
* Messages: Add omit-header to update_catalog - Cédric Krier (633)
* Messages: Catalog update: keep user comments from destination by default - Aarni Koskela (648)
* Messages: Skip empty message when writing mo file - Cédric Krier (564)
* Messages: Small fixes to avoid crashes on badly formatted .po files - Bryn Truscott (597)
* Numbers: `parse_decimal()` `strict` argument and `suggestions` - Charly C (590)
* Numbers: don't repeat suggestions in parse_decimal strict - Serban Constantin (599)
* Numbers: implement currency formatting with long display names - Luke Plant (585)
* Numbers: parse_decimal(): assume spaces are equivalent to non-breaking spaces when not in strict mode - Aarni Koskela (649)
* Performance: Cache locale_identifiers() - Aarni Koskela (644)

Bugfixes
~~~~~~~~

* CLDR: Skip alt=... for week data (minDays, firstDay, weekendStart, weekendEnd) - Aarni Koskela (634)
* Dates: Fix wrong weeknumber for 31.12.2018 - BT-sschmid (621)
* Locale: Avoid KeyError trying to get data on WindowsXP - mondeja (604)
* Locale: get_display_name(): Don't attempt to concatenate variant information to None - Aarni Koskela (645)
* Messages: pofile: Add comparison operators to _NormalizedString - Aarni Koskela (646)
* Messages: pofile: don't crash when message.locations can't be sorted - Aarni Koskela (646)

Tooling & docs
  • Docs: Remove all references to deprecated easy_install - Jon Dufresne (610)
  • Docs: Switch print statement in docs to print function - NotAFile
  • Docs: Update all pypi.python.org URLs to pypi.org - Jon Dufresne (587)
  • Docs: Use https URLs throughout project where available - Jon Dufresne (588)
  • Support: Add testing and document support for Python 3.7 - Jon Dufresne (611)
  • Support: Test on Python 3.8-dev - Aarni Koskela (642)
  • Support: Using ABCs from collections instead of collections.abc is deprecated. - Julien Palard (609)
  • Tests: Fix conftest.py compatibility with pytest 4.3 - Miro Hrončok (635)
  • Tests: Update pytest and pytest-cov - Miro Hrončok (635)

babel 2.6.0


Possibly incompatible changes


These may be backward incompatible in some cases, as some more-or-less internal APIs have changed.
Please feel free to file issues if you bump into anything strange and we'll try to help!

* Numbers: Refactor decimal handling code and allow bypass of decimal quantization. (kdeldycke) (PR 538)
* Messages: allow processing files that are in locales unknown to Babel (akx) (PR 557)
* General: Drop support for EOL Python 2.6 and 3.3 (hugovk) (PR 546)

Other changes
~~~~~~~~~~~~~

* CLDR: Use CLDR 33 (akx) (PR 581)
* Lists: Add support for various list styles other than the default (akx) (552)
* Messages: Add new PoFileError exception (Bedrock02) (PR 532)
* Times: Simplify Linux distro specific explicit timezone setting search (scop) (PR 528)

Bugfixes
~~~~~~~~

* CLDR: avoid importing alt=narrow currency symbols (akx) (PR 558)
* CLDR: ignore non-Latin numbering systems (akx) (PR 579)
* Docs: Fix improper example for date formatting (PTrottier) (PR 574)
* Tooling: Fix some deprecation warnings (akx) (PR 580)

Tooling & docs
~~~~~~~~~~~~~~

* Add explicit signatures to some date autofunctions (xmo-odoo) (PR 554)
* Include license file in the generated wheel package (jdufresne) (PR 539)
* Python 3.6 invalid escape sequence deprecation fixes (scop) (PR 528)
* Test and document all supported Python versions (jdufresne) (PR 540)
* Update copyright header years and authors file (akx) (PR 559)



## babel 2.5.3
-------------

This is a maintenance release that reverts undesired API-breaking changes that slipped into 2.5.2
(see https://github.com/python-babel/babel/issues/550).

It is based on v2.5.1 (f29eccd) with commits 7cedb84, 29da2d2 and edfb518 cherry-picked on top.


## babel 2.5.2
-------------

Bugfixes
~~~~~~~~

* Revert the unnecessary PyInstaller fixes from 2.5.0 and 2.5.1 (533) (yagebu)


## babel 2.5.1
-------------

Minor Improvements and bugfixes
  • Use a fixed datetime to avoid test failures (520) (narendravardi)
  • Parse multi-line future imports better (519) (akx)
  • Fix validate_currency docstring (522)
  • Allow normalize_locale and exists to handle various unexpected inputs (523) (suhojm)
  • Make PyInstaller support more robust (525, 526) (thijstriemstra, akx)

babel 2.5.0


New Features


* Numbers: Add currency utilities and helpers (491) (kdeldycke)
* Support PyInstaller (500, 505) (wodo)

Minor Improvements and bugfixes
  • Dates: Add str to DateTimePattern (515) (sfermigier)
  • Dates: Fix an invalid string to bytes comparison when parsing TZ files on Py3 (498) (rowillia)
  • Dates: Formatting zero-padded components of dates is faster (517) (akx)
  • Documentation: Fix "Good Commits" link in CONTRIBUTING.md (511) (naryanacharya6)
  • Documentation: Fix link to Python gettext module (512) (Linkid)
  • Messages: Allow both dash and underscore separated locale identifiers in pofiles (489, 490) (akx)
  • Messages: Extract Python messages in nested gettext calls (488) (sublee)
  • Messages: Fix in-place editing of dir list while iterating (476, 492) (MarcDufresne)
  • Messages: Stabilize sort order (482) (xavfernandez)
  • Time zones: Honor the no-inherit marker for metazone names (405) (akx)

babel 2.4.0


New Features


Some of these changes might break your current code and/or tests.

* CLDR: CLDR 29 is now used instead of CLDR 28 (405) (akx)
* Messages: Add option 'add_location' for location line formatting (438, 459) (rrader, alxpy)
* Numbers: Allow full control of decimal behavior (410) (etanol)

Minor Improvements and bugfixes
  • Documentation: Improve Date Fields descriptions (450) (ldwoolley)
  • Documentation: Typo fixes and documentation improvements (406, 412, 403, 440, 449, 463) (zyegfryed, adamchainz, jwilk, akx, roramirez, abhishekcs10)
  • Messages: Default to UTF-8 source encoding instead of ISO-8859-1 (399) (asottile)
  • Messages: Ensure messages are extracted in the order they were passed in (424) (ngrilly)
  • Messages: Message extraction for JSX files is improved (392, 396, 425) (karloskar, georgschoelly)
  • Messages: PO file reading supports multi-line obsolete units (429) (mbirtwell)
  • Messages: Python message extractor respects unicode_literals in future (427) (sublee)
  • Messages: Roundtrip Language headers (420) (kruton)
  • Messages: units before obsolete units are no longer erroneously marked obsolete (452) (mbirtwell)
  • Numbers: parse_pattern now preserves the full original pattern (414) (jtwang)
  • Numbers: Fix float conversion in extract_operands (435) (akx)
  • Plurals: Fix plural forms for Czech and Slovak locales (373) (ykshatroff)
  • Plurals: More plural form fixes based on Mozilla and CLDR references (431) (mshenfield)

Internal improvements


* Local times are constructed correctly in tests (411) (etanol)
* Miscellaneous small improvements (437) (scop)
* Regex flags are extracted from the regex strings (462) (singingwolfboy)
* The PO file reader is now a class and has seen some refactoring (429, 452) (mbirtwell)



## babel 2.3.4
-------------

(Bugfix release, released on April 22th 2016)

Bugfixes
~~~~~~~~

* CLDR: The lxml library is no longer used for CLDR importing, so it should not cause strange failures either. Thanks to aronbierbaum for the bug report and jtwang for the fix. (https://github.com/python-babel/babel/pull/393)
* CLI: Every last single CLI usage regression should now be gone, and both distutils and stand-alone CLIs should work as they have in the past. Thanks to paxswill and ajaeger for bug reports. (https://github.com/python-babel/babel/pull/389)


## babel 2.3.3
-------------

(Bugfix release, released on April 12th 2016)

Bugfixes
~~~~~~~~

* CLI: Usage regressions that had snuck in between 2.2 and 2.3 should be no more. (https://github.com/python-babel/babel/pull/386) Thanks to ajaeger, sebdiem and jcristovao for bug reports and patches.


## babel 2.3.2
-------------

(Bugfix release, released on April 9th 2016)

Bugfixes
~~~~~~~~

* Dates: Period (am/pm) formatting was broken in certain locales (namely zh_TW). Thanks to jun66j5 for the bug report. (https://github.com/python-babel/babel/issues/378, https://github.com/python-babel/babel/issues/379)


## babel 2.3.1
-------------

(Bugfix release because of deployment problems, released on April 8th 2016)


## babel 2.3
-----------

(Feature release, released on April 8th 2016)

Internal improvements

Features


* CLDR: Add an API for territory language data (https://github.com/python-babel/babel/pull/315)
* Core: Character order and measurement system data is imported and exposed (https://github.com/python-babel/babel/pull/368)
* Dates: Add an API for time interval formatting (https://github.com/python-babel/babel/pull/316)
* Dates: More pattern formats and lengths are supported (https://github.com/python-babel/babel/pull/347)
* Dates: Period IDs are imported and exposed (https://github.com/python-babel/babel/pull/349)
* Dates: Support for date-time skeleton formats has been added (https://github.com/python-babel/babel/pull/265)
* Dates: Timezone formatting has been improved (https://github.com/python-babel/babel/pull/338)
* Messages: JavaScript extraction now supports dotted names, ES6 template strings and JSX tags (https://github.com/python-babel/babel/pull/332)
* Messages: npgettext is recognized by default (https://github.com/python-babel/babel/pull/341)
* Messages: The CLI learned to accept multiple domains (https://github.com/python-babel/babel/pull/335)
* Messages: The extraction commands now accept filenames in addition to directories (https://github.com/python-babel/babel/pull/324)
* Units: A new API for unit formatting is implemented (https://github.com/python-babel/babel/pull/369)

Bugfixes

babel 2.2


(Feature release, released on January 2nd 2016)

Bugfixes


* General: Add __hash__ to Locale. (303) (2aa8074)
* General: Allow files with BOM if they're UTF-8 (189) (da87edd)
* General: localedata directory is now locale-data (109) (2d1882e)
* General: odict: Fix pop method (0a9e97e)
* General: Removed uses of datetime.date class from *.dat files (174) (94f6830)
* Messages: Fix plural selection for Chinese (531f666)
* Messages: Fix typo and add semicolon in plural_forms (5784501)
* Messages: Flatten NullTranslations.files into a list (ad11101)
* Times: FixedOffsetTimezone: fix display of negative offsets (d816803)

Features
  • CLDR: Update to CLDR 28 (292) (9f7f4d0)
  • General: Add copy and deepcopy to LazyProxy. (a1cc3f1)
  • General: Add official support for Python 3.4 and 3.5
  • General: Improve odict performance by making key search O(1) (6822b7f)
  • Locale: Add an ordinal_form property to Locale (270) (b3f3430)
  • Locale: Add support for list formatting (37ce4fa, be6e23d)
  • Locale: Check inheritance exceptions first (3ef0d6d)
  • Messages: Allow file locations without line numbers (279) (79bc781)
  • Messages: Allow passing a callable to extract() (289) (3f58516)
  • Messages: Support 'Language' header field of PO files (76) (3ce842b)
  • Messages: Update catalog headers from templates (e0e7ef1)
  • Numbers: Properly load and expose currency format types (201) (df676ab)
  • Numbers: Use cdecimal by default when available (b6169be)
  • Numbers: Use the CLDR's suggested number of decimals for format_currency (139) (201ed50)
  • Times: Add format_timedelta(format='narrow') support (edc5eb5)

babel 2.1


(Bugfix/minor feature release, released on September 25th 2015)

babel 2.0


(Released on July 27th 2015, codename Second Coming)

  • Added support for looking up currencies that belong to a territory
    through the :func:babel.numbers.get_territory_currencies
    function.
  • Improved Python 3 support.
  • Fixed some broken tests for timezone behavior.
  • Improved various smaller things for dealing with dates.

babel 1.4


(bugfix release, release date to be decided)

  • Fixed a bug that caused deprecated territory codes not being
    converted properly by the subtag resolving. This for instance
    showed up when trying to use und_UK as a language code
    which now properly resolves to en_GB.
  • Fixed a bug that made it impossible to import the CLDR data
    from scratch on windows systems.

babel 1.3


(bugfix release, released on July 29th 2013)

  • Fixed a bug in likely-subtag resolving for some common locales.
    This primarily makes zh_CN work again which was broken
    due to how it was defined in the likely subtags combined with
    our broken resolving. This fixes :gh:37.
  • Fixed a bug that caused pybabel to break when writing to stdout
    on Python 3.
  • Removed a stray print that was causing issues when writing to
    stdout for message catalogs.

babel 1.2


(bugfix release, released on July 27th 2013)

  • Included all tests in the tarball. Previously the include
    skipped past recursive folders.
  • Changed how tests are invoked and added separate standalone
    test command. This simplifies testing of the package for
    linux distributors.

babel 1.1


(bugfix release, released on July 27th 2013)

  • added dummy version requirements for pytz so that it installs
    on pip 1.4.
  • Included tests in the tarball.

babel 1.0


(Released on July 26th 2013, codename Revival)

  • support python 2.6, 2.7, 3.3+ and pypy - drop all other versions
  • use tox for testing on different pythons
  • Added support for the locale plural rules defined by the CLDR.
  • Added format_timedelta function to support localized formatting of
    relative times with strings such as "2 days" or "1 month" (:trac:126).
  • Fixed negative offset handling of Catalog._set_mime_headers (:trac:165).
  • Fixed the case where messages containing square brackets would break with
    an unpack error.
  • updated to CLDR 23
  • Make the CLDR import script work with Python 2.7.
  • Fix various typos.
  • Sort output of list-locales.
  • Make the POT-Creation-Date of the catalog being updated equal to
    POT-Creation-Date of the template used to update (:trac:148).
  • Use a more explicit error message if no option or argument (command) is
    passed to pybabel (:trac:81).
  • Keep the PO-Revision-Date if it is not the default value (:trac:148).
  • Make --no-wrap work by reworking --width's default and mimic xgettext's
    behaviour of always wrapping comments (:trac:145).
  • Add --project and --version options for commandline (:trac:173).
  • Add a ne() method to the Local class.
  • Explicitly sort instead of using sorted() and don't assume ordering
    (Jython compatibility).
  • Removed ValueError raising for string formatting message checkers if the
    string does not contain any string formattings (:trac:150).
  • Fix Serbian plural forms (:trac:213).
  • Small speed improvement in format_date() (:trac:216).
  • Fix so frontend.CommandLineInterface.run does not accumulate logging
    handlers (:trac:227, reported with initial patch by dfraser)
  • Fix exception if environment contains an invalid locale setting
    (:trac:200)
  • use cPickle instead of pickle for better performance (:trac:225)
  • Only use bankers round algorithm as a tie breaker if there are two nearest
    numbers, round as usual if there is only one nearest number (:trac:267,
    patch by Martin)
  • Allow disabling cache behaviour in LazyProxy (:trac:208, initial patch
    from Pedro Algarvio)
  • Support for context-aware methods during message extraction (:trac:229,
    patch from David Rios)
  • "init" and "update" commands support "--no-wrap" option (:trac:289)
  • fix formatting of fraction in format_decimal() if the input value is a float
    with more than 7 significant digits (:trac:183)
  • fix format_date() with datetime parameter (:trac:282, patch from Xavier
    Morel)
  • fix format_decimal() with small Decimal values (:trac:214, patch from
    George Lund)
  • fix handling of messages containing '\n' (:trac:198)
  • handle irregular multi-line msgstr (no "" as first line) gracefully
    (:trac:171)
  • parse_decimal() now returns Decimals not floats, API change (:trac:178)
  • no warnings when running setup.py without installed setuptools (:trac:262)
  • modified Locale.eq method so Locales are only equal if all of their
    attributes (language, territory, script, variant) are equal
  • resort to hard-coded message extractors/checkers if pkg_resources is
    installed but no egg-info was found (:trac:230)
  • format_time() and format_datetime() now accept also floats (:trac:242)
  • add babel.support.NullTranslations class similar to gettext.NullTranslations
    but with all of Babel's new gettext methods (:trac:277)
  • "init" and "update" commands support "--width" option (:trac:284)
  • fix 'input_dirs' option for setuptools integration (:trac:232, initial
    patch by Étienne Bersac)
  • ensure .mo file header contains the same information as the source .po file
    (:trac:199)
  • added support for get_language_name() on the locale objects.
  • added support for get_territory_name() on the locale objects.
  • added support for get_script_name() on the locale objects.
  • added pluralization support for currency names and added a '¤¤¤'
    pattern for currencies that includes the full name.
  • depend on pytz now and wrap it nicer. This gives us improved support
    for things like timezone transitions and an overall nicer API.
  • Added support for explicit charset to PO file reading.
  • Added experimental Python 3 support.
  • Added better support for returning timezone names.
  • Don't throw away a Catalog's obsolete messages when updating it.
  • Added basic likelySubtag resolving when doing locale parsing and no
    match can be found.

babel 0.9.6


(released on March 17th 2011)

  • Backport r493-494: documentation typo fixes.
  • Make the CLDR import script work with Python 2.7.
  • Fix various typos.
  • Fixed Python 2.3 compatibility (:trac:146, :trac:233).
  • Sort output of list-locales.
  • Make the POT-Creation-Date of the catalog being updated equal to
    POT-Creation-Date of the template used to update (:trac:148).
  • Use a more explicit error message if no option or argument (command) is
    passed to pybabel (:trac:81).
  • Keep the PO-Revision-Date if it is not the default value (:trac:148).
  • Make --no-wrap work by reworking --width's default and mimic xgettext's
    behaviour of always wrapping comments (:trac:145).
  • Fixed negative offset handling of Catalog._set_mime_headers (:trac:165).
  • Add --project and --version options for commandline (:trac:173).
  • Add a ne() method to the Local class.
  • Explicitly sort instead of using sorted() and don't assume ordering
    (Python 2.3 and Jython compatibility).
  • Removed ValueError raising for string formatting message checkers if the
    string does not contain any string formattings (:trac:150).
  • Fix Serbian plural forms (:trac:213).
  • Small speed improvement in format_date() (:trac:216).
  • Fix number formatting for locales where CLDR specifies alt or draft
    items (:trac:217)
  • Fix bad check in format_time (:trac:257, reported with patch and tests by
    jomae)
  • Fix so frontend.CommandLineInterface.run does not accumulate logging
    handlers (:trac:227, reported with initial patch by dfraser)
  • Fix exception if environment contains an invalid locale setting
    (:trac:200)

babel 0.9.5


(released on April 6th 2010)

  • Fixed the case where messages containing square brackets would break with
    an unpack error.
  • Backport of r467: Fuzzy matching regarding plurals should NOT be checked
    against len(message.id) because this is always 2, instead, it's should be
    checked against catalog.num_plurals (:trac:212).

babel 0.9.4


(released on August 25th 2008)

  • Currency symbol definitions that is defined with choice patterns in the
    CLDR data are no longer imported, so the symbol code will be used instead.
  • Fixed quarter support in date formatting.
  • Fixed a serious memory leak that was introduces by the support for CLDR
    aliases in 0.9.3 (:trac:128).
  • Locale modifiers such as "euro" are now stripped from locale identifiers
    when parsing (:trac:136).
  • The system locales "C" and "POSIX" are now treated as aliases for
    "en_US_POSIX", for which the CLDR provides the appropriate data. Thanks to
    Manlio Perillo for the suggestion.
  • Fixed JavaScript extraction for regular expression literals (:trac:138)
    and concatenated strings.
  • The Translation class in babel.support can now manage catalogs with
    different message domains, and exposes the family of d*gettext functions
    (:trac:137).

babel 0.9.3


(released on July 9th 2008)

  • Fixed invalid message extraction methods causing an UnboundLocalError.
  • Extraction method specification can now use a dot instead of the colon to
    separate module and function name (:trac:105).
  • Fixed message catalog compilation for locales with more than two plural
    forms (:trac:95).
  • Fixed compilation of message catalogs for locales with more than two plural
    forms where the translations were empty (:trac:97).
  • The stripping of the comment tags in comments is optional now and
    is done for each line in a comment.
  • Added a JavaScript message extractor.
  • Updated to CLDR 1.6.
  • Fixed timezone calculations when formatting datetime and time values.
  • Added a get_plural function into the plurals module that returns the
    correct plural forms for a locale as tuple.
  • Added support for alias definitions in the CLDR data files, meaning that
    the chance for items missing in certain locales should be greatly reduced
    (:trac:68).

babel 0.9.2


(released on February 4th 2008)

  • Fixed catalogs' charset values not being recognized (:trac:66).
  • Numerous improvements to the default plural forms.
  • Fixed fuzzy matching when updating message catalogs (:trac:82).
  • Fixed bug in catalog updating, that in some cases pulled in translations
    from different catalogs based on the same template.
  • Location lines in PO files do no longer get wrapped at hyphens in file
    names (:trac:79).
  • Fixed division by zero error in catalog compilation on empty catalogs
    (:trac:60).

babel 0.9.1


(released on September 7th 2007)

  • Fixed catalog updating when a message is merged that was previously simple
    but now has a plural form, for example by moving from gettext to
    ngettext, or vice versa.
  • Fixed time formatting for 12 am and 12 pm.
  • Fixed output encoding of the pybabel --list-locales command.
  • MO files are now written in binary mode on windows (:trac:61).

babel 0.9


(released on August 20th 2007)

  • The new_catalog distutils command has been renamed to init_catalog for
    consistency with the command-line frontend.
  • Added compilation of message catalogs to MO files (:trac:21).
  • Added updating of message catalogs from POT files (:trac:22).
  • Support for significant digits in number formatting.
  • Apply proper "banker's rounding" in number formatting in a cross-platform
    manner.
  • The number formatting functions now also work with numbers represented by
    Python Decimal objects (:trac:53).
  • Added extensible infrastructure for validating translation catalogs.
  • Fixed the extractor not filtering out messages that didn't validate against
    the keyword's specification (:trac:39).
  • Fixed the extractor raising an exception when encountering an empty string
    msgid. It now emits a warning to stderr.
  • Numerous Python message extractor fixes: it now handles nested function
    calls within a gettext function call correctly, uses the correct line number
    for multi-line function calls, and other small fixes (tickets :trac:38 and
    :trac:39).
  • Improved support for detecting Python string formatting fields in message
    strings (:trac:57).
  • CLDR upgraded to the 1.5 release.
  • Improved timezone formatting.
  • Implemented scientific number formatting.
  • Added mechanism to lookup locales by alias, for cases where browsers insist
    on including only the language code in the Accept-Language header, and
    sometimes even the incorrect language code.

babel 0.8.1


(released on July 2nd 2007)

  • default_locale() would fail when the value of the LANGUAGE environment
    variable contained multiple language codes separated by colon, as is
    explicitly allowed by the GNU gettext tools. As the default_locale()
    function is called at the module level in some modules, this bug would
    completely break importing these modules on systems where LANGUAGE is set
    that way.
  • The character set specified in PO template files is now respected when
    creating new catalog files based on that template. This allows the use of
    characters outside the ASCII range in POT files (:trac:17).
  • The default ordering of messages in generated POT files, which is based on
    the order those messages are found when walking the source tree, is no
    longer subject to differences between platforms; directory and file names
    are now always sorted alphabetically.
  • The Python message extractor now respects the special encoding comment to be
    able to handle files containing non-ASCII characters (:trac:23).
  • Added N_ (gettext noop) to the extractor's default keywords.
  • Made locale string parsing more robust, and also take the script part into
    account (:trac:27).
  • Added a function to list all locales for which locale data is available.
  • Added a command-line option to the pybabel command which prints out all
    available locales (:trac:24).
  • The name of the command-line script has been changed from just babel to
    pybabel to avoid a conflict with the OpenBabel project (:trac:34).

babel 0.8


(released on June 20th 2007)

  • First public release

packaging 20.4


* Canonicalize version before comparing specifiers. (:issue:`282`)
* Change type hint for ``canonicalize_name`` to return
  ``packaging.utils.NormalizedName``.
  This enables the use of static typing tools (like mypy) to detect mixing of
  normalized and un-normalized names.


## packaging 20.3
  • Fix changelog for 20.2.

packaging 20.2


* Fix a bug that caused a 32-bit OS that runs on a 64-bit ARM CPU (e.g. ARM-v8,
  aarch64), to report the wrong bitness.


## packaging 20.1
  • Fix a bug caused by reuse of an exhausted iterator. (:issue:257)

packaging 20.0


* Add type hints (:issue:`191`)

* Add proper trove classifiers for PyPy support (:issue:`198`)

* Scale back depending on ``ctypes`` for manylinux support detection (:issue:`171`)

* Use ``sys.implementation.name`` where appropriate for ``packaging.tags`` (:issue:`193`)

* Expand upon the API provded by ``packaging.tags``: ``interpreter_name()``, ``mac_platforms()``, ``compatible_tags()``, ``cpython_tags()``, ``generic_tags()`` (:issue:`187`)

* Officially support Python 3.8 (:issue:`232`)

* Add ``major``, ``minor``, and ``micro`` aliases to ``packaging.version.Version`` (:issue:`226`)

* Properly mark ``packaging`` has being fully typed by adding a `py.typed` file (:issue:`226`)


## packaging 19.2
  • Remove dependency on attrs (:issue:178, :issue:179)

  • Use appropriate fallbacks for CPython ABI tag (:issue:181, :issue:185)

  • Add manylinux2014 support (:issue:186)

  • Improve ABI detection (:issue:181)

  • Properly handle debug wheels for Python 3.8 (:issue:172)

  • Improve detection of debug builds on Windows (:issue:194)

packaging 19.1


* Add the ``packaging.tags`` module. (:issue:`156`)

* Correctly handle two-digit versions in ``python_version`` (:issue:`119`)



## packaging 19.0
  • Fix string representation of PEP 508 direct URL requirements with markers.

  • Better handling of file URLs

    This allows for using file:///absolute/path, which was previously
    prevented due to the missing netloc.

    This allows for all file URLs that urlunparse turns back into the
    original URL to be valid.

packaging 18.0


* Improve error messages when invalid requirements are given. (:issue:`129`)



## packaging 17.1
  • Fix utils.canonicalize_version when supplying non PEP 440 versions.

packaging 17.0


* Drop support for python 2.6, 3.2, and 3.3.

* Define minimal pyparsing version to 2.0.2 (:issue:`91`).

* Add ``epoch``, ``release``, ``pre``, ``dev``, and ``post`` attributes to
  ``Version`` and ``LegacyVersion`` (:issue:`34`).

* Add ``Version().is_devrelease`` and ``LegacyVersion().is_devrelease`` to
  make it easy to determine if a release is a development release.

* Add ``utils.canonicalize_version`` to canonicalize version strings or
  ``Version`` instances (:issue:`121`).



## packaging 16.8
  • Fix markers that utilize in so that they render correctly.

  • Fix an erroneous test on Python RC releases.

packaging 16.7


* Add support for the deprecated ``python_implementation`` marker which was
  an undocumented setuptools marker in addition to the newer markers.



## packaging 16.6
  • Add support for the deprecated, PEP 345 environment markers in addition to
    the newer markers.

packaging 16.5


* Fix a regression in parsing requirements with whitespaces between the comma
  separators.



## packaging 16.4
  • Fix a regression in parsing requirements like foo (==4).

packaging 16.3


* Fix a bug where ``packaging.requirements:Requirement`` was overly strict when
  matching legacy requirements.



## packaging 16.2
  • Add a function that implements the name canonicalization from PEP 503.

packaging 16.1


* Implement requirement specifiers from PEP 508.



## packaging 16.0
  • Relicense so that packaging is available under either the Apache License,
    Version 2.0 or a 2 Clause BSD license.

  • Support installation of packaging when only distutils is available.

  • Fix == comparison when there is a prefix and a local version in play.
    (:issue:41).

  • Implement environment markers from PEP 508.

packaging 15.3


* Normalize post-release spellings for rev/r prefixes. :issue:`35`



## packaging 15.2
  • Fix an error where the arbitary specifier (===) was not correctly
    allowing pre-releases when it was being used.

  • Expose the specifier and version parts through properties on the
    Specifier classes.

  • Allow iterating over the SpecifierSet to get access to all of the
    Specifier instances.

  • Allow testing if a version is contained within a specifier via the in
    operator.

packaging 15.1


* Fix a logic error that was causing inconsistent answers about whether or not
  a pre-release was contained within a ``SpecifierSet`` or not.



## packaging 15.0
  • Add Version().is_postrelease and LegacyVersion().is_postrelease to
    make it easy to determine if a release is a post release.

  • Add Version().base_version and LegacyVersion().base_version to make
    it easy to get the public version without any pre or post release markers.

  • Support the update to PEP 440 which removed the implied !=V.* when using
    either >V or <V and which instead special cased the handling of
    pre-releases, post-releases, and local versions when using >V or <V.

packaging 14.5


* Normalize release candidates as ``rc`` instead of ``c``.

* Expose the ``VERSION_PATTERN`` constant, a regular expression matching
  a valid version.



## packaging 14.4
  • Ensure that versions are normalized before comparison when used in a
    specifier with a less than (<) or greater than (>) operator.

packaging 14.3


* **BACKWARDS INCOMPATIBLE** Refactor specifier support so that it can sanely
  handle legacy specifiers as well as PEP 440 specifiers.

* **BACKWARDS INCOMPATIBLE** Move the specifier support out of
  ``packaging.version`` into ``packaging.specifiers``.



## packaging 14.2
  • Add prerelease support to Specifier.
  • Remove the ability to do item in Specifier() and replace it with
    Specifier().contains(item) in order to allow flags that signal if a
    prerelease should be accepted or not.
  • Add a method Specifier().filter() which will take an iterable and returns
    an iterable with items that do not match the specifier filtered out.

packaging 14.1


* Allow ``LegacyVersion`` and ``Version`` to be sorted together.
* Add ``packaging.version.parse()`` to enable easily parsing a version string
  as either a ``Version`` or a ``LegacyVersion`` depending on it's PEP 440
  validity.



## packaging 14.0
  • Initial release.

.. _master: https://github.com/pypa/packaging/

pytest-cov 2.10.0


  • Improved the --no-cov warning. Now it's only shown if --no-cov is present before --cov.
  • Removed legacy pytest support. Changed setup.py so that pytest>=4.6 is required.

six 1.15.0


  • Pull request 331: Optimize six.ensure_str and six.ensure_binary.

six 1.14.0


  • Issue 288, pull request 289: Add six.assertNotRegex.

  • Issue 317: six.moves._dummy_thread now points to the _thread module on
    Python 3.9+. Python 3.7 and later requires threading and deprecated the
    _dummy_thread module.

  • Issue 308, pull request 314: Remove support for Python 2.6 and Python 3.2.

  • Issue 250, issue 165, pull request 251: six.wraps now ignores missing
    attributes. This follows the Python 3.2+ standard library behavior.

six 1.13.0


  • Issue 298, pull request 299: Add six.moves.dbm_ndbm.

  • Issue 155: Add six.moves.collections_abc, which aliases the collections
    module on Python 2-3.2 and the collections.abc on Python 3.3 and greater.

  • Pull request 304: Re-add distutils fallback in setup.py.

  • Pull request 305: On Python 3.7, with_metaclass supports classes using PEP
    560 features.

six 1.12.0


  • Issue 259, pull request 260: six.add_metaclass now preserves
    __qualname__ from the original class.

  • Pull request 204: Add six.ensure_binary, six.ensure_text, and
    six.ensure_str.

six 1.11.0


  • Pull request 178: with_metaclass now properly proxies __prepare__ to the
    underlying metaclass.

  • Pull request 191: Allow with_metaclass to work with metaclasses implemented
    in C.

  • Pull request 203: Add parse_http_list and parse_keqv_list to moved
    urllib.request.

  • Pull request 172 and issue 171: Add unquote_to_bytes to moved urllib.parse.

  • Pull request 167: Add six.moves.getoutput.

  • Pull request 80: Add six.moves.urllib_parse.splitvalue.

  • Pull request 75: Add six.moves.email_mime_image.

  • Pull request 72: Avoid creating reference cycles through tracebacks in
    reraise.

six 1.10.0


  • Issue 122: Improve the performance of six.int2byte on Python 3.

  • Pull request 55 and issue 99: Don't add the winreg module to six.moves
    on non-Windows platforms.

  • Pull request 60 and issue 108: Add six.moves.getcwd and
    six.moves.getcwdu.

  • Pull request 64: Add create_unbound_method to create unbound methods.

six 1.9.0


  • Issue 106: Support the flush parameter to six.print_.

  • Pull request 48 and issue 15: Add the python_2_unicode_compatible
    decorator.

  • Pull request 57 and issue 50: Add several compatibility methods for unittest
    assertions that were renamed between Python 2 and 3.

  • Issue 105 and pull request 58: Ensure six.wraps respects the updated and
    assigned arguments.

  • Issue 102: Add raise_from to abstract out Python 3's raise from syntax.

  • Issue 97: Optimize six.iterbytes on Python 2.

  • Issue 98: Fix six.moves race condition in multi-threaded code.

  • Pull request 51: Add six.view(keys|values|itmes), which provide dictionary
    views on Python 2.7+.

  • Issue 112: six.moves.reload_module now uses the importlib module on
    Python 3.4+.

six 1.8.0


  • Issue 90: Add six.moves.shlex_quote.

  • Issue 59: Add six.moves.intern.

  • Add six.urllib.parse.uses_(fragment|netloc|params|query|relative).

  • Issue 88: Fix add_metaclass when the class has __slots__ containing
    __weakref__ or __dict__.

  • Issue 89: Make six use absolute imports.

  • Issue 85: Always accept updated and assigned arguments for wraps().

  • Issue 86: In reraise(), instantiate the exception if the second argument is
    None.

  • Pull request 45: Add six.moves.email_mime_nonmultipart.

  • Issue 81: Add six.urllib.request.splittag mapping.

  • Issue 80: Add six.urllib.request.splituser mapping.

six 1.7.3


  • Issue 77: Fix import six on Python 3.4 with a custom loader.

  • Issue 74: six.moves.xmlrpc_server should map to SimpleXMLRPCServer on Python
    2 as documented not xmlrpclib.

six 1.7.2


  • Issue 72: Fix installing on Python 2.

six 1.7.1


  • Issue 71: Make the six.moves meta path importer handle reloading of the six
    module gracefully.

six 1.7.0


  • Pull request 30: Implement six.moves with a PEP 302 meta path hook.

  • Pull request 32: Add six.wraps, which is like functools.wraps but always sets
    the wrapped attribute.

  • Pull request 35: Improve add_metaclass, so that it doesn't end up inserting
    another class into the hierarchy.

  • Pull request 34: Add import mappings for dummy_thread.

  • Pull request 33: Add import mappings for UserDict and UserList.

  • Pull request 31: Select the implementations of dictionary iterator routines
    at import time for a 20% speed boost.

six 1.6.1


  • Raise an AttributeError for six.moves.X when X is a module not available in
    the current interpreter.

six 1.6.0


  • Raise an AttributeError for every attribute of unimportable modules.

  • Issue 56: Make the fake modules six.moves puts into sys.modules appear not to
    have a path unless they are loaded.

  • Pull request 28: Add support for SplitResult.

  • Issue 55: Add move mapping for xmlrpc.server.

  • Pull request 29: Add move for urllib.parse.splitquery.

six 1.5.2


  • Issue 53: Make the fake modules six.moves puts into sys.modules appear not to
    have a name unless they are loaded.

six 1.5.1


  • Issue 51: Hack around the Django autoreloader after recent six.moves changes.

six 1.5.0


  • Removed support for Python 2.4. This is because py.test no longer supports
    2.4.

  • Fix various import problems including issues 19 and 41. six.moves modules
    are now lazy wrappers over the underlying modules instead of the actual
    modules themselves.

  • Issue 49: Add six.moves mapping for tkinter.ttk.

  • Pull request 24: Add dir special method to six.moves modules.

  • Issue 47: Fix add_metaclass on classes with a string for the slots
    variable.

  • Issue 44: Fix interpretation of backslashes on Python 2 in the u() function.

  • Pull request 21: Add import mapping for urllib's proxy_bypass function.

  • Issue 43: Add import mapping for the Python 2 xmlrpclib module.

  • Issue 39: Add import mapping for the Python 2 thread module.

  • Issue 40: Add import mapping for the Python 2 gdbm module.

  • Issue 35: On Python versions less than 2.7, print_ now encodes unicode
    strings when outputing to standard streams. (Python 2.7 handles this
    automatically.)

six 1.4.1


  • Issue 32: urllib module wrappings don't work when six is not a toplevel file.

six 1.4.0


  • Issue 31: Add six.moves mapping for UserString.

  • Pull request 12: Add six.add_metaclass, a decorator for adding a metaclass to
    a class.

  • Add six.moves.zip_longest and six.moves.filterfalse, which correspond
    respectively to itertools.izip_longest and itertools.ifilterfalse on Python 2
    and itertools.zip_longest and itertools.filterfalse on Python 3.

  • Issue 25: Add the unichr function, which returns a string for a Unicode
    codepoint.

  • Issue 26: Add byte2int function, which complements int2byte.

  • Add a PY2 constant with obvious semantics.

  • Add helpers for indexing and iterating over bytes: iterbytes and indexbytes.

  • Add create_bound_method() wrapper.

  • Issue 23: Allow multiple base classes to be passed to with_metaclass.

  • Issue 24: Add six.moves.range alias. This exactly the same as the current
    xrange alias.

  • Pull request 5: Create six.moves.urllib, which contains abstractions for a
    bunch of things which are in urllib in Python 3 and spread out across urllib,
    urllib2, and urlparse in Python 2.

six 1.3.0


  • Issue 21: Add methods to access the closure and globals of a function.

  • In six.iter(items/keys/values/lists), passed keyword arguments through to the
    underlying method.

  • Add six.iterlists().

  • Issue 20: Fix tests if tkinter is not available.

  • Issue 17: Define callable to be builtin callable when it is available again
    in Python 3.2+.

  • Issue 16: Rename Python 2 exec_'s arguments, so casually calling exec_ with
    keyword arguments will raise.

  • Issue 14: Put the six.moves package in sys.modules based on the name six is
    imported under.

  • Fix Jython detection.

  • Pull request 4: Add email_mime_multipart, email_mime_text, and
    email_mime_base to six.moves.

six 1.2.0


  • Issue 13: Make iterkeys/itervalues/iteritems return iterators on Python 3
    instead of iterables.

  • Issue 11: Fix maxsize support on Jython.

  • Add six.next() as an alias for six.advance_iterator().

  • Use the builtin next() function for advance_iterator() where is available
    (2.6+), not just Python 3.

  • Add the Iterator class for writing portable iterators.

six 1.1.0


  • Add the int2byte function.

  • Add compatibility mappings for iterators over the keys, values, and items of a
    dictionary.

  • Fix six.MAXSIZE on platforms where sizeof(long) != sizeof(Py_ssize_t).

  • Issue 3: Add six.moves mappings for filter, map, and zip.

six 1.0.0


  • Issue 2: u() on Python 2.x now resolves unicode escapes.

  • Expose an API for adding mappings to six.moves.

six 1.0


  • Reworked six into one .py file. This breaks imports. Please tell me if you
    are interested in an import compatibility layer.

titlecase 1.1.1

No release notes found.

typing-extensions 3.7.4.2

No release notes found.

werkzeug 1.0.1


Released 2020-03-31

  • Make the argument to RequestRedirect.get_response optional.
    :issue:1718
  • Only allow a single access control allow origin value. :pr:1723
  • Fix crash when trying to parse a non-existent Content Security
    Policy header. :pr:1731
  • http_date zero fills years < 1000 to always output four digits.
    :issue:1739
  • Fix missing local variables in interactive debugger console.
    :issue:1746
  • Fix passing file-like objects like io.BytesIO to
    FileStorage.save. :issue:1733

werkzeug 1.0.0


Released 2020-02-06

  • Drop support for Python 3.4. (:issue:1478)
  • Remove code that issued deprecation warnings in version 0.15.
    (:issue:1477)
  • Remove most top-level attributes provided by the werkzeug
    module in favor of direct imports. For example, instead of
    import werkzeug; werkzeug.url_quote, do
    from werkzeug.urls import url_quote. Install version 0.16 first
    to see deprecation warnings while upgrading. :issue:2, :pr:1640
  • Added utils.invalidate_cached_property() to invalidate cached
    properties. (:pr:1474)
  • Directive keys for the Set-Cookie response header are not
    ignored when parsing the Cookie request header. This allows
    cookies with names such as "expires" and "version". (:issue:1495)
  • Request cookies are parsed into a MultiDict to capture all
    values for cookies with the same key. cookies[key] returns the
    first value rather than the last. Use cookies.getlist(key) to
    get all values. parse_cookie also defaults to a MultiDict.
    :issue:1562, :pr:1458
  • Add charset=utf-8 to an HTTP exception response's
    CONTENT_TYPE header. (:pr:1526)
  • The interactive debugger handles outer variables in nested scopes
    such as lambdas and comprehensions. :issue:913, :issue:1037,
    :pr:1532
  • The user agent for Opera 60 on Mac is correctly reported as
    "opera" instead of "chrome". :issue:1556
  • The platform for Crosswalk on Android is correctly reported as
    "android" instead of "chromeos". (:pr:1572)
  • Issue a warning when the current server name does not match the
    configured server name. :issue:760
  • A configured server name with the default port for a scheme will
    match the current server name without the port if the current scheme
    matches. :pr:1584
  • :exc:~exceptions.InternalServerError has a original_exception
    attribute that frameworks can use to track the original cause of the
    error. :pr:1590
  • Headers are tested for equality independent of the header key case,
    such that X-Foo is the same as x-foo. :pr:1605
  • :meth:http.dump_cookie accepts 'None' as a value for
    samesite. :issue:1549
  • :meth:~test.Client.set_cookie accepts a samesite argument.
    :pr:1705
  • Support the Content Security Policy header through the
    Response.content_security_policy data structure. :pr:1617
  • LanguageAccept will fall back to matching "en" for "en-US" or
    "en-US" for "en" to better support clients or translations that
    only match at the primary language tag. :issue:450, :pr:1507
  • MIMEAccept uses MIME parameters for specificity when matching.
    :issue:458, :pr:1574
  • If the development server is started with an SSLContext
    configured to verify client certificates, the certificate in PEM
    format will be available as environ["SSL_CLIENT_CERT"].
    :pr:1469
  • is_resource_modified will run for methods other than GET and
    HEAD, rather than always returning False. :issue:409
  • SharedDataMiddleware returns 404 rather than 500 when trying to
    access a directory instead of a file with the package loader. The
    dependency on setuptools and pkg_resources is removed.
    :issue:1599
  • Add a response.cache_control.immutable flag. Keep in mind that
    browser support for this Cache-Control header option is still
    experimental and may not be implemented. :issue:1185
  • Optional request log highlighting with the development server is
    handled by Click instead of termcolor. :issue:1235
  • Optional ad-hoc TLS support for the development server is handled
    by cryptography instead of pyOpenSSL. :pr:1555
  • FileStorage.save() supports pathlib and :pep:519
    PathLike objects. :issue:1653
  • The debugger security pin is unique in containers managed by Podman.
    :issue:1661
  • Building a URL when host_matching is enabled takes into account
    the current host when there are duplicate endpoints with different
    hosts. :issue:488
  • The 429 TooManyRequests and 503 ServiceUnavailable HTTP
    exceptions takes a retry_after parameter to set the
    Retry-After header. :issue:1657
  • Map and Rule have a merge_slashes option to collapse
    multiple slashes into one, similar to how many HTTP servers behave.
    This is enabled by default. :pr:1286, 1694
  • Add HTTP 103, 208, 306, 425, 506, 508, and 511 to the list of status
    codes. :pr:1678
  • Add update, setlist, and setlistdefault methods to the
    Headers data structure. extend method can take MultiDict
    and kwargs. :pr:1687, 1697
  • The development server accepts paths that start with two slashes,
    rather than stripping off the first path segment. :issue:491
  • Add access control (Cross Origin Request Sharing, CORS) header
    properties to the Request and Response wrappers. :pr:1699
  • Accept values are no longer ordered alphabetically for equal
    quality tags. Instead the initial order is preserved. :issue:1686
  • Added Map.lock_class attribute for alternative
    implementations. :pr:1702
  • Support matching and building WebSocket rules in the routing system,
    for use by async frameworks. :pr:1709
  • Range requests that span an entire file respond with 206 instead of
    200, to be more compliant with :rfc:7233. This may help serving
    media to older browsers. :issue:410, 1704
  • The :class:~middleware.shared_data.SharedDataMiddleware default
    fallback_mimetype is application/octet-stream. If a filename
    looks like a text mimetype, the utf-8 charset is added to it.
    This matches the behavior of :class:~wrappers.BaseResponse and
    Flask's send_file(). :issue:1689

werkzeug 0.16.1


Released 2020-01-27

  • Fix import location in deprecation messages for subpackages.
    :issue:1663
  • Fix an SSL error on Python 3.5 when the dev server responds with no
    content. :issue:1659

werkzeug 0.16.0


Released 2019-09-19

  • Deprecate most top-level attributes provided by the werkzeug
    module in favor of direct imports. The deprecated imports will be
    removed in version 1.0.

    For example, instead of import werkzeug; werkzeug.url_quote, do
    from werkzeug.urls import url_quote. A deprecation warning will
    show the correct import to use. werkzeug.exceptions and
    werkzeug.routing should also be imported instead of accessed,
    but for technical reasons can't show a warning.

    :issue:2, :pr:1640

werkzeug 0.15.6


Released 2019-09-04

  • Work around a bug in pip that caused the reloader to fail on
    Windows when the script was an entry point. This fixes the issue
    with Flask's flask run command failing with "No module named
    Scripts\flask". :issue:1614
  • ProxyFix trusts the X-Forwarded-Proto header by default.
    :issue:1630
  • The deprecated num_proxies argument to ProxyFix sets
    x_for, x_proto, and x_host to match 0.14 behavior. This
    is intended to make intermediate upgrades less disruptive, but the
    argument will still be removed in 1.0. :issue:1630

werkzeug 0.15.5


Released 2019-07-17

  • Fix a TypeError due to changes to ast.Module in Python 3.8.
    :issue:1551
  • Fix a C assertion failure in debug builds of some Python 2.7
    releases. :issue:1553
  • :class:~exceptions.BadRequestKeyError adds the KeyError
    message to the description if e.show_exception is set to
    True. This is a more secure default than the original 0.15.0
    behavior and makes it easier to control without losing information.
    :pr:1592
  • Upgrade the debugger to jQuery 3.4.1. :issue:1581
  • Work around an issue in some external debuggers that caused the
    reloader to fail. :issue:1607
  • Work around an issue where the reloader couldn't introspect a
    setuptools script installed as an egg. :issue:1600
  • The reloader will use sys.executable even if the script is
    marked executable, reverting a behavior intended for NixOS
    introduced in 0.15. The reloader should no longer cause
    OSError: [Errno 8] Exec format error. :issue:1482,
    :issue:1580
  • SharedDataMiddleware safely handles paths with Windows drive
    names. :issue:1589

werkzeug 0.15.4


Released 2019-05-14

  • Fix a SyntaxError on Python 2.7.5. (:issue:1544)

werkzeug 0.15.3


Released 2019-05-14

  • Properly handle multi-line header folding in development server in
    Python 2.7. (:issue:1080)
  • Restore the response argument to :exc:~exceptions.Unauthorized.
    (:pr:1527)
  • :exc:~exceptions.Unauthorized doesn't add the WWW-Authenticate
    header if www_authenticate is not given. (:issue:1516)
  • The default URL converter correctly encodes bytes to string rather
    than representing them with b''. (:issue:1502)
  • Fix the filename format string in
    :class:~middleware.profiler.ProfilerMiddleware to correctly handle
    float values. (:issue:1511)
  • Update :class:~middleware.lint.LintMiddleware to work on Python 3.
    (:issue:1510)
  • The debugger detects cycles in chained exceptions and does not time
    out in that case. (:issue:1536)
  • When running the development server in Docker, the debugger security
    pin is now unique per container.

werkzeug 0.15.2


Released 2019-04-02

  • Rule code generation uses a filename that coverage will ignore.
    The previous value, "generated", was causing coverage to fail.
    (:issue:1487)
  • The test client removes the cookie header if there are no persisted
    cookies. This fixes an issue introduced in 0.15.0 where the cookies
    from the original request were used for redirects, causing functions
    such as logout to fail. (:issue:1491)
  • The test client copies the environ before passing it to the app, to
    prevent in-place modifications from affecting redirect requests.
    (:issue:1498)
  • The "werkzeug" logger only adds a handler if there is no handler
    configured for its level in the logging chain. This avoids double
    logging if other code configures logging first. (:issue:1492)

werkzeug 0.15.1


Released 2019-03-21

  • :exc:~exceptions.Unauthorized takes description as the first
    argument, restoring previous behavior. The new www_authenticate
    argument is listed second. (:issue:1483)

werkzeug 0.15.0


Released 2019-03-19

  • Building URLs is ~7x faster. Each :class:~routing.Rule compiles
    an optimized function for building itself. (:pr:1281)

  • :meth:MapAdapter.build() <routing.MapAdapter.build> can be passed
    a :class:~datastructures.MultiDict to represent multiple values
    for a key. It already did this when passing a dict with a list
    value. (:pr:724)

  • path_info defaults to '/' for
    :meth:Map.bind() <routing.Map.bind>. (:issue:740, :pr:768,
    :pr:1316)

  • Change RequestRedirect code from 301 to 308, preserving the verb
    and request body (form data) during redirect. (:pr:1342)

  • int and float converters in URL rules will handle negative
    values if passed the signed=True parameter. For example,
    /jump/<int(signed=True):count>. (:pr:1355)

  • Location autocorrection in :func:Response.get_wsgi_headers() <wrappers.BaseResponse.get_wsgi_headers> is relative to the current
    path rather than the root path. (:issue:693, :pr:718,
    :pr:1315)

  • 412 responses once again include entity headers and an error message
    in the body. They were originally omitted when implementing
    If-Match (:pr:1233), but the spec doesn't seem to disallow it.
    (:issue:1231, :pr:1255)

  • The Content-Length header is removed for 1xx and 204 responses. This
    fixes a previous change where no body would be sent, but the header
    would still be present. The new behavior matches RFC 7230.
    (:pr:1294)

  • :class:~exceptions.Unauthorized takes a www_authenticate
    parameter to set the WWW-Authenticate header for the response,
    which is technically required for a valid 401 response.
    (:issue:772, :pr:795)

  • Add support for status code 424 :exc:~exceptions.FailedDependency.
    (:pr:1358)

  • :func:http.parse_cookie ignores empty segments rather than
    producing a cookie with no key or value. (:issue:1245, :pr:1301)

  • :func:~http.parse_authorization_header (and
    :class:~datastructures.Authorization,
    :attr:~wrappers.Request.authorization) treats the authorization
    header as UTF-8. On Python 2, basic auth username and password are
    unicode. (:pr:1325)

  • :func:~http.parse_options_header understands :rfc:2231 parameter
    continuations. (:pr:1417)

  • :func:~urls.uri_to_iri does not unquote ASCII characters in the
    unreserved class, such as space, and leaves invalid bytes quoted
    when decoding. :func:~urls.iri_to_uri does not quote reserved
    characters. See :rfc:3987 for these character classes.
    (:pr:1433)

  • get_content_type appends a charset for any mimetype that ends
    with +xml, not just those that start with application/.
    Known text types such as application/javascript are also given
    charsets. (:pr:1439)

  • Clean up werkzeug.security module, remove outdated hashlib
    support. (:pr:1282)

  • In :func:~security.generate_password_hash, PBKDF2 uses 150000
    iterations by default, increased from 50000. (:pr:1377)

  • :class:~wsgi.ClosingIterator calls close on the wrapped
    iterable, not the internal iterator. This doesn't affect objects
    where __iter__ returned self. For other objects, the method
    was not called before. (:issue:1259, :pr:1260)

  • Bytes may be used as keys in :class:~datastructures.Headers, they
    will be decoded as Latin-1 like values are. (:pr:1346)

  • :class:~datastructures.Range validates that list of range tuples
    passed to it would produce a valid Range header. (:pr:1412)

  • :class:~datastructures.FileStorage looks up attributes on
    stream._file if they don't exist on stream, working around
    an issue where :func:tempfile.SpooledTemporaryFile didn't
    implement all of :class:io.IOBase. See
    bpo-26175: Fix SpooledTemporaryFile IOBase abstract python/cpython#3249. (:pr:1409)

  • :class:CombinedMultiDict.copy() <datastructures.CombinedMultiDict>
    returns a shallow mutable copy as a
    :class:~datastructures.MultiDict. The copy no longer reflects
    changes to the combined dicts, but is more generally useful.
    (:pr:1420)

  • The version of jQuery used by the debugger is updated to 3.3.1.
    (:pr:1390)

  • The debugger correctly renders long markupsafe.Markup instances.
    (:pr:1393)

  • The debugger can serve resources when Werkzeug is installed as a
    zip file. DebuggedApplication.get_resource uses
    pkgutil.get_data. (:pr:1401)

  • The debugger and server log support Python 3's chained exceptions.
    (:pr:1396)

  • The interactive debugger highlights frames that come from user code
    to make them easy to pick out in a long stack trace. Note that if an
    env was created with virtualenv instead of venv, the debugger may
    incorrectly classify some frames. (:pr:1421)

  • Clicking the error message at the top of the interactive debugger
    will jump down to the bottom of the traceback. (:pr:1422)

  • When generating a PIN, the debugger will ignore a KeyError
    raised when the current UID doesn't have an associated username,
    which can happen in Docker. (:issue:1471)

  • :class:~exceptions.BadRequestKeyError adds the KeyError
    message to the description, making it clearer what caused the 400
    error. Frameworks like Flask can omit this information in production
    by setting e.args = (). (:pr:1395)

  • If a nested ImportError occurs from :func:~utils.import_string
    the traceback mentions the nested import. Removes an untested code
    path for handling "modules not yet set up by the parent."
    (:pr:735)

  • Triggering a reload while using a tool such as PDB no longer hides
    input. (:pr:1318)

  • The reloader will not prepend the Python executable to the command
    line if the Python file is marked executable. This allows the
    reloader to work on NixOS. (:pr:1242)

  • Fix an issue where sys.path would change between reloads when
    running with python -m app. The reloader can detect that a
    module was run with "-m" and reconstructs that instead of the file
    path in sys.argv when reloading. (:pr:1416)

  • The dev server can bind to a Unix socket by passing a hostname like
    unix://app.socket. (:pr:209, :pr:1019)

  • Server uses IPPROTO_TCP constant instead of SOL_TCP for
    Jython compatibility. (:pr:1375)

  • When using an adhoc SSL cert with :func:~serving.run_simple, the
    cert is shown as self-signed rather than signed by an invalid
    authority. (:pr:1430)

  • The development server logs the unquoted IRI rather than the raw
    request line, to make it easier to work with Unicode in request
    paths during development. (:issue:1115)

  • The development server recognizes ConnectionError on Python 3 to
    silence client disconnects, and does not silence other OSErrors
    that may have been raised inside the application. (:pr:1418)

  • The environ keys REQUEST_URI and RAW_URI contain the raw
    path before it was percent-decoded. This is non-standard, but many
    WSGI servers add them. Middleware could replace PATH_INFO with
    this to route based on the raw value. (:pr:1419)

  • :class:~test.EnvironBuilder doesn't set CONTENT_TYPE or
    CONTENT_LENGTH in the environ if they aren't set. Previously
    these used default values if they weren't set. Now it's possible to
    distinguish between empty and unset values. (:pr:1308)

  • The test client raises a ValueError if a query string argument
    would overwrite a query string in the path. (:pr:1338)

  • :class:test.EnvironBuilder and :class:test.Client take a
    json argument instead of manually passing data and
    content_type. This is serialized using the
    :meth:test.EnvironBuilder.json_dumps method. (:pr:1404)

  • :class:test.Client redirect handling is rewritten. (:pr:1402)

    • The redirect environ is copied from the initial request environ.
    • Script root and path are correctly distinguished when
      redirecting to a path under the root.
    • The HEAD method is not changed to GET.
    • 307 and 308 codes preserve the method and body. All others
      ignore the body and related headers.
    • Headers are passed to the new request for all codes, following
      what browsers do.
    • :class:test.EnvironBuilder sets the content type and length
      headers in addition to the WSGI keys when detecting them from
      the data.
    • Intermediate response bodies are iterated over even when
      buffered=False to ensure iterator middleware can run cleanup
      code safely. Only the last response is not buffered. (:pr:988)
  • :class:~test.EnvironBuilder, :class:~datastructures.FileStorage,
    and :func:wsgi.get_input_stream no longer share a global
    _empty_stream instance. This improves test isolation by
    preventing cases where closing the stream in one request would
    affect other usages. (:pr:1340)

  • The default SecureCookie.serialization_method will change from
    :mod:pickle to :mod:json in 1.0. To upgrade existing tokens,
    override :meth:~contrib.securecookie.SecureCookie.unquote to try
    pickle if json fails. (:pr:1413)

  • CGIRootFix no longer modifies PATH_INFO for very old
    versions of Lighttpd. LighttpdCGIRootFix was renamed to
    CGIRootFix in 0.9. Both are deprecated and will be removed in
    version 1.0. (:pr:1141)

  • :class:werkzeug.wrappers.json.JSONMixin has been replaced with
    Flask's implementation. Check the docs for the full API.
    (:pr:1445)

  • The contrib modules are deprecated and will either be moved into
    werkzeug core or removed completely in version 1.0. Some modules
    that already issued deprecation warnings have been removed. Be sure
    to run or test your code with
    python -W default::DeprecationWarning to catch any deprecated
    code you're using. (:issue:4)

    • LintMiddleware has moved to :mod:werkzeug.middleware.lint.
    • ProfilerMiddleware has moved to
      :mod:werkzeug.middleware.profiler.
    • ProxyFix has moved to :mod:werkzeug.middleware.proxy_fix.
    • JSONRequestMixin has moved to :mod:werkzeug.wrappers.json.
    • cache has been extracted into a separate project,
      cachelib <https://github.com/pallets/cachelib>_. The version
      in Werkzeug is deprecated.
    • securecookie and sessions have been extracted into a
      separate project,
      secure-cookie <https://github.com/pallets/secure-cookie>_. The
      version in Werkzeug is deprecated.
    • Everything in fixers, except ProxyFix, is deprecated.
    • Everything in wrappers, except JSONMixin, is deprecated.
    • atom is deprecated. This did not fit in with the rest of
      Werkzeug, and is better served by a dedicated library in the
      community.
    • jsrouting is removed. Set URLs when rendering templates
      or JSON responses instead.
    • limiter is removed. Its specific use is handled by Werkzeug
      directly, but stream limiting is better handled by the WSGI
      server in general.
    • testtools is removed. It did not offer significant benefit
      over the default test client.
    • iterio is deprecated.
  • :func:wsgi.get_host no longer looks at X-Forwarded-For. Use
    :class:~middleware.proxy_fix.ProxyFix to handle that.
    (:issue:609, :pr:1303)

  • :class:~middleware.proxy_fix.ProxyFix is refactored to support
    more headers, multiple values, and more secure configuration.

    • Each header supports multiple values. The trusted number of
      proxies is configured separately for each header. The
      num_proxies argument is deprecated. (:pr:1314)
    • Sets SERVER_NAME and SERVER_PORT based on
      X-Forwarded-Host. (:pr:1314)
    • Sets SERVER_PORT and modifies HTTP_HOST based on
      X-Forwarded-Port. (:issue:1023, :pr:1304)
    • Sets SCRIPT_NAME based on X-Forwarded-Prefix.
      (:issue:1237)
    • The original WSGI environment values are stored in the
      werkzeug.proxy_fix.orig key, a dict. The individual keys
      werkzeug.proxy_fix.orig_remote_addr,
      werkzeug.proxy_fix.orig_wsgi_url_scheme, and
      werkzeug.proxy_fix.orig_http_host are deprecated.
  • Middleware from werkzeug.wsgi has moved to separate modules
    under werkzeug.middleware, along with the middleware moved from
    werkzeug.contrib. The old werkzeug.wsgi imports are
    deprecated and will be removed in version 1.0. (:pr:1452)

    • werkzeug.wsgi.DispatcherMiddleware has moved to
      :class:werkzeug.middleware.dispatcher.DispatcherMiddleware.
    • werkzeug.wsgi.ProxyMiddleware as moved to
      :class:werkzeug.middleware.http_proxy.ProxyMiddleware.
    • werkzeug.wsgi.SharedDataMiddleware has moved to
      :class:werkzeug.middleware.shared_data.SharedDataMiddleware.
  • :class:~middleware.http_proxy.ProxyMiddleware proxies the query
    string. (:pr:1252)

  • The filenames generated by
    :class:~middleware.profiler.ProfilerMiddleware can be customized.
    (:issue:1283)

  • The werkzeug.wrappers module has been converted to a package,
    and its various classes have been organized into separate modules.
    Any previously documented classes, understood to be the existing
    public API, are still importable from werkzeug.wrappers, or may
    be imported from their specific modules. (:pr:1456)

werkzeug 0.14.1


Released on December 31st 2017

  • Resolved a regression with status code handling in the integrated
    development server.

werkzeug 0.14


Released on December 31st 2017

  • HTTP exceptions are now automatically caught by
    Request.application.
  • Added support for edge as browser.
  • Added support for platforms that lack SpooledTemporaryFile.
  • Add support for etag handling through if-match
  • Added support for the SameSite cookie attribute.
  • Added werkzeug.wsgi.ProxyMiddleware
  • Implemented has for NullCache
  • get_multi on cache clients now returns lists all the time.
  • Improved the watchdog observer shutdown for the reloader to not crash
    on exit on older Python versions.
  • Added support for filename* filename attributes according to
    RFC 2231
  • Resolved an issue where machine ID for the reloader PIN was not
    read accurately on windows.
  • Added a workaround for syntax errors in init files in the reloader.
  • Added support for using the reloader with console scripts on windows.
  • The built-in HTTP server will no longer close a connection in cases
    where no HTTP body is expected (204, 204, HEAD requests etc.)
  • The EnvironHeaders object now skips over empty content type and
    lengths if they are set to falsy values.
  • Werkzeug will no longer send the content-length header on 1xx or
    204/304 responses.
  • Cookie values are now also permitted to include slashes and equal
    signs without quoting.
  • Relaxed the regex for the routing converter arguments.
  • If cookies are sent without values they are now assumed to have an
    empty value and the parser accepts this. Previously this could have
    corrupted cookies that followed the value.
  • The test Client and EnvironBuilder now support mimetypes like
    the request object does.
  • Added support for static weights in URL rules.
  • Better handle some more complex reloader scenarios where sys.path
    contained non directory paths.
  • EnvironHeaders no longer raises weird errors if non string keys
    are passed to it.

werkzeug 0.13


Released on December 7th 2017

  • Deprecate support for Python 2.6 and 3.3. CI tests will not run
    for these versions, and support will be dropped completely in the next
    version. (:issue:pallets/meta24)
  • Raise TypeError when port is not an integer. (:pr:1088)
  • Fully deprecate werkzeug.script. Use Click_ instead.
    (:pr:1090)
  • response.age is parsed as a timedelta. Previously, it was
    incorrectly treated as a datetime. The header value is an integer
    number of seconds, not a date string. (:pr:414)
  • Fix a bug in TypeConversionDict where errors are not propagated
    when using the converter. (:issue:1102)
  • Authorization.qop is a string instead of a set, to comply with
    RFC 2617. (:pr:984)
  • An exception is raised when an encoded cookie is larger than, by
    default, 4093 bytes. Browsers may silently ignore cookies larger than
    this. BaseResponse has a new attribute max_cookie_size and
    dump_cookie has a new argument max_size to configure this.
    (:pr:780, :pr:1109)
  • Fix a TypeError in werkzeug.contrib.lint.GuardedIterator.close.
    (:pr:1116)
  • BaseResponse.calculate_content_length now correctly works for
    Unicode responses on Python 3. It first encodes using
    iter_encoded. (:issue:705)
  • Secure cookie contrib works with string secret key on Python 3.
    (:pr:1205)
  • Shared data middleware accepts a list instead of a dict of static
    locations to preserve lookup order. (:pr:1197)
  • HTTP header values without encoding can contain single quotes.
    (:pr:1208)
  • The built-in dev server supports receiving requests with chunked
    transfer encoding. (:pr:1198)

.. _Click: https://palletsprojects.com/p/click/

werkzeug 0.12.2


Released on May 16 2017

  • Fix regression: Pull request 892 prevented Werkzeug from correctly
    logging the IP of a remote client behind a reverse proxy, even when using
    ProxyFix.
  • Fix a bug in safe_join on Windows.

werkzeug 0.12.1


Released on March 15th 2017

  • Fix crash of reloader (used on debug mode) on Windows.
    (OSError: [WinError 10038]). See pull request 1081
  • Partially revert change to class hierarchy of Headers. See 1084.

werkzeug 0.12


Released on March 10th 2017

  • Spit out big deprecation warnings for werkzeug.script
  • Use inspect.getfullargspec internally when available as
    inspect.getargspec is gone in 3.6
  • Added support for status code 451 and 423
  • Improved the build error suggestions. In particular only if
    someone stringifies the error will the suggestions be calculated.
  • Added support for uWSGI's caching backend.
  • Fix a bug where iterating over a FileStorage would result in an infinite
    loop.
  • Datastructures now inherit from the relevant baseclasses from the
    collections module in the stdlib. See 794.
  • Add support for recognizing NetBSD, OpenBSD, FreeBSD, DragonFlyBSD platforms
    in the user agent string.
  • Recognize SeaMonkey browser name and version correctly
  • Recognize Baiduspider, and bingbot user agents
  • If LocalProxy's wrapped object is a function, refer to it with wrapped
    attribute.
  • The defaults of generate_password_hash have been changed to more secure
    ones, see pull request 753.
  • Add support for encoding in options header parsing, see pull request
    933.
  • test.Client now properly handles Location headers with relative URLs, see
    pull request 879.
  • When HTTPException is raised, it now prints the description, for easier
    debugging.
  • Werkzeug's dict-like datastructures now have view-methods under Python 2,
    see pull request 968.
  • Fix a bug in MultiPartParser when no stream_factory was provided
    during initialization, see pull request 973.
  • Disable autocorrect and spellchecker in the debugger middleware's Python
    prompt, see pull request 994.
  • Don't redirect to slash route when method doesn't match, see pull request
    907.
  • Fix a bug when using SharedDataMiddleware with frozen packages, see pull
    request 959.
  • Range header parsing function fixed for invalid values 974.
  • Add support for byte Range Requests, see pull request 978.
  • Use modern cryptographic defaults in the dev servers 1004.
  • the post() method of the test client now accept file object through the data
    parameter.
  • Color run_simple's terminal output based on HTTP codes 1013.
  • Fix self-XSS in debugger console, see 1031.
  • Fix IPython 5.x shell support, see 1033.
  • Change Accept datastructure to sort by specificity first, allowing for more
    accurate results when using best_match for mime types (for example in
    requests.accept_mimetypes.best_match)

werkzeug 0.11.16


  • werkzeug.serving: set CONTENT_TYPE / CONTENT_LENGTH if only they're provided by the client
  • werkzeug.serving: Fix crash of reloader when using python -m werkzeug.serving.

werkzeug 0.11.15


Released on December 30th 2016.

  • Bugfix for the bugfix in the previous release.

werkzeug 0.11.14


Released on December 30th 2016.

  • Check if platform can fork before importing ForkingMixIn, raise exception
    when creating ForkingWSGIServer on such a platform, see PR 999.

werkzeug 0.11.13


Released on December 26th 2016.

  • Correct fix for the reloader issuer on certain Windows installations.

werkzeug 0.11.12


Released on December 26th 2016.

  • Fix more bugs in multidicts regarding empty lists. See 1000.
  • Add some docstrings to some EnvironBuilder properties that were previously
    unintentionally missing.
  • Added a workaround for the reloader on windows.

werkzeug 0.11.11


Released on August 31st 2016.

  • Fix JSONRequestMixin for Python3. See 731
  • Fix broken string handling in test client when passing integers. See 852
  • Fix a bug in parse_options_header where an invalid content type
    starting with comma or semi-colon would result in an invalid return value,
    see issue 995.
  • Fix a bug in multidicts when passing empty lists as values, see issue
    979.
  • Fix a security issue that allows XSS on the Werkzeug debugger. See 1001.

werkzeug 0.11.10


Released on May 24th 2016.

  • Fixed a bug that occurs when running on Python 2.6 and using a broken locale.
    See pull request 912.
  • Fixed a crash when running the debugger on Google App Engine. See issue 925.
  • Fixed an issue with multipart parsing that could cause memory exhaustion.

werkzeug 0.11.9


Released on April 24th 2016.

  • Corrected an issue that caused the debugger not to use the
    machine GUID on POSIX systems.
  • Corrected a Unicode error on Python 3 for the debugger's
    PIN usage.
  • Corrected the timestamp verification in the pin debug code.
    Without this fix the pin was remembered for too long.

werkzeug 0.11.8


Released on April 15th 2016.

  • fixed a problem with the machine GUID detection code on OS X
    on Python 3.

werkzeug 0.11.7


Released on April 14th 2016.

  • fixed a regression on Python 3 for the debugger.

werkzeug 0.11.6


Released on April 14th 2016.

  • werkzeug.serving: Still show the client address on bad requests.
  • improved the PIN based protection for the debugger to make it harder to
    brute force via trying cookies. Please keep in mind that the debugger
    is not intended for running on production environments
  • increased the pin timeout to a week to make it less annoying for people
    which should decrease the chance that users disable the pin check
    entirely.
  • werkzeug.serving: Fix broken HTTP_HOST when path starts with double slash.

werkzeug 0.11.5


Released on March 22nd 2016.

  • werkzeug.serving: Fix crash when attempting SSL connection to HTTP server.

werkzeug 0.11.4


Released on February 14th 2016.

  • Fixed werkzeug.serving not working from -m flag.
  • Fixed incorrect weak etag handling.

werkzeug 0.11.3


Released on December 20th 2015.

  • Fixed an issue with copy operations not working against
    proxies.
  • Changed the logging operations of the development server to
    correctly log where the server is running in all situations
    again.
  • Fixed another regression with SSL wrapping similar to the
    fix in 0.11.2 but for a different code path.

werkzeug 0.11.2


Released on November 12th 2015.

  • Fix inheritable sockets on Windows on Python 3.
  • Fixed an issue with the forking server not starting any longer.
  • Fixed SSL wrapping on platforms that supported opening sockets
    by file descriptor.
  • No longer log from the watchdog reloader.
  • Unicode errors in hosts are now better caught or converted into
    bad request errors.

werkzeug 0.11.1


Released on November 10th 2015.

  • Fixed a regression on Python 3 in the debugger.

werkzeug 0.11


Released on November 8th 2015, codename Gleisbaumaschine.

  • Added reloader_paths option to run_simple and other functions in
    werkzeug.serving. This allows the user to completely override the Python
    module watching of Werkzeug with custom paths.
  • Many custom cached properties of Werkzeug's classes are now subclasses of
    Python's property type (issue 616).
  • bind_to_environ now doesn't differentiate between implicit and explicit
    default port numbers in HTTP_HOST (pull request 204).
  • BuildErrors are now more informative. They come with a complete sentence
    as error message, and also provide suggestions (pull request 691).
  • Fix a bug in the user agent parser where Safari's build number instead of
    version would be extracted (pull request 703).
  • Fixed issue where RedisCache set_many was broken for twemproxy, which doesn't
    support the default MULTI command (pull request 702).
  • mimetype parameters on request and response classes are now always
    converted to lowercase.
  • Changed cache so that cache never expires if timeout is 0. This also fixes
    an issue with redis setex (issue 550)
  • Werkzeug now assumes UTF-8 as filesystem encoding on Unix if Python
    detected it as ASCII.
  • New optional has method on caches.
  • Fixed various bugs in parse_options_header (pull request 643).
  • If the reloader is enabled the server will now open the socket in the parent
    process if this is possible. This means that when the reloader kicks in
    the connection from client will wait instead of tearing down. This does
    not work on all Python versions.
  • Implemented PIN based authentication for the debugger. This can optionally
    be disabled but is discouraged. This change was necessary as it has been
    discovered that too many people run the debugger in production.
  • Devserver no longer requires SSL module to be installed.

werkzeug 0.10.5


(bugfix release, release date yet to be decided)

  • Reloader: Correctly detect file changes made by moving temporary files over
    the original, which is e.g. the case with PyCharm (pull request 722).
  • Fix bool behavior of werkzeug.datastructures.ETags under Python 3 (issue
    744).

werkzeug 0.10.4


(bugfix release, released on March 26th 2015)

  • Re-release of 0.10.3 with packaging artifacts manually removed.

werkzeug 0.10.3


(bugfix release, released on March 26th 2015)

  • Re-release of 0.10.2 without packaging artifacts.

werkzeug 0.10.2


(bugfix release, released on March 26th 2015)

  • Fixed issue where empty could break third-party libraries that relied on
    keyword arguments (pull request 675)
  • Improved Rule.empty by providing a ```get_empty_kwargsto allow setting custom kwargs without having to override entireempty`` method. (pull
    request ``675``)
  • Fixed extra_files parameter for reloader to not cause startup
    to crash when included in server params
  • Using MultiDict when building URLs is now not supported again. The behavior
    introduced several regressions.
  • Fix performance problems with stat-reloader (pull request 715).

werkzeug 0.10.1


(bugfix release, released on February 3rd 2015)

  • Fixed regression with multiple query values for URLs (pull request 667).
  • Fix issues with eventlet's monkeypatching and the builtin server (pull
    request 663).

werkzeug 0.10


Released on January 30th 2015, codename Bagger.

  • Changed the error handling of and improved testsuite for the caches in
    contrib.cache.
  • Fixed a bug on Python 3 when creating adhoc ssl contexts, due to sys.maxint
    not being defined.
  • Fixed a bug on Python 3, that caused
    :func:~werkzeug.serving.make_ssl_devcert to fail with an exception.
  • Added exceptions for 504 and 505.
  • Added support for ChromeOS detection.
  • Added UUID converter to the routing system.
  • Added message that explains how to quit the server.
  • Fixed a bug on Python 2, that caused len for
    :class:werkzeug.datastructures.CombinedMultiDict to crash.
  • Added support for stdlib pbkdf2 hmac if a compatible digest
    is found.
  • Ported testsuite to use py.test.
  • Minor optimizations to various middlewares (pull requests 496 and
    571).
  • Use stdlib ssl module instead of OpenSSL for the builtin server
    (issue 434). This means that OpenSSL contexts are not supported anymore,
    but instead ssl.SSLContext from the stdlib.
  • Allow protocol-relative URLs when building external URLs.
  • Fixed Atom syndication to print time zone offset for tz-aware datetime
    objects (pull request 254).
  • Improved reloader to track added files and to recover from broken
    sys.modules setups with syntax errors in packages.
  • cache.RedisCache now supports arbitrary **kwargs for the redis
    object.
  • werkzeug.test.Client now uses the original request method when resolving
    307 redirects (pull request 556).
  • werkzeug.datastructures.MIMEAccept now properly deals with mimetype
    parameters (pull request 205).
  • werkzeug.datastructures.Accept now handles a quality of 0 as
    intolerable, as per RFC 2616 (pull request 536).
  • werkzeug.urls.url_fix now properly encodes hostnames with idna
    encoding (issue 559). It also doesn't crash on malformed URLs anymore
    (issue 582).
  • werkzeug.routing.MapAdapter.match now recognizes the difference between
    the path / and an empty one (issue 360).
  • The interactive debugger now tries to decode non-ascii filenames (issue
    469).
  • Increased default key size of generated SSL certificates to 1024 bits (issue
    611).
  • Added support for specifying a Response subclass to use when calling
    :func:~werkzeug.utils.redirect\ .
  • werkzeug.test.EnvironBuilder now doesn't use the request method anymore
    to guess the content type, and purely relies on the form, files and
    input_stream properties (issue 620).
  • Added Symbian to the user agent platform list.
  • Fixed make_conditional to respect automatically_set_content_length
  • Unset Content-Length when writing to response.stream (issue 451)
  • wrappers.Request.method is now always uppercase, eliminating
    inconsistencies of the WSGI environment (issue 647).
  • routing.Rule.empty now works correctly with subclasses of Rule (pull
    request 645).
  • Made map updating safe in light of concurrent updates.
  • Allow multiple values for the same field for url building (issue 658).

werkzeug 0.9.7


  • Fixed uri_to_iri() not re-encoding hashes in query string parameters.

werkzeug 0.9.6


(bugfix release, released on June 7th 2014)

  • Added a safe conversion for IRI to URI conversion and use that
    internally to work around issues with spec violations for
    protocols such as itms-service.

werkzeug 0.9.5


(bugfix release, released on June 7th 2014)

  • Forward charset argument from request objects to the environ
    builder.
  • Fixed error handling for missing boundaries in multipart data.
  • Fixed session creation on systems without os.urandom().
  • Fixed pluses in dictionary keys not being properly URL encoded.
  • Fixed a problem with deepcopy not working for multi dicts.
  • Fixed a double quoting issue on redirects.
  • Fixed a problem with unicode keys appearing in headers on 2.x.
  • Fixed a bug with unicode strings in the test builder.
  • Fixed a unicode bug on Python 3 in the WSGI profiler.
  • Fixed an issue with the safe string compare function on
    Python 2.7.7 and Python 3.4.

werkzeug 0.9.4


(bugfix release, released on August 26th 2013)

  • Fixed an issue with Python 3.3 and an edge case in cookie parsing.
  • Fixed decoding errors not handled properly through the WSGI
    decoding dance.
  • Fixed URI to IRI conversion incorrectly decoding percent signs.

werkzeug 0.9.3


(bugfix release, released on July 25th 2013)

  • Restored behavior of the data descriptor of the request class to pre 0.9
    behavior. This now also means that .data and .get_data() have
    different behavior. New code should use .get_data() always.

    In addition to that there is now a flag for the .get_data() method that
    controls what should happen with form data parsing and the form parser will
    honor cached data. This makes dealing with custom form data more consistent.

werkzeug 0.9.2


(bugfix release, released on July 18th 2013)

  • Added unsafe parameter to :func:~werkzeug.urls.url_quote.
  • Fixed an issue with :func:~werkzeug.urls.url_quote_plus not quoting
    '+' correctly.
  • Ported remaining parts of :class:~werkzeug.contrib.RedisCache to
    Python 3.3.
  • Ported remaining parts of :class:~werkzeug.contrib.MemcachedCache to
    Python 3.3
  • Fixed a deprecation warning in the contrib atom module.
  • Fixed a regression with setting of content types through the
    headers dictionary instead with the content type parameter.
  • Use correct name for stdlib secure string comparison function.
  • Fixed a wrong reference in the docstring of
    :func:~werkzeug.local.release_local.
  • Fixed an AttributeError that sometimes occurred when accessing the
    :attr:werkzeug.wrappers.BaseResponse.is_streamed attribute.

werkzeug 0.9.1


(bugfix release, released on June 14th 2013)

  • Fixed an issue with integers no longer being accepted in certain
    parts of the routing system or URL quoting functions.
  • Fixed an issue with url_quote not producing the right escape
    codes for single digit codepoints.
  • Fixed an issue with :class:~werkzeug.wsgi.SharedDataMiddleware not
    reading the path correctly and breaking on etag generation in some
    cases.
  • Properly handle Expect: 100-continue in the development server
    to resolve issues with curl.
  • Automatically exhaust the input stream on request close. This should
    fix issues where not touching request files results in a timeout.
  • Fixed exhausting of streams not doing anything if a non-limited
    stream was passed into the multipart parser.
  • Raised the buffer sizes for the multipart parser.

werkzeug 0.9


Released on June 13nd 2013, codename Planierraupe.

  • Added support for :meth:~werkzeug.wsgi.LimitedStream.tell
    on the limited stream.
  • :class:~werkzeug.datastructures.ETags now is nonzero if it
    contains at least one etag of any kind, including weak ones.
  • Added a workaround for a bug in the stdlib for SSL servers.
  • Improved SSL interface of the devserver so that it can generate
    certificates easily and load them from files.
  • Refactored test client to invoke the open method on the class
    for redirects. This makes subclassing more powerful.
  • :func:werkzeug.wsgi.make_chunk_iter and
    :func:werkzeug.wsgi.make_line_iter now support processing of
    iterators and streams.
  • URL generation by the routing system now no longer quotes
    +.
  • URL fixing now no longer quotes certain reserved characters.
  • The :func:werkzeug.security.generate_password_hash and
    check functions now support any of the hashlib algorithms.
  • wsgi.get_current_url is now ascii safe for browsers sending
    non-ascii data in query strings.
  • improved parsing behavior for :func:werkzeug.http.parse_options_header
  • added more operators to local proxies.
  • added a hook to override the default converter in the routing
    system.
  • The description field of HTTP exceptions is now always escaped.
    Use markup objects to disable that.
  • Added number of proxy argument to the proxy fix to make it more
    secure out of the box on common proxy setups. It will by default
    no longer trust the x-forwarded-for header as much as it did
    before.
  • Added support for fragment handling in URI/IRI functions.
  • Added custom class support for :func:werkzeug.http.parse_dict_header.
  • Renamed LighttpdCGIRootFix to CGIRootFix.
  • Always treat + as safe when fixing URLs as people love misusing them.
  • Added support to profiling into directories in the contrib profiler.
  • The escape function now by default escapes quotes.
  • Changed repr of exceptions to be less magical.
  • Simplified exception interface to no longer require environments
    to be passed to receive the response object.
  • Added sentinel argument to IterIO objects.
  • Added pbkdf2 support for the security module.
  • Added a plain request type that disables all form parsing to only
    leave the stream behind.
  • Removed support for deprecated fix_headers.
  • Removed support for deprecated header_list.
  • Removed support for deprecated parameter for iter_encoded.
  • Removed support for deprecated non-silent usage of the limited
    stream object.
  • Removed support for previous dummy writable parameter on
    the cached property.
  • Added support for explicitly closing request objects to close
    associated resources.
  • Conditional request handling or access to the data property on responses no
    longer ignores direct passthrough mode.
  • Removed werkzeug.templates and werkzeug.contrib.kickstart.
  • Changed host lookup logic for forwarded hosts to allow lists of
    hosts in which case only the first one is picked up.
  • Added wsgi.get_query_string, wsgi.get_path_info and
    wsgi.get_script_name and made the wsgi.pop_path_info and
    wsgi.peek_path_info functions perform unicode decoding. This
    was necessary to avoid having to expose the WSGI encoding dance
    on Python 3.
  • Added content_encoding and content_md5 to the request object's
    common request descriptor mixin.
  • added options and trace to the test client.
  • Overhauled the utilization of the input stream to be easier to use
    and better to extend. The detection of content payload on the input
    side is now more compliant with HTTP by detecting off the content
    type header instead of the request method. This also now means that
    the stream property on the request class is always available instead
    of just when the parsing fails.
  • Added support for using :class:werkzeug.wrappers.BaseResponse in a with
    statement.
  • Changed get_app_iter to fetch the response early so that it does not
    fail when wrapping a response iterable. This makes filtering easier.
  • Introduced get_data and set_data methods for responses.
  • Introduced get_data for requests.
  • Soft deprecated the data descriptors for request and response objects.
  • Added as_bytes operations to some of the headers to simplify working
    with things like cookies.
  • Made the debugger paste tracebacks into github's gist service as
    private pastes.

werkzeug 0.8.4


(bugfix release, release date to be announced)

  • Added a favicon to the debugger which fixes problem with
    state changes being triggered through a request to
    /favicon.ico in Google Chrome. This should fix some
    problems with Flask and other frameworks that use
    context local objects on a stack with context preservation
    on errors.
  • Fixed an issue with scrolling up in the debugger.
  • Fixed an issue with debuggers running on a different URL
    than the URL root.
  • Fixed a problem with proxies not forwarding some rarely
    used special methods properly.
  • Added a workaround to prevent the XSS protection from Chrome
    breaking the debugger.
  • Skip redis tests if redis is not running.
  • Fixed a typo in the multipart parser that caused content-type
    to not be picked up properly.

werkzeug 0.8.3


(bugfix release, released on February 5th 2012)

  • Fixed another issue with :func:werkzeug.wsgi.make_line_iter
    where lines longer than the buffer size were not handled
    properly.
  • Restore stdout after debug console finished executing so
    that the debugger can be used on GAE better.
  • Fixed a bug with the redis cache for int subclasses
    (affects bool caching).
  • Fixed an XSS problem with redirect targets coming from
    untrusted sources.
  • Redis cache backend now supports password authentication.

werkzeug 0.8.2


(bugfix release, released on December 16th 2011)

  • Fixed a problem with request handling of the builtin server
    not responding to socket errors properly.
  • The routing request redirect exception's code attribute is now
    used properly.
  • Fixed a bug with shutdowns on Windows.
  • Fixed a few unicode issues with non-ascii characters being
    hardcoded in URL rules.
  • Fixed two property docstrings being assigned to fdel instead
    of __doc__.
  • Fixed an issue where CRLF line endings could be split into two
    by the line iter function, causing problems with multipart file
    uploads.

werkzeug 0.8.1


(bugfix release, released on September 30th 2011)

  • Fixed an issue with the memcache not working properly.
  • Fixed an issue for Python 2.7.1 and higher that broke
    copying of multidicts with :func:copy.copy.
  • Changed hashing methodology of immutable ordered multi dicts
    for a potential problem with alternative Python implementations.

werkzeug 0.8


Released on September 29th 2011, codename Lötkolben

  • Removed data structure specific KeyErrors for a general
    purpose :exc:~werkzeug.exceptions.BadRequestKeyError.
  • Documented :meth:werkzeug.wrappers.BaseRequest._load_form_data.
  • The routing system now also accepts strings instead of
    dictionaries for the query_args parameter since we're only
    passing them through for redirects.
  • Werkzeug now automatically sets the content length immediately when
    the :attr:~werkzeug.wrappers.BaseResponse.data attribute is set
    for efficiency and simplicity reasons.
  • The routing system will now normalize server names to lowercase.
  • The routing system will no longer raise ValueErrors in case the
    configuration for the server name was incorrect. This should make
    deployment much easier because you can ignore that factor now.
  • Fixed a bug with parsing HTTP digest headers. It rejected headers
    with missing nc and nonce params.
  • Proxy fix now also updates wsgi.url_scheme based on X-Forwarded-Proto.
  • Added support for key prefixes to the redis cache.
  • Added the ability to suppress some auto corrections in the wrappers
    that are now controlled via autocorrect_location_header and
    automatically_set_content_length on the response objects.
  • Werkzeug now uses a new method to check that the length of incoming
    data is complete and will raise IO errors by itself if the server
    fails to do so.
  • :func:~werkzeug.wsgi.make_line_iter now requires a limit that is
    not higher than the length the stream can provide.
  • Refactored form parsing into a form parser class that makes it possible
    to hook into individual parts of the parsing process for debugging and
    extending.
  • For conditional responses the content length is no longer set when it
    is already there and added if missing.
  • Immutable datastructures are hashable now.
  • Headers datastructure no longer allows newlines in values to avoid
    header injection attacks.
  • Made it possible through subclassing to select a different remote
    addr in the proxy fix.
  • Added stream based URL decoding. This reduces memory usage on large
    transmitted form data that is URL decoded since Werkzeug will no longer
    load all the unparsed data into memory.
  • Memcache client now no longer uses the buggy cmemcache module and
    supports pylibmc. GAE is not tried automatically and the dedicated
    class is no longer necessary.
  • Redis cache now properly serializes data.
  • Removed support for Python 2.4

werkzeug 0.7.2


(bugfix release, released on September 30th 2011)

  • Fixed a CSRF problem with the debugger.
  • The debugger is now generating private pastes on lodgeit.
  • If URL maps are now bound to environments the query arguments
    are properly decoded from it for redirects.

werkzeug 0.7.1


(bugfix release, released on July 26th 2011)

  • Fixed a problem with newer versions of IPython.
  • Disabled pyinotify based reloader which does not work reliably.

werkzeug 0.7


Released on July 24th 2011, codename Schraubschlüssel

  • Add support for python-libmemcached to the Werkzeug cache abstraction
    layer.
  • Improved :func:url_decode and :func:url_encode performance.
  • Fixed an issue where the SharedDataMiddleware could cause an
    internal server error on weird paths when loading via pkg_resources.
  • Fixed an URL generation bug that caused URLs to be invalid if a
    generated component contains a colon.
  • :func:werkzeug.import_string now works with partially set up
    packages properly.
  • Disabled automatic socket switching for IPv6 on the development
    server due to problems it caused.
  • Werkzeug no longer overrides the Date header when creating a
    conditional HTTP response.
  • The routing system provides a method to retrieve the matching
    methods for a given path.
  • The routing system now accepts a parameter to change the encoding
    error behaviour.
  • The local manager can now accept custom ident functions in the
    constructor that are forwarded to the wrapped local objects.
  • url_unquote_plus now accepts unicode strings again.
  • Fixed an issue with the filesystem session support's prune
    function and concurrent usage.
  • Fixed a problem with external URL generation discarding the port.
  • Added support for pylibmc to the Werkzeug cache abstraction layer.
  • Fixed an issue with the new multipart parser that happened when
    a linebreak happened to be on the chunk limit.
  • Cookies are now set properly if ports are in use. A runtime error
    is raised if one tries to set a cookie for a domain without a dot.
  • Fixed an issue with Template.from_file not working for file
    descriptors.
  • Reloader can now use inotify to track reloads. This requires the
    pyinotify library to be installed.
  • Werkzeug debugger can now submit to custom lodgeit installations.
  • redirect function's status code assertion now allows 201 to be used
    as redirection code. While it's not a real redirect, it shares
    enough with redirects for the function to still be useful.
  • Fixed securecookie for pypy.
  • Fixed ValueErrors being raised on calls to best_match on
    MIMEAccept objects when invalid user data was supplied.
  • Deprecated werkzeug.contrib.kickstart and werkzeug.contrib.testtools
  • URL routing now can be passed the URL arguments to keep them for
    redirects. In the future matching on URL arguments might also be
    possible.
  • Header encoding changed from utf-8 to latin1 to support a port to
    Python 3. Bytestrings passed to the object stay untouched which
    makes it possible to have utf-8 cookies. This is a part where
    the Python 3 version will later change in that it will always
    operate on latin1 values.
  • Fixed a bug in the form parser that caused the last character to
    be dropped off if certain values in multipart data are used.
  • Multipart parser now looks at the part-individual content type
    header to override the global charset.
  • Introduced mimetype and mimetype_params attribute for the file
    storage object.
  • Changed FileStorage filename fallback logic to skip special filenames
    that Python uses for marking special files like stdin.
  • Introduced more HTTP exception classes.
  • call_on_close now can be used as a decorator.
  • Support for redis as cache backend.
  • Added BaseRequest.scheme.
  • Support for the RFC 5789 PATCH method.
  • New custom routing parser and better ordering.
  • Removed support for is_behind_proxy. Use a WSGI middleware
    instead that rewrites the REMOTE_ADDR according to your setup.
    Also see the :class:werkzeug.contrib.fixers.ProxyFix for
    a drop-in replacement.
  • Added cookie forging support to the test client.
  • Added support for host based matching in the routing system.
  • Switched from the default 'ignore' to the better 'replace'
    unicode error handling mode.
  • The builtin server now adds a function named 'werkzeug.server.shutdown'
    into the WSGI env to initiate a shutdown. This currently only works
    in Python 2.6 and later.
  • Headers are now assumed to be latin1 for better compatibility with
    Python 3 once we have support.
  • Added :func:werkzeug.security.safe_join.
  • Added accept_json property analogous to accept_html on the
    :class:werkzeug.datastructures.MIMEAccept.
  • :func:werkzeug.utils.import_string now fails with much better
    error messages that pinpoint to the problem.
  • Added support for parsing of the If-Range header
    (:func:werkzeug.http.parse_if_range_header and
    :class:werkzeug.datastructures.IfRange).
  • Added support for parsing of the Range header
    (:func:werkzeug.http.parse_range_header and
    :class:werkzeug.datastructures.Range).
  • Added support for parsing of the Content-Range header of responses
    and provided an accessor object for it
    (:func:werkzeug.http.parse_content_range_header and
    :class:werkzeug.datastructures.ContentRange).

werkzeug 0.6.2


(bugfix release, released on April 23th 2010)

  • renamed the attribute implicit_seqence_conversion attribute of the
    request object to implicit_sequence_conversion.

werkzeug 0.6.1


(bugfix release, released on April 13th 2010)

  • heavily improved local objects. Should pick up standalone greenlet
    builds now and support proxies to free callables as well. There is
    also a stacked local now that makes it possible to invoke the same
    application from within itself by pushing current request/response
    on top of the stack.
  • routing build method will also build non-default method rules properly
    if no method is provided.
  • added proper IPv6 support for the builtin server.
  • windows specific filesystem session store fixes.
    (should now be more stable under high concurrency)
  • fixed a NameError in the session system.
  • fixed a bug with empty arguments in the werkzeug.script system.
  • fixed a bug where log lines will be duplicated if an application uses
    :meth:logging.basicConfig (499)
  • added secure password hashing and checking functions.
  • HEAD is now implicitly added as method in the routing system if
    GET is present. Not doing that was considered a bug because often
    code assumed that this is the case and in web servers that do not
    normalize HEAD to GET this could break HEAD requests.
  • the script support can start SSL servers now.

werkzeug 0.6


Released on Feb 19th 2010, codename Hammer.

  • removed pending deprecations
  • sys.path is now printed from the testapp.
  • fixed an RFC 2068 incompatibility with cookie value quoting.
  • the :class:FileStorage now gives access to the multipart headers.
  • cached_property.writeable has been deprecated.
  • :meth:MapAdapter.match now accepts a return_rule keyword argument
    that returns the matched Rule instead of just the endpoint
  • :meth:routing.Map.bind_to_environ raises a more correct error message
    now if the map was bound to an invalid WSGI environment.
  • added support for SSL to the builtin development server.
  • Response objects are no longer modified in place when they are evaluated
    as WSGI applications. For backwards compatibility the fix_headers
    function is still called in case it was overridden.
    You should however change your application to use get_wsgi_headers if
    you need header modifications before responses are sent as the backwards
    compatibility support will go away in future versions.
  • :func:append_slash_redirect no longer requires the QUERY_STRING to be
    in the WSGI environment.
  • added :class:~werkzeug.contrib.wrappers.DynamicCharsetResponseMixin
  • added :class:~werkzeug.contrib.wrappers.DynamicCharsetRequestMixin
  • added :attr:BaseRequest.url_charset
  • request and response objects have a default __repr__ now.
  • builtin data structures can be pickled now.
  • the form data parser will now look at the filename instead the
    content type to figure out if it should treat the upload as regular
    form data or file upload. This fixes a bug with Google Chrome.
  • improved performance of make_line_iter and the multipart parser
    for binary uploads.
  • fixed :attr:~werkzeug.BaseResponse.is_streamed
  • fixed a path quoting bug in EnvironBuilder that caused PATH_INFO and
    SCRIPT_NAME to end up in the environ unquoted.
  • :meth:werkzeug.BaseResponse.freeze now sets the content length.
  • for unknown HTTP methods the request stream is now always limited
    instead of being empty. This makes it easier to implement DAV
    and other protocols on top of Werkzeug.
  • added :meth:werkzeug.MIMEAccept.best_match
  • multi-value test-client posts from a standard dictionary are now
    supported. Previously you had to use a multi dict.
  • rule templates properly work with submounts, subdomains and
    other rule factories now.
  • deprecated non-silent usage of the :class:werkzeug.LimitedStream.
  • added support for IRI handling to many parts of Werkzeug.
  • development server properly logs to the werkzeug logger now.
  • added :func:werkzeug.extract_path_info
  • fixed a querystring quoting bug in :func:url_fix
  • added fallback_mimetype to :class:werkzeug.SharedDataMiddleware.
  • deprecated :meth:BaseResponse.iter_encoded's charset parameter.
  • added :meth:BaseResponse.make_sequence,
    :attr:BaseResponse.is_sequence and
    :meth:BaseResponse._ensure_sequence.
  • added better repr of :class:werkzeug.Map
  • import_string accepts unicode strings as well now.
  • development server doesn't break on double slashes after the host name.
  • better __repr__ and __str__ of
    :exc:werkzeug.exceptions.HTTPException
  • test client works correctly with multiple cookies now.
  • the :class:werkzeug.routing.Map now has a class attribute with
    the default converter mapping. This helps subclasses to override
    the converters without passing them to the constructor.
  • implemented :class:OrderedMultiDict
  • improved the session support for more efficient session storing
    on the filesystem. Also added support for listing of sessions
    currently stored in the filesystem session store.
  • werkzeug no longer utilizes the Python time module for parsing
    which means that dates in a broader range can be parsed.
  • the wrappers have no class attributes that make it possible to
    swap out the dict and list types it uses.
  • werkzeug debugger should work on the appengine dev server now.
  • the URL builder supports dropping of unexpected arguments now.
    Previously they were always appended to the URL as query string.
  • profiler now writes to the correct stream.

werkzeug 0.5.1


(bugfix release for 0.5, released on July 9th 2009)

  • fixed boolean check of :class:FileStorage
  • url routing system properly supports unicode URL rules now.
  • file upload streams no longer have to provide a truncate()
    method.
  • implemented :meth:BaseRequest._form_parsing_failed.
  • fixed 394
  • :meth:ImmutableDict.copy, :meth:ImmutableMultiDict.copy and
    :meth:ImmutableTypeConversionDict.copy return mutable shallow
    copies.
  • fixed a bug with the make_runserver script action.
  • :meth:MultiDict.items and :meth:MutiDict.iteritems now accept an
    argument to return a pair for each value of each key.
  • the multipart parser works better with hand-crafted multipart
    requests now that have extra newlines added. This fixes a bug
    with setuptools uploads not handled properly (390)
  • fixed some minor bugs in the atom feed generator.
  • fixed a bug with client cookie header parsing being case sensitive.
  • fixed a not-working deprecation warning.
  • fixed package loading for :class:SharedDataMiddleware.
  • fixed a bug in the secure cookie that made server-side expiration
    on servers with a local time that was not set to UTC impossible.
  • fixed console of the interactive debugger.

werkzeug 0.5


Released on April 24th, codename Schlagbohrer.

  • requires Python 2.4 now
  • fixed a bug in :class:~contrib.IterIO
  • added :class:MIMEAccept and :class:CharsetAccept that work like the
    regular :class:Accept but have extra special normalization for mimetypes
    and charsets and extra convenience methods.
  • switched the serving system from wsgiref to something homebrew.
  • the :class:Client now supports cookies.
  • added the :mod:~werkzeug.contrib.fixers module with various
    fixes for webserver bugs and hosting setup side-effects.
  • added :mod:werkzeug.contrib.wrappers
  • added :func:is_hop_by_hop_header
  • added :func:is_entity_header
  • added :func:remove_hop_by_hop_headers
  • added :func:pop_path_info
  • added :func:peek_path_info
  • added :func:wrap_file and :class:FileWrapper
  • moved LimitedStream from the contrib package into the regular
    werkzeug one and changed the default behavior to raise exceptions
    rather than stopping without warning. The old class will stick in
    the module until 0.6.
  • implemented experimental multipart parser that replaces the old CGI hack.
  • added :func:dump_options_header and :func:parse_options_header
  • added :func:quote_header_value and :func:unquote_header_value
  • :func:url_encode and :func:url_decode now accept a separator
    argument to switch between & and ; as pair separator. The magic
    switch is no longer in place.
  • all form data parsing functions as well as the :class:BaseRequest
    object have parameters (or attributes) to limit the number of
    incoming bytes (either totally or per field).
  • added :class:LanguageAccept
  • request objects are now enforced to be read only for all collections.
  • added many new collection classes, refactored collections in general.
  • test support was refactored, semi-undocumented werkzeug.test.File
    was replaced by :class:werkzeug.FileStorage.
  • :class:EnvironBuilder was added and unifies the previous distinct
    :func:create_environ, :class:Client and
    :meth:BaseRequest.from_values. They all work the same now which
    is less confusing.
  • officially documented imports from the internal modules as undefined
    behavior. These modules were never exposed as public interfaces.
  • removed FileStorage.__len__ which previously made the object
    falsy for browsers not sending the content length which all browsers
    do.
  • :class:SharedDataMiddleware uses wrap_file now and has a
    configurable cache timeout.
  • added :class:CommonRequestDescriptorsMixin
  • added :attr:CommonResponseDescriptorsMixin.mimetype_params
  • added :mod:werkzeug.contrib.lint
  • added passthrough_errors to run_simple.
  • added secure_filename
  • added :func:make_line_iter
  • :class:MultiDict copies now instead of revealing internal
    lists to the caller for getlist and iteration functions that
    return lists.
  • added :attr:follow_redirect to the :func:open of :class:Client.
  • added support for extra_files in
    :func:~werkzeug.script.make_runserver

werkzeug 0.4.1


(Bugfix release, released on January 11th 2009)

  • werkzeug.contrib.cache.Memcached accepts now objects that
    implement the memcache.Client interface as alternative to a list of
    strings with server addresses.
    There is also now a GAEMemcachedCache that connects to the Google
    appengine cache.
  • explicitly convert secret keys to bytestrings now because Python
    2.6 no longer does that.
  • url_encode and all interfaces that call it, support ordering of
    options now which however is disabled by default.
  • the development server no longer resolves the addresses of clients.
  • Fixed a typo in werkzeug.test that broke File.
  • Map.bind_to_environ uses the Host header now if available.
  • Fixed BaseCache.get_dict (345)
  • werkzeug.test.Client can now run the application buffered in which
    case the application is properly closed automatically.
  • Fixed Headers.set (354). Caused header duplication before.
  • Fixed Headers.pop (349). default parameter was not properly
    handled.
  • Fixed UnboundLocalError in create_environ (351)
  • Headers is more compatible with wsgiref now.
  • Template.render accepts multidicts now.
  • dropped support for Python 2.3

werkzeug 0.4


Released on November 23rd 2008, codename Schraubenzieher.

  • Client supports an empty data argument now.
  • fixed a bug in Response.application that made it impossible to use it
    as method decorator.
  • the session system should work on appengine now
  • the secure cookie works properly in load balanced environments with
    different cpu architectures now.
  • CacheControl.no_cache and CacheControl.private behavior changed to
    reflect the possibilities of the HTTP RFC. Setting these attributes to
    None or True now sets the value to "the empty value".
    More details in the documentation.
  • fixed werkzeug.contrib.atom.AtomFeed.__call__. (338)
  • BaseResponse.make_conditional now always returns self. Previously
    it didn't for post requests and such.
  • fixed a bug in boolean attribute handling of html and xhtml.
  • added graceful error handling to the debugger pastebin feature.
  • added a more list like interface to Headers (slicing and indexing
    works now)
  • fixed a bug with the __setitem__ method of Headers that didn't
    properly remove all keys on replacing.
  • added remove_entity_headers which removes all entity headers from
    a list of headers (or a Headers object)
  • the responses now automatically call remove_entity_headers if the
    status code is 304.
  • fixed a bug with Href query parameter handling. Previously the last
    item of a call to Href was not handled properly if it was a dict.
  • headers now support a pop operation to better work with environ
    properties.

werkzeug 0.3.1


(bugfix release, released on June 24th 2008)

  • fixed a security problem with werkzeug.contrib.SecureCookie.

werkzeug 0.3


Released on June 14th 2008, codename EUR325CAT6.

  • added support for redirecting in url routing.
  • added Authorization and AuthorizationMixin
  • added WWWAuthenticate and WWWAuthenticateMixin
  • added parse_list_header
  • added parse_dict_header
  • added parse_authorization_header
  • added parse_www_authenticate_header
  • added _get_current_object method to LocalProxy objects
  • added parse_form_data
  • MultiDict, CombinedMultiDict, Headers, and EnvironHeaders raise
    special key errors now that are subclasses of BadRequest so if you
    don't catch them they give meaningful HTTP responses.
  • added support for alternative encoding error handling and the new
    HTTPUnicodeError which (if not caught) behaves like a BadRequest.
  • added BadRequest.wrap.
  • added ETag support to the SharedDataMiddleware and added an option
    to disable caching.
  • fixed is_xhr on the request objects.
  • fixed error handling of the url adapter's dispatch method. (318)
  • fixed bug with SharedDataMiddleware.
  • fixed Accept.values.
  • EnvironHeaders contain content-type and content-length now
  • url_encode treats lists and tuples in dicts passed to it as multiple
    values for the same key so that one doesn't have to pass a MultiDict
    to the function.
  • added validate_arguments
  • added BaseRequest.application
  • improved Python 2.3 support
  • run_simple accepts use_debugger and use_evalex parameters now,
    like the make_runserver factory function from the script module.
  • the environ_property is now read-only by default
  • it's now possible to initialize requests as "shallow" requests which
    causes runtime errors if the request object tries to consume the
    input stream.

werkzeug 0.2


Released Feb 14th 2008, codename Faustkeil.

  • Added AnyConverter to the routing system.
  • Added werkzeug.contrib.securecookie
  • Exceptions have a get_response() method that return a response object
  • fixed the path ordering bug (293), thanks Thomas Johansson
  • BaseReporterStream is now part of the werkzeug contrib module. From
    Werkzeug 0.3 onwards you will have to import it from there.
  • added DispatcherMiddleware.
  • RequestRedirect is now a subclass of HTTPException and uses a
    301 status code instead of 302.
  • url_encode and url_decode can optionally treat keys as unicode strings
    now, too.
  • werkzeug.script has a different caller format for boolean arguments now.
  • renamed lazy_property to cached_property.
  • added import_string.
  • added is_* properties to request objects.
  • added empty() method to routing rules.
  • added werkzeug.contrib.profiler.
  • added extends to Headers.
  • added dump_cookie and parse_cookie.
  • added as_tuple to the Client.
  • added werkzeug.contrib.testtools.
  • added werkzeug.unescape
  • added BaseResponse.freeze
  • added werkzeug.contrib.atom
  • the HTTPExceptions accept an argument description now which overrides the
    default description.
  • the MapAdapter has a default for path info now. If you use
    bind_to_environ you don't have to pass the path later.
  • the wsgiref subclass werkzeug uses for the dev server does not use direct
    sys.stderr logging any more but a logger called "werkzeug".
  • implemented Href.
  • implemented find_modules
  • refactored request and response objects into base objects, mixins and
    full featured subclasses that implement all mixins.
  • added simple user agent parser
  • werkzeug's routing raises MethodNotAllowed now if it matches a
    rule but for a different method.
  • many fixes and small improvements

werkzeug 0.1


Released on Dec 9th 2007, codename Wictorinoxger.

  • Initial release

@codecov
Copy link

codecov bot commented Jun 13, 2020

Codecov Report

Merging #7430 into master will increase coverage by 0.02%.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #7430      +/-   ##
==========================================
+ Coverage   45.42%   45.45%   +0.02%     
==========================================
  Files         279      279              
  Lines       14055    14055              
  Branches     2122     2122              
==========================================
+ Hits         6384     6388       +4     
+ Misses       7386     7380       -6     
- Partials      285      287       +2     
Impacted Files Coverage Δ
decksite/view.py 60.85% <0.00%> (ø)
maintenance/elo.py 0.00% <0.00%> (ø)
decksite/data/rule.py 23.47% <0.00%> (ø)
decksite/views/person_achievements.py 35.00% <0.00%> (ø)
magic/image_fetcher.py 35.89% <0.00%> (+1.28%) ⬆️
discordbot/commands/rhinos.py 91.66% <0.00%> (+8.33%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 00215bf...2a3264c. Read the comment docs.

@mergify mergify bot merged commit d4e6981 into master Jun 13, 2020
@mergify mergify bot deleted the pyup-initial-update branch June 13, 2020 06:00
@vorpal-buildbot
Copy link
Contributor

Seen on LOGS (created by @pyup-bot and merged by @mergify[bot] 17 seconds ago) Please check your changes!

@vorpal-buildbot vorpal-buildbot added Seen-on-PROD and removed Pending-on-PROD Used by the build bot labels Jun 13, 2020
@vorpal-buildbot
Copy link
Contributor

Seen on PROD (created by @pyup-bot and merged by @mergify[bot] 54 seconds ago) Please check your changes!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants