Skip to content

Commit ed3f191

Browse files
authored
Simplify offense data model by removing adapter pattern (#63)
Remove the adapter classes (PackageAdapter, ConstantAdapter, ReferenceAdapter, LocationAdapter) from PksOffense that existed solely to make it compatible with Packwerk::ReferenceOffense interface. Instead, use PksOffense's direct properties throughout: - offense.constant_name instead of offense.reference.constant.name - offense.file instead of offense.reference.relative_path - offense.line instead of offense.location.line - offense.defining_pack_name instead of offense.reference.constant.package.name Update Check::OffensesFormatter interface to accept PksOffense directly instead of Packwerk::ReferenceOffense, and update DefaultFormatter to resolve constant locations via Private.constant_resolver. Closes dp-5q5
1 parent ca59fa8 commit ed3f191

5 files changed

Lines changed: 23 additions & 73 deletions

File tree

lib/danger-packwerk/check/default_formatter.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,23 @@ def initialize(custom_help_message: nil)
1919

2020
sig do
2121
override.params(
22-
offenses: T::Array[Packwerk::ReferenceOffense],
22+
offenses: T::Array[PksOffense],
2323
repo_link: String,
2424
org_name: String,
2525
repo_url_builder: T.nilable(T.proc.params(constant_path: String).returns(String))
2626
).returns(String)
2727
end
2828
def format_offenses(offenses, repo_link, org_name, repo_url_builder: nil)
29-
reference_offense = T.must(offenses.first)
29+
offense = T.must(offenses.first)
3030
violation_types = offenses.map(&:violation_type)
31-
referencing_file = reference_offense.reference.relative_path
31+
referencing_file = offense.file
3232
referencing_file_pack = ParsePackwerk.package_from_path(referencing_file).name
3333
# We remove leading double colons as they feel like an implementation detail of packwerk.
34-
constant_name = reference_offense.reference.constant.name.delete_prefix('::')
34+
constant_name = offense.constant_name.delete_prefix('::')
3535

36-
constant_source_package_name = reference_offense.reference.constant.package.name
36+
constant_source_package_name = offense.defining_pack_name
3737

38-
constant_location = reference_offense.reference.constant.location
38+
constant_location = Private.constant_resolver.resolve(offense.constant_name)&.location || offense.file
3939
constant_source_package = T.must(ParsePackwerk.all.find { |p| p.name == constant_source_package_name })
4040
constant_source_package_ownership_info = Private::OwnershipInformation.for_package(constant_source_package, org_name)
4141

lib/danger-packwerk/check/offenses_formatter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module OffensesFormatter
1212

1313
sig do
1414
abstract.params(
15-
offenses: T::Array[Packwerk::ReferenceOffense],
15+
offenses: T::Array[PksOffense],
1616
repo_link: String,
1717
org_name: String,
1818
repo_url_builder: T.nilable(T.proc.params(constant_path: String).returns(String))

lib/danger-packwerk/danger_packwerk.rb

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ class DangerPackwerk < Danger::Plugin
2020
# especially given all violations should fail the build anyways.
2121
# We set a max (rather than unlimited) to avoid GitHub rate limiting and general spam if a PR does some sort of mass rename.
2222
DEFAULT_MAX_COMMENTS = 15
23-
# Support both legacy Packwerk::ReferenceOffense and new PksOffense types
24-
OnFailure = T.type_alias { T.proc.params(offenses: T::Array[T.any(Packwerk::ReferenceOffense, PksOffense)]).void }
23+
OnFailure = T.type_alias { T.proc.params(offenses: T::Array[PksOffense]).void }
2524
DEFAULT_ON_FAILURE = T.let(->(offenses) {}, OnFailure)
2625
DEFAULT_FAIL = false
2726
DEFAULT_FAILURE_MESSAGE = 'Packwerk violations were detected! Please resolve them to unblock the build.'
@@ -109,8 +108,7 @@ def check(
109108
renamed_files = git_filesystem.renamed_files.map { |before_after_file| before_after_file[:after] }
110109

111110
offenses_to_care_about = pks_offenses.reject do |offense|
112-
constant_name = offense.reference.constant.name
113-
filepath_that_defines_this_constant = Private.constant_resolver.resolve(constant_name)&.location
111+
filepath_that_defines_this_constant = Private.constant_resolver.resolve(offense.constant_name)&.location
114112
# Ignore references that have been renamed
115113
renamed_files.include?(filepath_that_defines_this_constant) ||
116114
# Ignore violations that are not in the allow-list of violation types to leave comments for
@@ -123,14 +121,14 @@ def check(
123121
case grouping_strategy
124122
when CommentGroupingStrategy::PerConstantPerLocation
125123
[
126-
offense.reference.constant.name,
127-
offense.location.line,
128-
offense.reference.relative_path
124+
offense.constant_name,
125+
offense.line,
126+
offense.file
129127
]
130128
when CommentGroupingStrategy::PerConstantPerPack
131129
[
132-
offense.reference.constant.name,
133-
ParsePackwerk.package_from_path(offense.reference.relative_path)
130+
offense.constant_name,
131+
ParsePackwerk.package_from_path(offense.file)
134132
]
135133
else
136134
T.absurd(grouping_strategy)
@@ -141,11 +139,10 @@ def check(
141139
current_comment_count += 1
142140

143141
offense = T.must(unique_offenses.first)
144-
line_number = offense.location.line
145-
referencing_file = offense.reference.relative_path
142+
line_number = offense.line
143+
referencing_file = offense.file
146144

147-
# PksOffense adapters provide Packwerk::ReferenceOffense-compatible interface
148-
message = offenses_formatter.format_offenses(T.unsafe(unique_offenses), repo_link, org_name, repo_url_builder: repo_url_builder)
145+
message = offenses_formatter.format_offenses(unique_offenses, repo_link, org_name, repo_url_builder: repo_url_builder)
149146
markdown(message, file: git_filesystem.convert_to_filesystem(referencing_file), line: line_number)
150147
end
151148

lib/danger-packwerk/pks_offense.rb

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
module DangerPackwerk
66
#
77
# PksOffense represents a violation from pks JSON output.
8-
# It is designed to have a compatible interface with BasicReferenceOffense
9-
# so it can be used with the Update::OffensesFormatter.
10-
#
11-
# It also provides adapter objects (reference, location) for compatibility
12-
# with Packwerk::ReferenceOffense interface used by Check::OffensesFormatter.
8+
# It has a compatible interface with BasicReferenceOffense for use with formatters.
139
#
1410
class PksOffense < T::Struct
1511
extend T::Sig
@@ -24,50 +20,6 @@ class PksOffense < T::Struct
2420
const :strict, T::Boolean
2521
const :message, String
2622

27-
#
28-
# Adapter classes for Packwerk::ReferenceOffense compatibility
29-
# These allow PksOffense to be used with Check::OffensesFormatter
30-
#
31-
class PackageAdapter < T::Struct
32-
const :name, String
33-
end
34-
35-
class ConstantAdapter < T::Struct
36-
const :name, String
37-
const :location, String
38-
const :package, PackageAdapter
39-
end
40-
41-
class ReferenceAdapter < T::Struct
42-
const :relative_path, String
43-
const :constant, ConstantAdapter
44-
end
45-
46-
class LocationAdapter < T::Struct
47-
const :line, Integer
48-
end
49-
50-
# Adapter for Packwerk::ReferenceOffense.reference
51-
sig { returns(ReferenceAdapter) }
52-
def reference
53-
package_adapter = PackageAdapter.new(name: defining_pack_name)
54-
constant_adapter = ConstantAdapter.new(
55-
name: constant_name,
56-
location: file, # Best approximation - pks doesn't provide constant definition location
57-
package: package_adapter
58-
)
59-
ReferenceAdapter.new(
60-
relative_path: file,
61-
constant: constant_adapter
62-
)
63-
end
64-
65-
# Adapter for Packwerk::ReferenceOffense.location
66-
sig { returns(LocationAdapter) }
67-
def location
68-
LocationAdapter.new(line: line)
69-
end
70-
7123
# Alias methods for compatibility with BasicReferenceOffense interface
7224
sig { returns(String) }
7325
def class_name

spec/danger_packwerk/danger_packwerk_spec.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ module DangerPackwerk
5757
include Check::OffensesFormatter
5858

5959
def format_offenses(offenses, repo_link, org_name, repo_url_builder:)
60-
constant_location = offenses.first.reference.constant.location
61-
constant_name = offenses.first.reference.constant.name
60+
offense = offenses.first
61+
constant_location = offense.file
62+
constant_name = offense.constant_name
6263
url = repo_url_builder&.call(constant_location.to_s)
63-
offenses.map { |offense| "#{offense.message} [#{constant_name}](#{url})" }.join("\n\n")
64+
offenses.map { |o| "#{o.message} [#{constant_name}](#{url})" }.join("\n\n")
6465
end
6566
end
6667
end
@@ -601,7 +602,7 @@ def format_offenses(offenses, repo_link, org_name, repo_url_builder:)
601602
actual_markdowns = dangerfile.status_report[:markdowns]
602603
expect(actual_markdowns.count).to eq 1
603604
actual_markdown = actual_markdowns.first
604-
# The formatter uses offenses.first.reference.constant.location for all URLs
605+
# The formatter uses offense.file for all URLs
605606
expect(actual_markdown.message).to eq(<<~MSG.chomp)
606607
Vanilla message about privacy violations [::PrivateConstant](https://github.com/MyOrg/my_repo/blob/my_branch/packs/referencing_pack/some_file.rb)
607608

0 commit comments

Comments
 (0)