From a6e4e7a860b61ce4578816dfef28d919bb773d13 Mon Sep 17 00:00:00 2001 From: Parag Nemade Date: Mar 18 2018 06:16:21 +0000 Subject: Added 4 API methods and their test cases for getting more stats of pagure users - user_activity_stats - user_activity_stats_by_date - list_pull_requests - list_prs_actionable_by_user Signed-off-by: Parag Nemade --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index 76824e6..c07173e 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -520,6 +520,113 @@ class Pagure(object): return return_value + def user_activity_stats(self, username, format=None): + """ + Retrieve the activity stats about a specific user over the last year. + + Params: + username (string): filters the username of the user whose activity you are interested in. + format (string): Allows changing the of the date/time returned from iso format + to unix timestamp Can be: timestamp or isoformat + Returns: + dict: A dictionary of activities done by a given user for all the projects + for a given Pagure instance. + """ + request_url = "{}/api/0/user/{}/activity/stats".format(self.instance, username) + + payload = {} + if username is not None: + payload['username'] = username + if format is not None: + payload['format'] = format + + return_value = self._call_api(request_url, params=payload) + + return return_value + + def user_activity_stats_by_date(self, username, date, grouped=None): + """ + Retrieve activity information about a specific user on the specified date. + + Params: + username (string): filters the username of the user whose activity you are interested in. + date (string): filters by the date of interest, best provided in ISO format: YYYY-MM-DD + grouped (boolean): filters whether or not to group the commits + + Returns: + list: A list of activities done by a given user on some particular + date for all the projects for given Pagure instance. + """ + request_url = "{}/api/0/user/{}/activity/{}".format(self.instance, username, date) + + payload = {} + if username is not None: + payload['username'] = username + if date is not None: + payload['date'] = date + if grouped is not None: + payload['grouped'] = grouped + + return_value = self._call_api(request_url, params=payload) + + return return_value['activities'] + + def list_pull_requests(self, username, page, status=None): + """ + List pull-requests filed by user. + + Params: + username (string): filters the username of the user whose activity you are interested in. + page (integer): the page requested. Defaults to 1. + status (string): filter the status of pull requests. Default: Open, + can be Closed, Merged, All. + + Returns: + list: A list of Pull-Requests filed by a given user for all the + projects for given Pagure instance. + """ + request_url = "{}/api/0/user/{}/requests/filed".format(self.instance, username) + + payload = {} + if username is not None: + payload['username'] = username + if page is not None: + payload['page'] = page + if status is not None: + payload['status'] = status + + return_value = self._call_api(request_url, params=payload) + + return return_value['requests'] + + def list_prs_actionable_by_user(self, username, page, status=None): + """ + List PRs actionable by user. + + Params: + username (string): filters the username of the user whose activity you are interested in. + page (integer): the page requested. Defaults to 1. + status (string): filter the status of pull requests. Default: Open, + can be Closed, Merged, All. + + Returns: + list: A list of Pull-Requests a user is able to action for all the + projects for given Pagure instance. + """ + request_url = "{}/api/0/user/{}/requests/actionable".format(self.instance, username) + + payload = {} + if username is not None: + payload['username'] = username + if page is not None: + payload['page'] = page + if status is not None: + payload['status'] = status + + return_value = self._call_api(request_url, params=payload) + + return return_value['requests'] + def new_project(self, name, description, namespace=None, url=None, avatar_email=None, create_readme=False, private=False): """ diff --git a/tests/test_api.py b/tests/test_api.py index fdbd126..53639fd 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -280,3 +280,36 @@ def test_project_branches(mocker, simple_pg): simple_pg.project_branches() Pagure._call_api.assert_called_once_with( 'https://pagure.io/api/0/testrepo/git/branches') + +def test_user_activity_stats(mocker, simple_pg): + """ Test the API call to get stats about a user activity""" + mocker.patch('libpagure.Pagure._call_api') + simple_pg.user_activity_stats('auser') + expected = {'username': 'auser'} + Pagure._call_api.assert_called_once_with( + 'https://pagure.io/api/0/user/auser/activity/stats', params=expected) + +def test_user_activity_stats_by_date(mocker, simple_pg): + """ Test the API call to get stats about a user activity by specific date""" + mocker.patch('libpagure.Pagure._call_api') + simple_pg.user_activity_stats_by_date('auser',"2017-12-30") + expected = {'username': 'auser', 'date' : '2017-12-30'} + Pagure._call_api.assert_called_once_with( + 'https://pagure.io/api/0/user/auser/activity/2017-12-30', params=expected) + +def test_list_pull_requests(mocker, simple_pg): + """ Test the API call to get stats about a user's pull requests""" + mocker.patch('libpagure.Pagure._call_api') + simple_pg.list_pull_requests('auser', 1) + expected = {'username': 'auser', 'page': 1} + Pagure._call_api.assert_called_once_with( + 'https://pagure.io/api/0/user/auser/requests/filed', params=expected) + + +def test_list_prs_actionable_by_user(mocker, simple_pg): + """ Test the API call to list PR's actionable for a given user""" + mocker.patch('libpagure.Pagure._call_api') + simple_pg.list_prs_actionable_by_user('auser', 1) + expected = {'username': 'auser', 'page': 1} + Pagure._call_api.assert_called_once_with( + 'https://pagure.io/api/0/user/auser/requests/actionable', params=expected)