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

Visit Try 'orelse', 'finalbody' and 'handlers' and If 'orelse' #589

Merged
merged 47 commits into from
Sep 25, 2024

Conversation

tristanlatr
Copy link
Contributor

@tristanlatr tristanlatr commented May 24, 2022

…re. The older visitor relied on generic_visit() to be recursive. Where the provided generic_visit() is not recursive anymore, and moreover not called automatically when visiting unknow nodes! So what I'm saying here is that since #576 have been merged, we're not visiting the statements inside the 'orelse' field of Try and If nodes, same goes for 'finalbody' and 'handlers'.

This commit fixes that issue. The rationale is now the following: All statements in the 'orelse' block of IF nodes and statements in the except handlers of TRY nodes that would override a name already defined in the main 'body' (or TRY 'orelse' or 'finalbody') are ignored.

Meaning that in the context of the code below, 'ssl' would resolve to 'twisted.internet.ssl':

try:
    from twisted.internet import ssl as _ssl
except ImportError:
    ssl = None
else:
    ssl = _ssl
@codecov
Copy link

codecov bot commented May 24, 2022

Codecov Report

Attention: Patch coverage is 97.46835% with 2 lines in your changes missing coverage. Please review.

Project coverage is 92.20%. Comparing base (502d378) to head (0278320).
Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
pydoctor/astbuilder.py 96.29% 1 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #589      +/-   ##
==========================================
+ Coverage   92.03%   92.20%   +0.16%     
==========================================
  Files          47       47              
  Lines        8465     8495      +30     
  Branches     1868     1882      +14     
==========================================
+ Hits         7791     7833      +42     
+ Misses        395      385      -10     
+ Partials      279      277       -2     

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

@tristanlatr
Copy link
Contributor Author

tristanlatr commented May 24, 2022

Tell me if you think the rationale is good @glyph @adiroiban. Also, this needs to be documented in the codedoc.rst file.

@tristanlatr tristanlatr changed the title Visit try orelse finalbody and if orelse Visit Try 'orelse', 'finalbody' and 'handlers' and If 'orelse' May 24, 2022
@tristanlatr tristanlatr requested a review from glyph May 24, 2022 01:13
pydoctor/astbuilder.py Outdated Show resolved Hide resolved
pydoctor/astbuilder.py Outdated Show resolved Hide resolved
pydoctor/astbuilder.py Outdated Show resolved Hide resolved
pydoctor/astbuilder.py Outdated Show resolved Hide resolved
pydoctor/test/test_astbuilder.py Outdated Show resolved Hide resolved
@tristanlatr
Copy link
Contributor Author

This PR is somewhat liked to #17 and #33 in the sense that a duplicate name defined in except handlers or a If else block will not override the name previously defined.

So in the case of class 'Arena' from https://github.com/python/cpython/blob/d2ef66a10be1250b13c32fbf3c0f9a9d2d98b124/Lib/multiprocessing/heap.py#L31
Only the first class will be documented.

Copy link
Member

@glyph glyph left a comment

Choose a reason for hiding this comment

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

LGTM with the caveat that the specific semantics of the priorities should be better explained in terms of specific order, rather than things not-getting-overridden which is a sort of a double negative.

docs/source/codedoc.rst Outdated Show resolved Hide resolved
Comment on lines 325 to 326
When pydoctor deals with try/except/else or if/else block, it makes sure that the names defined in
the "principal" branch do not get overriden by names defined in the except hanlders or ifs' else block.
Copy link
Member

Choose a reason for hiding this comment

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

This strikes me as a bit awkward. I think you want to be saying something about the priority of the binding of the name in the last branch? Or the else branch?

Copy link
Contributor Author

@tristanlatr tristanlatr Jun 7, 2022

Choose a reason for hiding this comment

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

No it's not about whether the branch is last or not. It's only the except hanlders and ifs' else blocks where we enable the override name guard.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Please advise on another wording you would have used :)

Copy link
Contributor Author

@tristanlatr tristanlatr Jun 7, 2022

Choose a reason for hiding this comment

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

the else branch of try: blocks have the priority over the except: block. Similarly, the main body of if: blocks have priority over what's defined in the else: block.

So the thing that might be confusing here if that Try.orelse and If.orelse are NOT handled with the same override priority. Because the main branches in case of a if: is the body uniquely and in case of a try: it's the body, the orelse and the finalbody, in this order. So just saying else: block can be confusing if we don't know if it's the else block of a IF statement or a TRY statement.

