| Age | Commit message (Collapse) | Author |
|
|
|
Co-authored-by: Natalia Bidart <124304+nessita@users.noreply.github.com>
|
|
This makes it easier to work with lazy iterators used for callables,
etc. when extracting items or comparing to lists, e.g. during testing.
Also added `BaseChoiceIterator.__iter__()` to make it clear that
subclasses must implement this and added `__all__` to the module.
Co-authored-by: Adam Johnson <me@adamj.eu>
Co-authored-by: Natalia Bidart <124304+nessita@users.noreply.github.com>
|
|
|
|
django.utils.text.Truncator when truncating HTML text.
Thanks Wenchao Li of Alibaba Group for the report.
|
|
|
|
|
|
This also uses enum.EnumType for Python 3.11+ as Python 3.11 renamed
EnumMeta to EnumType. While the former is still available as an alias
of the latter for now, let's prefer the canonical name for this.
Check out https://docs.python.org/3/library/enum.html#enum.EnumType
|
|
Some third-party applications, e.g. `django-filter`, already define
their own `ChoiceIterator`, so renaming this `BaseChoiceIterator` will
be a better fit and avoid any potential confusion.
See https://github.com/carltongibson/django-filter/pull/1607.
|
|
django.utils.encoding.uri_to_iri().
Thanks MProgrammer (https://hackerone.com/mprogrammer) for the report.
Co-authored-by: nessita <124304+nessita@users.noreply.github.com>
|
|
choices.
Thanks Collin Anderson for the report.
Regression in 500e01073adda32d5149624ee9a5cb7aa3d3583f.
|
|
ChoiceField's choices.
|
|
Windows.
|
|
Special characters lose their special meaning inside sets of characters.
"-" lose its special meaning if it's placed as the first or last
character.
Follow up to 7c6b66383da5f9a67142334cd2ed2d769739e8f1.
|
|
|
|
|
|
This allows for formatting of lazy objects which have a custom formatter
defined by overriding the default implementation from `object`.
|
|
|
|
We can avoid the function call and assignment overhead which could be
significant when instantiating many lazy objects. It's still easy enough
to read too.
|
|
Previously, the proxy class was prepared lazily:
lazy_identity = lazy(identity, int)
lazy_identity(10) # prepared here
lazy_identity(10)
This has a slight advantage that if the lazy doesn't end up getting
used, the preparation work is skipped, however that's not very likely.
Besides this laziness, it is also inconsistent in that the methods which
are wrapped directly (__str__ etc.) are prepared already when __proxy__
is defined, and there is a weird half-initialized state.
This change it so that everything is prepared already on the first line
of the example above.
|
|
This order reads more naturally and puts methods into three groups:
1. The methods required to support the implementation of __proxy__, e.g.
__deepcopy__ doesn't come from `object` and __reduce__ is
overridden to support behavior required explicitly for pickling of
lazy objects.
2. Methods that are specifically overridden from `object` which we
don't want to inherit from the provided resultclasses. These will be
skipped later when we add methods from the resultclasses.
3. Additional methods - that is _add__, __radd__, and __mod__ - don't
come from `object`, but typically from `str` and `int` which are the
most common use cases.
Co-authored-by: Nick Pope <nick@nickpope.me.uk>
|
|
@total_ordering is slow. Using the following micro-benchmark
(resultclasses intentionally omitted to narrow the scope):
import cProfile
from django.utils.functional import lazy
def identity(x): return x
cProfile.run("for i in range(10000): str(lazy(identity)(1))")
Before:
380003 function calls in 0.304 seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.016 0.016 0.304 0.304 <string>:1(<module>)
10000 0.002 0.000 0.002 0.000 bench.py:5(double)
10000 0.005 0.000 0.006 0.000 functional.py:100(__cast)
10000 0.007 0.000 0.013 0.000 functional.py:106(__str__)
10000 0.005 0.000 0.017 0.000 functional.py:140(__wrapper__)
10000 0.020 0.000 0.258 0.000 functional.py:60(lazy)
10000 0.039 0.000 0.039 0.000 functional.py:68(__proxy__)
10000 0.010 0.000 0.012 0.000 functional.py:77(__init__)
10000 0.002 0.000 0.002 0.000 functional.py:84(__prepare_class__)
10000 0.025 0.000 0.075 0.000 functools.py:186(total_ordering)
10000 0.015 0.000 0.028 0.000 functools.py:189(<setcomp>)
10000 0.024 0.000 0.044 0.000 functools.py:37(update_wrapper)
10000 0.005 0.000 0.005 0.000 functools.py:67(wraps)
10000 0.074 0.000 0.114 0.000 {built-in method builtins.__build_class__}
1 0.000 0.000 0.304 0.304 {built-in method builtins.exec}
150000 0.023 0.000 0.023 0.000 {built-in method builtins.getattr}
10000 0.004 0.000 0.004 0.000 {built-in method builtins.max}
80000 0.025 0.000 0.025 0.000 {built-in method builtins.setattr}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
10000 0.003 0.000 0.003 0.000 {method 'update' of 'dict' objects}
After:
240003 function calls in 0.231 seconds
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.016 0.016 0.231 0.231 <string>:1(<module>)
10000 0.002 0.000 0.002 0.000 bench.py:5(double)
10000 0.006 0.000 0.012 0.000 functional.py:105(__str__)
10000 0.005 0.000 0.017 0.000 functional.py:159(__wrapper__)
10000 0.015 0.000 0.186 0.000 functional.py:60(lazy)
10000 0.022 0.000 0.022 0.000 functional.py:68(__proxy__)
10000 0.010 0.000 0.012 0.000 functional.py:76(__init__)
10000 0.002 0.000 0.002 0.000 functional.py:83(__prepare_class__)
10000 0.004 0.000 0.006 0.000 functional.py:99(__cast)
10000 0.023 0.000 0.043 0.000 functools.py:37(update_wrapper)
10000 0.004 0.000 0.004 0.000 functools.py:67(wraps)
10000 0.102 0.000 0.124 0.000 {built-in method builtins.__build_class__}
1 0.000 0.000 0.231 0.231 {built-in method builtins.exec}
70000 0.011 0.000 0.011 0.000 {built-in method builtins.getattr}
50000 0.007 0.000 0.007 0.000 {built-in method builtins.setattr}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
10000 0.003 0.000 0.003 0.000 {method 'update' of 'dict' objects}
|
|
They are no longer special cased.
|
|
|
|
Unnecessary since c716fe87821df00f9f03ecc761c914d1682591a2 and
7b2f2e74adb36a4334e83130f6abc2f79d395235.
|
|
may be bytes.
If the result type is bytes, then calling bytes() on it does nothing.
If the result type is not bytes, we should not cast to bytes, just
because the return value may be bytes.
|
|
|
|
patterns are used.
Regression in 94e7f471c4edef845a4fe5e3160132997b4cca81.
This reverts commit 94e7f471c4edef845a4fe5e3160132997b4cca81
(refs #34069) and
partly reverts commit 3b4728310a7a64f8fcc548163b0aa5f98a5c78f5.
Thanks Anthony Baillard for the report.
Co-Authored-By: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com>
|
|
|
|
different days and interval less than 1 day.
Follow up to 813015d67e2557fa859a07930a9becec4e5f64a0.
Regression in 8d67e16493c903adc9d049141028bc0fff43f8c8.
|
|
interval less than 1 day.
Regression in 8d67e16493c903adc9d049141028bc0fff43f8c8.
Thanks Lorenzo Peña for the report.
|
|
argument when fallback language is used.
Regression in 94e7f471c4edef845a4fe5e3160132997b4cca81.
Thanks Oussama Jarrousse for the report.
|
|
https://github.com/python/cpython/commit/2a4d8c0a9e88f45047da640ce5a92b304d2d39b1
|
|
This removes __text_cast() as it's the same as __cast().
_delegate_bytes and __delegate_text are mutually exclusive so the
`if self._delegate_bytes` branch in __cast() is unreachable.
Co-Authored-By: David Sanders <shang.xiao.sanders@gmail.com>
|
|
Unused since c716fe87821df00f9f03ecc761c914d1682591a2.
|
|
Black 23.1.0 is released which, as the first release of the year,
introduces the 2023 stable style. This incorporates most of last year's
preview style.
https://github.com/psf/black/releases/tag/23.1.0
|
|
Accept-Language.
The parsed values of Accept-Language headers are cached in order to
avoid repetitive parsing. This leads to a potential denial-of-service
vector via excessive memory usage if the raw value of Accept-Language
headers is very large.
Accept-Language headers are now limited to a maximum length in order
to avoid this issue.
|
|
graphlib.TopologicalSort().
graphlib.TopologicalSort() is available since Python 3.9.
|
|
|
|
Available since Python 3.10 where it was reintroduced.
|
|
isocalendar() returns a namedtuple() instead of tuple in Python 3.9+
|
|
|
|
|
|
|
|
django.utils.functional.cached_property().
Per deprecation timeline.
|
|
Per deprecation timeline.
|
|
|
|
|
|
timeline.
|
|
|