Skip to content

Commit 69bcee9

Browse files
author
Alex Evanczuk
authored
Support packwerk validator for top-level owner key in package.yml files (#68)
1 parent 8bd467a commit 69bcee9

File tree

12 files changed

+278
-28
lines changed

12 files changed

+278
-28
lines changed

Gemfile.lock

Lines changed: 99 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,101 @@
11
PATH
22
remote: .
33
specs:
4-
code_ownership (1.32.19)
4+
code_ownership (1.33.0)
55
code_teams (~> 1.0)
66
packs
77
sorbet-runtime (>= 0.5.10821)
88

99
GEM
1010
remote: https://rubygems.org/
1111
specs:
12+
actionpack (7.0.4.3)
13+
actionview (= 7.0.4.3)
14+
activesupport (= 7.0.4.3)
15+
rack (~> 2.0, >= 2.2.0)
16+
rack-test (>= 0.6.3)
17+
rails-dom-testing (~> 2.0)
18+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
19+
actionview (7.0.4.3)
20+
activesupport (= 7.0.4.3)
21+
builder (~> 3.1)
22+
erubi (~> 1.4)
23+
rails-dom-testing (~> 2.0)
24+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
25+
activesupport (7.0.4.3)
26+
concurrent-ruby (~> 1.0, >= 1.0.2)
27+
i18n (>= 1.6, < 2)
28+
minitest (>= 5.1)
29+
tzinfo (~> 2.0)
1230
ast (2.4.2)
31+
better_html (2.0.1)
32+
actionview (>= 6.0)
33+
activesupport (>= 6.0)
34+
ast (~> 2.0)
35+
erubi (~> 1.4)
36+
parser (>= 2.4)
37+
smart_properties
38+
builder (3.2.4)
1339
code_teams (1.0.1)
1440
sorbet-runtime
1541
coderay (1.1.3)
16-
diff-lcs (1.4.4)
42+
concurrent-ruby (1.2.2)
43+
constant_resolver (0.2.0)
44+
crass (1.0.6)
45+
diff-lcs (1.5.0)
46+
erubi (1.12.0)
47+
i18n (1.13.0)
48+
concurrent-ruby (~> 1.0)
49+
loofah (2.21.2)
50+
crass (~> 1.0.2)
51+
nokogiri (>= 1.12.0)
1752
method_source (1.0.0)
53+
mini_portile2 (2.8.2)
54+
minitest (5.18.0)
55+
netrc (0.11.0)
56+
nokogiri (1.14.4)
57+
mini_portile2 (~> 2.8.0)
58+
racc (~> 1.4)
59+
nokogiri (1.14.4-arm64-darwin)
60+
racc (~> 1.4)
61+
nokogiri (1.14.4-x86_64-darwin)
62+
racc (~> 1.4)
1863
packs (0.0.6)
1964
sorbet-runtime
20-
parser (3.1.2.0)
65+
packwerk (3.0.1)
66+
activesupport (>= 6.0)
67+
ast
68+
better_html
69+
bundler
70+
constant_resolver (>= 0.2.0)
71+
parallel
72+
parser
73+
sorbet-runtime (>= 0.5.9914)
74+
zeitwerk (>= 2.6.1)
75+
parallel (1.23.0)
76+
parser (3.2.2.1)
2177
ast (~> 2.4.1)
2278
pry (0.14.1)
2379
coderay (~> 1.1)
2480
method_source (~> 1.0)
81+
racc (1.6.2)
82+
rack (2.2.7)
83+
rack-test (2.1.0)
84+
rack (>= 1.3)
85+
rails-dom-testing (2.0.3)
86+
activesupport (>= 4.2.0)
87+
nokogiri (>= 1.6)
88+
rails-html-sanitizer (1.5.0)
89+
loofah (~> 2.19, >= 2.19.1)
90+
railties (7.0.4.3)
91+
actionpack (= 7.0.4.3)
92+
activesupport (= 7.0.4.3)
93+
method_source
94+
rake (>= 12.2)
95+
thor (~> 1.0)
96+
zeitwerk (~> 2.5)
2597
rake (13.0.6)
26-
rbi (0.0.14)
98+
rbi (0.0.16)
2799
ast
28100
parser (>= 2.6.4.0)
29101
sorbet-runtime (>= 0.5.9204)
@@ -41,6 +113,7 @@ GEM
41113
diff-lcs (>= 1.2.0, < 2.0)
42114
rspec-support (~> 3.10.0)
43115
rspec-support (3.10.2)
116+
smart_properties (1.17.0)
44117
sorbet (0.5.10821)
45118
sorbet-static (= 0.5.10821)
46119
sorbet-runtime (0.5.10821)
@@ -54,29 +127,33 @@ GEM
54127
sorbet-static (0.5.10821-universal-darwin-21)
55128
sorbet-static (0.5.10821-universal-darwin-22)
56129
sorbet-static (0.5.10821-x86_64-linux)
57-
spoom (1.1.11)
58-
sorbet (>= 0.5.9204)
130+
sorbet-static-and-runtime (0.5.10821)
131+
sorbet (= 0.5.10821)
132+
sorbet-runtime (= 0.5.10821)
133+
spoom (1.2.1)
134+
sorbet (>= 0.5.10187)
59135
sorbet-runtime (>= 0.5.9204)
60136
thor (>= 0.19.2)
61-
tapioca (0.7.2)
62-
bundler (>= 1.17.3)
63-
pry (>= 0.12.2)
64-
rbi (~> 0.0.0, >= 0.0.14)
65-
sorbet-runtime (>= 0.5.9204)
66-
sorbet-static (>= 0.5.9204)
67-
spoom (~> 1.1.0, >= 1.1.11)
137+
tapioca (0.11.6)
138+
bundler (>= 2.2.25)
139+
netrc (>= 0.11.0)
140+
parallel (>= 1.21.0)
141+
rbi (~> 0.0.0, >= 0.0.16)
142+
sorbet-static-and-runtime (>= 0.5.10187)
143+
spoom (~> 1.2.0, >= 1.2.0)
68144
thor (>= 1.2.0)
69145
yard-sorbet
70-
thor (1.2.1)
71-
unparser (0.6.4)
146+
thor (1.2.2)
147+
tzinfo (2.0.6)
148+
concurrent-ruby (~> 1.0)
149+
unparser (0.6.7)
72150
diff-lcs (~> 1.3)
73-
parser (>= 3.1.0)
74-
webrick (1.7.0)
75-
yard (0.9.27)
76-
webrick (~> 1.7.0)
77-
yard-sorbet (0.6.1)
151+
parser (>= 3.2.0)
152+
yard (0.9.34)
153+
yard-sorbet (0.8.1)
78154
sorbet-runtime (>= 0.5)
79155
yard (>= 0.9)
156+
zeitwerk (2.6.8)
80157

81158
PLATFORMS
82159
arm64-darwin-20
@@ -87,7 +164,9 @@ PLATFORMS
87164

88165
DEPENDENCIES
89166
code_ownership!
167+
packwerk
90168
pry
169+
railties
91170
rake
92171
rspec (~> 3.0)
93172
sorbet

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ metadata:
2121
owner: Team
2222
```
2323
24+
You can also define `owner` as a top-level key, e.g.
25+
```yml
26+
enforce_dependency: true
27+
enforce_privacy: true
28+
owner: Team
29+
```
30+
31+
To do this, add `code_ownership` to the `require` key of your `packwerk.yml`. See https://github.com/Shopify/packwerk/blob/main/USAGE.md#loading-extensions for more information.
32+
2433
### Glob-Based Ownership
2534
In your team's configured YML (see [`code_teams`](https://github.com/rubyatscale/code_teams)), you can set `owned_globs` to be a glob of files your team owns. For example, in `my_team.yml`:
2635
```yml

code_ownership.gemspec

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |spec|
22
spec.name = 'code_ownership'
3-
spec.version = '1.32.19'
3+
spec.version = '1.33.0'
44
spec.authors = ['Gusto Engineers']
55
spec.email = ['[email protected]']
66
spec.summary = 'A gem to help engineering teams declare ownership of code'
@@ -35,4 +35,6 @@ Gem::Specification.new do |spec|
3535
spec.add_development_dependency 'rspec', '~> 3.0'
3636
spec.add_development_dependency 'sorbet'
3737
spec.add_development_dependency 'tapioca'
38+
spec.add_development_dependency 'packwerk'
39+
spec.add_development_dependency 'railties'
3840
end

lib/code_ownership.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
require 'code_ownership/cli'
1414
require 'code_ownership/configuration'
1515

16+
if defined?(Packwerk)
17+
require 'code_ownership/private/permit_pack_owner_top_level_key'
18+
end
19+
1620
module CodeOwnership
1721
extend self
1822
extend T::Sig

lib/code_ownership/private/ownership_mappers/package_ownership.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def update_cache(cache, files)
5656

5757
sig { params(package: Packs::Pack).returns(T.nilable(CodeTeams::Team)) }
5858
def owner_for_package(package)
59-
raw_owner_value = package.metadata['owner']
59+
raw_owner_value = package.raw_hash['owner'] || package.metadata['owner']
6060
return nil if !raw_owner_value
6161

6262
Private.find_team!(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
# typed: strict
3+
# frozen_string_literal: true
4+
5+
require 'packwerk'
6+
7+
module CodeOwnership
8+
module Private
9+
class PackOwnershipValidator
10+
extend T::Sig
11+
include Packwerk::Validator
12+
13+
sig { override.params(package_set: Packwerk::PackageSet, configuration: Packwerk::Configuration).returns(Result) }
14+
def call(package_set, configuration)
15+
Result.new(ok: true)
16+
end
17+
18+
sig { override.returns(T::Array[String]) }
19+
def permitted_keys
20+
%w[owner]
21+
end
22+
end
23+
end
24+
end

sorbet/rbi/gems/[email protected]

Lines changed: 92 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/lib/code_ownership/private/ownership_mappers/package_ownership_spec.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ module CodeOwnership
99
write_file('packs/my_other_package/package.yml', <<~CONTENTS)
1010
enforce_dependency: true
1111
enforce_privacy: true
12-
metadata:
13-
owner: Bar
12+
owner: Bar
1413
CONTENTS
1514

1615
write_file('packs/my_other_package/my_file.rb')

spec/lib/code_ownership/private/validations/files_have_unique_owners_spec.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ module CodeOwnership
3636
write_file('packs/my_pack/package.yml', <<~CONTENTS)
3737
enforce_dependency: true
3838
enforce_privacy: true
39-
metadata:
40-
owner: Bar
39+
owner: Bar
4140
CONTENTS
4241

4342
write_file('package.yml', <<~CONTENTS)

0 commit comments

Comments
 (0)