Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-tqdm for openSUSE:Factory checked in at 2022-04-12 21:43:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-tqdm (Old) and /work/SRC/openSUSE:Factory/.python-tqdm.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-tqdm" Tue Apr 12 21:43:13 2022 rev:51 rq:967946 version:4.64.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-tqdm/python-tqdm.changes 2022-03-31 17:18:09.837627210 +0200 +++ /work/SRC/openSUSE:Factory/.python-tqdm.new.1900/python-tqdm.changes 2022-04-12 21:43:15.051742754 +0200 @@ -1,0 +2,12 @@ +Sat Apr 9 01:57:42 UTC 2022 - Arun Persaud <a...@gmx.de> + +- update to version 4.64.0: + * add contrib.slack (#1313) + +- changes from version 4.63.2: + * rich: expose options kwargs (#1282) + * autonotebook: re-enable VSCode (#1309) + * misc docs typos (#1301, #1299) + * update dev dependencies (#1311) + +------------------------------------------------------------------- Old: ---- tqdm-4.63.1.tar.gz New: ---- tqdm-4.64.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-tqdm.spec ++++++ --- /var/tmp/diff_new_pack.6iBh4t/_old 2022-04-12 21:43:15.795734198 +0200 +++ /var/tmp/diff_new_pack.6iBh4t/_new 2022-04-12 21:43:15.799734152 +0200 @@ -28,7 +28,7 @@ %bcond_with test %endif Name: python-tqdm%{pkg_suffix} -Version: 4.63.1 +Version: 4.64.0 Release: 0 Summary: An extensible progress meter License: MIT AND MPL-2.0 ++++++ tqdm-4.63.1.tar.gz -> tqdm-4.64.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/PKG-INFO new/tqdm-4.64.0/PKG-INFO --- old/tqdm-4.63.1/PKG-INFO 2022-03-24 00:37:15.631581800 +0100 +++ new/tqdm-4.64.0/PKG-INFO 2022-04-04 03:48:42.514477300 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tqdm -Version: 4.63.1 +Version: 4.64.0 Summary: Fast, Extensible Progress Meter Home-page: https://tqdm.github.io Maintainer: tqdm developers @@ -71,6 +71,7 @@ Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7 Description-Content-Type: text/x-rst Provides-Extra: dev +Provides-Extra: slack Provides-Extra: telegram Provides-Extra: notebook License-File: LICENCE @@ -769,11 +770,12 @@ - ``tqdm.contrib.itertools``: Thin wrappers around ``itertools`` - ``tqdm.contrib.concurrent``: Thin wrappers around ``concurrent.futures`` +- ``tqdm.contrib.slack``: Posts to `Slack <https://slack.com>`__ bots - ``tqdm.contrib.discord``: Posts to `Discord <https://discord.com>`__ bots - ``tqdm.contrib.telegram``: Posts to `Telegram <https://telegram.org>`__ bots - ``tqdm.contrib.bells``: Automagically enables all optional features - * ``auto``, ``pandas``, ``discord``, ``telegram`` + * ``auto``, ``pandas``, ``slack``, ``discord``, ``telegram`` Examples and Advanced Usage --------------------------- @@ -1053,7 +1055,7 @@ class TqdmExt(std_tqdm): def update(self, n=1): - displayed = super(TqdmExt, self).update(n): + displayed = super(TqdmExt, self).update(n) if displayed: external_callback(**self.format_dict) return displayed @@ -1261,8 +1263,9 @@ - `tqdm/notebook.py <https://github.com/tqdm/tqdm/blob/master/tqdm/notebook.py>`__ - `tqdm/gui.py <https://github.com/tqdm/tqdm/blob/master/tqdm/gui.py>`__ - `tqdm/tk.py <https://github.com/tqdm/tqdm/blob/master/tqdm/tk.py>`__ -- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ +- `tqdm/contrib/slack.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/slack.py>`__ - `tqdm/contrib/discord.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/discord.py>`__ +- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ Dynamic Monitor/Meter ~~~~~~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/README.rst new/tqdm-4.64.0/README.rst --- old/tqdm-4.63.1/README.rst 2022-03-24 00:37:11.000000000 +0100 +++ new/tqdm-4.64.0/README.rst 2022-04-04 03:48:38.000000000 +0200 @@ -692,11 +692,12 @@ - ``tqdm.contrib.itertools``: Thin wrappers around ``itertools`` - ``tqdm.contrib.concurrent``: Thin wrappers around ``concurrent.futures`` +- ``tqdm.contrib.slack``: Posts to `Slack <https://slack.com>`__ bots - ``tqdm.contrib.discord``: Posts to `Discord <https://discord.com>`__ bots - ``tqdm.contrib.telegram``: Posts to `Telegram <https://telegram.org>`__ bots - ``tqdm.contrib.bells``: Automagically enables all optional features - * ``auto``, ``pandas``, ``discord``, ``telegram`` + * ``auto``, ``pandas``, ``slack``, ``discord``, ``telegram`` Examples and Advanced Usage --------------------------- @@ -976,7 +977,7 @@ class TqdmExt(std_tqdm): def update(self, n=1): - displayed = super(TqdmExt, self).update(n): + displayed = super(TqdmExt, self).update(n) if displayed: external_callback(**self.format_dict) return displayed @@ -1184,8 +1185,9 @@ - `tqdm/notebook.py <https://github.com/tqdm/tqdm/blob/master/tqdm/notebook.py>`__ - `tqdm/gui.py <https://github.com/tqdm/tqdm/blob/master/tqdm/gui.py>`__ - `tqdm/tk.py <https://github.com/tqdm/tqdm/blob/master/tqdm/tk.py>`__ -- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ +- `tqdm/contrib/slack.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/slack.py>`__ - `tqdm/contrib/discord.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/discord.py>`__ +- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ Dynamic Monitor/Meter ~~~~~~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/environment.yml new/tqdm-4.64.0/environment.yml --- old/tqdm-4.63.1/environment.yml 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/environment.yml 2022-04-04 03:48:04.000000000 +0200 @@ -29,6 +29,7 @@ - numpy # pandas, keras, contrib.tenumerate - pandas - tensorflow # keras +- slack-sdk # contrib.slack - requests # contrib.telegram - rich # rich - argopt # `cd wiki && pymake` @@ -36,10 +37,10 @@ - wheel # `setup.py bdist_wheel` # `cd docs && pymake` - mkdocs-material -- pydoc-markdown >=3.3.0 +- pydoc-markdown - pygments - pymdown-extensions - pip: - py-make >=0.1.0 # `setup.py make/pymake` - - mkdocs-minify-plugin # `cd docs && pymake` - - git+git://github.com/tqdm/jsmin@python3-only#egg=jsmin # `cd docs && pymake` + - mkdocs-minify-plugin # `cd docs && pymake` + - git+https://github.com/tqdm/jsmin@python3-only#egg=jsmin # `cd docs && pymake` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/setup.cfg new/tqdm-4.64.0/setup.cfg --- old/tqdm-4.63.1/setup.cfg 2022-03-24 00:37:15.631581800 +0100 +++ new/tqdm-4.64.0/setup.cfg 2022-04-04 03:48:42.514477300 +0200 @@ -85,6 +85,7 @@ [options.extras_require] dev = py-make>=0.1.0; twine; wheel +slack = slack-sdk telegram = requests notebook = ipywidgets>=6 @@ -142,6 +143,7 @@ include = tqdm/* omit = tqdm/contrib/bells.py + tqdm/contrib/slack.py tqdm/contrib/discord.py tqdm/contrib/telegram.py tqdm/contrib/utils_worker.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/_dist_ver.py new/tqdm-4.64.0/tqdm/_dist_ver.py --- old/tqdm-4.63.1/tqdm/_dist_ver.py 2022-03-24 00:37:15.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/_dist_ver.py 2022-04-04 03:48:42.000000000 +0200 @@ -1 +1 @@ -__version__ = '4.63.1' +__version__ = '4.64.0' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/autonotebook.py new/tqdm-4.64.0/tqdm/autonotebook.py --- old/tqdm-4.63.1/tqdm/autonotebook.py 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/autonotebook.py 2022-04-04 03:48:04.000000000 +0200 @@ -6,7 +6,6 @@ >>> for i in trange(10): ... ... """ -import os import sys from warnings import warn @@ -14,8 +13,6 @@ get_ipython = sys.modules['IPython'].get_ipython if 'IPKernelApp' not in get_ipython().config: # pragma: no cover raise ImportError("console") - if 'VSCODE_PID' in os.environ: # pragma: no cover - raise ImportError("vscode") from .notebook import WARN_NOIPYW, IProgress if IProgress is None: from .std import TqdmWarning diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/contrib/bells.py new/tqdm-4.64.0/tqdm/contrib/bells.py --- old/tqdm-4.63.1/tqdm/contrib/bells.py 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/contrib/bells.py 2022-04-04 03:48:04.000000000 +0200 @@ -12,7 +12,9 @@ import warnings from os import getenv -if getenv("TQDM_TELEGRAM_TOKEN") and getenv("TQDM_TELEGRAM_CHAT_ID"): +if getenv("TQDM_SLACK_TOKEN") and getenv("TQDM_SLACK_CHANNEL"): + from .slack import tqdm, trange +elif getenv("TQDM_TELEGRAM_TOKEN") and getenv("TQDM_TELEGRAM_CHAT_ID"): from .telegram import tqdm, trange elif getenv("TQDM_DISCORD_TOKEN") and getenv("TQDM_DISCORD_CHANNEL_ID"): from .discord import tqdm, trange diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/contrib/discord.py new/tqdm-4.64.0/tqdm/contrib/discord.py --- old/tqdm-4.63.1/tqdm/contrib/discord.py 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/contrib/discord.py 2022-04-04 03:48:04.000000000 +0200 @@ -3,7 +3,7 @@ Usage: >>> from tqdm.contrib.discord import tqdm, trange ->>> for i in tqdm(iterable, token='{token}', channel_id='{channel_id}'): +>>> for i in trange(10, token='{token}', channel_id='{channel_id}'): ... ...  @@ -39,6 +39,7 @@ self.message = client.api.channels_messages_create(channel_id, self.text) except Exception as e: tqdm_auto.write(str(e)) + self.message = None def write(self, s): """Replaces internal `message`'s text with `s`.""" @@ -47,9 +48,12 @@ s = s.replace('\r', '').strip() if s == self.text: return # skip duplicate message + message = self.message + if message is None: + return self.text = s try: - future = self.submit(self.message.edit, '`' + s + '`') + future = self.submit(message.edit, '`' + s + '`') except Exception as e: tqdm_auto.write(str(e)) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/contrib/slack.py new/tqdm-4.64.0/tqdm/contrib/slack.py --- old/tqdm-4.63.1/tqdm/contrib/slack.py 1970-01-01 01:00:00.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/contrib/slack.py 2022-04-04 03:48:04.000000000 +0200 @@ -0,0 +1,126 @@ +""" +Sends updates to a Slack app. + +Usage: +>>> from tqdm.contrib.slack import tqdm, trange +>>> for i in trange(10, token='{token}', channel='{channel}'): +... ... + + +""" +from __future__ import absolute_import + +import logging +from os import getenv + +try: + from slack_sdk import WebClient +except ImportError: + raise ImportError("Please `pip install slack-sdk`") + +from ..auto import tqdm as tqdm_auto +from ..utils import _range +from .utils_worker import MonoWorker + +__author__ = {"github.com/": ["0x2b3bfa0", "casperdcl"]} +__all__ = ['SlackIO', 'tqdm_slack', 'tsrange', 'tqdm', 'trange'] + + +class SlackIO(MonoWorker): + """Non-blocking file-like IO using a Slack app.""" + def __init__(self, token, channel): + """Creates a new message in the given `channel`.""" + super(SlackIO, self).__init__() + self.client = WebClient(token=token) + self.text = self.__class__.__name__ + try: + self.message = self.client.chat_postMessage(channel=channel, text=self.text) + except Exception as e: + tqdm_auto.write(str(e)) + self.message = None + + def write(self, s): + """Replaces internal `message`'s text with `s`.""" + if not s: + s = "..." + s = s.replace('\r', '').strip() + if s == self.text: + return # skip duplicate message + message = self.message + if message is None: + return + self.text = s + try: + future = self.submit(self.client.chat_update, channel=message['channel'], + ts=message['ts'], text='`' + s + '`') + except Exception as e: + tqdm_auto.write(str(e)) + else: + return future + + +class tqdm_slack(tqdm_auto): + """ + Standard `tqdm.auto.tqdm` but also sends updates to a Slack app. + May take a few seconds to create (`__init__`). + + - create a Slack app with the `chat:write` scope & invite it to a + channel: <https://api.slack.com/authentication/basics> + - copy the bot `{token}` & `{channel}` and paste below + >>> from tqdm.contrib.slack import tqdm, trange + >>> for i in tqdm(iterable, token='{token}', channel='{channel}'): + ... ... + """ + def __init__(self, *args, **kwargs): + """ + Parameters + ---------- + token : str, required. Slack token + [default: ${TQDM_SLACK_TOKEN}]. + channel : int, required. Slack channel + [default: ${TQDM_SLACK_CHANNEL}]. + mininterval : float, optional. + Minimum of [default: 1.5] to avoid rate limit. + + See `tqdm.auto.tqdm.__init__` for other parameters. + """ + if not kwargs.get('disable'): + kwargs = kwargs.copy() + logging.getLogger("HTTPClient").setLevel(logging.WARNING) + self.sio = SlackIO( + kwargs.pop('token', getenv("TQDM_SLACK_TOKEN")), + kwargs.pop('channel', getenv("TQDM_SLACK_CHANNEL"))) + kwargs['mininterval'] = max(1.5, kwargs.get('mininterval', 1.5)) + super(tqdm_slack, self).__init__(*args, **kwargs) + + def display(self, **kwargs): + super(tqdm_slack, self).display(**kwargs) + fmt = self.format_dict + if fmt.get('bar_format', None): + fmt['bar_format'] = fmt['bar_format'].replace( + '<bar/>', '`{bar:10}`').replace('{bar}', '`{bar:10u}`') + else: + fmt['bar_format'] = '{l_bar}`{bar:10}`{r_bar}' + if fmt['ascii'] is False: + fmt['ascii'] = [":black_square:", ":small_blue_diamond:", ":large_blue_diamond:", + ":large_blue_square:"] + fmt['ncols'] = 336 + self.sio.write(self.format_meter(**fmt)) + + def clear(self, *args, **kwargs): + super(tqdm_slack, self).clear(*args, **kwargs) + if not self.disable: + self.sio.write("") + + +def tsrange(*args, **kwargs): + """ + A shortcut for `tqdm.contrib.slack.tqdm(xrange(*args), **kwargs)`. + On Python3+, `range` is used instead of `xrange`. + """ + return tqdm_slack(_range(*args), **kwargs) + + +# Aliases +tqdm = tqdm_slack +trange = tsrange diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/rich.py new/tqdm-4.64.0/tqdm/rich.py --- old/tqdm-4.63.1/tqdm/rich.py 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/rich.py 2022-04-04 03:48:04.000000000 +0200 @@ -84,12 +84,15 @@ ---------- progress : tuple, optional arguments for `rich.progress.Progress()`. + options : dict, optional + keyword arguments for `rich.progress.Progress()`. """ kwargs = kwargs.copy() kwargs['gui'] = True # convert disable = None to False kwargs['disable'] = bool(kwargs.get('disable', False)) progress = kwargs.pop('progress', None) + options = kwargs.pop('options', {}).copy() super(tqdm_rich, self).__init__(*args, **kwargs) if self.disable: @@ -108,7 +111,8 @@ ",", RateColumn(unit=d['unit'], unit_scale=d['unit_scale'], unit_divisor=d['unit_divisor']), "]" ) - self._prog = Progress(*progress, transient=not self.leave) + options.setdefault('transient', not self.leave) + self._prog = Progress(*progress, **options) self._prog.__enter__() self._task_id = self._prog.add_task(self.desc or "", **d) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm/std.py new/tqdm-4.64.0/tqdm/std.py --- old/tqdm-4.63.1/tqdm/std.py 2022-03-24 00:36:48.000000000 +0100 +++ new/tqdm-4.64.0/tqdm/std.py 2022-04-04 03:48:04.000000000 +0200 @@ -672,7 +672,7 @@ | groupby.(generic.)SeriesGroupBy ).progress_apply - A new instance will be create every time `progress_apply` is called, + A new instance will be created every time `progress_apply` is called, and each instance will automatically `close()` upon completion. Parameters diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm.egg-info/PKG-INFO new/tqdm-4.64.0/tqdm.egg-info/PKG-INFO --- old/tqdm-4.63.1/tqdm.egg-info/PKG-INFO 2022-03-24 00:37:15.000000000 +0100 +++ new/tqdm-4.64.0/tqdm.egg-info/PKG-INFO 2022-04-04 03:48:42.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tqdm -Version: 4.63.1 +Version: 4.64.0 Summary: Fast, Extensible Progress Meter Home-page: https://tqdm.github.io Maintainer: tqdm developers @@ -71,6 +71,7 @@ Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7 Description-Content-Type: text/x-rst Provides-Extra: dev +Provides-Extra: slack Provides-Extra: telegram Provides-Extra: notebook License-File: LICENCE @@ -769,11 +770,12 @@ - ``tqdm.contrib.itertools``: Thin wrappers around ``itertools`` - ``tqdm.contrib.concurrent``: Thin wrappers around ``concurrent.futures`` +- ``tqdm.contrib.slack``: Posts to `Slack <https://slack.com>`__ bots - ``tqdm.contrib.discord``: Posts to `Discord <https://discord.com>`__ bots - ``tqdm.contrib.telegram``: Posts to `Telegram <https://telegram.org>`__ bots - ``tqdm.contrib.bells``: Automagically enables all optional features - * ``auto``, ``pandas``, ``discord``, ``telegram`` + * ``auto``, ``pandas``, ``slack``, ``discord``, ``telegram`` Examples and Advanced Usage --------------------------- @@ -1053,7 +1055,7 @@ class TqdmExt(std_tqdm): def update(self, n=1): - displayed = super(TqdmExt, self).update(n): + displayed = super(TqdmExt, self).update(n) if displayed: external_callback(**self.format_dict) return displayed @@ -1261,8 +1263,9 @@ - `tqdm/notebook.py <https://github.com/tqdm/tqdm/blob/master/tqdm/notebook.py>`__ - `tqdm/gui.py <https://github.com/tqdm/tqdm/blob/master/tqdm/gui.py>`__ - `tqdm/tk.py <https://github.com/tqdm/tqdm/blob/master/tqdm/tk.py>`__ -- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ +- `tqdm/contrib/slack.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/slack.py>`__ - `tqdm/contrib/discord.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/discord.py>`__ +- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__ Dynamic Monitor/Meter ~~~~~~~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm.egg-info/SOURCES.txt new/tqdm-4.64.0/tqdm.egg-info/SOURCES.txt --- old/tqdm-4.63.1/tqdm.egg-info/SOURCES.txt 2022-03-24 00:37:15.000000000 +0100 +++ new/tqdm-4.64.0/tqdm.egg-info/SOURCES.txt 2022-04-04 03:48:42.000000000 +0200 @@ -83,5 +83,6 @@ tqdm/contrib/discord.py tqdm/contrib/itertools.py tqdm/contrib/logging.py +tqdm/contrib/slack.py tqdm/contrib/telegram.py tqdm/contrib/utils_worker.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tqdm-4.63.1/tqdm.egg-info/requires.txt new/tqdm-4.64.0/tqdm.egg-info/requires.txt --- old/tqdm-4.63.1/tqdm.egg-info/requires.txt 2022-03-24 00:37:15.000000000 +0100 +++ new/tqdm-4.64.0/tqdm.egg-info/requires.txt 2022-04-04 03:48:42.000000000 +0200 @@ -13,5 +13,8 @@ [notebook] ipywidgets>=6 +[slack] +slack-sdk + [telegram] requests