Skip to content

Commit 110fa31

Browse files
committed
add a few type hints
1 parent ae9c105 commit 110fa31

2 files changed

Lines changed: 78 additions & 14 deletions

File tree

osc/conf.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import textwrap
6161
from io import BytesIO
6262
from io import StringIO
63+
from typing import Optional, Tuple
6364
from urllib.parse import urlsplit
6465

6566
from . import credentials
@@ -1571,7 +1572,10 @@ def sanitize_apiurl(apiurl):
15711572
return urljoin(*parse_apisrv_url(None, apiurl))
15721573

15731574

1574-
def parse_apisrv_url(scheme, apisrv):
1575+
def parse_apisrv_url(scheme: Optional[str], apisrv: str) -> Tuple[str, str, str]:
1576+
"""
1577+
Parses the api server url ``apisrv`` and returns the tuple (scheme, url, path).
1578+
"""
15751579
if apisrv.startswith('http://') or apisrv.startswith('https://'):
15761580
url = apisrv
15771581
elif scheme is not None:
@@ -1582,17 +1586,17 @@ def parse_apisrv_url(scheme, apisrv):
15821586
return scheme, url, path.rstrip('/')
15831587

15841588

1585-
def urljoin(scheme, apisrv, path=''):
1586-
return f"{scheme}://{apisrv}" + path
1589+
def urljoin(scheme: str, apisrv: str, path: str='') -> str:
1590+
return f"{scheme}://{apisrv}{path}"
15871591

15881592

1589-
def is_known_apiurl(url):
1593+
def is_known_apiurl(url: str) -> bool:
15901594
"""returns ``True`` if url is a known apiurl"""
15911595
apiurl = sanitize_apiurl(url)
15921596
return apiurl in config['api_host_options']
15931597

15941598

