code_ownership 1.35.0 → 1.36.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: 687d34f0d9ad8f7421b0a599904c697e10b34ec9f638a47f1e861b2e858bf091
4
- data.tar.gz: b8beee01bb8e5ff88d73117a05ad8c99c04e3ee3a7434f1a92da0e15cc7839dd
3
+ metadata.gz: e34134e28ee70e58344ea6d3f90be157bbdd6945888eee07d73abf3db3ed873b
4
+ data.tar.gz: 1875f6d3131505551c163aa03413edefa86c6f279d2c3189d9663a74a9603758
5
5
  SHA512:
6
- metadata.gz: c30fb93a5e634f648f00ab7269d0744cbb9dc120b3c472769a116e59066190560845ae8ee660750efb81c10d8c483373ffda8058d523ac50f16fa05266cf9e29
7
- data.tar.gz: 1843017837ed962de655069fcb64d7d5121e72eb6375df14b8a7be8c35d6b9b55ba3e592bb9a240374964002ea65d1c7f87a0ddd6d565a1c74e4276c51bb56fb
6
+ metadata.gz: de217fe525521395f2b6ad647257aecd69c9e8f8895fa0d466051cf4d365c3fce2dcf08ea9c9bfbeeef0c75116f3188d6f350c72becb965f7f3d49a992a0b6fa
7
+ data.tar.gz: abf92fcca79c8311cfa9d82fabcb0b129fdd076c9cb7a3db31c0db983dabf1e6cb5810b501e38cdab9fbf028dc3a43ed6105928469015b6bf30a33e774b5a6b6
@@ -10,6 +10,8 @@ module CodeOwnership
10
10
  include Mapper
11
11
 
12
12
  CODEOWNERS_DIRECTORY_FILE_NAME = '.codeowner'
13
+ RELATIVE_ROOT = Pathname('.').freeze
14
+ ABSOLUTE_ROOT = Pathname('/').freeze
13
15
 
14
16
  @@directory_cache = T.let({}, T::Hash[String, T.nilable(CodeTeams::Team)]) # rubocop:disable Style/ClassVars
15
17
 
@@ -74,36 +76,46 @@ module CodeOwnership
74
76
  )
75
77
  end
76
78
 
77
- # takes a file and finds the relevant `.codeowner` file by walking up the directory
79
+ # Takes a file and finds the relevant `.codeowner` file by walking up the directory
78
80
  # structure. Example, given `a/b/c.rb`, this looks for `a/b/.codeowner`, `a/.codeowner`,
79
81
  # and `.codeowner` in that order, stopping at the first file to actually exist.
80
- # We do additional caching so that we don't have to check for file existence every time
82
+ # If the parovided file is a directory, it will look for `.codeowner` in that directory and then upwards.
83
+ # We do additional caching so that we don't have to check for file existence every time.
81
84
  sig { params(file: String).returns(T.nilable(CodeTeams::Team)) }
82
85
  def map_file_to_relevant_owner(file)
83
86
  file_path = Pathname.new(file)
84
- path_components = file_path.each_filename.to_a.map { |path| Pathname.new(path) }
87
+ team = T.let(nil, T.nilable(CodeTeams::Team))
85
88
 
86
- (path_components.length - 1).downto(0).each do |i|
87
- potential_relative_path_name = T.must(path_components[0...i]).reduce(Pathname.new('')) { |built_path, path| built_path.join(path) }
88
- potential_codeowners_file = potential_relative_path_name.join(CODEOWNERS_DIRECTORY_FILE_NAME)
89
+ if File.directory?(file)
90
+ team = get_team_from_codeowners_file_within_directory(file_path)
91
+ end
92
+
93
+ while team.nil? && file_path != RELATIVE_ROOT && file_path != ABSOLUTE_ROOT
94
+ file_path = file_path.parent
95
+ team = get_team_from_codeowners_file_within_directory(file_path)
96
+ end
97
+
98
+ team
99
+ end
89
100
 
90
- potential_codeowners_file_name = potential_codeowners_file.to_s
101
+ sig { params(directory: Pathname).returns(T.nilable(CodeTeams::Team)) }
102
+ def get_team_from_codeowners_file_within_directory(directory)
103
+ potential_codeowners_file = directory.join(CODEOWNERS_DIRECTORY_FILE_NAME)
91
104
 
92
- team = nil
93
- if @@directory_cache.key?(potential_codeowners_file_name)
94
- team = @@directory_cache[potential_codeowners_file_name]
95
- elsif potential_codeowners_file.exist?
96
- team = owner_for_codeowners_file(potential_codeowners_file)
105
+ potential_codeowners_file_name = potential_codeowners_file.to_s
97
106
 
98
- @@directory_cache[potential_codeowners_file_name] = team
99
- else
100
- @@directory_cache[potential_codeowners_file_name] = nil
101
- end
107
+ team = nil
108
+ if @@directory_cache.key?(potential_codeowners_file_name)
109
+ team = @@directory_cache[potential_codeowners_file_name]
110
+ elsif potential_codeowners_file.exist?
111
+ team = owner_for_codeowners_file(potential_codeowners_file)
102
112
 
103
- return team unless team.nil?
113
+ @@directory_cache[potential_codeowners_file_name] = team
114
+ else
115
+ @@directory_cache[potential_codeowners_file_name] = nil
104
116
  end
105
117
 
106
- nil
118
+ return team
107
119
  end
108
120
  end
109
121
  end
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.35.0
4
+ version: 1.36.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: 2023-11-29 00:00:00.000000000 Z
11
+ date: 2023-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_teams