Allow overhang in Google-style docstring arguments (#1668)

Resolves #1662.
This commit is contained in:
Charlie Marsh 2023-01-05 14:36:19 -05:00 committed by GitHub
parent e6611c4830
commit d34e6c02a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 28 deletions

View file

@ -1413,24 +1413,56 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: &
// See: `GOOGLE_ARGS_REGEX` in `pydocstyle/checker.py`.
static GOOGLE_ARGS_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^\s*(\*?\*?\w+)\s*(\(.*?\))?\s*:.+").unwrap());
Lazy::new(|| Regex::new(r"^\s*(\*?\*?\w+)\s*(\(.*?\))?\s*:\n?\s*.+").unwrap());
fn args_section(checker: &mut Checker, docstring: &Docstring, context: &SectionContext) {
let mut matches = Vec::new();
for line in context.following_lines {
if let Some(captures) = GOOGLE_ARGS_REGEX.captures(line) {
matches.push(captures);
if context.following_lines.is_empty() {
missing_args(checker, docstring, &FxHashSet::default());
return;
}
// Normalize leading whitespace, by removing any lines with less indentation
// than the first.
let leading_space = whitespace::leading_space(context.following_lines[0]);
let relevant_lines = context
.following_lines
.iter()
.filter(|line| line.starts_with(leading_space) || line.is_empty())
.join("\n");
let args_content = textwrap::dedent(&relevant_lines);
// Reformat each section.
let mut args_sections: Vec<String> = vec![];
for line in args_content.trim().lines() {
if line.chars().next().map_or(true, char::is_whitespace) {
// This is a continuation of the documentation for the previous parameter,
// because it starts with whitespace.
if let Some(last) = args_sections.last_mut() {
last.push_str(line);
last.push('\n');
}
} else {
// This line is the start of documentation for the next parameter, because it
// doesn't start with any whitespace.
let mut line = line.to_string();
line.push('\n');
args_sections.push(line);
}
}
missing_args(
checker,
docstring,
&matches
.iter()
.filter_map(|captures| captures.get(1).map(|arg_name| arg_name.as_str()))
.collect(),
);
// Extract the argument name from each section.
let mut matches = Vec::new();
for section in &args_sections {
if let Some(captures) = GOOGLE_ARGS_REGEX.captures(section) {
matches.push(captures);
}
}
let docstrings_args = matches
.iter()
.filter_map(|captures| captures.get(1).map(|arg_name| arg_name.as_str()))
.collect();
missing_args(checker, docstring, &docstrings_args);
}
fn parameters_section(checker: &mut Checker, docstring: &Docstring, context: &SectionContext) {

View file

@ -75,18 +75,6 @@ expression: checks
column: 11
fix: ~
parent: ~
- kind:
DocumentAllArguments:
- skip
- verbose
location:
row: 370
column: 4
end_location:
row: 382
column: 11
fix: ~
parent: ~
- kind:
DocumentAllArguments:
- y

View file

@ -16,7 +16,6 @@ expression: checks
parent: ~
- kind:
DocumentAllArguments:
- x
- y
- z
location:
@ -29,7 +28,6 @@ expression: checks
parent: ~
- kind:
DocumentAllArguments:
- x
- y
- z
location:

View file

@ -4,7 +4,6 @@ expression: checks
---
- kind:
DocumentAllArguments:
- x
- y
- z
location: