From 580a4b31a28eabdebfab135348104cc23e320c52 Mon Sep 17 00:00:00 2001 From: Jarren San Jose Date: Tue, 12 May 2026 00:31:02 -0700 Subject: [PATCH 1/3] feat: add type hints to api.py mixins (ListOrDetailSerialRelation, NameOrIdRetrieval) --- pokemon_v2/api.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index ea9cd983f..2b202edf6 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -1,11 +1,15 @@ import re import subprocess +from typing import Optional + from rest_framework import viewsets +from rest_framework.request import Request from rest_framework.response import Response +from rest_framework.serializers import BaseSerializer from rest_framework.views import APIView -from django.shortcuts import get_object_or_404 +from django.db.models import Model, Q, QuerySet from django.http import Http404 -from django.db.models import Q +from django.shortcuts import get_object_or_404 from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiParameter from drf_spectacular.types import OpenApiTypes @@ -25,9 +29,9 @@ class ListOrDetailSerialRelation: for list or detail view. """ - list_serializer_class = None + list_serializer_class: Optional[type[BaseSerializer]] = None - def get_serializer_class(self): + def get_serializer_class(self) -> type[BaseSerializer]: if self.action == "list" and self.list_serializer_class is not None: return self.list_serializer_class return self.serializer_class @@ -39,11 +43,11 @@ class NameOrIdRetrieval: pk (in this case ID) or by name """ - idPattern = re.compile(r"^-?[0-9]+$") + idPattern: re.Pattern[str] = re.compile(r"^-?[0-9]+$") # Allow alphanumeric, hyphen, plus, and space (Space added for test cases using name for lookup, ex: 'base pkm') - namePattern = re.compile(r"^[0-9A-Za-z\-\+ ]+$") + namePattern: re.Pattern[str] = re.compile(r"^[0-9A-Za-z\-\+ ]+$") - def get_queryset(self): + def get_queryset(self) -> QuerySet: queryset = super().get_queryset() filter = self.request.GET.get("q", "") @@ -52,7 +56,7 @@ def get_queryset(self): return queryset - def get_object(self): + def get_object(self) -> Model: queryset = self.get_queryset() queryset = self.filter_queryset(queryset) lookup = self.kwargs["pk"] From 26f24ac82bcb11e007cb1340e97784b3d7507676 Mon Sep 17 00:00:00 2001 From: Jarren San Jose Date: Tue, 12 May 2026 00:31:28 -0700 Subject: [PATCH 2/3] feat: add type hints to api.py viewset methods (retrieve, encounter get, meta list) --- pokemon_v2/api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index 2b202edf6..3b8e8441a 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -98,7 +98,7 @@ class PokeapiCommonViewset( ListOrDetailSerialRelation, NameOrIdRetrieval, viewsets.ReadOnlyModelViewSet ): @extend_schema(parameters=[retrieve_path_parameter]) - def retrieve(self, request, pk=None): + def retrieve(self, request: Request, pk: Optional[str] = None) -> Response: return super().retrieve(request, pk) pass @@ -988,7 +988,7 @@ class VersionGroupResource(PokeapiCommonViewset): }, ) class PokemonEncounterView(APIView): - def get(self, request, pokemon_id): + def get(self, request: Request, pokemon_id: str) -> Response: self.context = dict(request=request) try: @@ -1087,7 +1087,7 @@ def get(self, request, pokemon_id): }, ) class PokeapiMetaView(APIView): - def get(self, request): + def get(self, request: Request) -> Response: try: git_hash = ( subprocess.check_output( From 138a7852e0c8f672ca1ebcf9d4092e4689b1bc7c Mon Sep 17 00:00:00 2001 From: Jarren San Jose Date: Sat, 25 Jul 2026 01:17:25 -0700 Subject: [PATCH 3/3] style: use PEP 604 union syntax (X | None) instead of Optional --- pokemon_v2/api.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pokemon_v2/api.py b/pokemon_v2/api.py index 3b8e8441a..27b5f120c 100644 --- a/pokemon_v2/api.py +++ b/pokemon_v2/api.py @@ -1,6 +1,5 @@ import re import subprocess -from typing import Optional from rest_framework import viewsets from rest_framework.request import Request @@ -29,7 +28,7 @@ class ListOrDetailSerialRelation: for list or detail view. """ - list_serializer_class: Optional[type[BaseSerializer]] = None + list_serializer_class: type[BaseSerializer] | None = None def get_serializer_class(self) -> type[BaseSerializer]: if self.action == "list" and self.list_serializer_class is not None: @@ -98,7 +97,7 @@ class PokeapiCommonViewset( ListOrDetailSerialRelation, NameOrIdRetrieval, viewsets.ReadOnlyModelViewSet ): @extend_schema(parameters=[retrieve_path_parameter]) - def retrieve(self, request: Request, pk: Optional[str] = None) -> Response: + def retrieve(self, request: Request, pk: str | None = None) -> Response: return super().retrieve(request, pk) pass