lxml 6.0.2__tar.gz → 6.0.3__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 (472) hide show
  1. {lxml-6.0.2 → lxml-6.0.3}/CHANGES.txt +31 -3
  2. {lxml-6.0.2 → lxml-6.0.3}/INSTALL.txt +2 -2
  3. {lxml-6.0.2 → lxml-6.0.3}/PKG-INFO +14 -12
  4. {lxml-6.0.2 → lxml-6.0.3}/README.rst +1 -1
  5. {lxml-6.0.2 → lxml-6.0.3}/buildlibxml.py +118 -64
  6. {lxml-6.0.2 → lxml-6.0.3}/doc/FAQ.txt +7 -7
  7. {lxml-6.0.2 → lxml-6.0.3}/doc/api.txt +4 -4
  8. {lxml-6.0.2 → lxml-6.0.3}/doc/build.txt +4 -4
  9. {lxml-6.0.2 → lxml-6.0.3}/doc/capi.txt +1 -1
  10. {lxml-6.0.2 → lxml-6.0.3}/doc/compatibility.txt +2 -2
  11. {lxml-6.0.2 → lxml-6.0.3}/doc/element_classes.txt +5 -5
  12. {lxml-6.0.2 → lxml-6.0.3}/doc/extensions.txt +2 -2
  13. {lxml-6.0.2 → lxml-6.0.3}/doc/html/FAQ.html +10 -10
  14. {lxml-6.0.2 → lxml-6.0.3}/doc/html/api.html +7 -7
  15. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/index.html +3 -3
  16. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/ElementInclude.html +3 -3
  17. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/doctestcompare.html +3 -3
  18. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/html/builder.html +3 -3
  19. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/html/formfill.html +3 -3
  20. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/html.html +3 -3
  21. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml/isoschematron.html +3 -3
  22. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/lxml.html +4 -4
  23. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_modules/xml/sax/handler.html +4 -4
  24. lxml-6.0.3/doc/html/apidoc/_static/base-stemmer.js +476 -0
  25. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/css/theme.css +1 -1
  26. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/doctools.js +6 -5
  27. lxml-6.0.3/doc/html/apidoc/_static/english-stemmer.js +1066 -0
  28. lxml-6.0.3/doc/html/apidoc/_static/language_data.js +13 -0
  29. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/searchtools.js +115 -57
  30. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/sphinx_highlight.js +36 -31
  31. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/genindex.html +19 -3
  32. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/index.html +3 -3
  33. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.ElementInclude.html +25 -17
  34. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml._elementpath.html +3 -3
  35. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.builder.html +4 -4
  36. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.cssselect.html +3 -3
  37. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.doctestcompare.html +8 -8
  38. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.etree.html +1121 -1163
  39. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html +10 -3
  40. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.ElementSoup.html +3 -3
  41. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.builder.html +134 -134
  42. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.clean.html +3 -3
  43. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.defs.html +3 -3
  44. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.diff.html +17 -17
  45. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.formfill.html +16 -18
  46. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.html +115 -115
  47. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.html5parser.html +3 -3
  48. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.html.soupparser.html +3 -3
  49. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.isoschematron.html +18 -18
  50. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.objectify.html +15 -15
  51. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/lxml.sax.html +11 -13
  52. lxml-6.0.3/doc/html/apidoc/objects.inv +0 -0
  53. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/py-modindex.html +3 -3
  54. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/search.html +3 -3
  55. lxml-6.0.3/doc/html/apidoc/searchindex.js +1 -0
  56. {lxml-6.0.2 → lxml-6.0.3}/doc/html/build.html +7 -7
  57. {lxml-6.0.2 → lxml-6.0.3}/doc/html/capi.html +4 -4
  58. lxml-6.0.2/doc/html/changes-6.0.2.html → lxml-6.0.3/doc/html/changes-6.0.3.html +415 -393
  59. {lxml-6.0.2 → lxml-6.0.3}/doc/html/compatibility.html +5 -5
  60. {lxml-6.0.2 → lxml-6.0.3}/doc/html/credits.html +3 -3
  61. {lxml-6.0.2 → lxml-6.0.3}/doc/html/cssselect.html +3 -3
  62. {lxml-6.0.2 → lxml-6.0.3}/doc/html/element_classes.html +8 -8
  63. {lxml-6.0.2 → lxml-6.0.3}/doc/html/elementsoup.html +3 -3
  64. {lxml-6.0.2 → lxml-6.0.3}/doc/html/extensions.html +5 -5
  65. {lxml-6.0.2 → lxml-6.0.3}/doc/html/html5parser.html +5 -5
  66. {lxml-6.0.2 → lxml-6.0.3}/doc/html/index.html +7 -6
  67. {lxml-6.0.2 → lxml-6.0.3}/doc/html/installation.html +5 -5
  68. {lxml-6.0.2 → lxml-6.0.3}/doc/html/intro.html +3 -3
  69. {lxml-6.0.2 → lxml-6.0.3}/doc/html/lxml-source-howto.html +6 -6
  70. {lxml-6.0.2 → lxml-6.0.3}/doc/html/lxmlhtml.html +13 -13
  71. {lxml-6.0.2 → lxml-6.0.3}/doc/html/objectify.html +11 -11
  72. {lxml-6.0.2 → lxml-6.0.3}/doc/html/parsing.html +5 -5
  73. {lxml-6.0.2 → lxml-6.0.3}/doc/html/performance.html +4 -4
  74. {lxml-6.0.2 → lxml-6.0.3}/doc/html/resolvers.html +5 -5
  75. {lxml-6.0.2 → lxml-6.0.3}/doc/html/sax.html +5 -5
  76. {lxml-6.0.2 → lxml-6.0.3}/doc/html/sitemap.html +1 -1
  77. {lxml-6.0.2 → lxml-6.0.3}/doc/html/tutorial.html +6 -7
  78. {lxml-6.0.2 → lxml-6.0.3}/doc/html/validation.html +9 -9
  79. {lxml-6.0.2 → lxml-6.0.3}/doc/html/xpathxslt.html +4 -15
  80. {lxml-6.0.2 → lxml-6.0.3}/doc/html5parser.txt +2 -2
  81. {lxml-6.0.2 → lxml-6.0.3}/doc/lxml-source-howto.txt +3 -3
  82. {lxml-6.0.2 → lxml-6.0.3}/doc/lxmlhtml.txt +10 -10
  83. {lxml-6.0.2 → lxml-6.0.3}/doc/main.txt +8 -4
  84. {lxml-6.0.2 → lxml-6.0.3}/doc/memorymanagement.txt +3 -3
  85. {lxml-6.0.2 → lxml-6.0.3}/doc/objectify.txt +8 -8
  86. {lxml-6.0.2 → lxml-6.0.3}/doc/parsing.txt +3 -3
  87. {lxml-6.0.2 → lxml-6.0.3}/doc/performance.txt +1 -1
  88. {lxml-6.0.2 → lxml-6.0.3}/doc/resolvers.txt +2 -2
  89. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/lxml-ep2008.html +2 -2
  90. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/lxml-ep2008.txt +1 -1
  91. {lxml-6.0.2 → lxml-6.0.3}/doc/sax.txt +2 -2
  92. {lxml-6.0.2 → lxml-6.0.3}/doc/tutorial.txt +3 -3
  93. {lxml-6.0.2 → lxml-6.0.3}/doc/validation.txt +6 -6
  94. {lxml-6.0.2 → lxml-6.0.3}/doc/xpathxslt.txt +1 -3
  95. {lxml-6.0.2 → lxml-6.0.3}/pyproject.toml +2 -2
  96. lxml-6.0.3/requirements.txt +1 -0
  97. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/__init__.py +1 -1
  98. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/_elementpath.c +2520 -2400
  99. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/apihelpers.pxi +12 -5
  100. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/builder.c +2193 -2156
  101. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/docloader.pxi +1 -0
  102. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/etree.c +33600 -36131
  103. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/etree.h +7 -7
  104. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/etree.pyx +8 -3
  105. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/etree_api.h +73 -63
  106. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/extensions.pxi +10 -2
  107. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_difflib.c +5285 -5992
  108. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/clean.py +1 -1
  109. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/diff.c +3718 -4098
  110. lxml-6.0.3/src/lxml/includes/lxml-version.h +3 -0
  111. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/lxml.etree.h +7 -7
  112. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/lxml.etree_api.h +73 -63
  113. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/objectify.c +3968 -4141
  114. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/objectify.pyx +3 -3
  115. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/parser.pxi +14 -4
  116. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/proxy.pxi +3 -1
  117. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/public-api.pxi +10 -10
  118. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/python.pxd +3 -2
  119. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/readonlytree.pxi +4 -4
  120. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/sax.c +2254 -2169
  121. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/saxparser.pxi +1 -1
  122. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_http_io.py +3 -2
  123. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_nsclasses.py +11 -4
  124. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_objectify.py +15 -12
  125. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_unicode.py +1 -1
  126. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xmlerror.pxi +6 -2
  127. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xslt.pxi +7 -5
  128. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/PKG-INFO +14 -12
  129. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/SOURCES.txt +3 -1
  130. {lxml-6.0.2 → lxml-6.0.3}/tools/pypistats.py +1 -1
  131. lxml-6.0.2/doc/html/apidoc/_static/language_data.js +0 -192
  132. lxml-6.0.2/doc/html/apidoc/objects.inv +0 -0
  133. lxml-6.0.2/doc/html/apidoc/searchindex.js +0 -1
  134. lxml-6.0.2/requirements.txt +0 -1
  135. lxml-6.0.2/src/lxml/includes/lxml-version.h +0 -3
  136. {lxml-6.0.2 → lxml-6.0.3}/CREDITS.txt +0 -0
  137. {lxml-6.0.2 → lxml-6.0.3}/LICENSE.txt +0 -0
  138. {lxml-6.0.2 → lxml-6.0.3}/LICENSES.txt +0 -0
  139. {lxml-6.0.2 → lxml-6.0.3}/MANIFEST.in +0 -0
  140. {lxml-6.0.2 → lxml-6.0.3}/Makefile +0 -0
  141. {lxml-6.0.2 → lxml-6.0.3}/TODO.txt +0 -0
  142. {lxml-6.0.2 → lxml-6.0.3}/benchmark/bench_etree.py +0 -0
  143. {lxml-6.0.2 → lxml-6.0.3}/benchmark/bench_objectify.py +0 -0
  144. {lxml-6.0.2 → lxml-6.0.3}/benchmark/bench_xpath.py +0 -0
  145. {lxml-6.0.2 → lxml-6.0.3}/benchmark/bench_xslt.py +0 -0
  146. {lxml-6.0.2 → lxml-6.0.3}/benchmark/benchbase.py +0 -0
  147. {lxml-6.0.2 → lxml-6.0.3}/benchmark/run_benchmarks.py +0 -0
  148. {lxml-6.0.2 → lxml-6.0.3}/doc/api/Makefile +0 -0
  149. {lxml-6.0.2 → lxml-6.0.3}/doc/api/conf.py +0 -0
  150. {lxml-6.0.2 → lxml-6.0.3}/doc/cssselect.txt +0 -0
  151. {lxml-6.0.2 → lxml-6.0.3}/doc/docstructure.py +0 -0
  152. {lxml-6.0.2 → lxml-6.0.3}/doc/elementsoup.txt +0 -0
  153. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/index.rst.txt +0 -0
  154. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.ElementInclude.rst.txt +0 -0
  155. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml._elementpath.rst.txt +0 -0
  156. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.builder.rst.txt +0 -0
  157. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.cssselect.rst.txt +0 -0
  158. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.doctestcompare.rst.txt +0 -0
  159. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.etree.rst.txt +0 -0
  160. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.ElementSoup.rst.txt +0 -0
  161. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.builder.rst.txt +0 -0
  162. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.clean.rst.txt +0 -0
  163. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.defs.rst.txt +0 -0
  164. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.diff.rst.txt +0 -0
  165. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.formfill.rst.txt +0 -0
  166. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.html5parser.rst.txt +0 -0
  167. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.rst.txt +0 -0
  168. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.html.soupparser.rst.txt +0 -0
  169. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.isoschematron.rst.txt +0 -0
  170. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.objectify.rst.txt +0 -0
  171. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.rst.txt +0 -0
  172. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_sources/lxml.sax.rst.txt +0 -0
  173. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  174. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/basic.css +0 -0
  175. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/css/badge_only.css +0 -0
  176. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/documentation_options.js +0 -0
  177. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/file.png +0 -0
  178. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/jquery.js +0 -0
  179. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/js/badge_only.js +0 -0
  180. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/js/theme.js +0 -0
  181. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/js/versions.js +0 -0
  182. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/minus.png +0 -0
  183. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/plus.png +0 -0
  184. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/pygments.css +0 -0
  185. {lxml-6.0.2 → lxml-6.0.3}/doc/html/apidoc/_static/python-xml.png +0 -0
  186. {lxml-6.0.2 → lxml-6.0.3}/doc/html/paypal_btn_donateCC_LG.png +0 -0
  187. {lxml-6.0.2 → lxml-6.0.3}/doc/html/proxies.png +0 -0
  188. {lxml-6.0.2 → lxml-6.0.3}/doc/html/pubkey.asc +0 -0
  189. {lxml-6.0.2 → lxml-6.0.3}/doc/html/python-xml-title.png +0 -0
  190. {lxml-6.0.2 → lxml-6.0.3}/doc/html/python-xml.png +0 -0
  191. {lxml-6.0.2 → lxml-6.0.3}/doc/html/style.css +0 -0
  192. {lxml-6.0.2 → lxml-6.0.3}/doc/html/tagpython-big.png +0 -0
  193. {lxml-6.0.2 → lxml-6.0.3}/doc/intro.txt +0 -0
  194. {lxml-6.0.2 → lxml-6.0.3}/doc/licenses/BSD.txt +0 -0
  195. {lxml-6.0.2 → lxml-6.0.3}/doc/licenses/GPL.txt +0 -0
  196. {lxml-6.0.2 → lxml-6.0.3}/doc/licenses/elementtree.txt +0 -0
  197. {lxml-6.0.2 → lxml-6.0.3}/doc/lxml.mgp +0 -0
  198. {lxml-6.0.2 → lxml-6.0.3}/doc/lxml2.txt +0 -0
  199. {lxml-6.0.2 → lxml-6.0.3}/doc/mkhtml.py +0 -0
  200. {lxml-6.0.2 → lxml-6.0.3}/doc/mklatex.py +0 -0
  201. {lxml-6.0.2 → lxml-6.0.3}/doc/pubkey.asc +0 -0
  202. {lxml-6.0.2 → lxml-6.0.3}/doc/rest2html.py +0 -0
  203. {lxml-6.0.2 → lxml-6.0.3}/doc/rest2latex.py +0 -0
  204. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/Makefile +0 -0
  205. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ep2008/atom-example.xml +0 -0
  206. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ep2008/atom.py +0 -0
  207. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ep2008/atom.rng +0 -0
  208. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ep2008/atomgen.py +0 -0
  209. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ep2008/proxies.png +0 -0
  210. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/rst2s5.py +0 -0
  211. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/blank.gif +0 -0
  212. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/bodybg.gif +0 -0
  213. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/framing.css +0 -0
  214. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/iepngfix.htc +0 -0
  215. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/lxml-logo64.png +0 -0
  216. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/opera.css +0 -0
  217. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/outline.css +0 -0
  218. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/pretty.css +0 -0
  219. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/print.css +0 -0
  220. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/s5-core.css +0 -0
  221. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/slides.css +0 -0
  222. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/slides.js +0 -0
  223. {lxml-6.0.2 → lxml-6.0.3}/doc/s5/ui/default/tagpython.png +0 -0
  224. {lxml-6.0.2 → lxml-6.0.3}/doc/test.xml +0 -0
  225. {lxml-6.0.2 → lxml-6.0.3}/doc/update_performance_results.py +0 -0
  226. {lxml-6.0.2 → lxml-6.0.3}/doc/valgrind.txt +0 -0
  227. {lxml-6.0.2 → lxml-6.0.3}/samples/simple-ns.xml +0 -0
  228. {lxml-6.0.2 → lxml-6.0.3}/samples/simple.xml +0 -0
  229. {lxml-6.0.2 → lxml-6.0.3}/setup.cfg +0 -0
  230. {lxml-6.0.2 → lxml-6.0.3}/setup.py +0 -0
  231. {lxml-6.0.2 → lxml-6.0.3}/setupinfo.py +0 -0
  232. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/ElementInclude.py +0 -0
  233. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/__init__.pxd +0 -0
  234. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/_elementpath.py +0 -0
  235. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/builder.pxd +0 -0
  236. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/builder.py +0 -0
  237. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/classlookup.pxi +0 -0
  238. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/cleanup.pxi +0 -0
  239. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/cssselect.py +0 -0
  240. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/cvarargs.pxd +0 -0
  241. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/debug.pxi +0 -0
  242. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/doctestcompare.py +0 -0
  243. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/dtd.pxi +0 -0
  244. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/ElementSoup.py +0 -0
  245. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/__init__.py +0 -0
  246. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_diffcommand.py +0 -0
  247. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_difflib.pxd +0 -0
  248. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_difflib.py +0 -0
  249. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_html5builder.py +0 -0
  250. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/_setmixin.py +0 -0
  251. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/builder.py +0 -0
  252. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/defs.py +0 -0
  253. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/diff.py +0 -0
  254. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/formfill.py +0 -0
  255. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/html5parser.py +0 -0
  256. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/soupparser.py +0 -0
  257. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/__init__.py +0 -0
  258. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_applet.data +0 -0
  259. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_blink.data +0 -0
  260. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_crazy.data +0 -0
  261. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_embed.data +0 -0
  262. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_frame.data +0 -0
  263. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_iframe.data +0 -0
  264. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_link.data +0 -0
  265. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_meta.data +0 -0
  266. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_object.data +0 -0
  267. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onabort.data +0 -0
  268. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onblur.data +0 -0
  269. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onchange.data +0 -0
  270. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onclick.data +0 -0
  271. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_ondblclick.data +0 -0
  272. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onerror.data +0 -0
  273. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onfocus.data +0 -0
  274. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onkeydown.data +0 -0
  275. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onkeypress.data +0 -0
  276. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onkeyup.data +0 -0
  277. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onload.data +0 -0
  278. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onmousedown.data +0 -0
  279. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onmouseout.data +0 -0
  280. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onmouseover.data +0 -0
  281. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onmouseup.data +0 -0
  282. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onreset.data +0 -0
  283. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onresize.data +0 -0
  284. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onsubmit.data +0 -0
  285. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_onunload.data +0 -0
  286. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_script.data +0 -0
  287. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_script_cdata.data +0 -0
  288. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_script_inline.data +0 -0
  289. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/feedparser-data/entry_content_style.data +0 -0
  290. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/background-image-with-unicoded.data +0 -0
  291. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/downlevel-hidden.data +0 -0
  292. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/html-plus-time.data +0 -0
  293. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/javascript-link.data +0 -0
  294. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/style-comment.data +0 -0
  295. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/style-expression.data +0 -0
  296. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/style-import.data +0 -0
  297. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/style-js-tag.data +0 -0
  298. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/style-url-js.data +0 -0
  299. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/xml-data-island.data +0 -0
  300. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/hackers-org-data/xml-embedded-js.data +0 -0
  301. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_basic.py +0 -0
  302. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_basic.txt +0 -0
  303. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_diff.py +0 -0
  304. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_diff.txt +0 -0
  305. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_elementsoup.py +0 -0
  306. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_feedparser_data.py +0 -0
  307. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_formfill.py +0 -0
  308. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_formfill.txt +0 -0
  309. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_forms.py +0 -0
  310. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_forms.txt +0 -0
  311. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_frames.py +0 -0
  312. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_html5parser.py +0 -0
  313. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_rewritelinks.py +0 -0
  314. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_rewritelinks.txt +0 -0
  315. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_select.py +0 -0
  316. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_xhtml.py +0 -0
  317. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/test_xhtml.txt +0 -0
  318. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/tests/transform_feedparser_data.py +0 -0
  319. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/html/usedoctest.py +0 -0
  320. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/__init__.pxd +0 -0
  321. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/__init__.py +0 -0
  322. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/c14n.pxd +0 -0
  323. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/config.pxd +0 -0
  324. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/dtdvalid.pxd +0 -0
  325. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/etree_defs.h +0 -0
  326. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/etreepublic.pxd +0 -0
  327. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/htmlparser.pxd +0 -0
  328. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/relaxng.pxd +0 -0
  329. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/schematron.pxd +0 -0
  330. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/tree.pxd +0 -0
  331. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/uri.pxd +0 -0
  332. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xinclude.pxd +0 -0
  333. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xmlerror.pxd +0 -0
  334. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xmlparser.pxd +0 -0
  335. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xmlschema.pxd +0 -0
  336. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xpath.pxd +0 -0
  337. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/includes/xslt.pxd +0 -0
  338. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/__init__.py +0 -0
  339. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/rng/iso-schematron.rng +0 -0
  340. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl +0 -0
  341. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl +0 -0
  342. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl +0 -0
  343. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl +0 -0
  344. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl +0 -0
  345. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl +0 -0
  346. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl +0 -0
  347. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt +0 -0
  348. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/iterparse.pxi +0 -0
  349. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/lxml_endian.h +0 -0
  350. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/nsclasses.pxi +0 -0
  351. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/objectpath.pxi +0 -0
  352. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/parsertarget.pxi +0 -0
  353. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/pyclasslookup.py +0 -0
  354. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/relaxng.pxi +0 -0
  355. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/sax.pxd +0 -0
  356. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/sax.py +0 -0
  357. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/schematron.pxi +0 -0
  358. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/serializer.pxi +0 -0
  359. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/__init__.py +0 -0
  360. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nComment.xml +0 -0
  361. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nDefault.xml +0 -0
  362. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nPrefix.xml +0 -0
  363. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nPrefixQname.xml +0 -0
  364. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nPrefixQnameXpathElem.xml +0 -0
  365. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nQname.xml +0 -0
  366. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nQnameElem.xml +0 -0
  367. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nQnameXpathElem.xml +0 -0
  368. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/c14nTrim.xml +0 -0
  369. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/doc.dtd +0 -0
  370. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N1.xml +0 -0
  371. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N2.xml +0 -0
  372. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N3.xml +0 -0
  373. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N4.xml +0 -0
  374. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N5.xml +0 -0
  375. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inC14N6.xml +0 -0
  376. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsContent.xml +0 -0
  377. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsDefault.xml +0 -0
  378. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsPushdown.xml +0 -0
  379. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsRedecl.xml +0 -0
  380. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsSort.xml +0 -0
  381. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsSuperfluous.xml +0 -0
  382. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/inNsXml.xml +0 -0
  383. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N1_c14nComment.xml +0 -0
  384. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N1_c14nDefault.xml +0 -0
  385. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N2_c14nDefault.xml +0 -0
  386. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N2_c14nTrim.xml +0 -0
  387. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N3_c14nDefault.xml +0 -0
  388. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N3_c14nPrefix.xml +0 -0
  389. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N3_c14nTrim.xml +0 -0
  390. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N4_c14nDefault.xml +0 -0
  391. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N4_c14nTrim.xml +0 -0
  392. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N5_c14nDefault.xml +0 -0
  393. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N5_c14nTrim.xml +0 -0
  394. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inC14N6_c14nDefault.xml +0 -0
  395. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsContent_c14nDefault.xml +0 -0
  396. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsContent_c14nPrefixQnameXpathElem.xml +0 -0
  397. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsContent_c14nQnameElem.xml +0 -0
  398. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsContent_c14nQnameXpathElem.xml +0 -0
  399. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsDefault_c14nDefault.xml +0 -0
  400. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsDefault_c14nPrefix.xml +0 -0
  401. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsPushdown_c14nDefault.xml +0 -0
  402. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsPushdown_c14nPrefix.xml +0 -0
  403. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsRedecl_c14nDefault.xml +0 -0
  404. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsRedecl_c14nPrefix.xml +0 -0
  405. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsSort_c14nDefault.xml +0 -0
  406. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsSort_c14nPrefix.xml +0 -0
  407. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsSuperfluous_c14nDefault.xml +0 -0
  408. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsSuperfluous_c14nPrefix.xml +0 -0
  409. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsXml_c14nDefault.xml +0 -0
  410. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsXml_c14nPrefix.xml +0 -0
  411. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsXml_c14nPrefixQname.xml +0 -0
  412. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/out_inNsXml_c14nQname.xml +0 -0
  413. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/c14n-20/world.txt +0 -0
  414. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/common_imports.py +0 -0
  415. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/dummy_http_server.py +0 -0
  416. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/fuzz_xml_parse.py +0 -0
  417. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/include/test_xinclude.xml +0 -0
  418. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/selftest.py +0 -0
  419. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/selftest2.py +0 -0
  420. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/shakespeare.html +0 -0
  421. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test-document.xslt +0 -0
  422. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test-string.xml +0 -0
  423. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test.dtd +0 -0
  424. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test.rnc +0 -0
  425. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test.sch +0 -0
  426. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test.xml +0 -0
  427. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test.xsd +0 -0
  428. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test1.rng +0 -0
  429. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test1.xslt +0 -0
  430. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test2.rng +0 -0
  431. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test2.xslt +0 -0
  432. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_annotations.py +0 -0
  433. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_broken.xml +0 -0
  434. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_builder.py +0 -0
  435. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_classlookup.py +0 -0
  436. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_css.py +0 -0
  437. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_doctestcompare.py +0 -0
  438. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_dtd.py +0 -0
  439. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_elementpath.py +0 -0
  440. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_elementtree.py +0 -0
  441. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_errors.py +0 -0
  442. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_etree.py +0 -0
  443. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_external_document.py +0 -0
  444. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_htmlparser.py +0 -0
  445. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_import.xsd +0 -0
  446. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_inc.xsd +0 -0
  447. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_incremental_xmlfile.py +0 -0
  448. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_io.py +0 -0
  449. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_isoschematron.py +0 -0
  450. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_pyclasslookup.py +0 -0
  451. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_relaxng.py +0 -0
  452. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_sax.py +0 -0
  453. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_schematron.py +0 -0
  454. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_threading.py +0 -0
  455. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_xmlschema.py +0 -0
  456. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_xpathevaluator.py +0 -0
  457. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/tests/test_xslt.py +0 -0
  458. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/usedoctest.py +0 -0
  459. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xinclude.pxi +0 -0
  460. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xmlid.pxi +0 -0
  461. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xmlschema.pxi +0 -0
  462. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xpath.pxi +0 -0
  463. {lxml-6.0.2 → lxml-6.0.3}/src/lxml/xsltext.pxi +0 -0
  464. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/dependency_links.txt +0 -0
  465. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/not-zip-safe +0 -0
  466. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/requires.txt +0 -0
  467. {lxml-6.0.2 → lxml-6.0.3}/src/lxml.egg-info/top_level.txt +0 -0
  468. {lxml-6.0.2 → lxml-6.0.3}/test.py +0 -0
  469. {lxml-6.0.2 → lxml-6.0.3}/tools/manylinux/build-wheels.sh +0 -0
  470. {lxml-6.0.2 → lxml-6.0.3}/tools/xpathgrep.py +0 -0
  471. {lxml-6.0.2 → lxml-6.0.3}/update-error-constants.py +0 -0
  472. {lxml-6.0.2 → lxml-6.0.3}/versioninfo.py +0 -0
