Accepting request 939980 from home:bnavigator:branches:devel:languages:python

update (for python310)

OBS-URL: https://build.opensuse.org/request/show/939980
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-aiohttp?expand=0&rev=73
This commit is contained in:
Dirk Mueller 2021-12-13 18:46:07 +00:00 committed by Git OBS Bridge
parent 18ac096873
commit 9aed91572f
8 changed files with 229 additions and 279 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de
size 1114533

3
aiohttp-3.8.1.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578
size 7324180

View File

@ -1,93 +0,0 @@
From d0453ed56820e32802be743bf7a7b7027f9c9589 Mon Sep 17 00:00:00 2001
From: Sam Bull <aa6bs0@sambull.org>
Date: Sat, 14 Nov 2020 15:24:43 +0000
Subject: [PATCH 1/7] Backport fix for setting cookies
---
CHANGES/5233.bugfix | 1 +
aiohttp/web_protocol.py | 21 ++++++++++-----------
tests/test_web_exceptions.py | 28 ++++++++++++++++++++++++++++
3 files changed, 39 insertions(+), 11 deletions(-)
--- /dev/null
+++ b/CHANGES/5233.bugfix
@@ -0,0 +1 @@
+Fix cookies disappearing from HTTPExceptions.
--- a/aiohttp/web_protocol.py
+++ b/aiohttp/web_protocol.py
@@ -423,9 +423,7 @@ class RequestHandler(BaseProtocol):
finally:
self._current_request = None
except HTTPException as exc:
- resp = Response(
- status=exc.status, reason=exc.reason, text=exc.text, headers=exc.headers
- )
+ resp = exc
reset = await self.finish_response(request, resp, start_time)
except asyncio.CancelledError:
raise
@@ -437,6 +435,15 @@ class RequestHandler(BaseProtocol):
resp = self.handle_error(request, 500, exc)
reset = await self.finish_response(request, resp, start_time)
else:
+ # Deprecation warning (See #2415)
+ if getattr(resp, "__http_exception__", False):
+ warnings.warn(
+ "returning HTTPException object is deprecated "
+ "(#2415) and will be removed, "
+ "please raise the exception instead",
+ DeprecationWarning,
+ )
+
reset = await self.finish_response(request, resp, start_time)
return resp, reset
@@ -486,14 +493,6 @@ class RequestHandler(BaseProtocol):
except (asyncio.CancelledError, ConnectionError):
self.log_debug("Ignored premature client disconnection")
break
- # Deprecation warning (See #2415)
- if getattr(resp, "__http_exception__", False):
- warnings.warn(
- "returning HTTPException object is deprecated "
- "(#2415) and will be removed, "
- "please raise the exception instead",
- DeprecationWarning,
- )
# Drop the processed task from asyncio.Task.all_tasks() early
del task
--- a/tests/test_web_exceptions.py
+++ b/tests/test_web_exceptions.py
@@ -203,3 +203,31 @@ def test_HTTPException_retains_cause() -
tb = "".join(format_exception(ei.type, ei.value, ei.tb))
assert "CustomException" in tb
assert "direct cause" in tb
+
+
+async def test_HTTPException_retains_cookie(aiohttp_client):
+ @web.middleware
+ async def middleware(request, handler):
+ try:
+ return await handler(request)
+ except web.HTTPException as exc:
+ exc.set_cookie("foo", request["foo"])
+ raise exc
+
+ async def save(request):
+ request["foo"] = "works"
+ raise web.HTTPFound("/show")
+
+ async def show(request):
+ return web.Response(text=request.cookies["foo"])
+
+ app = web.Application(middlewares=[middleware])
+ app.router.add_route("GET", "/save", save)
+ app.router.add_route("GET", "/show", show)
+ client = await aiohttp_client(app)
+
+ resp = await client.get("/save")
+ assert resp.status == 200
+ assert str(resp.url)[-5:] == "/show"
+ text = await resp.text()
+ assert text == "works"

View File

@ -1,3 +1,192 @@
-------------------------------------------------------------------
Sat Dec 11 19:18:47 UTC 2021 - Ben Greiner <code@bnavigator.de>
- Update to version 3.8.1
* Bugfixes
* Fix the error in handling the return value of getaddrinfo.
getaddrinfo will return an (int, bytes) tuple, if CPython could
not handle the address family. It will cause a index out of
range error in aiohttp. For example, if user compile CPython
with --disable-ipv6 option but his system enable the ipv6.
#5901
* Do not install "examples" as a top-level package. #6189
* Restored ability to connect IPv6-only host. #6195
* Remove Signal from __all__, replace aiohttp.Signal with
aiosignal.Signal in docs #6201
* Made chunked encoding HTTP header check stricter. #6305
* Improved Documentation
* update quick starter demo codes. #6240
* Added an explanation of how tiny timeouts affect performance to
the client reference document. #6274
* Add flake8-docstrings to flake8 configuration, enable subset of
checks. #6276
* Added information on running complex applications with
additional tasks/processes -- :user:`Dreamsorcerer`. #6278
- Release 3.8.0 (2021-10-31)
* Features
* Added a GunicornWebWorker feature for extending the aiohttp
server configuration by allowing the 'wsgi' coroutine to return
web.AppRunner object. #2988
* Switch from http-parser to llhttp #3561
* Use Brotli instead of brotlipy #3803
* Disable implicit switch-back to pure python mode. The build
fails loudly if aiohttp cannot be compiled with C Accelerators.
Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions
complication and switch to Pure-Python mode. Note that
Pure-Python mode is significantly slower than compiled one.
#3828
* Make access log use local time with timezone #3853
* Implemented readuntil in StreamResponse #4054
* FileResponse now supports ETag. #4594
* Add a request handler type alias aiohttp.typedefs.Handler.
#4686
* AioHTTPTestCase is more async friendly now.
* For people who use unittest and are used to use
:py:exc:`~unittest.TestCase` it will be easier to write new
test cases like the sync version of the
:py:exc:`~unittest.TestCase` class, without using the decorator
@unittest_run_loop, just async def test_*. The only difference
is that for the people using python3.7 and below a new
dependency is needed, it is asynctestcase. #4700
* Add validation of HTTP header keys and values to prevent header
injection. #4818
* Add predicate to AbstractCookieJar.clear. Add
AbstractCookieJar.clear_domain to clean all domain and
subdomains cookies only. #4942
* Add keepalive_timeout parameter to web.run_app. #5094
* Tracing for client sent headers #5105
* Make type hints for http parser stricter #5267
* Add final declarations for constants. #5275
* Switch to external frozenlist and aiosignal libraries. #5293
* Don't send secure cookies by insecure transports.
* By default, the transport is secure if https or wss scheme is
used. Use CookieJar(treat_as_secure_origin="http://127.0.0.1")
to override the default security checker. #5571
* Always create a new event loop in aiohttp.web.run_app(). This
adds better compatibility with asyncio.run() or if trying to
run multiple apps in sequence. #5572
* Add aiohttp.pytest_plugin.AiohttpClient for static typing of
pytest plugin. #5585
* Added a socket_factory argument to BaseTestServer. #5844
* Add compression strategy parameter to enable_compression
method. #5909
* Added support for Python 3.10 to Github Actions CI/CD workflows
and fix the related deprecation warnings -- :user:`Hanaasagi`.
#5927
* Switched chardet to charset-normalizer for guessing the HTTP
payload body encoding -- :user:`Ousret`. #5930
* Added optional auto_decompress argument for HttpRequestParser
#5957
* Added support for HTTPS proxies to the extent CPython's
:py:mod:`asyncio` supports it -- by :user:`bmbouter`,
:user:`jborean93` and :user:`webknjaz`. #5992
* Added base_url parameter to the initializer of
:class:`~aiohttp.ClientSession`. #6013
* Add Trove classifier and create binary wheels for 3.10. --
:user:`hugovk`. #6079
* Started shipping platform-specific wheels with the musl tag
targeting typical Alpine Linux runtimes — :user:`asvetlov`.
#6139
* Started shipping platform-specific arm64 wheels for Apple
Silicon — :user:`asvetlov`. #6139
* Bugfixes
* Modify _drain_helper() to handle concurrent await
resp.write(...) or ws.send_json(...) calls without
race-condition. #2934
* Started using MultiLoopChildWatcher when it's available under
POSIX while setting up the test I/O loop. #3450
* Only encode content-disposition filename parameter using
percent-encoding. Other parameters are encoded to quoted-string
or RFC2231 extended parameter value. #4012
* Fixed HTTP client requests to honor no_proxy environment
variables. #4431
* Fix supporting WebSockets proxies configured via environment
variables. #4648
* Change return type on URLDispatcher to UrlMappingMatchInfo to
improve type annotations. #4748
* Ensure a cleanup context is cleaned up even when an exception
occurs during startup. #4799
* Added a new exception type for Unix socket client errors which
provides a more useful error message. #4984
* Remove Transfer-Encoding and Content-Type headers for 204 in
StreamResponse #5106
* Only depend on typing_extensions for Python <3.8 #5107
* Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode #5192
* Fix cookies disappearing from HTTPExceptions. #5233
* StaticResource prefixes no longer match URLs with a non-folder
prefix. For example routes.static('/foo', '/foo') no longer
matches the URL /foobar. Previously, this would attempt to load
the file /foo/ar. #5250
* Acquire the connection before running traces to prevent race
condition. #5259
* Add missing slots to `_RequestContextManager and
_WSRequestContextManager #5329
* Ensure sending a zero byte file does not throw an exception
(round 2) #5380
* Set "text/plain" when data is an empty string in client
requests. #5392
* Stop automatically releasing the ClientResponse object on calls
to the ok property for the failed requests. #5403
* Include query parameters from params keyword argument in
tracing URL. #5432
* Fix annotations #5466
* Fixed the multipart POST requests processing to always release
file descriptors for the tempfile.Temporaryfile-created
_io.BufferedRandom instances of files sent within multipart
request bodies via HTTP POST requests -- by :user:`webknjaz`.
#5494
* Fix 0 being incorrectly treated as an immediate timeout. #5527
* Fixes failing tests when an environment variable <scheme>_proxy
is set. #5554
* Replace deprecated app handler design in
tests/autobahn/server.py with call to web.run_app; replace
deprecated aiohttp.ws_connect calls in tests/autobahn/client.py
with aiohttp.ClienSession.ws_connect. #5606
* Fixed test for HTTPUnauthorized that access the text argument.
This is not used in any part of the code, so it's removed now.
#5657
* Remove incorrect default from docs #5727
* Remove external test dependency to http://httpbin.org #5840
* Don't cancel current task when entering a cancelled timer.
#5853
* Added params keyword argument to ClientSession.ws_connect. --
:user:`hoh`. #5868
* Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to
allow setting up test loop in non-main thread. #5877
* Fix the error in handling the return value of getaddrinfo.
getaddrinfo will return an (int, bytes) tuple, if CPython could
not handle the address family. It will cause a index out of
range error in aiohttp. For example, if user compile CPython
with --disable-ipv6 option but his system enable the ipv6.
#5901
* Removed the deprecated loop argument from the
asyncio.sleep/gather calls #5905
* Return None from request.if_modified_since,
request.if_unmodified_since, request.if_range and
response.last_modified when corresponding http date headers are
invalid. #5925
* Fix resetting SIGCHLD signals in Gunicorn aiohttp Worker to fix
subprocesses that capture output having an incorrect
returncode. #6130
* Raise 400: Content-Length can't be present with
Transfer-Encoding if both Content-Length and Transfer-Encoding
are sent by peer by both C and Python implementations #6182
* Improved Documentation
* Refactored OpenAPI/Swagger aiohttp addons, added aio-openapi
#5326
* Fixed docs on request cookies type, so it matches what is
actually used in the code (a read-only dictionary-like object).
#5725
* Documented that the HTTP client Authorization header is removed
on redirects to a different host or protocol. #5850
- Drop patches
* backport_fix_for_setting_cookies.patch
* remove_deprecated_loop_argument.patch
* stdlib-typing_extensions.patch
* unbundle-http-parser.patch -- replaced by llhttp, nothing else
than the bundled llhttp available.
- Disable building the docs (no sphinxcontrib-towncrier)
-------------------------------------------------------------------
Wed Nov 24 00:38:26 UTC 2021 - Steve Kowalik <steven.kowalik@suse.com>

View File

@ -18,66 +18,62 @@
%{?!python_module:%define python_module() python3-%{**}}
%define skip_python2 1
# requires some unavailable modules
%bcond_with docs
Name: python-aiohttp
Version: 3.7.4
Version: 3.8.1
Release: 0
Summary: Asynchronous HTTP client/server framework
License: Apache-2.0
URL: https://github.com/aio-libs/aiohttp
Source: https://files.pythonhosted.org/packages/source/a/aiohttp/aiohttp-%{version}.tar.gz
Patch0: unbundle-http-parser.patch
# PATCH-FIX-UPSTREAM stdlib-typing_extensions.patch gh#aio-libs/aiohttp#5374 mcepl@suse.com
# Fix typing_extensions imports.
Patch1: stdlib-typing_extensions.patch
# PATCH-FIX-UPSTREAM remove_deprecated_loop_argument.patch gh#aio-libs/aiohttp#5991 mcepl@suse.com
# remove deprecated loop argument
Patch3: remove_deprecated_loop_argument.patch
# PATCH-FIX-UPSTREAM backport_fix_for_setting_cookies.patch gh#aio-libs/aiohttp#5233 mcepl@suse.com
# backport of fixes from 3.8 branch
Patch4: backport_fix_for_setting_cookies.patch
BuildRequires: %{python_module Cython}
BuildRequires: %{python_module async_timeout >= 3.0}
BuildRequires: %{python_module aiosignal >= 1.1.2}
BuildRequires: %{python_module async_timeout >= 4.0}
BuildRequires: %{python_module asynctest = 0.13.0 if %python-base < 3.8}
BuildRequires: %{python_module attrs >= 17.3.0}
BuildRequires: %{python_module chardet >= 2.0}
BuildRequires: %{python_module devel >= 3.5.3}
BuildRequires: %{python_module freezegun}
BuildRequires: %{python_module idna_ssl >= 1.0}
BuildRequires: %{python_module charset-normalizer >= 2.0}
BuildRequires: %{python_module devel >= 3.6}
BuildRequires: %{python_module frozenlist >= 1.1.1}
BuildRequires: %{python_module idna_ssl >= 1.0 if %python-base < 3.7}
BuildRequires: %{python_module multidict >= 4.5}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module typing_extensions >= 3.6.5 if %python-base < 3.8}
BuildRequires: %{python_module typing_extensions >= 3.7.4 if %python-base < 3.8}
BuildRequires: %{python_module yarl >= 1.0}
BuildRequires: fdupes
BuildRequires: http-parser-devel
BuildRequires: python-rpm-macros
Requires: python >= 3.6
Requires: python-async_timeout >= 3.0
Requires: python-aiosignal >= 1.1.2
Requires: python-async_timeout >= 4.0
Requires: python-attrs >= 17.3.0
Requires: python-chardet >= 2.0
Requires: python-gunicorn
Requires: python-charset-normalizer >= 2.0
Requires: python-frozenlist >= 1.1.1
Requires: python-multidict >= 4.5
Requires: python-yarl >= 1.0
Requires: (python3-typing_extensions >= 3.6.5 if python3-base < 3.8)
Requires: (python-asynctest = 0.13.0 if python-base < 3.8)
Requires: (python-idna_ssl >= 1.0 if python-base < 3.7)
Requires: (python-typing_extensions >= 3.7.4 if python-base < 3.8)
Recommends: python-aiodns
Recommends: python-brotlipy
Recommends: python-cChardet
Suggests: %{name}-doc
%if 0%{?suse_version} < 1550 || "%{python_flavor}" == "python36"
Requires: python-idna_ssl >= 1.0
%endif
# SECTION test requirements
BuildRequires: %{python_module aiodns}
BuildRequires: %{python_module async_generator}
BuildRequires: %{python_module brotlipy}
BuildRequires: %{python_module freezegun}
BuildRequires: %{python_module gunicorn}
BuildRequires: %{python_module pluggy}
BuildRequires: %{python_module proxy.py}
BuildRequires: %{python_module pytest-mock}
BuildRequires: %{python_module pytest-timeout}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module re-assert}
BuildRequires: %{python_module trustme}
# /SECTION
# SECTION docs
%if %{with docs}
BuildRequires: %{python_module MarkupSafe}
BuildRequires: python3-Pygments >= 2.1
BuildRequires: python3-Sphinx
@ -85,6 +81,8 @@ BuildRequires: python3-aiohttp-theme
BuildRequires: python3-sphinxcontrib-asyncio
BuildRequires: python3-sphinxcontrib-blockdiag
BuildRequires: python3-sphinxcontrib-newsfeed
BuildRequires: python3-sphinxcontrib-towncrier
%endif
# /SECTION
%python_subpackages
@ -104,20 +102,18 @@ HTML documentation on the API and examples for %{name}.
%prep
%autosetup -p1 -n aiohttp-%{version}
# Prevent building with vendor version
rm vendor/http-parser/*.c
# Allow use with chardet v4
# https://github.com/aio-libs/aiohttp/pull/5333
sed -i 's/chardet>=2.0,<4.0/chardet>=2.0/' setup.py
# don't check coverage
sed -i '/--cov/d' setup.cfg
%build
export CFLAGS="%{optflags}"
%python_build
%if %{with docs}
pushd docs
%make_build html
rm _build/html/.buildinfo
popd
%endif
%install
%python_install
@ -127,16 +123,16 @@ rm -r %{buildroot}%{$python_sitearch}/aiohttp/.hash
}
%check
# ignore setup.cfg
touch pytest.ini
%define skiptest_allflavors test_aiohttp_request_coroutine or test_mark_formdata_as_processed or test_aiohttp_plugin_async
# we need it to be defined for all flavors for expansion inside pytest_arch to work. %%{?...} would expand too early.
%{lua: for p in string.gmatch(rpm.expand("%pythons"), "%S+") do rpm.define("skiptest_" .. p .. "_only %{nil}") end}
donttest="test_aiohttp_request_coroutine or test_mark_formdata_as_processed or test_aiohttp_plugin_async"
python36_donttest=" or test_read_boundary_with_incomplete_chunk"
# no name resolution
donttest+=" or test_client_session_timeout_zero or test_requote_redirect_url_default"
# flaky
donttest+=" or test_https_proxy_unsupported_tls_in_tls"
%if 0%{?python3_version_nodots} == 36
%define skiptest_python3_only or test_read_boundary_with_incomplete_chunk
donttest+="$python36_donttest"
%endif
%define skiptest_python36_only or test_read_boundary_with_incomplete_chunk
%pytest_arch --ignore ./aiohttp -rs -k 'not (%{skiptest_allflavors} %{skiptest_$python_only})'
%pytest_arch --ignore ./aiohttp -rsEf -k "not ($donttest ${$python_donttest})"
%files %{python_files}
%license LICENSE.txt
@ -144,7 +140,9 @@ touch pytest.ini
%{python_sitearch}/aiohttp
%{python_sitearch}/aiohttp-%{version}*-info
%if %{with docs}
%files -n %{name}-doc
%doc docs/_build/html
%endif
%changelog

View File

@ -1,59 +0,0 @@
From dd3a89130b5769218550159ebbab9e28d8b974a3 Mon Sep 17 00:00:00 2001
From: Hanaasagi <ambiguous404@gmail.com>
Date: Tue, 3 Aug 2021 11:53:45 +0000
Subject: [PATCH] fix: remove deprecated loop argument for asnycio.sleep/gather
calls
---
CHANGES/5905.bugfix | 1 +
aiohttp/web.py | 4 +---
tests/test_locks.py | 6 +++---
3 files changed, 5 insertions(+), 6 deletions(-)
create mode 100644 CHANGES/5905.bugfix
--- /dev/null
+++ b/CHANGES/5905.bugfix
@@ -0,0 +1 @@
+remove deprecated loop argument for asnycio.sleep/gather calls
--- a/aiohttp/web.py
+++ b/aiohttp/web.py
@@ -440,9 +440,7 @@ def _cancel_tasks(
for task in to_cancel:
task.cancel()
- loop.run_until_complete(
- asyncio.gather(*to_cancel, loop=loop, return_exceptions=True)
- )
+ loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True))
for task in to_cancel:
if task.cancelled():
--- a/tests/test_locks.py
+++ b/tests/test_locks.py
@@ -18,7 +18,7 @@ class TestEventResultOrError:
return 1
t = loop.create_task(c())
- await asyncio.sleep(0, loop=loop)
+ await asyncio.sleep(0)
e = Exception()
ev.set(exc=e)
assert (await t) == e
@@ -31,7 +31,7 @@ class TestEventResultOrError:
return 1
t = loop.create_task(c())
- await asyncio.sleep(0, loop=loop)
+ await asyncio.sleep(0)
ev.set()
assert (await t) == 1
@@ -43,7 +43,7 @@ class TestEventResultOrError:
t1 = loop.create_task(c())
t2 = loop.create_task(c())
- await asyncio.sleep(0, loop=loop)
+ await asyncio.sleep(0)
ev.cancel()
ev.set()

View File

@ -1,60 +0,0 @@
---
aiohttp/helpers.py | 5 ++++-
aiohttp/tracing.py | 5 ++++-
aiohttp/web_urldispatcher.py | 5 ++++-
setup.py | 2 +-
4 files changed, 13 insertions(+), 4 deletions(-)
--- a/aiohttp/helpers.py
+++ b/aiohttp/helpers.py
@@ -45,7 +45,10 @@ from urllib.request import getproxies
import async_timeout
import attr
from multidict import MultiDict, MultiDictProxy
-from typing_extensions import Protocol
+try:
+ from typing import Protocol
+except (ImportError, ModuleNotFoundError):
+ from typing_extensions import Protocol
from yarl import URL
from . import hdrs
--- a/aiohttp/tracing.py
+++ b/aiohttp/tracing.py
@@ -9,7 +9,10 @@ from .client_reqrep import ClientRespons
from .signals import Signal
if TYPE_CHECKING: # pragma: no cover
- from typing_extensions import Protocol
+ try:
+ from typing import Protocol
+ except (ImportError, ModuleNotFoundError):
+ from typing_extensions import Protocol
from .client import ClientSession
--- a/aiohttp/web_urldispatcher.py
+++ b/aiohttp/web_urldispatcher.py
@@ -33,7 +33,10 @@ from typing import (
cast,
)
-from typing_extensions import TypedDict
+try:
+ from typing import TypedDict
+except (ImportError, ModuleNotFoundError):
+ from typing_extensions import TypedDict
from yarl import URL, __version__ as yarl_version # type: ignore
from . import hdrs
--- a/setup.py
+++ b/setup.py
@@ -70,7 +70,7 @@ install_requires = [
"async_timeout>=3.0,<4.0",
"yarl>=1.0,<2.0",
'idna-ssl>=1.0; python_version<"3.7"',
- "typing_extensions>=3.6.5",
+ 'typing_extensions>=3.7.4; python_version<"3.8"',
]

View File

@ -1,25 +0,0 @@
Index: aiohttp-3.7.2/aiohttp/_cparser.pxd
===================================================================
--- aiohttp-3.7.2.orig/aiohttp/_cparser.pxd
+++ aiohttp-3.7.2/aiohttp/_cparser.pxd
@@ -1,7 +1,7 @@
from libc.stdint cimport uint16_t, uint32_t, uint64_t
-cdef extern from "../vendor/http-parser/http_parser.h":
+cdef extern from "http_parser.h":
ctypedef int (*http_data_cb) (http_parser*,
const char *at,
size_t length) except -1
Index: aiohttp-3.7.2/setup.py
===================================================================
--- aiohttp-3.7.2.orig/setup.py
+++ aiohttp-3.7.2/setup.py
@@ -27,7 +27,6 @@ extensions = [
"aiohttp._http_parser",
[
"aiohttp/_http_parser.c",
- "vendor/http-parser/http_parser.c",
"aiohttp/_find_header.c",
],
define_macros=[("HTTP_PARSER_STRICT", 0)],