Skip to content

Commit 92a8368

Browse files
Moving back to generic error
1 parent f1976d7 commit 92a8368

File tree

2 files changed

+61
-174
lines changed

2 files changed

+61
-174
lines changed

updater/lib/dependabot/dependency_change_builder.rb

Lines changed: 18 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -26,71 +26,6 @@ class DependencyChangeBuilder
2626
extend T::Sig
2727

2828
SUPPORT_FILE_WARNING_NAME_LIMIT = 10
29-
SUPPORT_FILES_ONLY_ERROR_MESSAGE = "FileUpdater returned only support files"
30-
31-
class SupportFilesOnly < Dependabot::DependabotError
32-
extend T::Sig
33-
34-
sig { returns(String) }
35-
attr_reader :dependency_info
36-
37-
sig { returns(T::Array[String]) }
38-
attr_reader :support_file_names
39-
40-
sig { returns(Integer) }
41-
attr_reader :omitted_support_file_count
42-
43-
sig do
44-
params(
45-
dependency_info: String,
46-
support_file_names: T::Array[String],
47-
omitted_support_file_count: Integer
48-
).void
49-
end
50-
def initialize(dependency_info:, support_file_names:, omitted_support_file_count:)
51-
@dependency_info = T.let(dependency_info.dup.freeze, String)
52-
@support_file_names = T.let(support_file_names.map { |name| name.dup.freeze }.freeze, T::Array[String])
53-
@omitted_support_file_count = T.let(omitted_support_file_count, Integer)
54-
55-
super(
56-
message_for(
57-
dependency_info: @dependency_info,
58-
support_file_names: @support_file_names,
59-
omitted_support_file_count: @omitted_support_file_count
60-
)
61-
)
62-
end
63-
64-
private
65-
66-
sig do
67-
params(
68-
dependency_info: String,
69-
support_file_names: T::Array[String],
70-
omitted_support_file_count: Integer
71-
).returns(String)
72-
end
73-
def message_for(dependency_info:, support_file_names:, omitted_support_file_count:)
74-
support_files = formatted_support_files(
75-
support_file_names: support_file_names,
76-
omitted_support_file_count: omitted_support_file_count
77-
)
78-
79-
"#{SUPPORT_FILES_ONLY_ERROR_MESSAGE} for: #{dependency_info}; excluded support files: #{support_files}"
80-
end
81-
82-
sig do
83-
params(
84-
support_file_names: T::Array[String],
85-
omitted_support_file_count: Integer
86-
).returns(String)
87-
end
88-
def formatted_support_files(support_file_names:, omitted_support_file_count:)
89-
support_files = support_file_names.join(", ")
90-
support_files += " (and #{omitted_support_file_count} more)" if omitted_support_file_count.positive?
91-
support_files
92-
end
93-
end
9429

