Skip to content

Commit

Permalink
🧎‍♀️OMFG NO WAY NO MORE TYPE ERRORS
Browse files Browse the repository at this point in the history
  • Loading branch information
ashleyzhang01 committed Nov 13, 2024
1 parent 0c305c6 commit df34e66
Show file tree
Hide file tree
Showing 17 changed files with 117 additions and 105 deletions.
2 changes: 1 addition & 1 deletion backend/laundry/api_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def parse_a_hall(hall_link: str) -> dict[str, Any]:
washers = {"open": 0, "running": 0, "out_of_order": 0, "offline": 0, "time_remaining": []}
dryers = {"open": 0, "running": 0, "out_of_order": 0, "offline": 0, "time_remaining": []}

detailed = []
detailed: list[dict[str, Any]] = []

try:
page = requests.get(
Expand Down
26 changes: 13 additions & 13 deletions backend/laundry/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,25 @@


class LaundryRoom(models.Model):
hall_id = models.IntegerField(default=0)
name = models.CharField(max_length=255)
location = models.CharField(max_length=255)
total_washers = models.IntegerField(default=0)
total_dryers = models.IntegerField(default=0)
hall_id: models.IntegerField = models.IntegerField(default=0)
name: models.CharField = models.CharField(max_length=255)
location: models.CharField = models.CharField(max_length=255)
total_washers: models.IntegerField = models.IntegerField(default=0)
total_dryers: models.IntegerField = models.IntegerField(default=0)

# Each Laundry Room has a UUID that we need to
# access Penn API laundry data
uuid = models.UUIDField(default=uuid.uuid4)
uuid: models.UUIDField = models.UUIDField(default=uuid.uuid4)

def __str__(self):
def __str__(self) -> str:
return f"Hall No. {self.hall_id} | {self.name}"


class LaundrySnapshot(models.Model):
room = models.ForeignKey(LaundryRoom, on_delete=models.CASCADE, null=True)
date = models.DateTimeField(default=timezone.now)
available_washers = models.IntegerField()
available_dryers = models.IntegerField()
room: models.ForeignKey = models.ForeignKey(LaundryRoom, on_delete=models.CASCADE, null=True)
date: models.DateTimeField = models.DateTimeField(default=timezone.now)
available_washers: models.IntegerField = models.IntegerField()
available_dryers: models.IntegerField = models.IntegerField()

def __str__(self):
return f"Hall No. {self.room.hall_id} | {self.date.date()}"
def __str__(self) -> str:
return f"Hall No. {self.room.hall_id} | {self.date.date()}" # ignore: type[attr-defined]
2 changes: 1 addition & 1 deletion backend/manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import sys


def main():
def main() -> None:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pennmobile.settings.development")
try:
from django.core.management import execute_from_command_line
Expand Down
12 changes: 7 additions & 5 deletions backend/pennmobile/admin.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
# CUSTOM ADMIN SETTUP FOR PENN MOBILE
from typing import Any, Dict, Optional, Type, TypeAlias
from typing import Any, Dict, Optional, Type, TypeAlias, TypeVar

from django.contrib import admin, messages
from django.contrib.admin.apps import AdminConfig
from django.db.models import Model
from django.http import HttpRequest
from django.urls import reverse
from django.utils.html import format_html

from portal.models import Poll, Post

ModelType: TypeAlias = Type[Model]

ContentType = TypeVar("ContentType", Poll, Post)
AdminContext: TypeAlias = Dict[str, Any]
MessageText: TypeAlias = str


def add_post_poll_message(request: HttpRequest, model: ModelType) -> None:
def add_post_poll_message(request: HttpRequest, model: Type[ContentType]) -> None:
if (count := model.objects.filter(model.ACTION_REQUIRED_CONDITION).count()) > 0:
link = reverse(f"admin:{model._meta.app_label}_{model._meta.model_name}_changelist")
messages.info(
Expand Down Expand Up @@ -43,4 +44,5 @@ class PennMobileAdminConfig(AdminConfig):
default_site = "pennmobile.admin.CustomAdminSite"


admin.AdminSite = CustomAdminSite # anything else that overrides default admin should override ours
# anything else that overrides default admin should override ours
admin.site = CustomAdminSite()
3 changes: 2 additions & 1 deletion backend/pennmobile/celery.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
from typing import Any

from celery import Celery

Expand All @@ -21,5 +22,5 @@


@app.task(bind=True)
def debug_task(self) -> None:
def debug_task(self: Any) -> None:
print(f"Request: {self.request!r}")
2 changes: 1 addition & 1 deletion backend/pennmobile/settings/production.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
ALLOWED_HOSTS = DOMAINS

# Make sure SECRET_KEY is set to a secret in production
SECRET_KEY = os.environ.get("SECRET_KEY", None)
SECRET_KEY = os.environ.get("SECRET_KEY", "")

# Sentry settings
SENTRY_URL = os.environ.get("SENTRY_URL", "")
Expand Down
11 changes: 6 additions & 5 deletions backend/pennmobile/test_runner.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
from typing import Any
from unittest import mock

from django.test.runner import DiscoverRunner
from xmlrunner.extra.djangotestrunner import XMLTestRunner


def check_wharton(*args) -> bool:
def check_wharton(*args: Any) -> bool:
return False


class MockLabsAnalytics:

def __init__(self):
def __init__(self) -> None:
pass

def submit(self, txn):
def submit(self, txn: Any) -> None:
pass


class MobileTestCIRunner(XMLTestRunner):
@mock.patch("analytics.analytics.LabsAnalytics", MockLabsAnalytics)
@mock.patch("gsr_booking.models.GroupMembership.check_wharton", check_wharton)
def run_tests(self, test_labels, **kwargs) -> None:
def run_tests(self, test_labels: list[str], **kwargs: Any) -> int:
return super().run_tests(test_labels, **kwargs)


class MobileTestLocalRunner(DiscoverRunner):
@mock.patch("analytics.analytics.LabsAnalytics", MockLabsAnalytics)
@mock.patch("gsr_booking.models.GroupMembership.check_wharton", check_wharton)
def run_tests(self, test_labels, **kwargs) -> None:
def run_tests(self, test_labels: list[str], **kwargs: Any) -> int:
return super().run_tests(test_labels, **kwargs)
6 changes: 4 additions & 2 deletions backend/pennmobile/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@
path("sublet/", include("sublet.urls")),
]

urlpatterns: URLPatternList = [
urlpatterns: URLPatternList = [ # type: ignore[no-redef]
path("api/", include(urlpatterns)),
path("", include((urlpatterns, "apex"))),
]

if settings.DEBUG:
import debug_toolbar

urlpatterns: URLPatternList = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
urlpatterns: URLPatternList = [ # type: ignore[no-redef]
path("__debug__/", include(debug_toolbar.urls))
] + urlpatterns
12 changes: 6 additions & 6 deletions backend/tests/laundry/test_api_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

@mock.patch("requests.get", fakeLaundryGet)
class TestAllStatus(TestCase):
def setUp(self):
def setUp(self) -> None:
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
)
Expand All @@ -27,7 +27,7 @@ def setUp(self):
hall_id=3, name="Craig", location="Quad", total_washers=3, total_dryers=3
)

def test_all_status(self):
def test_all_status(self) -> None:

data = all_status()

Expand Down Expand Up @@ -56,7 +56,7 @@ def test_all_status(self):

@mock.patch("requests.get", fakeLaundryGet)
class TestHallStatus(TestCase):
def setUp(self):
def setUp(self) -> None:
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
)
Expand All @@ -70,7 +70,7 @@ def setUp(self):
hall_id=3, name="Craig", location="Quad", total_washers=3, total_dryers=3
)

def test_all_status(self):
def test_all_status(self) -> None:

for room in LaundryRoom.objects.all():

Expand All @@ -88,7 +88,7 @@ def test_all_status(self):

@mock.patch("requests.get", fakeLaundryGet)
class TestSaveData(TestCase):
def setUp(self):
def setUp(self) -> None:
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
)
Expand All @@ -102,7 +102,7 @@ def setUp(self):
hall_id=3, name="Craig", location="Quad", total_washers=3, total_dryers=3
)

def test_save_data(self):
def test_save_data(self) -> None:

self.assertEqual(LaundrySnapshot.objects.all().count(), 0)

Expand Down
10 changes: 6 additions & 4 deletions backend/tests/laundry/test_commands.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import csv
from io import StringIO
from typing import Any
from unittest import mock

import requests
from django.conf import settings
from django.core.management import call_command
from django.test import TestCase

from laundry.models import LaundryRoom, LaundrySnapshot


def fakeLaundryGet(url, *args, **kwargs):
def fakeLaundryGet(url: str, *args: Any, **kwargs: Any) -> requests.models.Response:
if settings.LAUNDRY_URL in url:
with open("tests/laundry/laundry_snapshot.html", "rb") as f:
m = mock.MagicMock(content=f.read())
Expand All @@ -20,7 +22,7 @@ def fakeLaundryGet(url, *args, **kwargs):

@mock.patch("requests.get", fakeLaundryGet)
class TestGetSnapshot(TestCase):
def setUp(self):
def setUp(self) -> None:
# populates database with LaundryRooms
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
Expand All @@ -35,7 +37,7 @@ def setUp(self):
hall_id=3, name="Craig", location="Quad", total_washers=3, total_dryers=3
)

def test_db_populate(self):
def test_db_populate(self) -> None:
out = StringIO()
call_command("get_snapshot", stdout=out)

Expand All @@ -48,7 +50,7 @@ def test_db_populate(self):

@mock.patch("requests.get", fakeLaundryGet)
class TestLaundryRoomMigration(TestCase):
def test_db_populate(self):
def test_db_populate(self) -> None:
out = StringIO()
call_command("load_laundry_rooms", stdout=out)

Expand Down
10 changes: 5 additions & 5 deletions backend/tests/laundry/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class LaundrySnapshotTestCase(TestCase):
def setUp(self):
def setUp(self) -> None:
# populates database with LaundryRooms
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
Expand All @@ -23,15 +23,15 @@ def setUp(self):
room=self.laundry_room, available_washers=10, available_dryers=10
)

def test_str(self):
def test_str(self) -> None:
self.assertEqual(
str(self.snapshot),
f"Hall No. {self.snapshot.room.hall_id} | {self.snapshot.date.date()}",
f"Hall No. {self.snapshot.room.hall_id} | {self.snapshot.date.date()}", # ignore: type
)


class LaundryRoomTestCase(TestCase):
def setUp(self):
def setUp(self) -> None:
# populates database with LaundryRooms
LaundryRoom.objects.get_or_create(
hall_id=0, name="Bishop White", location="Quad", total_washers=9, total_dryers=9
Expand All @@ -47,5 +47,5 @@ def setUp(self):
)
self.room = LaundryRoom.objects.create(hall_id=1, name="test hall", location="location")

def test_str(self):
def test_str(self) -> None:
self.assertEqual(str(self.room), f"Hall No. {self.room.hall_id} | {self.room.name}")
Loading

0 comments on commit df34e66

Please sign in to comment.