From 9c6a4c905c75c5e64ca460ea17bb2bdf0f2782fa Mon Sep 17 00:00:00 2001 From: James Bourbeau Date: Thu, 3 Feb 2022 12:58:32 -0600 Subject: [PATCH 01/14] Add Python 3.10 build to CI --- .github/workflows/tests.yaml | 2 +- continuous_integration/environment-3.10.yaml | 56 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 continuous_integration/environment-3.10.yaml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7e087f9975..f2b479cd59 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -23,7 +23,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ["3.8", "3.9"] + python-version: ["3.8", "3.9", "3.10"] # Cherry-pick test modules to split the overall runtime roughly in half partition: [ci1, not ci1] include: diff --git a/continuous_integration/environment-3.10.yaml b/continuous_integration/environment-3.10.yaml new file mode 100644 index 0000000000..a51b0722d9 --- /dev/null +++ b/continuous_integration/environment-3.10.yaml @@ -0,0 +1,56 @@ +name: dask-distributed +channels: + - conda-forge + - defaults +dependencies: + - python=3.10 + - packaging + - pip + - asyncssh + - bokeh + - click + - cloudpickle + - coverage<6.3 # https://github.com/nedbat/coveragepy/issues/1310 + - dask # overridden by git tip below + - filesystem-spec # overridden by git tip below + - h5py + - ipykernel + - ipywidgets + - jinja2 + - joblib # overridden by git tip below + - jupyter_client + - lz4 # Only tested here + - msgpack-python + - netcdf4 + - paramiko + - pre-commit + - prometheus_client + - psutil + - pynvml # Only tested here + - pytest + - pytest-cov + - pytest-faulthandler + - pytest-repeat + - pytest-rerunfailures + - pytest-timeout + - python-blosc # Only tested here + - python-snappy # Only tested here + - requests + - s3fs # overridden by git tip below + - scikit-learn + - scipy + - sortedcollections + - tblib + - toolz + - tornado=6 + - zict # overridden by git tip below + - zstandard + - pip: + - git+https://github.com/dask/dask + - git+https://github.com/dask/s3fs + - git+https://github.com/dask/zict + # FIXME https://github.com/dask/distributed/issues/5345 + # - git+https://github.com/intake/filesystem_spec + - git+https://github.com/joblib/joblib + - keras + - pytest-asyncio<0.14.0 # `pytest-asyncio<0.14.0` isn't available on conda-forge for Python 3.10 From ea5557c98b7f0580bc15b91bf70fadd634444e98 Mon Sep 17 00:00:00 2001 From: James Bourbeau Date: Thu, 3 Feb 2022 13:05:10 -0600 Subject: [PATCH 02/14] Stacktrace workaround --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index f2b479cd59..1af383347a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -67,8 +67,8 @@ jobs: - name: Install stacktrace shell: bash -l {0} - # stacktrace for Python 3.8 has not been released at the moment of writing - if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version < '3.8' }} + # stacktrace for Python 3.8+ has not been released at the moment of writing + if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version == '3.7' }} run: mamba install -c conda-forge -c defaults -c numba libunwind stacktrace - name: Hack around https://github.com/ipython/ipython/issues/12197 From f449687ebada11b505b8859ddad704df75f28af3 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 16 Mar 2022 13:52:17 +0000 Subject: [PATCH 03/14] remove install stacktrace step --- .github/workflows/tests.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1af383347a..e5b74d5b49 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -65,12 +65,6 @@ jobs: shell: bash -l {0} run: conda config --show - - name: Install stacktrace - shell: bash -l {0} - # stacktrace for Python 3.8+ has not been released at the moment of writing - if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version == '3.7' }} - run: mamba install -c conda-forge -c defaults -c numba libunwind stacktrace - - name: Hack around https://github.com/ipython/ipython/issues/12197 # This upstream issue causes an interpreter crash when running # distributed/protocol/tests/test_serialize.py::test_profile_nested_sizeof From af3a2c0e6c8723b945a70944e18fdb54a7e679ac Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 26 Sep 2021 19:30:38 -0400 Subject: [PATCH 04/14] Remove explicit loop from asyncio tests In 3.10, the _internal_ `_loop` attribute of several asyncio classes has been removed. --- distributed/tests/test_client.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/distributed/tests/test_client.py b/distributed/tests/test_client.py index f9558d2dd3..436bcf905b 100644 --- a/distributed/tests/test_client.py +++ b/distributed/tests/test_client.py @@ -6462,12 +6462,18 @@ async def f(stacklevel, mode=None): assert "cdn.bokeh.org" in data +@pytest.mark.skipif( + sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" +) @gen_cluster(nthreads=[]) async def test_client_gather_semaphore_loop(s): async with Client(s.address, asynchronous=True) as c: assert c._gather_semaphore._loop is c.loop.asyncio_loop +@pytest.mark.skipif( + sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" +) @gen_cluster(client=True) async def test_as_completed_condition_loop(c, s, a, b): seq = c.map(inc, range(5)) @@ -6475,6 +6481,9 @@ async def test_as_completed_condition_loop(c, s, a, b): assert ac.condition._loop == c.loop.asyncio_loop +@pytest.mark.skipif( + sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" +) def test_client_connectionpool_semaphore_loop(s, a, b): with Client(s["address"]) as c: assert c.rpc.semaphore._loop is c.loop.asyncio_loop From a34b5caee86cbdcd7ee681e7cefeaa2a8c374c4b Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 16 Mar 2022 17:52:23 +0000 Subject: [PATCH 05/14] fix test_as_completed_condition_loop on py3.10 by interacting with the ac.condition we bind it to the loop on py3.10 --- distributed/tests/test_client.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/distributed/tests/test_client.py b/distributed/tests/test_client.py index 436bcf905b..5405cedfca 100644 --- a/distributed/tests/test_client.py +++ b/distributed/tests/test_client.py @@ -6471,13 +6471,12 @@ async def test_client_gather_semaphore_loop(s): assert c._gather_semaphore._loop is c.loop.asyncio_loop -@pytest.mark.skipif( - sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" -) @gen_cluster(client=True) async def test_as_completed_condition_loop(c, s, a, b): seq = c.map(inc, range(5)) ac = as_completed(seq) + async for _ in ac: + pass assert ac.condition._loop == c.loop.asyncio_loop From 5148a03194677f26767babf016114a53d80ef4db Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Thu, 17 Mar 2022 10:46:18 +0000 Subject: [PATCH 06/14] use a PROTOCOL_TLS_SERVER context for dashboards ERROR asyncio:base_events.py:1729 Exception in callback BaseAsyncIOLoop._handle_events(18, 1) handle: Traceback (most recent call last): File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/asyncio/events.py", line 80, in _run self._context.run(self._callback, *self._args) File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/site-packages/tornado/platform/asyncio.py", line 189, in _handle_events handler_func(fileobj, events) File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/site-packages/tornado/netutil.py", line 276, in accept_handler callback(connection, address) File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/site-packages/tornado/tcpserver.py", line 288, in _handle_connection connection = ssl_wrap_socket( File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/site-packages/tornado/netutil.py", line 615, in ssl_wrap_socket return context.wrap_socket(socket, server_hostname=server_hostname, **kwargs) File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/ssl.py", line 512, in wrap_socket return self.sslsocket_class._create( File "/home/graingert/miniconda3/envs/dask-distributed-310/lib/python3.10/ssl.py", line 1061, in _create self._sslobj = self._context._wrap_socket( ssl.SSLError: Cannot create a server socket with a PROTOCOL_TLS_CLIENT context (_ssl.c:794) --- distributed/node.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/distributed/node.py b/distributed/node.py index 6db2c7711e..6fedd1b8ac 100644 --- a/distributed/node.py +++ b/distributed/node.py @@ -131,12 +131,9 @@ def start_http_server( import ssl ssl_options = ssl.create_default_context( - cafile=tls_ca_file, purpose=ssl.Purpose.SERVER_AUTH + cafile=tls_ca_file, purpose=ssl.Purpose.CLIENT_AUTH ) ssl_options.load_cert_chain(tls_cert, keyfile=tls_key) - # We don't care about auth here, just encryption - ssl_options.check_hostname = False - ssl_options.verify_mode = ssl.CERT_NONE self.http_server = HTTPServer(self.http_application, ssl_options=ssl_options) From 99ea0e10c46e9d48326dca95094c936ff6fe2ced Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Fri, 18 Mar 2022 14:20:22 +0000 Subject: [PATCH 07/14] work around frame.f_lineno being None sometimes --- distributed/profile.py | 29 ++++++-- distributed/tests/test_profile.py | 112 ++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 4 deletions(-) diff --git a/distributed/profile.py b/distributed/profile.py index bb832735e8..22a2fc80cf 100644 --- a/distributed/profile.py +++ b/distributed/profile.py @@ -27,6 +27,7 @@ from __future__ import annotations import bisect +import dis import linecache import sys import threading @@ -59,21 +60,41 @@ def identifier(frame): ) +# work around some frames lacking an f_lineo eg: https://bugs.python.org/issue47085 +def _f_lineno(frame): + f_lineno = frame.f_lineno + if f_lineno is not None: + return f_lineno + + f_lasti = frame.f_lasti + code = frame.f_code + prev_line = code.co_firstlineno + + for start, next_line in dis.findlinestarts(code): + if f_lasti < start: + return prev_line + prev_line = next_line + + return prev_line + + def repr_frame(frame): """Render a frame as a line for inclusion into a text traceback""" co = frame.f_code - text = f' File "{co.co_filename}", line {frame.f_lineno}, in {co.co_name}' - line = linecache.getline(co.co_filename, frame.f_lineno, frame.f_globals).lstrip() + f_lineno = _f_lineno(frame) + text = f' File "{co.co_filename}", line {f_lineno}, in {co.co_name}' + line = linecache.getline(co.co_filename, f_lineno, frame.f_globals).lstrip() return text + "\n\t" + line def info_frame(frame): co = frame.f_code - line = linecache.getline(co.co_filename, frame.f_lineno, frame.f_globals).lstrip() + f_lineno = _f_lineno(frame) + line = linecache.getline(co.co_filename, f_lineno, frame.f_globals).lstrip() return { "filename": co.co_filename, "name": co.co_name, - "line_number": frame.f_lineno, + "line_number": f_lineno, "line": line, } diff --git a/distributed/tests/test_profile.py b/distributed/tests/test_profile.py index 7d044945d7..04a6158ff3 100644 --- a/distributed/tests/test_profile.py +++ b/distributed/tests/test_profile.py @@ -1,5 +1,9 @@ +from __future__ import annotations + +import dataclasses import sys import threading +from collections.abc import Iterator, Sequence from time import sleep import pytest @@ -11,6 +15,7 @@ call_stack, create, identifier, + info_frame, ll_get_stack, llprocess, merge, @@ -200,3 +205,110 @@ def stop(): while threading.active_count() > start_threads: assert time() < start + 2 sleep(0.01) + + +@dataclasses.dataclass(frozen=True) +class FakeCode: + co_filename: str + co_name: str + co_firstlineno: int + co_lnotab: bytes + co_lines_seq: Sequence[tuple[int, int, int | None]] + co_code: bytes + + def co_lines(self) -> Iterator[tuple[int, int, int | None]]: + yield from self.co_lines_seq + + +@dataclasses.dataclass(frozen=True) +class FakeFrame: + f_lasti: int + f_code: FakeCode + f_lineno: int | None = None + f_back: FakeFrame | None = None + f_globals: dict[str, object] = dataclasses.field(default_factory=dict) + + +@pytest.mark.parametrize( + "f_lasti,f_lineno", + [ + (-1, 1), + (0, 2), + (1, 2), + (11, 2), + (12, 3), + (21, 4), + (22, 4), + (23, 4), + (24, 2), + (25, 2), + (26, 2), + (27, 2), + (100, 2), + ], +) +def test_info_frame_f_lineno(f_lasti: int, f_lineno: int) -> None: + assert info_frame( + FakeFrame( + f_lasti=f_lasti, + f_code=FakeCode( + co_filename="", + co_name="example", + co_firstlineno=1, + co_lnotab=b"\x00\x01\x0c\x01\x08\x01\x04\xfe", + co_lines_seq=[ + (0, 12, 2), + (12, 20, 3), + (20, 22, 4), + (22, 24, None), + (24, 28, 2), + ], + co_code=b"t\x00d\x01\x83\x01D\x00]\x07}\x00|\x00d\x02k\x05r\x0b\t\x00q\x04d\x00S\x00", + ), + ) + ) == { + "filename": "", + "name": "example", + "line_number": f_lineno, + "line": "", + } + + +@pytest.mark.parametrize( + "f_lasti,f_lineno", + [ + (-1, 1), + (0, 2), + (1, 2), + (11, 2), + (12, 3), + (21, 4), + (22, 4), + (23, 4), + (24, 2), + (25, 2), + (26, 2), + (27, 2), + (100, 2), + ], +) +def test_call_stack_f_lineno(f_lasti: int, f_lineno: int) -> None: + assert call_stack( + FakeFrame( + f_lasti=f_lasti, + f_code=FakeCode( + co_filename="", + co_name="example", + co_firstlineno=1, + co_lnotab=b"\x00\x01\x0c\x01\x08\x01\x04\xfe", + co_lines_seq=[ + (0, 12, 2), + (12, 20, 3), + (20, 22, 4), + (22, 24, None), + (24, 28, 2), + ], + co_code=b"t\x00d\x01\x83\x01D\x00]\x07}\x00|\x00d\x02k\x05r\x0b\t\x00q\x04d\x00S\x00", + ), + ) + ) == [f' File "", line {f_lineno}, in example\n\t'] From 81f380f2eff63150271389e796266a13e4711ad7 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 22 Mar 2022 14:20:41 +0000 Subject: [PATCH 08/14] avoid DeprecationWarning in rpc.__exit__ by using rpc.__aexit__ --- distributed/utils_test.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/distributed/utils_test.py b/distributed/utils_test.py index dc3010cab9..617fd5a654 100644 --- a/distributed/utils_test.py +++ b/distributed/utils_test.py @@ -739,13 +739,16 @@ def cluster( except KeyError: rpc_kwargs = {} - with rpc(saddr, **rpc_kwargs) as s: - while True: - nthreads = loop.run_sync(s.ncores) - if len(nthreads) == nworkers: - break - if time() - start > 5: - raise Exception("Timeout on cluster creation") + async def wait_for_workers(): + async with rpc(saddr, **rpc_kwargs) as s: + while True: + nthreads = await s.ncores() + if len(nthreads) == nworkers: + break + if time() - start > 5: + raise Exception("Timeout on cluster creation") + + loop.run_sync(wait_for_workers) # avoid sending processes down to function yield {"address": saddr}, [ From f6d2219243ebf84c05f8a402648de21cf36bcfe2 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 22 Mar 2022 16:19:59 +0000 Subject: [PATCH 09/14] Update distributed/tests/test_client.py --- distributed/tests/test_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/distributed/tests/test_client.py b/distributed/tests/test_client.py index 5405cedfca..3e11cb2c5e 100644 --- a/distributed/tests/test_client.py +++ b/distributed/tests/test_client.py @@ -6475,6 +6475,7 @@ async def test_client_gather_semaphore_loop(s): async def test_as_completed_condition_loop(c, s, a, b): seq = c.map(inc, range(5)) ac = as_completed(seq) + # consume the ac so that the ac.condition is bound to the loop on py3.10+ async for _ in ac: pass assert ac.condition._loop == c.loop.asyncio_loop From 2ca74e2192b3f66b6fccae0d77fc51ca18d2ba17 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Wed, 23 Mar 2022 13:52:32 +0000 Subject: [PATCH 10/14] clarify test_client_connectionpool_semaphore_loop and test_client_gather_semaphore_loop skip reason --- distributed/tests/test_client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/distributed/tests/test_client.py b/distributed/tests/test_client.py index 3e11cb2c5e..a864d47787 100644 --- a/distributed/tests/test_client.py +++ b/distributed/tests/test_client.py @@ -6463,7 +6463,8 @@ async def f(stacklevel, mode=None): @pytest.mark.skipif( - sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" + sys.version_info >= (3, 10), + reason="On Py3.10+ semaphore._loop is not bound until .acquire() blocks", ) @gen_cluster(nthreads=[]) async def test_client_gather_semaphore_loop(s): @@ -6482,7 +6483,8 @@ async def test_as_completed_condition_loop(c, s, a, b): @pytest.mark.skipif( - sys.version_info >= (3, 10), reason="No internal loop in Python 3.10" + sys.version_info >= (3, 10), + reason="On Py3.10+ semaphore._loop is not bound until .acquire() blocks", ) def test_client_connectionpool_semaphore_loop(s, a, b): with Client(s["address"]) as c: From 47c59978f0cc234da23088ffaf66f2b5e77ebc77 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Fri, 25 Mar 2022 10:38:58 +0000 Subject: [PATCH 11/14] update trove classifiers --- setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.py b/setup.py index 999c0a8b9d..c9498b4a70 100755 --- a/setup.py +++ b/setup.py @@ -98,8 +98,11 @@ "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Topic :: Scientific/Engineering", "Topic :: System :: Distributed Computing", ], From d214ba8b991b19f69cd5d66266b820579b44b902 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Fri, 25 Mar 2022 11:04:59 +0000 Subject: [PATCH 12/14] document co_lnotab, co_lines_seq and co_code values in test_profile --- distributed/tests/test_profile.py | 68 ++++++++++++++----------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/distributed/tests/test_profile.py b/distributed/tests/test_profile.py index 04a6158ff3..75eb704c99 100644 --- a/distributed/tests/test_profile.py +++ b/distributed/tests/test_profile.py @@ -220,6 +220,32 @@ def co_lines(self) -> Iterator[tuple[int, int, int | None]]: yield from self.co_lines_seq +FAKE_CODE = FakeCode( + co_filename="", + co_name="example", + co_firstlineno=1, + # https://github.com/python/cpython/blob/b68431fadb3150134ac6ccbf501cdfeaf4c75678/Objects/lnotab_notes.txt#L84 + # generated from: + # def example(): + # for i in range(1): + # if i >= 0: + # pass + # example.__code__.co_lnotab + co_lnotab=b"\x00\x01\x0c\x01\x08\x01\x04\xfe", + # generated with list(example.__code__.co_lines()) + co_lines_seq=[ + (0, 12, 2), + (12, 20, 3), + (20, 22, 4), + (22, 24, None), + (24, 28, 2), + ], + # used in dis.findlinestarts as bytecode_len = len(code.co_code) + # https://github.com/python/cpython/blob/6f345d363308e3e6ecf0ad518ea0fcc30afde2a8/Lib/dis.py#L457 + co_code=bytes(28), +) + + @dataclasses.dataclass(frozen=True) class FakeFrame: f_lasti: int @@ -248,25 +274,7 @@ class FakeFrame: ], ) def test_info_frame_f_lineno(f_lasti: int, f_lineno: int) -> None: - assert info_frame( - FakeFrame( - f_lasti=f_lasti, - f_code=FakeCode( - co_filename="", - co_name="example", - co_firstlineno=1, - co_lnotab=b"\x00\x01\x0c\x01\x08\x01\x04\xfe", - co_lines_seq=[ - (0, 12, 2), - (12, 20, 3), - (20, 22, 4), - (22, 24, None), - (24, 28, 2), - ], - co_code=b"t\x00d\x01\x83\x01D\x00]\x07}\x00|\x00d\x02k\x05r\x0b\t\x00q\x04d\x00S\x00", - ), - ) - ) == { + assert info_frame(FakeFrame(f_lasti=f_lasti, f_code=FAKE_CODE)) == { "filename": "", "name": "example", "line_number": f_lineno, @@ -293,22 +301,6 @@ def test_info_frame_f_lineno(f_lasti: int, f_lineno: int) -> None: ], ) def test_call_stack_f_lineno(f_lasti: int, f_lineno: int) -> None: - assert call_stack( - FakeFrame( - f_lasti=f_lasti, - f_code=FakeCode( - co_filename="", - co_name="example", - co_firstlineno=1, - co_lnotab=b"\x00\x01\x0c\x01\x08\x01\x04\xfe", - co_lines_seq=[ - (0, 12, 2), - (12, 20, 3), - (20, 22, 4), - (22, 24, None), - (24, 28, 2), - ], - co_code=b"t\x00d\x01\x83\x01D\x00]\x07}\x00|\x00d\x02k\x05r\x0b\t\x00q\x04d\x00S\x00", - ), - ) - ) == [f' File "", line {f_lineno}, in example\n\t'] + assert call_stack(FakeFrame(f_lasti=f_lasti, f_code=FAKE_CODE)) == [ + f' File "", line {f_lineno}, in example\n\t' + ] From 43cc4a62c753e0a9f8be94bdc7edec6cb14a33f5 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Mon, 28 Mar 2022 10:42:26 +0100 Subject: [PATCH 13/14] remove "Only tested here" deps from 3.10 environment --- continuous_integration/environment-3.10.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/continuous_integration/environment-3.10.yaml b/continuous_integration/environment-3.10.yaml index a51b0722d9..6a9fd8f380 100644 --- a/continuous_integration/environment-3.10.yaml +++ b/continuous_integration/environment-3.10.yaml @@ -19,22 +19,18 @@ dependencies: - jinja2 - joblib # overridden by git tip below - jupyter_client - - lz4 # Only tested here - msgpack-python - netcdf4 - paramiko - pre-commit - prometheus_client - psutil - - pynvml # Only tested here - pytest - pytest-cov - pytest-faulthandler - pytest-repeat - pytest-rerunfailures - pytest-timeout - - python-blosc # Only tested here - - python-snappy # Only tested here - requests - s3fs # overridden by git tip below - scikit-learn From b0308accf5502df1a9f67aa04dfb059ade82bec2 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Mon, 28 Mar 2022 13:33:54 +0100 Subject: [PATCH 14/14] Apply suggestions from code review Co-authored-by: Florian Jetter --- continuous_integration/environment-3.10.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/continuous_integration/environment-3.10.yaml b/continuous_integration/environment-3.10.yaml index 6a9fd8f380..0ee8292226 100644 --- a/continuous_integration/environment-3.10.yaml +++ b/continuous_integration/environment-3.10.yaml @@ -17,7 +17,6 @@ dependencies: - ipykernel - ipywidgets - jinja2 - - joblib # overridden by git tip below - jupyter_client - msgpack-python - netcdf4 @@ -43,10 +42,5 @@ dependencies: - zstandard - pip: - git+https://github.com/dask/dask - - git+https://github.com/dask/s3fs - git+https://github.com/dask/zict - # FIXME https://github.com/dask/distributed/issues/5345 - # - git+https://github.com/intake/filesystem_spec - - git+https://github.com/joblib/joblib - - keras - pytest-asyncio<0.14.0 # `pytest-asyncio<0.14.0` isn't available on conda-forge for Python 3.10