css-inline 0.20.1__tar.gz → 0.21.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.
Files changed (34) hide show
  1. {css_inline-0.20.1 → css_inline-0.21.0}/PKG-INFO +4 -5
  2. {css_inline-0.20.1/bindings/python → css_inline-0.21.0}/README.md +2 -2
  3. {css_inline-0.20.1 → css_inline-0.21.0}/bindings/python/CHANGELOG.md +25 -1
  4. {css_inline-0.20.1 → css_inline-0.21.0}/bindings/python/Cargo.lock +131 -153
  5. {css_inline-0.20.1 → css_inline-0.21.0}/bindings/python/Cargo.toml +2 -2
  6. {css_inline-0.20.1 → css_inline-0.21.0/bindings/python}/README.md +2 -2
  7. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/Cargo.toml +9 -5
  8. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/README.md +2 -2
  9. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/document.rs +8 -10
  10. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/serializer.rs +44 -9
  11. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/lib.rs +12 -0
  12. {css_inline-0.20.1 → css_inline-0.21.0}/pyproject.toml +2 -3
  13. {css_inline-0.20.1 → css_inline-0.21.0}/LICENSE +0 -0
  14. {css_inline-0.20.1 → css_inline-0.21.0}/bindings/python/build.rs +0 -0
  15. {css_inline-0.20.1 → css_inline-0.21.0}/bindings/python/src/lib.rs +0 -0
  16. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/benches/inliner.rs +0 -0
  17. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/rustfmt.toml +0 -0
  18. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/error.rs +0 -0
  19. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/attributes.rs +0 -0
  20. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/element.rs +0 -0
  21. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/iter.rs +0 -0
  22. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/mod.rs +0 -0
  23. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/node.rs +0 -0
  24. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/parser.rs +0 -0
  25. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/attr_value.rs +0 -0
  26. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/local_name.rs +0 -0
  27. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/mod.rs +0 -0
  28. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/parser.rs +0 -0
  29. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/pseudo_classes.rs +0 -0
  30. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/pseudo_elements.rs +0 -0
  31. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/html/selectors/selector_impl.rs +0 -0
  32. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/main.rs +0 -0
  33. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/parser.rs +0 -0
  34. {css_inline-0.20.1 → css_inline-0.21.0}/css-inline/src/resolver.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: css-inline
3
- Version: 0.20.1
3
+ Version: 0.21.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -8,7 +8,6 @@ Classifier: Operating System :: MacOS :: MacOS X
8
8
  Classifier: Operating System :: Microsoft :: Windows
9
9
  Classifier: Operating System :: POSIX
10
10
  Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.9
12
11
  Classifier: Programming Language :: Python :: 3.10
13
12
  Classifier: Programming Language :: Python :: 3.11
14
13
  Classifier: Programming Language :: Python :: 3.12
@@ -21,7 +20,7 @@ License-File: LICENSE
21
20
  Summary: High-performance library for inlining CSS into HTML 'style' attributes
22
21
  Keywords: css,html,email,stylesheet,inlining
23
22
  Author-email: Dmitry Dygalo <dmitry@dygalo.dev>
24
- Requires-Python: >=3.9
23
+ Requires-Python: >=3.10
25
24
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
26
25
  Project-URL: homepage, https://github.com/Stranger6667/css-inline/tree/master/bindings/python
27
26
  Project-URL: repository, https://github.com/Stranger6667/css-inline
@@ -72,7 +71,7 @@ into:
72
71
  - Can process multiple documents in parallel
73
72
  - Works on Linux, Windows, macOS and in the browser via PyOdide
74
73
  - Supports HTML5 & CSS3
75
- - Tested on CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
74
+ - Tested on CPython 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
76
75
 
77
76
  ## Playground
78
77
 
@@ -118,7 +117,7 @@ inlined = css_inline.inline(HTML)
118
117
 
119
118
  Note that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.
120
119
 
121
- Alternatively, you can inline CSS into an HTML fragment, preserving the original structure:
120
+ Alternatively, you can inline CSS into an HTML fragment. Structural tags (`<html>`, `<head>`, `<body>`) are stripped from the output; only their contents are preserved. Use `inline` if you need to keep the full document structure:
122
121
 
123
122
  ```python
124
123
  FRAGMENT = """<main>
@@ -44,7 +44,7 @@ into:
44
44
  - Can process multiple documents in parallel
45
45
  - Works on Linux, Windows, macOS and in the browser via PyOdide
46
46
  - Supports HTML5 & CSS3
47
- - Tested on CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
47
+ - Tested on CPython 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
48
48
 
49
49
  ## Playground
50
50
 
@@ -90,7 +90,7 @@ inlined = css_inline.inline(HTML)
90
90
 
91
91
  Note that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.
92
92
 
93
- Alternatively, you can inline CSS into an HTML fragment, preserving the original structure:
93
+ Alternatively, you can inline CSS into an HTML fragment. Structural tags (`<html>`, `<head>`, `<body>`) are stripped from the output; only their contents are preserved. Use `inline` if you need to keep the full document structure:
94
94
 
95
95
  ```python
