def visit_functiondef(self, node): """Called for function and method definitions (def). :param node: Node for a function or method definition in the AST :type node: :class:`astroid.scoped_nodes.Function` """ node_allow_no_param = None node_doc = utils.docstringify(node.doc) if node.name in self.constructor_names: class_node = node_frame_class(node) if class_node is not None: class_doc = utils.docstringify(class_node.doc) self.check_single_constructor_params(class_doc, node_doc, class_node) # __init__ or class docstrings can have no parameters documented # as long as the other documents them. node_allow_no_param = class_doc.has_params() or None class_allow_no_param = node_doc.has_params() or None self.check_arguments_in_docstring( class_doc, node.args, class_node, class_allow_no_param) self.check_arguments_in_docstring( node_doc, node.args, node, node_allow_no_param)
def visit_functiondef(self, node): """Called for function and method definitions (def). :param node: Node for a function or method definition in the AST :type node: :class:`astroid.scoped_nodes.Function` """ node_allow_no_param = None node_doc = utils.docstringify(node.doc) if node.name in self.constructor_names: class_node = node_frame_class(node) if class_node is not None: class_doc = utils.docstringify(class_node.doc) self.check_single_constructor_params(class_doc, node_doc, class_node) # __init__ or class docstrings can have no parameters documented # as long as the other documents them. node_allow_no_param = class_doc.has_params() or None class_allow_no_param = node_doc.has_params() or None self.check_arguments_in_docstring(class_doc, node.args, class_node, class_allow_no_param) self.check_arguments_in_docstring(node_doc, node.args, node, node_allow_no_param)
def visit_yield(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify( func_node.doc, self.config.default_docstring_type, ) if not doc.is_valid() and self.config.accept_no_yields_doc: return if doc.supports_yields: doc_has_yields = doc.has_yields() doc_has_yields_type = doc.has_yields_type() else: doc_has_yields = doc.has_returns() doc_has_yields_type = doc.has_rtype() if not doc_has_yields: self.add_message( 'missing-yield-doc', node=func_node ) if not doc_has_yields_type: self.add_message( 'missing-yield-type-doc', node=func_node )
def visit_return(self, node: nodes.Return) -> None: if not utils.returns_something(node): return if self.linter.namespace.accept_no_return_doc: return func_node = node.frame(future=True) if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify(func_node.doc_node, self.linter.namespace.default_docstring_type) is_property = checker_utils.decorated_with_property(func_node) if not (doc.has_returns() or (doc.has_property_returns() and is_property)): self.add_message("missing-return-doc", node=func_node) if func_node.returns: return if not (doc.has_rtype() or (doc.has_property_type() and is_property)): self.add_message("missing-return-type-doc", node=func_node)
def visit_raise(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return if not func_node.doc: # If this is a property setter, # the property should have the docstring instead. property_ = utils.get_setters_property(func_node) if property_: func_node = property_ doc = utils.docstringify(func_node.doc) if not doc.is_valid(): if doc.doc: self._handle_no_raise_doc(expected_excs, func_node) return found_excs = doc.exceptions() missing_excs = expected_excs - found_excs self._add_raise_message(missing_excs, func_node)
def visit_raise(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return if not func_node.doc: # If this is a property setter, # the property should have the docstring instead. property_ = utils.get_setters_property(func_node) if property_: func_node = property_ doc = utils.docstringify(func_node.doc, self.config.default_docstring_type) if not doc.is_valid(): if doc.doc: self._handle_no_raise_doc(expected_excs, func_node) return found_excs_full_names = doc.exceptions() # Extract just the class name, e.g. "error" from "re.error" found_excs_class_names = { exc.split(".")[-1] for exc in found_excs_full_names } missing_excs = expected_excs - found_excs_class_names self._add_raise_message(missing_excs, func_node)
def visit_raise(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return if not func_node.doc: # If this is a property setter, # the property should have the docstring instead. property_ = utils.get_setters_property(func_node) if property_: func_node = property_ doc = utils.docstringify( func_node.doc, self.config.default_docstring_type, ) if not doc.is_valid(): if doc.doc: self._handle_no_raise_doc(expected_excs, func_node) return found_excs = doc.exceptions() missing_excs = expected_excs - found_excs self._add_raise_message(missing_excs, func_node)
def check_functiondef_params(self, node, node_doc): node_allow_no_param = None if node.name in self.constructor_names: class_node = checker_utils.node_frame_class(node) if class_node is not None: class_doc = utils.docstringify( class_node.doc, self.config.default_docstring_type, ) self.check_single_constructor_params(class_doc, node_doc, class_node) # __init__ or class docstrings can have no parameters documented # as long as the other documents them. node_allow_no_param = ( class_doc.has_params() or class_doc.params_documented_elsewhere() or None ) class_allow_no_param = ( node_doc.has_params() or node_doc.params_documented_elsewhere() or None ) self.check_arguments_in_docstring( class_doc, node.args, class_node, class_allow_no_param) self.check_arguments_in_docstring( node_doc, node.args, node, node_allow_no_param)
def visit_yield(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify(func_node.doc) if not doc.is_valid() and self.config.accept_no_yields_doc: return if doc.supports_yields: doc_has_yields = doc.has_yields() doc_has_yields_type = doc.has_yields_type() else: doc_has_yields = doc.has_returns() doc_has_yields_type = doc.has_rtype() if not doc_has_yields: self.add_message( 'missing-yield-doc', node=func_node ) if not doc_has_yields_type: self.add_message( 'missing-yield-type-doc', node=func_node )
def visit_return(self, node): if not utils.returns_something(node): return func_node = node.frame() if not isinstance( func_node, astroid.FunctionDef) or self._skip_func_docstring(func_node): return doc = utils.docstringify(func_node.doc, self.config.default_docstring_type) if not doc.is_valid() and self.config.accept_no_return_doc: return is_property = checker_utils.decorated_with_property(func_node) if not (doc.has_returns() or (doc.has_property_returns() and is_property)): self.add_message("missing-return-doc", node=func_node) if func_node.returns: return if not (doc.has_rtype() or (doc.has_property_type() and is_property)): self.add_message("missing-return-type-doc", node=func_node)
def visit_return(self, node): if not utils.returns_something(node): return func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify( func_node.doc, self.config.default_docstring_type, ) if not doc.is_valid() and self.config.accept_no_return_doc: return is_property = checker_utils.decorated_with_property(func_node) if not (doc.has_returns() or (doc.has_property_returns() and is_property)): self.add_message( 'missing-return-doc', node=func_node ) if func_node.returns: return if not (doc.has_rtype() or (doc.has_property_type() and is_property)): self.add_message( 'missing-return-type-doc', node=func_node )
def check_functiondef_params(self, node, node_doc): node_allow_no_param = None if node.name in self.constructor_names: class_node = checker_utils.node_frame_class(node) if class_node is not None: class_doc = utils.docstringify( class_node.doc, self.config.default_docstring_type) self.check_single_constructor_params(class_doc, node_doc, class_node) # __init__ or class docstrings can have no parameters documented # as long as the other documents them. node_allow_no_param = (class_doc.has_params() or class_doc.params_documented_elsewhere() or None) class_allow_no_param = (node_doc.has_params() or node_doc.params_documented_elsewhere() or None) self.check_arguments_in_docstring(class_doc, node.args, class_node, class_allow_no_param) self.check_arguments_in_docstring(node_doc, node.args, node, node_allow_no_param)
def visit_raise(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return if not func_node.doc: # If this is a property setter, # the property should have the docstring instead. property_ = utils.get_setters_property(func_node) if property_: func_node = property_ doc = utils.docstringify(func_node.doc, self.config.default_docstring_type) if not doc.is_valid(): if doc.doc: self._handle_no_raise_doc(expected_excs, func_node) return found_excs_full_names = doc.exceptions() # Extract just the class name, e.g. "error" from "re.error" found_excs_class_names = {exc.split(".")[-1] for exc in found_excs_full_names} missing_excs = expected_excs - found_excs_class_names self._add_raise_message(missing_excs, func_node)
def visit_functiondef(self, node): """Called for function and method definitions (def). :param node: Node for a function or method definition in the AST :type node: :class:`astroid.scoped_nodes.Function` """ node_doc = utils.docstringify(node.doc) self.check_functiondef_params(node, node_doc) self.check_functiondef_returns(node, node_doc)
def visit_return(self, node): if node.value is None: return func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify(func_node.doc) if not doc.is_valid() and self.config.accept_no_return_doc: return if not doc.has_returns(): self.add_message('missing-returns-doc', node=func_node)
def visit_functiondef(self, node): """Called for function and method definitions (def). :param node: Node for a function or method definition in the AST :type node: :class:`astroid.scoped_nodes.Function` """ if self._skip_func_docstring(node): return node_doc = utils.docstringify(node.doc, self.config.default_docstring_type) self.check_functiondef_params(node, node_doc) self.check_functiondef_returns(node, node_doc) self.check_functiondef_yields(node, node_doc)
def visit_return(self, node): if not utils.returns_something(node): return func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify(func_node.doc) if not doc.is_valid() and self.config.accept_no_return_doc: return if not doc.has_returns(): self.add_message( 'missing-returns-doc', node=func_node )
def visit_raise(self, node: nodes.Raise) -> None: func_node = node.frame(future=True) if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return if not func_node.doc_node: # If this is a property setter, # the property should have the docstring instead. property_ = utils.get_setters_property(func_node) if property_: func_node = property_ doc = utils.docstringify(func_node.doc_node, self.linter.namespace.default_docstring_type) if not doc.matching_sections(): if doc.doc: missing = {exc.name for exc in expected_excs} self._handle_no_raise_doc(missing, func_node) return found_excs_full_names = doc.exceptions() # Extract just the class name, e.g. "error" from "re.error" found_excs_class_names = { exc.split(".")[-1] for exc in found_excs_full_names } missing_excs = set() for expected in expected_excs: for found_exc in found_excs_class_names: if found_exc == expected.name: break if any(found_exc == ancestor.name for ancestor in expected.ancestors()): break else: missing_excs.add(expected.name) self._add_raise_message(missing_excs, func_node)
def visit_raise(self, node): func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return expected_excs = utils.possible_exc_types(node) if not expected_excs: return doc = utils.docstringify(func_node.doc) if not doc.is_valid(): if doc.doc: self._handle_no_raise_doc(expected_excs, func_node) return found_excs = doc.exceptions() missing_excs = expected_excs - found_excs self._add_raise_message(missing_excs, func_node)
def visit_yield(self, node: nodes.Yield) -> None: func_node = node.frame() if not isinstance(func_node, astroid.FunctionDef): return doc = utils.docstringify(func_node.doc, self.config.default_docstring_type) if not doc.is_valid() and self.config.accept_no_yields_doc: return if doc.supports_yields: doc_has_yields = doc.has_yields() doc_has_yields_type = doc.has_yields_type() else: doc_has_yields = doc.has_returns() doc_has_yields_type = doc.has_rtype() if not doc_has_yields: self.add_message("missing-yield-doc", node=func_node) if not (doc_has_yields_type or func_node.returns): self.add_message("missing-yield-type-doc", node=func_node)
def visit_functiondef(self, node: nodes.FunctionDef) -> None: """Called for function and method definitions (def). :param node: Node for a function or method definition in the AST :type node: :class:`astroid.scoped_nodes.Function` """ node_doc = utils.docstringify(node.doc, self.config.default_docstring_type) # skip functions that match the 'no-docstring-rgx' config option no_docstring_rgx = get_global_option(self, "no-docstring-rgx") if no_docstring_rgx and re.match(no_docstring_rgx, node.name): return # skip functions smaller than 'docstring-min-length' lines = checker_utils.get_node_last_lineno(node) - node.lineno max_lines = get_global_option(self, "docstring-min-length") if max_lines > -1 and lines < max_lines: return self.check_functiondef_params(node, node_doc) self.check_functiondef_returns(node, node_doc) self.check_functiondef_yields(node, node_doc)