modularization_statistics 1.33.0 → 1.36.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.
@@ -0,0 +1,109 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module ModularizationStatistics
5
+ module Private
6
+ module Metrics
7
+ class Packages
8
+ extend T::Sig
9
+
10
+ sig do
11
+ params(
12
+ packages: T::Array[ParsePackwerk::Package],
13
+ app_name: String
14
+ ).returns(T::Array[GaugeMetric])
15
+ end
16
+ def self.get_package_metrics(packages, app_name)
17
+ all_metrics = []
18
+ app_level_tag = Tag.for('app', app_name)
19
+ package_tags = T.let([app_level_tag], T::Array[Tag])
20
+ protected_packages = packages.map { |p| PackageProtections::ProtectedPackage.from(p) }
21
+
22
+ all_metrics << GaugeMetric.for('all_packages.count', packages.count, package_tags)
23
+ all_metrics << GaugeMetric.for('all_packages.dependencies.count', packages.sum { |package| package.dependencies.count }, package_tags)
24
+ all_metrics << GaugeMetric.for('all_packages.dependency_violations.count', protected_packages.sum { |package| Metrics.file_count(package.violations.select(&:dependency?)) }, package_tags)
25
+ all_metrics << GaugeMetric.for('all_packages.privacy_violations.count', protected_packages.sum { |package| Metrics.file_count(package.violations.select(&:privacy?)) }, package_tags)
26
+ all_metrics << GaugeMetric.for('all_packages.enforcing_dependencies.count', packages.count(&:enforces_dependencies?), package_tags)
27
+ all_metrics << GaugeMetric.for('all_packages.enforcing_privacy.count', packages.count(&:enforces_privacy?), package_tags)
28
+
29
+ all_metrics << GaugeMetric.for('all_packages.notify_on_package_yml_changes.count', packages.count { |p| p.metadata['notify_on_package_yml_changes'] }, package_tags)
30
+ all_metrics << GaugeMetric.for('all_packages.notify_on_new_violations.count', packages.count { |p| p.metadata['notify_on_new_violations'] }, package_tags)
31
+
32
+ all_metrics << GaugeMetric.for('all_packages.with_violations.count', protected_packages.count { |package| package.violations.any? }, package_tags)
33
+ all_metrics += Metrics::PublicUsage.get_public_usage_metrics('all_packages', packages, package_tags)
34
+ all_metrics << GaugeMetric.for('all_packages.has_readme.count', packages.count { |package| Metrics.has_readme?(package) }, package_tags)
35
+
36
+ all_metrics += Metrics::ProtectionUsage.get_protections_metrics('all_packages', protected_packages, package_tags)
37
+ all_metrics << GaugeMetric.for('all_packages.package_based_file_ownership.count', packages.count { |package| !package.metadata['owner'].nil? }, package_tags)
38
+
39
+ inbound_violations_by_package = protected_packages.flat_map(&:violations).group_by(&:to_package_name)
40
+
41
+ protected_packages.each do |protected_package|
42
+ package = protected_package.original_package
43
+ package_tags = Metrics.tags_for_package(package, app_name)
44
+
45
+ #
46
+ # VIOLATIONS (implicit dependencies)
47
+ #
48
+ outbound_violations = protected_package.violations
49
+ inbound_violations = inbound_violations_by_package[package.name] || []
50
+ all_dependency_violations = (outbound_violations + inbound_violations).select(&:dependency?)
51
+ all_privacy_violations = (outbound_violations + inbound_violations).select(&:privacy?)
52
+
53
+ all_metrics << GaugeMetric.for('by_package.dependency_violations.count', Metrics.file_count(all_dependency_violations), package_tags)
54
+ all_metrics << GaugeMetric.for('by_package.privacy_violations.count', Metrics.file_count(all_privacy_violations), package_tags)
55
+
56
+ all_metrics << GaugeMetric.for('by_package.outbound_dependency_violations.count', Metrics.file_count(outbound_violations.select(&:dependency?)), package_tags)
57
+ all_metrics << GaugeMetric.for('by_package.inbound_dependency_violations.count', Metrics.file_count(inbound_violations.select(&:dependency?)), package_tags)
58
+
59
+ all_metrics << GaugeMetric.for('by_package.outbound_privacy_violations.count', Metrics.file_count(outbound_violations.select(&:privacy?)), package_tags)
60
+ all_metrics << GaugeMetric.for('by_package.inbound_privacy_violations.count', Metrics.file_count(inbound_violations.select(&:privacy?)), package_tags)
61
+
62
+ all_metrics += Metrics::PublicUsage.get_public_usage_metrics('by_package', [package], package_tags)
63
+
64
+ protected_package.violations.group_by(&:to_package_name).each do |to_package_name, violations|
65
+ to_package = ParsePackwerk.find(to_package_name)
66
+ if to_package.nil?
67
+ raise StandardError, "Could not find matching package #{to_package_name}"
68
+ end
69
+
70
+ tags = package_tags + [Tag.for('to_package', Metrics.humanized_package_name(to_package_name))] + Metrics.tags_for_to_team(CodeOwnership.for_package(to_package)&.name)
71
+ all_metrics << GaugeMetric.for('by_package.outbound_dependency_violations.per_package.count', Metrics.file_count(violations.select(&:dependency?)), tags)
72
+ all_metrics << GaugeMetric.for('by_package.outbound_privacy_violations.per_package.count', Metrics.file_count(violations.select(&:privacy?)), tags)
73
+ end
74
+ end
75
+
76
+ inbound_explicit_dependency_by_package = {}
77
+ packages.each do |package|
78
+ package.dependencies.each do |explicit_dependency|
79
+ inbound_explicit_dependency_by_package[explicit_dependency] ||= []
80
+ inbound_explicit_dependency_by_package[explicit_dependency] << package.name
81
+ end
82
+ end
83
+
84
+ packages.each do |package| # rubocop:disable Style/CombinableLoops
85
+ package_tags = Metrics.tags_for_package(package, app_name)
86
+
87
+ #
88
+ # EXPLICIT DEPENDENCIES
89
+ #
90
+ package.dependencies.each do |explicit_dependency|
91
+ to_package = ParsePackwerk.find(explicit_dependency)
92
+ if to_package.nil?
93
+ raise StandardError, "Could not find matching package #{explicit_dependency}"
94
+ end
95
+
96
+ tags = package_tags + [Tag.for('to_package', Metrics.humanized_package_name(explicit_dependency))] + Metrics.tags_for_to_team(CodeOwnership.for_package(to_package)&.name)
97
+ all_metrics << GaugeMetric.for('by_package.outbound_explicit_dependencies.per_package.count', 1, tags)
98
+ end
99
+
100
+ all_metrics << GaugeMetric.for('by_package.outbound_explicit_dependencies.count', package.dependencies.count, package_tags)
101
+ all_metrics << GaugeMetric.for('by_package.inbound_explicit_dependencies.count', inbound_explicit_dependency_by_package[package.name]&.count || 0, package_tags)
102
+ end
103
+
104
+ all_metrics
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,73 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module ModularizationStatistics
5
+ module Private
6
+ module Metrics
7
+ class PackagesByTeam
8
+ extend T::Sig
9
+
10
+ sig do
11
+ params(
12
+ all_packages: T::Array[ParsePackwerk::Package],
13
+ app_name: String
14
+ ).returns(T::Array[GaugeMetric])
15
+ end
16
+ def self.get_package_metrics_by_team(all_packages, app_name)
17
+ all_metrics = T.let([], T::Array[GaugeMetric])
18
+ app_level_tag = Tag.for('app', app_name)
19
+ all_protected_packages = all_packages.map { |p| PackageProtections::ProtectedPackage.from(p) }
20
+ all_protected_packages.group_by { |protected_package| CodeOwnership.for_package(protected_package.original_package)&.name }.each do |team_name, protected_packages_by_team|
21
+ # We look at `all_packages` because we care about ALL inbound violations across all teams
22
+ inbound_violations_by_package = all_protected_packages.flat_map(&:violations).group_by(&:to_package_name)
23
+
24
+ team_tags = Metrics.tags_for_team(team_name) + [app_level_tag]
25
+ all_metrics << GaugeMetric.for('by_team.all_packages.count', protected_packages_by_team.count, team_tags)
26
+ all_metrics += Metrics::ProtectionUsage.get_protections_metrics('by_team', protected_packages_by_team, team_tags)
27
+ all_metrics += Metrics::PublicUsage.get_public_usage_metrics('by_team', protected_packages_by_team.map(&:original_package), team_tags)
28
+
29
+ all_metrics << GaugeMetric.for('by_team.notify_on_package_yml_changes.count', protected_packages_by_team.count { |p| p.metadata['notify_on_package_yml_changes'] }, team_tags)
30
+ all_metrics << GaugeMetric.for('by_team.notify_on_new_violations.count', protected_packages_by_team.count { |p| p.metadata['notify_on_new_violations'] }, team_tags)
31
+
32
+ #
33
+ # VIOLATIONS (implicit dependencies)
34
+ #
35
+ outbound_violations = protected_packages_by_team.flat_map(&:violations)
36
+ # Here we only look at packages_by_team because we only care about inbound violations onto packages for this team
37
+ inbound_violations = protected_packages_by_team.flat_map { |package| inbound_violations_by_package[package.name] || [] }
38
+ all_dependency_violations = (outbound_violations + inbound_violations).select(&:dependency?)
39
+ all_privacy_violations = (outbound_violations + inbound_violations).select(&:privacy?)
40
+
41
+ all_metrics << GaugeMetric.for('by_team.dependency_violations.count', Metrics.file_count(all_dependency_violations), team_tags)
42
+ all_metrics << GaugeMetric.for('by_team.privacy_violations.count', Metrics.file_count(all_privacy_violations), team_tags)
43
+
44
+ all_metrics << GaugeMetric.for('by_team.outbound_dependency_violations.count', Metrics.file_count(outbound_violations.select(&:dependency?)), team_tags)
45
+ all_metrics << GaugeMetric.for('by_team.inbound_dependency_violations.count', Metrics.file_count(inbound_violations.select(&:dependency?)), team_tags)
46
+
47
+ all_metrics << GaugeMetric.for('by_team.outbound_privacy_violations.count', Metrics.file_count(outbound_violations.select(&:privacy?)), team_tags)
48
+ all_metrics << GaugeMetric.for('by_team.inbound_privacy_violations.count', Metrics.file_count(inbound_violations.select(&:privacy?)), team_tags)
49
+
50
+ all_metrics << GaugeMetric.for('by_team.has_readme.count', protected_packages_by_team.count { |protected_package| Metrics.has_readme?(protected_package.original_package) }, team_tags)
51
+
52
+ grouped_outbound_violations = outbound_violations.group_by do |violation|
53
+ to_package = ParsePackwerk.find(violation.to_package_name)
54
+ if to_package.nil?
55
+ raise StandardError, "Could not find matching package #{violation.to_package_name}"
56
+ end
57
+
58
+ CodeOwnership.for_package(to_package)&.name
59
+ end
60
+
61
+ grouped_outbound_violations.each do |to_team_name, violations|
62
+ tags = team_tags + Metrics.tags_for_to_team(to_team_name)
63
+ all_metrics << GaugeMetric.for('by_team.outbound_dependency_violations.per_team.count', Metrics.file_count(violations.select(&:dependency?)), tags)
64
+ all_metrics << GaugeMetric.for('by_team.outbound_privacy_violations.per_team.count', Metrics.file_count(violations.select(&:privacy?)), tags)
65
+ end
66
+ end
67
+
68
+ all_metrics
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,33 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module ModularizationStatistics
5
+ module Private
6
+ module Metrics
7
+ class ProtectionUsage
8
+ extend T::Sig
9
+
10
+ sig { params(prefix: String, protected_packages: T::Array[PackageProtections::ProtectedPackage], package_tags: T::Array[Tag]).returns(T::Array[GaugeMetric]) }
11
+ def self.get_protections_metrics(prefix, protected_packages, package_tags)
12
+ PackageProtections.all.flat_map do |protection|
13
+ PackageProtections::ViolationBehavior.each_value.map do |violation_behavior|
14
+ # https://github.com/Gusto/package_protections/pull/42 changed the public API of these violation behaviors.
15
+ # To preserve our ability to understand historical trends, we map to the old values.
16
+ # This allows our dashboards to continue to operate as expected.
17
+ # Note if we ever open source mod stats, we should probably inject this behavior so that new clients can see the new keys in their metrics.
18
+ violation_behavior_map = {
19
+ PackageProtections::ViolationBehavior::FailOnAny => 'fail_the_build_on_any_instances',
20
+ PackageProtections::ViolationBehavior::FailNever => 'no',
21
+ PackageProtections::ViolationBehavior::FailOnNew => 'fail_the_build_if_new_instances_appear',
22
+ }
23
+ violation_behavior_name = violation_behavior_map[violation_behavior]
24
+ metric_name = "#{prefix}.#{protection.identifier}.#{violation_behavior_name}.count"
25
+ count_of_packages = protected_packages.count { |p| p.violation_behavior_for(protection.identifier) == violation_behavior }
26
+ GaugeMetric.for(metric_name, count_of_packages, package_tags)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module ModularizationStatistics
5
+ module Private
6
+ module Metrics
7
+ class PublicUsage
8
+ extend T::Sig
9
+
10
+ sig { params(prefix: String, packages: T::Array[ParsePackwerk::Package], package_tags: T::Array[Tag]).returns(T::Array[GaugeMetric]) }
11
+ def self.get_public_usage_metrics(prefix, packages, package_tags)
12
+ packages_except_for_root = packages.reject { |package| package.name == ParsePackwerk::ROOT_PACKAGE_NAME }
13
+ all_files = packages_except_for_root.flat_map do |package|
14
+ package.directory.glob('**/**.rb')
15
+ end
16
+
17
+ all_public_files = T.let([], T::Array[Pathname])
18
+ is_using_public_directory = 0
19
+ packages_except_for_root.each do |package|
20
+ public_files = package.directory.glob('app/public/**/**.rb')
21
+ all_public_files += public_files
22
+ is_using_public_directory += 1 if public_files.any?
23
+ end
24
+
25
+ # In Datadog, we can divide public files by all files to get the ratio.
26
+ # This is not a metric that we are targeting -- its for observability and reflection only.
27
+ [
28
+ GaugeMetric.for("#{prefix}.all_files.count", all_files.count, package_tags),
29
+ GaugeMetric.for("#{prefix}.public_files.count", all_public_files.count, package_tags),
30
+ GaugeMetric.for("#{prefix}.using_public_directory.count", is_using_public_directory, package_tags),
31
+ ]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module ModularizationStatistics
5
+ module Private
6
+ module Metrics
7
+ extend T::Sig
8
+ UNKNOWN_OWNER = T.let('Unknown', String)
9
+
10
+ sig { params(team_name: T.nilable(String)).returns(T::Array[Tag]) }
11
+ def self.tags_for_team(team_name)
12
+ [Tag.for('team', team_name || UNKNOWN_OWNER)]
13
+ end
14
+
15
+ sig { params(package: ParsePackwerk::Package, app_name: String).returns(T::Array[Tag]) }
16
+ def self.tags_for_package(package, app_name)
17
+ [
18
+ Tag.new(key: 'package', value: humanized_package_name(package.name)),
19
+ Tag.new(key: 'app', value: app_name),
20
+ *Metrics.tags_for_team(CodeOwnership.for_package(package)&.name),
21
+ ]
22
+ end
23
+
24
+ sig { params(team_name: T.nilable(String)).returns(T::Array[Tag]) }
25
+ def self.tags_for_to_team(team_name)
26
+ [Tag.for('to_team', team_name || Metrics::UNKNOWN_OWNER)]
27
+ end
28
+
29
+ sig { params(name: String).returns(String) }
30
+ def self.humanized_package_name(name)
31
+ if name == ParsePackwerk::ROOT_PACKAGE_NAME
32
+ 'root'
33
+ else
34
+ name
35
+ end
36
+ end
37
+
38
+ sig { params(violations: T::Array[ParsePackwerk::Violation]).returns(Integer) }
39
+ def self.file_count(violations)
40
+ violations.sum { |v| v.files.count }
41
+ end
42
+
43
+ sig { params(package: ParsePackwerk::Package).returns(T::Boolean) }
44
+ def self.has_readme?(package)
45
+ package.directory.join('README.md').exist?
46
+ end
47
+ end
48
+ end
49
+ end
@@ -7,7 +7,7 @@ module ModularizationStatistics
7
7
 