9530
sig do
9631
params(
@@ -134,14 +69,17 @@ def initialize(job:, dependency_files:, updated_dependencies:, change_source:, n
13469
@updated_dependencies = updated_dependencies
13570
@change_source = change_source
13671
@notices = notices
72+
@support_files_only_diagnostics = T.let(nil, T.nilable(String))
13773
end
13874

13975
sig { returns(Dependabot::DependencyChange) }
14076
def run
14177
updated_files = generate_dependency_files
14278

14379
unless updated_files.any?
144-
raise DependabotError, "FileUpdater failed to update any files for: #{dependency_info_for_error}"
80+
error_message = "FileUpdater failed to update any files for: #{dependency_info_for_error}"
81+
error_message += "; #{support_files_only_diagnostics}" if support_files_only_diagnostics
82+
raise DependabotError, error_message
14583
end
14684

14785
# Remove any unchanged dependencies from the updated list
@@ -182,6 +120,9 @@ def run
182120
sig { returns(T::Array[Dependabot::Notice]) }
183121
attr_reader :notices
184122

123+
sig { returns(T.nilable(String)) }
124+
attr_reader :support_files_only_diagnostics
125+
185126
sig { returns(T.nilable(String)) }
186127
def source_dependency_name
187128
return nil unless change_source.is_a? Dependabot::Dependency
@@ -206,7 +147,8 @@ def generate_dependency_files
206147
"#{updated_dependency.version}"
207148
)
208149
else
209-
Dependabot.logger.info("Updating #{dependency_names}")
150+
dependency_names = updated_dependencies.map(&:name)
151+
Dependabot.logger.info("Updating #{dependency_names.join(', ')}")
210152
end
211153

212154
# Ignore dependencies that are tagged as information_only. These will be
@@ -225,7 +167,7 @@ def generate_dependency_files
225167
@notices.concat(updater_notices)
226168

227169
updated_files = all_files.reject(&:support_file?)
228-
handle_support_files_only!(all_files: all_files, updated_files: updated_files)
170+
add_support_files_only_diagnostics(all_files: all_files, updated_files: updated_files)
229171

230172
updated_files
231173
end
@@ -236,20 +178,18 @@ def generate_dependency_files
236178
updated_files: T::Array[Dependabot::DependencyFile]
237179
).void
238180
end
239-
def handle_support_files_only!(all_files:, updated_files:)
181+
def add_support_files_only_diagnostics(all_files:, updated_files:)
240182
return unless all_files.any? && updated_files.empty?
241183

242184
support_file_names = naturally_sorted_names(all_files.select(&:support_file?).map(&:name).uniq)
243185
listed_support_file_names = support_file_names.first(SUPPORT_FILE_WARNING_NAME_LIMIT)
244186
omitted_support_file_count = support_file_names.length - listed_support_file_names.length
187+
support_file_list = listed_support_file_names.join(", ")
188+
support_file_list += " (and #{omitted_support_file_count} more)" if omitted_support_file_count.positive?
245189

246-
error = SupportFilesOnly.new(
247-
dependency_info: dependency_info_for_error,
248-
support_file_names: listed_support_file_names,
249-
omitted_support_file_count: omitted_support_file_count
250-
)
251-
Dependabot.logger.warn(error.message)
252-
raise error
190+
diagnostics = "FileUpdater returned only support files: #{support_file_list}"
191+
@support_files_only_diagnostics = diagnostics
192+
Dependabot.logger.warn("#{diagnostics} for: #{dependency_info_for_error}")
253193
end
254194

255195
sig { params(names: T::Array[String]).returns(T::Array[String]) }
@@ -266,7 +206,7 @@ def natural_sort_segments(name)
266206
end
267207

268208
sig { returns(String) }
269-
def dependency_names
209+
def dependency_names_for_error
270210
format_names(updated_dependencies.map(&:name))
271211
end
272212

@@ -277,7 +217,7 @@ def format_names(names)
277217

278218
sig { returns(String) }
279219
def dependency_info_for_error
280-
return dependency_names unless updated_dependencies.one?
220+
return dependency_names_for_error unless updated_dependencies.one?
281221

282222
dependency = T.must(updated_dependencies.first)
283223
previous_version = dependency.previous_version || "unknown"

updater/spec/dependabot/dependency_change_builder_spec.rb

Lines changed: 43 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
)
7474
end
7575

76-
let(:support_files_only_error_message) { described_class::SUPPORT_FILES_ONLY_ERROR_MESSAGE }
7776
let(:notices) { [] }
7877
let(:lead_dependency_change_source) { build_dependency(name: "dummy-pkg-b", version: "1.1.0") }
7978
let(:single_dependency_info) { "dummy-pkg-b (1.1.0 → 1.2.0)" }
@@ -137,21 +136,6 @@ def build_support_files(names)
137136
end
138137
end
139138

