Skip to content

Commit

Permalink
Fixes #36
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexandreDecan committed Aug 21, 2020
1 parent ce5d547 commit 4ad4a3c
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 10 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# Changelog


## 2.1.1 (2020-08-21)

### Fixed
- A regression for `IntervalDict` introduced in 2.1.0 ([#36](https://github.com/AlexandreDecan/portion/issues/36)).



## 2.1.0 (2020-08-09)

### Added
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The `portion` library (formerly distributed as `python-intervals`) provides data
- Heavily tested with high code coverage.

**Latest release:**
- `portion`: 2.1.0 on 2020-08-09 ([documentation](https://github.com/AlexandreDecan/portion/blob/2.1.0/README.md), [changes](https://github.com/AlexandreDecan/portion/blob/2.1.0/CHANGELOG.md)).
- `portion`: 2.1.1 on 2020-08-21 ([documentation](https://github.com/AlexandreDecan/portion/blob/2.1.1/README.md), [changes](https://github.com/AlexandreDecan/portion/blob/2.1.1/CHANGELOG.md)).
- `python-intervals`: 1.10.0 on 2019-09-26 ([documentation](https://github.com/AlexandreDecan/portion/blob/1.10.0/README.md), [changes](https://github.com/AlexandreDecan/portion/blob/1.10.0/README.md#changelog)).

Note that `python-intervals` will no longer receive updates since it has been replaced by `portion`.
Expand Down
35 changes: 27 additions & 8 deletions portion/dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,6 @@ def update(self, mapping_or_iterable):
data = mapping_or_iterable

for i, v in data:
i = singleton(i) if not isinstance(i, Interval) else i
self[i] = v

def combine(self, other, how):
Expand Down Expand Up @@ -261,41 +260,61 @@ def __setitem__(self, key, value):
if interval.empty:
return

removed_keys = []
added_items = []

found = False
for i, v in self._storage.items():
if value == v:
found = True
# Extend existing key
self._storage.pop(i)
self._storage[i | interval] = v
removed_keys.append(i)
added_items.append((i | interval, v))
elif i.overlaps(interval):
# Reduce existing key
remaining = i - interval
self._storage.pop(i)
removed_keys.append(i)
if not remaining.empty:
self._storage[remaining] = v
added_items.append((remaining, v))

if not found:
self._storage[interval] = value
added_items.append((interval, value))

# Update storage accordingly
for key in removed_keys:
self._storage.pop(key)

for key, value in added_items:
self._storage[key] = value

def __delitem__(self, key):
interval = key if isinstance(key, Interval) else singleton(key)

if interval.empty:
return

removed_keys = []
added_items = []

found = False
for i, v in self._storage.items():
if i.overlaps(interval):
found = True
remaining = i - interval
self._storage.pop(i)
removed_keys.append(i)
if not remaining.empty:
self._storage[remaining] = v
added_items.append((remaining, v))

if not found and not isinstance(key, Interval):
raise KeyError(key)

# Update storage accordingly
for key in removed_keys:
self._storage.pop(key)

for key, value in added_items:
self._storage[key] = value

def __iter__(self):
return iter(self._storage)

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

setup(
name='portion',
version='2.1.0',
version='2.1.1',
license='LGPLv3',

author='Alexandre Decan',
Expand Down

0 comments on commit 4ad4a3c

Please sign in to comment.