pyatv-http 0.1.0__tar.gz → 0.1.2__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 (25) hide show
  1. pyatv_http-0.1.2/.renovaterc.json +4 -0
  2. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/PKG-INFO +5 -5
  3. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/README.md +2 -2
  4. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/mise.toml +4 -0
  5. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/pyproject.toml +18 -18
  6. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/config.py +3 -2
  7. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/tests/test_config.py +19 -1
  8. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/uv.lock +20 -20
  9. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/.github/workflows/hk.yml +0 -0
  10. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/.github/workflows/release.yml +0 -0
  11. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/.gitignore +0 -0
  12. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/.yamllint +0 -0
  13. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/LICENSE +0 -0
  14. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/biome.json +0 -0
  15. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/hk.pkl +0 -0
  16. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/__init__.py +0 -0
  17. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/app.py +0 -0
  18. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/atv.py +0 -0
  19. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/auth.py +0 -0
  20. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/cli.py +0 -0
  21. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/src/pyatv_http/gen_config.py +0 -0
  22. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/tests/test_app.py +0 -0
  23. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/tests/test_atv.py +0 -0
  24. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/tests/test_cli.py +0 -0
  25. {pyatv_http-0.1.0 → pyatv_http-0.1.2}/tests/test_gen_config.py +0 -0
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": ["github>hugoh/renovate-config", ":preserveSemverRanges"]
4
+ }
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyatv-http
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: HTTP interface for controlling Apple TVs via pyatv
5
5
  Project-URL: Homepage, https://github.com/hugoh/pyatv-http
6
- Project-URL: Repository, https://github.com/hugoh/pyatv-http
7
6
  Project-URL: Issues, https://github.com/hugoh/pyatv-http/issues
7
+ Project-URL: Repository, https://github.com/hugoh/pyatv-http
8
8
  Author: Hugo Haas
9
9
  License-Expression: MIT
10
10
  License-File: LICENSE
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Topic :: Home Automation
19
19
  Requires-Python: >=3.12
20
20
  Requires-Dist: fastapi>=0.121.0
21
- Requires-Dist: pyatv>=0.16.0
21
+ Requires-Dist: pyatv>=0.18.0
22
22
  Requires-Dist: uvicorn>=0.38.0
23
23
  Description-Content-Type: text/markdown
24
24
 
@@ -106,7 +106,7 @@ identifier = "11:22:33:44:55:66"
106
106
  credentials = "..."
107
107
  ```
108
108
 
109
- - `port` — port the HTTP server listens on.
109
+ - `port` — port the HTTP server listens on. Optional, defaults to `8080`.
110
110
  - `[auth].tokens` — required, non-empty list of bearer tokens accepted on every
111
111
  request (see [API](#api) below). Generate one with e.g.
112
112
  `python3 -c "import secrets; print(secrets.token_urlsafe(32))"`.
@@ -196,6 +196,6 @@ These three routes are not themselves behind the bearer-token check.
196
196
 
197
197
  ```sh
198
198
  uv sync
199
- uv run pytest
199
+ uv run pytest # or: mise run test
200
200
  hk check --all
201
201
  ```
@@ -82,7 +82,7 @@ identifier = "11:22:33:44:55:66"
82
82
  credentials = "..."
83
83
  ```
84
84
 
85
- - `port` — port the HTTP server listens on.
85
+ - `port` — port the HTTP server listens on. Optional, defaults to `8080`.
86
86
  - `[auth].tokens` — required, non-empty list of bearer tokens accepted on every
