Skip to content

Update tomlkit to allow empty keys in pyproject.toml #1573

Description

@sandyowlet

Description

tomlkit used to not allowed empty keys in toml file, but it has been fixed in #17.

Empty key is valid in pyproject.toml, see link:

[tool.setuptools]
# ...
package-dir = {"" = "src"}
    # directory containing all the packages (e.g.  src/mypkg1, src/mypkg2)

# OR

[tool.setuptools.package-dir]
mypkg = "lib"
# mypkg.module corresponds to lib/module.py
"mypkg.subpkg1" = "lib1"
# mypkg.subpkg1.module1 corresponds to lib1/module1.py
"mypkg.subpkg2" = "lib2"
# mypkg.subpkg2.module2 corresponds to lib2/module2.py
# ...

Steps to reproduce

  1. A python package with below lines in pyproject.toml
# pyproject.toml
[tool.setuptools]
package-dir = { "" = "src" }
  1. Add commitizen check into pre-commit hooks
  - repo: https://github.com/commitizen-tools/commitizen
    rev: v1.17.0
    hooks:
      - id: commitizen
        stages: [commit-msg]
  1. Run pre-commit
    pre-commit run --all-files

Current behavior

commitizen check.........................................................Failed
- hook id: commitizen
- exit code: 1

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Scripts\cz.EXE\__main__.py", line 7, in <module>
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\commitizen\cli.py", line 179, in main
    conf = config.read_cfg()
           ^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\commitizen\config\__init__.py", line 60, in read_cfg
    _conf = TomlConfig(data=data, path=filename)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\commitizen\config\toml_config.py", line 10, in __init__
    self._parse_setting(data)
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\commitizen\config\toml_config.py", line 39, in _parse_setting
    doc = parse(data)
          ^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\api.py", line 51, in parse
    return Parser(string).parse()
           ^^^^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 153, in parse
    key, value = self._parse_table()
                 ^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 1056, in _parse_table
    item = self._parse_item()
           ^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 302, in _parse_item
    return self._parse_key_value(True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 387, in _parse_key_value
    val = self._parse_value()
          ^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 526, in _parse_value
    return self._parse_inline_table()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 710, in _parse_inline_table
    key, val = self._parse_key_value(False)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\pre-commit\repoztsxtdvg\py_env-python3\Lib\site-packages\tomlkit\parser.py", line 371, in _parse_key_value
    raise self.parse_error(EmptyKeyError)
tomlkit.exceptions.EmptyKeyError: Empty key at line 36 col 18

### Desired behavior

See above

### Screenshots

_No response_

### Environment

Commitizen Version: 4.8.3
Python Version: 3.10.16 (main, Mar 17 2025, 20:54:03) [MSC v.1943 64 bit (AMD64)]
Operating System: Windows

Metadata

Metadata

Assignees

No one assigned

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions