- Added
statsutils.modeto return the most common value, breaking ties by first appearance (#453) - Fixed
setutils.IndexedSet.updateadding the iterables themselves instead of their elements when given multiple inputs (#474) - Fixed
strutils.iter_splitlinesandstrutils.indentsplitting dates containing28or29instead of recognizing Unicode line separators (#475) - Added
strutils.ellipsizefor word-boundary-aware text truncation with an ellipsis - Fixed
funcutils.wrapspassing arguments positionally to wrappers that only accept them as keywords (#261) - Fixed
tableutils.Table.to_textcrashes on empty tables,Noneheaders, and short header rows; empty headers now render no header row, matchingto_html - Fixed
timeutils.isoparsemisreading fractional seconds (.851parsed as 851碌s instead of 851000碌s); >6-digit fractions now truncate instead of raising - Fixed
timeutils.daterangelooping forever on non-advancing steps: zero and self-cancelling month/day steps now raiseValueError, wrong-direction steps yield nothing likerange() - Fixed
strutils.MultiReplaceraisingKeyErroron empty substitution maps (now a no-op) - Fixed
jsonutils.JSONLIteratorhanging when a seek lands past the last newline, and negativerel_seekvalues seeking past EOF (sign bug) - Fixed
iterutils.xfrangeyielding nothing for descending ranges; now sharesfrange's count-based semantics, so both agree at inexact float boundaries - Fixed
urlutils.parse_qslignoring itsencodingargument when decoding keys and values (#455) - Fixed
dictutils.OrderedMultiDict.addlistdropping values from one-shot iterables, including the vendored copy inurlutils(#458) - Fixed
ecoutils.get_profilelooking up identifying host, username, and working-directory information whenscrub=True(#461) - Fixed
namedutils.namedtupleandnamedutils.namedlistraisingIndexErrorinstead ofValueErrorfor empty type and field names (#462) - Fixed
iterutils.GUIDeratorerror text to reflect the inclusive minimum size of 20 (#451) - Fixed
timeutils.decimal_relative_timeandrelative_timerejecting aware datetimes when the comparison time is omitted (#469) - Fixed
timeutils.USTimeZonehandling of repeated and missing DST hours, includingfoldon UTC conversion (#441) - Fixed
mathutils.Bitsnegative indexing (#450) - Fixed
mathutils.Bitsempty binary, hexadecimal, and byte round trips (#468) - Sped up
setutils.IndexedSetbulk difference and intersection updates with a single-pass rebuild (#440) - Fixed
listutils.BarrelListout-of-range indexing returning unrelated values (#440) - Fixed
listutils.BarrelListinsertion clamping across multiple internal lists (#440) - Fixed
listutils.BarrelListpopping after an internal list was emptied by indexed removals (#440) - Fixed
listutils.BarrelList.iter_sliceslice normalization and reverse steps (#471) - Fixed
listutils.BarrelList.del_slicedeletion across internal lists and through the end of the list (#472) - Fixed
jsonutils.JSONLIteratorrejecting the documentedrel_seek=1.0endpoint (#465) - Fixed
jsonutils.JSONLIteratorrelative seeking in binary streams (#464) - Fixed
statsutils.Stats.get_histogram_countsdivision by zero for data with no interquartile spread (#467) - Fixed
jsonutils.reverse_iter_linesignoring explicit and stream encodings (#463) - Fixed
jsonutils.reverse_iter_linesdetaching the caller's text stream, preventing later reads and context-manager cleanup (#466) - Fixed
cacheutils.ThresholdCounter.updateignoring mapping and keyword counts (#476) - Fixed
cacheutils.LRI.updateandcacheutils.LRU.updaterejecting empty and keyword-only updates, and ignoring keywords when the source is the cache itself (#478) - Fixed
cacheutils.ThresholdCounter.most_commonreturning no pairs when the limit is omitted (#460) - Fixed
strutils.bytes2humanfailing to use theYsuffix for yottabyte-sized values (#459) - Fixed
urlutils.URL.get_authoritydropping passwords when the username is empty (#477) - Fixed
strutils.args2shandstrutils.args2cmdignoring thesepargument (#454) - Fixed
statsutils.Stats.pearson_typeraisingRuntimeErrorinstead of classifying Pearson types IV, V, and VI (#434) - Fixed
statsutils.Stats.pearson_typedivision by zero at the exact coefficient boundary, preserving the existing Normal and Gamma cases (#434) - Fixed
setutils.complementsubset and superset comparisons raisingAttributeError(#438) - Fixed
mathutils.Bitsaccepting values too large for the requested bit length - Fixed
tbutils.ParsedExceptiondropping Python 3.11+ traceback anchor lines during round trips (#333) - Fixed
strutils.pluralizehandling of words ending inx, such asbox - Fixed
iterutils.backoff_iterdivision by zero withfactor=1.0and no count; equal bounds yield once, and unequal bounds raiseValueError
Full Changelog: 26.1.0...26.2.0