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

Add python 3.11 to the CI #88038

Merged
merged 57 commits into from
Feb 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5ea6684
Remove profiler.memory service
bdraco Feb 14, 2023
7c34b60
squash
bdraco Feb 14, 2023
fda1dd5
Merge branch 'dev' into python3.11
bdraco Feb 14, 2023
2be2d46
temp remove
bdraco Feb 14, 2023
07a5cea
Merge remote-tracking branch 'upstream/python3.11' into python3.11
bdraco Feb 14, 2023
f0207a0
temp dump tests
bdraco Feb 14, 2023
db33aa1
temp dump tests
bdraco Feb 14, 2023
073fcdb
drop a few more to get a run
bdraco Feb 15, 2023
e97afea
drop a few more to get a run
bdraco Feb 15, 2023
8d32bb6
Account for changed python3.11 enum.IntFlag behavior in zha
bdraco Feb 15, 2023
945d95f
Merge branch 'zha_fix_py3.11' into python3.11
bdraco Feb 15, 2023
57e5c21
merge
bdraco Feb 15, 2023
18d9e4a
restore
bdraco Feb 15, 2023
4b84ec2
restore
bdraco Feb 15, 2023
835fc17
legacy value
bdraco Feb 15, 2023
bc99908
Merge branch 'zha_fix_py3.11' into python3.11
bdraco Feb 15, 2023
e4b9e7a
Merge remote-tracking branch 'upstream/dev' into python3.11
bdraco Feb 15, 2023
31f4394
tweak a bit for the python 3.11 timings
bdraco Feb 15, 2023
9fc251a
block cchardet
bdraco Feb 15, 2023
789b0b4
conditional
bdraco Feb 15, 2023
c923fe1
adjust est
bdraco Feb 15, 2023
84ca277
adjust est
bdraco Feb 15, 2023
9b6fdc8
test
bdraco Feb 15, 2023
8d7cc8e
Merge branch 'profiler' into python3.11
bdraco Feb 15, 2023
f4d4f10
not yet
bdraco Feb 15, 2023
b57b4b0
tweak
bdraco Feb 15, 2023
80296e9
Merge branch 'zha_fix_py3.11' into python3.11
bdraco Feb 15, 2023
cd9d6fc
give a little leeway for timing
bdraco Feb 15, 2023
c7d260b
Fix otbr tests
emontnemery Feb 15, 2023
6ae2d91
Merge remote-tracking branch 'upstream/otbr_fix_tests' into python3.11
bdraco Feb 15, 2023
8ad961e
Increase database test timeout
bdraco Feb 15, 2023
79fd224
Merge branch 'db_timeout' into python3.11
bdraco Feb 15, 2023
e311fda
Increase database test timeout
bdraco Feb 15, 2023
573454a
Merge branch 'db_timeout' into python3.11
bdraco Feb 15, 2023
9a9af40
Fix aprs tests with python 3.11
bdraco Feb 15, 2023
4562301
merge fix
bdraco Feb 15, 2023
735aa48
hints
bdraco Feb 15, 2023
bc6fce1
Merge branch 'aprs_py311' into python3.11
bdraco Feb 15, 2023
e39a79d
Merge branch 'dev' into python3.11
bdraco Feb 15, 2023
f37d332
Merge branch 'dev' into python3.11
bdraco Feb 15, 2023
c47cd7e
Update homeassistant/package_constraints.txt
bdraco Feb 15, 2023
00da4b7
Update script/gen_requirements_all.py
bdraco Feb 15, 2023
eeac603
Merge branch 'dev' into python3.11
bdraco Feb 15, 2023
838db8f
Constrain uamqp for Python 3.10 only
frenck Feb 15, 2023
0f119e6
Merge remote-tracking branch 'upstream/dev' into python3.11
bdraco Feb 15, 2023
42b42c2
Merge remote-tracking branch 'upstream/frenck-2023-0312' into python3.11
bdraco Feb 15, 2023
a162aac
Merge remote-tracking branch 'upstream/python3.11' into python3.11
bdraco Feb 15, 2023
f7629fc
Merge branch 'dev' into python3.11
bdraco Feb 15, 2023
15ecc72
Bump vulcan-api to 2.3.0
bdraco Feb 16, 2023
8de5fb5
Merge branch 'vulcan_api' into python3.11
bdraco Feb 16, 2023
ee0c0c2
Merge remote-tracking branch 'upstream/python3.11' into python3.11
bdraco Feb 16, 2023
d56311c
add ban
bdraco Feb 16, 2023
2369260
Bump python-matter-server to 2.1.1
marcelveldt Feb 16, 2023
781e484
revert
bdraco Feb 16, 2023
66d747e
Merge remote-tracking branch 'upstream/bump-matter-server-2.1.1' into…
bdraco Feb 16, 2023
a9ea3ac
Update tests/asyncio_legacy.py
bdraco Feb 16, 2023
c4e6088
Merge branch 'dev' into python3.11
bdraco Feb 16, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ env:
MYPY_CACHE_VERSION: 4
HA_SHORT_VERSION: 2023.3
DEFAULT_PYTHON: "3.10"
ALL_PYTHON_VERSIONS: "['3.10']"
ALL_PYTHON_VERSIONS: "['3.10', '3.11']"
# 10.3 is the oldest supported version
# - 10.3.32 is the version currently shipped with Synology (as of 17 Feb 2022)
# 10.6 is the current long-term-support
Expand Down
3 changes: 3 additions & 0 deletions homeassistant/package_constraints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ libcst==0.3.23
# This is a old unmaintained library and is replaced with pycryptodome
pycrypto==1000000000.0.0

