././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6827455 yarl-1.8.2/0000755000175100001720000000000000000000000013272 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/CHANGES.rst0000644000175100001720000003522200000000000015100 0ustar00runnerdocker00000000000000========= 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.8.2 (2022-12-03) ================== This is the first release that started shipping wheels for Python 3.11. 1.8.1 (2022-08-01) ================== Misc ---- - `#694 `_, `#699 `_, `#700 `_, `#701 `_, `#702 `_, `#703 `_, `#739 `_ 1.8.0 (2022-08-01) ================== Features -------- - Added ``URL.raw_suffix``, ``URL.suffix``, ``URL.raw_suffixes``, ``URL.suffixes``, ``URL.with_suffix``. (`#613 `_) Improved Documentation ---------------------- - Fixed broken internal references to :meth:`~URL.human_repr`. (`#665 `_) - Fixed broken external references to :doc:`multidict:index` docs. (`#665 `_) Deprecations and Removals ------------------------- - Dropped Python 3.6 support. (`#672 `_) Misc ---- - `#646 `_, `#699 `_, `#701 `_ 1.7.2 (2021-11-01) ================== Bugfixes -------- - Changed call in ``with_port()`` to stop reencoding parts of the URL that were already encoded. (`#623 `_) 1.7.1 (2021-10-07) ================== Bugfixes -------- - Fix 1.7.0 build error 1.7.0 (2021-10-06) ================== Features -------- - Add `__bytes__()` magic method so that `bytes(url)` will work and use optimal ASCII encoding. (`#582 `_) - Started shipping platform-specific arm64 wheels for Apple Silicon. (`#622 `_) - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. (`#622 `_) - Added support for Python 3.10. (`#622 `_) 1.6.3 (2020-11-14) ================== Bugfixes -------- - No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved. `#517 `_ - Provide x86 Windows wheels. `#535 `_ ---- 1.6.2 (2020-10-12) ================== Bugfixes -------- - Provide generated ``.c`` files in TarBall distribution. `#530 `_ 1.6.1 (2020-10-12) ================== Features -------- - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on Linux as well as ``x86_64``. `#507 `_ - Provide wheels for Python 3.9. `#526 `_ Bugfixes -------- - ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid). `#511 `_ - Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation. `#514 `_ - Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits. `#516 `_ - Fix decoding ``%`` followed by a space and hexadecimal digit. `#520 `_ - Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case. `#528 `_ Removal ------- - Drop Python 3.5 support; Python 3.6 is the minimal supported Python version. ---- 1.6.0 (2020-09-23) ================== Features -------- - Allow for int and float subclasses in query, while still denying bool. `#492 `_ Bugfixes -------- - Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator. `#502 `_ - Keep IPv6 brackets in ``origin()``. `#504 `_ ---- 1.5.1 (2020-08-01) ================== Bugfixes -------- - Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists. `#485 `_ Misc ---- - `#484 `_ ---- 1.5.0 (2020-07-26) ================== Features -------- - Convert host to lowercase on URL building. `#386 `_ - Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method). `#435 `_ - Allow use of sequences such as ``list`` and ``tuple`` in the values of a mapping such as ``dict`` to represent that a key has many values:: url = URL("http://example.com") assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2") `#443 `_ - Support URL.build() with scheme and path (creates a relative URL). `#464 `_ - Cache slow IDNA encode/decode calls. `#476 `_ - Add ``@final`` / ``Final`` type hints `#477 `_ - Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method. `#478 `_ - Hide the library implementation details, make the exposed public list very clean. `#483 `_ Bugfixes -------- - Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+). `#409 `_ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way. `#426 `_ - Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore. `#431 `_ - Keep ipv6 brackets after updating port/user/password. `#451 `_ ---- 1.4.2 (2019-12-05) ================== Features -------- - Workaround for missing `str.isascii()` in Python 3.6 `#389 `_ ---- 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 can't 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 empty 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/LICENSE0000644000175100001720000000114100000000000014274 0ustar00runnerdocker00000000000000 Copyright 2016-2021, 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/MANIFEST.in0000644000175100001720000000034100000000000015026 0ustar00runnerdocker00000000000000include LICENSE include CHANGES.rst include README.rst graft yarl graft docs graft tests include yarl/*.c global-exclude *.pyc global-exclude *.cache exclude yarl/*.html exclude yarl/*.so exclude yarl/*.pyd prune docs/_build ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6827455 yarl-1.8.2/PKG-INFO0000644000175100001720000005124000000000000014371 0ustar00runnerdocker00000000000000Metadata-Version: 2.1 Name: yarl Version: 1.8.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 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.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.7 Description-Content-Type: text/x-rst License-File: LICENSE yarl ==== .. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI :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``: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url = URL('https://www.python.org') >>> url / 'foo' / 'bar' URL('https://www.python.org/foo/bar') >>> url / 'foo' % {'bar': 'baz'} URL('https://www.python.org/foo?bar=baz') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``: .. code-block:: pycon >>> 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! PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install ``yarl`` on another operating system (like *Alpine Linux*, which is not manylinux-compliant because of the missing glibc and therefore, cannot be used with our wheels) the the tarball will be used to compile the library from the source code. It requires a C compiler and and Python headers installed. To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS` environment variable to a non-empty value, e.g.: .. code-block:: bash $ YARL_NO_EXTENSIONS=1 pip install yarl Please note that the pure-Python (uncompiled) version is much slower. However, PyPy always uses a pure-Python implementation, and, as such, it is unaffected by this variable. Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Why isn't boolean supported by the URL query API? ------------------------------------------------- There is no standard for boolean representation of boolean values. Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``, ``Y``/``N``, ``1``/``0``, etc. ``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because it is specific to how the end-user's application is built and would be different for different apps. The library doesn't accept booleans in the API; a user should convert bools into strings using own preferred translation protocol. 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.8.2 (2022-12-03) ================== This is the first release that started shipping wheels for Python 3.11. 1.8.1 (2022-08-01) ================== Misc ---- - `#694 `_, `#699 `_, `#700 `_, `#701 `_, `#702 `_, `#703 `_, `#739 `_ 1.8.0 (2022-08-01) ================== Features -------- - Added ``URL.raw_suffix``, ``URL.suffix``, ``URL.raw_suffixes``, ``URL.suffixes``, ``URL.with_suffix``. (`#613 `_) Improved Documentation ---------------------- - Fixed broken internal references to ``(?P=rendered_text)``. (`#665 `_) - Fixed broken external references to ``(?P=rendered_text)`` docs. (`#665 `_) Deprecations and Removals ------------------------- - Dropped Python 3.6 support. (`#672 `_) Misc ---- - `#646 `_, `#699 `_, `#701 `_ 1.7.2 (2021-11-01) ================== Bugfixes -------- - Changed call in ``with_port()`` to stop reencoding parts of the URL that were already encoded. (`#623 `_) 1.7.1 (2021-10-07) ================== Bugfixes -------- - Fix 1.7.0 build error 1.7.0 (2021-10-06) ================== Features -------- - Add `__bytes__()` magic method so that `bytes(url)` will work and use optimal ASCII encoding. (`#582 `_) - Started shipping platform-specific arm64 wheels for Apple Silicon. (`#622 `_) - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. (`#622 `_) - Added support for Python 3.10. (`#622 `_) 1.6.3 (2020-11-14) ================== Bugfixes -------- - No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved. `#517 `_ - Provide x86 Windows wheels. `#535 `_ ---- 1.6.2 (2020-10-12) ================== Bugfixes -------- - Provide generated ``.c`` files in TarBall distribution. `#530 `_ 1.6.1 (2020-10-12) ================== Features -------- - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on Linux as well as ``x86_64``. `#507 `_ - Provide wheels for Python 3.9. `#526 `_ Bugfixes -------- - ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid). `#511 `_ - Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation. `#514 `_ - Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits. `#516 `_ - Fix decoding ``%`` followed by a space and hexadecimal digit. `#520 `_ - Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case. `#528 `_ Removal ------- - Drop Python 3.5 support; Python 3.6 is the minimal supported Python version. ---- 1.6.0 (2020-09-23) ================== Features -------- - Allow for int and float subclasses in query, while still denying bool. `#492 `_ Bugfixes -------- - Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator. `#502 `_ - Keep IPv6 brackets in ``origin()``. `#504 `_ ---- 1.5.1 (2020-08-01) ================== Bugfixes -------- - Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists. `#485 `_ Misc ---- - `#484 `_ ---- 1.5.0 (2020-07-26) ================== Features -------- - Convert host to lowercase on URL building. `#386 `_ - Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method). `#435 `_ - Allow use of sequences such as ``list`` and ``tuple`` in the values of a mapping such as ``dict`` to represent that a key has many values:: url = URL("http://example.com") assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2") `#443 `_ - Support URL.build() with scheme and path (creates a relative URL). `#464 `_ - Cache slow IDNA encode/decode calls. `#476 `_ - Add ``@final`` / ``Final`` type hints `#477 `_ - Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method. `#478 `_ - Hide the library implementation details, make the exposed public list very clean. `#483 `_ Bugfixes -------- - Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+). `#409 `_ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way. `#426 `_ - Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore. `#431 `_ - Keep ipv6 brackets after updating port/user/password. `#451 `_ ---- 1.4.2 (2019-12-05) ================== Features -------- - Workaround for missing `str.isascii()` in Python 3.6 `#389 `_ ---- 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 can't 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 empty 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/README.rst0000644000175100001720000001240000000000000014756 0ustar00runnerdocker00000000000000yarl ==== .. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI :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``: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url = URL('https://www.python.org') >>> url / 'foo' / 'bar' URL('https://www.python.org/foo/bar') >>> url / 'foo' % {'bar': 'baz'} URL('https://www.python.org/foo?bar=baz') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``: .. code-block:: pycon >>> 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! PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install ``yarl`` on another operating system (like *Alpine Linux*, which is not manylinux-compliant because of the missing glibc and therefore, cannot be used with our wheels) the the tarball will be used to compile the library from the source code. It requires a C compiler and and Python headers installed. To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS` environment variable to a non-empty value, e.g.: .. code-block:: bash $ YARL_NO_EXTENSIONS=1 pip install yarl Please note that the pure-Python (uncompiled) version is much slower. However, PyPy always uses a pure-Python implementation, and, as such, it is unaffected by this variable. Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Why isn't boolean supported by the URL query API? ------------------------------------------------- There is no standard for boolean representation of boolean values. Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``, ``Y``/``N``, ``1``/``0``, etc. ``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because it is specific to how the end-user's application is built and would be different for different apps. The library doesn't accept booleans in the API; a user should convert bools into strings using own preferred translation protocol. 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6787455 yarl-1.8.2/docs/0000755000175100001720000000000000000000000014222 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/Makefile0000644000175100001720000001703300000000000015666 0ustar00runnerdocker00000000000000# 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." ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6787455 yarl-1.8.2/docs/_static/0000755000175100001720000000000000000000000015650 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/_static/yarl-icon-128x128.png0000644000175100001720000004271600000000000021220 0ustar00runnerdocker00000000000000PNG  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`././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/api.rst0000644000175100001720000006640500000000000015540 0ustar00runnerdocker00000000000000.. _yarl-api: Public API ========== .. module:: yarl .. currentmodule:: yarl The only public *yarl* class is :class:`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.authority Decoded *authority* part of URL, a combination of *user*, *password*, *host*, and *port*. ``authority = [ user [ ":" password ] "@" ] host [ ":" port ]``. *authority* is empty string if all parts are missing. .. doctest:: >>> URL('http://john:pass@example.com:8000').authority 'john:pass@example.com:8000' .. versionadded:: 1.5 .. attribute:: URL.raw_authority Encoded *authority* part of URL, a combination of *user*, *password*, *host*, and *port*. empty string if all parts are missing. .. doctest:: >>> URL('http://john:pass@хост.домен:8000').raw_authority 'john:pass@xn--n1agdj.xn--d1acufc:8000' .. versionadded:: 1.5 .. 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.suffix The file extension of :attr:`name`. .. doctest:: >>> URL('http://example.com/path/to.txt').suffix '.txt' >>> URL('http://example.com/путь.сюда').suffix '.сюда' >>> URL('http://example.com/path').suffix '' .. attribute:: URL.raw_suffix The file extension of :attr:`raw_name`. .. doctest:: >>> URL('http://example.com/путь.сюда').raw_suffix '.%D1%81%D1%8E%D0%B4%D0%B0' .. attribute:: URL.suffixes A list of :attr:`name`'s file extensions. .. doctest:: >>> URL('http://example.com/path/to.tar.gz').suffixes ('.tar', '.gz') >>> URL('http://example.com/путь.тут.да').suffixes ('.тут', '.да') >>> URL('http://example.com/path').suffixes () .. attribute:: URL.raw_suffixes A list of :attr:`raw_name`'s file extensions. .. doctest:: >>> URL('http://example.com/путь.тут.да').raw_suffixes ('.%D1%82%D1%83%D1%82', '.%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 :class:`URL` instance. .. method:: URL.build(*, scheme=..., authority=..., user=..., password=..., \ host=..., port=..., path=..., query=..., \ query_string=..., fragment=..., encoded=False) :classmethod: 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:: Only one of ``query`` or ``query_string`` should be passed then ValueError 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. .. note:: The library accepts :class:`str`, :class:`float`, :class:`int` and their subclasses except :class:`bool` as query argument values. If a mapping such as :class:`dict` is used, the values may also be :class:`list` or :class:`tuple` to represent a key has many values. Please see :ref:`yarl-bools-support` for the reason why :class:`bool` is not supported out-of-the-box. .. 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({'c': [1, 2]}) URL('http://example.com/path?c=1&c=2') >>> 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') .. versionchanged:: 1.5 Support :class:`list` and :class:`tuple` as a query parameter value. .. versionchanged:: 1.6 Support subclasses of :class:`int` (except :class:`bool`) and :class:`float` as a query parameter value. .. 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 :class:`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. Mod operator (``%``) can be used as alternative to the direct call of :meth:`URL.update_query`. .. note:: The library accepts :class:`str`, :class:`float`, :class:`int` and their subclasses except :class:`bool` as query argument values. If a mapping such as :class:`dict` is used, the values may also be :class:`list` or :class:`tuple` to represent a key has many values. Please see :ref:`yarl-bools-support` for the reason why :class:`bool` is not supported out-of-the-box. .. 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({'c': [1, 2]}) URL('http://example.com/path?a=b&c=1&c=2') >>> 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') >>> URL('http://example.com/path?a=b') % {'c': 'd'} URL('http://example.com/path?a=b&c=d') .. versionchanged:: 1.0 All multiple key/value pairs are applied to the multi-dictionary. .. versionadded:: 1.5 Support for mod operator (``%``) to update the URL's query part. .. versionchanged:: 1.5 Support :class:`list` and :class:`tuple` as a query parameter value. .. versionchanged:: 1.6 Support subclasses of :class:`int` (except :class:`bool`) and :class:`float` as a query parameter value. .. method:: URL.with_fragment(fragment) 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') .. method:: URL.with_suffix(suffix) Return a new URL with *suffix* (file extension of *name*) replaced and cleaned up *query* and *fragment* parts. Name is encoded if needed. .. doctest:: >>> URL('http://example.com/path/to?arg#frag').with_suffix('.doc') URL('http://example.com/path/to.doc') >>> URL('http://example.com/path/to').with_suffix('.cуффикс') URL('http://example.com/path/to.c%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81') .. 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:: URL.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 Cache control ------------- IDNA conversion used for host encoding is quite expensive operation, that's why the ``yarl`` library caches IDNA encoding/decoding calls by storing last ``256`` encodes and last ``256`` decodes in the global LRU cache. .. function:: cache_clear() Clear IDNA caches. .. function:: cache_info() Return a dictionary with ``"idna_encode"`` and ``"idna_decode"`` keys, each value points to corresponding ``CacheInfo`` structure (see :func:`functools.lru_cache` for details): .. doctest:: :options: +SKIP >>> yarl.cache_info() {'idna_encode': CacheInfo(hits=5, misses=5, maxsize=256, currsize=5), 'idna_decode': CacheInfo(hits=24, misses=15, maxsize=256, currsize=15)} .. function:: cache_configure(*, idna_encode_size=256, idna_decode_size=256) Set IDNA encode and decode cache sizes (``256`` for each by default). Pass ``None`` to make the corresponding cache unbounded (may speed up the IDNA encoding/decoding operation a little but the memory footprint can be very high, please use with caution). 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/conf.py0000644000175100001720000002623400000000000015530 0ustar00runnerdocker00000000000000#!/usr/bin/env python3 # # 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": ("https://docs.python.org/3", None), "multidict": ("https://multidict.readthedocs.io/en/stable", 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 = "en" # 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 default_role = "any" nitpicky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/index.rst0000644000175100001720000001214100000000000016062 0ustar00runnerdocker00000000000000.. 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') A URL object can be modified with ``/`` and ``%`` operators: .. doctest:: >>> url = URL('https://www.python.org') >>> url / 'foo' / 'bar' URL('https://www.python.org/foo/bar') >>> url / 'foo' % {'bar': 'baz'} URL('https://www.python.org/foo?bar=baz') 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! PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install ``yarl`` on another operating system (like *Alpine Linux*, which is not manylinux-compliant because of the missing glibc and therefore, cannot be used with our wheels) the the tarball will be used to compile the library from the source code. It requires a C compiler and and Python headers installed. To skip the compilation you must explicitly opt-in by setting the ``YARL_NO_EXTENSIONS`` environment variable to a non-empty value, e.g.: :: $ YARL_NO_EXTENSIONS=1 pip install yarl Please note that the pure-Python (uncompiled) version is much slower. However, PyPy always uses a pure-Python implementation, and, as such, it is unaffected by this variable. 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. .. _yarl-bools-support: Why isn't boolean supported by the URL query API? ------------------------------------------------- There is no standard for boolean representation of boolean values. Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``, ``Y``/``N``, ``1``/``0``, etc. ``yarl`` cannot make an unambiguous decision on how to serialize :class:`bool` values because it is specific to how the end-user's application is built and would be different for different apps. The library doesn't accept booleans in the API; a user should convert bools into strings using own preferred translation protocol. 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 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/make.bat0000644000175100001720000001706000000000000015633 0ustar00runnerdocker00000000000000@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 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/spelling_wordlist.txt0000644000175100001720000000016400000000000020530 0ustar00runnerdocker00000000000000IPv boolean booleans bools de facto glibc google mailto manylinux multi subclass subclasses svetlov uncompiled yarl ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/docs/yarl-icon-128x128.xcf0000644000175100001720000011401400000000000017555 0ustar00runnerdocker00000000000000gimp 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=40", "wheel"] [tool.towncrier] package = "yarl" filename = "CHANGES.rst" directory = "CHANGES/" title_format = "{version} ({project_date})" issue_format = "`#{issue} `_" [tool.cibuildwheel] test-requires = "-r requirements/ci.txt" test-command = "pytest {project}/tests" # don't build PyPy wheels, install from source instead skip = "pp*" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6827455 yarl-1.8.2/setup.cfg0000644000175100001720000000076100000000000015117 0ustar00runnerdocker00000000000000[metadata] license_file = LICENSE [tool:pytest] addopts = --cov=yarl -v filterwarnings = error norecursedirs = dist docs build .tox .eggs venv virtualenv .git minversion = 3.8.2 testpaths = tests/ junit_suite_name = yarl_test_suite [pep8] max-line-length = 79 [flake8] ignore = E203,E301,E302,E704,W503,W504,F811 max-line-length = 88 [isort] profile = black [mypy] [mypy-idna] ignore_missing_imports = true [mypy-pytest] ignore_missing_imports = true [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/setup.py0000644000175100001720000000510500000000000015005 0ustar00runnerdocker00000000000000import os import pathlib import re import sys from setuptools import Extension, setup NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool if sys.implementation.name != "cpython": NO_EXTENSIONS = True extensions = [Extension("yarl._quoting_c", ["yarl/_quoting_c.c"])] # extra_compile_args=["-g"], # extra_link_args=["-g"], here = pathlib.Path(__file__).parent fname = here / "yarl" / "__init__.py" with fname.open(encoding="utf8") as fp: try: version = re.findall(r'^__version__ = "([^"]+)"$', fp.read(), re.M)[0] except IndexError: raise RuntimeError("Unable to determine version.") install_requires = [ "multidict>=4.0", "idna>=2.0", 'typing-extensions>=3.7.4;python_version<"3.8"', ] def read(name): fname = here / name with fname.open(encoding="utf8") as f: return f.read() # $ echo ':something:`test `' | sed 's/:\w\+:`\(\w\+\)\(\s\+\(.*\)\)\?`/``\1``/g' # ``test`` def sanitize_rst_roles(rst_source_text: str) -> str: """Replace RST roles with inline highlighting.""" role_regex = r":\w+:`(?P[^`]+)(\s+(.*))?`" substitution_pattern = r"``(?P=rendered_text)``" return re.sub(role_regex, substitution_pattern, rst_source_text) args = dict( name="yarl", version=version, description=("Yet another URL library"), long_description="\n\n".join( [read("README.rst"), sanitize_rst_roles(read("CHANGES.rst"))] ), long_description_content_type="text/x-rst", classifiers=[ "License :: OSI Approved :: Apache Software License", "Intended Audience :: Developers", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "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.7", include_package_data=True, exclude_package_data={"": ["*.c"]}, ) if not NO_EXTENSIONS: print("**********************") print("* Accelerated build *") print("**********************") setup(ext_modules=extensions, **args) else: print("*********************") print("* Pure Python build *") print("*********************") setup(**args) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6787455 yarl-1.8.2/tests/0000755000175100001720000000000000000000000014434 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_cache.py0000644000175100001720000000114700000000000017113 0ustar00runnerdocker00000000000000import yarl # Don't check the actual behavior but make sure that calls are allowed def teardown_module(): yarl.cache_configure() def test_cache_clear() -> None: yarl.cache_clear() def test_cache_info() -> None: info = yarl.cache_info() assert info.keys() == {"idna_encode", "idna_decode"} def test_cache_configure_default() -> None: yarl.cache_configure() def test_cache_configure_None() -> None: yarl.cache_configure(idna_encode_size=None, idna_decode_size=None) def test_cache_configure_explicit() -> None: yarl.cache_configure(idna_encode_size=128, idna_decode_size=128) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_cached_property.py0000644000175100001720000000141700000000000021223 0ustar00runnerdocker00000000000000import pytest from yarl._url 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 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_normalize_path.py0000644000175100001720000000145600000000000021067 0ustar00runnerdocker00000000000000import 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 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_pickle.py0000644000175100001720000000066400000000000017322 0ustar00runnerdocker00000000000000import 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" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_quoting.py0000644000175100001720000002711200000000000017536 0ustar00runnerdocker00000000000000import pytest from yarl._quoting import NO_EXTENSIONS from yarl._quoting_py import _Quoter as _PyQuoter from yarl._quoting_py import _Unquoter as _PyUnquoter if not NO_EXTENSIONS: from yarl._quoting_c import _Quoter as _CQuoter from yarl._quoting_c import _Unquoter as _CUnquoter @pytest.fixture(params=[_PyQuoter, _CQuoter], ids=["py_quoter", "c_quoter"]) def quoter(request): return request.param @pytest.fixture(params=[_PyUnquoter, _CUnquoter], ids=["py_unquoter", "c_unquoter"]) def unquoter(request): return request.param else: @pytest.fixture(params=[_PyQuoter], ids=["py_quoter"]) def quoter(request): return request.param @pytest.fixture(params=[_PyUnquoter], ids=["py_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_digit_non_strict(quoter): assert quoter()("%2") == "%252" def test_quote_unfinished_tail_safe_non_strict(quoter): assert quoter()("%x") == "%25x" def test_quote_unfinished_tail_unsafe_non_strict(quoter): assert quoter()("%#") == "%25%23" def test_quote_unfinished_tail_non_ascii_non_strict(quoter): assert quoter()("%ß") == "%25%C3%9F" def test_quote_unfinished_tail_non_ascii2_non_strict(quoter): assert quoter()("%€") == "%25%E2%82%AC" def test_quote_unfinished_tail_non_ascii3_non_strict(quoter): assert quoter()("%🐍") == "%25%F0%9F%90%8D" 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 result = quoter(requote=False)("%25") assert "%2525" == 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 # Expected value should be the same as given. # See https://url.spec.whatwg.org/#percent-encoded-bytes @pytest.mark.parametrize( ("input", "expected"), [ ("%", "%"), ("%2", "%2"), ("%x", "%x"), ("%€", "%€"), ("%2x", "%2x"), ("%2 ", "%2 "), ("% 2", "% 2"), ("%xa", "%xa"), ("%%", "%%"), ("%%3f", "%?"), ("%2%", "%2%"), ("%2%3f", "%2?"), ("%x%3f", "%x?"), ("%€%3f", "%€?"), ], ) def test_unquoting_bad_percent_escapes(unquoter, input, expected): assert unquoter()(input) == expected @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" @pytest.mark.parametrize( ("input", "expected"), [ ("%e2%82", "%e2%82"), ("%e2%82ac", "%e2%82ac"), ("%e2%82%f8", "%e2%82%f8"), ("%e2%82%2b", "%e2%82+"), ("%e2%82%e2%82%ac", "%e2%82€"), ("%e2%82%e2%82", "%e2%82%e2%82"), ], ) def test_unquote_non_utf8(unquoter, input, expected): assert unquoter()(input) == expected def test_unquote_unsafe_non_utf8(unquoter): assert unquoter(unsafe="\n")("%e2%82%0a") == "%e2%82%0A" def test_unquote_plus_non_utf8(unquoter): assert unquoter(qs=True)("%e2%82%2b") == "%e2%82%2B" def test_quote_non_ascii(quoter): assert quoter()("%F8") == "%F8" def test_quote_non_ascii2(quoter): assert quoter()("a%F8b") == "a%F8b" def test_quote_percent_percent_encoded(quoter): assert quoter()("%%3f") == "%25%3F" def test_quote_percent_digit_percent_encoded(quoter): assert quoter()("%2%3f") == "%252%3F" def test_quote_percent_safe_percent_encoded(quoter): assert quoter()("%x%3f") == "%25x%3F" def test_quote_percent_unsafe_percent_encoded(quoter): assert quoter()("%#%3f") == "%25%23%3F" def test_quote_percent_non_ascii_percent_encoded(quoter): assert quoter()("%ß%3f") == "%25%C3%9F%3F" def test_quote_percent_non_ascii2_percent_encoded(quoter): assert quoter()("%€%3f") == "%25%E2%82%AC%3F" def test_quote_percent_non_ascii3_percent_encoded(quoter): assert quoter()("%🐍%3f") == "%25%F0%9F%90%8D%3F" 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_quote_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(quoter): s1 = "/path/to" s2 = quoter(safe="/")(s1) assert s1 is s2 def test_quote_fastpath_pct(quoter): 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) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_update_query.py0000644000175100001720000002502100000000000020554 0ustar00runnerdocker00000000000000import enum import 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" @pytest.mark.parametrize( ("query", "expected"), [ pytest.param({"a": []}, "", id="empty list"), pytest.param({"a": ()}, "", id="empty tuple"), pytest.param({"a": [1]}, "/?a=1", id="single list"), pytest.param({"a": (1,)}, "/?a=1", id="single tuple"), pytest.param({"a": [1, 2]}, "/?a=1&a=2", id="list"), pytest.param({"a": (1, 2)}, "/?a=1&a=2", id="tuple"), pytest.param({"a[]": [1, 2]}, "/?a%5B%5D=1&a%5B%5D=2", id="key with braces"), pytest.param({"&": [1, 2]}, "/?%26=1&%26=2", id="quote key"), pytest.param({"a": ["1", 2]}, "/?a=1&a=2", id="mixed types"), pytest.param({"&": ["=", 2]}, "/?%26=%3D&%26=2", id="quote key and value"), pytest.param({"a": 1, "b": [2, 3]}, "/?a=1&b=2&b=3", id="single then list"), pytest.param({"a": [1, 2], "b": 3}, "/?a=1&a=2&b=3", id="list then single"), pytest.param({"a": ["1&a=2", 3]}, "/?a=1%26a%3D2&a=3", id="ampersand then int"), pytest.param({"a": [1, "2&a=3"]}, "/?a=1&a=2%26a%3D3", id="int then ampersand"), ], ) def test_with_query_sequence(query, expected): url = URL("http://example.com") expected = "http://example.com{expected}".format_map(locals()) assert str(url.with_query(query)) == expected @pytest.mark.parametrize( "query", [ pytest.param({"a": [[1]]}, id="nested"), pytest.param([("a", [1, 2])], id="tuple list"), ], ) def test_with_query_sequence_invalid_use(query): url = URL("http://example.com") with pytest.raises(TypeError, match="Invalid variable type"): url.with_query(query) class _CStr(str): pass class _EmptyStrEr: def __str__(self): return "" class _CInt(int, _EmptyStrEr): pass class _CFloat(float, _EmptyStrEr): pass @pytest.mark.parametrize( ("value", "expected"), [ pytest.param("1", "1", id="str"), pytest.param(_CStr("1"), "1", id="custom str"), pytest.param(1, "1", id="int"), pytest.param(_CInt(1), "1", id="custom int"), pytest.param(1.1, "1.1", id="float"), pytest.param(_CFloat(1.1), "1.1", id="custom float"), ], ) def test_with_query_valid_type(value, expected): url = URL("http://example.com") expected = "http://example.com/?a={expected}".format_map(locals()) assert str(url.with_query({"a": value})) == expected @pytest.mark.parametrize( ("value", "exc_type"), [ pytest.param(True, TypeError, id="bool"), pytest.param(None, TypeError, id="none"), pytest.param(float("inf"), ValueError, id="non-finite float"), pytest.param(float("nan"), ValueError, id="NaN float"), ], ) def test_with_query_invalid_type(value, exc_type): url = URL("http://example.com") with pytest.raises(exc_type): url.with_query({"a": value}) @pytest.mark.parametrize( ("value", "expected"), [ pytest.param("1", "1", id="str"), pytest.param(_CStr("1"), "1", id="custom str"), pytest.param(1, "1", id="int"), pytest.param(_CInt(1), "1", id="custom int"), pytest.param(1.1, "1.1", id="float"), pytest.param(_CFloat(1.1), "1.1", id="custom float"), ], ) def test_with_query_list_valid_type(value, expected): url = URL("http://example.com") expected = "http://example.com/?a={expected}".format_map(locals()) assert str(url.with_query([("a", value)])) == expected @pytest.mark.parametrize( ("value"), [pytest.param(True, id="bool"), pytest.param(None, id="none")] ) def test_with_query_list_invalid_type(value): url = URL("http://example.com") with pytest.raises(TypeError): url.with_query([("a", value)]) def test_with_int_enum(): class IntEnum(int, enum.Enum): A = 1 url = URL("http://example.com/path") url2 = url.with_query(a=IntEnum.A) assert str(url2) == "http://example.com/path?a=1" def test_with_float_enum(): class FloatEnum(float, enum.Enum): A = 1.1 url = URL("http://example.com/path") url2 = url.with_query(a=FloatEnum.A) assert str(url2) == "http://example.com/path?a=1.1" 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")) @pytest.mark.parametrize( ("query", "expected"), [ pytest.param([("key", "1;2;3")], "?key=1%3B2%3B3", id="tuple list semicolon"), pytest.param({"key": "1;2;3"}, "?key=1%3B2%3B3", id="mapping semicolon"), pytest.param([("key", "1&a=2")], "?key=1%26a%3D2", id="tuple list ampersand"), pytest.param({"key": "1&a=2"}, "?key=1%26a%3D2", id="mapping ampersand"), pytest.param([("&", "=")], "?%26=%3D", id="tuple list quote key"), pytest.param({"&": "="}, "?%26=%3D", id="mapping quote key"), pytest.param( [("a[]", "3")], "?a%5B%5D=3", id="quote one key braces", ), pytest.param( [("a[]", "3"), ("a[]", "4")], "?a%5B%5D=3&a%5B%5D=4", id="quote many key braces", ), ], ) def test_with_query_params(query, expected): url = URL("http://example.com/get") url2 = url.with_query(query) assert str(url2) == ("http://example.com/get" + expected) def test_with_query_only(): url = URL() url2 = url.with_query(key="value") assert str(url2) == "?key=value" def test_with_query_complex_url(): target_url = "http://example.com/?game=bulls+%26+cows" url = URL("/redir").with_query({"t": target_url}) assert url.query["t"] == target_url 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" # mod operator def test_update_query_with_mod_operator(): url = URL("http://example.com/") assert str(url % {"a": "1"}) == "http://example.com/?a=1" assert str(url % [("a", "1")]) == "http://example.com/?a=1" assert str(url % "a=1&b=2") == "http://example.com/?a=1&b=2" assert str(url % {"a": "1"} % {"b": "2"}) == "http://example.com/?a=1&b=2" assert str(url % {"a": "1"} % {"a": "3", "b": "2"}) == "http://example.com/?a=3&b=2" assert str(url / "foo" % {"a": "1"}) == "http://example.com/foo?a=1" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url.py0000644000175100001720000012015100000000000016647 0ustar00runnerdocker00000000000000from urllib.parse import SplitResult import pytest from yarl import URL def test_inheritance(): with pytest.raises(TypeError) as ctx: class MyURL(URL): # type: ignore[misc] pass assert ( "Inheriting 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_nonascii(): url = URL("http://user:password@историк.рф:8888/path/to?a=1&b=2") assert str(url.origin()) == "http://xn--h1aagokeh.xn--p1ai:8888" def test_origin_ipv6(): url = URL("http://user:password@[::1]:8888/path/to?a=1&b=2") assert str(url.origin()) == "http://[::1]:8888" 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_authority_full() -> None: url = URL("http://user:passwd@host.com:8080/path") assert url.raw_authority == "user:passwd@host.com:8080" assert url.authority == "user:passwd@host.com:8080" def test_authority_short() -> None: url = URL("http://host.com/path") assert url.raw_authority == "host.com" def test_authority_full_nonasci() -> None: url = URL("http://ваня:пароль@айдеко.рф:8080/path") assert url.raw_authority == ( "%D0%B2%D0%B0%D0%BD%D1%8F:%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C@" "xn--80aidohy.xn--p1ai:8080" ) assert url.authority == "ваня:пароль@айдеко.рф:8080" 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_suffix_for_empty_url(): url = URL() assert "" == url.raw_suffix def test_raw_suffix(): url = URL("http://example.com/path/to.txt#frag") assert ".txt" == url.raw_suffix def test_raw_suffix_root(): url = URL("http://example.com/#frag") assert "" == url.raw_suffix def test_raw_suffix_root2(): url = URL("http://example.com") assert "" == url.raw_suffix def test_raw_suffix_root3(): url = URL("http://example.com/") assert "" == url.raw_suffix def test_relative_raw_suffix(): url = URL("path/to") assert "" == url.raw_suffix def test_relative_raw_suffix_starting_from_slash(): url = URL("/path/to") assert "" == url.raw_suffix def test_relative_raw_suffix_dot(): url = URL(".") assert "" == url.raw_suffix def test_suffix_non_ascii(): url = URL("http://example.com/путь.суффикс") assert url.suffix == ".суффикс" def test_suffix_with_empty_name(): url = URL("http://example.com/.hgrc") assert "" == url.raw_suffix def test_suffix_multi_dot(): url = URL("http://example.com/doc.tar.gz") assert ".gz" == url.raw_suffix def test_suffix_with_dot_name(): url = URL("http://example.com/doc.") assert "" == url.raw_suffix def test_suffixes_for_empty_url(): url = URL() assert () == url.raw_suffixes def test_raw_suffixes(): url = URL("http://example.com/path/to.txt#frag") assert (".txt",) == url.raw_suffixes def test_raw_suffixes_root(): url = URL("http://example.com/#frag") assert () == url.raw_suffixes def test_raw_suffixes_root2(): url = URL("http://example.com") assert () == url.raw_suffixes def test_raw_suffixes_root3(): url = URL("http://example.com/") assert () == url.raw_suffixes def test_relative_raw_suffixes(): url = URL("path/to") assert () == url.raw_suffixes def test_relative_raw_suffixes_starting_from_slash(): url = URL("/path/to") assert () == url.raw_suffixes def test_relative_raw_suffixes_dot(): url = URL(".") assert () == url.raw_suffixes def test_suffixes_non_ascii(): url = URL("http://example.com/путь.суффикс") assert url.suffixes == (".суффикс",) def test_suffixes_with_empty_name(): url = URL("http://example.com/.hgrc") assert () == url.raw_suffixes def test_suffixes_multi_dot(): url = URL("http://example.com/doc.tar.gz") assert (".tar", ".gz") == url.raw_suffixes def test_suffixes_with_dot_name(): url = URL("http://example.com/doc.") assert () == url.raw_suffixes 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) def test_percent_encoded_in_qs(): url = URL("http://example.com") url2 = url.with_query({"k%cf%80": "v%cf%80"}) assert str(url2) == "http://example.com/?k%25cf%2580=v%25cf%2580" assert url2.raw_query_string == "k%25cf%2580=v%25cf%2580" assert url2.query_string == "k%cf%80=v%cf%80" assert url2.query == {"k%cf%80": "v%cf%80"} # 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/сюда") url2 = url / "туда" assert url2.path == "/сюда/туда" assert url2.raw_path == "/%D1%81%D1%8E%D0%B4%D0%B0/%D1%82%D1%83%D0%B4%D0%B0" assert url2.parts == ("/", "сюда", "туда") assert url2.raw_parts == ( "/", "%D1%81%D1%8E%D0%B4%D0%B0", "%D1%82%D1%83%D0%B4%D0%B0", ) def test_div_percent_encoded(): url = URL("http://example.com/path") url2 = url / "%cf%80" assert url2.path == "/path/%cf%80" assert url2.raw_path == "/path/%25cf%2580" assert url2.parts == ("/", "path", "%cf%80") assert url2.raw_parts == ("/", "path", "%25cf%2580") 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") url2 = url.with_path("/test") assert str(url2) == "http://example.com/test" assert url2.raw_path == "/test" assert url2.path == "/test" def test_with_path_nonascii(): url = URL("http://example.com") url2 = url.with_path("/π") assert str(url2) == "http://example.com/%CF%80" assert url2.raw_path == "/%CF%80" assert url2.path == "/π" def test_with_path_percent_encoded(): url = URL("http://example.com") url2 = url.with_path("/%cf%80") assert str(url2) == "http://example.com/%25cf%2580" assert url2.raw_path == "/%25cf%2580" assert url2.path == "/%cf%80" def test_with_path_encoded(): url = URL("http://example.com") url2 = url.with_path("/test", encoded=True) assert str(url2) == "http://example.com/test" assert url2.raw_path == "/test" assert url2.path == "/test" def test_with_path_encoded_nonascii(): url = URL("http://example.com") url2 = url.with_path("/π", encoded=True) assert str(url2) == "http://example.com/π" assert url2.raw_path == "/π" assert url2.path == "/π" def test_with_path_encoded_percent_encoded(): url = URL("http://example.com") url2 = url.with_path("/%cf%80", encoded=True) assert str(url2) == "http://example.com/%cf%80" assert url2.raw_path == "/%cf%80" assert url2.path == "/π" 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") url2 = url.with_fragment("frag") assert str(url2) == "http://example.com/#frag" assert url2.raw_fragment == "frag" assert url2.fragment == "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_percent_encoded(): url = URL("http://example.com") url2 = url.with_fragment("%cf%80") assert str(url2) == "http://example.com/#%25cf%2580" assert url2.raw_fragment == "%25cf%2580" assert url2.fragment == "%cf%80" 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") assert url2.parts == ("/", "a", "c") assert url2.raw_path == "/a/c" assert url2.path == "/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_percent_encoded(): url = URL("http://example.com/path") url2 = url.with_name("%cf%80") assert url2.raw_parts == ("/", "%25cf%2580") assert url2.parts == ("/", "%cf%80") assert url2.raw_path == "/%25cf%2580" assert url2.path == "/%cf%80" 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("..") # with_suffix def test_with_suffix(): url = URL("http://example.com/a/b") assert url.raw_parts == ("/", "a", "b") url2 = url.with_suffix(".c") assert url2.raw_parts == ("/", "a", "b.c") assert url2.parts == ("/", "a", "b.c") assert url2.raw_path == "/a/b.c" assert url2.path == "/a/b.c" def test_with_suffix_for_naked_path(): url = URL("http://example.com") with pytest.raises(ValueError) as excinfo: url.with_suffix(".a") (msg,) = excinfo.value.args assert msg == f"{url!r} has an empty name" def test_with_suffix_for_relative_path(): url = URL("a") url2 = url.with_suffix(".b") assert url2.raw_parts == ("a.b",) def test_with_suffix_for_relative_path2(): url = URL("a/b") url2 = url.with_suffix(".c") assert url2.raw_parts == ("a", "b.c") def test_with_suffix_for_relative_path_starting_from_slash(): url = URL("/a") url2 = url.with_suffix(".b") assert url2.raw_parts == ("/", "a.b") def test_with_suffix_for_relative_path_starting_from_slash2(): url = URL("/a/b") url2 = url.with_suffix(".c") assert url2.raw_parts == ("/", "a", "b.c") def test_with_suffix_empty(): url = URL("http://example.com/path/to").with_suffix("") assert str(url) == "http://example.com/path/to" def test_with_suffix_non_ascii(): url = URL("http://example.com/path").with_suffix(".путь") assert url.path == "/path.путь" assert url.raw_path == "/path.%D0%BF%D1%83%D1%82%D1%8C" assert url.parts == ("/", "path.путь") assert url.raw_parts == ("/", "path.%D0%BF%D1%83%D1%82%D1%8C") def test_with_suffix_percent_encoded(): url = URL("http://example.com/path") url2 = url.with_suffix(".%cf%80") assert url2.raw_parts == ("/", "path.%25cf%2580") assert url2.parts == ("/", "path.%cf%80") assert url2.raw_path == "/path.%25cf%2580" assert url2.path == "/path.%cf%80" def test_with_suffix_without_dot(): with pytest.raises(ValueError) as excinfo: URL("http://example.com/a").with_suffix("b") (msg,) = excinfo.value.args assert msg == "Invalid suffix 'b'" def test_with_suffix_non_str(): with pytest.raises(TypeError) as excinfo: URL("http://example.com").with_suffix(123) (msg,) = excinfo.value.args assert msg == "Invalid suffix type" def test_with_suffix_dot(): with pytest.raises(ValueError) as excinfo: URL("http://example.com").with_suffix(".") (msg,) = excinfo.value.args assert msg == "Invalid suffix '.'" def test_with_suffix_with_slash(): with pytest.raises(ValueError) as excinfo: URL("http://example.com/a").with_suffix("/.b") (msg,) = excinfo.value.args assert msg == "Invalid suffix '/.b'" def test_with_suffix_with_slash2(): with pytest.raises(ValueError) as excinfo: URL("http://example.com/a").with_suffix(".b/.d") (msg,) = excinfo.value.args assert msg == "Slash in name is not allowed" def test_with_suffix_replace(): url = URL("/a.b") url2 = url.with_suffix(".c") assert url2.raw_parts == ("/", "a.c") # 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_bytes(): url = URL("http://example.com/путь/туда") assert ( b"http://example.com/%D0%BF%D1%83%D1%82%D1%8C/%D1%82%D1%83%D0%B4%D0%B0" == bytes(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.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 URL(s) == url 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 URL(s) == url assert s == "http://вася:пароль@хост.домен/путь/сюда?арг=вал#фраг" def test_human_repr_ipv6(): url = URL("http://[::1]:8080/path") s = url.human_repr() url2 = URL(s) assert url2 == url assert url2.host == "::1" assert s == "http://[::1]:8080/path" def test_human_repr_delimiters(): url = URL.build( scheme="http", user=" !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", password=" !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", host="хост.домен", port=8080, path="/ !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", query={ " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~": " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" }, fragment=" !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", ) s = url.human_repr() assert URL(s) == url assert ( s == "http:// !\"%23$%25&'()*+,-.%2F%3A;<=>%3F%40[\\]^_`{|}~" ": !\"%23$%25&'()*+,-.%2F%3A;<=>%3F%40[\\]^_`{|}~" "@хост.домен:8080" "/ !\"%23$%25&'()*+,-./:;<=>%3F@[\\]^_`{|}~" "? !\"%23$%25%26'()*%2B,-./:%3B<%3D>?@[\\]^_`{|}~" "= !\"%23$%25%26'()*%2B,-./:%3B<%3D>?@[\\]^_`{|}~" "# !\"#$%25&'()*+,-./:;<=>?@[\\]^_`{|}~" ) def test_human_repr_non_printable(): url = URL.build( scheme="http", user="вася\n\xad\u200b", password="пароль\n\xad\u200b", host="хост.домен", port=8080, path="/путь\n\xad\u200b", query={"арг\n\xad\u200b": "вал\n\xad\u200b"}, fragment="фраг\n\xad\u200b", ) s = url.human_repr() assert URL(s) == url assert ( s == "http://вася%0A%C2%AD%E2%80%8B:пароль%0A%C2%AD%E2%80%8B" "@хост.домен:8080" "/путь%0A%C2%AD%E2%80%8B" "?арг%0A%C2%AD%E2%80%8B=вал%0A%C2%AD%E2%80%8B" "#фраг%0A%C2%AD%E2%80%8B" ) # 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/" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url_build.py0000644000175100001720000001636600000000000020042 0ustar00runnerdocker00000000000000import 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(): u = URL.build(scheme="blob", path="path") assert str(u) == "blob:path" 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_build_with_authority_and_host(): with pytest.raises(ValueError): URL.build(authority="host.com", host="example.com") def test_build_with_authority(): url = URL.build(scheme="http", authority="ваня:bar@host.com:8000", path="path") assert str(url) == "http://%D0%B2%D0%B0%D0%BD%D1%8F:bar@host.com:8000/path" def test_build_with_authority_without_encoding(): url = URL.build( scheme="http", authority="foo:bar@host.com:8000", path="path", encoded=True ) assert str(url) == "http://foo:bar@host.com:8000/path" 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_percent_encoded(): u = URL.build( scheme="http", host="%2d.org", user="u%2d", password="p%2d", path="/%2d", query_string="k%2d=v%2d", fragment="f%2d", ) assert str(u) == "http://u%252d:p%252d@%2d.org/%252d?k%252d=v%252d#f%252d" assert u.raw_host == "%2d.org" assert u.host == "%2d.org" assert u.raw_user == "u%252d" assert u.user == "u%2d" assert u.raw_password == "p%252d" assert u.password == "p%2d" assert u.raw_authority == "u%252d:p%252d@%2d.org" assert u.authority == "u%2d:p%2d@%2d.org:80" assert u.raw_path == "/%252d" assert u.path == "/%2d" assert u.query == {"k%2d": "v%2d"} assert u.raw_query_string == "k%252d=v%252d" assert u.query_string == "k%2d=v%2d" assert u.raw_fragment == "f%252d" assert u.fragment == "f%2d" def test_build_with_authority_percent_encoded(): u = URL.build(scheme="http", authority="u%2d:p%2d@%2d.org") assert str(u) == "http://u%252d:p%252d@%2d.org" assert u.raw_host == "%2d.org" assert u.host == "%2d.org" assert u.raw_user == "u%252d" assert u.user == "u%2d" assert u.raw_password == "p%252d" assert u.password == "p%2d" assert u.raw_authority == "u%252d:p%252d@%2d.org" assert u.authority == "u%2d:p%2d@%2d.org:80" def test_build_with_authority_percent_encoded_already_encoded(): u = URL.build(scheme="http", authority="u%2d:p%2d@%2d.org", encoded=True) assert str(u) == "http://u%2d:p%2d@%2d.org" assert u.raw_host == "%2d.org" assert u.host == "%2d.org" assert u.user == "u-" assert u.raw_user == "u%2d" assert u.password == "p-" assert u.raw_password == "p%2d" assert u.authority == "u-:p-@%2d.org:80" assert u.raw_authority == "u%2d:p%2d@%2d.org" 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) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url_cmp_and_hash.py0000644000175100001720000000315300000000000021335 0ustar00runnerdocker00000000000000from 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 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url_parsing.py0000644000175100001720000004145300000000000020401 0ustar00runnerdocker00000000000000import 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") # See: https://bugs.python.org/issue27657 if ( sys.version_info[:3] == (3, 7, 6) or sys.version_info[:3] == (3, 8, 1) or sys.version_info >= (3, 9, 0) ): assert u.scheme == "google.com" assert u.host is None assert u.path == "80" else: 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") 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 == "" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url_query.py0000644000175100001720000000265000000000000020077 0ustar00runnerdocker00000000000000from 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" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/tests/test_url_update_netloc.py0000644000175100001720000001417000000000000021560 0ustar00runnerdocker00000000000000import 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 == "вася" assert url2.raw_authority == "%D0%B2%D0%B0%D1%81%D1%8F@example.com" assert url2.authority == "вася@example.com:80" def test_with_user_percent_encoded(): url = URL("http://example.com") url2 = url.with_user("%cf%80") assert url2.raw_user == "%25cf%2580" assert url2.user == "%cf%80" assert url2.raw_authority == "%25cf%2580@example.com" assert url2.authority == "%cf%80@example.com:80" 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_ipv6(): url = URL("http://john:pass@[::1]:8080/") assert str(url.with_user(None)) == "http://[::1]:8080/" 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_ipv6(): url = URL("http://john:pass@[::1]:8080/") assert str(url.with_password(None)) == "http://john@[::1]:8080/" 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 == "пароль" assert url2.raw_authority == "john:%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C@example.com" assert url2.authority == "john:пароль@example.com:80" def test_with_password_percent_encoded(): url = URL("http://john@example.com") url2 = url.with_password("%cf%80") assert url2.raw_password == "%25cf%2580" assert url2.password == "%cf%80" assert url2.raw_authority == "john:%25cf%2580@example.com" assert url2.authority == "john:%cf%80@example.com:80" 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 == "историк.рф" assert url2.raw_authority == "xn--h1aagokeh.xn--p1ai:123" assert url2.authority == "историк.рф:123" def test_with_host_percent_encoded(): url = URL("http://%25cf%2580%cf%80:%25cf%2580%cf%80@example.com:123") url2 = url.with_host("%cf%80.org") assert url2.raw_host == "%cf%80.org" assert url2.host == "%cf%80.org" assert url2.raw_authority == "%25cf%2580%CF%80:%25cf%2580%CF%80@%cf%80.org:123" assert url2.authority == "%cf%80π:%cf%80π@%cf%80.org:123" 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_ipv6(): url = URL("http://[::1]:8080/") assert str(url.with_port(80)) == "http://[::1]:80/" 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_percent_encoded(): url = URL("http://user%name:pass%word@example.com/") assert str(url.with_port(808)) == "http://user%25name:pass%25word@example.com:808/" 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") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6827455 yarl-1.8.2/yarl/0000755000175100001720000000000000000000000014241 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/__init__.py0000644000175100001720000000023200000000000016347 0ustar00runnerdocker00000000000000from ._url import URL, cache_clear, cache_configure, cache_info __version__ = "1.8.2" __all__ = ("URL", "cache_clear", "cache_configure", "cache_info") ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/__init__.pyi0000644000175100001720000000745300000000000016534 0ustar00runnerdocker00000000000000import sys from functools import _CacheInfo from typing import Any, Mapping, Optional, Sequence, Tuple, Type, Union, overload import multidict if sys.version_info >= (3, 8): from typing import Final, TypedDict, final else: from typing_extensions import Final, TypedDict, final _SimpleQuery = Union[str, int, float] _QueryVariable = Union[_SimpleQuery, Sequence[_SimpleQuery]] _Query = Union[ None, str, Mapping[str, _QueryVariable], Sequence[Tuple[str, _QueryVariable]] ] @final class URL: scheme: Final[str] raw_user: Final[str] user: Final[Optional[str]] raw_password: Final[Optional[str]] password: Final[Optional[str]] raw_host: Final[Optional[str]] host: Final[Optional[str]] port: Final[Optional[int]] raw_authority: Final[str] authority: Final[str] raw_path: Final[str] path: Final[str] raw_query_string: Final[str] query_string: Final[str] path_qs: Final[str] raw_path_qs: Final[str] raw_fragment: Final[str] fragment: Final[str] query: Final[multidict.MultiDict[str]] raw_name: Final[str] name: Final[str] raw_suffix: Final[str] suffix: Final[str] raw_suffixes: Final[Tuple[str, ...]] suffixes: Final[Tuple[str, ...]] raw_parts: Final[Tuple[str, ...]] parts: Final[Tuple[str, ...]] parent: Final[URL] def __init__( self, val: Union[str, "URL"] = ..., *, encoded: bool = ... ) -> None: ... @classmethod def build( cls, *, scheme: str = ..., authority: 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 __mod__(self, query: _Query) -> 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 with_suffix(self, suffix: str) -> URL: ... def join(self, url: URL) -> URL: ... def human_repr(self) -> str: ... # private API @classmethod def _normalize_path(cls, path: str) -> str: ... @final 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: ... class CacheInfo(TypedDict): idna_encode: _CacheInfo idna_decode: _CacheInfo def cache_clear() -> None: ... def cache_info() -> CacheInfo: ... def cache_configure( *, idna_encode_size: Optional[int] = ..., idna_decode_size: Optional[int] = ... ) -> None: ... ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/_quoting.py0000644000175100001720000000100700000000000016436 0ustar00runnerdocker00000000000000import os import sys __all__ = ("_Quoter", "_Unquoter") NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool if sys.implementation.name != "cpython": NO_EXTENSIONS = True if not NO_EXTENSIONS: # pragma: no branch try: from ._quoting_c import _Quoter, _Unquoter # type: ignore[misc] except ImportError: # pragma: no cover from ._quoting_py import _Quoter, _Unquoter # type: ignore[misc] else: from ._quoting_py import _Quoter, _Unquoter # type: ignore[misc] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl/_quoting_c.c0000644000175100001720000161771700000000000016560 0ustar00runnerdocker00000000000000/* Generated by Cython 0.29.32 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* 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_32" #define CYTHON_HEX_VERSION 0x001D20F0 #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 #define CYTHON_COMPILING_IN_NOGIL 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 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) #endif #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_NOGIL 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 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PY_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #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 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #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 #define CYTHON_COMPILING_IN_NOGIL 0 #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 || PY_VERSION_HEX >= 0x030B00A2 #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 #if PY_VERSION_HEX >= 0x030B00A4 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #elif !defined(CYTHON_FAST_THREAD_STATE) #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) #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 #if PY_VERSION_HEX >= 0x030B00A4 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #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" #define __Pyx_DefaultClassType PyType_Type #if PY_VERSION_HEX >= 0x030B00A1 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; const char *fn_cstr=NULL; const char *name_cstr=NULL; PyCodeObject* co=NULL; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); if (!(kwds=PyDict_New())) goto end; if (!(argcount=PyLong_FromLong(a))) goto end; if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; if (!(posonlyargcount=PyLong_FromLong(0))) goto end; if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; if (!(nlocals=PyLong_FromLong(l))) goto end; if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; if (!(stacksize=PyLong_FromLong(s))) goto end; if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; if (!(flags=PyLong_FromLong(f))) goto end; if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; Py_XDECREF((PyObject*)co); co = (PyCodeObject*)call_result; call_result = NULL; if (0) { cleanup_code_too: Py_XDECREF((PyObject*)co); co = NULL; } end: Py_XDECREF(kwds); Py_XDECREF(argcount); Py_XDECREF(posonlyargcount); Py_XDECREF(kwonlyargcount); Py_XDECREF(nlocals); Py_XDECREF(stacksize); Py_XDECREF(replace); Py_XDECREF(call_result); Py_XDECREF(empty); if (type) { PyErr_Restore(type, value, traceback); } return co; } #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 #if defined(PyUnicode_IS_READY) #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #else #define __Pyx_PyUnicode_READY(op) (0) #endif #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) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #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 #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #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 PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #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 __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(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(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #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_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) 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_c #define __PYX_HAVE_API__yarl___quoting_c /* 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); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #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_c.pyx", "stringsource", "type.pxd", }; /*--- Type declarations ---*/ struct __pyx_obj_4yarl_10_quoting_c__Quoter; struct __pyx_obj_4yarl_10_quoting_c__Unquoter; struct __pyx_t_4yarl_10_quoting_c_Writer; /* "yarl/_quoting_c.pyx":79 * # ----------------- writer --------------------------- * * cdef struct Writer: # <<<<<<<<<<<<<< * char *buf * Py_ssize_t size */ struct __pyx_t_4yarl_10_quoting_c_Writer { char *buf; Py_ssize_t size; Py_ssize_t pos; int changed; }; /* "yarl/_quoting_c.pyx":169 * * * cdef class _Quoter: # <<<<<<<<<<<<<< * cdef bint _qs * cdef bint _requote */ struct __pyx_obj_4yarl_10_quoting_c__Quoter { PyObject_HEAD struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter *__pyx_vtab; int _qs; int _requote; uint8_t _safe_table[16]; uint8_t _protected_table[16]; }; /* "yarl/_quoting_c.pyx":271 * * * cdef class _Unquoter: # <<<<<<<<<<<<<< * cdef str _unsafe * cdef bint _qs */ struct __pyx_obj_4yarl_10_quoting_c__Unquoter { PyObject_HEAD struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter *__pyx_vtab; PyObject *_unsafe; int _qs; struct __pyx_obj_4yarl_10_quoting_c__Quoter *_quoter; struct __pyx_obj_4yarl_10_quoting_c__Quoter *_qs_quoter; }; /* "yarl/_quoting_c.pyx":169 * * * cdef class _Quoter: # <<<<<<<<<<<<<< * cdef bint _qs * cdef bint _requote */ struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter { PyObject *(*_do_quote)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *, struct __pyx_t_4yarl_10_quoting_c_Writer *); int (*_write)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4); }; static struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter *__pyx_vtabptr_4yarl_10_quoting_c__Quoter; static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4); /* "yarl/_quoting_c.pyx":271 * * * cdef class _Unquoter: # <<<<<<<<<<<<<< * cdef str _unsafe * cdef bint _qs */ struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter { PyObject *(*_do_unquote)(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *); }; static struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter *__pyx_vtabptr_4yarl_10_quoting_c__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 #if CYTHON_FAST_PYCALL static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #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 // CYTHON_FAST_PYCALL #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 /* GetItemIntUnicode.proto */ #define __Pyx_GetItemInt_Unicode(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Unicode_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "string index out of range"), (Py_UCS4)-1)) static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i, int wraparound, int boundscheck); /* 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 /* 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); __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); } #else #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #endif /* PyUnicode_Substring.proto */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop); /* 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)); } /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* 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); /* PySequenceContains.proto */ static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { int result = PySequence_Contains(seq, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* 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); /* IncludeStringH.proto */ #include /* 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); /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* 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); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* PyUCS4InUnicode.proto */ static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character); /* UnicodeAsUCS4.proto */ static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); /* 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 *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* ObjectAsUCS4.proto */ #define __Pyx_PyObject_AsPy_UCS4(x)\ (likely(PyUnicode_Check(x)) ? __Pyx_PyUnicode_AsPy_UCS4(x) : __Pyx__PyObject_AsPy_UCS4(x)) static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(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_10_quoting_c_7_Quoter__do_quote(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer); /* proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch); /* proto*/ static PyObject *__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto*/ /* 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 'libc.stdint' */ /* Module declarations from 'yarl._quoting_c' */ static PyTypeObject *__pyx_ptype_4yarl_10_quoting_c__Quoter = 0; static PyTypeObject *__pyx_ptype_4yarl_10_quoting_c__Unquoter = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_GEN_DELIMS = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_SUB_DELIMS = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_RESERVED = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_UNRESERVED = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_ALLOWED = 0; static PyObject *__pyx_v_4yarl_10_quoting_c_QS = 0; static char __pyx_v_4yarl_10_quoting_c_BUFFER[0x2000]; static uint8_t __pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE[16]; static uint8_t __pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE[16]; static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__to_hex(uint8_t); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__from_hex(Py_UCS4); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__is_lower_hex(Py_UCS4); /*proto*/ static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__restore_ch(Py_UCS4, Py_UCS4); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_bit_at(uint8_t *, uint64_t); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c_set_bit(uint8_t *, uint64_t); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__init_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *); /*proto*/ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__release_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_char(struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4, int); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_pct(struct __pyx_t_4yarl_10_quoting_c_Writer *, uint8_t, int); /*proto*/ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_utf8(struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4); /*proto*/ static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *); /*proto*/ static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *); /*proto*/ static int __Pyx_carray_from_py_uint8_t(PyObject *, uint8_t *, Py_ssize_t); /*proto*/ #define __Pyx_MODULE_NAME "yarl._quoting_c" extern int __pyx_module_is_main_yarl___quoting_c; int __pyx_module_is_main_yarl___quoting_c = 0; /* Implementation of 'yarl._quoting_c' */ 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_qs[] = "qs"; static const char __pyx_k__11[] = ":/?#[]@"; static const char __pyx_k__12[] = "!$'()*,"; static const char __pyx_k__13[] = "+?=;"; static const char __pyx_k__14[] = "-._~"; static const char __pyx_k__15[] = "+&=;"; 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_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_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_requote[] = "requote"; 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_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_yarl__quoting_c[] = "yarl._quoting_c"; 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_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))"; static const char __pyx_k_Only_safe_symbols_with_ORD_128_a[] = "Only safe symbols with ORD < 128 are allowed"; static const char __pyx_k_Incompatible_checksums_0x_x_vs_0_2[] = "Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_qs, _qs_quoter, _quoter, _unsafe))"; static PyObject *__pyx_kp_u_; static PyObject *__pyx_kp_u_Argument_should_be_str; static PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; static PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2; 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__11; static PyObject *__pyx_kp_u__12; static PyObject *__pyx_kp_u__13; static PyObject *__pyx_kp_u__14; static PyObject *__pyx_kp_u__15; 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_n_s_ascii_letters; 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_requote; 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_c; static int __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs, int __pyx_v_requote); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static int __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_unsafe, PyObject *__pyx_v_qs); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_4yarl_10_quoting_c___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_10_quoting_c_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_10_quoting_c__Quoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Unquoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_2; static PyObject *__pyx_int_41310077; static PyObject *__pyx_int_81650385; static PyObject *__pyx_int_87395286; static PyObject *__pyx_int_101395286; static PyObject *__pyx_int_132655457; static PyObject *__pyx_int_244432181; static PyObject *__pyx_slice__8; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; static PyObject *__pyx_tuple__9; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__16; static PyObject *__pyx_tuple__18; static PyObject *__pyx_codeobj__17; static PyObject *__pyx_codeobj__19; /* Late includes */ /* "yarl/_quoting_c.pyx":23 * cdef char BUFFER[BUF_SIZE] * * 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_10_quoting_c__to_hex(uint8_t __pyx_v_v) { Py_UCS4 __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_to_hex", 0); /* "yarl/_quoting_c.pyx":24 * * 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_c.pyx":25 * 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_c.pyx":24 * * cdef inline Py_UCS4 _to_hex(uint8_t v): * if v < 10: # <<<<<<<<<<<<<< * return (v+0x30) # ord('0') == 0x30 * else: */ } /* "yarl/_quoting_c.pyx":27 * 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_c.pyx":23 * cdef char BUFFER[BUF_SIZE] * * 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_c.pyx":30 * * * 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_10_quoting_c__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_c.pyx":31 * * 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_c.pyx":32 * 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_c.pyx":31 * * cdef inline int _from_hex(Py_UCS4 v): * if '0' <= v <= '9': # <<<<<<<<<<<<<< * return (v) - 0x30 # ord('0') == 0x30 * elif 'A' <= v <= 'F': */ } /* "yarl/_quoting_c.pyx":33 * 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_c.pyx":34 * 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_c.pyx":33 * 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_c.pyx":35 * 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_c.pyx":36 * 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_c.pyx":35 * 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_c.pyx":38 * return (v) - 0x61 + 10 # ord('a') == 0x61 * else: * return -1 # <<<<<<<<<<<<<< * * */ /*else*/ { __pyx_r = -1; goto __pyx_L0; } /* "yarl/_quoting_c.pyx":30 * * * 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_c.pyx":41 * * * cdef inline int _is_lower_hex(Py_UCS4 v): # <<<<<<<<<<<<<< * return 'a' <= v <= 'f' * */ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__is_lower_hex(Py_UCS4 __pyx_v_v) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_is_lower_hex", 0); /* "yarl/_quoting_c.pyx":42 * * cdef inline int _is_lower_hex(Py_UCS4 v): * return 'a' <= v <= 'f' # <<<<<<<<<<<<<< * * */ __pyx_t_1 = (97 <= __pyx_v_v); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_v <= 0x66); } __pyx_r = __pyx_t_1; goto __pyx_L0; /* "yarl/_quoting_c.pyx":41 * * * cdef inline int _is_lower_hex(Py_UCS4 v): # <<<<<<<<<<<<<< * return 'a' <= v <= 'f' * */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting_c.pyx":45 * * * 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_10_quoting_c__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_c.pyx":46 * * 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_10_quoting_c__from_hex(__pyx_v_d1); /* "yarl/_quoting_c.pyx":47 * 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_c.pyx":48 * 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_c.pyx":47 * 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_c.pyx":49 * if digit1 < 0: * return -1 * cdef int digit2 = _from_hex(d2) # <<<<<<<<<<<<<< * if digit2 < 0: * return -1 */ __pyx_v_digit2 = __pyx_f_4yarl_10_quoting_c__from_hex(__pyx_v_d2); /* "yarl/_quoting_c.pyx":50 * 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_c.pyx":51 * 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_c.pyx":50 * return -1 * cdef int digit2 = _from_hex(d2) * if digit2 < 0: # <<<<<<<<<<<<<< * return -1 * return (digit1 << 4 | digit2) */ } /* "yarl/_quoting_c.pyx":52 * 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_c.pyx":45 * * * 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_c.pyx":59 * * * 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_10_quoting_c_bit_at(uint8_t *__pyx_v_array, uint64_t __pyx_v_ch) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("bit_at", 0); /* "yarl/_quoting_c.pyx":60 * * 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_c.pyx":59 * * * 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_c.pyx":63 * * * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * array[ch >> 3] |= (1 << (ch & 7)) * */ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c_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_c.pyx":64 * * 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_c.pyx":63 * * * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<< * array[ch >> 3] |= (1 << (ch & 7)) * */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting_c.pyx":86 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__init_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_init_writer", 0); /* "yarl/_quoting_c.pyx":87 * * 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_10_quoting_c_BUFFER[0])); /* "yarl/_quoting_c.pyx":88 * 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_c.pyx":89 * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE * writer.pos = 0 # <<<<<<<<<<<<<< * writer.changed = 0 * */ __pyx_v_writer->pos = 0; /* "yarl/_quoting_c.pyx":90 * writer.size = BUF_SIZE * writer.pos = 0 * writer.changed = 0 # <<<<<<<<<<<<<< * * */ __pyx_v_writer->changed = 0; /* "yarl/_quoting_c.pyx":86 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting_c.pyx":93 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__release_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_release_writer", 0); /* "yarl/_quoting_c.pyx":94 * * 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_10_quoting_c_BUFFER) != 0); if (__pyx_t_1) { /* "yarl/_quoting_c.pyx":95 * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< * * */ PyMem_Free(__pyx_v_writer->buf); /* "yarl/_quoting_c.pyx":94 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ } /* "yarl/_quoting_c.pyx":93 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "yarl/_quoting_c.pyx":98 * * * 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_10_quoting_c__write_char(struct __pyx_t_4yarl_10_quoting_c_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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_write_char", 0); /* "yarl/_quoting_c.pyx":102 * 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_c.pyx":104 * 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_c.pyx":105 * # 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_10_quoting_c_BUFFER) != 0); if (__pyx_t_1) { /* "yarl/_quoting_c.pyx":106 * 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_c.pyx":107 * 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_c.pyx":108 * 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, 108, __pyx_L1_error) /* "yarl/_quoting_c.pyx":109 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * memcpy(buf, writer.buf, writer.size) * else: */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting_c.pyx":107 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } /* "yarl/_quoting_c.pyx":110 * 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_c.pyx":105 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ goto __pyx_L4; } /* "yarl/_quoting_c.pyx":112 * 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_c.pyx":113 * 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_c.pyx":114 * 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, 114, __pyx_L1_error) /* "yarl/_quoting_c.pyx":115 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * writer.buf = buf * writer.size = size */ __pyx_r = -1; goto __pyx_L0; /* "yarl/_quoting_c.pyx":113 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } } __pyx_L4:; /* "yarl/_quoting_c.pyx":116 * PyErr_NoMemory() * return -1 * writer.buf = buf # <<<<<<<<<<<<<< * writer.size = size * writer.buf[writer.pos] = ch */ __pyx_v_writer->buf = __pyx_v_buf; /* "yarl/_quoting_c.pyx":117 * 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_c.pyx":102 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ } /* "yarl/_quoting_c.pyx":118 * 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_c.pyx":119 * 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_c.pyx":120 * 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_c.pyx":121 * writer.pos += 1 * writer.changed |= changed * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "yarl/_quoting_c.pyx":98 * * * 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_c._write_char", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting_c.pyx":124 * * * 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_10_quoting_c__write_pct(struct __pyx_t_4yarl_10_quoting_c_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_c.pyx":125 * * 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_10_quoting_c__write_char(__pyx_v_writer, 37, __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting_c.pyx":126 * 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_c.pyx":125 * * 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_c.pyx":127 * 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_10_quoting_c__write_char(__pyx_v_writer, __pyx_f_4yarl_10_quoting_c__to_hex((((uint8_t)__pyx_v_ch) >> 4)), __pyx_v_changed) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting_c.pyx":128 * 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_c.pyx":127 * 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_c.pyx":129 * 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_10_quoting_c__write_char(__pyx_v_writer, __pyx_f_4yarl_10_quoting_c__to_hex((((uint8_t)__pyx_v_ch) & 0x0f)), __pyx_v_changed); goto __pyx_L0; /* "yarl/_quoting_c.pyx":124 * * * 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_c.pyx":132 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_utf8(struct __pyx_t_4yarl_10_quoting_c_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_c.pyx":133 * * 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_c.pyx":135 * 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_c.pyx":136 * * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)__pyx_v_utf), 1); goto __pyx_L0; /* "yarl/_quoting_c.pyx":135 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_pct(writer, utf, True) * elif utf < 0x800: */ } /* "yarl/_quoting_c.pyx":137 * 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_c.pyx":138 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6))), 1) < 0) != 0); if (__pyx_t_1) { /* "yarl/_quoting_c.pyx":139 * 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_c.pyx":138 * 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_c.pyx":140 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; /* "yarl/_quoting_c.pyx":137 * 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_c.pyx":141 * 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_c.pyx":143 * 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_c.pyx":141 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ } /* "yarl/_quoting_c.pyx":144 * # 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_c.pyx":145 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12))), 1) < 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":146 * 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_c.pyx":145 * 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_c.pyx":148 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting_c.pyx":147 * 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_c.pyx":149 * 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_c.pyx":147 * 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_c.pyx":150 * True) < 0: * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<< * elif utf > 0x10FFFF: * # symbol is too large */ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; /* "yarl/_quoting_c.pyx":144 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_pct(writer, (0xe0 | (utf >> 12)), True) < 0: * return -1 */ } /* "yarl/_quoting_c.pyx":151 * 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_c.pyx":153 * 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_c.pyx":151 * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ } /* "yarl/_quoting_c.pyx":155 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18))), 1) < 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":156 * 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_c.pyx":155 * return 0 * else: * if _write_pct(writer, (0xf0 | (utf >> 18)), True) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_pct(writer, (0x80 | ((utf >> 12) & 0x3f)), */ } /* "yarl/_quoting_c.pyx":158 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting_c.pyx":157 * 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_c.pyx":159 * 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_c.pyx":157 * 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_c.pyx":161 * 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_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0); /* "yarl/_quoting_c.pyx":160 * True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":162 * 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_c.pyx":160 * True) < 0: * return -1 * if _write_pct(writer, (0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<< * True) < 0: * return -1 */ } /* "yarl/_quoting_c.pyx":163 * True) < 0: * return -1 * return _write_pct(writer, (0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1); goto __pyx_L0; } /* "yarl/_quoting_c.pyx":132 * * * 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_c.pyx":176 * cdef uint8_t _protected_table[16] * * def __init__( # <<<<<<<<<<<<<< * self, *, str safe='', str protected='', bint qs=False, bint requote=True, * ): */ /* Python wrapper */ static int __pyx_pw_4yarl_10_quoting_c_7_Quoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_4yarl_10_quoting_c_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_v_requote; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; 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,&__pyx_n_s_requote,0}; PyObject* values[4] = {0,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 <= 4)) { Py_ssize_t index; for (index = 0; index < 4 && 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, 176, __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, 177, __pyx_L3_error) } else { /* "yarl/_quoting_c.pyx":177 * * def __init__( * self, *, str safe='', str protected='', bint qs=False, bint requote=True, # <<<<<<<<<<<<<< * ): * cdef Py_UCS4 ch */ __pyx_v_qs = ((int)0); } if (values[3]) { __pyx_v_requote = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_requote == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L3_error) } else { __pyx_v_requote = ((int)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, 176, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting_c._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, 177, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_protected), (&PyUnicode_Type), 1, "protected", 1))) __PYX_ERR(0, 177, __pyx_L1_error) __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), __pyx_v_safe, __pyx_v_protected, __pyx_v_qs, __pyx_v_requote); /* "yarl/_quoting_c.pyx":176 * cdef uint8_t _protected_table[16] * * def __init__( # <<<<<<<<<<<<<< * self, *, str safe='', str protected='', bint qs=False, bint requote=True, * ): */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs, int __pyx_v_requote) { 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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "yarl/_quoting_c.pyx":181 * cdef Py_UCS4 ch * * self._qs = qs # <<<<<<<<<<<<<< * self._requote = requote * */ __pyx_v_self->_qs = __pyx_v_qs; /* "yarl/_quoting_c.pyx":182 * * self._qs = qs * self._requote = requote # <<<<<<<<<<<<<< * * if not self._qs: */ __pyx_v_self->_requote = __pyx_v_requote; /* "yarl/_quoting_c.pyx":184 * self._requote = requote * * 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_c.pyx":185 * * 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_10_quoting_c_ALLOWED_NOTQS_TABLE, (sizeof(__pyx_v_self->_safe_table)))); /* "yarl/_quoting_c.pyx":184 * self._requote = requote * * if not self._qs: # <<<<<<<<<<<<<< * memcpy(self._safe_table, * ALLOWED_NOTQS_TABLE, */ goto __pyx_L3; } /* "yarl/_quoting_c.pyx":189 * sizeof(self._safe_table)) * else: * memcpy(self._safe_table, # <<<<<<<<<<<<<< * ALLOWED_TABLE, * sizeof(self._safe_table)) */ /*else*/ { /* "yarl/_quoting_c.pyx":191 * 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_10_quoting_c_ALLOWED_TABLE, (sizeof(__pyx_v_self->_safe_table)))); } __pyx_L3:; /* "yarl/_quoting_c.pyx":192 * 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, 192, __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, 192, __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_c.pyx":193 * 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_c.pyx":194 * 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, 194, __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, 194, __pyx_L1_error) /* "yarl/_quoting_c.pyx":193 * 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_c.pyx":195 * 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_10_quoting_c_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch); } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting_c.pyx":197 * 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_c.pyx":198 * * 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, 198, __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, 198, __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_c.pyx":199 * 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_c.pyx":200 * 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, 200, __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, 200, __pyx_L1_error) /* "yarl/_quoting_c.pyx":199 * 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_c.pyx":201 * 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_10_quoting_c_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch); /* "yarl/_quoting_c.pyx":202 * 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_10_quoting_c_set_bit(__pyx_v_self->_protected_table, __pyx_v_ch); } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting_c.pyx":176 * cdef uint8_t _protected_table[16] * * def __init__( # <<<<<<<<<<<<<< * self, *, str safe='', str protected='', bint qs=False, bint requote=True, * ): */ /* 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_c._Quoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting_c.pyx":204 * set_bit(self._protected_table, ch) * * def __call__(self, val): # <<<<<<<<<<<<<< * cdef Writer writer * if val is None: */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_val = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 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, 204, __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, 204, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting_c._Quoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), __pyx_v_val); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val) { struct __pyx_t_4yarl_10_quoting_c_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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__call__", 0); __Pyx_INCREF(__pyx_v_val); /* "yarl/_quoting_c.pyx":206 * 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_c.pyx":207 * 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_c.pyx":206 * def __call__(self, val): * cdef Writer writer * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ } /* "yarl/_quoting_c.pyx":208 * 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_c.pyx":209 * 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_c.pyx":211 * 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, 211, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":209 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ goto __pyx_L5; } /* "yarl/_quoting_c.pyx":213 * 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, 213, __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, 213, __pyx_L1_error) } __pyx_L5:; /* "yarl/_quoting_c.pyx":208 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ } /* "yarl/_quoting_c.pyx":214 * else: * raise TypeError("Argument should be str") * _init_writer(&writer) # <<<<<<<<<<<<<< * try: * return self._do_quote(val, &writer) */ __pyx_f_4yarl_10_quoting_c__init_writer((&__pyx_v_writer)); /* "yarl/_quoting_c.pyx":215 * raise TypeError("Argument should be str") * _init_writer(&writer) * try: # <<<<<<<<<<<<<< * return self._do_quote(val, &writer) * finally: */ /*try:*/ { /* "yarl/_quoting_c.pyx":216 * _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_10_quoting_c__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, 216, __pyx_L7_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L6_return; } /* "yarl/_quoting_c.pyx":218 * 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_10_quoting_c__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_10_quoting_c__release_writer((&__pyx_v_writer)); __pyx_r = __pyx_t_12; __pyx_t_12 = 0; goto __pyx_L0; } } /* "yarl/_quoting_c.pyx":204 * 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_c._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_c.pyx":220 * _release_writer(&writer) * * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * cdef int changed */ static PyObject *__pyx_f_4yarl_10_quoting_c_7_Quoter__do_quote(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) { Py_UCS4 __pyx_v_ch; int __pyx_v_changed; int __pyx_v_idx; int __pyx_v_length; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; int __pyx_t_2; Py_UCS4 __pyx_t_3; int __pyx_t_4; long __pyx_t_5; Py_UCS4 __pyx_t_6; int __pyx_t_7; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_do_quote", 0); /* "yarl/_quoting_c.pyx":223 * cdef Py_UCS4 ch * cdef int changed * cdef int idx = 0 # <<<<<<<<<<<<<< * cdef int length = len(val) * */ __pyx_v_idx = 0; /* "yarl/_quoting_c.pyx":224 * cdef int changed * cdef int idx = 0 * cdef int length = len(val) # <<<<<<<<<<<<<< * * while idx < length: */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 224, __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, 224, __pyx_L1_error) __pyx_v_length = __pyx_t_1; /* "yarl/_quoting_c.pyx":226 * cdef int length = len(val) * * while idx < length: # <<<<<<<<<<<<<< * ch = val[idx] * idx += 1 */ while (1) { __pyx_t_2 = ((__pyx_v_idx < __pyx_v_length) != 0); if (!__pyx_t_2) break; /* "yarl/_quoting_c.pyx":227 * * while idx < length: * ch = val[idx] # <<<<<<<<<<<<<< * idx += 1 * if ch == '%' and self._requote and idx <= length - 2: */ __pyx_t_3 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(__pyx_t_3 == (Py_UCS4)-1)) __PYX_ERR(0, 227, __pyx_L1_error) __pyx_v_ch = __pyx_t_3; /* "yarl/_quoting_c.pyx":228 * while idx < length: * ch = val[idx] * idx += 1 # <<<<<<<<<<<<<< * if ch == '%' and self._requote and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) */ __pyx_v_idx = (__pyx_v_idx + 1); /* "yarl/_quoting_c.pyx":229 * ch = val[idx] * idx += 1 * if ch == '%' and self._requote and idx <= length - 2: # <<<<<<<<<<<<<< * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: */ __pyx_t_4 = ((__pyx_v_ch == 37) != 0); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L6_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->_requote != 0); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L6_bool_binop_done; } __pyx_t_4 = ((__pyx_v_idx <= (__pyx_v_length - 2)) != 0); __pyx_t_2 = __pyx_t_4; __pyx_L6_bool_binop_done:; if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":230 * idx += 1 * if ch == '%' and self._requote and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) # <<<<<<<<<<<<<< * if ch != -1: * idx += 2 */ __pyx_t_3 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(__pyx_t_3 == (Py_UCS4)-1)) __PYX_ERR(0, 230, __pyx_L1_error) __pyx_t_5 = (__pyx_v_idx + 1); __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 230, __pyx_L1_error) __pyx_v_ch = __pyx_f_4yarl_10_quoting_c__restore_ch(__pyx_t_3, __pyx_t_6); /* "yarl/_quoting_c.pyx":231 * if ch == '%' and self._requote and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: # <<<<<<<<<<<<<< * idx += 2 * if ch < 128: */ __pyx_t_2 = ((__pyx_v_ch != ((Py_UCS4)-1L)) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":232 * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: * idx += 2 # <<<<<<<<<<<<<< * if ch < 128: * if bit_at(self._protected_table, ch): */ __pyx_v_idx = (__pyx_v_idx + 2); /* "yarl/_quoting_c.pyx":233 * if ch != -1: * idx += 2 * if ch < 128: # <<<<<<<<<<<<<< * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: */ __pyx_t_2 = ((__pyx_v_ch < 0x80) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":234 * idx += 2 * if ch < 128: * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<< * if _write_pct(writer, ch, True) < 0: * raise */ __pyx_t_2 = (__pyx_f_4yarl_10_quoting_c_bit_at(__pyx_v_self->_protected_table, __pyx_v_ch) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":235 * if ch < 128: * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0); if (unlikely(__pyx_t_2)) { /* "yarl/_quoting_c.pyx":236 * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 236, __pyx_L1_error) /* "yarl/_quoting_c.pyx":235 * if ch < 128: * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting_c.pyx":237 * if _write_pct(writer, ch, True) < 0: * raise * continue # <<<<<<<<<<<<<< * * if bit_at(self._safe_table, ch): */ goto __pyx_L3_continue; /* "yarl/_quoting_c.pyx":234 * idx += 2 * if ch < 128: * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<< * if _write_pct(writer, ch, True) < 0: * raise */ } /* "yarl/_quoting_c.pyx":239 * continue * * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * if _write_char(writer, ch, True) < 0: * raise */ __pyx_t_2 = (__pyx_f_4yarl_10_quoting_c_bit_at(__pyx_v_self->_safe_table, __pyx_v_ch) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":240 * * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0); if (unlikely(__pyx_t_2)) { /* "yarl/_quoting_c.pyx":241 * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: * raise # <<<<<<<<<<<<<< * continue * */ __Pyx_ReraiseException(); __PYX_ERR(0, 241, __pyx_L1_error) /* "yarl/_quoting_c.pyx":240 * * if bit_at(self._safe_table, ch): * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting_c.pyx":242 * if _write_char(writer, ch, True) < 0: * raise * continue # <<<<<<<<<<<<<< * * changed = (_is_lower_hex(val[idx - 2]) or */ goto __pyx_L3_continue; /* "yarl/_quoting_c.pyx":239 * continue * * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * if _write_char(writer, ch, True) < 0: * raise */ } /* "yarl/_quoting_c.pyx":233 * if ch != -1: * idx += 2 * if ch < 128: # <<<<<<<<<<<<<< * if bit_at(self._protected_table, ch): * if _write_pct(writer, ch, True) < 0: */ } /* "yarl/_quoting_c.pyx":244 * continue * * changed = (_is_lower_hex(val[idx - 2]) or # <<<<<<<<<<<<<< * _is_lower_hex(val[idx - 1])) * if _write_pct(writer, ch, changed) < 0: */ __pyx_t_5 = (__pyx_v_idx - 2); __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_t_8 = __pyx_f_4yarl_10_quoting_c__is_lower_hex(__pyx_t_6); if (!__pyx_t_8) { } else { __pyx_t_7 = __pyx_t_8; goto __pyx_L15_bool_binop_done; } /* "yarl/_quoting_c.pyx":245 * * changed = (_is_lower_hex(val[idx - 2]) or * _is_lower_hex(val[idx - 1])) # <<<<<<<<<<<<<< * if _write_pct(writer, ch, changed) < 0: * raise */ __pyx_t_5 = (__pyx_v_idx - 1); __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 245, __pyx_L1_error) __pyx_t_8 = __pyx_f_4yarl_10_quoting_c__is_lower_hex(__pyx_t_6); __pyx_t_7 = __pyx_t_8; __pyx_L15_bool_binop_done:; __pyx_v_changed = __pyx_t_7; /* "yarl/_quoting_c.pyx":246 * changed = (_is_lower_hex(val[idx - 2]) or * _is_lower_hex(val[idx - 1])) * if _write_pct(writer, ch, changed) < 0: # <<<<<<<<<<<<<< * raise * continue */ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, __pyx_v_ch, __pyx_v_changed) < 0) != 0); if (unlikely(__pyx_t_2)) { /* "yarl/_quoting_c.pyx":247 * _is_lower_hex(val[idx - 1])) * if _write_pct(writer, ch, changed) < 0: * raise # <<<<<<<<<<<<<< * continue * else: */ __Pyx_ReraiseException(); __PYX_ERR(0, 247, __pyx_L1_error) /* "yarl/_quoting_c.pyx":246 * changed = (_is_lower_hex(val[idx - 2]) or * _is_lower_hex(val[idx - 1])) * if _write_pct(writer, ch, changed) < 0: # <<<<<<<<<<<<<< * raise * continue */ } /* "yarl/_quoting_c.pyx":248 * if _write_pct(writer, ch, changed) < 0: * raise * continue # <<<<<<<<<<<<<< * else: * ch = '%' */ goto __pyx_L3_continue; /* "yarl/_quoting_c.pyx":231 * if ch == '%' and self._requote and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: # <<<<<<<<<<<<<< * idx += 2 * if ch < 128: */ } /* "yarl/_quoting_c.pyx":250 * continue * else: * ch = '%' # <<<<<<<<<<<<<< * * if self._write(writer, ch) < 0: */ /*else*/ { __pyx_v_ch = 37; } /* "yarl/_quoting_c.pyx":229 * ch = val[idx] * idx += 1 * if ch == '%' and self._requote and idx <= length - 2: # <<<<<<<<<<<<<< * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: */ } /* "yarl/_quoting_c.pyx":252 * ch = '%' * * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c_7_Quoter__write(__pyx_v_self, __pyx_v_writer, __pyx_v_ch) < 0) != 0); if (unlikely(__pyx_t_2)) { /* "yarl/_quoting_c.pyx":253 * * if self._write(writer, ch) < 0: * raise # <<<<<<<<<<<<<< * * if not writer.changed: */ __Pyx_ReraiseException(); __PYX_ERR(0, 253, __pyx_L1_error) /* "yarl/_quoting_c.pyx":252 * ch = '%' * * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<< * raise * */ } __pyx_L3_continue:; } /* "yarl/_quoting_c.pyx":255 * raise * * if not writer.changed: # <<<<<<<<<<<<<< * return val * else: */ __pyx_t_2 = ((!(__pyx_v_writer->changed != 0)) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":256 * * 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_c.pyx":255 * raise * * if not writer.changed: # <<<<<<<<<<<<<< * return val * else: */ } /* "yarl/_quoting_c.pyx":258 * 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, 258, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_r = ((PyObject*)__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L0; } /* "yarl/_quoting_c.pyx":220 * _release_writer(&writer) * * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * cdef int changed */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("yarl._quoting_c._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_c.pyx":260 * 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_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, struct __pyx_t_4yarl_10_quoting_c_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_c.pyx":261 * * 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_c.pyx":262 * 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_c.pyx":263 * 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_10_quoting_c__write_char(__pyx_v_writer, 43, 1); goto __pyx_L0; /* "yarl/_quoting_c.pyx":262 * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: * if ch == ' ': # <<<<<<<<<<<<<< * return _write_char(writer, '+', True) * */ } /* "yarl/_quoting_c.pyx":261 * * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): * if self._qs: # <<<<<<<<<<<<<< * if ch == ' ': * return _write_char(writer, '+', True) */ } /* "yarl/_quoting_c.pyx":265 * 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_10_quoting_c_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_c.pyx":266 * * 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_10_quoting_c__write_char(__pyx_v_writer, __pyx_v_ch, 0); goto __pyx_L0; /* "yarl/_quoting_c.pyx":265 * return _write_char(writer, '+', True) * * if ch < 128 and bit_at(self._safe_table, ch): # <<<<<<<<<<<<<< * return _write_char(writer, ch, False) * */ } /* "yarl/_quoting_c.pyx":268 * return _write_char(writer, ch, False) * * return _write_utf8(writer, ch) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_utf8(__pyx_v_writer, __pyx_v_ch); goto __pyx_L0; /* "yarl/_quoting_c.pyx":260 * 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_10_quoting_c_7_Quoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_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_10_quoting_c_7_Quoter_4__reduce_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__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; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_t_7; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self._protected_table, self._qs, self._requote, 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_PyBool_FromLong(__pyx_v_self->_requote); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_FromCString(__pyx_v_self->_safe_table); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_v_state = ((PyObject*)__pyx_t_5); __pyx_t_5 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self._protected_table, self._qs, self._requote, self._safe_table) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_5 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_v__dict = __pyx_t_5; __pyx_t_5 = 0; /* "(tree fragment)":7 * state = (self._protected_table, self._qs, self._requote, self._safe_table) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_6 = (__pyx_v__dict != Py_None); __pyx_t_7 = (__pyx_t_6 != 0); if (__pyx_t_7) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v__dict); __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); __pyx_t_4 = 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._requote, 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), 0xe91bd35, 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), 0xe91bd35, None), state * else: */ __pyx_t_7 = (__pyx_v_use_setstate != 0); if (__pyx_t_7) { /* "(tree fragment)":13 * use_setstate = False * if use_setstate: * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_244432181); __Pyx_GIVEREF(__pyx_int_244432181); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_int_244432181); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_5, 2, Py_None); __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_state); __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = False * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state * else: * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle__Quoter__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_244432181); __Pyx_GIVEREF(__pyx_int_244432181); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_int_244432181); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5); __pyx_t_3 = 0; __pyx_t_5 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 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_XDECREF(__pyx_t_5); __Pyx_AddTraceback("yarl._quoting_c._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), 0xe91bd35, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle__Quoter__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_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_10_quoting_c_7_Quoter_6__setstate_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, 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_10_quoting_c___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), 0xe91bd35, 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_c._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_c.pyx":277 * cdef _Quoter _qs_quoter * * def __init__(self, *, unsafe='', qs=False): # <<<<<<<<<<<<<< * self._unsafe = unsafe * self._qs = qs */ /* Python wrapper */ static int __pyx_pw_4yarl_10_quoting_c_9_Unquoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_4yarl_10_quoting_c_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_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 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, 277, __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, 277, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), __pyx_v_unsafe, __pyx_v_qs); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(struct __pyx_obj_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "yarl/_quoting_c.pyx":278 * * 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, 278, __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_c.pyx":279 * 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, 279, __pyx_L1_error) __pyx_v_self->_qs = __pyx_t_2; /* "yarl/_quoting_c.pyx":280 * 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_10_quoting_c__Quoter)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 280, __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_10_quoting_c__Quoter *)__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting_c.pyx":281 * 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, 281, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_qs, Py_True) < 0) __PYX_ERR(0, 281, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Quoter), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 281, __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_10_quoting_c__Quoter *)__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":277 * 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_c._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "yarl/_quoting_c.pyx":283 * self._qs_quoter = _Quoter(qs=True) * * def __call__(self, val): # <<<<<<<<<<<<<< * if val is None: * return None */ /* Python wrapper */ static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_val = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 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, 283, __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, 283, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), __pyx_v_val); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__call__", 0); __Pyx_INCREF(__pyx_v_val); /* "yarl/_quoting_c.pyx":284 * * 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_c.pyx":285 * 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_c.pyx":284 * * def __call__(self, val): * if val is None: # <<<<<<<<<<<<<< * return None * if type(val) is not str: */ } /* "yarl/_quoting_c.pyx":286 * 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_c.pyx":287 * 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_c.pyx":289 * 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, 289, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":287 * return None * if type(val) is not str: * if isinstance(val, str): # <<<<<<<<<<<<<< * # derived from str * val = str(val) */ goto __pyx_L5; } /* "yarl/_quoting_c.pyx":291 * 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, 291, __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, 291, __pyx_L1_error) } __pyx_L5:; /* "yarl/_quoting_c.pyx":286 * if val is None: * return None * if type(val) is not str: # <<<<<<<<<<<<<< * if isinstance(val, str): * # derived from str */ } /* "yarl/_quoting_c.pyx":292 * 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_10_quoting_c__Unquoter *)__pyx_v_self->__pyx_vtab)->_do_unquote(__pyx_v_self, ((PyObject*)__pyx_v_val)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 292, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "yarl/_quoting_c.pyx":283 * 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_c._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_c.pyx":294 * return self._do_unquote(val) * * cdef str _do_unquote(self, str val): # <<<<<<<<<<<<<< * if len(val) == 0: * return val */ static PyObject *__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_v_ret = 0; char __pyx_v_buffer[4]; Py_ssize_t __pyx_v_buflen; Py_ssize_t __pyx_v_consumed; PyObject *__pyx_v_unquoted = 0; Py_UCS4 __pyx_v_ch; Py_ssize_t __pyx_v_idx; Py_ssize_t __pyx_v_length; Py_ssize_t __pyx_v_start_pct; 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; Py_UCS4 __pyx_t_4; int __pyx_t_5; Py_UCS4 __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; int __pyx_t_14; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; PyObject *__pyx_t_18 = NULL; PyObject *__pyx_t_19 = NULL; PyObject *__pyx_t_20 = NULL; int __pyx_t_21; PyObject *(*__pyx_t_22)(PyObject *); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_do_unquote", 0); /* "yarl/_quoting_c.pyx":295 * * cdef str _do_unquote(self, str val): * if len(val) == 0: # <<<<<<<<<<<<<< * return val * cdef list ret = [] */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 295, __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, 295, __pyx_L1_error) __pyx_t_2 = ((__pyx_t_1 == 0) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":296 * cdef str _do_unquote(self, str val): * if len(val) == 0: * return val # <<<<<<<<<<<<<< * cdef list ret = [] * cdef char buffer[4] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_val); __pyx_r = __pyx_v_val; goto __pyx_L0; /* "yarl/_quoting_c.pyx":295 * * cdef str _do_unquote(self, str val): * if len(val) == 0: # <<<<<<<<<<<<<< * return val * cdef list ret = [] */ } /* "yarl/_quoting_c.pyx":297 * if len(val) == 0: * return val * cdef list ret = [] # <<<<<<<<<<<<<< * cdef char buffer[4] * cdef Py_ssize_t buflen = 0 */ __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_ret = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":299 * cdef list ret = [] * cdef char buffer[4] * cdef Py_ssize_t buflen = 0 # <<<<<<<<<<<<<< * cdef Py_ssize_t consumed * cdef str unquoted */ __pyx_v_buflen = 0; /* "yarl/_quoting_c.pyx":302 * cdef Py_ssize_t consumed * cdef str unquoted * cdef Py_UCS4 ch = 0 # <<<<<<<<<<<<<< * cdef Py_ssize_t idx = 0 * cdef Py_ssize_t length = len(val) */ __pyx_v_ch = 0; /* "yarl/_quoting_c.pyx":303 * cdef str unquoted * cdef Py_UCS4 ch = 0 * cdef Py_ssize_t idx = 0 # <<<<<<<<<<<<<< * cdef Py_ssize_t length = len(val) * cdef Py_ssize_t start_pct */ __pyx_v_idx = 0; /* "yarl/_quoting_c.pyx":304 * cdef Py_UCS4 ch = 0 * cdef Py_ssize_t idx = 0 * cdef Py_ssize_t length = len(val) # <<<<<<<<<<<<<< * cdef Py_ssize_t start_pct * */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 304, __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, 304, __pyx_L1_error) __pyx_v_length = __pyx_t_1; /* "yarl/_quoting_c.pyx":307 * cdef Py_ssize_t start_pct * * while idx < length: # <<<<<<<<<<<<<< * ch = val[idx] * idx += 1 */ while (1) { __pyx_t_2 = ((__pyx_v_idx < __pyx_v_length) != 0); if (!__pyx_t_2) break; /* "yarl/_quoting_c.pyx":308 * * while idx < length: * ch = val[idx] # <<<<<<<<<<<<<< * idx += 1 * if ch == '%' and idx <= length - 2: */ __pyx_t_4 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_4 == (Py_UCS4)-1)) __PYX_ERR(0, 308, __pyx_L1_error) __pyx_v_ch = __pyx_t_4; /* "yarl/_quoting_c.pyx":309 * while idx < length: * ch = val[idx] * idx += 1 # <<<<<<<<<<<<<< * if ch == '%' and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) */ __pyx_v_idx = (__pyx_v_idx + 1); /* "yarl/_quoting_c.pyx":310 * ch = val[idx] * idx += 1 * if ch == '%' and idx <= length - 2: # <<<<<<<<<<<<<< * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: */ __pyx_t_5 = ((__pyx_v_ch == 37) != 0); if (__pyx_t_5) { } else { __pyx_t_2 = __pyx_t_5; goto __pyx_L7_bool_binop_done; } __pyx_t_5 = ((__pyx_v_idx <= (__pyx_v_length - 2)) != 0); __pyx_t_2 = __pyx_t_5; __pyx_L7_bool_binop_done:; if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":311 * idx += 1 * if ch == '%' and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) # <<<<<<<<<<<<<< * if ch != -1: * idx += 2 */ __pyx_t_4 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_4 == (Py_UCS4)-1)) __PYX_ERR(0, 311, __pyx_L1_error) __pyx_t_1 = (__pyx_v_idx + 1); __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_1, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 311, __pyx_L1_error) __pyx_v_ch = __pyx_f_4yarl_10_quoting_c__restore_ch(__pyx_t_4, __pyx_t_6); /* "yarl/_quoting_c.pyx":312 * if ch == '%' and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: # <<<<<<<<<<<<<< * idx += 2 * assert buflen < 4 */ __pyx_t_2 = ((__pyx_v_ch != ((Py_UCS4)-1L)) != 0); if (__pyx_t_2) { /* "yarl/_quoting_c.pyx":313 * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: * idx += 2 # <<<<<<<<<<<<<< * assert buflen < 4 * buffer[buflen] = ch */ __pyx_v_idx = (__pyx_v_idx + 2); /* "yarl/_quoting_c.pyx":314 * if ch != -1: * idx += 2 * assert buflen < 4 # <<<<<<<<<<<<<< * buffer[buflen] = ch * buflen += 1 */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_buflen < 4) != 0))) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 314, __pyx_L1_error) } } #endif /* "yarl/_quoting_c.pyx":315 * idx += 2 * assert buflen < 4 * buffer[buflen] = ch # <<<<<<<<<<<<<< * buflen += 1 * try: */ (__pyx_v_buffer[__pyx_v_buflen]) = __pyx_v_ch; /* "yarl/_quoting_c.pyx":316 * assert buflen < 4 * buffer[buflen] = ch * buflen += 1 # <<<<<<<<<<<<<< * try: * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, */ __pyx_v_buflen = (__pyx_v_buflen + 1); /* "yarl/_quoting_c.pyx":317 * buffer[buflen] = ch * buflen += 1 * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_8); __Pyx_XGOTREF(__pyx_t_9); /*try:*/ { /* "yarl/_quoting_c.pyx":318 * buflen += 1 * try: * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, # <<<<<<<<<<<<<< * NULL, &consumed) * except UnicodeDecodeError: */ __pyx_t_3 = PyUnicode_DecodeUTF8Stateful(__pyx_v_buffer, __pyx_v_buflen, NULL, (&__pyx_v_consumed)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 318, __pyx_L10_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":317 * buffer[buflen] = ch * buflen += 1 * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ } __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L17_try_end; __pyx_L10_error:; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; /* "yarl/_quoting_c.pyx":320 * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) * except UnicodeDecodeError: # <<<<<<<<<<<<<< * start_pct = idx - buflen * 3 * buffer[0] = ch */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError); if (__pyx_t_10) { __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_11, &__pyx_t_12) < 0) __PYX_ERR(0, 320, __pyx_L12_except_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_11); __Pyx_GOTREF(__pyx_t_12); /* "yarl/_quoting_c.pyx":321 * NULL, &consumed) * except UnicodeDecodeError: * start_pct = idx - buflen * 3 # <<<<<<<<<<<<<< * buffer[0] = ch * buflen = 1 */ __pyx_v_start_pct = (__pyx_v_idx - (__pyx_v_buflen * 3)); /* "yarl/_quoting_c.pyx":322 * except UnicodeDecodeError: * start_pct = idx - buflen * 3 * buffer[0] = ch # <<<<<<<<<<<<<< * buflen = 1 * ret.append(val[start_pct : idx - 3]) */ (__pyx_v_buffer[0]) = __pyx_v_ch; /* "yarl/_quoting_c.pyx":323 * start_pct = idx - buflen * 3 * buffer[0] = ch * buflen = 1 # <<<<<<<<<<<<<< * ret.append(val[start_pct : idx - 3]) * try: */ __pyx_v_buflen = 1; /* "yarl/_quoting_c.pyx":324 * buffer[0] = ch * buflen = 1 * ret.append(val[start_pct : idx - 3]) # <<<<<<<<<<<<<< * try: * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 324, __pyx_L12_except_error) } __pyx_t_13 = __Pyx_PyUnicode_Substring(__pyx_v_val, __pyx_v_start_pct, (__pyx_v_idx - 3)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 324, __pyx_L12_except_error) __Pyx_GOTREF(__pyx_t_13); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_13); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 324, __pyx_L12_except_error) __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; /* "yarl/_quoting_c.pyx":325 * buflen = 1 * ret.append(val[start_pct : idx - 3]) * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_16); __Pyx_XGOTREF(__pyx_t_17); /*try:*/ { /* "yarl/_quoting_c.pyx":326 * ret.append(val[start_pct : idx - 3]) * try: * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, # <<<<<<<<<<<<<< * NULL, &consumed) * except UnicodeDecodeError: */ __pyx_t_13 = PyUnicode_DecodeUTF8Stateful(__pyx_v_buffer, __pyx_v_buflen, NULL, (&__pyx_v_consumed)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 326, __pyx_L20_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_13)); __pyx_t_13 = 0; /* "yarl/_quoting_c.pyx":325 * buflen = 1 * ret.append(val[start_pct : idx - 3]) * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ } __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; goto __pyx_L27_try_end; __pyx_L20_error:; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; /* "yarl/_quoting_c.pyx":328 * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) * except UnicodeDecodeError: # <<<<<<<<<<<<<< * buflen = 0 * ret.append(val[idx - 3 : idx]) */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError); if (__pyx_t_10) { __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_13, &__pyx_t_18, &__pyx_t_19) < 0) __PYX_ERR(0, 328, __pyx_L22_except_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_GOTREF(__pyx_t_18); __Pyx_GOTREF(__pyx_t_19); /* "yarl/_quoting_c.pyx":329 * NULL, &consumed) * except UnicodeDecodeError: * buflen = 0 # <<<<<<<<<<<<<< * ret.append(val[idx - 3 : idx]) * continue */ __pyx_v_buflen = 0; /* "yarl/_quoting_c.pyx":330 * except UnicodeDecodeError: * buflen = 0 * ret.append(val[idx - 3 : idx]) # <<<<<<<<<<<<<< * continue * if not unquoted: */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 330, __pyx_L22_except_error) } __pyx_t_20 = __Pyx_PyUnicode_Substring(__pyx_v_val, (__pyx_v_idx - 3), __pyx_v_idx); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 330, __pyx_L22_except_error) __Pyx_GOTREF(__pyx_t_20); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_20); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 330, __pyx_L22_except_error) __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; /* "yarl/_quoting_c.pyx":331 * buflen = 0 * ret.append(val[idx - 3 : idx]) * continue # <<<<<<<<<<<<<< * if not unquoted: * assert consumed == 0 */ goto __pyx_L29_except_continue; __pyx_L29_except_continue:; __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0; __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; goto __pyx_L26_try_continue; } goto __pyx_L22_except_error; __pyx_L22_except_error:; /* "yarl/_quoting_c.pyx":325 * buflen = 1 * ret.append(val[start_pct : idx - 3]) * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_17); __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); goto __pyx_L12_except_error; __pyx_L26_try_continue:; __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_17); __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); goto __pyx_L19_except_continue; __pyx_L27_try_end:; } __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; goto __pyx_L11_exception_handled; __pyx_L19_except_continue:; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; goto __pyx_L16_try_continue; } goto __pyx_L12_except_error; __pyx_L12_except_error:; /* "yarl/_quoting_c.pyx":317 * buffer[buflen] = ch * buflen += 1 * try: # <<<<<<<<<<<<<< * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, * NULL, &consumed) */ __Pyx_XGIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_XGIVEREF(__pyx_t_9); __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); goto __pyx_L1_error; __pyx_L16_try_continue:; __Pyx_XGIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_XGIVEREF(__pyx_t_9); __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); goto __pyx_L4_continue; __pyx_L11_exception_handled:; __Pyx_XGIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_XGIVEREF(__pyx_t_9); __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9); __pyx_L17_try_end:; } /* "yarl/_quoting_c.pyx":332 * ret.append(val[idx - 3 : idx]) * continue * if not unquoted: # <<<<<<<<<<<<<< * assert consumed == 0 * continue */ __pyx_t_2 = (__pyx_v_unquoted != Py_None)&&(__Pyx_PyUnicode_IS_TRUE(__pyx_v_unquoted) != 0); __pyx_t_5 = ((!__pyx_t_2) != 0); if (__pyx_t_5) { /* "yarl/_quoting_c.pyx":333 * continue * if not unquoted: * assert consumed == 0 # <<<<<<<<<<<<<< * continue * assert consumed == buflen */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_consumed == 0) != 0))) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 333, __pyx_L1_error) } } #endif /* "yarl/_quoting_c.pyx":334 * if not unquoted: * assert consumed == 0 * continue # <<<<<<<<<<<<<< * assert consumed == buflen * buflen = 0 */ goto __pyx_L4_continue; /* "yarl/_quoting_c.pyx":332 * ret.append(val[idx - 3 : idx]) * continue * if not unquoted: # <<<<<<<<<<<<<< * assert consumed == 0 * continue */ } /* "yarl/_quoting_c.pyx":335 * assert consumed == 0 * continue * assert consumed == buflen # <<<<<<<<<<<<<< * buflen = 0 * if self._qs and unquoted in '+=&;': */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_consumed == __pyx_v_buflen) != 0))) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 335, __pyx_L1_error) } } #endif /* "yarl/_quoting_c.pyx":336 * continue * assert consumed == buflen * buflen = 0 # <<<<<<<<<<<<<< * if self._qs and unquoted in '+=&;': * ret.append(self._qs_quoter(unquoted)) */ __pyx_v_buflen = 0; /* "yarl/_quoting_c.pyx":337 * assert consumed == buflen * buflen = 0 * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ __pyx_t_2 = (__pyx_v_self->_qs != 0); if (__pyx_t_2) { } else { __pyx_t_5 = __pyx_t_2; goto __pyx_L32_bool_binop_done; } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_kp_u__4, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 337, __pyx_L1_error) __pyx_t_21 = (__pyx_t_2 != 0); __pyx_t_5 = __pyx_t_21; __pyx_L32_bool_binop_done:; if (__pyx_t_5) { /* "yarl/_quoting_c.pyx":338 * buflen = 0 * 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_11 = ((PyObject *)__pyx_v_self->_qs_quoter); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_11, function); } } __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_3, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 338, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 338, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting_c.pyx":337 * assert consumed == buflen * buflen = 0 * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<< * ret.append(self._qs_quoter(unquoted)) * elif unquoted in self._unsafe: */ goto __pyx_L31; } /* "yarl/_quoting_c.pyx":339 * 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, 339, __pyx_L1_error) } __pyx_t_5 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 339, __pyx_L1_error) __pyx_t_21 = (__pyx_t_5 != 0); if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":340 * 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_11 = ((PyObject *)__pyx_v_self->_quoter); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_11, function); } } __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_3, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_unquoted); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 340, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 340, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting_c.pyx":339 * 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_L31; } /* "yarl/_quoting_c.pyx":342 * ret.append(self._quoter(unquoted)) * else: * ret.append(unquoted) # <<<<<<<<<<<<<< * continue * else: */ /*else*/ { __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_unquoted); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 342, __pyx_L1_error) } __pyx_L31:; /* "yarl/_quoting_c.pyx":343 * else: * ret.append(unquoted) * continue # <<<<<<<<<<<<<< * else: * ch = '%' */ goto __pyx_L4_continue; /* "yarl/_quoting_c.pyx":312 * if ch == '%' and idx <= length - 2: * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: # <<<<<<<<<<<<<< * idx += 2 * assert buflen < 4 */ } /* "yarl/_quoting_c.pyx":345 * continue * else: * ch = '%' # <<<<<<<<<<<<<< * * if buflen: */ /*else*/ { __pyx_v_ch = 37; } /* "yarl/_quoting_c.pyx":310 * ch = val[idx] * idx += 1 * if ch == '%' and idx <= length - 2: # <<<<<<<<<<<<<< * ch = _restore_ch(val[idx], val[idx + 1]) * if ch != -1: */ } /* "yarl/_quoting_c.pyx":347 * ch = '%' * * if buflen: # <<<<<<<<<<<<<< * start_pct = idx - 1 - buflen * 3 * ret.append(val[start_pct : idx - 1]) */ __pyx_t_21 = (__pyx_v_buflen != 0); if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":348 * * if buflen: * start_pct = idx - 1 - buflen * 3 # <<<<<<<<<<<<<< * ret.append(val[start_pct : idx - 1]) * buflen = 0 */ __pyx_v_start_pct = ((__pyx_v_idx - 1) - (__pyx_v_buflen * 3)); /* "yarl/_quoting_c.pyx":349 * if buflen: * start_pct = idx - 1 - buflen * 3 * ret.append(val[start_pct : idx - 1]) # <<<<<<<<<<<<<< * buflen = 0 * */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 349, __pyx_L1_error) } __pyx_t_12 = __Pyx_PyUnicode_Substring(__pyx_v_val, __pyx_v_start_pct, (__pyx_v_idx - 1)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting_c.pyx":350 * start_pct = idx - 1 - buflen * 3 * ret.append(val[start_pct : idx - 1]) * buflen = 0 # <<<<<<<<<<<<<< * * if ch == '+': */ __pyx_v_buflen = 0; /* "yarl/_quoting_c.pyx":347 * ch = '%' * * if buflen: # <<<<<<<<<<<<<< * start_pct = idx - 1 - buflen * 3 * ret.append(val[start_pct : idx - 1]) */ } /* "yarl/_quoting_c.pyx":352 * buflen = 0 * * if ch == '+': # <<<<<<<<<<<<<< * if not self._qs or ch in self._unsafe: * ret.append('+') */ __pyx_t_21 = ((__pyx_v_ch == 43) != 0); if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":353 * * if ch == '+': * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('+') * else: */ __pyx_t_5 = ((!(__pyx_v_self->_qs != 0)) != 0); if (!__pyx_t_5) { } else { __pyx_t_21 = __pyx_t_5; goto __pyx_L37_bool_binop_done; } if (unlikely(__pyx_v_self->_unsafe == Py_None)) { PyErr_SetString(PyExc_TypeError, "argument of type 'NoneType' is not iterable"); __PYX_ERR(0, 353, __pyx_L1_error) } __pyx_t_5 = ((__Pyx_UnicodeContainsUCS4(__pyx_v_self->_unsafe, __pyx_v_ch)) != 0); __pyx_t_21 = __pyx_t_5; __pyx_L37_bool_binop_done:; if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":354 * if ch == '+': * if not self._qs or ch in self._unsafe: * ret.append('+') # <<<<<<<<<<<<<< * else: * ret.append(' ') */ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__5); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 354, __pyx_L1_error) /* "yarl/_quoting_c.pyx":353 * * if ch == '+': * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('+') * else: */ goto __pyx_L36; } /* "yarl/_quoting_c.pyx":356 * ret.append('+') * else: * ret.append(' ') # <<<<<<<<<<<<<< * continue * */ /*else*/ { __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__6); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 356, __pyx_L1_error) } __pyx_L36:; /* "yarl/_quoting_c.pyx":357 * else: * ret.append(' ') * continue # <<<<<<<<<<<<<< * * if ch in self._unsafe: */ goto __pyx_L4_continue; /* "yarl/_quoting_c.pyx":352 * buflen = 0 * * if ch == '+': # <<<<<<<<<<<<<< * if not self._qs or ch in self._unsafe: * ret.append('+') */ } /* "yarl/_quoting_c.pyx":359 * 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, "argument of type 'NoneType' is not iterable"); __PYX_ERR(0, 359, __pyx_L1_error) } __pyx_t_21 = ((__Pyx_UnicodeContainsUCS4(__pyx_v_self->_unsafe, __pyx_v_ch)) != 0); if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":360 * * if ch in self._unsafe: * ret.append('%') # <<<<<<<<<<<<<< * h = hex(ord(ch)).upper()[2:] * for ch in h: */ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__7); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 360, __pyx_L1_error) /* "yarl/_quoting_c.pyx":361 * if ch in self._unsafe: * ret.append('%') * h = hex(ord(ch)).upper()[2:] # <<<<<<<<<<<<<< * for ch in h: * ret.append(ch) */ __pyx_t_11 = __Pyx_PyInt_From_long(((long)__pyx_v_ch)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_hex, __pyx_t_11); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_upper); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_11, function); } } __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_11); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_t_11 = __Pyx_PyObject_GetSlice(__pyx_t_12, 2, 0, NULL, NULL, &__pyx_slice__8, 1, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF_SET(__pyx_v_h, __pyx_t_11); __pyx_t_11 = 0; /* "yarl/_quoting_c.pyx":362 * 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_11 = __pyx_v_h; __Pyx_INCREF(__pyx_t_11); __pyx_t_1 = 0; __pyx_t_22 = NULL; } else { __pyx_t_1 = -1; __pyx_t_11 = PyObject_GetIter(__pyx_v_h); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 362, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_22 = Py_TYPE(__pyx_t_11)->tp_iternext; if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 362, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_22)) { if (likely(PyList_CheckExact(__pyx_t_11))) { if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_11)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_12 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 362, __pyx_L1_error) #else __pyx_t_12 = PySequence_ITEM(__pyx_t_11, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 362, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); #endif } else { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_11)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_11, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 362, __pyx_L1_error) #else __pyx_t_12 = PySequence_ITEM(__pyx_t_11, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 362, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); #endif } } else { __pyx_t_12 = __pyx_t_22(__pyx_t_11); 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, 362, __pyx_L1_error) } break; } __Pyx_GOTREF(__pyx_t_12); } __pyx_t_6 = __Pyx_PyObject_AsPy_UCS4(__pyx_t_12); if (unlikely((__pyx_t_6 == (Py_UCS4)-1) && PyErr_Occurred())) __PYX_ERR(0, 362, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_v_ch = __pyx_t_6; /* "yarl/_quoting_c.pyx":363 * h = hex(ord(ch)).upper()[2:] * for ch in h: * ret.append(ch) # <<<<<<<<<<<<<< * continue * */ __pyx_t_12 = PyUnicode_FromOrdinal(__pyx_v_ch); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 363, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 363, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; /* "yarl/_quoting_c.pyx":362 * ret.append('%') * h = hex(ord(ch)).upper()[2:] * for ch in h: # <<<<<<<<<<<<<< * ret.append(ch) * continue */ } __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; /* "yarl/_quoting_c.pyx":364 * for ch in h: * ret.append(ch) * continue # <<<<<<<<<<<<<< * * ret.append(ch) */ goto __pyx_L4_continue; /* "yarl/_quoting_c.pyx":359 * continue * * if ch in self._unsafe: # <<<<<<<<<<<<<< * ret.append('%') * h = hex(ord(ch)).upper()[2:] */ } /* "yarl/_quoting_c.pyx":366 * continue * * ret.append(ch) # <<<<<<<<<<<<<< * * if buflen: */ __pyx_t_11 = PyUnicode_FromOrdinal(__pyx_v_ch); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_11); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 366, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_L4_continue:; } /* "yarl/_quoting_c.pyx":368 * ret.append(ch) * * if buflen: # <<<<<<<<<<<<<< * ret.append(val[length - buflen * 3 : length]) * */ __pyx_t_21 = (__pyx_v_buflen != 0); if (__pyx_t_21) { /* "yarl/_quoting_c.pyx":369 * * if buflen: * ret.append(val[length - buflen * 3 : length]) # <<<<<<<<<<<<<< * * return ''.join(ret) */ if (unlikely(__pyx_v_val == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 369, __pyx_L1_error) } __pyx_t_11 = __Pyx_PyUnicode_Substring(__pyx_v_val, (__pyx_v_length - (__pyx_v_buflen * 3)), __pyx_v_length); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 369, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_11); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 369, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; /* "yarl/_quoting_c.pyx":368 * ret.append(ch) * * if buflen: # <<<<<<<<<<<<<< * ret.append(val[length - buflen * 3 : length]) * */ } /* "yarl/_quoting_c.pyx":371 * ret.append(val[length - buflen * 3 : length]) * * 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, 371, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_r = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L0; /* "yarl/_quoting_c.pyx":294 * 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_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_18); __Pyx_XDECREF(__pyx_t_19); __Pyx_XDECREF(__pyx_t_20); __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_ret); __Pyx_XDECREF(__pyx_v_unquoted); __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_10_quoting_c_9_Unquoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_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_10_quoting_c_9_Unquoter_4__reduce_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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_c._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_10_quoting_c_9_Unquoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_4yarl_10_quoting_c_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_10_quoting_c_9_Unquoter_6__setstate_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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_10_quoting_c___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_c._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_10_quoting_c_1__pyx_unpickle__Quoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_4yarl_10_quoting_c_1__pyx_unpickle__Quoter = {"__pyx_unpickle__Quoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_10_quoting_c_1__pyx_unpickle__Quoter, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_4yarl_10_quoting_c_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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 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_c.__pyx_unpickle__Quoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_10_quoting_c___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_10_quoting_c___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 PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xe91bd35, 0x60b2b56, 0x7e82961): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__9, Py_NE)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum not in (0xe91bd35, 0x60b2b56, 0x7e82961): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) * __pyx_result = _Quoter.__new__(__pyx_type) */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError); __pyx_t_4 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v___pyx_PickleError = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":6 * if __pyx_checksum not in (0xe91bd35, 0x60b2b56, 0x7e82961): * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = _Quoter.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_1 = __pyx_v___pyx_PickleError; __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xe91bd35, 0x60b2b56, 0x7e82961): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _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_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Quoter), __pyx_n_s_new); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_4 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result = __pyx_t_4; __pyx_t_4 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _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_3 = (__pyx_v___pyx_state != Py_None); __pyx_t_2 = (__pyx_t_3 != 0); if (__pyx_t_2) { /* "(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_4 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _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._requote = __pyx_state[2]; __pyx_result._safe_table = __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__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_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("yarl._quoting_c.__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._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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._requote = __pyx_state[2]; __pyx_result._safe_table = __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); 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); __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->_requote = __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, 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 (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._requote = __pyx_state[2]; __pyx_result._safe_table = __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_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 > 4) != 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._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[4]) # <<<<<<<<<<<<<< */ __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, 4, 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._requote = __pyx_state[2]; __pyx_result._safe_table = __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__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._requote = __pyx_state[2]; __pyx_result._safe_table = __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_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("yarl._quoting_c.__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_10_quoting_c_3__pyx_unpickle__Unquoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter = {"__pyx_unpickle__Unquoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_4yarl_10_quoting_c_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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 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_c.__pyx_unpickle__Unquoter", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_4yarl_10_quoting_c_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_10_quoting_c_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 PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0x276577d, 0x4dde2d1, 0x5358bd6): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__10, Py_NE)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum not in (0x276577d, 0x4dde2d1, 0x5358bd6): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) * __pyx_result = _Unquoter.__new__(__pyx_type) */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError); __pyx_t_4 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v___pyx_PickleError = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":6 * if __pyx_checksum not in (0x276577d, 0x4dde2d1, 0x5358bd6): * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = _Unquoter.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_1 = __pyx_v___pyx_PickleError; __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0x276577d, 0x4dde2d1, 0x5358bd6): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_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_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Unquoter), __pyx_n_s_new); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_4 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result = __pyx_t_4; __pyx_t_4 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_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_3 = (__pyx_v___pyx_state != Py_None); __pyx_t_2 = (__pyx_t_3 != 0); if (__pyx_t_2) { /* "(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_4 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0x276577d, 0x4dde2d1, 0x5358bd6) = (_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_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("yarl._quoting_c.__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_10_quoting_c___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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_10_quoting_c__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_10_quoting_c__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_10_quoting_c__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_10_quoting_c__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_c.__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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_10_quoting_c__Quoter __pyx_vtable_4yarl_10_quoting_c__Quoter; static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Quoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_4yarl_10_quoting_c__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_10_quoting_c__Quoter *)o); p->__pyx_vtab = __pyx_vtabptr_4yarl_10_quoting_c__Quoter; return o; } static void __pyx_tp_dealloc_4yarl_10_quoting_c__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_10_quoting_c__Quoter[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_7_Quoter_5__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_7_Quoter_7__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_4yarl_10_quoting_c__Quoter = { PyVarObject_HEAD_INIT(0, 0) "yarl._quoting_c._Quoter", /*tp_name*/ sizeof(struct __pyx_obj_4yarl_10_quoting_c__Quoter), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4yarl_10_quoting_c__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_10_quoting_c_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_10_quoting_c__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_10_quoting_c_7_Quoter_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4yarl_10_quoting_c__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 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 0, /*tp_pypy_flags*/ #endif }; static struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter __pyx_vtable_4yarl_10_quoting_c__Unquoter; static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Unquoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_4yarl_10_quoting_c__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_10_quoting_c__Unquoter *)o); p->__pyx_vtab = __pyx_vtabptr_4yarl_10_quoting_c__Unquoter; p->_unsafe = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None); p->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_4yarl_10_quoting_c__Unquoter(PyObject *o) { struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__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_10_quoting_c__Unquoter(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__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_10_quoting_c__Unquoter(PyObject *o) { PyObject* tmp; struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)o; tmp = ((PyObject*)p->_quoter); p->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_qs_quoter); p->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyMethodDef __pyx_methods_4yarl_10_quoting_c__Unquoter[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_9_Unquoter_5__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_9_Unquoter_7__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_4yarl_10_quoting_c__Unquoter = { PyVarObject_HEAD_INIT(0, 0) "yarl._quoting_c._Unquoter", /*tp_name*/ sizeof(struct __pyx_obj_4yarl_10_quoting_c__Unquoter), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_4yarl_10_quoting_c__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_10_quoting_c_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_10_quoting_c__Unquoter, /*tp_traverse*/ __pyx_tp_clear_4yarl_10_quoting_c__Unquoter, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_4yarl_10_quoting_c__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_10_quoting_c_9_Unquoter_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_4yarl_10_quoting_c__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 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 0, /*tp_pypy_flags*/ #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_c(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__quoting_c}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_quoting_c", 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_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_k_Incompatible_checksums_0x_x_vs_0_2, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_2), 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__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__14, __pyx_k__14, sizeof(__pyx_k__14), 0, 1, 0, 0}, {&__pyx_kp_u__15, __pyx_k__15, sizeof(__pyx_k__15), 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_n_s_ascii_letters, __pyx_k_ascii_letters, sizeof(__pyx_k_ascii_letters), 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_requote, __pyx_k_requote, sizeof(__pyx_k_requote), 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_c, __pyx_k_yarl__quoting_c, sizeof(__pyx_k_yarl__quoting_c), 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, 70, __pyx_L1_error) __pyx_builtin_chr = __Pyx_GetBuiltinName(__pyx_n_s_chr); if (!__pyx_builtin_chr) __PYX_ERR(0, 71, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 194, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 213, __pyx_L1_error) __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(0, 320, __pyx_L1_error) __pyx_builtin_hex = __Pyx_GetBuiltinName(__pyx_n_s_hex); if (!__pyx_builtin_hex) __PYX_ERR(0, 361, __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_c.pyx":194 * 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, 194, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "yarl/_quoting_c.pyx":213 * 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, 213, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); /* "yarl/_quoting_c.pyx":361 * 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, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_slice__8); __Pyx_GIVEREF(__pyx_slice__8); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xe91bd35, 0x60b2b56, 0x7e82961): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xe91bd35, 0x60b2b56, 0x7e82961) = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) */ __pyx_tuple__9 = PyTuple_Pack(3, __pyx_int_244432181, __pyx_int_101395286, __pyx_int_132655457); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); __pyx_tuple__10 = PyTuple_Pack(3, __pyx_int_41310077, __pyx_int_81650385, __pyx_int_87395286); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); /* "(tree fragment)":1 * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __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__Quoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_tuple__18 = 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__18)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Unquoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __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_41310077 = PyInt_FromLong(41310077L); if (unlikely(!__pyx_int_41310077)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_81650385 = PyInt_FromLong(81650385L); if (unlikely(!__pyx_int_81650385)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_87395286 = PyInt_FromLong(87395286L); if (unlikely(!__pyx_int_87395286)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_101395286 = PyInt_FromLong(101395286L); if (unlikely(!__pyx_int_101395286)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_132655457 = PyInt_FromLong(132655457L); if (unlikely(!__pyx_int_132655457)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_244432181 = PyInt_FromLong(244432181L); if (unlikely(!__pyx_int_244432181)) __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_10_quoting_c_GEN_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_SUB_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_RESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_UNRESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_ALLOWED = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_4yarl_10_quoting_c_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 int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __pyx_vtabptr_4yarl_10_quoting_c__Quoter = &__pyx_vtable_4yarl_10_quoting_c__Quoter; __pyx_vtable_4yarl_10_quoting_c__Quoter._do_quote = (PyObject *(*)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *, struct __pyx_t_4yarl_10_quoting_c_Writer *))__pyx_f_4yarl_10_quoting_c_7_Quoter__do_quote; __pyx_vtable_4yarl_10_quoting_c__Quoter._write = (int (*)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4))__pyx_f_4yarl_10_quoting_c_7_Quoter__write; if (PyType_Ready(&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_4yarl_10_quoting_c__Quoter.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_10_quoting_c__Quoter.tp_dictoffset && __pyx_type_4yarl_10_quoting_c__Quoter.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_4yarl_10_quoting_c__Quoter.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_4yarl_10_quoting_c__Quoter.tp_dict, __pyx_vtabptr_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Quoter, (PyObject *)&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error) __pyx_ptype_4yarl_10_quoting_c__Quoter = &__pyx_type_4yarl_10_quoting_c__Quoter; __pyx_vtabptr_4yarl_10_quoting_c__Unquoter = &__pyx_vtable_4yarl_10_quoting_c__Unquoter; __pyx_vtable_4yarl_10_quoting_c__Unquoter._do_unquote = (PyObject *(*)(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *))__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote; if (PyType_Ready(&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_4yarl_10_quoting_c__Unquoter.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_10_quoting_c__Unquoter.tp_dictoffset && __pyx_type_4yarl_10_quoting_c__Unquoter.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_4yarl_10_quoting_c__Unquoter.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_4yarl_10_quoting_c__Unquoter.tp_dict, __pyx_vtabptr_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Unquoter, (PyObject *)&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error) __pyx_ptype_4yarl_10_quoting_c__Unquoter = &__pyx_type_4yarl_10_quoting_c__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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_quoting_c(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_quoting_c(void) #else __Pyx_PyMODINIT_FUNC PyInit__quoting_c(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__quoting_c(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_c(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; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __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_c' 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_c(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(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #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_c", __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_c) { 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_c")) { if (unlikely(PyDict_SetItemString(modules, "yarl._quoting_c", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __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)) __PYX_ERR(0, 1, __pyx_L1_error) if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __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_c.pyx":9 * from libc.string cimport memcpy, memset * * from string import ascii_letters, digits # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __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, 9, __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, 9, __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, 9, __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, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_digits, __pyx_t_1) < 0) __PYX_ERR(0, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting_c.pyx":12 * * * cdef str GEN_DELIMS = ":/?#[]@" # <<<<<<<<<<<<<< * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' */ __Pyx_INCREF(__pyx_kp_u__11); __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_GEN_DELIMS); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_GEN_DELIMS, __pyx_kp_u__11); __Pyx_GIVEREF(__pyx_kp_u__11); /* "yarl/_quoting_c.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__12); __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__12); __Pyx_GIVEREF(__pyx_kp_u__12); /* "yarl/_quoting_c.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_10_quoting_c_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__13); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS, ((PyObject*)__pyx_t_2)); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting_c.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_10_quoting_c_GEN_DELIMS, __pyx_v_4yarl_10_quoting_c_SUB_DELIMS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_RESERVED); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_RESERVED, ((PyObject*)__pyx_t_2)); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; /* "yarl/_quoting_c.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__14); 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_10_quoting_c_UNRESERVED); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_UNRESERVED, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting_c.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_10_quoting_c_UNRESERVED, __pyx_v_4yarl_10_quoting_c_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_10_quoting_c_ALLOWED); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_ALLOWED, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting_c.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__15); __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_QS); __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_QS, __pyx_kp_u__15); __Pyx_GIVEREF(__pyx_kp_u__15); /* "yarl/_quoting_c.pyx":67 * * * memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) # <<<<<<<<<<<<<< * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) * */ (void)(memset(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE, 0, (sizeof(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE)))); /* "yarl/_quoting_c.pyx":68 * * 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_10_quoting_c_ALLOWED_NOTQS_TABLE, 0, (sizeof(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE)))); /* "yarl/_quoting_c.pyx":70 * 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, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 70, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "yarl/_quoting_c.pyx":71 * * 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, 71, __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, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v_4yarl_10_quoting_c_ALLOWED == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 71, __pyx_L1_error) } __pyx_t_5 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_3, __pyx_v_4yarl_10_quoting_c_ALLOWED, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 71, __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_c.pyx":72 * 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, 72, __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, 72, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE, __pyx_t_7); /* "yarl/_quoting_c.pyx":73 * 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, 73, __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, 73, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, __pyx_t_7); /* "yarl/_quoting_c.pyx":71 * * for i in range(128): * if chr(i) in ALLOWED: # <<<<<<<<<<<<<< * set_bit(ALLOWED_TABLE, i) * set_bit(ALLOWED_NOTQS_TABLE, i) */ } /* "yarl/_quoting_c.pyx":74 * 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, 74, __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, 74, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(__pyx_v_4yarl_10_quoting_c_QS == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 74, __pyx_L1_error) } __pyx_t_6 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_1, __pyx_v_4yarl_10_quoting_c_QS, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 74, __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_c.pyx":75 * 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, 75, __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, 75, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, __pyx_t_7); /* "yarl/_quoting_c.pyx":74 * 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_10_quoting_c_1__pyx_unpickle__Quoter, NULL, __pyx_n_s_yarl__quoting_c); 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._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3] * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter, NULL, __pyx_n_s_yarl__quoting_c); 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_c.pyx":1 * # cython: language_level=3 # <<<<<<<<<<<<<< * * from cpython.exc cimport PyErr_NoMemory */ __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_c", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init yarl._quoting_c"); } __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_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 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(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 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(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 = Py_TYPE(func)->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 (__Pyx_PyFastCFunction_Check(func)) { 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 /* GetItemIntUnicode */ static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i, int wraparound, int boundscheck) { Py_ssize_t length; if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return (Py_UCS4)-1; if (wraparound | boundscheck) { length = __Pyx_PyUnicode_GET_LENGTH(ustring); if (wraparound & unlikely(i < 0)) i += length; if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) { return __Pyx_PyUnicode_READ_CHAR(ustring, i); } else { PyErr_SetString(PyExc_IndexError, "string index out of range"); return (Py_UCS4)-1; } } else { return __Pyx_PyUnicode_READ_CHAR(ustring, i); } } /* 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 /* 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; if (stop <= start) return __Pyx_NewRef(__pyx_empty_unicode); #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 } /* 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; } /* 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 ((1) && (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; } /* PyObjectGetAttrStrNoError */ static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; } /* 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_getstate = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; PyObject *getstate = NULL; #if CYTHON_USE_PYTYPE_LOOKUP getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); #else getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); if (!getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (getstate) { #if CYTHON_USE_PYTYPE_LOOKUP object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); #else object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); if (!object_getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (object_getstate != getstate) { goto __PYX_GOOD; } } #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_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 __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_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_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); Py_XDECREF(object_getstate); Py_XDECREF(getstate); #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(CYTHON_NCP_UNUSED 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; (void) 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" #if PY_VERSION_HEX >= 0x030b00a6 #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 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); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif 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; PyObject *ptype, *pvalue, *ptraceback; 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) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __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;\ } /* PyUCS4InUnicode */ #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) #if PY_VERSION_HEX < 0x03090000 #define __Pyx_PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(op) #define __Pyx_PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(op) #else #define __Pyx_PyUnicode_AS_UNICODE(op) (((PyASCIIObject *)(op))->wstr) #define __Pyx_PyUnicode_GET_SIZE(op) ((PyCompactUnicodeObject *)(op))->wstr_length #endif #if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { Py_UNICODE high_val, low_val; Py_UNICODE* pos; high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1))); low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1))); for (pos=buffer; pos < buffer+length-1; pos++) { if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1; } return 0; } #endif static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { Py_UNICODE uchar; Py_UNICODE* pos; uchar = (Py_UNICODE) character; for (pos=buffer; pos < buffer+length; pos++) { if (unlikely(uchar == pos[0])) return 1; } return 0; } #endif static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { #if CYTHON_PEP393_ENABLED const int kind = PyUnicode_KIND(unicode); #ifdef PyUnicode_WCHAR_KIND if (likely(kind != PyUnicode_WCHAR_KIND)) #endif { Py_ssize_t i; const void* udata = PyUnicode_DATA(unicode); const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); for (i=0; i < length; i++) { if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1; } return 0; } #elif PY_VERSION_HEX >= 0x03090000 #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. #elif !defined(PyUnicode_AS_UNICODE) #error Cannot use "UChar in Unicode" in Python < 3.9 without Py_UNICODE support. #endif #if PY_VERSION_HEX < 0x03090000 || (defined(PyUnicode_WCHAR_KIND) && defined(PyUnicode_AS_UNICODE)) #if !defined(Py_UNICODE_SIZE) || Py_UNICODE_SIZE == 2 if ((sizeof(Py_UNICODE) == 2) && unlikely(character > 65535)) { return __Pyx_PyUnicodeBufferContainsUCS4_SP( __Pyx_PyUnicode_AS_UNICODE(unicode), __Pyx_PyUnicode_GET_SIZE(unicode), character); } else #endif { return __Pyx_PyUnicodeBufferContainsUCS4_BMP( __Pyx_PyUnicode_AS_UNICODE(unicode), __Pyx_PyUnicode_GET_SIZE(unicode), character); } #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; } /* CIntFromPy */ static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif 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) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif 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) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif 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; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= 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(int), little, !is_unsigned); } } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif 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); } } /* ObjectAsUCS4 */ static Py_UCS4 __Pyx__PyObject_AsPy_UCS4_raise_error(long ival) { if (ival < 0) { if (!PyErr_Occurred()) PyErr_SetString(PyExc_OverflowError, "cannot convert negative value to Py_UCS4"); } else { PyErr_SetString(PyExc_OverflowError, "value too large to convert to Py_UCS4"); } return (Py_UCS4)-1; } static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject* x) { long ival; ival = __Pyx_PyInt_As_long(x); if (unlikely(!__Pyx_is_valid_index(ival, 1114111 + 1))) { return __Pyx__PyObject_AsPy_UCS4_raise_error(ival); } return (Py_UCS4)ival; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif 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; i '9'); break; } if (rt_from_call[i] != ctversion[i]) { same = 0; break; } } if (!same) { char rtversion[5] = {'\0'}; char message[200]; for (i=0; i<4; ++i) { if (rt_from_call[i] == '.') { if (found_dot) break; found_dot = 1; } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { break; } rtversion[i] = rt_from_call[i]; } PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } /* InitStrings */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #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 Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(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 */ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/_quoting_c.pyi0000644000175100001720000000067700000000000017125 0ustar00runnerdocker00000000000000from typing import Optional class _Quoter: def __init__( self, *, safe: str = ..., protected: str = ..., qs: bool = ..., requote: bool = ... ) -> None: ... def __call__(self, val: Optional[str] = ...) -> Optional[str]: ... class _Unquoter: def __init__(self, *, unsafe: str = ..., qs: bool = ...) -> None: ... def __call__(self, val: Optional[str] = ...) -> Optional[str]: ... ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/_quoting_c.pyx0000644000175100001720000002635200000000000017142 0ustar00runnerdocker00000000000000# cython: language_level=3 from cpython.exc cimport PyErr_NoMemory from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc from cpython.unicode cimport PyUnicode_DecodeASCII, PyUnicode_DecodeUTF8Stateful from libc.stdint cimport uint8_t, uint64_t from libc.string cimport memcpy, memset 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 int _is_lower_hex(Py_UCS4 v): return 'a' <= v <= 'f' 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_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 bint _requote cdef uint8_t _safe_table[16] cdef uint8_t _protected_table[16] def __init__( self, *, str safe='', str protected='', bint qs=False, bint requote=True, ): cdef Py_UCS4 ch self._qs = qs self._requote = requote 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 changed cdef int idx = 0 cdef int length = len(val) while idx < length: ch = val[idx] idx += 1 if ch == '%' and self._requote and idx <= length - 2: ch = _restore_ch(val[idx], val[idx + 1]) if ch != -1: idx += 2 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 changed = (_is_lower_hex(val[idx - 2]) or _is_lower_hex(val[idx - 1])) if _write_pct(writer, ch, changed) < 0: raise continue else: ch = '%' 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 list ret = [] cdef char buffer[4] cdef Py_ssize_t buflen = 0 cdef Py_ssize_t consumed cdef str unquoted cdef Py_UCS4 ch = 0 cdef Py_ssize_t idx = 0 cdef Py_ssize_t length = len(val) cdef Py_ssize_t start_pct while idx < length: ch = val[idx] idx += 1 if ch == '%' and idx <= length - 2: ch = _restore_ch(val[idx], val[idx + 1]) if ch != -1: idx += 2 assert buflen < 4 buffer[buflen] = ch buflen += 1 try: unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, NULL, &consumed) except UnicodeDecodeError: start_pct = idx - buflen * 3 buffer[0] = ch buflen = 1 ret.append(val[start_pct : idx - 3]) try: unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, NULL, &consumed) except UnicodeDecodeError: buflen = 0 ret.append(val[idx - 3 : idx]) continue if not unquoted: assert consumed == 0 continue assert consumed == buflen buflen = 0 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) continue else: ch = '%' if buflen: start_pct = idx - 1 - buflen * 3 ret.append(val[start_pct : idx - 1]) buflen = 0 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 buflen: ret.append(val[length - buflen * 3 : length]) return ''.join(ret) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/_quoting_py.py0000644000175100001720000001434200000000000017154 0ustar00runnerdocker00000000000000import codecs import re from string import ascii_letters, ascii_lowercase, digits from typing import Optional, cast BASCII_LOWERCASE = ascii_lowercase.encode("ascii") BPCT_ALLOWED = {f"%{i:02X}".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]") _IS_HEX_STR = re.compile("[A-Fa-f0-9][A-Fa-f0-9]") utf8_decoder = codecs.getincrementaldecoder("utf-8") class _Quoter: def __init__( self, *, safe: str = "", protected: str = "", qs: bool = False, requote: bool = True, ) -> None: self._safe = safe self._protected = protected self._qs = qs self._requote = requote 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("%") and self._requote: 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((f"%{ch:02X}").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 "" decoder = cast(codecs.BufferedIncrementalDecoder, utf8_decoder()) ret = [] idx = 0 while idx < len(val): ch = val[idx] idx += 1 if ch == "%" and idx <= len(val) - 2: pct = val[idx : idx + 2] if _IS_HEX_STR.fullmatch(pct): b = bytes([int(pct, base=16)]) idx += 2 try: unquoted = decoder.decode(b) except UnicodeDecodeError: start_pct = idx - 3 - len(decoder.buffer) * 3 ret.append(val[start_pct : idx - 3]) decoder.reset() try: unquoted = decoder.decode(b) except UnicodeDecodeError: ret.append(val[idx - 3 : idx]) continue if not unquoted: continue 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) continue if decoder.buffer: start_pct = idx - 1 - len(decoder.buffer) * 3 ret.append(val[start_pct : idx - 1]) decoder.reset() 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 decoder.buffer: ret.append(val[-len(decoder.buffer) * 3 :]) ret2 = "".join(ret) if ret2 == val: return val return ret2 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/_url.py0000644000175100001720000010711200000000000015556 0ustar00runnerdocker00000000000000import functools import math import warnings from collections.abc import Mapping, Sequence from ipaddress import ip_address from urllib.parse import SplitResult, parse_qsl, quote, urljoin, urlsplit, urlunsplit import idna from multidict import MultiDict, MultiDictProxy from ._quoting import _Quoter, _Unquoter DEFAULT_PORTS = {"http": 80, "https": 443, "ws": 80, "wss": 443} sentinel = object() def rewrite_module(obj: object) -> object: obj.__module__ = "yarl" return obj 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") @rewrite_module 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(requote=False) _REQUOTER = _Quoter() _PATH_QUOTER = _Quoter(safe="@:", protected="/+", requote=False) _PATH_REQUOTER = _Quoter(safe="@:", protected="/+") _QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True, requote=False) _QUERY_REQUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True) _QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True, requote=False) _FRAGMENT_QUOTER = _Quoter(safe="?/:@", requote=False) _FRAGMENT_REQUOTER = _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, requote=True ) path = cls._PATH_REQUOTER(val[2]) if netloc: path = cls._normalize_path(path) cls._validate_authority_uri_abs_path(host=host, path=path) query = cls._QUERY_REQUOTER(val[3]) fragment = cls._FRAGMENT_REQUOTER(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="", authority="", user=None, password=None, host="", port=None, path="", query=None, query_string="", fragment="", encoded=False, ): """Creates and returns a new URL""" if authority and (user or password or host or port): raise ValueError( 'Can\'t mix "authority" with "user", "password", "host" or "port".' ) 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 ( scheme is None or authority is None or path is None or query_string is None or fragment is None ): raise TypeError( 'NoneType is illegal for "scheme", "authority", "path", ' '"query_string", and "fragment" args, use empty string instead.' ) if authority: if encoded: netloc = authority else: tmp = SplitResult("", authority, "", "", "") netloc = cls._make_netloc( tmp.username, tmp.password, tmp.hostname, tmp.port, encode=True ) elif not user and not password and not host and not port: netloc = "" else: netloc = cls._make_netloc( user, password, host, port, encode=not encoded, encode_host=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(f"Inheriting a class {cls!r} from URL is forbidden") 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 f"{self.__class__.__name__}('{str(self)}')" def __bytes__(self): return str(self).encode("ascii") 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( f"Appending path {name!r} starting from slash is forbidden" ) 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 __mod__(self, query): return self.update_query(query) 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) 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_authority(self): """Encoded authority part of URL. Empty string for relative URLs. """ return self._val.netloc @cached_property def authority(self): """Decoded authority part of URL. Empty string for relative URLs. """ return self._make_netloc( self.user, self.password, self.host, self.port, encode_host=False ) @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 return _idna_decode(raw) @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 f"{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 f"{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) @cached_property def raw_suffix(self): name = self.raw_name i = name.rfind(".") if 0 < i < len(name) - 1: return name[i:] else: return "" @cached_property def suffix(self): return self._UNQUOTER(self.raw_suffix) @cached_property def raw_suffixes(self): name = self.raw_name if name.endswith("."): return () name = name.lstrip(".") return tuple("." + suffix for suffix in name.split(".")[1:]) @cached_property def suffixes(self): return tuple(self._UNQUOTER(suffix) for suffix in self.raw_suffixes) @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) @classmethod def _encode_host(cls, host, human=False): try: ip, sep, zone = host.partition("%") ip = ip_address(ip) except ValueError: host = host.lower() # IDNA encoding is slow, # skip it for ASCII-only strings # Don't move the check into _idna_encode() helper # to reduce the cache size if human or host.isascii(): return host host = _idna_encode(host) 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=False, encode_host=True, requote=False ): quoter = cls._REQUOTER if requote else cls._QUOTER if encode_host: 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 = quoter(user) if encode: password = quoter(password) user = user + ":" + password elif user and encode: user = 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) ), 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) ), 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") val = self._val return URL( self._val._replace( netloc=self._make_netloc(val.username, val.password, host, val.port) ), 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(f"port should be int or None, got {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) ), 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) @classmethod def _query_seq_pairs(cls, quoter, pairs): for key, val in pairs: if isinstance(val, (list, tuple)): for v in val: yield quoter(key) + "=" + quoter(cls._query_var(v)) else: yield quoter(key) + "=" + quoter(cls._query_var(val)) @staticmethod def _query_var(v): cls = type(v) if issubclass(cls, str): return v if issubclass(cls, float): if math.isinf(v): raise ValueError("float('inf') is not supported") if math.isnan(v): raise ValueError("float('nan') is not supported") return str(float(v)) if issubclass(cls, int) and cls is not bool: return str(int(v)) raise TypeError( "Invalid variable type: value " "should be str, int or float, got {!r} " "of type {}".format(v, cls) ) 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(self._query_seq_pairs(quoter, 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 # We don't expect sequence values if we're given a list of pairs # already; only mappings like builtin `dict` which can't have the # same key pointing to multiple values are allowed to use # `_query_seq_pairs`. 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 (key, value) 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 with_suffix(self, suffix): """Return a new URL with suffix (file extension of name) replaced. Query and fragment parts are cleaned up. suffix is encoded if needed. """ if not isinstance(suffix, str): raise TypeError("Invalid suffix type") if suffix and not suffix.startswith(".") or suffix == ".": raise ValueError(f"Invalid suffix {suffix!r}") name = self.raw_name if not name: raise ValueError(f"{self!r} has an empty name") old_suffix = self.raw_suffix if not old_suffix: name = name + suffix else: name = name[: -len(old_suffix)] + suffix return self.with_name(name) 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.""" user = _human_quote(self.user, "#/:?@") password = _human_quote(self.password, "#/:?@") host = self.host if host: host = self._encode_host(self.host, human=True) path = _human_quote(self.path, "#?") query_string = "&".join( "{}={}".format(_human_quote(k, "#&+;="), _human_quote(v, "#&+;=")) for k, v in self.query.items() ) fragment = _human_quote(self.fragment, "") return urlunsplit( SplitResult( self.scheme, self._make_netloc( user, password, host, self._val.port, encode_host=False, ), path, query_string, fragment, ) ) def _human_quote(s, unsafe): if not s: return s for c in "%" + unsafe: if c in s: s = s.replace(c, f"%{ord(c):02X}") if s.isprintable(): return s return "".join(c if c.isprintable() else quote(c) for c in s) _MAXCACHE = 256 @functools.lru_cache(_MAXCACHE) def _idna_decode(raw): try: return idna.decode(raw.encode("ascii")) except UnicodeError: # e.g. '::1' return raw.encode("ascii").decode("idna") @functools.lru_cache(_MAXCACHE) def _idna_encode(host): try: return idna.encode(host, uts46=True).decode("ascii") except UnicodeError: return host.encode("idna").decode("ascii") @rewrite_module def cache_clear(): _idna_decode.cache_clear() _idna_encode.cache_clear() @rewrite_module def cache_info(): return { "idna_encode": _idna_encode.cache_info(), "idna_decode": _idna_decode.cache_info(), } @rewrite_module def cache_configure(*, idna_encode_size=_MAXCACHE, idna_decode_size=_MAXCACHE): global _idna_decode, _idna_encode _idna_encode = functools.lru_cache(idna_encode_size)(_idna_encode.__wrapped__) _idna_decode = functools.lru_cache(idna_decode_size)(_idna_decode.__wrapped__) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036862.0 yarl-1.8.2/yarl/py.typed0000644000175100001720000000001600000000000015735 0ustar00runnerdocker00000000000000# Placeholder ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1670036873.6827455 yarl-1.8.2/yarl.egg-info/0000755000175100001720000000000000000000000015733 5ustar00runnerdocker00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl.egg-info/PKG-INFO0000644000175100001720000005124000000000000017032 0ustar00runnerdocker00000000000000Metadata-Version: 2.1 Name: yarl Version: 1.8.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 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.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.7 Description-Content-Type: text/x-rst License-File: LICENSE yarl ==== .. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI :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``: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url = URL('https://www.python.org') >>> url / 'foo' / 'bar' URL('https://www.python.org/foo/bar') >>> url / 'foo' % {'bar': 'baz'} URL('https://www.python.org/foo?bar=baz') Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result: .. code-block:: pycon >>> 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: .. code-block:: pycon >>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C' Human readable representation of URL is available as ``.human_repr()``: .. code-block:: pycon >>> 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! PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install ``yarl`` on another operating system (like *Alpine Linux*, which is not manylinux-compliant because of the missing glibc and therefore, cannot be used with our wheels) the the tarball will be used to compile the library from the source code. It requires a C compiler and and Python headers installed. To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS` environment variable to a non-empty value, e.g.: .. code-block:: bash $ YARL_NO_EXTENSIONS=1 pip install yarl Please note that the pure-Python (uncompiled) version is much slower. However, PyPy always uses a pure-Python implementation, and, as such, it is unaffected by this variable. Dependencies ------------ YARL requires multidict_ library. API documentation ------------------ The documentation is located at https://yarl.readthedocs.org Why isn't boolean supported by the URL query API? ------------------------------------------------- There is no standard for boolean representation of boolean values. Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``, ``Y``/``N``, ``1``/``0``, etc. ``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because it is specific to how the end-user's application is built and would be different for different apps. The library doesn't accept booleans in the API; a user should convert bools into strings using own preferred translation protocol. 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.8.2 (2022-12-03) ================== This is the first release that started shipping wheels for Python 3.11. 1.8.1 (2022-08-01) ================== Misc ---- - `#694 `_, `#699 `_, `#700 `_, `#701 `_, `#702 `_, `#703 `_, `#739 `_ 1.8.0 (2022-08-01) ================== Features -------- - Added ``URL.raw_suffix``, ``URL.suffix``, ``URL.raw_suffixes``, ``URL.suffixes``, ``URL.with_suffix``. (`#613 `_) Improved Documentation ---------------------- - Fixed broken internal references to ``(?P=rendered_text)``. (`#665 `_) - Fixed broken external references to ``(?P=rendered_text)`` docs. (`#665 `_) Deprecations and Removals ------------------------- - Dropped Python 3.6 support. (`#672 `_) Misc ---- - `#646 `_, `#699 `_, `#701 `_ 1.7.2 (2021-11-01) ================== Bugfixes -------- - Changed call in ``with_port()`` to stop reencoding parts of the URL that were already encoded. (`#623 `_) 1.7.1 (2021-10-07) ================== Bugfixes -------- - Fix 1.7.0 build error 1.7.0 (2021-10-06) ================== Features -------- - Add `__bytes__()` magic method so that `bytes(url)` will work and use optimal ASCII encoding. (`#582 `_) - Started shipping platform-specific arm64 wheels for Apple Silicon. (`#622 `_) - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. (`#622 `_) - Added support for Python 3.10. (`#622 `_) 1.6.3 (2020-11-14) ================== Bugfixes -------- - No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved. `#517 `_ - Provide x86 Windows wheels. `#535 `_ ---- 1.6.2 (2020-10-12) ================== Bugfixes -------- - Provide generated ``.c`` files in TarBall distribution. `#530 `_ 1.6.1 (2020-10-12) ================== Features -------- - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on Linux as well as ``x86_64``. `#507 `_ - Provide wheels for Python 3.9. `#526 `_ Bugfixes -------- - ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid). `#511 `_ - Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation. `#514 `_ - Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits. `#516 `_ - Fix decoding ``%`` followed by a space and hexadecimal digit. `#520 `_ - Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case. `#528 `_ Removal ------- - Drop Python 3.5 support; Python 3.6 is the minimal supported Python version. ---- 1.6.0 (2020-09-23) ================== Features -------- - Allow for int and float subclasses in query, while still denying bool. `#492 `_ Bugfixes -------- - Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator. `#502 `_ - Keep IPv6 brackets in ``origin()``. `#504 `_ ---- 1.5.1 (2020-08-01) ================== Bugfixes -------- - Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists. `#485 `_ Misc ---- - `#484 `_ ---- 1.5.0 (2020-07-26) ================== Features -------- - Convert host to lowercase on URL building. `#386 `_ - Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method). `#435 `_ - Allow use of sequences such as ``list`` and ``tuple`` in the values of a mapping such as ``dict`` to represent that a key has many values:: url = URL("http://example.com") assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2") `#443 `_ - Support URL.build() with scheme and path (creates a relative URL). `#464 `_ - Cache slow IDNA encode/decode calls. `#476 `_ - Add ``@final`` / ``Final`` type hints `#477 `_ - Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method. `#478 `_ - Hide the library implementation details, make the exposed public list very clean. `#483 `_ Bugfixes -------- - Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+). `#409 `_ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way. `#426 `_ - Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore. `#431 `_ - Keep ipv6 brackets after updating port/user/password. `#451 `_ ---- 1.4.2 (2019-12-05) ================== Features -------- - Workaround for missing `str.isascii()` in Python 3.6 `#389 `_ ---- 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 can't 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 empty 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. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl.egg-info/SOURCES.txt0000644000175100001720000000150200000000000017615 0ustar00runnerdocker00000000000000CHANGES.rst LICENSE MANIFEST.in README.rst pyproject.toml 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 tests/test_cache.py 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.py yarl/_quoting_c.c yarl/_quoting_c.pyi yarl/_quoting_c.pyx yarl/_quoting_py.py yarl/_url.py yarl/py.typed 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.txt././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl.egg-info/dependency_links.txt0000644000175100001720000000000100000000000022001 0ustar00runnerdocker00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl.egg-info/requires.txt0000644000175100001720000000011500000000000020330 0ustar00runnerdocker00000000000000multidict>=4.0 idna>=2.0 [:python_version < "3.8"] typing-extensions>=3.7.4 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1670036873.0 yarl-1.8.2/yarl.egg-info/top_level.txt0000644000175100001720000000000500000000000020460 0ustar00runnerdocker00000000000000yarl