Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit babe31b0ce1a78e02105dd472b0d37c83533a913
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Thu Sep 3 15:39:33 2015 +0200
[frontend][API] added query arg `show_chroots` for GET
/api_2/builds/<build_id>; fix tests
---------------------------------------------------------------
frontend/coprs_frontend/coprs/rest_api/common.py | 25 ++++++++++++++++++-
.../coprs/rest_api/resources/build.py | 23 +++++++++++++++---
.../coprs/rest_api/resources/build_chroot.py | 21 +---------------
frontend/coprs_frontend/coprs/rest_api/schemas.py | 1 +
.../tests/test_api/test_build_chroot_r.py | 3 +-
.../coprs_frontend/tests/test_api/test_build_r.py | 15 ++++++++++++
6 files changed, 62 insertions(+), 26 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/rest_api/common.py
b/frontend/coprs_frontend/coprs/rest_api/common.py
index da57710..124ed83 100644
--- a/frontend/coprs_frontend/coprs/rest_api/common.py
+++ b/frontend/coprs_frontend/coprs/rest_api/common.py
@@ -3,6 +3,8 @@ import base64
import datetime
import functools
from logging import getLogger
+from coprs.rest_api.schemas import BuildChrootSchema
+from coprs.rest_api.util import mm_serialize_one
log = getLogger(__name__)
@@ -27,11 +29,13 @@ def render_copr_chroot(chroot):
}
-def render_build(build):
+def render_build(build, self_params=None):
+ if self_params is None:
+ self_params = {}
return {
"build": BuildSchema().dump(build)[0],
"_links": {
- "self": {"href": url_for(".buildr",
build_id=build.id)},
+ "self": {"href": url_for(".buildr",
build_id=build.id, **self_params)},
"project": {"href": url_for(".projectr",
project_id=build.copr_id)},
"chroots": {"href":
url_for(".buildchrootlistr", build_id=build.id)}
}
@@ -52,6 +56,22 @@ def render_project(copr, self_params=None):
}
+def render_build_chroot(chroot):
+ """
+ :type chroot: models.BuildChroot
+ """
+ return {
+ "chroot": mm_serialize_one(BuildChrootSchema, chroot),
+ "_links": {
+ "project": {"href": url_for(".projectr",
project_id=chroot.build.copr_id)},
+ "self": {"href": url_for(".buildchrootr",
+ build_id=chroot.build.id,
+ name=chroot.name)},
+ }
+ }
+
+
+
def rest_api_auth_required(f):
# todo: move to common.py and test this
@functools.wraps(f)
@@ -85,3 +105,4 @@ def rest_api_auth_required(f):
raise AuthFailed(message)
return f(*args, **kwargs)
return decorated_function
+
diff --git a/frontend/coprs_frontend/coprs/rest_api/resources/build.py
b/frontend/coprs_frontend/coprs/rest_api/resources/build.py
index b948a98..dfd5868 100644
--- a/frontend/coprs_frontend/coprs/rest_api/resources/build.py
+++ b/frontend/coprs_frontend/coprs/rest_api/resources/build.py
@@ -5,14 +5,13 @@ from flask import url_for, make_response
# from flask_restful_swagger import swagger
-from coprs import db
+from coprs import db, models
from coprs.exceptions import ActionInProgressException, InsufficientRightsException,
RequestCannotBeExecuted
from coprs.logic.coprs_logic import CoprsLogic
from coprs.logic.builds_logic import BuildsLogic
from coprs.logic.users_logic import UsersLogic
from coprs.rest_api.exceptions import MalformedRequest, CannotProcessRequest,
AccessForbidden
-from ..common import render_build, rest_api_auth_required
-
+from ..common import render_build, rest_api_auth_required, render_build_chroot
from coprs.rest_api.schemas import BuildSchema, BuildCreateSchema,
BuildCreateFromUrlSchema
@@ -164,10 +163,26 @@ class BuildListR(Resource):
class BuildR(Resource):
def get(self, build_id):
+ parser = reqparse.RequestParser()
+ parser.add_argument('show_chroots', type=bool, default=False)
+ req_args = parser.parse_args()
+
build = get_one_safe(BuildsLogic.get(build_id),
"Not found build with id: {}".format(build_id))
+ """:type : models.Build """
+
+ self_params = {}
+ if req_args["show_chroots"]:
+ self_params["show_chroots"] = req_args["show_chroots"]
+
+ result = render_build(build, self_params)
+ if req_args["show_chroots"]:
+ result["build_chroots"] = [
+ render_build_chroot(chroot)
+ for chroot in build.build_chroots
+ ]
- return render_build(build)
+ return result
@rest_api_auth_required
def delete(self, build_id):
diff --git a/frontend/coprs_frontend/coprs/rest_api/resources/build_chroot.py
b/frontend/coprs_frontend/coprs/rest_api/resources/build_chroot.py
index 7d04edd..3f6da84 100644
--- a/frontend/coprs_frontend/coprs/rest_api/resources/build_chroot.py
+++ b/frontend/coprs_frontend/coprs/rest_api/resources/build_chroot.py
@@ -3,28 +3,11 @@
from flask import url_for
from flask_restful import Resource
-from ... import models
+from coprs.rest_api.common import render_build_chroot
from ...exceptions import MalformedArgumentException
from ...logic.builds_logic import BuildsLogic, BuildChrootsLogic
-
from ..exceptions import MalformedRequest
-from ..schemas import BuildChrootSchema
-from ..util import get_one_safe, mm_serialize_one
-
-
-def render_build_chroot(chroot):
- """
- :type chroot: models.BuildChroot
- """
- return {
- "chroot": mm_serialize_one(BuildChrootSchema, chroot),
- "_links": {
- "project": {"href": url_for(".projectr",
project_id=chroot.build.copr_id)},
- "self": {"href": url_for(".buildchrootr",
- build_id=chroot.build.id,
- name=chroot.name)},
- }
- }
+from ..util import get_one_safe
class BuildChrootListR(Resource):
diff --git a/frontend/coprs_frontend/coprs/rest_api/schemas.py
b/frontend/coprs_frontend/coprs/rest_api/schemas.py
index 4af3e2c..a11bbcd 100644
--- a/frontend/coprs_frontend/coprs/rest_api/schemas.py
+++ b/frontend/coprs_frontend/coprs/rest_api/schemas.py
@@ -115,6 +115,7 @@ class BuildChrootSchema(Schema):
result_dir_url = fields.Str(dump_only=True)
+
class BuildSchema(Schema):
id = fields.Int(dump_only=True)
diff --git a/frontend/coprs_frontend/tests/test_api/test_build_chroot_r.py
b/frontend/coprs_frontend/tests/test_api/test_build_chroot_r.py
index 5709b1e..8b1b40a 100644
--- a/frontend/coprs_frontend/tests/test_api/test_build_chroot_r.py
+++ b/frontend/coprs_frontend/tests/test_api/test_build_chroot_r.py
@@ -61,7 +61,8 @@ class TestBuildChrootResource(CoprsTestCase):
r0 = self.tc.get(href)
assert r0.status_code == 200
obj = json.loads(r0.data)
- assert obj["chroot"] == expected_dict
+ for k in expected_fields:
+ assert obj["chroot"][k] == expected_dict[k]
def test_get_one_bad_name(self, f_users, f_coprs, f_mock_chroots, f_builds, f_db,
f_users_api):
diff --git a/frontend/coprs_frontend/tests/test_api/test_build_r.py
b/frontend/coprs_frontend/tests/test_api/test_build_r.py
index a2067eb..5c4512c 100644
--- a/frontend/coprs_frontend/tests/test_api/test_build_r.py
+++ b/frontend/coprs_frontend/tests/test_api/test_build_r.py
@@ -351,6 +351,21 @@ class TestBuildResource(CoprsTestCase):
assert obj["build"]["id"] == b_id
assert obj["_links"]["self"]["href"] == href
+ def test_get_one_build_with_chroots(self, f_users, f_coprs, f_builds, f_db,
+ f_users_api, f_mock_chroots):
+
+ build_id_list = [b.id for b in self.basic_builds]
+ self.db.session.commit()
+
+ for b_id in build_id_list:
+ href = "/api_2/builds/{}?show_chroots=True".format(b_id)
+ r = self.tc.get(href)
+ assert r.status_code == 200
+ obj = json.loads(r.data)
+ assert obj["build"]["id"] == b_id
+ assert obj["_links"]["self"]["href"] == href
+ assert "build_chroots" in obj
+
def test_get_one_build_not_found(self, f_users, f_coprs, f_builds, f_db,
f_users_api, f_mock_chroots):
build_id_list = [b.id for b in self.basic_builds]