# This is a old unmaintained library and is replaced with faust-cchardet
cchardet==1000000000.0.0

# To remove reliance on typing
btlewrap>=0.0.10

Expand Down
3 changes: 3 additions & 0 deletions script/gen_requirements_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@
# This is a old unmaintained library and is replaced with pycryptodome
pycrypto==1000000000.0.0

# This is a old unmaintained library and is replaced with faust-cchardet
cchardet==1000000000.0.0

# To remove reliance on typing
btlewrap>=0.0.10

Expand Down
128 changes: 128 additions & 0 deletions tests/asyncio_legacy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
"""Minimal legacy asyncio.coroutine."""

# flake8: noqa
# stubbing out for integrations that have
# not yet been updated for python 3.11
# but can still run on python 3.10
bdraco marked this conversation as resolved.
Show resolved Hide resolved
#
# Remove this once rflink, fido, and blackbird
# have had their libraries updated to remove
# asyncio.coroutine
from asyncio import base_futures, constants, format_helpers
from asyncio.coroutines import _is_coroutine
import collections.abc
import functools
import inspect
import logging
import traceback
import types
import warnings

logger = logging.getLogger(__name__)


class CoroWrapper:
# Wrapper for coroutine object in _DEBUG mode.

def __init__(self, gen, func=None):
assert inspect.isgenerator(gen) or inspect.iscoroutine(gen), gen
self.gen = gen
self.func = func # Used to unwrap @coroutine decorator
self._source_traceback = format_helpers.extract_stack(sys._getframe(1))
self.__name__ = getattr(gen, "__name__", None)
self.__qualname__ = getattr(gen, "__qualname__", None)

def __iter__(self):
return self

def __next__(self):
return self.gen.send(None)

def send(self, value):
return self.gen.send(value)

def throw(self, type, value=None, traceback=None):
return self.gen.throw(type, value, traceback)

def close(self):
return self.gen.close()

@property
def gi_frame(self):
return self.gen.gi_frame

@property
def gi_running(self):
return self.gen.gi_running

@property
def gi_code(self):
return self.gen.gi_code

def __await__(self):
return self

@property
def gi_yieldfrom(self):
return self.gen.gi_yieldfrom

def __del__(self):
# Be careful accessing self.gen.frame -- self.gen might not exist.
gen = getattr(self, "gen", None)
frame = getattr(gen, "gi_frame", None)
if frame is not None and frame.f_lasti == -1:
msg = f"{self!r} was never yielded from"
tb = getattr(self, "_source_traceback", ())
if tb:
tb = "".join(traceback.format_list(tb))
msg += (
f"\nCoroutine object created at "
f"(most recent call last, truncated to "
f"{constants.DEBUG_STACK_DEPTH} last lines):\n"
)
msg += tb.rstrip()
logger.error(msg)


def legacy_coroutine(func):
"""Decorator to mark coroutines.
If the coroutine is not yielded from before it is destroyed,
an error message is logged.
"""
warnings.warn(
'"@coroutine" decorator is deprecated since Python 3.8, use "async def" instead',
DeprecationWarning,
stacklevel=2,
)
if inspect.iscoroutinefunction(func):
# In Python 3.5 that's all we need to do for coroutines
# defined with "async def".
return func

if inspect.isgeneratorfunction(func):
coro = func
else:

@functools.wraps(func)
def coro(*args, **kw):
res = func(*args, **kw)
if (
base_futures.isfuture(res)
or inspect.isgenerator(res)
or isinstance(res, CoroWrapper)
):
res = yield from res
else:
# If 'res' is an awaitable, run it.
try:
await_meth = res.__await__
except AttributeError:
pass
else:
if isinstance(res, collections.abc.Awaitable):
res = yield from await_meth()
return res

wrapper = types.coroutine(coro)
wrapper._is_coroutine = _is_coroutine # For iscoroutinefunction().
return wrapper
6 changes: 6 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import logging
import sqlite3
import ssl
import sys
import threading
from typing import TYPE_CHECKING, Any, ParamSpec, TypeVar, cast
from unittest.mock import AsyncMock, MagicMock, Mock, patch
Expand Down Expand Up @@ -100,6 +101,11 @@
# Disable fixtures overriding our beautiful policy
asyncio.set_event_loop_policy = lambda policy: None

if sys.version_info[:2] >= (3, 11):
from .asyncio_legacy import legacy_coroutine

setattr(asyncio, "coroutine", legacy_coroutine)


def _utcnow() -> datetime.datetime:
"""Make utcnow patchable by freezegun."""
Expand Down
6 changes: 2 additions & 4 deletions tests/util/test_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ def _loop_sleep_in_executor():
iexecutor.shutdown()

assert "time.sleep(0.2)" in caplog.text
assert (
caplog.text.count("is still running at shutdown") == executor.MAX_LOG_ATTEMPTS
)
assert "is still running at shutdown" in caplog.text
iexecutor.shutdown()


Expand Down Expand Up @@ -86,6 +84,6 @@ def _loop_sleep_in_executor():
iexecutor.shutdown()
finish = time.monotonic()

assert finish - start < 1
assert finish - start < 1.2

iexecutor.shutdown()