yarl-1.4.2/0000755000175100001650000000000013572034534012763 5ustar vstsdocker00000000000000yarl-1.4.2/CHANGES.rst0000644000175100001650000002006213572034522014562 0ustar vstsdocker00000000000000========= Changelog ========= .. You should *NOT* be adding new change log entries to this file, this file is managed by towncrier. You *may* edit previous change logs to fix problems like typo corrections or such. To add a new change log entry, please see https://pip.pypa.io/en/latest/development/#adding-a-news-entry we named the news folder "changes". WARNING: Don't drop the next directive! .. towncrier release notes start 1.4.1 (2019-11-29) ================== * Fix regression, make the library work on Python 3.5 and 3.6 again. 1.4.0 (2019-11-29) ================== * Distinguish an empty password in URL from a password not provided at all (#262) * Fixed annotations for optional parameters of ``URL.build`` (#309) * Use None as default value of ``user`` parameter of ``URL.build`` (#309) * Enforce building C Accelerated modules when installing from source tarball, use ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python implementation (#329) * Drop Python 3.5 support * Fix quoting of plus in path by pure python version (#339) * Don't create a new URL if fragment is unchanged (#292) * Included in error msg the path that produces starting slash forbidden error (#376) * Skip slow IDNA encoding for ASCII-only strings (#387) 1.3.0 (2018-12-11) ================== * Fix annotations for ``query`` parameter (#207) * An incoming query sequence can have int variables (the same as for Mapping type) (#208) * Add ``URL.explicit_port`` property (#218) * Give a friendlier error when port cant be converted to int (#168) * ``bool(URL())`` now returns ``False`` (#272) 1.2.6 (2018-06-14) ================== * Drop Python 3.4 trove classifier (#205) 1.2.5 (2018-05-23) ================== * Fix annotations for ``build`` (#199) 1.2.4 (2018-05-08) ================== * Fix annotations for ``cached_property`` (#195) 1.2.3 (2018-05-03) ================== * Accept ``str`` subclasses in ``URL`` constructor (#190) 1.2.2 (2018-05-01) ================== * Fix build 1.2.1 (2018-04-30) ================== * Pin minimal required Python to 3.5.3 (#189) 1.2.0 (2018-04-30) ================== * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171) * Support PEP-561 (provide type hinting marker) (#182) 1.1.1 (2018-02-17) ================== * Fix performance regression: don't encode enmpty netloc (#170) 1.1.0 (2018-01-21) ================== * Make pure Python quoter consistent with Cython version (#162) 1.0.0 (2018-01-15) ================== * Use fast path if quoted string does not need requoting (#154) * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155) * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155) * Add custom string writer, reuse static buffer if available (#157) Code is 50-80 times faster than Pure Python version (was 4-5 times faster) * Don't recode IP zone (#144) * Support ``encoded=True`` in ``yarl.URL.build()`` (#158) * Fix updating query with multiple keys (#160) 0.18.0 (2018-01-10) =================== * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152) 0.17.0 (2017-12-30) =================== * Use IDNA 2008 for domain name processing (#149) 0.16.0 (2017-12-07) =================== * Fix raising ``TypeError`` by ``url.query_string()`` after ``url.with_query({})`` (empty mapping) (#141) 0.15.0 (2017-11-23) =================== * Add ``raw_path_qs`` attribute (#137) 0.14.2 (2017-11-14) =================== * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote`` 0.14.1 (2017-11-13) =================== * Restore ``strict`` parameter as no-op for sake of compatibility with aiohttp 2.2 0.14.0 (2017-11-11) =================== * Drop strict mode (#123) * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124) 0.13.0 (2017-10-01) =================== * Document ``encoded`` parameter (#102) * Support relative urls like ``'?key=value'`` (#100) * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104) * Process passwords without user names (#95) 0.12.0 (2017-06-26) =================== * Properly support paths without leading slash in ``URL.with_path()`` (#90) * Enable type annotation checks 0.11.0 (2017-06-26) =================== * Normalize path (#86) * Clear query and fragment parts in ``.with_path()`` (#85) 0.10.3 (2017-06-13) =================== * Prevent double URL args unquoting (#83) 0.10.2 (2017-05-05) =================== * Unexpected hash behaviour (#75) 0.10.1 (2017-05-03) =================== * Unexpected compare behaviour (#73) * Do not quote or unquote + if not a query string. (#74) 0.10.0 (2017-03-14) =================== * Added ``URL.build`` class method (#58) * Added ``path_qs`` attribute (#42) 0.9.8 (2017-02-16) ================== * Do not quote ``:`` in path 0.9.7 (2017-02-16) ================== * Load from pickle without _cache (#56) * Percent-encoded pluses in path variables become spaces (#59) 0.9.6 (2017-02-15) ================== * Revert backward incompatible change (BaseURL) 0.9.5 (2017-02-14) ================== * Fix BaseURL rich comparison support 0.9.4 (2017-02-14) ================== * Use BaseURL 0.9.3 (2017-02-14) ================== * Added BaseURL 0.9.2 (2017-02-08) ================== * Remove debug print 0.9.1 (2017-02-07) ================== * Do not lose tail chars (#45) 0.9.0 (2017-02-07) ================== * Allow to quote ``%`` in non strict mode (#21) * Incorrect parsing of query parameters with %3B (;) inside (#34) * Fix core dumps (#41) * tmpbuf - compiling error (#43) * Added ``URL.update_path()`` method * Added ``URL.update_query()`` method (#47) 0.8.1 (2016-12-03) ================== * Fix broken aiohttp: revert back ``quote`` / ``unquote``. 0.8.0 (2016-12-03) ================== * Support more verbose error messages in ``.with_query()`` (#24) * Don't percent-encode ``@`` and ``:`` in path (#32) * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are part of private API 0.7.1 (2016-11-18) ================== * Accept not only ``str`` but all classes inherited from ``str`` also (#25) 0.7.0 (2016-11-07) ================== * Accept ``int`` as value for ``.with_query()`` 0.6.0 (2016-11-07) ================== * Explicitly use UTF8 encoding in setup.py (#20) * Properly unquote non-UTF8 strings (#19) 0.5.3 (2016-11-02) ================== * Don't use namedtuple fields but indexes on URL construction 0.5.2 (2016-11-02) ================== * Inline ``_encode`` class method 0.5.1 (2016-11-02) ================== * Make URL construction faster by removing extra classmethod calls 0.5.0 (2016-11-02) ================== * Add cython optimization for quoting/unquoting * Provide binary wheels 0.4.3 (2016-09-29) ================== * Fix typing stubs 0.4.2 (2016-09-29) ================== * Expose ``quote()`` and ``unquote()`` as public API 0.4.1 (2016-09-28) ================== * Support empty values in query (``'/path?arg'``) 0.4.0 (2016-09-27) ================== * Introduce ``relative()`` (#16) 0.3.2 (2016-09-27) ================== * Typo fixes #15 0.3.1 (2016-09-26) ================== * Support sequence of pairs as ``with_query()`` parameter 0.3.0 (2016-09-26) ================== * Introduce ``is_default_port()`` 0.2.1 (2016-09-26) ================== * Raise ValueError for URLs like 'http://:8080/' 0.2.0 (2016-09-18) ================== * Avoid doubling slashes when joining paths (#13) * Appending path starting from slash is forbidden (#12) 0.1.4 (2016-09-09) ================== * Add kwargs support for ``with_query()`` (#10) 0.1.3 (2016-09-07) ================== * Document ``with_query()``, ``with_fragment()`` and ``origin()`` * Allow ``None`` for ``with_query()`` and ``with_fragment()`` 0.1.2 (2016-09-07) ================== * Fix links, tune docs theme. 0.1.1 (2016-09-06) ================== * Update README, old version used obsolete API 0.1.0 (2016-09-06) ================== * The library was deeply refactored, bytes are gone away but all accepted strings are encoded if needed. 0.0.1 (2016-08-30) ================== * The first release. yarl-1.4.2/LICENSE0000644000175100001650000002615013572034522013771 0ustar vstsdocker00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2016-2018, Andrew Svetlov and aio-libs team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. yarl-1.4.2/MANIFEST.in0000644000175100001650000000042413572034522014516 0ustar vstsdocker00000000000000include LICENSE include CHANGES.rst include README.rst graft yarl graft docs graft tests global-exclude *.pyc global-exclude *.cache include yarl/*.c exclude yarl/_quoting.html exclude yarl/_quoting.*.so exclude yarl/_quoting.pyd exclude yarl/_quoting.*.pyd prune docs/_build yarl-1.4.2/PKG-INFO0000644000175100001650000004165413572034534014072 0ustar vstsdocker00000000000000Metadata-Version: 1.2 Name: yarl Version: 1.4.2 Summary: Yet another URL library Home-page: https://github.com/aio-libs/yarl/ Author: Andrew Svetlov Author-email: andrew.svetlov@gmail.com License: Apache 2 Description: yarl ==== .. image:: https://dev.azure.com/aio-libs/yarl/_apis/build/status/CI?branchName=master :target: https://dev.azure.com/aio-libs/yarl/_build/latest?definitionId=7&branchName=master :align: right .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/yarl .. image:: https://badge.fury.io/py/yarl.svg :target: https://badge.fury.io/py/yarl .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest :target: https://yarl.readthedocs.io .. image:: https://img.shields.io/pypi/pyversions/yarl.svg :target: https://pypi.python.org/pypi/yarl .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Introduction ------------ Url is constructed from ``str``:: >>> from yarl import URL >>> url = URL('https://www.python.org/~guido?arg=1#frag') >>> url URL('https://www.python.org/~guido?arg=1#frag') All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*, *query* and *fragment* are accessible by properties:: >>> url.scheme 'https' >>> url.host 'www.python.org' >>> url.path '/~guido' >>> url.query_string 'arg=1' >>> url.query >>> url.fragment 'frag' All url manipulations produce a new url object:: >>> url.parent / 'downloads/source' URL('https://www.python.org/downloads/source') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result:: >>> url = URL('https://www.python.org/путь') >>> url URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C') Regular properties are *percent-decoded*, use ``raw_`` versions for getting *encoded* strings:: >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``:: >>> url.human_repr() 'https://www.python.org/путь' For full documentation please read https://yarl.readthedocs.org. Installation ------------ :: $ pip install yarl The library is Python 3 only! Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Comparison with other URL libraries ------------------------------------ * furl (https://pypi.python.org/pypi/furl) The library has rich functionality but the ``furl`` object is mutable. I'm afraid to pass this object into foreign code: who knows if the code will modify my url in a terrible way while I just want to send URL with handy helpers for accessing URL properties. ``furl`` has other non-obvious tricky things but the main objection is mutability. * URLObject (https://pypi.python.org/pypi/URLObject) URLObject is immutable, that's pretty good. Every URL change generates a new URL object. But the library doesn't do any decode/encode transformations leaving the end user to cope with these gory details. Source code ----------- The project is hosted on GitHub_ Please file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. The library uses `Azure Pipelines `_ for Continuous Integration. Discussion list --------------- *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs Feel free to post your questions and ideas here. Authors and License ------------------- The ``yarl`` package is written by Andrew Svetlov. It's *Apache 2* licensed and freely available. .. _GitHub: https://github.com/aio-libs/yarl .. _multidict: https://github.com/aio-libs/multidict ========= Changelog ========= .. You should *NOT* be adding new change log entries to this file, this file is managed by towncrier. You *may* edit previous change logs to fix problems like typo corrections or such. To add a new change log entry, please see https://pip.pypa.io/en/latest/development/#adding-a-news-entry we named the news folder "changes". WARNING: Don't drop the next directive! .. towncrier release notes start 1.4.1 (2019-11-29) ================== * Fix regression, make the library work on Python 3.5 and 3.6 again. 1.4.0 (2019-11-29) ================== * Distinguish an empty password in URL from a password not provided at all (#262) * Fixed annotations for optional parameters of ``URL.build`` (#309) * Use None as default value of ``user`` parameter of ``URL.build`` (#309) * Enforce building C Accelerated modules when installing from source tarball, use ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python implementation (#329) * Drop Python 3.5 support * Fix quoting of plus in path by pure python version (#339) * Don't create a new URL if fragment is unchanged (#292) * Included in error msg the path that produces starting slash forbidden error (#376) * Skip slow IDNA encoding for ASCII-only strings (#387) 1.3.0 (2018-12-11) ================== * Fix annotations for ``query`` parameter (#207) * An incoming query sequence can have int variables (the same as for Mapping type) (#208) * Add ``URL.explicit_port`` property (#218) * Give a friendlier error when port cant be converted to int (#168) * ``bool(URL())`` now returns ``False`` (#272) 1.2.6 (2018-06-14) ================== * Drop Python 3.4 trove classifier (#205) 1.2.5 (2018-05-23) ================== * Fix annotations for ``build`` (#199) 1.2.4 (2018-05-08) ================== * Fix annotations for ``cached_property`` (#195) 1.2.3 (2018-05-03) ================== * Accept ``str`` subclasses in ``URL`` constructor (#190) 1.2.2 (2018-05-01) ================== * Fix build 1.2.1 (2018-04-30) ================== * Pin minimal required Python to 3.5.3 (#189) 1.2.0 (2018-04-30) ================== * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171) * Support PEP-561 (provide type hinting marker) (#182) 1.1.1 (2018-02-17) ================== * Fix performance regression: don't encode enmpty netloc (#170) 1.1.0 (2018-01-21) ================== * Make pure Python quoter consistent with Cython version (#162) 1.0.0 (2018-01-15) ================== * Use fast path if quoted string does not need requoting (#154) * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155) * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155) * Add custom string writer, reuse static buffer if available (#157) Code is 50-80 times faster than Pure Python version (was 4-5 times faster) * Don't recode IP zone (#144) * Support ``encoded=True`` in ``yarl.URL.build()`` (#158) * Fix updating query with multiple keys (#160) 0.18.0 (2018-01-10) =================== * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152) 0.17.0 (2017-12-30) =================== * Use IDNA 2008 for domain name processing (#149) 0.16.0 (2017-12-07) =================== * Fix raising ``TypeError`` by ``url.query_string()`` after ``url.with_query({})`` (empty mapping) (#141) 0.15.0 (2017-11-23) =================== * Add ``raw_path_qs`` attribute (#137) 0.14.2 (2017-11-14) =================== * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote`` 0.14.1 (2017-11-13) =================== * Restore ``strict`` parameter as no-op for sake of compatibility with aiohttp 2.2 0.14.0 (2017-11-11) =================== * Drop strict mode (#123) * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124) 0.13.0 (2017-10-01) =================== * Document ``encoded`` parameter (#102) * Support relative urls like ``'?key=value'`` (#100) * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104) * Process passwords without user names (#95) 0.12.0 (2017-06-26) =================== * Properly support paths without leading slash in ``URL.with_path()`` (#90) * Enable type annotation checks 0.11.0 (2017-06-26) =================== * Normalize path (#86) * Clear query and fragment parts in ``.with_path()`` (#85) 0.10.3 (2017-06-13) =================== * Prevent double URL args unquoting (#83) 0.10.2 (2017-05-05) =================== * Unexpected hash behaviour (#75) 0.10.1 (2017-05-03) =================== * Unexpected compare behaviour (#73) * Do not quote or unquote + if not a query string. (#74) 0.10.0 (2017-03-14) =================== * Added ``URL.build`` class method (#58) * Added ``path_qs`` attribute (#42) 0.9.8 (2017-02-16) ================== * Do not quote ``:`` in path 0.9.7 (2017-02-16) ================== * Load from pickle without _cache (#56) * Percent-encoded pluses in path variables become spaces (#59) 0.9.6 (2017-02-15) ================== * Revert backward incompatible change (BaseURL) 0.9.5 (2017-02-14) ================== * Fix BaseURL rich comparison support 0.9.4 (2017-02-14) ================== * Use BaseURL 0.9.3 (2017-02-14) ================== * Added BaseURL 0.9.2 (2017-02-08) ================== * Remove debug print 0.9.1 (2017-02-07) ================== * Do not lose tail chars (#45) 0.9.0 (2017-02-07) ================== * Allow to quote ``%`` in non strict mode (#21) * Incorrect parsing of query parameters with %3B (;) inside (#34) * Fix core dumps (#41) * tmpbuf - compiling error (#43) * Added ``URL.update_path()`` method * Added ``URL.update_query()`` method (#47) 0.8.1 (2016-12-03) ================== * Fix broken aiohttp: revert back ``quote`` / ``unquote``. 0.8.0 (2016-12-03) ================== * Support more verbose error messages in ``.with_query()`` (#24) * Don't percent-encode ``@`` and ``:`` in path (#32) * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are part of private API 0.7.1 (2016-11-18) ================== * Accept not only ``str`` but all classes inherited from ``str`` also (#25) 0.7.0 (2016-11-07) ================== * Accept ``int`` as value for ``.with_query()`` 0.6.0 (2016-11-07) ================== * Explicitly use UTF8 encoding in setup.py (#20) * Properly unquote non-UTF8 strings (#19) 0.5.3 (2016-11-02) ================== * Don't use namedtuple fields but indexes on URL construction 0.5.2 (2016-11-02) ================== * Inline ``_encode`` class method 0.5.1 (2016-11-02) ================== * Make URL construction faster by removing extra classmethod calls 0.5.0 (2016-11-02) ================== * Add cython optimization for quoting/unquoting * Provide binary wheels 0.4.3 (2016-09-29) ================== * Fix typing stubs 0.4.2 (2016-09-29) ================== * Expose ``quote()`` and ``unquote()`` as public API 0.4.1 (2016-09-28) ================== * Support empty values in query (``'/path?arg'``) 0.4.0 (2016-09-27) ================== * Introduce ``relative()`` (#16) 0.3.2 (2016-09-27) ================== * Typo fixes #15 0.3.1 (2016-09-26) ================== * Support sequence of pairs as ``with_query()`` parameter 0.3.0 (2016-09-26) ================== * Introduce ``is_default_port()`` 0.2.1 (2016-09-26) ================== * Raise ValueError for URLs like 'http://:8080/' 0.2.0 (2016-09-18) ================== * Avoid doubling slashes when joining paths (#13) * Appending path starting from slash is forbidden (#12) 0.1.4 (2016-09-09) ================== * Add kwargs support for ``with_query()`` (#10) 0.1.3 (2016-09-07) ================== * Document ``with_query()``, ``with_fragment()`` and ``origin()`` * Allow ``None`` for ``with_query()`` and ``with_fragment()`` 0.1.2 (2016-09-07) ================== * Fix links, tune docs theme. 0.1.1 (2016-09-06) ================== * Update README, old version used obsolete API 0.1.0 (2016-09-06) ================== * The library was deeply refactored, bytes are gone away but all accepted strings are encoded if needed. 0.0.1 (2016-08-30) ================== * The first release. Platform: UNKNOWN Classifier: License :: OSI Approved :: Apache Software License Classifier: Intended Audience :: Developers Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.5 yarl-1.4.2/README.rst0000644000175100001650000000734313572034522014456 0ustar vstsdocker00000000000000yarl ==== .. image:: https://dev.azure.com/aio-libs/yarl/_apis/build/status/CI?branchName=master :target: https://dev.azure.com/aio-libs/yarl/_build/latest?definitionId=7&branchName=master :align: right .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/yarl .. image:: https://badge.fury.io/py/yarl.svg :target: https://badge.fury.io/py/yarl .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest :target: https://yarl.readthedocs.io .. image:: https://img.shields.io/pypi/pyversions/yarl.svg :target: https://pypi.python.org/pypi/yarl .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Introduction ------------ Url is constructed from ``str``:: >>> from yarl import URL >>> url = URL('https://www.python.org/~guido?arg=1#frag') >>> url URL('https://www.python.org/~guido?arg=1#frag') All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*, *query* and *fragment* are accessible by properties:: >>> url.scheme 'https' >>> url.host 'www.python.org' >>> url.path '/~guido' >>> url.query_string 'arg=1' >>> url.query >>> url.fragment 'frag' All url manipulations produce a new url object:: >>> url.parent / 'downloads/source' URL('https://www.python.org/downloads/source') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result:: >>> url = URL('https://www.python.org/путь') >>> url URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C') Regular properties are *percent-decoded*, use ``raw_`` versions for getting *encoded* strings:: >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``:: >>> url.human_repr() 'https://www.python.org/путь' For full documentation please read https://yarl.readthedocs.org. Installation ------------ :: $ pip install yarl The library is Python 3 only! Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Comparison with other URL libraries ------------------------------------ * furl (https://pypi.python.org/pypi/furl) The library has rich functionality but the ``furl`` object is mutable. I'm afraid to pass this object into foreign code: who knows if the code will modify my url in a terrible way while I just want to send URL with handy helpers for accessing URL properties. ``furl`` has other non-obvious tricky things but the main objection is mutability. * URLObject (https://pypi.python.org/pypi/URLObject) URLObject is immutable, that's pretty good. Every URL change generates a new URL object. But the library doesn't do any decode/encode transformations leaving the end user to cope with these gory details. Source code ----------- The project is hosted on GitHub_ Please file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. The library uses `Azure Pipelines `_ for Continuous Integration. Discussion list --------------- *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs Feel free to post your questions and ideas here. Authors and License ------------------- The ``yarl`` package is written by Andrew Svetlov. It's *Apache 2* licensed and freely available. .. _GitHub: https://github.com/aio-libs/yarl .. _multidict: https://github.com/aio-libs/multidict yarl-1.4.2/docs/0000755000175100001650000000000013572034534013713 5ustar vstsdocker00000000000000yarl-1.4.2/docs/Makefile0000644000175100001650000001703313572034522015354 0ustar vstsdocker00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " epub3 to make an epub3" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" @echo " dummy to check syntax errors of document sources" .PHONY: clean clean: rm -rf $(BUILDDIR)/* .PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." .PHONY: dirhtml dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." .PHONY: singlehtml singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." .PHONY: pickle pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." .PHONY: json json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." .PHONY: htmlhelp htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." .PHONY: qthelp qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/yarl.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/yarl.qhc" .PHONY: applehelp applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." .PHONY: devhelp devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/yarl" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/yarl" @echo "# devhelp" .PHONY: epub epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." .PHONY: epub3 epub3: $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 @echo @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." .PHONY: latex latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." .PHONY: latexpdf latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: latexpdfja latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: text text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." .PHONY: man man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." .PHONY: texinfo texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." .PHONY: info info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." .PHONY: gettext gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." .PHONY: changes changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." .PHONY: linkcheck linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." .PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." .PHONY: coverage coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." .PHONY: xml xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." .PHONY: pseudoxml pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." .PHONY: dummy dummy: $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy @echo @echo "Build finished. Dummy builder generates no files." spelling: $(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling @echo @echo "Build finished." yarl-1.4.2/docs/_static/0000755000175100001650000000000013572034534015341 5ustar vstsdocker00000000000000yarl-1.4.2/docs/_static/yarl-icon-128x128.png0000644000175100001650000004271613572034522020706 0ustar vstsdocker00000000000000PNG  IHDRL\gAMA a cHRMz&u0`:pQ<bKGD pHYs  tIME 02!. DIDATxidu{rzE7ؚ؈&EʢH–,ɖ4Ǜ&b"D{b~:l2mˢX  @4F[uמg~ܗ/  )_d4]Ysپ3/UݷMD3#~er;*Xkỳ%(2KGh.cKʎS4-jG})Yfdݵc 3;K1 ~戅tSJLZy#]I$oYy̞9 FOTk ۤ=ԝ5ݽWm<'[l29}&  S qP5AU[A z^icRN ~`lx0Ez0Tj/rtluִ/#&0Ҵi G vaoo qDޡ}$~󀌚_Itl(w#yhҳm&gO((EJB ")eWc)~}3DM^gq+lsZ5G$1&0:nŗM.>mWWEJB WԸ 5|Lc ZPf- x|M5޾Da ^ALdYhins5'}r4M8vHo3gYRZiweخ]t/T:@DQknuA^Ug>G>c/) p R 1ARfʁ ӵY``y$R|^{"~jˆZ9i M)Mȸ 5;oM(-!7MsI{z `/K;4Ŵ1عfjG;>^ò2?(xȃ.@^ryskOGR`ؽ6+8'2oK_kOIAAuk{8> 3C&p[Q=0M8/RGoeYǾW)6_k36/L%9x $K9eYCe?*txϱ:/o̗YIX213TEZM [_~O/ (:3)4M$T*QMzI?͟>H52gD)#8gxajHcY R˕;~$Iqo!Z4M4SmYm}7k_*H 1s+Ih![x 6jK AESᱽg}V4a9\`lڛ^ h`2q6BC&L$_a: &j3e~?g~8 pw&^O<8,CsHYb^K-ɦ69iM| 匸d qʖKoI e)168f宿U'Sz[x y>E}vguMt+>I6o "'% ' y9s'5"n3h b!{f@iLwWCK6j?ovIY%IRY5O,Sߤ~U{u߄ 6{_kT~M ~rP'} J#ᷔ\IRY&=}6>5c&km?&RJL}0y4}pT:,yҝz|f M&:+; @Er!|ULǔdSa f  ƿ2I|jZY9x$II:O~B&XIIȆTzLIX]އeWI*d1u.xgsw͸>|OcԻkml5 b ;;xxLK: C jտk=WgGaZEDA__Afsl/yK|M"b9[tXwL2ڜU&~3-U&x)?yEyVpASXo`\"oPU2 !%< c; qW?@Y 'GуyI0'n(pnOe=߭ ջDl &B_3טsȯ ~T ct\GVlmm_UHxA|/lo|^y:{Ѵ&eNA"Wt stA.p0CogLB~2:NEAޜvjZV>+]y҃<"J,&K(M:!z@sĉkO#XcGRHIy ȌZ>>7H,DXxPs|% -$r 6Grz:%>߲ Q,[q o=pIT1ofܥaYr濮$%M.`2PRX%ʧxe (taCfW̓ G,Tuatv*7ƀʇooEL;ܩ˻90ED~0C粒[싟Q*#3aIL*pH;9퐊Ӿ[/p3t}\?ՃjLɃP)aK6#0qNYzDiR!7UB$8$|xsd1vFg OjDkl#9}] $_d bVd +~b_6}6@v83,]zYE.[PS]G/}qPe)z8ҝjؾt‰GrI8w:HiWl_*A֙l0!Ρ۳Nb[qIL3Id )Y5cBן3g>}w$9𨝻݊ý @ * Ԑ[kM=]aXHx!K2%pЉ2g~3o]A#i^?4S61k7 Ьש:s"qje$=ȫ]b\A0Ra^؏v@od+|. 'EY]aTHNGٜubdBܽH̺beݢ,$`*N|t}ht4jll/3/,m“/J<0=>" i n(yu~9⽏'q,"Ba6U2,C؛~m8m`HY[e$!shclE b)ěDD`= 'sjuxW{V%T*{6:?˲cȴd`9Go`Oi9N| _ : 2HFVL`s[ ChZͭԼ{8[3 A"$(6`3^Kw+_"EƐ 22ZՈ..BiW*n^w%c{9;\cd:$+<3ld,%E*s$ )s,RH[FEdC0U?Dl1:4EA؍Ms"^C"j4!y수_ (Oäl%PGKk` +vH__x~UI<:?77WOZuw|?@iCN-p)tn0 =ca_4T@^`W5fhG, lGdÉy, 7AqU!ԥ00Ty؜W;;-S"x^'z^!W[tlS?"{^ d5D^Pg?W9r Cy^5&RrʳwԼ wM);̤YqpS8Bt1.W?K; *M9װ@:"tҙ֛~ e/ݮ:t$^~_m0CH )!+Wgk4.3`Umjswk'!|03IHdFIRŧFOe3!WCi/~OBidX({"{>7iӺ0q4¾Xa=*ͧB_Mv8w-dD8I}F*}?|G(wl`-`=|Y6ۡ4/٬?5 [ޕraa|;~%@B3X~/ HMH月@X b׾{EЀyzҩ `: Y>*m`Y"sM+h8dpz|7͑ /?/!=q$K; ɫ HlfN`x_{zyA י2 _Qibf;8/2oֿVe S@f2>$ɋw3l/-(g?}QxJLjCm;OH2d5ʼ8+0pMpY9u uwwx&%T w/p:>; H5'^[!^lvS%%raQFH)` lBZV~€tiZ{KyzaPz# ^šCęMZ>Oyd`sqZ}S#-n1SL}O[.p WS8W.tI[lx82}<=znqqKT l`rbWٝҴll;xhvD%qk;m0_䈊pA^y U,uջqBeTzMnk (h cs<:T!ltf/~ pZN5(EbXˇ |HaA [n%'rϞKw:IH@NƮWҤ=2Ů%t7j/v2tB-({&$x)jB"Bnj#kX@M6uB gqqXa5` x/3#i퍍{usd3aBT7'NxJ}.<7 /47\àޚ},dE[KtL&u6D 6|7-m_]։P:Vc}yMk fΊ&=;) HX=1/s/_޹Q5a?ZǰZ N|\ !Sl"[݆5SߢU6Jz@=Y740̌4%&<)b7ޝ鐬3NI.*0 Koܽ^f t "wYSJ1TC)Cf#ٻ =-`jS⶟O+"OHdOŒ|W+YS@슎@u=8OVm ΰ>c03`OvkxJ M0 0MA%?-\/.$4-0_z5_-3, 4&ֶံ=+m뉪7 äEH(ZX(+}u0X fF]j.fzxBlƷjRyX;e- jv@`C ftS:F1$v{8a`R+o>1@l5o19tl %Xҿ :.{5aݷ} g0I({: !%:H*`O`f:z,Dg/ćFP&Pۊ`M:fF&:w+QTܧ9`X G3f!jb C9l6CVSmN2 |܁>/_l+?B#x{GZ3!_D6äE7Qlɤ0ˀt<,$;\˟Tf?nNɕJ8 ]vؤdRP(n[#G? w14qQs0&N 7i6c`Pz[&)2[ Z8] ϼH^ʷbkUﱖO"N`6I"u7c2),\$]v3&TA XM|" 15OZ:ޅe#n@>) ܣfs"uz>:9++P\ν˶C}k~e^sbD{Ċ~3(l DC *29$!BuwK(E4qKUFZ(2uHHHx* HODtd3BdyY^# !jr3bqtrC"\`ATxx'<^R&BE]FɭQgMn"Y?_%j㝲70rfᩲ *'l֧YE2H^pbT!~ /F%II %C ` @VB`bv= TY8q6=B'"hͺuָ/ "ZN U:xЯפM--Eq9 I~IS,au}݉0U?ĺOd bP!~TV“Qs ~O}ۇF@ ==C 2S9+Uʼnq炽UT6vc m޽fы|  W*E,h6FE,Ӂl rZMNA!6`S$@*IUȁ eBh¹ (w"& 2YIrX},;ټ!oYzyG7I-93)"$3 HŹey/۵g7V@T`lĵDDRaҾjRDQG90$U6"Bޣx`0n!*d\VBdyS=GpC'|Pl2";Y 9PHHck1՟I1\~f(U=Wk6i33; IB\t GKՉp: )$! *\%1lJ\2BBT_%rwXPFX=s (4hV֠}Bm"<.5&*sE> f]p_ Ϯ3EuP$<1g'X%; Vypm$BHFtJQ8<_^$ưlV? H*NeH_-2+w3`vea$} BJ` /3$ I^m<4c^)fDYl 0F3&1[md`;~Hs޲Ћ<؀ 'w0)>> ޠxUR8k*$=I: l 483&Y*&an\}o*] m>'H'rĻ=3Dj7F Tfes3YnA BeD޶ Le‡-{(u RpwY\·«$5 ([播v"C w msR'd<sxET%م#UvaT `,ïa?&06[$ BH`+B1R?>*-DyFA"`_ ;s3_YRahM,+|'0Lg1 u8 -^X kxæ`G3ĠhoPz`d6AI$fؿ}7bD$H1lF:%\@exp 1[]l2s> 1B7Q1a1/bc]\xc6dI!e"~f6 0̺ P?UWylt6'!:M{H;T;ȭs%tweE1UiR].[3HMNMxs62S7s,as]bi7 9 sorAa3N*C-/G@y1,(pڮe޽Dws bߘMt1qx{xK T e; F? p."ڇ%NPZYA呪6-p@!g?ysu&'F..]h~!MC?I';,o!mj+lNM ]lPUFS R!S?6M^sruƒa3&e ݞΧZ=/vIO KǸ{: ~`FiWJNk`d0IRl`bnLwCSmV;Qs"T(06ȯP<2A-۽`"b06dawrC:#3Emv0maKݝ4Ÿ"IPTZ.TdƷ|HYx+~~ի #"3Xyi R gVƨX}&f&,Ac*rj<6C繷Z:"]Nvv5VEnazU: @CB« Z xf ?- &-rz륋=rI BCӉu;[KZY/f 5DyDWe4aGց9p> 8]iW\=0(Ŵ.RjGo`Z|h{i. ~YwyjguK6]H!9ހ߀&?mS͚,y<ŀ P$R3B%Waf yz :/6$UX Q2!:K.%n#y_ڍ7̙\Jμ9605C?O|BbhO<Π3j_NuG1+ꪾ2v.ETPRm y!o K}$A*sJ"T}b"߀%x˩!YQ鳎2)B9!t/#Ajt8 vXiɅۻ DDh`poPxFeݰVsB7U9Gyz0(\8b ^n]64#9ҰE&!MGa#a24<ϑ cEMTXe ٗFeYgxփD+/3 \ p R+3gθ-λW#w"UC՛qr-KKP09>.5ACGs}[_ԕÎνK (O }^<*^A*+ ^ի(;\hRY6_#zcf.\W] vT6'=^{֮ǀx>?pH8O"`˔ӸADUqMբ*`OmXdOp%u `@H w)w{: Q1\K=yPJ}[YY)GdVF ^iףTÕw\n>~]AD:Ư^)I6|ƷlQ(-ރhN#9G#ksRl3. ˨פhOS(m<íWA x억V[y73Z뙻ĔyӚTeQԎhmeXjp,T' f r%S/ y)]aqoma؟U`j$DX\l>g7Ɖ , h]*o>U<\aʟfVXe3j4G;6,jȷz~:`sΆȜ7YaE-A"(NM`'sm"sC\=8Fy5^L^`Q;uFtϰ؟8nu/­e rvA̙3O<1FՖ)# _6^jd`H޹B -Gkߣ**nĐB^9FD힐Vg -= N"}>6JeJPuMnbs7ݤC,G9`'׾9^vUTMNGTmY]熆6> v<ӧ/?ꓲ /pfb AHZ^{d 6b@ U/db>hQ,HIS4w=|_^"u5:efZp[y|1m_q#^S\/(]{,Uۗ-ذ$ɕsyd Jg=ϋj\ydO_{"o[Y5G?4LF0Dž^H΂IcW\i01 H1^g "J'W&揿F|/ٍgs{S@w[ذ$m??>Nc=U.+㏊c-wɕ;"i=%@JΈI vEV\SF}7vQ)בm-n #݃L *kbGˑ[q5{m@aV$[x{ p"'eL A=d,N;ԊWnFa_#!H@a\~`De,Ġljq8keV%Y㢴7eggǕ:\ܡJzq0w4C薼ғ8+m+$a vƥ`PUx 9oPkLQj];ٜܲN7b,AjdhSڗ¤X8#hbOʡM 7Y",!!orVѬb%׳ 'T(th<펖6\_H~Qmnn&IR6jf=g "U ٙSTؖHB BݷH5*^b@ dPj2y+eqkkRaxKoBIn Z9S]r_YbbCJ'!=bat)F ^vSR>TH&{-ҟT)7=p̬g13lfGr_QVJm7KRJaZkښ+"* 9{u@qyծ%ir$]hD#5%Kx@,S$镯˧/O2_E썥-gL"5'ekG(6661f%ylGQVesKILs6]b xI)xP尳 )h$I7>~ƥ?""X3[-(ɩkP?hYD8j.|$FQEZjmoop㶏V[* S8y<ϭu>Ino)e_[[ YȪ0Ɏ{ kO"?^ȿaW4u(\&CRAL4^W>G ӬNXIsl5P_s 'M2[vjЃ '~̟;<|cc,xW:4M$zhL(۴}yp[oy +8U>It=CT=[MҌmDLj7C7g5L|.DrXx(2f\F$VYV'niN0xliYfj_ֹ!pCxinllqEHNqZw,Kc5$g/PQq)rx3e97?k{vbb>W9oɰb)Yy̒F*eWg{{n+\r ۥvY`l8 Bl$td|yZx3JI)H(h_s[< _-cئcemaX٠Io} 3{hvbfG;΀Qp}#6$I"+]a$k_ֿ9^G֦Oi@Η?MdGu~j)IlXSjNs'TP^_yn(t;!?`8̆$I$!z>77ꎮ6[&pMNNB)RK"\aC5UYߤ$in@E#Hj4i,s0Ƅah4jZyw)CDu]׽͈{3dFYi=a^w;̜eYz$SJit 4M]+ i]͛^IqDZ[Wjm<}4FFlp1C|x D4C1&'˲,F]#-{p=WS#LdhBroe]?\0 1buMzFμQvk5EԟAS䞜ɀ蔔*I` Mp0%tEXtdate:create2018-10-06T12:06:19+00:00\JZ%tEXtdate:modify2018-10-06T12:06:19+00:00-IENDB`yarl-1.4.2/docs/_templates/0000755000175100001650000000000013572034534016050 5ustar vstsdocker00000000000000yarl-1.4.2/docs/_templates/about.html0000644000175100001650000000047113572034522020047 0ustar vstsdocker00000000000000{%- include "alabaster/about.html" %}

https://dev.azure.com/aio-libs/yarl/_apis/build/status/CI?branchName=master

yarl-1.4.2/docs/api.rst0000644000175100001650000005435513572034522015227 0ustar vstsdocker00000000000000.. _yarl-api: Public API ========== .. module:: yarl .. currentmodule:: yarl The only public *yarl* class is ``URL``: .. doctest:: >>> from yarl import URL .. class:: URL(arg, *, encoded=False) Represents URL as :: [scheme:]//[user[:password]@]host[:port][/path][?query][#fragment] for absolute URLs and :: [/path][?query][#fragment] for relative ones (:ref:`yarl-api-relative-urls`). The URL structure is:: http://user:pass@example.com:8042/over/there?name=ferret#nose \__/ \__/ \__/ \_________/ \__/\_________/ \_________/ \__/ | | | | | | | | scheme user password host port path query fragment Internally all data are stored as *percent-encoded* strings for *user*, *path*, *query* and *fragment* URL parts and *IDNA-encoded* (:rfc:`5891`) for *host*. Constructor and modification operators perform *encoding* for all parts automatically. The library assumes all data uses *UTF-8* for *percent-encoded* tokens. .. doctest:: >>> URL('http://example.com/path/to/?arg1=a&arg2=b#fragment') URL('http://example.com/path/to/?arg1=a&arg2=b#fragment') Unless URL contain the only *ascii* characters there is no differences. But for *non-ascii* case *encoding* is applied. .. doctest:: >>> str(URL('http://εμπορικόσήμα.eu/путь/這裡')) 'http://xn--jxagkqfkduily1i.eu/%D0%BF%D1%83%D1%82%D1%8C/%E9%80%99%E8%A3%A1' The same is true for *user*, *password*, *query* and *fragment* parts of URL. Already encoded URL is not changed: .. doctest:: >>> URL('http://xn--jxagkqfkduily1i.eu') URL('http://xn--jxagkqfkduily1i.eu') Use :meth:`URL.human_repr` for getting human readable representation: .. doctest:: >>> url = URL('http://εμπορικόσήμα.eu/путь/這裡') >>> str(url) 'http://xn--jxagkqfkduily1i.eu/%D0%BF%D1%83%D1%82%D1%8C/%E9%80%99%E8%A3%A1' >>> url.human_repr() 'http://εμπορικόσήμα.eu/путь/這裡' .. note:: Sometimes encoding performed by *yarl* is not acceptable for certain WEB server. Passing ``encoded=True`` parameter prevents URL auto-encoding, user is responsible about URL correctness. Don't use this option unless there is no other way for keeping URL attributes not touched. Any URL manipulations don't guarantee correct encoding, URL parts could be re-quoted even if *encoded* parameter was explicitly set. URL properties -------------- There are two kinds of properties: *decoded* and *encoded* (with ``raw_`` prefix): .. attribute:: URL.scheme Scheme for absolute URLs, empty string for relative URLs or URLs starting with `'//'` (:ref:`yarl-api-relative-urls`). .. doctest:: >>> URL('http://example.com').scheme 'http' >>> URL('//example.com').scheme '' >>> URL('page.html').scheme '' .. attribute:: URL.user Decoded *user* part of URL, ``None`` if *user* is missing. .. doctest:: >>> URL('http://john@example.com').user 'john' >>> URL('http://андрей@example.com').user 'андрей' >>> URL('http://example.com').user is None True .. attribute:: URL.raw_user Encoded *user* part of URL, ``None`` if *user* is missing. .. doctest:: >>> URL('http://андрей@example.com').raw_user '%D0%B0%D0%BD%D0%B4%D1%80%D0%B5%D0%B9' >>> URL('http://example.com').raw_user is None True .. attribute:: URL.password Decoded *password* part of URL, ``None`` if *user* is missing. .. doctest:: >>> URL('http://john:pass@example.com').password 'pass' >>> URL('http://андрей:пароль@example.com').password 'пароль' >>> URL('http://example.com').password is None True .. attribute:: URL.raw_password Encoded *password* part of URL, ``None`` if *user* is missing. .. doctest:: >>> URL('http://user:пароль@example.com').raw_password '%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C' .. attribute:: URL.host Encoded *host* part of URL, ``None`` for relative URLs (:ref:`yarl-api-relative-urls`). Brackets are stripped for IPv6. Host is converted to lowercase, address is validated and converted to compressed form. .. doctest:: >>> URL('http://example.com').host 'example.com' >>> URL('http://хост.домен').host 'хост.домен' >>> URL('page.html').host is None True >>> URL('http://[::1]').host '::1' .. attribute:: URL.raw_host IDNA decoded *host* part of URL, ``None`` for relative URLs (:ref:`yarl-api-relative-urls`). .. doctest:: >>> URL('http://хост.домен').raw_host 'xn--n1agdj.xn--d1acufc' .. attribute:: URL.port *port* part of URL, with scheme-based fallback. ``None`` for relative URLs (:ref:`yarl-api-relative-urls`) or for URLs without explicit port and :attr:`URL.scheme` without :ref:`default port substitution `. .. doctest:: >>> URL('http://example.com:8080').port 8080 >>> URL('http://example.com').port 80 >>> URL('page.html').port is None True .. attribute:: URL.explicit_port *explicit_port* part of URL, without scheme-based fallback. ``None`` for relative URLs (:ref:`yarl-api-relative-urls`) or for URLs without explicit port. .. doctest:: >>> URL('http://example.com:8080').explicit_port 8080 >>> URL('http://example.com').explicit_port is None True >>> URL('page.html').explicit_port is None True .. versionadded:: 1.3 .. attribute:: URL.path Decoded *path* part of URL, ``'/'`` for absolute URLs without *path* part. .. doctest:: >>> URL('http://example.com/path/to').path '/path/to' >>> URL('http://example.com/путь/сюда').path '/путь/сюда' >>> URL('http://example.com').path '/' .. attribute:: URL.path_qs Decoded *path* part of URL and query string, ``'/'`` for absolute URLs without *path* part. .. doctest:: >>> URL('http://example.com/path/to?a1=a&a2=b').path_qs '/path/to?a1=a&a2=b' .. attribute:: URL.raw_path_qs Encoded *path* part of URL and query string, ``'/'`` for absolute URLs without *path* part. .. doctest:: >>> URL('http://example.com/путь/сюда?ключ=знач').raw_path_qs '/%D0%BF%D1%83%D1%82%D1%8C/%D1%81%D1%8E%D0%B4%D0%B0?%D0%BA%D0%BB%D1%8E%D1%87=%D0%B7%D0%BD%D0%B0%D1%87' .. versionadded:: 0.15 .. attribute:: URL.raw_path Encoded *path* part of URL, ``'/'`` for absolute URLs without *path* part. .. doctest:: >>> URL('http://example.com/путь/сюда').raw_path '/%D0%BF%D1%83%D1%82%D1%8C/%D1%81%D1%8E%D0%B4%D0%B0' .. attribute:: URL.query_string Decoded *query* part of URL, empty string if *query* is missing. .. doctest:: >>> URL('http://example.com/path?a1=a&a2=b').query_string 'a1=a&a2=b' >>> URL('http://example.com/path?ключ=знач').query_string 'ключ=знач' >>> URL('http://example.com/path').query_string '' .. attribute:: URL.raw_query_string Encoded *query* part of URL, empty string if *query* is missing. .. doctest:: >>> URL('http://example.com/path?ключ=знач').raw_query_string '%D0%BA%D0%BB%D1%8E%D1%87=%D0%B7%D0%BD%D0%B0%D1%87' .. attribute:: URL.fragment Encoded *fragment* part of URL, empty string if *fragment* is missing. .. doctest:: >>> URL('http://example.com/path#fragment').fragment 'fragment' >>> URL('http://example.com/path#якорь').fragment 'якорь' >>> URL('http://example.com/path').fragment '' .. attribute:: URL.raw_fragment Decoded *fragment* part of URL, empty string if *fragment* is missing. .. doctest:: >>> URL('http://example.com/path#якорь').raw_fragment '%D1%8F%D0%BA%D0%BE%D1%80%D1%8C' For *path* and *query* *yarl* supports additional helpers: .. attribute:: URL.parts A :class:`tuple` containing decoded *path* parts, ``('/',)`` for absolute URLs if *path* is missing. .. doctest:: >>> URL('http://example.com/path/to').parts ('/', 'path', 'to') >>> URL('http://example.com/путь/сюда').parts ('/', 'путь', 'сюда') >>> URL('http://example.com').parts ('/',) .. attribute:: URL.raw_parts A :class:`tuple` containing encoded *path* parts, ``('/',)`` for absolute URLs if *path* is missing. .. doctest:: >>> URL('http://example.com/путь/сюда').raw_parts ('/', '%D0%BF%D1%83%D1%82%D1%8C', '%D1%81%D1%8E%D0%B4%D0%B0') .. attribute:: URL.name The last part of :attr:`parts`. .. doctest:: >>> URL('http://example.com/path/to').name 'to' >>> URL('http://example.com/путь/сюда').name 'сюда' >>> URL('http://example.com/path/').name '' .. attribute:: URL.raw_name The last part of :attr:`raw_parts`. .. doctest:: >>> URL('http://example.com/путь/сюда').raw_name '%D1%81%D1%8E%D0%B4%D0%B0' .. attribute:: URL.query A :class:`multidict.MultiDictProxy` representing parsed *query* parameters in decoded representation. Empty value if URL has no *query* part. .. doctest:: >>> URL('http://example.com/path?a1=a&a2=b').query >>> URL('http://example.com/path?ключ=знач').query >>> URL('http://example.com/path').query .. _yarl-api-relative-urls: Absolute and relative URLs -------------------------- The module supports both absolute and relative URLs. Absolute URL should start from either *scheme* or ``'//'``. .. method:: URL.is_absolute() A check for absolute URLs. Return ``True`` for absolute ones (having *scheme* or starting with ``//``), ``False`` otherwise. .. doctest:: >>> URL('http://example.com').is_absolute() True >>> URL('//example.com').is_absolute() True >>> URL('/path/to').is_absolute() False >>> URL('path').is_absolute() False New URL generation ------------------ URL is an immutable object, every operation described in the section generates a new *URL* instance. .. method:: URL.build(*, scheme, user, password, host, port, path, query, \ query_string, fragment, encoded=False) Creates and returns a new URL: .. doctest:: >>> URL.build(scheme="http", host="example.com") URL('http://example.com') >>> URL.build(scheme="http", host="example.com", query={"a": "b"}) URL('http://example.com/?a=b') >>> URL.build(scheme="http", host="example.com", query_string="a=b") URL('http://example.com/?a=b') >>> URL.build() URL('') Calling ``build`` method without arguments is equal to calling ``__init__`` without arguments. .. note:: When ``scheme`` and ``host`` are passed new URL will be “absolute”. If only one of ``scheme`` or ``host`` is passed then AssertionError will be raised. .. note:: Only one of ``query`` or ``query_string`` should be passed then AssertionError will be raised. .. method:: URL.with_scheme(scheme) Return a new URL with *scheme* replaced: .. doctest:: >>> URL('http://example.com').with_scheme('https') URL('https://example.com') .. method:: URL.with_user(user) Return a new URL with *user* replaced, auto-encode *user* if needed. Clear user/password if *user* is ``None``. .. doctest:: >>> URL('http://user:pass@example.com').with_user('new_user') URL('http://new_user:pass@example.com') >>> URL('http://user:pass@example.com').with_user('вася') URL('http://%D0%B2%D0%B0%D1%81%D1%8F:pass@example.com') >>> URL('http://user:pass@example.com').with_user(None) URL('http://example.com') .. method:: URL.with_password(password) Return a new URL with *password* replaced, auto-encode *password* if needed. Clear password if ``None`` is passed. .. doctest:: >>> URL('http://user:pass@example.com').with_password('пароль') URL('http://user:%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C@example.com') >>> URL('http://user:pass@example.com').with_password(None) URL('http://user@example.com') .. method:: URL.with_host(host) Return a new URL with *host* replaced, auto-encode *host* if needed. Changing *host* for relative URLs is not allowed, use :meth:`URL.join` instead. .. doctest:: >>> URL('http://example.com/path/to').with_host('python.org') URL('http://python.org/path/to') >>> URL('http://example.com/path').with_host('хост.домен') URL('http://xn--n1agdj.xn--d1acufc/path') .. method:: URL.with_port(port) Return a new URL with *port* replaced. Clear port to default if ``None`` is passed. .. doctest:: >>> URL('http://example.com:8888').with_port(9999) URL('http://example.com:9999') >>> URL('http://example.com:8888').with_port(None) URL('http://example.com') .. method:: URL.with_path(path) Return a new URL with *path* replaced, encode *path* if needed. .. doctest:: >>> URL('http://example.com/').with_path('/path/to') URL('http://example.com/path/to') .. method:: URL.with_query(query) URL.with_query(**kwargs) Return a new URL with *query* part replaced. Unlike :meth:`update_query` the method replaces all query parameters. Accepts any :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.MultiDict` instances) or :class:`str`, auto-encode the argument if needed. A sequence of ``(key, value)`` pairs is supported as well. Also it can take an arbitrary number of keyword arguments. Clear *query* if ``None`` is passed. .. doctest:: >>> URL('http://example.com/path?a=b').with_query('c=d') URL('http://example.com/path?c=d') >>> URL('http://example.com/path?a=b').with_query({'c': 'd'}) URL('http://example.com/path?c=d') >>> URL('http://example.com/path?a=b').with_query({'кл': 'зн'}) URL('http://example.com/path?%D0%BA%D0%BB=%D0%B7%D0%BD') >>> URL('http://example.com/path?a=b').with_query(None) URL('http://example.com/path') >>> URL('http://example.com/path?a=b&b=1').with_query(b='2') URL('http://example.com/path?b=2') >>> URL('http://example.com/path?a=b&b=1').with_query([('b', '2')]) URL('http://example.com/path?b=2') .. method:: URL.update_query(query) URL.update_query(**kwargs) Returns a new URL with *query* part updated. Unlike :meth:`with_query` the method does not replace query completely. Returned ``URL`` object will contain query string which updated parts from passed query parts (or parts of parsed query string). Accepts any :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.MultiDict` instances) or :class:`str`, auto-encode the argument if needed. A sequence of ``(key, value)`` pairs is supported as well. Also it can take an arbitrary number of keyword arguments. Clear *query* if ``None`` is passed. .. doctest:: >>> URL('http://example.com/path?a=b').update_query('c=d') URL('http://example.com/path?a=b&c=d') >>> URL('http://example.com/path?a=b').update_query({'c': 'd'}) URL('http://example.com/path?a=b&c=d') >>> URL('http://example.com/path?a=b').update_query({'кл': 'зн'}) URL('http://example.com/path?a=b&%D0%BA%D0%BB=%D0%B7%D0%BD') >>> URL('http://example.com/path?a=b&b=1').update_query(b='2') URL('http://example.com/path?a=b&b=2') >>> URL('http://example.com/path?a=b&b=1').update_query([('b', '2')]) URL('http://example.com/path?a=b&b=2') >>> URL('http://example.com/path?a=b&c=e&c=f').update_query(c='d') URL('http://example.com/path?a=b&c=d') >>> URL('http://example.com/path?a=b').update_query('c=d&c=f') URL('http://example.com/path?a=b&c=d&c=f') .. versionchanged:: 1.0 All multiple key/value pairs are applied to the multi-dictionary. .. method:: URL.with_fragment(port) Return a new URL with *fragment* replaced, auto-encode *fragment* if needed. Clear *fragment* to default if ``None`` is passed. .. doctest:: >>> URL('http://example.com/path#frag').with_fragment('anchor') URL('http://example.com/path#anchor') >>> URL('http://example.com/path#frag').with_fragment('якорь') URL('http://example.com/path#%D1%8F%D0%BA%D0%BE%D1%80%D1%8C') >>> URL('http://example.com/path#frag').with_fragment(None) URL('http://example.com/path') .. method:: URL.with_name(name) Return a new URL with *name* (last part of *path*) replaced and cleaned up *query* and *fragment* parts. Name is encoded if needed. .. doctest:: >>> URL('http://example.com/path/to?arg#frag').with_name('new') URL('http://example.com/path/new') >>> URL('http://example.com/path/to').with_name('имя') URL('http://example.com/path/%D0%B8%D0%BC%D1%8F') .. attribute:: URL.parent A new URL with last part of *path* removed and cleaned up *query* and *fragment* parts. .. doctest:: >>> URL('http://example.com/path/to?arg#frag').parent URL('http://example.com/path') .. method:: URL.origin() A new URL with *scheme*, *host* and *port* parts only. *user*, *password*, *path*, *query* and *fragment* are removed. .. doctest:: >>> URL('http://example.com/path/to?arg#frag').origin() URL('http://example.com') >>> URL('http://user:pass@example.com/path').origin() URL('http://example.com') .. method:: URL.relative() A new *relative* URL with *path*, *query* and *fragment* parts only. *scheme*, *user*, *password*, *host* and *port* are removed. .. doctest:: >>> URL('http://example.com/path/to?arg#frag').relative() URL('/path/to?arg#frag') Division (``/``) operator creates a new URL with appended *path* parts and cleaned up *query* and *fragment* parts. The path is encoded if needed. .. doctest:: >>> url = URL('http://example.com/path?arg#frag') / 'to/subpath' >>> url URL('http://example.com/path/to/subpath') >>> url.parts ('/', 'path', 'to', 'subpath') >>> url = URL('http://example.com/path?arg#frag') / 'сюда' >>> url URL('http://example.com/path/%D1%81%D1%8E%D0%B4%D0%B0') .. method:: URL.join(url) Construct a full (“absolute”) URL by combining a “base URL” (``self``) with another URL (``url``). Informally, this uses components of the base URL, in particular the addressing scheme, the network location and (part of) the path, to provide missing components in the relative URL, e.g.: .. doctest:: >>> base = URL('http://example.com/path/index.html') >>> base.join(URL('page.html')) URL('http://example.com/path/page.html') .. note:: If ``url`` is an absolute URL (that is, starting with ``//`` or ``scheme://``), the URL‘s host name and/or scheme will be present in the result, e.g.: .. doctest:: >>> base = URL('http://example.com/path/index.html') >>> base.join(URL('//python.org/page.html')) URL('http://python.org/page.html') Human readable representation ----------------------------- All URL data is stored in encoded form internally. It's pretty good for passing ``str(url)`` everywhere URL string is accepted but quite bad for memorizing by humans. .. method:: human_repr() Return decoded human readable string for URL representation. .. doctest:: >>> url = URL('http://εμπορικόσήμα.eu/這裡') >>> str(url) 'http://xn--jxagkqfkduily1i.eu/%E9%80%99%E8%A3%A1' >>> url.human_repr() 'http://εμπορικόσήμα.eu/這裡' .. _yarl-api-default-ports: Default port substitution ------------------------- :mod:`yarl` is aware about the following *scheme* -> *port* translations: +------------------+-------+ | scheme | port | +==================+=======+ | ``'http'`` | 80 | +------------------+-------+ | ``'https'`` | 443 | +------------------+-------+ | ``'ws'`` | 80 | +------------------+-------+ | ``'wss'`` | 443 | +------------------+-------+ .. method:: URL.is_default_port() A check for default port. Return ``True`` if URL's :attr:`~URL.port` is *default* for used :attr:`~URL.scheme`, ``False`` otherwise. Relative URLs have no default port. .. doctest:: >>> URL('http://example.com').is_default_port() True >>> URL('http://example.com:80').is_default_port() True >>> URL('http://example.com:8080').is_default_port() False >>> URL('/path/to').is_default_port() False References ---------- :mod:`yarl` stays on shoulders of giants: several RFC documents and low-level :mod:`urllib.parse` which performs almost all gory work. The module borrowed design from :mod:`pathlib` in any place where it was possible. .. seealso:: :rfc:`5891` - Internationalized Domain Names in Applications (IDNA): Protocol Document describing non-ASCII domain name encoding. :rfc:`3987` - Internationalized Resource Identifiers This specifies conversion rules for non-ASCII characters in URL. :rfc:`3986` - Uniform Resource Identifiers This is the current standard (STD66). Any changes to :mod:`yarl` module should conform to this. Certain deviations could be observed, which are mostly for backward compatibility purposes and for certain de-facto parsing requirements as commonly observed in major browsers. :rfc:`2732` - Format for Literal IPv6 Addresses in URL's. This specifies the parsing requirements of IPv6 URLs. :rfc:`2396` - Uniform Resource Identifiers (URI): Generic Syntax Document describing the generic syntactic requirements for both Uniform Resource Names (URNs) and Uniform Resource Locators (URLs). :rfc:`2368` - The mailto URL scheme. Parsing requirements for mailto URL schemes. :rfc:`1808` - Relative Uniform Resource Locators This Request For Comments includes the rules for joining an absolute and a relative URL, including a fair number of "Abnormal Examples" which govern the treatment of border cases. :rfc:`1738` - Uniform Resource Locators (URL) This specifies the formal syntax and semantics of absolute URLs. yarl-1.4.2/docs/conf.py0000644000175100001650000002645513572034522015223 0ustar vstsdocker00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # yarl documentation build configuration file, created by # sphinx-quickstart on Mon Aug 29 19:55:36 2016. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' import pathlib import re _docs_path = pathlib.Path(__file__).parent _version_path = _docs_path / '../yarl/__init__.py' with _version_path.open() as fp: try: _version_info = re.search(r"^__version__ = \"" r"(?P\d+)" r"\.(?P\d+)" r"\.(?P\d+)" r"(?P.*)?\"$", fp.read(), re.M).groupdict() except IndexError: raise RuntimeError('Unable to determine version.') # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.intersphinx', 'sphinx.ext.coverage', 'sphinx.ext.doctest', 'sphinx.ext.viewcode', 'alabaster', ] try: import sphinxcontrib.spelling # noqa extensions.append('sphinxcontrib.spelling') except ImportError: pass intersphinx_mapping = { 'python': ('http://docs.python.org/3', None), 'multidict': ('http://multidict.readthedocs.io/', None)} # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The encoding of source files. # # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = 'yarl' copyright = '2016-2018, Andrew Svetlov and aio-libs team' author = 'Andrew Svetlov and aio-libs team' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '{major}.{minor}'.format(**_version_info) # The full version, including alpha/beta/rc tags. release = '{major}.{minor}.{patch}-{tag}'.format(**_version_info) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # # today = '' # # Else, today_fmt is used as the format for a strftime call. # # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The reST default role (used for this markup: `text`) to use for all # documents. # # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' html_theme_options = { 'logo': 'yarl-icon-128x128.png', 'description': 'Yet another URL library', 'github_user': 'aio-libs', 'github_repo': 'yarl', 'github_button': True, 'github_type': 'star', 'github_banner': True, 'codecov_button': True, 'pre_bg': '#FFF6E5', 'note_bg': '#E5ECD1', 'note_border': '#BFCF8C', 'body_text': '#482C0A', 'sidebar_text': '#49443E', 'sidebar_header': '#4B4032', 'sidebar_collapse': False, } # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. # " v documentation" by default. # # html_title = 'yarl v0.1.0' # A shorter title for the navigation bar. Default is the same as html_title. # # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # # html_logo = None # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # # html_extra_path = [] # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. # # html_last_updated_fmt = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # # html_sidebars = {} html_sidebars = { '**': [ 'about.html', 'navigation.html', 'searchbox.html', ] } # Additional templates that should be rendered to pages, maps page names to # template names. # # html_additional_pages = {} # If false, no module index is generated. # # html_domain_indices = True # If false, no index is generated. # # html_use_index = True # If true, the index is split into individual pages for each letter. # # html_split_index = False # If true, links to the reST sources are added to the pages. # # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh' # # html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # 'ja' uses this config value. # 'zh' user can custom change `jieba` dictionary path. # # html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'yarldoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'yarl.tex', 'yarl Documentation', 'Andrew Svetlov', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # # latex_use_parts = False # If true, show page references after internal links. # # latex_show_pagerefs = False # If true, show URL addresses after external links. # # latex_show_urls = False # Documents to append as an appendix to all manuals. # # latex_appendices = [] # It false, will not define \strong, \code, itleref, \crossref ... but only # \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added # packages. # # latex_keep_old_macro_names = True # If false, no module index is generated. # # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'yarl', 'yarl Documentation', [author], 1) ] # If true, show URL addresses after external links. # # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'yarl', 'yarl Documentation', author, 'yarl', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # # texinfo_appendices = [] # If false, no module index is generated. # # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # # texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'https://docs.python.org/': None} yarl-1.4.2/docs/index.rst0000644000175100001650000000675513572034522015566 0ustar vstsdocker00000000000000.. yarl documentation master file, created by sphinx-quickstart on Mon Aug 29 19:55:36 2016. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. yarl ==== The module provides handy :class:`~yarl.URL` class for URL parsing and changing. Introduction ------------ URL is constructed from :class:`str`: .. doctest:: >>> from yarl import URL >>> url = URL('https://www.python.org/~guido?arg=1#frag') >>> url URL('https://www.python.org/~guido?arg=1#frag') All URL parts: *scheme*, *user*, *password*, *host*, *port*, *path*, *query* and *fragment* are accessible by properties: .. doctest:: >>> url.scheme 'https' >>> url.host 'www.python.org' >>> url.path '/~guido' >>> url.query_string 'arg=1' >>> url.query >>> url.fragment 'frag' All URL manipulations produces a new URL object: .. doctest:: >>> url.parent / 'downloads/source' URL('https://www.python.org/downloads/source') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result: .. doctest:: >>> url = URL('https://www.python.org/путь') >>> url URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C') Regular properties are *percent-decoded*, use ``raw_`` versions for getting *encoded* strings: .. doctest:: >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as :meth:`~yarl.URL.human_repr()`: .. doctest:: >>> url.human_repr() 'https://www.python.org/путь' For full documentation please read :ref:`yarl-api` section. Installation ------------ :: $ pip install yarl The library is Python 3 only! Dependencies ------------ YARL requires :mod:`multidict` library. It installs it automatically. API documentation ------------------ Open :ref:`yarl-api` for reading full list of available methods. Comparison with other URL libraries ------------------------------------ * furl (https://pypi.python.org/pypi/furl) The library has a rich functionality but ``furl`` object is mutable. I afraid to pass this object into foreign code: who knows if the code will modify my URL in a terrible way while I just want to send URL with handy helpers for accessing URL properties. ``furl`` has other non obvious tricky things but the main objection is mutability. * URLObject (https://pypi.python.org/pypi/URLObject) URLObject is immutable, that's pretty good. Every URL change generates a new URL object. But the library doesn't any decode/encode transformations leaving end user to cope with these gory details. Source code ----------- The project is hosted on GitHub_ Please file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. The library uses `Azure Pipelines `_ for Continuous Integration. Discussion list --------------- *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs Feel free to post your questions and ideas here. Authors and License ------------------- The ``yarl`` package is written by Andrew Svetlov. It's *Apache 2* licensed and freely available. Contents: .. toctree:: :maxdepth: 2 api Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` .. _GitHub: https://github.com/aio-libs/yarl yarl-1.4.2/docs/make.bat0000644000175100001650000001706013572034522015321 0ustar vstsdocker00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. epub3 to make an epub3 echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled echo. dummy to check syntax errors of document sources goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 1>NUL 2>NUL if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\yarl.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\yarl.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "epub3" ( %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "coverage" ( %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage if errorlevel 1 exit /b 1 echo. echo.Testing of coverage in the sources finished, look at the ^ results in %BUILDDIR%/coverage/python.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) if "%1" == "dummy" ( %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy if errorlevel 1 exit /b 1 echo. echo.Build finished. Dummy builder generates no files. goto end ) :end yarl-1.4.2/docs/spelling_wordlist.txt0000644000175100001650000000005113572034522020211 0ustar vstsdocker00000000000000de facto google IPv mailto multi svetlov yarl-1.4.2/docs/yarl-icon-128x128.xcf0000644000175100001650000011401413572034522017243 0ustar vstsdocker00000000000000gimp xcf fileBBBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765 3 a ⁠U⁠R⁠L     gimp-text-layer(markup "URL") (font "Sans") (font-size 18.000000) (font-size-unit pixels) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 174.000000) (box-height 165.000000) (box-unit pixels) (hinting yes) c  '                                                                                # $   H J   p r    V T  |   / 2   GI ~  h+,i  # %!% }!{    {z $$ || ǨX$  7 =    E  0 "N {     w  2        7  ~ H    i  "O   "    +  4   K Q 2  (_  I  0 + W   ; #   .     # " " " " % p" " ( ^" " +..     TȬS     @ @ @ @ @ @ @ @WR+)Layer       U  % 5 E@@aiohttp-icon-128x128.png      " : V/rRu82.).13            82.).13 Ķнٻ侢ڼѶҮ뼸Ƶ򩨫ѡƶͮ񼘜ȶƸ㰣񟢣贵ըʥҷäڷ ֶ ɷ ŦŹ ˩ Үˡ ܰ靈á® 鳲ܻ ۴ʱٯޱ׬𳵱ԪĦԪִշȨֳ˦򮧦ز՛ڸڲةݴܜĥ߷ۮݹ죣ʥܻХݲ Яʣ߷Ӧϣ̬󤢸ګݬ۵簾ټ¢ۡҦѥǡ並ڮܩꨭˬߨįԨⲰ ˪򰵽ӳìཱس ײۿ öɱ Ҿӱ ٲ ˽ݴ ݾ޷¾82.).13 ƭs`ZZUSQҭl[RO?//1?DD꽇\NONPPQJ1,,+3@@όX?:;?MONML8*++9@@￉S:;;:87AMMC,++*/>@|h[?:8778GMJ3*++6@jP^gF6676=L>+**-<\NKMP;99:C3--.//.4ۊcIIGIJJIBNepiTHIJHOS::;E^cOJLMMLL}ٙWLo?;;87651-;acNJNheB>9776/**)773++*0HKKVwzfgIEDA@;7786.++:MNMIlehFFCAA?9882,,.ENNGyeh EFBAA<86-,,+6LMAqeh EEB@AA@90++,@I?Vdh PKHGG>558>+2@AA<+A>Rԃffr lW:7;JNNH0+,9AA@0Nx975=kYNchgg ucB88ANOON9,,0?BAABB8^b+499855:HKNNXhiihP899:IOOE.--6BB?pR*,0899FOOPaiih_<8998>MOOL5,--.=BACF*--3998?MOONUgiliG899EOO@--,3@D>+--.79:IOO]irjX9989+--,18BOOReP]C::C=//.38-//9JNMMWJB=GKJJKBAIIHM[HIID>==;;9.?OOM56NPPTbfVPPMC=880ΠI1,1IOO@--APPOR[eiaQPPOFBA;994-f,-,:NOOJ2,,2KPOQX_iihYOPPKBB?997/-?IW*-.EOON;,--,991--}<5-,J@--2JQB..+TcOUgjjaRPHCCB<:6..O;/--++--39::9<:9;LdjjSFPPH7ACCT61?CCBVSA5.5::8@9:COXijja?1-6CCA9.-097gK8:=MPPajjiL99BOPPD/-1@CCt40-/=CCAa:-..2P_7::GPPOUgjjk[<::;IPPL5-..7CCK3/..4BCCE^+.-6{8::@OPP]jjkgF9::@OPP?..0>CC73//;DD=m+,,<:;>6;:DPQQPZjkcA:;;>NQP;.//MQQRbkN:;;:DQF0//.3BQ40//1=45`-6GQPPW[>;;=I7//:ULHHQIWDFBAACJJHGHHGNVVRRWh\YOIA;::;63KRQQOFLSRRSdSURRbkgRZLDD>;;91.;:1//=QQIDDFPR[jjsiHFFOZklljoll^wDEEC=5//1HOFEEKUgloeFCBHdllksjllhjMHHA6554Fc@2+,-.6EwaOk@9++*(5q\:/*(2jV757CMNOQPN^@6(.`O*,66=KMMNORah{;,RW+(*+28GMMViTJJKTB=>?gUGIJJH?:997FKLNMSvNMNNG?:6774+:MMOQNdfZNNKA@>8776.*-EMMNPPRgdSNNMD@@;772++*5KMMODeg^NNI@@?8775-++@MMFDCRhgWNOOMC@AA=8771++2JNNJAADEJhbQOOHAA@;885-,,MNNG37IPQRSSRQN>3587885Xa@OXg q;78ENNOSF?AHTTMAA@B=86Pi9KNP`l gms:7H[}qab b`̬dE@6**++-/5Se57GIOcb baiԩsHIC554=;CBFTUL`bbޯwPVQCC;8iCGUNG`bb`ⰭuHURDCC?14FCGRFF`bb`ᰫtBPRDCC6-17CFJCE`bbݮoAGODCC=/-03mCABCC|db bakԩeACFCCB4../3HDC6?DBmuab b`ŢXCD<@DD;//37D0/4=1//04RNGHHR[ǂb`bba`eǧ\ZZOGGJQHHLUdSRQ]q٫{ga``biҪtbd`TRR]hWRRVj[P^iafҭccYRRUgkbRRUSkefW`caiܭecc^SRR`kkjZQRRTOi{RQYc`VjҸѼ_\caVRQXikkeTRRSI{˜VQRR\[WUi˯óԫ_VX`YRRSdkk]RRMF{jbSRRNQWWUaḁ̀ZVWVRR\jkkhVRRPGFqkkj[RPFFQWWVXsд~cVVMEMRUgkkaSRJEGlllgUKDDFOVWVTplXTTLEEHR`llkZOEEHikll[IHHOWZWKSanw|{uk]RVTUThWACCBPjlldLHIKilljNMRQQSZ`|NUTTUSKOOLB:<<=NgllYIQRTp               420(*.4<ȿۼȾۿؿ󪲷ѾƿԾֹٿҼ๴¿н𨱷Ų˪ӵоش٫ἴпὴ䬴մѾгݸ®ݱӧĴæ׺۫Οة޽Ǧæߺ򽴳齩֯߶꾨Ũܰ𶧨뱨ҫݩ񰪩伬򯶿̬Ŭܪ¹ưеɦŷꩭ ȧýȸ ǧ̫槮úٿ竩к򾮯÷ۮƦĬث𱮶Թְٮ۶ӶƻӵͶ俶ȷٹŸ¸Ż Ὸ 軸 Ᾰ ⸶ཷ ݮܵ ֯ܵ ڱܷ೴ۺ縲Ƭίίݱ԰éڲݵ߸Ҵºù̴ÿ˹Կֹ׳༻޷̸»ཱϾDzúǫ"20(*.4<d?>mPRRN7/1?EE9006<<;CPYjllp>CPRRSt|kllhG;MQ_llz@MRRPjllV<<;kKRRK3/00TUTT^iXTTURH@z:<<5?Ce:==608OSSUoRH22ITTWhmbTTLDcF<==:1>gA<=:211BSSXgO9009QTTammkZSTTRQPHD:==<41Fy:=<51104LSR^`C11DTTYkmmfUTTRh·^<==811oL<=8110=RRgS501105NTTUemml^SSf;==;311==<3112GPu?0110?STS\lmmiU[;==611`?=711.0C\.0113JTVglkkm?=:211ZC;201100[Z0010.-.;;CR_nnjF@EGG6AGDtm:>>@OTVgnnlqώkJDGF9DC :>>HTTS\mnnodAm-AqsJ5=@ :>AQTTdnnmOKTTXknno^?>>==qicT?1223AE|=;xn;@OUUTWioX>>MJHTM6229G69A{v2:IUU^eD>>=^AAP>223?_GMCbϦbBDEIJJKMJJGyHJKEDDI]l]ha[XSTVVND?>>?;:RUURRTKRWVVWeniSUVVRIGA??>62DUURRNHKUVV\m|ziUVVULHHF??:326NUUT|PIHHPVVWhoZVVPHHC??=5332?TUUVrKHHJTVV`oofWVVTJHHG@??8334JUUXhGHHNVVYkoom_VVNHHD??<4332:RU[]GHHIRVVcoo iZVSIHHGA?>633EU]XGHHLUV\moo xbWLHHE?:3327N\WGHHPWgoo qXKIIB744AUVFGGI]noo ZVUSSDCEE@HR@AAC]ppoo [YXVVN7?IIH9>T?@@KXipp aXYVVT>36EII@49Y>@@?DTV^oppfXYVVI443@@NVVfppqWZWR:3445CII=443e=@@?GUVVZmppWYF4439GIID5441n:@@BQVVbppV;8544@IIH:3440}4?@@JVVXjpU8964437FIA441n2;@DSVVU^o?88543vB3Нr]X__LKKFAA?^S25ͣwvILMMGCNp476ϝiZOG9788מ}yu!20(*.4<                1.,#%(+.3<޷񴱭ۭתť˩ڪؽ۳ڴڭӪӳȪิ ¯޽Ѧ߸ۮܵ򱨧Ӿ׳Чаڭɬ׹īɪտﱻ׬ػﵴܾͼ򰪩ٶ·ٳѴڲüѸڶڰ˺޹Ŷ۰ùǸܼٺڳ򿮨ȯ㫨ſµھȰطԼüĭѭ°ɷͰخɽܾݴ ƶ ໺º 䯰  ɾծ ϸ¸㯯 鰯 簯  ݮ  ˮ  󼶷 ƾ Է Ĵ  Ƽ⻸ °޷޷Ųٸ޸ﴸԻĹߺﯸͰٷ༬رű공๴շ͹츴ǸǽոҸ໹𹳱߿򷲳𷼼򬭲.,#%(+.3<lm[=DQRRQ`SFUWWLCFD>:RK;;DQ[kllfC?OSTsllgE;=KRRPu24AORSTSSQI833;<<:9>NRSdllQ;<==MS>h/11;FA2114RSSTG7TjSTTXi^TTLC=9t;<<=86NTSSTUs2HSSO7/N^STTbmhWTTPFF@RSSH211-y3OTTWimml\STTLFFC?b7110/3N`x113ITP8011.l-ATTammhVTPGFF=110/.6Ov110:QC11/`.4KZkmm`SJFFBe1.6TbZPJ5B8334Y13?ennkTIIGN^~W;22@@wED;;==<@Y;>CU<@OYknnS?MTTRTlBEGG;VGF713;>>=FQ=ITTannobA=CRTRWxO.aFGGA6EGG>226=>=HNARTTVinnlL=>>HX~]C10JMGGD9GmGB5122:>=INKTTS]mnno\?=;Aq|XRN711:VFGGF=5R/1224==HQPRSTTUennhF;?hpVRTT@122bBGGB8CNu60226=UzlZRSTYlnnT<\mA=NTTK422/u9GGE;5~F6LJ012[ќcSTbobRzE<>>ESS<22/q2CH@8F?305vd;فTVkL<>>?LG3220^29C:6IDDCAgfgHIJJIKGDDB]HENG_eWVVS qNTUUNVca^l]m\VVTs 6:RUURIIRVV\kjnohWVT b0EUUTLHHLUVVWn}o`U^07OUUPHHPVVUookWn52@TUUSJHHJTVVUoaw825KUUNHHNVV^oky722AACEZ pqcM GII?5=@@BDP pnN; QHIIE638?@@CDO pq^?uXGIIH<344<@@DCU pjGvY@CSr߭yEkFIIG9344@@KSRR@X.2:eEII@4458:Hly]=@@CRWH1{041kBIF7344698Ud=@@IQ91c33;ZD<34588?vGIIJHBATMAB?HDCEFEcUWWN@UXYyVXWhva[Xj8PWWU?4HXUUXXYgh4AVWWJ549RVu\Z[\56LWWS;454DXapW_54=4.0", "idna>=2.0"] def read(name): fname = here / name with fname.open(encoding="utf8") as f: return f.read() args = dict( name="yarl", version=version, description=("Yet another URL library"), long_description="\n\n".join([read("README.rst"), read("CHANGES.rst")]), classifiers=[ "License :: OSI Approved :: Apache Software License", "Intended Audience :: Developers", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Internet :: WWW/HTTP", ], author="Andrew Svetlov", author_email="andrew.svetlov@gmail.com", url="https://github.com/aio-libs/yarl/", license="Apache 2", packages=["yarl"], install_requires=install_requires, python_requires=">=3.5", include_package_data=True, ) if not NO_EXTENSIONS: print("**********************") print("* Accellerated build *") print("**********************") setup(ext_modules=extensions, **args) else: print("*********************") print("* Pure Python build *") print("*********************") setup(**args) yarl-1.4.2/tests/0000755000175100001650000000000013572034534014125 5ustar vstsdocker00000000000000yarl-1.4.2/tests/test_cached_property.py0000644000175100001650000000141213572034522020704 0ustar vstsdocker00000000000000import pytest from yarl import cached_property def test_reify(): class A: def __init__(self): self._cache = {} @cached_property def prop(self): return 1 a = A() assert 1 == a.prop def test_reify_class(): class A: def __init__(self): self._cache = {} @cached_property def prop(self): """Docstring.""" return 1 assert isinstance(A.prop, cached_property) assert "Docstring." == A.prop.__doc__ def test_reify_assignment(): class A: def __init__(self): self._cache = {} @cached_property def prop(self): return 1 a = A() with pytest.raises(AttributeError): a.prop = 123 yarl-1.4.2/tests/test_normalize_path.py0000644000175100001650000000145713572034522020556 0ustar vstsdocker00000000000000import pytest from yarl import URL PATHS = [ # No dots ("", ""), ("/", "/"), ("//", "//"), ("///", "///"), # Single-dot ("path/to", "path/to"), ("././path/to", "path/to"), ("path/./to", "path/to"), ("path/././to", "path/to"), ("path/to/.", "path/to/"), ("path/to/./.", "path/to/"), # Double-dots ("../path/to", "path/to"), ("path/../to", "to"), ("path/../../to", "to"), # Non-ASCII characters ("μονοπάτι/../../να/ᴜɴɪ/ᴄᴏᴅᴇ", "να/ᴜɴɪ/ᴄᴏᴅᴇ"), ("μονοπάτι/../../να/𝕦𝕟𝕚/𝕔𝕠𝕕𝕖/.", "να/𝕦𝕟𝕚/𝕔𝕠𝕕𝕖/"), ] @pytest.mark.parametrize("original,expected", PATHS) def test__normalize_path(original, expected): assert URL._normalize_path(original) == expected yarl-1.4.2/tests/test_pickle.py0000644000175100001650000000066513572034522017011 0ustar vstsdocker00000000000000import pickle from yarl import URL # serialize def test_pickle(): u1 = URL("test") hash(u1) v = pickle.dumps(u1) u2 = pickle.loads(v) assert u1._cache assert not u2._cache assert hash(u1) == hash(u2) def test_default_style_state(): u = URL("test") hash(u) u.__setstate__((None, {"_val": "test", "_strict": False, "_cache": {"hash": 1}})) assert not u._cache assert u._val == "test" yarl-1.4.2/tests/test_quoting.py0000644000175100001650000002270113572034522017223 0ustar vstsdocker00000000000000import pytest from yarl.quoting import _PyQuoter, _PyUnquoter, _Quoter, _Unquoter @pytest.fixture(params=[_PyQuoter, _Quoter], ids=["py_quoter", "c_quoter"]) def quoter(request): return request.param @pytest.fixture(params=[_PyUnquoter, _Unquoter], ids=["py_unquoter", "c_unquoter"]) def unquoter(request): return request.param def hexescape(char): """Escape char as RFC 2396 specifies""" hex_repr = hex(ord(char))[2:].upper() if len(hex_repr) == 1: hex_repr = "0%s" % hex_repr return "%" + hex_repr def test_quote_not_allowed_non_strict(quoter): assert quoter()("%HH") == "%25HH" def test_quote_unfinished_tail_percent_non_strict(quoter): assert quoter()("%") == "%25" def test_quote_unfinished_tail_non_strict(quoter): assert quoter()("%2") == "%252" def test_quote_from_bytes(quoter): assert quoter()("archaeological arcana") == "archaeological%20arcana" assert quoter()("") == "" def test_quote_ignore_broken_unicode(quoter): s = quoter()( "j\u001a\udcf4q\udcda/\udc97g\udcee\udccb\u000ch\udccb" "\u0018\udce4v\u001b\udce2\udcce\udccecom/y\udccepj\u0016" ) assert s == "j%1Aq%2Fg%0Ch%18v%1Bcom%2Fypj%16" assert quoter()(s) == s def test_unquote_to_bytes(unquoter): assert unquoter()("abc%20def") == "abc def" assert unquoter()("") == "" def test_never_quote(quoter): # Make sure quote() does not quote letters, digits, and "_,.-~" do_not_quote = ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" "_.-~" ) assert quoter()(do_not_quote) == do_not_quote assert quoter(qs=True)(do_not_quote) == do_not_quote def test_safe(quoter): # Test setting 'safe' parameter does what it should do quote_by_default = "<>" assert quoter(safe=quote_by_default)(quote_by_default) == quote_by_default ret = quoter(safe=quote_by_default, qs=True)(quote_by_default) assert ret == quote_by_default _SHOULD_QUOTE = [chr(num) for num in range(32)] _SHOULD_QUOTE.append(r'<>#"{}|\^[]`') _SHOULD_QUOTE.append(chr(127)) # For 0x7F SHOULD_QUOTE = "".join(_SHOULD_QUOTE) @pytest.mark.parametrize("char", SHOULD_QUOTE) def test_default_quoting(char, quoter): # Make sure all characters that should be quoted are by default sans # space (separate test for that). result = quoter()(char) assert hexescape(char) == result result = quoter(qs=True)(char) assert hexescape(char) == result # TODO: should it encode percent? def test_default_quoting_percent(quoter): result = quoter()("%25") assert "%25" == result result = quoter(qs=True)("%25") assert "%25" == result def test_default_quoting_partial(quoter): partial_quote = "ab[]cd" expected = "ab%5B%5Dcd" result = quoter()(partial_quote) assert expected == result result = quoter(qs=True)(partial_quote) assert expected == result def test_quoting_space(quoter): # Make sure quote() and quote_plus() handle spaces as specified in # their unique way result = quoter()(" ") assert result == hexescape(" ") result = quoter(qs=True)(" ") assert result == "+" given = "a b cd e f" expect = given.replace(" ", hexescape(" ")) result = quoter()(given) assert expect == result expect = given.replace(" ", "+") result = quoter(qs=True)(given) assert expect == result def test_quoting_plus(quoter): assert quoter(qs=False)("alpha+beta gamma") == "alpha+beta%20gamma" assert quoter(qs=True)("alpha+beta gamma") == "alpha%2Bbeta+gamma" assert quoter(safe="+", qs=True)("alpha+beta gamma") == "alpha+beta+gamma" def test_quote_with_unicode(quoter): # Characters in Latin-1 range, encoded by default in UTF-8 given = "\u00a2\u00d8ab\u00ff" expect = "%C2%A2%C3%98ab%C3%BF" result = quoter()(given) assert expect == result # Characters in BMP, encoded by default in UTF-8 given = "\u6f22\u5b57" # "Kanji" expect = "%E6%BC%A2%E5%AD%97" result = quoter()(given) assert expect == result def test_quote_plus_with_unicode(quoter): # Characters in Latin-1 range, encoded by default in UTF-8 given = "\u00a2\u00d8ab\u00ff" expect = "%C2%A2%C3%98ab%C3%BF" result = quoter(qs=True)(given) assert expect == result # Characters in BMP, encoded by default in UTF-8 given = "\u6f22\u5b57" # "Kanji" expect = "%E6%BC%A2%E5%AD%97" result = quoter(qs=True)(given) assert expect == result @pytest.mark.parametrize("num", list(range(128))) def test_unquoting(num, unquoter): # Make sure unquoting of all ASCII values works given = hexescape(chr(num)) expect = chr(num) result = unquoter()(given) assert expect == result if expect not in "+=&;": result = unquoter(qs=True)(given) assert expect == result @pytest.mark.xfail # FIXME: Expected value should be the same as given. # See https://url.spec.whatwg.org/#percent-encoded-bytes def test_unquoting_bad_percent_escapes_1(unquoter): assert "%" == unquoter()("%") @pytest.mark.xfail # FIXME: Expected value should be the same as given. # See https://url.spec.whatwg.org/#percent-encoded-bytes def test_unquoting_bad_percent_escapes_2(unquoter): assert "%x" == unquoter()("%x") @pytest.mark.xfail # FIXME: Expected value should be the same as given. # See https://url.spec.whatwg.org/#percent-encoded-bytes def test_unquoting_bad_percent_escapes_3(unquoter): assert "%xa" == unquoter()("%xa") @pytest.mark.xfail # FIXME: After conversion to bytes, should not cause UTF-8 decode fail. # See https://url.spec.whatwg.org/#percent-encoded-bytes def test_unquoting_invalid_utf8_sequence(unquoter): with pytest.raises(ValueError): unquoter()("%AB") with pytest.raises(ValueError): unquoter()("%AB%AB") def test_unquoting_mixed_case_percent_escapes(unquoter): expected = "𝕦" assert expected == unquoter()("%F0%9D%95%A6") assert expected == unquoter()("%F0%9d%95%a6") assert expected == unquoter()("%f0%9D%95%a6") assert expected == unquoter()("%f0%9d%95%a6") def test_unquoting_parts(unquoter): # Make sure unquoting works when have non-quoted characters # interspersed given = "ab" + hexescape("c") + "d" expect = "abcd" result = unquoter()(given) assert expect == result result = unquoter(qs=True)(given) assert expect == result def test_quote_None(quoter): assert quoter()(None) is None def test_unquote_None(unquoter): assert unquoter()(None) is None def test_quote_empty_string(quoter): assert quoter()("") == "" def test_unquote_empty_string(unquoter): assert unquoter()("") == "" def test_quote_bad_types(quoter): with pytest.raises(TypeError): quoter()(123) def test_unquote_bad_types(unquoter): with pytest.raises(TypeError): unquoter()(123) def test_quote_lowercase(quoter): assert quoter()("%d1%84") == "%D1%84" def test_quote_unquoted(quoter): assert quoter()("%41") == "A" def test_quote_space(quoter): assert quoter()(" ") == "%20" # NULL # test to see if this would work to fix # coverage on this file. def test_quote_percent_last_character(quoter): # % is last character in this case. assert quoter()("%") == "%25" def test_unquote_unsafe(unquoter): assert unquoter(unsafe="@")("%40") == "%40" def test_unquote_unsafe2(unquoter): assert unquoter(unsafe="@")("%40abc") == "%40abc" def test_unquote_unsafe3(unquoter): assert unquoter(qs=True)("a%2Bb=?%3D%2B%26") == "a%2Bb=?%3D%2B%26" def test_unquote_unsafe4(unquoter): assert unquoter(unsafe="@")("a@b") == "a%40b" def test_unquote_non_ascii(unquoter): assert unquoter()("%F8") == "%F8" def test_unquote_non_ascii_non_tailing(unquoter): assert unquoter()("%F8ab") == "%F8ab" def test_quote_non_ascii(quoter): assert quoter()("%F8") == "%F8" def test_quote_non_ascii2(quoter): assert quoter()("a%F8b") == "a%F8b" class StrLike(str): pass def test_quote_str_like(quoter): assert quoter()(StrLike("abc")) == "abc" def test_unquote_str_like(unquoter): assert unquoter()(StrLike("abc")) == "abc" def test_quote_sub_delims(quoter): assert quoter()("!$&'()*+,;=") == "!$&'()*+,;=" def test_requote_sub_delims(quoter): assert quoter()("%21%24%26%27%28%29%2A%2B%2C%3B%3D") == "!$&'()*+,;=" def test_unquoting_plus(unquoter): assert unquoter(qs=False)("a+b") == "a+b" def test_unquote_plus_to_space(unquoter): assert unquoter(qs=True)("a+b") == "a b" def test_unquote_plus_to_space_unsafe(unquoter): assert unquoter(unsafe="+", qs=True)("a+b") == "a+b" def test_qoute_qs_with_colon(quoter): s = quoter(safe="=+&?/:@", qs=True)("next=http%3A//example.com/") assert s == "next=http://example.com/" def test_quote_protected(quoter): s = quoter(protected="/")("/path%2fto/three") assert s == "/path%2Fto/three" def test_quote_fastpath_safe(): s1 = "/path/to" s2 = _Quoter(safe="/")(s1) assert s1 is s2 def test_quote_fastpath_pct(): s1 = "abc%A0" s2 = _Quoter()(s1) assert s1 is s2 def test_quote_very_large_string(quoter): # more than 8 KiB s = "abcфух%30%0a" * 1024 assert quoter()(s) == "abc%D1%84%D1%83%D1%850%0A" * 1024 def test_space(quoter): s = "% A" assert quoter()(s) == "%25%20A" def test_quoter_path_with_plus(quoter): s = "/test/x+y%2Bz/:+%2B/" assert "/test/x+y%2Bz/:+%2B/" == quoter(safe="@:", protected="/+")(s) def test_unquoter_path_with_plus(unquoter): s = "/test/x+y%2Bz/:+%2B/" assert "/test/x+y+z/:++/" == unquoter(unsafe="+")(s) yarl-1.4.2/tests/test_update_query.py0000644000175100001650000001350013572034522020241 0ustar vstsdocker00000000000000import pytest from multidict import MultiDict from yarl import URL # with_query def test_with_query(): url = URL("http://example.com") assert str(url.with_query({"a": "1"})) == "http://example.com/?a=1" def test_update_query(): url = URL("http://example.com/") assert str(url.update_query({"a": "1"})) == "http://example.com/?a=1" assert str(URL("test").update_query(a=1)) == "test?a=1" url = URL("http://example.com/?foo=bar") expected_url = URL("http://example.com/?foo=bar&baz=foo") assert url.update_query({"baz": "foo"}) == expected_url assert url.update_query(baz="foo") == expected_url assert url.update_query("baz=foo") == expected_url def test_update_query_with_args_and_kwargs(): url = URL("http://example.com/") with pytest.raises(ValueError): url.update_query("a", foo="bar") def test_update_query_with_multiple_args(): url = URL("http://example.com/") with pytest.raises(ValueError): url.update_query("a", "b") def test_with_query_list_of_pairs(): url = URL("http://example.com") assert str(url.with_query([("a", "1")])) == "http://example.com/?a=1" def test_with_query_list_non_pairs(): url = URL("http://example.com") with pytest.raises(ValueError): url.with_query(["a=1", "b=2" "c=3"]) def test_with_query_kwargs(): url = URL("http://example.com") q = url.with_query(query="1", query2="1").query assert q == dict(query="1", query2="1") def test_with_query_kwargs_and_args_are_mutually_exclusive(): url = URL("http://example.com") with pytest.raises(ValueError): url.with_query({"a": "2", "b": "4"}, a="1") def test_with_query_only_single_arg_is_supported(): url = URL("http://example.com") u1 = url.with_query(b=3) u2 = URL("http://example.com/?b=3") assert u1 == u2 with pytest.raises(ValueError): url.with_query("a=1", "a=b") def test_with_query_empty_dict(): url = URL("http://example.com/?a=b") new_url = url.with_query({}) assert new_url.query_string == "" assert str(new_url) == "http://example.com/" def test_with_query_empty_str(): url = URL("http://example.com/?a=b") assert str(url.with_query("")) == "http://example.com/" def test_with_query_empty_value(): url = URL("http://example.com/") assert str(url.with_query({"a": ""})) == "http://example.com/?a=" def test_with_query_str(): url = URL("http://example.com") assert str(url.with_query("a=1&b=2")) == "http://example.com/?a=1&b=2" def test_with_query_str_non_ascii_and_spaces(): url = URL("http://example.com") url2 = url.with_query("a=1 2&b=знач") assert url2.raw_query_string == "a=1+2&b=%D0%B7%D0%BD%D0%B0%D1%87" assert url2.query_string == "a=1 2&b=знач" def test_with_query_int(): url = URL("http://example.com") assert url.with_query({"a": 1}) == URL("http://example.com/?a=1") def test_with_query_kwargs_int(): url = URL("http://example.com") assert url.with_query(b=2) == URL("http://example.com/?b=2") def test_with_query_list_int(): url = URL("http://example.com") assert str(url.with_query([("a", 1)])) == "http://example.com/?a=1" def test_with_query_non_str(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query({"a": 1.1}) def test_with_query_bool(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query({"a": True}) def test_with_query_none(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query({"a": None}) def test_with_query_list_non_str(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query([("a", 1.0)]) def test_with_query_list_bool(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query([("a", False)]) def test_with_query_multidict(): url = URL("http://example.com/path") q = MultiDict([("a", "b"), ("c", "d")]) assert str(url.with_query(q)) == "http://example.com/path?a=b&c=d" def test_with_multidict_with_spaces_and_non_ascii(): url = URL("http://example.com") url2 = url.with_query({"a b": "ю б"}) assert url2.raw_query_string == "a+b=%D1%8E+%D0%B1" def test_with_query_multidict_with_unsafe(): url = URL("http://example.com/path") url2 = url.with_query({"a+b": "?=+&;"}) assert url2.raw_query_string == "a%2Bb=?%3D%2B%26%3B" assert url2.query_string == "a%2Bb=?%3D%2B%26%3B" assert url2.query == {"a+b": "?=+&;"} def test_with_query_None(): url = URL("http://example.com/path?a=b") assert url.with_query(None).query_string == "" def test_with_query_bad_type(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query(123) def test_with_query_bytes(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query(b"123") def test_with_query_bytearray(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query(bytearray(b"123")) def test_with_query_memoryview(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query(memoryview(b"123")) def test_with_query_params(): url = URL("http://example.com/get") url2 = url.with_query([("key", "1;2;3")]) assert str(url2) == "http://example.com/get?key=1%3B2%3B3" def test_with_query_params2(): url = URL("http://example.com/get") url2 = url.with_query({"key": "1;2;3"}) assert str(url2) == "http://example.com/get?key=1%3B2%3B3" def test_with_query_only(): url = URL() url2 = url.with_query(key="value") assert str(url2) == "?key=value" def test_update_query_multiple_keys(): url = URL("http://example.com/path?a=1&a=2") u2 = url.update_query([("a", "3"), ("a", "4")]) assert str(u2) == "http://example.com/path?a=3&a=4" yarl-1.4.2/tests/test_url.py0000644000175100001650000007235313572034522016347 0ustar vstsdocker00000000000000import sys import pytest from urllib.parse import SplitResult from yarl import URL @pytest.mark.skipif( sys.version_info < (3, 6), reason="The feature requires Python 3.6+" ) def test_inheritance(): with pytest.raises(TypeError) as ctx: class MyURL(URL): pass assert ( "Inheritance a class " ".MyURL'> " "from URL is forbidden" == str(ctx.value) ) def test_str_subclass(): class S(str): pass assert str(URL(S("http://example.com"))) == "http://example.com" def test_is(): u1 = URL("http://example.com") u2 = URL(u1) assert u1 is u2 def test_bool(): assert URL("http://example.com") assert not URL() assert not URL("") def test_absolute_url_without_host(): with pytest.raises(ValueError): URL("http://:8080/") def test_url_is_not_str(): url = URL("http://example.com") assert not isinstance(url, str) def test_str(): url = URL("http://example.com:8888/path/to?a=1&b=2") assert str(url) == "http://example.com:8888/path/to?a=1&b=2" def test_repr(): url = URL("http://example.com") assert "URL('http://example.com')" == repr(url) def test_origin(): url = URL("http://user:password@example.com:8888/path/to?a=1&b=2") assert URL("http://example.com:8888") == url.origin() def test_origin_not_absolute_url(): url = URL("/path/to?a=1&b=2") with pytest.raises(ValueError): url.origin() def test_origin_no_scheme(): url = URL("//user:password@example.com:8888/path/to?a=1&b=2") with pytest.raises(ValueError): url.origin() def test_drop_dots(): u = URL("http://example.com/path/../to") assert str(u) == "http://example.com/to" def test_abs_cmp(): assert URL("http://example.com:8888") == URL("http://example.com:8888") assert URL("http://example.com:8888/") == URL("http://example.com:8888/") assert URL("http://example.com:8888/") == URL("http://example.com:8888") assert URL("http://example.com:8888") == URL("http://example.com:8888/") def test_abs_hash(): url = URL("http://example.com:8888") url_trailing = URL("http://example.com:8888/") assert hash(url) == hash(url_trailing) # properties def test_scheme(): url = URL("http://example.com") assert "http" == url.scheme def test_raw_user(): url = URL("http://user@example.com") assert "user" == url.raw_user def test_raw_user_non_ascii(): url = URL("http://вася@example.com") assert "%D0%B2%D0%B0%D1%81%D1%8F" == url.raw_user def test_no_user(): url = URL("http://example.com") assert url.user is None def test_user_non_ascii(): url = URL("http://вася@example.com") assert "вася" == url.user def test_raw_password(): url = URL("http://user:password@example.com") assert "password" == url.raw_password def test_raw_password_non_ascii(): url = URL("http://user:пароль@example.com") assert "%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C" == url.raw_password def test_password_non_ascii(): url = URL("http://user:пароль@example.com") assert "пароль" == url.password def test_password_without_user(): url = URL("http://:password@example.com") assert url.user is None assert "password" == url.password def test_user_empty_password(): url = URL("http://user:@example.com") assert "user" == url.user assert "" == url.password def test_raw_host(): url = URL("http://example.com") assert "example.com" == url.raw_host def test_raw_host_non_ascii(): url = URL("http://историк.рф") assert "xn--h1aagokeh.xn--p1ai" == url.raw_host def test_host_non_ascii(): url = URL("http://историк.рф") assert "историк.рф" == url.host def test_localhost(): url = URL("http://[::1]") assert "::1" == url.host def test_host_with_underscore(): url = URL("http://abc_def.com") assert "abc_def.com" == url.host def test_raw_host_when_port_is_specified(): url = URL("http://example.com:8888") assert "example.com" == url.raw_host def test_raw_host_from_str_with_ipv4(): url = URL("http://127.0.0.1:80") assert url.raw_host == "127.0.0.1" def test_raw_host_from_str_with_ipv6(): url = URL("http://[::1]:80") assert url.raw_host == "::1" def test_lowercase(): url = URL("http://gitHUB.com") assert url.raw_host == "github.com" assert url.host == url.raw_host def test_lowercase_nonascii(): url = URL("http://Айдеко.Рф") assert url.raw_host == "xn--80aidohy.xn--p1ai" assert url.host == "айдеко.рф" def test_compressed_ipv6(): url = URL("http://[1DEC:0:0:0::1]") assert url.raw_host == "1dec::1" assert url.host == url.raw_host def test_ipv6_zone(): url = URL("http://[fe80::822a:a8ff:fe49:470c%тест%42]:123") assert url.raw_host == "fe80::822a:a8ff:fe49:470c%тест%42" assert url.host == url.raw_host def test_ipv4_zone(): # I'm unsure if it is correct. url = URL("http://1.2.3.4%тест%42:123") assert url.raw_host == "1.2.3.4%тест%42" assert url.host == url.raw_host def test_port_for_explicit_port(): url = URL("http://example.com:8888") assert 8888 == url.port def test_port_for_implicit_port(): url = URL("http://example.com") assert 80 == url.port def test_port_for_relative_url(): url = URL("/path/to") assert url.port is None def test_port_for_unknown_scheme(): url = URL("unknown://example.com") assert url.port is None def test_explicit_port_for_explicit_port(): url = URL("http://example.com:8888") assert 8888 == url.explicit_port def test_explicit_port_for_implicit_port(): url = URL("http://example.com") assert url.explicit_port is None def test_explicit_port_for_relative_url(): url = URL("/path/to") assert url.explicit_port is None def test_explicit_port_for_unknown_scheme(): url = URL("unknown://example.com") assert url.explicit_port is None def test_raw_path_string_empty(): url = URL("http://example.com") assert "/" == url.raw_path def test_raw_path(): url = URL("http://example.com/path/to") assert "/path/to" == url.raw_path def test_raw_path_non_ascii(): url = URL("http://example.com/путь/сюда") assert "/%D0%BF%D1%83%D1%82%D1%8C/%D1%81%D1%8E%D0%B4%D0%B0" == url.raw_path def test_path_non_ascii(): url = URL("http://example.com/путь/сюда") assert "/путь/сюда" == url.path def test_path_with_spaces(): url = URL("http://example.com/a b/test") assert "/a b/test" == url.path url = URL("http://example.com/a b") assert "/a b" == url.path def test_raw_path_for_empty_url(): url = URL() assert "" == url.raw_path def test_raw_path_for_colon_and_at(): url = URL("http://example.com/path:abc@123") assert url.raw_path == "/path:abc@123" def test_raw_query_string(): url = URL("http://example.com?a=1&b=2") assert url.raw_query_string == "a=1&b=2" def test_raw_query_string_non_ascii(): url = URL("http://example.com?б=в&ю=к") assert url.raw_query_string == "%D0%B1=%D0%B2&%D1%8E=%D0%BA" def test_query_string_non_ascii(): url = URL("http://example.com?б=в&ю=к") assert url.query_string == "б=в&ю=к" def test_path_qs(): url = URL("http://example.com/") assert url.path_qs == "/" url = URL("http://example.com/?б=в&ю=к") assert url.path_qs == "/?б=в&ю=к" url = URL("http://example.com/path?б=в&ю=к") assert url.path_qs == "/path?б=в&ю=к" def test_raw_path_qs(): url = URL("http://example.com/") assert url.raw_path_qs == "/" url = URL("http://example.com/?б=в&ю=к") assert url.raw_path_qs == "/?%D0%B1=%D0%B2&%D1%8E=%D0%BA" url = URL("http://example.com/path?б=в&ю=к") assert url.raw_path_qs == "/path?%D0%B1=%D0%B2&%D1%8E=%D0%BA" url = URL("http://example.com/путь?a=1&b=2") assert url.raw_path_qs == "/%D0%BF%D1%83%D1%82%D1%8C?a=1&b=2" def test_query_string_spaces(): url = URL("http://example.com?a+b=c+d&e=f+g") assert url.query_string == "a b=c d&e=f g" # raw fragment def test_raw_fragment_empty(): url = URL("http://example.com") assert "" == url.raw_fragment def test_raw_fragment(): url = URL("http://example.com/path#anchor") assert "anchor" == url.raw_fragment def test_raw_fragment_non_ascii(): url = URL("http://example.com/path#якорь") assert "%D1%8F%D0%BA%D0%BE%D1%80%D1%8C" == url.raw_fragment def test_raw_fragment_safe(): url = URL("http://example.com/path#a?b/c:d@e") assert "a?b/c:d@e" == url.raw_fragment def test_fragment_non_ascii(): url = URL("http://example.com/path#якорь") assert "якорь" == url.fragment def test_raw_parts_empty(): url = URL("http://example.com") assert ("/",) == url.raw_parts def test_raw_parts(): url = URL("http://example.com/path/to") assert ("/", "path", "to") == url.raw_parts def test_raw_parts_without_path(): url = URL("http://example.com") assert ("/",) == url.raw_parts def test_raw_path_parts_with_2F_in_path(): url = URL("http://example.com/path%2Fto/three") assert ("/", "path%2Fto", "three") == url.raw_parts def test_raw_path_parts_with_2f_in_path(): url = URL("http://example.com/path%2fto/three") assert ("/", "path%2Fto", "three") == url.raw_parts def test_raw_parts_for_relative_path(): url = URL("path/to") assert ("path", "to") == url.raw_parts def test_raw_parts_for_relative_path_starting_from_slash(): url = URL("/path/to") assert ("/", "path", "to") == url.raw_parts def test_raw_parts_for_relative_double_path(): url = URL("path/to") assert url.raw_parts == url.raw_parts def test_parts_for_empty_url(): url = URL() assert ("",) == url.raw_parts def test_raw_parts_non_ascii(): url = URL("http://example.com/путь/сюда") assert ( "/", "%D0%BF%D1%83%D1%82%D1%8C", "%D1%81%D1%8E%D0%B4%D0%B0", ) == url.raw_parts def test_parts_non_ascii(): url = URL("http://example.com/путь/сюда") assert ("/", "путь", "сюда") == url.parts def test_name_for_empty_url(): url = URL() assert "" == url.raw_name def test_raw_name(): url = URL("http://example.com/path/to#frag") assert "to" == url.raw_name def test_raw_name_root(): url = URL("http://example.com/#frag") assert "" == url.raw_name def test_raw_name_root2(): url = URL("http://example.com") assert "" == url.raw_name def test_raw_name_root3(): url = URL("http://example.com/") assert "" == url.raw_name def test_relative_raw_name(): url = URL("path/to") assert "to" == url.raw_name def test_relative_raw_name_starting_from_slash(): url = URL("/path/to") assert "to" == url.raw_name def test_relative_raw_name_slash(): url = URL("/") assert "" == url.raw_name def test_name_non_ascii(): url = URL("http://example.com/путь") assert url.name == "путь" def test_plus_in_path(): url = URL("http://example.com/test/x+y%2Bz/:+%2B/") assert "/test/x+y+z/:++/" == url.path def test_nonascii_in_qs(): url = URL("http://example.com") url2 = url.with_query({"f\xf8\xf8": "f\xf8\xf8"}) assert "http://example.com/?f%C3%B8%C3%B8=f%C3%B8%C3%B8" == str(url2) # modifiers def test_parent_raw_path(): url = URL("http://example.com/path/to") assert url.parent.raw_path == "/path" def test_parent_raw_parts(): url = URL("http://example.com/path/to") assert url.parent.raw_parts == ("/", "path") def test_double_parent_raw_path(): url = URL("http://example.com/path/to") assert url.parent.parent.raw_path == "/" def test_empty_parent_raw_path(): url = URL("http://example.com/") assert url.parent.parent.raw_path == "/" def test_empty_parent_raw_path2(): url = URL("http://example.com") assert url.parent.parent.raw_path == "/" def test_clear_fragment_on_getting_parent(): url = URL("http://example.com/path/to#frag") assert URL("http://example.com/path") == url.parent def test_clear_fragment_on_getting_parent_toplevel(): url = URL("http://example.com/#frag") assert URL("http://example.com/") == url.parent def test_clear_query_on_getting_parent(): url = URL("http://example.com/path/to?a=b") assert URL("http://example.com/path") == url.parent def test_clear_query_on_getting_parent_toplevel(): url = URL("http://example.com/?a=b") assert URL("http://example.com/") == url.parent # truediv def test_div_root(): url = URL("http://example.com") assert str(url / "path" / "to") == "http://example.com/path/to" def test_div_root_with_slash(): url = URL("http://example.com/") assert str(url / "path" / "to") == "http://example.com/path/to" def test_div(): url = URL("http://example.com/path") assert str(url / "to") == "http://example.com/path/to" def test_div_with_slash(): url = URL("http://example.com/path/") assert str(url / "to") == "http://example.com/path/to" def test_div_path_starting_from_slash_is_forbidden(): url = URL("http://example.com/path/") with pytest.raises(ValueError): url / "/to/others" def test_div_cleanup_query_and_fragment(): url = URL("http://example.com/path?a=1#frag") assert str(url / "to") == "http://example.com/path/to" def test_div_for_empty_url(): url = URL() / "a" assert url.raw_parts == ("a",) def test_div_for_relative_url(): url = URL("a") / "b" assert url.raw_parts == ("a", "b") def test_div_for_relative_url_started_with_slash(): url = URL("/a") / "b" assert url.raw_parts == ("/", "a", "b") def test_div_non_ascii(): url = URL("http://example.com/path") url2 = url / "сюда" assert url2.path == "/path/сюда" assert url2.raw_path == "/path/%D1%81%D1%8E%D0%B4%D0%B0" assert url2.parts == ("/", "path", "сюда") assert url2.raw_parts == ("/", "path", "%D1%81%D1%8E%D0%B4%D0%B0") def test_div_with_colon_and_at(): url = URL("http://example.com/base") / "path:abc@123" assert url.raw_path == "/base/path:abc@123" def test_div_with_dots(): url = URL("http://example.com/base") / "../path/./to" assert url.raw_path == "/path/to" # with_path def test_with_path(): url = URL("http://example.com") assert str(url.with_path("/test")) == "http://example.com/test" def test_with_path_encoded(): url = URL("http://example.com") assert str(url.with_path("/test", encoded=True)) == "http://example.com/test" def test_with_path_dots(): url = URL("http://example.com") assert str(url.with_path("/test/.")) == "http://example.com/test/" def test_with_path_relative(): url = URL("/path") assert str(url.with_path("/new")) == "/new" def test_with_path_query(): url = URL("http://example.com?a=b") assert str(url.with_path("/test")) == "http://example.com/test" def test_with_path_fragment(): url = URL("http://example.com#frag") assert str(url.with_path("/test")) == "http://example.com/test" def test_with_path_empty(): url = URL("http://example.com/test") assert str(url.with_path("")) == "http://example.com" def test_with_path_leading_slash(): url = URL("http://example.com") assert url.with_path("test").path == "/test" # with_fragment def test_with_fragment(): url = URL("http://example.com") assert str(url.with_fragment("frag")) == "http://example.com/#frag" def test_with_fragment_safe(): url = URL("http://example.com") u2 = url.with_fragment("a:b?c@d/e") assert str(u2) == "http://example.com/#a:b?c@d/e" def test_with_fragment_non_ascii(): url = URL("http://example.com") url2 = url.with_fragment("фрагм") assert url2.raw_fragment == "%D1%84%D1%80%D0%B0%D0%B3%D0%BC" assert url2.fragment == "фрагм" def test_with_fragment_None(): url = URL("http://example.com/path#frag") url2 = url.with_fragment(None) assert str(url2) == "http://example.com/path" def test_with_fragment_None_matching(): url = URL("http://example.com/path") url2 = url.with_fragment(None) assert url is url2 def test_with_fragment_matching(): url = URL("http://example.com/path#frag") url2 = url.with_fragment("frag") assert url is url2 def test_with_fragment_bad_type(): url = URL("http://example.com") with pytest.raises(TypeError): url.with_fragment(123) # with_name def test_with_name(): url = URL("http://example.com/a/b") assert url.raw_parts == ("/", "a", "b") url2 = url.with_name("c") assert url2.raw_parts == ("/", "a", "c") def test_with_name_for_naked_path(): url = URL("http://example.com") url2 = url.with_name("a") assert url2.raw_parts == ("/", "a") def test_with_name_for_relative_path(): url = URL("a") url2 = url.with_name("b") assert url2.raw_parts == ("b",) def test_with_name_for_relative_path2(): url = URL("a/b") url2 = url.with_name("c") assert url2.raw_parts == ("a", "c") def test_with_name_for_relative_path_starting_from_slash(): url = URL("/a") url2 = url.with_name("b") assert url2.raw_parts == ("/", "b") def test_with_name_for_relative_path_starting_from_slash2(): url = URL("/a/b") url2 = url.with_name("c") assert url2.raw_parts == ("/", "a", "c") def test_with_name_empty(): url = URL("http://example.com/path/to").with_name("") assert str(url) == "http://example.com/path/" def test_with_name_non_ascii(): url = URL("http://example.com/path").with_name("путь") assert url.path == "/путь" assert url.raw_path == "/%D0%BF%D1%83%D1%82%D1%8C" assert url.parts == ("/", "путь") assert url.raw_parts == ("/", "%D0%BF%D1%83%D1%82%D1%8C") def test_with_name_with_slash(): with pytest.raises(ValueError): URL("http://example.com").with_name("a/b") def test_with_name_non_str(): with pytest.raises(TypeError): URL("http://example.com").with_name(123) def test_with_name_within_colon_and_at(): url = URL("http://example.com/oldpath").with_name("path:abc@123") assert url.raw_path == "/path:abc@123" def test_with_name_dot(): with pytest.raises(ValueError): URL("http://example.com").with_name(".") def test_with_name_double_dot(): with pytest.raises(ValueError): URL("http://example.com").with_name("..") # is_absolute def test_is_absolute_for_relative_url(): url = URL("/path/to") assert not url.is_absolute() def test_is_absolute_for_absolute_url(): url = URL("http://example.com") assert url.is_absolute() def test_is_non_absolute_for_empty_url(): url = URL() assert not url.is_absolute() def test_is_non_absolute_for_empty_url2(): url = URL("") assert not url.is_absolute() def test_is_absolute_path_starting_from_double_slash(): url = URL("//www.python.org") assert url.is_absolute() # is_default_port def test_is_default_port_for_relative_url(): url = URL("/path/to") assert not url.is_default_port() def test_is_default_port_for_absolute_url_without_port(): url = URL("http://example.com") assert url.is_default_port() def test_is_default_port_for_absolute_url_with_default_port(): url = URL("http://example.com:80") assert url.is_default_port() def test_is_default_port_for_absolute_url_with_nondefault_port(): url = URL("http://example.com:8080") assert not url.is_default_port() def test_is_default_port_for_unknown_scheme(): url = URL("unknown://example.com:8080") assert not url.is_default_port() # def test_no_scheme(): url = URL("example.com") assert url.raw_host is None assert url.raw_path == "example.com" assert str(url) == "example.com" def test_no_scheme2(): url = URL("example.com/a/b") assert url.raw_host is None assert url.raw_path == "example.com/a/b" assert str(url) == "example.com/a/b" def test_from_non_allowed(): with pytest.raises(TypeError): URL(1234) def test_from_idna(): url = URL("http://xn--jxagkqfkduily1i.eu") assert "http://xn--jxagkqfkduily1i.eu" == str(url) url = URL("http://xn--einla-pqa.de/") # needs idna 2008 assert "http://xn--einla-pqa.de/" == str(url) def test_to_idna(): url = URL("http://εμπορικόσήμα.eu") assert "http://xn--jxagkqfkduily1i.eu" == str(url) url = URL("http://einlaß.de/") assert "http://xn--einla-pqa.de/" == str(url) def test_from_ascii_login(): url = URL("http://" "%D0%B2%D0%B0%D1%81%D1%8F" "@host:1234/") assert ("http://" "%D0%B2%D0%B0%D1%81%D1%8F" "@host:1234/") == str(url) def test_from_non_ascii_login(): url = URL("http://вася@host:1234/") assert ("http://" "%D0%B2%D0%B0%D1%81%D1%8F" "@host:1234/") == str(url) def test_from_ascii_login_and_password(): url = URL( "http://" "%D0%B2%D0%B0%D1%81%D1%8F" ":%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C" "@host:1234/" ) assert ( "http://" "%D0%B2%D0%B0%D1%81%D1%8F" ":%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C" "@host:1234/" ) == str(url) def test_from_non_ascii_login_and_password(): url = URL("http://вася:пароль@host:1234/") assert ( "http://" "%D0%B2%D0%B0%D1%81%D1%8F" ":%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C" "@host:1234/" ) == str(url) def test_from_ascii_path(): url = URL("http://example.com/" "%D0%BF%D1%83%D1%82%D1%8C/%D1%82%D1%83%D0%B4%D0%B0") assert ( "http://example.com/" "%D0%BF%D1%83%D1%82%D1%8C/%D1%82%D1%83%D0%B4%D0%B0" ) == str(url) def test_from_ascii_path_lower_case(): url = URL("http://example.com/" "%d0%bf%d1%83%d1%82%d1%8c/%d1%82%d1%83%d0%b4%d0%b0") assert ( "http://example.com/" "%D0%BF%D1%83%D1%82%D1%8C/%D1%82%D1%83%D0%B4%D0%B0" ) == str(url) def test_from_non_ascii_path(): url = URL("http://example.com/путь/туда") assert ( "http://example.com/" "%D0%BF%D1%83%D1%82%D1%8C/%D1%82%D1%83%D0%B4%D0%B0" ) == str(url) def test_from_ascii_query_parts(): url = URL( "http://example.com/" "?%D0%BF%D0%B0%D1%80%D0%B0%D0%BC" "=%D0%B7%D0%BD%D0%B0%D1%87" ) assert ( "http://example.com/" "?%D0%BF%D0%B0%D1%80%D0%B0%D0%BC" "=%D0%B7%D0%BD%D0%B0%D1%87" ) == str(url) def test_from_non_ascii_query_parts(): url = URL("http://example.com/?парам=знач") assert ( "http://example.com/" "?%D0%BF%D0%B0%D1%80%D0%B0%D0%BC" "=%D0%B7%D0%BD%D0%B0%D1%87" ) == str(url) def test_from_non_ascii_query_parts2(): url = URL("http://example.com/?п=з&ю=б") assert "http://example.com/?%D0%BF=%D0%B7&%D1%8E=%D0%B1" == str(url) def test_from_ascii_fragment(): url = URL("http://example.com/" "#%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82") assert ( "http://example.com/" "#%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82" ) == str(url) def test_from_bytes_with_non_ascii_fragment(): url = URL("http://example.com/#фрагмент") assert ( "http://example.com/" "#%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82" ) == str(url) def test_to_str(): url = URL("http://εμπορικόσήμα.eu/") assert "http://xn--jxagkqfkduily1i.eu/" == str(url) def test_to_str_long(): url = URL( "https://host-12345678901234567890123456789012345678901234567890" "-name:8888/" ) expected = ( "https://host-" "12345678901234567890123456789012345678901234567890" "-name:8888/" ) assert expected == str(url) def test_decoding_with_2F_in_path(): url = URL("http://example.com/path%2Fto") assert "http://example.com/path%2Fto" == str(url) assert url == URL(str(url)) def test_decoding_with_26_and_3D_in_query(): url = URL("http://example.com/?%26=%3D") assert "http://example.com/?%26=%3D" == str(url) assert url == URL(str(url)) def test_fragment_only_url(): url = URL("#frag") assert str(url) == "#frag" def test_url_from_url(): url = URL("http://example.com") assert URL(url) == url assert URL(url).raw_parts == ("/",) def test_lowercase_scheme(): url = URL("HTTP://example.com") assert str(url) == "http://example.com" def test_str_for_empty_url(): url = URL() assert "" == str(url) def test_parent_for_empty_url(): url = URL() assert url is url.parent def test_empty_value_for_query(): url = URL("http://example.com/path").with_query({"a": ""}) assert str(url) == "http://example.com/path?a=" def test_none_value_for_query(): with pytest.raises(TypeError): URL("http://example.com/path").with_query({"a": None}) def test_decode_pct_in_path(): url = URL("http://www.python.org/%7Eguido") assert "http://www.python.org/~guido" == str(url) def test_decode_pct_in_path_lower_case(): url = URL("http://www.python.org/%7eguido") assert "http://www.python.org/~guido" == str(url) # join def test_join(): base = URL("http://www.cwi.nl/%7Eguido/Python.html") url = URL("FAQ.html") url2 = base.join(url) assert str(url2) == "http://www.cwi.nl/~guido/FAQ.html" def test_join_absolute(): base = URL("http://www.cwi.nl/%7Eguido/Python.html") url = URL("//www.python.org/%7Eguido") url2 = base.join(url) assert str(url2) == "http://www.python.org/~guido" def test_join_non_url(): base = URL("http://example.com") with pytest.raises(TypeError): base.join("path/to") NORMAL = [ ("g:h", "g:h"), ("g", "http://a/b/c/g"), ("./g", "http://a/b/c/g"), ("g/", "http://a/b/c/g/"), ("/g", "http://a/g"), ("//g", "http://g"), ("?y", "http://a/b/c/d;p?y"), ("g?y", "http://a/b/c/g?y"), ("#s", "http://a/b/c/d;p?q#s"), ("g#s", "http://a/b/c/g#s"), ("g?y#s", "http://a/b/c/g?y#s"), (";x", "http://a/b/c/;x"), ("g;x", "http://a/b/c/g;x"), ("g;x?y#s", "http://a/b/c/g;x?y#s"), ("", "http://a/b/c/d;p?q"), (".", "http://a/b/c/"), ("./", "http://a/b/c/"), ("..", "http://a/b/"), ("../", "http://a/b/"), ("../g", "http://a/b/g"), ("../..", "http://a/"), ("../../", "http://a/"), ("../../g", "http://a/g"), ] @pytest.mark.parametrize("url,expected", NORMAL) def test_join_from_rfc_3986_normal(url, expected): # test case from https://tools.ietf.org/html/rfc3986.html#section-5.4 base = URL("http://a/b/c/d;p?q") url = URL(url) expected = URL(expected) assert base.join(url) == expected ABNORMAL = [ ("../../../g", "http://a/g"), ("../../../../g", "http://a/g"), ("/./g", "http://a/g"), ("/../g", "http://a/g"), ("g.", "http://a/b/c/g."), (".g", "http://a/b/c/.g"), ("g..", "http://a/b/c/g.."), ("..g", "http://a/b/c/..g"), ("./../g", "http://a/b/g"), ("./g/.", "http://a/b/c/g/"), ("g/./h", "http://a/b/c/g/h"), ("g/../h", "http://a/b/c/h"), ("g;x=1/./y", "http://a/b/c/g;x=1/y"), ("g;x=1/../y", "http://a/b/c/y"), ("g?y/./x", "http://a/b/c/g?y/./x"), ("g?y/../x", "http://a/b/c/g?y/../x"), ("g#s/./x", "http://a/b/c/g#s/./x"), ("g#s/../x", "http://a/b/c/g#s/../x"), ] @pytest.mark.skipif( sys.version_info < (3, 5), reason="Python 3.4 doen't support abnormal cases" ) @pytest.mark.parametrize("url,expected", ABNORMAL) def test_join_from_rfc_3986_abnormal(url, expected): # test case from https://tools.ietf.org/html/rfc3986.html#section-5.4.2 base = URL("http://a/b/c/d;p?q") url = URL(url) expected = URL(expected) assert base.join(url) == expected def test_split_result_non_decoded(): with pytest.raises(ValueError): URL(SplitResult("http", "example.com", "path", "qs", "frag")) def test_human_repr(): url = URL("http://вася:пароль@хост.домен:8080/путь/сюда?арг=вал#фраг") s = url.human_repr() assert s == "http://вася:пароль@хост.домен:8080/путь/сюда?арг=вал#фраг" def test_human_repr_defaults(): url = URL("путь") s = url.human_repr() assert s == "путь" def test_human_repr_default_port(): url = URL("http://вася:пароль@хост.домен/путь/сюда?арг=вал#фраг") s = url.human_repr() assert s == "http://вася:пароль@хост.домен/путь/сюда?арг=вал#фраг" # relative def test_relative(): url = URL("http://user:pass@example.com:8080/path?a=b#frag") rel = url.relative() assert str(rel) == "/path?a=b#frag" def test_relative_is_relative(): url = URL("http://user:pass@example.com:8080/path?a=b#frag") rel = url.relative() assert not rel.is_absolute() def test_relative_abs_parts_are_removed(): url = URL("http://user:pass@example.com:8080/path?a=b#frag") rel = url.relative() assert not rel.scheme assert not rel.user assert not rel.password assert not rel.host assert not rel.port def test_relative_fails_on_rel_url(): with pytest.raises(ValueError): URL("/path?a=b#frag").relative() def test_slash_and_question_in_query(): u = URL("http://example.com/path?http://example.com/p?a#b") assert u.query_string == "http://example.com/p?a" def test_slash_and_question_in_fragment(): u = URL("http://example.com/path#http://example.com/p?a") assert u.fragment == "http://example.com/p?a" def test_requoting(): u = URL("http://127.0.0.1/?next=http%3A//example.com/") assert u.raw_query_string == "next=http://example.com/" assert str(u) == "http://127.0.0.1/?next=http://example.com/" yarl-1.4.2/tests/test_url_build.py0000644000175100001650000001163313572034522017520 0ustar vstsdocker00000000000000import pytest from yarl import URL # build classmethod def test_build_without_arguments(): u = URL.build() assert str(u) == "" def test_build_simple(): u = URL.build(scheme="http", host="127.0.0.1") assert str(u) == "http://127.0.0.1" def test_build_with_scheme(): with pytest.raises(ValueError): URL.build(scheme="http") def test_build_with_host(): u = URL.build(host="127.0.0.1") assert str(u) == "//127.0.0.1" assert u == URL("//127.0.0.1") def test_build_with_scheme_and_host(): u = URL.build(scheme="http", host="127.0.0.1") assert str(u) == "http://127.0.0.1" assert u == URL("http://127.0.0.1") def test_build_with_port(): with pytest.raises(ValueError): URL.build(port=8000) u = URL.build(scheme="http", host="127.0.0.1", port=8000) assert str(u) == "http://127.0.0.1:8000" def test_build_with_user(): u = URL.build(scheme="http", host="127.0.0.1", user="foo") assert str(u) == "http://foo@127.0.0.1" def test_build_with_user_password(): u = URL.build(scheme="http", host="127.0.0.1", user="foo", password="bar") assert str(u) == "http://foo:bar@127.0.0.1" def test_build_with_query_and_query_string(): with pytest.raises(ValueError): URL.build( scheme="http", host="127.0.0.1", user="foo", password="bar", port=8000, path="/index.html", query=dict(arg="value1"), query_string="arg=value1", fragment="top", ) def test_build_with_all(): u = URL.build( scheme="http", host="127.0.0.1", user="foo", password="bar", port=8000, path="/index.html", query_string="arg=value1", fragment="top", ) assert str(u) == "http://foo:bar@127.0.0.1:8000/index.html?arg=value1#top" def test_query_str(): u = URL.build(scheme="http", host="127.0.0.1", path="/", query_string="arg=value1") assert str(u) == "http://127.0.0.1/?arg=value1" def test_query_dict(): u = URL.build(scheme="http", host="127.0.0.1", path="/", query=dict(arg="value1")) assert str(u) == "http://127.0.0.1/?arg=value1" def test_build_path_quoting(): u = URL.build( scheme="http", host="127.0.0.1", path="/файл.jpg", query=dict(arg="Привет") ) assert u == URL("http://127.0.0.1/файл.jpg?arg=Привет") assert str(u) == ( "http://127.0.0.1/%D1%84%D0%B0%D0%B9%D0%BB.jpg?" "arg=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" ) def test_build_query_quoting(): u = URL.build(scheme="http", host="127.0.0.1", path="/файл.jpg", query="arg=Привет") assert u == URL("http://127.0.0.1/файл.jpg?arg=Привет") assert str(u) == ( "http://127.0.0.1/%D1%84%D0%B0%D0%B9%D0%BB.jpg?" "arg=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" ) def test_build_query_only(): u = URL.build(query={"key": "value"}) assert str(u) == "?key=value" def test_build_drop_dots(): u = URL.build(scheme="http", host="example.com", path="/path/../to") assert str(u) == "http://example.com/to" def test_build_encode(): u = URL.build( scheme="http", host="историк.рф", path="/путь/файл", query_string="ключ=знач", fragment="фраг", ) expected = ( "http://xn--h1aagokeh.xn--p1ai" "/%D0%BF%D1%83%D1%82%D1%8C/%D1%84%D0%B0%D0%B9%D0%BB" "?%D0%BA%D0%BB%D1%8E%D1%87=%D0%B7%D0%BD%D0%B0%D1%87" "#%D1%84%D1%80%D0%B0%D0%B3" ) assert str(u) == expected def test_build_already_encoded(): # resulting URL is invalid but not encoded u = URL.build( scheme="http", host="историк.рф", path="/путь/файл", query_string="ключ=знач", fragment="фраг", encoded=True, ) assert str(u) == "http://историк.рф/путь/файл?ключ=знач#фраг" def test_build_with_authority_with_path_with_leading_slash(): u = URL.build(scheme="http", host="example.com", path="/path_with_leading_slash") assert str(u) == "http://example.com/path_with_leading_slash" def test_build_with_authority_with_empty_path(): u = URL.build(scheme="http", host="example.com", path="") assert str(u) == "http://example.com" def test_build_with_authority_with_path_without_leading_slash(): with pytest.raises(ValueError): URL.build(scheme="http", host="example.com", path="path_without_leading_slash") def test_build_with_none_path(): with pytest.raises(TypeError): URL.build(scheme="http", host="example.com", path=None) def test_build_with_none_query_string(): with pytest.raises(TypeError): URL.build(scheme="http", host="example.com", query_string=None) def test_build_with_none_fragment(): with pytest.raises(TypeError): URL.build(scheme="http", host="example.com", fragment=None) yarl-1.4.2/tests/test_url_cmp_and_hash.py0000644000175100001650000000315413572034522021024 0ustar vstsdocker00000000000000from yarl import URL # comparison and hashing def test_ne_str(): url = URL("http://example.com/") assert url != "http://example.com/" def test_eq(): url = URL("http://example.com/") assert url == URL("http://example.com/") def test_hash(): assert hash(URL("http://example.com/")) == hash(URL("http://example.com/")) def test_hash_double_call(): url = URL("http://example.com/") assert hash(url) == hash(url) def test_le_less(): url1 = URL("http://example1.com/") url2 = URL("http://example2.com/") assert url1 <= url2 def test_le_eq(): url1 = URL("http://example.com/") url2 = URL("http://example.com/") assert url1 <= url2 def test_le_not_implemented(): url = URL("http://example1.com/") assert url.__le__(123) is NotImplemented def test_lt(): url1 = URL("http://example1.com/") url2 = URL("http://example2.com/") assert url1 < url2 def test_lt_not_implemented(): url = URL("http://example1.com/") assert url.__lt__(123) is NotImplemented def test_ge_more(): url1 = URL("http://example1.com/") url2 = URL("http://example2.com/") assert url2 >= url1 def test_ge_eq(): url1 = URL("http://example.com/") url2 = URL("http://example.com/") assert url2 >= url1 def test_ge_not_implemented(): url = URL("http://example1.com/") assert url.__ge__(123) is NotImplemented def test_gt(): url1 = URL("http://example1.com/") url2 = URL("http://example2.com/") assert url2 > url1 def test_gt_not_implemented(): url = URL("http://example1.com/") assert url.__gt__(123) is NotImplemented yarl-1.4.2/tests/test_url_parsing.py0000644000175100001650000004103513572034522020063 0ustar vstsdocker00000000000000import sys import pytest from yarl import URL class TestScheme: def test_scheme_path(self): u = URL("scheme:path") assert u.scheme == "scheme" assert u.host is None assert u.path == "path" assert u.query_string == "" assert u.fragment == "" def test_scheme_path_other(self): u = URL("scheme:path:other") assert u.scheme == "scheme" assert u.host is None assert u.path == "path:other" assert u.query_string == "" assert u.fragment == "" def test_complex_scheme(self): u = URL("allow+chars-33.:path") assert u.scheme == "allow+chars-33." assert u.host is None assert u.path == "path" assert u.query_string == "" assert u.fragment == "" def test_scheme_only(self): u = URL("simple:") assert u.scheme == "simple" assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "" def test_no_scheme1(self): u = URL("google.com:80") assert u.scheme == "" assert u.host is None assert u.path == "google.com:80" assert u.query_string == "" assert u.fragment == "" def test_no_scheme2(self): u = URL("google.com:80/root") assert u.scheme == "google.com" assert u.host is None assert u.path == "80/root" assert u.query_string == "" assert u.fragment == "" def test_not_a_scheme1(self): u = URL("not_cheme:path") assert u.scheme == "" assert u.host is None assert u.path == "not_cheme:path" assert u.query_string == "" assert u.fragment == "" def test_not_a_scheme2(self): u = URL("37signals:book") assert u.scheme == "37signals" assert u.host is None assert u.path == "book" assert u.query_string == "" assert u.fragment == "" def test_scheme_rel_path1(self): u = URL(":relative-path") assert u.scheme == "" assert u.host is None assert u.path == ":relative-path" assert u.query_string == "" assert u.fragment == "" def test_scheme_rel_path2(self): u = URL(":relative/path") assert u.scheme == "" assert u.host is None assert u.path == ":relative/path" assert u.query_string == "" assert u.fragment == "" def test_scheme_weird(self): u = URL("://and-this") assert u.scheme == "" assert u.host is None assert u.path == "://and-this" assert u.query_string == "" assert u.fragment == "" class TestHost: def test_canonical(self): u = URL("scheme://host/path") assert u.scheme == "scheme" assert u.host == "host" assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_absolute_no_scheme(self): u = URL("//host/path") assert u.scheme == "" assert u.host == "host" assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_absolute_no_scheme_complex_host(self): u = URL("//host+path") assert u.scheme == "" assert u.host == "host+path" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_absolute_no_scheme_simple_host(self): u = URL("//host") assert u.scheme == "" assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_weird_host(self): u = URL("//this+is$also&host!") assert u.scheme == "" assert u.host == "this+is$also&host!" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_scheme_no_host(self): u = URL("scheme:/host/path") assert u.scheme == "scheme" assert u.host is None assert u.path == "/host/path" assert u.query_string == "" assert u.fragment == "" def test_scheme_no_host2(self): u = URL("scheme:///host/path") assert u.scheme == "scheme" assert u.host is None assert u.path == "/host/path" assert u.query_string == "" assert u.fragment == "" def test_no_scheme_no_host(self): u = URL("scheme//host/path") assert u.scheme == "" assert u.host is None assert u.path == "scheme//host/path" assert u.query_string == "" assert u.fragment == "" def test_ipv4(self): u = URL("//127.0.0.1/") assert u.scheme == "" assert u.host == "127.0.0.1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_masked_ipv4(self): u = URL("//[127.0.0.1]/") assert u.scheme == "" assert u.host == "127.0.0.1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_ipv6(self): u = URL("//[::1]/") assert u.scheme == "" assert u.host == "::1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_strange_ip(self): u = URL("//[-1]/") assert u.scheme == "" assert u.host == "-1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_strange_ip_2(self): u = URL("//[v1.-1]/") assert u.scheme == "" assert u.host == "v1.-1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_strange_ip_3(self): u = URL("//v1.[::1]/") assert u.scheme == "" assert u.host == "::1" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" class TestPort: def test_canonical(self): u = URL("//host:80/path") assert u.scheme == "" assert u.host == "host" assert u.port == 80 assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_no_path(self): u = URL("//host:80") assert u.scheme == "" assert u.host == "host" assert u.port == 80 assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_no_host(self): with pytest.raises(ValueError): URL("//:80") def test_double_port(self): with pytest.raises(ValueError): URL("//h:22:80/") def test_bad_port(self): with pytest.raises(ValueError): URL("//h:no/path") def test_another_bad_port(self): with pytest.raises(ValueError): URL("//h:22:no/path") @pytest.mark.skipif(sys.version_info < (3, 6), reason="Requires Python 3.6+") def test_bad_port_again(self): with pytest.raises(ValueError): URL("//h:-80/path") class TestUserInfo: def test_canonical(self): u = URL("sch://user@host/") assert u.scheme == "sch" assert u.user == "user" assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_user_pass(self): u = URL("//user:pass@host") assert u.scheme == "" assert u.user == "user" assert u.password == "pass" assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_complex_userinfo(self): u = URL("//user:pas:and:more@host") assert u.scheme == "" assert u.user == "user" assert u.password == "pas:and:more" assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_no_user(self): u = URL("//:pas:@host") assert u.scheme == "" assert u.user is None assert u.password == "pas:" assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_weird_user(self): u = URL("//!($&')*+,;=@host") assert u.scheme == "" assert u.user == "!($&')*+,;=" assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_weird_user2(self): u = URL("//user@info@ya.ru") assert u.scheme == "" assert u.user == "user@info" assert u.password is None assert u.host == "ya.ru" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_weird_user3(self): u = URL("//[some]@host") assert u.scheme == "" assert u.user == "[some]" assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" class TestQuery_String: def test_simple(self): u = URL("?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "query" assert u.fragment == "" def test_scheme_query(self): u = URL("http:?query") assert u.scheme == "http" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "query" assert u.fragment == "" def test_abs_url_query(self): u = URL("//host?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "query" assert u.fragment == "" def test_abs_url_path_query(self): u = URL("//host/path?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/path" assert u.query_string == "query" assert u.fragment == "" def test_double_question_mark(self): u = URL("//ho?st/path?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "ho" assert u.path == "/" assert u.query_string == "st/path?query" assert u.fragment == "" def test_complex_query(self): u = URL("?a://b:c@d.e/f?g#h") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "a://b:c@d.e/f?g" assert u.fragment == "h" def test_query_in_fragment(self): u = URL("#?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "?query" class TestFragment: def test_simple(self): u = URL("#frag") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "frag" def test_scheme_frag(self): u = URL("http:#frag") assert u.scheme == "http" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "frag" def test_host_frag(self): u = URL("//host#frag") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "frag" def test_scheme_path_frag(self): u = URL("//host/path#frag") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/path" assert u.query_string == "" assert u.fragment == "frag" def test_scheme_query_frag(self): u = URL("//host?query#frag") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "query" assert u.fragment == "frag" def test_host_frag_query(self): u = URL("//ho#st/path?query") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "ho" assert u.path == "/" assert u.query_string == "" assert u.fragment == "st/path?query" def test_complex_frag(self): u = URL("#a://b:c@d.e/f?g#h") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "a://b:c@d.e/f?g#h" class TestStripEmptyParts: def test_all_empty(self): with pytest.raises(ValueError): URL("//@:?#") def test_path_only(self): u = URL("///path") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_empty_user(self): u = URL("//@host") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_empty_port(self): u = URL("//host:") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_empty_port_and_path(self): u = URL("//host:/") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host == "host" assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_empty_path_only(self): u = URL("/") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "/" assert u.query_string == "" assert u.fragment == "" def test_relative_path_only(self): u = URL("path") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "path" assert u.query_string == "" assert u.fragment == "" def test_path(self): u = URL("/path") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_empty_query_with_path(self): u = URL("/path?") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_empty_query(self): u = URL("?") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "" def test_empty_query_with_frag(self): u = URL("?#frag") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "frag" def test_path_empty_frag(self): u = URL("/path#") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "/path" assert u.query_string == "" assert u.fragment == "" def test_empty_path(self): u = URL("#") assert u.scheme == "" assert u.user is None assert u.password is None assert u.host is None assert u.path == "" assert u.query_string == "" assert u.fragment == "" yarl-1.4.2/tests/test_url_query.py0000644000175100001650000000324013572034522017561 0ustar vstsdocker00000000000000from urllib.parse import urlencode from multidict import MultiDict, MultiDictProxy from yarl import URL # query def test_query_spaces(): url = URL("http://example.com?a+b=c+d") assert url.query == MultiDict({"a b": "c d"}) def test_query_empty(): url = URL("http://example.com") assert isinstance(url.query, MultiDictProxy) assert url.query == MultiDict() def test_query(): url = URL("http://example.com?a=1&b=2") assert url.query == MultiDict([("a", "1"), ("b", "2")]) def test_query_repeated_args(): url = URL("http://example.com?a=1&b=2&a=3") assert url.query == MultiDict([("a", "1"), ("b", "2"), ("a", "3")]) def test_query_empty_arg(): url = URL("http://example.com?a") assert url.query == MultiDict([("a", "")]) def test_query_dont_unqoute_twice(): sample_url = "http://base.place?" + urlencode({"a": "/////"}) query = urlencode({"url": sample_url}) full_url = "http://test_url.aha?" + query url = URL(full_url) assert url.query["url"] == sample_url def test_query_nonascii(): url = URL("http://example.com?ключ=знач") assert url.query == MultiDict({"ключ": "знач"}) # query separators def test_ampersand_as_separator(): u = URL("http://127.0.0.1/?a=1&b=2") assert len(u.query) == 2 def test_ampersand_as_value(): u = URL("http://127.0.0.1/?a=1%26b=2") assert len(u.query) == 1 assert u.query["a"] == "1&b=2" def test_semicolon_as_separator(): u = URL("http://127.0.0.1/?a=1;b=2") assert len(u.query) == 2 def test_semicolon_as_value(): u = URL("http://127.0.0.1/?a=1%3Bb=2") assert len(u.query) == 1 assert u.query["a"] == "1;b=2" yarl-1.4.2/tests/test_url_update_netloc.py0000644000175100001650000001026513572034522021247 0ustar vstsdocker00000000000000import pytest from yarl import URL # with_* def test_with_scheme(): url = URL("http://example.com") assert str(url.with_scheme("https")) == "https://example.com" def test_with_scheme_uppercased(): url = URL("http://example.com") assert str(url.with_scheme("HTTPS")) == "https://example.com" def test_with_scheme_for_relative_url(): with pytest.raises(ValueError): URL("path/to").with_scheme("http") def test_with_scheme_invalid_type(): url = URL("http://example.com") with pytest.raises(TypeError): assert str(url.with_scheme(123)) def test_with_user(): url = URL("http://example.com") assert str(url.with_user("john")) == "http://john@example.com" def test_with_user_non_ascii(): url = URL("http://example.com") url2 = url.with_user("вася") assert url2.raw_user == "%D0%B2%D0%B0%D1%81%D1%8F" assert url2.user == "вася" def test_with_user_for_relative_url(): with pytest.raises(ValueError): URL("path/to").with_user("user") def test_with_user_invalid_type(): url = URL("http://example.com:123") with pytest.raises(TypeError): url.with_user(123) def test_with_user_None(): url = URL("http://john@example.com") assert str(url.with_user(None)) == "http://example.com" def test_with_user_None_when_password_present(): url = URL("http://john:pass@example.com") assert str(url.with_user(None)) == "http://example.com" def test_with_password(): url = URL("http://john@example.com") assert str(url.with_password("pass")) == "http://john:pass@example.com" def test_with_password_non_ascii(): url = URL("http://john@example.com") url2 = url.with_password("пароль") assert url2.raw_password == "%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C" assert url2.password == "пароль" def test_with_password_non_ascii_with_colon(): url = URL("http://john@example.com") url2 = url.with_password("п:а") assert url2.raw_password == "%D0%BF%3A%D0%B0" assert url2.password == "п:а" def test_with_password_for_relative_url(): with pytest.raises(ValueError): URL("path/to").with_password("pass") def test_with_password_None(): url = URL("http://john:pass@example.com") assert str(url.with_password(None)) == "http://john@example.com" def test_with_password_invalid_type(): url = URL("http://example.com:123") with pytest.raises(TypeError): url.with_password(123) def test_with_password_and_empty_user(): url = URL("http://example.com") url2 = url.with_password("pass") assert url2.password == "pass" assert url2.user is None assert str(url2) == "http://:pass@example.com" def test_from_str_with_host_ipv4(): url = URL("http://host:80") url = url.with_host("192.168.1.1") assert url.raw_host == "192.168.1.1" def test_from_str_with_host_ipv6(): url = URL("http://host:80") url = url.with_host("::1") assert url.raw_host == "::1" def test_with_host(): url = URL("http://example.com:123") assert str(url.with_host("example.org")) == "http://example.org:123" def test_with_host_empty(): url = URL("http://example.com:123") with pytest.raises(ValueError): url.with_host("") def test_with_host_non_ascii(): url = URL("http://example.com:123") url2 = url.with_host("историк.рф") assert url2.raw_host == "xn--h1aagokeh.xn--p1ai" assert url2.host == "историк.рф" def test_with_host_for_relative_url(): with pytest.raises(ValueError): URL("path/to").with_host("example.com") def test_with_host_invalid_type(): url = URL("http://example.com:123") with pytest.raises(TypeError): url.with_host(None) def test_with_port(): url = URL("http://example.com") assert str(url.with_port(8888)) == "http://example.com:8888" def test_with_port_keeps_query_and_fragment(): url = URL("http://example.com/?a=1#frag") assert str(url.with_port(8888)) == "http://example.com:8888/?a=1#frag" def test_with_port_for_relative_url(): with pytest.raises(ValueError): URL("path/to").with_port(1234) def test_with_port_invalid_type(): with pytest.raises(TypeError): URL("http://example.com").with_port("123") yarl-1.4.2/yarl/0000755000175100001650000000000013572034534013732 5ustar vstsdocker00000000000000yarl-1.4.2/yarl/__init__.py0000644000175100001650000007677213572034522016063 0ustar vstsdocker00000000000000import sys import warnings from collections.abc import Mapping, Sequence from ipaddress import ip_address from urllib.parse import SplitResult, parse_qsl, urljoin, urlsplit, urlunsplit from multidict import MultiDict, MultiDictProxy import idna from .quoting import _Quoter, _Unquoter __version__ = "1.4.2" __all__ = ("URL",) DEFAULT_PORTS = {"http": 80, "https": 443, "ws": 80, "wss": 443} sentinel = object() class cached_property: """Use as a class method decorator. It operates almost exactly like the Python `@property` decorator, but it puts the result of the method it decorates into the instance dict after the first call, effectively replacing the function it decorates with an instance variable. It is, in Python parlance, a data descriptor. """ def __init__(self, wrapped): self.wrapped = wrapped try: self.__doc__ = wrapped.__doc__ except AttributeError: # pragma: no cover self.__doc__ = "" self.name = wrapped.__name__ def __get__(self, inst, owner, _sentinel=sentinel): if inst is None: return self val = inst._cache.get(self.name, _sentinel) if val is not _sentinel: return val val = self.wrapped(inst) inst._cache[self.name] = val return val def __set__(self, inst, value): raise AttributeError("cached property is read-only") class URL: # Don't derive from str # follow pathlib.Path design # probably URL will not suffer from pathlib problems: # it's intended for libraries like aiohttp, # not to be passed into standard library functions like os.open etc. # URL grammar (RFC 3986) # pct-encoded = "%" HEXDIG HEXDIG # reserved = gen-delims / sub-delims # gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" # / "*" / "+" / "," / ";" / "=" # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" # URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] # hier-part = "//" authority path-abempty # / path-absolute # / path-rootless # / path-empty # scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) # authority = [ userinfo "@" ] host [ ":" port ] # userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) # host = IP-literal / IPv4address / reg-name # IP-literal = "[" ( IPv6address / IPvFuture ) "]" # IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) # IPv6address = 6( h16 ":" ) ls32 # / "::" 5( h16 ":" ) ls32 # / [ h16 ] "::" 4( h16 ":" ) ls32 # / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 # / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 # / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 # / [ *4( h16 ":" ) h16 ] "::" ls32 # / [ *5( h16 ":" ) h16 ] "::" h16 # / [ *6( h16 ":" ) h16 ] "::" # ls32 = ( h16 ":" h16 ) / IPv4address # ; least-significant 32 bits of address # h16 = 1*4HEXDIG # ; 16 bits of address represented in hexadecimal # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet # dec-octet = DIGIT ; 0-9 # / %x31-39 DIGIT ; 10-99 # / "1" 2DIGIT ; 100-199 # / "2" %x30-34 DIGIT ; 200-249 # / "25" %x30-35 ; 250-255 # reg-name = *( unreserved / pct-encoded / sub-delims ) # port = *DIGIT # path = path-abempty ; begins with "/" or is empty # / path-absolute ; begins with "/" but not "//" # / path-noscheme ; begins with a non-colon segment # / path-rootless ; begins with a segment # / path-empty ; zero characters # path-abempty = *( "/" segment ) # path-absolute = "/" [ segment-nz *( "/" segment ) ] # path-noscheme = segment-nz-nc *( "/" segment ) # path-rootless = segment-nz *( "/" segment ) # path-empty = 0 # segment = *pchar # segment-nz = 1*pchar # segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) # ; non-zero-length segment without any colon ":" # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" # query = *( pchar / "/" / "?" ) # fragment = *( pchar / "/" / "?" ) # URI-reference = URI / relative-ref # relative-ref = relative-part [ "?" query ] [ "#" fragment ] # relative-part = "//" authority path-abempty # / path-absolute # / path-noscheme # / path-empty # absolute-URI = scheme ":" hier-part [ "?" query ] __slots__ = ("_cache", "_val") _QUOTER = _Quoter() _PATH_QUOTER = _Quoter(safe="@:", protected="/+") _QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True) _QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True) _FRAGMENT_QUOTER = _Quoter(safe="?/:@") _UNQUOTER = _Unquoter() _PATH_UNQUOTER = _Unquoter(unsafe="+") _QS_UNQUOTER = _Unquoter(qs=True) def __new__(cls, val="", *, encoded=False, strict=None): if strict is not None: # pragma: no cover warnings.warn("strict parameter is ignored") if type(val) is cls: return val if type(val) is str: val = urlsplit(val) elif type(val) is SplitResult: if not encoded: raise ValueError("Cannot apply decoding to SplitResult") elif isinstance(val, str): val = urlsplit(str(val)) else: raise TypeError("Constructor parameter should be str") if not encoded: if not val[1]: # netloc netloc = "" host = "" else: host = val.hostname if host is None: raise ValueError("Invalid URL: host is required for absolute urls") try: port = val.port except ValueError as e: raise ValueError( "Invalid URL: port can't be converted to integer" ) from e netloc = cls._make_netloc( val.username, val.password, host, port, encode=True ) path = cls._PATH_QUOTER(val[2]) if netloc: path = cls._normalize_path(path) cls._validate_authority_uri_abs_path(host=host, path=path) query = cls._QUERY_QUOTER(val[3]) fragment = cls._FRAGMENT_QUOTER(val[4]) val = SplitResult(val[0], netloc, path, query, fragment) self = object.__new__(cls) self._val = val self._cache = {} return self @classmethod def build( cls, *, scheme="", user=None, password=None, host="", port=None, path="", query=None, query_string="", fragment="", encoded=False ): """Creates and returns a new URL""" if not host and scheme: raise ValueError('Can\'t build URL with "scheme" but without "host".') if port and not host: raise ValueError('Can\'t build URL with "port" but without "host".') if query and query_string: raise ValueError('Only one of "query" or "query_string" should be passed') if path is None or query_string is None or fragment is None: raise TypeError( 'NoneType is illegal for "path", "query_string" and ' '"fragment" args, use string values instead.' ) if not user and not password and not host and not port: netloc = "" else: netloc = cls._make_netloc(user, password, host, port, encode=not encoded) if not encoded: path = cls._PATH_QUOTER(path) if netloc: path = cls._normalize_path(path) cls._validate_authority_uri_abs_path(host=host, path=path) query_string = cls._QUERY_QUOTER(query_string) fragment = cls._FRAGMENT_QUOTER(fragment) url = cls( SplitResult(scheme, netloc, path, query_string, fragment), encoded=True ) if query: return url.with_query(query) else: return url def __init_subclass__(cls): raise TypeError("Inheritance a class {!r} from URL " "is forbidden".format(cls)) def __str__(self): val = self._val if not val.path and self.is_absolute() and (val.query or val.fragment): val = val._replace(path="/") return urlunsplit(val) def __repr__(self): return "{}('{}')".format(self.__class__.__name__, str(self)) def __eq__(self, other): if not type(other) is URL: return NotImplemented val1 = self._val if not val1.path and self.is_absolute(): val1 = val1._replace(path="/") val2 = other._val if not val2.path and other.is_absolute(): val2 = val2._replace(path="/") return val1 == val2 def __hash__(self): ret = self._cache.get("hash") if ret is None: val = self._val if not val.path and self.is_absolute(): val = val._replace(path="/") ret = self._cache["hash"] = hash(val) return ret def __le__(self, other): if not type(other) is URL: return NotImplemented return self._val <= other._val def __lt__(self, other): if not type(other) is URL: return NotImplemented return self._val < other._val def __ge__(self, other): if not type(other) is URL: return NotImplemented return self._val >= other._val def __gt__(self, other): if not type(other) is URL: return NotImplemented return self._val > other._val def __truediv__(self, name): name = self._PATH_QUOTER(name) if name.startswith("/"): raise ValueError( "Appending path {!r} starting from slash is forbidden".format(name) ) path = self._val.path if path == "/": new_path = "/" + name elif not path and not self.is_absolute(): new_path = name else: parts = path.rstrip("/").split("/") parts.append(name) new_path = "/".join(parts) if self.is_absolute(): new_path = self._normalize_path(new_path) return URL( self._val._replace(path=new_path, query="", fragment=""), encoded=True ) def __bool__(self) -> bool: return bool( self._val.netloc or self._val.path or self._val.query or self._val.fragment ) def __getstate__(self): return (self._val,) def __setstate__(self, state): if state[0] is None and isinstance(state[1], dict): # default style pickle self._val = state[1]["_val"] else: self._val, *unused = state self._cache = {} def is_absolute(self): """A check for absolute URLs. Return True for absolute ones (having scheme or starting with //), False otherwise. """ return self.raw_host is not None def is_default_port(self): """A check for default port. Return True if port is default for specified scheme, e.g. 'http://python.org' or 'http://python.org:80', False otherwise. """ if self.port is None: return False default = DEFAULT_PORTS.get(self.scheme) if default is None: return False return self.port == default def origin(self): """Return an URL with scheme, host and port parts only. user, password, path, query and fragment are removed. """ # TODO: add a keyword-only option for keeping user/pass maybe? if not self.is_absolute(): raise ValueError("URL should be absolute") if not self._val.scheme: raise ValueError("URL should have scheme") v = self._val netloc = self._make_netloc(None, None, v.hostname, v.port, encode=False) val = v._replace(netloc=netloc, path="", query="", fragment="") return URL(val, encoded=True) def relative(self): """Return a relative part of the URL. scheme, user, password, host and port are removed. """ if not self.is_absolute(): raise ValueError("URL should be absolute") val = self._val._replace(scheme="", netloc="") return URL(val, encoded=True) @property def scheme(self): """Scheme for absolute URLs. Empty string for relative URLs or URLs starting with // """ return self._val.scheme @property def raw_user(self): """Encoded user part of URL. None if user is missing. """ # not .username ret = self._val.username if not ret: return None return ret @cached_property def user(self): """Decoded user part of URL. None if user is missing. """ return self._UNQUOTER(self.raw_user) @property def raw_password(self): """Encoded password part of URL. None if password is missing. """ return self._val.password @cached_property def password(self): """Decoded password part of URL. None if password is missing. """ return self._UNQUOTER(self.raw_password) @property def raw_host(self): """Encoded host part of URL. None for relative URLs. """ # Use host instead of hostname for sake of shortness # May add .hostname prop later return self._val.hostname @cached_property def host(self): """Decoded host part of URL. None for relative URLs. """ raw = self.raw_host if raw is None: return None if "%" in raw: # Hack for scoped IPv6 addresses like # fe80::2%Проверка # presence of '%' sign means only IPv6 address, so idna is useless. return raw try: return idna.decode(raw.encode("ascii")) except UnicodeError: # e.g. '::1' return raw.encode("ascii").decode("idna") @property def port(self): """Port part of URL, with scheme-based fallback. None for relative URLs or URLs without explicit port and scheme without default port substitution. """ return self._val.port or DEFAULT_PORTS.get(self._val.scheme) @property def explicit_port(self): """Port part of URL, without scheme-based fallback. None for relative URLs or URLs without explicit port. """ return self._val.port @property def raw_path(self): """Encoded path of URL. / for absolute URLs without path part. """ ret = self._val.path if not ret and self.is_absolute(): ret = "/" return ret @cached_property def path(self): """Decoded path of URL. / for absolute URLs without path part. """ return self._PATH_UNQUOTER(self.raw_path) @cached_property def query(self): """A MultiDictProxy representing parsed query parameters in decoded representation. Empty value if URL has no query part. """ ret = MultiDict(parse_qsl(self.raw_query_string, keep_blank_values=True)) return MultiDictProxy(ret) @property def raw_query_string(self): """Encoded query part of URL. Empty string if query is missing. """ return self._val.query @cached_property def query_string(self): """Decoded query part of URL. Empty string if query is missing. """ return self._QS_UNQUOTER(self.raw_query_string) @cached_property def path_qs(self): """Decoded path of URL with query.""" if not self.query_string: return self.path return "{}?{}".format(self.path, self.query_string) @cached_property def raw_path_qs(self): """Encoded path of URL with query.""" if not self.raw_query_string: return self.raw_path return "{}?{}".format(self.raw_path, self.raw_query_string) @property def raw_fragment(self): """Encoded fragment part of URL. Empty string if fragment is missing. """ return self._val.fragment @cached_property def fragment(self): """Decoded fragment part of URL. Empty string if fragment is missing. """ return self._UNQUOTER(self.raw_fragment) @cached_property def raw_parts(self): """A tuple containing encoded *path* parts. ('/',) for absolute URLs if *path* is missing. """ path = self._val.path if self.is_absolute(): if not path: parts = ["/"] else: parts = ["/"] + path[1:].split("/") else: if path.startswith("/"): parts = ["/"] + path[1:].split("/") else: parts = path.split("/") return tuple(parts) @cached_property def parts(self): """A tuple containing decoded *path* parts. ('/',) for absolute URLs if *path* is missing. """ return tuple(self._UNQUOTER(part) for part in self.raw_parts) @cached_property def parent(self): """A new URL with last part of path removed and cleaned up query and fragment. """ path = self.raw_path if not path or path == "/": if self.raw_fragment or self.raw_query_string: return URL(self._val._replace(query="", fragment=""), encoded=True) return self parts = path.split("/") val = self._val._replace(path="/".join(parts[:-1]), query="", fragment="") return URL(val, encoded=True) @cached_property def raw_name(self): """The last part of raw_parts.""" parts = self.raw_parts if self.is_absolute(): parts = parts[1:] if not parts: return "" else: return parts[-1] else: return parts[-1] @cached_property def name(self): """The last part of parts.""" return self._UNQUOTER(self.raw_name) @staticmethod def _validate_authority_uri_abs_path(host, path): """Ensure that path in URL with authority starts with a leading slash. Raise ValueError if not. """ if len(host) > 0 and len(path) > 0 and not path.startswith("/"): raise ValueError( "Path in a URL with authority " "should start with a slash ('/') if set" ) @classmethod def _normalize_path(cls, path): # Drop '.' and '..' from path segments = path.split("/") resolved_path = [] for seg in segments: if seg == "..": try: resolved_path.pop() except IndexError: # ignore any .. segments that would otherwise cause an # IndexError when popped from resolved_path if # resolving for rfc3986 pass elif seg == ".": continue else: resolved_path.append(seg) if segments[-1] in (".", ".."): # do some post-processing here. # if the last segment was a relative dir, # then we need to append the trailing '/' resolved_path.append("") return "/".join(resolved_path) if sys.version_info >= (3, 7): @classmethod def _encode_host(cls, host): try: ip, sep, zone = host.partition("%") ip = ip_address(ip) except ValueError: # IDNA encoding is slow, # skip it for ASCII-only strings if host.isascii(): return host try: host = idna.encode(host, uts46=True).decode("ascii") except UnicodeError: host = host.encode("idna").decode("ascii") else: host = ip.compressed if sep: host += "%" + zone if ip.version == 6: host = "[" + host + "]" return host else: # work around for missing str.isascii() in Python <= 3.6 @classmethod def _encode_host(cls, host): try: ip, sep, zone = host.partition("%") ip = ip_address(ip) except ValueError: for char in host: if char > "\x7f": break else: return host try: host = idna.encode(host, uts46=True).decode("ascii") except UnicodeError: host = host.encode("idna").decode("ascii") else: host = ip.compressed if sep: host += "%" + zone if ip.version == 6: host = "[" + host + "]" return host @classmethod def _make_netloc(cls, user, password, host, port, encode): if encode: ret = cls._encode_host(host) else: ret = host if port: ret = ret + ":" + str(port) if password is not None: if not user: user = "" else: if encode: user = cls._QUOTER(user) if encode: password = cls._QUOTER(password) user = user + ":" + password elif user and encode: user = cls._QUOTER(user) if user: ret = user + "@" + ret return ret def with_scheme(self, scheme): """Return a new URL with scheme replaced.""" # N.B. doesn't cleanup query/fragment if not isinstance(scheme, str): raise TypeError("Invalid scheme type") if not self.is_absolute(): raise ValueError("scheme replacement is not allowed " "for relative URLs") return URL(self._val._replace(scheme=scheme.lower()), encoded=True) def with_user(self, user): """Return a new URL with user replaced. Autoencode user if needed. Clear user/password if user is None. """ # N.B. doesn't cleanup query/fragment val = self._val if user is None: password = None elif isinstance(user, str): user = self._QUOTER(user) password = val.password else: raise TypeError("Invalid user type") if not self.is_absolute(): raise ValueError("user replacement is not allowed " "for relative URLs") return URL( self._val._replace( netloc=self._make_netloc( user, password, val.hostname, val.port, encode=False ) ), encoded=True, ) def with_password(self, password): """Return a new URL with password replaced. Autoencode password if needed. Clear password if argument is None. """ # N.B. doesn't cleanup query/fragment if password is None: pass elif isinstance(password, str): password = self._QUOTER(password) else: raise TypeError("Invalid password type") if not self.is_absolute(): raise ValueError("password replacement is not allowed " "for relative URLs") val = self._val return URL( self._val._replace( netloc=self._make_netloc( val.username, password, val.hostname, val.port, encode=False ) ), encoded=True, ) def with_host(self, host): """Return a new URL with host replaced. Autoencode host if needed. Changing host for relative URLs is not allowed, use .join() instead. """ # N.B. doesn't cleanup query/fragment if not isinstance(host, str): raise TypeError("Invalid host type") if not self.is_absolute(): raise ValueError("host replacement is not allowed " "for relative URLs") if not host: raise ValueError("host removing is not allowed") host = self._encode_host(host) val = self._val return URL( self._val._replace( netloc=self._make_netloc( val.username, val.password, host, val.port, encode=False ) ), encoded=True, ) def with_port(self, port): """Return a new URL with port replaced. Clear port to default if None is passed. """ # N.B. doesn't cleanup query/fragment if port is not None and not isinstance(port, int): raise TypeError("port should be int or None, got {}".format(type(port))) if not self.is_absolute(): raise ValueError("port replacement is not allowed " "for relative URLs") val = self._val return URL( self._val._replace( netloc=self._make_netloc( val.username, val.password, val.hostname, port, encode=False ) ), encoded=True, ) def with_path(self, path, *, encoded=False): """Return a new URL with path replaced.""" if not encoded: path = self._PATH_QUOTER(path) if self.is_absolute(): path = self._normalize_path(path) if len(path) > 0 and path[0] != "/": path = "/" + path return URL(self._val._replace(path=path, query="", fragment=""), encoded=True) @staticmethod def _query_var(v): if isinstance(v, str): return v if type(v) is int: # no subclasses like bool return str(v) raise TypeError( "Invalid variable type: value " "should be str or int, got {!r} " "of type {}".format(v, type(v)) ) def _get_str_query(self, *args, **kwargs): if kwargs: if len(args) > 0: raise ValueError( "Either kwargs or single query parameter " "must be present" ) query = kwargs elif len(args) == 1: query = args[0] else: raise ValueError( "Either kwargs or single query parameter " "must be present" ) if query is None: query = "" elif isinstance(query, Mapping): quoter = self._QUERY_PART_QUOTER query = "&".join( quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query.items() ) elif isinstance(query, str): query = self._QUERY_QUOTER(query) elif isinstance(query, (bytes, bytearray, memoryview)): raise TypeError( "Invalid query type: bytes, bytearray and " "memoryview are forbidden" ) elif isinstance(query, Sequence): quoter = self._QUERY_PART_QUOTER query = "&".join( quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query ) else: raise TypeError( "Invalid query type: only str, mapping or " "sequence of (str, str) pairs is allowed" ) return query def with_query(self, *args, **kwargs): """Return a new URL with query part replaced. Accepts any Mapping (e.g. dict, multidict.MultiDict instances) or str, autoencode the argument if needed. A sequence of (key, value) pairs is supported as well. It also can take an arbitrary number of keyword arguments. Clear query if None is passed. """ # N.B. doesn't cleanup query/fragment new_query = self._get_str_query(*args, **kwargs) return URL( self._val._replace(path=self._val.path, query=new_query), encoded=True ) def update_query(self, *args, **kwargs): """Return a new URL with query part updated.""" s = self._get_str_query(*args, **kwargs) new_query = MultiDict(parse_qsl(s, keep_blank_values=True)) query = MultiDict(self.query) query.update(new_query) return URL(self._val._replace(query=self._get_str_query(query)), encoded=True) def with_fragment(self, fragment): """Return a new URL with fragment replaced. Autoencode fragment if needed. Clear fragment to default if None is passed. """ # N.B. doesn't cleanup query/fragment if fragment is None: raw_fragment = "" elif not isinstance(fragment, str): raise TypeError("Invalid fragment type") else: raw_fragment = self._FRAGMENT_QUOTER(fragment) if self.raw_fragment == raw_fragment: return self return URL(self._val._replace(fragment=raw_fragment), encoded=True) def with_name(self, name): """Return a new URL with name (last part of path) replaced. Query and fragment parts are cleaned up. Name is encoded if needed. """ # N.B. DOES cleanup query/fragment if not isinstance(name, str): raise TypeError("Invalid name type") if "/" in name: raise ValueError("Slash in name is not allowed") name = self._PATH_QUOTER(name) if name in (".", ".."): raise ValueError(". and .. values are forbidden") parts = list(self.raw_parts) if self.is_absolute(): if len(parts) == 1: parts.append(name) else: parts[-1] = name parts[0] = "" # replace leading '/' else: parts[-1] = name if parts[0] == "/": parts[0] = "" # replace leading '/' return URL( self._val._replace(path="/".join(parts), query="", fragment=""), encoded=True, ) def join(self, url): """Join URLs Construct a full (“absolute”) URL by combining a “base URL” (self) with another URL (url). Informally, this uses components of the base URL, in particular the addressing scheme, the network location and (part of) the path, to provide missing components in the relative URL. """ # See docs for urllib.parse.urljoin if not isinstance(url, URL): raise TypeError("url should be URL") return URL(urljoin(str(self), str(url)), encoded=True) def human_repr(self): """Return decoded human readable string for URL representation.""" return urlunsplit( SplitResult( self.scheme, self._make_netloc( self.user, self.password, self.host, self._val.port, encode=False ), self.path, self.query_string, self.fragment, ) ) yarl-1.4.2/yarl/__init__.pyi0000644000175100001650000000546213572034522016220 0ustar vstsdocker00000000000000from typing import overload, Any, Tuple, Optional, Mapping, Union, Sequence, Type import multidict QueryVariable = Union[str, int] Query = Union[ None, str, Mapping[str, QueryVariable], Sequence[Tuple[str, QueryVariable]] ] class URL: scheme: str raw_user: str user: Optional[str] raw_password: Optional[str] password: Optional[str] raw_host: Optional[str] host: Optional[str] port: Optional[int] raw_path: str path: str raw_query_string: str query_string: str path_qs: str raw_path_qs: str raw_fragment: str fragment: str query: multidict.MultiDict[str] raw_name: str name: str raw_parts: Tuple[str, ...] parts: Tuple[str, ...] parent: URL def __init__( self, val: Union[str, "URL"] = ..., *, encoded: bool = ... ) -> None: ... @classmethod def build( cls, *, scheme: str = ..., user: Optional[str] = ..., password: Optional[str] = ..., host: str = ..., port: Optional[int] = ..., path: str = ..., query: Optional[Query] = ..., query_string: str = ..., fragment: str = ..., encoded: bool = ... ) -> URL: ... def __str__(self) -> str: ... def __repr__(self) -> str: ... def __eq__(self, other: Any) -> bool: ... def __le__(self, other: Any) -> bool: ... def __lt__(self, other: Any) -> bool: ... def __ge__(self, other: Any) -> bool: ... def __gt__(self, other: Any) -> bool: ... def __hash__(self) -> int: ... def __truediv__(self, name: str) -> URL: ... def is_absolute(self) -> bool: ... def is_default_port(self) -> bool: ... def origin(self) -> URL: ... def relative(self) -> URL: ... def with_scheme(self, scheme: str) -> URL: ... def with_user(self, user: Optional[str]) -> URL: ... def with_password(self, password: Optional[str]) -> URL: ... def with_host(self, host: str) -> URL: ... def with_port(self, port: Optional[int]) -> URL: ... def with_path(self, path: str, *, encoded: bool = ...) -> URL: ... @overload def with_query(self, query: Query) -> URL: ... @overload def with_query(self, **kwargs: QueryVariable) -> URL: ... @overload def update_query(self, query: Query) -> URL: ... @overload def update_query(self, **kwargs: QueryVariable) -> URL: ... def with_fragment(self, fragment: Optional[str]) -> URL: ... def with_name(self, name: str) -> URL: ... def join(self, url: URL) -> URL: ... def human_repr(self) -> str: ... # private API @classmethod def _normalize_path(cls, path: str) -> str: ... class cached_property: def __init__(self, wrapped: Any) -> None: ... def __get__(self, inst: URL, owner: Type[URL]) -> Any: ... def __set__(self, inst: URL, value: Any) -> None: ... yarl-1.4.2/yarl/_quoting.c0000644000175100001650000162045413572034534015737 0ustar vstsdocker00000000000000/* Generated by Cython 0.29.14 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_14" #define CYTHON_HEX_VERSION 0x001D0EF0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_ERR(f_index, lineno, Ln_error) \ { \ __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__yarl___quoting #define __PYX_HAVE_API__yarl___quoting /* Early includes */ #include #include #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "yarl/_quoting.pyx", "stringsource", "type.pxd", }; /*--- Type declarations ---*/ struct __pyx_obj_4yarl_8_quoting__Quoter; struct __pyx_obj_4yarl_8_quoting__Unquoter; struct __pyx_t_4yarl_8_quoting_Writer; /* "yarl/_quoting.pyx":76 * # ----------------- writer --------------------------- * * cdef struct Writer: # <<<<<<<<<<<<<< * char *buf * Py_ssize_t size */ struct __pyx_t_4yarl_8_quoting_Writer { char *buf; Py_ssize_t size; Py_ssize_t pos; int changed; }; /* "yarl/_quoting.pyx":186 * * * cdef class _Quoter: # <<<<<<<<<<<<<< * cdef bint _qs * */ struct __pyx_obj_4yarl_8_quoting__Quoter { PyObject_HEAD struct __pyx_vtabstruct_4yarl_8_quoting__Quoter *__pyx_vtab; int _qs; uint8_t _safe_table[16]; uint8_t _protected_table[16]; }; /* "yarl/_quoting.pyx":301 * * * cdef class _Unquoter: # <<<<<<<<<<<<<< * cdef str _unsafe * cdef bint _qs */ struct __pyx_obj_4yarl_8_quoting__Unquoter { PyObject_HEAD struct __pyx_vtabstruct_4yarl_8_quoting__Unquoter *__pyx_vtab; PyObject *_unsafe; int _qs; struct __pyx_obj_4yarl_8_quoting__Quoter *_quoter; struct __pyx_obj_4yarl_8_quoting__Quoter *_qs_quoter; }; /* "yarl/_quoting.pyx":186 * * * cdef class _Quoter: # <<<<<<<<<<<<<< * cdef bint _qs * */ struct __pyx_vtabstruct_4yarl_8_quoting__Quoter { PyObject *(*_do_quote)(struct __pyx_obj_4yarl_8_quoting__Quoter *, PyObject *, struct __pyx_t_4yarl_8_quoting_Writer *); int (*_write)(struct __pyx_obj_4yarl_8_quoting__Quoter *, struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4); }; static struct __pyx_vtabstruct_4yarl_8_quoting__Quoter *__pyx_vtabptr_4yarl_8_quoting__Quoter; static CYTHON_INLINE int __pyx_f_4yarl_8_quoting_7_Quoter__write(struct __pyx_obj_4yarl_8_quoting__Quoter *, struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4); /* "yarl/_quoting.pyx":301 * * * cdef class _Unquoter: # <<<<<<<<<<<<<< * cdef str _unsafe * cdef bint _qs */ struct __pyx_vtabstruct_4yarl_8_quoting__Unquoter { PyObject *(*_do_unquote)(struct __pyx_obj_4yarl_8_quoting__Unquoter *, PyObject *); }; static struct __pyx_vtabstruct_4yarl_8_quoting__Unquoter *__pyx_vtabptr_4yarl_8_quoting__Unquoter; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* WriteUnraisableException.proto */ static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename, int full_traceback, int nogil); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* ArgTypeTest.proto */ #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ __Pyx__ArgTypeTest(obj, type, name, exact)) static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /* unicode_iter.proto */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* ReRaiseException.proto */ static CYTHON_INLINE void __Pyx_ReraiseException(void); /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } #define __Pyx_GetModuleGlobalNameUncached(var, name) {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* PyObjectCallNoArg.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); #else #define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) #endif /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod1.proto */ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); /* ByteArrayAppend.proto */ static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value); /* ByteArrayAppendObject.proto */ static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyObject* value); /* PyUnicode_Substring.proto */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop); /* decode_c_string_utf16.proto */ static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 0; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = -1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } /* decode_c_bytes.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); /* decode_bytearray.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_bytearray( PyObject* string, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { return __Pyx_decode_c_bytes( PyByteArray_AS_STRING(string), PyByteArray_GET_SIZE(string), start, stop, encoding, errors, decode_func); } /* PyUnicodeContains.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { int result = PyUnicode_Contains(text, substring); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* ListAppend.proto */ #if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { Py_INCREF(x); PyList_SET_ITEM(list, len, x); Py_SIZE(list) = len+1; return 0; } return PyList_Append(list, x); } #else #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #endif /* SliceObject.proto */ #define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound)\ __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound) static CYTHON_INLINE int __Pyx_PyObject_SetSlice( PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** py_start, PyObject** py_stop, PyObject** py_slice, int has_cstart, int has_cstop, int wraparound); /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeAsUCS4.proto */ static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); /* object_ord.proto */ #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyObject_Ord(c)\ (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) #else #define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) #endif static long __Pyx__PyObject_Ord(PyObject* c); /* SliceObject.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** py_start, PyObject** py_stop, PyObject** py_slice, int has_cstart, int has_cstop, int wraparound); /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* HasAttr.proto */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); /* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* SetVTable.proto */ static int __Pyx_SetVtable(PyObject *dict, void *vtable); /* SetupReduce.proto */ static int __Pyx_setup_reduce(PyObject* type_obj); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); static PyObject *__pyx_f_4yarl_8_quoting_7_Quoter__do_quote(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer); /* proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting_7_Quoter__write(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch); /* proto*/ static PyObject *__pyx_f_4yarl_8_quoting_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto*/ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'cpython' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.exc' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'cpython.unicode' */ /* Module declarations from 'yarl._quoting' */ static PyTypeObject *__pyx_ptype_4yarl_8_quoting__Quoter = 0; static PyTypeObject *__pyx_ptype_4yarl_8_quoting__Unquoter = 0; static PyObject *__pyx_v_4yarl_8_quoting_GEN_DELIMS = 0; static PyObject *__pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS = 0; static PyObject *__pyx_v_4yarl_8_quoting_SUB_DELIMS = 0; static PyObject *__pyx_v_4yarl_8_quoting_RESERVED = 0; static PyObject *__pyx_v_4yarl_8_quoting_UNRESERVED = 0; static PyObject *__pyx_v_4yarl_8_quoting_ALLOWED = 0; static PyObject *__pyx_v_4yarl_8_quoting_QS = 0; static char __pyx_v_4yarl_8_quoting_BUFFER[0x2000]; static uint8_t __pyx_v_4yarl_8_quoting_ALLOWED_TABLE[16]; static uint8_t __pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE[16]; static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_8_quoting__to_hex(uint8_t); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__from_hex(Py_UCS4); /*proto*/ static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_8_quoting__restore_ch(Py_UCS4, Py_UCS4); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting_bit_at(uint8_t *, uint64_t); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting_set_bit(uint8_t *, uint64_t); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting__init_writer(struct __pyx_t_4yarl_8_quoting_Writer *); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting__release_writer(struct __pyx_t_4yarl_8_quoting_Writer *); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_char(struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4, int); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_pct(struct __pyx_t_4yarl_8_quoting_Writer *, uint8_t, int); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_percent(struct __pyx_t_4yarl_8_quoting_Writer *); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_pct_check(struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4, Py_UCS4 *); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_utf8(struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4); /*proto*/ static PyObject *__pyx_f_4yarl_8_quoting___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_8_quoting__Quoter *, PyObject *); /*proto*/ static PyObject *__pyx_f_4yarl_8_quoting___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_8_quoting__Unquoter *, PyObject *); /*proto*/ static int __Pyx_carray_from_py_uint8_t(PyObject *, uint8_t *, Py_ssize_t); /*proto*/ #define __Pyx_MODULE_NAME "yarl._quoting" extern int __pyx_module_is_main_yarl___quoting; int __pyx_module_is_main_yarl___quoting = 0; /* Implementation of 'yarl._quoting' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_chr; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_TypeError; static PyObject *__pyx_builtin_UnicodeDecodeError; static PyObject *__pyx_builtin_hex; static PyObject *__pyx_builtin_OverflowError; static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_builtin_IndexError; static const char __pyx_k_[] = ""; static const char __pyx_k_i[] = "i"; static const char __pyx_k__4[] = "+=&;"; static const char __pyx_k__5[] = "%"; static const char __pyx_k__6[] = "+"; static const char __pyx_k__7[] = " "; static const char __pyx_k__9[] = ":/?#[]@"; static const char __pyx_k_qs[] = "qs"; static const char __pyx_k__10[] = "!$'()*,"; static const char __pyx_k__11[] = "+?=;"; static const char __pyx_k__12[] = "-._~"; static const char __pyx_k__13[] = "+&=;"; static const char __pyx_k_chr[] = "chr"; static const char __pyx_k_hex[] = "hex"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_val[] = "val"; static const char __pyx_k_base[] = "base"; static const char __pyx_k_dict[] = "__dict__"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_safe[] = "safe"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_upper[] = "upper"; static const char __pyx_k_Quoter[] = "_Quoter"; static const char __pyx_k_append[] = "append"; static const char __pyx_k_digits[] = "digits"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_pickle[] = "pickle"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_string[] = "string"; static const char __pyx_k_unsafe[] = "unsafe"; static const char __pyx_k_update[] = "update"; static const char __pyx_k_Unquoter[] = "_Unquoter"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_pyx_type[] = "__pyx_type"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_enumerate[] = "enumerate"; static const char __pyx_k_protected[] = "protected"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_IndexError[] = "IndexError"; static const char __pyx_k_ValueError[] = "ValueError"; static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_stringsource[] = "stringsource"; static const char __pyx_k_OverflowError[] = "OverflowError"; static const char __pyx_k_ascii_letters[] = "ascii_letters"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_yarl__quoting[] = "yarl._quoting"; static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_UnicodeDecodeError[] = "UnicodeDecodeError"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_pyx_unpickle__Quoter[] = "__pyx_unpickle__Quoter"; static const char __pyx_k_Argument_should_be_str[] = "Argument should be str"; static const char __pyx_k_pyx_unpickle__Unquoter[] = "__pyx_unpickle__Unquoter"; static const char __pyx_k_Incompatible_checksums_s_vs_0x27[] = "Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))"; static const char __pyx_k_Incompatible_checksums_s_vs_0x8f[] = "Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))"; static const char __pyx_k_Only_safe_symbols_with_ORD_128_a[] = "Only safe symbols with ORD < 128 are allowed"; static PyObject *__pyx_kp_u_; static PyObject *__pyx_kp_u_Argument_should_be_str; static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x27; static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x8f; static PyObject *__pyx_n_s_IndexError; static PyObject *__pyx_kp_u_Only_safe_symbols_with_ORD_128_a; static PyObject *__pyx_n_s_OverflowError; static PyObject *__pyx_n_s_PickleError; static PyObject *__pyx_n_s_Quoter; static PyObject *__pyx_n_s_TypeError; static PyObject *__pyx_n_s_UnicodeDecodeError; static PyObject *__pyx_n_s_Unquoter; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_kp_u__10; static PyObject *__pyx_kp_u__11; static PyObject *__pyx_kp_u__12; static PyObject *__pyx_kp_u__13; static PyObject *__pyx_kp_u__4; static PyObject *__pyx_kp_u__5; static PyObject *__pyx_kp_u__6; static PyObject *__pyx_kp_u__7; static PyObject *__pyx_kp_u__9; static PyObject *__pyx_n_s_append; static PyObject *__pyx_n_s_ascii_letters; static PyObject *__pyx_n_s_base; static PyObject *__pyx_n_s_chr; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_dict; static PyObject *__pyx_n_s_digits; static PyObject *__pyx_n_s_enumerate; static PyObject *__pyx_n_s_getstate; static PyObject *__pyx_n_s_hex; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_new; static PyObject *__pyx_n_s_pickle; static PyObject *__pyx_n_s_protected; static PyObject *__pyx_n_s_pyx_PickleError; static PyObject *__pyx_n_s_pyx_checksum; static PyObject *__pyx_n_s_pyx_result; static PyObject *__pyx_n_s_pyx_state; static PyObject *__pyx_n_s_pyx_type; static PyObject *__pyx_n_s_pyx_unpickle__Quoter; static PyObject *__pyx_n_s_pyx_unpickle__Unquoter; static PyObject *__pyx_n_s_pyx_vtable; static PyObject *__pyx_n_s_qs; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_reduce; static PyObject *__pyx_n_s_reduce_cython; static PyObject *__pyx_n_s_reduce_ex; static PyObject *__pyx_n_s_safe; static PyObject *__pyx_n_s_setstate; static PyObject *__pyx_n_s_setstate_cython; static PyObject *__pyx_n_s_string; static PyObject *__pyx_kp_s_stringsource; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_unsafe; static PyObject *__pyx_n_s_update; static PyObject *__pyx_n_s_upper; static PyObject *__pyx_n_s_val; static PyObject *__pyx_n_s_yarl__quoting; static int __pyx_pf_4yarl_8_quoting_7_Quoter___init__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_2__call__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static int __pyx_pf_4yarl_8_quoting_9_Unquoter___init__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_unsafe, PyObject *__pyx_v_qs); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_2__call__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting___pyx_unpickle__Quoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_4yarl_8_quoting_2__pyx_unpickle__Unquoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_tp_new_4yarl_8_quoting__Quoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_4yarl_8_quoting__Unquoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_2; static PyObject *__pyx_int_16; static PyObject *__pyx_int_41310077; static PyObject *__pyx_int_150049702; static PyObject *__pyx_slice__8; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; static PyObject *__pyx_tuple__14; static PyObject *__pyx_tuple__16; static PyObject *__pyx_codeobj__15; static PyObject *__pyx_codeobj__17; /* Late includes */ /* "yarl/_quoting.pyx":24 * * * cdef inline Py_UCS4 _to_hex(uint8_t v): # <<<<<<<<<<<<<< * if v < 10: * return (v+0x30) # ord('0') == 0x30 */ static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_8_quoting__to_hex(uint8_t __pyx_v_v) { Py_UCS4 __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_to_hex", 0); /* "yarl/_quoting.pyx":25 * * cdef inline Py_UCS4 _to_hex(uint8_t v): * if v < 10: # <<<<<<<<<<<<<< * return (v+0x30) # ord('0') == 0x30 * else: */ __pyx_t_1 = ((__pyx_v_v < 10) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":26 * cdef inline Py_UCS4 _to_hex(uint8_t v): * if v < 10: * return (v+0x30) # ord('0') == 0x30 # <<<<<<<<<<<<<< * else: * return (v+0x41-10) # ord('A') == 0x41 */ __pyx_r = ((Py_UCS4)(__pyx_v_v + 0x30)); goto __pyx_L0; /* "yarl/_quoting.pyx":25 * * cdef inline Py_UCS4 _to_hex(uint8_t v): * if v < 10: # <<<<<<<<<<<<<< * return (v+0x30) # ord('0') == 0x30 * else: */ } /* "yarl/_quoting.pyx":28 * return (v+0x30) # ord('0') == 0x30 * else: * return (v+0x41-10) # ord('A') == 0x41 # <<<<<<<<<<<<<< * * */ /*else*/ { __pyx_r = ((Py_UCS4)((__pyx_v_v + 0x41) - 10)); goto __pyx_L0; } /* "yarl/_quoting.pyx":24 * * * cdef inline Py_UCS4 _to_hex(uint8_t v): # <<<<<<<<<<<<<< * if v < 10: * return (v+0x30) # ord('0') == 0x30 */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":31 * * * cdef inline int _from_hex(Py_UCS4 v): # <<<<<<<<<<<<<< * if '0' <= v <= '9': * return (v) - 0x30 # ord('0') == 0x30 */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__from_hex(Py_UCS4 __pyx_v_v) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_from_hex", 0); /* "yarl/_quoting.pyx":32 * * cdef inline int _from_hex(Py_UCS4 v): * if '0' <= v <= '9': # <<<<<<<<<<<<<< * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': */ __pyx_t_1 = (48 <= __pyx_v_v); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_v <= 57); } __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":33 * cdef inline int _from_hex(Py_UCS4 v): * if '0' <= v <= '9': * return (v) - 0x30 # ord('0') == 0x30 # <<<<<<<<<<<<<< * elif 'A' <= v <= 'F': * return (v) - 0x41 + 10 # ord('A') == 0x41 */ __pyx_r = (((int)__pyx_v_v) - 0x30); goto __pyx_L0; /* "yarl/_quoting.pyx":32 * * cdef inline int _from_hex(Py_UCS4 v): * if '0' <= v <= '9': # <<<<<<<<<<<<<< * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': */ } /* "yarl/_quoting.pyx":34 * if '0' <= v <= '9': * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': # <<<<<<<<<<<<<< * return (v) - 0x41 + 10 # ord('A') == 0x41 * elif 'a' <= v <= 'f': */ __pyx_t_2 = (65 <= __pyx_v_v); if (__pyx_t_2) { __pyx_t_2 = (__pyx_v_v <= 70); } __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":35 * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': * return (v) - 0x41 + 10 # ord('A') == 0x41 # <<<<<<<<<<<<<< * elif 'a' <= v <= 'f': * return (v) - 0x61 + 10 # ord('a') == 0x61 */ __pyx_r = ((((int)__pyx_v_v) - 0x41) + 10); goto __pyx_L0; /* "yarl/_quoting.pyx":34 * if '0' <= v <= '9': * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': # <<<<<<<<<<<<<< * return (v) - 0x41 + 10 # ord('A') == 0x41 * elif 'a' <= v <= 'f': */ } /* "yarl/_quoting.pyx":36 * elif 'A' <= v <= 'F': * return (v) - 0x41 + 10 # ord('A') == 0x41 * elif 'a' <= v <= 'f': # <<<<<<<<<<<<<< * return (v) - 0x61 + 10 # ord('a') == 0x61 * else: */ __pyx_t_1 = (97 <= __pyx_v_v); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_v <= 0x66); } __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":37 * return (v) - 0x41 + 10 # ord('A') == 0x41 * elif 'a' <= v <= 'f': * return (v) - 0x61 + 10 # ord('a') == 0x61 # <<<<<<<<<<<<<< * else: * return -1 */ __pyx_r = ((((int)__pyx_v_v) - 0x61) + 10); goto __pyx_L0; /* "yarl/_quoting.pyx":36 * elif 'A' <= v <= 'F': * return (v) - 0x41 + 10 # ord('A') == 0x41 * elif 'a' <= v <= 'f': # <<<<<<<<<<<<<< * return (v) - 0x61 + 10 # ord('a') == 0x61 * else: */ } /* "yarl/_quoting.pyx":39 * return (v) - 0x61 + 10 # ord('a') == 0x61 * else: * return -1 # <<<<<<<<<<<<<< * * */ /*else*/ { __pyx_r = -1; goto __pyx_L0; } /* "yarl/_quoting.pyx":31 * * * cdef inline int _from_hex(Py_UCS4 v): # <<<<<<<<<<<<<< * if '0' <= v <= '9': * return (v) - 0x30 # ord('0') == 0x30 */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":42 * * * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): # <<<<<<<<<<<<<< * cdef int digit1 = _from_hex(d1) * if digit1 < 0: */ static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_8_quoting__restore_ch(Py_UCS4 __pyx_v_d1, Py_UCS4 __pyx_v_d2) { int __pyx_v_digit1; int __pyx_v_digit2; Py_UCS4 __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_restore_ch", 0); /* "yarl/_quoting.pyx":43 * * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): * cdef int digit1 = _from_hex(d1) # <<<<<<<<<<<<<< * if digit1 < 0: * return -1 */ __pyx_v_digit1 = __pyx_f_4yarl_8_quoting__from_hex(__pyx_v_d1); /* "yarl/_quoting.pyx":44 * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): * cdef int digit1 = _from_hex(d1) * if digit1 < 0: # <<<<<<<<<<<<<< * return -1 * cdef int digit2 = _from_hex(d2) */ __pyx_t_1 = ((__pyx_v_digit1 < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":45 * cdef int digit1 = _from_hex(d1) * if digit1 < 0: * return -1 # <<<<<<<<<<<<<< * cdef int digit2 = _from_hex(d2) * if digit2 < 0: */ __pyx_r = ((Py_UCS4)-1L); goto __pyx_L0; /* "yarl/_quoting.pyx":44 * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): * cdef int digit1 = _from_hex(d1) * if digit1 < 0: # <<<<<<<<<<<<<< * return -1 * cdef int digit2 = _from_hex(d2) */ } /* "yarl/_quoting.pyx":46 * if digit1 < 0: * return -1 * cdef int digit2 = _from_hex(d2) # <<<<<<<<<<<<<< * if digit2 < 0: * return -1 */ __pyx_v_digit2 = __pyx_f_4yarl_8_quoting__from_hex(__pyx_v_d2); /* "yarl/_quoting.pyx":47 * return -1 * cdef int digit2 = _from_hex(d2) * if digit2 < 0: # <<<<<<<<<<<<<< * return -1 * return (digit1 << 4 | digit2) */ __pyx_t_1 = ((__pyx_v_digit2 < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":48 * cdef int digit2 = _from_hex(d2) * if digit2 < 0: * return -1 # <<<<<<<<<<<<<< * return (digit1 << 4 | digit2) * */ __pyx_r = ((Py_UCS4)-1L); goto __pyx_L0; /* "yarl/_quoting.pyx":47 * return -1 * cdef int digit2 = _from_hex(d2) * if digit2 < 0: # <<<<<<<<<<<<<< * return -1 * return (digit1 << 4 | digit2) */ } /* "yarl/_quoting.pyx":49 * if digit2 < 0: * return -1 * return (digit1 << 4 | digit2) # <<<<<<<<<<<<<< * * */ __pyx_r = ((Py_UCS4)((__pyx_v_digit1 << 4) | __pyx_v_digit2)); goto __pyx_L0; /* "yarl/_quoting.pyx":42 * * * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): # <<<<<<<<<<<<<< * cdef int digit1 = _from_hex(d1) * if digit1 < 0: */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":56 * * * cdef inline bint bit_at(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * return array[ch >> 3] & (1 << (ch & 7)) * */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting_bit_at(uint8_t *__pyx_v_array, uint64_t __pyx_v_ch) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("bit_at", 0); /* "yarl/_quoting.pyx":57 * * cdef inline bint bit_at(uint8_t array[], uint64_t ch): * return array[ch >> 3] & (1 << (ch & 7)) # <<<<<<<<<<<<<< * * */ __pyx_r = ((__pyx_v_array[(__pyx_v_ch >> 3)]) & (1 << (__pyx_v_ch & 7))); goto __pyx_L0; /* "yarl/_quoting.pyx":56 * * * cdef inline bint bit_at(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * return array[ch >> 3] & (1 << (ch & 7)) * */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":60 * * * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * array[ch >> 3] |= (1 << (ch & 7)) * */ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting_set_bit(uint8_t *__pyx_v_array, uint64_t __pyx_v_ch) { __Pyx_RefNannyDeclarations uint64_t __pyx_t_1; __Pyx_RefNannySetupContext("set_bit", 0); /* "yarl/_quoting.pyx":61 * * cdef inline void set_bit(uint8_t array[], uint64_t ch): * array[ch >> 3] |= (1 << (ch & 7)) # <<<<<<<<<<<<<< * * */ __pyx_t_1 = (__pyx_v_ch >> 3); (__pyx_v_array[__pyx_t_1]) = ((__pyx_v_array[__pyx_t_1]) | (1 << (__pyx_v_ch & 7))); /* "yarl/_quoting.pyx":60 * * * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * array[ch >> 3] |= (1 << (ch & 7)) * */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting.pyx":83 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting__init_writer(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_init_writer", 0); /* "yarl/_quoting.pyx":84 * * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<< * writer.size = BUF_SIZE * writer.pos = 0 */ __pyx_v_writer->buf = (&(__pyx_v_4yarl_8_quoting_BUFFER[0])); /* "yarl/_quoting.pyx":85 * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE # <<<<<<<<<<<<<< * writer.pos = 0 * writer.changed = 0 */ __pyx_v_writer->size = 0x2000; /* "yarl/_quoting.pyx":86 * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE * writer.pos = 0 # <<<<<<<<<<<<<< * writer.changed = 0 * */ __pyx_v_writer->pos = 0; /* "yarl/_quoting.pyx":87 * writer.size = BUF_SIZE * writer.pos = 0 * writer.changed = 0 # <<<<<<<<<<<<<< * * */ __pyx_v_writer->changed = 0; /* "yarl/_quoting.pyx":83 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting.pyx":90 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ static CYTHON_INLINE void __pyx_f_4yarl_8_quoting__release_writer(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_release_writer", 0); /* "yarl/_quoting.pyx":91 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ __pyx_t_1 = ((__pyx_v_writer->buf != __pyx_v_4yarl_8_quoting_BUFFER) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":92 * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< * * */ PyMem_Free(__pyx_v_writer->buf); /* "yarl/_quoting.pyx":91 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ } /* "yarl/_quoting.pyx":90 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting.pyx":95 * * * cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_char(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch, int __pyx_v_changed) { char *__pyx_v_buf; Py_ssize_t __pyx_v_size; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2; __Pyx_RefNannySetupContext("_write_char", 0); /* "yarl/_quoting.pyx":99 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ __pyx_t_1 = ((__pyx_v_writer->pos == __pyx_v_writer->size) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":101 * if writer.pos == writer.size: * # reallocate * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<< * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) */ __pyx_v_size = (__pyx_v_writer->size + 0x2000); /* "yarl/_quoting.pyx":102 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ __pyx_t_1 = ((__pyx_v_writer->buf == __pyx_v_4yarl_8_quoting_BUFFER) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":103 * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size)); /* "yarl/_quoting.pyx":104 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":105 * buf = PyMem_Malloc(size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * memcpy(buf, writer.buf, writer.size) */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 105, __pyx_L1_error) /* "yarl/_quoting.pyx":106 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * memcpy(buf, writer.buf, writer.size) * else: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":104 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } /* "yarl/_quoting.pyx":107 * PyErr_NoMemory() * return -1 * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<< * else: * buf = PyMem_Realloc(writer.buf, size) */ (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size)); /* "yarl/_quoting.pyx":102 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ goto __pyx_L4; } /* "yarl/_quoting.pyx":109 * memcpy(buf, writer.buf, writer.size) * else: * buf = PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ /*else*/ { __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size)); /* "yarl/_quoting.pyx":110 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":111 * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * writer.buf = buf */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 111, __pyx_L1_error) /* "yarl/_quoting.pyx":112 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * writer.buf = buf * writer.size = size */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":110 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } } __pyx_L4:; /* "yarl/_quoting.pyx":113 * PyErr_NoMemory() * return -1 * writer.buf = buf # <<<<<<<<<<<<<< * writer.size = size * writer.buf[writer.pos] = ch */ __pyx_v_writer->buf = __pyx_v_buf; /* "yarl/_quoting.pyx":114 * return -1 * writer.buf = buf * writer.size = size # <<<<<<<<<<<<<< * writer.buf[writer.pos] = ch * writer.pos += 1 */ __pyx_v_writer->size = __pyx_v_size; /* "yarl/_quoting.pyx":99 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ } /* "yarl/_quoting.pyx":115 * writer.buf = buf * writer.size = size * writer.buf[writer.pos] = ch # <<<<<<<<<<<<<< * writer.pos += 1 * writer.changed |= changed */ (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch); /* "yarl/_quoting.pyx":116 * writer.size = size * writer.buf[writer.pos] = ch * writer.pos += 1 # <<<<<<<<<<<<<< * writer.changed |= changed * return 0 */ __pyx_v_writer->pos = (__pyx_v_writer->pos + 1); /* "yarl/_quoting.pyx":117 * writer.buf[writer.pos] = ch * writer.pos += 1 * writer.changed |= changed # <<<<<<<<<<<<<< * return 0 * */ __pyx_v_writer->changed = (__pyx_v_writer->changed | __pyx_v_changed); /* "yarl/_quoting.pyx":118 * writer.pos += 1 * writer.changed |= changed * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "yarl/_quoting.pyx":95 * * * cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ /* function exit code */ __pyx_L1_error:; __Pyx_WriteUnraisable("yarl._quoting._write_char", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":121 * * * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): # <<<<<<<<<<<<<< * if _write_char(writer, '%', changed) < 0: * return -1 */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_pct(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, uint8_t __pyx_v_ch, int __pyx_v_changed) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_write_pct", 0); /* "yarl/_quoting.pyx":122 * * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 37, __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":123 * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): * if _write_char(writer, '%', changed) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: * return -1 */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":122 * * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: */ } /* "yarl/_quoting.pyx":124 * if _write_char(writer, '%', changed) < 0: * return -1 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, _to_hex(ch & 0x0f), changed) */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_f_4yarl_8_quoting__to_hex((((uint8_t)__pyx_v_ch) >> 4)), __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":125 * return -1 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_char(writer, _to_hex(ch & 0x0f), changed) * */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":124 * if _write_char(writer, '%', changed) < 0: * return -1 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, _to_hex(ch & 0x0f), changed) */ } /* "yarl/_quoting.pyx":126 * if _write_char(writer, _to_hex(ch >> 4), changed) < 0: * return -1 * return _write_char(writer, _to_hex(ch & 0x0f), changed) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_f_4yarl_8_quoting__to_hex((((uint8_t)__pyx_v_ch) & 0x0f)), __pyx_v_changed); goto __pyx_L0; /* "yarl/_quoting.pyx":121 * * * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): # <<<<<<<<<<<<<< * if _write_char(writer, '%', changed) < 0: * return -1 */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":129 * * * cdef inline int _write_percent(Writer* writer): # <<<<<<<<<<<<<< * if _write_char(writer, '%', True) < 0: * return -1 */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_percent(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_write_percent", 0); /* "yarl/_quoting.pyx":130 * * cdef inline int _write_percent(Writer* writer): * if _write_char(writer, '%', True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, '2', True) < 0: */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 37, 1) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":131 * cdef inline int _write_percent(Writer* writer): * if _write_char(writer, '%', True) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_char(writer, '2', True) < 0: * return -1 */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":130 * * cdef inline int _write_percent(Writer* writer): * if _write_char(writer, '%', True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, '2', True) < 0: */ } /* "yarl/_quoting.pyx":132 * if _write_char(writer, '%', True) < 0: * return -1 * if _write_char(writer, '2', True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, '5', True) */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 50, 1) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":133 * return -1 * if _write_char(writer, '2', True) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_char(writer, '5', True) * */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":132 * if _write_char(writer, '%', True) < 0: * return -1 * if _write_char(writer, '2', True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, '5', True) */ } /* "yarl/_quoting.pyx":134 * if _write_char(writer, '2', True) < 0: * return -1 * return _write_char(writer, '5', True) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 53, 1); goto __pyx_L0; /* "yarl/_quoting.pyx":129 * * * cdef inline int _write_percent(Writer* writer): # <<<<<<<<<<<<<< * if _write_char(writer, '%', True) < 0: * return -1 */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":137 * * * cdef inline int _write_pct_check(Writer* writer, Py_UCS4 ch, Py_UCS4 pct[]): # <<<<<<<<<<<<<< * cdef Py_UCS4 pct1 = _to_hex(ch >> 4) * cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_pct_check(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch, Py_UCS4 *__pyx_v_pct) { Py_UCS4 __pyx_v_pct1; Py_UCS4 __pyx_v_pct2; int __pyx_v_changed; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_write_pct_check", 0); /* "yarl/_quoting.pyx":138 * * cdef inline int _write_pct_check(Writer* writer, Py_UCS4 ch, Py_UCS4 pct[]): * cdef Py_UCS4 pct1 = _to_hex(ch >> 4) # <<<<<<<<<<<<<< * cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) * cdef bint changed = pct[0] != pct1 or pct[1] != pct2 */ __pyx_v_pct1 = __pyx_f_4yarl_8_quoting__to_hex((((uint8_t)__pyx_v_ch) >> 4)); /* "yarl/_quoting.pyx":139 * cdef inline int _write_pct_check(Writer* writer, Py_UCS4 ch, Py_UCS4 pct[]): * cdef Py_UCS4 pct1 = _to_hex(ch >> 4) * cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) # <<<<<<<<<<<<<< * cdef bint changed = pct[0] != pct1 or pct[1] != pct2 * */ __pyx_v_pct2 = __pyx_f_4yarl_8_quoting__to_hex((((uint8_t)__pyx_v_ch) & 0x0f)); /* "yarl/_quoting.pyx":140 * cdef Py_UCS4 pct1 = _to_hex(ch >> 4) * cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) * cdef bint changed = pct[0] != pct1 or pct[1] != pct2 # <<<<<<<<<<<<<< * * if _write_char(writer, '%', changed) < 0: */ __pyx_t_2 = (((__pyx_v_pct[0]) != __pyx_v_pct1) != 0); if (!__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L3_bool_binop_done; } __pyx_t_2 = (((__pyx_v_pct[1]) != __pyx_v_pct2) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L3_bool_binop_done:; __pyx_v_changed = __pyx_t_1; /* "yarl/_quoting.pyx":142 * cdef bint changed = pct[0] != pct1 or pct[1] != pct2 * * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, pct1, changed) < 0: */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 37, __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":143 * * if _write_char(writer, '%', changed) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_char(writer, pct1, changed) < 0: * return -1 */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":142 * cdef bint changed = pct[0] != pct1 or pct[1] != pct2 * * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_char(writer, pct1, changed) < 0: */ } /* "yarl/_quoting.pyx":144 * if _write_char(writer, '%', changed) < 0: * return -1 * if _write_char(writer, pct1, changed) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, pct2, changed) */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_v_pct1, __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":145 * return -1 * if _write_char(writer, pct1, changed) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_char(writer, pct2, changed) * */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":144 * if _write_char(writer, '%', changed) < 0: * return -1 * if _write_char(writer, pct1, changed) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_char(writer, pct2, changed) */ } /* "yarl/_quoting.pyx":146 * if _write_char(writer, pct1, changed) < 0: * return -1 * return _write_char(writer, pct2, changed) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_v_pct2, __pyx_v_changed); goto __pyx_L0; /* "yarl/_quoting.pyx":137 * * * cdef inline int _write_pct_check(Writer* writer, Py_UCS4 ch, Py_UCS4 pct[]): # <<<<<<<<<<<<<< * cdef Py_UCS4 pct1 = _to_hex(ch >> 4) * cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":149 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting__write_utf8(struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) { uint64_t __pyx_v_utf; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_write_utf8", 0); /* "yarl/_quoting.pyx":150 * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): * cdef uint64_t utf = symbol # <<<<<<<<<<<<<< * * if utf < 0x80: */ __pyx_v_utf = ((uint64_t)__pyx_v_symbol); /* "yarl/_quoting.pyx":152 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_pct(writer, utf, True) * elif utf < 0x800: */ __pyx_t_1 = ((__pyx_v_utf < 0x80) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":153 * * if utf < 0x80: * return _write_pct(writer, utf, True) # <<<<<<<<<<<<<< * elif utf < 0x800: * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: */ __pyx_r = __pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)__pyx_v_utf), 1); goto __pyx_L0; /* "yarl/_quoting.pyx":152 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_pct(writer, utf, True) * elif utf < 0x800: */ } /* "yarl/_quoting.pyx":154 * if utf < 0x80: * return _write_pct(writer, utf, True) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: * return -1 */ __pyx_t_1 = ((__pyx_v_utf < 0x800) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":155 * return _write_pct(writer, utf, True) * elif utf < 0x800: * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) */ __pyx_t_1 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6))), 1) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":156 * elif utf < 0x800: * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif 0xD800 <= utf <= 0xDFFF: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":155 * return _write_pct(writer, utf, True) * elif utf < 0x800: * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) */ } /* "yarl/_quoting.pyx":157 * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<< * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored */ __pyx_r = __pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; /* "yarl/_quoting.pyx":154 * if utf < 0x80: * return _write_pct(writer, utf, True) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: * return -1 */ } /* "yarl/_quoting.pyx":158 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ __pyx_t_1 = (0xD800 <= __pyx_v_utf); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_utf <= 0xDFFF); } __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":160 * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored * return 0 # <<<<<<<<<<<<<< * elif utf < 0x10000: * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "yarl/_quoting.pyx":158 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ } /* "yarl/_quoting.pyx":161 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 */ __pyx_t_2 = ((__pyx_v_utf < 0x10000) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":162 * return 0 * elif utf < 0x10000: * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), */ __pyx_t_2 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12))), 1) < 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":163 * elif utf < 0x10000: * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":162 * return 0 * elif utf < 0x10000: * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), */ } /* "yarl/_quoting.pyx":165 * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) */ __pyx_t_2 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting.pyx":164 * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ if (__pyx_t_2) { /* "yarl/_quoting.pyx":166 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif utf > 0x10FFFF: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":164 * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ } /* "yarl/_quoting.pyx":167 * True) < 0: * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<< * elif utf > 0x10FFFF: * # symbol is too large */ __pyx_r = __pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; /* "yarl/_quoting.pyx":161 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 */ } /* "yarl/_quoting.pyx":168 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ __pyx_t_2 = ((__pyx_v_utf > 0x10FFFF) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":170 * elif utf > 0x10FFFF: * # symbol is too large * return 0 # <<<<<<<<<<<<<< * else: * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "yarl/_quoting.pyx":168 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ } /* "yarl/_quoting.pyx":172 * return 0 * else: * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), */ /*else*/ { __pyx_t_2 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18))), 1) < 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":173 * else: * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), * True) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":172 * return 0 * else: * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), */ } /* "yarl/_quoting.pyx":175 * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), * True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), */ __pyx_t_2 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting.pyx":174 * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ if (__pyx_t_2) { /* "yarl/_quoting.pyx":176 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), * True) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":174 * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ } /* "yarl/_quoting.pyx":178 * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) */ __pyx_t_2 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting.pyx":177 * True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ if (__pyx_t_2) { /* "yarl/_quoting.pyx":179 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), * True) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting.pyx":177 * True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ } /* "yarl/_quoting.pyx":180 * True) < 0: * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; } /* "yarl/_quoting.pyx":149 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":192 * cdef uint8_t _protected_table[16] * * def __init__(self, *, str safe='', str protected='', bint qs=False): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * */ /* Python wrapper */ static int __pyx_pw_4yarl_8_quoting_7_Quoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_4yarl_8_quoting_7_Quoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_safe = 0; PyObject *__pyx_v_protected = 0; int __pyx_v_qs; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_safe,&__pyx_n_s_protected,&__pyx_n_s_qs,0}; PyObject* values[3] = {0,0,0}; values[0] = ((PyObject*)__pyx_kp_u_); values[1] = ((PyObject*)__pyx_kp_u_); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); if (kw_args > 0 && likely(kw_args <= 3)) { Py_ssize_t index; for (index = 0; index < 3 && kw_args > 0; index++) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]); if (value) { values[index] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, 0, "__init__") < 0)) __PYX_ERR(0, 192, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 0) { goto __pyx_L5_argtuple_error; } else { } __pyx_v_safe = ((PyObject*)values[0]); __pyx_v_protected = ((PyObject*)values[1]); if (values[2]) { __pyx_v_qs = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_qs == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 192, __pyx_L3_error) } else { __pyx_v_qs = ((int)0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 192, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting._Quoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_safe), (&PyUnicode_Type), 1, "safe", 1))) __PYX_ERR(0, 192, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_protected), (&PyUnicode_Type), 1, "protected", 1))) __PYX_ERR(0, 192, __pyx_L1_error) __pyx_r = __pyx_pf_4yarl_8_quoting_7_Quoter___init__(((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_v_self), __pyx_v_safe, __pyx_v_protected, __pyx_v_qs); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_4yarl_8_quoting_7_Quoter___init__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs) { Py_UCS4 __pyx_v_ch; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; Py_ssize_t __pyx_t_3; Py_ssize_t __pyx_t_4; void *__pyx_t_5; int __pyx_t_6; int __pyx_t_7; Py_ssize_t __pyx_t_8; PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("__init__", 0); /* "yarl/_quoting.pyx":195 * cdef Py_UCS4 ch * * self._qs = qs # <<<<<<<<<<<<<< * * if not self._qs: */ __pyx_v_self->_qs = __pyx_v_qs; /* "yarl/_quoting.pyx":197 * self._qs = qs * * if not self._qs: # <<<<<<<<<<<<<< * memcpy(self._safe_table, * ALLOWED_NOTQS_TABLE, */ __pyx_t_1 = ((!(__pyx_v_self->_qs != 0)) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":198 * * if not self._qs: * memcpy(self._safe_table, # <<<<<<<<<<<<<< * ALLOWED_NOTQS_TABLE, * sizeof(self._safe_table)) */ (void)(memcpy(__pyx_v_self->_safe_table, __pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE, (sizeof(__pyx_v_self->_safe_table)))); /* "yarl/_quoting.pyx":197 * self._qs = qs * * if not self._qs: # <<<<<<<<<<<<<< * memcpy(self._safe_table, * ALLOWED_NOTQS_TABLE, */ goto __pyx_L3; } /* "yarl/_quoting.pyx":202 * sizeof(self._safe_table)) * else: * memcpy(self._safe_table, # <<<<<<<<<<<<<< * ALLOWED_TABLE, * sizeof(self._safe_table)) */ /*else*/ { /* "yarl/_quoting.pyx":204 * memcpy(self._safe_table, * ALLOWED_TABLE, * sizeof(self._safe_table)) # <<<<<<<<<<<<<< * for ch in safe: * if ord(ch) > 127: */ (void)(memcpy(__pyx_v_self->_safe_table, __pyx_v_4yarl_8_quoting_ALLOWED_TABLE, (sizeof(__pyx_v_self->_safe_table)))); } __pyx_L3:; /* "yarl/_quoting.pyx":205 * ALLOWED_TABLE, * sizeof(self._safe_table)) * for ch in safe: # <<<<<<<<<<<<<< * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") */ if (unlikely(__pyx_v_safe == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 205, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_safe); __pyx_t_2 = __pyx_v_safe; __pyx_t_7 = __Pyx_init_unicode_iteration(__pyx_t_2, (&__pyx_t_4), (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 205, __pyx_L1_error) for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_4; __pyx_t_8++) { __pyx_t_3 = __pyx_t_8; __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_6, __pyx_t_5, __pyx_t_3); /* "yarl/_quoting.pyx":206 * sizeof(self._safe_table)) * for ch in safe: * if ord(ch) > 127: # <<<<<<<<<<<<<< * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) */ __pyx_t_1 = ((((long)__pyx_v_ch) > 0x7F) != 0); if (unlikely(__pyx_t_1)) { /* "yarl/_quoting.pyx":207 * for ch in safe: * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<< * set_bit(self._safe_table, ch) * */ __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 207, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_Raise(__pyx_t_9, 0, 0, 0); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __PYX_ERR(0, 207, __pyx_L1_error) /* "yarl/_quoting.pyx":206 * sizeof(self._safe_table)) * for ch in safe: * if ord(ch) > 127: # <<<<<<<<<<<<<< * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) */ } /* "yarl/_quoting.pyx":208 * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) # <<<<<<<<<<<<<< * * memset(self._protected_table, 0, sizeof(self._protected_table)) */ __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch); } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting.pyx":210 * set_bit(self._safe_table, ch) * * memset(self._protected_table, 0, sizeof(self._protected_table)) # <<<<<<<<<<<<<< * for ch in protected: * if ord(ch) > 127: */ (void)(memset(__pyx_v_self->_protected_table, 0, (sizeof(__pyx_v_self->_protected_table)))); /* "yarl/_quoting.pyx":211 * * memset(self._protected_table, 0, sizeof(self._protected_table)) * for ch in protected: # <<<<<<<<<<<<<< * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") */ if (unlikely(__pyx_v_protected == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 211, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_protected); __pyx_t_2 = __pyx_v_protected; __pyx_t_7 = __Pyx_init_unicode_iteration(__pyx_t_2, (&__pyx_t_3), (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 211, __pyx_L1_error) for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_3; __pyx_t_8++) { __pyx_t_4 = __pyx_t_8; __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_6, __pyx_t_5, __pyx_t_4); /* "yarl/_quoting.pyx":212 * memset(self._protected_table, 0, sizeof(self._protected_table)) * for ch in protected: * if ord(ch) > 127: # <<<<<<<<<<<<<< * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) */ __pyx_t_1 = ((((long)__pyx_v_ch) > 0x7F) != 0); if (unlikely(__pyx_t_1)) { /* "yarl/_quoting.pyx":213 * for ch in protected: * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<< * set_bit(self._safe_table, ch) * set_bit(self._protected_table, ch) */ __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 213, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_Raise(__pyx_t_9, 0, 0, 0); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __PYX_ERR(0, 213, __pyx_L1_error) /* "yarl/_quoting.pyx":212 * memset(self._protected_table, 0, sizeof(self._protected_table)) * for ch in protected: * if ord(ch) > 127: # <<<<<<<<<<<<<< * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) */ } /* "yarl/_quoting.pyx":214 * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) # <<<<<<<<<<<<<< * set_bit(self._protected_table, ch) * */ __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch); /* "yarl/_quoting.pyx":215 * raise ValueError("Only safe symbols with ORD < 128 are allowed") * set_bit(self._safe_table, ch) * set_bit(self._protected_table, ch) # <<<<<<<<<<<<<< * * def __call__(self, val): */ __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_self->_protected_table, __pyx_v_ch); } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting.pyx":192 * cdef uint8_t _protected_table[16] * * def __init__(self, *, str safe='', str protected='', bint qs=False): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("yarl._quoting._Quoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":217 * set_bit(self._protected_table, ch) * * def __call__(self, val): # <<<<<<<<<<<<<< * cdef Writer writer * if val is None: */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_val = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_val,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__call__") < 0)) __PYX_ERR(0, 217, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_val = values[0]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__call__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 217, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting._Quoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_8_quoting_7_Quoter_2__call__(((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_v_self), __pyx_v_val); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_2__call__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_val) { struct __pyx_t_4yarl_8_quoting_Writer __pyx_v_writer; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_t_5; char const *__pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("__call__", 0); __Pyx_INCREF(__pyx_v_val); /* "yarl/_quoting.pyx":219 * def __call__(self, val): * cdef Writer writer * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ __pyx_t_1 = (__pyx_v_val == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":220 * cdef Writer writer * if val is None: * return None # <<<<<<<<<<<<<< * if type(val) is not str: * if isinstance(val, str): */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "yarl/_quoting.pyx":219 * def __call__(self, val): * cdef Writer writer * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ } /* "yarl/_quoting.pyx":221 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ __pyx_t_2 = (((PyObject *)Py_TYPE(__pyx_v_val)) != ((PyObject *)(&PyUnicode_Type))); __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":222 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ __pyx_t_1 = PyUnicode_Check(__pyx_v_val); __pyx_t_2 = (__pyx_t_1 != 0); if (likely(__pyx_t_2)) { /* "yarl/_quoting.pyx":224 * if isinstance(val, str): * # derived from str * val = str(val) # <<<<<<<<<<<<<< * else: * raise TypeError("Argument should be str") */ __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":222 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ goto __pyx_L5; } /* "yarl/_quoting.pyx":226 * val = str(val) * else: * raise TypeError("Argument should be str") # <<<<<<<<<<<<<< * _init_writer(&writer) * try: */ /*else*/ { __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 226, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 226, __pyx_L1_error) } __pyx_L5:; /* "yarl/_quoting.pyx":221 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ } /* "yarl/_quoting.pyx":227 * else: * raise TypeError("Argument should be str") * _init_writer(&writer) # <<<<<<<<<<<<<< * try: * return self._do_quote(val, &writer) */ __pyx_f_4yarl_8_quoting__init_writer((&__pyx_v_writer)); /* "yarl/_quoting.pyx":228 * raise TypeError("Argument should be str") * _init_writer(&writer) * try: # <<<<<<<<<<<<<< * return self._do_quote(val, &writer) * finally: */ /*try:*/ { /* "yarl/_quoting.pyx":229 * _init_writer(&writer) * try: * return self._do_quote(val, &writer) # <<<<<<<<<<<<<< * finally: * _release_writer(&writer) */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = ((struct __pyx_vtabstruct_4yarl_8_quoting__Quoter *)__pyx_v_self->__pyx_vtab)->_do_quote(__pyx_v_self, ((PyObject*)__pyx_v_val), (&__pyx_v_writer)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 229, __pyx_L7_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L6_return; } /* "yarl/_quoting.pyx":231 * return self._do_quote(val, &writer) * finally: * _release_writer(&writer) # <<<<<<<<<<<<<< * * cdef str _do_quote(self, str val, Writer *writer): */ /*finally:*/ { __pyx_L7_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_8); __Pyx_XGOTREF(__pyx_t_9); __Pyx_XGOTREF(__pyx_t_10); __Pyx_XGOTREF(__pyx_t_11); __Pyx_XGOTREF(__pyx_t_12); __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; { __pyx_f_4yarl_8_quoting__release_writer((&__pyx_v_writer)); } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_10); __Pyx_XGIVEREF(__pyx_t_11); __Pyx_XGIVEREF(__pyx_t_12); __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); } __Pyx_XGIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_XGIVEREF(__pyx_t_9); __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; goto __pyx_L1_error; } __pyx_L6_return: { __pyx_t_12 = __pyx_r; __pyx_r = 0; __pyx_f_4yarl_8_quoting__release_writer((&__pyx_v_writer)); __pyx_r = __pyx_t_12; __pyx_t_12 = 0; goto __pyx_L0; } } /* "yarl/_quoting.pyx":217 * set_bit(self._protected_table, ch) * * def __call__(self, val): # <<<<<<<<<<<<<< * cdef Writer writer * if val is None: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("yarl._quoting._Quoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":233 * _release_writer(&writer) * * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * cdef int has_pct = 0 */ static PyObject *__pyx_f_4yarl_8_quoting_7_Quoter__do_quote(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer) { Py_UCS4 __pyx_v_ch; int __pyx_v_has_pct; Py_UCS4 __pyx_v_pct[2]; CYTHON_UNUSED int __pyx_v_idx; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; void *__pyx_t_4; int __pyx_t_5; int __pyx_t_6; Py_ssize_t __pyx_t_7; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("_do_quote", 0); /* "yarl/_quoting.pyx":235 * cdef str _do_quote(self, str val, Writer *writer): * cdef Py_UCS4 ch * cdef int has_pct = 0 # <<<<<<<<<<<<<< * cdef Py_UCS4 pct[2] * cdef int idx = 0 */ __pyx_v_has_pct = 0; /* "yarl/_quoting.pyx":237 * cdef int has_pct = 0 * cdef Py_UCS4 pct[2] * cdef int idx = 0 # <<<<<<<<<<<<<< * * for ch in val: */ __pyx_v_idx = 0; /* "yarl/_quoting.pyx":239 * cdef int idx = 0 * * for ch in val: # <<<<<<<<<<<<<< * if has_pct: * pct[has_pct-1] = ch */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 239, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_val); __pyx_t_1 = __pyx_v_val; __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 239, __pyx_L1_error) for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) { __pyx_t_2 = __pyx_t_7; __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2); /* "yarl/_quoting.pyx":240 * * for ch in val: * if has_pct: # <<<<<<<<<<<<<< * pct[has_pct-1] = ch * has_pct += 1 */ __pyx_t_8 = (__pyx_v_has_pct != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":241 * for ch in val: * if has_pct: * pct[has_pct-1] = ch # <<<<<<<<<<<<<< * has_pct += 1 * if has_pct == 3: */ (__pyx_v_pct[(__pyx_v_has_pct - 1)]) = __pyx_v_ch; /* "yarl/_quoting.pyx":242 * if has_pct: * pct[has_pct-1] = ch * has_pct += 1 # <<<<<<<<<<<<<< * if has_pct == 3: * ch = _restore_ch(pct[0], pct[1]) */ __pyx_v_has_pct = (__pyx_v_has_pct + 1); /* "yarl/_quoting.pyx":243 * pct[has_pct-1] = ch * has_pct += 1 * if has_pct == 3: # <<<<<<<<<<<<<< * ch = _restore_ch(pct[0], pct[1]) * has_pct = 0 */ __pyx_t_8 = ((__pyx_v_has_pct == 3) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":244 * has_pct += 1 * if has_pct == 3: * ch = _restore_ch(pct[0], pct[1]) # <<<<<<<<<<<<<< * has_pct = 0 * */ __pyx_v_ch = __pyx_f_4yarl_8_quoting__restore_ch((__pyx_v_pct[0]), (__pyx_v_pct[1])); /* "yarl/_quoting.pyx":245 * if has_pct == 3: * ch = _restore_ch(pct[0], pct[1]) * has_pct = 0 # <<<<<<<<<<<<<< * * if ch == -1: */ __pyx_v_has_pct = 0; /* "yarl/_quoting.pyx":247 * has_pct = 0 * * if ch == -1: # <<<<<<<<<<<<<< * if _write_percent(writer) < 0: * raise */ __pyx_t_8 = ((__pyx_v_ch == ((Py_UCS4)-1L)) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":248 * * if ch == -1: * if _write_percent(writer) < 0: # <<<<<<<<<<<<<< * raise * if self._write(writer, pct[0]) < 0: */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting__write_percent(__pyx_v_writer) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":249 * if ch == -1: * if _write_percent(writer) < 0: * raise # <<<<<<<<<<<<<< * if self._write(writer, pct[0]) < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 249, __pyx_L1_error) /* "yarl/_quoting.pyx":248 * * if ch == -1: * if _write_percent(writer) < 0: # <<<<<<<<<<<<<< * raise * if self._write(writer, pct[0]) < 0: */ } /* "yarl/_quoting.pyx":250 * if _write_percent(writer) < 0: * raise * if self._write(writer, pct[0]) < 0: # <<<<<<<<<<<<<< * raise * if self._write(writer, pct[1]) < 0: */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting_7_Quoter__write(__pyx_v_self, __pyx_v_writer, (__pyx_v_pct[0])) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":251 * raise * if self._write(writer, pct[0]) < 0: * raise # <<<<<<<<<<<<<< * if self._write(writer, pct[1]) < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 251, __pyx_L1_error) /* "yarl/_quoting.pyx":250 * if _write_percent(writer) < 0: * raise * if self._write(writer, pct[0]) < 0: # <<<<<<<<<<<<<< * raise * if self._write(writer, pct[1]) < 0: */ } /* "yarl/_quoting.pyx":252 * if self._write(writer, pct[0]) < 0: * raise * if self._write(writer, pct[1]) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting_7_Quoter__write(__pyx_v_self, __pyx_v_writer, (__pyx_v_pct[1])) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":253 * raise * if self._write(writer, pct[1]) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 253, __pyx_L1_error) /* "yarl/_quoting.pyx":252 * if self._write(writer, pct[0]) < 0: * raise * if self._write(writer, pct[1]) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting.pyx":254 * if self._write(writer, pct[1]) < 0: * raise * continue # <<<<<<<<<<<<<< * * if ch < 128: */ goto __pyx_L3_continue; /* "yarl/_quoting.pyx":247 * has_pct = 0 * * if ch == -1: # <<<<<<<<<<<<<< * if _write_percent(writer) < 0: * raise */ } /* "yarl/_quoting.pyx":256 * continue * * if ch < 128: # <<<<<<<<<<<<<< * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: */ __pyx_t_8 = ((__pyx_v_ch < 0x80) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":257 * * if ch < 128: * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<< * if _write_pct(writer, ch, True) < 0: * raise */ __pyx_t_8 = (__pyx_f_4yarl_8_quoting_bit_at(__pyx_v_self->_protected_table, __pyx_v_ch) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":258 * if ch < 128: * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting__write_pct(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":259 * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 259, __pyx_L1_error) /* "yarl/_quoting.pyx":258 * if ch < 128: * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting.pyx":260 * if _write_pct(writer, ch, True) < 0: * raise * continue # <<<<<<<<<<<<<< * * if bit_at(self._safe_table, ch): */ goto __pyx_L3_continue; /* "yarl/_quoting.pyx":257 * * if ch < 128: * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<< * if _write_pct(writer, ch, True) < 0: * raise */ } /* "yarl/_quoting.pyx":262 * continue * * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * if _write_char(writer, ch, True) < 0: * raise */ __pyx_t_8 = (__pyx_f_4yarl_8_quoting_bit_at(__pyx_v_self->_safe_table, __pyx_v_ch) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":263 * * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":264 * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 264, __pyx_L1_error) /* "yarl/_quoting.pyx":263 * * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting.pyx":265 * if _write_char(writer, ch, True) < 0: * raise * continue # <<<<<<<<<<<<<< * * if _write_pct_check(writer, ch, pct) < 0: */ goto __pyx_L3_continue; /* "yarl/_quoting.pyx":262 * continue * * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * if _write_char(writer, ch, True) < 0: * raise */ } /* "yarl/_quoting.pyx":256 * continue * * if ch < 128: # <<<<<<<<<<<<<< * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: */ } /* "yarl/_quoting.pyx":267 * continue * * if _write_pct_check(writer, ch, pct) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting__write_pct_check(__pyx_v_writer, __pyx_v_ch, __pyx_v_pct) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":268 * * if _write_pct_check(writer, ch, pct) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 268, __pyx_L1_error) /* "yarl/_quoting.pyx":267 * continue * * if _write_pct_check(writer, ch, pct) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting.pyx":243 * pct[has_pct-1] = ch * has_pct += 1 * if has_pct == 3: # <<<<<<<<<<<<<< * ch = _restore_ch(pct[0], pct[1]) * has_pct = 0 */ } /* "yarl/_quoting.pyx":269 * if _write_pct_check(writer, ch, pct) < 0: * raise * continue # <<<<<<<<<<<<<< * * elif ch == '%': */ goto __pyx_L3_continue; /* "yarl/_quoting.pyx":240 * * for ch in val: * if has_pct: # <<<<<<<<<<<<<< * pct[has_pct-1] = ch * has_pct += 1 */ } /* "yarl/_quoting.pyx":271 * continue * * elif ch == '%': # <<<<<<<<<<<<<< * has_pct = 1 * continue */ __pyx_t_8 = ((__pyx_v_ch == 37) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":272 * * elif ch == '%': * has_pct = 1 # <<<<<<<<<<<<<< * continue * */ __pyx_v_has_pct = 1; /* "yarl/_quoting.pyx":273 * elif ch == '%': * has_pct = 1 * continue # <<<<<<<<<<<<<< * * if self._write(writer, ch) < 0: */ goto __pyx_L3_continue; /* "yarl/_quoting.pyx":271 * continue * * elif ch == '%': # <<<<<<<<<<<<<< * has_pct = 1 * continue */ } /* "yarl/_quoting.pyx":275 * continue * * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting_7_Quoter__write(__pyx_v_self, __pyx_v_writer, __pyx_v_ch) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":276 * * if self._write(writer, ch) < 0: * raise # <<<<<<<<<<<<<< * * if has_pct: */ __Pyx_ReraiseException(); __PYX_ERR(0, 276, __pyx_L1_error) /* "yarl/_quoting.pyx":275 * continue * * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ } __pyx_L3_continue:; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":278 * raise * * if has_pct: # <<<<<<<<<<<<<< * if _write_percent(writer) < 0: * raise */ __pyx_t_8 = (__pyx_v_has_pct != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":279 * * if has_pct: * if _write_percent(writer) < 0: # <<<<<<<<<<<<<< * raise * if has_pct > 1: # the value is 2 */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting__write_percent(__pyx_v_writer) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":280 * if has_pct: * if _write_percent(writer) < 0: * raise # <<<<<<<<<<<<<< * if has_pct > 1: # the value is 2 * if self._write(writer, ch) < 0: */ __Pyx_ReraiseException(); __PYX_ERR(0, 280, __pyx_L1_error) /* "yarl/_quoting.pyx":279 * * if has_pct: * if _write_percent(writer) < 0: # <<<<<<<<<<<<<< * raise * if has_pct > 1: # the value is 2 */ } /* "yarl/_quoting.pyx":281 * if _write_percent(writer) < 0: * raise * if has_pct > 1: # the value is 2 # <<<<<<<<<<<<<< * if self._write(writer, ch) < 0: * raise */ __pyx_t_8 = ((__pyx_v_has_pct > 1) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":282 * raise * if has_pct > 1: # the value is 2 * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_8 = ((__pyx_f_4yarl_8_quoting_7_Quoter__write(__pyx_v_self, __pyx_v_writer, __pyx_v_ch) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "yarl/_quoting.pyx":283 * if has_pct > 1: # the value is 2 * if self._write(writer, ch) < 0: * raise # <<<<<<<<<<<<<< * * if not writer.changed: */ __Pyx_ReraiseException(); __PYX_ERR(0, 283, __pyx_L1_error) /* "yarl/_quoting.pyx":282 * raise * if has_pct > 1: # the value is 2 * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ } /* "yarl/_quoting.pyx":281 * if _write_percent(writer) < 0: * raise * if has_pct > 1: # the value is 2 # <<<<<<<<<<<<<< * if self._write(writer, ch) < 0: * raise */ } /* "yarl/_quoting.pyx":278 * raise * * if has_pct: # <<<<<<<<<<<<<< * if _write_percent(writer) < 0: * raise */ } /* "yarl/_quoting.pyx":285 * raise * * if not writer.changed: # <<<<<<<<<<<<<< * return val * else: */ __pyx_t_8 = ((!(__pyx_v_writer->changed != 0)) != 0); if (__pyx_t_8) { /* "yarl/_quoting.pyx":286 * * if not writer.changed: * return val # <<<<<<<<<<<<<< * else: * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_val); __pyx_r = __pyx_v_val; goto __pyx_L0; /* "yarl/_quoting.pyx":285 * raise * * if not writer.changed: # <<<<<<<<<<<<<< * return val * else: */ } /* "yarl/_quoting.pyx":288 * return val * else: * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") # <<<<<<<<<<<<<< * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_9 = PyUnicode_DecodeASCII(__pyx_v_writer->buf, __pyx_v_writer->pos, ((char *)"strict")); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 288, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_r = ((PyObject*)__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L0; } /* "yarl/_quoting.pyx":233 * _release_writer(&writer) * * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * cdef int has_pct = 0 */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("yarl._quoting._Quoter._do_quote", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":290 * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): # <<<<<<<<<<<<<< * if self._qs: * if ch == ' ': */ static CYTHON_INLINE int __pyx_f_4yarl_8_quoting_7_Quoter__write(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, struct __pyx_t_4yarl_8_quoting_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_write", 0); /* "yarl/_quoting.pyx":291 * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: # <<<<<<<<<<<<<< * if ch == ' ': * return _write_char(writer, '+', True) */ __pyx_t_1 = (__pyx_v_self->_qs != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":292 * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: * if ch == ' ': # <<<<<<<<<<<<<< * return _write_char(writer, '+', True) * */ __pyx_t_1 = ((__pyx_v_ch == 32) != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":293 * if self._qs: * if ch == ' ': * return _write_char(writer, '+', True) # <<<<<<<<<<<<<< * * if ch < 128 and bit_at(self._safe_table, ch): */ __pyx_r = __pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, 43, 1); goto __pyx_L0; /* "yarl/_quoting.pyx":292 * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: * if ch == ' ': # <<<<<<<<<<<<<< * return _write_char(writer, '+', True) * */ } /* "yarl/_quoting.pyx":291 * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: # <<<<<<<<<<<<<< * if ch == ' ': * return _write_char(writer, '+', True) */ } /* "yarl/_quoting.pyx":295 * return _write_char(writer, '+', True) * * if ch < 128 and bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * return _write_char(writer, ch, False) * */ __pyx_t_2 = ((__pyx_v_ch < 0x80) != 0); if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L6_bool_binop_done; } __pyx_t_2 = (__pyx_f_4yarl_8_quoting_bit_at(__pyx_v_self->_safe_table, __pyx_v_ch) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L6_bool_binop_done:; if (__pyx_t_1) { /* "yarl/_quoting.pyx":296 * * if ch < 128 and bit_at(self._safe_table, ch): * return _write_char(writer, ch, False) # <<<<<<<<<<<<<< * * return _write_utf8(writer, ch) */ __pyx_r = __pyx_f_4yarl_8_quoting__write_char(__pyx_v_writer, __pyx_v_ch, 0); goto __pyx_L0; /* "yarl/_quoting.pyx":295 * return _write_char(writer, '+', True) * * if ch < 128 and bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * return _write_char(writer, ch, False) * */ } /* "yarl/_quoting.pyx":298 * return _write_char(writer, ch, False) * * return _write_utf8(writer, ch) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_8_quoting__write_utf8(__pyx_v_writer, __pyx_v_ch); goto __pyx_L0; /* "yarl/_quoting.pyx":290 * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): # <<<<<<<<<<<<<< * if self._qs: * if ch == ' ': */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_4yarl_8_quoting_7_Quoter_4__reduce_cython__(((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self._protected_table, self._qs, self._safe_table) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = __Pyx_PyObject_FromCString(__pyx_v_self->_protected_table); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->_qs); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_FromCString(__pyx_v_self->_safe_table); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_v_state = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self._protected_table, self._qs, self._safe_table) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_4 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_v__dict = __pyx_t_4; __pyx_t_4 = 0; /* "(tree fragment)":7 * state = (self._protected_table, self._qs, self._safe_table) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_5 = (__pyx_v__dict != Py_None); __pyx_t_6 = (__pyx_t_5 != 0); if (__pyx_t_6) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v__dict); __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = False */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self._protected_table, self._qs, self._safe_table) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = False # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, None), state */ /*else*/ { __pyx_v_use_setstate = 0; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = False * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, None), state * else: */ __pyx_t_6 = (__pyx_v_use_setstate != 0); if (__pyx_t_6) { /* "(tree fragment)":13 * use_setstate = False * if use_setstate: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_150049702); __Pyx_GIVEREF(__pyx_int_150049702); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_150049702); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_4, 2, Py_None); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = False * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, None), state * else: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle__Quoter__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_150049702); __Pyx_GIVEREF(__pyx_int_150049702); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_150049702); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("yarl._quoting._Quoter.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle__Quoter__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_7_Quoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_4yarl_8_quoting_7_Quoter_6__setstate_cython__(((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle__Quoter__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_4yarl_8_quoting___pyx_unpickle__Quoter__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle__Quoter, (type(self), 0x8f193a6, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle__Quoter__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("yarl._quoting._Quoter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":307 * cdef _Quoter _qs_quoter * * def __init__(self, *, unsafe='', qs=False): # <<<<<<<<<<<<<< * self._unsafe = unsafe * self._qs = qs */ /* Python wrapper */ static int __pyx_pw_4yarl_8_quoting_9_Unquoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_4yarl_8_quoting_9_Unquoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_unsafe = 0; PyObject *__pyx_v_qs = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_unsafe,&__pyx_n_s_qs,0}; PyObject* values[2] = {0,0}; values[0] = ((PyObject *)__pyx_kp_u_); values[1] = ((PyObject *)Py_False); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); if (kw_args > 0 && likely(kw_args <= 2)) { Py_ssize_t index; for (index = 0; index < 2 && kw_args > 0; index++) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]); if (value) { values[index] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, 0, "__init__") < 0)) __PYX_ERR(0, 307, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 0) { goto __pyx_L5_argtuple_error; } else { } __pyx_v_unsafe = values[0]; __pyx_v_qs = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 307, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_8_quoting_9_Unquoter___init__(((struct __pyx_obj_4yarl_8_quoting__Unquoter *)__pyx_v_self), __pyx_v_unsafe, __pyx_v_qs); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_4yarl_8_quoting_9_Unquoter___init__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_unsafe, PyObject *__pyx_v_qs) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("__init__", 0); /* "yarl/_quoting.pyx":308 * * def __init__(self, *, unsafe='', qs=False): * self._unsafe = unsafe # <<<<<<<<<<<<<< * self._qs = qs * self._quoter = _Quoter() */ if (!(likely(PyUnicode_CheckExact(__pyx_v_unsafe))||((__pyx_v_unsafe) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_unsafe)->tp_name), 0))) __PYX_ERR(0, 308, __pyx_L1_error) __pyx_t_1 = __pyx_v_unsafe; __Pyx_INCREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_unsafe); __Pyx_DECREF(__pyx_v_self->_unsafe); __pyx_v_self->_unsafe = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":309 * def __init__(self, *, unsafe='', qs=False): * self._unsafe = unsafe * self._qs = qs # <<<<<<<<<<<<<< * self._quoter = _Quoter() * self._qs_quoter = _Quoter(qs=True) */ __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_qs); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 309, __pyx_L1_error) __pyx_v_self->_qs = __pyx_t_2; /* "yarl/_quoting.pyx":310 * self._unsafe = unsafe * self._qs = qs * self._quoter = _Quoter() # <<<<<<<<<<<<<< * self._qs_quoter = _Quoter(qs=True) * */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_4yarl_8_quoting__Quoter)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_quoter); __Pyx_DECREF(((PyObject *)__pyx_v_self->_quoter)); __pyx_v_self->_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":311 * self._qs = qs * self._quoter = _Quoter() * self._qs_quoter = _Quoter(qs=True) # <<<<<<<<<<<<<< * * def __call__(self, val): */ __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_qs, Py_True) < 0) __PYX_ERR(0, 311, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4yarl_8_quoting__Quoter), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_GIVEREF(__pyx_t_3); __Pyx_GOTREF(__pyx_v_self->_qs_quoter); __Pyx_DECREF(((PyObject *)__pyx_v_self->_qs_quoter)); __pyx_v_self->_qs_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":307 * cdef _Quoter _qs_quoter * * def __init__(self, *, unsafe='', qs=False): # <<<<<<<<<<<<<< * self._unsafe = unsafe * self._qs = qs */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("yarl._quoting._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":313 * self._qs_quoter = _Quoter(qs=True) * * def __call__(self, val): # <<<<<<<<<<<<<< * if val is None: * return None */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_val = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__call__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_val,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__call__") < 0)) __PYX_ERR(0, 313, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_val = values[0]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__call__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 313, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting._Unquoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_8_quoting_9_Unquoter_2__call__(((struct __pyx_obj_4yarl_8_quoting__Unquoter *)__pyx_v_self), __pyx_v_val); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_2__call__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("__call__", 0); __Pyx_INCREF(__pyx_v_val); /* "yarl/_quoting.pyx":314 * * def __call__(self, val): * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ __pyx_t_1 = (__pyx_v_val == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":315 * def __call__(self, val): * if val is None: * return None # <<<<<<<<<<<<<< * if type(val) is not str: * if isinstance(val, str): */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "yarl/_quoting.pyx":314 * * def __call__(self, val): * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ } /* "yarl/_quoting.pyx":316 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ __pyx_t_2 = (((PyObject *)Py_TYPE(__pyx_v_val)) != ((PyObject *)(&PyUnicode_Type))); __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { /* "yarl/_quoting.pyx":317 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ __pyx_t_1 = PyUnicode_Check(__pyx_v_val); __pyx_t_2 = (__pyx_t_1 != 0); if (likely(__pyx_t_2)) { /* "yarl/_quoting.pyx":319 * if isinstance(val, str): * # derived from str * val = str(val) # <<<<<<<<<<<<<< * else: * raise TypeError("Argument should be str") */ __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 319, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":317 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ goto __pyx_L5; } /* "yarl/_quoting.pyx":321 * val = str(val) * else: * raise TypeError("Argument should be str") # <<<<<<<<<<<<<< * return self._do_unquote(val) * */ /*else*/ { __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 321, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 321, __pyx_L1_error) } __pyx_L5:; /* "yarl/_quoting.pyx":316 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ } /* "yarl/_quoting.pyx":322 * else: * raise TypeError("Argument should be str") * return self._do_unquote(val) # <<<<<<<<<<<<<< * * cdef str _do_unquote(self, str val): */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = ((struct __pyx_vtabstruct_4yarl_8_quoting__Unquoter *)__pyx_v_self->__pyx_vtab)->_do_unquote(__pyx_v_self, ((PyObject*)__pyx_v_val)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 322, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "yarl/_quoting.pyx":313 * self._qs_quoter = _Quoter(qs=True) * * def __call__(self, val): # <<<<<<<<<<<<<< * if val is None: * return None */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("yarl._quoting._Unquoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting.pyx":324 * return self._do_unquote(val) * * cdef str _do_unquote(self, str val): # <<<<<<<<<<<<<< * if len(val) == 0: * return val */ static PyObject *__pyx_f_4yarl_8_quoting_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_v_pct = 0; PyObject *__pyx_v_last_pct = 0; PyObject *__pyx_v_pcts = 0; PyObject *__pyx_v_ret = 0; PyObject *__pyx_v_unquoted = 0; PyObject *__pyx_v_ch = NULL; PyObject *__pyx_v_h = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; void *__pyx_t_6; int __pyx_t_7; int __pyx_t_8; Py_ssize_t __pyx_t_9; Py_ssize_t __pyx_t_10; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; int __pyx_t_13; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; int __pyx_t_17; int __pyx_t_18; long __pyx_t_19; PyObject *(*__pyx_t_20)(PyObject *); __Pyx_RefNannySetupContext("_do_unquote", 0); /* "yarl/_quoting.pyx":325 * * cdef str _do_unquote(self, str val): * if len(val) == 0: # <<<<<<<<<<<<<< * return val * cdef str pct = '' */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 325, __pyx_L1_error) } __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_val); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 325, __pyx_L1_error) __pyx_t_2 = ((__pyx_t_1 == 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":326 * cdef str _do_unquote(self, str val): * if len(val) == 0: * return val # <<<<<<<<<<<<<< * cdef str pct = '' * cdef str last_pct = '' */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_val); __pyx_r = __pyx_v_val; goto __pyx_L0; /* "yarl/_quoting.pyx":325 * * cdef str _do_unquote(self, str val): * if len(val) == 0: # <<<<<<<<<<<<<< * return val * cdef str pct = '' */ } /* "yarl/_quoting.pyx":327 * if len(val) == 0: * return val * cdef str pct = '' # <<<<<<<<<<<<<< * cdef str last_pct = '' * cdef bytearray pcts = bytearray() */ __Pyx_INCREF(__pyx_kp_u_); __pyx_v_pct = __pyx_kp_u_; /* "yarl/_quoting.pyx":328 * return val * cdef str pct = '' * cdef str last_pct = '' # <<<<<<<<<<<<<< * cdef bytearray pcts = bytearray() * cdef list ret = [] */ __Pyx_INCREF(__pyx_kp_u_); __pyx_v_last_pct = __pyx_kp_u_; /* "yarl/_quoting.pyx":329 * cdef str pct = '' * cdef str last_pct = '' * cdef bytearray pcts = bytearray() # <<<<<<<<<<<<<< * cdef list ret = [] * cdef str unquoted */ __pyx_t_3 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_pcts = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":330 * cdef str last_pct = '' * cdef bytearray pcts = bytearray() * cdef list ret = [] # <<<<<<<<<<<<<< * cdef str unquoted * for ch in val: */ __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 330, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_ret = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":332 * cdef list ret = [] * cdef str unquoted * for ch in val: # <<<<<<<<<<<<<< * if pct: * pct += ch */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 332, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_val); __pyx_t_4 = __pyx_v_val; __pyx_t_8 = __Pyx_init_unicode_iteration(__pyx_t_4, (&__pyx_t_5), (&__pyx_t_6), (&__pyx_t_7)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 332, __pyx_L1_error) for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_5; __pyx_t_9++) { __pyx_t_1 = __pyx_t_9; __pyx_t_3 = PyUnicode_FromOrdinal(__Pyx_PyUnicode_READ(__pyx_t_7, __pyx_t_6, __pyx_t_1)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 332, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF_SET(__pyx_v_ch, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":333 * cdef str unquoted * for ch in val: * if pct: # <<<<<<<<<<<<<< * pct += ch * if len(pct) == 3: # pragma: no branch # peephole optimizer */ __pyx_t_2 = (__pyx_v_pct != Py_None)&&(__Pyx_PyUnicode_IS_TRUE(__pyx_v_pct) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":334 * for ch in val: * if pct: * pct += ch # <<<<<<<<<<<<<< * if len(pct) == 3: # pragma: no branch # peephole optimizer * pcts.append(int(pct[1:], base=16)) */ __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_pct, __pyx_v_ch); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 334, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyUnicode_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 334, __pyx_L1_error) __Pyx_DECREF_SET(__pyx_v_pct, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":335 * if pct: * pct += ch * if len(pct) == 3: # pragma: no branch # peephole optimizer # <<<<<<<<<<<<<< * pcts.append(int(pct[1:], base=16)) * last_pct = pct */ if (unlikely(__pyx_v_pct == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 335, __pyx_L1_error) } __pyx_t_10 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_pct); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 335, __pyx_L1_error) __pyx_t_2 = ((__pyx_t_10 == 3) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":336 * pct += ch * if len(pct) == 3: # pragma: no branch # peephole optimizer * pcts.append(int(pct[1:], base=16)) # <<<<<<<<<<<<<< * last_pct = pct * pct = '' */ if (unlikely(__pyx_v_pct == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 336, __pyx_L1_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_pct, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 336, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 336, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 336, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_base, __pyx_int_16) < 0) __PYX_ERR(0, 336, __pyx_L1_error) __pyx_t_12 = __Pyx_PyObject_Call(((PyObject *)(&PyInt_Type)), __pyx_t_11, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 336, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_13 = __Pyx_PyByteArray_AppendObject(__pyx_v_pcts, __pyx_t_12); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 336, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":337 * if len(pct) == 3: # pragma: no branch # peephole optimizer * pcts.append(int(pct[1:], base=16)) * last_pct = pct # <<<<<<<<<<<<<< * pct = '' * continue */ __Pyx_INCREF(__pyx_v_pct); __Pyx_DECREF_SET(__pyx_v_last_pct, __pyx_v_pct); /* "yarl/_quoting.pyx":338 * pcts.append(int(pct[1:], base=16)) * last_pct = pct * pct = '' # <<<<<<<<<<<<<< * continue * if pcts: */ __Pyx_INCREF(__pyx_kp_u_); __Pyx_DECREF_SET(__pyx_v_pct, __pyx_kp_u_); /* "yarl/_quoting.pyx":335 * if pct: * pct += ch * if len(pct) == 3: # pragma: no branch # peephole optimizer # <<<<<<<<<<<<<< * pcts.append(int(pct[1:], base=16)) * last_pct = pct */ } /* "yarl/_quoting.pyx":339 * last_pct = pct * pct = '' * continue # <<<<<<<<<<<<<< * if pcts: * try: */ goto __pyx_L4_continue; /* "yarl/_quoting.pyx":333 * cdef str unquoted * for ch in val: * if pct: # <<<<<<<<<<<<<< * pct += ch * if len(pct) == 3: # pragma: no branch # peephole optimizer */ } /* "yarl/_quoting.pyx":340 * pct = '' * continue * if pcts: # <<<<<<<<<<<<<< * try: * unquoted = pcts.decode('utf8') */ __pyx_t_2 = (PyByteArray_GET_SIZE(__pyx_v_pcts) != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":341 * continue * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); __Pyx_XGOTREF(__pyx_t_14); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_16); /*try:*/ { /* "yarl/_quoting.pyx":342 * if pcts: * try: * unquoted = pcts.decode('utf8') # <<<<<<<<<<<<<< * except UnicodeDecodeError: * pass */ __pyx_t_12 = __Pyx_decode_bytearray(__pyx_v_pcts, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 342, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_12)); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":341 * continue * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ } /* "yarl/_quoting.pyx":346 * pass * else: * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ /*else:*/ { __pyx_t_17 = (__pyx_v_self->_qs != 0); if (__pyx_t_17) { } else { __pyx_t_2 = __pyx_t_17; goto __pyx_L18_bool_binop_done; } __pyx_t_17 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_kp_u__4, Py_EQ)); if (unlikely(__pyx_t_17 < 0)) __PYX_ERR(0, 346, __pyx_L11_except_error) __pyx_t_18 = (__pyx_t_17 != 0); __pyx_t_2 = __pyx_t_18; __pyx_L18_bool_binop_done:; if (__pyx_t_2) { /* "yarl/_quoting.pyx":347 * else: * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) # <<<<<<<<<<<<<< * elif unquoted in self._unsafe: * ret.append(self._quoter(unquoted)) */ __Pyx_INCREF(((PyObject *)__pyx_v_self->_qs_quoter)); __pyx_t_3 = ((PyObject *)__pyx_v_self->_qs_quoter); __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_12 = (__pyx_t_11) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_11, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 347, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 347, __pyx_L11_except_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":346 * pass * else: * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ goto __pyx_L17; } /* "yarl/_quoting.pyx":348 * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: # <<<<<<<<<<<<<< * ret.append(self._quoter(unquoted)) * else: */ if (unlikely(__pyx_v_self->_unsafe == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 348, __pyx_L11_except_error) } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 348, __pyx_L11_except_error) __pyx_t_18 = (__pyx_t_2 != 0); if (__pyx_t_18) { /* "yarl/_quoting.pyx":349 * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: * ret.append(self._quoter(unquoted)) # <<<<<<<<<<<<<< * else: * ret.append(unquoted) */ __Pyx_INCREF(((PyObject *)__pyx_v_self->_quoter)); __pyx_t_3 = ((PyObject *)__pyx_v_self->_quoter); __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_12 = (__pyx_t_11) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_11, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 349, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 349, __pyx_L11_except_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":348 * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: # <<<<<<<<<<<<<< * ret.append(self._quoter(unquoted)) * else: */ goto __pyx_L17; } /* "yarl/_quoting.pyx":351 * ret.append(self._quoter(unquoted)) * else: * ret.append(unquoted) # <<<<<<<<<<<<<< * del pcts[:] * */ /*else*/ { __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_unquoted); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 351, __pyx_L11_except_error) } __pyx_L17:; /* "yarl/_quoting.pyx":352 * else: * ret.append(unquoted) * del pcts[:] # <<<<<<<<<<<<<< * * if ch == '%': */ if (__Pyx_PyObject_DelSlice(__pyx_v_pcts, 0, 0, NULL, NULL, NULL, 0, 0, 1) < 0) __PYX_ERR(0, 352, __pyx_L11_except_error) } __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; goto __pyx_L16_try_end; __pyx_L9_error:; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":343 * try: * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: # <<<<<<<<<<<<<< * pass * else: */ __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError); if (__pyx_t_8) { __Pyx_ErrRestore(0,0,0); goto __pyx_L10_exception_handled; } goto __pyx_L11_except_error; __pyx_L11_except_error:; /* "yarl/_quoting.pyx":341 * continue * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); goto __pyx_L1_error; __pyx_L10_exception_handled:; __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); __pyx_L16_try_end:; } /* "yarl/_quoting.pyx":340 * pct = '' * continue * if pcts: # <<<<<<<<<<<<<< * try: * unquoted = pcts.decode('utf8') */ } /* "yarl/_quoting.pyx":354 * del pcts[:] * * if ch == '%': # <<<<<<<<<<<<<< * pct = ch * continue */ __pyx_t_18 = (__Pyx_PyUnicode_Equals(__pyx_v_ch, __pyx_kp_u__5, Py_EQ)); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 354, __pyx_L1_error) if (__pyx_t_18) { /* "yarl/_quoting.pyx":355 * * if ch == '%': * pct = ch # <<<<<<<<<<<<<< * continue * */ if (!(likely(PyUnicode_CheckExact(__pyx_v_ch))||((__pyx_v_ch) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_ch)->tp_name), 0))) __PYX_ERR(0, 355, __pyx_L1_error) __pyx_t_12 = __pyx_v_ch; __Pyx_INCREF(__pyx_t_12); __Pyx_DECREF_SET(__pyx_v_pct, ((PyObject*)__pyx_t_12)); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":356 * if ch == '%': * pct = ch * continue # <<<<<<<<<<<<<< * * if pcts: */ goto __pyx_L4_continue; /* "yarl/_quoting.pyx":354 * del pcts[:] * * if ch == '%': # <<<<<<<<<<<<<< * pct = ch * continue */ } /* "yarl/_quoting.pyx":358 * continue * * if pcts: # <<<<<<<<<<<<<< * ret.append(last_pct) # %F8ab * last_pct = '' */ __pyx_t_18 = (PyByteArray_GET_SIZE(__pyx_v_pcts) != 0); if (__pyx_t_18) { /* "yarl/_quoting.pyx":359 * * if pcts: * ret.append(last_pct) # %F8ab # <<<<<<<<<<<<<< * last_pct = '' * */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_last_pct); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 359, __pyx_L1_error) /* "yarl/_quoting.pyx":360 * if pcts: * ret.append(last_pct) # %F8ab * last_pct = '' # <<<<<<<<<<<<<< * * if ch == '+': */ __Pyx_INCREF(__pyx_kp_u_); __Pyx_DECREF_SET(__pyx_v_last_pct, __pyx_kp_u_); /* "yarl/_quoting.pyx":358 * continue * * if pcts: # <<<<<<<<<<<<<< * ret.append(last_pct) # %F8ab * last_pct = '' */ } /* "yarl/_quoting.pyx":362 * last_pct = '' * * if ch == '+': # <<<<<<<<<<<<<< * if not self._qs or ch in self._unsafe: * ret.append('+') */ __pyx_t_18 = (__Pyx_PyUnicode_Equals(__pyx_v_ch, __pyx_kp_u__6, Py_EQ)); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 362, __pyx_L1_error) if (__pyx_t_18) { /* "yarl/_quoting.pyx":363 * * if ch == '+': * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('+') * else: */ __pyx_t_2 = ((!(__pyx_v_self->_qs != 0)) != 0); if (!__pyx_t_2) { } else { __pyx_t_18 = __pyx_t_2; goto __pyx_L24_bool_binop_done; } if (unlikely(__pyx_v_self->_unsafe == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 363, __pyx_L1_error) } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_ch, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 363, __pyx_L1_error) __pyx_t_17 = (__pyx_t_2 != 0); __pyx_t_18 = __pyx_t_17; __pyx_L24_bool_binop_done:; if (__pyx_t_18) { /* "yarl/_quoting.pyx":364 * if ch == '+': * if not self._qs or ch in self._unsafe: * ret.append('+') # <<<<<<<<<<<<<< * else: * ret.append(' ') */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__6); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 364, __pyx_L1_error) /* "yarl/_quoting.pyx":363 * * if ch == '+': * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('+') * else: */ goto __pyx_L23; } /* "yarl/_quoting.pyx":366 * ret.append('+') * else: * ret.append(' ') # <<<<<<<<<<<<<< * continue * */ /*else*/ { __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__7); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 366, __pyx_L1_error) } __pyx_L23:; /* "yarl/_quoting.pyx":367 * else: * ret.append(' ') * continue # <<<<<<<<<<<<<< * * if ch in self._unsafe: */ goto __pyx_L4_continue; /* "yarl/_quoting.pyx":362 * last_pct = '' * * if ch == '+': # <<<<<<<<<<<<<< * if not self._qs or ch in self._unsafe: * ret.append('+') */ } /* "yarl/_quoting.pyx":369 * continue * * if ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('%') * h = hex(ord(ch)).upper()[2:] */ if (unlikely(__pyx_v_self->_unsafe == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 369, __pyx_L1_error) } __pyx_t_18 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_ch, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 369, __pyx_L1_error) __pyx_t_17 = (__pyx_t_18 != 0); if (__pyx_t_17) { /* "yarl/_quoting.pyx":370 * * if ch in self._unsafe: * ret.append('%') # <<<<<<<<<<<<<< * h = hex(ord(ch)).upper()[2:] * for ch in h: */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__5); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 370, __pyx_L1_error) /* "yarl/_quoting.pyx":371 * if ch in self._unsafe: * ret.append('%') * h = hex(ord(ch)).upper()[2:] # <<<<<<<<<<<<<< * for ch in h: * ret.append(ch) */ __pyx_t_19 = __Pyx_PyObject_Ord(__pyx_v_ch); if (unlikely(__pyx_t_19 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 371, __pyx_L1_error) __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_t_19); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_hex, __pyx_t_3); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_upper); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_12 = (__pyx_t_11) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_11) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetSlice(__pyx_t_12, 2, 0, NULL, NULL, &__pyx_slice__8, 1, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF_SET(__pyx_v_h, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":372 * ret.append('%') * h = hex(ord(ch)).upper()[2:] * for ch in h: # <<<<<<<<<<<<<< * ret.append(ch) * continue */ if (likely(PyList_CheckExact(__pyx_v_h)) || PyTuple_CheckExact(__pyx_v_h)) { __pyx_t_3 = __pyx_v_h; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0; __pyx_t_20 = NULL; } else { __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_h); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 372, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_20)) { if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_12 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_12); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 372, __pyx_L1_error) #else __pyx_t_12 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); #endif } else { if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_12); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 372, __pyx_L1_error) #else __pyx_t_12 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); #endif } } else { __pyx_t_12 = __pyx_t_20(__pyx_t_3); if (unlikely(!__pyx_t_12)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); else __PYX_ERR(0, 372, __pyx_L1_error) } break; } __Pyx_GOTREF(__pyx_t_12); } __Pyx_DECREF_SET(__pyx_v_ch, __pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting.pyx":373 * h = hex(ord(ch)).upper()[2:] * for ch in h: * ret.append(ch) # <<<<<<<<<<<<<< * continue * */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_ch); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 373, __pyx_L1_error) /* "yarl/_quoting.pyx":372 * ret.append('%') * h = hex(ord(ch)).upper()[2:] * for ch in h: # <<<<<<<<<<<<<< * ret.append(ch) * continue */ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":374 * for ch in h: * ret.append(ch) * continue # <<<<<<<<<<<<<< * * ret.append(ch) */ goto __pyx_L4_continue; /* "yarl/_quoting.pyx":369 * continue * * if ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('%') * h = hex(ord(ch)).upper()[2:] */ } /* "yarl/_quoting.pyx":376 * continue * * ret.append(ch) # <<<<<<<<<<<<<< * * if pcts: */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_ch); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 376, __pyx_L1_error) __pyx_L4_continue:; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "yarl/_quoting.pyx":378 * ret.append(ch) * * if pcts: # <<<<<<<<<<<<<< * try: * unquoted = pcts.decode('utf8') */ __pyx_t_17 = (PyByteArray_GET_SIZE(__pyx_v_pcts) != 0); if (__pyx_t_17) { /* "yarl/_quoting.pyx":379 * * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_16, &__pyx_t_15, &__pyx_t_14); __Pyx_XGOTREF(__pyx_t_16); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_14); /*try:*/ { /* "yarl/_quoting.pyx":380 * if pcts: * try: * unquoted = pcts.decode('utf8') # <<<<<<<<<<<<<< * except UnicodeDecodeError: * ret.append(last_pct) # %F8 */ __pyx_t_3 = __Pyx_decode_bytearray(__pyx_v_pcts, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 380, __pyx_L30_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":379 * * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ } /* "yarl/_quoting.pyx":384 * ret.append(last_pct) # %F8 * else: * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ /*else:*/ { __pyx_t_18 = (__pyx_v_self->_qs != 0); if (__pyx_t_18) { } else { __pyx_t_17 = __pyx_t_18; goto __pyx_L37_bool_binop_done; } __pyx_t_18 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_kp_u__4, Py_EQ)); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 384, __pyx_L32_except_error) __pyx_t_2 = (__pyx_t_18 != 0); __pyx_t_17 = __pyx_t_2; __pyx_L37_bool_binop_done:; if (__pyx_t_17) { /* "yarl/_quoting.pyx":385 * else: * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) # <<<<<<<<<<<<<< * elif unquoted in self._unsafe: * ret.append(self._quoter(unquoted)) */ __Pyx_INCREF(((PyObject *)__pyx_v_self->_qs_quoter)); __pyx_t_12 = ((PyObject *)__pyx_v_self->_qs_quoter); __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_12, function); } } __pyx_t_3 = (__pyx_t_11) ? __Pyx_PyObject_Call2Args(__pyx_t_12, __pyx_t_11, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 385, __pyx_L32_except_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_3); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 385, __pyx_L32_except_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":384 * ret.append(last_pct) # %F8 * else: * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ goto __pyx_L36; } /* "yarl/_quoting.pyx":386 * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: # <<<<<<<<<<<<<< * ret.append(self._quoter(unquoted)) * else: */ if (unlikely(__pyx_v_self->_unsafe == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 386, __pyx_L32_except_error) } __pyx_t_17 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_17 < 0)) __PYX_ERR(0, 386, __pyx_L32_except_error) __pyx_t_2 = (__pyx_t_17 != 0); if (__pyx_t_2) { /* "yarl/_quoting.pyx":387 * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: * ret.append(self._quoter(unquoted)) # <<<<<<<<<<<<<< * else: * ret.append(unquoted) */ __Pyx_INCREF(((PyObject *)__pyx_v_self->_quoter)); __pyx_t_12 = ((PyObject *)__pyx_v_self->_quoter); __pyx_t_11 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_12, function); } } __pyx_t_3 = (__pyx_t_11) ? __Pyx_PyObject_Call2Args(__pyx_t_12, __pyx_t_11, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 387, __pyx_L32_except_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_3); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 387, __pyx_L32_except_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting.pyx":386 * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: # <<<<<<<<<<<<<< * ret.append(self._quoter(unquoted)) * else: */ goto __pyx_L36; } /* "yarl/_quoting.pyx":389 * ret.append(self._quoter(unquoted)) * else: * ret.append(unquoted) # <<<<<<<<<<<<<< * return ''.join(ret) */ /*else*/ { __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_unquoted); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 389, __pyx_L32_except_error) } __pyx_L36:; } __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; goto __pyx_L35_try_end; __pyx_L30_error:; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; /* "yarl/_quoting.pyx":381 * try: * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: # <<<<<<<<<<<<<< * ret.append(last_pct) # %F8 * else: */ __pyx_t_7 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError); if (__pyx_t_7) { __Pyx_AddTraceback("yarl._quoting._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_12, &__pyx_t_11) < 0) __PYX_ERR(0, 381, __pyx_L32_except_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_12); __Pyx_GOTREF(__pyx_t_11); /* "yarl/_quoting.pyx":382 * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: * ret.append(last_pct) # %F8 # <<<<<<<<<<<<<< * else: * if self._qs and unquoted in '+=&;': */ __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_last_pct); if (unlikely(__pyx_t_13 == ((int)-1))) __PYX_ERR(0, 382, __pyx_L32_except_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L31_exception_handled; } goto __pyx_L32_except_error; __pyx_L32_except_error:; /* "yarl/_quoting.pyx":379 * * if pcts: * try: # <<<<<<<<<<<<<< * unquoted = pcts.decode('utf8') * except UnicodeDecodeError: */ __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_ExceptionReset(__pyx_t_16, __pyx_t_15, __pyx_t_14); goto __pyx_L1_error; __pyx_L31_exception_handled:; __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_ExceptionReset(__pyx_t_16, __pyx_t_15, __pyx_t_14); __pyx_L35_try_end:; } /* "yarl/_quoting.pyx":378 * ret.append(ch) * * if pcts: # <<<<<<<<<<<<<< * try: * unquoted = pcts.decode('utf8') */ } /* "yarl/_quoting.pyx":390 * else: * ret.append(unquoted) * return ''.join(ret) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_11 = PyUnicode_Join(__pyx_kp_u_, __pyx_v_ret); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_r = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L0; /* "yarl/_quoting.pyx":324 * return self._do_unquote(val) * * cdef str _do_unquote(self, str val): # <<<<<<<<<<<<<< * if len(val) == 0: * return val */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("yarl._quoting._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pct); __Pyx_XDECREF(__pyx_v_last_pct); __Pyx_XDECREF(__pyx_v_pcts); __Pyx_XDECREF(__pyx_v_ret); __Pyx_XDECREF(__pyx_v_unquoted); __Pyx_XDECREF(__pyx_v_ch); __Pyx_XDECREF(__pyx_v_h); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_4yarl_8_quoting_9_Unquoter_4__reduce_cython__(((struct __pyx_obj_4yarl_8_quoting__Unquoter *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->_qs); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_v_self->_qs_quoter)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->_qs_quoter)); PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->_qs_quoter)); __Pyx_INCREF(((PyObject *)__pyx_v_self->_quoter)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self->_quoter)); PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->_quoter)); __Pyx_INCREF(__pyx_v_self->_unsafe); __Pyx_GIVEREF(__pyx_v_self->_unsafe); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->_unsafe); __pyx_t_1 = 0; __pyx_v_state = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v__dict = __pyx_t_2; __pyx_t_2 = 0; /* "(tree fragment)":7 * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_3 = (__pyx_v__dict != Py_None); __pyx_t_4 = (__pyx_t_3 != 0); if (__pyx_t_4) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict); __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); __pyx_t_1 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state */ /*else*/ { __pyx_t_3 = (((PyObject *)__pyx_v_self->_qs_quoter) != Py_None); __pyx_t_5 = (__pyx_t_3 != 0); if (!__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (((PyObject *)__pyx_v_self->_quoter) != Py_None); __pyx_t_3 = (__pyx_t_5 != 0); if (!__pyx_t_3) { } else { __pyx_t_4 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } __pyx_t_3 = (__pyx_v_self->_unsafe != ((PyObject*)Py_None)); __pyx_t_5 = (__pyx_t_3 != 0); __pyx_t_4 = __pyx_t_5; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_4; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state * else: */ __pyx_t_4 = (__pyx_v_use_setstate != 0); if (__pyx_t_4) { /* "(tree fragment)":13 * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None * if use_setstate: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle__Unquoter); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_41310077); __Pyx_GIVEREF(__pyx_int_41310077); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_41310077); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_6; __pyx_t_6 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state * else: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle__Unquoter__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle__Unquoter); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_41310077); __Pyx_GIVEREF(__pyx_int_41310077); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_41310077); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); __pyx_t_6 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("yarl._quoting._Unquoter.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle__Unquoter__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_4yarl_8_quoting_9_Unquoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_4yarl_8_quoting_9_Unquoter_6__setstate_cython__(((struct __pyx_obj_4yarl_8_quoting__Unquoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle__Unquoter__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_4yarl_8_quoting___pyx_unpickle__Unquoter__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle__Unquoter__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("yarl._quoting._Unquoter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_1__pyx_unpickle__Quoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_4yarl_8_quoting_1__pyx_unpickle__Quoter = {"__pyx_unpickle__Quoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_8_quoting_1__pyx_unpickle__Quoter, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_4yarl_8_quoting_1__pyx_unpickle__Quoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle__Quoter") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Quoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_8_quoting___pyx_unpickle__Quoter(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting___pyx_unpickle__Quoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x8f193a6: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) */ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x8f193a6) != 0); if (__pyx_t_1) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum != 0x8f193a6: * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) * __pyx_result = _Quoter.__new__(__pyx_type) */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2); __pyx_v___pyx_PickleError = __pyx_t_2; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum != 0x8f193a6: * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = _Quoter.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x8f, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x8f193a6: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) * __pyx_result = _Quoter.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_8_quoting__Quoter), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v___pyx_result = __pyx_t_3; __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) * __pyx_result = _Quoter.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_1 = (__pyx_v___pyx_state != Py_None); __pyx_t_6 = (__pyx_t_1 != 0); if (__pyx_t_6) { /* "(tree fragment)":9 * __pyx_result = _Quoter.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_3 = __pyx_f_4yarl_8_quoting___pyx_unpickle__Quoter__set_state(((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x8f193a6 = (_protected_table, _qs, _safe_table))" % __pyx_checksum) * __pyx_result = _Quoter.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Quoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_4yarl_8_quoting___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_8_quoting__Quoter *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; uint8_t __pyx_t_2[16]; int __pyx_t_3; Py_ssize_t __pyx_t_4; int __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter__set_state", 0); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] # <<<<<<<<<<<<<< * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[3]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (unlikely(__Pyx_carray_from_py_uint8_t(__pyx_t_1, __pyx_t_2, 16) < 0)) __PYX_ERR(1, 12, __pyx_L1_error) memcpy(&(__pyx_v___pyx_result->_protected_table[0]), __pyx_t_2, sizeof(__pyx_v___pyx_result->_protected_table[0]) * (16)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result->_qs = __pyx_t_3; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (unlikely(__Pyx_carray_from_py_uint8_t(__pyx_t_1, __pyx_t_2, 16) < 0)) __PYX_ERR(1, 12, __pyx_L1_error) memcpy(&(__pyx_v___pyx_result->_safe_table[0]), __pyx_t_2, sizeof(__pyx_v___pyx_result->_safe_table[0]) * (16)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[3]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = ((__pyx_t_4 > 3) != 0); if (__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_6 = (__pyx_t_5 != 0); __pyx_t_3 = __pyx_t_6; __pyx_L4_bool_binop_done:; if (__pyx_t_3) { /* "(tree fragment)":14 * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[3]) # <<<<<<<<<<<<<< */ __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_update); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_8, function); } } __pyx_t_1 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[3]) */ } /* "(tree fragment)":11 * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Quoter__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle__Unquoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_8_quoting_3__pyx_unpickle__Unquoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_4yarl_8_quoting_3__pyx_unpickle__Unquoter = {"__pyx_unpickle__Unquoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_8_quoting_3__pyx_unpickle__Unquoter, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_4yarl_8_quoting_3__pyx_unpickle__Unquoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle__Unquoter") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Unquoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_8_quoting_2__pyx_unpickle__Unquoter(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_8_quoting_2__pyx_unpickle__Unquoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x276577d: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) */ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x276577d) != 0); if (__pyx_t_1) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum != 0x276577d: * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) * __pyx_result = _Unquoter.__new__(__pyx_type) */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2); __pyx_v___pyx_PickleError = __pyx_t_2; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum != 0x276577d: * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = _Unquoter.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x27, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x276577d: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) * __pyx_result = _Unquoter.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_8_quoting__Unquoter), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v___pyx_result = __pyx_t_3; __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) * __pyx_result = _Unquoter.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_1 = (__pyx_v___pyx_state != Py_None); __pyx_t_6 = (__pyx_t_1 != 0); if (__pyx_t_6) { /* "(tree fragment)":9 * __pyx_result = _Unquoter.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_3 = __pyx_f_4yarl_8_quoting___pyx_unpickle__Unquoter__set_state(((struct __pyx_obj_4yarl_8_quoting__Unquoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) * __pyx_result = _Unquoter.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle__Unquoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Unquoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_4yarl_8_quoting___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_8_quoting__Unquoter *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter__set_state", 0); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] # <<<<<<<<<<<<<< * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[4]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result->_qs = __pyx_t_2; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4yarl_8_quoting__Quoter))))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->_qs_quoter); __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->_qs_quoter)); __pyx_v___pyx_result->_qs_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4yarl_8_quoting__Quoter))))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->_quoter); __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->_quoter)); __pyx_v___pyx_result->_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->_unsafe); __Pyx_DECREF(__pyx_v___pyx_result->_unsafe); __pyx_v___pyx_result->_unsafe = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[4]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_4 = ((__pyx_t_3 > 4) != 0); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = (__pyx_t_4 != 0); __pyx_t_2 = __pyx_t_5; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { /* "(tree fragment)":14 * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[4]) # <<<<<<<<<<<<<< */ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[4]) */ } /* "(tree fragment)":11 * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("yarl._quoting.__pyx_unpickle__Unquoter__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "carray.from_py":77 * * @cname("__Pyx_carray_from_py_uint8_t") * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< * cdef Py_ssize_t i = length * try: */ static int __Pyx_carray_from_py_uint8_t(PyObject *__pyx_v_o, uint8_t *__pyx_v_v, Py_ssize_t __pyx_v_length) { Py_ssize_t __pyx_v_i; PyObject *__pyx_v_item = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; Py_ssize_t __pyx_t_4; int __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; Py_ssize_t __pyx_t_8; PyObject *(*__pyx_t_9)(PyObject *); PyObject *__pyx_t_10 = NULL; uint8_t __pyx_t_11; char const *__pyx_t_12; __Pyx_RefNannySetupContext("__Pyx_carray_from_py_uint8_t", 0); /* "carray.from_py":78 * @cname("__Pyx_carray_from_py_uint8_t") * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: * cdef Py_ssize_t i = length # <<<<<<<<<<<<<< * try: * i = len(o) */ __pyx_v_i = __pyx_v_length; /* "carray.from_py":79 * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: * cdef Py_ssize_t i = length * try: # <<<<<<<<<<<<<< * i = len(o) * except (TypeError, OverflowError): */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "carray.from_py":80 * cdef Py_ssize_t i = length * try: * i = len(o) # <<<<<<<<<<<<<< * except (TypeError, OverflowError): * pass */ __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 80, __pyx_L3_error) __pyx_v_i = __pyx_t_4; /* "carray.from_py":79 * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: * cdef Py_ssize_t i = length * try: # <<<<<<<<<<<<<< * i = len(o) * except (TypeError, OverflowError): */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; /* "carray.from_py":81 * try: * i = len(o) * except (TypeError, OverflowError): # <<<<<<<<<<<<<< * pass * if i == length: */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); if (__pyx_t_5) { __Pyx_ErrRestore(0,0,0); goto __pyx_L4_exception_handled; } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "carray.from_py":79 * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: * cdef Py_ssize_t i = length * try: # <<<<<<<<<<<<<< * i = len(o) * except (TypeError, OverflowError): */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L4_exception_handled:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); __pyx_L8_try_end:; } /* "carray.from_py":83 * except (TypeError, OverflowError): * pass * if i == length: # <<<<<<<<<<<<<< * for i, item in enumerate(o): * if i >= length: */ __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); if (__pyx_t_6) { /* "carray.from_py":84 * pass * if i == length: * for i, item in enumerate(o): # <<<<<<<<<<<<<< * if i >= length: * break */ __pyx_t_4 = 0; if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0; __pyx_t_9 = NULL; } else { __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 84, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_9)) { if (likely(PyList_CheckExact(__pyx_t_7))) { if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(1, 84, __pyx_L1_error) #else __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); #endif } else { if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(1, 84, __pyx_L1_error) #else __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); #endif } } else { __pyx_t_10 = __pyx_t_9(__pyx_t_7); if (unlikely(!__pyx_t_10)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); else __PYX_ERR(1, 84, __pyx_L1_error) } break; } __Pyx_GOTREF(__pyx_t_10); } __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10); __pyx_t_10 = 0; __pyx_v_i = __pyx_t_4; __pyx_t_4 = (__pyx_t_4 + 1); /* "carray.from_py":85 * if i == length: * for i, item in enumerate(o): * if i >= length: # <<<<<<<<<<<<<< * break * v[i] = item */ __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0); if (__pyx_t_6) { /* "carray.from_py":86 * for i, item in enumerate(o): * if i >= length: * break # <<<<<<<<<<<<<< * v[i] = item * else: */ goto __pyx_L11_break; /* "carray.from_py":85 * if i == length: * for i, item in enumerate(o): * if i >= length: # <<<<<<<<<<<<<< * break * v[i] = item */ } /* "carray.from_py":87 * if i >= length: * break * v[i] = item # <<<<<<<<<<<<<< * else: * i += 1 # convert index to length */ __pyx_t_11 = __Pyx_PyInt_As_uint8_t(__pyx_v_item); if (unlikely((__pyx_t_11 == ((uint8_t)-1)) && PyErr_Occurred())) __PYX_ERR(1, 87, __pyx_L1_error) (__pyx_v_v[__pyx_v_i]) = __pyx_t_11; /* "carray.from_py":84 * pass * if i == length: * for i, item in enumerate(o): # <<<<<<<<<<<<<< * if i >= length: * break */ } /*else*/ { /* "carray.from_py":89 * v[i] = item * else: * i += 1 # convert index to length # <<<<<<<<<<<<<< * if i == length: * return 0 */ __pyx_v_i = (__pyx_v_i + 1); /* "carray.from_py":90 * else: * i += 1 # convert index to length * if i == length: # <<<<<<<<<<<<<< * return 0 * */ __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); if (__pyx_t_6) { /* "carray.from_py":91 * i += 1 # convert index to length * if i == length: * return 0 # <<<<<<<<<<<<<< * * PyErr_Format( */ __pyx_r = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L0; /* "carray.from_py":90 * else: * i += 1 # convert index to length * if i == length: # <<<<<<<<<<<<<< * return 0 * */ } } /* "carray.from_py":84 * pass * if i == length: * for i, item in enumerate(o): # <<<<<<<<<<<<<< * if i >= length: * break */ __pyx_L11_break:; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; /* "carray.from_py":83 * except (TypeError, OverflowError): * pass * if i == length: # <<<<<<<<<<<<<< * for i, item in enumerate(o): * if i >= length: */ } /* "carray.from_py":96 * IndexError, * ("too many values found during array assignment, expected %zd" * if i >= length else # <<<<<<<<<<<<<< * "not enough values found during array assignment, expected %zd, got %zd"), * length, i) */ if (((__pyx_v_i >= __pyx_v_length) != 0)) { __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd"); } else { __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd"); } /* "carray.from_py":93 * return 0 * * PyErr_Format( # <<<<<<<<<<<<<< * IndexError, * ("too many values found during array assignment, expected %zd" */ __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 93, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; /* "carray.from_py":77 * * @cname("__Pyx_carray_from_py_uint8_t") * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< * cdef Py_ssize_t i = length * try: */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_uint8_t", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF(__pyx_v_item); __Pyx_RefNannyFinishContext(); return __pyx_r; } static struct __pyx_vtabstruct_4yarl_8_quoting__Quoter __pyx_vtable_4yarl_8_quoting__Quoter; static PyObject *__pyx_tp_new_4yarl_8_quoting__Quoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_4yarl_8_quoting__Quoter *p; PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; p = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)o); p->__pyx_vtab = __pyx_vtabptr_4yarl_8_quoting__Quoter; return o; } static void __pyx_tp_dealloc_4yarl_8_quoting__Quoter(PyObject *o) { #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif (*Py_TYPE(o)->tp_free)(o); } static PyMethodDef __pyx_methods_4yarl_8_quoting__Quoter[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_8_quoting_7_Quoter_5__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_8_quoting_7_Quoter_7__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_4yarl_8_quoting__Quoter = { PyVarObject_HEAD_INIT(0, 0) "yarl._quoting._Quoter", /*tp_name*/ sizeof(struct __pyx_obj_4yarl_8_quoting__Quoter), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4yarl_8_quoting__Quoter, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ __pyx_pw_4yarl_8_quoting_7_Quoter_3__call__, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_4yarl_8_quoting__Quoter, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_4yarl_8_quoting_7_Quoter_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4yarl_8_quoting__Quoter, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_vtabstruct_4yarl_8_quoting__Unquoter __pyx_vtable_4yarl_8_quoting__Unquoter; static PyObject *__pyx_tp_new_4yarl_8_quoting__Unquoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_4yarl_8_quoting__Unquoter *p; PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; p = ((struct __pyx_obj_4yarl_8_quoting__Unquoter *)o); p->__pyx_vtab = __pyx_vtabptr_4yarl_8_quoting__Unquoter; p->_unsafe = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)Py_None); Py_INCREF(Py_None); p->_qs_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)Py_None); Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_4yarl_8_quoting__Unquoter(PyObject *o) { struct __pyx_obj_4yarl_8_quoting__Unquoter *p = (struct __pyx_obj_4yarl_8_quoting__Unquoter *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->_unsafe); Py_CLEAR(p->_quoter); Py_CLEAR(p->_qs_quoter); (*Py_TYPE(o)->tp_free)(o); } static int __pyx_tp_traverse_4yarl_8_quoting__Unquoter(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_4yarl_8_quoting__Unquoter *p = (struct __pyx_obj_4yarl_8_quoting__Unquoter *)o; if (p->_quoter) { e = (*v)(((PyObject *)p->_quoter), a); if (e) return e; } if (p->_qs_quoter) { e = (*v)(((PyObject *)p->_qs_quoter), a); if (e) return e; } return 0; } static int __pyx_tp_clear_4yarl_8_quoting__Unquoter(PyObject *o) { PyObject* tmp; struct __pyx_obj_4yarl_8_quoting__Unquoter *p = (struct __pyx_obj_4yarl_8_quoting__Unquoter *)o; tmp = ((PyObject*)p->_quoter); p->_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_qs_quoter); p->_qs_quoter = ((struct __pyx_obj_4yarl_8_quoting__Quoter *)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyMethodDef __pyx_methods_4yarl_8_quoting__Unquoter[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_8_quoting_9_Unquoter_5__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_8_quoting_9_Unquoter_7__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_4yarl_8_quoting__Unquoter = { PyVarObject_HEAD_INIT(0, 0) "yarl._quoting._Unquoter", /*tp_name*/ sizeof(struct __pyx_obj_4yarl_8_quoting__Unquoter), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4yarl_8_quoting__Unquoter, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ __pyx_pw_4yarl_8_quoting_9_Unquoter_3__call__, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_4yarl_8_quoting__Unquoter, /*tp_traverse*/ __pyx_tp_clear_4yarl_8_quoting__Unquoter, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_4yarl_8_quoting__Unquoter, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_4yarl_8_quoting_9_Unquoter_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4yarl_8_quoting__Unquoter, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__quoting(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__quoting}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_quoting", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, {&__pyx_kp_u_Argument_should_be_str, __pyx_k_Argument_should_be_str, sizeof(__pyx_k_Argument_should_be_str), 0, 1, 0, 0}, {&__pyx_kp_s_Incompatible_checksums_s_vs_0x27, __pyx_k_Incompatible_checksums_s_vs_0x27, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x27), 0, 0, 1, 0}, {&__pyx_kp_s_Incompatible_checksums_s_vs_0x8f, __pyx_k_Incompatible_checksums_s_vs_0x8f, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x8f), 0, 0, 1, 0}, {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, {&__pyx_kp_u_Only_safe_symbols_with_ORD_128_a, __pyx_k_Only_safe_symbols_with_ORD_128_a, sizeof(__pyx_k_Only_safe_symbols_with_ORD_128_a), 0, 1, 0, 0}, {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_Quoter, __pyx_k_Quoter, sizeof(__pyx_k_Quoter), 0, 0, 1, 1}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s_UnicodeDecodeError, __pyx_k_UnicodeDecodeError, sizeof(__pyx_k_UnicodeDecodeError), 0, 0, 1, 1}, {&__pyx_n_s_Unquoter, __pyx_k_Unquoter, sizeof(__pyx_k_Unquoter), 0, 0, 1, 1}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0}, {&__pyx_kp_u__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 1, 0, 0}, {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, {&__pyx_kp_u__13, __pyx_k__13, sizeof(__pyx_k__13), 0, 1, 0, 0}, {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, {&__pyx_kp_u__5, __pyx_k__5, sizeof(__pyx_k__5), 0, 1, 0, 0}, {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, {&__pyx_kp_u__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 1, 0, 0}, {&__pyx_n_s_append, __pyx_k_append, sizeof(__pyx_k_append), 0, 0, 1, 1}, {&__pyx_n_s_ascii_letters, __pyx_k_ascii_letters, sizeof(__pyx_k_ascii_letters), 0, 0, 1, 1}, {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, {&__pyx_n_s_chr, __pyx_k_chr, sizeof(__pyx_k_chr), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, {&__pyx_n_s_digits, __pyx_k_digits, sizeof(__pyx_k_digits), 0, 0, 1, 1}, {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_s_hex, __pyx_k_hex, sizeof(__pyx_k_hex), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, {&__pyx_n_s_protected, __pyx_k_protected, sizeof(__pyx_k_protected), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle__Quoter, __pyx_k_pyx_unpickle__Quoter, sizeof(__pyx_k_pyx_unpickle__Quoter), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle__Unquoter, __pyx_k_pyx_unpickle__Unquoter, sizeof(__pyx_k_pyx_unpickle__Unquoter), 0, 0, 1, 1}, {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, {&__pyx_n_s_qs, __pyx_k_qs, sizeof(__pyx_k_qs), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_n_s_safe, __pyx_k_safe, sizeof(__pyx_k_safe), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_string, __pyx_k_string, sizeof(__pyx_k_string), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_unsafe, __pyx_k_unsafe, sizeof(__pyx_k_unsafe), 0, 0, 1, 1}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1}, {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, {&__pyx_n_s_yarl__quoting, __pyx_k_yarl__quoting, sizeof(__pyx_k_yarl__quoting), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 67, __pyx_L1_error) __pyx_builtin_chr = __Pyx_GetBuiltinName(__pyx_n_s_chr); if (!__pyx_builtin_chr) __PYX_ERR(0, 68, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 207, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 226, __pyx_L1_error) __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(0, 343, __pyx_L1_error) __pyx_builtin_hex = __Pyx_GetBuiltinName(__pyx_n_s_hex); if (!__pyx_builtin_hex) __PYX_ERR(0, 371, __pyx_L1_error) __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) __PYX_ERR(1, 81, __pyx_L1_error) __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 84, __pyx_L1_error) __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 94, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "yarl/_quoting.pyx":207 * for ch in safe: * if ord(ch) > 127: * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<< * set_bit(self._safe_table, ch) * */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Only_safe_symbols_with_ORD_128_a); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 207, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "yarl/_quoting.pyx":226 * val = str(val) * else: * raise TypeError("Argument should be str") # <<<<<<<<<<<<<< * _init_writer(&writer) * try: */ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Argument_should_be_str); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 226, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); /* "yarl/_quoting.pyx":371 * if ch in self._unsafe: * ret.append('%') * h = hex(ord(ch)).upper()[2:] # <<<<<<<<<<<<<< * for ch in h: * ret.append(ch) */ __pyx_slice__8 = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice__8)) __PYX_ERR(0, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_slice__8); __Pyx_GIVEREF(__pyx_slice__8); /* "(tree fragment)":1 * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_tuple__14 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Quoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_tuple__16 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Unquoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_16 = PyInt_FromLong(16); if (unlikely(!__pyx_int_16)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_41310077 = PyInt_FromLong(41310077L); if (unlikely(!__pyx_int_41310077)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_150049702 = PyInt_FromLong(150049702L); if (unlikely(!__pyx_int_150049702)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __pyx_v_4yarl_8_quoting_GEN_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_SUB_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_RESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_UNRESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_ALLOWED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_8_quoting_QS = ((PyObject*)Py_None); Py_INCREF(Py_None); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __pyx_vtabptr_4yarl_8_quoting__Quoter = &__pyx_vtable_4yarl_8_quoting__Quoter; __pyx_vtable_4yarl_8_quoting__Quoter._do_quote = (PyObject *(*)(struct __pyx_obj_4yarl_8_quoting__Quoter *, PyObject *, struct __pyx_t_4yarl_8_quoting_Writer *))__pyx_f_4yarl_8_quoting_7_Quoter__do_quote; __pyx_vtable_4yarl_8_quoting__Quoter._write = (int (*)(struct __pyx_obj_4yarl_8_quoting__Quoter *, struct __pyx_t_4yarl_8_quoting_Writer *, Py_UCS4))__pyx_f_4yarl_8_quoting_7_Quoter__write; if (PyType_Ready(&__pyx_type_4yarl_8_quoting__Quoter) < 0) __PYX_ERR(0, 186, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_4yarl_8_quoting__Quoter.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_8_quoting__Quoter.tp_dictoffset && __pyx_type_4yarl_8_quoting__Quoter.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_4yarl_8_quoting__Quoter.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_4yarl_8_quoting__Quoter.tp_dict, __pyx_vtabptr_4yarl_8_quoting__Quoter) < 0) __PYX_ERR(0, 186, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Quoter, (PyObject *)&__pyx_type_4yarl_8_quoting__Quoter) < 0) __PYX_ERR(0, 186, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_8_quoting__Quoter) < 0) __PYX_ERR(0, 186, __pyx_L1_error) __pyx_ptype_4yarl_8_quoting__Quoter = &__pyx_type_4yarl_8_quoting__Quoter; __pyx_vtabptr_4yarl_8_quoting__Unquoter = &__pyx_vtable_4yarl_8_quoting__Unquoter; __pyx_vtable_4yarl_8_quoting__Unquoter._do_unquote = (PyObject *(*)(struct __pyx_obj_4yarl_8_quoting__Unquoter *, PyObject *))__pyx_f_4yarl_8_quoting_9_Unquoter__do_unquote; if (PyType_Ready(&__pyx_type_4yarl_8_quoting__Unquoter) < 0) __PYX_ERR(0, 301, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_4yarl_8_quoting__Unquoter.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_8_quoting__Unquoter.tp_dictoffset && __pyx_type_4yarl_8_quoting__Unquoter.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_4yarl_8_quoting__Unquoter.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_4yarl_8_quoting__Unquoter.tp_dict, __pyx_vtabptr_4yarl_8_quoting__Unquoter) < 0) __PYX_ERR(0, 301, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Unquoter, (PyObject *)&__pyx_type_4yarl_8_quoting__Unquoter) < 0) __PYX_ERR(0, 301, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_8_quoting__Unquoter) < 0) __PYX_ERR(0, 301, __pyx_L1_error) __pyx_ptype_4yarl_8_quoting__Unquoter = &__pyx_type_4yarl_8_quoting__Unquoter; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION < 3 #ifdef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC void #else #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #endif #else #ifdef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyObject * #else #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_quoting(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_quoting(void) #else __Pyx_PyMODINIT_FUNC PyInit__quoting(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__quoting(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__quoting(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; long __pyx_t_4; int __pyx_t_5; int __pyx_t_6; uint64_t __pyx_t_7; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_quoting' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__quoting(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_quoting", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_yarl___quoting) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "yarl._quoting")) { if (unlikely(PyDict_SetItemString(modules, "yarl._quoting", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) goto __pyx_L1_error; /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) goto __pyx_L1_error; /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "yarl/_quoting.pyx":10 * from cpython.unicode cimport PyUnicode_DecodeASCII * * from string import ascii_letters, digits # <<<<<<<<<<<<<< * * cdef str GEN_DELIMS = ":/?#[]@" */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_ascii_letters); __Pyx_GIVEREF(__pyx_n_s_ascii_letters); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ascii_letters); __Pyx_INCREF(__pyx_n_s_digits); __Pyx_GIVEREF(__pyx_n_s_digits); PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_digits); __pyx_t_2 = __Pyx_Import(__pyx_n_s_string, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ascii_letters); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_ascii_letters, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_digits); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_digits, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting.pyx":12 * from string import ascii_letters, digits * * cdef str GEN_DELIMS = ":/?#[]@" # <<<<<<<<<<<<<< * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' */ __Pyx_INCREF(__pyx_kp_u__9); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_GEN_DELIMS); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_GEN_DELIMS, __pyx_kp_u__9); __Pyx_GIVEREF(__pyx_kp_u__9); /* "yarl/_quoting.pyx":13 * * cdef str GEN_DELIMS = ":/?#[]@" * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," # <<<<<<<<<<<<<< * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS */ __Pyx_INCREF(__pyx_kp_u__10); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__10); __Pyx_GIVEREF(__pyx_kp_u__10); /* "yarl/_quoting.pyx":14 * cdef str GEN_DELIMS = ":/?#[]@" * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' # <<<<<<<<<<<<<< * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS * cdef str UNRESERVED = ascii_letters + digits + '-._~' */ __pyx_t_2 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_SUB_DELIMS); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_SUB_DELIMS, ((PyObject*)__pyx_t_2)); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting.pyx":15 * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS # <<<<<<<<<<<<<< * cdef str UNRESERVED = ascii_letters + digits + '-._~' * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS */ __pyx_t_2 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_8_quoting_GEN_DELIMS, __pyx_v_4yarl_8_quoting_SUB_DELIMS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_RESERVED); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_RESERVED, ((PyObject*)__pyx_t_2)); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting.pyx":16 * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS * cdef str UNRESERVED = ascii_letters + digits + '-._~' # <<<<<<<<<<<<<< * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS * cdef str QS = '+&=;' */ __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ascii_letters); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_digits); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_kp_u__12); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_UNRESERVED); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_UNRESERVED, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":17 * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS * cdef str UNRESERVED = ascii_letters + digits + '-._~' * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS # <<<<<<<<<<<<<< * cdef str QS = '+&=;' * */ __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_8_quoting_UNRESERVED, __pyx_v_4yarl_8_quoting_SUB_DELIMS_WITHOUT_QS); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_ALLOWED); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_ALLOWED, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":18 * cdef str UNRESERVED = ascii_letters + digits + '-._~' * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS * cdef str QS = '+&=;' # <<<<<<<<<<<<<< * * DEF BUF_SIZE = 8 * 1024 # 8KiB */ __Pyx_INCREF(__pyx_kp_u__13); __Pyx_XGOTREF(__pyx_v_4yarl_8_quoting_QS); __Pyx_DECREF_SET(__pyx_v_4yarl_8_quoting_QS, __pyx_kp_u__13); __Pyx_GIVEREF(__pyx_kp_u__13); /* "yarl/_quoting.pyx":64 * * * memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) # <<<<<<<<<<<<<< * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) * */ (void)(memset(__pyx_v_4yarl_8_quoting_ALLOWED_TABLE, 0, (sizeof(__pyx_v_4yarl_8_quoting_ALLOWED_TABLE)))); /* "yarl/_quoting.pyx":65 * * memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) # <<<<<<<<<<<<<< * * for i in range(128): */ (void)(memset(__pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE, 0, (sizeof(__pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE)))); /* "yarl/_quoting.pyx":67 * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) * * for i in range(128): # <<<<<<<<<<<<<< * if chr(i) in ALLOWED: * set_bit(ALLOWED_TABLE, i) */ for (__pyx_t_4 = 0; __pyx_t_4 < 0x80; __pyx_t_4+=1) { __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":68 * * for i in range(128): * if chr(i) in ALLOWED: # <<<<<<<<<<<<<< * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_chr, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v_4yarl_8_quoting_ALLOWED == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 68, __pyx_L1_error) } __pyx_t_5 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_3, __pyx_v_4yarl_8_quoting_ALLOWED, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = (__pyx_t_5 != 0); if (__pyx_t_6) { /* "yarl/_quoting.pyx":69 * for i in range(128): * if chr(i) in ALLOWED: * set_bit(ALLOWED_TABLE, i) # <<<<<<<<<<<<<< * set_bit(ALLOWED_NOTQS_TABLE, i) * if chr(i) in QS: */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_3); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 69, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_4yarl_8_quoting_ALLOWED_TABLE, __pyx_t_7); /* "yarl/_quoting.pyx":70 * if chr(i) in ALLOWED: * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) # <<<<<<<<<<<<<< * if chr(i) in QS: * set_bit(ALLOWED_NOTQS_TABLE, i) */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_3); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE, __pyx_t_7); /* "yarl/_quoting.pyx":68 * * for i in range(128): * if chr(i) in ALLOWED: # <<<<<<<<<<<<<< * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) */ } /* "yarl/_quoting.pyx":71 * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) * if chr(i) in QS: # <<<<<<<<<<<<<< * set_bit(ALLOWED_NOTQS_TABLE, i) * */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_chr, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(__pyx_v_4yarl_8_quoting_QS == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 71, __pyx_L1_error) } __pyx_t_6 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_1, __pyx_v_4yarl_8_quoting_QS, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 71, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_5 = (__pyx_t_6 != 0); if (__pyx_t_5) { /* "yarl/_quoting.pyx":72 * set_bit(ALLOWED_NOTQS_TABLE, i) * if chr(i) in QS: * set_bit(ALLOWED_NOTQS_TABLE, i) # <<<<<<<<<<<<<< * * # ----------------- writer --------------------------- */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_1); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_f_4yarl_8_quoting_set_bit(__pyx_v_4yarl_8_quoting_ALLOWED_NOTQS_TABLE, __pyx_t_7); /* "yarl/_quoting.pyx":71 * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) * if chr(i) in QS: # <<<<<<<<<<<<<< * set_bit(ALLOWED_NOTQS_TABLE, i) * */ } } /* "(tree fragment)":1 * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4yarl_8_quoting_1__pyx_unpickle__Quoter, NULL, __pyx_n_s_yarl__quoting); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__Quoter, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":11 * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._safe_table = __pyx_state[2] * if len(__pyx_state) > 3 and hasattr(__pyx_result, '__dict__'): */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4yarl_8_quoting_3__pyx_unpickle__Unquoter, NULL, __pyx_n_s_yarl__quoting); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__Unquoter, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting.pyx":1 * # cython: language_level=3 # <<<<<<<<<<<<<< * * from libc.stdint cimport uint8_t, uint64_t */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "carray.from_py":77 * * @cname("__Pyx_carray_from_py_uint8_t") * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< * cdef Py_ssize_t i = length * try: */ /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init yarl._quoting", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init yarl._quoting"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* WriteUnraisableException */ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, int full_traceback, CYTHON_UNUSED int nogil) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_PyThreadState_declare #ifdef WITH_THREAD PyGILState_STATE state; if (nogil) state = PyGILState_Ensure(); #ifdef _MSC_VER else state = (PyGILState_STATE)-1; #endif #endif __Pyx_PyThreadState_assign __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); if (full_traceback) { Py_XINCREF(old_exc); Py_XINCREF(old_val); Py_XINCREF(old_tb); __Pyx_ErrRestore(old_exc, old_val, old_tb); PyErr_PrintEx(1); } #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } #ifdef WITH_THREAD if (nogil) PyGILState_Release(state); #endif } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } else if (exact) { #if PY_MAJOR_VERSION == 2 if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(__Pyx_TypeCheck(obj, type))) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } /* unicode_iter */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { #if CYTHON_PEP393_ENABLED if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; *kind = PyUnicode_KIND(ustring); *length = PyUnicode_GET_LENGTH(ustring); *data = PyUnicode_DATA(ustring); #else *kind = 0; *length = PyUnicode_GET_SIZE(ustring); *data = (void*)PyUnicode_AS_UNICODE(ustring); #endif return 0; } /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); } } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallOneArg */ #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, &arg, 1); } #endif if (likely(PyCFunction_Check(func))) { if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_Pack(1, arg); if (unlikely(!args)) return NULL; result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = *type; exc_info->exc_value = *value; exc_info->exc_traceback = *tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = *type; tstate->exc_value = *value; tstate->exc_traceback = *tb; #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); PyErr_SetExcInfo(*type, *value, *tb); *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* ReRaiseException */ static CYTHON_INLINE void __Pyx_ReraiseException(void) { PyObject *type = NULL, *value = NULL, *tb = NULL; #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = PyThreadState_GET(); #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); type = exc_info->exc_type; value = exc_info->exc_value; tb = exc_info->exc_traceback; #else type = tstate->exc_type; value = tstate->exc_value; tb = tstate->exc_traceback; #endif #else PyErr_GetExcInfo(&type, &value, &tb); #endif if (!type || type == Py_None) { #if !CYTHON_FAST_THREAD_STATE Py_XDECREF(type); Py_XDECREF(value); Py_XDECREF(tb); #endif PyErr_SetString(PyExc_RuntimeError, "No active exception to reraise"); } else { #if CYTHON_FAST_THREAD_STATE Py_INCREF(type); Py_XINCREF(value); Py_XINCREF(tb); #endif PyErr_Restore(type, value, tb); } } /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; icurexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; if (unlikely(PyTuple_Check(err))) return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #endif /* GetAttr */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { #if CYTHON_USE_TYPE_SLOTS #if PY_MAJOR_VERSION >= 3 if (likely(PyUnicode_Check(n))) #else if (likely(PyString_Check(n))) #endif return __Pyx_PyObject_GetAttrStr(o, n); #endif return PyObject_GetAttr(o, n); } /* GetAttr3 */ static PyObject *__Pyx_GetAttr3Default(PyObject *d) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) return NULL; __Pyx_PyErr_Clear(); Py_INCREF(d); return d; } static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { PyObject *r = __Pyx_GetAttr(o, n); return (likely(r)) ? r : __Pyx_GetAttr3Default(d); } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* PyObjectCallNoArg */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, NULL, 0); } #endif #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) #else if (likely(PyCFunction_Check(func))) #endif { if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { return __Pyx_PyObject_CallMethO(func, NULL); } } return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); } #endif /* PyObjectCall2Args */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { PyObject *args, *result = NULL; #if CYTHON_FAST_PYCALL if (PyFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyFunction_FastCall(function, args, 2); } #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyCFunction_FastCall(function, args, 2); } #endif args = PyTuple_New(2); if (unlikely(!args)) goto done; Py_INCREF(arg1); PyTuple_SET_ITEM(args, 0, arg1); Py_INCREF(arg2); PyTuple_SET_ITEM(args, 1, arg2); Py_INCREF(function); result = __Pyx_PyObject_Call(function, args, NULL); Py_DECREF(args); Py_DECREF(function); done: return result; } /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (descr != NULL) { *method = descr; return 0; } PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(name)); #endif return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod1 */ static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); Py_DECREF(method); return result; } static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { PyObject *method = NULL, *result; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_Call2Args(method, obj, arg); Py_DECREF(method); return result; } if (unlikely(!method)) return NULL; return __Pyx__PyObject_CallMethod1(method, arg); } /* ByteArrayAppend */ static CYTHON_INLINE int __Pyx_PyByteArray_Append(PyObject* bytearray, int value) { PyObject *pyval, *retval; #if CYTHON_COMPILING_IN_CPYTHON if (likely(__Pyx_is_valid_index(value, 256))) { Py_ssize_t n = Py_SIZE(bytearray); if (likely(n != PY_SSIZE_T_MAX)) { if (unlikely(PyByteArray_Resize(bytearray, n + 1) < 0)) return -1; PyByteArray_AS_STRING(bytearray)[n] = value; return 0; } } else { PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); return -1; } #endif pyval = PyInt_FromLong(value); if (unlikely(!pyval)) return -1; retval = __Pyx_PyObject_CallMethod1(bytearray, __pyx_n_s_append, pyval); Py_DECREF(pyval); if (unlikely(!retval)) return -1; Py_DECREF(retval); return 0; } /* ByteArrayAppendObject */ static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyObject* value) { Py_ssize_t ival; #if PY_MAJOR_VERSION < 3 if (unlikely(PyString_Check(value))) { if (unlikely(PyString_GET_SIZE(value) != 1)) { PyErr_SetString(PyExc_ValueError, "string must be of size 1"); return -1; } ival = (unsigned char) (PyString_AS_STRING(value)[0]); } else #endif #if CYTHON_USE_PYLONG_INTERNALS if (likely(PyLong_CheckExact(value)) && likely(Py_SIZE(value) == 1 || Py_SIZE(value) == 0)) { if (Py_SIZE(value) == 0) { ival = 0; } else { ival = ((PyLongObject*)value)->ob_digit[0]; if (unlikely(ival > 255)) goto bad_range; } } else #endif { ival = __Pyx_PyIndex_AsSsize_t(value); if (unlikely(!__Pyx_is_valid_index(ival, 256))) { if (ival == -1 && PyErr_Occurred()) return -1; goto bad_range; } } return __Pyx_PyByteArray_Append(bytearray, ival); bad_range: PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); return -1; } /* PyUnicode_Substring */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop) { Py_ssize_t length; if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL; length = __Pyx_PyUnicode_GET_LENGTH(text); if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; else if (stop > length) stop = length; length = stop - start; if (length <= 0) return PyUnicode_FromUnicode(NULL, 0); #if CYTHON_PEP393_ENABLED return PyUnicode_FromKindAndData(PyUnicode_KIND(text), PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); #else return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start); #endif } /* decode_c_bytes */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { if (unlikely((start < 0) | (stop < 0))) { if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } if (stop > length) stop = length; length = stop - start; if (unlikely(length <= 0)) return PyUnicode_FromUnicode(NULL, 0); cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } /* SliceObject */ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { #if CYTHON_USE_TYPE_SLOTS PyMappingMethods* mp; #if PY_MAJOR_VERSION < 3 PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; if (likely(ms && ms->sq_ass_slice)) { if (!has_cstart) { if (_py_start && (*_py_start != Py_None)) { cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstart = 0; } if (!has_cstop) { if (_py_stop && (*_py_stop != Py_None)) { cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstop = PY_SSIZE_T_MAX; } if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { Py_ssize_t l = ms->sq_length(obj); if (likely(l >= 0)) { if (cstop < 0) { cstop += l; if (cstop < 0) cstop = 0; } if (cstart < 0) { cstart += l; if (cstart < 0) cstart = 0; } } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) goto bad; PyErr_Clear(); } } return ms->sq_ass_slice(obj, cstart, cstop, value); } #endif mp = Py_TYPE(obj)->tp_as_mapping; if (likely(mp && mp->mp_ass_subscript)) #endif { int result; PyObject *py_slice, *py_start, *py_stop; if (_py_slice) { py_slice = *_py_slice; } else { PyObject* owned_start = NULL; PyObject* owned_stop = NULL; if (_py_start) { py_start = *_py_start; } else { if (has_cstart) { owned_start = py_start = PyInt_FromSsize_t(cstart); if (unlikely(!py_start)) goto bad; } else py_start = Py_None; } if (_py_stop) { py_stop = *_py_stop; } else { if (has_cstop) { owned_stop = py_stop = PyInt_FromSsize_t(cstop); if (unlikely(!py_stop)) { Py_XDECREF(owned_start); goto bad; } } else py_stop = Py_None; } py_slice = PySlice_New(py_start, py_stop, Py_None); Py_XDECREF(owned_start); Py_XDECREF(owned_stop); if (unlikely(!py_slice)) goto bad; } #if CYTHON_USE_TYPE_SLOTS result = mp->mp_ass_subscript(obj, py_slice, value); #else result = value ? PyObject_SetItem(obj, py_slice, value) : PyObject_DelItem(obj, py_slice); #endif if (!_py_slice) { Py_DECREF(py_slice); } return result; } PyErr_Format(PyExc_TypeError, "'%.200s' object does not support slice %.10s", Py_TYPE(obj)->tp_name, value ? "assignment" : "deletion"); bad: return -1; } /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* UnicodeAsUCS4 */ static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { Py_ssize_t length; #if CYTHON_PEP393_ENABLED length = PyUnicode_GET_LENGTH(x); if (likely(length == 1)) { return PyUnicode_READ_CHAR(x, 0); } #else length = PyUnicode_GET_SIZE(x); if (likely(length == 1)) { return PyUnicode_AS_UNICODE(x)[0]; } #if Py_UNICODE_SIZE == 2 else if (PyUnicode_GET_SIZE(x) == 2) { Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; if (high_val >= 0xD800 && high_val <= 0xDBFF) { Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; if (low_val >= 0xDC00 && low_val <= 0xDFFF) { return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); } } } #endif #endif PyErr_Format(PyExc_ValueError, "only single character unicode strings can be converted to Py_UCS4, " "got length %" CYTHON_FORMAT_SSIZE_T "d", length); return (Py_UCS4)-1; } /* object_ord */ static long __Pyx__PyObject_Ord(PyObject* c) { Py_ssize_t size; if (PyBytes_Check(c)) { size = PyBytes_GET_SIZE(c); if (likely(size == 1)) { return (unsigned char) PyBytes_AS_STRING(c)[0]; } #if PY_MAJOR_VERSION < 3 } else if (PyUnicode_Check(c)) { return (long)__Pyx_PyUnicode_AsPy_UCS4(c); #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) } else if (PyByteArray_Check(c)) { size = PyByteArray_GET_SIZE(c); if (likely(size == 1)) { return (unsigned char) PyByteArray_AS_STRING(c)[0]; } #endif } else { PyErr_Format(PyExc_TypeError, "ord() expected string of length 1, but %.200s found", c->ob_type->tp_name); return (long)(Py_UCS4)-1; } PyErr_Format(PyExc_TypeError, "ord() expected a character, but string of length %zd found", size); return (long)(Py_UCS4)-1; } /* SliceObject */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { #if CYTHON_USE_TYPE_SLOTS PyMappingMethods* mp; #if PY_MAJOR_VERSION < 3 PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; if (likely(ms && ms->sq_slice)) { if (!has_cstart) { if (_py_start && (*_py_start != Py_None)) { cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstart = 0; } if (!has_cstop) { if (_py_stop && (*_py_stop != Py_None)) { cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstop = PY_SSIZE_T_MAX; } if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { Py_ssize_t l = ms->sq_length(obj); if (likely(l >= 0)) { if (cstop < 0) { cstop += l; if (cstop < 0) cstop = 0; } if (cstart < 0) { cstart += l; if (cstart < 0) cstart = 0; } } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) goto bad; PyErr_Clear(); } } return ms->sq_slice(obj, cstart, cstop); } #endif mp = Py_TYPE(obj)->tp_as_mapping; if (likely(mp && mp->mp_subscript)) #endif { PyObject* result; PyObject *py_slice, *py_start, *py_stop; if (_py_slice) { py_slice = *_py_slice; } else { PyObject* owned_start = NULL; PyObject* owned_stop = NULL; if (_py_start) { py_start = *_py_start; } else { if (has_cstart) { owned_start = py_start = PyInt_FromSsize_t(cstart); if (unlikely(!py_start)) goto bad; } else py_start = Py_None; } if (_py_stop) { py_stop = *_py_stop; } else { if (has_cstop) { owned_stop = py_stop = PyInt_FromSsize_t(cstop); if (unlikely(!py_stop)) { Py_XDECREF(owned_start); goto bad; } } else py_stop = Py_None; } py_slice = PySlice_New(py_start, py_stop, Py_None); Py_XDECREF(owned_start); Py_XDECREF(owned_stop); if (unlikely(!py_slice)) goto bad; } #if CYTHON_USE_TYPE_SLOTS result = mp->mp_subscript(obj, py_slice); #else result = PyObject_GetItem(obj, py_slice); #endif if (!_py_slice) { Py_DECREF(py_slice); } return result; } PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); bad: return NULL; } /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* HasAttr */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { PyObject *r; if (unlikely(!__Pyx_PyBaseString_Check(n))) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return -1; } r = __Pyx_GetAttr(o, n); if (unlikely(!r)) { PyErr_Clear(); return 0; } else { Py_DECREF(r); return 1; } } /* ExtTypeTest */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (likely(__Pyx_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, attr_name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(attr_name)); #endif return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* SetVTable */ static int __Pyx_SetVtable(PyObject *dict, void *vtable) { #if PY_VERSION_HEX >= 0x02070000 PyObject *ob = PyCapsule_New(vtable, 0, 0); #else PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); #endif if (!ob) goto bad; if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) goto bad; Py_DECREF(ob); return 0; bad: Py_XDECREF(ob); return -1; } /* SetupReduce */ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; #if CYTHON_USE_PYTYPE_LOOKUP if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; #else if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; #endif #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; } PyType_Modified((PyTypeObject*)type_obj); } } goto GOOD; BAD: if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); ret = -1; GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *x) { const uint8_t neg_one = (uint8_t) ((uint8_t) 0 - (uint8_t) 1), const_zero = (uint8_t) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(uint8_t) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(uint8_t, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (uint8_t) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (uint8_t) 0; case 1: __PYX_VERIFY_RETURN_INT(uint8_t, digit, digits[0]) case 2: if (8 * sizeof(uint8_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) >= 2 * PyLong_SHIFT) { return (uint8_t) (((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])); } } break; case 3: if (8 * sizeof(uint8_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) >= 3 * PyLong_SHIFT) { return (uint8_t) (((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])); } } break; case 4: if (8 * sizeof(uint8_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) >= 4 * PyLong_SHIFT) { return (uint8_t) (((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (uint8_t) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(uint8_t) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(uint8_t, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(uint8_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (uint8_t) 0; case -1: __PYX_VERIFY_RETURN_INT(uint8_t, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(uint8_t, digit, +digits[0]) case -2: if (8 * sizeof(uint8_t) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) { return (uint8_t) (((uint8_t)-1)*(((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; case 2: if (8 * sizeof(uint8_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) { return (uint8_t) ((((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; case -3: if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) { return (uint8_t) (((uint8_t)-1)*(((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; case 3: if (8 * sizeof(uint8_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) { return (uint8_t) ((((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; case -4: if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 4 * PyLong_SHIFT) { return (uint8_t) (((uint8_t)-1)*(((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; case 4: if (8 * sizeof(uint8_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint8_t) - 1 > 4 * PyLong_SHIFT) { return (uint8_t) ((((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]))); } } break; } #endif if (sizeof(uint8_t) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(uint8_t, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(uint8_t, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else uint8_t val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (uint8_t) -1; } } else { uint8_t val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (uint8_t) -1; val = __Pyx_PyInt_As_uint8_t(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to uint8_t"); return (uint8_t) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to uint8_t"); return (uint8_t) -1; } /* CIntFromPy */ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { const uint64_t neg_one = (uint64_t) ((uint64_t) 0 - (uint64_t) 1), const_zero = (uint64_t) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(uint64_t) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (uint64_t) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (uint64_t) 0; case 1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, digits[0]) case 2: if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) >= 2 * PyLong_SHIFT) { return (uint64_t) (((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])); } } break; case 3: if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) >= 3 * PyLong_SHIFT) { return (uint64_t) (((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])); } } break; case 4: if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) >= 4 * PyLong_SHIFT) { return (uint64_t) (((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (uint64_t) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(uint64_t) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(uint64_t, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(uint64_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (uint64_t) 0; case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, +digits[0]) case -2: if (8 * sizeof(uint64_t) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) { return (uint64_t) (((uint64_t)-1)*(((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; case 2: if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) { return (uint64_t) ((((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; case -3: if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) { return (uint64_t) (((uint64_t)-1)*(((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; case 3: if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) { return (uint64_t) ((((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; case -4: if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 4 * PyLong_SHIFT) { return (uint64_t) (((uint64_t)-1)*(((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; case 4: if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(uint64_t) - 1 > 4 * PyLong_SHIFT) { return (uint64_t) ((((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]))); } } break; } #endif if (sizeof(uint64_t) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(uint64_t, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(uint64_t) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(uint64_t, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else uint64_t val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (uint64_t) -1; } } else { uint64_t val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (uint64_t) -1; val = __Pyx_PyInt_As_uint64_t(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to uint64_t"); return (uint64_t) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to uint64_t"); return (uint64_t) -1; } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ yarl-1.4.2/yarl/_quoting.pyx0000644000175100001650000002666513572034522016335 0ustar vstsdocker00000000000000# cython: language_level=3 from libc.stdint cimport uint8_t, uint64_t from libc.string cimport memcpy, memset from cpython.exc cimport PyErr_NoMemory from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free from cpython.unicode cimport PyUnicode_DecodeASCII from string import ascii_letters, digits cdef str GEN_DELIMS = ":/?#[]@" cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' cdef str RESERVED = GEN_DELIMS + SUB_DELIMS cdef str UNRESERVED = ascii_letters + digits + '-._~' cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS cdef str QS = '+&=;' DEF BUF_SIZE = 8 * 1024 # 8KiB cdef char BUFFER[BUF_SIZE] cdef inline Py_UCS4 _to_hex(uint8_t v): if v < 10: return (v+0x30) # ord('0') == 0x30 else: return (v+0x41-10) # ord('A') == 0x41 cdef inline int _from_hex(Py_UCS4 v): if '0' <= v <= '9': return (v) - 0x30 # ord('0') == 0x30 elif 'A' <= v <= 'F': return (v) - 0x41 + 10 # ord('A') == 0x41 elif 'a' <= v <= 'f': return (v) - 0x61 + 10 # ord('a') == 0x61 else: return -1 cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): cdef int digit1 = _from_hex(d1) if digit1 < 0: return -1 cdef int digit2 = _from_hex(d2) if digit2 < 0: return -1 return (digit1 << 4 | digit2) cdef uint8_t ALLOWED_TABLE[16] cdef uint8_t ALLOWED_NOTQS_TABLE[16] cdef inline bint bit_at(uint8_t array[], uint64_t ch): return array[ch >> 3] & (1 << (ch & 7)) cdef inline void set_bit(uint8_t array[], uint64_t ch): array[ch >> 3] |= (1 << (ch & 7)) memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) for i in range(128): if chr(i) in ALLOWED: set_bit(ALLOWED_TABLE, i) set_bit(ALLOWED_NOTQS_TABLE, i) if chr(i) in QS: set_bit(ALLOWED_NOTQS_TABLE, i) # ----------------- writer --------------------------- cdef struct Writer: char *buf Py_ssize_t size Py_ssize_t pos bint changed cdef inline void _init_writer(Writer* writer): writer.buf = &BUFFER[0] writer.size = BUF_SIZE writer.pos = 0 writer.changed = 0 cdef inline void _release_writer(Writer* writer): if writer.buf != BUFFER: PyMem_Free(writer.buf) cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): cdef char * buf cdef Py_ssize_t size if writer.pos == writer.size: # reallocate size = writer.size + BUF_SIZE if writer.buf == BUFFER: buf = PyMem_Malloc(size) if buf == NULL: PyErr_NoMemory() return -1 memcpy(buf, writer.buf, writer.size) else: buf = PyMem_Realloc(writer.buf, size) if buf == NULL: PyErr_NoMemory() return -1 writer.buf = buf writer.size = size writer.buf[writer.pos] = ch writer.pos += 1 writer.changed |= changed return 0 cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): if _write_char(writer, '%', changed) < 0: return -1 if _write_char(writer, _to_hex(ch >> 4), changed) < 0: return -1 return _write_char(writer, _to_hex(ch & 0x0f), changed) cdef inline int _write_percent(Writer* writer): if _write_char(writer, '%', True) < 0: return -1 if _write_char(writer, '2', True) < 0: return -1 return _write_char(writer, '5', True) cdef inline int _write_pct_check(Writer* writer, Py_UCS4 ch, Py_UCS4 pct[]): cdef Py_UCS4 pct1 = _to_hex(ch >> 4) cdef Py_UCS4 pct2 = _to_hex(ch & 0x0f) cdef bint changed = pct[0] != pct1 or pct[1] != pct2 if _write_char(writer, '%', changed) < 0: return -1 if _write_char(writer, pct1, changed) < 0: return -1 return _write_char(writer, pct2, changed) cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): cdef uint64_t utf = symbol if utf < 0x80: return _write_pct(writer, utf, True) elif utf < 0x800: if _write_pct(writer, (0xc0 | (utf >> 6)), True) < 0: return -1 return _write_pct(writer, (0x80 | (utf & 0x3f)), True) elif 0xD800 <= utf <= 0xDFFF: # surogate pair, ignored return 0 elif utf < 0x10000: if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: return -1 if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), True) < 0: return -1 return _write_pct(writer, (0x80 | (utf & 0x3f)), True) elif utf > 0x10FFFF: # symbol is too large return 0 else: if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: return -1 if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), True) < 0: return -1 if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), True) < 0: return -1 return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # --------------------- end writer -------------------------- cdef class _Quoter: cdef bint _qs cdef uint8_t _safe_table[16] cdef uint8_t _protected_table[16] def __init__(self, *, str safe='', str protected='', bint qs=False): cdef Py_UCS4 ch self._qs = qs if not self._qs: memcpy(self._safe_table, ALLOWED_NOTQS_TABLE, sizeof(self._safe_table)) else: memcpy(self._safe_table, ALLOWED_TABLE, sizeof(self._safe_table)) for ch in safe: if ord(ch) > 127: raise ValueError("Only safe symbols with ORD < 128 are allowed") set_bit(self._safe_table, ch) memset(self._protected_table, 0, sizeof(self._protected_table)) for ch in protected: if ord(ch) > 127: raise ValueError("Only safe symbols with ORD < 128 are allowed") set_bit(self._safe_table, ch) set_bit(self._protected_table, ch) def __call__(self, val): cdef Writer writer if val is None: return None if type(val) is not str: if isinstance(val, str): # derived from str val = str(val) else: raise TypeError("Argument should be str") _init_writer(&writer) try: return self._do_quote(val, &writer) finally: _release_writer(&writer) cdef str _do_quote(self, str val, Writer *writer): cdef Py_UCS4 ch cdef int has_pct = 0 cdef Py_UCS4 pct[2] cdef int idx = 0 for ch in val: if has_pct: pct[has_pct-1] = ch has_pct += 1 if has_pct == 3: ch = _restore_ch(pct[0], pct[1]) has_pct = 0 if ch == -1: if _write_percent(writer) < 0: raise if self._write(writer, pct[0]) < 0: raise if self._write(writer, pct[1]) < 0: raise continue if ch < 128: if bit_at(self._protected_table, ch): if _write_pct(writer, ch, True) < 0: raise continue if bit_at(self._safe_table, ch): if _write_char(writer, ch, True) < 0: raise continue if _write_pct_check(writer, ch, pct) < 0: raise continue elif ch == '%': has_pct = 1 continue if self._write(writer, ch) < 0: raise if has_pct: if _write_percent(writer) < 0: raise if has_pct > 1: # the value is 2 if self._write(writer, ch) < 0: raise if not writer.changed: return val else: return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") cdef inline int _write(self, Writer *writer, Py_UCS4 ch): if self._qs: if ch == ' ': return _write_char(writer, '+', True) if ch < 128 and bit_at(self._safe_table, ch): return _write_char(writer, ch, False) return _write_utf8(writer, ch) cdef class _Unquoter: cdef str _unsafe cdef bint _qs cdef _Quoter _quoter cdef _Quoter _qs_quoter def __init__(self, *, unsafe='', qs=False): self._unsafe = unsafe self._qs = qs self._quoter = _Quoter() self._qs_quoter = _Quoter(qs=True) def __call__(self, val): if val is None: return None if type(val) is not str: if isinstance(val, str): # derived from str val = str(val) else: raise TypeError("Argument should be str") return self._do_unquote(val) cdef str _do_unquote(self, str val): if len(val) == 0: return val cdef str pct = '' cdef str last_pct = '' cdef bytearray pcts = bytearray() cdef list ret = [] cdef str unquoted for ch in val: if pct: pct += ch if len(pct) == 3: # pragma: no branch # peephole optimizer pcts.append(int(pct[1:], base=16)) last_pct = pct pct = '' continue if pcts: try: unquoted = pcts.decode('utf8') except UnicodeDecodeError: pass else: if self._qs and unquoted in '+=&;': ret.append(self._qs_quoter(unquoted)) elif unquoted in self._unsafe: ret.append(self._quoter(unquoted)) else: ret.append(unquoted) del pcts[:] if ch == '%': pct = ch continue if pcts: ret.append(last_pct) # %F8ab last_pct = '' if ch == '+': if not self._qs or ch in self._unsafe: ret.append('+') else: ret.append(' ') continue if ch in self._unsafe: ret.append('%') h = hex(ord(ch)).upper()[2:] for ch in h: ret.append(ch) continue ret.append(ch) if pcts: try: unquoted = pcts.decode('utf8') except UnicodeDecodeError: ret.append(last_pct) # %F8 else: if self._qs and unquoted in '+=&;': ret.append(self._qs_quoter(unquoted)) elif unquoted in self._unsafe: ret.append(self._quoter(unquoted)) else: ret.append(unquoted) return ''.join(ret) yarl-1.4.2/yarl/py.typed0000644000175100001650000000001513572034522015422 0ustar vstsdocker00000000000000# Placeholderyarl-1.4.2/yarl/quoting.py0000644000175100001650000001531013572034522015767 0ustar vstsdocker00000000000000import os import re import sys from string import ascii_letters, ascii_lowercase, digits from typing import Optional, TYPE_CHECKING, cast NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool if sys.implementation.name != "cpython": NO_EXTENSIONS = True BASCII_LOWERCASE = ascii_lowercase.encode("ascii") BPCT_ALLOWED = {"%{:02X}".format(i).encode("ascii") for i in range(256)} GEN_DELIMS = ":/?#[]@" SUB_DELIMS_WITHOUT_QS = "!$'()*," SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + "+&=;" RESERVED = GEN_DELIMS + SUB_DELIMS UNRESERVED = ascii_letters + digits + "-._~" ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS _IS_HEX = re.compile(b"[A-Z0-9][A-Z0-9]") class _Quoter: def __init__( self, *, safe: str = "", protected: str = "", qs: bool = False ) -> None: self._safe = safe self._protected = protected self._qs = qs def __call__(self, val: Optional[str]) -> Optional[str]: if val is None: return None if not isinstance(val, str): raise TypeError("Argument should be str") if not val: return "" bval = cast(str, val).encode("utf8", errors="ignore") ret = bytearray() pct = bytearray() safe = self._safe safe += ALLOWED if not self._qs: safe += "+&=;" safe += self._protected bsafe = safe.encode("ascii") idx = 0 while idx < len(bval): ch = bval[idx] idx += 1 if pct: if ch in BASCII_LOWERCASE: ch = ch - 32 # convert to uppercase pct.append(ch) if len(pct) == 3: # pragma: no branch # peephole optimizer buf = pct[1:] if not _IS_HEX.match(buf): ret.extend(b"%25") pct.clear() idx -= 2 continue try: unquoted = chr(int(pct[1:].decode("ascii"), base=16)) except ValueError: ret.extend(b"%25") pct.clear() idx -= 2 continue if unquoted in self._protected: ret.extend(pct) elif unquoted in safe: ret.append(ord(unquoted)) else: ret.extend(pct) pct.clear() # special case, if we have only one char after "%" elif len(pct) == 2 and idx == len(bval): ret.extend(b"%25") pct.clear() idx -= 1 continue elif ch == ord("%"): pct.clear() pct.append(ch) # special case if "%" is last char if idx == len(bval): ret.extend(b"%25") continue if self._qs: if ch == ord(" "): ret.append(ord("+")) continue if ch in bsafe: ret.append(ch) continue ret.extend(("%{:02X}".format(ch)).encode("ascii")) ret2 = ret.decode("ascii") if ret2 == val: return val return ret2 class _Unquoter: def __init__(self, *, unsafe: str = "", qs: bool = False) -> None: self._unsafe = unsafe self._qs = qs self._quoter = _Quoter() self._qs_quoter = _Quoter(qs=True) def __call__(self, val: Optional[str]) -> Optional[str]: if val is None: return None if not isinstance(val, str): raise TypeError("Argument should be str") if not val: return "" pct = "" last_pct = "" pcts = bytearray() ret = [] for ch in val: if pct: pct += ch if len(pct) == 3: # pragma: no branch # peephole optimizer pcts.append(int(pct[1:], base=16)) last_pct = pct pct = "" continue if pcts: try: unquoted = pcts.decode("utf8") except UnicodeDecodeError: pass else: if self._qs and unquoted in "+=&;": to_add = self._qs_quoter(unquoted) if to_add is None: # pragma: no cover raise RuntimeError("Cannot quote None") ret.append(to_add) elif unquoted in self._unsafe: to_add = self._quoter(unquoted) if to_add is None: # pragma: no cover raise RuntimeError("Cannot quote None") ret.append(to_add) else: ret.append(unquoted) del pcts[:] if ch == "%": pct = ch continue if pcts: ret.append(last_pct) # %F8ab last_pct = "" if ch == "+": if not self._qs or ch in self._unsafe: ret.append("+") else: ret.append(" ") continue if ch in self._unsafe: ret.append("%") h = hex(ord(ch)).upper()[2:] for ch in h: ret.append(ch) continue ret.append(ch) if pcts: try: unquoted = pcts.decode("utf8") except UnicodeDecodeError: ret.append(last_pct) # %F8 else: if self._qs and unquoted in "+=&;": to_add = self._qs_quoter(unquoted) if to_add is None: # pragma: no cover raise RuntimeError("Cannot quote None") ret.append(to_add) elif unquoted in self._unsafe: to_add = self._qs_quoter(unquoted) if to_add is None: # pragma: no cover raise RuntimeError("Cannot quote None") ret.append(to_add) else: ret.append(unquoted) ret2 = "".join(ret) if ret2 == val: return val return ret2 _PyQuoter = _Quoter _PyUnquoter = _Unquoter if not TYPE_CHECKING and not NO_EXTENSIONS: # pragma: no branch try: from ._quoting import _Quoter, _Unquoter except ImportError: # pragma: no cover _Quoter = _PyQuoter _Unquoter = _PyUnquoter yarl-1.4.2/yarl.egg-info/0000755000175100001650000000000013572034534015424 5ustar vstsdocker00000000000000yarl-1.4.2/yarl.egg-info/PKG-INFO0000644000175100001650000004165413572034534016533 0ustar vstsdocker00000000000000Metadata-Version: 1.2 Name: yarl Version: 1.4.2 Summary: Yet another URL library Home-page: https://github.com/aio-libs/yarl/ Author: Andrew Svetlov Author-email: andrew.svetlov@gmail.com License: Apache 2 Description: yarl ==== .. image:: https://dev.azure.com/aio-libs/yarl/_apis/build/status/CI?branchName=master :target: https://dev.azure.com/aio-libs/yarl/_build/latest?definitionId=7&branchName=master :align: right .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/yarl .. image:: https://badge.fury.io/py/yarl.svg :target: https://badge.fury.io/py/yarl .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest :target: https://yarl.readthedocs.io .. image:: https://img.shields.io/pypi/pyversions/yarl.svg :target: https://pypi.python.org/pypi/yarl .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Introduction ------------ Url is constructed from ``str``:: >>> from yarl import URL >>> url = URL('https://www.python.org/~guido?arg=1#frag') >>> url URL('https://www.python.org/~guido?arg=1#frag') All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*, *query* and *fragment* are accessible by properties:: >>> url.scheme 'https' >>> url.host 'www.python.org' >>> url.path '/~guido' >>> url.query_string 'arg=1' >>> url.query >>> url.fragment 'frag' All url manipulations produce a new url object:: >>> url.parent / 'downloads/source' URL('https://www.python.org/downloads/source') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result:: >>> url = URL('https://www.python.org/путь') >>> url URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C') Regular properties are *percent-decoded*, use ``raw_`` versions for getting *encoded* strings:: >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``:: >>> url.human_repr() 'https://www.python.org/путь' For full documentation please read https://yarl.readthedocs.org. Installation ------------ :: $ pip install yarl The library is Python 3 only! Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Comparison with other URL libraries ------------------------------------ * furl (https://pypi.python.org/pypi/furl) The library has rich functionality but the ``furl`` object is mutable. I'm afraid to pass this object into foreign code: who knows if the code will modify my url in a terrible way while I just want to send URL with handy helpers for accessing URL properties. ``furl`` has other non-obvious tricky things but the main objection is mutability. * URLObject (https://pypi.python.org/pypi/URLObject) URLObject is immutable, that's pretty good. Every URL change generates a new URL object. But the library doesn't do any decode/encode transformations leaving the end user to cope with these gory details. Source code ----------- The project is hosted on GitHub_ Please file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. The library uses `Azure Pipelines `_ for Continuous Integration. Discussion list --------------- *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs Feel free to post your questions and ideas here. Authors and License ------------------- The ``yarl`` package is written by Andrew Svetlov. It's *Apache 2* licensed and freely available. .. _GitHub: https://github.com/aio-libs/yarl .. _multidict: https://github.com/aio-libs/multidict ========= Changelog ========= .. You should *NOT* be adding new change log entries to this file, this file is managed by towncrier. You *may* edit previous change logs to fix problems like typo corrections or such. To add a new change log entry, please see https://pip.pypa.io/en/latest/development/#adding-a-news-entry we named the news folder "changes". WARNING: Don't drop the next directive! .. towncrier release notes start 1.4.1 (2019-11-29) ================== * Fix regression, make the library work on Python 3.5 and 3.6 again. 1.4.0 (2019-11-29) ================== * Distinguish an empty password in URL from a password not provided at all (#262) * Fixed annotations for optional parameters of ``URL.build`` (#309) * Use None as default value of ``user`` parameter of ``URL.build`` (#309) * Enforce building C Accelerated modules when installing from source tarball, use ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python implementation (#329) * Drop Python 3.5 support * Fix quoting of plus in path by pure python version (#339) * Don't create a new URL if fragment is unchanged (#292) * Included in error msg the path that produces starting slash forbidden error (#376) * Skip slow IDNA encoding for ASCII-only strings (#387) 1.3.0 (2018-12-11) ================== * Fix annotations for ``query`` parameter (#207) * An incoming query sequence can have int variables (the same as for Mapping type) (#208) * Add ``URL.explicit_port`` property (#218) * Give a friendlier error when port cant be converted to int (#168) * ``bool(URL())`` now returns ``False`` (#272) 1.2.6 (2018-06-14) ================== * Drop Python 3.4 trove classifier (#205) 1.2.5 (2018-05-23) ================== * Fix annotations for ``build`` (#199) 1.2.4 (2018-05-08) ================== * Fix annotations for ``cached_property`` (#195) 1.2.3 (2018-05-03) ================== * Accept ``str`` subclasses in ``URL`` constructor (#190) 1.2.2 (2018-05-01) ================== * Fix build 1.2.1 (2018-04-30) ================== * Pin minimal required Python to 3.5.3 (#189) 1.2.0 (2018-04-30) ================== * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171) * Support PEP-561 (provide type hinting marker) (#182) 1.1.1 (2018-02-17) ================== * Fix performance regression: don't encode enmpty netloc (#170) 1.1.0 (2018-01-21) ================== * Make pure Python quoter consistent with Cython version (#162) 1.0.0 (2018-01-15) ================== * Use fast path if quoted string does not need requoting (#154) * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155) * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155) * Add custom string writer, reuse static buffer if available (#157) Code is 50-80 times faster than Pure Python version (was 4-5 times faster) * Don't recode IP zone (#144) * Support ``encoded=True`` in ``yarl.URL.build()`` (#158) * Fix updating query with multiple keys (#160) 0.18.0 (2018-01-10) =================== * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152) 0.17.0 (2017-12-30) =================== * Use IDNA 2008 for domain name processing (#149) 0.16.0 (2017-12-07) =================== * Fix raising ``TypeError`` by ``url.query_string()`` after ``url.with_query({})`` (empty mapping) (#141) 0.15.0 (2017-11-23) =================== * Add ``raw_path_qs`` attribute (#137) 0.14.2 (2017-11-14) =================== * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote`` 0.14.1 (2017-11-13) =================== * Restore ``strict`` parameter as no-op for sake of compatibility with aiohttp 2.2 0.14.0 (2017-11-11) =================== * Drop strict mode (#123) * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124) 0.13.0 (2017-10-01) =================== * Document ``encoded`` parameter (#102) * Support relative urls like ``'?key=value'`` (#100) * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104) * Process passwords without user names (#95) 0.12.0 (2017-06-26) =================== * Properly support paths without leading slash in ``URL.with_path()`` (#90) * Enable type annotation checks 0.11.0 (2017-06-26) =================== * Normalize path (#86) * Clear query and fragment parts in ``.with_path()`` (#85) 0.10.3 (2017-06-13) =================== * Prevent double URL args unquoting (#83) 0.10.2 (2017-05-05) =================== * Unexpected hash behaviour (#75) 0.10.1 (2017-05-03) =================== * Unexpected compare behaviour (#73) * Do not quote or unquote + if not a query string. (#74) 0.10.0 (2017-03-14) =================== * Added ``URL.build`` class method (#58) * Added ``path_qs`` attribute (#42) 0.9.8 (2017-02-16) ================== * Do not quote ``:`` in path 0.9.7 (2017-02-16) ================== * Load from pickle without _cache (#56) * Percent-encoded pluses in path variables become spaces (#59) 0.9.6 (2017-02-15) ================== * Revert backward incompatible change (BaseURL) 0.9.5 (2017-02-14) ================== * Fix BaseURL rich comparison support 0.9.4 (2017-02-14) ================== * Use BaseURL 0.9.3 (2017-02-14) ================== * Added BaseURL 0.9.2 (2017-02-08) ================== * Remove debug print 0.9.1 (2017-02-07) ================== * Do not lose tail chars (#45) 0.9.0 (2017-02-07) ================== * Allow to quote ``%`` in non strict mode (#21) * Incorrect parsing of query parameters with %3B (;) inside (#34) * Fix core dumps (#41) * tmpbuf - compiling error (#43) * Added ``URL.update_path()`` method * Added ``URL.update_query()`` method (#47) 0.8.1 (2016-12-03) ================== * Fix broken aiohttp: revert back ``quote`` / ``unquote``. 0.8.0 (2016-12-03) ================== * Support more verbose error messages in ``.with_query()`` (#24) * Don't percent-encode ``@`` and ``:`` in path (#32) * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are part of private API 0.7.1 (2016-11-18) ================== * Accept not only ``str`` but all classes inherited from ``str`` also (#25) 0.7.0 (2016-11-07) ================== * Accept ``int`` as value for ``.with_query()`` 0.6.0 (2016-11-07) ================== * Explicitly use UTF8 encoding in setup.py (#20) * Properly unquote non-UTF8 strings (#19) 0.5.3 (2016-11-02) ================== * Don't use namedtuple fields but indexes on URL construction 0.5.2 (2016-11-02) ================== * Inline ``_encode`` class method 0.5.1 (2016-11-02) ================== * Make URL construction faster by removing extra classmethod calls 0.5.0 (2016-11-02) ================== * Add cython optimization for quoting/unquoting * Provide binary wheels 0.4.3 (2016-09-29) ================== * Fix typing stubs 0.4.2 (2016-09-29) ================== * Expose ``quote()`` and ``unquote()`` as public API 0.4.1 (2016-09-28) ================== * Support empty values in query (``'/path?arg'``) 0.4.0 (2016-09-27) ================== * Introduce ``relative()`` (#16) 0.3.2 (2016-09-27) ================== * Typo fixes #15 0.3.1 (2016-09-26) ================== * Support sequence of pairs as ``with_query()`` parameter 0.3.0 (2016-09-26) ================== * Introduce ``is_default_port()`` 0.2.1 (2016-09-26) ================== * Raise ValueError for URLs like 'http://:8080/' 0.2.0 (2016-09-18) ================== * Avoid doubling slashes when joining paths (#13) * Appending path starting from slash is forbidden (#12) 0.1.4 (2016-09-09) ================== * Add kwargs support for ``with_query()`` (#10) 0.1.3 (2016-09-07) ================== * Document ``with_query()``, ``with_fragment()`` and ``origin()`` * Allow ``None`` for ``with_query()`` and ``with_fragment()`` 0.1.2 (2016-09-07) ================== * Fix links, tune docs theme. 0.1.1 (2016-09-06) ================== * Update README, old version used obsolete API 0.1.0 (2016-09-06) ================== * The library was deeply refactored, bytes are gone away but all accepted strings are encoded if needed. 0.0.1 (2016-08-30) ================== * The first release. Platform: UNKNOWN Classifier: License :: OSI Approved :: Apache Software License Classifier: Intended Audience :: Developers Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.5 yarl-1.4.2/yarl.egg-info/SOURCES.txt0000644000175100001650000000140013572034534017303 0ustar vstsdocker00000000000000CHANGES.rst LICENSE MANIFEST.in README.rst setup.cfg setup.py docs/Makefile docs/api.rst docs/conf.py docs/index.rst docs/make.bat docs/spelling_wordlist.txt docs/yarl-icon-128x128.xcf docs/_static/yarl-icon-128x128.png docs/_templates/about.html tests/test_cached_property.py tests/test_normalize_path.py tests/test_pickle.py tests/test_quoting.py tests/test_update_query.py tests/test_url.py tests/test_url_build.py tests/test_url_cmp_and_hash.py tests/test_url_parsing.py tests/test_url_query.py tests/test_url_update_netloc.py yarl/__init__.py yarl/__init__.pyi yarl/_quoting.c yarl/_quoting.pyx yarl/py.typed yarl/quoting.py yarl.egg-info/PKG-INFO yarl.egg-info/SOURCES.txt yarl.egg-info/dependency_links.txt yarl.egg-info/requires.txt yarl.egg-info/top_level.txtyarl-1.4.2/yarl.egg-info/dependency_links.txt0000644000175100001650000000000113572034534021472 0ustar vstsdocker00000000000000 yarl-1.4.2/yarl.egg-info/requires.txt0000644000175100001650000000003113572034534020016 0ustar vstsdocker00000000000000multidict>=4.0 idna>=2.0 yarl-1.4.2/yarl.egg-info/top_level.txt0000644000175100001650000000000513572034534020151 0ustar vstsdocker00000000000000yarl