fix(python): use standard dict/list type annotation

Since Python 3.9 list/dict can be used as type hint.
This commit is contained in:
Jelle van der Waa 2022-07-31 20:58:39 +02:00 committed by Jelle van der Waa
parent 28970ccc91
commit a509e40474
31 changed files with 175 additions and 195 deletions

View file

@ -1,4 +1,3 @@
from typing import List
from unittest import mock
import pytest
@ -21,7 +20,7 @@ def setup(db_test):
return
def run_main(args: List[str] = []):
def run_main(args: list[str] = []):
with mock.patch("sys.argv", ["aurweb-adduser"] + args):
adduser.main()

View file

@ -2,7 +2,6 @@ import gzip
import json
import os
from typing import List
from unittest import mock
import py
@ -47,7 +46,7 @@ def user() -> User:
@pytest.fixture
def packages(user: User) -> List[Package]:
def packages(user: User) -> list[Package]:
output = []
with db.begin():
lic = db.create(License, Name="GPL")
@ -89,7 +88,7 @@ def config_mock(tmpdir: py.path.local) -> None:
config.rehash()
def test_mkpkglists(tmpdir: py.path.local, config_mock: None, user: User, packages: List[Package]):
def test_mkpkglists(tmpdir: py.path.local, config_mock: None, user: User, packages: list[Package]):
from aurweb.scripts import mkpkglists
mkpkglists.main()
@ -168,7 +167,7 @@ def test_mkpkglists_extended_empty(config_mock: None):
@mock.patch("sys.argv", ["mkpkglists", "--extended"])
def test_mkpkglists_extended(config_mock: None, user: User,
packages: List[Package]):
packages: list[Package]):
from aurweb.scripts import mkpkglists
mkpkglists.main()

View file

@ -1,5 +1,4 @@
from logging import ERROR
from typing import List
from unittest import mock
import pytest
@ -46,7 +45,7 @@ def user2() -> User:
@pytest.fixture
def pkgbases(user: User) -> List[PackageBase]:
def pkgbases(user: User) -> list[PackageBase]:
now = time.utcnow()
output = []
@ -62,7 +61,7 @@ def pkgbases(user: User) -> List[PackageBase]:
@pytest.fixture
def pkgreq(user2: User, pkgbases: List[PackageBase]):
def pkgreq(user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
with db.begin():
pkgreq_ = db.create(PackageRequest, PackageBase=pkgbase,
@ -74,7 +73,7 @@ def pkgreq(user2: User, pkgbases: List[PackageBase]):
@pytest.fixture
def packages(pkgbases: List[PackageBase]) -> List[Package]:
def packages(pkgbases: list[PackageBase]) -> list[Package]:
output = []
with db.begin():
for i, pkgbase in enumerate(pkgbases):
@ -85,7 +84,7 @@ def packages(pkgbases: List[PackageBase]) -> List[Package]:
def test_out_of_date(user: User, user1: User, user2: User,
pkgbases: List[PackageBase]):
pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
# Create two comaintainers. We'll pass the maintainer uid to
# FlagNotification, so we should expect to get two emails.
@ -162,7 +161,7 @@ link does not work, try copying and pasting it into your browser.
assert email.body == expected
def test_comment(user: User, user2: User, pkgbases: List[PackageBase]):
def test_comment(user: User, user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
with db.begin():
@ -194,7 +193,7 @@ please go to the package page [2] and select "Disable notifications".
assert expected == email.body
def test_update(user: User, user2: User, pkgbases: List[PackageBase]):
def test_update(user: User, user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
with db.begin():
user.UpdateNotify = 1
@ -221,7 +220,7 @@ please go to the package page [2] and select "Disable notifications".
assert expected == email.body
def test_adopt(user: User, user2: User, pkgbases: List[PackageBase]):
def test_adopt(user: User, user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
notif = notify.AdoptNotification(user2.ID, pkgbase.ID)
notif.send()
@ -241,7 +240,7 @@ The package {pkgbase.Name} [1] was adopted by {user2.Username} [2].
assert email.body == expected
def test_disown(user: User, user2: User, pkgbases: List[PackageBase]):
def test_disown(user: User, user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
notif = notify.DisownNotification(user2.ID, pkgbase.ID)
notif.send()
@ -261,7 +260,7 @@ The package {pkgbase.Name} [1] was disowned by {user2.Username} [2].
assert email.body == expected
def test_comaintainer_addition(user: User, pkgbases: List[PackageBase]):
def test_comaintainer_addition(user: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
notif = notify.ComaintainerAddNotification(user.ID, pkgbase.ID)
notif.send()
@ -280,7 +279,7 @@ You were added to the co-maintainer list of {pkgbase.Name} [1].
assert email.body == expected
def test_comaintainer_removal(user: User, pkgbases: List[PackageBase]):
def test_comaintainer_removal(user: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
notif = notify.ComaintainerRemoveNotification(user.ID, pkgbase.ID)
notif.send()
@ -299,7 +298,7 @@ You were removed from the co-maintainer list of {pkgbase.Name} [1].
assert email.body == expected
def test_suspended_ownership_change(user: User, pkgbases: List[PackageBase]):
def test_suspended_ownership_change(user: User, pkgbases: list[PackageBase]):
with db.begin():
user.Suspended = 1
@ -314,7 +313,7 @@ def test_suspended_ownership_change(user: User, pkgbases: List[PackageBase]):
assert Email.count() == 1
def test_delete(user: User, user2: User, pkgbases: List[PackageBase]):
def test_delete(user: User, user2: User, pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
notif = notify.DeleteNotification(user2.ID, pkgbase.ID)
notif.send()
@ -336,7 +335,7 @@ You will no longer receive notifications about this package.
assert email.body == expected
def test_merge(user: User, user2: User, pkgbases: List[PackageBase]):
def test_merge(user: User, user2: User, pkgbases: list[PackageBase]):
source, target = pkgbases[:2]
notif = notify.DeleteNotification(user2.ID, source.ID, target.ID)
notif.send()
@ -361,7 +360,7 @@ please go to [3] and click "Disable notifications".
assert email.body == expected
def set_tu(users: List[User]) -> User:
def set_tu(users: list[User]) -> User:
with db.begin():
for user in users:
user.AccountTypeID = TRUSTED_USER_ID
@ -369,7 +368,7 @@ def set_tu(users: List[User]) -> User:
def test_open_close_request(user: User, user2: User,
pkgreq: PackageRequest,
pkgbases: List[PackageBase]):
pkgbases: list[PackageBase]):
set_tu([user])
pkgbase = pkgbases[0]
@ -432,7 +431,7 @@ Request #{pkgreq.ID} has been rejected by {user2.Username} [1].
def test_close_request_comaintainer_cc(user: User, user2: User,
pkgreq: PackageRequest,
pkgbases: List[PackageBase]):
pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
with db.begin():
db.create(models.PackageComaintainer, PackageBase=pkgbase,
@ -449,7 +448,7 @@ def test_close_request_comaintainer_cc(user: User, user2: User,
def test_close_request_closure_comment(user: User, user2: User,
pkgreq: PackageRequest,
pkgbases: List[PackageBase]):
pkgbases: list[PackageBase]):
pkgbase = pkgbases[0]
with db.begin():
pkgreq.ClosureComment = "This is a test closure comment."

View file

@ -1,7 +1,6 @@
import re
from http import HTTPStatus
from typing import List
from unittest import mock
import pytest
@ -177,7 +176,7 @@ def comment(user: User, package: Package) -> PackageComment:
@pytest.fixture
def packages(maintainer: User) -> List[Package]:
def packages(maintainer: User) -> list[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = []
now = time.utcnow()
@ -521,7 +520,7 @@ def test_package_dependencies(client: TestClient, maintainer: User,
assert broken_node.text.strip() == broken_dep.DepName
def test_packages(client: TestClient, packages: List[Package]):
def test_packages(client: TestClient, packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SeB": "X", # "X" isn't valid, defaults to "nd"
@ -550,7 +549,7 @@ def test_packages_empty(client: TestClient):
assert results[0].text.strip() == expected
def test_packages_search_by_name(client: TestClient, packages: List[Package]):
def test_packages_search_by_name(client: TestClient, packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SeB": "n",
@ -565,7 +564,7 @@ def test_packages_search_by_name(client: TestClient, packages: List[Package]):
def test_packages_search_by_exact_name(client: TestClient,
packages: List[Package]):
packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SeB": "N",
@ -594,7 +593,7 @@ def test_packages_search_by_exact_name(client: TestClient,
def test_packages_search_by_pkgbase(client: TestClient,
packages: List[Package]):
packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SeB": "b",
@ -609,7 +608,7 @@ def test_packages_search_by_pkgbase(client: TestClient,
def test_packages_search_by_exact_pkgbase(client: TestClient,
packages: List[Package]):
packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SeB": "B",
@ -634,7 +633,7 @@ def test_packages_search_by_exact_pkgbase(client: TestClient,
def test_packages_search_by_keywords(client: TestClient,
packages: List[Package]):
packages: list[Package]):
# None of our packages have keywords, so this query should return nothing.
with client as request:
response = request.get("/packages", params={
@ -791,7 +790,7 @@ def test_packages_search_by_submitter(client: TestClient,
assert len(rows) == 1
def test_packages_sort_by_name(client: TestClient, packages: List[Package]):
def test_packages_sort_by_name(client: TestClient, packages: list[Package]):
with client as request:
response = request.get("/packages", params={
"SB": "n", # Name
@ -820,7 +819,7 @@ def test_packages_sort_by_name(client: TestClient, packages: List[Package]):
def test_packages_sort_by_votes(client: TestClient,
maintainer: User,
packages: List[Package]):
packages: list[Package]):
# Set the first package's NumVotes to 1.
with db.begin():
packages[0].PackageBase.NumVotes = 1
@ -855,7 +854,7 @@ def test_packages_sort_by_votes(client: TestClient,
def test_packages_sort_by_popularity(client: TestClient,
maintainer: User,
packages: List[Package]):
packages: list[Package]):
# Set the first package's Popularity to 0.50.
with db.begin():
packages[0].PackageBase.Popularity = "0.50"
@ -875,7 +874,7 @@ def test_packages_sort_by_popularity(client: TestClient,
def test_packages_sort_by_voted(client: TestClient,
maintainer: User,
packages: List[Package]):
packages: list[Package]):
now = time.utcnow()
with db.begin():
db.create(PackageVote, PackageBase=packages[0].PackageBase,
@ -902,7 +901,7 @@ def test_packages_sort_by_voted(client: TestClient,
def test_packages_sort_by_notify(client: TestClient,
maintainer: User,
packages: List[Package]):
packages: list[Package]):
db.create(PackageNotification,
PackageBase=packages[0].PackageBase,
User=maintainer)
@ -970,7 +969,7 @@ def test_packages_sort_by_maintainer(client: TestClient,
def test_packages_sort_by_last_modified(client: TestClient,
packages: List[Package]):
packages: list[Package]):
now = time.utcnow()
# Set the first package's ModifiedTS to be 1000 seconds before now.
package = packages[0]
@ -996,7 +995,7 @@ def test_packages_sort_by_last_modified(client: TestClient,
def test_packages_flagged(client: TestClient, maintainer: User,
packages: List[Package]):
packages: list[Package]):
package = packages[0]
now = time.utcnow()
@ -1029,7 +1028,7 @@ def test_packages_flagged(client: TestClient, maintainer: User,
assert len(rows) == 50
def test_packages_orphans(client: TestClient, packages: List[Package]):
def test_packages_orphans(client: TestClient, packages: list[Package]):
package = packages[0]
with db.begin():
package.PackageBase.Maintainer = None

View file

@ -1,7 +1,6 @@
import re
from http import HTTPStatus
from typing import List
from unittest import mock
import pytest
@ -176,7 +175,7 @@ def comment(user: User, package: Package) -> PackageComment:
@pytest.fixture
def packages(maintainer: User) -> List[Package]:
def packages(maintainer: User) -> list[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = []
now = time.utcnow()
@ -197,7 +196,7 @@ def packages(maintainer: User) -> List[Package]:
@pytest.fixture
def requests(user: User, packages: List[Package]) -> List[PackageRequest]:
def requests(user: User, packages: list[Package]) -> list[PackageRequest]:
pkgreqs = []
deletion_type = db.query(RequestType).filter(
RequestType.ID == DELETION_ID

View file

@ -1,5 +1,3 @@
from typing import List
import pytest
from aurweb import db, time
@ -22,7 +20,7 @@ def user() -> User:
@pytest.fixture
def packages(user: User) -> List[Package]:
def packages(user: User) -> list[Package]:
output = []
now = time.utcnow()
@ -37,14 +35,14 @@ def packages(user: User) -> List[Package]:
yield output
def test_pkgmaint_noop(packages: List[Package]):
def test_pkgmaint_noop(packages: list[Package]):
assert len(packages) == 5
pkgmaint.main()
packages = db.query(Package).all()
assert len(packages) == 5
def test_pkgmaint(packages: List[Package]):
def test_pkgmaint(packages: list[Package]):
assert len(packages) == 5
# Modify the first package so it's out of date and gets deleted.

View file

@ -2,7 +2,6 @@ import re
from http import HTTPStatus
from logging import DEBUG
from typing import List
import pytest
@ -91,7 +90,7 @@ def maintainer() -> User:
@pytest.fixture
def packages(maintainer: User) -> List[Package]:
def packages(maintainer: User) -> list[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = []
now = time.utcnow()
@ -112,7 +111,7 @@ def packages(maintainer: User) -> List[Package]:
@pytest.fixture
def requests(user: User, packages: List[Package]) -> List[PackageRequest]:
def requests(user: User, packages: list[Package]) -> list[PackageRequest]:
pkgreqs = []
with db.begin():
for i in range(55):
@ -660,8 +659,8 @@ def test_requests_unauthorized(client: TestClient):
def test_requests(client: TestClient,
tu_user: User,
packages: List[Package],
requests: List[PackageRequest]):
packages: list[Package],
requests: list[PackageRequest]):
cookies = {"AURSID": tu_user.login(Request(), "testPassword")}
with client as request:
resp = request.get("/requests", params={
@ -697,7 +696,7 @@ def test_requests(client: TestClient,
def test_requests_selfmade(client: TestClient, user: User,
requests: List[PackageRequest]):
requests: list[PackageRequest]):
cookies = {"AURSID": user.login(Request(), "testPassword")}
with client as request:
resp = request.get("/requests", cookies=cookies)

View file

@ -1,7 +1,6 @@
import re
from http import HTTPStatus
from typing import List
from unittest import mock
import orjson
@ -62,7 +61,7 @@ def user3() -> User:
@pytest.fixture
def packages(user: User, user2: User, user3: User) -> List[Package]:
def packages(user: User, user2: User, user3: User) -> list[Package]:
output = []
# Create package records used in our tests.
@ -123,7 +122,7 @@ def packages(user: User, user2: User, user3: User) -> List[Package]:
@pytest.fixture
def depends(packages: List[Package]) -> List[PackageDependency]:
def depends(packages: list[Package]) -> list[PackageDependency]:
output = []
with db.begin():
@ -162,7 +161,7 @@ def depends(packages: List[Package]) -> List[PackageDependency]:
@pytest.fixture
def relations(user: User, packages: List[Package]) -> List[PackageRelation]:
def relations(user: User, packages: list[Package]) -> list[PackageRelation]:
output = []
with db.begin():
@ -241,9 +240,9 @@ def test_rpc_documentation_missing():
def test_rpc_singular_info(client: TestClient,
user: User,
packages: List[Package],
depends: List[PackageDependency],
relations: List[PackageRelation]):
packages: list[Package],
depends: list[PackageDependency],
relations: list[PackageRelation]):
# Define expected response.
pkg = packages[0]
expected_data = {
@ -310,7 +309,7 @@ def test_rpc_nonexistent_package(client: TestClient):
assert response_data["resultcount"] == 0
def test_rpc_multiinfo(client: TestClient, packages: List[Package]):
def test_rpc_multiinfo(client: TestClient, packages: list[Package]):
# Make dummy request.
request_packages = ["big-chungus", "chungy-chungus"]
with client as request:
@ -328,7 +327,7 @@ def test_rpc_multiinfo(client: TestClient, packages: List[Package]):
assert request_packages == []
def test_rpc_mixedargs(client: TestClient, packages: List[Package]):
def test_rpc_mixedargs(client: TestClient, packages: list[Package]):
# Make dummy request.
response1_packages = ["gluggly-chungus"]
response2_packages = ["gluggly-chungus", "chungy-chungus"]
@ -361,9 +360,9 @@ def test_rpc_mixedargs(client: TestClient, packages: List[Package]):
def test_rpc_no_dependencies_omits_key(client: TestClient, user: User,
packages: List[Package],
depends: List[PackageDependency],
relations: List[PackageRelation]):
packages: list[Package],
depends: list[PackageDependency],
relations: list[PackageRelation]):
"""
This makes sure things like 'MakeDepends' get removed from JSON strings
when they don't have set values.
@ -517,7 +516,7 @@ def test_rpc_no_args(client: TestClient):
assert expected_data == response_data
def test_rpc_no_maintainer(client: TestClient, packages: List[Package]):
def test_rpc_no_maintainer(client: TestClient, packages: list[Package]):
# Make dummy request.
with client as request:
response = request.get("/rpc", params={
@ -531,7 +530,7 @@ def test_rpc_no_maintainer(client: TestClient, packages: List[Package]):
assert response_data["results"][0]["Maintainer"] is None
def test_rpc_suggest_pkgbase(client: TestClient, packages: List[Package]):
def test_rpc_suggest_pkgbase(client: TestClient, packages: list[Package]):
params = {"v": 5, "type": "suggest-pkgbase", "arg": "big"}
with client as request:
response = request.get("/rpc", params=params)
@ -560,7 +559,7 @@ def test_rpc_suggest_pkgbase(client: TestClient, packages: List[Package]):
assert data == []
def test_rpc_suggest(client: TestClient, packages: List[Package]):
def test_rpc_suggest(client: TestClient, packages: list[Package]):
params = {"v": 5, "type": "suggest", "arg": "other"}
with client as request:
response = request.get("/rpc", params=params)
@ -600,7 +599,7 @@ def mock_config_getint(section: str, key: str):
@mock.patch("aurweb.config.getint", side_effect=mock_config_getint)
def test_rpc_ratelimit(getint: mock.MagicMock, client: TestClient,
pipeline: Pipeline, packages: List[Package]):
pipeline: Pipeline, packages: list[Package]):
params = {"v": 5, "type": "suggest-pkgbase", "arg": "big"}
for i in range(4):
@ -626,7 +625,7 @@ def test_rpc_ratelimit(getint: mock.MagicMock, client: TestClient,
assert response.status_code == int(HTTPStatus.OK)
def test_rpc_etag(client: TestClient, packages: List[Package]):
def test_rpc_etag(client: TestClient, packages: list[Package]):
params = {"v": 5, "type": "suggest-pkgbase", "arg": "big"}
with client as request:
@ -647,7 +646,7 @@ def test_rpc_search_arg_too_small(client: TestClient):
assert response.json().get("error") == "Query arg too small."
def test_rpc_search(client: TestClient, packages: List[Package]):
def test_rpc_search(client: TestClient, packages: list[Package]):
params = {"v": 5, "type": "search", "arg": "big"}
with client as request:
response = request.get("/rpc", params=params)
@ -673,7 +672,7 @@ def test_rpc_search(client: TestClient, packages: List[Package]):
assert response.json().get("error") == "No request type/data specified."
def test_rpc_msearch(client: TestClient, user: User, packages: List[Package]):
def test_rpc_msearch(client: TestClient, user: User, packages: list[Package]):
params = {"v": 5, "type": "msearch", "arg": user.Username}
with client as request:
response = request.get("/rpc", params=params)
@ -709,8 +708,8 @@ def test_rpc_msearch(client: TestClient, user: User, packages: List[Package]):
assert result.get("Name") == "big-chungus"
def test_rpc_search_depends(client: TestClient, packages: List[Package],
depends: List[PackageDependency]):
def test_rpc_search_depends(client: TestClient, packages: list[Package],
depends: list[PackageDependency]):
params = {
"v": 5, "type": "search", "by": "depends", "arg": "chungus-depends"
}
@ -722,8 +721,8 @@ def test_rpc_search_depends(client: TestClient, packages: List[Package],
assert result.get("Name") == packages[0].Name
def test_rpc_search_makedepends(client: TestClient, packages: List[Package],
depends: List[PackageDependency]):
def test_rpc_search_makedepends(client: TestClient, packages: list[Package],
depends: list[PackageDependency]):
params = {
"v": 5,
"type": "search",
@ -738,8 +737,8 @@ def test_rpc_search_makedepends(client: TestClient, packages: List[Package],
assert result.get("Name") == packages[0].Name
def test_rpc_search_optdepends(client: TestClient, packages: List[Package],
depends: List[PackageDependency]):
def test_rpc_search_optdepends(client: TestClient, packages: list[Package],
depends: list[PackageDependency]):
params = {
"v": 5,
"type": "search",
@ -754,8 +753,8 @@ def test_rpc_search_optdepends(client: TestClient, packages: List[Package],
assert result.get("Name") == packages[0].Name
def test_rpc_search_checkdepends(client: TestClient, packages: List[Package],
depends: List[PackageDependency]):
def test_rpc_search_checkdepends(client: TestClient, packages: list[Package],
depends: list[PackageDependency]):
params = {
"v": 5,
"type": "search",
@ -802,7 +801,7 @@ def test_rpc_jsonp_callback(client: TestClient):
assert response.json().get("error") == "Invalid callback name."
def test_rpc_post(client: TestClient, packages: List[Package]):
def test_rpc_post(client: TestClient, packages: list[Package]):
data = {
"v": 5,
"type": "info",
@ -816,7 +815,7 @@ def test_rpc_post(client: TestClient, packages: List[Package]):
def test_rpc_too_many_search_results(client: TestClient,
packages: List[Package]):
packages: list[Package]):
config_getint = config.getint
def mock_config(section: str, key: str):
@ -831,7 +830,7 @@ def test_rpc_too_many_search_results(client: TestClient,
assert resp.json().get("error") == "Too many package results."
def test_rpc_too_many_info_results(client: TestClient, packages: List[Package]):
def test_rpc_too_many_info_results(client: TestClient, packages: list[Package]):
# Make many of these packages depend and rely on each other.
# This way, we can test to see that the exceeded limit stays true
# regardless of the number of related records.

View file

@ -1,6 +1,6 @@
import re
from typing import Any, Dict
from typing import Any
import pytest
@ -126,7 +126,7 @@ def test_commit_hash():
assert commit_hash not in render
def pager_context(num_packages: int) -> Dict[str, Any]:
def pager_context(num_packages: int) -> dict[str, Any]:
return {
"request": Request(),
"singular": "%d package found.",