Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/humanfriendly/case.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/humanfriendly/case.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -# Human friendly input/output in Python. -# -# Author: Peter Odding <peter@peterodding.com> -# Last Change: April 19, 2020 -# URL: https://humanfriendly.readthedocs.io - -""" -Simple case insensitive dictionaries. - -The :class:`CaseInsensitiveDict` class is a dictionary whose string keys -are case insensitive. It works by automatically coercing string keys to -:class:`CaseInsensitiveKey` objects. Keys that are not strings are -supported as well, just without case insensitivity. - -At its core this module works by normalizing strings to lowercase before -comparing or hashing them. It doesn't support proper case folding nor -does it support Unicode normalization, hence the word "simple". -""" - -# Standard library modules. -import collections - -try: - # Python >= 3.3. - from collections.abc import Iterable, Mapping -except ImportError: - # Python 2.7. - from collections import Iterable, Mapping - -# Modules included in our package. -from humanfriendly.compat import basestring, unicode - -# Public identifiers that require documentation. -__all__ = ("CaseInsensitiveDict", "CaseInsensitiveKey") - - -class CaseInsensitiveDict(collections.OrderedDict): - - """ - Simple case insensitive dictionary implementation (that remembers insertion order). - - This class works by overriding methods that deal with dictionary keys to - coerce string keys to :class:`CaseInsensitiveKey` objects before calling - down to the regular dictionary handling methods. While intended to be - complete this class has not been extensively tested yet. - """ - - def __init__(self, other=None, **kw): - """Initialize a :class:`CaseInsensitiveDict` object.""" - # Initialize our superclass. - super(CaseInsensitiveDict, self).__init__() - # Handle the initializer arguments. - self.update(other, **kw) - - def coerce_key(self, key): - """ - Coerce string keys to :class:`CaseInsensitiveKey` objects. - - :param key: The value to coerce (any type). - :returns: If `key` is a string then a :class:`CaseInsensitiveKey` - object is returned, otherwise the value of `key` is - returned unmodified. - """ - if isinstance(key, basestring): - key = CaseInsensitiveKey(key) - return key - - @classmethod - def fromkeys(cls, iterable, value=None): - """Create a case insensitive dictionary with keys from `iterable` and values set to `value`.""" - return cls((k, value) for k in iterable) - - def get(self, key, default=None): - """Get the value of an existing item.""" - return super(CaseInsensitiveDict, self).get(self.coerce_key(key), default) - - def pop(self, key, default=None): - """Remove an item from a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).pop(self.coerce_key(key), default) - - def setdefault(self, key, default=None): - """Get the value of an existing item or add a new item.""" - return super(CaseInsensitiveDict, self).setdefault(self.coerce_key(key), default) - - def update(self, other=None, **kw): - """Update a case insensitive dictionary with new items.""" - if isinstance(other, Mapping): - # Copy the items from the given mapping. - for key, value in other.items(): - self[key] = value - elif isinstance(other, Iterable): - # Copy the items from the given iterable. - for key, value in other: - self[key] = value - elif other is not None: - # Complain about unsupported values. - msg = "'%s' object is not iterable" - type_name = type(value).__name__ - raise TypeError(msg % type_name) - # Copy the keyword arguments (if any). - for key, value in kw.items(): - self[key] = value - - def __contains__(self, key): - """Check if a case insensitive dictionary contains the given key.""" - return super(CaseInsensitiveDict, self).__contains__(self.coerce_key(key)) - - def __delitem__(self, key): - """Delete an item in a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).__delitem__(self.coerce_key(key)) - - def __getitem__(self, key): - """Get the value of an item in a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).__getitem__(self.coerce_key(key)) - - def __setitem__(self, key, value): - """Set the value of an item in a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).__setitem__(self.coerce_key(key), value) - - -class CaseInsensitiveKey(unicode): - - """ - Simple case insensitive dictionary key implementation. - - The :class:`CaseInsensitiveKey` class provides an intentionally simple - implementation of case insensitive strings to be used as dictionary keys. - - If you need features like Unicode normalization or proper case folding - please consider using a more advanced implementation like the :pypi:`istr` - package instead. - """ - - def __new__(cls, value): - """Create a :class:`CaseInsensitiveKey` object.""" - # Delegate string object creation to our superclass. - obj = unicode.__new__(cls, value) - # Store the lowercased string and its hash value. - normalized = obj.lower() - obj._normalized = normalized - obj._hash_value = hash(normalized) - return obj - - def __hash__(self): - """Get the hash value of the lowercased string.""" - return self._hash_value - - def __eq__(self, other): - """Compare two strings as lowercase.""" - if isinstance(other, CaseInsensitiveKey): - # Fast path (and the most common case): Comparison with same type. - return self._normalized == other._normalized - elif isinstance(other, unicode): - # Slow path: Comparison with strings that need lowercasing. - return self._normalized == other.lower() - else: - return NotImplemented