8
8
  const :is_componentized_file, T::Boolean
9
9
  const :is_packaged_file, T::Boolean
10
- const :team_owner, T.nilable(Teams::Team)
10
+ const :team_owner, T.nilable(CodeTeams::Team)
11
11
  const :pathname, Pathname
12
12
 
13
13
  sig { returns(T::Boolean) }
@@ -4,7 +4,7 @@ require 'sorbet-runtime'
4
4
  require 'json'
5
5
  require 'yaml'
6
6
  require 'benchmark'
7
- require 'teams'
7
+ require 'code_teams'
8
8
  require 'code_ownership'
9
9
  require 'pathname'
10
10
  require 'modularization_statistics/private/source_code_file'
@@ -12,18 +12,18 @@ module CodeOwnership
12
12
  sig do
13
13
  params(
14
14
  backtrace: T.nilable(T::Array[::String]),
15
- excluded_teams: T::Array[::Teams::Team]
16
- ).returns(T.nilable(::Teams::Team))
15
+ excluded_teams: T::Array[::CodeTeams::Team]
16
+ ).returns(T.nilable(::CodeTeams::Team))
17
17
  end
18
18
  def for_backtrace(backtrace, excluded_teams: T.unsafe(nil)); end
19
19
 
20
- sig { params(klass: T.nilable(T.any(::Class, ::Module))).returns(T.nilable(::Teams::Team)) }
20
+ sig { params(klass: T.nilable(T.any(::Class, ::Module))).returns(T.nilable(::CodeTeams::Team)) }
21
21
  def for_class(klass); end
