From 7a734f992bce2ea73f7276b5bf49a790669af9ed Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 10 2015 16:16:38 +0000 Subject: [PATCH 1/2] Include in the API the number of items returned This way no need to iterate through the list, we can know the info directly. Adjust the API documentation accordingly --- diff --git a/pagure/api/__init__.py b/pagure/api/__init__.py index 73dd47d..1cdffa9 100644 --- a/pagure/api/__init__.py +++ b/pagure/api/__init__.py @@ -251,6 +251,7 @@ def api_users(): :: { + "total_users": 2, "users": ["user1", "user2"] } @@ -259,13 +260,12 @@ def api_users(): if pattern is not None and not pattern.endswith('*'): pattern += '*' + users = pagure.lib.search_user(SESSION, pattern=pattern) + return flask.jsonify( { - 'users': [ - user.username - for user in pagure.lib.search_user( - SESSION, pattern=pattern) - ] + 'total_users': len(users), + 'users': [user.username for user in users] } ) @@ -304,6 +304,7 @@ def api_project_tags(repo, username=None): :: { + "total_tags": 2, "tags": ["tag1", "tag2"] } @@ -319,13 +320,13 @@ def api_project_tags(repo, username=None): jsonout.status_code = 404 return jsonout + tags = pagure.lib.get_tags_of_project( + SESSION, project_obj, pattern=pattern) + return flask.jsonify( { - 'tags': [ - tag.tag - for tag in pagure.lib.get_tags_of_project( - SESSION, project_obj, pattern=pattern) - ] + 'total_tags': len(tags), + 'tags': [tag.tag for tag in tags] } ) @@ -360,6 +361,7 @@ def api_groups(): :: { + "total_groups": 2, "groups": ["group1", "group2"] } @@ -368,13 +370,12 @@ def api_groups(): if pattern is not None and not pattern.endswith('*'): pattern += '*' + groups = pagure.lib.search_groups(SESSION, pattern=pattern) + return flask.jsonify( { - 'groups': [ - group.group_name - for group in pagure.lib.search_groups( - SESSION, pattern=pattern) - ] + 'total_groups': len(groups), + 'groups': [group.group_name for group in groups] } ) diff --git a/pagure/api/fork.py b/pagure/api/fork.py index 436443c..a99a957 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -65,6 +65,7 @@ def api_pull_request_views(repo, username=None): "author": null, "status": true }, + "total_requests": 1, "requests": [ { "assignee": null, @@ -140,6 +141,7 @@ def api_pull_request_views(repo, username=None): status=status) jsonout = flask.jsonify({ + 'total_requests': len(requests), 'requests': [ request.to_json(public=True, api=True) for request in requests], diff --git a/pagure/api/issue.py b/pagure/api/issue.py index e88d5c7..363e13a 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -192,6 +192,7 @@ def api_view_issues(repo, username=None): "0.1" ] }, + "total_issues": 1, "issues": [ { "assignee": null, @@ -271,6 +272,7 @@ def api_view_issues(repo, username=None): author=author, private=private) jsonout = flask.jsonify({ + 'total_issues': len(issues), 'issues': [issue.to_json(public=True) for issue in issues], 'args': { 'status': status, diff --git a/pagure/api/project.py b/pagure/api/project.py index d5a272b..60f9719 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -40,6 +40,7 @@ def api_git_tags(repo, username=None): :: { + "total_tags": 2, "tags": ["0.0.1", "0.0.2"] } @@ -51,7 +52,10 @@ def api_git_tags(repo, username=None): tags = pagure.lib.git.get_git_tags(repo) - jsonout = flask.jsonify({'tags': tags}) + jsonout = flask.jsonify({ + 'total_tags': len(tags), + 'tags': tags + }) return jsonout @@ -96,6 +100,7 @@ def api_projects(): :: { + "total_projects": 2, "projects": [ { "date_created": "1427441537", @@ -150,6 +155,7 @@ def api_projects(): 404, error_code=APIERROR.ENOPROJECTS) jsonout = flask.jsonify({ + 'total_projects': len(projects), 'projects': [p.to_json(api=True, public=True) for p in projects] }) return jsonout From 22662856016149ca9d8933b366aacd1924f1a2c7 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 10 2015 16:17:18 +0000 Subject: [PATCH 2/2] Adjust the unit-tests for the change in the API data returned --- diff --git a/tests/test_progit_flask_api.py b/tests/test_progit_flask_api.py index c54817f..6432d07 100644 --- a/tests/test_progit_flask_api.py +++ b/tests/test_progit_flask_api.py @@ -54,13 +54,15 @@ class PagureFlaskApitests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertEqual(sorted(data['users']), ['foo', 'pingou']) - self.assertEqual(data.keys(), ['users']) + self.assertEqual(sorted(data.keys()), ['total_users', 'users']) + self.assertEqual(data['total_users'], 2) output = self.app.get('/api/0/users?pattern=p') self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertEqual(data['users'], ['pingou']) - self.assertEqual(data.keys(), ['users']) + self.assertEqual(sorted(data.keys()), ['total_users', 'users']) + self.assertEqual(data['total_users'], 1) def test_api_project_tags(self): """ Test the api_project_tags function. """ @@ -76,8 +78,9 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/test/tags/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) - self.assertEqual(data.keys(), ['tags']) + self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) self.assertEqual(data['tags'], []) + self.assertEqual(data['total_tags'], 0) # Add an issue and tag it so that we can list them item = pagure.lib.model.Issue( @@ -105,20 +108,23 @@ class PagureFlaskApitests(tests.Modeltests): output = self.app.get('/api/0/test/tags/') self.assertEqual(output.status_code, 200) data = json.loads(output.data) - self.assertEqual(data.keys(), ['tags']) + self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) self.assertEqual(data['tags'], ['tag1']) + self.assertEqual(data['total_tags'], 1) output = self.app.get('/api/0/test/tags/?pattern=t') self.assertEqual(output.status_code, 200) data = json.loads(output.data) - self.assertEqual(data.keys(), ['tags']) + self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) self.assertEqual(data['tags'], ['tag1']) + self.assertEqual(data['total_tags'], 1) output = self.app.get('/api/0/test/tags/?pattern=p') self.assertEqual(output.status_code, 200) data = json.loads(output.data) - self.assertEqual(data.keys(), ['tags']) + self.assertEqual(sorted(data.keys()), ['tags', 'total_tags']) self.assertEqual(data['tags'], []) + self.assertEqual(data['total_tags'], 0) def test_api_groups(self): """ Test the api_groups function. """ @@ -143,13 +149,15 @@ class PagureFlaskApitests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertEqual(data['groups'], ['group1', 'rel-eng']) - self.assertEqual(data.keys(), ['groups']) + self.assertEqual(sorted(data.keys()), ['groups', 'total_groups']) + self.assertEqual(data['total_groups'], 2) output = self.app.get('/api/0/groups?pattern=re') self.assertEqual(output.status_code, 200) data = json.loads(output.data) self.assertEqual(data['groups'], ['rel-eng']) - self.assertEqual(data.keys(), ['groups']) + self.assertEqual(sorted(data.keys()), ['groups', 'total_groups']) + self.assertEqual(data['total_groups'], 1) if __name__ == '__main__': diff --git a/tests/test_progit_flask_api_fork.py b/tests/test_progit_flask_api_fork.py index 81f7a7f..7047d18 100644 --- a/tests/test_progit_flask_api_fork.py +++ b/tests/test_progit_flask_api_fork.py @@ -99,6 +99,7 @@ class PagureFlaskApiForktests(tests.Modeltests): "author": None, "status": True }, + "total_requests": 1, "requests": [ { "assignee": None, diff --git a/tests/test_progit_flask_api_issue.py b/tests/test_progit_flask_api_issue.py index ebd6748..0c50434 100644 --- a/tests/test_progit_flask_api_issue.py +++ b/tests/test_progit_flask_api_issue.py @@ -154,6 +154,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": None, "tags": [] }, + "total_issues": 1, "issues": [ { "assignee": None, @@ -204,6 +205,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": None, "tags": [] }, + "total_issues": 1, "issues": [ { "assignee": None, @@ -257,6 +259,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": None, "tags": [] }, + "total_issues": 1, "issues": [ { "assignee": None, @@ -296,6 +299,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": None, "tags": [] }, + "total_issues": 2, "issues": [ { "assignee": None, @@ -348,6 +352,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": "Closed", "tags": [] }, + "total_issues": 0, "issues": [] } ) @@ -365,6 +370,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): "status": "Invalid", "tags": [] }, + "total_issues": 0, "issues": [] } ) diff --git a/tests/test_progit_flask_api_project.py b/tests/test_progit_flask_api_project.py index 756178a..3a320a5 100644 --- a/tests/test_progit_flask_api_project.py +++ b/tests/test_progit_flask_api_project.py @@ -100,7 +100,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): data = json.loads(output.data) self.assertDictEqual( data, - {'tags': ['0.0.1']} + {'tags': ['0.0.1'], 'total_tags': 1} ) def test_api_projects(self): @@ -137,6 +137,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): self.assertDictEqual( data, { + "total_projects": 1, "projects": [ { "date_created": "1436527638", @@ -161,6 +162,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): self.assertDictEqual( data, { + "total_projects": 2, "projects": [ { "date_created": "1436527638", @@ -196,6 +198,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): self.assertDictEqual( data, { + "total_projects": 1, "projects": [ { "date_created": "1436527638",