summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEllen Marie Dash <me@duckie.co>2024-09-28 14:24:17 -0400
committergit <svn-admin@ruby-lang.org>2024-10-23 20:03:13 +0000
commit35f0b7c83fbeac0fa13df253b90aea5919715a7f (patch)
tree1e4e2033aa0d87cbaf8b65602ee14ed011d9c5c1 /lib
parent5460d5b1193c9e899db9bbe455a2042c57ab4a09 (diff)
[rubygems/rubygems] [suggest_gems_from_name] Bail early if the value is guaranteed to be rejected.
https://github.com/rubygems/rubygems/commit/56262a9384
Diffstat (limited to 'lib')
-rw-r--r--lib/rubygems/spec_fetcher.rb9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/rubygems/spec_fetcher.rb b/lib/rubygems/spec_fetcher.rb
index 9c0399f196..d6dd59e4bd 100644
--- a/lib/rubygems/spec_fetcher.rb
+++ b/lib/rubygems/spec_fetcher.rb
@@ -174,8 +174,17 @@ class Gem::SpecFetcher
max = gem_name.size / 2
names = available_specs(type).first.values.flatten(1)
+ min_length = gem_name.length - max
+ max_length = gem_name.length + max
+
matches = names.map do |n|
+ len = n.name.length
+ # If the length is min_length or shorter, we've done `max` deletions.
+ # If the length is max_length or longer, we've done `max` insertions.
+ # These would both be rejected later, so we bail early for performance.
+ next if len <= min_length || len >= max_length
next unless n.match_platform?
+
distance = levenshtein_distance gem_name, n.name.downcase.tr("_-", "")
next if distance >= max
return [n.name] if distance == 0