96
96
  FRAGMENT = """<main>
@@ -2,6 +2,28 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.21.0] - 2026-06-16
6
+
7
+ ### Removed
8
+
9
+ - Support for Python 3.9.
10
+
11
+ ### Changed
12
+
13
+ - Update `selectors` to `0.38`.
14
+ - Update `cssparser` to `0.37`.
15
+ - Update `PyO3` to `0.29.0`.
16
+
17
+ ### Fixed
18
+
19
+ - `width`/`height` HTML attributes not derived from an element's own inline `style` attribute. [#725](https://github.com/Stranger6667/css-inline/issues/725)
20
+
21
+ ## [0.20.2] - 2026-04-02
22
+
23
+ ### Fixed
24
+
25
+ - `inline_fragment` silently returning only whitespace when the input starts with whitespace or contains structural HTML tags (`<html>`, `<head>`, `<body>`, `<style>`). [#692](https://github.com/Stranger6667/css-inline/issues/692) [#693](https://github.com/Stranger6667/css-inline/issues/693)
26
+
5
27
  ## [0.20.1] - 2026-03-26
6
28
 
7
29
  ### Changed
@@ -563,7 +585,9 @@
563
585
 
564
586
  - Initial public release
565
587
 
566
- [Unreleased]: https://github.com/Stranger6667/css-inline/compare/python-v0.20.1...HEAD
588
+ [Unreleased]: https://github.com/Stranger6667/css-inline/compare/python-v0.21.0...HEAD
589
+ [0.21.0]: https://github.com/Stranger6667/css-inline/compare/python-v0.20.2...python-v0.21.0
590
+ [0.20.2]: https://github.com/Stranger6667/css-inline/compare/python-v0.20.1...python-v0.20.2
567
591
  [0.20.1]: https://github.com/Stranger6667/css-inline/compare/python-v0.20.0...python-v0.20.1
568
592
  [0.20.0]: https://github.com/Stranger6667/css-inline/compare/python-v0.19.1...python-v0.20.0
569
593
  [0.19.1]: https://github.com/Stranger6667/css-inline/compare/python-v0.19.0...python-v0.19.1
@@ -25,9 +25,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
25
25
 
26
26
  [[package]]
27
27
  name = "autocfg"
28
- version = "1.5.0"
28
+ version = "1.5.1"
29
29
  source = "registry+https://github.com/rust-lang/crates.io-index"
30
- checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
30
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
31
31
 
32
32
  [[package]]
33
33
  name = "base64"
@@ -37,9 +37,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
37
37
 
38
38
  [[package]]
39
39
  name = "bitflags"
40
- version = "2.11.0"
40
+ version = "2.13.0"
41
41
  source = "registry+https://github.com/rust-lang/crates.io-index"
42
- checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
42
+ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
43
43
 
44
44
  [[package]]
45
45
  name = "built"
@@ -53,9 +53,9 @@ dependencies = [
53
53
 
54
54
  [[package]]
55
55
  name = "bumpalo"
56
- version = "3.20.2"
56
+ version = "3.20.3"
57
57
  source = "registry+https://github.com/rust-lang/crates.io-index"
58
- checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
58
+ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
59
59
 
60
60
  [[package]]
61
61
  name = "bytes"
@@ -77,9 +77,9 @@ dependencies = [
77
77
 
78
78
  [[package]]
79
79
  name = "cc"
80
- version = "1.2.57"
80
+ version = "1.2.64"
81
81
  source = "registry+https://github.com/rust-lang/crates.io-index"
82
- checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423"
82
+ checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
83
83
  dependencies = [
84
84
  "find-msvc-tools",
85
85
  "shlex",
@@ -99,9 +99,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
99
99
 
100
100
  [[package]]
101
101
  name = "chrono"
102
- version = "0.4.44"
102
+ version = "0.4.45"
103
103
  source = "registry+https://github.com/rust-lang/crates.io-index"
104
- checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
104
+ checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
105
105
  dependencies = [
106
106
  "iana-time-zone",
107
107
  "num-traits",
@@ -141,7 +141,7 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
141
141
 
142
142
  [[package]]
143
143
  name = "css-inline"
144
- version = "0.20.1"
144
+ version = "0.21.0"
145
145
  dependencies = [
146
146
  "cssparser",
147
147
  "html5ever",
@@ -157,7 +157,7 @@ dependencies = [
157
157
 
158
158
  [[package]]
159
159
  name = "css-inline-python"
160
- version = "0.20.1"
160
+ version = "0.21.0"
161
161
  dependencies = [
162
162
  "built",
163
163
  "css-inline",
@@ -169,9 +169,9 @@ dependencies = [
169
169
 
170
170
  [[package]]
171
171
  name = "cssparser"
172
- version = "0.36.0"
172
+ version = "0.37.0"
173
173
  source = "registry+https://github.com/rust-lang/crates.io-index"
174
- checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2"
174
+ checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98"
175
175
  dependencies = [
176
176
  "cssparser-macros",
177
177
  "dtoa-short",
@@ -182,9 +182,9 @@ dependencies = [
182
182
 
183
183
  [[package]]
184
184
  name = "cssparser-macros"
185
- version = "0.6.1"
185
+ version = "0.7.0"
186
186
  source = "registry+https://github.com/rust-lang/crates.io-index"
187
- checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
187
+ checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf"
188
188
  dependencies = [
189
189
  "quote",
190
190
  "syn",
@@ -213,9 +213,9 @@ dependencies = [
213
213
 
214
214
  [[package]]
215
215
  name = "displaydoc"
216
- version = "0.2.5"
216
+ version = "0.2.6"
217
217
  source = "registry+https://github.com/rust-lang/crates.io-index"
218
- checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
218
+ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
219
219
  dependencies = [
220
220
  "proc-macro2",
221
221
  "quote",
@@ -239,9 +239,9 @@ dependencies = [
239
239
 
240
240
  [[package]]
241
241
  name = "either"
242
- version = "1.15.0"
242
+ version = "1.16.0"
243
243
  source = "registry+https://github.com/rust-lang/crates.io-index"
244
- checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
244
+ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
245
245
 
246
246
  [[package]]
247
247
  name = "equivalent"
@@ -251,9 +251,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
251
251
 
252
252
  [[package]]
253
253
  name = "fastrand"
254
- version = "2.3.0"
254
+ version = "2.4.1"
255
255
  source = "registry+https://github.com/rust-lang/crates.io-index"
256
- checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
256
+ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
257
257
 
258
258
  [[package]]
259
259
  name = "find-msvc-tools"
@@ -354,9 +354,9 @@ dependencies = [
354
354
 
355
355
  [[package]]
356
356
  name = "hashbrown"
357
- version = "0.16.1"
357
+ version = "0.17.1"
358
358
  source = "registry+https://github.com/rust-lang/crates.io-index"
359
- checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
359
+ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
360
360
  dependencies = [
361
361
  "allocator-api2",
362
362
  "equivalent",
@@ -381,9 +381,9 @@ dependencies = [
381
381
 
382
382
  [[package]]
383
383
  name = "http"
384
- version = "1.4.0"
384
+ version = "1.4.2"
385
385
  source = "registry+https://github.com/rust-lang/crates.io-index"
386
- checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
386
+ checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
387
387
  dependencies = [
388
388
  "bytes",
389
389
  "itoa",
@@ -420,9 +420,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
420
420
 
421
421
  [[package]]
422
422
  name = "hyper"
423
- version = "1.8.1"
423
+ version = "1.10.1"
424
424
  source = "registry+https://github.com/rust-lang/crates.io-index"
425
- checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
425
+ checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
426
426
  dependencies = [
427
427
  "atomic-waker",
428
428
  "bytes",
@@ -433,7 +433,6 @@ dependencies = [
433
433
  "httparse",
434
434
  "itoa",
435
435
  "pin-project-lite",
436
- "pin-utils",
437
436
  "smallvec",
438
437
  "tokio",
439
438
  "want",
@@ -441,15 +440,14 @@ dependencies = [
441
440
 
442
441
  [[package]]
443
442
  name = "hyper-rustls"
444
- version = "0.27.7"
443
+ version = "0.27.9"
445
444
  source = "registry+https://github.com/rust-lang/crates.io-index"
446
- checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
445
+ checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f"
447
446
  dependencies = [
448
447
  "http",
449
448
  "hyper",
450
449
  "hyper-util",
451
450
  "rustls",
452
- "rustls-pki-types",
453
451
  "tokio",
454
452
  "tokio-rustls",
455
453
  "tower-service",
@@ -607,9 +605,9 @@ dependencies = [
607
605
 
608
606
  [[package]]
609
607
  name = "indexmap"
610
- version = "2.13.0"
608
+ version = "2.14.0"
611
609
  source = "registry+https://github.com/rust-lang/crates.io-index"
612
- checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
610
+ checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
613
611
  dependencies = [
614
612
  "equivalent",
615
613
  "hashbrown",
@@ -621,16 +619,6 @@ version = "2.12.0"
621
619
  source = "registry+https://github.com/rust-lang/crates.io-index"
622
620
  checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
623
621
 
624
- [[package]]
625
- name = "iri-string"
626
- version = "0.7.11"
627
- source = "registry+https://github.com/rust-lang/crates.io-index"
628
- checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb"
629
- dependencies = [
630
- "memchr",
631
- "serde",
632
- ]
633
-
634
622
  [[package]]
635
623
  name = "itoa"
636
624
  version = "1.0.18"
@@ -639,25 +627,26 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
639
627
 
640
628
  [[package]]
641
629
  name = "js-sys"
642
- version = "0.3.91"
630
+ version = "0.3.102"
643
631
  source = "registry+https://github.com/rust-lang/crates.io-index"
644
- checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c"
632
+ checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
645
633
  dependencies = [
646
- "once_cell",
634
+ "cfg-if",
635
+ "futures-util",
647
636
  "wasm-bindgen",
648
637
  ]
649
638
 
650
639
  [[package]]
651
640
  name = "libc"
652
- version = "0.2.183"
641
+ version = "0.2.186"
653
642
  source = "registry+https://github.com/rust-lang/crates.io-index"
654
- checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
643
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
655
644
 
656
645
  [[package]]
657
646
  name = "litemap"
658
- version = "0.8.1"
647
+ version = "0.8.2"
659
648
  source = "registry+https://github.com/rust-lang/crates.io-index"
660
- checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
649
+ checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
661
650
 
662
651
  [[package]]
663
652
  name = "lock_api"
@@ -670,15 +659,15 @@ dependencies = [
670
659
 
671
660
  [[package]]
672
661
  name = "log"
673
- version = "0.4.29"
662
+ version = "0.4.32"
674
663
  source = "registry+https://github.com/rust-lang/crates.io-index"
675
- checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
664
+ checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
676
665
 
677
666
  [[package]]
678
667
  name = "lru"
679
- version = "0.16.3"
668
+ version = "0.18.0"
680
669
  source = "registry+https://github.com/rust-lang/crates.io-index"
681
- checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"
670
+ checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
682
671
  dependencies = [
683
672
  "hashbrown",
684
673
  ]
@@ -702,15 +691,15 @@ dependencies = [
702
691
 
703
692
  [[package]]
704
693
  name = "memchr"
705
- version = "2.8.0"
694
+ version = "2.8.2"
706
695
  source = "registry+https://github.com/rust-lang/crates.io-index"
707
- checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
696
+ checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
708
697
 
709
698
  [[package]]
710
699
  name = "mio"
711
- version = "1.1.1"
700
+ version = "1.2.1"
712
701
  source = "registry+https://github.com/rust-lang/crates.io-index"
713
- checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
702
+ checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
714
703
  dependencies = [
715
704
  "libc",
716
705
  "wasi",
@@ -826,12 +815,6 @@ version = "0.2.17"
826
815
  source = "registry+https://github.com/rust-lang/crates.io-index"
827
816
  checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
828
817
 
829
- [[package]]
830
- name = "pin-utils"
831
- version = "0.1.0"
832
- source = "registry+https://github.com/rust-lang/crates.io-index"
833
- checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
834
-
835
818
  [[package]]
836
819
  name = "portable-atomic"
837
820
  version = "1.13.1"
@@ -840,9 +823,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
840
823
 
841
824
  [[package]]
842
825
  name = "potential_utf"
843
- version = "0.1.4"
826
+ version = "0.1.5"
844
827
  source = "registry+https://github.com/rust-lang/crates.io-index"
845
- checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
828
+ checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
846
829
  dependencies = [
847
830
  "zerovec",
848
831
  ]
@@ -873,9 +856,9 @@ dependencies = [
873
856
 
874
857
  [[package]]
875
858
  name = "pyo3"
876
- version = "0.28.2"
859
+ version = "0.29.0"
877
860
  source = "registry+https://github.com/rust-lang/crates.io-index"
878
- checksum = "cf85e27e86080aafd5a22eae58a162e133a589551542b3e5cee4beb27e54f8e1"
861
+ checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
879
862
  dependencies = [
880
863
  "libc",
881
864
  "once_cell",
@@ -887,9 +870,9 @@ dependencies = [
887
870
 
888
871
  [[package]]
889
872
  name = "pyo3-build-config"
890
- version = "0.28.2"
873
+ version = "0.29.0"
891
874
  source = "registry+https://github.com/rust-lang/crates.io-index"
892
- checksum = "8bf94ee265674bf76c09fa430b0e99c26e319c945d96ca0d5a8215f31bf81cf7"
875
+ checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
893
876
  dependencies = [
894
877
  "target-lexicon",
895
878
  ]
@@ -902,9 +885,9 @@ checksum = "4bf83fcee540452241ba030140f50418b973e840a64727c967b9266660f0a690"
902
885
 
903
886
  [[package]]
904
887
  name = "pyo3-ffi"
905
- version = "0.28.2"
888
+ version = "0.29.0"
906
889
  source = "registry+https://github.com/rust-lang/crates.io-index"
907
- checksum = "491aa5fc66d8059dd44a75f4580a2962c1862a1c2945359db36f6c2818b748dc"
890
+ checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
908
891
  dependencies = [
909
892
  "libc",
910
893
  "pyo3-build-config",
@@ -912,9 +895,9 @@ dependencies = [
912
895
 
913
896
  [[package]]
914
897
  name = "pyo3-macros"
915
- version = "0.28.2"
898
+ version = "0.29.0"
916
899
  source = "registry+https://github.com/rust-lang/crates.io-index"
917
- checksum = "f5d671734e9d7a43449f8480f8b38115df67bef8d21f76837fa75ee7aaa5e52e"
900
+ checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
918
901
  dependencies = [
919
902
  "proc-macro2",
920
903
  "pyo3-macros-backend",
@@ -924,13 +907,12 @@ dependencies = [
924
907
 
925
908
  [[package]]
926
909
  name = "pyo3-macros-backend"
927
- version = "0.28.2"
910
+ version = "0.29.0"
928
911
  source = "registry+https://github.com/rust-lang/crates.io-index"
929
- checksum = "22faaa1ce6c430a1f71658760497291065e6450d7b5dc2bcf254d49f66ee700a"
912
+ checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
930
913
  dependencies = [
931
914
  "heck",
932
915
  "proc-macro2",
933
- "pyo3-build-config",
934
916
  "quote",
935
917
  "syn",
936
918
  ]
@@ -1007,9 +989,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1007
989
 
1008
990
  [[package]]
1009
991
  name = "rand"
1010
- version = "0.9.2"
992
+ version = "0.9.4"
1011
993
  source = "registry+https://github.com/rust-lang/crates.io-index"
1012
- checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
994
+ checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
1013
995
  dependencies = [
1014
996
  "rand_chacha",
1015
997
  "rand_core",
@@ -1036,9 +1018,9 @@ dependencies = [
1036
1018
 
1037
1019
  [[package]]
1038
1020
  name = "rayon"
1039
- version = "1.11.0"
1021
+ version = "1.12.0"
1040
1022
  source = "registry+https://github.com/rust-lang/crates.io-index"
1041
- checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
1023
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
1042
1024
  dependencies = [
1043
1025
  "either",
1044
1026
  "rayon-core",
@@ -1119,9 +1101,9 @@ dependencies = [
1119
1101
 
1120
1102
  [[package]]
1121
1103
  name = "rustc-hash"
1122
- version = "2.1.1"
1104
+ version = "2.1.2"
1123
1105
  source = "registry+https://github.com/rust-lang/crates.io-index"
1124
- checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
1106
+ checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
1125
1107
 
1126
1108
  [[package]]
1127
1109
  name = "rustc_version"
@@ -1134,9 +1116,9 @@ dependencies = [
1134
1116
 
1135
1117
  [[package]]
1136
1118
  name = "rustls"
1137
- version = "0.23.37"
1119
+ version = "0.23.40"
1138
1120
  source = "registry+https://github.com/rust-lang/crates.io-index"
1139
- checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4"
1121
+ checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
1140
1122
  dependencies = [
1141
1123
  "once_cell",
1142
1124
  "ring",
@@ -1148,9 +1130,9 @@ dependencies = [
1148
1130
 
1149
1131
  [[package]]
1150
1132
  name = "rustls-pki-types"
1151
- version = "1.14.0"
1133
+ version = "1.14.1"
1152
1134
  source = "registry+https://github.com/rust-lang/crates.io-index"
1153
- checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
1135
+ checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
1154
1136
  dependencies = [
1155
1137
  "web-time",
1156
1138
  "zeroize",
@@ -1158,9 +1140,9 @@ dependencies = [
1158
1140
 
1159
1141
  [[package]]
1160
1142
  name = "rustls-webpki"
1161
- version = "0.103.10"
1143
+ version = "0.103.13"
1162
1144
  source = "registry+https://github.com/rust-lang/crates.io-index"
1163
- checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef"
1145
+ checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
1164
1146
  dependencies = [
1165
1147
  "ring",
1166
1148
  "rustls-pki-types",
@@ -1187,9 +1169,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1187
1169
 
1188
1170
  [[package]]
1189
1171
  name = "selectors"
1190
- version = "0.36.1"
1172
+ version = "0.38.0"
1191
1173
  source = "registry+https://github.com/rust-lang/crates.io-index"
1192
- checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c"
1174
+ checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d"
1193
1175
  dependencies = [
1194
1176
  "bitflags",
1195
1177
  "cssparser",
@@ -1206,9 +1188,9 @@ dependencies = [
1206
1188
 
1207
1189
  [[package]]
1208
1190
  name = "semver"
1209
- version = "1.0.27"
1191
+ version = "1.0.28"
1210
1192
  source = "registry+https://github.com/rust-lang/crates.io-index"
1211
- checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
1193
+ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
1212
1194
  dependencies = [
1213
1195
  "serde",
1214
1196
  "serde_core",
@@ -1246,9 +1228,9 @@ dependencies = [
1246
1228
 
1247
1229
  [[package]]
1248
1230
  name = "serde_json"
1249
- version = "1.0.149"
1231
+ version = "1.0.150"
1250
1232
  source = "registry+https://github.com/rust-lang/crates.io-index"
1251
- checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
1233
+ checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
1252
1234
  dependencies = [
1253
1235
  "itoa",
1254
1236
  "memchr",
@@ -1289,15 +1271,15 @@ dependencies = [
1289
1271
 
1290
1272
  [[package]]
1291
1273
  name = "shlex"
1292
- version = "1.3.0"
1274
+ version = "2.0.1"
1293
1275
  source = "registry+https://github.com/rust-lang/crates.io-index"
1294
- checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1276
+ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
1295
1277
 
1296
1278
  [[package]]
1297
1279
  name = "siphasher"
1298
- version = "1.0.2"
1280
+ version = "1.0.3"
1299
1281
  source = "registry+https://github.com/rust-lang/crates.io-index"
1300
- checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
1282
+ checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649"
1301
1283
 
1302
1284
  [[package]]
1303
1285
  name = "slab"
@@ -1307,15 +1289,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1307
1289
 
1308
1290
  [[package]]
1309
1291
  name = "smallvec"
1310
- version = "1.15.1"
1292
+ version = "1.15.2"
1311
1293
  source = "registry+https://github.com/rust-lang/crates.io-index"
1312
- checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1294
+ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
1313
1295
 
1314
1296
  [[package]]
1315
1297
  name = "socket2"
1316
- version = "0.6.3"
1298
+ version = "0.6.4"
1317
1299
  source = "registry+https://github.com/rust-lang/crates.io-index"
1318
- checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
1300
+ checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
1319
1301
  dependencies = [
1320
1302
  "libc",
1321
1303
  "windows-sys 0.61.2",
@@ -1426,9 +1408,9 @@ dependencies = [
1426
1408
 
1427
1409
  [[package]]
1428
1410
  name = "tinystr"
1429
- version = "0.8.2"
1411
+ version = "0.8.3"
1430
1412
  source = "registry+https://github.com/rust-lang/crates.io-index"
1431
- checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
1413
+ checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
1432
1414
  dependencies = [
1433
1415
  "displaydoc",
1434
1416
  "zerovec",
@@ -1451,9 +1433,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1451
1433
 
1452
1434
  [[package]]
1453
1435
  name = "tokio"
1454
- version = "1.50.0"
1436
+ version = "1.52.3"
1455
1437
  source = "registry+https://github.com/rust-lang/crates.io-index"
1456
- checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d"
1438
+ checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
1457
1439
  dependencies = [
1458
1440
  "bytes",
1459
1441
  "libc",
@@ -1531,20 +1513,20 @@ dependencies = [
1531
1513
 
1532
1514
  [[package]]
1533
1515
  name = "tower-http"
1534
- version = "0.6.8"
1516
+ version = "0.6.11"
1535
1517
  source = "registry+https://github.com/rust-lang/crates.io-index"
1536
- checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
1518
+ checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
1537
1519
  dependencies = [
1538
1520
  "bitflags",
1539
1521
  "bytes",
1540
1522
  "futures-util",
1541
1523
  "http",
1542
1524
  "http-body",
1543
- "iri-string",
1544
1525
  "pin-project-lite",
1545
1526
  "tower",
1546
1527
  "tower-layer",
1547
1528
  "tower-service",
1529
+ "url",
1548
1530
  ]
1549
1531
 
1550
1532
  [[package]]
@@ -1646,9 +1628,9 @@ dependencies = [
1646
1628
 
1647
1629
  [[package]]
1648
1630
  name = "wasm-bindgen"
1649
- version = "0.2.114"
1631
+ version = "0.2.125"
1650
1632
  source = "registry+https://github.com/rust-lang/crates.io-index"
1651
- checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e"
1633
+ checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
1652
1634
  dependencies = [
1653
1635
  "cfg-if",
1654
1636
  "once_cell",
@@ -1659,23 +1641,19 @@ dependencies = [
1659
1641
 
1660
1642
  [[package]]
1661
1643
  name = "wasm-bindgen-futures"
1662
- version = "0.4.64"
1644
+ version = "0.4.75"
1663
1645
  source = "registry+https://github.com/rust-lang/crates.io-index"
1664
- checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8"
1646
+ checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
1665
1647
  dependencies = [
1666
- "cfg-if",
1667
- "futures-util",
1668
1648
  "js-sys",
1669
- "once_cell",
1670
1649
  "wasm-bindgen",
1671
- "web-sys",
1672
1650
  ]
1673
1651
 
1674
1652
  [[package]]
1675
1653
  name = "wasm-bindgen-macro"
1676
- version = "0.2.114"
1654
+ version = "0.2.125"
1677
1655
  source = "registry+https://github.com/rust-lang/crates.io-index"
1678
- checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6"
1656
+ checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
1679
1657
  dependencies = [
1680
1658
  "quote",
1681
1659
  "wasm-bindgen-macro-support",
@@ -1683,9 +1661,9 @@ dependencies = [
1683
1661
 
1684
1662
  [[package]]
1685
1663
  name = "wasm-bindgen-macro-support"
1686
- version = "0.2.114"
1664
+ version = "0.2.125"
1687
1665
  source = "registry+https://github.com/rust-lang/crates.io-index"
1688
- checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3"
1666
+ checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
1689
1667
  dependencies = [
1690
1668
  "bumpalo",
1691
1669
  "proc-macro2",
@@ -1696,18 +1674,18 @@ dependencies = [
1696
1674
 
1697
1675
  [[package]]
1698
1676
  name = "wasm-bindgen-shared"
1699
- version = "0.2.114"
1677
+ version = "0.2.125"
1700
1678
  source = "registry+https://github.com/rust-lang/crates.io-index"
1701
- checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16"
1679
+ checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
1702
1680
  dependencies = [
1703
1681
  "unicode-ident",
1704
1682
  ]
1705
1683
 
1706
1684
  [[package]]
1707
1685
  name = "web-sys"
1708
- version = "0.3.91"
1686
+ version = "0.3.102"
1709
1687
  source = "registry+https://github.com/rust-lang/crates.io-index"
1710
- checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9"
1688
+ checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
1711
1689
  dependencies = [
1712
1690
  "js-sys",
1713
1691
  "wasm-bindgen",
@@ -1725,9 +1703,9 @@ dependencies = [
1725
1703
 
1726
1704
  [[package]]
1727
1705
  name = "web_atoms"
1728
- version = "0.2.3"
1706
+ version = "0.2.4"
1729
1707
  source = "registry+https://github.com/rust-lang/crates.io-index"
1730
- checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576"
1708
+ checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538"
1731
1709
  dependencies = [
1732
1710
  "phf",
1733
1711
  "phf_codegen",
@@ -1737,9 +1715,9 @@ dependencies = [
1737
1715
 
1738
1716
  [[package]]
1739
1717
  name = "webpki-roots"
1740
- version = "1.0.6"
1718
+ version = "1.0.7"
1741
1719
  source = "registry+https://github.com/rust-lang/crates.io-index"
1742
- checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed"
1720
+ checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d"
1743
1721
  dependencies = [
1744
1722
  "rustls-pki-types",
1745
1723
  ]
@@ -1976,15 +1954,15 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
1976
1954
 
1977
1955
  [[package]]
1978
1956
  name = "writeable"
1979
- version = "0.6.2"
1957
+ version = "0.6.3"
1980
1958
  source = "registry+https://github.com/rust-lang/crates.io-index"
1981
- checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
1959
+ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
1982
1960
 
1983
1961
  [[package]]
1984
1962
  name = "yoke"
1985
- version = "0.8.1"
1963
+ version = "0.8.3"
1986
1964
  source = "registry+https://github.com/rust-lang/crates.io-index"
1987
- checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
1965
+ checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
1988
1966
  dependencies = [
1989
1967
  "stable_deref_trait",
1990
1968
  "yoke-derive",
@@ -1993,9 +1971,9 @@ dependencies = [
1993
1971
 
1994
1972
  [[package]]
1995
1973
  name = "yoke-derive"
1996
- version = "0.8.1"
1974
+ version = "0.8.2"
1997
1975
  source = "registry+https://github.com/rust-lang/crates.io-index"
1998
- checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
1976
+ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
1999
1977
  dependencies = [
2000
1978
  "proc-macro2",
2001
1979
  "quote",
@@ -2005,18 +1983,18 @@ dependencies = [
2005
1983
 
2006
1984
  [[package]]
2007
1985
  name = "zerocopy"
2008
- version = "0.8.47"
1986
+ version = "0.8.52"
2009
1987
  source = "registry+https://github.com/rust-lang/crates.io-index"
2010
- checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87"
1988
+ checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
2011
1989
  dependencies = [
2012
1990
  "zerocopy-derive",
2013
1991
  ]
2014
1992
 
2015
1993
  [[package]]
2016
1994
  name = "zerocopy-derive"
2017
- version = "0.8.47"
1995
+ version = "0.8.52"
2018
1996
  source = "registry+https://github.com/rust-lang/crates.io-index"
2019
- checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89"
1997
+ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
2020
1998
  dependencies = [
2021
1999
  "proc-macro2",
2022
2000
  "quote",
@@ -2025,18 +2003,18 @@ dependencies = [
2025
2003
 
2026
2004
  [[package]]
2027
2005
  name = "zerofrom"
2028
- version = "0.1.6"
2006
+ version = "0.1.8"
2029
2007
  source = "registry+https://github.com/rust-lang/crates.io-index"
2030
- checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
2008
+ checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
2031
2009
  dependencies = [
2032
2010
  "zerofrom-derive",
2033
2011
  ]
2034
2012
 
2035
2013
  [[package]]
2036
2014
  name = "zerofrom-derive"
2037
- version = "0.1.6"
2015
+ version = "0.1.7"
2038
2016
  source = "registry+https://github.com/rust-lang/crates.io-index"
2039
- checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2017
+ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
2040
2018
  dependencies = [
2041
2019
  "proc-macro2",
2042
2020
  "quote",
@@ -2046,15 +2024,15 @@ dependencies = [
2046
2024
 
2047
2025
  [[package]]
2048
2026
  name = "zeroize"
2049
- version = "1.8.2"
2027
+ version = "1.9.0"
2050
2028
  source = "registry+https://github.com/rust-lang/crates.io-index"
2051
- checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
2029
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
2052
2030
 
2053
2031
  [[package]]
2054
2032
  name = "zerotrie"
2055
- version = "0.2.3"
2033
+ version = "0.2.4"
2056
2034
  source = "registry+https://github.com/rust-lang/crates.io-index"
2057
- checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
2035
+ checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
2058
2036
  dependencies = [
2059
2037
  "displaydoc",
2060
2038
  "yoke",
@@ -2063,9 +2041,9 @@ dependencies = [
2063
2041
 
2064
2042
  [[package]]
2065
2043
  name = "zerovec"
2066
- version = "0.11.5"
2044
+ version = "0.11.6"
2067
2045
  source = "registry+https://github.com/rust-lang/crates.io-index"
2068
- checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
2046
+ checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
2069
2047
  dependencies = [
2070
2048
  "yoke",
2071
2049
  "zerofrom",
@@ -2074,9 +2052,9 @@ dependencies = [
2074
2052
 
2075
2053
  [[package]]
2076
2054
  name = "zerovec-derive"
2077
- version = "0.11.2"
2055
+ version = "0.11.3"
2078
2056
  source = "registry+https://github.com/rust-lang/crates.io-index"
2079
- checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
2057
+ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
2080
2058
  dependencies = [
2081
2059
  "proc-macro2",
2082
2060
  "quote",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "css-inline-python"
3
- version = "0.20.1"
3
+ version = "0.21.0"
4
4
  authors = ["Dmitry Dygalo <dmitry@dygalo.dev>"]
5
5
  edition = "2024"
6
6
  rust-version = "1.85"
@@ -15,7 +15,7 @@ crate-type = ["cdylib"]
15
15
  built = { version = "0.8.0", features = ["cargo-lock", "chrono"] }
16
16
 
17
17
  [dependencies]
18
- pyo3 = { version = "0.28.0", features = ["extension-module", "abi3-py39"] }
18
+ pyo3 = { version = "0.29.0", features = ["extension-module", "abi3-py310"] }
19
19
  pyo3-built = "0.6"
20
20
  rayon = "1"
21
21
  url = "2"
@@ -44,7 +44,7 @@ into:
44
44
  - Can process multiple documents in parallel
45
45
  - Works on Linux, Windows, macOS and in the browser via PyOdide
46
46
  - Supports HTML5 & CSS3
47
- - Tested on CPython 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
47
+ - Tested on CPython 3.10, 3.11, 3.12, 3.13, 3.14 and PyPy 3.11.
48
48
 
49
49
  ## Playground
50
50
 
@@ -90,7 +90,7 @@ inlined = css_inline.inline(HTML)
90
90
 
91
91
  Note that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.
92
92
 
93
- Alternatively, you can inline CSS into an HTML fragment, preserving the original structure:
93
+ Alternatively, you can inline CSS into an HTML fragment. Structural tags (`<html>`, `<head>`, `<body>`) are stripped from the output; only their contents are preserved. Use `inline` if you need to keep the full document structure:
94
94
 
95
95
  ```python
96
96
  FRAGMENT = """<main>
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "css-inline"
3
- version = "0.20.1"
3
+ version = "0.21.0"
4
4
  authors = ["Dmitry Dygalo <dmitry@dygalo.dev>"]