140-
def expect_support_files_only_error(
141-
dependency_info:, support_file_names:, omitted_support_file_count: 0, expected_message: nil
142-
)
143-
expect { create_change }.to raise_error(described_class::SupportFilesOnly) { |error|
144-
expect(error.dependency_info).to eq(dependency_info)
145-
expect(error.support_file_names).to eq(support_file_names)
146-
expect(error.omitted_support_file_count).to eq(omitted_support_file_count)
147-
if expected_message
148-
expect(error.message).to eq(expected_message)
149-
else
150-
expect(error.message).to include(support_files_only_error_message)
151-
end
152-
}
153-
end
154-
155139
context "when the source is a lead dependency" do
156140
let(:change_source) { lead_dependency_change_source }
157141

@@ -272,64 +256,31 @@ def expect_support_files_only_error(
272256
expect(Dependabot.logger)
273257
.to receive(:warn)
274258
.with(satisfy { |message|
275-
message.include?(support_files_only_error_message) &&
259+
message.include?("FileUpdater returned only support files") &&
276260
message.include?("for: #{single_dependency_info}") &&
277-
message.include?("excluded support files:") &&
278261
message.include?("sub_dep") &&
279262
message.include?("sub_dep.lock") &&
280263
!message.include?("(and")
281264
})
282265

283-
expect_support_files_only_error(
284-
dependency_info: single_dependency_info,
285-
support_file_names: %w(sub_dep sub_dep.lock)
286-
)
266+
expect { create_change }
267+
.to raise_error(
268+
Dependabot::DependabotError,
269+
"FileUpdater failed to update any files for: dummy-pkg-b (1.1.0 → 1.2.0); " \
270+
"FileUpdater returned only support files: sub_dep, sub_dep.lock"
271+
)
287272
end
288273

289274
it "collects notices before raising" do
290-
expect_support_files_only_error(
291-
dependency_info: single_dependency_info,
292-
support_file_names: %w(sub_dep sub_dep.lock)
293-
)
275+
expect { create_change }
276+
.to raise_error(
277+
Dependabot::DependabotError,
278+
"FileUpdater failed to update any files for: dummy-pkg-b (1.1.0 → 1.2.0); " \
279+
"FileUpdater returned only support files: sub_dep, sub_dep.lock"
280+
)
294281

295282
expect(notices).to eq(updater_notices)
296283
end
297-
298-
it "exposes immutable support file names on the raised error" do
299-
expect { create_change }.to raise_error(described_class::SupportFilesOnly) { |error|
300-
expect(error.support_file_names).to be_frozen
301-
expect(error.support_file_names).to all(be_frozen)
302-
expect { error.support_file_names << "new_support_file" }.to raise_error(FrozenError)
303-
}
304-
end
305-
306-
it "exposes immutable dependency info on the raised error" do
307-
expect { create_change }.to raise_error(described_class::SupportFilesOnly) { |error|
308-
expect(error.dependency_info).to be_frozen
309-
}
310-
end
311-
312-
it "defensively copies support file names and dependency info" do
313-
dependency_info = +"dummy-pkg-b (1.1.0 → 1.2.0)"
314-
support_file_names = ["sub_dep", "sub_dep.lock"]
315-
316-
error = described_class::SupportFilesOnly.new(
317-
dependency_info: dependency_info,
318-
support_file_names: support_file_names,
319-
omitted_support_file_count: 0
320-
)
321-
322-
dependency_info << " (mutated)"
323-
support_file_names << "new_support_file"
324-
325-
expect(error.dependency_info).to eq("dummy-pkg-b (1.1.0 → 1.2.0)")
326-
expect(error.support_file_names).to eq(%w(sub_dep sub_dep.lock))
327-
expect(error.message).to start_with(
328-
"#{support_files_only_error_message} for: dummy-pkg-b (1.1.0 → 1.2.0);"
329-
)
330-
expect(error.message).to include("excluded support files: sub_dep, sub_dep.lock")
331-
expect(error.message).not_to include("new_support_file")
332-
end
333284
end
334285

335286
context "when grouped updates return only support files" do
@@ -347,16 +298,13 @@ def expect_support_files_only_error(
347298
stub_file_updater(updated_dependency_files: support_files)
348299
end
349300

350-
it "raises an exception with sorted and unique dependency names" do
351-
expected_message =
352-
"FileUpdater returned only support files for: dummy-pkg-a, dummy-pkg-b; " \
353-
"excluded support files: sub_dep, sub_dep.lock"
354-
355-
expect_support_files_only_error(
356-
dependency_info: "dummy-pkg-a, dummy-pkg-b",
357-
support_file_names: %w(sub_dep sub_dep.lock),
358-
expected_message: expected_message
359-
)
301+
it "raises a diagnostics error with sorted and unique dependency names" do
302+
expect { create_change }
303+
.to raise_error(
304+
Dependabot::DependabotError,
305+
"FileUpdater failed to update any files for: dummy-pkg-a, dummy-pkg-b; " \
306+
"FileUpdater returned only support files: sub_dep, sub_dep.lock"
307+
)
360308
end
361309
end
362310

@@ -373,22 +321,17 @@ def expect_support_files_only_error(
373321
stub_file_updater(updated_dependency_files: support_files)
374322
end
375323

376-
it "warns with the listed limit and omitted count" do
377-
expect(Dependabot.logger)
378-
.to receive(:warn)
379-
.with(satisfy { |message|
380-
message.include?(support_files_only_error_message) &&
381-
message.include?("excluded support files:") &&
382-
message.include?("(and 1 more)")
383-
})
324+
it "adds omitted count to diagnostics" do
325+
expected_support_files = Array.new(described_class::SUPPORT_FILE_WARNING_NAME_LIMIT) do |index|
326+
"support_#{index}.txt"
327+
end.join(", ")
384328

385-
expect_support_files_only_error(
386-
dependency_info: single_dependency_info,
387-
support_file_names: Array.new(described_class::SUPPORT_FILE_WARNING_NAME_LIMIT) do |index|
388-
"support_#{index}.txt"
389-
end,
390-
omitted_support_file_count: 1
391-
)
329+
expect { create_change }
330+
.to raise_error(
331+
Dependabot::DependabotError,
332+
"FileUpdater failed to update any files for: dummy-pkg-b (1.1.0 → 1.2.0); " \
333+
"FileUpdater returned only support files: #{expected_support_files} (and 1 more)"
334+
)
392335
end
393336
end
394337

@@ -402,11 +345,13 @@ def expect_support_files_only_error(
402345
stub_file_updater(updated_dependency_files: support_files)
403346
end
404347

405-
it "orders support file names naturally in the raised error" do
406-
expect_support_files_only_error(
407-
dependency_info: single_dependency_info,
408-
support_file_names: %w(support_1.txt support_2.txt support_10.txt)
409-
)
348+
it "orders support file names naturally in diagnostics" do
349+
expect { create_change }
350+
.to raise_error(
351+
Dependabot::DependabotError,
352+
"FileUpdater failed to update any files for: dummy-pkg-b (1.1.0 → 1.2.0); " \
353+
"FileUpdater returned only support files: support_1.txt, support_2.txt, support_10.txt"
354+
)
410355
end
411356
end
412357

@@ -421,10 +366,12 @@ def expect_support_files_only_error(
421366
end
422367

423368
it "orders support file names naturally regardless of case" do
424-
expect_support_files_only_error(
425-
dependency_info: single_dependency_info,
426-
support_file_names: ["support_1.txt", "Support_2.txt", "support_10.txt"]
427-
)
369+
expect { create_change }
370+
.to raise_error(
371+
Dependabot::DependabotError,
372+
"FileUpdater failed to update any files for: dummy-pkg-b (1.1.0 → 1.2.0); " \
373+
"FileUpdater returned only support files: support_1.txt, Support_2.txt, support_10.txt"
374+
)
428375
end
429376
end
430377
end

0 commit comments

Comments
 (0)