@contextlib.contextmanager
def override_guard(self) -> Iterator[None]:
"""
Returns a context manager that will make the builder ignore any extraneous
Copy link
Member

Choose a reason for hiding this comment

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

A clearer explanation of the definition of "extraneous" would be interesting here.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

extraneous meaning assignments to name that already exist

Copy link
Contributor Author

@tristanlatr tristanlatr Jun 11, 2022

Choose a reason for hiding this comment

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

We can read: "Returns a context manager that will make the builder ignore any new assignments to names that already existed in the same context"

@@ -227,6 +294,9 @@ def visit_ClassDef(self, node: ast.ClassDef) -> None:
parent = self.builder.current
if isinstance(parent, model.Function):
raise self.SkipNode()
# Ignore in override guard
if self._name_in_override_guard(parent, node.name):
raise self.SkipNode()
Copy link
Contributor Author

@tristanlatr tristanlatr May 31, 2022

Choose a reason for hiding this comment

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

I wonder why this code is required, a module under an if branch is not possible. I also wonder how this code is not marked as unreached by the tests…

@contextlib.contextmanager
def override_guard(self) -> Iterator[None]:
"""
Returns a context manager that will make the builder ignore any extraneous
Copy link
Contributor Author

Choose a reason for hiding this comment

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

extraneous meaning assignments to name that already exist

except ImportError:
ssl = None
else:
ssl = _ssl
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Here the else branch have the priority over what defined in the except handler. Because it's the "principal" flow.

Comment on lines 325 to 326
When pydoctor deals with try/except/else or if/else block, it makes sure that the names defined in
the "principal" branch do not get overriden by names defined in the except hanlders or ifs' else block.
Copy link
Contributor Author

@tristanlatr tristanlatr Jun 7, 2022

Choose a reason for hiding this comment

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

No it's not about whether the branch is last or not. It's only the except hanlders and ifs' else blocks where we enable the override name guard.

Comment on lines 247 to 249
return self._override_guard_state[0] is True \
and self._override_guard_state[1] is ob \
and name in self._override_guard_state[2]
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@glyph please see this method for the implementation of the override guard.

The override guard is a re-entrant context manager that ensures that follow-up assignments to names that already existed before in the same frame context are simply ignored.