@@ -2,6 +2,34 @@
2
2
  lxml changelog
3
3
  ==============
4
4
 
5
+ 6.0.3 (2026-04-09)
6
+ ==================
7
+
8
+ Bugs fixed
9
+ ----------
10
+
11
+ * Several out of memory error cases now raise ``MemoryError`` that were not handled before.
12
+
13
+ * Slicing with large step values (outside of ``+/- sys.maxsize``) could trigger undefined C behaviour.
14
+
15
+ * LP#2125399: Some failing tests were fixed or disabled in PyPy.
16
+
17
+ * LP#2138421: Memory leak in error cases when setting the ``public_id`` or ``system_url`` of a document.
18
+
19
+ * Memory leak in case of a memory allocation failure when copying document subtrees.
20
+
21
+ * When mapping an XPath result to Python failed, the result memory could leak.
22
+
23
+ * When preparing an XSLT transform failed, the XSLT parameter memory could leak.
24
+
25
+ Other changes
26
+ -------------
27
+
28
+ * Built using Cython 3.2.4.
29
+
30
+ * Binary wheels use zlib 1.3.2.
31
+
32
+
5
33
  6.0.2 (2025-09-21)
6
34
  ==================
7
35
 
@@ -2451,7 +2479,7 @@ Bugs fixed
2451
2479
  * When an open file-like object is passed into ``parse()`` or
