## Changelog

### v0.27.3
#### Fixed
- add missing pypy and freethreaded linux wheels

#### Removed
- drop s390x and ppc64le wheels since they are virtually unused and require extremly long to build under emulation

### v0.27.2
#### Changed
- fix build with ``scikit-build-core`` ``v0.11``
- upgrade to `Cython==3.1.6`
- upgrade to `rapidfuzz-cpp==3.3.3`

#### Added
- add support for free threaded Python
- add python 3.14 wheels

#### Removed
- drop support for Python 3.9
- drop 32 bit linux wheels

### v0.27.1
#### Changed
- fix build with ``scikit-build-core`` ``v0.11``
- upgrade to `Cython==3.0.12`

### v0.27.0
#### Fixed
- avoid instantiation of basic_string for unsupported types

#### Changed
- upgrade ``rapidfuzz-cpp`` to ``v3.2.0``

### v0.26.1
#### Fixed
- add missing mac os wheels

### v0.26.0
#### Changed
- add support for Python 3.13
- drop support for Python 3.8
- switch build system to `scikit-build-core`
- upgrade to `Cython==3.0.11`

### v0.25.1
#### Fixed
- fix potentially incorrect results of `jaro_winkler` when using high prefix weights

### v0.25.0
#### Changed
- improve type hints

### v0.24.0
#### Changed
- upgrade ``rapidfuzz-cpp`` to ``v3.0.0``
- drop support for Python 3.7

### v0.23.0
#### Changed
- added keyword argument `pad` to Hamming distance. This controls whether sequences of different
  length should be padded or lead to a `ValueError`
- upgrade to `Cython==3.0.3`

### v0.22.0
#### Changed
- add support for Python 3.12
- drop support for Python 3.6

#### Added
- add wheels for windows arm64

### v0.21.1
#### Changed
- upgrade ``rapidfuzz-cpp`` to ``v2.0.0``

### v0.21.0
#### Changed
- relax dependency requirement on ``rapidfuzz``

### v0.20.9
#### Fixed
- fix function signature of `get_requires_for_build_wheel`

### v0.20.8
#### Fixed
- type hints for `editops`/`opcoded`/`matching_blocks` did not allow any
  hashable sequence

### v0.20.7
#### Fixed
- type hints did not get installed

### v0.20.6
#### Fixed
- fix incorrect result normalization in `setratio` and `seqratio`

### v0.20.5
#### Fixed
- fix support for cmake versions below 3.17
- fix version requirement for `rapidfuzz-cpp` when building against a previously installed version

### v0.20.4
#### Changed
- modernize cmake build to fix most conda-forge builds

### v0.20.3
#### Changed
- Added support for Python 3.11

### v0.20.2
#### Fixed
- fix matching_blocks conversion for empty editops

#### Changed
- added in-tree build backend to install cmake and ninja only when it is not installed yet and only when wheels are available

### v0.20.1
#### Fixed
- fix broken matching_blocks conversion

### v0.20.0
#### Changed
- use `matching_blocks`/`apply`/`remove_subsequence`/`inverse` implementation from RapidFuzz

#### Fixed
- stop adding data to wheels
- fix segmentation fault on some invalid editop sequences in subtract_edit
- detect duplicated entries in editops validation

### v0.19.3
#### Added
- add musllinux wheels

### v0.19.2
#### Added
- add missing type hints

### v0.19.1
#### Added
- Add type hints

### v0.19.0
#### Changed
- implement all Python wrappers mostly with cython
- replace usage of deprecated Python APIs

#### Fixed
- fix behavior of median and median_improve

### v0.18.2
#### Changed
- Allow installation from system installed versions of `rapidfuzz-cpp`

### v0.18.1
#### Fixed
- Indel.normalized_similarity was broken in RapidFuzz v2.0.0 (see #20)

### v0.18.0
#### Fixed
* Fixed memory leak in error path of setratio

* Fixed out of bound reads due to uninitialized variable in median
  * e.g. quickmedian(["test", "teste"], [0, 0]) caused out of bound reads

#### Changed
* Use a faster editops implementation provided by RapidFuzz
* Reduce code duplication
* reuse implementations from rapidfuzz-cpp
* Transition to scikit-build

### v0.17.0
* Removed support for Python 3.5

### v0.16.1
* Add support for RapidFuzz v1.9.*

### v0.16.0
* Add support for Python 3.10

### v0.15.0
* Update SequenceMatcher interface to support the autojunk parameter

### v0.14.0
* Drop Python 2 support
* Fixed free of non heap object due caused by zero offset on a heap object
* Fixed warnings about missing type conversions
* Fix segmentation fault in subtract_edit when incorrect input types are used
* Fixed unchecked memory allocations
* Implement distance/ratio/hamming/jaro/jaro_winkler
  using rapidfuzz instead of providing a own implementation
* Implement Wrapper for inverse/editops/opcodes/matching_blocks/subtract_edit/apply_edit
  using Cython to simplify support for new Python versions

### v0.13.0
* Maintainership passed to Max Bachmann
* use faster bitparallel implementations for distance and ratio
* avoid string copies in distance, ratio and hamming
* Fix usage of deprecated Unicode APIs in distance, ratio and hamming
* Fixed incorrect window size inside Jaro and Jaro-Winkler implementation
* Fixed incorrect exception messages
* Removed unused functions and compiler specific hacks
* Split the Python and C implementations to simplify building of
  the C library
* Fixed multiple bugs which prevented the use as C library, since some functions
  only got defined when compiling for Python
* Build and deliver python wheels for the library
* Fixed incorrect allocation size in lev_editops_matching_blocks and
  lev_opcodes_matching_blocks

### v0.12.1
* Fixed handling of numerous possible wraparounds in calculating the size
  of memory allocations; incorrect handling of which could cause denial
  of service or even possible remote code execution in previous versions
  of the library.

### v0.12.0
* Fixed a bug in StringMatcher.StringMatcher.get_matching_blocks /
  extract_editops for Python 3; now allow only `str` editops on
  both Python 2 and Python 3, for simpler and working code.
* Added documentation in the source distribution and in GIT
* Fixed the package layout: renamed the .so/.dll to _levenshtein,
  and made it reside inside a package, along with the StringMatcher
  class.
* Fixed spelling errors.

### v0.11.2
* Fixed a bug in setup.py: installation would fail on Python 3 if the locale
  did not specify UTF-8 charset (Felix Yan).

* Added COPYING, StringMatcher.py, gendoc.sh and NEWS in MANIFEST.in, as they
  were missing from source distributions.

### v0.11.1
* Added Levenshtein.h to MANIFEST.in

### v0.11.0
* Python 3 support, maintainership passed to Antti Haapala

### v0.10.2
* Made python-Lehvenstein Git compatible and use setuptools for PyPi upload
* Created HISTORY.txt and made README reST compatible

### v0.10.1
* apply_edit() broken for Unicodes was fixed (thanks to Radovan Garabik)
* subtract_edit() function was added

### v0.10.0
* Hamming distance, Jaro similarity metric and Jaro-Winkler similarity
      metric were added
* ValueErrors raised on wrong argument types were fixed to TypeErrors

### v0.9.0
* a poor-but-fast generalized median method quickmedian() was added
* some auxiliary functions added to the C api (lev_set_median_index,
      lev_editops_normalize, ...)

### v0.8.2
* fixed missing `static' in the method list

### v0.8.1
* some compilation problems with non-gcc were fixed

v0.8.0
* median_improve(), a generalized median improving function, was added
* an arbitrary length limitation imposed on greedy median() result was
      removed
* out of memory should be handled more gracefully (on systems w/o memory
      overcomitting)
* the documentation now passes doctest

### v0.7.0
* fixed greedy median() for Unicode characters > U+FFFF, it's now usable
      with whatever integer type wchar_t happens to be
* added missing MANIFEST
* renamed exported C functions, all public names now have lev_, LEV_ or
      Lev prefix; defined lev_byte, lev_wchar, and otherwise santinized
      the (still unstable) C interface
* added edit-ops group of functions, with two interfaces: native, useful
      for string averaging, and difflib-like for interoperability
* added an example SequenceMatcher-like class StringMatcher

### v0.6.0
* a segfault in seqratio()/setratio() on invalid input has been fixed
      to an exception
* optimized ratio() and distance() (about 20%)
* Levenshtein.h header file was added to make it easier to actually use
      it as a C library

### v0.5.0
* a segfault in setratio() was fixed
* median() handles all empty strings situation more gracefully

### v0.4.0
* new functions seqratio() and setratio() computing similarity between
      string sequences and sets
* Levenshtein optimizations (affects all routines except median())
* all Sequence objects are accepted, not just Lists

### v0.3.0
* setmedian() finding set median was added
* median() initial overhead for Unicodes was reduced

### v0.2.0
* ratio() and distance() now accept both Strings and Unicodes
* removed uratio() and udistance()
* Levenshtein.c is now compilable as a C library (with -DNO_PYTHON)
* a median() function finding approximate weighted median of a string
      set was added

### v0.1.0
* Initial release
