Skip to content

Commit dfcdab7

Browse files
authored
Merge branch 'pypi:main' into main
2 parents 344784f + a5d7b84 commit dfcdab7

File tree

7 files changed

+39
-18
lines changed

7 files changed

+39
-18
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ ignore_missing_imports = true
8282
[tool.pytest.ini_options]
8383
addopts = [
8484
"--disable-socket",
85-
"--allow-hosts=localhost,::1,stripe",
85+
"--allow-hosts=localhost,::1,stripe,redis",
8686
"--durations=20",
8787
"--numprocesses=auto",
8888
# Disable ddtrace for tests

requirements/lint.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -525,9 +525,9 @@ types-certifi==2021.10.8.3 \
525525
--hash=sha256:72cf7798d165bc0b76e1c10dd1ea3097c7063c42c21d664523b928e88b554a4f \
526526
--hash=sha256:b2d1e325e69f71f7c78e5943d410e650b4707bb0ef32e4ddf3da37f54176e88a
527527
# via -r requirements/lint.in
528-
types-cffi==1.16.0.20250318 \
529-
--hash=sha256:1be00aa4274c8d5595ed96648db8fa4de06a1fa8e53c408b94b90b7215fe03ff \
530-
--hash=sha256:ccaed0d3c4110ee232b301bc550b7cfac51520dd1c6b0a48fe06307ba4cc0e4e
528+
types-cffi==1.17.0.20250319 \
529+
--hash=sha256:5e95f0f10d3f2fd0a8a0a10f6b8b1e0e6ff47796ad2fdd4302b5e514b64d6af4 \
530+
--hash=sha256:66b0656818e5363f136a0a361f28e41330b55f83d390b14c6bf56026f57b3603
531531
# via types-pyopenssl
532532
types-first==2.0.5.20240806 \
533533
--hash=sha256:11e3eba5bfc294be7afc6cea00be69cb20244674df117aa67648dcbd26c96766 \
@@ -541,9 +541,9 @@ types-itsdangerous==1.1.6 \
541541
--hash=sha256:21c6966c10e353a5d35d36c82aaa2c5598d3bc32ddc8e0591276da5ad2e3c638 \
542542
--hash=sha256:aef2535c2fa0527dcce244ece0792b20ec02ee46533800735275f82a45a0244d
543543
# via -r requirements/lint.in
544-
types-passlib==1.7.7.20250318 \
545-
--hash=sha256:038c9f982ef5fb70c1954458d26cc5cbf0d76c77bf6e16d99d32a6be7600080b \
546-
--hash=sha256:a5d618acd79dbb6b84252b4aaee9e39eb4909e204f09b0f81be5aa42214117f3
544+
types-passlib==1.7.7.20250319 \
545+
--hash=sha256:13bcec71852208f63459fcdd9f694bedf66639b2c7de5849a8efa9272f0bd4be \
546+
--hash=sha256:50ecbe0cc8ff91b8523bd4ca6a8bf6e0a0ac655872690d8ef18002a311f20378
547547
# via -r requirements/lint.in
548548
types-pyopenssl==24.1.0.20240722 \
549549
--hash=sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39 \
@@ -582,9 +582,9 @@ types-stripe==3.5.2.20240106 \
582582
--hash=sha256:63a36958f0dc4a71685b027f0b6d807ff197ee337135ac19a0f8b6132365ca52 \
583583
--hash=sha256:9ea7bc9b9889a3d8606114c52dcc70a8fc62d44a46da4bc5ee19f0d463674bb8
584584
# via -r requirements/lint.in
585-
types-webob==1.8.0.20250226 \
586-
--hash=sha256:066950ab6855e9e5b2536de02f9825a81894dcdfe3e5adc9a5037c70a5ef10ed \
587-
--hash=sha256:8703b80b97ddf5a77647536d54bf41bcbce75bfd865143e6f34578548c58059a
585+
types-webob==1.8.0.20250319 \
586+
--hash=sha256:4a64ffb72af06e2ec1d0f6798e6ecbb5fcba8283b771eb70af67f9f399a78fad \
587+
--hash=sha256:6948384355b31a5313666c6f9b67c0922185128dfc751ceeda3108b7fb183a2c
588588
# via -r requirements/lint.in
589589
types-wtforms==3.2.1.20250304 \
590590
--hash=sha256:4844534fc16e59571e337fb681329a14b161adeecb50b281124079070b80a59c \

requirements/tests.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ factory-boy==3.3.3 \
179179
--hash=sha256:1c39e3289f7e667c4285433f305f8d506efc2fe9c73aaea4151ebd5cdea394fc \
180180
--hash=sha256:866862d226128dfac7f2b4160287e899daf54f2612778327dd03d0e2cb1e3d03
181181
# via -r requirements/tests.in
182-
faker==37.0.0 \
183-
--hash=sha256:2598f78b76710a4ed05e197dda5235be409b4c291ba5c9c7514989cfbc7a5144 \
184-
--hash=sha256:d2e4e2a30d459a8ec0ae52a552aa51c48973cb32cf51107dee90f58a8322a880
182+
faker==37.0.1 \
183+
--hash=sha256:3a71763f28d796c1d770b90e6b7519d75120a84b5dc4cdd27237870cc0451ff7 \
184+
--hash=sha256:92bb009dcc708244b446be2f0c11a843fca90ea6e412a2addfef0cf2849c94f9
185185
# via factory-boy
186186
freezegun==1.5.1 \
187187
--hash=sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9 \

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ def get_app_config(database, nondefaults=None):
320320
"database.url": database,
321321
"docs.url": "http://docs.example.com/",
322322
"ratelimit.url": "memory://",
323-
"db_results_cache.url": "redis://localhost:0/",
323+
"db_results_cache.url": "redis://redis:0/",
324324
"opensearch.url": "https://localhost/warehouse",
325325
"files.backend": "warehouse.packaging.services.LocalFileStorage",
326326
"archive_files.backend": "warehouse.packaging.services.LocalArchiveFileStorage",

tests/unit/cache/test_services.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ def test_create_service(self):
3434

3535
assert isinstance(service, RedisQueryResults)
3636

37+
def test_get_missing(self, query_results_cache_service):
38+
# Attempt to get a value that doesn't exist in the cache
39+
result = query_results_cache_service.get("missing_key")
40+
41+
assert result is None
42+
3743
def test_set_get_simple(self, query_results_cache_service):
3844
# Set a value in the cache
3945
query_results_cache_service.set("test_key", {"foo": "bar"})

warehouse/cache/services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def get(self, key: str) -> list | dict | None:
4949
"""Get a cached result by key."""
5050
result = self.redis_client.get(key)
5151
# deserialize the value as a JSON object
52-
return orjson.loads(result)
52+
return orjson.loads(result) if result else None
5353

5454
def set(self, key: str, value) -> None:
5555
"""Set a cached result by key."""

warehouse/packaging/services.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from zope.interface import implementer
3535

3636
from warehouse.admin.flags import AdminFlagValue
37+
from warehouse.cache import IQueryResultsCache
3738
from warehouse.email import send_pending_trusted_publisher_invalidated_email
3839
from warehouse.events.tags import EventTag
3940
from warehouse.helpdesk.interfaces import IAdminNotificationService
@@ -411,13 +412,18 @@ def create_service(cls, context, request):
411412

412413
@implementer(IProjectService)
413414
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:
415418
if ratelimiters is None:
416419
ratelimiters = {}
420+
if query_results_cache is None:
421+
query_results_cache = {}
417422

418423
self.db = session
419424
self.ratelimiters = collections.defaultdict(DummyRateLimiter, ratelimiters)
420425
self._metrics = metrics
426+
self._query_results_cache = query_results_cache
421427

422428
def _check_ratelimits(self, request, creator):
423429
# 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:
486492
raise ProjectNameUnavailableSimilarError(similar_project_name)
487493

488494
# 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+
):
490499
raise ProjectNameUnavailableTypoSquattingError(
491500
check_name=typo_check_match[0],
492501
existing_project_name=typo_check_match[1],
@@ -718,4 +727,10 @@ def project_service_factory(context, request):
718727
IRateLimiter, name="project.create.ip", context=None
719728
),
720729
}
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

Comments
 (0)