summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--obsapi/core.py24
-rw-r--r--test/test_api.py31
2 files changed, 55 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py
index 45d19c6..748044c 100644
--- a/obsapi/core.py
+++ b/obsapi/core.py
@@ -393,3 +393,27 @@ class ObsApi(object):
for srcfile in flist:
if srcfile.name.endswith('.spec'):
yield self.source.get(prj, pkg, srcfile.name)
+
+ def set_flag(self, prj, pkg=None, flag=None):
+ if flag is None:
+ return None
+
+ try:
+ flag_type = getattr(flag, 'flag', flag.get('flag', None))
+ if flag_type is None:
+ raise Exception('Invalid flag type: None')
+ except AttributeError:
+ raise Exception('flag type %s missing get function' % type(flag))
+
+ status = getattr(flag, 'status', flag.get('status', 'enable'))
+ if status not in ['enable', 'disable']:
+ raise ValueError('flag status expected "enable" or "disable" got %s' % status)
+
+ params = dict(cmd='set_flag',
+ flag=flag_type,
+ status=status,
+ repository=getattr(flag, 'repository', flag.get('repository', None)),
+ arch=getattr(flag, 'arch', flag.get('arch', None)),
+ )
+
+ return self.source.post(prj, pkg, **params)
diff --git a/test/test_api.py b/test/test_api.py
index 5a46fb9..3fbf349 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -4,6 +4,12 @@ import os
from . import test_dir
from obsapi import ObsApi
from lxml import etree
+try:
+ from urllib.parse import urlparse
+ from urllib.parse import parse_qs
+except Exception:
+ from urlparse import urlparse
+ from urlparse import parse_qs
apiurl = 'https://api.opensuse.org'
api = ObsApi(apiurl=apiurl)
@@ -514,3 +520,28 @@ def test_get_project_spec_files(requests_mock, project_directory, package_direct
expected_specfiles = [spec_file_1, spec_file_2, spec_file_3]
specfiles = api.get_spec_files(prj)
assert list(specfiles) == expected_specfiles
+
+
+# POST /source/<project>?cmd=set_flag&repository=:opt&arch=:opt&flag=flag&status=status
+def test_set_project_flags(requests_mock):
+ matcher = re.compile(r'/source/.*')
+ requests_mock.post(matcher)
+ params = dict(cmd='set_flag', flag='publish', status='enable')
+
+ response = api.set_flag(prj, flag=params)
+ assert response.status_code == 200
+
+ url = requests_mock.request_history[0].url
+ query = parse_qs(urlparse(url).query)
+ assert query.keys() == params.keys()
+ for key, values in query.items():
+ assert len(values) == 1
+ assert params.get(key, None) == query.get(key, [])[0]
+
+
+# POST /source/<project>/<package>?cmd=set_flag&repository=:opt&arch=:opt&flag=flag&status=status
+def test_set_package_flags(requests_mock):
+ pass
+
+# POST /source/<project>/<package>?cmd=remove_flag&repository=:opt&arch=:opt&flag=flag
+# POST /source/<project>?cmd=remove_flag&repository=:opt&arch=:opt&flag=flag