Skip to content

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

@sandyowlet

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions