rubocop-packaging 0.4.0 → 0.5.2
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 +4 -1
- data/config/default.yml +21 -9
- data/lib/rubocop/cop/packaging/bundler_setup_in_tests.rb +14 -2
- data/lib/rubocop/cop/packaging/gemspec_git.rb +12 -14
- data/lib/rubocop/cop/packaging/{require_with_relative_path.rb → require_hardcoding_lib.rb} +22 -7
- data/lib/rubocop/cop/packaging/require_relative_hardcoding_lib.rb +18 -7
- data/lib/rubocop/cop/packaging_cops.rb +1 -1
- data/lib/rubocop/packaging/lib_helper_module.rb +7 -1
- data/lib/rubocop/packaging/version.rb +1 -1
- metadata +18 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45a3b0981916c4440d8092538357892c433f57955f845b45ab3890086e0e0bd2
|
4
|
+
data.tar.gz: b7caa60273e00c8d3468e5f7d7235a1c5a99088d935fc0a2803d8611c4df1f87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 676a58d6efb8be59c432cb299dc229b497753b4630802e4f0b274f0359d3e2349b08311519f7e252965d877f3046cb7d30ee1bfba6f6a19d546d38b411bae349
|
7
|
+
data.tar.gz: 3fd0d9db07d161dbf6740d8e3947909f2fe486235b933ae5af06befce00c461ca7c61149a65559d7568ed1a1cfb674f0d1c45b01d8a7e8644daadbd8d5a5d5c5
|
data/README.md
CHANGED
@@ -10,7 +10,10 @@ environment without any problems.
|
|
10
10
|
## Documentation
|
11
11
|
|
12
12
|
A detailed documentation, explaining what this extension is doing and the
|
13
|
-
reasoning behind it, can be found here:
|
13
|
+
reasoning behind it, can be found here: https://docs.rubocop.org/rubocop-packaging/
|
14
|
+
|
15
|
+
We also have a [packaging-style-guide](https://packaging.rubystyle.guide/),
|
16
|
+
listing some good and bad examples and the rationale behind these cops.
|
14
17
|
|
15
18
|
In case anything is not clear, please feel free to raise an issue, asking
|
16
19
|
for more explanation!
|
data/config/default.yml
CHANGED
@@ -1,23 +1,35 @@
|
|
1
1
|
# This is the default configuration file.
|
2
2
|
|
3
3
|
Packaging/BundlerSetupInTests:
|
4
|
-
Description:
|
4
|
+
Description: >-
|
5
|
+
Using `bundler/setup` in tests is redundant. Consider
|
6
|
+
removing it.
|
5
7
|
Enabled: true
|
6
8
|
VersionAdded: '0.4'
|
9
|
+
VersionChanged: '0.5'
|
7
10
|
|
8
11
|
Packaging/GemspecGit:
|
9
|
-
Description:
|
12
|
+
Description: >-
|
13
|
+
Avoid using git to produce lists of files. Downstreams
|
14
|
+
often need to build your package in an environment
|
15
|
+
that does not have git (on purpose). Use some pure
|
16
|
+
Ruby alternative, like `Dir` or `Dir.glob`.
|
10
17
|
Enabled: true
|
11
18
|
VersionAdded: '0.1'
|
12
19
|
VersionChanged: '0.1'
|
13
20
|
|
14
|
-
Packaging/
|
15
|
-
Description:
|
21
|
+
Packaging/RequireHardcodingLib:
|
22
|
+
Description: >-
|
23
|
+
Avoid using `require` with relative path to lib. Use
|
24
|
+
`require` with absolute path instead.
|
16
25
|
Enabled: true
|
17
|
-
VersionAdded: '0.
|
18
|
-
VersionChanged: '0.
|
26
|
+
VersionAdded: '0.4'
|
27
|
+
VersionChanged: '0.5'
|
19
28
|
|
20
|
-
Packaging/
|
21
|
-
Description:
|
29
|
+
Packaging/RequireRelativeHardcodingLib:
|
30
|
+
Description: >-
|
31
|
+
Avoid using `require_relative` with relative path to
|
32
|
+
lib. Use `require` with absolute path instead.
|
22
33
|
Enabled: true
|
23
|
-
VersionAdded: '0.
|
34
|
+
VersionAdded: '0.2'
|
35
|
+
VersionChanged: '0.5'
|
@@ -19,10 +19,12 @@ module RuboCop # :nodoc:
|
|
19
19
|
#
|
20
20
|
class BundlerSetupInTests < Base
|
21
21
|
include RuboCop::Packaging::LibHelperModule
|
22
|
+
include RangeHelp
|
23
|
+
extend AutoCorrector
|
22
24
|
|
23
25
|
# This is the message that will be displayed when RuboCop::Packaging finds
|
24
26
|
# an offense of using `require "bundler/setup"` in the tests directory.
|
25
|
-
MSG = "
|
27
|
+
MSG = "Using `bundler/setup` in tests is redundant. Consider removing it."
|
26
28
|
|
27
29
|
def_node_matcher :bundler_setup?, <<~PATTERN
|
28
30
|
(send nil? :require
|
@@ -45,7 +47,17 @@ module RuboCop # :nodoc:
|
|
45
47
|
def on_send(node)
|
46
48
|
return unless bundler_setup?(node)
|
47
49
|
|
48
|
-
add_offense(node)
|
50
|
+
add_offense(node) do |corrector|
|
51
|
+
autocorrect(corrector, node)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Called from on_send, this method helps to autocorrect
|
56
|
+
# the offenses flagged by this cop.
|
57
|
+
def autocorrect(corrector, node)
|
58
|
+
range = range_by_whole_lines(node.source_range, include_final_newline: true)
|
59
|
+
|
60
|
+
corrector.remove(range)
|
49
61
|
end
|
50
62
|
|
51
63
|
# This method is called from inside `#def_node_matcher`.
|
@@ -11,14 +11,12 @@ module RuboCop # :nodoc:
|
|
11
11
|
#
|
12
12
|
# # bad
|
13
13
|
# Gem::Specification.new do |spec|
|
14
|
-
# spec.files
|
15
|
-
# spec.test_files = `git ls-files -- spec`.split("\n")
|
14
|
+
# spec.files = `git ls-files`.split("\n")
|
16
15
|
# end
|
17
16
|
#
|
18
17
|
# # good
|
19
18
|
# Gem::Specification.new do |spec|
|
20
|
-
# spec.files
|
21
|
-
# spec.test_files = Dir["spec/**/*"]
|
19
|
+
# spec.files = Dir["lib/**/*", "LICENSE", "README.md"]
|
22
20
|
# end
|
23
21
|
#
|
24
22
|
# # bad
|
@@ -29,31 +27,31 @@ module RuboCop # :nodoc:
|
|
29
27
|
# end
|
30
28
|
#
|
31
29
|
# # good
|
30
|
+
# require "rake/file_list"
|
31
|
+
#
|
32
32
|
# Gem::Specification.new do |spec|
|
33
|
-
# spec.files
|
33
|
+
# spec.files = Rake::FileList["**/*"].exclude(*File.read(".gitignore").split)
|
34
34
|
# end
|
35
35
|
#
|
36
36
|
# # bad
|
37
37
|
# Gem::Specification.new do |spec|
|
38
|
-
# spec.files
|
39
|
-
# spec.
|
40
|
-
# spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
38
|
+
# spec.files = `git ls-files -- lib/`.split("\n")
|
39
|
+
# spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
41
40
|
# end
|
42
41
|
#
|
43
42
|
# # good
|
44
43
|
# Gem::Specification.new do |spec|
|
45
|
-
# spec.files
|
46
|
-
# spec.
|
47
|
-
# spec.executables = Dir.glob("bin/*").map{ |f| File.basename(f) }
|
44
|
+
# spec.files = Dir.glob("lib/**/*")
|
45
|
+
# spec.executables = Dir.glob("bin/*").map{ |f| File.basename(f) }
|
48
46
|
# end
|
49
47
|
#
|
50
48
|
class GemspecGit < Base
|
51
49
|
# This is the message that will be displayed when RuboCop finds an
|
52
50
|
# offense of using `git ls-files`.
|
53
51
|
MSG = "Avoid using git to produce lists of files. " \
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
"Downstreams often need to build your package in an environment " \
|
53
|
+
"that does not have git (on purpose). " \
|
54
|
+
"Use some pure Ruby alternative, like `Dir` or `Dir.glob`."
|
57
55
|
|
58
56
|
def_node_search :xstr, <<~PATTERN
|
59
57
|
(block
|
@@ -34,18 +34,21 @@ module RuboCop # :nodoc:
|
|
34
34
|
# # good
|
35
35
|
# require "baz/qux"
|
36
36
|
#
|
37
|
-
class
|
37
|
+
class RequireHardcodingLib < Base
|
38
38
|
include RuboCop::Packaging::LibHelperModule
|
39
|
+
extend AutoCorrector
|
39
40
|
|
40
41
|
# This is the message that will be displayed when RuboCop::Packaging
|
41
42
|
# finds an offense of using `require` with relative path to lib.
|
42
|
-
MSG = "Avoid using `require` with relative path to `lib/`."
|
43
|
+
MSG = "Avoid using `require` with relative path to `lib/`. " \
|
44
|
+
"Use `require` with absolute path instead."
|
43
45
|
|
44
46
|
def_node_matcher :require?, <<~PATTERN
|
45
47
|
{(send nil? :require (str #falls_in_lib?))
|
46
48
|
(send nil? :require (send (const nil? :File) :expand_path (str #falls_in_lib?) (send nil? :__dir__)))
|
47
49
|
(send nil? :require (send (const nil? :File) :expand_path (str #falls_in_lib_using_file?) (str _)))
|
48
|
-
(send nil? :require (send (send (const nil? :File) :dirname {(str _) (send nil? _)}) :+ (str #falls_in_lib_with_file_dirname_plus_str?)))
|
50
|
+
(send nil? :require (send (send (const nil? :File) :dirname {(str _) (send nil? _)}) :+ (str #falls_in_lib_with_file_dirname_plus_str?)))
|
51
|
+
(send nil? :require (dstr (begin (send (const nil? :File) :dirname {(str _) (send nil? _)})) (str #falls_in_lib_with_file_dirname_plus_str?)))}
|
49
52
|
PATTERN
|
50
53
|
|
51
54
|
# Extended from the Base class.
|
@@ -64,28 +67,40 @@ module RuboCop # :nodoc:
|
|
64
67
|
def on_send(node)
|
65
68
|
return unless require?(node)
|
66
69
|
|
67
|
-
add_offense(node)
|
70
|
+
add_offense(node) do |corrector|
|
71
|
+
corrector.replace(node, good_require_call)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Called from on_send, this method helps to replace
|
76
|
+
# the "bad" require call with the "good" one.
|
77
|
+
def good_require_call
|
78
|
+
good_call = @str.sub(%r{^.*/lib/}, "")
|
79
|
+
%(require "#{good_call}")
|
68
80
|
end
|
69
81
|
|
70
82
|
# This method is called from inside `#def_node_matcher`.
|
71
83
|
# It flags an offense if the `require` call is made from
|
72
84
|
# anywhere except the "lib" directory.
|
73
85
|
def falls_in_lib?(str)
|
74
|
-
|
86
|
+
@str = str
|
87
|
+
target_falls_in_lib?(str) && inspected_file_is_not_in_lib_or_gemspec?
|
75
88
|
end
|
76
89
|
|
77
90
|
# This method is called from inside `#def_node_matcher`.
|
78
91
|
# It flags an offense if the `require` call (using the __FILE__
|
79
92
|
# arguement) is made from anywhere except the "lib" directory.
|
80
93
|
def falls_in_lib_using_file?(str)
|
81
|
-
|
94
|
+
@str = str
|
95
|
+
target_falls_in_lib_using_file?(str) && inspected_file_is_not_in_lib_or_gemspec?
|
82
96
|
end
|
83
97
|
|
84
98
|
# This method preprends a "." to the string that starts with "/".
|
85
99
|
# And then determines if that call is made to "lib/".
|
86
100
|
def falls_in_lib_with_file_dirname_plus_str?(str)
|
101
|
+
@str = str
|
87
102
|
str.prepend(".")
|
88
|
-
target_falls_in_lib?(str)
|
103
|
+
target_falls_in_lib?(str) && inspected_file_is_not_in_lib_or_gemspec?
|
89
104
|
end
|
90
105
|
end
|
91
106
|
end
|
@@ -12,10 +12,10 @@ module RuboCop # :nodoc:
|
|
12
12
|
# @example
|
13
13
|
#
|
14
14
|
# # bad
|
15
|
-
# require_relative "lib/foo
|
15
|
+
# require_relative "lib/foo"
|
16
16
|
#
|
17
17
|
# # good
|
18
|
-
# require "foo
|
18
|
+
# require "foo"
|
19
19
|
#
|
20
20
|
# # bad
|
21
21
|
# require_relative "../../lib/foo/bar"
|
@@ -24,16 +24,17 @@ module RuboCop # :nodoc:
|
|
24
24
|
# require "foo/bar"
|
25
25
|
#
|
26
26
|
# # good
|
27
|
-
# require_relative "
|
28
|
-
# require_relative "
|
27
|
+
# require_relative "foo/bar/bax"
|
28
|
+
# require_relative "baz/qux"
|
29
29
|
#
|
30
30
|
class RequireRelativeHardcodingLib < Base
|
31
31
|
include RuboCop::Packaging::LibHelperModule
|
32
|
+
extend AutoCorrector
|
32
33
|
|
33
34
|
# This is the message that will be displayed when RuboCop finds an
|
34
35
|
# offense of using `require_relative` with relative path to lib.
|
35
36
|
MSG = "Avoid using `require_relative` with relative path to lib. " \
|
36
|
-
|
37
|
+
"Use `require` with absolute path instead."
|
37
38
|
|
38
39
|
def_node_matcher :require_relative, <<~PATTERN
|
39
40
|
(send nil? :require_relative
|
@@ -56,14 +57,24 @@ module RuboCop # :nodoc:
|
|
56
57
|
def on_send(node)
|
57
58
|
return unless require_relative(node)
|
58
59
|
|
59
|
-
add_offense(node)
|
60
|
+
add_offense(node) do |corrector|
|
61
|
+
corrector.replace(node, good_require_call)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Called from on_send, this method helps to replace the
|
66
|
+
# "bad" require_relative call with the "good" one.
|
67
|
+
def good_require_call
|
68
|
+
good_call = File.expand_path(@str, @file_directory).delete_prefix("#{root_dir}/lib/")
|
69
|
+
%(require "#{good_call}")
|
60
70
|
end
|
61
71
|
|
62
72
|
# This method is called from inside `#def_node_matcher`.
|
63
73
|
# It flags an offense if the `require_relative` call is made
|
64
74
|
# from anywhere except the "lib" directory.
|
65
75
|
def falls_in_lib?(str)
|
66
|
-
|
76
|
+
@str = str
|
77
|
+
target_falls_in_lib?(str) && inspected_file_is_not_in_lib_or_gemspec?
|
67
78
|
end
|
68
79
|
end
|
69
80
|
end
|
@@ -2,5 +2,5 @@
|
|
2
2
|
|
3
3
|
require_relative "packaging/bundler_setup_in_tests"
|
4
4
|
require_relative "packaging/gemspec_git"
|
5
|
+
require_relative "packaging/require_hardcoding_lib"
|
5
6
|
require_relative "packaging/require_relative_hardcoding_lib"
|
6
|
-
require_relative "packaging/require_with_relative_path"
|
@@ -7,7 +7,7 @@ module RuboCop # :nodoc:
|
|
7
7
|
module LibHelperModule
|
8
8
|
# For determining the root directory of the project.
|
9
9
|
def root_dir
|
10
|
-
RuboCop::
|
10
|
+
RuboCop::ConfigFinder.project_root
|
11
11
|
end
|
12
12
|
|
13
13
|
# This method determines if the calls are made to the "lib" directory.
|
@@ -30,6 +30,12 @@ module RuboCop # :nodoc:
|
|
30
30
|
def inspected_file_is_gemspec?
|
31
31
|
@file_path.end_with?("gemspec")
|
32
32
|
end
|
33
|
+
|
34
|
+
# This method determines if the inspected file is not in lib/ or
|
35
|
+
# isn't a gemspec file.
|
36
|
+
def inspected_file_is_not_in_lib_or_gemspec?
|
37
|
+
!inspected_file_falls_in_lib? && !inspected_file_is_gemspec?
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
35
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-packaging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Utkarsh Gupta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bump
|
@@ -84,18 +84,24 @@ dependencies:
|
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.33'
|
90
|
+
- - "<"
|
88
91
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
92
|
+
version: '2.0'
|
90
93
|
type: :runtime
|
91
94
|
prerelease: false
|
92
95
|
version_requirements: !ruby/object:Gem::Requirement
|
93
96
|
requirements:
|
94
|
-
- - "
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.33'
|
100
|
+
- - "<"
|
95
101
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
102
|
+
version: '2.0'
|
97
103
|
description: |
|
98
|
-
A collection of RuboCop cops to check for downstream
|
104
|
+
A collection of RuboCop cops to check for downstream compatibility issues in the
|
99
105
|
Ruby code.
|
100
106
|
email:
|
101
107
|
- utkarsh@debian.org
|
@@ -109,8 +115,8 @@ files:
|
|
109
115
|
- lib/rubocop-packaging.rb
|
110
116
|
- lib/rubocop/cop/packaging/bundler_setup_in_tests.rb
|
111
117
|
- lib/rubocop/cop/packaging/gemspec_git.rb
|
118
|
+
- lib/rubocop/cop/packaging/require_hardcoding_lib.rb
|
112
119
|
- lib/rubocop/cop/packaging/require_relative_hardcoding_lib.rb
|
113
|
-
- lib/rubocop/cop/packaging/require_with_relative_path.rb
|
114
120
|
- lib/rubocop/cop/packaging_cops.rb
|
115
121
|
- lib/rubocop/packaging.rb
|
116
122
|
- lib/rubocop/packaging/inject.rb
|
@@ -122,6 +128,7 @@ licenses:
|
|
122
128
|
metadata:
|
123
129
|
homepage_uri: https://github.com/utkarsh2102/rubocop-packaging
|
124
130
|
source_code_uri: https://github.com/utkarsh2102/rubocop-packaging
|
131
|
+
rubygems_mfa_required: 'true'
|
125
132
|
post_install_message:
|
126
133
|
rdoc_options: []
|
127
134
|
require_paths:
|
@@ -130,15 +137,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
137
|
requirements:
|
131
138
|
- - ">="
|
132
139
|
- !ruby/object:Gem::Version
|
133
|
-
version: 2.
|
140
|
+
version: 2.6.0
|
134
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
142
|
requirements:
|
136
143
|
- - ">="
|
137
144
|
- !ruby/object:Gem::Version
|
138
145
|
version: '0'
|
139
146
|
requirements: []
|
140
|
-
rubygems_version: 3.
|
147
|
+
rubygems_version: 3.3.5
|
141
148
|
signing_key:
|
142
149
|
specification_version: 4
|
143
|
-
summary: Automatic downstream
|
150
|
+
summary: Automatic downstream compatibility checking tool for Ruby code
|
144
151
|
test_files: []
|