diff options
Diffstat (limited to 'aptdaemon/utils.py')
-rw-r--r-- | aptdaemon/utils.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/aptdaemon/utils.py b/aptdaemon/utils.py new file mode 100644 index 0000000..d7da9ce --- /dev/null +++ b/aptdaemon/utils.py @@ -0,0 +1,131 @@ +"""Module with little helper functions and classes: + +deprecated - decorator to emit a warning if a depreacted function is used +""" +# Copyright (C) 2008-2009 Sebastian Heinlein <sevel@glatzor.de> +# +# Licensed under the GNU General Public License Version 2 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +__author__ = "Sebastian Heinlein <devel@glatzor.de>" + +__all__ = ("deprecated", "IsoCodes") + +import os +import sys +import contextlib +import gettext +import functools +import warnings +from xml.etree import ElementTree + +if sys.version >= '3': + _gettext_method = "gettext" +else: + _gettext_method = "ugettext" + + +def deprecated(func): + """This is a decorator which can be used to mark functions + as deprecated. It will result in a warning being emitted + when the function is used. + + Taken from http://wiki.python.org/moin/PythonDecoratorLibrary + #GeneratingDeprecationWarnings + """ + @functools.wraps(func) + def new_func(*args, **kwargs): + warnings.warn_explicit( + "Call to deprecated function %(funcname)s." % { + 'funcname': func.__name__, + }, + category=DeprecationWarning, + filename=func.__code__.co_filename, + lineno=func.__code__.co_firstlineno + 1 + ) + return func(*args, **kwargs) + return new_func + + +@contextlib.contextmanager +def set_euid_egid(uid, gid): + # no need to drop privs + if os.getuid() != 0 and os.getgid() != 0: + yield + return + # temporary drop privs + os.setegid(gid) + old_groups = os.getgroups() + os.setgroups([gid]) + os.seteuid(uid) + try: + yield + finally: + os.seteuid(os.getuid()) + os.setegid(os.getgid()) + os.setgroups(old_groups) + + +class IsoCodes(object): + + """Provides access to the iso-codes language, script and country + database. + """ + + def __init__(self, norm, tag, fallback_tag=None): + filename = "/usr/share/xml/iso-codes/%s.xml" % norm + et = ElementTree.ElementTree(file=filename) + self._dict = {} + self.norm = norm + for element in list(et.iter()): + iso_code = element.get(tag) + if not iso_code and fallback_tag: + iso_code = element.get(fallback_tag) + if iso_code: + self._dict[iso_code] = element.get("name") + + def get_localised_name(self, value, locale): + try: + name = self._dict[value] + except KeyError: + return None + trans = gettext.translation(domain=self.norm, fallback=True, + languages=[locale]) + return getattr(trans, _gettext_method)(name) + + def get_name(self, value): + try: + return self._dict[value] + except KeyError: + return None + + +def split_package_id(package): + """Return the name, the version number and the release of the + specified package.""" + if "=" in package: + name, version = package.split("=", 1) + release = None + elif "/" in package: + name, release = package.split("/", 1) + version = None + else: + name = package + version = release = None + return name, version, release + + +# vim:ts=4:sw=4:et |