5
5
  edition = "2021"
6
6
  license = "MIT"
@@ -16,7 +16,11 @@ exclude = [
16
16
  "tests",
17
17
  ]
18
18
  categories = ["web-programming"]
19
- rust-version = "1.80"
19
+ rust-version = "1.85"
20
+ resolver = "3"
21
+
22
+ [[bin]]
23
+ name = "css-inline"
20
24
 
21
25
  [features]
22
26
  default = ["cli", "http", "file", "stylesheet-cache"]
@@ -26,15 +30,15 @@ file = []
26
30
  stylesheet-cache = ["lru"]
27
31
 
28
32
  [dependencies]
29
- cssparser = "0.36.0"
33
+ cssparser = "0.37.0"
30
34
  html5ever = "0.39.0"
31
- lru = { version = "0.16.0", optional = true }
35
+ lru = { version = "0.18.0", optional = true }
32
36
  memchr = "2.7"
33
37
  precomputed-hash = "0.1.1"
34
38
  rayon = { version = "1.10", optional = true }
35
39
  reqwest = { version = "0.12.0", optional = true, default-features = false, features = ["rustls-tls", "blocking"] }
36
40
  rustc-hash = "2.0.0"
37
- selectors = "0.36.1"
41
+ selectors = "0.38.0"
38
42
  smallvec = "1"
