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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0441b4d9f29a02a65680ffc46fb56985251723336a076999f7867ad7eb92185d
4
- data.tar.gz: 92771eff5ed80253a14a85fd96ecaace40e7ce0476f2e26c6cb42372a26b9706
3
+ metadata.gz: 07050b077e5266437a527369312875e178be1df47c24f2792fd5945060fe0e26
4
+ data.tar.gz: 04ad13719f726d00a61a5cd287573813ce6d2780ef4ef7e8ea4092ed02a24af2
5
5
  SHA512:
6
- metadata.gz: b1fd06eba3ce66013593a26400d81698fa3eeb01725890aa3ae5e0f78d086729b6b633f9d6a0551e61e2c1118ad844a12daba2ab97da5306ff13b8feb48a3d2b
7
- data.tar.gz: 7595e8287a2f7f3904d643c98c1bafc412c2bfebcf4eb2de364ae13af4badf491985eba022f86cf93362efb997d0df57a171068a3ecc1ffb0b27d0c0cbf6e028
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'
@@ -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.4.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.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