geojson-msgspec 1.0.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,26 @@
1
+ name: Build & Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ id-token: write
12
+
13
+ jobs:
14
+ publish:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v5
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v7
21
+
22
+ - name: Build package
23
+ run: uv build
24
+
25
+ - name: Publish to PyPI
26
+ run: uv publish
@@ -0,0 +1,41 @@
1
+ # Editor config folders
2
+ ## Vscode
3
+ .settings/
4
+ .project
5
+ .vscode/
6
+ .vs/
7
+ ## PyCharm/IntelliJ-generated files
8
+ *.iml
9
+ .idea/
10
+
11
+ # Python cached sources
12
+ __pycache__/
13
+ *.pyc
14
+
15
+ # Virtual environments
16
+ .venv*/
17
+ venv*/
18
+
19
+ # Pytest and coverage
20
+ .coverage
21
+ .pytest/
22
+ .pytest_cache/
23
+ htmlcov/
24
+
25
+ # Mypy Cache
26
+ .mypy_cache/
27
+
28
+ # Setuptools/twine-generated files, compiled sources.
29
+ build/
30
+ dist/
31
+ *.egg-info/
32
+ pip-wheel-metadata/
33
+ *.so
34
+ *.o
35
+ *.pyd
36
+
37
+ # Misc
38
+ *.pem
39
+ out/
40
+ .cache/
41
+ .DS_Store
@@ -0,0 +1,30 @@
1
+ default_language_version:
2
+ python: '3.9'
3
+
4
+ repos:
5
+ - repo: https://github.com/pre-commit/pre-commit-hooks
6
+ rev: v6.0.0
7
+ hooks:
8
+ - id: trailing-whitespace
9
+ - id: end-of-file-fixer
10
+ - id: check-added-large-files
11
+ - id: check-merge-conflict
12
+ - id: check-toml
13
+ - id: debug-statements
14
+
15
+ - repo: https://github.com/astral-sh/ruff-pre-commit
16
+ rev: v0.14.2
17
+ hooks:
18
+ - id: ruff
19
+ name: ruff check
20
+ pass_filenames: false
21
+ args:
22
+ - --fix
23
+ - id: ruff-format
24
+ pass_filenames: false
25
+
26
+ - repo: https://github.com/pre-commit/mirrors-mypy
27
+ rev: v1.18.2
28
+ hooks:
29
+ - id: mypy
30
+ pass_filenames: false
@@ -0,0 +1,28 @@
1
+ Copyright (c) 2021, Jim Crist-Harif
2
+ Copyright (c) 2024, Rafał Krupiński, öKlo GmbH
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its contributors
16
+ may be used to endorse or promote products derived from this software
17
+ without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.4
2
+ Name: geojson-msgspec
3
+ Version: 1.0.0
4
+ Summary: msgspec GeoJSON model
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.9
7
+ Requires-Dist: msgspec<0.20,>=0.19
8
+ Description-Content-Type: text/x-rst
9
+
10
+ This project contains code published as an example in the `msgspec project <https://jcristharif.com/msgspec/>`
11
+ backported to python 3.8.
12
+
13
+ GeoJSON
14
+ =======
15
+
16
+ `GeoJSON <https://geojson.org>`__ is a popular format for encoding geographic
17
+ data. Its specification_ describes nine different types a message may take
18
+ (seven "geometry" types, plus two "feature" types). Here we provide one way of
19
+ implementing that specification using ``msgspec`` to handle the parsing and
20
+ validation.
21
+
22
+ The ``loads`` and ``dumps`` methods defined below work similar to the
23
+ standard library's ``json.loads``/``json.dumps``, but:
24
+
25
+ - Will result in high-level `msgspec.Struct` objects representing GeoJSON types
26
+ - Will error nicely if a field is missing or the wrong type
27
+ - Will fill in default values for optional fields
28
+ - Decodes and encodes *significantly faster* than the `json` module (as well as
29
+ most other ``json`` implementations in Python).
30
+
31
+ This example makes use `msgspec.Struct` types to define the different GeoJSON
32
+ types, and `struct-tagged-unions`_ to differentiate between them. See the
33
+ relevant docs for more information.
34
+
35
+ The original source code can be found `here
36
+ <https://github.com/jcrist/msgspec/blob/main/examples/geojson>`__.
37
+
38
+ Here we use the ``loads`` method defined above to read some `example GeoJSON`_.
39
+
40
+ .. code-block:: ipython3
41
+
42
+ In [1]: import msgspec_geojson
43
+
44
+ In [2]: with open("canada.json", "rb") as f:
45
+ ...: data = f.read()
46
+
47
+ In [3]: canada = msgspec_geojson.loads(data)
48
+
49
+ In [4]: type(canada) # loaded as high-level, validated object
50
+ Out[4]: msgspec_geojson.FeatureCollection
51
+
52
+ In [5]: canada.features[0].properties
53
+ Out[5]: {'name': 'Canada'}
54
+
55
+ Comparing performance to:
56
+
57
+ - orjson_
58
+ - `json`
59
+ - geojson_ (another validating Python implementation)
60
+
61
+ .. code-block:: ipython3
62
+
63
+ In [6]: %timeit msgspec_geojson.loads(data) # benchmark msgspec
64
+ 6.15 ms ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
65
+
66
+ In [7]: %timeit orjson.loads(data) # benchmark orjson
67
+ 8.67 ms ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
68
+
69
+ In [8]: %timeit json.loads(data) # benchmark json
70
+ 27.6 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
71
+
72
+ In [9]: %timeit geojson.loads(data) # benchmark geojson
73
+ 93.9 ms ± 88.1 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
74
+
75
+
76
+ This shows that the readable ``msgspec`` implementation above is 1.4x faster
77
+ than `orjson` (on this data), while also ensuring the loaded data is valid
78
+ GeoJSON. Compared to geojson_ (another validating geojson library for python),
79
+ loading the data using ``msgspec`` was **15.3x faster**.
80
+
81
+ .. _specification: https://datatracker.ietf.org/doc/html/rfc7946
82
+ .. _example GeoJSON: https://github.com/jcrist/msgspec/blob/main/examples/geojson/canada.json
83
+ .. _orjson: https://github.com/ijl/orjson
84
+ .. _geojson: https://github.com/jazzband/geojson
85
+ .. _struct-tagged-unions: https://jcristharif.com/msgspec/structs.html#tagged-unions
@@ -0,0 +1,76 @@
1
+ This project contains code published as an example in the `msgspec project <https://jcristharif.com/msgspec/>`
2
+ backported to python 3.8.
3
+
4
+ GeoJSON
5
+ =======
6
+
7
+ `GeoJSON <https://geojson.org>`__ is a popular format for encoding geographic
8
+ data. Its specification_ describes nine different types a message may take
9
+ (seven "geometry" types, plus two "feature" types). Here we provide one way of
10
+ implementing that specification using ``msgspec`` to handle the parsing and
11
+ validation.
12
+
13
+ The ``loads`` and ``dumps`` methods defined below work similar to the
14
+ standard library's ``json.loads``/``json.dumps``, but:
15
+
16
+ - Will result in high-level `msgspec.Struct` objects representing GeoJSON types
17
+ - Will error nicely if a field is missing or the wrong type
18
+ - Will fill in default values for optional fields
19
+ - Decodes and encodes *significantly faster* than the `json` module (as well as
20
+ most other ``json`` implementations in Python).
21
+
22
+ This example makes use `msgspec.Struct` types to define the different GeoJSON
23
+ types, and `struct-tagged-unions`_ to differentiate between them. See the
24
+ relevant docs for more information.
25
+
26
+ The original source code can be found `here
27
+ <https://github.com/jcrist/msgspec/blob/main/examples/geojson>`__.
28
+
29
+ Here we use the ``loads`` method defined above to read some `example GeoJSON`_.
30
+
31
+ .. code-block:: ipython3
32
+
33
+ In [1]: import msgspec_geojson
34
+
35
+ In [2]: with open("canada.json", "rb") as f:
36
+ ...: data = f.read()
37
+
38
+ In [3]: canada = msgspec_geojson.loads(data)
39
+
40
+ In [4]: type(canada) # loaded as high-level, validated object
41
+ Out[4]: msgspec_geojson.FeatureCollection
42
+
43
+ In [5]: canada.features[0].properties
44
+ Out[5]: {'name': 'Canada'}
45
+
46
+ Comparing performance to:
47
+
48
+ - orjson_
49
+ - `json`
50
+ - geojson_ (another validating Python implementation)
51
+
52
+ .. code-block:: ipython3
53
+
54
+ In [6]: %timeit msgspec_geojson.loads(data) # benchmark msgspec
55
+ 6.15 ms ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
56
+
57
+ In [7]: %timeit orjson.loads(data) # benchmark orjson
58
+ 8.67 ms ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
59
+
60
+ In [8]: %timeit json.loads(data) # benchmark json
61
+ 27.6 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
62
+
63
+ In [9]: %timeit geojson.loads(data) # benchmark geojson
64
+ 93.9 ms ± 88.1 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
65
+
66
+
67
+ This shows that the readable ``msgspec`` implementation above is 1.4x faster
68
+ than `orjson` (on this data), while also ensuring the loaded data is valid
69
+ GeoJSON. Compared to geojson_ (another validating geojson library for python),
70
+ loading the data using ``msgspec`` was **15.3x faster**.
71
+
72
+ .. _specification: https://datatracker.ietf.org/doc/html/rfc7946
73
+ .. _example GeoJSON: https://github.com/jcrist/msgspec/blob/main/examples/geojson/canada.json
74
+ .. _orjson: https://github.com/ijl/orjson
75
+ .. _geojson: https://github.com/jazzband/geojson
76
+ .. _struct-tagged-unions: https://jcristharif.com/msgspec/structs.html#tagged-unions
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional, Union
4
+
5
+ import msgspec
6
+
7
+ Position = tuple[float, float]
8
+
9
+
10
+ # Define the 7 standard Geometry types.
11
+ # All types set `tag=True`, meaning that they'll make use of a `type` field to
12
+ # disambiguate between types when decoding.
13
+ class Point(msgspec.Struct, tag=True):
14
+ coordinates: Position
15
+
16
+
17
+ class MultiPoint(msgspec.Struct, tag=True):
18
+ coordinates: list[Position]
19
+
20
+
21
+ class LineString(msgspec.Struct, tag=True):
22
+ coordinates: list[Position]
23
+
24
+
25
+ class MultiLineString(msgspec.Struct, tag=True):
26
+ coordinates: list[list[Position]]
27
+
28
+
29
+ class Polygon(msgspec.Struct, tag=True):
30
+ coordinates: list[list[Position]]
31
+
32
+
33
+ class MultiPolygon(msgspec.Struct, tag=True):
34
+ coordinates: list[list[list[Position]]]
35
+
36
+
37
+ class GeometryCollection(msgspec.Struct, tag=True):
38
+ geometries: list[Geometry]
39
+
40
+
41
+ Geometry = Union[
42
+ Point,
43
+ MultiPoint,
44
+ LineString,
45
+ MultiLineString,
46
+ Polygon,
47
+ MultiPolygon,
48
+ GeometryCollection,
49
+ ]
50
+
51
+
52
+ # Define the two Feature types
53
+ class Feature(msgspec.Struct, tag=True):
54
+ geometry: Optional[Geometry] = None
55
+ properties: Optional[dict] = None
56
+ id: Union[str, int, None] = None
57
+
58
+
59
+ class FeatureCollection(msgspec.Struct, tag=True):
60
+ features: list[Feature]
61
+
62
+
63
+ # A union of all 9 GeoJSON types
64
+ GeoJSON = Union[Geometry, Feature, FeatureCollection]
65
+
66
+
67
+ # Create a decoder and an encoder to use for decoding & encoding GeoJSON types
68
+ loads = msgspec.json.Decoder(GeoJSON).decode
69
+ dumps = msgspec.json.Encoder().encode
File without changes
@@ -0,0 +1,32 @@
1
+ [project]
2
+ name = "geojson-msgspec"
3
+ version = "1.0.0"
4
+ description = "msgspec GeoJSON model"
5
+ readme = "README.rst"
6
+ requires-python = ">=3.9"
7
+ dependencies = [
8
+ "msgspec>=0.19,<0.20",
9
+ ]
10
+
11
+ [build-system]
12
+ requires = ["hatchling"]
13
+ build-backend = "hatchling.build"
14
+
15
+
16
+ [tool.mypy]
17
+ python_version = "3.9"
18
+ packages=["geojson_msgspec"]
19
+ disable_error_code = ["call-arg"]
20
+
21
+ [tool.ruff]
22
+ target-version = "py39"
23
+
24
+ [tool.ruff.lint]
25
+ select = [
26
+ "E", # PEP8 Errors
27
+ "F", # Pyflakes
28
+ "W", # PEP8 Warnings
29
+ ]
30
+
31
+ [tool.ruff.lint.isort]
32
+ combine-as-imports = true
@@ -0,0 +1,57 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.9"
4
+
5
+ [[package]]
6
+ name = "geojson-msgspec"
7
+ version = "1.0.0"
8
+ source = { editable = "." }
9
+ dependencies = [
10
+ { name = "msgspec" },
11
+ ]
12
+
13
+ [package.metadata]
14
+ requires-dist = [{ name = "msgspec", specifier = ">=0.19,<0.20" }]
15
+
16
+ [[package]]
17
+ name = "msgspec"
18
+ version = "0.19.0"
19
+ source = { registry = "https://pypi.org/simple" }
20
+ sdist = { url = "https://files.pythonhosted.org/packages/cf/9b/95d8ce458462b8b71b8a70fa94563b2498b89933689f3a7b8911edfae3d7/msgspec-0.19.0.tar.gz", hash = "sha256:604037e7cd475345848116e89c553aa9a233259733ab51986ac924ab1b976f8e", size = 216934, upload-time = "2024-12-27T17:40:28.597Z" }
21
+ wheels = [
22
+ { url = "https://files.pythonhosted.org/packages/13/40/817282b42f58399762267b30deb8ac011d8db373f8da0c212c85fbe62b8f/msgspec-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8dd848ee7ca7c8153462557655570156c2be94e79acec3561cf379581343259", size = 190019, upload-time = "2024-12-27T17:39:13.803Z" },
23
+ { url = "https://files.pythonhosted.org/packages/92/99/bd7ed738c00f223a8119928661167a89124140792af18af513e6519b0d54/msgspec-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0553bbc77662e5708fe66aa75e7bd3e4b0f209709c48b299afd791d711a93c36", size = 183680, upload-time = "2024-12-27T17:39:17.847Z" },
24
+ { url = "https://files.pythonhosted.org/packages/e5/27/322badde18eb234e36d4a14122b89edd4e2973cdbc3da61ca7edf40a1ccd/msgspec-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2c4bf29bf4e89790b3117470dea2c20b59932772483082c468b990d45fb947", size = 209334, upload-time = "2024-12-27T17:39:19.065Z" },
25
+ { url = "https://files.pythonhosted.org/packages/c6/65/080509c5774a1592b2779d902a70b5fe008532759927e011f068145a16cb/msgspec-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e87ecfa9795ee5214861eab8326b0e75475c2e68a384002aa135ea2a27d909", size = 211551, upload-time = "2024-12-27T17:39:21.767Z" },
26
+ { url = "https://files.pythonhosted.org/packages/6f/2e/1c23c6b4ca6f4285c30a39def1054e2bee281389e4b681b5e3711bd5a8c9/msgspec-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3c4ec642689da44618f68c90855a10edbc6ac3ff7c1d94395446c65a776e712a", size = 215099, upload-time = "2024-12-27T17:39:24.71Z" },
27
+ { url = "https://files.pythonhosted.org/packages/83/fe/95f9654518879f3359d1e76bc41189113aa9102452170ab7c9a9a4ee52f6/msgspec-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2719647625320b60e2d8af06b35f5b12d4f4d281db30a15a1df22adb2295f633", size = 218211, upload-time = "2024-12-27T17:39:27.396Z" },
28
+ { url = "https://files.pythonhosted.org/packages/79/f6/71ca7e87a1fb34dfe5efea8156c9ef59dd55613aeda2ca562f122cd22012/msgspec-0.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:695b832d0091edd86eeb535cd39e45f3919f48d997685f7ac31acb15e0a2ed90", size = 186174, upload-time = "2024-12-27T17:39:29.647Z" },
29
+ { url = "https://files.pythonhosted.org/packages/24/d4/2ec2567ac30dab072cce3e91fb17803c52f0a37aab6b0c24375d2b20a581/msgspec-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa77046904db764b0462036bc63ef71f02b75b8f72e9c9dd4c447d6da1ed8f8e", size = 187939, upload-time = "2024-12-27T17:39:32.347Z" },
30
+ { url = "https://files.pythonhosted.org/packages/2b/c0/18226e4328897f4f19875cb62bb9259fe47e901eade9d9376ab5f251a929/msgspec-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:047cfa8675eb3bad68722cfe95c60e7afabf84d1bd8938979dd2b92e9e4a9551", size = 182202, upload-time = "2024-12-27T17:39:33.633Z" },
31
+ { url = "https://files.pythonhosted.org/packages/81/25/3a4b24d468203d8af90d1d351b77ea3cffb96b29492855cf83078f16bfe4/msgspec-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e78f46ff39a427e10b4a61614a2777ad69559cc8d603a7c05681f5a595ea98f7", size = 209029, upload-time = "2024-12-27T17:39:35.023Z" },
32
+ { url = "https://files.pythonhosted.org/packages/85/2e/db7e189b57901955239f7689b5dcd6ae9458637a9c66747326726c650523/msgspec-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c7adf191e4bd3be0e9231c3b6dc20cf1199ada2af523885efc2ed218eafd011", size = 210682, upload-time = "2024-12-27T17:39:36.384Z" },
33
+ { url = "https://files.pythonhosted.org/packages/03/97/7c8895c9074a97052d7e4a1cc1230b7b6e2ca2486714eb12c3f08bb9d284/msgspec-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f04cad4385e20be7c7176bb8ae3dca54a08e9756cfc97bcdb4f18560c3042063", size = 214003, upload-time = "2024-12-27T17:39:39.097Z" },
34
+ { url = "https://files.pythonhosted.org/packages/61/61/e892997bcaa289559b4d5869f066a8021b79f4bf8e955f831b095f47a4cd/msgspec-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45c8fb410670b3b7eb884d44a75589377c341ec1392b778311acdbfa55187716", size = 216833, upload-time = "2024-12-27T17:39:41.203Z" },
35
+ { url = "https://files.pythonhosted.org/packages/ce/3d/71b2dffd3a1c743ffe13296ff701ee503feaebc3f04d0e75613b6563c374/msgspec-0.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:70eaef4934b87193a27d802534dc466778ad8d536e296ae2f9334e182ac27b6c", size = 186184, upload-time = "2024-12-27T17:39:43.702Z" },
36
+ { url = "https://files.pythonhosted.org/packages/b2/5f/a70c24f075e3e7af2fae5414c7048b0e11389685b7f717bb55ba282a34a7/msgspec-0.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f98bd8962ad549c27d63845b50af3f53ec468b6318400c9f1adfe8b092d7b62f", size = 190485, upload-time = "2024-12-27T17:39:44.974Z" },
37
+ { url = "https://files.pythonhosted.org/packages/89/b0/1b9763938cfae12acf14b682fcf05c92855974d921a5a985ecc197d1c672/msgspec-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:43bbb237feab761b815ed9df43b266114203f53596f9b6e6f00ebd79d178cdf2", size = 183910, upload-time = "2024-12-27T17:39:46.401Z" },
38
+ { url = "https://files.pythonhosted.org/packages/87/81/0c8c93f0b92c97e326b279795f9c5b956c5a97af28ca0fbb9fd86c83737a/msgspec-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cfc033c02c3e0aec52b71710d7f84cb3ca5eb407ab2ad23d75631153fdb1f12", size = 210633, upload-time = "2024-12-27T17:39:49.099Z" },
39
+ { url = "https://files.pythonhosted.org/packages/d0/ef/c5422ce8af73928d194a6606f8ae36e93a52fd5e8df5abd366903a5ca8da/msgspec-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d911c442571605e17658ca2b416fd8579c5050ac9adc5e00c2cb3126c97f73bc", size = 213594, upload-time = "2024-12-27T17:39:51.204Z" },
40
+ { url = "https://files.pythonhosted.org/packages/19/2b/4137bc2ed45660444842d042be2cf5b18aa06efd2cda107cff18253b9653/msgspec-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:757b501fa57e24896cf40a831442b19a864f56d253679f34f260dcb002524a6c", size = 214053, upload-time = "2024-12-27T17:39:52.866Z" },
41
+ { url = "https://files.pythonhosted.org/packages/9d/e6/8ad51bdc806aac1dc501e8fe43f759f9ed7284043d722b53323ea421c360/msgspec-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f0f65f29b45e2816d8bded36e6b837a4bf5fb60ec4bc3c625fa2c6da4124537", size = 219081, upload-time = "2024-12-27T17:39:55.142Z" },
42
+ { url = "https://files.pythonhosted.org/packages/b1/ef/27dd35a7049c9a4f4211c6cd6a8c9db0a50647546f003a5867827ec45391/msgspec-0.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:067f0de1c33cfa0b6a8206562efdf6be5985b988b53dd244a8e06f993f27c8c0", size = 187467, upload-time = "2024-12-27T17:39:56.531Z" },
43
+ { url = "https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f12d30dd6266557aaaf0aa0f9580a9a8fbeadfa83699c487713e355ec5f0bd86", size = 190498, upload-time = "2024-12-27T17:40:00.427Z" },
44
+ { url = "https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82b2c42c1b9ebc89e822e7e13bbe9d17ede0c23c187469fdd9505afd5a481314", size = 183950, upload-time = "2024-12-27T17:40:04.219Z" },
45
+ { url = "https://files.pythonhosted.org/packages/e8/f0/5b764e066ce9aba4b70d1db8b087ea66098c7c27d59b9dd8a3532774d48f/msgspec-0.19.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19746b50be214a54239aab822964f2ac81e38b0055cca94808359d779338c10e", size = 210647, upload-time = "2024-12-27T17:40:05.606Z" },
46
+ { url = "https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ef4bdb0ec8e4ad62e5a1f95230c08efb1f64f32e6e8dd2ced685bcc73858b5", size = 213563, upload-time = "2024-12-27T17:40:10.516Z" },
47
+ { url = "https://files.pythonhosted.org/packages/53/2f/2b1c2b056894fbaa975f68f81e3014bb447516a8b010f1bed3fb0e016ed7/msgspec-0.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac7f7c377c122b649f7545810c6cd1b47586e3aa3059126ce3516ac7ccc6a6a9", size = 213996, upload-time = "2024-12-27T17:40:12.244Z" },
48
+ { url = "https://files.pythonhosted.org/packages/aa/5a/4cd408d90d1417e8d2ce6a22b98a6853c1b4d7cb7669153e4424d60087f6/msgspec-0.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5bc1472223a643f5ffb5bf46ccdede7f9795078194f14edd69e3aab7020d327", size = 219087, upload-time = "2024-12-27T17:40:14.881Z" },
49
+ { url = "https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:317050bc0f7739cb30d257ff09152ca309bf5a369854bbf1e57dffc310c1f20f", size = 187432, upload-time = "2024-12-27T17:40:16.256Z" },
50
+ { url = "https://files.pythonhosted.org/packages/ea/d0/323f867eaec1f2236ba30adf613777b1c97a7e8698e2e881656b21871fa4/msgspec-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15c1e86fff77184c20a2932cd9742bf33fe23125fa3fcf332df9ad2f7d483044", size = 189926, upload-time = "2024-12-27T17:40:18.939Z" },
51
+ { url = "https://files.pythonhosted.org/packages/a8/37/c3e1b39bdae90a7258d77959f5f5e36ad44b40e2be91cff83eea33c54d43/msgspec-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b5541b2b3294e5ffabe31a09d604e23a88533ace36ac288fa32a420aa38d229", size = 183873, upload-time = "2024-12-27T17:40:20.214Z" },
52
+ { url = "https://files.pythonhosted.org/packages/cb/a2/48f2c15c7644668e51f4dce99d5f709bd55314e47acb02e90682f5880f35/msgspec-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f5c043ace7962ef188746e83b99faaa9e3e699ab857ca3f367b309c8e2c6b12", size = 209272, upload-time = "2024-12-27T17:40:21.534Z" },
53
+ { url = "https://files.pythonhosted.org/packages/25/3c/aa339cf08b990c3f07e67b229a3a8aa31bf129ed974b35e5daa0df7d9d56/msgspec-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca06aa08e39bf57e39a258e1996474f84d0dd8130d486c00bec26d797b8c5446", size = 211396, upload-time = "2024-12-27T17:40:22.897Z" },
54
+ { url = "https://files.pythonhosted.org/packages/c7/00/c7fb9d524327c558b2803973cc3f988c5100a1708879970a9e377bdf6f4f/msgspec-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e695dad6897896e9384cf5e2687d9ae9feaef50e802f93602d35458e20d1fb19", size = 215002, upload-time = "2024-12-27T17:40:24.341Z" },
55
+ { url = "https://files.pythonhosted.org/packages/3f/bf/d9f9fff026c1248cde84a5ce62b3742e8a63a3c4e811f99f00c8babf7615/msgspec-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3be5c02e1fee57b54130316a08fe40cca53af92999a302a6054cd451700ea7db", size = 218132, upload-time = "2024-12-27T17:40:25.744Z" },
56
+ { url = "https://files.pythonhosted.org/packages/00/03/b92011210f79794958167a3a3ea64a71135d9a2034cfb7597b545a42606d/msgspec-0.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:0684573a821be3c749912acf5848cce78af4298345cb2d7a8b8948a0a5a27cfe", size = 186301, upload-time = "2024-12-27T17:40:27.076Z" },
57
+ ]