mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 22:55:08 +00:00
Fixed panic in missing_copyright_notice
(#7029)
This commit is contained in:
parent
afcd00da56
commit
33806b8b7c
4 changed files with 76 additions and 7 deletions
|
@ -149,6 +149,17 @@ import os
|
||||||
# Content Content Content Content Content Content Content Content Content Content
|
# Content Content Content Content Content Content Content Content Content Content
|
||||||
|
|
||||||
# Copyright 2023
|
# Copyright 2023
|
||||||
|
"#
|
||||||
|
.trim(),
|
||||||
|
&settings::Settings::for_rules(vec![Rule::MissingCopyrightNotice]),
|
||||||
|
);
|
||||||
|
assert_messages!(diagnostics);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn char_boundary() {
|
||||||
|
let diagnostics = test_snippet(
|
||||||
|
r#"কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক
|
||||||
"#
|
"#
|
||||||
.trim(),
|
.trim(),
|
||||||
&settings::Settings::for_rules(vec![Rule::MissingCopyrightNotice]),
|
&settings::Settings::for_rules(vec![Rule::MissingCopyrightNotice]),
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
use ruff_text_size::{TextRange, TextSize};
|
|
||||||
|
|
||||||
use ruff_diagnostics::{Diagnostic, Violation};
|
use ruff_diagnostics::{Diagnostic, Violation};
|
||||||
use ruff_macros::{derive_message_formats, violation};
|
use ruff_macros::{derive_message_formats, violation};
|
||||||
use ruff_source_file::Locator;
|
use ruff_source_file::Locator;
|
||||||
|
use ruff_text_size::{TextRange, TextSize};
|
||||||
|
|
||||||
use crate::settings::Settings;
|
use crate::settings::Settings;
|
||||||
|
|
||||||
|
@ -33,11 +32,7 @@ pub(crate) fn missing_copyright_notice(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only search the first 1024 bytes in the file.
|
// Only search the first 1024 bytes in the file.
|
||||||
let contents = if locator.len() < 1024 {
|
let contents = locator.up_to(locator.floor_char_boundary(TextSize::new(1024)));
|
||||||
locator.contents()
|
|
||||||
} else {
|
|
||||||
locator.up_to(TextSize::from(1024))
|
|
||||||
};
|
|
||||||
|
|
||||||
// Locate the copyright notice.
|
// Locate the copyright notice.
|
||||||
if let Some(match_) = settings.flake8_copyright.notice_rgx.find(contents) {
|
if let Some(match_) = settings.flake8_copyright.notice_rgx.find(contents) {
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff/src/rules/flake8_copyright/mod.rs
|
||||||
|
---
|
||||||
|
<filename>:1:1: CPY001 Missing copyright notice at top of file
|
||||||
|
|
|
||||||
|
1 | কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক
|
||||||
|
| CPY001
|
||||||
|
|
|
||||||
|
|
||||||
|
|
|
@ -388,6 +388,59 @@ impl<'a> Locator<'a> {
|
||||||
&self.contents[usize::from(offset)..]
|
&self.contents[usize::from(offset)..]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Finds the closest [`TextSize`] not exceeding the offset for which `is_char_boundary` is
|
||||||
|
/// `true`.
|
||||||
|
///
|
||||||
|
/// Can be replaced with `str#floor_char_boundary` once it's stable.
|
||||||
|
///
|
||||||
|
/// ## Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
/// # use ruff_source_file::Locator;
|
||||||
|
///
|
||||||
|
/// let locator = Locator::new("Hello");
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// locator.floor_char_boundary(TextSize::from(0)),
|
||||||
|
/// TextSize::from(0)
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// locator.floor_char_boundary(TextSize::from(5)),
|
||||||
|
/// TextSize::from(5)
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// let locator = Locator::new("α");
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// locator.floor_char_boundary(TextSize::from(0)),
|
||||||
|
/// TextSize::from(0)
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// locator.floor_char_boundary(TextSize::from(1)),
|
||||||
|
/// TextSize::from(0)
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// locator.floor_char_boundary(TextSize::from(2)),
|
||||||
|
/// TextSize::from(2)
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
pub fn floor_char_boundary(&self, offset: TextSize) -> TextSize {
|
||||||
|
if offset >= self.text_len() {
|
||||||
|
self.text_len()
|
||||||
|
} else {
|
||||||
|
// We know that the character boundary is within four bytes.
|
||||||
|
(0u32..=3u32)
|
||||||
|
.map(TextSize::from)
|
||||||
|
.filter_map(|index| offset.checked_sub(index))
|
||||||
|
.find(|offset| self.contents.is_char_boundary(offset.to_usize()))
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Take the source code between the given [`TextRange`].
|
/// Take the source code between the given [`TextRange`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn slice<T: Ranged>(&self, ranged: T) -> &'a str {
|
pub fn slice<T: Ranged>(&self, ranged: T) -> &'a str {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue