Skip to content

Commit 58a3f7d

Browse files
committed
Chore: Typing additions and some linter fixes
1 parent d82d153 commit 58a3f7d

2 files changed

Lines changed: 41 additions & 44 deletions

File tree

musicbrainzngs/mbxml.py

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from . import util
1111

1212

13-
def fixtag(tag, namespaces):
13+
def fixtag(tag, namespaces: dict[str, str]):
1414
# given a decorated tag (of the form {uri}tag), return prefixed
1515
# tag and namespace declaration, if any
1616
if isinstance(tag, ET.QName):
@@ -20,13 +20,10 @@ def fixtag(tag, namespaces):
2020
if prefix is None:
2121
prefix = "ns%d" % len(namespaces)
2222
namespaces[namespace_uri] = prefix
23-
if prefix == "xml":
24-
xmlns = None
25-
else:
26-
xmlns = ("xmlns:%s" % prefix, namespace_uri)
23+
xmlns = None if prefix == "xml" else (f"xmlns:{prefix}", namespace_uri)
2724
else:
2825
xmlns = None
29-
return "%s:%s" % (prefix, tag), xmlns
26+
return f"{prefix}:{tag}", xmlns
3027

3128

3229
NS_MAP = {"http://musicbrainz.org/ns/mmd-2.0#": "ws2", "http://musicbrainz.org/ns/ext#-2.0": "ext"}
@@ -63,7 +60,7 @@ def make_artist_credit(artists):
6360
return "".join(names)
6461

6562

66-
def parse_elements(valid_els, inner_els, element):
63+
def parse_elements(valid_els: list[str], inner_els: dict, element) -> dict:
6764
"""Extract single level subelements from an element.
6865
For example, given the element:
6966
<element>
@@ -104,7 +101,7 @@ def parse_elements(valid_els, inner_els, element):
104101
# add counts for lists when available
105102
m = re.match(r"([a-z0-9-]+)-list", t)
106103
if m and "count" in sub.attrib:
107-
result["%s-count" % m.group(1)] = int(sub.attrib["count"])
104+
result[f"{m.group(1)}-count"] = int(sub.attrib["count"])
108105
else:
109106
_log.info("in <%s>, uncaught <%s>", fixtag(element.tag, NS_MAP)[0], t)
110107
return result
@@ -131,7 +128,7 @@ def parse_attributes(attributes, element):
131128
return result
132129

133130

134-
def parse_message(message):
131+
def parse_message(message) -> dict:
135132
tree = util.bytes_to_elementtree(message)
136133
root = tree.getroot()
137134
result = {}
@@ -212,16 +209,14 @@ def parse_annotation(annotation):
212209

213210

214211
def parse_lifespan(lifespan):
215-
parts = parse_elements(["begin", "end", "ended"], {}, lifespan)
216-
217-
return parts
212+
return parse_elements(["begin", "end", "ended"], {}, lifespan)
218213

219214

220215
def parse_area_list(al):
221216
return [parse_area(a) for a in al]
222217

223218

224-
def parse_area(area):
219+
def parse_area(area) -> dict:
225220
result = {}
226221
attribs = ["id", "type", "ext:score"]
227222
elements = ["name", "sort-name", "disambiguation"]
@@ -508,15 +503,15 @@ def parse_medium(medium):
508503
return result
509504

510505

511-
def parse_disc_list(dl):
506+
def parse_disc_list(dl) -> list:
512507
return [parse_disc(d) for d in dl]
513508

514509

515-
def parse_text_representation(textr):
510+
def parse_text_representation(textr) -> dict:
516511
return parse_elements(["language", "script"], {}, textr)
517512

518513

519-
def parse_release_group(rg):
514+
def parse_release_group(rg) -> dict:
520515
result = {}
521516
attribs = ["id", "type", "ext:score"]
522517
elements = ["title", "user-rating", "first-release-date", "primary-type", "disambiguation"]
@@ -582,18 +577,18 @@ def parse_external_id_list(pl):
582577
return [parse_attributes(["id"], p)["id"] for p in pl]
583578

584579

585-
def parse_element_list(el):
580+
def parse_element_list(el) -> list:
586581
return [e.text for e in el]
587582

588583

589584
def parse_work_list(wl):
590585
return [parse_work(w) for w in wl]
591586

592587

593-
def parse_work(work):
588+
def parse_work(work) -> dict:
594589
result = {}
595-
attribs = ["id", "ext:score", "type"]
596-
elements = ["title", "user-rating", "language", "iswc", "disambiguation"]
590+
attribs: list[str] = ["id", "ext:score", "type"]
591+
elements: list[str] = ["title", "user-rating", "language", "iswc", "disambiguation"]
597592
inner_els = {
598593
"tag-list": parse_tag_list,
599594
"user-tag-list": parse_tag_list,
@@ -775,14 +770,14 @@ def parse_track(track):
775770
return result
776771

777772

778-
def parse_tag_list(tl):
773+
def parse_tag_list(tl: ET.Element) -> list[dict[str, str]]:
779774
return [parse_tag(t) for t in tl]
780775

781776

782-
def parse_tag(tag):
783-
result = {}
784-
attribs = ["count"]
785-
elements = ["name"]
777+
def parse_tag(tag: ET.Element) -> dict[str, str]:
778+
result: dict[str, str] = {}
779+
attribs: list[str] = ["count"]
780+
elements: list[str] = ["name"]
786781

787782
result.update(parse_attributes(attribs, tag))
788783
result.update(parse_elements(elements, {}, tag))
@@ -877,10 +872,10 @@ def make_rating_request(**kwargs):
877872
return ET.tostring(root, "utf-8")
878873

879874

880-
def make_isrc_request(recording2isrcs):
875+
def make_isrc_request(recording2isrcs: dict):
881876
NS = "http://musicbrainz.org/ns/mmd-2.0#"
882-
root = ET.Element("{%s}metadata" % NS)
883-
rec_list = ET.SubElement(root, "{%s}recording-list" % NS)
877+
root = ET.Element(f"{{{NS}}}metadata")
878+
rec_list = ET.SubElement(root, f"{{{NS}}}recording-list")
884879
for rec, isrcs in recording2isrcs.items():
885880
if len(isrcs) > 0:
886881
rec_xml = ET.SubElement(rec_list, "{%s}recording" % NS)

musicbrainzngs/musicbrainz.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -462,23 +462,23 @@ class AuthenticationError(WebServiceError):
462462
# Helpers for validating and formatting allowed sets.
463463

464464

465-
def _check_includes_impl(includes, valid_includes):
465+
def _check_includes_impl(includes, valid_includes) -> None:
466466
for i in includes:
467467
if i not in valid_includes:
468468
raise InvalidIncludeError("Bad includes: %s is not a valid include" % i)
469469

470470

471-
def _check_includes(entity, inc):
471+
def _check_includes(entity, inc) -> None:
472472
_check_includes_impl(inc, VALID_INCLUDES[entity])
473473

474474

475-
def _check_filter(values, valid):
475+
def _check_filter(values, valid) -> None:
476476
for v in values:
477477
if v not in valid:
478478
raise InvalidFilterError(v)
479479

480480

481-
def _check_filter_and_make_params(entity, includes, release_status=[], release_type=[]):
481+
def _check_filter_and_make_params(entity, includes, release_status=[], release_type=[]) -> dict:
482482
"""Check that the status or type values are valid. Then, check that
483483
the filters can be used with the given includes. Return a params
484484
dict that can be passed to _do_mb_query.
@@ -810,8 +810,7 @@ def mb_parser_xml(resp):
810810
except Exception as exc:
811811
if isinstance(exc, ETREE_EXCEPTIONS):
812812
raise ResponseError(cause=exc)
813-
else:
814-
raise
813+
raise
815814

