Source code for openalea.core.pkgdict

# -*- python -*-
#
#       OpenAlea.Core
#
#       Copyright 2006-2009 INRIA - CIRAD - INRA
#
#       File author(s): Samuel Dufour-Kowalski <samuel.dufour@sophia.inria.fr>
#
#       Distributed under the Cecill-C License.
#       See accompanying file LICENSE.txt or copy at
#           http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
#       OpenAlea WebSite : http://openalea.gforge.inria.fr
#
###############################################################################
"""Special Dict with case insensitive key and protected field"""
# from six.moves import filter

__license__ = "Cecill-C"
__revision__ = " $Id$ "


[docs] def lower(item): try: item = item.lower() finally: return item
[docs] def is_protected(item): """ Return true the item is protected """ try: return item.startswith('#') except: return False
[docs] def protected(item): " Return corresponding protected name for item " return "#" + item
[docs] class PackageDict(dict): """ Dictionnary with case insensitive key This object is able to handle protected entry begining with an '#' """ def __init__(self, *args): self.nb_public = None dict.__init__(self, *args) def __getitem__(self, item): item = lower(item) try: return dict.__getitem__(self, item) except KeyError: # Try to return protected entry return dict.__getitem__(self, protected(item)) def __setitem__(self, item, y): # Update nb public key if (self.nb_public and not self.has_key(item) and not is_protected(item)): self.nb_public += 1 return dict.__setitem__(self, lower(item), y) def __contains__(self, key): return self.has_key(key)
[docs] def has_key(self, key): key = lower(key) if dict.__contains__(self, key): return True else: return dict.__contains__(self, protected(key))
def __delitem__(self, key): # Update nb public key if (self.nb_public and not is_protected(key)): self.nb_public -= 1 return dict.__delitem__(self, lower(key))
[docs] def get(self, key, default=None): return dict.get(self, lower(key), default)
[docs] def iter_public_values(self): """ Iterate througth dictionnary value (remove protected value) """ for k, v in self.items(): if (not is_protected(k)): yield v
[docs] def nb_public_values(self): """ Return the number of unprotected values """ if (self.nb_public is None): l = lambda x: not is_protected(x) ks = filter(l, list(self.keys())) self.nb_public = len(list(ks)) return self.nb_public