39
43
  url = "2"
40
44
 
@@ -59,7 +59,7 @@ To include it in your project, add the following line to the dependencies sectio
59
59
  css-inline = "0.20"
60
60
  ```
61
61
 
62
- The Minimum Supported Rust Version is 1.80.
62
+ The Minimum Supported Rust Version is 1.85.
63
63
 
64
64
  ## Usage
65
65
 
@@ -82,7 +82,7 @@ fn main() -> css_inline::Result<()> {
82
82
 
83
83
  Note that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.
84
84
 
85
- Alternatively, you can inline CSS into an HTML fragment, preserving the original structure:
85
+ Alternatively, you can inline CSS into an HTML fragment. Structural tags (`<html>`, `<head>`, `<body>`) are stripped from the output; only their contents are preserved. Use `inline` if you need to keep the full document structure:
86
86
 
87
87
  ```rust
88
88
  const FRAGMENT: &str = r#"<main>
@@ -220,16 +220,14 @@ impl Document {
220
220
 
221
221
  match bytes.first() {
222
222
  // Class selector: .classname
223
- Some(b'.') => extract_identifier(&bytes[1..]).map_or(true, |name| {
224
- self.by_class.contains_key(&LocalName::from(name))
225
- }),
223
+ Some(b'.') => extract_identifier(&bytes[1..])
224
+ .is_none_or(|name| self.by_class.contains_key(&LocalName::from(name))),
226
225
  // ID selector: #id
227
226
  Some(b'#') => extract_identifier(&bytes[1..])
228
- .map_or(true, |name| self.by_id.contains_key(&LocalName::from(name))),
227
+ .is_none_or(|name| self.by_id.contains_key(&LocalName::from(name))),
229
228
  // Tag selector: starts with ASCII letter
230
- Some(b'a'..=b'z' | b'A'..=b'Z') => extract_identifier(bytes).map_or(true, |name| {
231
- self.by_tag.contains_key(&LocalName::from(name))
232
- }),
229
+ Some(b'a'..=b'z' | b'A'..=b'Z') => extract_identifier(bytes)
230
+ .is_none_or(|name| self.by_tag.contains_key(&LocalName::from(name))),
233
231
  // Universal (*), attribute ([), pseudo-class (:), empty, or unknown
234
232
  _ => true,
235
233
  }
@@ -284,10 +282,10 @@ impl Document {
284
282
 
285
283
  /// Remove all the children from node and append them to `new_parent`.
286
284
  pub(super) fn reparent_children(&mut self, node: NodeId, new_parent: NodeId) {
287
- let mut next_child = self[node].first_child;
288
- while let Some(child) = next_child {
285
+ // Re-read `first_child` each iteration: `append` calls `detach` internally, which clears
286
+ // `child.next_sibling` and updates `node.first_child` to the former second child.
287
+ while let Some(child) = self[node].first_child {
289
288
  self.append(new_parent, child);
290
- next_child = self[child].next_sibling;
291
289
  }
292
290
  }
293
291
 
@@ -119,6 +119,37 @@ fn find_style_value<'a>(styles: &'a ElementStyleMap<'_>, property: &str) -> Opti
119
119
  .map(|(_, _, value)| *value)
120
120
  }
121
121
 
122
+ /// Find a property value in an element's inline `style` attribute (last declaration wins).
123
+ fn find_inline_style_value<'a>(style: &'a str, property: &str) -> Option<&'a str> {
124
+ let mut input = cssparser::ParserInput::new(style);
125
+ let mut css_parser = cssparser::Parser::new(&mut input);
126
+ let mut declaration_parser = parser::CSSDeclarationListParser;
127
+ let declarations = cssparser::RuleBodyParser::new(&mut css_parser, &mut declaration_parser);
128
+ let mut found = None;
129
+ for (name, value) in declarations.flatten() {
130
+ if name.eq_ignore_ascii_case(property) {
131
+ found = Some(value);
132
+ }
133
+ }
134
+ found
135
+ }
136
+
137
+ /// Pick the cascade-effective value between an inline `style` declaration and a stylesheet rule.
138
+ /// Precedence (high to low): inline `!important`, stylesheet `!important`, inline, stylesheet.
139
+ fn effective_dimension<'a>(
140
+ inline: Option<&'a str>,
141
+ stylesheet: Option<&'a str>,
142
+ ) -> Option<&'a str> {
143
+ let important = |v: &str| v.trim_end().ends_with("!important");
144
+ if inline.is_some_and(important) {
145
+ inline
146
+ } else if stylesheet.is_some_and(important) {
147
+ stylesheet
148
+ } else {
149
+ inline.or(stylesheet)
150
+ }
151
+ }
152
+
122
153
  #[allow(clippy::too_many_arguments, clippy::fn_params_excessive_bools)]
