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

Handling of attrs/dataclass/pydantic/namedtuple constructors #656

Draft
wants to merge 63 commits into
base: master
Choose a base branch
from

Conversation

tristanlatr
Copy link
Contributor

@tristanlatr tristanlatr commented Oct 17, 2022

This PR drastically improve our understanding of attrs generated classes.

It will infer the __init__ signature and present fields docstrings in the parameter table.
It understand combinations of auto_attribs, auto_detect, kw_only and init arguments to the attr.s() function. As well as the new APIs attrs.define(). For attr.ib(), it checks the converter, factory, default, type, kw_only and init arguments to infer each constructor param.

It only handles the creation of the __init__ method, it’s does not create __eq__ and other attrs methods. Since these methods all have the same signature, it’s probably not worth it to actually create Function instance to represent them. One thing we could do it to add a note at the end of the docstring listing implemented methods. Another thing to do would be to show the class decorators so the reader can determine whether all compare methods are implemented.

See documentation here: https://pydoctor--656.org.readthedocs.build/en/656/codedoc.html#using-attrs

@codecov
Copy link

codecov bot commented Oct 31, 2022

Codecov Report

Attention: Patch coverage is 91.42212% with 38 lines in your changes are missing coverage. Please review.

Project coverage is 92.52%. Comparing base (9becf85) to head (417e995).

❗ Current head 417e995 differs from pull request most recent head 60c319e. Consider uploading reports for the commit 60c319e to get more accurate results

Files Patch % Lines
pydoctor/extensions/attrs.py 88.98% 15 Missing and 11 partials ⚠️
pydoctor/astutils.py 88.88% 7 Missing and 1 partial ⚠️
pydoctor/extensions/_dataclass_like.py 95.34% 1 Missing and 1 partial ⚠️
pydoctor/model.py 93.75% 0 Missing and 1 partial ⚠️
pydoctor/templatewriter/pages/__init__.py 66.66% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #656      +/-   ##
==========================================
- Coverage   92.69%   92.52%   -0.17%     
==========================================
  Files          47       48       +1     
  Lines        8285     8580     +295     
  Branches     1826     1896      +70     
==========================================
+ Hits         7680     7939     +259     
- Misses        347      370      +23     
- Partials      258      271      +13     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tristanlatr tristanlatr marked this pull request as draft January 18, 2023 17:59
@tristanlatr tristanlatr changed the title 305 handling of constructors Handling of constructors Feb 22, 2023
@tristanlatr tristanlatr mentioned this pull request Feb 23, 2023
@tristanlatr tristanlatr changed the title Handling of constructors Handling of attrs constructors Apr 6, 2023

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

@tristanlatr tristanlatr marked this pull request as ready for review March 7, 2024 16:10
@tristanlatr tristanlatr changed the title Handling of attrs constructors Handling of attrs/dataclass/pydantic/namedtuple constructors Mar 7, 2024
@tristanlatr tristanlatr marked this pull request as draft March 7, 2024 20:49
Copy link

Diff from pydoctor_primer, showing the effect of this PR on open source code:

