diff --git a/HISTORY.rst b/HISTORY.rst index 4f61b632..750a1a36 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,4 +1,15 @@ +6.5.1 / 2026-08-05 +================== + + * security: pin URL connections to validated DNS addresses to prevent DNS-rebinding bypasses of private-network blocking + * security: bound encoded and decoded compressed responses to prevent gzip and deflate resource-exhaustion attacks + * fix: reject XML 1.0-forbidden characters consistently across Python and Rust serializers instead of emitting invalid XML + * fix: require an actual boolean for ``allow_private_networks`` and normalize malformed-hostname failures as ``URLReadError`` + * chore: release ``json2xml-rs`` 0.4.3 first and require it from ``json2xml[fast]`` for XML-safe accelerated installs + * docs: document URL safety controls, XML validation behavior, migration guidance, and the Rust-first release sequence + + 6.5.0 / 2026-07-15 ================== diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 4b55256f..d1aff258 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,45 +1,61 @@ -# json2xml_rs 0.4.3 +# json2xml 6.5.1 Released 2026-08-05. ## Highlights -- Rejects XML 1.0-forbidden characters in serialized text, attributes, CDATA, and the exported `escape_xml_py()` and `wrap_cdata_py()` helpers instead of emitting invalid XML. -- Gives the Python package a compatible accelerator that passes its XML-safety probe, restoring automatic Rust dispatch for supported payloads. -- Updates PyO3 from 0.28.2 to 0.29.1 while preserving the existing Python 3.9+ package contract and wheel matrix. +- Pins public URL connections to the validated DNS address while preserving the requested Host header and TLS certificate hostname, preventing DNS-rebinding bypasses of private-network blocking. +- Bounds encoded input and incremental gzip or deflate output so compressed responses cannot consume unbounded network I/O or memory before rejection. +- Rejects XML 1.0-forbidden characters consistently across the Python serializer and the newly published Rust accelerator instead of emitting invalid XML. +- Updates `json2xml[fast]` to require the compatible `json2xml-rs>=0.4.3` release. + +## Security + +- URL reads reject redirects and private, loopback, link-local, and other non-global destinations by default, including destinations reached through DNS rebinding. +- Encoded and decoded response bodies are independently limited to 10 MiB by default. +- Only `gzip`, `x-gzip`, `deflate`, and `identity` content encodings are accepted; malformed or stacked encodings are rejected. +- `allow_private_networks` accepts only `True` or `False`, avoiding truthiness-based policy bypasses. +- Malformed Unicode hostnames consistently raise `URLReadError` when IDNA encoding or DNS resolution fails. ## Migration guidance -Inputs containing forbidden XML 1.0 characters now raise `ValueError`. Remove or replace those characters before conversion; callers must not depend on invalid XML being emitted. +- Trusted callers that intentionally read private endpoints must pass `allow_private_networks=True` as an actual boolean. +- Set `max_response_bytes` explicitly when a trusted endpoint needs a positive response limit other than the 10 MiB default. +- Servers returning Brotli, Zstandard, stacked encodings, or malformed compressed streams must be reconfigured or read outside `readfromurl()`. +- Inputs containing forbidden XML 1.0 characters now fail validation. Low-level serializer functions raise `ValueError`; `Json2xml.to_xml()` raises `InvalidDataError`. -## Package Version +## Package Versions +- Python package: `json2xml==6.5.1` - Rust accelerator: `json2xml-rs==0.4.3` +- Fast install: `pip install "json2xml[fast]==6.5.1"` ## Verification -The release is gated on Rust formatting, Clippy with warnings denied, Rust unit tests, the full Python suite, and built-wheel tests for Linux, macOS, and Windows before PyPI publication. +The release passed 496 tests with 100% statement coverage, Ruff, ty, sdist and wheel builds, Twine metadata checks, and an isolated install against the published `json2xml-rs==0.4.3` wheel. The pull request also runs the complete cross-platform Python matrix before merge. -# Unreleased +# json2xml_rs 0.4.3 -## Security +Released 2026-08-05. + +## Highlights -- Public URL reads now pin connections to a validated DNS address while preserving the requested Host header and HTTPS certificate hostname, preventing DNS-rebinding bypasses of private-network blocking. -- Gzip and deflate responses honor valid `Content-Length` values and are decoded incrementally with bounded encoded input and zlib output, so compressed bodies cannot consume unbounded network I/O or memory before rejection. -- `allow_private_networks` accepts only `True` or `False`; strings, numbers, and other values now raise `URLReadError` instead of relying on truthiness. -- Malformed Unicode hostnames now consistently raise `URLReadError` when IDNA encoding or DNS resolution fails. +- Rejects XML 1.0-forbidden characters in serialized text, attributes, CDATA, and the exported `escape_xml_py()` and `wrap_cdata_py()` helpers instead of emitting invalid XML. +- Gives the Python package a compatible accelerator that passes its XML-safety probe, restoring automatic Rust dispatch for supported payloads. +- Updates PyO3 from 0.28.2 to 0.29.1 while preserving the existing Python 3.9+ package contract and wheel matrix. ## Migration guidance -- URL reads continue to reject redirects and private, loopback, link-local, and other non-global destinations by default. Trusted callers that intentionally read a private endpoint must pass `allow_private_networks=True` as an actual boolean. -- Encoded and decoded URL responses are limited to 10 MiB by default. Set `max_response_bytes` explicitly when a trusted endpoint needs a different positive limit. -- URL response compression is limited to `gzip`, `x-gzip`, `deflate`, and `identity`. Servers returning Brotli, Zstandard, stacked encodings, or malformed compressed streams must be reconfigured or read outside `readfromurl()`. -- XML 1.0-forbidden characters are now rejected instead of being serialized. Low-level serializer functions raise `ValueError`; `Json2xml.to_xml()` raises `InvalidDataError`. +Inputs containing forbidden XML 1.0 characters now raise `ValueError`. Remove or replace those characters before conversion; callers must not depend on invalid XML being emitted. + +## Package Version -## Release prerequisite +- Rust accelerator: `json2xml-rs==0.4.3` + +## Verification -Publish `json2xml-rs==0.4.3`, then raise the `json2xml[fast]` and `uv.lock` minimum to that published version. Until then, the compatibility probe safely disables 0.4.2 and uses the Python backend. +The release passed Rust formatting, Clippy with warnings denied, 48 Rust unit tests, and built-wheel tests across Linux, macOS, Windows, CPython 3.9-3.15, free-threaded builds, and PyPy before PyPI publication. # json2xml 6.5.0 diff --git a/json2xml/__init__.py b/json2xml/__init__.py index e2726ba4..f83b33e1 100644 --- a/json2xml/__init__.py +++ b/json2xml/__init__.py @@ -2,4 +2,4 @@ __author__ = """Vinit Kumar""" __email__ = "mail@vinitkumar.me" -__version__ = "6.5.0" +__version__ = "6.5.1" diff --git a/pyproject.toml b/pyproject.toml index 9ed17e81..8b03d546 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "json2xml" -version = "6.5.0" +version = "6.5.1" description = "Simple Python Library to convert JSON to XML" readme = "README.rst" requires-python = ">=3.10" @@ -50,7 +50,7 @@ dev = [ "pygments>=2.20.0", "xmltodict>=0.12.0", ] -fast = ["json2xml-rs>=0.4.2"] +fast = ["json2xml-rs>=0.4.3"] [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/uv.lock b/uv.lock index 428eddee..b52c38fb 100644 --- a/uv.lock +++ b/uv.lock @@ -147,7 +147,7 @@ wheels = [ [[package]] name = "json2xml" -version = "6.5.0" +version = "6.5.1" source = { editable = "." } dependencies = [ { name = "defusedxml" }, @@ -171,7 +171,7 @@ fast = [ requires-dist = [ { name = "coverage", marker = "extra == 'dev'" }, { name = "defusedxml" }, - { name = "json2xml-rs", marker = "extra == 'fast'", specifier = ">=0.4.2" }, + { name = "json2xml-rs", marker = "extra == 'fast'", specifier = ">=0.4.3" }, { name = "pygments", marker = "extra == 'dev'", specifier = ">=2.20.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.4.1" }, { name = "pytest-cov", marker = "extra == 'dev'" }, @@ -183,41 +183,41 @@ provides-extras = ["dev", "fast"] [[package]] name = "json2xml-rs" -version = "0.4.2" +version = "0.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4b/df/24550bb7664ef8aba5e6ea8aa6f6f29dffa4bcab8a4415d492cf9130c499/json2xml_rs-0.4.2.tar.gz", hash = "sha256:be63b26a8885002dcdd2d11d8685251224370cc1a45073ff226a5a6ecf15d508", size = 9860, upload-time = "2026-07-15T19:29:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/85/7e8155f2a71595c8190ef0a63ed5176f7fc9bc50e893f7d6dbaf6f30e3d7/json2xml_rs-0.4.3.tar.gz", hash = "sha256:21d1eb7d3c55d63335ccb167b8c854b402466a279d759ad458935f8d0fef784e", size = 10793, upload-time = "2026-08-04T19:48:56.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/71/5d1bbf681d61a86232396568e9b117d4b399b6fd85f4242022e01953640e/json2xml_rs-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ad92712ed0c61da1287d8af1ed0ea7d29b1db5677cfee962b81b89161a7d3d5", size = 228754, upload-time = "2026-07-15T19:28:30.647Z" }, - { url = "https://files.pythonhosted.org/packages/8d/22/f5c4809a28861783162ab2379237330dc7238c6aefb58126fe7da9a7f520/json2xml_rs-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff28b3c5ae09e0d716604b5fad0cd202b907f06cd801d1ae5fff505b5d898c64", size = 216101, upload-time = "2026-07-15T19:28:32.063Z" }, - { url = "https://files.pythonhosted.org/packages/02/6b/180d0fe7e544ad8e80730bc8f9e2b0036be5d7c494ad6cf3b4592bdaa685/json2xml_rs-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f88fac51361577cdbaedc00869524a2d52cf31d8ca3a725ffa9cd5e03503b8", size = 232071, upload-time = "2026-07-15T19:28:33.324Z" }, - { url = "https://files.pythonhosted.org/packages/81/19/f76b390ea40d5ca49e3bae3a1ba237e644bf675c0970ccf45385f7d28b4e/json2xml_rs-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7335ca3eda98f64f55afc5341105aecb5280f76ade5801f46c587b2ec5a18e26", size = 236773, upload-time = "2026-07-15T19:28:34.596Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0b/44c03dc291ad98340c506ea818be397cf1737b6f00453da7c3805cc88aa9/json2xml_rs-0.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:8d9aa18496e198a3dd4040d038b1fd5141419a474ccdd58ab6480980b70447cd", size = 122693, upload-time = "2026-07-15T19:28:36.051Z" }, - { url = "https://files.pythonhosted.org/packages/1d/a8/fea4fcd7c24679f76cbebbbddef33d48e96b069bb4864ed9bb08be9d922c/json2xml_rs-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cf0e15a6125bd5898a5df4e58b3931bbdf30f6e2c1bd3a7c068372bed50a4734", size = 228456, upload-time = "2026-07-15T19:28:37.474Z" }, - { url = "https://files.pythonhosted.org/packages/eb/53/963029983dadaa9ddffd623abe667f79c0f547b7fb62127df9208bbeb3a1/json2xml_rs-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bff5ad506356af0ff3d8bf2677918c00d9c94f06891c871f16f71f0fc257025e", size = 215993, upload-time = "2026-07-15T19:28:38.994Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4e/039c16db1400e5196accb8be1bf55e5f0c36ff8b0d056d0ce235a2972179/json2xml_rs-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570bcd5708adda2bc49731776ee6a638a7aab39b53937afcc15a53ef3a795edd", size = 231705, upload-time = "2026-07-15T19:28:40.424Z" }, - { url = "https://files.pythonhosted.org/packages/da/1c/33e64336547a93998f6dac21795495a1c3571de4dadcbcaaf37b103c691a/json2xml_rs-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dee86ddf29793b8abd409244d04f99f46686f4e74214869e90322f826b5d3d", size = 236573, upload-time = "2026-07-15T19:28:41.908Z" }, - { url = "https://files.pythonhosted.org/packages/46/7e/4d8eb642839f5f930ea0dfa1dffbbcc8da1161e66da41c054bd217e5b252/json2xml_rs-0.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:a56cce17b6d7844aa34cab93ecab5e8eeb38d07d31c55b530a5825a2c89e4f04", size = 122676, upload-time = "2026-07-15T19:28:43.313Z" }, - { url = "https://files.pythonhosted.org/packages/9f/03/4e4150adf7ba5cf2ea87bc9767113840407041b158283bbdacf5c7983d56/json2xml_rs-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b8ae72d10ef65d938d04f7e86ef3c09ffb033c0646a9dbba298db8908147ccfd", size = 227337, upload-time = "2026-07-15T19:28:44.471Z" }, - { url = "https://files.pythonhosted.org/packages/08/2b/7b0489f5a0a656ad53c3ef2771a9ccca13d26e18b70d1fa93a7ab98b5a4c/json2xml_rs-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8da6b104093281da9a83ed3de14738c4a4b344a9fc929b04d227a109de119cae", size = 215399, upload-time = "2026-07-15T19:28:45.731Z" }, - { url = "https://files.pythonhosted.org/packages/ab/13/8f21655528e7e53c2bcad443520a9b205877871d43681a33953ed3d2e750/json2xml_rs-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d6d250c7934a98cdddf50470a96409929567bfa58cd77b3f141bce887a85d8", size = 231336, upload-time = "2026-07-15T19:28:47.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fb/f7966a2d48b1c5d5a25b036ba8e7ed3ccc410630ec12e40d9ca0b5f0fb65/json2xml_rs-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d7b8a46e0011621d380079d32f63c5cc37fa87832587752c2ba0f2b36524242", size = 236633, upload-time = "2026-07-15T19:28:48.557Z" }, - { url = "https://files.pythonhosted.org/packages/74/59/6e52737b557fb81974fcf1b5454d9344c56db5d25948e0aac8efe2e1c502/json2xml_rs-0.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:168b875b2bd8b57952907b042e68802b82fca67124abe9447133fc55c95cc2dd", size = 121111, upload-time = "2026-07-15T19:28:49.915Z" }, - { url = "https://files.pythonhosted.org/packages/04/28/f5f108b1e54a086463d3ea512b748d86f116a3d098b51772c2e278e452c1/json2xml_rs-0.4.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:953620b10c9f5a1e8e72c51c3083d8afacb4be1d31450329ba225068f8276edc", size = 227522, upload-time = "2026-07-15T19:28:51.197Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/d22d3c95ccfa59b7836b676fbc43a82ef7457cefa32673a2052048368c0f/json2xml_rs-0.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf71582f53627e815f796bdac6ec571089508ec2b0fb1945fff88ca30eb3c8ea", size = 215557, upload-time = "2026-07-15T19:28:52.518Z" }, - { url = "https://files.pythonhosted.org/packages/56/14/cbbd821e1abaa682255540563f589a723eb4a6701a5eb2b7ee889a9a64f1/json2xml_rs-0.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b049f77c4299ee911f467d9e3b3a557500373a614e8d3d882ec825d9b2ae058e", size = 231366, upload-time = "2026-07-15T19:28:53.816Z" }, - { url = "https://files.pythonhosted.org/packages/75/fa/0b8d7e4e929550294af87f074eec265102c5095106bec924a698437deb79/json2xml_rs-0.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c191f9f3480aa83ef265034f51802def53ab59dc9fd17b071c0bb67d4493a8e", size = 236723, upload-time = "2026-07-15T19:28:55.302Z" }, - { url = "https://files.pythonhosted.org/packages/92/85/13a730c16684e43abad6613573e560fbc26eb84009f9f67f9fe7d1227f71/json2xml_rs-0.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:72ab02d5cc23ad2539d8d3ab14af8d58c3179bb2e6f7843a82206e615664f031", size = 121314, upload-time = "2026-07-15T19:28:56.595Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/01af728bb5003b7960a4f9e427fc893ef976e189e674fb55bda25c9f71e8/json2xml_rs-0.4.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:fe2ee5d59fb7c5d805692dce80cde4aa21a535e64eb71979806b5d981af3e417", size = 227266, upload-time = "2026-07-15T19:28:57.776Z" }, - { url = "https://files.pythonhosted.org/packages/90/32/e339f6dc9a727e6f50208e0f5e083677f9fab96b3e5ba8cb8a9a48b460eb/json2xml_rs-0.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8f9a99f05fda5844ae3e5858d412e947c714b10881431e777ed826a7ca503c46", size = 215275, upload-time = "2026-07-15T19:28:59.389Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e1/145fe6dbb4312bfb867d28db44d61afe5f785ca8fbb5ee586c91eab3069d/json2xml_rs-0.4.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0eb17ed09d57c47e725321321fd93e91b9a29b3e84ee5b32d9e8ca67ce154d4", size = 231013, upload-time = "2026-07-15T19:29:00.744Z" }, - { url = "https://files.pythonhosted.org/packages/41/b2/2e5b6714e6de31e9eba0df50a5fee154ccf5359fd7022b2cf55b7c824a89/json2xml_rs-0.4.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e50cbe379830783504fe862ebc9ee44f5ca9eb41fd0d611f6b99dc166bff8560", size = 236491, upload-time = "2026-07-15T19:29:02.143Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b4/77cc6deb8a26f9b837bc1b4d358ff03317e2e98796ba0b742d6de7fd8063/json2xml_rs-0.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:c8472e19f6506fe8e98872136fc6aca062853d03ada8e601343b5c7afbd2ec04", size = 121118, upload-time = "2026-07-15T19:29:03.657Z" }, - { url = "https://files.pythonhosted.org/packages/9b/a3/184a57d724c31db0fa6beffe2fb1eb64d37814e595ea3a1eed4f21cb6cd7/json2xml_rs-0.4.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4d86932ede1ce290724f48f9ac1bbb2413d766b70d0c824257be094c582734", size = 230020, upload-time = "2026-07-15T19:29:05.087Z" }, - { url = "https://files.pythonhosted.org/packages/1b/93/0f162a8b214c9818fa207bb7f5b92677a33f7f5eb445b0195bd17f2bd855/json2xml_rs-0.4.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329447da89fd6af6047604a5f121f243ac8a88ea8f094472732c317f552d9d20", size = 235688, upload-time = "2026-07-15T19:29:06.456Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2f/3014c23537830778357dde18adcc0fa28dfee1fe3a54b82833cbdaf5e05b/json2xml_rs-0.4.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30275441b6be1a591948195e5e3fc1130bf9b0a7cf49d8d9fb44290706eff8be", size = 235884, upload-time = "2026-07-15T19:29:07.916Z" }, - { url = "https://files.pythonhosted.org/packages/9c/85/bf705b01d3d1b1fbaeafb9e7b93fe6394d8114ded6a73bf3d36f1355e64d/json2xml_rs-0.4.2-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b67c1199080bdba5d7c7a2bbd13e26a1aa990d3af19bcd1ea3d891e5ebf327f", size = 235147, upload-time = "2026-07-15T19:29:09.328Z" }, - { url = "https://files.pythonhosted.org/packages/11/b8/2b6539769b8253c103de8e643dcf351f90faa473be1a3026aa868f2122b0/json2xml_rs-0.4.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78c08daa09f46556282603d8ee480062a6d1111d52f3baedd5e7262195de217e", size = 233522, upload-time = "2026-07-15T19:29:13.55Z" }, - { url = "https://files.pythonhosted.org/packages/65/18/cb9b4dba617c8b292dd34674bb8a9a2968e5168e533d64e45d491676f50c/json2xml_rs-0.4.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:826bd78c84b57d0990d1e117b0057b1e47349f4aa25168db7f3c5d6668a33176", size = 238401, upload-time = "2026-07-15T19:29:14.989Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b0/84edf9b615394ec58331b7fca1cab805390ab55fccdc43339e2cb67f25f9/json2xml_rs-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e6b5b81024542b72f6667720f1a1d4ef27a3b7559cee163137877cf732e4ded3", size = 227669, upload-time = "2026-08-04T19:48:09.218Z" }, + { url = "https://files.pythonhosted.org/packages/18/db/dee4651278601612bbab1647f142a088c8e29f34035d1332992be92375ef/json2xml_rs-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25c21e174b045c8f6b8524a7a549d49bd3f1dcd7b7c9aca1688e5263d73dd0a", size = 218489, upload-time = "2026-08-04T19:48:10.695Z" }, + { url = "https://files.pythonhosted.org/packages/83/64/8686c515fbf2e46bb8250d6df414437caa087ceba83cb83811568e7246bb/json2xml_rs-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32af2fcdc344c7187d86602b06f03f4d4d48591cfef7816d15426c23e8a8bffa", size = 232860, upload-time = "2026-08-04T19:48:12.079Z" }, + { url = "https://files.pythonhosted.org/packages/94/3e/a16afffb4e39d74db40835a1db6f6cbb1a4c2b6f4623038ea4bdd7b53aea/json2xml_rs-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124ac203abd4286a8d3eb4f0cca349b5f95aee406a342dd966af5d5bda7addd4", size = 237465, upload-time = "2026-08-04T19:48:13.564Z" }, + { url = "https://files.pythonhosted.org/packages/d6/9b/b9bc1f420c2982fc84cb47254695c044fe446149b03124996e6fd608eba1/json2xml_rs-0.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1f3dd9d541ebbfe8c375fdf2fdf8a1048be11b15620b79826ee68442131bcb8", size = 123934, upload-time = "2026-08-04T19:48:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6a/16c103a3b6df03f306b4459155ed57ee08ee7bd8ee62be676283b2aa4ef2/json2xml_rs-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:58cc73b768ff484d553dbcdf556a9f75d72a15a11be7daa7fae56be27dd81402", size = 227436, upload-time = "2026-08-04T19:48:16.495Z" }, + { url = "https://files.pythonhosted.org/packages/f5/64/85d623c74e55424e58544a820809bd27a2d3fded81e82db22e2ef5cd6037/json2xml_rs-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e011eebad49ee91c47ad3fcaaca95832c580e89f3d506deeddb77704b93eaee9", size = 218317, upload-time = "2026-08-04T19:48:17.954Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/d55c9db5d201e56d25e27da3945d752278cabda50ff3ed705de225266ef5/json2xml_rs-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81b7ef49c388a1eb51ca21adbe5ee594c28fbe1aa75dac083e0f784bb21f780", size = 232617, upload-time = "2026-08-04T19:48:19.481Z" }, + { url = "https://files.pythonhosted.org/packages/74/d0/0e0240cecd3a7db3a0334a11aa064f64e72cfa0ebea440404620ad2030f5/json2xml_rs-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f585eef27b19b28ca543db6782247865f8046f8350cb8e4685ac73bd128806f9", size = 237141, upload-time = "2026-08-04T19:48:21.002Z" }, + { url = "https://files.pythonhosted.org/packages/7d/85/39d23a85beaab8091279435971d91eba6c1627c7c9b5d889ada3eff68cab/json2xml_rs-0.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:44e5858d84956883c8987b3bd38da174ce09168664769950c956853f57edcf0e", size = 123900, upload-time = "2026-08-04T19:48:22.35Z" }, + { url = "https://files.pythonhosted.org/packages/6a/72/f09f07bf38dd49e6fee9c56dd49d4785e3d82b3aeb92923d2129468e3596/json2xml_rs-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c89fc1f697a81020738ec5978144aefe86c7239cccaafe43bad91b9a302a0af0", size = 228295, upload-time = "2026-08-04T19:48:23.681Z" }, + { url = "https://files.pythonhosted.org/packages/f6/bb/33c27a18c4ddbe3108ae6d06a36b7648b4b7da88f8d7f86423b2ae761409/json2xml_rs-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:84ba6e3468d44cf3ae05fc0bf64535ae2408e984fdca58d400a83d1e710d8f29", size = 215964, upload-time = "2026-08-04T19:48:25.267Z" }, + { url = "https://files.pythonhosted.org/packages/c0/4d/b606a8aa7fcae6bb81f69168f1ede565a97f7c9154c199336ab287a2c2ae/json2xml_rs-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59e2e64e65af4e065d8608f1b6b6e51b0495e39d8bc3fa66747d3aad134a40e9", size = 231529, upload-time = "2026-08-04T19:48:28.105Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3b/a87e293a844e5d9f6b81a64c38f1e209f9fbf3ac8e5a1b84495c5afbbf8c/json2xml_rs-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0230f950e72451d8fa2e3a2c3714b66f1be1c84c37025e9324148e8566bbe279", size = 236389, upload-time = "2026-08-04T19:48:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e6/cd42656d27fb38e4ef1d11e1dd9e28e4987f2fcfb4554fda385821df8f32/json2xml_rs-0.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:7c92cb5fed4049d3c009646780a8683e2a8915a84ba9daf0b1e8cf9cf6f2225f", size = 121558, upload-time = "2026-08-04T19:48:30.711Z" }, + { url = "https://files.pythonhosted.org/packages/e5/05/4b4389c0c56b5a2d837573e8bd5da79592ae2f29dc0a4c51cab3599120c7/json2xml_rs-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4a1d1aacd42504628d1f040468ad001f4f12541aa580f524dfb92d828ab15ea7", size = 228437, upload-time = "2026-08-04T19:48:31.932Z" }, + { url = "https://files.pythonhosted.org/packages/44/24/6c251ddf16fac53564ae1e966f7fd5cc8891ad2abad6c8a416a76a331834/json2xml_rs-0.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4aaece7a4937e1bebc569d3d919c394a4a58f713eb485d36bd3acad5a99b13a", size = 215950, upload-time = "2026-08-04T19:48:33.363Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5d/c4ac43c21891d371fb0a277f473ad56ac216f966ea48f0e74f23d01afe18/json2xml_rs-0.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49c6bccd6d67edb9005eab10d105a45d5bbaf1d1c35f295d1cfe224c402016a0", size = 231522, upload-time = "2026-08-04T19:48:34.788Z" }, + { url = "https://files.pythonhosted.org/packages/43/e7/b06f2ee3c4ac610607e1601ef7a4b53977d910b2840f9dd406a53dd0ee6a/json2xml_rs-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d30954bedc80abb65f8a2f20bec8edea61a0a5986b3b90a1a9b0072efddaab", size = 236486, upload-time = "2026-08-04T19:48:36.19Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3f/1eef7759151b106190fc5131cac137fa01a2948660ad7da905ecaca3caca/json2xml_rs-0.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:ac0b2f9769de283e07a33350a3bde0c39e404e743e9cc1ea90a974f671b8e8bb", size = 121759, upload-time = "2026-08-04T19:48:37.606Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/4d041164c9a4dea25b7bcead1075be52552e25c57c82843275064ca618b4/json2xml_rs-0.4.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e8a56148c8e54cd27e879e073dd525b66a145f69ab448252e27c4c7d419a3d53", size = 228688, upload-time = "2026-08-04T19:48:38.806Z" }, + { url = "https://files.pythonhosted.org/packages/ef/68/3f6a8ea273fa7dddb86e5059beb9cb1ae03cf0fd4bc155d5a2dbcdfc9d77/json2xml_rs-0.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d345d7c3ed00a337c03fde40efe2ccb9a5feab2e10eef21aba241f4a0bbd8d45", size = 216319, upload-time = "2026-08-04T19:48:40.214Z" }, + { url = "https://files.pythonhosted.org/packages/0d/43/96f51974301d4a3cbf140b519d929f9ce3a8c497dc2e4f8804d80cb9e1d8/json2xml_rs-0.4.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d911143de90f4735505a07e6485724b376a163c87e90ff71b1c1b8c04fbff73", size = 231993, upload-time = "2026-08-04T19:48:41.653Z" }, + { url = "https://files.pythonhosted.org/packages/45/a0/d583b22fba4371f10a5a4fec053e212e744e6d5e181db4161d71d151c164/json2xml_rs-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd4a30f2cbedcb4a24002b2d75b6751368f791f2f3cecdbdec6713cc49878ffc", size = 236851, upload-time = "2026-08-04T19:48:43.065Z" }, + { url = "https://files.pythonhosted.org/packages/7d/55/15ef643e8f685635739a51dce213813dc79998a8c024eae2c23790ab0375/json2xml_rs-0.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0ecee378e1dff89f8290e0c1543b547419c3d65b3e1bc2706673221093b1612a", size = 121760, upload-time = "2026-08-04T19:48:44.407Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a0/813a6a4b3d3b1b41c33bd6128f475ebe39eae378b85a6a2ba41b175cc343/json2xml_rs-0.4.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e49b492bc2140c6de59dd4d09c1c97d6fcac2b1e65d55c7190e46b5ffb736fae", size = 230870, upload-time = "2026-08-04T19:48:45.741Z" }, + { url = "https://files.pythonhosted.org/packages/29/7a/467cd23ff09f7301d5572000f04364ceeb3738ed4dfe6c652293d566fe65/json2xml_rs-0.4.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:164dd7bc519e2061e9766eb304818fa92c3ca10951017af0965cd61cd8494204", size = 235930, upload-time = "2026-08-04T19:48:47.187Z" }, + { url = "https://files.pythonhosted.org/packages/b4/6a/6b3101bb6b9f68ee6ccf17c94df60215520b4ff28a2c8b56739d419ebaf2/json2xml_rs-0.4.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f7fe6960be3cd6fe0985812f7adffea54d011f6736756e93fca83e74155740c", size = 236452, upload-time = "2026-08-04T19:48:48.666Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/cbf562b4adb62b653b0036a11392240c66749009314235ad0e8d509b61a5/json2xml_rs-0.4.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b5108019451c740b7fc49fd6f80ec377b78684f2a9ca5b894c9c73d358ea91", size = 235711, upload-time = "2026-08-04T19:48:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/44/ab/ff657702a94ce2fe27e62e6799b0158d678ec1e01cf6fafd1661081b30b9/json2xml_rs-0.4.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:644c30aa8b47dd53a4e0015fadfded3bbc4878d28d9d55658b37310bac440236", size = 234191, upload-time = "2026-08-04T19:48:54.195Z" }, + { url = "https://files.pythonhosted.org/packages/e3/b5/4f569b33430a9543d8a3db2297d506986519f4f590d05fa973b20f68dd8f/json2xml_rs-0.4.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:374d73d42b1ffe83b9c559109b827f8c7ce5d6af77fa30775ae4dcd383949574", size = 238881, upload-time = "2026-08-04T19:48:55.61Z" }, ] [[package]]