rubocop-elegant 0.4.0 → 0.5.0
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 +4 -4
- data/README.md +1 -0
- data/config/default.yml +11 -0
- data/lib/rubocop/cop/elegant/one_class_per_file.rb +38 -0
- data/lib/rubocop/cop/elegant_cops.rb +1 -0
- data/rubocop-elegant.gemspec +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 07050b077e5266437a527369312875e178be1df47c24f2792fd5945060fe0e26
|
|
4
|
+
data.tar.gz: 04ad13719f726d00a61a5cd287573813ce6d2780ef4ef7e8ea4092ed02a24af2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 384fa71d95456e0515d5bb4a518a65af285f6e9774289163595e3f1a1885473dab1f85f931ce731e5376d6fa73029991f7cd5624771736e5650dec8e06b845ab
|
|
7
|
+
data.tar.gz: d9d7248056d93b0c1c0d81afd0e7c96c709e314e944eeb95365ef1affe3d4f1342607f84b6da874a2e3a68ae3eb21fa0064e9163449935f1a695906f2da5fae4
|
data/README.md
CHANGED
|
@@ -22,6 +22,7 @@ The custom cops add the following restrictions:
|
|
|
22
22
|
|
|
23
23
|
* Classes must live inside a module; top-level classes are forbidden.
|
|
24
24
|
* A class nested in a module must use compact namespace syntax.
|
|
25
|
+
* Only one non-empty top-level class per file; empty forward declarations are allowed.
|
|
25
26
|
* Method names must be single lowercase verbs.
|
|
26
27
|
* Variable names must be single lowercase nouns.
|
|
27
28
|
* Each indentation step must add exactly two spaces.
|
data/config/default.yml
CHANGED
|
@@ -43,6 +43,13 @@ Elegant/NoClassInModule:
|
|
|
43
43
|
Exclude:
|
|
44
44
|
- '**/*Test.rb'
|
|
45
45
|
- '**/test_*.rb'
|
|
46
|
+
Elegant/OneClassPerFile:
|
|
47
|
+
Description: 'Allows only one non-empty top-level class per file; empty forward declarations are treated as namespace scaffolding'
|
|
48
|
+
Enabled: true
|
|
49
|
+
VersionAdded: '0.4.0'
|
|
50
|
+
Exclude:
|
|
51
|
+
- '**/*Test.rb'
|
|
52
|
+
- '**/test_*.rb'
|
|
46
53
|
Elegant/IndentationLadder:
|
|
47
54
|
Description: 'Requires the indentation step to be exactly two spaces when a line indents to the right of the previous one'
|
|
48
55
|
Enabled: true
|
|
@@ -102,6 +109,10 @@ Style/MultilineBlockChain:
|
|
|
102
109
|
Enabled: false
|
|
103
110
|
Style/ClassAndModuleChildren:
|
|
104
111
|
Enabled: false
|
|
112
|
+
Style/OneClassPerFile:
|
|
113
|
+
Enabled: false
|
|
114
|
+
Lint/EmptyClass:
|
|
115
|
+
Enabled: false
|
|
105
116
|
Lint/NestedMethodDefinition:
|
|
106
117
|
Enabled: false
|
|
107
118
|
Metrics/ParameterLists:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2019-2026 Yegor Bugayenko
|
|
4
|
+
# SPDX-License-Identifier: MIT
|
|
5
|
+
|
|
6
|
+
# Enforces one top-level class per file, treating empty class bodies as
|
|
7
|
+
# namespace scaffolding rather than real classes. An empty top-level
|
|
8
|
+
# +class Foo::Bar; end+ resolves a parent namespace so that the actual
|
|
9
|
+
# class in the same file can use the compact-namespaced form required
|
|
10
|
+
# by +Elegant/NoClassInModule+ without a circular require; it is not a
|
|
11
|
+
# class definition in its own right. Only when two or more top-level
|
|
12
|
+
# class bodies are non-empty does the cop register an offense, on every
|
|
13
|
+
# such class after the first.
|
|
14
|
+
class RuboCop::Cop::Elegant::OneClassPerFile < RuboCop::Cop::Base
|
|
15
|
+
MSG = 'Only one non-empty class per file is allowed; %<name>s is the extra one'
|
|
16
|
+
public_constant :MSG
|
|
17
|
+
|
|
18
|
+
def on_new_investigation
|
|
19
|
+
real = tops.reject { |node| node.body.nil? }
|
|
20
|
+
real.drop(1).each do |node|
|
|
21
|
+
add_offense(node, message: format(MSG, name: label(node)))
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def tops
|
|
28
|
+
ast = processed_source.ast
|
|
29
|
+
return [] if ast.nil?
|
|
30
|
+
return [ast] if ast.class_type?
|
|
31
|
+
return [] unless ast.begin_type?
|
|
32
|
+
ast.children.select(&:class_type?)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def label(node)
|
|
36
|
+
node.children[0].source
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -15,4 +15,5 @@ require_relative 'elegant/no_empty_lines_in_blocks'
|
|
|
15
15
|
require_relative 'elegant/no_empty_lines_in_methods'
|
|
16
16
|
require_relative 'elegant/no_nil_return'
|
|
17
17
|
require_relative 'elegant/no_redundant_variable'
|
|
18
|
+
require_relative 'elegant/one_class_per_file'
|
|
18
19
|
require_relative 'elegant/paired_brackets'
|
data/rubocop-elegant.gemspec
CHANGED
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
|
9
9
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to?(:required_rubygems_version=)
|
|
10
10
|
s.required_ruby_version = '>=2.2'
|
|
11
11
|
s.name = 'rubocop-elegant'
|
|
12
|
-
s.version = '0.
|
|
12
|
+
s.version = '0.5.0'
|
|
13
13
|
s.license = 'MIT'
|
|
14
14
|
s.summary = 'Set of custom RuboCop cops for elegant Ruby coding'
|
|
15
15
|
s.description =
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rubocop-elegant
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yegor Bugayenko
|
|
@@ -63,6 +63,7 @@ files:
|
|
|
63
63
|
- lib/rubocop/cop/elegant/no_empty_lines_in_methods.rb
|
|
64
64
|
- lib/rubocop/cop/elegant/no_nil_return.rb
|
|
65
65
|
- lib/rubocop/cop/elegant/no_redundant_variable.rb
|
|
66
|
+
- lib/rubocop/cop/elegant/one_class_per_file.rb
|
|
66
67
|
- lib/rubocop/cop/elegant/paired_brackets.rb
|
|
67
68
|
- lib/rubocop/cop/elegant_cops.rb
|
|
68
69
|
- lib/rubocop/elegant/plugin.rb
|