| 694 | from _collections_abc import MutableMapping, Mapping |
| 695 | |
| 696 | class _Environ(MutableMapping): |
| 697 | def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue): |
| 698 | self.encodekey = encodekey |
| 699 | self.decodekey = decodekey |
| 700 | self.encodevalue = encodevalue |
| 701 | self.decodevalue = decodevalue |
| 702 | self._data = data |
| 703 | |
| 704 | def __getitem__(self, key): |
| 705 | try: |
| 706 | value = self._data[self.encodekey(key)] |
| 707 | except KeyError: |
| 708 | # raise KeyError with the original key value |
| 709 | raise KeyError(key) from None |
| 710 | return self.decodevalue(value) |
| 711 | |
| 712 | def __setitem__(self, key, value): |
| 713 | key = self.encodekey(key) |
| 714 | value = self.encodevalue(value) |
| 715 | putenv(key, value) |
| 716 | self._data[key] = value |
| 717 | |
| 718 | def __delitem__(self, key): |
| 719 | encodedkey = self.encodekey(key) |
| 720 | unsetenv(encodedkey) |
| 721 | try: |
| 722 | del self._data[encodedkey] |
| 723 | except KeyError: |
| 724 | # raise KeyError with the original key value |
| 725 | raise KeyError(key) from None |
| 726 | |
| 727 | def __iter__(self): |
| 728 | # list() from dict object is an atomic operation |
| 729 | keys = list(self._data) |
| 730 | for key in keys: |
| 731 | yield self.decodekey(key) |
| 732 | |
| 733 | def __len__(self): |
| 734 | return len(self._data) |
| 735 | |
| 736 | def __repr__(self): |
| 737 | formatted_items = ", ".join( |
| 738 | f"{self.decodekey(key)!r}: {self.decodevalue(value)!r}" |
| 739 | for key, value in self._data.items() |
| 740 | ) |
| 741 | return f"environ({{{formatted_items}}})" |
| 742 | |
| 743 | def copy(self): |
| 744 | return dict(self) |
| 745 | |
| 746 | def setdefault(self, key, value): |
| 747 | if key not in self: |
| 748 | self[key] = value |
| 749 | return self[key] |
| 750 | |
| 751 | def __ior__(self, other): |
| 752 | self.update(other) |
| 753 | return self |
no outgoing calls
no test coverage detected