Skip to content
Open

Mypy #690

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ jobs:
- name: Lint with flake8
run: |
make lint
- name: Run mypy
run: |
uv run mypy .
- name: Run collectstatic
run: |
make collectstatic
Expand Down
17 changes: 8 additions & 9 deletions devel/management/commands/read_bumpbuddy_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ class PkgData(TypedDict):
class Command(BaseCommand):
def process_package(self, pkgdata: PkgData) -> FlagRequest | None:
pkgbase = pkgdata['pkgbase']
version = pkgdata['local_version']
upstream_version = pkgdata['upstream_version']
logger.debug("Import new out of date package '%s'", pkgbase)

Expand All @@ -53,26 +52,26 @@ def process_package(self, pkgdata: PkgData) -> FlagRequest | None:

if len(found_packages) == 0:
logger.error("no matching packages found for pkgbase='%s'", pkgbase)
return
return None

# already flagged
not_flagged_packages = [pkg for pkg in found_packages if pkg.flag_date is None]
if len(not_flagged_packages) == 0:
return
return None

ood_packages = [pkg for pkg in not_flagged_packages if alpm.vercmp(upstream_version, pkg.pkgver) > 0]
if len(ood_packages) == 0:
logger.debug("package is not out of date for pkgbase='%s'", pkgbase)
return
return None

pkg = ood_packages[0]

# find a common version if there is one available to store
versions = {(pkg.pkgver, pkg.pkgrel, pkg.epoch) for pkg in ood_packages}
if len(versions) == 1:
version = versions.pop()
pkg_version = versions.pop()
else:
version = ('', '', 0)
pkg_version = ('', '', 0)

current_time = now()
# Compatibility for old json output without issue
Expand All @@ -93,9 +92,9 @@ def process_package(self, pkgdata: PkgData) -> FlagRequest | None:
ip_address="0.0.0.0",
pkgbase=pkg.pkgbase,
repo=pkg.repo,
pkgver=version[0],
pkgrel=version[1],
epoch=version[2],
pkgver=pkg_version[0],
pkgrel=pkg_version[1],
epoch=pkg_version[2],
num_packages=len(ood_packages))

return flag_request
Expand Down
6 changes: 1 addition & 5 deletions devel/tests/test_read_bumpbuddy_status.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from typing import TYPE_CHECKING

import pytest
from django.utils.timezone import now
Expand All @@ -7,9 +6,6 @@
from main.models import Arch, Package, Repo
from packages.alpm import AlpmAPI

if TYPE_CHECKING:
from packages.models import FlagRequest

alpm = AlpmAPI()


Expand Down Expand Up @@ -62,7 +58,7 @@ def test_outofdate(command, package):

@pytest.mark.skipif(not alpm.available, reason="ALPM is unavailable")
def test_already_flagged(command, package):
request: FlagRequest = command.process_package({
request = command.process_package({
'pkgbase': 'systemd',
'local_version': 100,
'upstream_version': 101,
Expand Down
3 changes: 2 additions & 1 deletion main/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.conf import settings
from django.http import HttpRequest


def mastodon_link(request):
def mastodon_link(request: HttpRequest) -> dict[str, str]:
return {'MASTODON_LINK': getattr(settings, "MASTODON_LINK", "")}
2 changes: 1 addition & 1 deletion planet/tests/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def mock_get(*args, **kwargs):

class Result(dict):
status = 200
entries = []
entries: list[FeedItem] = []

def get(self, value):
return getattr(self, value)
Expand Down
19 changes: 18 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,17 @@ dependencies = [

[dependency-groups]
dev = [
"django-debug-toolbar==6.3.0",
"django-stubs[compatible-mypy]>=5.2.0",
"flake8>=7.3.0",
"mypy>=1.15.0",
"pytest>=9.0.3",
"pytest-cov>=6.2.1",
"pytest-django>=4.11.1",
"ruff>=0.15.13",
"django-debug-toolbar==6.3.0",
"types-bleach>=6.0.0",
"types-Markdown>=3.6.0",
"types-requests>=2.32.0",
]
prod = [
"pyasyncore==1.0.5",
Expand Down Expand Up @@ -84,5 +89,17 @@ ignore = [
"FBT002", # default-value-positional-argument
]

[tool.mypy]
python_version = "3.14"
plugins = ["mypy_django_plugin.main"]
exclude = [
"migrations/",
"archlinux_common_style/",
]
ignore_missing_imports = true

[tool.django-stubs]
django_settings_module = "settings"

[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "settings"
16 changes: 8 additions & 8 deletions settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

MIDDLEWARE = (
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
Expand All @@ -55,7 +55,7 @@
'django.middleware.security.SecurityMiddleware',
'django.middleware.http.ConditionalGetMiddleware',
'csp.middleware.CSPMiddleware',
)
]

# Base of the URL hierarchy
ROOT_URLCONF = 'urls'
Expand Down Expand Up @@ -106,7 +106,7 @@
# Use new test runner
TEST_RUNNER = 'django.test.runner.DiscoverRunner'

INSTALLED_APPS = (
INSTALLED_APPS = [
'django.contrib.contenttypes',
'django.contrib.auth',
'django.contrib.humanize',
Expand All @@ -130,7 +130,7 @@
'public',
'releng',
'visualize',
)
]

# Logging configuration for not getting overspammed
LOGGING = {
Expand Down Expand Up @@ -264,16 +264,16 @@

# Enable the debug toolbar if requested
if DEBUG_TOOLBAR:
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware', *list(MIDDLEWARE)]
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware', *MIDDLEWARE]

INSTALLED_APPS = [*list(INSTALLED_APPS), 'debug_toolbar']
INSTALLED_APPS = [*INSTALLED_APPS, 'debug_toolbar']

if PROMETHEUS_METRICS:
MIDDLEWARE = ['django_prometheus.middleware.PrometheusBeforeMiddleware',
*list(MIDDLEWARE),
*MIDDLEWARE,
'django_prometheus.middleware.PrometheusAfterMiddleware']

INSTALLED_APPS = [*list(INSTALLED_APPS), 'django_prometheus']
INSTALLED_APPS = [*INSTALLED_APPS, 'django_prometheus']

# Assume all URLField will be HTTPS if not specified.
# NOTE: this can be removed once we bump Django to 6.x
Expand Down
7 changes: 5 additions & 2 deletions sitemaps.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,11 @@ def priority(self, obj):


class PackageFilesSitemap(PackagesSitemap):
changefreq = "weekly"
priority = "0.1"
def changefreq(self, obj):
return "weekly"

def priority(self, obj):
return "0.1"

def location(self, obj):
return PackagesSitemap.location(self, obj) + 'files/'
Expand Down
4 changes: 2 additions & 2 deletions urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.contrib.sitemaps import views as sitemap_views
from django.urls import include, path, re_path
from django.urls import URLPattern, URLResolver, include, path, re_path
from django.views.decorators.cache import cache_page
from django.views.generic import TemplateView

Expand Down Expand Up @@ -34,7 +34,7 @@

news_sitemaps = {'news': sitemaps.RecentNewsSitemap}

urlpatterns = []
urlpatterns: list[URLPattern | URLResolver] = []

# Public pages
urlpatterns.extend([
Expand Down
Loading
Loading