package_protections 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7471704e495c4ffe4e849be40a9fad64eed08e3980e9d630300eeae5c8e0d006
4
- data.tar.gz: dbb34a83f3b4f7ed1a3327d36ac2dd5191d17bba0206ebfa06344d056c35b43a
3
+ metadata.gz: 209662f8b4bb58c12b998627275107715b1b92f72250dd57275a830db2b3ee28
4
+ data.tar.gz: 72dfeeca3bc2e0d83af7d7274fb7574b9d50fa41df594a56673a997b7ca5c63f
5
5
  SHA512:
6
- metadata.gz: 77012017f0440763480a9f02ab289254870b9d937ff72cfa8f665331b04195cf01e1724562796d1a74414d38c855fa95710879d6efe105367792a3cf7b1bf60b
7
- data.tar.gz: 48cb93ff9ec6b2b4785587c795fb6571ff55ade4de471c93b38fa3244113b4d4b0ecd6f431d335754ad4d5c6e7d23e3ec6701c71d0fca1328848dcf5a1f27836
6
+ metadata.gz: f21c828d5523d288a4b4bbc297efc15ef54cbc8e34871d3338cbeccf12254b5c21e20613a22f7a950edaf27f4052b27db4ffc86d34378eb254760618895245d2
7
+ data.tar.gz: 6cf01a48f348a4d297a3153b6129bb139f78206d46daf29bc5b543a84debc309780645ddb6979e8375b8cdf8affcdd4f70af3eea02eb33d07a2445b3ec8f1ba9
@@ -35,8 +35,6 @@ module PackageProtections
35
35
 
36
36
  sig { returns(T::Array[ProtectionInterface]) }
37
37
  def default_protections
38
- require 'rubocop/cop/package_protections'
39
-
40
38
  [
41
39
  Private::OutgoingDependencyProtection.new,
42
40
  Private::IncomingPrivacyProtection.new,
@@ -117,6 +117,9 @@ module PackageProtections
117
117
  @protected_packages_indexed_by_name = nil
118
118
  @private_cop_config = nil
119
119
  PackageProtections.config.bust_cache!
120
+ # This comes explicitly after `PackageProtections.config.bust_cache!` because
121
+ # otherwise `PackageProtections.config` will attempt to reload the client configuratoin.
122
+ @loaded_client_configuration = false
120
123
  end
121
124
 
122
125
  sig { params(identifier: Identifier).returns(T::Hash[T.untyped, T.untyped]) }
@@ -128,6 +131,49 @@ module PackageProtections
128
131
  protected_packages.map { |p| [p.name, protection.custom_cop_config(p)] }.to_h
129
132
  end
130
133
  end
134
+
135
+ sig { returns(T::Array[T::Hash[T.untyped, T.untyped]]) }
136
+ def self.rubocop_todo_ymls
137
+ @rubocop_todo_ymls = T.let(@rubocop_todo_ymls, T.nilable(T::Array[T::Hash[T.untyped, T.untyped]]))
138
+ @rubocop_todo_ymls ||= begin
139
+ todo_files = Pathname.glob('**/.rubocop_todo.yml')
140
+ todo_files.map do |todo_file|
141
+ YAML.load_file(todo_file)
142
+ end
143
+ end
144
+ end
145
+
146
+ sig { void }
147
+ def self.bust_rubocop_todo_yml_cache
148
+ @rubocop_todo_ymls = nil
149
+ end
150
+
151
+ sig { params(rule: String).returns(T::Set[String]) }
152
+ def self.exclude_for_rule(rule)
153
+ excludes = T.let(Set.new, T::Set[String])
154
+
155
+ Private.rubocop_todo_ymls.each do |todo_yml|
156
+ config = todo_yml[rule]
157
+ next if config.nil?
158
+
159
+ exclude_list = config['Exclude']
160
+ next if exclude_list.nil?
161
+
162
+ excludes += exclude_list
163
+ end
164
+
165
+ excludes
166
+ end
167
+
168
+ sig { void }
169
+ def self.load_client_configuration
170
+ @loaded_client_configuration ||= T.let(false, T.nilable(T::Boolean))
171
+ return if @loaded_client_configuration
172
+
173
+ @loaded_client_configuration = true
174
+ client_configuration = Pathname.pwd.join('config/package_protections.rb')
175
+ require client_configuration.to_s if client_configuration.exist?
176
+ end
131
177
  end
132
178
 
133
179
  private_constant :Private
@@ -71,20 +71,7 @@ module PackageProtections
71
71
 
72
72
  sig { void }
73
73
  def self.bust_rubocop_todo_yml_cache
74
- @rubocop_todo_yml = nil
75
- end
76
-
77
- sig { returns(T.untyped) }
78
- def self.rubocop_todo_yml
79
- @rubocop_todo_yml = T.let(@rubocop_todo_yml, T.untyped)
80
- @rubocop_todo_yml ||= begin
81
- todo_file = Pathname.new('.rubocop_todo.yml')
82
- if todo_file.exist?
83
- YAML.load_file(todo_file)
84
- else
85
- {}
86
- end
87
- end
74
+ Private.bust_rubocop_todo_yml_cache
88
75
  end
89
76
 
90
77
  sig do
@@ -93,7 +80,7 @@ module PackageProtections
93
80
  ).returns(T::Array[Offense])
94
81
  end
95
82
  def get_offenses_for_existing_violations(protected_packages)
96
- exclude_list = exclude_for_rule(cop_name)
83
+ exclude_list = Private.exclude_for_rule(cop_name)
97
84
  offenses = []
98
85
 
99
86
  protected_packages.each do |package|
@@ -146,13 +133,5 @@ module PackageProtections
146
133
  )
147
134
  ]
148
135
  end
149
-
150
- private
151
-
152
- sig { params(rule: String).returns(T::Set[String]) }
153
- def exclude_for_rule(rule)
154
- rule_config = RubocopProtectionInterface.rubocop_todo_yml[rule] || {}
155
- Set.new(rule_config['Exclude'] || [])
156
- end
157
136
  end
158
137
  end
@@ -1,23 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # typed: strict
4
-
5
4
  require 'sorbet-runtime'
6
-
7
5
  require 'open3'
8
6
  require 'set'
9
7
  require 'parse_packwerk'
8
+ require 'rubocop'
9
+ require 'rubocop-sorbet'
10
10
 
11
- require 'zeitwerk'
12
- loader = T.unsafe(Zeitwerk::Loader).for_gem
13
- loader.ignore("#{__dir__}/rubocop")
14
- loader.setup
15
-
11
+ #
16
12
  # Welcome to PackageProtections!
17
13
  # See https://github.com/rubyatscale/package_protections#readme for more info
18
14
  #
19
15
  # This file is a reference for the available API to `package_protections`, but all implementation details are private
20
16
  # (which is why we delegate to `Private` for the actual implementation).
17
+ #
21
18
  module PackageProtections
22
19
  extend T::Sig
23
20
 
@@ -30,6 +27,18 @@ module PackageProtections
30
27
  # This is currently the only handled exception that `PackageProtections` will throw.
31
28
  class IncorrectPublicApiUsageError < StandardError; end
32
29
 
30
+ require 'package_protections/offense'
31
+ require 'package_protections/violation_behavior'
32
+ require 'package_protections/protected_package'
33
+ require 'package_protections/per_file_violation'
34
+ require 'package_protections/protection_interface'
35
+ require 'package_protections/rubocop_protection_interface'
36
+ require 'package_protections/private'
37
+
38
+ # Implementation of rubocop-based protections
39
+ require 'rubocop/cop/package_protections/namespaced_under_package_name'
40
+ require 'rubocop/cop/package_protections/typed_public_api'
41
+
33
42
  class << self
34
43
  extend T::Sig
35
44
 
@@ -46,6 +55,7 @@ module PackageProtections
46
55
 
47
56
  sig { returns(Private::Configuration) }
48
57
  def self.config
58
+ Private.load_client_configuration
49
59
  @config = T.let(@config, T.nilable(Private::Configuration))
50
60
  @config ||= Private::Configuration.new
51
61
  end
@@ -119,7 +129,3 @@ module PackageProtections
119
129
  RubocopProtectionInterface.bust_rubocop_todo_yml_cache
120
130
  end
121
131
  end
122
-
123
- if defined?(Rubocop)
124
- require 'rubocop/cop/package_protections'
125
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: package_protections
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-21 00:00:00.000000000 Z
11
+ date: 2022-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: zeitwerk
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -205,7 +191,6 @@ files:
205
191
  - lib/package_protections/rspec/support.rb
206
192
  - lib/package_protections/rubocop_protection_interface.rb
207
193
  - lib/package_protections/violation_behavior.rb
208
- - lib/rubocop/cop/package_protections.rb
209
194
  - lib/rubocop/cop/package_protections/namespaced_under_package_name.rb
210
195
  - lib/rubocop/cop/package_protections/namespaced_under_package_name/desired_zeitwerk_api.rb
211
196
  - lib/rubocop/cop/package_protections/typed_public_api.rb
@@ -1,13 +0,0 @@
1
- require 'rubocop'
2
- require 'rubocop-sorbet'
3
-
4
- module RuboCop
5
- module Cop
6
- module PackageProtections
7
- autoload :NamespacedUnderPackageName, 'rubocop/cop/package_protections/namespaced_under_package_name'
8
- autoload :TypedPublicApi, 'rubocop/cop/package_protections/typed_public_api'
9
- end
10
- end
11
- end
12
-
13
- # Implementation of rubocop-based protections