diff options
author | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:24:06 +0300 |
---|---|---|
committer | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:41:34 +0300 |
commit | e0e3e1717e3d33762ce61950504f9637a6e669ed (patch) | |
tree | bca3ff6939b10ed60c3d5c12439963a1146b9711 /contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py | |
parent | 38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff) | |
download | ydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz |
add ydb deps
Diffstat (limited to 'contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py')
-rw-r--r-- | contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py b/contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py new file mode 100644 index 0000000000..d1eb5f2730 --- /dev/null +++ b/contrib/python/prompt-toolkit/py2/prompt_toolkit/history.py @@ -0,0 +1,120 @@ +from __future__ import unicode_literals +from abc import ABCMeta, abstractmethod +from six import with_metaclass + +import datetime +import os + +__all__ = ( + 'FileHistory', + 'History', + 'InMemoryHistory', +) + + +class History(with_metaclass(ABCMeta, object)): + """ + Base ``History`` interface. + """ + @abstractmethod + def append(self, string): + " Append string to history. " + + @abstractmethod + def __getitem__(self, key): + " Return one item of the history. It should be accessible like a `list`. " + + @abstractmethod + def __iter__(self): + " Iterate through all the items of the history. Cronologically. " + + @abstractmethod + def __len__(self): + " Return the length of the history. " + + def __bool__(self): + """ + Never evaluate to False, even when the history is empty. + (Python calls __len__ if __bool__ is not implemented.) + This is mainly to allow lazy evaluation:: + + x = history or InMemoryHistory() + """ + return True + + __nonzero__ = __bool__ # For Python 2. + + +class InMemoryHistory(History): + """ + :class:`.History` class that keeps a list of all strings in memory. + """ + def __init__(self): + self.strings = [] + + def append(self, string): + self.strings.append(string) + + def __getitem__(self, key): + return self.strings[key] + + def __iter__(self): + return iter(self.strings) + + def __len__(self): + return len(self.strings) + + +class FileHistory(History): + """ + :class:`.History` class that stores all strings in a file. + """ + def __init__(self, filename): + self.strings = [] + self.filename = filename + + self._load() + + def _load(self): + lines = [] + + def add(): + if lines: + # Join and drop trailing newline. + string = ''.join(lines)[:-1] + + self.strings.append(string) + + if os.path.exists(self.filename): + with open(self.filename, 'rb') as f: + for line in f: + line = line.decode('utf-8') + + if line.startswith('+'): + lines.append(line[1:]) + else: + add() + lines = [] + + add() + + def append(self, string): + self.strings.append(string) + + # Save to file. + with open(self.filename, 'ab') as f: + def write(t): + f.write(t.encode('utf-8')) + + write('\n# %s\n' % datetime.datetime.now()) + for line in string.split('\n'): + write('+%s\n' % line) + + def __getitem__(self, key): + return self.strings[key] + + def __iter__(self): + return iter(self.strings) + + def __len__(self): + return len(self.strings) |