1595-
def extract_known_apiurl(url):
1599+
def extract_known_apiurl(url: str) -> Optional[str]:
15961600
"""
15971601
Return longest prefix of given url that is known apiurl,
15981602
None if there is no known apiurl that is prefix of given url.

osc/core.py

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from http.client import IncompleteRead
2929
from io import StringIO
3030
from pathlib import Path
31-
from typing import Optional, Dict, Union, List, Iterable
31+
from typing import TYPE_CHECKING, Any, Optional, Dict, Union, List, Iterable, Tuple, overload
3232
from urllib.parse import parse_qs, urlsplit, urlunsplit, urlparse, urlunparse, quote, urlencode, unquote
3333
from urllib.error import HTTPError
3434
from xml.etree import ElementTree as ET
@@ -1335,7 +1335,7 @@ def show_package_trigger_reason(apiurl: str, prj: str, pac: str, repo: str, arch
13351335
raise
13361336

13371337

1338-
def show_package_meta(apiurl: str, prj: str, pac: str, meta=False, blame=None):
1338+
def show_package_meta(apiurl: str, prj: str, pac: str, meta: bool=False, blame=None) -> List[bytes]:
13391339
query: Dict[str, Union[str, int]] = {}
13401340
if meta:
13411341
query['meta'] = 1
@@ -1394,7 +1394,7 @@ def show_scmsync(apiurl, prj, pac=None):
13941394
return project_obj.scmsync
13951395

13961396

1397-
def show_devel_project(apiurl, prj, pac):
1397+
def show_devel_project(apiurl: str, prj: str, pac: str) -> Tuple[Optional[str], Optional[str]]:
13981398
from . import obs_api
13991399

14001400
package_obj = obs_api.Package.from_api(apiurl, prj, pac)
@@ -1521,7 +1521,7 @@ def is_force_supported(self):
15211521
def __call__(self, **kwargs):
15221522
return self._delegate(**kwargs)
15231523

1524-
def __init__(self, url, input, change_is_required=False, file_ext='.xml', method=None):
1524+
def __init__(self, url, input: Union[List[str], str, bytes, List[bytes]], change_is_required=False, file_ext='.xml', method=None):
15251525
if isinstance(url, self._URLFactory):
15261526
self._url_factory = url
15271527
else:
@@ -1608,8 +1608,20 @@ def discard(self):
16081608
os.unlink(self.filename)
16091609

16101610

1611+
if TYPE_CHECKING:
1612+
from typing import Literal, TypedDict
1613+
1614+
MetaType = Literal['prj', 'pkg', 'attribute', 'prjconf', 'user', 'group', 'pattern']
1615+
1616+
class _MetaType(TypedDict):
1617+
path: str
1618+
template: str
1619+
file_ext: str
1620+
1621+
16111622
# different types of metadata
1612-
metatypes = {'prj': {'path': 'source/%s/_meta',
1623+
metatypes: "Dict[MetaType, _MetaType]" = {
1624+
'prj': {'path': 'source/%s/_meta',
16131625
'template': new_project_templ,
16141626
'file_ext': '.xml'
16151627
},
@@ -1640,7 +1652,7 @@ def discard(self):
16401652
}
16411653

16421654

1643-
def meta_exists(metatype: str, path_args=None, template_args=None, create_new=True, apiurl=None):
1655+
def meta_exists(metatype: "MetaType", path_args=None, template_args=None, create_new=True, apiurl=None):
16441656

16451657
global metatypes
16461658

@@ -1661,7 +1673,7 @@ def meta_exists(metatype: str, path_args=None, template_args=None, create_new=Tr
16611673

16621674

16631675
def make_meta_url(
1664-
metatype: str,
1676+
metatype: "MetaType",
16651677
path_args=None,
16661678
apiurl: Optional[str] = None,
16671679
force=False,
@@ -1704,7 +1716,7 @@ def parse_meta_to_string(data: Union[bytes, list, Iterable]) -> str:
17041716

17051717

17061718
def edit_meta(
1707-
metatype,
1719+
metatype: "MetaType",
17081720
path_args=None,
17091721
data: Optional[List[str]] = None,
17101722
template_args=None,
@@ -3684,6 +3696,7 @@ def attribute_branch_pkg(
36843696
return r
36853697

36863698

3699+
@overload
36873700
def branch_pkg(
36883701
apiurl: str,
36893702
src_project: str,
@@ -3705,7 +3718,54 @@ def branch_pkg(
37053718
maintenance=False,
37063719
newinstance=False,
37073720
disable_build=False,
3708-
):
3721+
) -> Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]: ...
3722+
3723+
@overload
3724+
def branch_pkg(
3725+
apiurl: str,
3726+
src_project: str,
3727+
src_package: str,
3728+
nodevelproject=False,
3729+
rev=None,
3730+
linkrev=None,
3731+
target_project: Optional[str] = None,
3732+
target_package=None,
3733+
return_existing=True,
3734+
msg="",
3735+
force=False,
3736+
noaccess=False,
3737+
add_repositories=False,
3738+
add_repositories_block=None,
3739+
add_repositories_rebuild=None,
3740+
extend_package_names=False,
3741+
missingok=False,
3742+
maintenance=False,
3743+
newinstance=False,
3744+
disable_build=False,
3745+
) -> Union[Tuple[True, str, str, None, None], Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]]: ...
3746+
3747+
def branch_pkg(
3748+
apiurl: str,
3749+
src_project: str,
3750+
src_package: str,
3751+
nodevelproject=False,
3752+
rev=None,
3753+
linkrev=None,
3754+
target_project: Optional[str] = None,
3755+
target_package=None,
3756+
return_existing=False,
3757+
msg="",
3758+
force=False,
3759+
noaccess=False,
3760+
add_repositories=False,
3761+
add_repositories_block=None,
3762+
add_repositories_rebuild=None,
3763+
extend_package_names=False,
3764+
missingok=False,
3765+
maintenance=False,
3766+
newinstance=False,
3767+
disable_build=False,
3768+
) -> Union[Tuple[True, str, str, None, None], Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]]:
37093769
"""
37103770
Branch a package (via API call)
37113771
"""

0 commit comments

Comments
 (0)