-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
270 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
""" | ||
All the bells & whistles: | ||
- tqdm.auto | ||
- tqdm.tqdm.pandas | ||
- tqdm.contrib.telegram | ||
+ uses ${TQDM_TELEGRAM_TOKEN} and ${TQDM_TELEGRAM_CHAT_ID} | ||
- tqdm.contrib.discord | ||
+ uses ${TQDM_DISCORD_TOKEN} and ${TQDM_DISCORD_CHANNEL_ID} | ||
""" | ||
__all__ = ['tqdm', 'trange'] | ||
from os import getenv | ||
import warnings | ||
|
||
|
||
if getenv("TQDM_TELEGRAM_TOKEN") and getenv("TQDM_TELEGRAM_CHAT_ID"): | ||
from tqdm.contrib.telegram import tqdm, trange | ||
elif getenv("TQDM_DISCORD_TOKEN") and getenv("TQDM_DISCORD_CHANNEL_ID"): | ||
from tqdm.contrib.discord import tqdm, trange | ||
else: | ||
from tqdm.auto import tqdm, trange | ||
|
||
with warnings.catch_warnings(): | ||
warnings.simplefilter("ignore", category=FutureWarning) | ||
tqdm.pandas() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
""" | ||
Sends updates to a Discord bot. | ||
""" | ||
from __future__ import absolute_import | ||
from copy import deepcopy | ||
from os import getenv | ||
|
||
try: | ||
from disco.client import Client, ClientConfig | ||
except ImportError: | ||
raise ImportError("Please `pip install disco-py`") | ||
|
||
from tqdm.auto import tqdm as tqdm_auto | ||
from tqdm.utils import _range | ||
from .utils_worker import MonoWorker | ||
__author__ = {"github.com/": ["casperdcl"]} | ||
__all__ = ['DiscordIO', 'tqdm_discord', 'tdrange', 'tqdm', 'trange'] | ||
|
||
|
||
class DiscordIO(MonoWorker): | ||
"""Non-blocking file-like IO using a Discord Bot.""" | ||
def __init__(self, token, channel_id): | ||
"""Creates a new message in the given `channel_id`.""" | ||
super(DiscordIO, self).__init__() | ||
config = ClientConfig() | ||
config.token = token | ||
client = Client(config) | ||
self.text = self.__class__.__name__ | ||
try: | ||
self.message = client.api.channels_messages_create( | ||
channel_id, self.text) | ||
except Exception as e: | ||
tqdm_auto.write(str(e)) | ||
|
||
def write(self, s): | ||
"""Replaces internal `message`'s text with `s`.""" | ||
if not s: | ||
return | ||
s = s.replace('\r', '').strip() | ||
if s == self.text: | ||
return # skip duplicate message | ||
self.text = s | ||
try: | ||
future = self.submit(self.message.edit, '`' + s + '`') | ||
except Exception as e: | ||
tqdm_auto.write(str(e)) | ||
else: | ||
return future | ||
|
||
|
||
class tqdm_discord(tqdm_auto): | ||
""" | ||
Standard `tqdm.auto.tqdm` but also sends updates to a Discord Bot. | ||
May take a few seconds to create (`__init__`). | ||
- create a discord bot (not public, no requirement of OAuth2 code | ||
grant, only send message permissions) & invite it to a channel: | ||
https://discordpy.readthedocs.io/en/latest/discord.html | ||
- copy the bot `{token}` & `{channel_id}` and paste below | ||
>>> from tqdm.contrib.discord import tqdm, trange | ||
>>> for i in tqdm(iterable, token='{token}', channel_id='{channel_id}'): | ||
... ... | ||
""" | ||
def __init__(self, *args, **kwargs): | ||
""" | ||
Parameters | ||
---------- | ||
token : str, required. Discord token | ||
[default: ${TQDM_DISCORD_TOKEN}]. | ||
channel_id : int, required. Discord channel ID | ||
[default: ${TQDM_DISCORD_CHANNEL_ID}]. | ||
mininterval : float, optional. | ||
Minimum of [default: 1.5] to avoid rate limit. | ||
See `tqdm.auto.tqdm.__init__` for other parameters. | ||
""" | ||
kwargs = deepcopy(kwargs) | ||
self.dio = DiscordIO( | ||
kwargs.pop('token', getenv("TQDM_DISCORD_TOKEN")), | ||
kwargs.pop('channel_id', getenv("TQDM_DISCORD_CHANNEL_ID"))) | ||
|
||
kwargs['mininterval'] = max(1.5, kwargs.get('mininterval', 1.5)) | ||
super(tqdm_discord, self).__init__(*args, **kwargs) | ||
|
||
def display(self, **kwargs): | ||
super(tqdm_discord, self).display(**kwargs) | ||
fmt = self.format_dict | ||
if 'bar_format' in fmt and fmt['bar_format']: | ||
fmt['bar_format'] = fmt['bar_format'].replace('<bar/>', '{bar}') | ||
else: | ||
fmt['bar_format'] = '{l_bar}{bar}{r_bar}' | ||
fmt['bar_format'] = fmt['bar_format'].replace('{bar}', '{bar:10u}') | ||
self.dio.write(self.format_meter(**fmt)) | ||
|
||
def __new__(cls, *args, **kwargs): | ||
""" | ||
Workaround for mixed-class same-stream nested progressbars. | ||
See [#509](https://github.com/tqdm/tqdm/issues/509) | ||
""" | ||
with cls.get_lock(): | ||
try: | ||
cls._instances = tqdm_auto._instances | ||
except AttributeError: | ||
pass | ||
instance = super(tqdm_discord, cls).__new__(cls, *args, **kwargs) | ||
with cls.get_lock(): | ||
try: | ||
# `tqdm_auto` may have been changed so update | ||
cls._instances.update(tqdm_auto._instances) | ||
except AttributeError: | ||
pass | ||
tqdm_auto._instances = cls._instances | ||
return instance | ||
|
||
|
||
def tdrange(*args, **kwargs): | ||
""" | ||
A shortcut for `tqdm.contrib.discord.tqdm(xrange(*args), **kwargs)`. | ||
On Python3+, `range` is used instead of `xrange`. | ||
""" | ||
return tqdm_discord(_range(*args), **kwargs) | ||
|
||
|
||
# Aliases | ||
tqdm = tqdm_discord | ||
trange = tdrange |
Oops, something went wrong.