816815

817816
# Defaults
@@ -976,7 +975,7 @@ def _do_mb_query(entity, id, includes=[], params={}):
976975
return _mb_request(path, "GET", auth_required, args=args)
977976

978977

979-
def _do_mb_search(entity, query="", fields={}, limit=None, offset=None, strict=False):
978+
def _do_mb_search(entity, query: str = "", fields: dict = {}, limit=None, offset=None, strict: bool = False) -> dict:
980979
"""Perform a full-text search on the MusicBrainz search server.
981980
`query` is a lucene query string when no fields are set,
982981
but is escaped when any fields are given. `fields` is a dictionary
@@ -998,7 +997,7 @@ def _do_mb_search(entity, query="", fields={}, limit=None, offset=None, strict=F
998997
for key, value in fields.items():
999998
# Ensure this is a valid search field.
1000999
if key not in VALID_SEARCH_FIELDS[entity]:
1001-
raise InvalidSearchFieldError("%s is not a valid search field for %s" % (key, entity))
1000+
raise InvalidSearchFieldError(f"{key} is not a valid search field for {entity}")
10021001

10031002
# Escape Lucene's special characters.
10041003
value = util._unicode(value)
@@ -1179,7 +1178,7 @@ def search_areas(query="", limit=None, offset=None, strict=False, **fields):
11791178

11801179

11811180
@_docstring_search("artist")
1182-
def search_artists(query="", limit=None, offset=None, strict=False, **fields):
1181+
def search_artists(query="", limit=None, offset=None, strict=False, **fields) -> dict:
11831182
"""Search for artists and return a dict with an 'artist-list' key.
11841183
11851184
*Available search fields*: {fields}"""
@@ -1222,32 +1221,35 @@ def search_places(query="", limit=None, offset=None, strict=False, **fields):
12221221
def search_recordings(query="", limit=None, offset=None, strict=False, **fields):
12231222
"""Search for recordings and return a dict with a 'recording-list' key.
12241223
1225-
*Available search fields*: {fields}"""
1224+
*Available search fields*: {fields}
1225+
"""
12261226
return _do_mb_search("recording", query, fields, limit, offset, strict)
12271227

12281228

12291229
@_docstring_search("release")
12301230
def search_releases(query="", limit=None, offset=None, strict=False, **fields):
12311231
"""Search for recordings and return a dict with a 'recording-list' key.
12321232
1233-
*Available search fields*: {fields}"""
1233+
*Available search fields*: {fields}
1234+
"""
12341235
return _do_mb_search("release", query, fields, limit, offset, strict)
12351236

12361237

12371238
@_docstring_search("release-group")
1238-
def search_release_groups(query="", limit=None, offset=None, strict=False, **fields):
1239-
"""Search for release groups and return a dict
1240-
with a 'release-group-list' key.
1239+
def search_release_groups(query: str = "", limit: int | None = None, offset=None, strict=False, **fields) -> dict:
1240+
"""Search for release groups and return a dict with a 'release-group-list' key.
12411241
1242-
*Available search fields*: {fields}"""
1242+
*Available search fields*: {fields}
1243+
"""
12431244
return _do_mb_search("release-group", query, fields, limit, offset, strict)
12441245

12451246

12461247
@_docstring_search("series")
12471248
def search_series(query="", limit=None, offset=None, strict=False, **fields):
12481249
"""Search for series and return a dict with a 'series-list' key.
12491250
1250-
*Available search fields*: {fields}"""
1251+
*Available search fields*: {fields}
1252+
"""
12511253
return _do_mb_search("series", query, fields, limit, offset, strict)
12521254

12531255

0 commit comments

Comments
 (0)