aboutsummaryrefslogtreecommitdiff
path: root/discord/compat.py
diff options
context:
space:
mode:
authorRapptz <[email protected]>2018-06-10 18:09:14 -0400
committerRapptz <[email protected]>2018-06-10 18:10:00 -0400
commitf25091efe1281aebe70189c61f9cac405b21a72f (patch)
treed0d13dad1a89de9f45845a36ea475098b7a0b494 /discord/compat.py
parentAdd Message.jump_to_url (diff)
downloaddiscord.py-f25091efe1281aebe70189c61f9cac405b21a72f.tar.xz
discord.py-f25091efe1281aebe70189c61f9cac405b21a72f.zip
Drop support for Python 3.4 and make minimum version 3.5.2.
Diffstat (limited to 'discord/compat.py')
-rw-r--r--discord/compat.py140
1 files changed, 0 insertions, 140 deletions
diff --git a/discord/compat.py b/discord/compat.py
deleted file mode 100644
index 9c51e784..00000000
--- a/discord/compat.py
+++ /dev/null
@@ -1,140 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-The MIT License (MIT)
-
-Copyright (c) 2015-2017 Rapptz
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-"""
-
-import concurrent.futures
-import asyncio
-
-try:
- create_task = asyncio.ensure_future
-except AttributeError:
- create_task = getattr(asyncio, 'async')
-
-try:
- _create_future = asyncio.AbstractEventLoop.create_future
-except AttributeError:
- def create_future(loop):
- return asyncio.Future(loop=loop)
-else:
- def create_future(loop):
- return loop.create_future()
-
-try:
- run_coroutine_threadsafe = asyncio.run_coroutine_threadsafe
-except AttributeError:
- # the following code is slightly modified from the
- # official asyncio repository that could be found here:
- # https://github.com/python/asyncio/blob/master/asyncio/futures.py
- # with a commit hash of 5c7efbcdfbe6a5c25b4cd5df22d9a15ab4062c8e
- # this portion is licensed under Apache license 2.0
-
- def _set_concurrent_future_state(concurrent, source):
- """Copy state from a future to a concurrent.futures.Future."""
- assert source.done()
- if source.cancelled():
- concurrent.cancel()
- if not concurrent.set_running_or_notify_cancel():
- return
- exception = source.exception()
- if exception is not None:
- concurrent.set_exception(exception)
- else:
- result = source.result()
- concurrent.set_result(result)
-
-
- def _copy_future_state(source, dest):
- """Internal helper to copy state from another Future.
- The other Future may be a concurrent.futures.Future.
- """
- assert source.done()
- if dest.cancelled():
- return
- assert not dest.done()
- if source.cancelled():
- dest.cancel()
- else:
- exception = source.exception()
- if exception is not None:
- dest.set_exception(exception)
- else:
- result = source.result()
- dest.set_result(result)
-
- def _chain_future(source, destination):
- """Chain two futures so that when one completes, so does the other.
- The result (or exception) of source will be copied to destination.
- If destination is cancelled, source gets cancelled too.
- Compatible with both asyncio.Future and concurrent.futures.Future.
- """
- if not isinstance(source, (asyncio.Future, concurrent.futures.Future)):
- raise TypeError('A future is required for source argument')
-
- if not isinstance(destination, (asyncio.Future, concurrent.futures.Future)):
- raise TypeError('A future is required for destination argument')
-
- source_loop = source._loop if isinstance(source, asyncio.Future) else None
- dest_loop = destination._loop if isinstance(destination, asyncio.Future) else None
-
- def _set_state(future, other):
- if isinstance(future, asyncio.Future):
- _copy_future_state(other, future)
- else:
- _set_concurrent_future_state(future, other)
-
- def _call_check_cancel(destination):
- if destination.cancelled():
- if source_loop is None or source_loop is dest_loop:
- source.cancel()
- else:
- source_loop.call_soon_threadsafe(source.cancel)
-
- def _call_set_state(source):
- if dest_loop is None or dest_loop is source_loop:
- _set_state(destination, source)
- else:
- dest_loop.call_soon_threadsafe(_set_state, destination, source)
-
- destination.add_done_callback(_call_check_cancel)
- source.add_done_callback(_call_set_state)
-
- def run_coroutine_threadsafe(coro, loop):
- """Submit a coroutine object to a given event loop.
-
- Return a concurrent.futures.Future to access the result.
- """
- if not asyncio.iscoroutine(coro):
- raise TypeError('A coroutine object is required')
-
- future = concurrent.futures.Future()
-
- def callback():
- try:
- _chain_future(create_task(coro, loop=loop), future)
- except Exception as exc:
- if future.set_running_or_notify_cancel():
- future.set_exception(exc)
- raise
- loop.call_soon_threadsafe(callback)
- return future