123
154
  pub(crate) fn serialize_to<W: Write>(
124
155
  document: &Document,
@@ -398,7 +429,7 @@ impl<'a, W: Write> HtmlSerializer<'a, W> {
398
429
  self.styles.get_mut(node_id.get()).and_then(|slot| {
399
430
  slot.take().map(|mut styles| {
400
431
  // Sort by specificity for consistent output order
401
- styles.sort_unstable_by(|a, b| a.1.cmp(&b.1));
432
+ styles.sort_unstable_by_key(|a| a.1);
402
433
  styles
403
434
  })
404
435
  })
@@ -418,11 +449,14 @@ impl<'a, W: Write> HtmlSerializer<'a, W> {
418
449
  if let Some(ref html_name) = html_name {
419
450
  if supports_dimension_attrs(html_name) {
420
451
  let allow_percent = is_table_element(html_name);
452
+ // Resolve the cascade-effective value across the inline `style` and stylesheet.
453
+ let style_attr = attrs.get(local_name!("style"));
421
454
  if apply_width_attributes && !attrs.contains(local_name!("width")) {
422
- if let Some(dim) = styles
423
- .as_ref()
424
- .and_then(|s| find_style_value(s, "width"))
425
- .and_then(|v| extract_dimension_value(v, allow_percent))
455
+ if let Some(dim) = effective_dimension(
456
+ style_attr.and_then(|s| find_inline_style_value(s, "width")),
457
+ styles.as_ref().and_then(|s| find_style_value(s, "width")),
458
+ )
459
+ .and_then(|v| extract_dimension_value(v, allow_percent))
426
460
  {
427
461
  self.writer.write_all(b" width=\"")?;
428
462
  dim.write_to(&mut self.writer)?;
@@ -430,10 +464,11 @@ impl<'a, W: Write> HtmlSerializer<'a, W> {
430
464
  }
431
465
  }
432
466
  if apply_height_attributes && !attrs.contains(local_name!("height")) {
433
- if let Some(dim) = styles
434
- .as_ref()
435
- .and_then(|s| find_style_value(s, "height"))
436
- .and_then(|v| extract_dimension_value(v, allow_percent))
467
+ if let Some(dim) = effective_dimension(
468
+ style_attr.and_then(|s| find_inline_style_value(s, "height")),
469
+ styles.as_ref().and_then(|s| find_style_value(s, "height")),
470
+ )
471
+ .and_then(|v| extract_dimension_value(v, allow_percent))
437
472
  {
438
473
  self.writer.write_all(b" height=\"")?;
439
474
  dim.write_to(&mut self.writer)?;
@@ -589,6 +589,14 @@ impl<'a> CSSInliner<'a> {
589
589
 
590
590
  /// Inline CSS into an HTML fragment.
591
591
  ///
592
+ /// Unlike [`inline`](CSSInliner::inline), this method does not wrap the output in `<html>` and
593
+ /// `<body>` tags. Structural tags (`<html>`, `<head>`, `<body>`) are stripped from the output;
594
+ /// only their contents are preserved. CSS from `<style>` tags within the input is also
595
+ /// processed and inlined.
596
+ ///
597
+ /// If you need to preserve the full HTML document structure, use [`inline`](CSSInliner::inline)
598
+ /// instead.
599
+ ///
592
600
  /// # Errors
593
601
  ///
594
602
  /// Inlining might fail for the following reasons:
@@ -609,6 +617,8 @@ impl<'a> CSSInliner<'a> {
609
617
 
610
618
  /// Inline CSS into an HTML fragment and write the result to a generic writer.
611
619
  ///
620
+ /// See [`inline_fragment`](CSSInliner::inline_fragment) for details on fragment handling.
621
+ ///
612
622
  /// # Errors
613
623
  ///
614
624
  /// Inlining might fail for the following reasons:
@@ -939,6 +949,8 @@ pub fn inline_to<W: Write>(html: &str, target: &mut W) -> Result<()> {
939
949
 
940
950
  /// Shortcut for inlining CSS into an HTML fragment with default parameters.
941
951
  ///
952
+ /// See [`CSSInliner::inline_fragment`] for details on fragment handling.
953
+ ///
942
954
  /// # Errors
943
955
  ///
944
956
  /// Inlining might fail for the following reasons:
@@ -16,7 +16,6 @@ classifiers=[
16
16
  "Operating System :: Microsoft :: Windows",
17
17
  "Operating System :: POSIX",
18
18
  "Programming Language :: Python :: 3",
19
- "Programming Language :: Python :: 3.9",
20
19
  "Programming Language :: Python :: 3.10",
21
20
  "Programming Language :: Python :: 3.11",
22
21
  "Programming Language :: Python :: 3.12",
@@ -27,7 +26,7 @@ classifiers=[
27
26
  "Programming Language :: Rust",
28
27
  ]
29
28
  dependencies = []
30
- requires-python = ">=3.9"
29
+ requires-python = ">=3.10"
31
30
 
32
31
  [project.urls]
33
32
  homepage = "https://github.com/Stranger6667/css-inline/tree/master/bindings/python"
@@ -35,7 +34,7 @@ repository = "https://github.com/Stranger6667/css-inline"
35
34
 
36
35
  [tool.ruff]
37
36
  line-length = 120
38
- target-version = "py39"
37
+ target-version = "py310"
39
38
 
40
39
  [tool.ruff.lint.isort]
41
40
  known-first-party = ["css_inline"]
File without changes