code_ownership 1.29.2 → 1.29.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/code_ownership.rb +28 -10
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e796fdc12573836124effdc391e8443cb8ae82cdd5804d52ba417cf9fe21b57
4
- data.tar.gz: bd19a776739342474b75840d51b8c8f441efe9ad7ac26fca58e3062c43426581
3
+ metadata.gz: 0ea243e473ae151a2775f8e1e47d0eb9dacb27f3d2d594db63d3004f5c611109
4
+ data.tar.gz: eb77703d34e6c40ee734d3e487fd58ba0f124555a681ff267326a4a3f4aeb03e
5
5
  SHA512:
6
- metadata.gz: 72c79c8a88854736b955b006067b9e03578c3dab1463cdb9d7936340e83166d792ebe8b4075c9dd1642725de780681de2bc8434c494f6c5e3a9e4d379402880f
7
- data.tar.gz: bd9a5a8adc21b80d30f34b18f9825969c3f2dfbf8f4b73367154c36867bfc4aa627bc70217cc7ef4480baf7af2d92954af834ecef3f95b6838b28427c5763229
6
+ metadata.gz: 8464d15022cc9a5f9e6019c0633b8941a3a5f1984f5d55f676c6377b94c335efb0b5722c4289f40b32da5f01453e806911c829c7fa0f11643f2d90c3327db3f3
7
+ data.tar.gz: 84c95502b0457b848d705b71b675c0d9b8654ed940cd3ba37bc1503c0d8c3cfe7b53dfa28340610ccfde17527e69facc14e7abb106843b21456b3fb17b3bc41d
@@ -58,7 +58,6 @@ module CodeOwnership
58
58
  ownership_information += ownership_for_mapper
59
59
  end
60
60
 
61
-
62
61
  ownership_information << ""
63
62
  end
64
63
 
@@ -93,7 +92,25 @@ module CodeOwnership
93
92
  # first line that corresponds to a file with assigned ownership
94
93
  sig { params(backtrace: T.nilable(T::Array[String]), excluded_teams: T::Array[::CodeTeams::Team]).returns(T.nilable(::CodeTeams::Team)) }
95
94
  def for_backtrace(backtrace, excluded_teams: [])
96
- return unless backtrace
95
+ first_owned_file_for_backtrace(backtrace, excluded_teams: excluded_teams)&.first
96
+ end
97
+
98
+ # Given a backtrace from either `Exception#backtrace` or `caller`, find the
99
+ # first owned file in it, useful for figuring out which file is being blamed.
100
+ sig { params(backtrace: T.nilable(T::Array[String]), excluded_teams: T::Array[::CodeTeams::Team]).returns(T.nilable([::CodeTeams::Team, String])) }
101
+ def first_owned_file_for_backtrace(backtrace, excluded_teams: [])
102
+ backtrace_with_ownership(backtrace).each do |(team, file)|
103
+ if team && !excluded_teams.include?(team)
104
+ return [team, file]
105
+ end
106
+ end
107
+
108
+ nil
109
+ end
110
+
111
+ sig { params(backtrace: T.nilable(T::Array[String])).returns(T::Enumerable[[T.nilable(::CodeTeams::Team), String]]) }
112
+ def backtrace_with_ownership(backtrace)
113
+ return [] unless backtrace
97
114
 
98
115
  # The pattern for a backtrace hasn't changed in forever and is considered
99
116
  # stable: https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L303-L317
@@ -110,18 +127,19 @@ module CodeOwnership
110
127
  `(?<function>.*)' # Matches "`block (3 levels) in create'"
111
128
  \z}x
112
129
 
113
- backtrace.each do |line|
130
+ backtrace.lazy.filter_map do |line|
114
131
  match = line.match(backtrace_line)
132
+ next unless match
115
133
 
116
- if match
117
- team = CodeOwnership.for_file(T.must(match[:file]))
118
- if team && !excluded_teams.include?(team)
119
- return team
120
- end
121
- end
134
+ file = T.must(match[:file])
135
+
136
+ [
137
+ CodeOwnership.for_file(file),
138
+ file,
139
+ ]
122
140
  end
123
- nil
124
141
  end
142
+ private_class_method(:backtrace_with_ownership)
125
143
 
126
144
  sig { params(klass: T.nilable(T.any(Class, Module))).returns(T.nilable(::CodeTeams::Team)) }
127
145
  def for_class(klass)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code_ownership
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.29.2
4
+ version: 1.29.3
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-12-28 00:00:00.000000000 Z
11
+ date: 2023-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_teams