package_protections 0.64.0 → 0.65.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: f1b60522d3be3ff25aaab73a4c0e6d4d0585657663352b9c353d6df3307287c4
4
- data.tar.gz: 8b57faaea71bfb8b64f842b7e2ec40cdc313bc2c674243a698c9dc7bcbc21b56
3
+ metadata.gz: d88381cc31fe478662a2be25b85704c798c2b890aca03fd399d38c3e3e4036f7
4
+ data.tar.gz: d1451e08e65506b3524ae32eaad2b6e8375cf600e6b11bb381426fc0e15490fd
5
5
  SHA512:
6
- metadata.gz: e35ac2ae85c9459f3e480ba9939bf7e5db0902049c3643620e3ba2478a443c87dfe1ac1c9029254d7f616ac0d4821df3d07625e332a431349ff4860d5f46e64e
7
- data.tar.gz: c90972ea3fbf86c36ea1492948fa56cd42e2b38731f6e9410c69296286d43310e7104413ccb20206392e1546e3b82c23ea25ba16defe09960718b7dadb63189f
6
+ metadata.gz: fa85b6989d368a73734516df0e26bc5132024c70da4f4562db0ef868a289101441d640d8d39d65502696cd91dbf9066d5214cd10e20b4d19e894c6ef1372d251
7
+ data.tar.gz: a877190298f30b829e18f5626f15ac9af3175a852a339cb36b474e4760805c8e3265cc008cd7f4edb64917ba49231633faad7e6763a952ac493005849897fff8
data/README.md CHANGED
@@ -128,6 +128,18 @@ PackageProtections.set_defaults!(packages)
128
128
  PackageProtections.set_defaults!(packages.select{|p| p.package_name == 'packs/my_package'})
129
129
  ```
130
130
 
131
+ ## Custom Protections
132
+
133
+ It's possible to create your own custom protections that go through this interface. To do this, you just need to implement a protection and configure `PackageProtections`.
134
+
135
+ ```ruby
136
+ PackageProtections.configure do |config|
137
+ config.protections += [MyCustomProtection]
138
+ end
139
+ ```
140
+
141
+ In this example, `MyCustomProtection` needs to implement the `PackageProtections::ProtectionInterface` (for protections powered by `packwerk` that look at new and existing violations) OR `PackageProtections::RubocopProtectionInterface` (for protections powered by `rubocop` that look at the AST). It's recommended to take a look at the existing protections as examples. If you're having any trouble with this, please file an issue and we'll be glad to help.
142
+
131
143
  ## Incorporating into your CI Pipeline
132
144
  Your CI pipeline can execute the public API ta and fail if there are any offenses.
133
145
 
@@ -0,0 +1,38 @@
1
+ # typed: strict
2
+
3
+ module PackageProtections
4
+ module Private
5
+ class Configuration
6
+ extend T::Sig
7
+
8
+ sig { params(protections: T::Array[ProtectionInterface]).void }
9
+ attr_writer :protections
10
+
11
+ sig { void }
12
+ def initialize
13
+ @protections = T.let(default_protections, T::Array[ProtectionInterface])
14
+ end
15
+
16
+ sig { returns(T::Array[ProtectionInterface]) }
17
+ def protections
18
+ @protections
19
+ end
20
+
21
+ sig { void }
22
+ def bust_cache!
23
+ @protections = default_protections
24
+ end
25
+
26
+ sig { returns(T::Array[ProtectionInterface]) }
27
+ def default_protections
28
+ [
29
+ Private::OutgoingDependencyProtection.new,
30
+ Private::IncomingPrivacyProtection.new,
31
+ Private::TypedApiProtection.new,
32
+ Private::MultipleNamespacesProtection.new,
33
+ Private::VisibilityProtection.new
34
+ ]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -9,6 +9,7 @@ require 'package_protections/private/outgoing_dependency_protection'
9
9
  require 'package_protections/private/metadata_modifiers'
10
10
  require 'package_protections/private/multiple_namespaces_protection'
11
11
  require 'package_protections/private/visibility_protection'
12
+ require 'package_protections/private/configuration'
12
13
 
13
14
  module PackageProtections
14
15
  #
@@ -18,6 +19,12 @@ module PackageProtections
18
19
  module Private
19
20
  extend T::Sig
20
21
 
22
+ sig { returns(Private::Configuration) }
23
+ def self.config
24
+ @config = T.let(@config, T.nilable(Configuration))
25
+ @config ||= Private::Configuration.new
26
+ end
27
+
21
28
  sig do
22
29
  params(
23
30
  packages: T::Array[ParsePackwerk::Package],
@@ -138,6 +145,7 @@ module PackageProtections
138
145
  def self.bust_cache!
139
146
  @protected_packages_indexed_by_name = nil
140
147
  @private_cop_config = nil
148
+ config.bust_cache!
141
149
  end
142
150
 
143
151
  sig { params(identifier: Identifier).returns(T::Hash[T.untyped, T.untyped]) }
@@ -38,20 +38,18 @@ module PackageProtections
38
38
  # Implementation of rubocop-based protections
39
39
  require 'rubocop/cop/package_protections/namespaced_under_package_name'
40
40
 
41
- #
42
- # These are all of the concrete implementations of the `ProtectionInterface`.
43
- # This list is added to when a new protection is created, but in the future,
44
- # this list may be injected by the client.
45
- #
41
+ class << self
42
+ extend T::Sig
43
+
44
+ sig { params(blk: T.proc.params(arg0: Private::Configuration).void).void }
45
+ def configure(&blk)
46
+ yield(Private.config)
47
+ end
48
+ end
49
+
46
50
  sig { returns(T::Array[ProtectionInterface]) }
47
51
  def self.all
48
- [
49
- Private::OutgoingDependencyProtection.new,
50
- Private::IncomingPrivacyProtection.new,
51
- Private::TypedApiProtection.new,
52
- Private::MultipleNamespacesProtection.new,
53
- Private::VisibilityProtection.new
54
- ]
52
+ Private.config.protections
55
53
  end
56
54
 
57
55
  #
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: 0.64.0
4
+ version: 0.65.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-05-04 00:00:00.000000000 Z
11
+ date: 2022-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -178,6 +178,7 @@ files:
178
178
  - lib/package_protections/per_file_violation.rb
179
179
  - lib/package_protections/private.rb
180
180
  - lib/package_protections/private/colorized_string.rb
181
+ - lib/package_protections/private/configuration.rb
181
182
  - lib/package_protections/private/incoming_privacy_protection.rb
182
183
  - lib/package_protections/private/metadata_modifiers.rb
183
184
  - lib/package_protections/private/multiple_namespaces_protection.rb