From 23d3ff96f75dcd0ce1a0f9a5e8035888a956337f Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 22 2015 08:49:24 +0000 Subject: Move from API Error code to use enum and adjust the requirements accordingly --- diff --git a/pagure/api/__init__.py b/pagure/api/__init__.py index 1907b7e..0c548f3 100644 --- a/pagure/api/__init__.py +++ b/pagure/api/__init__.py @@ -13,6 +13,7 @@ API namespace version 0. import functools import flask +import enum API = flask.Blueprint('api_ns', __name__, url_prefix='/api/0') @@ -23,25 +24,27 @@ from pagure import __api_version__, APP, SESSION from pagure.exceptions import APIError -API_ERROR_CODE = { - 0: 'Variable message describing the issue', - 1: 'Project not found', - 2: 'No issue tracker found for this project', - 3: 'An error occured at the database level and prevent the action from ' - 'reaching completion', - 4: 'Invalid or incomplete input submited', - 5: 'Invalid or expired token. Please visit %s get or renew your ' - 'API token.' % APP.config['APP_URL'], - 6: 'Issue not found', - 7: 'You are not allowed to view this issue', - 8: 'Pull-Request have been deactivated for this project', - 9: 'Pull-Request not found', - 10: 'You are not allowed to merge/close pull-request for this project', - 11: 'This request does not have the minimum review score necessary to ' - 'be merged', - 12: 'Only the assignee can merge this review', - 13: 'This request must be assigned to be merged', -} +class APIERROR(enum.Enum): + """ Clast listing as Enum all the possible error thrown by the API. + """ + ENOCODE = 'Variable message describing the issue' + ENOPROJECT = 'Project not found' + ENOTRACKER = 'No issue tracker found for this project' + EDBERROR = 'An error occured at the database level and prevent the ' \ + 'action from reaching completion' + EINVALIDREQ = 'Invalid or incomplete input submited' + EINVALIDTOK = 'Invalid or expired token. Please visit %s get or '\ + 'renew your API token.' % APP.config['APP_URL'] + ENOISSUE = 'Issue not found' + EISSUEREST = 'You are not allowed to view this issue' + ENOPR = 'Pull-Request have been deactivated for this project' + ENOREQ = 'Pull-Request not found' + ENOPRCLOSE = 'You are not allowed to merge/close pull-request for '\ + 'this project' + EPRSCORE = 'This request does not have the minimum review score '\ + 'necessary to be merged' + ENOASSIG = 'Only the assignee can merge this review' + ENOTASSIG = 'This request must be assigned to be merged' def check_api_acls(acls, optional=False): @@ -74,8 +77,8 @@ def check_api_acls(acls, optional=False): if not token_auth: output = { - 'error_code': 5, - 'error': API_ERROR_CODE[5], + 'error_code': APIERROR.EINVALIDTOK.name, + 'error': APIERROR.EINVALIDTOK.value, } jsonout = flask.jsonify(output) jsonout.status_code = 401 @@ -145,8 +148,8 @@ def api_method(function): else: response = flask.jsonify( { - 'error': API_ERROR_CODE[e.error_code], - 'error_code': e.error_code + 'error': e.error_code.value, + 'error_code': e.error_code.name, } ) response.status_code = e.status_code diff --git a/pagure/api/fork.py b/pagure/api/fork.py index 83fa17f..f4a9f2e 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -17,7 +17,7 @@ import pagure.exceptions import pagure.lib from pagure import APP, SESSION, is_repo_admin, authenticated from pagure.api import ( - API, api_method, api_login_required, api_login_optional, API_ERROR_CODE + API, api_method, api_login_required, api_login_optional, APIERROR ) @@ -33,16 +33,16 @@ def api_pull_request_view(repo, requestid, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('pull_requests', True): - raise pagure.exceptions.APIError(404, error_code=8) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPR) request = pagure.lib.search_pull_requests( SESSION, project_id=repo.id, requestid=requestid) if not request: - raise pagure.exceptions.APIError(404, error_code=9) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOREQ) jsonout = flask.jsonify(request.to_json()) jsonout.status_code = httpcode @@ -63,33 +63,33 @@ def api_pull_request_merge(repo, requestid, username=None): repo = pagure.lib.get_project(SESSION, repo, user=username) if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('pull_requests', True): - raise pagure.exceptions.APIError(404, error_code=8) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPR) if repo != flask.g.token.project: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) request = pagure.lib.search_pull_requests( SESSION, project_id=repo.id, requestid=requestid) if not request: - raise pagure.exceptions.APIError(404, error_code=9) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOREQ) if not is_repo_admin(repo): - raise pagure.exceptions.APIError(403, error_code=10) + raise pagure.exceptions.APIError(403, error_code=APIERROR.ENOPRCLOSE) if repo.settings.get('Only_assignee_can_merge_pull-request', False): if not request.assignee: - raise pagure.exceptions.APIError(403, error_code=13) + raise pagure.exceptions.APIError(403, error_code=APIERROR.ENOTASSIG) if request.assignee.username != flask.g.fas_user.username: - raise pagure.exceptions.APIError(403, error_code=12) + raise pagure.exceptions.APIError(403, error_code=APIERROR.ENOASSIG) threshold = repo.settings.get('Minimum_score_to_merge_pull-request', -1) if threshold > 0 and int(request.score) < int(threshold): - raise pagure.exceptions.APIError(403, error_code=11) + raise pagure.exceptions.APIError(403, error_code=APIERROR.EPRSCORE) try: message = pagure.lib.git.merge_pull_request( @@ -98,7 +98,7 @@ def api_pull_request_merge(repo, requestid, username=None): output['message'] = message except pagure.exceptions.PagureException as err: raise pagure.exceptions.APIError( - 400, error_code=0, error=str(err)) + 400, error_code=APIERROR.ENOCODE, error=str(err)) jsonout = flask.jsonify(output) jsonout.status_code = httpcode @@ -119,22 +119,22 @@ def api_pull_request_close(repo, requestid, username=None): repo = pagure.lib.get_project(SESSION, repo, user=username) if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('pull_requests', True): - raise pagure.exceptions.APIError(404, error_code=8) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPR) if repo != flask.g.token.project: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) request = pagure.lib.search_pull_requests( SESSION, project_id=repo.id, requestid=requestid) if not request: - raise pagure.exceptions.APIError(404, error_code=9) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOREQ) if not is_repo_admin(repo): - raise pagure.exceptions.APIError(403, error_code=10) + raise pagure.exceptions.APIError(403, error_code=APIERROR.ENOPRCLOSE) pagure.lib.close_pull_request( SESSION, request, flask.g.fas_user.username, @@ -146,7 +146,7 @@ def api_pull_request_close(repo, requestid, username=None): except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) - raise pagure.exceptions.APIError(400, error_code=3) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EDBERROR) jsonout = flask.jsonify(output) jsonout.status_code = httpcode @@ -167,19 +167,19 @@ def api_pull_request_add_comment(repo, requestid, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('pull_requests', True): - raise pagure.exceptions.APIError(404, error_code=8) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPR) if repo.fullname != flask.g.token.project.fullname: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) request = pagure.lib.search_pull_requests( SESSION, project_id=repo.id, requestid=requestid) if not request: - raise pagure.exceptions.APIError(404, error_code=9) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOREQ) form = pagure.forms.AddPullRequestCommentForm(csrf_enabled=False) if form.validate_on_submit(): @@ -202,10 +202,10 @@ def api_pull_request_add_comment(repo, requestid, username=None): SESSION.commit() output['message'] = message except SQLAlchemyError, err: # pragma: no cover - raise pagure.exceptions.APIError(400, error_code=3) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EDBERROR) else: - raise pagure.exceptions.APIError(400, error_code=4) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EINVALIDREQ) jsonout = flask.jsonify(output) jsonout.status_code = httpcode diff --git a/pagure/api/issue.py b/pagure/api/issue.py index caf27c6..765f4ec 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -17,7 +17,7 @@ import pagure.exceptions import pagure.lib from pagure import APP, SESSION, is_repo_admin, authenticated from pagure.api import ( - API, api_method, api_login_required, api_login_optional, API_ERROR_CODE + API, api_method, api_login_required, api_login_optional, APIERROR ) @@ -33,13 +33,13 @@ def api_new_issue(repo, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('issue_tracker', True): - raise pagure.exceptions.APIError(404, error_code=2) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOTRACKER) if repo != flask.g.token.project: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) status = pagure.lib.get_issue_statuses(SESSION) form = pagure.forms.IssueForm(status=status, csrf_enabled=False) @@ -88,10 +88,10 @@ def api_new_issue(repo, username=None): output['message'] = 'issue created' output['message'] = 'issue created' except SQLAlchemyError, err: # pragma: no cover - raise pagure.exceptions.APIError(400, error_code=3) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EDBERROR) else: - raise pagure.exceptions.APIError(400, error_code=4) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EINVALIDREQ) jsonout = flask.jsonify(output) jsonout.status_code = httpcode @@ -111,20 +111,20 @@ def api_view_issue(repo, issueid, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('issue_tracker', True): - raise pagure.exceptions.APIError(404, error_code=2) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOTRACKER) issue = pagure.lib.search_issues(SESSION, repo, issueid=issueid) if issue is None or issue.project != repo: - raise pagure.exceptions.APIError(404, error_code=6) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOISSUE) if issue.private and not is_repo_admin(repo) \ and (not authenticated() or not issue.user.user == flask.g.fas_user.username): - raise pagure.exceptions.APIError(403, error_code=7) + raise pagure.exceptions.APIError(403, error_code=APIERROR.EISSUEREST) jsonout = flask.jsonify(issue.to_json()) jsonout.status_code = httpcode @@ -143,23 +143,23 @@ def api_change_status_issue(repo, issueid, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('issue_tracker', True): - raise pagure.exceptions.APIError(404, error_code=2) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOTRACKER) if repo != flask.g.token.project: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) issue = pagure.lib.search_issues(SESSION, repo, issueid=issueid) if issue is None or issue.project != repo: - raise pagure.exceptions.APIError(404, error_code=6) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOISSUE) if issue.private and not is_repo_admin(repo) \ and (not authenticated() or not issue.user.user == flask.g.fas_user.username): - raise pagure.exceptions.APIError(403, error_code=7) + raise pagure.exceptions.APIError(403, error_code=APIERROR.EISSUEREST) status = pagure.lib.get_issue_statuses(SESSION) form = pagure.forms.StatusForm(status=status, csrf_enabled=False) @@ -181,12 +181,12 @@ def api_change_status_issue(repo, issueid, username=None): output['message'] = 'No changes' except pagure.exceptions.PagureException, err: raise pagure.exceptions.APIError( - 400, error_code=0, error=str(err)) + 400, error_code=APIERROR.ENOCODE, error=str(err)) except SQLAlchemyError, err: # pragma: no cover - raise pagure.exceptions.APIError(400, error_code=3) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EDBERROR) else: - raise pagure.exceptions.APIError(400, error_code=4) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EINVALIDREQ) jsonout = flask.jsonify(output) jsonout.status_code = httpcode @@ -205,23 +205,23 @@ def api_comment_issue(repo, issueid, username=None): output = {} if repo is None: - raise pagure.exceptions.APIError(404, error_code=1) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOPROJECT) if not repo.settings.get('issue_tracker', True): - raise pagure.exceptions.APIError(404, error_code=2) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOTRACKER) if repo.fullname != flask.g.token.project.fullname: - raise pagure.exceptions.APIError(401, error_code=5) + raise pagure.exceptions.APIError(401, error_code=APIERROR.EINVALIDTOK) issue = pagure.lib.search_issues(SESSION, repo, issueid=issueid) if issue is None or issue.project != repo: - raise pagure.exceptions.APIError(404, error_code=6) + raise pagure.exceptions.APIError(404, error_code=APIERROR.ENOISSUE) if issue.private and not is_repo_admin(repo) \ and (not authenticated() or not issue.user.user == flask.g.fas_user.username): - raise pagure.exceptions.APIError(403, error_code=7) + raise pagure.exceptions.APIError(403, error_code=APIERROR.EISSUEREST) form = pagure.forms.CommentForm(csrf_enabled=False) if form.validate_on_submit(): @@ -238,10 +238,10 @@ def api_comment_issue(repo, issueid, username=None): SESSION.commit() output['message'] = message except SQLAlchemyError, err: # pragma: no cover - raise pagure.exceptions.APIError(400, error_code=3) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EDBERROR) else: - raise pagure.exceptions.APIError(400, error_code=4) + raise pagure.exceptions.APIError(400, error_code=APIERROR.EINVALIDREQ) jsonout = flask.jsonify(output) jsonout.status_code = httpcode diff --git a/requirements.txt b/requirements.txt index 4030d75..f90ae69 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ arrow blinker chardet docutils +enum34 flask flask-wtf kitchen