sonicop 26.8.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CONFORMANCE.md +109 -0
- data/Cargo.lock +975 -0
- data/Cargo.toml +40 -0
- data/LICENSE +21 -0
- data/NOTICE +7 -0
- data/README.ja.md +161 -0
- data/README.md +173 -0
- data/config/default.yml +6305 -0
- data/exe/sonicop +7 -0
- data/ext/sonicop/extconf.rb +38 -0
- data/lib/sonicop/runner.rb +67 -0
- data/lib/sonicop/version.rb +6 -0
- data/lib/sonicop.rb +8 -0
- data/licenses/RUBOCOP.txt +20 -0
- data/licenses/TREE_SITTER_RUBY.txt +21 -0
- data/src/cli.rs +940 -0
- data/src/config/inheritance.rs +332 -0
- data/src/config/loader.rs +117 -0
- data/src/config/mod.rs +461 -0
- data/src/config/paths.rs +436 -0
- data/src/config/plugin.rs +247 -0
- data/src/config/store.rs +141 -0
- data/src/cop_name.rs +71 -0
- data/src/diagnostic.rs +205 -0
- data/src/directives.rs +305 -0
- data/src/engine.rs +734 -0
- data/src/formatter.rs +684 -0
- data/src/lib.rs +42 -0
- data/src/main.rs +3 -0
- data/src/ruby_version.rs +393 -0
- data/src/rules/layout/empty_line_after_magic_comment.rs +49 -0
- data/src/rules/layout/end_of_line.rs +35 -0
- data/src/rules/layout/line_length.rs +167 -0
- data/src/rules/layout/mod.rs +13 -0
- data/src/rules/layout/space_after_comma.rs +32 -0
- data/src/rules/layout/space_around_operators.rs +104 -0
- data/src/rules/layout/space_inside_parens.rs +100 -0
- data/src/rules/layout/support.rs +23 -0
- data/src/rules/layout/trailing_empty_lines.rs +38 -0
- data/src/rules/layout/trailing_whitespace.rs +26 -0
- data/src/rules/lint/duplicate_methods.rs +72 -0
- data/src/rules/lint/mod.rs +7 -0
- data/src/rules/lint/syntax.rs +200 -0
- data/src/rules/lint/unused_block_argument.rs +74 -0
- data/src/rules/lint/useless_assignment.rs +104 -0
- data/src/rules/metrics/block_length.rs +39 -0
- data/src/rules/metrics/class_length.rs +34 -0
- data/src/rules/metrics/method_length.rs +10 -0
- data/src/rules/metrics/mod.rs +10 -0
- data/src/rules/metrics/module_length.rs +17 -0
- data/src/rules/metrics/parameter_lists.rs +21 -0
- data/src/rules/metrics/support.rs +105 -0
- data/src/rules/mod.rs +380 -0
- data/src/rules/naming/ascii_identifiers.rs +17 -0
- data/src/rules/naming/constant_name.rs +49 -0
- data/src/rules/naming/method_name.rs +51 -0
- data/src/rules/naming/mod.rs +9 -0
- data/src/rules/naming/support.rs +22 -0
- data/src/rules/naming/variable_name.rs +50 -0
- data/src/rules/security/eval.rs +170 -0
- data/src/rules/security/mod.rs +6 -0
- data/src/rules/style/frozen_string_literal_comment.rs +56 -0
- data/src/rules/style/hash_syntax.rs +63 -0
- data/src/rules/style/mod.rs +9 -0
- data/src/rules/style/numeric_literals.rs +59 -0
- data/src/rules/style/redundant_return.rs +143 -0
- data/src/rules/style/semicolon.rs +48 -0
- data/src/rules/style/string_literals.rs +74 -0
- data/src/rules/support.rs +31 -0
- data/src/source.rs +118 -0
- metadata +117 -0
data/src/source.rs
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
use std::ops::Range;
|
|
2
|
+
use std::path::{Path, PathBuf};
|
|
3
|
+
|
|
4
|
+
use tree_sitter::Node;
|
|
5
|
+
|
|
6
|
+
#[derive(Clone, Debug)]
|
|
7
|
+
pub struct SourceFile {
|
|
8
|
+
path: PathBuf,
|
|
9
|
+
text: String,
|
|
10
|
+
line_starts: Vec<usize>,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
impl SourceFile {
|
|
14
|
+
pub fn new(path: impl Into<PathBuf>, text: String) -> Self {
|
|
15
|
+
let mut line_starts = vec![0];
|
|
16
|
+
line_starts.extend(
|
|
17
|
+
text.bytes()
|
|
18
|
+
.enumerate()
|
|
19
|
+
.filter_map(|(index, byte)| (byte == b'\n').then_some(index + 1)),
|
|
20
|
+
);
|
|
21
|
+
Self {
|
|
22
|
+
path: path.into(),
|
|
23
|
+
text,
|
|
24
|
+
line_starts,
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
pub fn path(&self) -> &Path {
|
|
29
|
+
&self.path
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
pub fn text(&self) -> &str {
|
|
33
|
+
&self.text
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pub fn len(&self) -> usize {
|
|
37
|
+
self.text.len()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
pub fn is_empty(&self) -> bool {
|
|
41
|
+
self.text.is_empty()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
pub fn slice(&self, range: Range<usize>) -> &str {
|
|
45
|
+
&self.text[range]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
pub fn node_text<'a>(&'a self, node: Node<'_>) -> &'a str {
|
|
49
|
+
&self.text[node.byte_range()]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
pub fn line_count(&self) -> usize {
|
|
53
|
+
self.line_starts.len()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
pub fn line_start(&self, one_based_line: usize) -> usize {
|
|
57
|
+
self.line_starts
|
|
58
|
+
.get(one_based_line.saturating_sub(1))
|
|
59
|
+
.copied()
|
|
60
|
+
.unwrap_or(self.text.len())
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
pub fn line_range(&self, one_based_line: usize) -> Range<usize> {
|
|
64
|
+
let start = self.line_start(one_based_line);
|
|
65
|
+
let end = self
|
|
66
|
+
.line_starts
|
|
67
|
+
.get(one_based_line)
|
|
68
|
+
.copied()
|
|
69
|
+
.unwrap_or(self.text.len());
|
|
70
|
+
start..end
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
pub fn line(&self, one_based_line: usize) -> &str {
|
|
74
|
+
let range = self.line_range(one_based_line);
|
|
75
|
+
&self.text[range]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// An offset landing inside a multibyte character is rounded down to that character's start
|
|
79
|
+
/// rather than panicking: a cop reporting a byte range it derived by arithmetic must not be
|
|
80
|
+
/// able to abort the whole run.
|
|
81
|
+
pub fn line_column(&self, byte_offset: usize) -> (usize, usize) {
|
|
82
|
+
let mut offset = byte_offset.min(self.text.len());
|
|
83
|
+
while offset > 0 && !self.text.is_char_boundary(offset) {
|
|
84
|
+
offset -= 1;
|
|
85
|
+
}
|
|
86
|
+
let line_index = self.line_starts.partition_point(|start| *start <= offset) - 1;
|
|
87
|
+
let line_start = self.line_starts[line_index];
|
|
88
|
+
let column = self.text[line_start..offset].chars().count() + 1;
|
|
89
|
+
(line_index + 1, column)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
pub fn is_protected(offset: usize, ranges: &[Range<usize>]) -> bool {
|
|
94
|
+
let index = ranges.partition_point(|range| range.start <= offset);
|
|
95
|
+
index > 0 && ranges[index - 1].contains(&offset)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#[cfg(test)]
|
|
99
|
+
mod tests {
|
|
100
|
+
use super::SourceFile;
|
|
101
|
+
|
|
102
|
+
#[test]
|
|
103
|
+
fn calculates_unicode_columns() {
|
|
104
|
+
let source = SourceFile::new("test.rb", "あa\nxyz".to_owned());
|
|
105
|
+
assert_eq!(source.line_column("あ".len()), (1, 2));
|
|
106
|
+
assert_eq!(source.line_column(5), (2, 1));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#[test]
|
|
110
|
+
fn an_offset_inside_a_multibyte_character_resolves_to_its_start() {
|
|
111
|
+
let source = SourceFile::new("test.rb", "あ = 1\n".to_owned());
|
|
112
|
+
|
|
113
|
+
for offset in 0.."あ".len() {
|
|
114
|
+
assert_eq!(source.line_column(offset), (1, 1));
|
|
115
|
+
}
|
|
116
|
+
assert_eq!(source.line_column("あ".len()), (1, 2));
|
|
117
|
+
}
|
|
118
|
+
}
|
metadata
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: sonicop
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 26.8.101
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Yohei
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies: []
|
|
12
|
+
description: |
|
|
13
|
+
Sonicop is a Rust implementation of the core RuboCop inspection pipeline.
|
|
14
|
+
It ships as a native executable wrapped in a Ruby gem.
|
|
15
|
+
email: []
|
|
16
|
+
executables:
|
|
17
|
+
- sonicop
|
|
18
|
+
extensions:
|
|
19
|
+
- ext/sonicop/extconf.rb
|
|
20
|
+
extra_rdoc_files: []
|
|
21
|
+
files:
|
|
22
|
+
- CONFORMANCE.md
|
|
23
|
+
- Cargo.lock
|
|
24
|
+
- Cargo.toml
|
|
25
|
+
- LICENSE
|
|
26
|
+
- NOTICE
|
|
27
|
+
- README.ja.md
|
|
28
|
+
- README.md
|
|
29
|
+
- config/default.yml
|
|
30
|
+
- exe/sonicop
|
|
31
|
+
- ext/sonicop/extconf.rb
|
|
32
|
+
- lib/sonicop.rb
|
|
33
|
+
- lib/sonicop/runner.rb
|
|
34
|
+
- lib/sonicop/version.rb
|
|
35
|
+
- licenses/RUBOCOP.txt
|
|
36
|
+
- licenses/TREE_SITTER_RUBY.txt
|
|
37
|
+
- src/cli.rs
|
|
38
|
+
- src/config/inheritance.rs
|
|
39
|
+
- src/config/loader.rs
|
|
40
|
+
- src/config/mod.rs
|
|
41
|
+
- src/config/paths.rs
|
|
42
|
+
- src/config/plugin.rs
|
|
43
|
+
- src/config/store.rs
|
|
44
|
+
- src/cop_name.rs
|
|
45
|
+
- src/diagnostic.rs
|
|
46
|
+
- src/directives.rs
|
|
47
|
+
- src/engine.rs
|
|
48
|
+
- src/formatter.rs
|
|
49
|
+
- src/lib.rs
|
|
50
|
+
- src/main.rs
|
|
51
|
+
- src/ruby_version.rs
|
|
52
|
+
- src/rules/layout/empty_line_after_magic_comment.rs
|
|
53
|
+
- src/rules/layout/end_of_line.rs
|
|
54
|
+
- src/rules/layout/line_length.rs
|
|
55
|
+
- src/rules/layout/mod.rs
|
|
56
|
+
- src/rules/layout/space_after_comma.rs
|
|
57
|
+
- src/rules/layout/space_around_operators.rs
|
|
58
|
+
- src/rules/layout/space_inside_parens.rs
|
|
59
|
+
- src/rules/layout/support.rs
|
|
60
|
+
- src/rules/layout/trailing_empty_lines.rs
|
|
61
|
+
- src/rules/layout/trailing_whitespace.rs
|
|
62
|
+
- src/rules/lint/duplicate_methods.rs
|
|
63
|
+
- src/rules/lint/mod.rs
|
|
64
|
+
- src/rules/lint/syntax.rs
|
|
65
|
+
- src/rules/lint/unused_block_argument.rs
|
|
66
|
+
- src/rules/lint/useless_assignment.rs
|
|
67
|
+
- src/rules/metrics/block_length.rs
|
|
68
|
+
- src/rules/metrics/class_length.rs
|
|
69
|
+
- src/rules/metrics/method_length.rs
|
|
70
|
+
- src/rules/metrics/mod.rs
|
|
71
|
+
- src/rules/metrics/module_length.rs
|
|
72
|
+
- src/rules/metrics/parameter_lists.rs
|
|
73
|
+
- src/rules/metrics/support.rs
|
|
74
|
+
- src/rules/mod.rs
|
|
75
|
+
- src/rules/naming/ascii_identifiers.rs
|
|
76
|
+
- src/rules/naming/constant_name.rs
|
|
77
|
+
- src/rules/naming/method_name.rs
|
|
78
|
+
- src/rules/naming/mod.rs
|
|
79
|
+
- src/rules/naming/support.rs
|
|
80
|
+
- src/rules/naming/variable_name.rs
|
|
81
|
+
- src/rules/security/eval.rs
|
|
82
|
+
- src/rules/security/mod.rs
|
|
83
|
+
- src/rules/style/frozen_string_literal_comment.rs
|
|
84
|
+
- src/rules/style/hash_syntax.rs
|
|
85
|
+
- src/rules/style/mod.rs
|
|
86
|
+
- src/rules/style/numeric_literals.rs
|
|
87
|
+
- src/rules/style/redundant_return.rs
|
|
88
|
+
- src/rules/style/semicolon.rs
|
|
89
|
+
- src/rules/style/string_literals.rs
|
|
90
|
+
- src/rules/support.rs
|
|
91
|
+
- src/source.rs
|
|
92
|
+
homepage: https://github.com/owayo/sonicop
|
|
93
|
+
licenses:
|
|
94
|
+
- MIT
|
|
95
|
+
metadata:
|
|
96
|
+
homepage_uri: https://github.com/owayo/sonicop
|
|
97
|
+
source_code_uri: https://github.com/owayo/sonicop
|
|
98
|
+
changelog_uri: https://github.com/owayo/sonicop/releases
|
|
99
|
+
rubygems_mfa_required: 'true'
|
|
100
|
+
rdoc_options: []
|
|
101
|
+
require_paths:
|
|
102
|
+
- lib
|
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
|
+
requirements:
|
|
105
|
+
- - ">="
|
|
106
|
+
- !ruby/object:Gem::Version
|
|
107
|
+
version: 2.6.0
|
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
|
+
requirements:
|
|
110
|
+
- - ">="
|
|
111
|
+
- !ruby/object:Gem::Version
|
|
112
|
+
version: '0'
|
|
113
|
+
requirements: []
|
|
114
|
+
rubygems_version: 3.6.9
|
|
115
|
+
specification_version: 4
|
|
116
|
+
summary: A fast, native RuboCop-compatible Ruby linter and formatter
|
|
117
|
+
test_files: []
|