2452
2480
  ``iterparse()``, the parser will no longer close it after use. This
2453
2481
  reverts a change in lxml 2.3 where all files would be closed. It is
2454
- the users responsibility to properly close the file(-like) object,
2482
+ the user's responsibility to properly close the file(-like) object,
2455
2483
  also in error cases.
2456
2484
 
2457
2485
  * Assertion error in lxml.html.cleaner when discarding top-level elements.
@@ -3106,7 +3134,7 @@ Features added
3106
3134
 
3107
3135
  * lxml.etree now tries to find the absolute path name of files when
3108
3136
  parsing from a file-like object. This helps custom resolvers when
3109
- resolving relative URLs, as lixbml2 can prepend them with the path
3137
+ resolving relative URLs, as libxml2 can prepend them with the path
3110
3138
  of the source document.
3111
3139
 
3112
3140
  Bugs fixed
@@ -4068,7 +4096,7 @@ Bugs fixed
4068
4096
  Features added
4069
4097
  --------------
4070
4098
 
4071
- * Module ``lxml.pyclasslookup`` module implements an Element class lookup
4099
+ * The ``lxml.pyclasslookup`` module implements an Element class lookup
4072
4100
  scheme that can access the entire tree in read-only mode to help determining
4073
4101
  a suitable Element class
4074
4102
 
@@ -70,7 +70,7 @@ build dependencies of the provided lxml package, e.g.
70
70
 
71
71
  ::
72
72
 
73
- sudo apt-get install build-dep python3-lxml
73
+ sudo apt-get build-dep python3-lxml
74
74
 
75
75
 
76
76
  Installation
@@ -193,7 +193,7 @@ packages, too.
193
193
  Source builds on MS Windows
194
194
  ---------------------------
195
195
 
196
- Most MS Windows systems lack the necessarily tools to build software,
196
+ Most MS Windows systems lack the necessary tools to build software,
197
197
  starting with a C compiler already. Microsoft leaves it to users to
198
198
  install and configure them, which is usually not trivial and means
199
199
  that distributors cannot rely on these dependencies being available
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lxml
3
- Version: 6.0.2
3
+ Version: 6.0.3
4
4
  Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
5
5
  Home-page: https://lxml.de/
6
6
  Author: lxml dev team
@@ -75,29 +75,31 @@ Running ``pip install https://github.com/lxml/lxml/archive/refs/heads/lxml-6.0.t
75
75
  will install the unreleased branch state as soon as a maintenance branch has been established.
76
76
  Note that this requires Cython to be installed at an appropriate version for the build.
77
77
 
78
- 6.0.2 (2025-09-21)
78
+ 6.0.3 (2026-04-09)
79
79
  ==================
80
80
 
81
81
  Bugs fixed
82
82
  ----------
83
83
 
84
- * LP#2125278: Compilation with libxml2 2.15.0 failed.
85
- Original patch by Xi Ruoyao.
84
+ * Several out of memory error cases now raise ``MemoryError`` that were not handled before.
86
85
 
87
- * Setting ``decompress=True`` in the parser had no effect in libxml2 2.15.
86
+ * Slicing with large step values (outside of ``+/- sys.maxsize``) could trigger undefined C behaviour.
88
87
 
89
- * Binary wheels on Linux and macOS use the library version libxml2 2.14.6.
90
- See https://gitlab.gnome.org/GNOME/libxml2/-/releases/v2.14.6
88
+ * LP#2125399: Some failing tests were fixed or disabled in PyPy.
91
89
 
92
- * Test failures in libxml2 2.15.0 were fixed.
90
+ * LP#2138421: Memory leak in error cases when setting the ``public_id`` or ``system_url`` of a document.
91
+
92
+ * Memory leak in case of a memory allocation failure when copying document subtrees.
93
+
94
+ * When mapping an XPath result to Python failed, the result memory could leak.
95
+
96
+ * When preparing an XSLT transform failed, the XSLT parameter memory could leak.
93
97
 
94
98
  Other changes
95
99
  -------------
96
100
 
97
- * Binary wheels for Py3.9-3.11 on the ``riscv64`` architecture were added.
98
-
99
- * Error constants were updated to match libxml2 2.15.0.
101
+ * Built using Cython 3.2.4.
100
102
 
101
- * Built using Cython 3.1.4.
103
+ * Binary wheels use zlib 1.3.2.
102
104
 
103
105
 
@@ -8,7 +8,7 @@ For an introduction and further documentation, see `doc/main.txt`_.
8
8
 
9
9
  For installation information, see `INSTALL.txt`_.
10
10
 
11
- For issue tracker, see https://bugs.launchpad.net/lxml
11
+ For the issue tracker, see https://bugs.launchpad.net/lxml
12
12
 
13
13
  Support the project
14
14
  -------------------
@@ -1,12 +1,17 @@
1
+ import hashlib
1
2
  import json
2
- import os, re, sys, platform
3
+ import os
4
+ import platform
5
+ import re
6
+ import sys
3
7
  import tarfile
4
8
  import time
5
9
  from contextlib import closing
6
10
  from ftplib import FTP
11
+ from pathlib import Path
7
12
 
8
13
  import urllib.error
9
- from urllib.parse import urljoin, unquote, urlparse
14
+ from urllib.parse import urljoin, quote as urlquote, unquote, urlparse
10
15
  from urllib.request import urlretrieve, urlopen, Request
11
16
 
12
17
  multi_make_options = []
@@ -44,25 +49,6 @@ def read_file_digest(file):
44
49
 
45
50
 
46
51
  def download_and_extract_windows_binaries(destdir):
47
- url = "https://api.github.com/repos/lxml/libxml2-win-binaries/releases?per_page=5"
48
- releases, _ = read_url(
49
- url,
50
- accept="application/vnd.github+json",
51
- as_json=True,
52
- github_api_token=os.environ.get("GITHUB_API_TOKEN"),
53
- )
54
-
55
- max_release = {'tag_name': ''}
56
- for release in releases:
57
- if max_release['tag_name'] < release.get('tag_name', ''):
58
- max_release = release
59
-
60
- url = "https://github.com/lxml/libxml2-win-binaries/releases/download/%s/" % max_release['tag_name']
61
- asset_files = {
62
- asset['name']: (asset['size'], asset['digest'])
63
- for asset in max_release.get('assets', ())
64
- }
65
-
66
52
  # Check for native ARM64 build or the environment variable that is set by
67
53
  # Visual Studio for cross-compilation (same variable as setuptools uses)
68
54
  if platform.machine() == 'ARM64' or os.getenv('VSCMD_ARG_TGT_ARCH') == 'arm64':
