Version are structured like the following: <major>.<minor>.<bugfix>. The first 0.1 release does not properly adhere to this. Unless explicitly stated, changes are made by Andreas Runfalk.

Version 1.1.1

Released on 21st April, 2021

  • Normalize ranges to be empty when start and end is the same and either bound is exclusive (bug #18, lgharibashvili)

Version 1.1.0

Released on 2nd June, 2019

This release changes a lot of internal implementation details that should prevent methods from not handling unbounded ranges correctly in the future.

  • Added validation to ensure unbounded ranges are never inclusive
  • Changed __repr__ for ranges to be more similar to proper Python syntax. The old representation looked like mismatched parentheses. For instance floatrange((,10.0]) becomes floatrange(upper=10.0, upper_inc=True)
  • Dropped Python 3.3 support since it’s been EOL for almost two years. It probably still works but it is no longer tested
  • Fixed pickling of empty range sets not working (bug #14)
  • Fixed union() not working properly with unbounded ranges
  • Fixed lowerly unbounded ranges improperly being lower inclusive
  • Fixed startswith() and endsbefore() being not handling empty ranges

Version 1.0.2

Released on 22th February, 2019

Version 1.0.1

Released on 31st January, 2018

  • Fixed PartialOrderingMixin not using __slots__ (bug #10)

Version 1.0.0

Released on 8th June, 2017

  • Added NotImplemented for << and >> operators when there is a type mismatch
  • Added | operator for unions of Range and NotImplemented support for RangeSet
  • Added & operator for intersections of Range and NotImplemented support for RangeSet
  • Added - operator for differences of Range and NotImplemented support for RangeSet
  • Added reversed() iterator support for DiscreteRange
  • Fixed overlap with empty range incorrectly returns True (bug #7)
  • Fixed issue with contains() for scalars on unbounded ranges
  • Fixed type check for right_of()
  • Fixed type check for contains()
  • Fixed type check for union()
  • Fixed type check for intersection()
  • Fixed type check for difference()
  • Fixed infinite iterators not being supported for DiscreteRange

Version 0.5.0

Released on 16th April, 2017

This release is a preparation for a stable 1.0 release.

  • Fixed comparison operators when working with empty or unbounded ranges. They would previously raise exceptions. Ranges are now partially ordered instead of totally ordered
  • Added more unit tests
  • Renamed classes to match PEP 8#class-names conventions. This does not apply to classes that works on built-in that does not follow PEP 8#class-names.
  • Refactored left_of()
  • Refactored overlap()
  • Refactored union()

Version 0.4.0

Released on 20th March, 2017

This release is called 0.4.1 on PyPI because I messed up the upload.

  • Added new argument to from_date() for working with different kinds of date intervals. The argument accepts a period of either "day" (default), "week" (ISO week), "american_week" (starts on sunday), "month", "quarter" or "year".
  • Added new methods to daterange for working with different kinds of date intervals: from_week(), from_month(), from_quarter() and from_year().
  • Added a new class PeriodRange for working with periods like weeks, months, quarters or years. It inherits all methods from daterange and is aware of its own period type. It allows things like getting the previous or next week.
  • Fixed daterange not accepting subclasses of date (bug #5)
  • Fixed some broken doctests
  • Moved unit tests to pytest
  • Removed Tox config
  • Minor documentation tweaks

Version 0.3.0

Released on 26th August, 2016

  • Added documentation for __iter__()
  • Fixed intersection of multiple range sets not working correctly (bug #3)
  • Fixed iteration of RangeSet returning an empty range when RangeSet is empty (bug #4)


This change is backwards incompatible to code that expect range sets to always return at least one set when iterating.

Version 0.2.1

Released on 27th June, 2016

  • Fixed RangeSet not returning NotImplemented when comparing to classes that are not sub classes of RangeSet, pull request #2 (Michael Krahe)
  • Updated license in to follow recommendations by PyPA

Version 0.2.0

Released on 22nd December, 2015

  • Added __len__() to range sets (Michael Krahe)
  • Added contains() to range sets (Michael Krahe)
  • Added Sphinx style doc strings to all methods
  • Added proper Sphinx documentation
  • Added unit tests for uncovered parts, mostly error checking
  • Added wheel to PyPI along with source distribution
  • Fixed a potential bug where comparing ranges of different types would result in an infinite loop
  • Changed meta class implementation for range sets to allow more mixins for custom range sets

Version 0.1.4

Released on 15th May, 2015

Version 0.1.3

Released on 27th February, 2015

  • Added offset() to some range types
  • Added offset() to some range set types
  • Added sanity checks to range boundaries
  • Fixed incorrect __slots__ usage, resulting in __slots__ not being used on most ranges
  • Fixed pickling of ranges and range sets
  • Simplified creation of new range sets, by the use of the meta class MetaRangeSet

Version 0.1.2

Released on 13th June, 2014

  • Fix for inproper version detection on Ubuntu’s bundled Python interpreter

Version 0.1.1

Released on 12th June, 2014

  • Readme fixes
  • Syntax highlighting for PyPI page

Version 0.1.0

Released on 30th August, 2013

  • Initial release