griffe
griffe copied to clipboard
Stub Files and Wildcard Expansion issues
Describe the bug Griffe seems to be unable to resolve builtins in stub files - https://pastebin.com/JsqPWvZn.
The error seems to be occur within these 2 files https://github.com/NAFTeam/NAFF/blob/master/naff/client/utils/attr_utils.pyi https://github.com/NAFTeam/NAFF/blob/master/naff/client/utils/attr_utils.py
Upon deleting the pyi file to bypass the error, another error occurs (https://pastebin.com/CHYvChzD). I resolved this by adding a dumb-fix to griffe/loader.py[260] allowing my docs to build successfully.
# original
if new_member.name not in obj.members or obj[new_member.name].lineno < alias_lineno:
#"fixed"
if new_member.name not in obj.members or (obj[new_member.name].lineno or 0) < alias_lineno:
To Reproduce
clone https://github.com/NAFTeam/NAFF
mkdocs build
Expected behavior Docs build successfully
Screenshots
exceptions
griffe.exceptions.AliasResolutionError: Could not resolve logging:
https://pastebin.com/JsqPWvZn
TypeError: '<' not supported between instances of 'NoneType' and 'int':
https://pastebin.com/CHYvChzD
System (please complete the following information):
griffeversion: [e.g. 0.2.1] 0.19.3- Python version: [e.g. 3.8] 3.10.4
- OS: [Windows/Linux] Windows and Linux
Additional context We've previously had issues building docs with mkdocstrings new parser https://github.com/mkdocstrings/mkdocstrings/issues/382
Hi, thanks for the report!
Griffe seems to be unable to resolve builtins in stub files
After having taken a look at your logs (thanks!), I'd rephrase that to say that I forgot to take aliases into account when merging stubs. We should not try to resolve aliases when merging stubs.
About the second issue: yup, it has been reported in #72 as well. I need to check why these aliases don't have a line number. A quick check of the code just told me that I never instantiate an alias without line numbers, at least not when visiting (when inspecting, yes, of course, since there's no line number information). That's one more reproducible example for me so, thanks :slightly_smiling_face: I'll try to get to it soon.
Eventually, if it's not fixable, your "dumb fix", which is not dumb, will probably be applied :smile:
Ah, maybe found a patch, if you could try it:
for new_member, alias_lineno, alias_endlineno in expanded:
overwrite = False
already_present = new_member.name in obj.members
if already_present:
old_member = obj[new_member.name]
old_lineno = getattr(old_member, "alias_lineno", old_member.lineno)
overwrite = alias_lineno > old_lineno
if not already_present or overwrite:
obj[new_member.name] = Alias(
new_member.name, new_member, lineno=alias_lineno, endlineno=alias_endlineno
)
Unfortunately unsuccessful
ERROR - Error reading page 'API Reference\Client.md': '>' not supported between instances of 'int' and 'NoneType'
Traceback (most recent call last):
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\click\core.py", line 1055, in main
rv = self.invoke(ctx)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\click\core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\click\core.py", line 760, in invoke
return __callback(*args, **kwargs)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocs\__main__.py", line 192, in build_command
build.build(config.load_config(**kwargs), dirty=not clean)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocs\commands\build.py", line 292, in build
_populate_page(file.page, config, files, dirty)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocs\commands\build.py", line 174, in _populate_page
page.render(config, files)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocs\structure\pages.py", line 175, in render
self.content = md.convert(self.markdown)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\markdown\core.py", line 264, in convert
root = self.parser.parseDocument(self.lines).getroot()
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\markdown\blockparser.py", line 90, in parseDocument
self.parseChunk(self.root, '\n'.join(lines))
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\markdown\blockparser.py", line 105, in parseChunk
self.parseBlocks(parent, text.split('\n\n'))
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\markdown\blockparser.py", line 123, in parseBlocks
if processor.run(parent, blocks) is not False:
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocstrings\extension.py", line 121, in run
html, handler, data = self._process_block(identifier, block, heading_level)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocstrings\extension.py", line 195, in _process_block
data: CollectorItem = handler.collect(identifier, options)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\mkdocstrings_handlers\python\handler.py", line 195, in collect
unresolved, iterations = loader.resolve_aliases(only_exported=True, only_known_modules=True)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\griffe\loader.py", line 179, in resolve_aliases
self.expand_wildcards(wildcards_module)
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\griffe\loader.py", line 247, in expand_wildcards
self.expand_wildcards(target, only_known_modules) # type: ignore[union-attr]
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\griffe\loader.py", line 247, in expand_wildcards
self.expand_wildcards(target, only_known_modules) # type: ignore[union-attr]
File "C:\Users\LordOfPolls\Documents\Projects\NAFF\.venv\lib\site-packages\griffe\loader.py", line 265, in expand_wildcards
overwrite = alias_lineno > old_lineno
TypeError: '>' not supported between instances of 'int' and 'NoneType'
This should now be fixed by 0.20.0! Thank you for the report and help! Let me know if you still encounter issues :slightly_smiling_face:
Im still showing this as an issue with griffe 0.20.0
relevent versions:
> pip list
[...]
griffe 0.20.0
[...]
mkdocs 1.3.0
mkdocs-autorefs 0.4.1
mkdocs-awesome-pages-plugin 2.7.0
mkdocs-material 8.2.15
mkdocs-material-extensions 1.0.3
mkdocstrings 0.19.0
mkdocstrings-python 0.7.0
ERROR - Error reading page 'API Reference/Client.md': Could not resolve logging
Traceback (most recent call last):
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/dataclasses.py", line 944, in resolve_target
resolved = self.modules_collection[self.target_path]
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/mixins.py", line 26, in __getitem__
return self.members[parts[0]] # type: ignore[attr-defined]
KeyError: 'logging'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/lordofpolls/.pyenv/versions/docs/bin/mkdocs", line 8, in <module>
sys.exit(cli())
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/click/core.py", line 1130, in __call__
return self.main(*args, **kwargs)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/click/core.py", line 1055, in main
rv = self.invoke(ctx)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/click/core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/click/core.py", line 760, in invoke
return __callback(*args, **kwargs)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocs/__main__.py", line 192, in build_command
build.build(config.load_config(**kwargs), dirty=not clean)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocs/commands/build.py", line 292, in build
_populate_page(file.page, config, files, dirty)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocs/commands/build.py", line 174, in _populate_page
page.render(config, files)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocs/structure/pages.py", line 175, in render
self.content = md.convert(self.markdown)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/markdown/core.py", line 264, in convert
root = self.parser.parseDocument(self.lines).getroot()
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/markdown/blockparser.py", line 90, in parseDocument
self.parseChunk(self.root, '\n'.join(lines))
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/markdown/blockparser.py", line 105, in parseChunk
self.parseBlocks(parent, text.split('\n\n'))
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/markdown/blockparser.py", line 123, in parseBlocks
if processor.run(parent, blocks) is not False:
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocstrings/extension.py", line 121, in run
html, handler, data = self._process_block(identifier, block, heading_level)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocstrings/extension.py", line 195, in _process_block
data: CollectorItem = handler.collect(identifier, options)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/mkdocstrings_handlers/python/handler.py", line 191, in collect
loader.load_module(module_name)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/loader.py", line 148, in load_module
top_module = self._load_module(package.name, package.path, submodules=submodules)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/loader.py", line 352, in _load_module
return self._load_module_path(module_name, module_path, submodules, parent)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/loader.py", line 380, in _load_module_path
self._load_submodules(module)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/loader.py", line 385, in _load_submodules
self._load_submodule(module, subparts, subpath)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/loader.py", line 396, in _load_submodule
member_parent[subparts[-1]] = self._load_module(
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/mixins.py", line 75, in __setitem__
value = merge_stubs(member, value)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/merger.py", line 92, in merge_stubs
_merge_module_stubs(module, stubs)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/merger.py", line 20, in _merge_module_stubs
_merge_stubs_members(module, stubs)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/merger.py", line 60, in _merge_stubs_members
elif obj_member.is_class:
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/dataclasses.py", line 811, in __getattr__
attr = getattr(self.target, name)
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/dataclasses.py", line 920, in target
self.resolve_target()
File "/home/lordofpolls/.pyenv/versions/3.10.4/envs/docs/lib/python3.10/site-packages/griffe/dataclasses.py", line 946, in resolve_target
raise AliasResolutionError(self.target_path) from error
griffe.exceptions.AliasResolutionError: Could not resolve logging
Oh yes, that's another issue. Will reopen until it's fixed.
Apologies for bumping this, do you know when you'll have chance to fix this?
I'll try to push a fix soon :slightly_smiling_face: Just need proper testing.
Hey @LordOfPolls, sorry for the long wait. I've been busy / suffering from burnout. Could you let me know if I can still replicate the issue within https://github.com/NAFTeam/NAFF?
I just built NAFF's docs on master branch without any issues, please open a new issue if you still have encounter errors.