diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f5e1b00e..6906b471b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,15 +10,64 @@ You can find our backwards-compatibility policy [here](https://github.com/python Changes for the upcoming release can be found in the [`changelog.d` directory](https://github.com/python-attrs/attrs/tree/main/changelog.d) in our repository. - -This changelog is managed by towncrier and is compiled at release time. +## [24.1.0](https://github.com/python-attrs/attrs/tree/24.1.0) - 2024-08-03 -See https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md#changelog for details. ---> +### Backwards-incompatible Changes - +- `attrs.evolve()` doesn't accept the *inst* argument as a keyword argument anymore. + Pass it as the first positional argument instead. + [#1264](https://github.com/python-attrs/attrs/issues/1264) +- `attrs.validators.provides()` has been removed. + The removed code is available as a [gist](https://gist.github.com/hynek/9eaaaeb659808f3519870dfa16d2b6b2) for convenient copy and pasting. + [#1265](https://github.com/python-attrs/attrs/issues/1265) +- All packaging metadata except from `__version__` and `__version_info__` has been removed from the `attr` and `attrs` modules (for example, `attrs.__url__`). + + Please use [`importlib.metadata`](https://docs.python.org/3/library/importlib.metadata.html) or [*importlib_metadata*](https://pypi.org/project/importlib-metadata/) instead. + [#1268](https://github.com/python-attrs/attrs/issues/1268) +- Speed up the generated `__eq__` methods significantly by generating a chain of attribute comparisons instead of constructing and comparing tuples. + This change arguably makes the behavior more correct, + but changes it if an attribute compares equal by identity but not value, like `float('nan')`. + [#1310](https://github.com/python-attrs/attrs/issues/1310) + + +### Deprecations + +- The *repr_ns* argument to `attr.s` is now deprecated. + It was a workaround for nested classes in Python 2 and is pointless in Python 3. + [#1263](https://github.com/python-attrs/attrs/issues/1263) +- The *hash* argument to `@attr.s`, `@attrs.define`, and `make_class()` is now deprecated in favor of *unsafe_hash*, as defined by PEP 681. + [#1323](https://github.com/python-attrs/attrs/issues/1323) + + +### Changes + +- Allow original slotted `functools.cached_property` classes to be cleaned by garbage collection. + Allow `super()` calls in slotted cached properties. + [#1221](https://github.com/python-attrs/attrs/issues/1221) +- Our type stubs now use modern type notation and are organized such that VS Code's quick-fix prefers the `attrs` namespace. + [#1234](https://github.com/python-attrs/attrs/issues/1234) +- Preserve `AttributeError` raised by properties of slotted classes with `functools.cached_properties`. + [#1253](https://github.com/python-attrs/attrs/issues/1253) +- It is now possible to wrap a converter into an `attrs.Converter` and get the current instance and/or the current field definition passed into the converter callable. + + Note that this is not supported by any type checker, yet. + [#1267](https://github.com/python-attrs/attrs/issues/1267) +- `attrs.make_class()` now populates the `__annotations__` dict of the generated class, so that `attrs.resolve_types()` can resolve them. + [#1285](https://github.com/python-attrs/attrs/issues/1285) +- Added the `attrs.validators.or_()` validator. + [#1303](https://github.com/python-attrs/attrs/issues/1303) +- The combination of a `__attrs_pre_init__` that takes arguments, a kw-only field, and a default on that field does not crash anymore. + [#1319](https://github.com/python-attrs/attrs/issues/1319) +- `attrs.validators.in_()` now transforms certain unhashable options to tuples to keep the field hashable. + + This allows fields that use this validator to be used with, for example, `attrs.filters.include()`. + [#1320](https://github.com/python-attrs/attrs/issues/1320) +- If a class has an *inherited* method called `__attrs_init_subclass__`, it is now called once the class is done assembling. + + This is a replacement for Python's `__init_subclass__` and useful for registering classes, and similar. + [#1321](https://github.com/python-attrs/attrs/issues/1321) ## [23.2.0](https://github.com/python-attrs/attrs/tree/23.2.0) - 2023-12-31 diff --git a/changelog.d/1221.change.md b/changelog.d/1221.change.md deleted file mode 100644 index c1f84c38d..000000000 --- a/changelog.d/1221.change.md +++ /dev/null @@ -1,2 +0,0 @@ -Allow original slotted `functools.cached_property` classes to be cleaned by garbage collection. -Allow `super()` calls in slotted cached properties. diff --git a/changelog.d/1234.change.md b/changelog.d/1234.change.md deleted file mode 100644 index 0fbb078f0..000000000 --- a/changelog.d/1234.change.md +++ /dev/null @@ -1 +0,0 @@ -Our type stubs now use modern type notation and are organized such that VS Code's quick-fix prefers the `attrs` namespace. diff --git a/changelog.d/1253.change.md b/changelog.d/1253.change.md deleted file mode 100644 index 3c32d8356..000000000 --- a/changelog.d/1253.change.md +++ /dev/null @@ -1 +0,0 @@ -Preserve `AttributeError` raised by properties of slotted classes with `functools.cached_properties`. diff --git a/changelog.d/1263.deprecation.md b/changelog.d/1263.deprecation.md deleted file mode 100644 index 25939511b..000000000 --- a/changelog.d/1263.deprecation.md +++ /dev/null @@ -1,2 +0,0 @@ -The *repr_ns* argument to `attr.s` is now deprecated. -It was a workaround for nested classes in Python 2 and is pointless in Python 3. diff --git a/changelog.d/1264.breaking.md b/changelog.d/1264.breaking.md deleted file mode 100644 index f268e2d08..000000000 --- a/changelog.d/1264.breaking.md +++ /dev/null @@ -1,2 +0,0 @@ -`attrs.evolve()` doesn't accept the *inst* argument as a keyword argument anymore. -Pass it as the first positional argument instead. diff --git a/changelog.d/1265.breaking.md b/changelog.d/1265.breaking.md deleted file mode 100644 index 1edd7d10a..000000000 --- a/changelog.d/1265.breaking.md +++ /dev/null @@ -1,2 +0,0 @@ -`attrs.validators.provides()` has been removed. -The removed code is available as a [gist](https://gist.github.com/hynek/9eaaaeb659808f3519870dfa16d2b6b2) for convenient copy and pasting. diff --git a/changelog.d/1267.change.md b/changelog.d/1267.change.md deleted file mode 100644 index 2b31c576a..000000000 --- a/changelog.d/1267.change.md +++ /dev/null @@ -1,3 +0,0 @@ -It is now possible to wrap a converter into an `attrs.Converter` and get the current instance and/or the current field definition passed into the converter callable. - -Note that this is not supported by any type checker, yet. diff --git a/changelog.d/1268.breaking.md b/changelog.d/1268.breaking.md deleted file mode 100644 index 25ce9c630..000000000 --- a/changelog.d/1268.breaking.md +++ /dev/null @@ -1,3 +0,0 @@ -All packaging metadata except from `__version__` and `__version_info__` has been removed from the `attr` and `attrs` modules (for example, `attrs.__url__`). - -Please use [`importlib.metadata`](https://docs.python.org/3/library/importlib.metadata.html) or [*importlib_metadata*](https://pypi.org/project/importlib-metadata/) instead. diff --git a/changelog.d/1285.change.md b/changelog.d/1285.change.md deleted file mode 100644 index 5f5a2997a..000000000 --- a/changelog.d/1285.change.md +++ /dev/null @@ -1 +0,0 @@ -`attrs.make_class()` now populates the `__annotations__` dict of the generated class, so that `attrs.resolve_types()` can resolve them. diff --git a/changelog.d/1303.change.md b/changelog.d/1303.change.md deleted file mode 100644 index 10e79c14e..000000000 --- a/changelog.d/1303.change.md +++ /dev/null @@ -1 +0,0 @@ -Added the `attrs.validators.or_()` validator. diff --git a/changelog.d/1310.breaking.md b/changelog.d/1310.breaking.md deleted file mode 100644 index a8f0a7228..000000000 --- a/changelog.d/1310.breaking.md +++ /dev/null @@ -1,3 +0,0 @@ -Speed up the generated `__eq__` methods significantly by generating a chain of attribute comparisons instead of constructing and comparing tuples. -This change arguably makes the behavior more correct, -but changes it if an attribute compares equal by identity but not value, like `float('nan')`. diff --git a/changelog.d/1319.change.md b/changelog.d/1319.change.md deleted file mode 100644 index 02ae14166..000000000 --- a/changelog.d/1319.change.md +++ /dev/null @@ -1 +0,0 @@ -The combination of a `__attrs_pre_init__` that takes arguments, a kw-only field, and a default on that field does not crash anymore. diff --git a/changelog.d/1320.change.md b/changelog.d/1320.change.md deleted file mode 100644 index 5c849b876..000000000 --- a/changelog.d/1320.change.md +++ /dev/null @@ -1,3 +0,0 @@ -`attrs.validators.in_()` now transforms certain unhashable options to tuples to keep the field hashable. - -This allows fields that use this validator to be used with, for example, `attrs.filters.include()`. diff --git a/changelog.d/1321.change.md b/changelog.d/1321.change.md deleted file mode 100644 index 94c8c1483..000000000 --- a/changelog.d/1321.change.md +++ /dev/null @@ -1,3 +0,0 @@ -If a class has an *inherited* method called `__attrs_init_subclass__`, it is now called once the class is done assembling. - -This is a replacement for Python's `__init_subclass__` and useful for registering classes, and similar. diff --git a/changelog.d/1323.deprecation.md b/changelog.d/1323.deprecation.md deleted file mode 100644 index b699885a5..000000000 --- a/changelog.d/1323.deprecation.md +++ /dev/null @@ -1 +0,0 @@ -The *hash* argument to `@attr.s`, `@attrs.define`, and `make_class()` is now deprecated in favor of *unsafe_hash*, as defined by PEP 681.