Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
commit babe31b0ce1a78e02105dd472b0d37c83533a913 Author: Valentin Gologuzov vgologuz@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]
copr-commits@lists.fedorahosted.org