diff options
Diffstat (limited to 'alot/addressbook')
-rw-r--r-- | alot/addressbook/__init__.py | 38 | ||||
-rw-r--r-- | alot/addressbook/abook.py | 31 | ||||
-rw-r--r-- | alot/addressbook/external.py | 73 |
3 files changed, 142 insertions, 0 deletions
diff --git a/alot/addressbook/__init__.py b/alot/addressbook/__init__.py new file mode 100644 index 00000000..f649b523 --- /dev/null +++ b/alot/addressbook/__init__.py @@ -0,0 +1,38 @@ +# Copyright (C) 2011-2015 Patrick Totzke <patricktotzke@gmail.com> +# This file is released under the GNU GPL, version 3 or a later revision. +# For further details see the COPYING file +import re + + +class AddressbookError(Exception): + pass + + +class AddressBook(object): + """can look up email addresses and realnames for contacts. + + .. note:: + + This is an abstract class that leaves :meth:`get_contacts` + unspecified. See :class:`AbookAddressBook` and + :class:`MatchSdtoutAddressbook` for implementations. + """ + def __init__(self, ignorecase=True): + self.reflags = re.IGNORECASE if ignorecase else 0 + + def get_contacts(self): + """list all contacts tuples in this abook as (name, email) tuples""" + return [] + + def lookup(self, query=''): + """looks up all contacts where name or address match query""" + res = [] + query = '.*%s.*' % query + for name, email in self.get_contacts(): + try: + if re.match(query, name, self.reflags) or \ + re.match(query, email, self.reflags): + res.append((name, email)) + except: + pass + return res diff --git a/alot/addressbook/abook.py b/alot/addressbook/abook.py new file mode 100644 index 00000000..c71f485c --- /dev/null +++ b/alot/addressbook/abook.py @@ -0,0 +1,31 @@ +# Copyright (C) 2011-2015 Patrick Totzke <patricktotzke@gmail.com> +# This file is released under the GNU GPL, version 3 or a later revision. +# For further details see the COPYING file + +import os +from . import AddressBook +from ..settings.utils import read_config + + +class AbookAddressBook(AddressBook): + """:class:`AddressBook` that parses abook's config/database files""" + def __init__(self, path='~/.abook/addressbook', **kwargs): + """ + :param path: path to theme file + :type path: str + """ + AddressBook.__init__(self, **kwargs) + DEFAULTSPATH = os.path.join(os.path.dirname(__file__), 'defaults') + self._spec = os.path.join(DEFAULTSPATH, 'abook_contacts.spec') + path = os.path.expanduser(path) + self._config = read_config(path, self._spec) + del(self._config['format']) + + def get_contacts(self): + c = self._config + res = [] + for id in c.sections: + for email in c[id]['email']: + if email: + res.append((c[id]['name'], email)) + return res diff --git a/alot/addressbook/external.py b/alot/addressbook/external.py new file mode 100644 index 00000000..5c88b291 --- /dev/null +++ b/alot/addressbook/external.py @@ -0,0 +1,73 @@ +# Copyright (C) 2011-2015 Patrick Totzke <patricktotzke@gmail.com> +# This file is released under the GNU GPL, version 3 or a later revision. +# For further details see the COPYING file +import re + +from ..helper import call_cmd +from ..helper import split_commandstring +from . import AddressBook, AddressbookError + + +class ExternalAddressbook(AddressBook): + """:class:`AddressBook` that parses a shell command's output""" + + def __init__(self, commandline, regex, reflags=0, + external_filtering=True, + **kwargs): + """ + :param commandline: commandline + :type commandline: str + :param regex: regular expression used to match contacts in `commands` + output to stdout. Must define subparts named "email" and + "name". + :type regex: str + :param reflags: flags to use with regular expression. + Use the constants defined in :mod:`re` here + (`re.IGNORECASE` etc.) + :type reflags: str + :param external_filtering: if True the command is fired + with the given search string as parameter + and the result is not filtered further. + If set to False, the command is fired without + additional parameters and the result list is filtered + according to the search string. + :type external_filtering: bool + """ + AddressBook.__init__(self, **kwargs) + self.commandline = commandline + self.regex = regex + self.reflags = reflags + self.external_filtering = external_filtering + + def get_contacts(self): + return self._call_and_parse(self.commandline) + + def lookup(self, prefix): + if self.external_filtering: + return self._call_and_parse(self.commandline + " " + prefix) + else: + return AddressBook.lookup(self, prefix) + + def _call_and_parse(self, commandline): + cmdlist = split_commandstring(commandline) + resultstring, errmsg, retval = call_cmd(cmdlist) + if retval != 0: + msg = 'abook command "%s" returned with ' % commandline + msg += 'return code %d' % retval + if errmsg: + msg += ':\n%s' % errmsg + raise AddressbookError(msg) + + if not resultstring: + return [] + lines = resultstring.splitlines() + res = [] + for l in lines: + m = re.match(self.regex, l, self.reflags) + if m: + info = m.groupdict() + if 'email' and 'name' in info: + email = info['email'].strip() + name = info['name'] + res.append((name, email)) + return res |