Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve TOML placeholder parser error messages #78

Open
object-Object opened this issue Jul 20, 2024 · 0 comments
Open

Improve TOML placeholder parser error messages #78

object-Object opened this issue Jul 20, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@object-Object
Copy link
Member

object-Object commented Jul 20, 2024

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
@object-Object object-Object added the bug Something isn't working label Jul 20, 2024
@github-project-automation github-project-automation bot moved this to 📋 Backlog in hexdoc Jul 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: 📋 Backlog
Development

No branches or pull requests

1 participant