/usr/lib/python3/dist-packages/kajiki/util.py is in python3-kajiki 0.5.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | # -*- coding: utf-8 -*-
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from collections import deque
import sys
from random import randint
from threading import local
def debug(): # pragma no cover
def pm(etype, value, tb):
import pdb
import traceback
try:
from IPython.ipapi import make_session
make_session()
from IPython.Debugger import Pdb
sys.stderr.write('Entering post-mortem IPDB shell\n')
p = Pdb(color_scheme='Linux')
p.reset()
p.setup(None, tb)
p.print_stack_trace()
sys.stderr.write('%s: %s\n' % (etype, value))
p.cmdloop()
p.forget()
# p.interaction(None, tb)
except ImportError:
sys.stderr.write('Entering post-mortem PDB shell\n')
traceback.print_exception(etype, value, tb)
pdb.post_mortem(tb)
sys.excepthook = pm
def expose(func):
func.exposed = True
return func
class Undefined(object):
pass
UNDEFINED = Undefined()
class flattener(object):
def __init__(self, iterator):
while type(iterator) == flattener:
iterator = iterator.iterator
self.iterator = iterator
@classmethod
def decorate(cls, func):
def inner(*args, **kwargs):
return cls(func(*args, **kwargs))
return inner
def accumulate_str(self):
if type(self.iterator) == flattener:
return self.iterator.accumulate_str()
s = ''
iter_stack = [self.iterator]
while iter_stack:
try:
x = iter_stack[-1].next()
except StopIteration:
iter_stack.pop()
continue
if type(x) == flattener:
iter_stack.append(x.iterator)
elif x is None:
pass
else:
s += x
return s
def __iter__(self):
for x in self.iterator:
if type(x) == flattener:
for xx in x:
if xx is not None:
yield xx
elif x is not None:
yield x
def literal(text):
return flattener(iter([text]))
class NameGen(object):
lcl = local()
def __init__(self):
self.names = set()
@classmethod
def gen(cls, hint):
if not hasattr(cls.lcl, 'inst'):
cls.lcl.inst = NameGen()
return cls.lcl.inst._gen(hint)
def _gen(self, hint):
r = hint
while r in self.names:
r = '%s_%d' % (hint, randint(0, len(self.names) * 10))
self.names.add(r)
return r
def gen_name(hint='_kj_'):
return NameGen.gen(hint)
def window(seq, n=2):
"""Return a sliding window of size ``n`` over an iterator"""
l = deque((next(seq, None) for _ in range(n)), maxlen=n)
push = l.append
yield l
for item in seq:
push(item)
yield l
|