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

Allow overhang in Google-style docstring arguments #1668

Merged
merged 1 commit into from Jan 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 43 additions & 11 deletions src/pydocstyle/plugins.rs
Expand Up @@ -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) {
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);
}
}

// Extract the argument name from each section.
let mut matches = Vec::new();
for line in context.following_lines {
if let Some(captures) = GOOGLE_ARGS_REGEX.captures(line) {
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,
&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) {
Expand Down
Expand Up @@ -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
Expand Down
Expand Up @@ -16,7 +16,6 @@ expression: checks
parent: ~
- kind:
DocumentAllArguments:
- x
- y
- z
location:
Expand All @@ -29,7 +28,6 @@ expression: checks
parent: ~
- kind:
DocumentAllArguments:
- x
- y
- z
location:
Expand Down
Expand Up @@ -4,7 +4,6 @@ expression: checks
---
- kind:
DocumentAllArguments:
- x
- y
- z
location:
Expand Down