rubocop-vendor 0.6.0 → 0.8.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: 69207722d1f85c15ec43d9206abb228f4051f9bf5bb6df6891975427ffbcee57
4
- data.tar.gz: 37d1f7a6075504487894018da7f7adb11d70c7e9d774f7a659c9a20f372e93d5
3
+ metadata.gz: 595f5e0a7a5df8e76e6ac84dbbe195bbddc3feb2aaa1c50be9c6073244eb93b8
4
+ data.tar.gz: c933229c0d0a244d9e3b918958eee8c9d934adcf60947a00580898b243f784a3
5
5
  SHA512:
6
- metadata.gz: 7d4bb0376770d8be587725522cacf89ee448d4476d2f92a05656c9847d6169935076cefed131de3e2aad36107fb94893cd4197d88e034358cb68584f27e63284
7
- data.tar.gz: e0e48ef333ed5842e26ba7a8b0e3fa4326f35cd240df0d44685dd6e650ad1714daaf0388e72a5ed6ac4f39d10b59623c3eb69462977e47993cefb2c93ad2365a
6
+ metadata.gz: 4b8925c01fcd0ffd8409c3539c794bf509521dacf03ce52882450dfc6356c7df80140f8db2349acdf3c12436b76dc68db3b6f9e6eecd1f8d45130e6af9fb7b52
7
+ data.tar.gz: 10384648012c7d2dc85d28d4de95dc38dc8a12403bfa7a3d5595e8aabe0cd2111ad330f9093705a02f1b03b06976f2ca05de26e6b33d946c808c167e4113d83f
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- # RuboCop Vendor
1
+ # rubocop-vendor
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/rubocop-vendor.svg)](https://badge.fury.io/rb/rubocop-vendor)
4
- [![CircleCI](https://circleci.com/gh/wealthsimple/rubocop-vendor.svg?style=svg)](https://circleci.com/gh/wealthsimple/rubocop-vendor)
4
+ [![GitHub Actions Badge](https://github.com/wealthsimple/rubocop-vendor/actions/workflows/main.yml/badge.svg)](https://github.com/wealthsimple/rubocop-vendor/actions)
5
5
 
6
6
  Vendor integration analysis for your projects, as an extension to [RuboCop](https://github.com/rubocop-hq/rubocop).
7
7
 
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Vendor
6
+ class Base < Rubocop::Cop::Base
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Vendor
6
+ # This cop flags uses of the recursive-open-struct gem.
7
+ #
8
+ # RecursiveOpenStruct inherits from OpenStruct, which is now officially discouraged to be used
9
+ # for performance, version compatibility, and security issues.
10
+ #
11
+ # https://ruby-doc.org/stdlib-3.0.1/libdoc/ostruct/rdoc/OpenStruct.html#class-OpenStruct-label-Caveats
12
+ class RecursiveOpenStructGem < Base
13
+ MSG = <<~MSG.strip
14
+ Do not use the recursive-open-struct gem. RecursiveOpenStruct inherits from OpenStruct, which is now officially discouraged from usage due to performance, version compatibility, and security issues.
15
+ MSG
16
+
17
+ def on_new_investigation
18
+ return if processed_source.blank?
19
+
20
+ gem_declarations(processed_source.ast).each do |declaration|
21
+ next unless declaration.first_argument.str_content.match?('recursive-open-struct')
22
+
23
+ add_offense(declaration)
24
+ end
25
+ end
26
+
27
+ # @!method gem_declarations(node)
28
+ def_node_search :gem_declarations, <<~PATTERN
29
+ (:send nil? :gem str ...)
30
+ PATTERN
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Vendor
6
+ # This cop flags uses of RecursiveOpenStruct. RecursiveOpenStruct is a library used in the
7
+ # Wealthsimple ecosystem that is being phased out due to security issues.
8
+ #
9
+ # RecursiveOpenStruct inherits from OpenStruct, which is now officially discouraged to be used
10
+ # for performance, version compatibility, and security issues.
11
+ #
12
+ # @safety
13
+ #
14
+ # Note that this cop may flag false positives; for instance, the following legal
15
+ # use of a hand-rolled `RecursiveOpenStruct` type would be considered an offense:
16
+ #
17
+ # ```
18
+ # module MyNamespace
19
+ # class RecursiveOpenStruct # not the RecursiveOpenStruct we're looking for
20
+ # end
21
+ #
22
+ # def new_struct
23
+ # RecursiveOpenStruct.new # resolves to MyNamespace::RecursiveOpenStruct
24
+ # end
25
+ # end
26
+ # ```
27
+ #
28
+ # @example
29
+ #
30
+ # # bad
31
+ # point = RecursiveOpenStruct.new(x: 0, y: 1)
32
+ #
33
+ # # good
34
+ # Point = Struct.new(:x, :y)
35
+ # point = Point.new(0, 1)
36
+ #
37
+ # # also good
38
+ # point = { x: 0, y: 1 }
39
+ #
40
+ # # bad
41
+ # test_double = RecursiveOpenStruct.new(a: 'b')
42
+ #
43
+ # # good (assumes test using rspec-mocks)
44
+ # test_double = double
45
+ # allow(test_double).to receive(:a).and_return('b')
46
+ #
47
+ class RecursiveOpenStructUse < Base
48
+ MSG = <<~MSG.strip
49
+ Avoid using `RecursiveOpenStruct`; use `Struct`, `Hash`, a class or test doubles instead.
50
+ MSG
51
+
52
+ # @!method uses_recursive_open_struct?(node)
53
+ def_node_matcher :uses_recursive_open_struct?, <<-PATTERN
54
+ (const {nil? (cbase)} :RecursiveOpenStruct)
55
+ PATTERN
56
+
57
+ def on_const(node)
58
+ return unless uses_recursive_open_struct?(node)
59
+ return if custom_class_or_module_definition?(node)
60
+
61
+ add_offense(node)
62
+ end
63
+
64
+ private
65
+
66
+ def custom_class_or_module_definition?(node)
67
+ parent = node.parent
68
+
69
+ (parent.class_type? || parent.module_type?) && node.left_siblings.empty?
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -29,7 +29,7 @@ module RuboCop
29
29
  # end
30
30
  # end
31
31
  #
32
- class RollbarInsideRescue < Cop
32
+ class RollbarInsideRescue < Base
33
33
  MSG = 'Only call Rollbar when handling errors inside a `rescue` block.'
34
34
 
35
35
  # @!method rollbar?(node)
@@ -48,7 +48,7 @@ module RuboCop
48
48
  return unless rollbar?(node)
49
49
  return if in_rescue_block?(node)
50
50
 
51
- add_offense(node, location: node.children[0].loc.expression)
51
+ add_offense(node.children[0].loc.expression)
52
52
  end
53
53
 
54
54
  def in_rescue_block?(node)
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # # good
17
17
  # Rollbar.error(e, "Unable to sync account", account_id: account.id)
18
18
  #
19
- class RollbarInterpolation < Cop
19
+ class RollbarInterpolation < Base
20
20
  MSG = 'Send extra fields as hash parameter instead of interpolated message.'
21
21
 
22
22
  # @!method bad_method?(node)
@@ -15,8 +15,9 @@ module RuboCop
15
15
  # # good
16
16
  # Rollbar.info('Stale message')
17
17
  #
18
- class RollbarLog < Cop
18
+ class RollbarLog < Base
19
19
  include RangeHelp
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Use `Rollbar.%<method>s` instead of `Rollbar.log`.'
22
23
 
@@ -30,13 +31,11 @@ module RuboCop
30
31
  def on_send(node)
31
32
  return unless bad_method?(node)
32
33
 
33
- add_offense(node, location: offending_range(node))
34
- end
35
-
36
- def autocorrect(node)
37
34
  range = offending_range(node)
38
- replacement = "#{node.children[2].value}#{range.source.include?('(') ? '(' : ' '}"
39
- lambda do |corrector|
35
+ method = node.children[2].value
36
+
37
+ add_offense(range, message: format(MSG, method: method)) do |corrector|
38
+ replacement = "#{method}#{range.source.include?('(') ? '(' : ' '}"
40
39
  corrector.replace(range, replacement)
41
40
  end
42
41
  end
@@ -49,10 +48,6 @@ module RuboCop
49
48
  node.children[3].loc.column
50
49
  )
51
50
  end
52
-
53
- def message(node)
54
- format(MSG, method: node.children[2].value)
55
- end
56
51
  end
57
52
  end
58
53
  end
@@ -17,7 +17,9 @@ module RuboCop
17
17
  # # good
18
18
  # Rails.logger.info("Stale message")
19
19
  #
20
- class RollbarLogger < Cop
20
+ class RollbarLogger < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Use `Rails.logger` for `debug`, `info` or `warning` calls.'
22
24
 
23
25
  # @!method bad_method?(node)
@@ -28,12 +30,10 @@ module RuboCop
28
30
  def on_send(node)
29
31
  return unless bad_method?(node)
30
32
 
31
- add_offense(node, location: node.children[0].loc.expression)
32
- end
33
+ offending_node = node.children.first
33
34
 
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- corrector.replace(node.children[0].loc.expression, 'Rails.logger')
35
+ add_offense(offending_node) do |corrector|
36
+ corrector.replace(offending_node.loc.expression, 'Rails.logger')
37
37
  end
38
38
  end
39
39
  end
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # # good
20
20
  # Rollbar.error(exception, "Unable to sync account")
21
21
  #
22
- class RollbarWithException < Cop
22
+ class RollbarWithException < Base
23
23
  include RangeHelp
24
24
 
25
25
  MSG = 'Send exception as first parameter when calling `error` or `critical`.'
@@ -37,7 +37,8 @@ module RuboCop
37
37
  return unless first_param
38
38
 
39
39
  begin_pos = first_param.loc.expression.begin.begin_pos
40
- add_offense(first_param, location: range_between(begin_pos, begin_pos + 1))
40
+
41
+ add_offense(range_between(begin_pos, begin_pos + 1))
41
42
  end
42
43
  end
43
44
  end
@@ -3,6 +3,8 @@
3
3
  module RuboCop
4
4
  end
5
5
 
6
+ require_relative 'vendor/recursive_open_struct_gem'
7
+ require_relative 'vendor/recursive_open_struct_use'
6
8
  require_relative 'vendor/rollbar_inside_rescue'
7
9
  require_relative 'vendor/rollbar_interpolation'
8
10
  require_relative 'vendor/rollbar_log'
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Vendor
5
5
  module Version
6
- STRING = '0.6.0'
6
+ STRING = '0.8.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-vendor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danilo Cabello
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-03-10 00:00:00.000000000 Z
13
+ date: 2022-01-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -82,6 +82,9 @@ files:
82
82
  - README.md
83
83
  - config/default.yml
84
84
  - lib/rubocop-vendor.rb
85
+ - lib/rubocop/cop/vendor/base.rb
86
+ - lib/rubocop/cop/vendor/recursive_open_struct_gem.rb
87
+ - lib/rubocop/cop/vendor/recursive_open_struct_use.rb
85
88
  - lib/rubocop/cop/vendor/rollbar_inside_rescue.rb
86
89
  - lib/rubocop/cop/vendor/rollbar_interpolation.rb
87
90
  - lib/rubocop/cop/vendor/rollbar_log.rb
@@ -96,10 +99,11 @@ licenses:
96
99
  - MIT
97
100
  metadata:
98
101
  homepage_uri: https://rubocop-vendor.readthedocs.io/
99
- changelog_uri: https://github.com/wealthsimple/rubocop-vendor/blob/master/CHANGELOG.md
102
+ changelog_uri: https://github.com/wealthsimple/rubocop-vendor/blob/main/CHANGELOG.md
100
103
  source_code_uri: https://github.com/wealthsimple/rubocop-vendor/
101
104
  documentation_uri: https://rubocop-vendor.readthedocs.io/
102
105
  bug_tracker_uri: https://github.com/wealthsimple/rubocop-vendor/issues
106
+ rubygems_mfa_required: 'true'
103
107
  post_install_message:
104
108
  rdoc_options: []
105
109
  require_paths:
@@ -108,14 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
112
  requirements:
109
113
  - - ">="
110
114
  - !ruby/object:Gem::Version
111
- version: '2.4'
115
+ version: '2.7'
112
116
  required_rubygems_version: !ruby/object:Gem::Requirement
113
117
  requirements:
114
118
  - - ">="
115
119
  - !ruby/object:Gem::Version
116
120
  version: '0'
117
121
  requirements: []
118
- rubygems_version: 3.0.3
122
+ rubygems_version: 3.1.6
119
123
  signing_key:
120
124
  specification_version: 4
121
125
  summary: Automatic vendor integration checking tool for Ruby code.