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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/CONFORMANCE.md +109 -0
  3. data/Cargo.lock +975 -0
  4. data/Cargo.toml +40 -0
  5. data/LICENSE +21 -0
  6. data/NOTICE +7 -0
  7. data/README.ja.md +161 -0
  8. data/README.md +173 -0
  9. data/config/default.yml +6305 -0
  10. data/exe/sonicop +7 -0
  11. data/ext/sonicop/extconf.rb +38 -0
  12. data/lib/sonicop/runner.rb +67 -0
  13. data/lib/sonicop/version.rb +6 -0
  14. data/lib/sonicop.rb +8 -0
  15. data/licenses/RUBOCOP.txt +20 -0
  16. data/licenses/TREE_SITTER_RUBY.txt +21 -0
  17. data/src/cli.rs +940 -0
  18. data/src/config/inheritance.rs +332 -0
  19. data/src/config/loader.rs +117 -0
  20. data/src/config/mod.rs +461 -0
  21. data/src/config/paths.rs +436 -0
  22. data/src/config/plugin.rs +247 -0
  23. data/src/config/store.rs +141 -0
  24. data/src/cop_name.rs +71 -0
  25. data/src/diagnostic.rs +205 -0
  26. data/src/directives.rs +305 -0
  27. data/src/engine.rs +734 -0
  28. data/src/formatter.rs +684 -0
  29. data/src/lib.rs +42 -0
  30. data/src/main.rs +3 -0
  31. data/src/ruby_version.rs +393 -0
  32. data/src/rules/layout/empty_line_after_magic_comment.rs +49 -0
  33. data/src/rules/layout/end_of_line.rs +35 -0
  34. data/src/rules/layout/line_length.rs +167 -0
  35. data/src/rules/layout/mod.rs +13 -0
  36. data/src/rules/layout/space_after_comma.rs +32 -0
  37. data/src/rules/layout/space_around_operators.rs +104 -0
  38. data/src/rules/layout/space_inside_parens.rs +100 -0
  39. data/src/rules/layout/support.rs +23 -0
  40. data/src/rules/layout/trailing_empty_lines.rs +38 -0
  41. data/src/rules/layout/trailing_whitespace.rs +26 -0
  42. data/src/rules/lint/duplicate_methods.rs +72 -0
  43. data/src/rules/lint/mod.rs +7 -0
  44. data/src/rules/lint/syntax.rs +200 -0
  45. data/src/rules/lint/unused_block_argument.rs +74 -0
  46. data/src/rules/lint/useless_assignment.rs +104 -0
  47. data/src/rules/metrics/block_length.rs +39 -0
  48. data/src/rules/metrics/class_length.rs +34 -0
  49. data/src/rules/metrics/method_length.rs +10 -0
  50. data/src/rules/metrics/mod.rs +10 -0
  51. data/src/rules/metrics/module_length.rs +17 -0
  52. data/src/rules/metrics/parameter_lists.rs +21 -0
  53. data/src/rules/metrics/support.rs +105 -0
  54. data/src/rules/mod.rs +380 -0
  55. data/src/rules/naming/ascii_identifiers.rs +17 -0
  56. data/src/rules/naming/constant_name.rs +49 -0
  57. data/src/rules/naming/method_name.rs +51 -0
  58. data/src/rules/naming/mod.rs +9 -0
  59. data/src/rules/naming/support.rs +22 -0
  60. data/src/rules/naming/variable_name.rs +50 -0
  61. data/src/rules/security/eval.rs +170 -0
  62. data/src/rules/security/mod.rs +6 -0
  63. data/src/rules/style/frozen_string_literal_comment.rs +56 -0
  64. data/src/rules/style/hash_syntax.rs +63 -0
  65. data/src/rules/style/mod.rs +9 -0
  66. data/src/rules/style/numeric_literals.rs +59 -0
  67. data/src/rules/style/redundant_return.rs +143 -0
  68. data/src/rules/style/semicolon.rs +48 -0
  69. data/src/rules/style/string_literals.rs +74 -0
  70. data/src/rules/support.rs +31 -0
  71. data/src/source.rs +118 -0
  72. 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: []