daizutabi / mkapi

A plugin for MkDocs to generate API documentation
https://daizutabi.github.io/mkapi/
MIT License
95 stars 19 forks source link

KeyError on __dataclass_field__ #13

Closed rhuygen closed 4 years ago

rhuygen commented 4 years ago

Hi,

I'm trying to use your mkdocs plugin for a project and I get the following error:

  File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/node.py", line 101, in get_kind
    if hasattr(obj, "__dataclass_fields__") and hasattr(obj, "__qualname__"):
KeyError: '__dataclass_fields__'
Full console output of `mkdocs build`

``` (venv38) ~/Git/plato-common-egse/MKDOCS (develop)> mkdocs build Traceback (most recent call last): File "/Users/rik/Git/plato-common-egse/venv38/bin/mkdocs", line 8, in sys.exit(cli()) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/click/core.py", line 829, in __call__ return self.main(*args, **kwargs) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/click/core.py", line 782, in main rv = self.invoke(ctx) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/click/core.py", line 1066, in invoke return ctx.invoke(self.callback, **ctx.params) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkdocs/__main__.py", line 152, in build_command build.build(config.load_config(**kwargs), dirty=not clean) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkdocs/commands/build.py", line 236, in build config = config['plugins'].run_event('config', config) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkdocs/plugins.py", line 94, in run_event result = method(item, **kwargs) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/plugins/mkdocs.py", line 47, in on_config config, self.abs_api_paths = mkapi.plugins.api.create_nav(config) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/plugins/api.py", line 23, in create_nav page[key], abs_api_paths_ = collect(value, docs_dir, config_dir) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/plugins/api.py", line 43, in collect module = get_module(package_path) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 115, in get_module return Module(obj) File "", line 6, in __init__ File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 28, in __post_init__ super().__post_init__() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/tree.py", line 51, in __post_init__ self.members = self.get_members() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 51, in get_members return get_members(self.obj) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 99, in get_members module = get_module(name) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 115, in get_module return Module(obj) File "", line 6, in __init__ File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 28, in __post_init__ super().__post_init__() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/tree.py", line 51, in __post_init__ self.members = self.get_members() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 51, in get_members return get_members(self.obj) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 99, in get_members module = get_module(name) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 115, in get_module return Module(obj) File "", line 6, in __init__ File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 28, in __post_init__ super().__post_init__() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/tree.py", line 51, in __post_init__ self.members = self.get_members() File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 51, in get_members return get_members(self.obj) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 99, in get_members module = get_module(name) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 115, in get_module return Module(obj) File "", line 6, in __init__ File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 30, in __post_init__ objects = get_objects(self.obj) File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/module.py", line 71, in get_objects if not get_kind(obj): File "/Users/rik/Git/plato-common-egse/venv38/lib/python3.8/site-packages/mkapi/core/node.py", line 101, in get_kind if hasattr(obj, "__dataclass_fields__") and hasattr(obj, "__qualname__"): KeyError: '__dataclass_fields__' ```

daizutabi commented 4 years ago

I'm wondering that hasattr() raises exception. hasattr() returns boolean if the object implements __getattr__() correctly. I mean it should not raise an KeyError but AttributeError if no attribute is found.

daizutabi commented 4 years ago

Anyway, I enclosed hasattr() by a try-except block. Please check the results using Version 0.8.2.

rhuygen commented 4 years ago

I agree this is strange, so I ran the code through pdb and found the problem is in one of my classes which doesn't properly implement __getattr__(). I'm really sorry for this.