mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-08-19 12:59:42 -07:00
Bump tempora from 5.2.1 to 5.5.0 (#2111)
* Bump tempora from 5.2.1 to 5.5.0 Bumps [tempora](https://github.com/jaraco/tempora) from 5.2.1 to 5.5.0. - [Release notes](https://github.com/jaraco/tempora/releases) - [Changelog](https://github.com/jaraco/tempora/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/tempora/compare/v5.2.1...v5.5.0) --- updated-dependencies: - dependency-name: tempora dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Update tempora==5.5.0 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> [skip ci]
This commit is contained in:
parent
9a196f3dca
commit
1e903b164b
10 changed files with 429 additions and 133 deletions
|
@ -9,11 +9,10 @@ Some backward-compatible usability improvements have been made.
|
|||
"""
|
||||
import math
|
||||
import operator
|
||||
import warnings
|
||||
|
||||
from collections import deque
|
||||
from collections.abc import Sized
|
||||
from functools import reduce
|
||||
from functools import partial, reduce
|
||||
from itertools import (
|
||||
chain,
|
||||
combinations,
|
||||
|
@ -29,7 +28,6 @@ from itertools import (
|
|||
zip_longest,
|
||||
)
|
||||
from random import randrange, sample, choice
|
||||
from sys import hexversion
|
||||
|
||||
__all__ = [
|
||||
'all_equal',
|
||||
|
@ -52,7 +50,9 @@ __all__ = [
|
|||
'pad_none',
|
||||
'pairwise',
|
||||
'partition',
|
||||
'polynomial_eval',
|
||||
'polynomial_from_roots',
|
||||
'polynomial_derivative',
|
||||
'powerset',
|
||||
'prepend',
|
||||
'quantify',
|
||||
|
@ -65,6 +65,7 @@ __all__ = [
|
|||
'sieve',
|
||||
'sliding_window',
|
||||
'subslices',
|
||||
'sum_of_squares',
|
||||
'tabulate',
|
||||
'tail',
|
||||
'take',
|
||||
|
@ -77,6 +78,18 @@ __all__ = [
|
|||
_marker = object()
|
||||
|
||||
|
||||
# zip with strict is available for Python 3.10+
|
||||
try:
|
||||
zip(strict=True)
|
||||
except TypeError:
|
||||
_zip_strict = zip
|
||||
else:
|
||||
_zip_strict = partial(zip, strict=True)
|
||||
|
||||
# math.sumprod is available for Python 3.12+
|
||||
_sumprod = getattr(math, 'sumprod', lambda x, y: dotproduct(x, y))
|
||||
|
||||
|
||||
def take(n, iterable):
|
||||
"""Return first *n* items of the iterable as a list.
|
||||
|
||||
|
@ -293,7 +306,7 @@ def _pairwise(iterable):
|
|||
"""
|
||||
a, b = tee(iterable)
|
||||
next(b, None)
|
||||
yield from zip(a, b)
|
||||
return zip(a, b)
|
||||
|
||||
|
||||
try:
|
||||
|
@ -303,7 +316,7 @@ except ImportError:
|
|||
else:
|
||||
|
||||
def pairwise(iterable):
|
||||
yield from itertools_pairwise(iterable)
|
||||
return itertools_pairwise(iterable)
|
||||
|
||||
pairwise.__doc__ = _pairwise.__doc__
|
||||
|
||||
|
@ -334,13 +347,9 @@ def _zip_equal(*iterables):
|
|||
for i, it in enumerate(iterables[1:], 1):
|
||||
size = len(it)
|
||||
if size != first_size:
|
||||
break
|
||||
else:
|
||||
# If we didn't break out, we can use the built-in zip.
|
||||
return zip(*iterables)
|
||||
|
||||
# If we did break out, there was a mismatch.
|
||||
raise UnequalIterablesError(details=(first_size, i, size))
|
||||
raise UnequalIterablesError(details=(first_size, i, size))
|
||||
# All sizes are equal, we can use the built-in zip.
|
||||
return zip(*iterables)
|
||||
# If any one of the iterables didn't have a length, start reading
|
||||
# them until one runs out.
|
||||
except TypeError:
|
||||
|
@ -433,12 +442,9 @@ def partition(pred, iterable):
|
|||
if pred is None:
|
||||
pred = bool
|
||||
|
||||
evaluations = ((pred(x), x) for x in iterable)
|
||||
t1, t2 = tee(evaluations)
|
||||
return (
|
||||
(x for (cond, x) in t1 if not cond),
|
||||
(x for (cond, x) in t2 if cond),
|
||||
)
|
||||
t1, t2, p = tee(iterable, 3)
|
||||
p1, p2 = tee(map(pred, p))
|
||||
return (compress(t1, map(operator.not_, p1)), compress(t2, p2))
|
||||
|
||||
|
||||
def powerset(iterable):
|
||||
|
@ -712,12 +718,14 @@ def convolve(signal, kernel):
|
|||
is immediately consumed and stored.
|
||||
|
||||
"""
|
||||
# This implementation intentionally doesn't match the one in the itertools
|
||||
# documentation.
|
||||
kernel = tuple(kernel)[::-1]
|
||||
n = len(kernel)
|
||||
window = deque([0], maxlen=n) * n
|
||||
for x in chain(signal, repeat(0, n - 1)):
|
||||
window.append(x)
|
||||
yield sum(map(operator.mul, kernel, window))
|
||||
yield _sumprod(kernel, window)
|
||||
|
||||
|
||||
def before_and_after(predicate, it):
|
||||
|
@ -778,9 +786,7 @@ def sliding_window(iterable, n):
|
|||
For a variant with more features, see :func:`windowed`.
|
||||
"""
|
||||
it = iter(iterable)
|
||||
window = deque(islice(it, n), maxlen=n)
|
||||
if len(window) == n:
|
||||
yield tuple(window)
|
||||
window = deque(islice(it, n - 1), maxlen=n)
|
||||
for x in it:
|
||||
window.append(x)
|
||||
yield tuple(window)
|
||||
|
@ -807,12 +813,8 @@ def polynomial_from_roots(roots):
|
|||
>>> polynomial_from_roots(roots) # x^3 - 4 * x^2 - 17 * x + 60
|
||||
[1, -4, -17, 60]
|
||||
"""
|
||||
# Use math.prod for Python 3.8+,
|
||||
prod = getattr(math, 'prod', lambda x: reduce(operator.mul, x, 1))
|
||||
roots = list(map(operator.neg, roots))
|
||||
return [
|
||||
sum(map(prod, combinations(roots, k))) for k in range(len(roots) + 1)
|
||||
]
|
||||
factors = zip(repeat(1), map(operator.neg, roots))
|
||||
return list(reduce(convolve, factors, [1]))
|
||||
|
||||
|
||||
def iter_index(iterable, value, start=0):
|
||||
|
@ -830,9 +832,13 @@ def iter_index(iterable, value, start=0):
|
|||
except AttributeError:
|
||||
# Slow path for general iterables
|
||||
it = islice(iterable, start, None)
|
||||
for i, element in enumerate(it, start):
|
||||
if element is value or element == value:
|
||||
i = start - 1
|
||||
try:
|
||||
while True:
|
||||
i = i + operator.indexOf(it, value) + 1
|
||||
yield i
|
||||
except ValueError:
|
||||
pass
|
||||
else:
|
||||
# Fast path for sequences
|
||||
i = start - 1
|
||||
|
@ -850,43 +856,45 @@ def sieve(n):
|
|||
>>> list(sieve(30))
|
||||
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
||||
"""
|
||||
isqrt = getattr(math, 'isqrt', lambda x: int(math.sqrt(x)))
|
||||
data = bytearray((0, 1)) * (n // 2)
|
||||
data[:3] = 0, 0, 0
|
||||
limit = isqrt(n) + 1
|
||||
limit = math.isqrt(n) + 1
|
||||
for p in compress(range(limit), data):
|
||||
data[p * p : n : p + p] = bytes(len(range(p * p, n, p + p)))
|
||||
data[2] = 1
|
||||
return iter_index(data, 1) if n > 2 else iter([])
|
||||
|
||||
|
||||
def batched(iterable, n):
|
||||
def _batched(iterable, n):
|
||||
"""Batch data into lists of length *n*. The last batch may be shorter.
|
||||
|
||||
>>> list(batched('ABCDEFG', 3))
|
||||
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
|
||||
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]
|
||||
|
||||
This recipe is from the ``itertools`` docs. This library also provides
|
||||
:func:`chunked`, which has a different implementation.
|
||||
On Python 3.12 and above, this is an alias for :func:`itertools.batched`.
|
||||
"""
|
||||
if hexversion >= 0x30C00A0: # Python 3.12.0a0
|
||||
warnings.warn(
|
||||
(
|
||||
'batched will be removed in a future version of '
|
||||
'more-itertools. Use the standard library '
|
||||
'itertools.batched function instead'
|
||||
),
|
||||
DeprecationWarning,
|
||||
)
|
||||
|
||||
if n < 1:
|
||||
raise ValueError('n must be at least one')
|
||||
it = iter(iterable)
|
||||
while True:
|
||||
batch = list(islice(it, n))
|
||||
batch = tuple(islice(it, n))
|
||||
if not batch:
|
||||
break
|
||||
yield batch
|
||||
|
||||
|
||||
try:
|
||||
from itertools import batched as itertools_batched
|
||||
except ImportError:
|
||||
batched = _batched
|
||||
else:
|
||||
|
||||
def batched(iterable, n):
|
||||
return itertools_batched(iterable, n)
|
||||
|
||||
batched.__doc__ = _batched.__doc__
|
||||
|
||||
|
||||
def transpose(it):
|
||||
"""Swap the rows and columns of the input.
|
||||
|
||||
|
@ -894,21 +902,21 @@ def transpose(it):
|
|||
[(1, 11), (2, 22), (3, 33)]
|
||||
|
||||
The caller should ensure that the dimensions of the input are compatible.
|
||||
If the input is empty, no output will be produced.
|
||||
"""
|
||||
# TODO: when 3.9 goes end-of-life, add stric=True to this.
|
||||
return zip(*it)
|
||||
return _zip_strict(*it)
|
||||
|
||||
|
||||
def matmul(m1, m2):
|
||||
"""Multiply two matrices.
|
||||
>>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
|
||||
[[49, 80], [41, 60]]
|
||||
[(49, 80), (41, 60)]
|
||||
|
||||
The caller should ensure that the dimensions of the input matrices are
|
||||
compatible with each other.
|
||||
"""
|
||||
n = len(m2[0])
|
||||
return batched(starmap(dotproduct, product(m1, transpose(m2))), n)
|
||||
return batched(starmap(_sumprod, product(m1, transpose(m2))), n)
|
||||
|
||||
|
||||
def factor(n):
|
||||
|
@ -916,15 +924,54 @@ def factor(n):
|
|||
>>> list(factor(360))
|
||||
[2, 2, 2, 3, 3, 5]
|
||||
"""
|
||||
isqrt = getattr(math, 'isqrt', lambda x: int(math.sqrt(x)))
|
||||
for prime in sieve(isqrt(n) + 1):
|
||||
for prime in sieve(math.isqrt(n) + 1):
|
||||
while True:
|
||||
quotient, remainder = divmod(n, prime)
|
||||
if remainder:
|
||||
if n % prime:
|
||||
break
|
||||
yield prime
|
||||
n = quotient
|
||||
n //= prime
|
||||
if n == 1:
|
||||
return
|
||||
if n >= 2:
|
||||
if n > 1:
|
||||
yield n
|
||||
|
||||
|
||||
def polynomial_eval(coefficients, x):
|
||||
"""Evaluate a polynomial at a specific value.
|
||||
|
||||
Example: evaluating x^3 - 4 * x^2 - 17 * x + 60 at x = 2.5:
|
||||
|
||||
>>> coefficients = [1, -4, -17, 60]
|
||||
>>> x = 2.5
|
||||
>>> polynomial_eval(coefficients, x)
|
||||
8.125
|
||||
"""
|
||||
n = len(coefficients)
|
||||
if n == 0:
|
||||
return x * 0 # coerce zero to the type of x
|
||||
powers = map(pow, repeat(x), reversed(range(n)))
|
||||
return _sumprod(coefficients, powers)
|
||||
|
||||
|
||||
def sum_of_squares(it):
|
||||
"""Return the sum of the squares of the input values.
|
||||
|
||||
>>> sum_of_squares([10, 20, 30])
|
||||
1400
|
||||
"""
|
||||
return _sumprod(*tee(it))
|
||||
|
||||
|
||||
def polynomial_derivative(coefficients):
|
||||
"""Compute the first derivative of a polynomial.
|
||||
|
||||
Example: evaluating the derivative of x^3 - 4 * x^2 - 17 * x + 60
|
||||
|
||||
>>> coefficients = [1, -4, -17, 60]
|
||||
>>> derivative_coefficients = polynomial_derivative(coefficients)
|
||||
>>> derivative_coefficients
|
||||
[3, -8, -17]
|
||||
"""
|
||||
n = len(coefficients)
|
||||
powers = reversed(range(1, n))
|
||||
return list(map(operator.mul, coefficients, powers))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue