aboutsummaryrefslogtreecommitdiffstats
path: root/python/gevent/_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/gevent/_util.py')
-rw-r--r--python/gevent/_util.py178
1 files changed, 0 insertions, 178 deletions
diff --git a/python/gevent/_util.py b/python/gevent/_util.py
deleted file mode 100644
index 4397aa3..0000000
--- a/python/gevent/_util.py
+++ /dev/null
@@ -1,178 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-internal gevent utilities, not for external use.
-"""
-
-from __future__ import print_function, absolute_import, division
-
-from functools import update_wrapper
-
-from gevent._compat import iteritems
-
-
-class _NONE(object):
- """
- A special object you must never pass to any gevent API.
- Used as a marker object for keyword arguments that cannot have the
- builtin None (because that might be a valid value).
- """
- __slots__ = ()
-
- def __repr__(self):
- return '<default value>'
-
-_NONE = _NONE()
-
-def copy_globals(source,
- globs,
- only_names=None,
- ignore_missing_names=False,
- names_to_ignore=(),
- dunder_names_to_keep=('__implements__', '__all__', '__imports__'),
- cleanup_globs=True):
- """
- Copy attributes defined in ``source.__dict__`` to the dictionary
- in globs (which should be the caller's :func:`globals`).
-
- Names that start with ``__`` are ignored (unless they are in
- *dunder_names_to_keep*). Anything found in *names_to_ignore* is
- also ignored.
-
- If *only_names* is given, only those attributes will be
- considered. In this case, *ignore_missing_names* says whether or
- not to raise an :exc:`AttributeError` if one of those names can't
- be found.
-
- If *cleanup_globs* has a true value, then common things imported but
- not used at runtime are removed, including this function.
-
- Returns a list of the names copied; this should be assigned to ``__imports__``.
- """
- if only_names:
- if ignore_missing_names:
- items = ((k, getattr(source, k, _NONE)) for k in only_names)
- else:
- items = ((k, getattr(source, k)) for k in only_names)
- else:
- items = iteritems(source.__dict__)
-
- copied = []
- for key, value in items:
- if value is _NONE:
- continue
- if key in names_to_ignore:
- continue
- if key.startswith("__") and key not in dunder_names_to_keep:
- continue
- globs[key] = value
- copied.append(key)
-
- if cleanup_globs:
- if 'copy_globals' in globs:
- del globs['copy_globals']
-
- return copied
-
-def import_c_accel(globs, cname):
- """
- Import the C-accelerator for the __name__
- and copy its globals.
- """
-
- name = globs.get('__name__')
-
- if not name or name == cname:
- # Do nothing if we're being exec'd as a file (no name)
- # or we're running from the C extension
- return
-
-
- from gevent._compat import PURE_PYTHON
- if PURE_PYTHON:
- return
-
- import importlib
- import warnings
- with warnings.catch_warnings():
- # Python 3.7 likes to produce
- # "ImportWarning: can't resolve
- # package from __spec__ or __package__, falling back on
- # __name__ and __path__"
- # when we load cython compiled files. This is probably a bug in
- # Cython, but it doesn't seem to have any consequences, it's
- # just annoying to see and can mess up our unittests.
- warnings.simplefilter('ignore', ImportWarning)
- mod = importlib.import_module(cname)
-
- # By adopting the entire __dict__, we get a more accurate
- # __file__ and module repr, plus we don't leak any imported
- # things we no longer need.
- globs.clear()
- globs.update(mod.__dict__)
-
- if 'import_c_accel' in globs:
- del globs['import_c_accel']
-
-
-class Lazy(object):
- """
- A non-data descriptor used just like @property. The
- difference is the function value is assigned to the instance
- dict the first time it is accessed and then the function is never
- called agoin.
- """
- def __init__(self, func):
- self.data = (func, func.__name__)
- update_wrapper(self, func)
-
- def __get__(self, inst, class_):
- if inst is None:
- return self
-
- func, name = self.data
- value = func(inst)
- inst.__dict__[name] = value
- return value
-
-class readproperty(object):
- """
- A non-data descriptor like @property. The difference is that
- when the property is assigned to, it is cached in the instance
- and the function is not called on that instance again.
- """
-
- def __init__(self, func):
- self.func = func
- update_wrapper(self, func)
-
- def __get__(self, inst, class_):
- if inst is None:
- return self
-
- return self.func(inst)
-
-def gmctime():
- """
- Returns the current time as a string in RFC3339 format.
- """
- import time
- return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
-
-try:
- from zope.interface import Interface
- from zope.interface import implementer
- from zope.interface import Attribute
-except ImportError:
- class Interface(object):
- pass
- def implementer(_iface):
- def dec(c):
- return c
- return dec
-
- def Attribute(s):
- return s
-
-Interface = Interface
-implementer = implementer
-Attribute = Attribute