nr5103e-sdk 0.1.0__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.
@@ -0,0 +1,19 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - uses: actions/setup-python@v5
13
+ with:
14
+ python-version-file: .python-version
15
+ - name: Install dependencies
16
+ run: |
17
+ python -m pip install -e . --group dev
18
+ - name: Run tests
19
+ run: ./bin/test
@@ -0,0 +1,38 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ - name: Build package
17
+ run: |
18
+ python -m pip install build
19
+ python -m build
20
+ - uses: actions/upload-artifact@v4
21
+ with:
22
+ name: python-dist
23
+ path: dist/
24
+
25
+ publish:
26
+ needs: build
27
+ runs-on: ubuntu-latest
28
+ environment:
29
+ name: pypi
30
+ url: https://pypi.org/p/nr5103e-sdk
31
+ permissions:
32
+ id-token: write
33
+ steps:
34
+ - uses: actions/download-artifact@v4
35
+ with:
36
+ name: python-dist
37
+ path: dist/
38
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,12 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ /integration_tests.py
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,22 @@
1
+ # AGENTS
2
+
3
+ This repository is a Python SDK for interacting with Zyxel NR5103E routers.
4
+
5
+ ## Workflow
6
+ - Use the Python version specified in `.python-version`.
7
+ - Source files live under `src/` and tests under `tests/`.
8
+ - Run `bin/format` to apply ruff autoformatting.
9
+ - Run `bin/test` after changes. It performs ruff linting, checks formatting, runs mypy and pytest.
10
+
11
+ Always run both commands before committing code.
12
+
13
+ ## Development Setup
14
+ The project configuration and dependencies live in `pyproject.toml`.
15
+ Create a virtual environment and install the SDK in editable mode with its
16
+ `dev` extras to get the tooling used by `bin/format` and `bin/test`:
17
+
18
+ ```sh
19
+ python -m venv .venv
20
+ source .venv/bin/activate
21
+ pip install -e .[dev]
22
+ ```
@@ -0,0 +1,44 @@
1
+ Metadata-Version: 2.4
2
+ Name: nr5103e-sdk
3
+ Version: 0.1.0
4
+ Summary: SDK for interacting with the Zyxel NR5103E router.
5
+ Author-email: Gary Fernie <g@ryfernie.me>
6
+ Requires-Python: >=3.13
7
+ Requires-Dist: requests>=2.32.3
8
+ Description-Content-Type: text/markdown
9
+
10
+ # NR5103E SDK
11
+
12
+ A Python SDK for interacting with NR5103E routers. It handles login, sessions, and basic router queries.
13
+
14
+ ## Quick Start
15
+
16
+ ### Installation
17
+
18
+ ```sh
19
+ pip install .
20
+ ```
21
+
22
+ ### Usage Example
23
+
24
+ ```python
25
+ from nr5103e_sdk.client import Client
26
+
27
+ with Client("admin_password") as client:
28
+ status = client.cellwan_status()
29
+ print(f"Cell ID: {status['INTF_Cell_ID']")
30
+ ```
31
+
32
+ ## Contributing
33
+
34
+ ### Run Tests
35
+
36
+ ```sh
37
+ bin/test
38
+ ```
39
+
40
+ ### Format Code
41
+
42
+ ```sh
43
+ bin/format
44
+ ```
@@ -0,0 +1,35 @@
1
+ # NR5103E SDK
2
+
3
+ A Python SDK for interacting with NR5103E routers. It handles login, sessions, and basic router queries.
4
+
5
+ ## Quick Start
6
+
7
+ ### Installation
8
+
9
+ ```sh
10
+ pip install .
11
+ ```
12
+
13
+ ### Usage Example
14
+
15
+ ```python
16
+ from nr5103e_sdk.client import Client
17
+
18
+ with Client("admin_password") as client:
19
+ status = client.cellwan_status()
20
+ print(f"Cell ID: {status['INTF_Cell_ID']")
21
+ ```
22
+
23
+ ## Contributing
24
+
25
+ ### Run Tests
26
+
27
+ ```sh
28
+ bin/test
29
+ ```
30
+
31
+ ### Format Code
32
+
33
+ ```sh
34
+ bin/format
35
+ ```
@@ -0,0 +1,4 @@
1
+ #! /bin/sh
2
+ set -ex
3
+ ruff check --fix --quiet
4
+ ruff format
@@ -0,0 +1,6 @@
1
+ #! /bin/sh
2
+ set -ex
3
+ ruff check
4
+ ruff format --diff
5
+ mypy .
6
+ pytest
@@ -0,0 +1,41 @@
1
+ [project]
2
+ name = "nr5103e-sdk"
3
+ version = "0.1.0"
4
+ description = "SDK for interacting with the Zyxel NR5103E router."
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Gary Fernie", email = "g@ryfernie.me" }
8
+ ]
9
+ requires-python = ">=3.13"
10
+ dependencies = [
11
+ "requests>=2.32.3",
12
+ ]
13
+
14
+ [build-system]
15
+ requires = ["hatchling"]
16
+ build-backend = "hatchling.build"
17
+
18
+ [dependency-groups]
19
+ dev = [
20
+ "mypy>=1.15.0",
21
+ "pytest>=8.3.5",
22
+ "ruff>=0.11.6",
23
+ "types-requests>=2.32.0.20250328",
24
+ ]
25
+
26
+ [tool.pytest.ini_options]
27
+ log_cli = true
28
+ log_cli_level = "DEBUG"
29
+
30
+ [tool.ruff.lint]
31
+ select = ["ALL"]
32
+ ignore = [
33
+ "COM812",
34
+ "D203",
35
+ "D213",
36
+ "FIX",
37
+ "TD",
38
+ ]
39
+
40
+ [tool.ruff.lint.per-file-ignores]
41
+ "tests/*.py" = ["ANN201", "D100", "D103", "D104", "S101"]
@@ -0,0 +1 @@
1
+ """SDK for interacting with the Zyxel NR5103E router."""
@@ -0,0 +1,110 @@
1
+ """Client for interacting with NR5103E router."""
2
+
3
+ import logging
4
+ from base64 import b64encode
5
+ from functools import cached_property
6
+ from types import TracebackType
7
+ from typing import Self
8
+ from urllib.parse import urljoin
9
+
10
+ import requests
11
+
12
+ DEFAULT_HOST = "https://192.168.1.1"
13
+ DEFAULT_USERNAME = "admin"
14
+
15
+ log = logging.getLogger(__name__)
16
+
17
+
18
+ class Client:
19
+ """Client for interacting with NR5103E router."""
20
+
21
+ def __init__(
22
+ self,
23
+ *args: str,
24
+ username: str = DEFAULT_USERNAME,
25
+ password: str | None = None,
26
+ host: str = DEFAULT_HOST,
27
+ verify: bool | None = True,
28
+ ) -> None:
29
+ """Initialise client with some common defaults.
30
+
31
+ Positional args can be:
32
+ * password
33
+ * username, password
34
+ * username, password, host
35
+ """
36
+ match len(args):
37
+ case 0:
38
+ if password is None:
39
+ msg = "Foo.__init__() missing 1 required positional argument: 'password'" # noqa:E501
40
+ raise TypeError(msg)
41
+ self.username = username
42
+ self.password = password
43
+ self.host = host
44
+ case 1:
45
+ self.username = username
46
+ self.password = args[0]
47
+ self.host = host
48
+ case 2:
49
+ self.username, self.password = args
50
+ self.host = host
51
+ case 3:
52
+ self.username, self.password, self.host = args
53
+ self.verify = verify
54
+ self.timeout = 1
55
+
56
+ def __enter__(self) -> Self:
57
+ """Do nothing."""
58
+ return self
59
+
60
+ def __exit__(
61
+ self,
62
+ exc_type: type[BaseException] | None,
63
+ exc_value: BaseException | None,
64
+ traceback: TracebackType | None,
65
+ ) -> bool | None:
66
+ """Close and delete session from instance cache."""
67
+ if "session" in self.__dict__:
68
+ self.session.close()
69
+ del self.__dict__["session"]
70
+ return None
71
+
72
+ @cached_property
73
+ def session(self) -> requests.Session:
74
+ """Lazy requests session."""
75
+ session = requests.Session()
76
+ session.verify = self.verify
77
+ return session
78
+
79
+ def user_login(self) -> None:
80
+ """Log in for session."""
81
+ url = urljoin(self.host, "UserLogin")
82
+ encoded_password = b64encode(self.password.encode()).decode()
83
+ body = {
84
+ "Input_Account": self.username,
85
+ "Input_Passwd": encoded_password,
86
+ "currLang": "en",
87
+ "SHA512_password": False,
88
+ }
89
+ log.debug("Send request to URL %s\nRequest Body: %s", url, body)
90
+ response = self.session.post(url, json=body, timeout=self.timeout)
91
+ if not response.ok:
92
+ log.warning(
93
+ "Unexpected response for URL %s\nStatus Code: %s\nResponse Body: %s",
94
+ url,
95
+ response.status_code,
96
+ response.text,
97
+ )
98
+
99
+ def user_login_check(self) -> bool:
100
+ """Check if login is valid."""
101
+ url = urljoin(self.host, "cgi-bin/UserLoginCheck")
102
+ response = self.session.get(url, timeout=self.timeout)
103
+ log.info("Login status: %s", response.status_code)
104
+ return response.ok
105
+
106
+ def cellwan_status(self) -> dict:
107
+ """Get info about cell interface status."""
108
+ url = urljoin(self.host, "cgi-bin/DAL?oid=cellwan_status")
109
+ response = self.session.get(url, timeout=self.timeout)
110
+ return response.json()["Object"][0]
File without changes
File without changes
@@ -0,0 +1,12 @@
1
+ from nr5103e_sdk.client import Client
2
+
3
+
4
+ def test_client_context_manager():
5
+ with Client("password"):
6
+ pass
7
+
8
+
9
+ def test_client_session_lazy():
10
+ client = Client("password")
11
+ with client:
12
+ assert "session" not in client.__dict__
@@ -0,0 +1,219 @@
1
+ version = 1
2
+ revision = 1
3
+ requires-python = ">=3.13"
4
+
5
+ [[package]]
6
+ name = "certifi"
7
+ version = "2025.4.26"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "charset-normalizer"
16
+ version = "3.4.1"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
21
+ { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
22
+ { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
23
+ { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
24
+ { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
25
+ { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
26
+ { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
27
+ { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
28
+ { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
29
+ { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
30
+ { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
31
+ { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
32
+ { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
33
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
34
+ ]
35
+
36
+ [[package]]
37
+ name = "colorama"
38
+ version = "0.4.6"
39
+ source = { registry = "https://pypi.org/simple" }
40
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
41
+ wheels = [
42
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
43
+ ]
44
+
45
+ [[package]]
46
+ name = "idna"
47
+ version = "3.10"
48
+ source = { registry = "https://pypi.org/simple" }
49
+ sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
50
+ wheels = [
51
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
52
+ ]
53
+
54
+ [[package]]
55
+ name = "iniconfig"
56
+ version = "2.1.0"
57
+ source = { registry = "https://pypi.org/simple" }
58
+ sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 }
59
+ wheels = [
60
+ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 },
61
+ ]
62
+
63
+ [[package]]
64
+ name = "mypy"
65
+ version = "1.15.0"
66
+ source = { registry = "https://pypi.org/simple" }
67
+ dependencies = [
68
+ { name = "mypy-extensions" },
69
+ { name = "typing-extensions" },
70
+ ]
71
+ sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
72
+ wheels = [
73
+ { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
74
+ { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
75
+ { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
76
+ { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
77
+ { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
78
+ { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
79
+ { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
80
+ ]
81
+
82
+ [[package]]
83
+ name = "mypy-extensions"
84
+ version = "1.1.0"
85
+ source = { registry = "https://pypi.org/simple" }
86
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 }
87
+ wheels = [
88
+ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 },
89
+ ]
90
+
91
+ [[package]]
92
+ name = "nr5103e-sdk"
93
+ version = "0.1.0"
94
+ source = { editable = "." }
95
+ dependencies = [
96
+ { name = "requests" },
97
+ ]
98
+
99
+ [package.dev-dependencies]
100
+ dev = [
101
+ { name = "mypy" },
102
+ { name = "pytest" },
103
+ { name = "ruff" },
104
+ { name = "types-requests" },
105
+ ]
106
+
107
+ [package.metadata]
108
+ requires-dist = [{ name = "requests", specifier = ">=2.32.3" }]
109
+
110
+ [package.metadata.requires-dev]
111
+ dev = [
112
+ { name = "mypy", specifier = ">=1.15.0" },
113
+ { name = "pytest", specifier = ">=8.3.5" },
114
+ { name = "ruff", specifier = ">=0.11.6" },
115
+ { name = "types-requests", specifier = ">=2.32.0.20250328" },
116
+ ]
117
+
118
+ [[package]]
119
+ name = "packaging"
120
+ version = "25.0"
121
+ source = { registry = "https://pypi.org/simple" }
122
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 }
123
+ wheels = [
124
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 },
125
+ ]
126
+
127
+ [[package]]
128
+ name = "pluggy"
129
+ version = "1.5.0"
130
+ source = { registry = "https://pypi.org/simple" }
131
+ sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
132
+ wheels = [
133
+ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
134
+ ]
135
+
136
+ [[package]]
137
+ name = "pytest"
138
+ version = "8.3.5"
139
+ source = { registry = "https://pypi.org/simple" }
140
+ dependencies = [
141
+ { name = "colorama", marker = "sys_platform == 'win32'" },
142
+ { name = "iniconfig" },
143
+ { name = "packaging" },
144
+ { name = "pluggy" },
145
+ ]
146
+ sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
147
+ wheels = [
148
+ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
149
+ ]
150
+
151
+ [[package]]
152
+ name = "requests"
153
+ version = "2.32.3"
154
+ source = { registry = "https://pypi.org/simple" }
155
+ dependencies = [
156
+ { name = "certifi" },
157
+ { name = "charset-normalizer" },
158
+ { name = "idna" },
159
+ { name = "urllib3" },
160
+ ]
161
+ sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
162
+ wheels = [
163
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
164
+ ]
165
+
166
+ [[package]]
167
+ name = "ruff"
168
+ version = "0.11.7"
169
+ source = { registry = "https://pypi.org/simple" }
170
+ sdist = { url = "https://files.pythonhosted.org/packages/5b/89/6f9c9674818ac2e9cc2f2b35b704b7768656e6b7c139064fc7ba8fbc99f1/ruff-0.11.7.tar.gz", hash = "sha256:655089ad3224070736dc32844fde783454f8558e71f501cb207485fe4eee23d4", size = 4054861 }
171
+ wheels = [
172
+ { url = "https://files.pythonhosted.org/packages/b4/ec/21927cb906c5614b786d1621dba405e3d44f6e473872e6df5d1a6bca0455/ruff-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:d29e909d9a8d02f928d72ab7837b5cbc450a5bdf578ab9ebee3263d0a525091c", size = 10245403 },
173
+ { url = "https://files.pythonhosted.org/packages/e2/af/fec85b6c2c725bcb062a354dd7cbc1eed53c33ff3aa665165871c9c16ddf/ruff-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dd1fb86b168ae349fb01dd497d83537b2c5541fe0626e70c786427dd8363aaee", size = 11007166 },
174
+ { url = "https://files.pythonhosted.org/packages/31/9a/2d0d260a58e81f388800343a45898fd8df73c608b8261c370058b675319a/ruff-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3d7d2e140a6fbbc09033bce65bd7ea29d6a0adeb90b8430262fbacd58c38ada", size = 10378076 },
175
+ { url = "https://files.pythonhosted.org/packages/c2/c4/9b09b45051404d2e7dd6d9dbcbabaa5ab0093f9febcae664876a77b9ad53/ruff-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4809df77de390a1c2077d9b7945d82f44b95d19ceccf0c287c56e4dc9b91ca64", size = 10557138 },
176
+ { url = "https://files.pythonhosted.org/packages/5e/5e/f62a1b6669870a591ed7db771c332fabb30f83c967f376b05e7c91bccd14/ruff-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3a0c2e169e6b545f8e2dba185eabbd9db4f08880032e75aa0e285a6d3f48201", size = 10095726 },
177
+ { url = "https://files.pythonhosted.org/packages/45/59/a7aa8e716f4cbe07c3500a391e58c52caf665bb242bf8be42c62adef649c/ruff-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49b888200a320dd96a68e86736cf531d6afba03e4f6cf098401406a257fcf3d6", size = 11672265 },
178
+ { url = "https://files.pythonhosted.org/packages/dd/e3/101a8b707481f37aca5f0fcc3e42932fa38b51add87bfbd8e41ab14adb24/ruff-0.11.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2b19cdb9cf7dae00d5ee2e7c013540cdc3b31c4f281f1dacb5a799d610e90db4", size = 12331418 },
179
+ { url = "https://files.pythonhosted.org/packages/dd/71/037f76cbe712f5cbc7b852e4916cd3cf32301a30351818d32ab71580d1c0/ruff-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64e0ee994c9e326b43539d133a36a455dbaab477bc84fe7bfbd528abe2f05c1e", size = 11794506 },
180
+ { url = "https://files.pythonhosted.org/packages/ca/de/e450b6bab1fc60ef263ef8fcda077fb4977601184877dce1c59109356084/ruff-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bad82052311479a5865f52c76ecee5d468a58ba44fb23ee15079f17dd4c8fd63", size = 13939084 },
181
+ { url = "https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502", size = 11450441 },
182
+ { url = "https://files.pythonhosted.org/packages/9d/7d/1b048eb460517ff9accd78bca0fa6ae61df2b276010538e586f834f5e402/ruff-0.11.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:169027e31c52c0e36c44ae9a9c7db35e505fee0b39f8d9fca7274a6305295a92", size = 10441060 },
183
+ { url = "https://files.pythonhosted.org/packages/3a/57/8dc6ccfd8380e5ca3d13ff7591e8ba46a3b330323515a4996b991b10bd5d/ruff-0.11.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:305b93f9798aee582e91e34437810439acb28b5fc1fee6b8205c78c806845a94", size = 10058689 },
184
+ { url = "https://files.pythonhosted.org/packages/23/bf/20487561ed72654147817885559ba2aa705272d8b5dee7654d3ef2dbf912/ruff-0.11.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a681db041ef55550c371f9cd52a3cf17a0da4c75d6bd691092dfc38170ebc4b6", size = 11073703 },
185
+ { url = "https://files.pythonhosted.org/packages/9d/27/04f2db95f4ef73dccedd0c21daf9991cc3b7f29901a4362057b132075aa4/ruff-0.11.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:07f1496ad00a4a139f4de220b0c97da6d4c85e0e4aa9b2624167b7d4d44fd6b6", size = 11532822 },
186
+ { url = "https://files.pythonhosted.org/packages/e1/72/43b123e4db52144c8add336581de52185097545981ff6e9e58a21861c250/ruff-0.11.7-py3-none-win32.whl", hash = "sha256:f25dfb853ad217e6e5f1924ae8a5b3f6709051a13e9dad18690de6c8ff299e26", size = 10362436 },
187
+ { url = "https://files.pythonhosted.org/packages/c5/a0/3e58cd76fdee53d5c8ce7a56d84540833f924ccdf2c7d657cb009e604d82/ruff-0.11.7-py3-none-win_amd64.whl", hash = "sha256:0a931d85959ceb77e92aea4bbedfded0a31534ce191252721128f77e5ae1f98a", size = 11566676 },
188
+ { url = "https://files.pythonhosted.org/packages/68/ca/69d7c7752bce162d1516e5592b1cc6b6668e9328c0d270609ddbeeadd7cf/ruff-0.11.7-py3-none-win_arm64.whl", hash = "sha256:778c1e5d6f9e91034142dfd06110534ca13220bfaad5c3735f6cb844654f6177", size = 10677936 },
189
+ ]
190
+
191
+ [[package]]
192
+ name = "types-requests"
193
+ version = "2.32.0.20250328"
194
+ source = { registry = "https://pypi.org/simple" }
195
+ dependencies = [
196
+ { name = "urllib3" },
197
+ ]
198
+ sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995 }
199
+ wheels = [
200
+ { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663 },
201
+ ]
202
+
203
+ [[package]]
204
+ name = "typing-extensions"
205
+ version = "4.13.2"
206
+ source = { registry = "https://pypi.org/simple" }
207
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
208
+ wheels = [
209
+ { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
210
+ ]
211
+
212
+ [[package]]
213
+ name = "urllib3"
214
+ version = "2.4.0"
215
+ source = { registry = "https://pypi.org/simple" }
216
+ sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
217
+ wheels = [
218
+ { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
219
+ ]