@@ -72,47 +58,68 @@ def download_and_extract_windows_binaries(destdir):
72
58
  else:
73
59
  arch = "win32"
74
60
 
75
- arch_part = '.' + arch + '.'
61
+ def build_libzip_name(libname, version):
62
+ return f"{libname}-{version}.{arch}.zip"
63
+
64
+ def read_latest_release():
65
+ url = "https://api.github.com/repos/lxml/libxml2-win-binaries/releases?per_page=5"
66
+ releases, _ = read_url(
67
+ url,
68
+ accept="application/vnd.github+json",
69
+ as_json=True,
70
+ github_api_token=os.environ.get("GITHUB_API_TOKEN"),
71
+ )
72
+
73
+ max_release = {'tag_name': ''}
74
+ for release in releases:
75
+ if max_release['tag_name'] < release.get('tag_name', ''):
76
+ max_release = release
77
+
78
+ return max_release
79
+
80
+ latest_release = read_latest_release()
81
+
82
+ release_tag = latest_release['tag_name']
83
+ download_url = f"https://github.com/lxml/libxml2-win-binaries/releases/download/{urlquote(release_tag)}/"
84
+
85
+ arch_part = f'.{arch}.'
76
86
  asset_files = {
77
- filename: details
78
- for filename, details in asset_files.items()
79
- if arch_part in filename
87
+ asset['name']: (asset['size'], asset['digest'])
88
+ for asset in latest_release.get('assets', ())
89
+ if arch_part in asset['name']
80
90
  }
81
91
 
82
- libs = {}
83
- for libname in ['libxml2', 'libxslt', 'zlib', 'iconv']:
84
- libs[libname] = "%s-%s.%s.zip" % (
85
- libname,
86
- find_max_version(libname, list(asset_files)),
87
- arch,
88
- )
92
+ lib_file_names = list(asset_files)
93
+ libs = {
94
+ libname: build_libzip_name(libname, find_max_version(libname, lib_file_names))
95
+ for libname in ['libxml2', 'libxslt', 'zlib', 'iconv']
96
+ }
89
97
 
90
98
  if not os.path.exists(destdir):
91
99
  os.makedirs(destdir)
92
100
 
93
- for libname, libfn in libs.items():
94
- srcfile = urljoin(url, libfn)
101
+ for libfn in libs.values():
102
+ srcfile = urljoin(download_url, libfn)
95
103
  destfile = os.path.join(destdir, libfn)
96
104
  if os.path.exists(destfile):
97
105
  file_size, file_digest = asset_files.get(libfn, (None, None))
98
106
  if file_size and os.path.getsize(destfile) == file_size and read_file_digest(destfile) == file_digest:
99
- print('Using local copy of "{}"'.format(srcfile))
107
+ print(f'Using local copy of "{srcfile}"')
100
108
  continue
101
109
 
102
- print('Retrieving "%s" to "%s"' % (srcfile, destfile))
110
+ print(f'Retrieving "{srcfile}" to "{destfile}"')
103
111
  urlretrieve(srcfile, destfile)
104
112
 
105
- for libname, libfn in libs.items():
106
- destfile = os.path.join(destdir, libfn)
107
- d = unpack_zipfile(destfile, destdir)
108
- libs[libname] = d
109
-
110
- return libs
113
+ lib_dirs = {
114
+ libname: unpack_zipfile(os.path.join(destdir, libfn), destdir)
115
+ for libname, libfn in libs.items()
116
+ }
117
+ return lib_dirs
111
118
 
112
119
 
113
120
  def find_top_dir_of_zipfile(zipfile):
114
121
  topdir = None
115
- files = (f.filename for f in zipfile.filelist)
122
+ files = [f.filename for f in zipfile.filelist]
116
123
  dirs = [d for d in files if d.endswith('/')]
117
124
  if dirs:
118
125
  dirs.sort(key=len)
@@ -277,6 +284,27 @@ def tryint(s):
277
284
  return s
278
285
 
279
286
 
287
+ ARCHIVE_HASHES = {
288
+ # Default hash algorithm is SHA-256.
289
+ # Prefix hash with e.g. "sha512:" for alternative algorithms.
290
+ filename: digest
291
+ for line in """
292
+ c8b9bc81f8b590c33af8cc6c336dbff2f53409973588a351c95f1c621b13d09d libxml2-2.15.2.tar.xz
293
+ 7ce458a0affeb83f0b55f1f4f9e0e55735dbfc1a9de124ee86fb4a66b597203a libxml2-2.14.6.tar.xz
294
+
295
+ 9acfe68419c4d06a45c550321b3212762d92f41465062ca4ea19e632ee5d216e libxslt-1.1.45.tar.xz
296
+ 5a3d6b383ca5afc235b171118e90f5ff6aa27e9fea3303065231a6d403f0183a libxslt-1.1.43.tar.xz
297
+
298
+ 88dd96a8c0464eca144fc791ae60cd31cd8ee78321e67397e25fc095c4a19aa6 libiconv-1.19.tar.gz
299
+ 3b08f5f4f9b4eb82f151a7040bfd6fe6c6fb922efe4b1659c66ea933276965e8 libiconv-1.18.tar.gz
300
+
301
+ bb329a0a2cd0274d05519d61c667c062e06990d72e125ee2dfa8de64f0119d16 zlib-1.3.2.tar.gz
302
+ """.strip().splitlines()
303
+ if len(line) > 64
304
+ for digest, filename in [line.split()]
305
+ }
306
+
307
+
280
308
  def download_libxml2(dest_dir, version=None):
281
309
  """Downloads libxml2, returning the filename where the library was downloaded"""
282
310
  #version_re = re.compile(r'LATEST_LIBXML2_IS_([0-9.]+[0-9](?:-[abrc0-9]+)?)')
@@ -328,18 +356,37 @@ def find_max_version(libname, filenames, version_re=None):
328
356
  match = version_re.search(fn)
329
357
  if match:
330
358
  version_string = match.group(1)
331
- versions.append((tuple(map(tryint, version_string.replace("-", ".-").split('.'))),
332
- version_string))
359
+ versions.append((
360
+ tuple(map(tryint, version_string.replace("-", ".-").split('.'))),
361
+ version_string,
362
+ ))
333
363
  if not versions:
334
364
  raise Exception(
335
365
  "Could not find the most current version of %s from the files: %s" % (
336
- libname, filenames))
366
+ libname, list(filenames)))
337
367
  versions.sort()
338
368
  version_string = versions[-1][-1]
339
369
  print('Latest version of %s is %s' % (libname, version_string))
340
370
  return version_string
341
371
 
342
372
 
373
+ def file_exists(file_path: Path, size=None, digest=None):
374
+ if not file_path.exists():
375
+ return False
376
+ if size is not None:
377
+ if file_path.stat().st_size != size:
378
+ return False
379
+ if digest is not None and hasattr(hashlib, 'file_digest'):
380
+ hash_alg = 'sha256'
381
+ if ':' in digest:
382
+ hash_alg, _, digest = digest.partition(':')
383
+ with file_path.open(mode='rb') as f:
384
+ file_digest = hashlib.file_digest(f, hash_alg)
385
+ if digest != file_digest.hexdigest():
386
+ return False
387
+ return True
388
+
389
+
343
390
  def download_library(dest_dir, location, name, version_re, filename, version=None):