22
22
 
23
- sig { params(file: ::String).returns(T.nilable(::Teams::Team)) }
23
+ sig { params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
24
24
  def for_file(file); end
25
25
 
26
- sig { params(package: ::ParsePackwerk::Package).returns(T.nilable(::Teams::Team)) }
26
+ sig { params(package: ::ParsePackwerk::Package).returns(T.nilable(::CodeTeams::Team)) }
27
27
  def for_package(package); end
28
28
 
29
29
  sig { params(files: T::Array[::String], autocorrect: T::Boolean, stage_changes: T::Boolean).void }
@@ -40,6 +40,7 @@ end
40
40
 
41
41
  class CodeOwnership::Cli
42
42
  class << self
43
+ def for_file(argv); end
43
44
  def run!(argv); end
44
45
 
45
46
  private
@@ -64,7 +65,7 @@ module CodeOwnership::Private
64
65
  sig { params(files: T::Array[::String]).returns(T::Hash[::String, T::Array[::String]]) }
65
66
  def files_by_mapper(files); end
66
67
 
67
- sig { params(team_name: ::String, location_of_reference: ::String).returns(::Teams::Team) }
68
+ sig { params(team_name: ::String, location_of_reference: ::String).returns(::CodeTeams::Team) }
68
69
  def find_team!(team_name, location_of_reference); end
69
70
 
70
71
  sig { returns(T::Array[::CodeOwnership::Private::OwnershipMappers::Interface]) }
@@ -107,19 +108,19 @@ class CodeOwnership::Private::OwnershipMappers::FileAnnotations
107
108
  sig { override.void }
108
109
  def bust_caches!; end
109
110
 
110
- sig { override.returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
111
+ sig { override.returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
111
112
  def codeowners_lines_to_owners; end
112
113
 
113
114
  sig { override.returns(::String) }
114
115
  def description; end
115
116
 
116
- sig { params(filename: ::String).returns(T.nilable(::Teams::Team)) }
117
+ sig { params(filename: ::String).returns(T.nilable(::CodeTeams::Team)) }
117
118
  def file_annotation_based_owner(filename); end
118
119
 
119
- sig { override.params(file: ::String).returns(T.nilable(::Teams::Team)) }
120
+ sig { override.params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
120
121
  def map_file_to_owner(file); end
121
122
 
122
- sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
123
+ sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
123
124
  def map_files_to_owners(files); end
124
125
 
125
126
  sig { params(filename: ::String).void }
@@ -134,16 +135,16 @@ module CodeOwnership::Private::OwnershipMappers::Interface
134
135
  sig { abstract.void }
135
136
  def bust_caches!; end
136
137
 
137
- sig { abstract.returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
138
+ sig { abstract.returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
138
139
  def codeowners_lines_to_owners; end
139
140
 
140
141
  sig { abstract.returns(::String) }
141
142
  def description; end
142
143
 
143
- sig { abstract.params(file: ::String).returns(T.nilable(::Teams::Team)) }
144
+ sig { abstract.params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
144
145
  def map_file_to_owner(file); end
145
146
 
146
- sig { abstract.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
147
+ sig { abstract.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
147
148
  def map_files_to_owners(files); end
148
149
  end
149
150
 
@@ -153,19 +154,19 @@ class CodeOwnership::Private::OwnershipMappers::JsPackageOwnership
153
154
  sig { override.void }
154
155
  def bust_caches!; end
155
156
 
156
- sig { override.returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
157
+ sig { override.returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
157
158
  def codeowners_lines_to_owners; end
158
159
 
159
160
  sig { override.returns(::String) }
160
161
  def description; end
161
162
 
162
- sig { override.params(file: ::String).returns(T.nilable(::Teams::Team)) }
163
+ sig { override.params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
163
164
  def map_file_to_owner(file); end
164
165
 
165
- sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
166
+ sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
166
167
  def map_files_to_owners(files); end
167
168
 
168
- sig { params(package: ::CodeOwnership::Private::ParseJsPackages::Package).returns(T.nilable(::Teams::Team)) }
169
+ sig { params(package: ::CodeOwnership::Private::ParseJsPackages::Package).returns(T.nilable(::CodeTeams::Team)) }
169
170
  def owner_for_package(package); end
170
171
 
171
172
  private
@@ -180,19 +181,19 @@ class CodeOwnership::Private::OwnershipMappers::PackageOwnership
180
181
  sig { override.void }
181
182
  def bust_caches!; end
182
183
 
183
- sig { override.returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
184
+ sig { override.returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
184
185
  def codeowners_lines_to_owners; end
185
186
 
186
187
  sig { override.returns(::String) }
187
188
  def description; end
188
189
 
189
- sig { override.params(file: ::String).returns(T.nilable(::Teams::Team)) }
190
+ sig { override.params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
190
191
  def map_file_to_owner(file); end
191
192
 
192
- sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
193
+ sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
193
194
  def map_files_to_owners(files); end
194
195
 
195
- sig { params(package: ::ParsePackwerk::Package).returns(T.nilable(::Teams::Team)) }
196
+ sig { params(package: ::ParsePackwerk::Package).returns(T.nilable(::CodeTeams::Team)) }
196
197
  def owner_for_package(package); end
197
198
 
198
199
  private
@@ -207,16 +208,16 @@ class CodeOwnership::Private::OwnershipMappers::TeamGlobs
207
208
  sig { override.void }
208
209
  def bust_caches!; end
209
210
 
210
- sig { override.returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
211
+ sig { override.returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
211
212
  def codeowners_lines_to_owners; end
212
213
 
213
214
  sig { override.returns(::String) }
214
215
  def description; end
215
216
 
216
- sig { override.params(file: ::String).returns(T.nilable(::Teams::Team)) }
217
+ sig { override.params(file: ::String).returns(T.nilable(::CodeTeams::Team)) }
217
218
  def map_file_to_owner(file); end
218
219
 
219
- sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::Teams::Team)]) }
220
+ sig { override.params(files: T::Array[::String]).returns(T::Hash[::String, T.nilable(::CodeTeams::Team)]) }
220
221
  def map_files_to_owners(files); end
221
222
  end
222
223
 
@@ -248,7 +249,7 @@ end
248
249
  CodeOwnership::Private::ParseJsPackages::ROOT_PACKAGE_NAME = T.let(T.unsafe(nil), String)
249
250
  module CodeOwnership::Private::TeamPlugins; end
250
251
 
251
- class CodeOwnership::Private::TeamPlugins::Github < ::Teams::Plugin
252
+ class CodeOwnership::Private::TeamPlugins::Github < ::CodeTeams::Plugin
252
253
  sig { returns(::CodeOwnership::Private::TeamPlugins::Github::GithubStruct) }
253
254
  def github; end
254
255
  end
@@ -267,7 +268,7 @@ class CodeOwnership::Private::TeamPlugins::Github::GithubStruct < ::Struct
267
268
  end
268
269
  end
269
270
 
270
- class CodeOwnership::Private::TeamPlugins::Ownership < ::Teams::Plugin
271
+ class CodeOwnership::Private::TeamPlugins::Ownership < ::CodeTeams::Plugin
271
272
  sig { returns(T::Array[::String]) }
272
273
  def owned_globs; end
273
274
  end
@@ -1,78 +1,78 @@
1
1
  # typed: true
2
2
 
3
3
  # DO NOT EDIT MANUALLY
4
- # This is an autogenerated file for types exported from the `bigrails-teams` gem.
5
- # Please instead update this file by running `bin/tapioca gem bigrails-teams`.
4
+ # This is an autogenerated file for types exported from the `code_teams` gem.
5
+ # Please instead update this file by running `bin/tapioca gem code_teams`.
6
6
 
7
- module Teams
7
+ module CodeTeams
8
8
  class << self
9
- sig { returns(T::Array[::Teams::Team]) }
9
+ sig { returns(T::Array[::CodeTeams::Team]) }
10
10
  def all; end
11
11
 
12
12
  sig { void }
13
13
  def bust_caches!; end
14
14
 
15
- sig { params(name: ::String).returns(T.nilable(::Teams::Team)) }
15
+ sig { params(name: ::String).returns(T.nilable(::CodeTeams::Team)) }
16
16
  def find(name); end
17
17
 
18
- sig { params(dir: ::String).returns(T::Array[::Teams::Team]) }
18
+ sig { params(dir: ::String).returns(T::Array[::CodeTeams::Team]) }
19
19
  def for_directory(dir); end
20
20
 
21
21
  sig { params(string: ::String).returns(::String) }
22
22
  def tag_value_for(string); end
23
23
 
24
- sig { params(teams: T::Array[::Teams::Team]).returns(T::Array[::String]) }
24
+ sig { params(teams: T::Array[::CodeTeams::Team]).returns(T::Array[::String]) }
25
25
  def validation_errors(teams); end
26
26
  end
27
27
  end
28
28
 
29
- class Teams::IncorrectPublicApiUsageError < ::StandardError; end
29
+ class CodeTeams::IncorrectPublicApiUsageError < ::StandardError; end
30
30
 
31
- class Teams::Plugin
31
+ class CodeTeams::Plugin
32
32
  abstract!
33
33
 
34
- sig { params(team: ::Teams::Team).void }
34
+ sig { params(team: ::CodeTeams::Team).void }
35
35
  def initialize(team); end
36
36
 
37
37
  class << self
38
- sig { returns(T::Array[T.class_of(Teams::Plugin)]) }
38
+ sig { returns(T::Array[T.class_of(CodeTeams::Plugin)]) }
39
39
  def all_plugins; end
40
40
 
41
- sig { params(team: ::Teams::Team).returns(T.attached_class) }
41
+ sig { params(team: ::CodeTeams::Team).returns(T.attached_class) }
42
42
  def for(team); end
43
43
 
44
44
  sig { params(base: T.untyped).void }
45
45
  def inherited(base); end
46
46
 
47
- sig { params(team: ::Teams::Team, key: ::String).returns(::String) }
47
+ sig { params(team: ::CodeTeams::Team, key: ::String).returns(::String) }
48
48
  def missing_key_error_message(team, key); end
49
49
 
50
- sig { params(teams: T::Array[::Teams::Team]).returns(T::Array[::String]) }
50
+ sig { params(teams: T::Array[::CodeTeams::Team]).returns(T::Array[::String]) }
51
51
  def validation_errors(teams); end
52
52
 
53
53
  private
54
54
 
55
- sig { params(team: ::Teams::Team).returns(T.attached_class) }
55
+ sig { params(team: ::CodeTeams::Team).returns(T.attached_class) }
56
56
  def register_team(team); end
57
57
 
58
- sig { returns(T::Hash[T.nilable(::String), T::Hash[::Class, ::Teams::Plugin]]) }
58
+ sig { returns(T::Hash[T.nilable(::String), T::Hash[::Class, ::CodeTeams::Plugin]]) }
59
59
  def registry; end
60
60
  end
61
61
  end
62
62
 
63
- module Teams::Plugins; end
63
+ module CodeTeams::Plugins; end
64
64
 
65
- class Teams::Plugins::Identity < ::Teams::Plugin
66
- sig { returns(::Teams::Plugins::Identity::IdentityStruct) }
65
+ class CodeTeams::Plugins::Identity < ::CodeTeams::Plugin
66
+ sig { returns(::CodeTeams::Plugins::Identity::IdentityStruct) }
67
67
  def identity; end
68
68
 
69
69
  class << self
70
- sig { override.params(teams: T::Array[::Teams::Team]).returns(T::Array[::String]) }
70
+ sig { override.params(teams: T::Array[::CodeTeams::Team]).returns(T::Array[::String]) }
71
71
  def validation_errors(teams); end
72
72
  end
73
73
  end
74
74
 
75
- class Teams::Plugins::Identity::IdentityStruct < ::Struct
75
+ class CodeTeams::Plugins::Identity::IdentityStruct < ::Struct
76
76
  def name; end
77
77
  def name=(_); end
78
78
 
@@ -84,7 +84,7 @@ class Teams::Plugins::Identity::IdentityStruct < ::Struct
84
84
  end
85
85
  end
86
86
 
87
- class Teams::Team
87
+ class CodeTeams::Team
88
88
  sig { params(config_yml: T.nilable(::String), raw_hash: T::Hash[T.untyped, T.untyped]).void }
89
89
  def initialize(config_yml:, raw_hash:); end
90
90
 
@@ -109,12 +109,12 @@ class Teams::Team
109
109
  def to_tag; end
110
110
 
111
111
  class << self
112
- sig { params(raw_hash: T::Hash[T.untyped, T.untyped]).returns(::Teams::Team) }
112
+ sig { params(raw_hash: T::Hash[T.untyped, T.untyped]).returns(::CodeTeams::Team) }
113
113
  def from_hash(raw_hash); end
114
114
 
115
- sig { params(config_yml: ::String).returns(::Teams::Team) }
115
+ sig { params(config_yml: ::String).returns(::CodeTeams::Team) }
116
116
  def from_yml(config_yml); end
117
117
  end
118
118
  end
119
119
 
120
- Teams::UNKNOWN_TEAM_STRING = T.let(T.unsafe(nil), String)
120
+ CodeTeams::UNKNOWN_TEAM_STRING = T.let(T.unsafe(nil), String)