|
34 | 34 | from zope.interface import implementer
|
35 | 35 |
|
36 | 36 | from warehouse.admin.flags import AdminFlagValue
|
| 37 | +from warehouse.cache import IQueryResultsCache |
37 | 38 | from warehouse.email import send_pending_trusted_publisher_invalidated_email
|
38 | 39 | from warehouse.events.tags import EventTag
|
39 | 40 | from warehouse.helpdesk.interfaces import IAdminNotificationService
|
@@ -411,13 +412,18 @@ def create_service(cls, context, request):
|
411 | 412 |
|
412 | 413 | @implementer(IProjectService)
|
413 | 414 | class ProjectService:
|
414 |
| - def __init__(self, session, metrics=None, ratelimiters=None) -> None: |
| 415 | + def __init__( |
| 416 | + self, session, metrics=None, ratelimiters=None, query_results_cache=None |
| 417 | + ) -> None: |
415 | 418 | if ratelimiters is None:
|
416 | 419 | ratelimiters = {}
|
| 420 | + if query_results_cache is None: |
| 421 | + query_results_cache = {} |
417 | 422 |
|
418 | 423 | self.db = session
|
419 | 424 | self.ratelimiters = collections.defaultdict(DummyRateLimiter, ratelimiters)
|
420 | 425 | self._metrics = metrics
|
| 426 | + self._query_results_cache = query_results_cache |
421 | 427 |
|
422 | 428 | def _check_ratelimits(self, request, creator):
|
423 | 429 | # First we want to check if a single IP is exceeding our rate limiter.
|
@@ -486,7 +492,10 @@ def check_project_name(self, name: str) -> None:
|
486 | 492 | raise ProjectNameUnavailableSimilarError(similar_project_name)
|
487 | 493 |
|
488 | 494 | # Check for typo-squatting.
|
489 |
| - if typo_check_match := typo_check_name(canonicalize_name(name)): |
| 495 | + cached_corpus = self._query_results_cache.get("top_dependents_corpus") |
| 496 | + if typo_check_match := typo_check_name( |
| 497 | + canonicalize_name(name), corpus=cached_corpus |
| 498 | + ): |
490 | 499 | raise ProjectNameUnavailableTypoSquattingError(
|
491 | 500 | check_name=typo_check_match[0],
|
492 | 501 | existing_project_name=typo_check_match[1],
|
@@ -718,4 +727,10 @@ def project_service_factory(context, request):
|
718 | 727 | IRateLimiter, name="project.create.ip", context=None
|
719 | 728 | ),
|
720 | 729 | }
|
721 |
| - return ProjectService(request.db, metrics=metrics, ratelimiters=ratelimiters) |
| 730 | + query_results_cache = request.find_service(IQueryResultsCache) |
| 731 | + return ProjectService( |
| 732 | + request.db, |
| 733 | + metrics=metrics, |
| 734 | + ratelimiters=ratelimiters, |
| 735 | + query_results_cache=query_results_cache, |
| 736 | + ) |
0 commit comments