Skip to content

Improve TOML placeholder parser error messages #78

@object-Object

Description

@object-Object

For example, when a placeholder key contains too many parent references, this is the current error message:

─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\cli\app.py:186 in build                   │
│                                                                                                  │
│   183 │   For developers: returns the site path (eg. `/v/latest/main`).                          │
│   184 │   """                                                                                    │
│   185 │                                                                                          │
│ ❱ 186 │   props, pm, book_plugin, plugin = load_common_data(props_file, branch)                  │
│   187 │                                                                                          │
│   188 │   if props.env.hexdoc_subdirectory:                                                      │
│   189 │   │   output_dir /= props.env.hexdoc_subdirectory                                        │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\cli\utils\load.py:55 in load_common_data  │
│                                                                                                  │
│    52 │   *,                                                                                     │
│    53 │   book: bool = False,                                                                    │
│    54 ) -> tuple[Properties, PluginManager, BookPlugin[Any], ModPlugin]:                         │
│ ❱  55 │   props = Properties.load(props_file)                                                    │
│    56 │   pm = PluginManager(branch, props)                                                      │
│    57 │                                                                                          │
│    58 │   book_plugin = pm.book_plugin(props.book_type)                                          │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\core\properties.py:175 in load            │
│                                                                                                  │
│   172 │   def load(cls, path: Path) -> Self:                                                     │
│   173 │   │   return cls.load_data(                                                              │
│   174 │   │   │   props_dir=path.parent,                                                         │
│ ❱ 175 │   │   │   data=load_toml_with_placeholders(path),                                        │
│   176 │   │   )                                                                                  │
│   177 │                                                                                          │
│   178 │   @classmethod                                                                           │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\utils\deserialize\toml.py:135 in          │
│ load_toml_with_placeholders                                                                      │
│                                                                                                  │
│   132                                                                                            │
│   133 def load_toml_with_placeholders(path: Path) -> TOMLDict:                                   │
│   134 │   data = tomllib.loads(path.read_text("utf-8"))                                          │
│ ❱ 135 │   fill_placeholders(data)                                                                │
│   136 │   return data                                                                            │
│   137                                                                                            │
│   138                                                                                            │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\utils\deserialize\toml.py:34 in           │
│ fill_placeholders                                                                                │
│                                                                                                  │
│    31                                                                                            │
│    32                                                                                            │
│    33 def fill_placeholders(data: TOMLDict):                                                     │
│ ❱  34 │   _fill_placeholders(data, [data], set())                                                │
│    35                                                                                            │
│    36                                                                                            │
│    37 def _expand_placeholder(                                                                   │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\utils\deserialize\toml.py:130 in          │
│ _fill_placeholders                                                                               │
│                                                                                                  │
│   127 ):                                                                                         │
│   128 │   table = stack[-1]                                                                      │
│   129 │   for key, child in table.items():                                                       │
│ ❱ 130 │   │   _handle_child(data, stack, expanded, key, child, table.__setitem__)                │
│   131                                                                                            │
│   132                                                                                            │
│   133 def load_toml_with_placeholders(path: Path) -> TOMLDict:                                   │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\utils\deserialize\toml.py:113 in          │
│ _handle_child                                                                                    │
│                                                                                                  │
│   110 │   │   case list():                                                                       │
│   111 │   │   │   # handle each item in the list without adding the list to the stack            │
│   112 │   │   │   for i, item in enumerate(value):                                               │
│ ❱ 113 │   │   │   │   _handle_child(data, stack, expanded, i, item, value.__setitem__)           │
│   114 │   │                                                                                      │
│   115 │   │   case dict():                                                                       │
│   116 │   │   │   # recursion!                                                                   │
│                                                                                                  │
│ E:\Projects\Complex-Hex\.venv\Lib\site-packages\hexdoc\utils\deserialize\toml.py:89 in           │
│ _handle_child                                                                                    │
│                                                                                                  │
│    86 │   │   │   # fill the string's placeholders                                               │
│    87 │   │   │   for match in reversed(list(_PLACEHOLDER_RE.finditer(value))):                  │
│    88 │   │   │   │   try:                                                                       │
│ ❱  89 │   │   │   │   │   v = _expand_placeholder(                                               │
│    90 │   │   │   │   │   │   data,                                                              │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
IndexError: list index out of range

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Status

    📋 Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions