Skip to content
Open
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
2 changes: 1 addition & 1 deletion devel/management/commands/generate_keyring.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def generate_keyring(keyserver, keyring):
}


def generate_ownertrust(trust_path):
def generate_ownertrust(trust_path: str) -> None:
master_key_ids = MasterKey.objects.values_list("pgp_key", flat=True)
with open(trust_path, "w") as trustfile:
for key_id in master_key_ids:
Expand Down
8 changes: 4 additions & 4 deletions devel/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,14 @@ class Meta:
verbose_name = 'additional profile data'
verbose_name_plural = 'additional profile data'

def get_absolute_url(self):
def get_absolute_url(self) -> str | None:
user = self.user
group = StaffGroup.objects.filter(group=user.groups.all().first()).get()
if group:
return f'{group.get_absolute_url()}#{user.username}'
return None

def __str__(self):
def __str__(self) -> str:
return f"{self.user}"


Expand Down Expand Up @@ -114,7 +114,7 @@ class Meta:
ordering = ('created',)
get_latest_by = 'created'

def __str__(self):
def __str__(self) -> str:
return f'{self.owner.get_full_name()}, created {self.created}'


Expand Down Expand Up @@ -145,7 +145,7 @@ class Meta:
get_latest_by = 'created'
verbose_name = 'PGP signature'

def __str__(self):
def __str__(self) -> str:
return f'{self.signer} → {self.signee}'


Expand Down
2 changes: 1 addition & 1 deletion devel/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def __init__(self, href, title, desc):
self.title = title
self.desc = desc

def __str__(self):
def __str__(self) -> str:
return format_html('<a href="{href}" title="{title}">{desc}</a>',
href=self.href, title=self.title, desc=self.desc)

Expand Down
2 changes: 1 addition & 1 deletion devel/tests/test_pgp_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
]


def test_pgp_import_error():
def test_pgp_import_error() -> None:
with pytest.raises(CommandError) as e:
call_command('pgp_import')
assert 'keyring_path' in str(e)
Expand Down
35 changes: 19 additions & 16 deletions devel/tests/test_reports.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from collections.abc import Generator

import pytest
from django.contrib.auth.models import User
from django.test import Client

from devel.reports import Linkify
from packages.models import PackageRelation


@pytest.fixture
def devel_client(client, arches, repos, package):
def devel_client(client: Client, arches: None, repos: None, package: None) -> Generator[Client]:
password = 'test'
user = User.objects.create_superuser('admin',
'admin@archlinux.org',
Expand All @@ -21,57 +24,57 @@ def devel_client(client, arches, repos, package):
user.delete()


def test_overview(devel_client):
def test_overview(devel_client: Client) -> None:
response = devel_client.get('/devel/')
assert response.status_code == 200


def test_reports_old(devel_client):
def test_reports_old(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/old', follow=True)
assert response.status_code == 200


def test_reports_outofdate(devel_client):
def test_reports_outofdate(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/long-out-of-date', follow=True)
assert response.status_code == 200


def test_reports_big(devel_client):
def test_reports_big(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/big', follow=True)
assert response.status_code == 200


def test_reports_badcompression(devel_client):
def test_reports_badcompression(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/badcompression', follow=True)
assert response.status_code == 200


def test_reports_uncompressed_man(devel_client):
def test_reports_uncompressed_man(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/uncompressed-man', follow=True)
assert response.status_code == 200


def test_reports_uncompressed_info(devel_client):
def test_reports_uncompressed_info(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/uncompressed-info', follow=True)
assert response.status_code == 200


def test_reports_unneeded_orphans(devel_client):
def test_reports_unneeded_orphans(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/unneeded-orphans', follow=True)
assert response.status_code == 200


def test_reports_mismatched_signature(devel_client):
def test_reports_mismatched_signature(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/mismatched-signature', follow=True)
assert response.status_code == 200


def test_reports_signature_time(devel_client):
def test_reports_signature_time(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/signature-time', follow=True)
assert response.status_code == 200


def test_reports_pkgbases(devel_client):
def test_reports_pkgbases(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/old/pkgbases/')
assert response.status_code == 200
assert response['Content-Type'] == 'text/plain'
Expand All @@ -83,12 +86,12 @@ def test_reports_pkgbases_with_username(devel_client):
assert response['Content-Type'] == 'text/plain'


def test_reports_pkgbases_invalid_report(devel_client):
def test_reports_pkgbases_invalid_report(devel_client: Client) -> None:
response = devel_client.get('/devel/reports/nonexistent/pkgbases/')
assert response.status_code == 404


def test_report_filtered_by_maintainer(devel_client):
def test_report_filtered_by_maintainer(devel_client: Client) -> None:
user = User.objects.get(username='admin')
PackageRelation.objects.create(
pkgbase='linux',
Expand All @@ -104,7 +107,7 @@ def test_report_filtered_by_maintainer(devel_client):
assert pkgbases == {'linux'}


def test_report_pkgbases_filtered_by_maintainer(devel_client):
def test_report_pkgbases_filtered_by_maintainer(devel_client: Client) -> None:
user = User.objects.get(username='admin')
PackageRelation.objects.create(
pkgbase='linux',
Expand All @@ -118,7 +121,7 @@ def test_report_pkgbases_filtered_by_maintainer(devel_client):
assert response.content.decode().strip() == 'linux'


def test_linkify_escapes_html():
def test_linkify_escapes_html() -> None:
link = Linkify(href='"><script>alert(1)</script>', title='<img onerror=alert(1)>', desc='<b>xss</b>')
result = str(link)
assert '<script>' not in result
Expand Down
10 changes: 5 additions & 5 deletions devel/tests/test_retire_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,19 @@ def test_user(arches, repos, groups):
user.delete()


def test_invalid_args():
def test_invalid_args() -> None:
with pytest.raises(CommandError) as e:
call_command('retire_user')
assert 'missing argument user.' in str(e)


def test_user_not_found(db):
def test_user_not_found(db: None) -> None:
with pytest.raises(CommandError) as e:
call_command('retire_user', 'user1')
assert "Failed to find User 'user1'" in str(e)


def test_userprofile_missing(db):
def test_userprofile_missing(db: None) -> None:
user = User.objects.create(username='user2', first_name="Jane",
last_name="User2", email="user2@example.com")

Expand All @@ -50,13 +50,13 @@ def test_userprofile_missing(db):
user.delete()


def test_user_inactive(test_user):
def test_user_inactive(test_user: User) -> None:
call_command('retire_user', test_user.username)
user = User.objects.get(username=test_user.username)
assert not user.is_active


def test_user_moved_groups(test_user):
def test_user_moved_groups(test_user: User) -> None:
test_user.groups.add(Group.objects.get(name='Developers'))
test_user.save()

Expand Down
2 changes: 1 addition & 1 deletion devel/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ def find_by_pgp_key(self, pgp_key):
self.pgp_cache[pgp_key] = user
return user

def clear_cache(self):
def clear_cache(self) -> None:
self.cache = {}
self.username_cache = {}
self.email_cache = {}
Expand Down
2 changes: 1 addition & 1 deletion feeds.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def write(self, s):
self.outfile.write(b''.join(buf))
self.buf = []

def flush(self):
def flush(self) -> None:
self.outfile.write(b''.join(self.buf))
self.outfile.flush()

Expand Down
2 changes: 1 addition & 1 deletion main/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def __setitem__(self, key, value):
super().__setitem__(key, value)
self.check_item_limits()

def check_item_limits(self):
def check_item_limits(self) -> None:
if self.size_limit is None:
return
while len(self) > self.size_limit:
Expand Down
26 changes: 13 additions & 13 deletions main/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class Arch(models.Model):
required_signoffs = models.PositiveIntegerField(
default=2, help_text="Number of signoffs required for packages of this architecture")

def __str__(self):
def __str__(self) -> str:
return self.name

def __lt__(self, other):
Expand All @@ -75,7 +75,7 @@ class Repo(models.Model):
bugs_category = models.SmallIntegerField(
default=2, help_text="Flyspray category ID for this repository.")

def __str__(self):
def __str__(self) -> str:
return self.name

def __lt__(self, other):
Expand Down Expand Up @@ -116,25 +116,25 @@ class Meta:
get_latest_by = 'last_update'
unique_together = (('pkgname', 'repo', 'arch'),)

def __str__(self):
def __str__(self) -> str:
return self.pkgname

@property
def full_version(self):
def full_version(self) -> str:
if self.epoch > 0:
return f'{self.epoch}:{self.pkgver}-{self.pkgrel}'
return f'{self.pkgver}-{self.pkgrel}'

def get_absolute_url(self):
return f'/packages/{self.repo.name.lower()}/{self.arch.name}/{self.pkgname}/'

def get_full_url(self, proto='https'):
def get_full_url(self, proto='https') -> str:
'''get a URL suitable for things like email including the domain'''
domain = Site.objects.get_current().domain
return f'{proto}://{domain}{self.get_absolute_url()}'

@property
def updated_mins_ago(self):
def updated_mins_ago(self) -> int:
# Note: This uses the archweb metadata update time, not when the
# package was actually pushed to any repo. We don't have that
# easily available without adding more fields and scripts.
Expand All @@ -143,19 +143,19 @@ def updated_mins_ago(self):
return int((now - self.last_update).total_seconds()) // 60

@property
def is_recent(self):
def is_recent(self) -> bool:
return self.updated_mins_ago <= 90

@property
def signature(self):
def signature(self) -> SignatureWrapper | None:
if not self.signature_bytes:
return None
data = BinaryData(self.signature_bytes)
packets = list(data.packets())
return SignatureWrapper(packets[0])

@property
def signer(self):
def signer(self) -> User | None:
sig = self.signature
if sig and sig.key_id:
try:
Expand Down Expand Up @@ -439,7 +439,7 @@ class PackageFile(models.Model):
directory = models.CharField(max_length=1024)
filename = models.CharField(max_length=1024, null=True, blank=True)

def __str__(self):
def __str__(self) -> str:
return "{}{}".format(self.directory, self.filename or '')

class Meta:
Expand Down Expand Up @@ -475,10 +475,10 @@ class RebuilderdStatus(models.Model):
build_id = models.IntegerField(null=True, blank=True)

@property
def status_str(self):
def status_str(self) -> str:
return self.REBUILDERD_STATUSES[self.status][1]

def __str__(self):
def __str__(self) -> str:
return f"pkg={self.pkg}, status={self.status_str}"


Expand All @@ -487,7 +487,7 @@ class Soname(models.Model):
pkg = models.ForeignKey(Package, on_delete=models.CASCADE)
name = models.CharField(max_length=255)

def __str__(self):
def __str__(self) -> str:
return f"pkg={self.pkg}, name={self.name}"


Expand Down
8 changes: 4 additions & 4 deletions main/tests/test_donor_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
command = Command()


def test_parse_subject():
def test_parse_subject() -> None:
assert command.parse_subject('garbage') is None

# Valid
Expand All @@ -21,14 +21,14 @@ def test_parse_subject():
assert output == 'John Doe'


def test_parse_name():
def test_parse_name() -> None:
assert command.sanitize_name('1244') == ''
assert command.sanitize_name('John Doe') == 'John Doe'
assert command.sanitize_name(' John Doe ') == 'John Doe'
assert command.sanitize_name('John Doe 23') == 'John Doe'


def test_decode_subject():
def test_decode_subject() -> None:
text = 'メイル'
subject = Header(text, 'utf-8')
assert command.decode_subject(subject) == text
Expand All @@ -41,7 +41,7 @@ def test_invalid_args(monkeypatch):
assert 'Failed to read from STDIN' in str(e.value)


def test_invalid_path():
def test_invalid_path() -> None:
with pytest.raises(FileNotFoundError) as e:
call_command('donor_import', '/tmp/non-existant')
assert 'No such file or directory' in str(e.value)
Expand Down
Loading
Loading