smartbox 2.2.1__tar.gz → 2.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {smartbox-2.2.1 → smartbox-2.3.1}/.github/workflows/publish-to-pypi.yml +6 -6
  2. {smartbox-2.2.1 → smartbox-2.3.1}/.github/workflows/python-package.yml +13 -14
  3. {smartbox-2.2.1 → smartbox-2.3.1}/.gitignore +2 -0
  4. {smartbox-2.2.1 → smartbox-2.3.1}/PKG-INFO +8 -8
  5. {smartbox-2.2.1 → smartbox-2.3.1}/pyproject.toml +20 -20
  6. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/reseller.py +6 -0
  7. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/socket.py +4 -5
  8. {smartbox-2.2.1 → smartbox-2.3.1}/tests/conftest.py +1 -1
  9. {smartbox-2.2.1 → smartbox-2.3.1}/tests/test_cmd.py +18 -18
  10. {smartbox-2.2.1 → smartbox-2.3.1}/tox.ini +3 -1
  11. smartbox-2.3.1/uv.lock +1254 -0
  12. smartbox-2.2.1/uv.lock +0 -875
  13. {smartbox-2.2.1 → smartbox-2.3.1}/.github/FUNDING.yml +0 -0
  14. {smartbox-2.2.1 → smartbox-2.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {smartbox-2.2.1 → smartbox-2.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {smartbox-2.2.1 → smartbox-2.3.1}/.github/ISSUE_TEMPLATE/new-reseller.md +0 -0
  17. {smartbox-2.2.1 → smartbox-2.3.1}/.github/dependabot.yml +0 -0
  18. {smartbox-2.2.1 → smartbox-2.3.1}/.pre-commit-config.yaml +0 -0
  19. {smartbox-2.2.1 → smartbox-2.3.1}/.vscode/settings.json +0 -0
  20. {smartbox-2.2.1 → smartbox-2.3.1}/CHANGELOG.md +0 -0
  21. {smartbox-2.2.1 → smartbox-2.3.1}/CODEOWNERS +0 -0
  22. {smartbox-2.2.1 → smartbox-2.3.1}/LICENSE +0 -0
  23. {smartbox-2.2.1 → smartbox-2.3.1}/README.md +0 -0
  24. {smartbox-2.2.1 → smartbox-2.3.1}/api-notes.md +0 -0
  25. {smartbox-2.2.1 → smartbox-2.3.1}/codecov.yml +0 -0
  26. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/__init__.py +0 -0
  27. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/cmd.py +0 -0
  28. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/error.py +0 -0
  29. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/models.py +0 -0
  30. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/py.typed +0 -0
  31. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/session.py +0 -0
  32. {smartbox-2.2.1 → smartbox-2.3.1}/src/smartbox/update_manager.py +0 -0
  33. {smartbox-2.2.1 → smartbox-2.3.1}/tests/__init__.py +0 -0
  34. {smartbox-2.2.1 → smartbox-2.3.1}/tests/common.py +0 -0
  35. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/acm/1/samples.json +0 -0
  36. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/acm/1/setup.json +0 -0
  37. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/acm/1/status.json +0 -0
  38. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/connected.json +0 -0
  39. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/htr/0/samples.json +0 -0
  40. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/htr/0/setup.json +0 -0
  41. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/htr/0/status.json +0 -0
  42. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/htr_system/power_limit.json +0 -0
  43. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/mgr/away_status.json +0 -0
  44. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/mgr/nodes.json +0 -0
  45. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/pmo/3/samples.json +0 -0
  46. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/pmo/3/setup.json +0 -0
  47. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device1/pmo/3/status.json +0 -0
  48. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/connected.json +0 -0
  49. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/0/samples.json +0 -0
  50. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/0/setup.json +0 -0
  51. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/0/status.json +0 -0
  52. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/1/samples.json +0 -0
  53. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/1/setup.json +0 -0
  54. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/1/status.json +0 -0
  55. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/2/samples.json +0 -0
  56. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/2/setup.json +0 -0
  57. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/2/status.json +0 -0
  58. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/3/samples.json +0 -0
  59. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/3/setup.json +0 -0
  60. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/3/status.json +0 -0
  61. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/4/samples.json +0 -0
  62. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/4/setup.json +0 -0
  63. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/4/status.json +0 -0
  64. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/5/samples.json +0 -0
  65. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/5/setup.json +0 -0
  66. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_mod/5/status.json +0 -0
  67. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/htr_system/power_limit.json +0 -0
  68. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/mgr/away_status.json +0 -0
  69. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs/device2/mgr/nodes.json +0 -0
  70. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/devs.json +0 -0
  71. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/grouped_devs.json +0 -0
  72. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/groups/test_home/guest_users.json +0 -0
  73. {smartbox-2.2.1 → smartbox-2.3.1}/tests/fixtures/test_path.json +0 -0
  74. {smartbox-2.2.1 → smartbox-2.3.1}/tests/test_models.py +0 -0
  75. {smartbox-2.2.1 → smartbox-2.3.1}/tests/test_reseller.py +0 -0
  76. {smartbox-2.2.1 → smartbox-2.3.1}/tests/test_session.py +0 -0
  77. {smartbox-2.2.1 → smartbox-2.3.1}/tests/test_update_manager.py +0 -0
@@ -14,18 +14,18 @@ jobs:
14
14
  permissions:
15
15
  id-token: write
16
16
  steps:
17
- - uses: actions/checkout@v4
17
+ - uses: actions/checkout@v5
18
18
  with:
19
19
  fetch-depth: 0
20
20
  - name: Install uv
21
- uses: astral-sh/setup-uv@v5
21
+ uses: astral-sh/setup-uv@v7
22
22
  with:
23
- python-version: ${{ env.PYTHON_VERSION }}
23
+ python-version: ${{ env.PYTHON_VERSION }}
24
24
  - name: Set up Python ${{ env.PYTHON_VERSION }}
25
- uses: actions/setup-python@v5.6.0
25
+ uses: actions/setup-python@v6.0.0
26
26
  with:
27
- python-version: ${{ env.PYTHON_VERSION }}
27
+ python-version: ${{ env.PYTHON_VERSION }}
28
28
  - name: Build a binary wheel and a source tarball
29
29
  run: uv build
30
30
  - name: Publish 📦 to PyPI
31
- uses: pypa/gh-action-pypi-publish@release/v1
31
+ uses: pypa/gh-action-pypi-publish@release/v1.13
@@ -11,21 +11,20 @@ on:
11
11
  pull_request:
12
12
 
13
13
  jobs:
14
-
15
14
  linter:
16
15
  runs-on: ubuntu-latest
17
16
  strategy:
18
17
  max-parallel: 4
19
18
  matrix:
20
- python-version: [3.13]
19
+ python-version: [3.13, 3.14]
21
20
  steps:
22
- - uses: actions/checkout@v4
21
+ - uses: actions/checkout@v5
23
22
  - name: Install uv
24
- uses: astral-sh/setup-uv@v5
23
+ uses: astral-sh/setup-uv@v7
25
24
  with:
26
25
  python-version: ${{ matrix.python-version }}
27
26
  - name: Set up Python ${{ matrix.python-version }}
28
- uses: actions/setup-python@v5.6.0
27
+ uses: actions/setup-python@v6.0.0
29
28
  with:
30
29
  python-version: ${{ matrix.python-version }}
31
30
  - name: Install the project
@@ -38,16 +37,16 @@ jobs:
38
37
  strategy:
39
38
  max-parallel: 1
40
39
  matrix:
41
- python-version: [3.13]
40
+ python-version: [3.13, 3.14]
42
41
 
43
42
  steps:
44
- - uses: actions/checkout@v4
43
+ - uses: actions/checkout@v5
45
44
  - name: Install uv
46
- uses: astral-sh/setup-uv@v5
45
+ uses: astral-sh/setup-uv@v7
47
46
  with:
48
47
  python-version: ${{ matrix.python-version }}
49
48
  - name: Set up Python ${{ matrix.python-version }}
50
- uses: actions/setup-python@v5.6.0
49
+ uses: actions/setup-python@v6.0.0
51
50
  with:
52
51
  python-version: ${{ matrix.python-version }}
53
52
  - name: Install the project
@@ -60,17 +59,17 @@ jobs:
60
59
  strategy:
61
60
  max-parallel: 4
62
61
  matrix:
63
- python-version: [3.13]
62
+ python-version: [3.13, 3.14]
64
63
 
65
64
  steps:
66
- - uses: actions/checkout@v4
65
+ - uses: actions/checkout@v5
67
66
  - name: Install uv
68
- uses: astral-sh/setup-uv@v5
67
+ uses: astral-sh/setup-uv@v7
69
68
  with:
70
69
  python-version: ${{ matrix.python-version }}
71
70
 
72
71
  - name: Set up Python ${{ matrix.python-version }}
73
- uses: actions/setup-python@v5.6.0
72
+ uses: actions/setup-python@v6.0.0
74
73
  with:
75
74
  python-version: ${{ matrix.python-version }}
76
75
  - name: Install the project
@@ -78,7 +77,7 @@ jobs:
78
77
  uv sync --all-extras --dev
79
78
  uv run tox -e py
80
79
  - name: "Upload coverage to Codecov"
81
- uses: codecov/codecov-action@v5
80
+ uses: codecov/codecov-action@v5.5.1
82
81
  with:
83
82
  token: ${{ secrets.CODECOV_TOKEN }}
84
83
  fail_ci_if_error: true
@@ -70,3 +70,5 @@ env.bak/
70
70
  venv.bak/
71
71
  junit.xml
72
72
  .DS_Store
73
+
74
+ *.code-workspace
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smartbox
3
- Version: 2.2.1
3
+ Version: 2.3.1
4
4
  Summary: Python API to control heating 'smart boxes'
5
5
  Project-URL: Homepage, https://github.com/ajtudela/smartbox
6
6
  Project-URL: Issues, https://github.com/ajtudela/smartbox/issues
@@ -11,13 +11,13 @@ Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Requires-Python: >=3.13
14
- Requires-Dist: aiohttp>=3.11.11
15
- Requires-Dist: asyncclick>=8.1.8
16
- Requires-Dist: jq>=1.8.0
17
- Requires-Dist: pydantic>=2.10.4
18
- Requires-Dist: python-socketio==5.13.0
19
- Requires-Dist: requests>=2.32.3
20
- Requires-Dist: websocket-client>=1.8.0
14
+ Requires-Dist: aiohttp
15
+ Requires-Dist: asyncclick
16
+ Requires-Dist: jq
17
+ Requires-Dist: pydantic==2.12.2
18
+ Requires-Dist: python-socketio
19
+ Requires-Dist: requests
20
+ Requires-Dist: websocket-client
21
21
  Description-Content-Type: text/markdown
22
22
 
23
23
  # smartbox ![build](https://github.com/ajtudela/smartbox/workflows/Python%20package/badge.svg) [![PyPI version](https://badge.fury.io/py/smartbox.svg)](https://badge.fury.io/py/smartbox) [![codecov](https://codecov.io/gh/ajtudela/smartbox/branch/main/graph/badge.svg?token=ghNZOGVzVv)](https://codecov.io/gh/ajtudela/smartbox) [![PyPI license](https://img.shields.io/pypi/l/smartbox.svg)](https://pypi.python.org/pypi/smartbox/) [![PyPI pyversions](https://img.shields.io/pypi/pyversions/smartbox.svg)](https://pypi.python.org/pypi/smartbox/)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "smartbox"
3
- version = "2.2.1"
3
+ version = "2.3.1"
4
4
  requires-python = ">=3.13"
5
5
  authors = [
6
6
  { name="Alberto Tudela", email="ajtudela@gmail.com" },
@@ -18,13 +18,13 @@ classifiers = [
18
18
  license = "MIT"
19
19
  license-files = ["LICEN[CS]E*"]
20
20
  dependencies = [
21
- "aiohttp>=3.11.11",
22
- "asyncclick>=8.1.8",
23
- "jq>=1.8.0",
24
- "pydantic>=2.10.4",
25
- "python-socketio==5.13.0",
26
- "requests>=2.32.3",
27
- "websocket-client>=1.8.0",
21
+ "aiohttp",
22
+ "asyncclick",
23
+ "jq",
24
+ "pydantic==2.12.2",
25
+ "python-socketio",
26
+ "requests",
27
+ "websocket-client",
28
28
  ]
29
29
 
30
30
  [project.urls]
@@ -43,18 +43,18 @@ members = ["smartbox"]
43
43
 
44
44
  [dependency-groups]
45
45
  dev = [
46
- "pre-commit>=4.1.0",
47
- "freezegun>=1.5.1",
48
- "pytest>=8.3.4",
49
- "pytest-asyncio>=0.25.3",
50
- "pytest-cov>=6.0.0",
51
- "pytest-mock>=3.14.0",
52
- "pytest-randomly>=3.16.0",
53
- "requests-mock>=1.12.1",
54
- "tox>=4.24.1",
55
- "ruff>=0.9.4",
56
- "mypy>=1.14.1",
57
- "time-machine>=2.16.0",
46
+ "pre-commit",
47
+ "freezegun",
48
+ "pytest",
49
+ "pytest-asyncio",
50
+ "pytest-cov",
51
+ "pytest-mock",
52
+ "pytest-randomly",
53
+ "requests-mock",
54
+ "tox",
55
+ "ruff",
56
+ "mypy",
57
+ "time-machine",
58
58
  ]
59
59
 
60
60
  [tool.pytest.ini_options]
@@ -49,6 +49,12 @@ class AvailableResellers:
49
49
  api_url="api-elnur",
50
50
  serial_id=7,
51
51
  ),
52
+ "api-valderoma": SmartboxReseller(
53
+ name="Valderoma",
54
+ web_url="https://wifi.valderoma.fr/",
55
+ api_url="api-climastar",
56
+ serial_id=8,
57
+ ),
52
58
  "api-hjm": SmartboxReseller(
53
59
  name="HJM",
54
60
  web_url="https://api.calorhjm.com/",
@@ -45,17 +45,16 @@ class SmartboxAPIV2Namespace(socketio.AsyncClientNamespace):
45
45
  _LOGGER.debug("Namespace %s connected", self._namespace)
46
46
  self._namespace_connected = True
47
47
 
48
- async def on_disconnect(self) -> None:
48
+ async def on_disconnect(self, reason: str) -> None:
49
49
  """Disconnection of namespace."""
50
50
  _LOGGER.debug(
51
- "Namespace %s disconnected, disconnecting socket",
51
+ "Namespace %s disconnected, disconnecting socket. Reason: %s",
52
52
  self._namespace,
53
+ reason,
53
54
  )
54
55
  self._namespace_connected = False
55
56
  self._received_message = False
56
57
  self._received_dev_data = False
57
- # we need to call disconnect to disconnect all namespaces
58
- await self.disconnect()
59
58
 
60
59
  @property
61
60
  def connected(self) -> bool:
@@ -197,7 +196,7 @@ class SocketSession:
197
196
  if remaining > 0:
198
197
  await asyncio.sleep(sleep_time)
199
198
  else:
200
- logging.warning(
199
+ _LOGGER.warning(
201
200
  "Failed to connect after %s attempts, falling through to refresh token",
202
201
  self._reconnect_attempts,
203
202
  )
@@ -11,7 +11,7 @@ from tests.common import fake_get_request
11
11
 
12
12
  @pytest.fixture
13
13
  def runner():
14
- return CliRunner(mix_stderr=False)
14
+ return CliRunner()
15
15
 
16
16
 
17
17
  @pytest.fixture
@@ -14,7 +14,7 @@ DEFAULT_ARGS = [
14
14
  ]
15
15
 
16
16
 
17
- @pytest.mark.anyio
17
+ @pytest.mark.asyncio
18
18
  async def test_health_check(runner, mock_session):
19
19
  devices_future = asyncio.Future()
20
20
  devices_future.set_result("")
@@ -28,7 +28,7 @@ async def test_health_check(runner, mock_session):
28
28
  assert "" in result.output
29
29
 
30
30
 
31
- @pytest.mark.anyio
31
+ @pytest.mark.asyncio
32
32
  async def test_api_version(runner, mock_session):
33
33
  devices_future = asyncio.Future()
34
34
  devices_future.set_result(
@@ -44,7 +44,7 @@ async def test_api_version(runner, mock_session):
44
44
  assert "subminor" in result.output
45
45
 
46
46
 
47
- @pytest.mark.anyio
47
+ @pytest.mark.asyncio
48
48
  async def test_devices(runner, async_smartbox_session):
49
49
  result = await runner.invoke(
50
50
  smartbox,
@@ -54,14 +54,14 @@ async def test_devices(runner, async_smartbox_session):
54
54
  assert "device1" in result.output
55
55
 
56
56
 
57
- @pytest.mark.anyio
57
+ @pytest.mark.asyncio
58
58
  async def test_homes(runner, async_smartbox_session):
59
59
  result = await runner.invoke(smartbox, [*DEFAULT_ARGS, "homes"])
60
60
  assert result.exit_code == 0
61
61
  assert "home1" in result.output
62
62
 
63
63
 
64
- @pytest.mark.anyio
64
+ @pytest.mark.asyncio
65
65
  async def test_nodes(runner, async_smartbox_session):
66
66
  result = await runner.invoke(smartbox, [*DEFAULT_ARGS, "nodes"])
67
67
  assert result.exit_code == 0
@@ -69,7 +69,7 @@ async def test_nodes(runner, async_smartbox_session):
69
69
  assert "Smart Light" in result.output
70
70
 
71
71
 
72
- @pytest.mark.anyio
72
+ @pytest.mark.asyncio
73
73
  async def test_status(runner, async_smartbox_session):
74
74
  result = await runner.invoke(smartbox, [*DEFAULT_ARGS, "status"])
75
75
  assert result.exit_code == 0
@@ -77,7 +77,7 @@ async def test_status(runner, async_smartbox_session):
77
77
  assert "true_radiant_active" in result.output
78
78
 
79
79
 
80
- @pytest.mark.anyio
80
+ @pytest.mark.asyncio
81
81
  async def test_device_away_status(runner, async_smartbox_session):
82
82
  result = await runner.invoke(
83
83
  smartbox,
@@ -87,7 +87,7 @@ async def test_device_away_status(runner, async_smartbox_session):
87
87
  assert "away" in result.output
88
88
 
89
89
 
90
- @pytest.mark.anyio
90
+ @pytest.mark.asyncio
91
91
  async def test_socket(runner, mocker, mock_session):
92
92
  mock_socket_session = mocker.patch("smartbox.cmd.SocketSession")
93
93
  mock_socket_session.return_value.run.return_value = asyncio.Future()
@@ -100,7 +100,7 @@ async def test_socket(runner, mocker, mock_session):
100
100
  assert result.exit_code == 0
101
101
 
102
102
 
103
- @pytest.mark.anyio
103
+ @pytest.mark.asyncio
104
104
  async def test_set_status(runner, mock_session):
105
105
  devices_future = asyncio.Future()
106
106
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -135,7 +135,7 @@ async def test_set_status(runner, mock_session):
135
135
  )
136
136
 
137
137
 
138
- @pytest.mark.anyio
138
+ @pytest.mark.asyncio
139
139
  async def test_set_setup(runner, mock_session):
140
140
  devices_future = asyncio.Future()
141
141
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -187,7 +187,7 @@ async def test_set_setup(runner, mock_session):
187
187
  )
188
188
 
189
189
 
190
- @pytest.mark.anyio
190
+ @pytest.mark.asyncio
191
191
  async def test_set_device_away_status(runner, mock_session):
192
192
  devices_future = asyncio.Future()
193
193
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -221,7 +221,7 @@ async def test_set_device_away_status(runner, mock_session):
221
221
  )
222
222
 
223
223
 
224
- @pytest.mark.anyio
224
+ @pytest.mark.asyncio
225
225
  async def test_node_samples(runner, mock_session):
226
226
  devices_future = asyncio.Future()
227
227
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -262,7 +262,7 @@ async def test_node_samples(runner, mock_session):
262
262
  )
263
263
 
264
264
 
265
- @pytest.mark.anyio
265
+ @pytest.mark.asyncio
266
266
  async def test_reseller(runner, mocker, reseller):
267
267
  result = await runner.invoke(
268
268
  smartbox,
@@ -273,7 +273,7 @@ async def test_reseller(runner, mocker, reseller):
273
273
  assert "http" in result.output
274
274
 
275
275
 
276
- @pytest.mark.anyio
276
+ @pytest.mark.asyncio
277
277
  async def test_device_power_limit(runner, mock_session):
278
278
  devices_future = asyncio.Future()
279
279
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -298,7 +298,7 @@ async def test_device_power_limit(runner, mock_session):
298
298
  )
299
299
 
300
300
 
301
- @pytest.mark.anyio
301
+ @pytest.mark.asyncio
302
302
  async def test_setup(runner, mock_session):
303
303
  devices_future = asyncio.Future()
304
304
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -327,7 +327,7 @@ async def test_setup(runner, mock_session):
327
327
  )
328
328
 
329
329
 
330
- @pytest.mark.anyio
330
+ @pytest.mark.asyncio
331
331
  async def test_set_device_power_limit(runner, mock_session):
332
332
  devices_future = asyncio.Future()
333
333
  devices_future.set_result([{"name": "Device1", "dev_id": "1"}])
@@ -355,7 +355,7 @@ async def test_set_device_power_limit(runner, mock_session):
355
355
  )
356
356
 
357
357
 
358
- @pytest.mark.anyio
358
+ @pytest.mark.asyncio
359
359
  async def test_guests(runner, mock_session):
360
360
  guests_future = asyncio.Future()
361
361
  guests_future.set_result(
@@ -375,7 +375,7 @@ async def test_guests(runner, mock_session):
375
375
  )
376
376
 
377
377
 
378
- @pytest.mark.anyio
378
+ @pytest.mark.asyncio
379
379
  async def test_device_connected_status(runner, async_smartbox_session):
380
380
  result = await runner.invoke(
381
381
  smartbox,
@@ -1,5 +1,7 @@
1
1
  [tox]
2
- envlist = py313
2
+ envlist =
3
+
4
+ py313
3
5
 
4
6
  [testenv]
5
7
  deps =