diff --git a/Lib/fontTools/cu2qu.py b/Lib/fontTools/cu2qu.py index 767a683e8..4710f3c6f 100644 --- a/Lib/fontTools/cu2qu.py +++ b/Lib/fontTools/cu2qu.py @@ -19,19 +19,7 @@ try: import cython except ImportError: # if cython not installed, use mock module with no-op decorators and types - from types import SimpleNamespace - - def _empty_decorator(x): - return x - - cython = SimpleNamespace() - cython.compiled = False - for name in ("double", "complex", "int"): - setattr(cython, name, None) - for name in ("cfunc", "inline"): - setattr(cython, name, _empty_decorator) - cython.locals = lambda **_: _empty_decorator - cython.returns = lambda _: _empty_decorator + from fontTools.misc import cython import math diff --git a/Lib/fontTools/misc/cython.py b/Lib/fontTools/misc/cython.py new file mode 100644 index 000000000..0ba659f60 --- /dev/null +++ b/Lib/fontTools/misc/cython.py @@ -0,0 +1,25 @@ +""" Exports a no-op 'cython' namespace similar to +https://github.com/cython/cython/blob/master/Cython/Shadow.py + +This allows to optionally compile @cython decorated functions +(when cython is available at built time), or run the same code +as pure-python, without runtime dependency on cython module. + +We only define the symbols that we use. E.g. see fontTools.cu2qu +""" + +from types import SimpleNamespace + +def _empty_decorator(x): + return x + +compiled = False + +for name in ("double", "complex", "int"): + globals()[name] = None + +for name in ("cfunc", "inline"): + globals()[name] = _empty_decorator + +locals = lambda **_: _empty_decorator +returns = lambda _: _empty_decorator