- Improve performance of
Intervalcreation and union for large disjunctions of overlapping intervals. - Improve performance of
Interval.__contains__for values.
- A
__version__attribute relying onimportlib.metadata. - A
uv.locklock-file for reproducible builds.
- Drop official support for Python 3.8.
- Switch from
blacktorufffor code style. - Fully migrate to a
pyproject.toml-based project. - Ensure code style consistency (see selected rules in
pyproject.toml). - Extra dependencies are part of the
devdependency group (PEP 735). - Switch from
setuptoolstohatchlingfor buildingportion. - Switch from
coveragetopytest-covfor test coverage.
- The
howfunction ofcombinecan access the current interval ifpass_intervalis set (see #97).
- The
combinemethod of anIntervalDictaccepts amissingparameter to fill values for non-overlapping keys (see #96). - A recipe to
combinemore than twoIntervalDict(see #95).
- Drop official support for Python 3.7.
- Import error when using
create_apiin Python 3.10+ (see #87).
- Import error when using
create_apioutside a REPL (see #85).
- An
AbstractDiscreteIntervalclass to ease the creation of specialized discrete intervals (experimental). - A
create_apifunction to generate an API similar to the one ofportionbut configured to use a given subclass ofInterval(experimental, see Specialize & customize intervals).
- Speed up
reprandto_stringforIntervalinstances (see #76, adm271828). - Some internal changes to ease subclassing:
from_stringandfrom_dataaccepts aklassparameter to specify which class should be used to createIntervalinstances (default isInterval).- Add a
klassparameter foropen,closed,openclosed,closedopen,singletonandempty(default isInterval). - Add a
_klassclass attribute inIntervalDictto specify how to createIntervalinstances (default isInterval). IntervalDictusesself.__class__to preserve subclasses when creating new instances.
- Speed up lookups in
IntervalDictfor non-interval keys. - Speed up
iterateby no longer creating singleton instances under the hood. - Drop official support for Python 3.6.
- Infinite recursion when a subclass of an
Intervalis compared using>with anIntervalinstance (see #75).
- Support for Python 3.10.
IntervalDict.as_dicthas an optionalatomic=Falseparameter that, if set toTrue, returns intervals that are atomic.- Experimental support for structural pattern matching (on
left,lower,upperandright).
- (breaking) Set
list(P.empty()) == [], i.e., the empty interval is a disjunction of no interval (see #72). - (breaking) For consistency, the empty interval is never
<,>,<=, nor>=when compared to another interval. - Comparing an interval and a value is deprecated since it is ill-defined when the value is on the left of
<=or>=. Convert values to singletons first.
- Support PEP 517.
- Some internal changes to ease subclassing
Interval(see #58):- Use
self.__class__instead ofIntervalto create new instances; - Deprecate and move
mergeablefunction toInterval._mergeableclass method; Interval.from_atomicis now a class method instead of a static method.
- Use
- Speed up lookups in
IntervalDict(#65, Jeff Trull). - Speed up removals in
IntervalDict. - Speed up intersection for non-overlapping intervals (#66, Jeff Trull).
- Speed up
.overlapsand.containsfor non-overlapping intervals/items.
- Drop official support for Python 3.5.
- Use
blackas official code formatting.
from_stringraises aValueErrorif given string cannot be parsed to an interval (#57).
- Getting items from an
Intervalusing a slice does no longer return alistbut anIntervalinstance. - Intervals are properly pretty-printed by
pandas(#54).
- Much faster
get,copyand|operations forIntervalDict.
- Empty intervals are contained in all intervals (#41).
IntervalDictsupports|and|=, the same waydictwill do starting from Python 3.9 (#37).
- Fix invalid simplification of 3+ intervals when a closed interval shares the lower bound of an open one (#38).
- Fix the order in which items are returned from an
IntervalDictwhen a closed interval shares the lower bound of an open one (#39).
- Fix a regression introduced in 2.1.0 for
IntervalDict(#36).
IntervalDict.as_dict()to export its content to a classical Pythondict.
IntervalDict.keys(),values()anditems()return view objects instead of lists.
IntervalDict.popitem()now returns a (key, value) pair instead of anIntervalDict.- The documentation of
IntervalDict.pop()now correctly states that the value (and not the key) is returned.
- Fix occasional
StopIterationexception when checking for containment (#28).
- Fix invalid representations of non-atomic intervals composed of a singleton (#22).
i.emptyto check for interval emptiness.i.atomicto check for interval atomicity.- An
adjacentmethod to test whether two intervals are adjacent. i.__getitem__supports slices.- Infinities define a hash value.
- Static method
Interval.from_atomic(left, lower, upper, right)to create an interval composed of a single atomic interval (replacesAtomicInterval(left, lower, upper, right)).
- (breaking)
python-intervalshas been renamedportion. - (breaking) Many (optional) parameters are converted to keyword-only arguments:
- for
from_stringandto_string:bound,disj,sep,left_open,left_closed,right_open,right_closed,pinfandninf; - for
from_dataandto_data:pinfandninf; - for
iterate:baseandreverse; - for
Interval.replace:ignore_inf.
- for
- (breaking)
incris replaced bystepiniterate. - (breaking) For consistency with
range, thestepparameter initerateis always added even ifreverse=True. - (breaking)
i.enclosureis a property and no longer a method. - (breaking) Indexing or iterating on the atomic intervals of an
IntervalreturnsIntervalinstances instead ofAtomicIntervalones. - (breaking) An interval is hashable if and only if its bounds are hashable.
- Huge performance increase for creation, union, intersection, complement and difference of intervals (#21).
CLOSEDandOPENare members of theBoundenumeration.- Large refactoring to encapsulate
AtomicIntervaland all its operations inInterval. - Restructure package in modules instead of a flat file.
- Reorganise tests in modules and classes instead of a flat file.
- Reorganise changelog with explicit categories.
- (breaking) Drop support for Python 2.7 and 3.4 since they reached end-of-life.
- (breaking)
AtomicIntervalis anamedtupleand is no longer part of the public API. - (breaking) Remove
i.to_atomic()(usei.enclosureinstead). - (breaking) Remove
i.is_empty()(usei.emptyinstead). - (breaking) Remove
i.is_atomic()(usei.atomicinstead). - (breaking)
CLOSEDandOPENdo no longer define an implicit Boolean value. Use~instead ofnotto invert a bound. - (breaking) Remove deprecated
permissiveini.overlaps. - (breaking) Remove
adjacentini.overlaps, usei.adjacentmethod instead.
- Fix an issue where an interval can be composed of duplicated empty intervals (#19).
- Fix performance issues when intervals composed of hundreds of atomic intervals are complemented (#20)
IntervalDicthas a.combinemethod to merge its keys and values with anotherIntervalDict.
- Discrete iteration on the values of an interval with
iterate. - Map intervals to data with the dict-like
IntervalDictstructure.
- Faster comparisons between arbitrary values and intervals.
- Deprecate
permissivein.overlapsin favour ofadjacent.
.unionwhen intervals share a bound, one inclusive and one exclusive (#12)..overlapswhen intervals share a lower bound, and one interval is contained within the other one (#13).
- Intervals have a
.left,.lower,.upper, and.rightattribute that refer to its enclosure. - Intervals have a
.replacemethod to create new intervals based on the current one. This method accepts both values and functions. - Intervals have an
.applymethod to apply a function on the underlying atomic intervals. - Intervals can be compared with single values as well.
P.empty()returns the same instance to save memory.- Infinities are singleton objects.
- Set
len(P.empty()) = 1andP.empty()[0] == P.empty().to_atomic()for consistency.
- Import from and export to Python built-in data types (a list of 4-uples) with
from_dataandto_data(#6). - Examples for arbitrary interval transformations.
- Support for customized infinity representation in
to_stringandfrom_string(#3).
.overlaps(#2).
- Invalid
reprfor atomic singleton intervals.
- Invalid comparisons when both
IntervalandAtomicIntervalare compared.
- #1 by making empty intervals always resolving to
(P.inf, -P.inf).
Interval.__init__acceptsIntervalinstances in addition toAtomicIntervalones.
- Function
P.to_stringto export an interval to a string, with many options to customize the representation. - Function
P.from_stringto create an interval from a string, with many options to customize the parsing.
- Support for Python 2.7.
- More tests to cover all comparisons.
- Define
__slots__to lower memory usage, and to speed up attribute access. - Define
Interval.__rand__(and other magic methods) to supportIntervalfromAtomicIntervalinstead of having a dedicated piece of code inAtomicInterval. __all__properly defined.
- Meaningful
<=and>=comparisons for intervals.
Intervalsupports indexing to retrieve the underlyingAtomicIntervalobjects.
- Both
AtomicIntervalandIntervalare fully comparable. singleton(x)to create a singleton interval [x].empty()to create an empty interval.Interval.enclosure()that returns the smallest interval that includes the current one.
- Interval simplification is in O(n) instead of O(n*m).
AtomicIntervalobjects in anIntervalare sorted by lower and upper bounds.
- All operations of
AtomicInterval(except overlaps) acceptInterval. - Raise
TypeErrorinstead ofValueErrorif type is not supported (coherent withNotImplemented).
- Initial release on PyPP.
- Initial release.