class CaseInsensitiveDict(MutableMapping): """ Inspired by requests' case-insensitive dict implementation, but works with non-string keys as well. """ def __init__(self, init=None, **kwargs): """ Force internal dict to be ordered to ensure a consistent iteration order, irrespective of case. """ self._data = OrderedDict() self.update(init or {}, **kwargs) def __len__(self): return len(self._data) def __setitem__(self, key, value): # Store the case-sensitive key so it is available for dict iteration self._data[to_lowercase(key)] = (key, value) def __delitem__(self, key): del self._data[to_lowercase(key)] def __getitem__(self, key): return self._data[to_lowercase(key)][1] def __iter__(self): return (item[0] for item in iter(self._data.values())) def __eq__(self, rval): if not isinstance(rval, Mapping): # Comparing to non-mapping type (e.g. int) is always False return False return dict(self.items_lower()) == dict(CaseInsensitiveDict(rval).items_lower()) def __repr__(self): return repr(dict(iter(self.items()))) def items_lower(self): """ Returns a generator iterating over keys and values, with the keys all being lowercase. """ return ((key, val[1]) for key, val in iter(self._data.items())) def copy(self): """ Returns a copy of the object """ return CaseInsensitiveDict(iter(self._data.items()))
# -*- coding: utf-8 -*- ''' Application Kinds of Hubble. These are used to indicate what kind of Application is using RAET ''' from collections import namedtuple from hubblestack.utils.odict import OrderedDict # Python equivalent of an enum APPL_KINDS = OrderedDict([('master', 0), ('minion', 1), ('syndic', 2), ('caller', 3)]) APPL_KIND_NAMES = OrderedDict((v, k) for k, v in list(APPL_KINDS.items())) # inverse map ApplKind = namedtuple('ApplKind', list(APPL_KINDS.keys())) applKinds = ApplKind(**APPL_KINDS)