-
Notifications
You must be signed in to change notification settings - Fork 51
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
Rework reparenting and allobjects attribute #725
Conversation
Introduces the Module.imports attribue holding a list of resolved imports, this is required by the re-exporting process since only imported names should be reparented. Introduces the System.modules attribute that is a dict from the module full names to the Module instances. This dict is not changed during reparenting. Switch from using of a actual dict to hold values of System.allobjects attribute; instead allobject is a proxy that lazily get the documentable having the requested fullname based on system's rootobjects and modules attributes. It simplifies drastically the reparenting code since the only thing left to handle is the new name of object and it's parent.contents links. This commit should not introduce any changes in behavior.
Codecov ReportPatch coverage:
Additional details and impacted files@@ Coverage Diff @@
## master #725 +/- ##
=======================================
Coverage 92.62% 92.62%
=======================================
Files 47 47
Lines 8132 8214 +82
Branches 1944 1968 +24
=======================================
+ Hits 7532 7608 +76
Misses 343 343
- Partials 257 263 +6
☔ View full report in Codecov by Sentry. |
@@ -246,27 +330,14 @@ def reparent(self, new_parent: 'Module', new_name: str) -> None: | |||
# invariants assumed by various bits of pydoctor |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment should be adjusted saying that the last invariants assumed by pydoctor is that obj is obj.parent.contents[obj.name]
if the object is not a root module.
@@ -1433,6 +1523,11 @@ def postProcess(self) -> None: | |||
without the risk of drawing incorrect conclusions because modules | |||
were not fully processed yet. | |||
""" | |||
# TODO: it might be better to do the re-exporting after default | |||
# post-processes (zopeinterface post process is designed to be run after | |||
# reparenting); or better implement a sorted based or post processing priority |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See #726
orgmodule = imported_name.orgmodule | ||
if local_name != '*' and (not orgname or local_name not in exports): | ||
continue | ||
origin = system.modules.get(orgmodule) or system.allobjects.get(orgmodule) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
origin = system.modules.get(orgmodule) or system.allobjects.get(orgmodule) | |
origin = system.modules.get(orgmodule) |
This is probably enough, since we can't reparent an object that has already been reparented
This PR could and should be splitted in two: first the allobject refactor, then the reparenting refactor. |
Rework reparenting in post-processing. It ensures that for all time of visiting the ASTs, the model represent the real code structure, since no reparenting is done before post processing.
This patch changes some of the core pydoctor logic, so it should be carefully reviewed.
This changes will help fixing #295 as well as improve our capacity to fix #184 and other
__all__
related problems. Together with #723 it will finally fix #295.Introduces the
Module.imports
attribute holding a list of resolved imports (likeast.alias
but with full module names), this is required by the re-exporting process since only imported names should be reparented.Introduces the
System.modules
attribute that is a dict from the module full names to the Module instances. This dict is not changed during reparenting. It's populated when the modules are added to the system. This behaviour better matches the python import system and makes us differentiate a module vs an object with the same fullname as the module in the parent package__init__.py
for instance.Switch from using of a actual dict to hold values of
System.allobjects
attribute; insteadallobject
is a proxy that lazily get the documentable having the requested fullname based on system'srootobjects
andmodules
attributes. It simplifies drastically the reparenting code since the only thing left to handle is the new name of object and it'sparent.contents
links. This switch also introduces diff in handling of duplicate objects since there is no need to explicitly handleallobjects
mapping.This PR should not introduce any changes in behaviour, except it fixes a bug in reparenting process when there as duplicates (see new tests).