Skip to content

Commit 640e440

Browse files
authored
[Feature] Test Python 3.14 (#840)
* Update pipeline.yml * Update pyproject.toml * exclude integration tests * rename functions * Update pipeline.yml
1 parent 4d6176c commit 640e440

5 files changed

Lines changed: 34 additions & 22 deletions

File tree

.github/workflows/pipeline.yml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ jobs:
8888
- uses: actions/checkout@v4
8989
- uses: conda-incubator/setup-miniconda@v3
9090
with:
91-
python-version: '3.13'
91+
python-version: '3.14'
9292
miniforge-version: latest
9393
channels: conda-forge
9494
conda-remove-defaults: "true"
@@ -121,11 +121,11 @@ jobs:
121121
matrix:
122122
include:
123123
- operating-system: ubuntu-latest
124-
python-version: '3.13'
124+
python-version: '3.14'
125125
environment-file: .ci_support/environment-openmpi.yml
126126

127127
- operating-system: ubuntu-latest
128-
python-version: '3.13'
128+
python-version: '3.14'
129129
environment-file: .ci_support/environment-mpich.yml
130130

131131
steps:
@@ -318,13 +318,16 @@ jobs:
318318
matrix:
319319
include:
320320
- operating-system: macos-latest
321-
python-version: '3.13'
321+
python-version: '3.14'
322322

323323
- operating-system: ubuntu-24.04-arm
324-
python-version: '3.13'
324+
python-version: '3.14'
325325

326326
- operating-system: ubuntu-22.04-arm
327-
python-version: '3.13'
327+
python-version: '3.14'
328+
329+
- operating-system: ubuntu-latest
330+
python-version: '3.14'
328331

329332
- operating-system: ubuntu-latest
330333
python-version: '3.13'
@@ -359,15 +362,18 @@ jobs:
359362
matrix:
360363
include:
361364
- operating-system: macos-latest
362-
python-version: '3.13'
365+
python-version: '3.14'
363366

364367
- operating-system: ubuntu-latest
365-
python-version: '3.13'
368+
python-version: '3.14'
366369

367370
- operating-system: ubuntu-24.04-arm
368-
python-version: '3.13'
371+
python-version: '3.14'
369372

370373
- operating-system: ubuntu-22.04-arm
374+
python-version: '3.14'
375+
376+
- operating-system: ubuntu-latest
371377
python-version: '3.13'
372378

373379
- operating-system: ubuntu-latest
@@ -400,7 +406,7 @@ jobs:
400406
- uses: actions/checkout@v4
401407
- uses: conda-incubator/setup-miniconda@v3
402408
with:
403-
python-version: "3.13"
409+
python-version: "3.14"
404410
miniforge-version: latest
405411
channels: conda-forge
406412
conda-remove-defaults: "true"

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ authors = [
1616
readme = "README.md"
1717
license = { file = "LICENSE" }
1818
keywords = ["high performance computing", "hpc", "task scheduler", "slurm", "flux-framework", "executor", "python", "parallel computing", "distributed computing", "scientific computing", "concurrent.futures", "mpi4py", "gpu"]
19-
requires-python = ">3.9, <3.14"
19+
requires-python = ">3.9, <3.15"
2020
classifiers = [
2121
"Development Status :: 5 - Production/Stable",
2222
"Topic :: Scientific/Engineering :: Physics",
@@ -27,6 +27,7 @@ classifiers = [
2727
"Programming Language :: Python :: 3.11",
2828
"Programming Language :: Python :: 3.12",
2929
"Programming Language :: Python :: 3.13",
30+
"Programming Language :: Python :: 3.14",
3031
]
3132
dependencies = [
3233
"cloudpickle==3.1.2",

src/executorlib/backend/interactive_serial.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
)
1313

1414

15-
def main(argument_lst: Optional[list[str]] = None):
15+
def evaluate_cmd(argument_lst: Optional[list[str]] = None):
1616
"""
1717
The main function of the program.
1818
@@ -90,4 +90,4 @@ def main(argument_lst: Optional[list[str]] = None):
9090

9191

9292
if __name__ == "__main__":
93-
main(argument_lst=sys.argv)
93+
evaluate_cmd(argument_lst=sys.argv)

tests/integration/test_pyiron_workflow.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from time import sleep
1212
from typing import Callable
1313
import unittest
14+
import sys
1415

1516
from executorlib import SingleNodeExecutor
1617
from executorlib.standalone.serialize import cloudpickle_register
@@ -55,6 +56,10 @@ def as_dynamic_foo(fnc: Callable):
5556
return as_dynamic_foo
5657

5758

59+
@unittest.skipIf(
60+
sys.version_info.minor >= 14 and sys.version_info.minor >= 3,
61+
"Test environment has to be Python <3.14 for dynamic objects.",
62+
)
5863
class TestDynamicallyDefinedObjects(unittest.TestCase):
5964
def test_args(self):
6065
"""

tests/unit/backend/test_interactive_serial.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import cloudpickle
55
import zmq
66

7-
from executorlib.backend.interactive_serial import main
7+
from executorlib.backend.interactive_serial import evaluate_cmd
88

99

1010
def calc(i, j):
1111
return i + j
1212

1313

14-
def set_global():
14+
def set_global_variable():
1515
return {"j": 5}
1616

1717

@@ -21,15 +21,15 @@ def raise_error():
2121

2222
def submit(socket):
2323
socket.send(
24-
cloudpickle.dumps({"init": True, "fn": set_global, "args": (), "kwargs": {}})
24+
cloudpickle.dumps({"init": True, "fn": set_global_variable, "args": (), "kwargs": {}})
2525
)
2626
socket.send(cloudpickle.dumps({"fn": calc, "args": (), "kwargs": {"i": 2}}))
2727
socket.send(cloudpickle.dumps({"shutdown": True, "wait": True}))
2828

2929

3030
def submit_error(socket):
3131
socket.send(
32-
cloudpickle.dumps({"init": True, "fn": set_global, "args": (), "kwargs": {}})
32+
cloudpickle.dumps({"init": True, "fn": set_global_variable, "args": (), "kwargs": {}})
3333
)
3434
socket.send(cloudpickle.dumps({"fn": calc, "args": (), "kwargs": {}}))
3535
socket.send(cloudpickle.dumps({"shutdown": True, "wait": True}))
@@ -48,7 +48,7 @@ def test_main_as_thread(self):
4848
context = zmq.Context()
4949
socket = context.socket(zmq.PAIR)
5050
port = socket.bind_to_random_port("tcp://*")
51-
t = Thread(target=main, kwargs={"argument_lst": ["--zmqport", str(port)]})
51+
t = Thread(target=evaluate_cmd, kwargs={"argument_lst": ["--zmqport", str(port)]})
5252
t.start()
5353
submit(socket=socket)
5454
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": True})
@@ -61,7 +61,7 @@ def test_main_as_thread_error(self):
6161
context = zmq.Context()
6262
socket = context.socket(zmq.PAIR)
6363
port = socket.bind_to_random_port("tcp://*")
64-
t = Thread(target=main, kwargs={"argument_lst": ["--zmqport", str(port)]})
64+
t = Thread(target=evaluate_cmd, kwargs={"argument_lst": ["--zmqport", str(port)]})
6565
t.start()
6666
submit_error(socket=socket)
6767
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": True})
@@ -76,7 +76,7 @@ def test_main_as_thread_init_error(self):
7676
context = zmq.Context()
7777
socket = context.socket(zmq.PAIR)
7878
port = socket.bind_to_random_port("tcp://*")
79-
t = Thread(target=main, kwargs={"argument_lst": ["--zmqport", str(port)]})
79+
t = Thread(target=evaluate_cmd, kwargs={"argument_lst": ["--zmqport", str(port)]})
8080
t.start()
8181
submit_init_error(socket=socket)
8282
self.assertEqual(
@@ -94,7 +94,7 @@ def test_submit_as_thread(self):
9494
port = socket.bind_to_random_port("tcp://*")
9595
t = Thread(target=submit, kwargs={"socket": socket})
9696
t.start()
97-
main(argument_lst=["--zmqport", str(port)])
97+
evaluate_cmd(argument_lst=["--zmqport", str(port)])
9898
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": True})
9999
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": 7})
100100
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": True})
@@ -107,7 +107,7 @@ def test_submit_as_thread_error(self):
107107
port = socket.bind_to_random_port("tcp://*")
108108
t = Thread(target=submit_error, kwargs={"socket": socket})
109109
t.start()
110-
main(argument_lst=["--zmqport", str(port)])
110+
evaluate_cmd(argument_lst=["--zmqport", str(port)])
111111
self.assertEqual(cloudpickle.loads(socket.recv()), {"result": True})
112112
self.assertEqual(
113113
str(type(cloudpickle.loads(socket.recv())["error"])), "<class 'TypeError'>"

0 commit comments

Comments
 (0)