bottle (https://github.com/bottlepy/bottle): typechecking got 15.23x faster (13.8s -> 0.9s)
(Performance measurements are based on a single noisy sample)
+ Traceback (most recent call last):
+   File "/new_pydoctor/venv/bin/pydoctor", line 8, in <module>
+     sys.exit(main())
+              ^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 166, in main
+     system = get_system(options)
+              ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 33, in get_system
+     system = options.systemclass(options)
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/model.py", line 975, in __init__
+     extensions.load_extension_module(self, ext)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 209, in load_extension_module
+     setup_pydoctor_extension(ExtRegistrar(system))
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/attrs.py", line 608, in setup_pydoctor_extension
+     r.register_mixin(AttrsLikeClass)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 181, in register_mixin
+     self.system._factory.add_mixins(**_get_mixins(*mixin))
+                                       ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 113, in _get_mixins
+     assert False, f"Invalid mixin {mixin.__name__!r}. Mixins must subclass one of the base class."
+ AssertionError: Invalid mixin 'AttrsLikeClass'. Mixins must subclass one of the base class.
- /projects/bottle/bottle.py:3012: bad docstring: Definition list ends without a blank line; unexpected unindent.
- /projects/bottle/bottle.py:3591: ambiguous ref to name, could be bottle.Route.name, bottle.HeaderProperty.name, bottle.JSONPlugin.name, bottle.TemplatePlugin.name, bottle._ImportRedirect.name, bottle.FileUpload.name, bottle.BaseTemplate.name
- /projects/bottle/bottle.py:3591: Cannot find link target for "name"
- /projects/bottle/bottle.py:3591: Cannot find link target for "pack.mod" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:3592: Cannot find link target for "pack.mod.func" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:3128: Parameter "script_name" was already documented
- /projects/bottle/bottle.py:3641: Cannot find link target for "wsgiref"
- /projects/bottle/bottle.py:3649: Documented parameter "options" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:2843: Cannot find link target for "Save as..." (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:295: Cannot find link target for "/contact"
- /projects/bottle/bottle.py:296: Cannot find link target for "page"
- /projects/bottle/bottle.py:297: Cannot find link target for "routing"
- /projects/bottle/bottle.py:804: Cannot find link target for "Plugin"
- /projects/bottle/bottle.py:778: Cannot find link target for "/prefix"
- /projects/bottle/bottle.py:779: Cannot find link target for "/prefix/"
- /projects/bottle/bottle.py:767: Cannot find link target for "mount-point"
- /projects/bottle/bottle.py:900: Cannot find link target for "Plugin.apply" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:889: Cannot find link target for "GET"
- /projects/bottle/bottle.py:889: Cannot find link target for "PUT"
- /projects/bottle/bottle.py:889: Cannot find link target for "GET"
- /projects/bottle/bottle.py:1206: Cannot find link target for "Signed Cookie"
- /projects/bottle/bottle.py:1207: Cannot find link target for "secret"
- /projects/bottle/bottle.py:1362: Cannot find link target for "io.BytesIO" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:1364: Cannot find link target for "seek(0)"
- /projects/bottle/bottle.py:1261: Cannot find link target for "multipart/form-data"
- /projects/bottle/bottle.py:1237: Cannot find link target for "url-encoded"
- /projects/bottle/bottle.py:1237: Cannot find link target for "multipart/form-data"
- /projects/bottle/bottle.py:1483: Cannot find link target for "X-Requested-With"
- /projects/bottle/bottle.py:1381: Cannot find link target for "cgi.FieldStorage" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:1421: Cannot find link target for "urlparse.SplitResult" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:1882: Cannot find link target for "domain"
- /projects/bottle/bottle.py:1882: ambiguous ref to path, could be bottle.BaseRequest.path, bottle.ResourceManager.path
- /projects/bottle/bottle.py:1882: Cannot find link target for "path"
- /projects/bottle/bottle.py:1801: Cannot find link target for "secret"
- /projects/bottle/bottle.py:1802: Cannot find link target for "Signed Cookie"
- /projects/bottle/bottle.py:1809: Cannot find link target for "cookie.Morsel" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:1822: Cannot find link target for "maxage"
- /projects/bottle/bottle.py:1811: Documented parameter "maxage" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1812: Documented parameter "expires" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1813: Documented parameter "domain" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1815: Documented parameter "path" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1816: Documented parameter "secure" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1817: Documented parameter "httponly" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:1820: Cannot find link target for "lax"
- /projects/bottle/bottle.py:1820: Cannot find link target for "strict"
- /projects/bottle/bottle.py:1820: Cannot find link target for "none"
- /projects/bottle/bottle.py:1819: Documented parameter "samesite" does not exist, variable keywords should be documented with the "keyword" field
- /projects/bottle/bottle.py:2021: Cannot find link target for "template_engine"
- /projects/bottle/bottle.py:2404: Cannot find link target for "python:configparser.ConfigParser" (you can link to external docs with --intersphinx)
- /projects/bottle/bottle.py:2670: Cannot find link target for "/"
- /projects/bottle/bottle.py:2707: Cannot find link target for "None"
- /projects/bottle/bottle.py:3476: Cannot find link target for "backlog"
- /projects/bottle/bottle.py:3479: Cannot find link target for "family"
- these 1 objects' docstrings contain syntax errors:
-     bottle._parse_http_header

attrs (https://github.com/python-attrs/attrs)
+ Traceback (most recent call last):
+   File "/new_pydoctor/venv/bin/pydoctor", line 8, in <module>
+     sys.exit(main())
+              ^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 166, in main
+     system = get_system(options)
+              ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 33, in get_system
+     system = options.systemclass(options)
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/model.py", line 975, in __init__
+     extensions.load_extension_module(self, ext)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 209, in load_extension_module
+     setup_pydoctor_extension(ExtRegistrar(system))
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/attrs.py", line 608, in setup_pydoctor_extension
+     r.register_mixin(AttrsLikeClass)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 181, in register_mixin
+     self.system._factory.add_mixins(**_get_mixins(*mixin))
+                                       ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 113, in _get_mixins
+     assert False, f"Invalid mixin {mixin.__name__!r}. Mixins must subclass one of the base class."
+ AssertionError: Invalid mixin 'AttrsLikeClass'. Mixins must subclass one of the base class.
- /projects/attrs/src/attr/_make.py:2573: bad docstring: No role entry for "ref" in module "docutils.parsers.rst.languages.en".
- Trying "ref" as canonical role name.
- /projects/attrs/src/attr/_make.py:2573: bad docstring: Unknown interpreted text role "ref".
- /projects/attrs/src/attr/_make.py:2584: bad docstring: No role entry for "ref" in module "docutils.parsers.rst.languages.en".
- Trying "ref" as canonical role name.
- /projects/attrs/src/attr/_make.py:2584: bad docstring: Unknown interpreted text role "ref".
- /projects/attrs/src/attr/_make.py:497: bad docstring: Inline interpreted text or phrase reference start-string without end-string.
- /projects/attrs/src/attr/_make.py:497: bad docstring: Inline interpreted text or phrase reference start-string without end-string.
- /projects/attrs/src/attr/filters.py:13: bad docstring: Inline interpreted text or phrase reference start-string without end-string.
- /projects/attrs/src/attr/_make.py:162: bad docstring: No role entry for "ref" in module "docutils.parsers.rst.languages.en".
- Trying "ref" as canonical role name.
- /projects/attrs/src/attr/_make.py:162: bad docstring: Unknown interpreted text role "ref".
- /projects/attrs/src/attr/_make.py:212: bad docstring: No role entry for "ref" in module "docutils.parsers.rst.languages.en".
- Trying "ref" as canonical role name.
- /projects/attrs/src/attr/_make.py:212: bad docstring: Unknown interpreted text role "ref".
- /projects/attrs/src/attr/_make.py:1334: bad docstring: No role entry for "term" in module "docutils.parsers.rst.languages.en".
- Trying "term" as canonical role name.
- /projects/attrs/src/attr/_make.py:1334: bad docstring: Unknown interpreted text role "term".
- /projects/attrs/src/attr/_make.py:1437: bad docstring: No role entry for "term" in module "docutils.parsers.rst.languages.en".
- Trying "term" as canonical role name.
- /projects/attrs/src/attr/_make.py:1437: bad docstring: Unknown interpreted text role "term".
- /projects/attrs/src/attr/_make.py:1437: bad docstring: No role entry for "term" in module "docutils.parsers.rst.languages.en".
- Trying "term" as canonical role name.
- /projects/attrs/src/attr/_make.py:1437: bad docstring: Unknown interpreted text role "term".
- /projects/attrs/src/attr/_make.py:1484: bad docstring: No role entry for "ref" in module "docutils.parsers.rst.languages.en".
- Trying "ref" as canonical role name.
- /projects/attrs/src/attr/_make.py:1484: bad docstring: Unknown interpreted text role "ref".
- /projects/attrs/src/attr/_next_gen.py:62: bad docstring: No role entry for "term" in module "docutils.parsers.rst.languages.en".
- Trying "term" as canonical role name.
- /projects/attrs/src/attr/_next_gen.py:62: bad docstring: Unknown interpreted text role "term".
- /projects/attrs/src/attr/_cmp.py:45: Cannot find link target for "comparison"
- /projects/attrs/src/attr/_cmp.py:29: Documented parameter "typing.Callable | None eq" does not exist
- /projects/attrs/src/attr/_cmp.py:31: Documented parameter "typing.Callable | None lt" does not exist
- /projects/attrs/src/attr/_cmp.py:33: Documented parameter "typing.Callable | None le" does not exist
- /projects/attrs/src/attr/_cmp.py:35: Documented parameter "typing.Callable | None gt" does not exist
- /projects/attrs/src/attr/_cmp.py:37: Documented parameter "typing.Callable | None ge" does not exist
- /projects/attrs/src/attr/_cmp.py:40: Cannot find link target for "True"
- /projects/attrs/src/attr/_cmp.py:41: Cannot find link target for "NotImplemented"
- /projects/attrs/src/attr/_cmp.py:40: Documented parameter "bool require_same_type" does not exist
- /projects/attrs/src/attr/_cmp.py:43: Documented parameter "str | None class_name" does not exist
- /projects/attrs/src/attr/_funcs.py:25: Documented parameter "bool recurse" does not exist
- /projects/attrs/src/attr/_funcs.py:27: Cannot find link target for "True"
- /projects/attrs/src/attr/_funcs.py:28: Cannot find link target for "False"
- /projects/attrs/src/attr/_funcs.py:26: Documented parameter "~typing.Callable filter" does not exist
- /projects/attrs/src/attr/_funcs.py:30: Documented parameter "~typing.Callable dict_factory" does not exist
- /projects/attrs/src/attr/_funcs.py:33: Cannot find link target for "list"
- /projects/attrs/src/attr/_funcs.py:34: Cannot find link target for "tuple"
- /projects/attrs/src/attr/_funcs.py:34: Cannot find link target for "set"
- /projects/attrs/src/attr/_funcs.py:35: Cannot find link target for "True"
- /projects/attrs/src/attr/_funcs.py:33: Documented parameter "bool retain_collection_types" does not exist
- /projects/attrs/src/attr/_funcs.py:36: Documented parameter "typing.Callable | None value_serializer" does not exist
- /projects/attrs/src/attr/_funcs.py:209: Documented parameter "bool recurse" does not exist
- /projects/attrs/src/attr/_funcs.py:211: Cannot find link target for "True"
- /projects/attrs/src/attr/_funcs.py:212: Cannot find link target for "False"
- /projects/attrs/src/attr/_funcs.py:210: Documented parameter "~typing.Callable filter" does not exist
- /projects/attrs/src/attr/_funcs.py:214: Documented parameter "~typing.Callable tuple_factory" does not exist
- /projects/attrs/src/attr/_funcs.py:216: Cannot find link target for "list"
- /projects/attrs/src/attr/_funcs.py:216: Cannot find link target for "dict"
- /projects/attrs/src/attr/_funcs.py:217: Cannot find link target for "tuple"
- /projects/attrs/src/attr/_funcs.py:216: Cannot find link target for "dict"
- /projects/attrs/src/attr/_funcs.py:217: Cannot find link target for "set"
- /projects/attrs/src/attr/_funcs.py:218: Cannot find link target for "True"
- /projects/attrs/src/attr/_funcs.py:216: Documented parameter "bool retain_collection_types" does not exist
- /projects/attrs/src/attr/_funcs.py:371: Documented parameter "inst" does not exist, variable keywords should be documented with the "keyword" field
- /projects/attrs/src/attr/_funcs.py:308: Documented parameter "type cls" does not exist
- /projects/attrs/src/attr/_funcs.py:426: Cannot find link target for "typing.get_type_hints" (you can link to external docs with --intersphinx)
- /projects/attrs/src/attr/_funcs.py:428: Documented parameter "type cls" does not exist
- /projects/attrs/src/attr/_funcs.py:429: Documented parameter "dict | None globalns" does not exist
- /projects/attrs/src/attr/_funcs.py:430: Documented parameter "dict | None localns" does not exist
- /projects/attrs/src/attr/_funcs.py:431: Documented parameter "list | None attribs" does not exist
- /projects/attrs/src/attr/_funcs.py:434: Documented parameter "bool include_extras" does not exist
- /projects/attrs/src/attr/_make.py:239: Cannot find link target for "None"
- /projects/attrs/src/attr/_make.py:135: Cannot find link target for "TypeError"
- /projects/attrs/src/attr/_make.py:140: Cannot find link target for "defaults"
- /projects/attrs/src/attr/_make.py:142: Documented parameter "~typing.Callable factory" does not exist
- /projects/attrs/src/attr/_make.py:148: Cannot find link target for "~attrs.Attribute" (you can link to external docs with --intersphinx)
- /projects/attrs/src/attr/_make.py:153: Cannot find link target for "list"
- /projects/attrs/src/attr/_make.py:145: Documented parameter "~typing.Callable | list[~typing.Callable] validator" does not exist
- /projects/attrs/src/attr/_make.py:164: Cannot find link target for "True"
- /projects/attrs/src/attr/_make.py:165: Cannot find link target for "False"
- /projects/attrs/src/attr/_make.py:163: Documented parameter "bool | ~typing.Callable repr" does not exist
- /projects/attrs/src/attr/_make.py:171: Cannot find link target for "True"
- /projects/attrs/src/attr/_make.py:177: Cannot find link target for "comparison"
- /projects/attrs/src/attr/_make.py:171: Documented parameter "bool | ~typing.Callable eq" does not exist
- /projects/attrs/src/attr/_make.py:179: Cannot find link target for "True"
- /projects/attrs/src/attr/_make.py:185: Cannot find link target for "comparison"
- /projects/attrs/src/attr/_make.py:179: Documented parameter "bool | ~typing.Callable order" does not exist
- /projects/attrs/src/attr/_make.py:190: Cannot find link target for "comparison"
- /projects/attrs/src/attr/_make.py:191: Cannot find link target for "bool"
- /projects/attrs/src/attr/_make.py:191: Cannot find link target for "callable"
- /projects/attrs/src/attr/_make.py:194: Cannot find link target for "None"

... (truncated 167 lines) ...

pydoctor (https://github.com/twisted/pydoctor): typechecking got 44.08x faster (37.1s -> 0.8s)
(Performance measurements are based on a single noisy sample)
+ Traceback (most recent call last):
+   File "/new_pydoctor/venv/bin/pydoctor", line 8, in <module>
+     sys.exit(main())
+              ^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 166, in main
+     system = get_system(options)
+              ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 33, in get_system
+     system = options.systemclass(options)
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/model.py", line 975, in __init__
+     extensions.load_extension_module(self, ext)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 209, in load_extension_module
+     setup_pydoctor_extension(ExtRegistrar(system))
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/attrs.py", line 608, in setup_pydoctor_extension
+     r.register_mixin(AttrsLikeClass)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 181, in register_mixin
+     self.system._factory.add_mixins(**_get_mixins(*mixin))
+                                       ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 113, in _get_mixins
+     assert False, f"Invalid mixin {mixin.__name__!r}. Mixins must subclass one of the base class."
+ AssertionError: Invalid mixin 'AttrsLikeClass'. Mixins must subclass one of the base class.

coco (https://github.com/numbbo/coco): typechecking got 43.34x faster (21.8s -> 0.5s)
(Performance measurements are based on a single noisy sample)
+ Traceback (most recent call last):
+   File "/new_pydoctor/venv/bin/pydoctor", line 8, in <module>
+     sys.exit(main())
+              ^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 166, in main
+     system = get_system(options)
+              ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 33, in get_system
+     system = options.systemclass(options)
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/model.py", line 975, in __init__
+     extensions.load_extension_module(self, ext)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 209, in load_extension_module
+     setup_pydoctor_extension(ExtRegistrar(system))
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/attrs.py", line 608, in setup_pydoctor_extension
+     r.register_mixin(AttrsLikeClass)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 181, in register_mixin
+     self.system._factory.add_mixins(**_get_mixins(*mixin))
+                                       ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 113, in _get_mixins
+     assert False, f"Invalid mixin {mixin.__name__!r}. Mixins must subclass one of the base class."
+ AssertionError: Invalid mixin 'AttrsLikeClass'. Mixins must subclass one of the base class.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:5: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:5: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/findfiles.py:8: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:8: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/findfiles.py:8: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:8: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/pproc.py:676: bad docstring: Unexpected indentation.
- /projects/coco/code-postprocessing/cocopp/pproc.py:677: bad docstring: Block quote ends without a blank line; unexpected unindent.
- /projects/coco/code-postprocessing/cocopp/ppfigdim.py:31: bad docstring: No directive entry for "plot" in module "docutils.parsers.rst.languages.en".
- Trying "plot" as canonical directive name.
- /projects/coco/code-postprocessing/cocopp/ppfigdim.py:31: bad docstring: Unknown directive type "plot"... plot::
-     :width: 50%
- 
-     import urllib
-     import tarfile
-     import glob
-     from pylab import *
- 
-     import cocopp
- 
-     # Collect and unarchive data (3.4MB)
-     dataurl = 'http://coco.lri.fr/BBOB2009/pythondata/BIPOP-CMA-ES.tar.gz'
-     filename, headers = urllib.urlretrieve(dataurl)
-     archivefile = tarfile.open(filename)
-     archivefile.extractall()
- 
-     # Scaling figure
-     ds = cocopp.load(glob.glob('BBOB2009pythondata/BIPOP-CMA-ES/ppdata_f002_*.pickle'))
-     figure()
-     cocopp.ppfigdim.plot(ds)
-     cocopp.ppfigdim.beautify()
-     cocopp.ppfigdim.plot_previous_algorithms(2, False) # plot BBOB 2009 best algorithm on fun 2
- /projects/coco/code-postprocessing/cocopp/pprldistr.py:19: bad docstring: No directive entry for "plot" in module "docutils.parsers.rst.languages.en".
- Trying "plot" as canonical directive name.
- /projects/coco/code-postprocessing/cocopp/pprldistr.py:19: bad docstring: Unknown directive type "plot"... plot::
-    :width: 75%
- 
-    import urllib
-    import tarfile
-    import glob
-    from pylab import *
-    import cocopp
- 
-    # Collect and unarchive data (3.4MB)
-    dataurl = 'http://coco.lri.fr/BBOB2009/pythondata/BIPOP-CMA-ES.tar.gz'
-    filename, headers = urllib.urlretrieve(dataurl)
-    archivefile = tarfile.open(filename)
-    archivefile.extractall()
- 
-    # Empirical cumulative distribution function figure
-    ds = cocopp.load(glob.glob('BBOB2009pythondata/BIPOP-CMA-ES/ppdata_f0*_20.pickle'))
-    figure()
-    cocopp.pprldistr.plot(ds)
-    cocopp.pprldistr.beautify() # resize the window to view whole figure
- 
- /projects/coco/code-postprocessing/cocopp/compall/pprldmany.py:19: bad docstring: No directive entry for "plot" in module "docutils.parsers.rst.languages.en".
- Trying "plot" as canonical directive name.
- /projects/coco/code-postprocessing/cocopp/compall/pprldmany.py:19: bad docstring: Unknown directive type "plot"... plot::
-     :width: 50%
- 
-     import cocopp
- 
-     # Empirical cumulative distribution function of bootstrapped ERT figure
-     ds = cocopp.load(cocopp.bbob.get('2009/BIPOP-CMA-ES'))
-     figure()
-     cocopp.compall.pprldmany.plot(ds) # must rather call main instead of plot?
-     cocopp.compall.pprldmany.beautify()
- /projects/coco/code-postprocessing/cocopp/rungeneric1.py:7: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/rungeneric1.py:7: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/ppfigcons1.py:7: bad docstring: Unexpected indentation.
- /projects/coco/code-postprocessing/cocopp/algportfolio.py:15: bad docstring: No directive entry for "plot" in module "docutils.parsers.rst.languages.en".
- Trying "plot" as canonical directive name.
- /projects/coco/code-postprocessing/cocopp/algportfolio.py:15: bad docstring: Unknown directive type "plot"... plot::
-    :width: 75%
- 
-    import glob
-    from pylab import *
-    import pickle
-    import cocopp
-    import cocopp.compall.pprldmany
-    import cocopp.algportfolio
- 
-    # Collect and unarchive data
-    dsets = {}
-    for alg in ('BIPOP-CMA-ES_hansen_noiseless', 'NEWUOA_ros_noiseless'):
-       dsets[alg] = cocopp.load(cocopp.bbob(alg))
- 
-    # Generate the algorithm portfolio
-    dspf = cocopp.algportfolio.build(dsets)
-    dsets['Portfolio'] = dspf # store the portfolio in dsets
- 
-    # plot the run lengths distribution functions
-    plt.figure()
-    for algname, ds in dsets.items():
-       dataset = ds.dictByDimFunc()[10][13]  # DataSet dimension 10 on F13
-       cocopp.compall.pprldmany.plot(dataset, label=algname)
-    cocopp.compall.pprldmany.beautify()
-    legend(loc='best') # Display legend
-    plt.show()
- 
- /projects/coco/code-postprocessing/cocopp/compall/ppperfprof.py:9: bad docstring: No directive entry for "plot" in module "docutils.parsers.rst.languages.en".
- Trying "plot" as canonical directive name.
- /projects/coco/code-postprocessing/cocopp/compall/ppperfprof.py:9: bad docstring: Unknown directive type "plot"... plot::
-    :width: 75%
- 
-    import urllib
-    import tarfile
-    import glob
-    from pylab import *
-    import pickle
-    import cocopp
-    import cocopp.compall.ppperfprof
-    import cocopp.bestalg
- 
-    # Collect and unarchive data
-    dsets = {}
-    for alg in cocopp.compall.ppperfprof.best:
-        for date in ('2010', '2009'):
-            try:
-                dataurl = 'http://coco.lri.fr/BBOB'+date+'/pythondata/' + alg + '.tar.gz'
-                filename, headers = urllib.urlretrieve(dataurl)
-                archivefile = tarfile.open(filename)
-                archivefile.extractall()  # write to disc
-                dsets[alg] = cocopp.load(glob.glob('BBOB'+date+'pythondata/' + alg + '/ppdata_f0*_20.pickle'))
-            except:
-                pass
- 
-    # plot the profiles
-    figure()
-    # cocopp.compall.ppperfprof.plotmultiple(dsets, dsref=cocopp.bestalg.bestAlgorithmEntries)
- /projects/coco/code-postprocessing/cocopp/findfiles.py:45: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:45: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/findfiles.py:45: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/findfiles.py:45: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/toolsstats.py:985: bad docstring: Unknown target name: "list".
- /projects/coco/code-postprocessing/cocopp/ppfig.py:631: bad docstring: Blank line missing before literal block (after the "::")? Interpreted as a definition list item.
- /projects/coco/code-postprocessing/cocopp/pproc.py:149: bad docstring: Unexpected indentation.
- /projects/coco/code-postprocessing/cocopp/pproc.py:147: bad docstring: Inline literal start-string without end-string.
- /projects/coco/code-postprocessing/cocopp/pproc.py:3241: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/pproc.py:3241: bad docstring: Unknown interpreted text role "file".
- /projects/coco/code-postprocessing/cocopp/pproc.py:3241: bad docstring: No role entry for "file" in module "docutils.parsers.rst.languages.en".
- Trying "file" as canonical role name.
- /projects/coco/code-postprocessing/cocopp/pproc.py:3241: bad docstring: Unknown interpreted text role "file".

... (truncated 459 lines) ...

pycma (https://github.com/CMA-ES/pycma): typechecking got 57.23x faster (39.4s -> 0.7s)
(Performance measurements are based on a single noisy sample)
+ Traceback (most recent call last):
+   File "/new_pydoctor/venv/bin/pydoctor", line 8, in <module>
+     sys.exit(main())
+              ^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 166, in main
+     system = get_system(options)
+              ^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/driver.py", line 33, in get_system
+     system = options.systemclass(options)
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/model.py", line 975, in __init__
+     extensions.load_extension_module(self, ext)
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/__init__.py", line 209, in load_extension_module
+     setup_pydoctor_extension(ExtRegistrar(system))
+   File "/new_pydoctor/venv/lib/python3.11/site-packages/pydoctor/extensions/attrs.py", line 608, in setup_pydoctor_extension
+     r.register_mixin(AttrsLikeClass)

... (truncated 1160 lines) ...```

@tristanlatr
Copy link
Contributor Author

Looks like I messed up with the merge commit…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant