Skip to content

Commit

Permalink
Merge pull request pepkit#36 from pepkit/dev
Browse files Browse the repository at this point in the history
release 0.10
  • Loading branch information
vreuter committed May 15, 2019
2 parents 0cae76c + 0c8b048 commit c088cbc
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 2 deletions.
2 changes: 1 addition & 1 deletion attmap/_version.py
@@ -1 +1 @@
__version__ = "0.9"
__version__ = "0.10"
10 changes: 10 additions & 0 deletions attmap/attmap.py
Expand Up @@ -113,6 +113,16 @@ def _new_empty_basic_map(self):
""" Return the empty collection builder for Mapping type simplification. """
return dict()

def _repr_pretty_(self, p, cycle):
"""
IPython display; https://ipython.readthedocs.io/en/stable/api/generated/IPython.lib.pretty.html
:param IPython.lib.pretty.PrettyPrinter p: printer instance
:param bool cycle: whether a cyclic reference is detected
:return str: text representation of the instance
"""
return p.text(repr(self) if not cycle else '...')

@property
def _transformations(self):
"""
Expand Down
2 changes: 1 addition & 1 deletion attmap/attmap_echo.py
Expand Up @@ -24,7 +24,7 @@ def __getattr__(self, item, default=None):
return super(self.__class__, self).__getattr__(item, default)
except (AttributeError, TypeError):
# If not, triage and cope accordingly.
if item.startswith("_OrderedDict") or \
if self._is_od_member(item) or \
(item.startswith("__") and item.endswith("__")):
# Accommodate security-through-obscurity approach of some libs.
error_reason = "Protected-looking attribute: {}".format(item)
Expand Down
50 changes: 50 additions & 0 deletions attmap/ordattmap.py
@@ -1,6 +1,7 @@
""" Ordered attmap """

from collections import OrderedDict
import itertools
from .attmap import AttMap
from .helpers import get_logger, safedel_message

Expand All @@ -19,6 +20,21 @@ class OrdAttMap(OrderedDict, AttMap):
def __init__(self, entries=None):
super(OrdAttMap, self).__init__(entries or {})

def __iter__(self):
return itertools.chain(
super(OrdAttMap, self).__iter__(),
filter(lambda k: not self._is_od_member(k), self.__dict__.keys()))

def __reversed__(self):
_LOGGER.warning("Reverse iteration as implemented may be inefficient")
return iter(reversed(list(self.keys())))

def __getitem__(self, item):
try:
return super(OrdAttMap, self).__getitem__(item)
except KeyError:
return AttMap.__getitem__(self, item)

def __setitem__(self, key, value):
super(OrdAttMap, self).__setitem__(key, self._finalize_value(value))

Expand All @@ -39,6 +55,40 @@ def __ne__(self, other):
def __repr__(self):
return AttMap.__repr__(self)

def keys(self):
return [k for k in self]

def values(self):
return [self[k] for k in self]

def items(self):
return [(k, self[k]) for k in self]

def clear(self):
raise NotImplementedError("Clearance isn't implemented for {}".
format(self.__class__.__name__))

__marker = object()

def pop(self, key, default=__marker):
try:
return super(OrdAttMap, self).pop(key)
except KeyError:
try:
return self.__dict__.pop(key)
except KeyError:
if default is self.__marker:
raise KeyError(key)
return default

def popitem(self, last=True):
raise NotImplementedError("popitem isn't supported on a {}".
format(self.__class__.__name__))

@staticmethod
def _is_od_member(name):
return name.startswith("_OrderedDict")

def _new_empty_basic_map(self):
return OrderedDict()

Expand Down
4 changes: 4 additions & 0 deletions docs/changelog.md
@@ -1,5 +1,9 @@
# Changelog

## [0.10] - 2019-05-15
### Fixed
- `OrdAttMap` and descendants now have data updated via `__setattr__` syntax.

## [0.9] - 2019-05-14
### Changed
- `OrdPathAttExAttMap` is now `PathExAttMap`.
Expand Down

0 comments on commit c088cbc

Please sign in to comment.