Skip to content

Commit 21327d8

Browse files
committed
Improve the package interface for using in console
1 parent 0240c38 commit 21327d8

5 files changed

Lines changed: 184 additions & 9 deletions

File tree

lib/query_packwerk/package.rb

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ def metadata
3636
@original_package.metadata
3737
end
3838

39-
sig { returns(T::Array[String]) }
39+
sig { returns(QueryPackwerk::Packages) }
4040
def dependencies
41+
Packages.where(name: @original_package.dependencies)
42+
end
43+
44+
sig { returns(T::Array[String]) }
45+
def dependency_names
4146
@original_package.dependencies
4247
end
4348

@@ -53,17 +58,29 @@ def directory
5358

5459
sig { returns(QueryPackwerk::Violations) }
5560
def violations
61+
QueryPackwerk::Violations.where(consuming_pack: name)
62+
end
63+
alias todos violations
64+
65+
sig { returns(QueryPackwerk::Violations) }
66+
def consumer_violations
5667
QueryPackwerk::Violations.where(producing_pack: name)
5768
end
69+
alias incoming_violations consumer_violations
5870

59-
sig { returns(T::Array[String]) }
71+
sig { returns(QueryPackwerk::Packages) }
6072
def consumers
61-
violations.consumers.keys
73+
Packages.where(name: consumer_names)
74+
end
75+
76+
sig { returns(T::Array[String]) }
77+
def consumer_names
78+
consumer_violations.consumers.keys
6279
end
6380

6481
sig { returns(T::Hash[String, Integer]) }
6582
def consumer_counts
66-
violations.consumers
83+
consumer_violations.consumers
6784
end
6885

6986
sig { returns(String) }
@@ -81,7 +98,7 @@ def deconstruct_keys(keys)
8198
name: name,
8299
owner: metadata.fetch('owner', Packages::UNOWNED),
83100
owned: metadata['owner'].nil?,
84-
dependencies: dependencies,
101+
dependencies: dependency_names,
85102

86103
# Used for future implementations of NestedPacks
87104
parent_name: parent_name
@@ -92,7 +109,7 @@ def deconstruct_keys(keys)
92109

93110
sig { returns(String) }
94111
def inspect
95-
"#<#{self.class.name} name=#{name} owner=#{owner} dependencies=#{dependencies}>"
112+
"#<#{self.class.name} #{name}>"
96113
end
97114
end
98115
end

lib/query_packwerk/packages.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ class << self
2626
# Get all packages wrapped in our interfaces
2727
sig { returns(QueryPackwerk::Packages) }
2828
def all
29-
packages = ParsePackwerk.all.map { |p| QueryPackwerk::Package.new(original_package: p) }
30-
31-
QueryPackwerk::Packages.new(packages)
29+
@all ||= T.let(
30+
begin
31+
packages = ParsePackwerk.all.map { |p| QueryPackwerk::Package.new(original_package: p) }
32+
QueryPackwerk::Packages.new(packages)
33+
end,
34+
T.nilable(QueryPackwerk::Packages)
35+
)
3236
end
3337

3438
sig do
@@ -56,5 +60,14 @@ def violations
5660
@original_collection.flat_map { |pack| pack.violations.original_collection }
5761
)
5862
end
63+
64+
sig { returns(String) }
65+
def inspect
66+
[
67+
"#<#{self.class.name} [",
68+
to_a.map(&:inspect).join("\n"),
69+
']>'
70+
].join("\n")
71+
end
5972
end
6073
end

lib/query_packwerk/violation.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,11 @@ def deconstruct_keys(keys)
278278
keys.nil? ? all_values : all_values.slice(*T.unsafe(keys))
279279
end
280280

281+
sig { returns(String) }
282+
def inspect
283+
"#<#{self.class.name} #{consuming_pack.name} -> #{class_name} (#{type})>"
284+
end
285+
281286
private
282287

283288
sig { params(string: String).returns(String) }

lib/query_packwerk/violations.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,15 @@ def excluding_files(*file_globs)
239239
QueryPackwerk::Violations.new(filtered_violations)
240240
end
241241

242+
sig { returns(String) }
243+
def inspect
244+
[
245+
"#<#{self.class.name} [",
246+
to_a.map(&:inspect).join("\n"),
247+
']>'
248+
].join("\n")
249+
end
250+
242251
private
243252

244253
sig { params(string: String).returns(String) }
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# typed: false
2+
# frozen_string_literal: true
3+
4+
RSpec.describe QueryPackwerk::Package do
5+
include_context 'pseudo packs'
6+
7+
let(:package) { QueryPackwerk.package(package_name) }
8+
9+
describe '#name' do
10+
it 'returns the package name' do
11+
expect(package.name).to eq(package_name)
12+
end
13+
end
14+
15+
describe '#enforce_dependencies' do
16+
it 'returns whether dependencies are enforced' do
17+
expect(package.enforce_dependencies).to be true
18+
end
19+
end
20+
21+
describe '#enforce_privacy' do
22+
it 'returns whether privacy is enforced' do
23+
expect(package.enforce_privacy).to be true
24+
end
25+
end
26+
27+
describe '#metadata' do
28+
it 'returns the package metadata' do
29+
expect(package.metadata).to be_a(Hash)
30+
end
31+
end
32+
33+
describe '#dependencies' do
34+
it 'returns the package dependencies as a Packages collection' do
35+
expect(package.dependencies).to be_a(QueryPackwerk::Packages)
36+
end
37+
end
38+
39+
describe '#dependency_names' do
40+
it 'returns an array of dependency names' do
41+
expect(package.dependency_names).to be_an(Array)
42+
end
43+
end
44+
45+
describe '#owner' do
46+
it 'returns the owner or unowned constant' do
47+
expect(package.owner).to eq(QueryPackwerk::Packages::UNOWNED)
48+
end
49+
end
50+
51+
describe '#directory' do
52+
it 'returns a Pathname representing the package directory' do
53+
expect(package.directory).to be_a(Pathname)
54+
expect(package.directory.to_s).to eq(package_name)
55+
end
56+
end
57+
58+
describe '#violations' do
59+
it 'returns violations for the package' do
60+
violations = package.violations
61+
expect(violations).to be_a(QueryPackwerk::Violations)
62+
expect(violations.size).to eq(raw_violations.size)
63+
end
64+
end
65+
66+
describe '#todos' do
67+
it 'is an alias for #violations' do
68+
# Both methods should return equivalent objects but might not be equal with `==`
69+
expect(package.todos.to_a).to match_array(package.violations.to_a)
70+
end
71+
end
72+
73+
describe '#consumer_violations' do
74+
it 'returns violations where this package is the producing pack' do
75+
violations = package.consumer_violations
76+
expect(violations).to be_a(QueryPackwerk::Violations)
77+
end
78+
end
79+
80+
describe '#incoming_violations' do
81+
it 'is an alias for #consumer_violations' do
82+
# Both methods should return equivalent objects but might not be equal with `==`
83+
expect(package.incoming_violations.to_a).to match_array(package.consumer_violations.to_a)
84+
end
85+
end
86+
87+
describe '#consumers' do
88+
it 'returns packages that have violations against this package' do
89+
expect(package.consumers).to be_a(QueryPackwerk::Packages)
90+
end
91+
end
92+
93+
describe '#consumer_names' do
94+
it 'returns an array of consumer package names' do
95+
expect(package.consumer_names).to be_an(Array)
96+
end
97+
end
98+
99+
describe '#consumer_counts' do
100+
it 'returns a hash of consumer package names to violation counts' do
101+
expect(package.consumer_counts).to be_a(Hash)
102+
end
103+
end
104+
105+
describe '#parent_name' do
106+
it 'returns the parent directory name' do
107+
expect(package.parent_name).to eq('packs')
108+
end
109+
end
110+
111+
describe '#deconstruct_keys' do
112+
it 'returns a hash of values for pattern matching' do
113+
result = package.deconstruct_keys(%i[name owner dependencies])
114+
expect(result).to be_a(Hash)
115+
expect(result.keys).to include(:name, :owner, :dependencies)
116+
expect(result[:name]).to eq(package_name)
117+
end
118+
119+
it 'returns all values when keys is nil' do
120+
result = package.deconstruct_keys(nil)
121+
expect(result).to be_a(Hash)
122+
expect(result.keys).to include(:name, :owner, :dependencies, :owned, :parent_name)
123+
end
124+
end
125+
126+
describe '#inspect' do
127+
it 'returns a string representation of the package' do
128+
expect(package.inspect).to eq("#<QueryPackwerk::Package #{package_name}>")
129+
end
130+
end
131+
end

0 commit comments

Comments
 (0)