interrogate icon indicating copy to clipboard operation
interrogate copied to clipboard

Interrogate fails on certain pyproject.toml due to incorrect parsing by toml library

Open apirogov opened this issue 2 years ago • 0 comments

Description of the bug

Using interrogate as a pre-commit hook:

  - repo: https://github.com/econchick/interrogate
    rev: "1.5.0"
    hooks:
      - id: interrogate
        files: "^src/"

results in:

interrogate..............................................................Failed
- hook id: interrogate
- exit code: 1

Traceback (most recent call last):
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/bin/interrogate", line 8, in <module>
    sys.exit(main())
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 1054, in main
    with self.make_context(prog_name, args, **extra) as ctx:
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 920, in make_context
    self.parse_args(ctx, args)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 1378, in parse_args
    value, args = param.handle_parse_result(ctx, opts, args)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 2360, in handle_parse_result
    value = self.process_value(ctx, value)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/click/core.py", line 2322, in process_value
    value = self.callback(ctx, self, value)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/interrogate/config.py", line 201, in read_config_file
    config = parse_pyproject_toml(value)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/interrogate/config.py", line 109, in parse_pyproject_toml
    pyproject_toml = toml.load(path_config)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/toml/decoder.py", line 134, in load
    return loads(ffile.read(), _dict, decoder)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/toml/decoder.py", line 511, in loads
    ret = decoder.load_line(line, currentlevel, multikey,
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/toml/decoder.py", line 778, in load_line
    value, vtype = self.load_value(pair[1], strictly_valid)
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/toml/decoder.py", line 880, in load_value
    return (self.load_array(v), "array")
  File "/local/home/a.pirogov/.cache/pre-commit/repofo1r4gjz/py_env-python3/lib/python3.8/site-packages/toml/decoder.py", line 1002, in load_array
    a[b] = a[b] + ',' + a[b + 1]
IndexError: list index out of range

What you expected to happen

No exception at config loading.

How to reproduce (as minimally and precisely as possible)

Have mixed array in pyproject.toml, e.g.:

include = [
  "*.md", "LICENSE",
  { path = "mkdocs.yml", format = "sdist" },
  { path = "docs", format = "sdist" },
  { path = "tests", format = "sdist" },
]

which is in fact valid and used by poetry.

Anthing else we need to know?

The toml library is not TOML 1.0 compliant.

To solve, toml should be replaced by tomli (which is essentially tomllib which is standardized with Python 3.11)

apirogov avatar Jun 06 '23 14:06 apirogov