# Changelog

To install the unreleased unihan-etl version, see [developmental releases](https://unihan-etl.git-pull.com/quickstart.html#developmental-releases).

[uv](https://docs.astral.sh/uv/):

```console
$ uv add unihan-etl --prerelease allow
```

```console
$ uvx --from 'unihan-etl' --prerelease allow unihan-etl
```

These commands install or run the latest available pre-release.

[pip](https://pip.pypa.io/en/stable/):

```console
$ pip install --user --upgrade --pre unihan-etl
```

[pipx](https://pypa.github.io/pipx/docs/):

```console
$ pipx install --suffix=@next unihan-etl --pip-args '\--pre' --force
```

Then run `unihan-etl@next`.

## unihan-etl 0.42.x (unreleased)

<!-- KEEP THIS PLACEHOLDER - DO NOT REMOVE OR MODIFY THIS LINE -->
_Notes on the upcoming release will go here._
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

<!-- Maintainers, insert changes / features for the next release here -->

## unihan-etl 0.41.0 (2026-03-21)

### Documentation

#### Linkable CLI argument definitions

CLI documentation now features linkable argument definitions:

- Each argument (`--format`, `-h`, etc.) has a unique anchor ID
- Headerlink anchors (¶) appear on hover for easy link copying
- Direct navigation to specific arguments via URL fragments

#### Improved help text rendering

- Glob patterns like `django-*` in help text no longer trigger RST parsing warnings
- Metavars with underscores (e.g., `socket_name`) are now properly highlighted

## unihan-etl 0.40.0 (2026-01-24)

### Breaking changes

#### CLI now requires explicit subcommand (#344)

Running `unihan-etl` without arguments now displays help instead of running the ETL process.

**Before (0.39.x and earlier):**

```console
$ unihan-etl
```

This would download and export UNIHAN data with default settings.

**After (0.40.x):**

```console
$ unihan-etl export
```

Use the `export` subcommand explicitly. The bare command now shows available subcommands.

### New CLI subcommand architecture (#342)

The CLI has been redesigned with a subcommand structure for better organization and discoverability:

- `unihan-etl export` - Export UNIHAN data (CSV, JSON, YAML, Python)
- `unihan-etl download` - Download and cache UNIHAN database
- `unihan-etl fields` - List available UNIHAN fields
- `unihan-etl files` - List available UNIHAN source files
- `unihan-etl search` - Search UNIHAN data by character or field

#### CLI features

- Colorized help output with syntax highlighting for examples
- Privacy-aware path display (hides home directory in output)
- Multiple output formats: table, JSON, NDJSON

### Documentation

#### Sphinx extensions

New Sphinx extensions ported from vcspull for enhanced CLI documentation:

- `sphinx_argparse_neo`: Modern sphinx-argparse replacement with better compatibility
- `argparse_exemplar`: Transform argparse epilog examples into documentation sections
- `argparse_lexer`: Pygments lexer for argparse help output highlighting
- `argparse_roles`: RST roles for argparse cross-references
- `cli_usage_lexer`: Pygments lexer for CLI usage/help text highlighting

### Development

- Comprehensive test coverage for CLI subcommands and infrastructure
- Tests for Sphinx documentation extensions



## unihan-etl 0.39.1 (2026-01-24)

### CI

- Migrate to PyPI Trusted Publisher (#339)

## unihan-etl 0.39.0 (2026-01-11)

### Revision 39 updates (#343)

These changes align with UNIHAN's [39th revision](https://www.unicode.org/reports/tr38/tr38-39.html#Modifications) and are part of ongoing improvements to Unihan data handling.

#### New field

- `kTayNumeric`: Numeric value for Tày Nôm characters (Unicode 17.0)

  See also: https://www.unicode.org/reports/tr38/#kTayNumeric

#### New property type

- `kStrange`: Add 'Y' (S**y**mmetric) property type for symmetric ideographs (Unicode 16.0)

  The letter 'Y' was chosen because 'S' was already assigned to Stroke-heavy.

  See also: https://www.unicode.org/reports/tr38/#kStrange

#### Removed fields

- `kGB7`: Removed in Unicode 17.0
- `kJa`: Removed in Unicode 17.0

  See also: https://www.unicode.org/reports/tr38/#ChronologicalListing

### Development

#### Makefile -> Justfile (#340)

- Migrate from `Makefile` to `justfile` for running development tasks
- Update documentation to reference `just` commands

### Documentation

- Migrate docs deployment to AWS OIDC authentication and AWS CLI

## unihan-etl 0.38.0 (2025-11-01)

### Breaking changes

- Drop support for Python 3.9; the new minimum is Python 3.10 (#386)

  See also:
  - [Python 3.9 EOL timeline](https://devguide.python.org/versions/#:~:text=Release%20manager-,3.9,-PEP%20596)
  - [PEP 596](https://peps.python.org/pep-0596/)

### Development

- Add Python 3.14 to test matrix (#337)

#### chore: Implement PEP 563 deferred annotation resolution (#333)

- Add `from __future__ import annotations` to defer annotation resolution and reduce unnecessary runtime computations during type checking.
- Enable Ruff checks for PEP-compliant annotations:
  - [non-pep585-annotation (UP006)](https://docs.astral.sh/ruff/rules/non-pep585-annotation/)
  - [non-pep604-annotation (UP007)](https://docs.astral.sh/ruff/rules/non-pep604-annotation/)

For more details on PEP 563, see: https://peps.python.org/pep-0563/

## unihan-etl 0.37.0 (2024-12-21)

_Maintenance release: No bug fixes or new features._

### Breaking changes

- Drop Python 3.8 (#332)

  The minimum version of Python in this and future releases is Python 3.9.

  Python 3.8 reached end-of-life status on October 7th, 2024 (see PEP 569).

### Development

- Aggressive automated lint fixes via `ruff` (#332)

  via ruff v0.8.4, all automated lint fixes, including unsafe and previews were applied for Python 3.9:

  ```sh
  ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .
  ```

## unihan-etl 0.36.0 (2024-11-26)

_Maintenance release: No bug fixes or new features._

### Breaking changes

#### Project and package management: poetry to uv (#329)

[uv] is the new package and project manager for the project, replacing Poetry.

[uv]: https://github.com/astral-sh/uv

#### Build system: poetry to hatchling (#329)

[Build system] moved from [poetry] to [hatchling].

[Build system]: https://packaging.python.org/en/latest/tutorials/packaging-projects/#choosing-a-build-backend
[poetry]: https://github.com/python-poetry/poetry
[hatchling]: https://hatch.pypa.io/latest/

## unihan-etl 0.35.0 (2024-11-25)

### Revision 37 updates (#330)

These changes align with Unicode Technical Report #38's [37th revision](https://www.unicode.org/reports/tr38/tr38-37.html#Modifications) and are part of ongoing improvements to Unihan data handling.

#### Add `kFanqie` and `kZhuang`

Adds support for the `kFanqie` and `kZhuang` fields.

See also:
- https://www.unicode.org/reports/tr38/#kFanqie
- https://www.unicode.org/reports/tr38/#kZhuang

#### Support `kRSUnicode` for apostrophes

`Unihan_IRGSources`: Updated `kRSUnicode` for apostrophes.

See also:
- https://www.unicode.org/reports/tr38/#ChronologicalListing
- https://github.com/cihai/unihan-etl/issues/318
- https://github.com/cihai/unihan-etl/issues/315#issuecomment-2029105502

#### Removals

- `kFrequency`: Removed from `Unihan_DictionaryLikeData`, `constants`, and `datapackage.json`.

See also:
- https://www.unicode.org/L2/L2024/24006.htm#178-C17
- https://www.unicode.org/reports/tr38/#ChronologicalListing

#### Tests

- Added tests for simplified expansions to ensure correctness of `kFanqie` and `kZhuang`.

### Documentation

- Automatically linkify links that were previously only text.

### Development

- poetry: 1.8.1 -> 1.8.2

  See also: https://github.com/python-poetry/poetry/blob/1.8.2/CHANGELOG.md
- Code quality: Use f-strings in more places (#320)

  via [ruff 0.4.2](https://github.com/astral-sh/ruff/blob/v0.4.2/CHANGELOG.md).

## unihan-etl 0.34.0 (2024-03-24)

### Development

- Aggressive automated lint fixes via `ruff` (#317)

  via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied:

  ```sh
  ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format .
  ```

  Branches were treated with:

  ```sh
  git rebase \
      --strategy-option=theirs \
      --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \
      origin/master
  ```
- poetry: 1.7.1 -> 1.8.1

  See also: https://github.com/python-poetry/poetry/blob/1.8.1/CHANGELOG.md
- ruff 0.2.2 -> 0.3.0 (#316)

  Related formattings. Update CI to use `ruff check .` instead of `ruff .`.

  See also: https://github.com/astral-sh/ruff/blob/v0.3.0/CHANGELOG.md

## unihan-etl 0.33.1 (2024-02-09)

_Maintenance release: No bug fixes or new features._

### Documentation

- README: Rewrite introduction, note updated UNIHAN compatibility information.
- Link to UNIHAN release in v0.31.0's changelog notes.

## unihan-etl 0.33.0 (2024-02-09)

_Maintenance release: No bug fixes or new features._

### Documentation

- `CsvLexer`: Fix quoted items (#314)

### Development

- Strengthen linting (#313)

  - Add flake8-commas (COM)

    - https://docs.astral.sh/ruff/rules/#flake8-commas-com
    - https://pypi.org/project/flake8-commas/

  - Add flake8-builtins (A)

    - https://docs.astral.sh/ruff/rules/#flake8-builtins-a
    - https://pypi.org/project/flake8-builtins/

  - Add flake8-errmsg (EM)

    - https://docs.astral.sh/ruff/rules/#flake8-errmsg-em
    - https://pypi.org/project/flake8-errmsg/

## unihan-etl 0.32.0 (2024-02-05)

### Documentation

- Highlighting for CSV and TSV examples (#253)

### Improvements

- Typing fixes and additional doctest for `kTGH2013` (#312)

### Development

- Added `types-pygments` package (#253)
- Added some manual type stubs for `pygments`' `Lexer` (#253)
- pytest-watcher: Silent `*.py.*py` reruns (#312)

## unihan-etl 0.31.0 (2024-02-04)

### Breaking: UNIHAN upgrades (#305)

Bump UNIHAN compatibility from 11.0.0 to [15.1.0](https://www.unicode.org/reports/tr38/tr38-35.html#History) (released 2023-09-01, revision 35).

#### Removed fields

- 15.1.0: [kHKSCS](https://www.unicode.org/L2/L2023/23005.htm#174-C10),
  [kIRGDaiKanwaZiten](https://www.unicode.org/L2/L2022/22241.htm#173-C9),
  [kKPS0](https://www.unicode.org/L2/L2023/23005.htm#174-C11),
  [kKPS1](https://www.unicode.org/L2/L2023/23005.htm#174-C11),
  [kKSC0](https://www.unicode.org/L2/L2023/23005.htm#174-C9),
  [kKSC1](https://www.unicode.org/L2/L2023/23005.htm#174-C9),
  [kRSKangXi](https://www.unicode.org/L2/L2022/22241.htm#173-C12)
- 13.0.0:
  [kRSJapanese](https://www.unicode.org/cgi-bin/GetDocumentLink?L2/19-209),
  [kRSKanWa](https://www.unicode.org/cgi-bin/GetDocumentLink?L2/19-209),
  [kRSKorean](https://www.unicode.org/cgi-bin/GetDocumentLink?L2/19-209)
- 12.0.0:
  [kDefaultSortKey](https://www.unicode.org/cgi-bin/GetDocumentLink?L2/18-118)
  (private property)

#### New fields

- 15.1.0: [kJapanese](https://www.unicode.org/reports/tr38/#kJapanese),
  [kMojiJoho](https://www.unicode.org/reports/tr38/#kMojiJoho),
  [kSMSZD2003Index](https://www.unicode.org/reports/tr38/#kSMSZD2003Index),
  [kSMSZD2003Readings](https://www.unicode.org/reports/tr38/#kSMSZD2003Readings),
  [kVietnameseNumeric](https://www.unicode.org/reports/tr38/#kVietnameseNumeric),
  [kZhuangNumeric](https://www.unicode.org/reports/tr38/#kZhuangNumeric)
- 15.0.0:
  [kAlternateTotalStrokes](https://www.unicode.org/reports/tr38/#kAlternateTotalStrokes)
- 14.0.0: [kStrange ](https://www.unicode.org/reports/tr38/#kStrange)
- 13.0.0: [kIRG_SSource](https://www.unicode.org/reports/tr38/#kIRG_SSource),
  [kIRG_UKSource](https://www.unicode.org/reports/tr38/#kIRG_UKSource),
  [kSpoofingVariant](https://www.unicode.org/reports/tr38/#kSpoofingVariant),
  [kTGHZ2013](https://www.unicode.org/reports/tr38/#kTGHZ2013),
  [kUnihanCore2020](https://www.unicode.org/reports/tr38/#kUnihanCore2020)

### Development

- Quiet pytest tracebacks (#310)
- Relax pytest plugin assertions in regards to zip / export file size (#310)

## unihan-etl 0.30.1 (2023-12-10)

### Bug fix

- Expansions: Fix loading of double apostrophe values via `kRSUnicode` via `kRSGeneric` (#304)

## unihan-etl 0.30.0post0 (2023-11-26)

### CI

- Move CodeQL from advanced configuration file to GitHub's default

### Documentation

- Typo fixes

## unihan-etl 0.30.0 (2023-11-26)

_Maintenance only, no bug fixes, or new features_

### Development

- ci: Add pydocstyle rule to ruff (#303)

### Documentation

- Add docstrings to functions, methods, classes, and packages (#303)

## unihan-etl 0.29.0 (2023-11-19)

_Maintenance only, no bug fixes, or new features_

### Packaging

- Move pytest configuration to `pyproject.toml` (#299)
- Add Python 3.12 to trove classifiers
- Per [Poetry's docs on managing dependencies] and `poetry check`, we had it wrong: Instead of using extras, we should create these:

  ```toml
  [tool.poetry.group.group-name.dependencies]
  dev-dependency = "1.0.0"
  ```

  Which we now do.

  [Poetry's docs on managing dependencies]: https://python-poetry.org/docs/master/managing-dependencies/

### Development

- Poetry: 1.6.1 -> 1.7.0

  See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md

- Move formatting from `black` to [`ruff format`] (#302)

  This retains the same formatting style of `black` while eliminating a
  dev dependency by using our existing rust-based `ruff` linter.

  [`ruff format`]: https://docs.astral.sh/ruff/formatter/

- CI: Update action packages to fix warnings

  - [dorny/paths-filter]: 2.7.0 -> 2.11.1

  [dorny/paths-filter]: https://github.com/dorny/paths-filter

## unihan-etl 0.28.1 (2023-09-02)

### Bug fix

- `SPACE_DELIMITED_LIST_FIELDS`: Fix for field name `kAccountingNumeric` found
  during automated sweep for typos.

### Development

- Typo fixes

  ```console
  typos --format brief --write-changes
  ```

  One of these typos was for `kAccountingNumeric` in
  `SPACE_DELIMITED_LIST_FIELDS`.

- ruff: Remove ERA / `eradicate` plugin

  This rule had too many false positives to trust. Other ruff rules have been beneficial.

## unihan-etl 0.28.0 (2023-07-22)

### Breaking: pytest fixtures now prefixed with `unihan_` (#296)

- All pytest plugin fixtures are now prefixed `unihan_`, e.g.:

  - `quick_unihan_path` -> `unihan_quick_path`
  - `quick_unihan_options` -> `unihan_quick_options`
  - `quick_unihan_packager` -> `unihan_quick_packager`
  - `ensure_quick_unihan` -> `unihan_ensure_quick`
  - `mock_zip` -> `unihan_mock_zip`
  - `columns` -> `unihan_quick_columns`

- `TestPackager` fixture has been removed

  This fixture was made redundant by `unihan_quick_*` and `unihan_full_*`
  fixtures

### Bug fixes (#296)

- pytest plugin (`unihan_zshrc`): Fix `skipif` condition to run if shell uses `zsh(1)`

## unihan-etl 0.27.0 (2023-07-18)

### Breaking: pytest fixtures renamed, data moved (#294)

- "quick" fixtures:

  - Data has been moved from `tests/fixtures` to
    `src/unihan_etl/data_files/quick`
  - Fixtures prefixed by `sample_` in the name have been renamed to `quick_`

- "quick" and "full" fixtures: Fixed ability to access data files from outside
  `unihan_etl` package

### Development

- ruff: Code quality tweaks (#295)

## unihan-etl 0.26.0 (2023-07-09)

### Features

- pytest plugin: Add cached fixtures for `UNIHAN` (#291)

  After initial download of UNIHAN.zip, an 11 second testrun on unihan-etl's
  test can go down to 1.5 seconds - eliminating redownloading and extraction.

## unihan-etl 0.25.2 (2023-07-08)

### Bug Fixes

- pytest plugin: Revert fix of `zshrc` fixture's `skipif` condition (#293)

  It was fine as-is.

## unihan-etl 0.25.1 (2023-07-08)

_Rolled back_

### Bug Fixes

- pytest plugin: Fix `zshrc` fixture's `skipif` condition (#292)

## unihan-etl 0.25.0 (2023-07-01)

_Maintenance only, no bug fixes, or new features_

### Internal changes

- ruff: Add additional linters, apply code fixes automatically and by hand
  (#290)
- Typings: Extract `LogLevel` and `UnihanFormats`

## unihan-etl 0.24.0 (2023-06-24)

_Maintenance only, no bug fixes, or new features_

### Internal changes

- zhon: 1.1.5 -> 2.0.0 (#289, fixes #282)

  [Release notes](https://github.com/tsroten/zhon/blob/v2.0.0/CHANGES.rst#v200-2023-06-24)

  Fixes pytest warning related to regular expressions.

## unihan-etl 0.23.0 (2023-06-24)

_Maintenance only, no bug fixes, or new features_

### Internal changes

- {mod}`unihan_etl._internal.app_dirs` improvements (#287)

  - Breaking: `app_dirs` moved

    - Before 0.23.x: `unihan_etl.app_dirs`
    - After 0.23.x: `unihan_etl._internal.app_dirs`

  - New feature: Override directories on a one-off basis
  - New feature: Template replacement of variables replacing environmental variables
    via {func}`os.path.expandvars` + {func}`os.path.expanduser`
  - {mod}`doctests`: See the above in action thanks to doctests
  - Dedicated tests via pytest

### Documentation

- API docs (#288):
  - Limit depth of table of contents to one
  - Fix section heading
  - Fix comment in `AppDirs`

## unihan-etl 0.22.1 (2023-06-18)

### Bug fixes

- Fix for `destination` of files not replacing file extension correctly (#285)

## unihan-etl 0.22.0 (2023-06-17)

### Breaking changes

#### `unihan_etl.process` -> `unihan_etl.core` (#284)

This module has been renamed.

#### Configuration (#280)

Before 0.22.x, unihan_etl's configuration was done through a {class}`dict` object.

0.22.0 and after settings are configurable via a {obj}`dataclasses.dataclass` object:
{class}`unihan_etl.options.Options`

### Documentation

- Add {mod}`doctest` support (#274)

  - Initial doctest example added to README.md, test.py, and util.py.

- Stub out initial pytest plugin (#274)
- Split _API_ docs into multiple files (#283)
- Fix `make start` in `docs/Makefile` by fixing argument positions (#283)

## unihan-etl 0.21.1 (2023-06-18)

### Bug fixes

- Fix for `destination` of files not replacing file extension correctly (#286)

## unihan-etl 0.21.0 (2023-06-12)

_Maintenance only, no bug fixes or features_

### Internal improvements

- Move file locations to {mod}`pathlib` internally (#277)
- Improved typing download `urlretrive_fn` and `reporthook` via {class}`typing.Protocol` (#277)

## unihan-etl 0.20.0 (2023-06-11)

_Maintenance only, no bug fixes or features_

### Breaking changes

- **Python 3.7 Dropped**

  Python 3.7 support has been dropped (#272)

  Its end-of-life is June 27th, 2023 and Python 3.8 will add support for
  {mod}`typing`'s {class}`typing.TypedDict` and {class}`typing.Protocol` out of the box without needing
  {mod}`typing_extensions`'s.

### Internal improvements

- Typings:

  - Import {mod}`typing` as a namespace, e.g. `import typing as t` (#276)
  - Use `typing` for {class}`typing.TypedDict` and {class}`typing.Literal` (#276)
  - Use typing_extensions' {py:data}`TypeAlias` for repeated types, such in test_expansions (#276)

## unihan-etl 0.19.1 (2023-05-28)

_Maintenance only, no bug fixes or features_

### Development

- Add back `black` for formatting

  This is still necessary to accompany `ruff`, until it replaces black.

## unihan-etl 0.19.0 (2023-05-27)

_Maintenance only, no bug fixes or features_

### Internal improvements

- Move formatting, import sorting, and linting to [ruff].

  This rust-based checker has dramatically improved performance. Linting and
  formatting can be done almost instantly.

  This change replaces black, isort, flake8 and flake8 plugins.

- poetry: 1.4.0 -> 1.5.0

  See also: https://github.com/python-poetry/poetry/releases/tag/1.5.0

- pytest: Fix invalid escape sequence warning from `zhon`

[ruff]: https://ruff.rs

### Development

- `merge_dict`: Improve typing of generic params (#271)

## unihan-etl 0.18.1 (2022-10-01)

### Packaging

- Add PyYAML dependency

### Infrastructure

- CI speedups (#267)

  - Split out release to separate job so the PyPI Upload docker image isn't pulled on normal runs
  - Clean up CodeQL

- Bump poetry 1.1.x to 1.2.x

### Packaging

- Move `.coveragerc` -> `pyproject.toml` (#268)

## unihan-etl 0.18.0 (2022-09-11)

### Development

- Move to `src/`-layout structure (#266)
- Add [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) (#263)
- Add [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) (#264)

### Documentation

- Render changelog in [`linkify_issues`] (~~#261~~, #265)
- Fix Table of contents rendering with sphinx autodoc with [`sphinx_toctree_autodoc_fix`] (#265)
- Test doctests in our docs via [`pytest_doctest_docutils`] (built on [`doctest_docutils`]) (#265)

[`linkify_issues`]: https://gp-libs.git-pull.com/linkify_issues/
[`sphinx_toctree_autodoc_fix`]: https://gp-libs.git-pull.com/sphinx_toctree_autodoc_fix/
[`pytest_doctest_docutils`]: https://gp-libs.git-pull.com/doctest/pytest.html
[`doctest_docutils`]: https://gp-libs.git-pull.com/doctest

## unihan-etl 0.17.2 (2022-08-21)

### Documentation

- Add vendorized, updated fork of `sphinxcontrib-issuetracker`, via #261.
- Remove sphinx-issues package

## unihan-etl 0.17.1 (2022-08-21)

Follow ups to #257.

### Fixes

- `merged_dict()`: Fix merging edgecase where destination key was missing
- `download()`: Fix edgecase when "downloading" file from local path

## unihan-etl 0.17.0 (2022-08-21)

### Features

- mypy `--strict` annotations, via #257

## unihan-etl 0.16.0 (2022-08-20)

### Features

- New option: `--no-cache`

  Disregard cached .zip / extracted files, via #259.

### Development

- Add python 3.8 and 3.9 to CI

  This is to make way for strict type annotations, as the typings and generic
  behavior vary dramatically between 3.7 - 3.11.

## unihan-etl 0.15.0 (2022-08-29)

### Breaking changes

- Python 2 compatibility module and imports removed. Python 2.x was officially
  dropped in 0.12.0 (2021-06-15) via #258

## unihan-etl 0.14.0 (2022-08-16)

### Improvements

- `load_data`: Accept list of `pathlib.Path` in addition to list of `str`

### Compatibility

- Add Python 3.10 (#248)
- Dropped Python 3.6 (#248)

### Development

Infrastructure updates for static type checking and doctest examples.

- Update poetry to 1.1
  - CI: Use poetry 1.1.12 and `install-poetry.py` installer (#237 + #248)
  - Relock poetry.lock at 1.1 (w/ 1.1.7's fix)
- Run pyupgrade for python 3.7
- Tests: Move from `tmpdir` -> `tmp_path`
- Initial [doctests] support added, via #255

  [doctests]: https://docs.python.org/3/library/doctest.html

- Initial [mypy] validation, via #255

  [mypy]: https://github.com/python/mypy

- CI (tests, docs): Improve caching of python dependencies via
  `action/setup-python`'s v3/4's new poetry caching, via #255

- CI (docs): Skip if no `PUBLISH` condition triggered, via #255

### Documentation

- Move to `furo` theme
- Add :ref:`quickstart` page
- Link to cihai's developer documentation:
  https://cihai.git-pull.com/contributing/

## unihan-etl 0.13.0 (2021-06-16)

- #236: Convert to markdown

## unihan-etl 0.12.0 (2021-06-15)

- Update `black` to 21.6b0
- Update trove classifiers to 3.9
- #235: Drop python 2.7, 3.5. Remove python 2 modesets and
  `__future__`

## unihan-etl 0.11.0 (2020-08-09)

- #230 Move packaging / publishing to poetry
- #229 Self host docs
- #229 Add metadata / icons / etc. for doc site
- #229 Move travis -> github actions
- #229 Overhaul Makefiles

## unihan-etl 0.10.4 (2020-08-05)

- Update CHANGES headings to produce working links
- Relax `appdirs` version constraint
- #228 Move from Pipfile to poetry

## unihan-etl 0.10.3 (2019-08-18)

- Fix flicker in download progress bar

## unihan-etl 0.10.2 (2019-08-17)

- Add `project_urls` to setup.py
- Use plain reStructuredText for CHANGES
- Use `collections` that's compatible with python 2 and 3
- PEP8 tweaks

## unihan-etl 0.10.1 (2017-09-08)

- Add code links in API
- Add `__version__` to `unihan_etl`

## unihan-etl 0.10.0 (2017-08-29)

- #91 New fields from UNIHAN
  [Revision 25](https://www.unicode.org/reports/tr38/tr38-25.html).

  - kJinmeiyoKanji
  - kJoyoKanji
  - kKoreanEducationHanja
  - kKoreanName
  - kTGH

  UNIHAN Revision 25 was released 2018-05-18 and issued for Unicode **11.0**:

- Add tests and example corpus for kCCCII
- Add configuration / make tests for isort, flake8
- Switch tmuxp config to use pipenv
- Add _Pipfile_
- Add `make sync_pipfile` task to sync _requirements/_.txt* files
  with *Pipfile\*
- Update and sync Pipfile
- Developer package updates (linting / docs / testing)

  - isort 4.2.15 to 4.3.4
  - flake8 3.3.0 to 3.5.0
  - vulture 0.14 to 0.27
  - sphinx 1.6.2 to 1.7.6
  - alagitpull 0.0.12 to 0.0.21
  - releases 1.3.1 to 1.6.1
  - sphinx-argparse 0.2.1 to 1.6.2
  - pytest 3.1.2 to 3.6.4

- Move documentation over to numpy-style
- Add sphinxcontrib-napoleon 0.6.1
- Update LICENSE New BSD to MIT
- All future commits and contributions are licensed to the
  _cihai software foundation_. This includes commits by Tony Narlock (creator).

## unihan-etl 0.9.5 (2017-06-26)

- Enhance support for locations on _kHDZRadBreak_ fields.

## unihan-etl 0.9.4 (2017-06-05)

- Fix kIRG_GSource without location
- Fix kFenn output
- Fix kHanyuPinlu support output for n diacritics

## unihan-etl 0.9.3 (2017-05-31)

- Add expansion for kIRGKangXi

## unihan-etl 0.9.2 (2017-05-31)

- Normalize Radical-Stroke expansion for kRSUnicode
- Migrate more fields to regular expressions
- Normalize character field for kDaeJaweon, kHanyuPinyin,
  and kCheungBauer, kFennIndex, kCheungBauerIndex, kIICore,
  kIRGHanyuDaZidian

## unihan-etl 0.9.1 (2017-05-27)

- Support for expanding kGSR
- Convert some field expansions to use regexes

## unihan-etl 0.9.0 (2017-05-26)

- Fix bug where destination file was made into directory on
  first run
- Rename from unihan-tabular to unihan-etl
- Support for expanding multi-value fields
- Support for pruning empty fields
- Improve help dialog
- Added a page about UNIHAN and the project to documentation
- Split constant values into their own module
- Split functionality for expanding unstructured values into
  its own module

## unihan-etl 0.8.1 (2017-05-20)

- Update to add _kJa_ and adjust source file of
  _kCompatibilityVariant_ per Unicode 8.0.0.

## unihan-etl 0.8.0 (2017-05-17)

- Support for configuring logging via options and CLI
- Convert all print statements to use logger

## unihan-etl 0.7.4 (2017-05-14)

- Allow for local / file system sources for Unihan.zip
- Only extract zip if unextracted

## unihan-etl 0.7.3 (2017-05-13)

- Update package classifiers

## unihan-etl 0.7.2 (2017-05-13)

- Add back datapackage

## unihan-etl 0.7.1 (2017-05-12)

- Fix python 2 CSV output
- Default to CSV output

## unihan-etl 0.7.0 (2017-05-12)

- Move unicodecsv module to dependency package
- Support for XDG directory specification
- Support for custom destination output, including replacing
  template variable `{ext}`

## unihan-etl 0.6.3 (2017-05-11)

- Move _**about**.py_ to module level

## unihan-etl 0.6.2 (2017-05-11)

- Fix python package import

## unihan-etl 0.6.1 (2017-05-10)

- Fix readme bug on pypi

## unihan-etl 0.6.0 (2017-05-10)

- Support for exporting in YAML and JSON
- More internal factoring and simplification
- Return data as list

## unihan-etl 0.5.1 (2017-05-08)

- Drop python 3.3 an 3.4 support

## unihan-etl 0.5.0 (2017-05-08)

- Rename from cihaidata_unihan unihan_tabular
- Drop datapackages in favor of a universal JSON, YAML and CSV
  export.
- Only use UnicodeWriter in Python 2, fixes issue with python
  would encode `b` in front of values

## unihan-etl 0.4.2 (2017-05-07)

- Rename _scripts/_ to _cihaidata_unihan/_

## unihan-etl 0.4.1 (2017-05-07)

- Enable invoking tool via `$ cihaidata_unihan`

## unihan-etl 0.4.0 (2017-05-07)

- Major internal refactor and simplification
- Convert to pytest `assert` statements
- Convert full test suite to pytest functions and fixtures
- Get CLI documentation up again
- Improve test coverage
- Lint code, remove unused imports
- Switch license BSD -> MIT

## unihan-etl 0.3.0 (2017-04-17)

- Rebooted
- Modernize _Makefile_ in docs
- Add Makefile to main project
- Modernize package metadata to use _**about**.py_
- Update requirements to use _requirements/_ folder for
  base, testing and doc dependencies.
- Update sphinx theme to alabaster with new logo.
- Update travis to use coverall
- Update links on README to use https
- Update travis to test up to python 3.6
- Add support for pypy (why not)
- Lock base dependencies
- Add dev dependencies for isort, vulture and flake8

<!---
vim: set filetype=markdown:
-->