344
391
  if version is None:
345
392
  try:
@@ -368,24 +415,31 @@ def download_library(dest_dir, location, name, version_re, filename, version=Non
368
415
  filename = filename % version
369
416
 
370
417
  full_url = urljoin(location, filename)
371
- dest_filename = os.path.join(dest_dir, filename)
372
- if os.path.exists(dest_filename):
373
- print(('Using existing %s downloaded into %s '
374
- '(delete this file if you want to re-download the package)') % (
375
- name, dest_filename))
376
- return dest_filename
377
-
378
- print('Downloading %s into %s from %s' % (name, dest_filename, full_url))
379
- try:
380
- urlretrieve(full_url, dest_filename)
381
- except urllib.error.URLError as exc:
382
- # retry once
383
- retry_after_seconds = 2
384
- print(f"Download failed: {exc}, retrying in {int(retry_after_seconds)} seconds…")
385
- time.sleep(retry_after_seconds)
386
- urlretrieve(full_url, dest_filename)
418
+ dest_filepath = Path(dest_dir) / filename
419
+ if file_exists(dest_filepath, digest=ARCHIVE_HASHES.get(filename)):
420
+ print(f'Using existing {name} downloaded into {dest_filepath} '
421
+ '(delete this file if you want to re-download the package)')
422
+ return dest_filepath
423
+
424
+ print('Downloading %s into %s from %s' % (name, dest_filepath, full_url))
425
+ for retry_after_seconds in (2, 5, 10, None):
426
+ try:
427
+ urlretrieve(full_url, dest_filepath)
428
+ except urllib.error.URLError as exc:
429
+ if retry_after_seconds is None:
430
+ print(f"Download failed: {exc}")
431
+ break
432
+ else:
433
+ print(f"Download failed: {exc}, retrying in {int(retry_after_seconds)} seconds…")
434
+ time.sleep(retry_after_seconds)
435
+ else:
436
+ if file_exists(dest_filepath, digest=ARCHIVE_HASHES.get(filename)):
437
+ return dest_filepath
438
+
439
+ if not file_exists(dest_filepath, digest=ARCHIVE_HASHES.get(filename)):
440
+ raise RuntimeError(f"File download of {filename} failed to write the correct file.")
387
441
 
388
- return dest_filename
442
+ return dest_filepath
389
443
 
390
444
 
391
445
  def unpack_tarball(tar_filename, dest) -> str:
@@ -656,7 +710,7 @@ def main(with_zlib=True, download_only=False, platform=None):
656
710
  if platform is None:
657
711
  platform = sys_platform
658
712
 
659
- if sys_platform.startswith('win'):
713
+ if platform.startswith('win'):
660
714
  return get_prebuilt_libxml2xslt(
661
715
  download_dir, static_include_dirs, static_library_dirs)
662
716
 
@@ -67,7 +67,7 @@ ElementTree_.
67
67
  7.5 How can I modify the tree during iteration?
68
68
 
69
69
 
70
- The code examples below use the `'lxml.etree`` module:
70
+ The code examples below use the ``lxml.etree`` module:
71
71
 
72
72
  .. sourcecode:: pycon
73
73
 
@@ -380,7 +380,7 @@ I'm glad you asked.
380
380
  Note that this beautiful quick-and-dirty converter expects children
381
381
  to have unique tag names and will silently overwrite any data that
382
382
  was contained in preceding siblings with the same name. For any
383
- real-world application of xml-to-dict conversion, you would better
383
+ real-world application of xml-to-dict conversion, you had better
384
384
  write your own, longer version of this.
385
385
 
386
386
 
@@ -484,7 +484,7 @@ Why do I get errors about missing UCS4 symbols when installing lxml?
484
484
 
485
485
  You are using a Python installation that was configured for a different
486
486
  internal Unicode representation than the lxml package you are trying to
487
- install. CPython versions before 3.3 allowed to switch between two types
487
+ install. CPython versions before 3.3 allowed switching between two types
488
488
  at build time: the 32 bit encoding UCS4 and the 16 bit encoding UCS2.
489
489
  Sadly, both are not compatible, so eggs and other binary distributions
490
490
  can only support the one they were compiled with.
@@ -550,7 +550,7 @@ subdirectories in the lxml source tree (below the ``src`` directory)
550
550
  and the ReST_ `text files`_ in the ``doc`` directory.
551
551
 
552
552
  We also have a `list of missing features`_ that we would like to
553
- implement but didn't due to lack if time. If *you* find the time,
553
+ implement but didn't due to lack of time. If *you* find the time,
554
554
  patches are very welcome.
555
555
 
556
556
  .. _ReST: http://docutils.sourceforge.net/rst.html
@@ -651,7 +651,7 @@ release you are using.
651
651
 
652
652
  .. _`current developer changelog`: https://github.com/lxml/lxml/blob/master/CHANGES.txt
653
653
 
654
- Also, the 'crash' section above has a few good advices what to try to see if
654
+ Also, the 'crash' section above has some good advice on what to try to see if
655
655
  the problem is really in lxml - and not in your setup. Believe it or not,
656
656
  that happens more often than you might think, especially when old libraries
657
657
  or even multiple library versions are installed.
@@ -720,7 +720,7 @@ the respective project, namely:
720
720
  On the other hand, everything that seems to be related to Python code,
721
721
  including custom resolvers, custom XPath functions, etc. is likely
722
722
  outside of the scope of libxml2/libxslt. If you encounter problems
723
- here or you are not sure where there the problem may come from, please
723
+ here or you are not sure where the problem may come from, please
724
724
  ask on the lxml mailing list first.
725
725
 
726
726
  In any case, a good explanation of the problem including some simple
@@ -869,7 +869,7 @@ for possible approaches to solve your specific problem:
869
869
  * compile lxml without threading support by running ``setup.py`` with the
870
870
  ``--without-threading`` option. While this might be slower in certain
871
871
  scenarios on multi-processor systems, it *might* also keep your application
872
- from crashing, which should be worth more to you than peek performance.
872
+ from crashing, which should be worth more to you than peak performance.
873
873
  Remember that lxml is fast anyway, so concurrency may not even be worth it.
874
874
 
875
875
  * look out for fancy XSLT stuff like foreign document access or
@@ -178,7 +178,7 @@ on an ElementTree use its explicit root node as reference.
178
178
  Iteration
179
179
  ---------
180
180
 
181
- The ElementTree API makes Elements iterable to supports iteration over their
181
+ The ElementTree API makes Elements iterable to support iteration over their
182
182
  children. Using the tree defined above, we get:
183
183
 
184
184
  .. sourcecode:: pycon
@@ -289,7 +289,7 @@ transformer object. See their documentation for details.
289
289
 
290
290
  However, lxml also keeps a global error log of all errors that occurred at the
291
291
  application level. Whenever an exception is raised, you can retrieve the
292
- errors that occurred and "might have" lead to the problem from the error log
292
+ errors that occurred and "might have" led to the problem from the error log
293
293
  copy attached to the exception:
294
294
 
295
295
  .. sourcecode:: pycon
@@ -325,7 +325,7 @@ error level:
325
325
  This might look a little cryptic at first, but it is the information that
326
326
  libxml2 gives you. At least the message at the end should give you a hint
327
327
  what went wrong and you can see that the fatal errors (FATAL) happened during
328
- parsing (PARSER) lines 4, column 8 and line 5, column 1 of a string (<string>,
328
+ parsing (PARSER) at line 4, column 8 and line 5, column 1 of a string (<string>,
329
329
  or the filename if available). Here, PARSER is the so-called error domain,
330
330
  see ``lxml.etree.ErrorDomains`` for that. You can get it from a log entry
331
331
  like this:
@@ -473,7 +473,7 @@ Incremental XML generation
473
473
  --------------------------
474
474
 
475
475
  Since version 3.1, lxml provides an ``xmlfile`` API for incrementally
476
- generating XML using the ``with`` statement. It's main purpose is to
476
+ generating XML using the ``with`` statement. Its main purpose is to
477
477
  freely and safely mix surrounding elements with pre-built in-memory
478
478
  trees, e.g. to write out large documents that consist mostly of
479
479
  repetitive subtrees (like database dumps). But it can be useful in
@@ -34,12 +34,12 @@ Cython versions, which may or may not generate correct code for lxml.
34
34
  The pre-generated release sources were tested and therefore are known
35
35
  to work.
36
36
 
37
- So, if you want a reliable build of lxml, we suggest to a) use a
38
- source release of lxml and b) disable or uninstall Cython for the
37
+ So, if you want a reliable build of lxml, we suggest a) using a
38
+ source release of lxml and b) disabling or uninstalling Cython for the
39
39
  build.
40
40
 
41
41
  *Only* if you are interested in building lxml from a checkout of the
42
- developer sources (e.g. to test a bug fix that has not been release
42
+ developer sources (e.g. to test a bug fix that has not been released
43
43
  yet) or if you want to be an lxml developer, then you do need a
44
44
  working Cython installation. You can use pip_ to install it::
45
45
 
@@ -255,7 +255,7 @@ install Unix/Linux style package management tools and new software, it
255
255
  actually seems to be hard to get libraries set up for exclusive usage
256
256
  that MacOS-X ships in an older version. Alternative distributions
257
257
  (like macports) install their libraries in addition to the system
258
- libraries, but the compiler and the runtime loader on MacOS still sees
258
+ libraries, but the compiler and the runtime loader on MacOS still see
259
259
  the system libraries before the new libraries. This can lead to
260
260
  undebuggable crashes where the newer library seems to be loaded but
261
261
  the older system library is used.
@@ -22,7 +22,7 @@ c-importable by extension modules implemented in Cython_.
22
22
  Passing generated trees through Python
23
23
  --------------------------------------
24
24
 
25
- This is the most simple way to integrate with lxml. It does not require
25
+ This is the simplest way to integrate with lxml. It does not require
26
26
  any C-level integration but uses a Python function to wrap an externally
27
27
  generated libxml2 document in lxml.
28
28
 
@@ -7,7 +7,7 @@ ElementTree. Nonetheless, some differences and incompatibilities exist:
7
7
 
8
8
  * Importing etree is obviously different; etree uses a lower-case
9
9
  package name, while ElementTree uses a combination of upper-case and
10
- lower case in imports:
10
+ lower-case in imports:
11
11
 
12
12
  .. sourcecode:: python
13
13
 
@@ -160,7 +160,7 @@ ElementTree. Nonetheless, some differences and incompatibilities exist:
160
160
  * ElementTree merges the target of a processing instruction into ``PI.text``,
161
161
  while lxml.etree puts it into the ``.target`` property and leaves it out of
162
162
  the ``.text`` property. The ``pi.text`` in ElementTree therefore
163
- correspondents to ``pi.target + " " + pi.text`` in lxml.etree.
163
+ corresponds to ``pi.target + " " + pi.text`` in lxml.etree.
164
164
 
165
165
  * Because etree is built on top of libxml2, which is namespace prefix aware,
166
166
  etree preserves namespaces declarations and prefixes while ElementTree tends
@@ -60,7 +60,7 @@ Element initialization
60
60
  ======================
61
61
 
62
62
  There is one thing to know up front. Element classes *must not* have
63
- an ``__init___`` or ``__new__`` method. There should not be any
63
+ an ``__init__`` or ``__new__`` method. There should not be any
64
64
  internal state either, except for the data stored in the underlying
65
65
  XML tree. Element instances are created and garbage collected at
66
66
  need, so there is normally no way to predict when and how often a
@@ -98,7 +98,7 @@ cache manually up to date if the tree changes, which can get tricky in
98
98
  cases.
99
99
 
100
100
  For proxy initialisation, ElementBase classes have an ``_init()``
101
- method that can be overridden, as oppose to the normal ``__init__()``
101
+ method that can be overridden, as opposed to the normal ``__init__()``
102
102
  method. It can be used to modify the XML tree, e.g. to construct
103
103
  special children or verify and update attributes.
104
104
 
@@ -121,7 +121,7 @@ The semantics of ``_init()`` are as follows:
121
121
  before running through the init process.
122
122
 
123
123
  * Any exceptions raised in ``_init()`` will be propagated through the API
124
- call that lead to the creation of the Element. So be careful with the code
124
+ call that led to the creation of the Element. So be careful with the code
125
125
  you write here as its exceptions may turn up in various unexpected places.
126
126
 
127
127
 
@@ -382,7 +382,7 @@ the elements in the tree have been instantiated as Python Element
382
382
  proxies.
383
383
 
384
384
  Luckily, there is a way to do this. The ``PythonElementClassLookup``
385
- works similar to the custom lookup scheme:
385
+ works similarly to the custom lookup scheme:
386
386
 
387
387
  .. sourcecode:: pycon
388
388
 
@@ -394,7 +394,7 @@ works similar to the custom lookup scheme:
394
394
  >>> parser.set_element_class_lookup(MyLookup())
395
395
 
396
396
  As before, the first argument to the ``lookup()`` method is the opaque
397
- document instance that contains the Element. The second arguments is a
397
+ document instance that contains the Element. The second argument is a
398
398
  lightweight Element proxy implementation that is only valid during the lookup.
399
399
  Do not try to keep a reference to it. Once the lookup is finished, the proxy
400
400
  will become invalid. You will get an ``AssertionError`` if you access any of
@@ -46,7 +46,7 @@ and extension elements in XSLT as in the following example:
46
46
  XPath Extension functions
47
47
  =========================
48
48
 
49
- Here is how an extension function looks like. As the first argument,
49
+ Here is what an extension function looks like. As the first argument,
50
50
  it always receives a context object (see below). The other arguments
51
51
  are provided by the respective call in the XPath expression, one in
52
52
  the following examples. Any number of arguments is allowed:
@@ -471,7 +471,7 @@ And then you can implement the element in Python like this:
471
471
  ... # just copy own content input to output
472
472
  ... output_parent.extend( list(self_node) )
473
473
 
474
- The arguments passed to the ``.execute()`` method are
474
+ The arguments passed to the ``.execute()`` method are
475
475
 
476
476
  context
477
477
  The opaque evaluation context. You need this when calling back