docs/source/codedoc.rst Outdated Show resolved Hide resolved
docs/source/codedoc.rst Show resolved Hide resolved
@contextlib.contextmanager
def override_guard(self) -> Iterator[None]:
"""
Returns a context manager that will make the builder ignore any extraneous
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
Returns a context manager that will make the builder ignore any extraneous
Returns a context manager that will make the builder ignore any new

@tristanlatr
Copy link
Contributor Author

tristanlatr commented Jun 12, 2022

I see this in the code:

   def handleDuplicate(self, obj: Documentable) -> None:
        """
        This is called when we see two objects with the same
        .fullName(), for example::

            class C:
                if something:
                    def meth(self):
                        implementation 1
                else:
                    def meth(self):
                        implementation 2

        The default is that the second definition "wins".
        """

But clearly, that was never tested, so never officially supported.
I'm wondering if we should stick to that or to what I'm proposing, which seems better IMO.

but would be a breaking change. (Anyway it's broken right now and the CI is still green ^^')

@tristanlatr tristanlatr requested a review from glyph June 12, 2022 04:39

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

…nsions when desired. The naming is not the best at the moment but it passes the tests...

This comment has been minimized.

This comment has been minimized.

docs/source/codedoc.rst Show resolved Hide resolved
docs/source/codedoc.rst Outdated Show resolved Hide resolved
pydoctor/astbuilder.py Outdated Show resolved Hide resolved

This comment has been minimized.

This comment has been minimized.

@tristanlatr tristanlatr linked an issue Sep 24, 2024 that may be closed by this pull request

This comment has been minimized.

1 similar comment

This comment has been minimized.

Copy link

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

pycma (https://github.com/CMA-ES/pycma)
+ /projects/pycma/cma/wrapper.py:41: bad docstring: Unexpected indentation.
+ /projects/pycma/cma/wrapper.py:42: bad docstring: Block quote ends without a blank line; unexpected unindent.
- /projects/pycma/cma/__init__.py:20: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/__init__.py:27: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/__init__.py:27: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/__init__.py:27: Cannot find link target for "fmin"
- /projects/pycma/cma/__init__.py:96: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/__init__.py:96: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/__init__.py:96: Cannot find link target for "fmin"
- /projects/pycma/cma/constraints_handler.py:360: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/constraints_handler.py:361: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/constraints_handler.py:380: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/constraints_handler.py:380: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/constraints_handler.py:380: Cannot find link target for "fmin"
- /projects/pycma/cma/constraints_handler.py:829: Cannot find link target for "cma.ConstrainedFitnessAL"
- /projects/pycma/cma/constraints_handler.py:1323: Cannot find link target for "cma.fmin2"
- /projects/pycma/cma/evolution_strategy.py:3800: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/evolution_strategy.py:3840: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:3848: Cannot find link target for "cma.NoiseHandler"
- /projects/pycma/cma/evolution_strategy.py:3691: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/evolution_strategy.py:4323: Cannot find link target for "cma.ConstrainedFitnessAL"
- /projects/pycma/cma/evolution_strategy.py:4323: Cannot find link target for "cma.fmin_con2"
- /projects/pycma/cma/evolution_strategy.py:4328: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:4363: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/evolution_strategy.py:4523: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:4527: Cannot find link target for "cma.fmin2"
- /projects/pycma/cma/evolution_strategy.py:3499: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:3536: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/evolution_strategy.py:3569: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:3610: Cannot find link target for "objective_function"
- /projects/pycma/cma/evolution_strategy.py:476: Cannot find link target for "cma.ff.rosen"
+ /projects/pycma/cma/evolution_strategy.py:476: Cannot find link target for "cma.fitness_functions.ff.rosen", resolved from "cma.ff.rosen"
- /projects/pycma/cma/evolution_strategy.py:477: Cannot find link target for "cma.ff"
- /projects/pycma/cma/fitness_models.py:135: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/fitness_transformations.py:641: Cannot find link target for "cma.CMAOptions"
- /projects/pycma/cma/fitness_transformations.py:691: Cannot find link target for "cma.CMAOptions"
- /projects/pycma/cma/integer_centering.py:28: Cannot find link target for "cma.CMAEvolutionStrategy.tell"
- /projects/pycma/cma/integer_centering.py:34: Cannot find link target for "cma.CMAOptions"
- /projects/pycma/cma/integer_centering.py:70: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/logger.py:1857: Cannot find link target for "cma.plot"
- /projects/pycma/cma/logger.py:1860: Cannot find link target for "cma.plot"
- /projects/pycma/cma/optimization_tools.py:531: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:531: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:531: Cannot find link target for "fmin"
- /projects/pycma/cma/optimization_tools.py:536: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:536: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:536: Cannot find link target for "fmin"
- /projects/pycma/cma/optimization_tools.py:603: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:603: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:603: Cannot find link target for "fmin"
- /projects/pycma/cma/optimization_tools.py:627: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:627: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:627: Cannot find link target for "fmin"
- /projects/pycma/cma/optimization_tools.py:641: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:641: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/optimization_tools.py:641: Cannot find link target for "fmin"
- /projects/pycma/cma/options_parameters.py:181: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/options_parameters.py:135: Cannot find link target for "cma.CMAOptions"
- /projects/pycma/cma/options_parameters.py:997: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/options_parameters.py:997: ambiguous ref to fmin, could be cma.evolution_strategy.fmin, cma.purecma.fmin
- /projects/pycma/cma/options_parameters.py:997: Cannot find link target for "fmin"
- /projects/pycma/cma/purecma.py:26: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/purecma.py:26: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/restricted_gaussian_sampler.py:76: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/restricted_gaussian_sampler.py:77: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/restricted_gaussian_sampler.py:342: Cannot find link target for "cma.fmin"
- /projects/pycma/cma/restricted_gaussian_sampler.py:343: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/sigma_adaptation.py:21: Cannot find link target for "cma.CMAEvolutionStrategy"
- /projects/pycma/cma/wrapper.py:4: Cannot find link target for "SkoptCMAoptimizer"
+ /projects/pycma/cma/wrapper.py:38: Cannot find link target for "func"
+ /projects/pycma/cma/wrapper.py:45: Cannot find link target for "res"
+ /projects/pycma/cma/wrapper.py:48: Cannot find link target for "x"
+ /projects/pycma/cma/wrapper.py:49: Cannot find link target for "fun"
+ /projects/pycma/cma/wrapper.py:50: Cannot find link target for "x_iters"
+ /projects/pycma/cma/wrapper.py:52: Cannot find link target for "func_vals"
+ /projects/pycma/cma/wrapper.py:53: Cannot find link target for "space"
+ these 1 objects' docstrings contain syntax errors:
+     cma.wrapper.SkoptCMAoptimizer

numpy (https://github.com/numpy/numpy)
- /projects/numpy/numpy/_core/_type_aliases.py:3: Cannot find link target for "numpy.generic"
+ /projects/numpy/numpy/_core/_type_aliases.py:3: Cannot find link target for "numpy._core.generic", resolved from "numpy.generic"
- /projects/numpy/numpy/_core/_ufunc_config.py:165: Cannot find link target for "numpy.errstate"
+ /projects/numpy/numpy/_core/_ufunc_config.py:165: Cannot find link target for "numpy._core.errstate", resolved from "numpy.errstate"
- /projects/numpy/numpy/_core/_ufunc_config.py:174: Cannot find link target for "numpy.errstate"
+ /projects/numpy/numpy/_core/_ufunc_config.py:174: Cannot find link target for "numpy._core.errstate", resolved from "numpy.errstate"
- /projects/numpy/numpy/_core/arrayprint.py:651: Cannot find link target for "numpy.timedelta64"
+ /projects/numpy/numpy/_core/arrayprint.py:651: Cannot find link target for "numpy._core.timedelta64", resolved from "numpy.timedelta64"
- /projects/numpy/numpy/_core/arrayprint.py:652: Cannot find link target for "numpy.datetime64"
+ /projects/numpy/numpy/_core/arrayprint.py:652: Cannot find link target for "numpy._core.datetime64", resolved from "numpy.datetime64"
- /projects/numpy/numpy/_core/arrayprint.py:657: Cannot find link target for "numpy.void"
+ /projects/numpy/numpy/_core/arrayprint.py:657: Cannot find link target for "numpy._core.void", resolved from "numpy.void"
- /projects/numpy/numpy/_core/arrayprint.py:658: Cannot find link target for "numpy.bytes_"
+ /projects/numpy/numpy/_core/arrayprint.py:658: Cannot find link target for "numpy._core.bytes_", resolved from "numpy.bytes_"
- /projects/numpy/numpy/_core/arrayprint.py:658: Cannot find link target for "numpy.str_"
+ /projects/numpy/numpy/_core/arrayprint.py:658: Cannot find link target for "numpy._core.str_", resolved from "numpy.str_"
- /projects/numpy/numpy/_core/arrayprint.py:167: Cannot find link target for "numpy.timedelta64"
+ /projects/numpy/numpy/_core/arrayprint.py:167: Cannot find link target for "numpy._core.timedelta64", resolved from "numpy.timedelta64"
- /projects/numpy/numpy/_core/arrayprint.py:168: Cannot find link target for "numpy.datetime64"
+ /projects/numpy/numpy/_core/arrayprint.py:168: Cannot find link target for "numpy._core.datetime64", resolved from "numpy.datetime64"
- /projects/numpy/numpy/_core/arrayprint.py:173: Cannot find link target for "numpy.bytes_"
+ /projects/numpy/numpy/_core/arrayprint.py:173: Cannot find link target for "numpy._core.bytes_", resolved from "numpy.bytes_"
- /projects/numpy/numpy/_core/arrayprint.py:173: Cannot find link target for "numpy.str_"
+ /projects/numpy/numpy/_core/arrayprint.py:173: Cannot find link target for "numpy._core.str_", resolved from "numpy.str_"
- /projects/numpy/numpy/_core/arrayprint.py:174: Cannot find link target for "numpy.object_", resolved from "np.object_"
+ /projects/numpy/numpy/_core/arrayprint.py:174: Cannot find link target for "numpy._core.object_", resolved from "np.object_"
- /projects/numpy/numpy/_core/defchararray.py:65: Cannot find link target for "numpy.equal"
+ /projects/numpy/numpy/_core/defchararray.py:65: Cannot find link target for "numpy._core.equal", resolved from "numpy.equal"
- /projects/numpy/numpy/_core/strings.py:227: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/strings.py:227: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/strings.py:227: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/strings.py:227: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/defchararray.py:202: Cannot find link target for "numpy.greater"
+ /projects/numpy/numpy/_core/defchararray.py:202: Cannot find link target for "numpy._core.greater", resolved from "numpy.greater"
- /projects/numpy/numpy/_core/defchararray.py:133: Cannot find link target for "numpy.greater_equal"
+ /projects/numpy/numpy/_core/defchararray.py:133: Cannot find link target for "numpy._core.greater_equal", resolved from "numpy.greater_equal"
- /projects/numpy/numpy/_core/defchararray.py:236: Cannot find link target for "numpy.greater"
+ /projects/numpy/numpy/_core/defchararray.py:236: Cannot find link target for "numpy._core.greater", resolved from "numpy.greater"
- /projects/numpy/numpy/_core/defchararray.py:168: Cannot find link target for "numpy.less_equal"
+ /projects/numpy/numpy/_core/defchararray.py:168: Cannot find link target for "numpy._core.less_equal", resolved from "numpy.less_equal"
- /projects/numpy/numpy/_core/strings.py:189: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/strings.py:189: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/strings.py:189: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/strings.py:189: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/defchararray.py:274: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/defchararray.py:274: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/defchararray.py:274: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/defchararray.py:274: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/defchararray.py:99: Cannot find link target for "numpy.not_equal"
+ /projects/numpy/numpy/_core/defchararray.py:99: Cannot find link target for "numpy._core.not_equal", resolved from "numpy.not_equal"
- /projects/numpy/numpy/_core/strings.py:336: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/strings.py:336: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/strings.py:336: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/strings.py:336: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/strings.py:338: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/strings.py:338: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/strings.py:338: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/strings.py:338: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/strings.py:1524: Cannot find link target for "numpy.bytes_", resolved from "np.bytes_"
+ /projects/numpy/numpy/_core/strings.py:1524: Cannot find link target for "numpy._core.bytes_", resolved from "np.bytes_"
- /projects/numpy/numpy/_core/strings.py:1524: Cannot find link target for "numpy.str_", resolved from "np.str_"
+ /projects/numpy/numpy/_core/strings.py:1524: Cannot find link target for "numpy._core.str_", resolved from "np.str_"
- /projects/numpy/numpy/_core/defchararray.py:443: ambiguous ref to copy, could be numpy.lib._function_base_impl.copy, numpy.ma.core.copy
- /projects/numpy/numpy/_core/defchararray.py:443: Cannot find link target for "copy"
- /projects/numpy/numpy/_core/defchararray.py:722: Cannot find link target for "numpy.argsort"
+ /projects/numpy/numpy/_core/defchararray.py:722: Cannot find link target for "numpy._core.argsort", resolved from "numpy.argsort"
- /projects/numpy/numpy/_core/einsumfunc.py:1133: Cannot find link target for "numpy.trace"
+ /projects/numpy/numpy/_core/einsumfunc.py:1133: Cannot find link target for "numpy._core.trace", resolved from "numpy.trace"
- /projects/numpy/numpy/_core/einsumfunc.py:1134: Cannot find link target for "numpy.diag"
- /projects/numpy/numpy/_core/einsumfunc.py:1135: Cannot find link target for "numpy.sum"
+ /projects/numpy/numpy/_core/einsumfunc.py:1135: Cannot find link target for "numpy._core.sum", resolved from "numpy.sum"
- /projects/numpy/numpy/_core/einsumfunc.py:1136: Cannot find link target for "numpy.transpose"
+ /projects/numpy/numpy/_core/einsumfunc.py:1136: Cannot find link target for "numpy._core.transpose", resolved from "numpy.transpose"
- /projects/numpy/numpy/_core/einsumfunc.py:1137: Cannot find link target for "numpy.matmul"
+ /projects/numpy/numpy/_core/einsumfunc.py:1137: Cannot find link target for "numpy._core.matmul", resolved from "numpy.matmul"
- /projects/numpy/numpy/_core/einsumfunc.py:1138: Cannot find link target for "numpy.dot"
+ /projects/numpy/numpy/_core/einsumfunc.py:1138: Cannot find link target for "numpy._core.dot", resolved from "numpy.dot"
- /projects/numpy/numpy/_core/einsumfunc.py:1139: Cannot find link target for "numpy.inner"
+ /projects/numpy/numpy/_core/einsumfunc.py:1139: Cannot find link target for "numpy._core.inner", resolved from "numpy.inner"
- /projects/numpy/numpy/_core/einsumfunc.py:1140: Cannot find link target for "numpy.outer"
+ /projects/numpy/numpy/_core/einsumfunc.py:1140: Cannot find link target for "numpy._core.outer", resolved from "numpy.outer"
- /projects/numpy/numpy/_core/einsumfunc.py:1142: Cannot find link target for "numpy.multiply"
+ /projects/numpy/numpy/_core/einsumfunc.py:1142: Cannot find link target for "numpy._core.multiply", resolved from "numpy.multiply"
- /projects/numpy/numpy/_core/einsumfunc.py:1143: Cannot find link target for "numpy.tensordot"
+ /projects/numpy/numpy/_core/einsumfunc.py:1143: Cannot find link target for "numpy._core.tensordot", resolved from "numpy.tensordot"
- /projects/numpy/numpy/_core/einsumfunc.py:1145: Cannot find link target for "numpy.einsum_path"
+ /projects/numpy/numpy/_core/einsumfunc.py:1145: Cannot find link target for "numpy._core.einsum_path", resolved from "numpy.einsum_path"

... (truncated 585 lines) ...

@tristanlatr tristanlatr merged commit 68cb9f8 into master Sep 25, 2024
40 of 41 checks passed
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.

2 participants