87
87
  request (see [API](#api) below). Generate one with e.g.
88
88
  `python3 -c "import secrets; print(secrets.token_urlsafe(32))"`.
@@ -172,6 +172,6 @@ These three routes are not themselves behind the bearer-token check.
172
172
 
173
173
  ```sh
174
174
  uv sync
175
- uv run pytest
175
+ uv run pytest # or: mise run test
176
176
  hk check --all
177
177
  ```
@@ -1,3 +1,7 @@
1
+ [tasks.test]
2
+ description = "Run tests"
3
+ run = "uv run pytest"
4
+
1
5
  [tools]
2
6
  uv = "0.11.26"
3
7
  hk = "1.50.0"
@@ -1,14 +1,13 @@
1
1
  [project]
2
2
  name = "pyatv-http"
3
- dynamic = ["version"]
4
3
  description = "HTTP interface for controlling Apple TVs via pyatv"
5
- authors = [
6
- { name = "Hugo Haas" },
7
- ]
8
4
  readme = "README.md"
5
+ requires-python = ">=3.12"
9
6
  license = "MIT"
10
7
  license-files = ["LICENSE"]
11
- requires-python = ">=3.12"
8
+ authors = [
9
+ { name = "Hugo Haas" },
10
+ ]
12
11
  classifiers = [
13
12
  "Development Status :: 3 - Alpha",
14
13
  "Environment :: Console",
@@ -19,47 +18,48 @@ classifiers = [
19
18
  "Programming Language :: Python :: 3.12",
20
19
  "Topic :: Home Automation",
21
20
  ]
21
+ dynamic = ["version"]
22
22
 
23
23
  dependencies = [
24
- "pyatv>=0.16.0",
25
24
  "fastapi>=0.121.0",
25
+ "pyatv>=0.18.0",
26
26
  "uvicorn>=0.38.0",
27
27
  ]
28
28
 
29
29
  [project.urls]
30
30
  Homepage = "https://github.com/hugoh/pyatv-http"
31
- Repository = "https://github.com/hugoh/pyatv-http"
32
31
  Issues = "https://github.com/hugoh/pyatv-http/issues"
32
+ Repository = "https://github.com/hugoh/pyatv-http"
33
33
 
34
34
  [project.scripts]
35
35
  pyatv-http = "pyatv_http.cli:main"
36
36
 
37
- [build-system]
38
- requires = ["hatchling", "hatch-vcs"]
39
- build-backend = "hatchling.build"
40
-
41
37
  [dependency-groups]
42
38
  dev = [
43
- "ty>=0.0.57",
44
- "ruff>=0.15.20",
39
+ "httpx>=0.28.1",
45
40
  "pytest>=9.1.1",
46
41
  "pytest-asyncio>=1.3.0",
47
- "httpx>=0.28.1",
42
+ "ruff>=0.15.20",
43
+ "ty>=0.0.57",
48
44
  ]
49
45
 
46
+ [build-system]
47
+ requires = ["hatch-vcs", "hatchling"]
48
+ build-backend = "hatchling.build"
49
+
50
50
  [tool.hatch.build.targets.wheel]
51
51
  packages = ["src/pyatv_http"]
52
52
 
53
53
  [tool.hatch.version]
54
54
  source = "vcs"
55
55
 
56
+ [tool.pytest.ini_options]
57
+ testpaths = ["tests"]
58
+ asyncio_mode = "auto"
59
+
56
60
  [tool.ruff]
57
61
  line-length = 88
58
62
  target-version = "py312"
59
63
 
60
64
  [tool.ruff.lint]
61
65
  select = ["E", "F", "I", "B", "UP", "SIM"]
62
-
63
- [tool.pytest.ini_options]
64
- testpaths = ["tests"]
65
- asyncio_mode = "auto"
@@ -5,6 +5,7 @@ from dataclasses import dataclass, field
5
5
  from pathlib import Path
6
6
 
7
7
  KNOWN_PROTOCOLS = frozenset({"airplay", "companion", "dmap", "mrp", "raop"})
8
+ DEFAULT_PORT = 8080
8
9
 
9
10
 
10
11
  class ConfigError(Exception):
@@ -97,9 +98,9 @@ def load_config(path: str | Path) -> AppConfig:
97
98
 
98
99
  data = tomllib.loads(path.read_text())
99
100
 
100
- port = data.get("port")
101
+ port = data.get("port", DEFAULT_PORT)
101
102
  if not isinstance(port, int):
102
- raise ConfigError("missing or invalid required field 'port'")
103
+ raise ConfigError("invalid field 'port': must be an integer")
103
104
 
104
105
  raw_devices = data.get("devices")
105
106
  if not raw_devices:
@@ -75,7 +75,7 @@ def test_unknown_device_key_returns_none(tmp_path):
75
75
  assert config.get_device("bedroom") is None
76
76
 
77
77
 
78
- def test_missing_port_raises(tmp_path):
78
+ def test_missing_port_defaults_to_8080(tmp_path):
79
79
  path = tmp_path / "config.toml"
80
80
  path.write_text(
81
81
  AUTH_BLOCK
@@ -87,6 +87,24 @@ address = "10.0.0.5"
87
87
  """
88
88
  )
89
89
 
90
+ config = load_config(path)
91
+
92
+ assert config.port == 8080
93
+
94
+
95
+ def test_invalid_port_raises(tmp_path):
96
+ path = tmp_path / "config.toml"
97
+ path.write_text(
98
+ 'port = "not-a-number"\n'
99
+ + AUTH_BLOCK
100
+ + """
101
+ [devices.living_room]
102
+ name = "Living Room"
103
+ identifier = "AA:BB:CC:DD:EE:FF"
104
+ address = "10.0.0.5"
105
+ """
106
+ )
107
+
90
108
  with pytest.raises(ConfigError, match="port"):
91
109
  load_config(path)
92
110
 
@@ -870,7 +870,7 @@ dev = [
870
870
  [package.metadata]
871
871
  requires-dist = [
872
872
  { name = "fastapi", specifier = ">=0.121.0" },
873
- { name = "pyatv", specifier = ">=0.16.0" },
873
+ { name = "pyatv", specifier = ">=0.18.0" },
874
874
  { name = "uvicorn", specifier = ">=0.38.0" },
875
875
  ]
876
876
 
@@ -1114,27 +1114,27 @@ wheels = [
1114
1114
 
1115
1115
  [[package]]
1116
1116
  name = "ty"
1117
- version = "0.0.61"
1117
+ version = "0.0.62"
1118
1118
  source = { registry = "https://pypi.org/simple" }
1119
- sdist = { url = "https://files.pythonhosted.org/packages/92/63/6944925d0fe9a4bb9cc744e6c045a42bbd2ee4654c103190674577a36c3f/ty-0.0.61.tar.gz", hash = "sha256:acbf0d914cc7e2e57ccc440036af36114819e2a604a5ffb554e72e4ca7dd65a2", size = 6234957, upload-time = "2026-07-18T01:39:54.696Z" }
1119
+ sdist = { url = "https://files.pythonhosted.org/packages/ff/2c/ecf9d6a7456e64ea9114d21e68edaea77ecda9151cc89dfd3ed0b673e4a9/ty-0.0.62.tar.gz", hash = "sha256:145b6feba4d5f38b6d595eb41f7a8ec1c970a0a83b79a70680e9e3b787a3e381", size = 6271717, upload-time = "2026-07-22T01:02:43.732Z" }
1120
1120
  wheels = [
1121
- { url = "https://files.pythonhosted.org/packages/dc/cf/044f31523e2768e3e64b0ca2ec32f70b3a731d4a2caa6ea110baf26e251c/ty-0.0.61-py3-none-linux_armv6l.whl", hash = "sha256:148779b8675eac93f40ec58bd70037fe67537117f20a23272264f8f136d41336", size = 11891448, upload-time = "2026-07-18T01:39:18.449Z" },
1122
- { url = "https://files.pythonhosted.org/packages/d2/55/558cfe76b65d91d1854bbfac336020bd42fd887caa632d845d13c0c539eb/ty-0.0.61-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:08217382b3385808ee7288501ea3214b32631b08d1fd091ece6799b0c95264c5", size = 11602442, upload-time = "2026-07-18T01:39:20.914Z" },
1123
- { url = "https://files.pythonhosted.org/packages/27/be/78c0ae6634cd606a68e5b46b338db427a48a1800c96a749b2d2f7a702e03/ty-0.0.61-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d99c729011b47dec20e78a32ac9c8f6defd4cf62f7bb851bbccf70dde6cee50", size = 11125286, upload-time = "2026-07-18T01:39:22.893Z" },
1124
- { url = "https://files.pythonhosted.org/packages/a4/18/a40793962f1b6337938ddb0bca7496b54e70879e23b4d2cc8dfd7e5d1af3/ty-0.0.61-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cda607978ae271b77e51c947663218bce635c3507e256865444b10c37cdb60d", size = 11663403, upload-time = "2026-07-18T01:39:25.017Z" },
1125
- { url = "https://files.pythonhosted.org/packages/98/c1/7879244da5b30407dc368946d36be5024380073408b079f144ffe034030e/ty-0.0.61-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d78f160a0f9434d570cdcdbc4dafba1f6aac3c47a32f9f63995b3cb55ffe4b6", size = 11715250, upload-time = "2026-07-18T01:39:27.045Z" },
1126
- { url = "https://files.pythonhosted.org/packages/35/c4/8a4637cd58abd37f315dd515e24c582986cb1bfdf2edc4786882f5a4f69a/ty-0.0.61-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09aeab4800b36e93e4ce918699004da642d74988cac920b7592a6a2b9be6611c", size = 12393876, upload-time = "2026-07-18T01:39:29.197Z" },
1127
- { url = "https://files.pythonhosted.org/packages/27/4b/27e7c640b1272743503229aa17ae2167a538040c4716a2fa1777c2b34fea/ty-0.0.61-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dccc8136df44142a109953a168be17b4915c99876b047d0b6672c31dae939bdf", size = 12958187, upload-time = "2026-07-18T01:39:31.308Z" },
1128
- { url = "https://files.pythonhosted.org/packages/3a/f5/70eaaefb6081fb0a8115cff66fbfaa20dafac8c646df2477adad95a59de2/ty-0.0.61-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:220760c2d13a887d027ee1093172c24ac35b6e634805329c93a30908ae4d3f5c", size = 12560101, upload-time = "2026-07-18T01:39:33.35Z" },
1129
- { url = "https://files.pythonhosted.org/packages/e3/5a/17bae3b6429b5c479dc6c1e344d34e1f79efbc27531f15f3ee5b5da63745/ty-0.0.61-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:effefbb89da7128d18059529d1c2ea390fe7f1f3882690d257ca2143d49a0c34", size = 12225389, upload-time = "2026-07-18T01:39:35.436Z" },
1130
- { url = "https://files.pythonhosted.org/packages/d2/0e/2ac380ba20d6395542c8df1d6fa4f00e2aead784c2e6aaefa1e02ed0610c/ty-0.0.61-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ba8b28a5ef811d5bb6461e37d76110c06fd20487474865c323d3d18b08b972b2", size = 12548403, upload-time = "2026-07-18T01:39:37.556Z" },
1131
- { url = "https://files.pythonhosted.org/packages/b0/e5/7da4b73e825e1a9808c26d68b0156e9a37aede1846191210dfffb8c64042/ty-0.0.61-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:88ecd6d9b05e8174b1860dac9bd3e188d6cef5702b0d3239fd9f94f6ac73a29d", size = 11621813, upload-time = "2026-07-18T01:39:39.919Z" },
1132
- { url = "https://files.pythonhosted.org/packages/9b/3c/5b58015e998cd0d89b17a463b6321421457d86d987574e8dac65ddfceba3/ty-0.0.61-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fb0cdfe4c48542ffb9a1139825dfa3d4aae49e96e966682ef7da762ab97831ff", size = 11734101, upload-time = "2026-07-18T01:39:42.097Z" },
1133
- { url = "https://files.pythonhosted.org/packages/a6/21/294f4cc819b7b12ed659fd860e5cdfbd592d4c768c8f23596685dbc43e6b/ty-0.0.61-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dff03873c0c3d0b44738f8b6d403b0756a31cf54c65136397df7624c6159b1f0", size = 11988401, upload-time = "2026-07-18T01:39:44.183Z" },
1134
- { url = "https://files.pythonhosted.org/packages/2e/26/0f96f79fdac118521a9771e9eef3f9b3f447d647b2c77953e80a1715c7e8/ty-0.0.61-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a9210e80e3d41c1dfc751e9e8e0980272f475031fafd0fb0f48aee233c78da03", size = 12330624, upload-time = "2026-07-18T01:39:46.662Z" },
1135
- { url = "https://files.pythonhosted.org/packages/e3/08/1e62d1bca5c0cebdc7a34db1f4b61557aab85961cedd56953dd2c32d3e66/ty-0.0.61-py3-none-win32.whl", hash = "sha256:e3e1fe06f49a5492a922a5df2739834aa5ee978c7dd10414119dc8755cc40c9c", size = 11313991, upload-time = "2026-07-18T01:39:48.761Z" },
1136
- { url = "https://files.pythonhosted.org/packages/26/f1/d8e33b3aeb36b73d81ae34d10e46ec4abf506d68f4e0a1491a76a593dd42/ty-0.0.61-py3-none-win_amd64.whl", hash = "sha256:25f2291169e0298fcdbba1b1fea64f8207a6c1908dddef32346fd5e3e6ac9221", size = 12311717, upload-time = "2026-07-18T01:39:50.881Z" },
1137
- { url = "https://files.pythonhosted.org/packages/e1/14/7caec26d93a943c0e7d15eb7374644508d08cbd387d112b722b12d14e044/ty-0.0.61-py3-none-win_arm64.whl", hash = "sha256:3e496f7698bc4b5bbb1eb66d8b5799ba87596d88d36604ca359083893fa2fc49", size = 11693485, upload-time = "2026-07-18T01:39:52.73Z" },
1121
+ { url = "https://files.pythonhosted.org/packages/e4/ab/cb629d65b4437b298214a095488a8d84ec349f225ed84da13763adfce08b/ty-0.0.62-py3-none-linux_armv6l.whl", hash = "sha256:3db167f0aef29e7c34d47414c9ce160fd045e9b2d6a0edd08d0331b4eaa3b9ad", size = 12045218, upload-time = "2026-07-22T01:02:04.497Z" },
1122
+ { url = "https://files.pythonhosted.org/packages/b7/c9/f6555aa3b0c46bf2a38891a2048c45616e836a6aab96dff847ab01cc83b3/ty-0.0.62-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aab3f1d6ca4c9ad1869e57164478694d9828ad1dfcadc192ece7215a20859197", size = 11688585, upload-time = "2026-07-22T01:02:06.795Z" },
1123
+ { url = "https://files.pythonhosted.org/packages/56/25/9f4a322c64ac8a4f2d1593749bb5932c5c964e557fe7788116fa029b2463/ty-0.0.62-py3-none-macosx_11_0_arm64.whl", hash = "sha256:69ce10b241f487b69ccdc36ca4ac4f4ba683172d24594b5d7296a66f7e26d15c", size = 11204179, upload-time = "2026-07-22T01:02:09.109Z" },
1124
+ { url = "https://files.pythonhosted.org/packages/ef/db/d9cf7d5343ff896c2d780caec3dcd0ee77493d8a4140b8aa49e15824abff/ty-0.0.62-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd736420acb009d00a2379e47be4085dd3e3cdbe5305bdf5acce0dd9082f1bbb", size = 11745874, upload-time = "2026-07-22T01:02:11.507Z" },
1125
+ { url = "https://files.pythonhosted.org/packages/4b/23/a575008c2ccdaacaf1c358be52087db449ea73a78c91c8afb30084d64cfc/ty-0.0.62-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bca9a80e2e5fb72e88e31cf662aae3bd8d7e9e0005ab517a89c368267c992387", size = 11875688, upload-time = "2026-07-22T01:02:14.072Z" },
1126
+ { url = "https://files.pythonhosted.org/packages/df/92/43a6250b52a704169b6d864665f286f71588d95ff645941cc0e4ca026ab7/ty-0.0.62-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f8d2a35940bbdea1d28c36c83d3eaba08bf47990486a066b9cb3ae4fbb8625e", size = 12484062, upload-time = "2026-07-22T01:02:16.081Z" },
1127
+ { url = "https://files.pythonhosted.org/packages/92/34/35c698baa067a2543a32cd7237ad9bdc63dec1ce8b5b62b4686b4485fec4/ty-0.0.62-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f8257481a517f05e0621ef3b4ef4089a38ac03f17aa800c9f672df19fd03b3d", size = 13007869, upload-time = "2026-07-22T01:02:18.145Z" },
1128
+ { url = "https://files.pythonhosted.org/packages/2a/2c/e9dd785d62bcfeb9285cc030495288640f1942bf3228a791a3a30d72f7b4/ty-0.0.62-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b907322a2cecd3e25902878997d08de57cf0efbb27833f8b3378fbd4f218590", size = 12675651, upload-time = "2026-07-22T01:02:20.299Z" },
1129
+ { url = "https://files.pythonhosted.org/packages/36/86/5650d8b70bd80946afdb3aaefedd280a698b82d9066f18f8a47f58642230/ty-0.0.62-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac8b70f0b5494feed0a3cf47af579141e4c2e88faffcaeebcb4176e914b54b6a", size = 12324208, upload-time = "2026-07-22T01:02:22.671Z" },
1130
+ { url = "https://files.pythonhosted.org/packages/38/2d/278a17a0f47a90804a744e7d7a598c47fbc15a357ad5aaff563fee3bc65a/ty-0.0.62-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:059790546f9304a750f28ded9b964a7a27dec88e725d329a4b9ab5d944e83dd6", size = 12616124, upload-time = "2026-07-22T01:02:24.8Z" },
1131
+ { url = "https://files.pythonhosted.org/packages/1a/51/62741847bd646f8702b9ce61de496804a8ac52055afab8dbb94aaf64f431/ty-0.0.62-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9e83bc6d59e2b37a1d8923ffb7e2455fd35ad35821a3dc69c8459ca9cd28724", size = 11695150, upload-time = "2026-07-22T01:02:27.17Z" },
1132
+ { url = "https://files.pythonhosted.org/packages/0c/0d/74bd23f94a527bdc32d8366f51db157f75a3074e320c567a2eae83bd6d21/ty-0.0.62-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f84ac4b606c3b4275a17f7b2f60cb0ca8216972bb7af2f515383ee6e4b1fb7f1", size = 11884562, upload-time = "2026-07-22T01:02:29.09Z" },
1133
+ { url = "https://files.pythonhosted.org/packages/dd/0e/2f42cc81436b5dc0070b4e353c74cbe94ce91ef5828753db921088dec500/ty-0.0.62-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1c05f8f9cd720fa42744574bf3bda9b1b676f7876e33324b03b21aad81f651df", size = 12071773, upload-time = "2026-07-22T01:02:31.292Z" },
1134
+ { url = "https://files.pythonhosted.org/packages/42/24/0bd3c0069524bf7d5e610d92dd0698414372015461507280c8787c9cd25b/ty-0.0.62-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:88bef93008228890e990fe9e87f0504b8dea9f9f24534eb3a5ee9d8ab9e5cd4f", size = 12425247, upload-time = "2026-07-22T01:02:34.474Z" },
1135
+ { url = "https://files.pythonhosted.org/packages/3f/27/08505fa0d2bef8fe4107753bb02ed2da4e323103ff5d423b9cc9eea4346e/ty-0.0.62-py3-none-win32.whl", hash = "sha256:254690c758e9d0ee2c8dfe07320d4e9d54709d5e95fa588ecf5a96391dc8d8d4", size = 11381070, upload-time = "2026-07-22T01:02:36.625Z" },
1136
+ { url = "https://files.pythonhosted.org/packages/aa/c1/609840f13d1c48e88e5b431fe789650da14cb25da0df2979fe08ce422e73/ty-0.0.62-py3-none-win_amd64.whl", hash = "sha256:d88c2594e6a33c5f859c1d9016ad6137ec304c5d51422ce48894d2b9393956a7", size = 12415015, upload-time = "2026-07-22T01:02:39.193Z" },
1137
+ { url = "https://files.pythonhosted.org/packages/0f/a8/43f838fa38922f175a223814120b5faeb1bb6e5ef1533e45f543c0f510b8/ty-0.0.62-py3-none-win_arm64.whl", hash = "sha256:11b5e7df21890bef3eda49ae15a0c4d12554917ec4ea90ea985caa33241af627", size = 11773787, upload-time = "2026-07-22T01:02:41.564Z" },
1138
1138
  ]
1139
1139
 
1140
1140
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes