visualize_packwerk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +32 -0
  3. data/lib/visualize_packwerk/graph_interface.rb +17 -0
  4. data/lib/visualize_packwerk/node_interface.rb +29 -0
  5. data/lib/visualize_packwerk/package_graph.rb +48 -0
  6. data/lib/visualize_packwerk/package_node.rb +28 -0
  7. data/lib/visualize_packwerk/package_relationships.rb +158 -0
  8. data/lib/visualize_packwerk/railtie.rb +15 -0
  9. data/lib/visualize_packwerk/tasks/visualize_packwerk.rake +73 -0
  10. data/lib/visualize_packwerk/team_graph.rb +52 -0
  11. data/lib/visualize_packwerk/team_node.rb +27 -0
  12. data/lib/visualize_packwerk.rb +17 -0
  13. data/sorbet/config +2 -0
  14. data/sorbet/rbi/gems/activesupport@7.0.3.1.rbi +76 -0
  15. data/sorbet/rbi/gems/ast@2.4.2.rbi +522 -0
  16. data/sorbet/rbi/gems/code_ownership@1.28.0.rbi +411 -0
  17. data/sorbet/rbi/gems/code_teams@1.0.0.rbi +138 -0
  18. data/sorbet/rbi/gems/coderay@1.1.3.rbi +8 -0
  19. data/sorbet/rbi/gems/concurrent-ruby@1.1.10.rbi +8 -0
  20. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +866 -0
  21. data/sorbet/rbi/gems/i18n@1.12.0.rbi +8 -0
  22. data/sorbet/rbi/gems/json@2.6.2.rbi +1423 -0
  23. data/sorbet/rbi/gems/method_source@1.0.0.rbi +8 -0
  24. data/sorbet/rbi/gems/minitest@5.16.2.rbi +9 -0
  25. data/sorbet/rbi/gems/package_protections@1.3.0.rbi +654 -0
  26. data/sorbet/rbi/gems/parallel@1.22.1.rbi +163 -0
  27. data/sorbet/rbi/gems/parse_packwerk@0.11.0.rbi +148 -0
  28. data/sorbet/rbi/gems/parser@3.1.2.0.rbi +4261 -0
  29. data/sorbet/rbi/gems/pry@0.14.1.rbi +8 -0
  30. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +8 -0
  31. data/sorbet/rbi/gems/rake@13.0.6.rbi +1854 -0
  32. data/sorbet/rbi/gems/rbi@0.0.15.rbi +2340 -0
  33. data/sorbet/rbi/gems/regexp_parser@2.5.0.rbi +8 -0
  34. data/sorbet/rbi/gems/rexml@3.2.5.rbi +8 -0
  35. data/sorbet/rbi/gems/rspec-core@3.11.0.rbi +7698 -0
  36. data/sorbet/rbi/gems/rspec-expectations@3.11.0.rbi +6201 -0
  37. data/sorbet/rbi/gems/rspec-mocks@3.11.1.rbi +3625 -0
  38. data/sorbet/rbi/gems/rspec-support@3.11.0.rbi +1176 -0
  39. data/sorbet/rbi/gems/rspec@3.11.0.rbi +40 -0
  40. data/sorbet/rbi/gems/rubocop-ast@1.19.1.rbi +8 -0
  41. data/sorbet/rbi/gems/rubocop-sorbet@0.6.11.rbi +8 -0
  42. data/sorbet/rbi/gems/rubocop@1.33.0.rbi +8 -0
  43. data/sorbet/rbi/gems/ruby-graphviz@1.2.5.rbi +840 -0
  44. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +8 -0
  45. data/sorbet/rbi/gems/spoom@1.1.11.rbi +1600 -0
  46. data/sorbet/rbi/gems/tapioca@0.8.3.rbi +1978 -0
  47. data/sorbet/rbi/gems/thor@1.2.1.rbi +2921 -0
  48. data/sorbet/rbi/gems/tzinfo@2.0.5.rbi +8 -0
  49. data/sorbet/rbi/gems/unicode-display_width@2.2.0.rbi +8 -0
  50. data/sorbet/rbi/gems/unparser@0.6.5.rbi +8 -0
  51. data/sorbet/rbi/gems/webrick@1.7.0.rbi +1802 -0
  52. data/sorbet/rbi/gems/yard-sorbet@0.6.1.rbi +288 -0
  53. data/sorbet/rbi/gems/yard@0.9.28.rbi +12863 -0
  54. data/sorbet/tapioca/config.yml +13 -0
  55. data/sorbet/tapioca/require.rb +7 -0
  56. metadata +241 -0
@@ -0,0 +1,8 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `method_source` gem.
5
+ # Please instead update this file by running `bin/tapioca gem method_source`.
6
+
7
+ # THIS IS AN EMPTY RBI FILE.
8
+ # see https://github.com/Shopify/tapioca/wiki/Manual-Gem-Requires
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `minitest` gem.
5
+ # Please instead update this file by running `bin/tapioca gem minitest`.
6
+
7
+ class Integer < ::Numeric
8
+ include ::JSON::Ext::Generator::GeneratorMethods::Integer
9
+ end
@@ -0,0 +1,654 @@
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This is an autogenerated file for types exported from the `package_protections` gem.
5
+ # Please instead update this file by running `bin/tapioca gem package_protections`.
6
+
7
+ # Welcome to PackageProtections!
8
+ # See https://github.com/rubyatscale/package_protections#readme for more info
9
+ #
10
+ # This file is a reference for the available API to `package_protections`, but all implementation details are private
11
+ # (which is why we delegate to `Private` for the actual implementation).
12
+ module PackageProtections
13
+ class << self
14
+ sig { returns(T::Array[::PackageProtections::ProtectionInterface]) }
15
+ def all; end
16
+
17
+ sig { void }
18
+ def bust_cache!; end
19
+
20
+ # @yield [Private.config]
21
+ sig { params(blk: T.proc.params(arg0: ::PackageProtections::Private::Configuration).void).void }
22
+ def configure(&blk); end
23
+
24
+ # This returns an array of a `Offense` which is how we represent the outcome of attempting to protect one or more packages,
25
+ # each of which is configured with different violation behaviors for each protection.
26
+ sig do
27
+ params(
28
+ packages: T::Array[::ParsePackwerk::Package],
29
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
30
+ ).returns(T::Array[::PackageProtections::Offense])
31
+ end
32
+ def get_offenses(packages:, new_violations:); end
33
+
34
+ sig do
35
+ params(
36
+ package_names: T::Array[::String],
37
+ all_packages: T::Array[::ParsePackwerk::Package]
38
+ ).returns(T::Array[::ParsePackwerk::Package])
39
+ end
40
+ def packages_for_names(package_names, all_packages); end
41
+
42
+ # Do not use this method -- it's meant to be used by Rubocop cops to get directory-specific
43
+ # parameters without needing to have directory-specific .rubocop.yml files.
44
+ sig { params(identifier: ::String).returns(T::Hash[T.untyped, T.untyped]) }
45
+ def private_cop_config(identifier); end
46
+
47
+ # Why do we use Bundler.root here?
48
+ # The reason is that this function is evaluated in `.client_rubocop.yml`, so when rubocop evaluates the
49
+ # YML and parses the ERB, the working directory is inside this gem. We need to make sure it's at the root of the
50
+ # application so that we can find all of the packwerk packages.
51
+ # We use Bundler.root to get the root because:
52
+ # A) We expect it to be reliable
53
+ # B) We expect the client to be running bundle exec rubocop, which is typically done at the root, and also means
54
+ # the client already has this dependency.
55
+ sig { params(root_pathname: ::Pathname).returns(::String) }
56
+ def rubocop_yml(root_pathname: T.unsafe(nil)); end
57
+
58
+ # PackageProtections.set_defaults! sets any unset protections to their default enforcement
59
+ sig do
60
+ params(
61
+ packages: T::Array[::ParsePackwerk::Package],
62
+ protection_identifiers: T::Array[::String],
63
+ verbose: T::Boolean
64
+ ).void
65
+ end
66
+ def set_defaults!(packages, protection_identifiers: T.unsafe(nil), verbose: T.unsafe(nil)); end
67
+
68
+ # This is a fast way to get a protection given an identifier
69
+ sig { params(identifier: ::String).returns(::PackageProtections::ProtectionInterface) }
70
+ def with_identifier(identifier); end
71
+ end
72
+ end
73
+
74
+ PackageProtections::EXPECTED_PACK_DIRECTORIES = T.let(T.unsafe(nil), Array)
75
+
76
+ # A protection identifier is just a string that identifies the name of the protection within a `package.yml`
77
+ PackageProtections::Identifier = T.type_alias { ::String }
78
+
79
+ # This is currently the only handled exception that `PackageProtections` will throw.
80
+ class PackageProtections::IncorrectPublicApiUsageError < ::StandardError; end
81
+
82
+ class PackageProtections::Offense < ::T::Struct
83
+ const :file, ::String
84
+ const :message, ::String
85
+ const :package, ::ParsePackwerk::Package
86
+ const :violation_type, ::String
87
+
88
+ sig { returns(::String) }
89
+ def package_name; end
90
+
91
+ class << self
92
+ def inherited(s); end
93
+ end
94
+ end
95
+
96
+ PackageProtections::PROTECTIONS_TODO_YML = T.let(T.unsafe(nil), String)
97
+
98
+ # Perhaps this should be in ParsePackwerk. For now, this is here to help us break down violations per file.
99
+ # This is analogous to `Packwerk::ReferenceOffense`
100
+ class PackageProtections::PerFileViolation < ::T::Struct
101
+ const :class_name, ::String
102
+ const :constant_source_package, ::String
103
+ const :filepath, ::String
104
+ const :reference_source_package, ::ParsePackwerk::Package
105
+ const :type, ::String
106
+
107
+ sig { returns(T::Boolean) }
108
+ def dependency?; end
109
+
110
+ sig { returns(T::Boolean) }
111
+ def privacy?; end
112
+
113
+ class << self
114
+ sig do
115
+ params(
116
+ violation: ::ParsePackwerk::Violation,
117
+ reference_source_package: ::ParsePackwerk::Package
118
+ ).returns(T::Array[::PackageProtections::PerFileViolation])
119
+ end
120
+ def from(violation, reference_source_package); end
121
+
122
+ def inherited(s); end
123
+ end
124
+ end
125
+
126
+ # This module cannot be accessed by clients of `PackageProtections` -- only within the `PackageProtections` module itself.
127
+ # All implementation details are in here to keep the main `PackageProtections` module easily scannable and to keep the private things private.
128
+ module PackageProtections::Private
129
+ class << self
130
+ sig { returns(T::Array[::PackageProtections::ProtectedPackage]) }
131
+ def all_protected_packages; end
132
+
133
+ sig { void }
134
+ def bust_cache!; end
135
+
136
+ sig { returns(::PackageProtections::Private::Configuration) }
137
+ def config; end
138
+
139
+ sig do
140
+ params(
141
+ packages: T::Array[::ParsePackwerk::Package],
142
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
143
+ ).returns(T::Array[::PackageProtections::Offense])
144
+ end
145
+ def get_offenses(packages:, new_violations:); end
146
+
147
+ sig { params(name: ::String).returns(::PackageProtections::ProtectedPackage) }
148
+ def get_package_with_name(name); end
149
+
150
+ sig do
151
+ params(
152
+ package_names: T::Array[::String],
153
+ all_packages: T::Array[::ParsePackwerk::Package]
154
+ ).returns(T::Array[::ParsePackwerk::Package])
155
+ end
156
+ def packages_for_names(package_names, all_packages); end
157
+
158
+ sig { params(identifier: ::String).returns(T::Hash[T.untyped, T.untyped]) }
159
+ def private_cop_config(identifier); end
160
+
161
+ sig { params(root_pathname: ::Pathname).returns(::String) }
162
+ def rubocop_yml(root_pathname:); end
163
+
164
+ sig do
165
+ params(
166
+ packages: T::Array[::ParsePackwerk::Package],
167
+ protection_identifiers: T::Array[::String],
168
+ verbose: T::Boolean
169
+ ).void
170
+ end
171
+ def set_defaults!(packages, protection_identifiers:, verbose:); end
172
+ end
173
+ end
174
+
175
+ class PackageProtections::Private::ColorizedString
176
+ sig { params(original_string: ::String, color: ::PackageProtections::Private::ColorizedString::Color).void }
177
+ def initialize(original_string, color = T.unsafe(nil)); end
178
+
179
+ sig { returns(::PackageProtections::Private::ColorizedString) }
180
+ def blue; end
181
+
182
+ sig { returns(::String) }
183
+ def colorized_to_s; end
184
+
185
+ sig { returns(::PackageProtections::Private::ColorizedString) }
186
+ def green; end
187
+
188
+ sig { returns(::PackageProtections::Private::ColorizedString) }
189
+ def light_blue; end
190
+
191
+ sig { returns(::PackageProtections::Private::ColorizedString) }
192
+ def pink; end
193
+
194
+ sig { returns(::PackageProtections::Private::ColorizedString) }
195
+ def red; end
196
+
197
+ sig { returns(::String) }
198
+ def to_s; end
199
+
200
+ sig { returns(::PackageProtections::Private::ColorizedString) }
201
+ def white; end
202
+
203
+ sig { returns(::PackageProtections::Private::ColorizedString) }
204
+ def yellow; end
205
+
206
+ private
207
+
208
+ sig { returns(::Integer) }
209
+ def color_code; end
210
+
211
+ sig do
212
+ params(
213
+ color: ::PackageProtections::Private::ColorizedString::Color
214
+ ).returns(::PackageProtections::Private::ColorizedString)
215
+ end
216
+ def colorize(color); end
217
+ end
218
+
219
+ class PackageProtections::Private::ColorizedString::Color < ::T::Enum
220
+ enums do
221
+ Black = new
222
+ Red = new
223
+ Green = new
224
+ Yellow = new
225
+ Blue = new
226
+ Pink = new
227
+ LightBlue = new
228
+ White = new
229
+ end
230
+ end
231
+
232
+ class PackageProtections::Private::Configuration
233
+ sig { void }
234
+ def initialize; end
235
+
236
+ sig { void }
237
+ def bust_cache!; end
238
+
239
+ sig { returns(T::Array[::PackageProtections::ProtectionInterface]) }
240
+ def default_protections; end
241
+
242
+ sig { returns(T::Array[::PackageProtections::ProtectionInterface]) }
243
+ def protections; end
244
+
245
+ sig { params(protections: T::Array[::PackageProtections::ProtectionInterface]).void }
246
+ def protections=(protections); end
247
+ end
248
+
249
+ class PackageProtections::Private::IncomingPrivacyProtection
250
+ include ::PackageProtections::ProtectionInterface
251
+
252
+ sig do
253
+ override
254
+ .params(
255
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage]
256
+ ).returns(T::Array[::PackageProtections::Offense])
257
+ end
258
+ def get_offenses_for_existing_violations(protected_packages); end
259
+
260
+ sig do
261
+ override
262
+ .params(
263
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
264
+ ).returns(T::Array[::PackageProtections::Offense])
265
+ end
266
+ def get_offenses_for_new_violations(new_violations); end
267
+
268
+ sig { override.returns(::String) }
269
+ def humanized_protection_description; end
270
+
271
+ sig { override.returns(::String) }
272
+ def humanized_protection_name; end
273
+
274
+ sig { override.returns(::String) }
275
+ def identifier; end
276
+
277
+ sig do
278
+ override
279
+ .params(
280
+ behavior: ::PackageProtections::ViolationBehavior,
281
+ package: ::ParsePackwerk::Package
282
+ ).returns(T.nilable(::String))
283
+ end
284
+ def unmet_preconditions_for_behavior(behavior, package); end
285
+
286
+ private
287
+
288
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
289
+ def message_for_fail_on_any(per_file_violation); end
290
+
291
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
292
+ def message_for_fail_on_new(per_file_violation); end
293
+ end
294
+
295
+ PackageProtections::Private::IncomingPrivacyProtection::IDENTIFIER = T.let(T.unsafe(nil), String)
296
+
297
+ class PackageProtections::Private::MetadataModifiers
298
+ class << self
299
+ sig do
300
+ params(
301
+ package: ::ParsePackwerk::Package,
302
+ protection_identifier: ::String,
303
+ violation_behavior: ::PackageProtections::ViolationBehavior
304
+ ).returns(::ParsePackwerk::Package)
305
+ end
306
+ def package_with_modified_protection(package, protection_identifier, violation_behavior); end
307
+ end
308
+ end
309
+
310
+ class PackageProtections::Private::OutgoingDependencyProtection
311
+ include ::PackageProtections::ProtectionInterface
312
+
313
+ sig do
314
+ override
315
+ .params(
316
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage]
317
+ ).returns(T::Array[::PackageProtections::Offense])
318
+ end
319
+ def get_offenses_for_existing_violations(protected_packages); end
320
+
321
+ sig do
322
+ override
323
+ .params(
324
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
325
+ ).returns(T::Array[::PackageProtections::Offense])
326
+ end
327
+ def get_offenses_for_new_violations(new_violations); end
328
+
329
+ sig { override.returns(::String) }
330
+ def humanized_protection_description; end
331
+
332
+ sig { override.returns(::String) }
333
+ def humanized_protection_name; end
334
+
335
+ sig { override.returns(::String) }
336
+ def identifier; end
337
+
338
+ sig do
339
+ override
340
+ .params(
341
+ behavior: ::PackageProtections::ViolationBehavior,
342
+ package: ::ParsePackwerk::Package
343
+ ).returns(T.nilable(::String))
344
+ end
345
+ def unmet_preconditions_for_behavior(behavior, package); end
346
+
347
+ private
348
+
349
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
350
+ def message_for_fail_on_any(per_file_violation); end
351
+
352
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
353
+ def message_for_fail_on_new(per_file_violation); end
354
+ end
355
+
356
+ PackageProtections::Private::OutgoingDependencyProtection::IDENTIFIER = T.let(T.unsafe(nil), String)
357
+
358
+ class PackageProtections::Private::Output
359
+ class << self
360
+ sig { params(str: ::String).void }
361
+ def p(str); end
362
+
363
+ sig { params(str: ::PackageProtections::Private::ColorizedString, colorized: T::Boolean).void }
364
+ def p_colorized(str, colorized:); end
365
+ end
366
+ end
367
+
368
+ class PackageProtections::Private::VisibilityProtection
369
+ include ::PackageProtections::ProtectionInterface
370
+
371
+ # By default, this protection does not show up when creating a new package, and its default behavior is FailNever
372
+ # A package that uses this protection is not considered strictly better -- in general, we want to design packages that
373
+ # are consumable by all packages. Therefore, a package that is consumable by all packages is the happy path.
374
+ #
375
+ # If a user wants to turn on package visibility, they must do it explicitly.
376
+ sig { returns(::PackageProtections::ViolationBehavior) }
377
+ def default_behavior; end
378
+
379
+ sig do
380
+ override
381
+ .params(
382
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage]
383
+ ).returns(T::Array[::PackageProtections::Offense])
384
+ end
385
+ def get_offenses_for_existing_violations(protected_packages); end
386
+
387
+ sig do
388
+ override
389
+ .params(
390
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
391
+ ).returns(T::Array[::PackageProtections::Offense])
392
+ end
393
+ def get_offenses_for_new_violations(new_violations); end
394
+
395
+ sig { override.returns(::String) }
396
+ def humanized_protection_description; end
397
+
398
+ sig { override.returns(::String) }
399
+ def humanized_protection_name; end
400
+
401
+ sig { override.returns(::String) }
402
+ def identifier; end
403
+
404
+ sig do
405
+ override
406
+ .params(
407
+ behavior: ::PackageProtections::ViolationBehavior,
408
+ package: ::ParsePackwerk::Package
409
+ ).returns(T.nilable(::String))
410
+ end
411
+ def unmet_preconditions_for_behavior(behavior, package); end
412
+
413
+ private
414
+
415
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
416
+ def message_for_fail_on_any(per_file_violation); end
417
+
418
+ sig { params(per_file_violation: ::PackageProtections::PerFileViolation).returns(::String) }
419
+ def message_for_fail_on_new(per_file_violation); end
420
+ end
421
+
422
+ PackageProtections::Private::VisibilityProtection::IDENTIFIER = T.let(T.unsafe(nil), String)
423
+
424
+ class PackageProtections::ProtectedPackage < ::T::Struct
425
+ const :deprecated_references, ::ParsePackwerk::DeprecatedReferences
426
+ const :original_package, ::ParsePackwerk::Package
427
+ const :protections, T::Hash[::String, ::PackageProtections::ViolationBehavior]
428
+
429
+ sig { returns(T::Array[::String]) }
430
+ def dependencies; end
431
+
432
+ sig { returns(T::Hash[T.untyped, T.untyped]) }
433
+ def metadata; end
434
+
435
+ sig { returns(::String) }
436
+ def name; end
437
+
438
+ sig { params(key: ::String).returns(::PackageProtections::ViolationBehavior) }
439
+ def violation_behavior_for(key); end
440
+
441
+ sig { returns(T::Array[::ParsePackwerk::Violation]) }
442
+ def violations; end
443
+
444
+ sig { returns(T::Set[::String]) }
445
+ def visible_to; end
446
+
447
+ sig { returns(::Pathname) }
448
+ def yml; end
449
+
450
+ class << self
451
+ sig { params(original_package: ::ParsePackwerk::Package).returns(::PackageProtections::ProtectedPackage) }
452
+ def from(original_package); end
453
+
454
+ sig do
455
+ params(
456
+ protection: ::PackageProtections::ProtectionInterface,
457
+ metadata: T::Hash[T.untyped, T.untyped],
458
+ package: ::ParsePackwerk::Package
459
+ ).returns(::PackageProtections::ViolationBehavior)
460
+ end
461
+ def get_violation_behavior(protection, metadata, package); end
462
+
463
+ def inherited(s); end
464
+ end
465
+ end
466
+
467
+ # @abstract Subclasses must implement the `abstract` methods below.
468
+ module PackageProtections::ProtectionInterface
469
+ requires_ancestor { Kernel }
470
+
471
+ abstract!
472
+
473
+ sig { returns(::PackageProtections::ViolationBehavior) }
474
+ def default_behavior; end
475
+
476
+ sig do
477
+ params(
478
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage],
479
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
480
+ ).returns(T::Array[::PackageProtections::Offense])
481
+ end
482
+ def get_offenses(protected_packages, new_violations); end
483
+
484
+ # @abstract
485
+ sig do
486
+ abstract
487
+ .params(
488
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage]
489
+ ).returns(T::Array[::PackageProtections::Offense])
490
+ end
491
+ def get_offenses_for_existing_violations(protected_packages); end
492
+
493
+ # @abstract
494
+ sig do
495
+ abstract
496
+ .params(
497
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
498
+ ).returns(T::Array[::PackageProtections::Offense])
499
+ end
500
+ def get_offenses_for_new_violations(new_violations); end
501
+
502
+ # @abstract
503
+ sig { abstract.returns(::String) }
504
+ def humanized_protection_description; end
505
+
506
+ # @abstract
507
+ sig { abstract.returns(::String) }
508
+ def humanized_protection_name; end
509
+
510
+ # @abstract
511
+ sig { abstract.returns(::String) }
512
+ def identifier; end
513
+
514
+ sig do
515
+ params(
516
+ behavior: ::PackageProtections::ViolationBehavior,
517
+ package: ::ParsePackwerk::Package
518
+ ).returns(T::Boolean)
519
+ end
520
+ def supports_violation_behavior?(behavior, package); end
521
+
522
+ # @abstract
523
+ sig do
524
+ abstract
525
+ .params(
526
+ behavior: ::PackageProtections::ViolationBehavior,
527
+ package: ::ParsePackwerk::Package
528
+ ).returns(T.nilable(::String))
529
+ end
530
+ def unmet_preconditions_for_behavior(behavior, package); end
531
+ end
532
+
533
+ # @abstract Subclasses must implement the `abstract` methods below.
534
+ module PackageProtections::RubocopProtectionInterface
535
+ include ::PackageProtections::ProtectionInterface
536
+
537
+ abstract!
538
+
539
+ sig do
540
+ params(
541
+ packages: T::Array[::PackageProtections::ProtectedPackage]
542
+ ).returns(T::Array[::PackageProtections::RubocopProtectionInterface::CopConfig])
543
+ end
544
+ def cop_configs(packages); end
545
+
546
+ # Abstract Methods: These are methods that the client needs to implement
547
+ #
548
+ # @abstract
549
+ sig { abstract.returns(::String) }
550
+ def cop_name; end
551
+
552
+ # Overriddable Methods: These are methods that the client can override,
553
+ # but a default is provided.
554
+ sig { params(package: ::PackageProtections::ProtectedPackage).returns(T::Hash[T.untyped, T.untyped]) }
555
+ def custom_cop_config(package); end
556
+
557
+ sig do
558
+ override
559
+ .params(
560
+ protected_packages: T::Array[::PackageProtections::ProtectedPackage]
561
+ ).returns(T::Array[::PackageProtections::Offense])
562
+ end
563
+ def get_offenses_for_existing_violations(protected_packages); end
564
+
565
+ sig do
566
+ override
567
+ .params(
568
+ new_violations: T::Array[::PackageProtections::PerFileViolation]
569
+ ).returns(T::Array[::PackageProtections::Offense])
570
+ end
571
+ def get_offenses_for_new_violations(new_violations); end
572
+
573
+ # @abstract
574
+ sig { abstract.returns(T::Array[::String]) }
575
+ def included_globs_for_pack; end
576
+
577
+ # @abstract
578
+ sig { abstract.params(file: ::String).returns(::String) }
579
+ def message_for_fail_on_any(file); end
580
+
581
+ sig do
582
+ override
583
+ .params(
584
+ behavior: ::PackageProtections::ViolationBehavior,
585
+ package: ::ParsePackwerk::Package
586
+ ).returns(T.nilable(::String))
587
+ end
588
+ def unmet_preconditions_for_behavior(behavior, package); end
589
+
590
+ private
591
+
592
+ sig { params(rule: ::String).returns(T::Set[::String]) }
593
+ def exclude_for_rule(rule); end
594
+
595
+ class << self
596
+ sig { void }
597
+ def bust_rubocop_todo_yml_cache; end
598
+
599
+ sig { returns(T.untyped) }
600
+ def rubocop_todo_yml; end
601
+ end
602
+ end
603
+
604
+ class PackageProtections::RubocopProtectionInterface::CopConfig < ::T::Struct
605
+ const :enabled, T::Boolean, default: T.unsafe(nil)
606
+ const :exclude_paths, T::Array[::String], default: T.unsafe(nil)
607
+ const :include_paths, T::Array[::String], default: T.unsafe(nil)
608
+ const :name, ::String
609
+
610
+ sig { returns(::String) }
611
+ def to_rubocop_yml_compatible_format; end
612
+
613
+ class << self
614
+ def inherited(s); end
615
+ end
616
+ end
617
+
618
+ class PackageProtections::ViolationBehavior < ::T::Enum
619
+ enums do
620
+ FailOnAny = new
621
+ FailOnNew = new
622
+ FailNever = new
623
+ end
624
+
625
+ sig { returns(T::Boolean) }
626
+ def enabled?; end
627
+
628
+ sig { returns(T::Boolean) }
629
+ def fail_never?; end
630
+
631
+ sig { returns(T::Boolean) }
632
+ def fail_on_any?; end
633
+
634
+ sig { returns(T::Boolean) }
635
+ def fail_on_new?; end
636
+
637
+ class << self
638
+ sig { params(value: T.untyped).returns(::PackageProtections::ViolationBehavior) }
639
+ def from_raw_value(value); end
640
+ end
641
+ end
642
+
643
+ RuboCop::Cop::PackageProtections::NamespacedUnderPackageName::IDENTIFIER = T.let(T.unsafe(nil), String)
644
+
645
+ # This inherits from `Sorbet::StrictSigil` and doesn't change any behavior of it.
646
+ # The only reason we do this is so that configuration for this cop can live under a different cop namespace.
647
+ # This prevents this cop's configuration from clashing with other configurations for the same cop.
648
+ # A concrete example of this would be if a user is using this package protection to make sure public APIs are typed,
649
+ # and separately the application as a whole requiring strict typing in certain parts of the application.
650
+ #
651
+ # To prevent problems associated with needing to manage identical configurations for the same cop, we simply call it
652
+ # something else in the context of this protection.
653
+ #
654
+ # We can apply this same pattern if we want to use other cops in the context of package protections and prevent clashing.