diff --git a/crates/ruff/resources/test/fixtures/flake8_copyright/CPY001.py b/crates/ruff/resources/test/fixtures/flake8_copyright/CPY001.py new file mode 100644 index 00000000000000..4faa67b68bd6a7 --- /dev/null +++ b/crates/ruff/resources/test/fixtures/flake8_copyright/CPY001.py @@ -0,0 +1 @@ +কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক \ No newline at end of file diff --git a/crates/ruff/src/rules/flake8_copyright/mod.rs b/crates/ruff/src/rules/flake8_copyright/mod.rs index 6e2a39c4cbd3a5..e4708d6d80ac47 100644 --- a/crates/ruff/src/rules/flake8_copyright/mod.rs +++ b/crates/ruff/src/rules/flake8_copyright/mod.rs @@ -5,10 +5,28 @@ pub mod settings; #[cfg(test)] mod tests { + use std::path::Path; + + use anyhow::Result; + use test_case::test_case; + use crate::registry::Rule; + use crate::settings::Settings; + use crate::test::test_path; use crate::test::test_snippet; use crate::{assert_messages, settings}; + #[test_case(Rule::MissingCopyrightNotice, Path::new("CPY001.py"))] + fn rules(rule_code: Rule, path: &Path) -> Result<()> { + let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); + let diagnostics = test_path( + Path::new("flake8_copyright").join(path).as_path(), + &Settings::for_rule(rule_code), + )?; + assert_messages!(snapshot, diagnostics); + Ok(()) + } + #[test] fn notice() { let diagnostics = test_snippet( diff --git a/crates/ruff/src/rules/flake8_copyright/rules/missing_copyright_notice.rs b/crates/ruff/src/rules/flake8_copyright/rules/missing_copyright_notice.rs index 3c99bb487fdebe..fbdd8e8f5cdfec 100644 --- a/crates/ruff/src/rules/flake8_copyright/rules/missing_copyright_notice.rs +++ b/crates/ruff/src/rules/flake8_copyright/rules/missing_copyright_notice.rs @@ -36,7 +36,14 @@ pub(crate) fn missing_copyright_notice( let contents = if locator.len() < 1024 { locator.contents() } else { - locator.up_to(TextSize::from(1024)) + let char_boundary: u32 = (0..1024) + .rev() + .find(|&byte_idx| locator.contents().is_char_boundary(byte_idx)) + .unwrap_or(0) // Default to 0 if no valid boundary is found + .try_into() // SAFETY: 0 <= char_boundary <= 1024 + .unwrap_or(0); + + locator.up_to(TextSize::from(char_boundary)) }; // Locate the copyright notice. diff --git a/crates/ruff/src/rules/flake8_copyright/snapshots/ruff__rules__flake8_copyright__tests__CPY001_CPY001.py.snap b/crates/ruff/src/rules/flake8_copyright/snapshots/ruff__rules__flake8_copyright__tests__CPY001_CPY001.py.snap new file mode 100644 index 00000000000000..c14b1e15a90d0b --- /dev/null +++ b/crates/ruff/src/rules/flake8_copyright/snapshots/ruff__rules__flake8_copyright__tests__CPY001_CPY001.py.snap @@ -0,0 +1,11 @@ +--- +source: crates/ruff/src/rules/flake8_copyright/mod.rs +assertion_line: 27 +--- +CPY001.py:1:1: CPY001 Missing copyright notice at top of file + | +1 | কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক + | CPY001 + | + +