mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2024-12-22 14:35:00 +01:00
Drop Support for ujson
(#3037)
This commit is contained in:
parent
d2cabcaa74
commit
ca4e4c6280
15 changed files with 13 additions and 91 deletions
|
@ -137,7 +137,6 @@ Optional Dependencies
|
||||||
PTB can be installed with optional dependencies:
|
PTB can be installed with optional dependencies:
|
||||||
|
|
||||||
* ``pip install python-telegram-bot[passport]`` installs the `cryptography>=3.0 <https://cryptography.io>`_ library. Use this, if you want to use Telegram Passport related functionality.
|
* ``pip install python-telegram-bot[passport]`` installs the `cryptography>=3.0 <https://cryptography.io>`_ library. Use this, if you want to use Telegram Passport related functionality.
|
||||||
* ``pip install python-telegram-bot[json]`` installs the `ujson>=4.0.0 <https://pypi.org/project/ujson/>`_ library. It will then be used for JSON de- & encoding, which can bring speed up compared to the standard `json <https://docs.python.org/3/library/json.html>`_ library.
|
|
||||||
* ``pip install python-telegram-bot[socks]`` installs ``httpx[socks]``. Use this, if you want to work behind a Socks5 server.
|
* ``pip install python-telegram-bot[socks]`` installs ``httpx[socks]``. Use this, if you want to work behind a Socks5 server.
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
|
|
|
@ -135,7 +135,6 @@ Optional Dependencies
|
||||||
``python-telegram-bot-raw`` can be installed with optional dependencies:
|
``python-telegram-bot-raw`` can be installed with optional dependencies:
|
||||||
|
|
||||||
* ``pip install python-telegram-bot[passport]`` installs the `cryptography <https://cryptography.io>`_ library. Use this, if you want to use Telegram Passport related functionality.
|
* ``pip install python-telegram-bot[passport]`` installs the `cryptography <https://cryptography.io>`_ library. Use this, if you want to use Telegram Passport related functionality.
|
||||||
* ``pip install python-telegram-bot[json]`` installs the `ujson <https://pypi.org/project/ujson/>`_ library. It will then be used for JSON de- & encoding, which can bring speed up compared to the standard `json <https://docs.python.org/3/library/json.html>`_ library.
|
|
||||||
* ``pip install python-telegram-bot[socks]`` installs the `PySocks <https://pypi.org/project/PySocks/>`_ library. Use this, if you want to work behind a Socks5 server.
|
* ``pip install python-telegram-bot[socks]`` installs the `PySocks <https://pypi.org/project/PySocks/>`_ library. Use this, if you want to work behind a Socks5 server.
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -71,9 +71,6 @@ def get_setup_kwargs(raw=False):
|
||||||
install_requires=requirements,
|
install_requires=requirements,
|
||||||
extras_require={
|
extras_require={
|
||||||
"socks": "httpx[socks]",
|
"socks": "httpx[socks]",
|
||||||
# json and cryptography are very stable, so we use a reasonably new version as
|
|
||||||
# lower bound and have no upper bound
|
|
||||||
"json": "ujson>=4.0.0",
|
|
||||||
# 3.4-3.4.3 contained some cyclical import bugs
|
# 3.4-3.4.3 contained some cyclical import bugs
|
||||||
"passport": "cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=3.0",
|
"passport": "cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=3.0",
|
||||||
},
|
},
|
||||||
|
|
|
@ -42,10 +42,6 @@ from typing import (
|
||||||
no_type_check,
|
no_type_check,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef] # noqa: F723
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cryptography.hazmat.backends import default_backend
|
from cryptography.hazmat.backends import default_backend
|
||||||
|
@ -4710,10 +4706,7 @@ class Bot(TelegramObject, AbstractAsyncContextManager):
|
||||||
if start_parameter is not None:
|
if start_parameter is not None:
|
||||||
data["start_parameter"] = start_parameter
|
data["start_parameter"] = start_parameter
|
||||||
if provider_data is not None:
|
if provider_data is not None:
|
||||||
if isinstance(provider_data, str):
|
data["provider_data"] = provider_data
|
||||||
data["provider_data"] = provider_data
|
|
||||||
else:
|
|
||||||
data["provider_data"] = json.dumps(provider_data)
|
|
||||||
if photo_url is not None:
|
if photo_url is not None:
|
||||||
data["photo_url"] = photo_url
|
data["photo_url"] = photo_url
|
||||||
if photo_size is not None:
|
if photo_size is not None:
|
||||||
|
|
|
@ -17,11 +17,7 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
# pylint: disable=missing-module-docstring, redefined-builtin
|
# pylint: disable=missing-module-docstring, redefined-builtin
|
||||||
try:
|
import json
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef]
|
|
||||||
|
|
||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
from typing import TYPE_CHECKING, Any, List, Optional, no_type_check
|
from typing import TYPE_CHECKING, Any, List, Optional, no_type_check
|
||||||
|
|
||||||
|
|
|
@ -17,12 +17,9 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
"""Base class for Telegram Objects."""
|
"""Base class for Telegram Objects."""
|
||||||
|
import json
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef]
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Type, TypeVar, Union
|
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Type, TypeVar, Union
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
"""This module contains the DictPersistence class."""
|
"""This module contains the DictPersistence class."""
|
||||||
|
import json
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from typing import Dict, Optional, cast
|
from typing import Dict, Optional, cast
|
||||||
|
|
||||||
|
@ -25,11 +25,6 @@ from telegram._utils.types import JSONDict
|
||||||
from telegram.ext import BasePersistence, PersistenceInput
|
from telegram.ext import BasePersistence, PersistenceInput
|
||||||
from telegram.ext._utils.types import CDCData, ConversationDict, ConversationKey
|
from telegram.ext._utils.types import CDCData, ConversationDict, ConversationKey
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef]
|
|
||||||
|
|
||||||
|
|
||||||
class DictPersistence(BasePersistence):
|
class DictPersistence(BasePersistence):
|
||||||
"""Using Python's :obj:`dict` and :mod:`json` for making your bot persistent.
|
"""Using Python's :obj:`dict` and :mod:`json` for making your bot persistent.
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
# pylint: disable=missing-module-docstring
|
# pylint: disable=missing-module-docstring
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import json
|
||||||
import logging
|
import logging
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from ssl import SSLContext
|
from ssl import SSLContext
|
||||||
|
@ -33,11 +34,6 @@ from telegram.ext._extbot import ExtBot
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from telegram import Bot
|
from telegram import Bot
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef]
|
|
||||||
|
|
||||||
|
|
||||||
class WebhookServer:
|
class WebhookServer:
|
||||||
"""Thin wrapper around ``tornado.httpserver.HTTPServer``."""
|
"""Thin wrapper around ``tornado.httpserver.HTTPServer``."""
|
||||||
|
|
|
@ -19,15 +19,12 @@
|
||||||
"""This module contains an abstract class to make POST and GET requests."""
|
"""This module contains an abstract class to make POST and GET requests."""
|
||||||
import abc
|
import abc
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import json
|
||||||
from contextlib import AbstractAsyncContextManager
|
from contextlib import AbstractAsyncContextManager
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
from typing import ClassVar, Optional, Tuple, Type, TypeVar, Union
|
from typing import ClassVar, Optional, Tuple, Type, TypeVar, Union
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef]
|
|
||||||
|
|
||||||
from telegram._utils.defaultvalue import DEFAULT_NONE as _DEFAULT_NONE
|
from telegram._utils.defaultvalue import DEFAULT_NONE as _DEFAULT_NONE
|
||||||
from telegram._utils.types import JSONDict, ODVInput
|
from telegram._utils.types import JSONDict, ODVInput
|
||||||
|
|
|
@ -17,17 +17,13 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
"""This module contains a class that holds the parameters of a request to the Bot API."""
|
"""This module contains a class that holds the parameters of a request to the Bot API."""
|
||||||
|
import json
|
||||||
from typing import Any, Dict, List, Union
|
from typing import Any, Dict, List, Union
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
from telegram._utils.types import UploadFileDict
|
from telegram._utils.types import UploadFileDict
|
||||||
from telegram.request._requestparameter import RequestParameter
|
from telegram.request._requestparameter import RequestParameter
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef] # noqa: F723
|
|
||||||
|
|
||||||
|
|
||||||
class RequestData:
|
class RequestData:
|
||||||
"""Instances of this class collect the data needed for one request to the Bot API, including
|
"""Instances of this class collect the data needed for one request to the Bot API, including
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
"""This module contains a class that describes a single parameter of a request to the Bot API."""
|
"""This module contains a class that describes a single parameter of a request to the Bot API."""
|
||||||
|
import json
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List, Optional, Tuple
|
from typing import List, Optional, Tuple
|
||||||
|
@ -28,11 +29,6 @@ from telegram._utils.datetime import to_timestamp
|
||||||
from telegram._utils.enum import StringEnum
|
from telegram._utils.enum import StringEnum
|
||||||
from telegram._utils.types import UploadFileDict
|
from telegram._utils.types import UploadFileDict
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json # type: ignore[no-redef] # noqa: F723
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(repr=False, eq=False, order=False, frozen=True)
|
@dataclass(repr=False, eq=False, order=False, frozen=True)
|
||||||
class RequestParameter:
|
class RequestParameter:
|
||||||
|
|
|
@ -16,12 +16,9 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
import pytest
|
import json
|
||||||
|
|
||||||
try:
|
import pytest
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json
|
|
||||||
|
|
||||||
from telegram.ext import DictPersistence
|
from telegram.ext import DictPersistence
|
||||||
|
|
||||||
|
|
|
@ -195,11 +195,7 @@ class TestInvoice:
|
||||||
|
|
||||||
async def test_send_object_as_provider_data(self, monkeypatch, bot, chat_id, provider_token):
|
async def test_send_object_as_provider_data(self, monkeypatch, bot, chat_id, provider_token):
|
||||||
async def make_assertion(url, request_data: RequestData, *args, **kwargs):
|
async def make_assertion(url, request_data: RequestData, *args, **kwargs):
|
||||||
# depends on whether we're using ujson
|
return request_data.json_parameters["provider_data"] == '{"test_data": 123456789}'
|
||||||
return request_data.json_parameters["provider_data"] in [
|
|
||||||
'{"test_data": 123456789}',
|
|
||||||
'{"test_data":123456789}',
|
|
||||||
]
|
|
||||||
|
|
||||||
monkeypatch.setattr(bot.request, "post", make_assertion)
|
monkeypatch.setattr(bot.request, "post", make_assertion)
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,9 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
|
import json
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson as json
|
|
||||||
except ImportError:
|
|
||||||
import json
|
|
||||||
|
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
|
|
@ -17,16 +17,11 @@
|
||||||
# You should have received a copy of the GNU Lesser Public License
|
# You should have received a copy of the GNU Lesser Public License
|
||||||
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
# along with this program. If not, see [http://www.gnu.org/licenses/].
|
||||||
import datetime
|
import datetime
|
||||||
import json as json_lib
|
|
||||||
import pickle
|
import pickle
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
try:
|
|
||||||
import ujson
|
|
||||||
except ImportError:
|
|
||||||
ujson = None
|
|
||||||
|
|
||||||
from telegram import Chat, Message, PhotoSize, TelegramObject, User
|
from telegram import Chat, Message, PhotoSize, TelegramObject, User
|
||||||
|
|
||||||
|
@ -38,9 +33,7 @@ class TestTelegramObject:
|
||||||
self.normal = normal
|
self.normal = normal
|
||||||
self._bot = b
|
self._bot = b
|
||||||
|
|
||||||
def test_to_json_native(self, monkeypatch):
|
def test_to_json(self, monkeypatch):
|
||||||
if ujson:
|
|
||||||
monkeypatch.setattr("ujson.dumps", json_lib.dumps)
|
|
||||||
# to_json simply takes whatever comes from to_dict, therefore we only need to test it once
|
# to_json simply takes whatever comes from to_dict, therefore we only need to test it once
|
||||||
telegram_object = TelegramObject()
|
telegram_object = TelegramObject()
|
||||||
|
|
||||||
|
@ -61,28 +54,6 @@ class TestTelegramObject:
|
||||||
with pytest.raises(TypeError):
|
with pytest.raises(TypeError):
|
||||||
telegram_object.to_json()
|
telegram_object.to_json()
|
||||||
|
|
||||||
@pytest.mark.skipif(not ujson, reason="ujson not installed")
|
|
||||||
def test_to_json_ujson(self, monkeypatch):
|
|
||||||
# to_json simply takes whatever comes from to_dict, therefore we only need to test it once
|
|
||||||
telegram_object = TelegramObject()
|
|
||||||
|
|
||||||
# Test that it works with a dict with str keys as well as dicts as lists as values
|
|
||||||
d = {"str": "str", "str2": ["str", "str"], "str3": {"str": "str"}}
|
|
||||||
monkeypatch.setattr("telegram.TelegramObject.to_dict", lambda _: d)
|
|
||||||
json = telegram_object.to_json()
|
|
||||||
# Order isn't guarantied and ujon discards whitespace
|
|
||||||
assert '"str":"str"' in json
|
|
||||||
assert '"str2":["str","str"]' in json
|
|
||||||
assert '"str3":{"str":"str"}' in json
|
|
||||||
|
|
||||||
# Test that ujson allows tuples
|
|
||||||
# NOTE: This could be seen as a bug (since it's differnt from the normal "json",
|
|
||||||
# but we test it anyways
|
|
||||||
d = {("str", "str"): "str"}
|
|
||||||
|
|
||||||
monkeypatch.setattr("telegram.TelegramObject.to_dict", lambda _: d)
|
|
||||||
telegram_object.to_json()
|
|
||||||
|
|
||||||
def test_to_dict_private_attribute(self):
|
def test_to_dict_private_attribute(self):
|
||||||
class TelegramObjectSubclass(TelegramObject):
|
class TelegramObjectSubclass(TelegramObject):
|
||||||
__slots__ = ("a", "_b") # Added slots so that the attrs are converted to dict
|
__slots__ = ("a", "_b") # Added slots so that the attrs are converted to dict
|
||||||
|
|
Loading…
Reference in a new issue