diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b2acc54..a54b722 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -5,6 +5,9 @@ on:
tags:
- "v*"
+permissions:
+ contents: write
+
jobs:
# Publish Python package to PyPI.
publish-to-pypi:
diff --git a/.idea/ephys-link.iml b/.idea/ephys-link.iml
index ca4bf72..52e1e20 100644
--- a/.idea/ephys-link.iml
+++ b/.idea/ephys-link.iml
@@ -8,7 +8,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 83a5a49..31648a1 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/pyproject.toml b/pyproject.toml
index 9862c4c..00c8ecb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,14 +7,13 @@ name = "ephys-link"
dynamic = ["version"]
description = "A Python Socket.IO server that allows any Socket.IO-compliant application to communicate with manipulators used in electrophysiology experiments."
readme = "README.md"
-requires-python = ">=3.13"
+requires-python = ">=3.10"
license = "GPL-3.0-only"
keywords = ["socket-io", "manipulator", "electrophysiology", "ephys", "sensapex", "neuroscience", "neurotech", "virtualbrainlab", "new-scale"]
authors = [{ name = "Kenneth Yang", email = "kjy5@uw.edu" }]
maintainers = [{ name = "Kenneth Yang", email = "kjy5@uw.edu" }]
classifiers = [
"Programming Language :: Python",
- "Programming Language :: Python :: 3.13",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Programming Language :: Python :: 3",
@@ -36,7 +35,7 @@ dependencies = [
"requests==2.32.5",
"sensapex==1.400.4",
"rich==14.2.0",
- "vbl-aquarium==1.0.0"
+ "vbl-aquarium==1.0.1"
]
[project.urls]
@@ -57,14 +56,14 @@ exclude = ["/.github", "/.idea", "/docs"]
[tool.hatch.envs.default]
installer = "uv"
-python = "3.13"
+python = "3.14"
dependencies = [
- "pyinstaller==6.15.0",
- "basedpyright==1.31.4",
+ "pyinstaller==6.16.0",
+ "basedpyright==1.32.1",
"pytest==8.4.2",
- "pytest-cov==6.3.0",
- "pytest-mock==3.15.0",
- "pytest-asyncio==1.1.0"
+ "pytest-cov==7.0.0",
+ "pytest-mock==3.15.1",
+ "pytest-asyncio==1.2.0"
]
[tool.hatch.envs.default.scripts]
exe = "pyinstaller.exe ephys_link.spec -y -- -d && pyinstaller.exe ephys_link.spec -y"
@@ -76,7 +75,7 @@ cov = "pytest --cov=ephys_link --cov-report=html --cov-report=term-missing"
[tool.hatch.envs.docs]
installer = "uv"
-python = "3.13"
+python = "3.14"
skip-install = true
dependencies = [
"mkdocs-material==9.6.19",
diff --git a/tests/back_end/test_server.py b/tests/back_end/test_server.py
index 639e91e..9e82c84 100644
--- a/tests/back_end/test_server.py
+++ b/tests/back_end/test_server.py
@@ -146,7 +146,7 @@ def run_coroutine(coroutine: Awaitable[None]) -> None:
patched_get_event_loop.assert_called_once()
spied_info_print.assert_any_call("PLATFORM", platform_handler.get_display_name())
spied_info_print.assert_any_call("MANIPULATORS", str(DUMMY_STRING_LIST))
- spied_info_print.assert_any_call("PINPOINT ID", mocker.ANY) # pyright: ignore[reportAny]
+ spied_info_print.assert_any_call("PINPOINT ID", mocker.ANY)
patched_connect.assert_awaited_once() # pyright: ignore[reportUnusedCallResult]
patched_wait.assert_awaited_once() # pyright: ignore[reportUnusedCallResult]
@@ -194,7 +194,7 @@ def run_coroutine(coroutine: Awaitable[None]) -> None:
patched_get_event_loop.assert_called_once()
spied_info_print.assert_any_call("PLATFORM", platform_handler.get_display_name())
spied_info_print.assert_any_call("MANIPULATORS", str(DUMMY_STRING_LIST))
- spied_info_print.assert_any_call("PINPOINT ID", mocker.ANY) # pyright: ignore[reportAny]
+ spied_info_print.assert_any_call("PINPOINT ID", mocker.ANY)
assert init_error.value.args[0] == PROXY_CLIENT_NOT_INITIALIZED_ERROR
patched_connect.assert_not_awaited() # pyright: ignore[reportUnusedCallResult]
patched_wait.assert_not_awaited() # pyright: ignore[reportUnusedCallResult]