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

Add Sphinx docs customization for multimethod #1088

Merged
merged 5 commits into from
Jun 17, 2022

Conversation

lorenzncode
Copy link
Member

This adds customization to better handle multimethod in the HTML docs. To resolve #1087.

Now multimethod is handled in a similar way as overload and singledispatch.

@codecov
Copy link

codecov bot commented May 24, 2022

Codecov Report

Merging #1088 (5d83e3b) into master (a5fadeb) will not change coverage.
The diff coverage is n/a.

❗ Current head 5d83e3b differs from pull request most recent head 3c35d7b. Consider uploading reports for the commit 3c35d7b to get more accurate results

@@           Coverage Diff           @@
##           master    #1088   +/-   ##
=======================================
  Coverage   96.34%   96.34%           
=======================================
  Files          40       40           
  Lines        9533     9533           
  Branches     1259     1259           
=======================================
  Hits         9185     9185           
  Misses        205      205           
  Partials      143      143           
Impacted Files Coverage Δ
cadquery/sketch.py 96.30% <ø> (ø)

📣 Codecov can now indicate which changes are the most critical in Pull Requests. Learn more

@lorenzncode lorenzncode marked this pull request as draft May 24, 2022 03:51
Handle multimethod class methods in automodule customization
Update sphinx pin
Update .gitignore for vim
@lorenzncode lorenzncode marked this pull request as ready for review June 4, 2022 04:16
@lorenzncode
Copy link
Member Author

Here is an example of the customized autosummary output (API Reference):
image

It shows ellipsis in place of the input parameters now.

This provides a hint, and following the link, multiple signatures are displayed.
image

The Parameters field list continues to show a single set of parameters for one of the signatures similar to overloads. The source link is available to show the implementation.

@jmwright
Copy link
Member

jmwright commented Jun 6, 2022

@lorenzncode I think this looks good. Is it ready for review?

@lorenzncode
Copy link
Member Author

Yes, this is ready for review. Thanks for taking a look.

@jmwright jmwright self-requested a review June 7, 2022 12:54
@jmwright
Copy link
Member

jmwright commented Jun 7, 2022

@Peque You have done a lot with our Sphinx setup before, do you have the time and interest to take a look at this PR?

@lorenzncode I get the following warning when I generate the docs, are you getting it as well? WARNING: while setting up extension sphinx_autodoc_multimethod: directive 'autosummary' is already registered, it will be overridden

@Peque
Copy link
Contributor

Peque commented Jun 7, 2022

@jmwright Not the time, but thanks for the ping! 😊

@lorenzncode
Copy link
Member Author

Thanks @jmwright. Yes I reproduced the warning. I've pushed a change to address the warning by setting the override=True flag. Since this is an intentional override, sphinx will no longer issue the warning.

@jmwright
Copy link
Member

jmwright commented Jun 9, 2022

Thanks @lorenzncode

Other than the two other comments I think this PR looks good. I'm not sure who else will review it. @adam-urbanczyk are you available to do it?

@dcowden
Copy link
Member

dcowden commented Jun 9, 2022

@jmwright i can review, I probably can get to it early next week

@jmwright
Copy link
Member

jmwright commented Jun 9, 2022

@dcowden Great thanks!

@jmwright jmwright requested a review from dcowden June 9, 2022 14:01
Copy link
Member

@adam-urbanczyk adam-urbanczyk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, would it be possible (and not too much work) to generate three parameter lists under each function prototype?

afbeelding

@dcowden
Copy link
Member

dcowden commented Jun 14, 2022

+1

Copy link
Member

@dcowden dcowden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely not a sphinx expert here, but looks ok to me

Copy link
Member

@jmwright jmwright left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lorenzncode Thanks! Feel free to merge if you think it's ready. You might want to start a new issue for the comment made by @adam-urbanczyk . I think this is a nice stand-alone PR as-is, but that's a possible future change.

# of inner classes can be documented
full_name = modname + "::" + full_name[len(modname) + 1 :]
# NB. using full_name here is important, since Documenters
# handle module prefixes slightly differently
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are the extra preceding spaces in this comment intentional?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This extension creates a subclass of sphinx.ext.autodoc.MethodDocumenter overriding method format_signature and a sublcass of sphinx.ext.autosummary.AutoSummary overriding get_items. Actually this comment comes from the original implementation of get_items. I didn't change the formatting other than run black. I would suggest to keep the extra spaces as is to help diff in the future say when checking for compatibility with a new Sphinx release (I'll add a note on maintenance).

@@ -782,7 +782,7 @@ def arc(
forConstruction: bool = False,
) -> T:
"""
Construct an arc starting at p1, through p2, ending at p3
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was actually added in a fairly recent PR. https://github.com/CadQuery/cadquery/pull/1049/files

What's the reason for removing it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this was intentionally reverted back to the original docstring. The original docstring has a generic description that is applicable to all of the dispatch methods which is better than a description specific to only one of the methods.

@lorenzncode
Copy link
Member Author

LGTM, would it be possible (and not too much work) to generate three parameter lists under each function prototype?

afbeelding

I agree the vertical field list for each prototype would be nice to try. Unfortunately it does not look easy to me.

This PR attempts to bring multimethod support more in line with how Sphinx handles overload and singledispatchmethod where Sphinx supports a list of signatures. This was mostly a matter of identifying multimethod usage and appending to the signature list. Sphinx does not show the Parameter field list for each signature today for say singledispatchmethod so I think more significant customization would be required.

@lorenzncode
Copy link
Member Author

Notes on maintenance:

When updating to a newer Sphinx version, test that the extension is working. The extension depends on Sphinx autodoc and autosummary and may require updates depending on changes to Sphinx (there were none from v4.5 to v5.0 so far).

Compare MultimethodAutosummary.get_items, and MethodDocumenter.format_signature with the Sphinx implementation.
The modifications are commented with # -- multimethod customization, # -- end customization.

@lorenzncode
Copy link
Member Author

I pushed a minor change to a .gitignore entry added in this PR. If there are no other issues, this is ready to squash and merge.

@jmwright jmwright merged commit c9d3f1e into CadQuery:master Jun 17, 2022
@jmwright
Copy link
Member

Thanks @lorenzncode

I re-ran the randomly falling test on Windows and it passed the second time.

@adam-urbanczyk
Copy link
Member

I agree the vertical field list for each prototype would be nice to try. Unfortunately it does not look easy to me.

This PR attempts to bring multimethod support more in line with how Sphinx handles overload and singledispatchmethod where Sphinx supports a list of signatures. This was mostly a matter of identifying multimethod usage and appending to the signature list. Sphinx does not show the Parameter field list for each signature today for say singledispatchmethod so I think more significant customization would be required.

No worries, thanks for the hard work!

@lorenzncode lorenzncode deleted the sphinx-multimethod branch February 26, 2023 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Show multimethod signatures in HTML docs
5 participants