Skip to content

Commit c0147f8

Browse files
dcermakdmach
authored andcommitted
WIP: add a few type hints
1 parent 0a916d0 commit c0147f8

2 files changed

Lines changed: 76 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
@@ -1561,7 +1562,10 @@ def sanitize_apiurl(apiurl):
15611562
return urljoin(*parse_apisrv_url(None, apiurl))
15621563

15631564

1564-
def parse_apisrv_url(scheme, apisrv):
1565+
def parse_apisrv_url(scheme: Optional[str], apisrv: str) -> Tuple[str, str, str]:
1566+
"""
1567+
Parses the api server url ``apisrv`` and returns the tuple (scheme, url, path).
1568+
"""
15651569
if apisrv.startswith('http://') or apisrv.startswith('https://'):
15661570
url = apisrv
15671571
elif scheme is not None:
@@ -1572,17 +1576,17 @@ def parse_apisrv_url(scheme, apisrv):
15721576
return scheme, url, path.rstrip('/')
15731577

15741578

1575-
def urljoin(scheme, apisrv, path=''):
1576-
return f"{scheme}://{apisrv}" + path
1579+
def urljoin(scheme: str, apisrv: str, path: str='') -> str:
1580+
return f"{scheme}://{apisrv}{path}"
15771581

15781582

1579-
def is_known_apiurl(url):
1583+
def is_known_apiurl(url: str) -> bool:
15801584
"""returns ``True`` if url is a known apiurl"""
15811585
apiurl = sanitize_apiurl(url)
15821586
return apiurl in config['api_host_options']
15831587

15841588

1585-
def extract_known_apiurl(url):
1589+
def extract_known_apiurl(url: str) -> Optional[str]:
15861590
"""
15871591
Return longest prefix of given url that is known apiurl,
15881592
None if there is no known apiurl that is prefix of given url.

osc/core.py

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
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 Optional, Dict, Union, List, Iterable, Tuple, overload
32+
from typing_extensions import Literal, TypedDict
3233
from urllib.parse import parse_qs, urlsplit, urlunsplit, urlparse, urlunparse, quote, urlencode, unquote
3334
from urllib.error import HTTPError
3435
from xml.etree import ElementTree as ET
@@ -1335,7 +1336,7 @@ def show_package_trigger_reason(apiurl: str, prj: str, pac: str, repo: str, arch
13351336
raise
13361337

13371338

1338-
def show_package_meta(apiurl: str, prj: str, pac: str, meta=False, blame=None):
1339+
def show_package_meta(apiurl: str, prj: str, pac: str, meta: bool=False, blame=None) -> List[bytes]:
13391340
query: Dict[str, Union[str, int]] = {}
13401341
if meta:
13411342
query['meta'] = 1
@@ -1394,7 +1395,7 @@ def show_scmsync(apiurl, prj, pac=None):
13941395
return project_obj.scmsync
13951396

13961397

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

14001401
package_obj = obs_api.Package.from_api(apiurl, prj, pac)
@@ -1521,7 +1522,7 @@ def is_force_supported(self):
15211522
def __call__(self, **kwargs):
15221523
return self._delegate(**kwargs)
15231524

1524-
def __init__(self, url, input, change_is_required=False, file_ext='.xml', method=None):
1525+
def __init__(self, url, input: Union[List[str], str, bytes, List[bytes]], change_is_required=False, file_ext='.xml', method=None):
15251526
if isinstance(url, self._URLFactory):
15261527
self._url_factory = url
15271528
else:
@@ -1608,8 +1609,17 @@ def discard(self):
16081609
os.unlink(self.filename)
16091610

16101611

1612+
MetaType = Literal['prj', 'pkg', 'attribute', 'prjconf', 'user', 'group', 'pattern']
1613+
1614+
class _MetaType(TypedDict):
1615+
path: str
1616+
template: str
1617+
file_ext: str
1618+
1619+
16111620
# different types of metadata
1612-
metatypes = {'prj': {'path': 'source/%s/_meta',
1621+
metatypes: Dict[MetaType, _MetaType] = {
1622+
'prj': {'path': 'source/%s/_meta',
16131623
'template': new_project_templ,
16141624
'file_ext': '.xml'
16151625
},
@@ -1640,7 +1650,7 @@ def discard(self):
16401650
}
16411651

16421652

1643-
def meta_exists(metatype: str, path_args=None, template_args=None, create_new=True, apiurl=None):
1653+
def meta_exists(metatype: MetaType, path_args=None, template_args=None, create_new=True, apiurl=None):
16441654

16451655
global metatypes
16461656

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

16621672

16631673
def make_meta_url(
1664-
metatype: str,
1674+
metatype: MetaType,
16651675
path_args=None,
16661676
apiurl: Optional[str] = None,
16671677
force=False,
@@ -1704,7 +1714,7 @@ def parse_meta_to_string(data: Union[bytes, list, Iterable]) -> str:
17041714

17051715

17061716
def edit_meta(
1707-
metatype,
1717+
metatype: MetaType,
17081718
path_args=None,
17091719
data: Optional[List[str]] = None,
17101720
template_args=None,
@@ -3684,6 +3694,7 @@ def attribute_branch_pkg(
36843694
return r
36853695

36863696

3697+
@overload
36873698
def branch_pkg(
36883699
apiurl: str,
36893700
src_project: str,
@@ -3705,7 +3716,54 @@ def branch_pkg(
37053716
maintenance=False,
37063717
newinstance=False,
37073718
disable_build=False,
3708-
):
3719+
) -> Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]: ...
3720+
3721+
@overload
3722+
def branch_pkg(
3723+
apiurl: str,
3724+
src_project: str,
3725+
src_package: str,
3726+
nodevelproject=False,
3727+
rev=None,
3728+
linkrev=None,
3729+
target_project: Optional[str] = None,
3730+
target_package=None,
3731+
return_existing=True,
3732+
msg="",
3733+
force=False,
3734+
noaccess=False,
3735+
add_repositories=False,
3736+
add_repositories_block=None,
3737+
add_repositories_rebuild=None,
3738+
extend_package_names=False,
3739+
missingok=False,
3740+
maintenance=False,
3741+
newinstance=False,
3742+
disable_build=False,
3743+
) -> Union[Tuple[True, str, str, None, None], Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]]: ...
3744+
3745+
def branch_pkg(
3746+
apiurl: str,
3747+
src_project: str,
3748+
src_package: str,
3749+
nodevelproject=False,
3750+
rev=None,
3751+
linkrev=None,
3752+
target_project: Optional[str] = None,
3753+
target_package=None,
3754+
return_existing=False,
3755+
msg="",
3756+
force=False,
3757+
noaccess=False,
3758+
add_repositories=False,
3759+
add_repositories_block=None,
3760+
add_repositories_rebuild=None,
3761+
extend_package_names=False,
3762+
missingok=False,
3763+
maintenance=False,
3764+
newinstance=False,
3765+
disable_build=False,
3766+
) -> Union[Tuple[True, str, str, None, None], Tuple[False, Optional[str], Optional[str], Optional[str], Optional[str]]]:
37093767
"""
37103768
Branch a package (via API call)
37113769
"""

0 commit comments

Comments
 (0)