diff --git a/augur/datasources/augur_db/augur_db.py b/augur/datasources/augur_db/augur_db.py
index 2a7cc7a85d..d0e4624e94 100644
--- a/augur/datasources/augur_db/augur_db.py
+++ b/augur/datasources/augur_db/augur_db.py
@@ -692,6 +692,182 @@ def code_changes_lines(self, repo_group_id, repo_id=None, period='day', begin_da
'begin_date': begin_date, 'end_date': end_date})
return results
+ @annotate(tag='reviews')
+ def reviews(self, repo_group_id, repo_id=None, period='day', begin_date=None, end_date=None):
+ """ Returns a timeseris of new reviews or pull requests opened
+
+ :param repo_group_id: The repository's repo_group_id
+ :param repo_id: The repository's repo_id, defaults to None
+ :param period: To set the periodicity to 'day', 'week', 'month' or 'year', defaults to 'day'
+ :param begin_date: Specifies the begin date, defaults to '1970-1-1 00:00:00'
+ :param end_date: Specifies the end date, defaults to datetime.now()
+ :return: DataFrame of new reviews/period
+ """
+ if not begin_date:
+ begin_date = '1970-1-1'
+ if not end_date:
+ end_date = datetime.datetime.now().strftime('%Y-%m-%d')
+
+ if not repo_id:
+ reviews_SQL = s.sql.text("""
+ SELECT
+ pull_requests.repo_id,
+ repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_created_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id IN
+ (SELECT repo_id FROM repo WHERE repo_group_id = :repo_group_id)
+ AND pull_requests.pr_created_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ GROUP BY pull_requests.repo_id, repo_name, date
+ ORDER BY pull_requests.repo_id, date
+ """)
+
+ results = pd.read_sql(reviews_SQL, self.db,
+ params={'period': period, 'repo_group_id': repo_group_id,
+ 'begin_date': begin_date, 'end_date': end_date })
+ return results
+
+ else:
+ reviews_SQL = s.sql.text("""
+ SELECT
+ repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_created_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id = :repo_id
+ AND pull_requests.pr_created_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD HH24:MI:SS')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD HH24:MI:SS')
+ GROUP BY date, repo_name
+ ORDER BY date
+ """)
+
+ results = pd.read_sql(reviews_SQL, self.db,
+ params={'period': period, 'repo_id': repo_id,
+ 'begin_date': begin_date, 'end_date': end_date})
+ return results
+
+ @annotate(tag='reviews-accepted')
+ def reviews_accepted(self, repo_group_id, repo_id=None, period='day', begin_date=None, end_date=None):
+ """Returns a timeseries of number of reviews or pull requests accepted.
+
+ :param repo_group_id: The repository's repo_group_id
+ :param repo_id: The repository's repo_id, defaults to None
+ :param period: To set the periodicity to 'day', 'week', 'month' or 'year', defaults to 'day'
+ :param begin_date: Specifies the begin date, defaults to '1970-1-1 00:00:00'
+ :param end_date: Specifies the end date, defaults to datetime.now()
+ :return: DataFrame of accepted reviews/period
+ """
+ if not begin_date:
+ begin_date = '1970-1-1'
+ if not end_date:
+ end_date = datetime.datetime.now().strftime('%Y-%m-%d')
+
+ if not repo_id:
+ reviews_accepted_SQL = s.sql.text("""
+ SELECT
+ pull_requests.repo_id,
+ repo.repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_merged_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id IN
+ (SELECT repo_id FROM repo WHERE repo_group_id = :repo_group_id)
+ AND pr_merged_at IS NOT NULL
+ AND pr_merged_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ GROUP BY pull_requests.repo_id, repo_name, date
+ ORDER BY pull_requests.repo_id, date
+ """)
+
+ results = pd.read_sql(reviews_accepted_SQL, self.db,
+ params={'period': period, 'repo_group_id': repo_group_id,
+ 'begin_date': begin_date, 'end_date': end_date})
+ return results
+ else:
+ reviews_accepted_SQL = s.sql.text("""
+ SELECT
+ repo.repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_merged_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id = :repo_id
+ AND pr_merged_at IS NOT NULL
+ AND pr_merged_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ GROUP BY date, repo.repo_name
+ ORDER BY date
+ """)
+
+ results = pd.read_sql(reviews_accepted_SQL, self.db,
+ params={'period': period, 'repo_id': repo_id,
+ 'begin_date': begin_date, 'end_date': end_date})
+ return results
+
+ @annotate(tag='reviews-declined')
+ def reviews_declined(self, repo_group_id, repo_id=None, period='day', begin_date=None, end_date=None):
+ """ Returns a time series of reivews declined
+
+ :param repo_group_id: The repository's repo_group_id
+ :param repo_id: The repository's repo_id, defaults to None
+ :param period: To set the periodicity to 'day', 'week', 'month' or 'year', defaults to 'day'
+ :param begin_date: Specifies the begin date, defaults to '1970-1-1 00:00:00'
+ :param end_date: Specifies the end date, defaults to datetime.now()
+ :return: DataFrame of declined reviews/period
+ """
+ if not begin_date:
+ begin_date = '1970-1-1'
+ if not end_date:
+ end_date = datetime.datetime.now().strftime('%Y-%m-%d')
+
+ if not repo_id:
+ reviews_declined_SQL = s.sql.text("""
+ SELECT
+ pull_requests.repo_id,
+ repo.repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_closed_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id IN
+ (SELECT repo_id FROM repo WHERE repo_group_id = :repo_group_id)
+ AND pr_src_state = 'closed' AND pr_merged_at IS NULL
+ AND pr_closed_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ GROUP BY pull_requests.repo_id, repo_name, date
+ ORDER BY pull_requests.repo_id, date
+ """)
+
+ results = pd.read_sql(reviews_declined_SQL, self.db,
+ params={'period': period, 'repo_group_id': repo_group_id,
+ 'begin_date': begin_date, 'end_date': end_date })
+ return results
+ else:
+ reviews_declined_SQL = s.sql.text("""
+ SELECT
+ repo.repo_name,
+ DATE_TRUNC(:period, pull_requests.pr_closed_at) AS date,
+ COUNT(pr_src_id) AS pull_requests
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id = :repo_id
+ AND pr_src_state = 'closed' AND pr_merged_at IS NULL
+ AND pr_closed_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ GROUP BY date, repo.repo_name
+ ORDER BY date
+ """)
+
+ results = pd.read_sql(reviews_declined_SQL, self.db,
+ params={'period': period, 'repo_id': repo_id,
+ 'begin_date': begin_date, 'end_date': end_date})
+ return results
+
@annotate(tag='issues-new')
def issues_new(self, repo_group_id, repo_id=None, period='day', begin_date=None, end_date=None):
"""Returns a timeseries of new issues opened.
@@ -855,6 +1031,70 @@ def issues_closed(self, repo_group_id, repo_id=None, period='day', begin_date=No
'begin_date': begin_date, 'end_date': end_date})
return results
+ @annotate(tag='review-duration')
+ def review_duration(self, repo_group_id, repo_id=None, begin_date=None, end_date=None):
+ """ Returns the duartion of each accepted review.
+
+ :param repo_group_id: The repository's repo_group_id
+ :param repo_id: The repository's repo_id, defaults to None
+ :param begin_date: Specifies the begin date, defaults to '1970-1-1 00:00:00'
+ :param end_date: Specifies the end date, defaults to datetime.now()
+ :return: DataFrame of pull request id with the corresponding duration
+ """
+ if not begin_date:
+ begin_date = '1970-1-1'
+ if not end_date:
+ end_date = datetime.datetime.now().strftime('%Y-%m-%d')
+
+ if not repo_id:
+ review_duration_SQL = s.sql.text("""
+ SELECT
+ pull_requests.repo_id,
+ repo.repo_name,
+ pull_requests.pull_request_id,
+ pull_requests.pr_created_at AS created_at,
+ pull_requests.pr_merged_at AS merged_at,
+ (pr_merged_at - pr_created_at) AS duration
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id IN
+ (SELECT repo_id FROM repo WHERE repo_group_id = :repo_group_id)
+ AND pr_merged_at IS NOT NULL
+ AND pr_created_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ ORDER BY pull_requests.repo_id, pull_requests.pull_request_id
+ """)
+
+ results = pd.read_sql(review_duration_SQL, self.db,
+ params={'repo_group_id': repo_group_id,
+ 'begin_date': begin_date,
+ 'end_date': end_date})
+ results['duration'] = results['duration'].astype(str)
+ return results
+ else:
+ review_duration_SQL = s.sql.text("""
+ SELECT
+ repo_name,
+ pull_request_id,
+ pr_created_at AS created_at,
+ pr_merged_at AS merged_at,
+ (pr_merged_at - pr_created_at) AS duration
+ FROM pull_requests JOIN repo ON pull_requests.repo_id = repo.repo_id
+ WHERE pull_requests.repo_id = :repo_id
+ AND pr_merged_at IS NOT NULL
+ AND pr_created_at
+ BETWEEN to_timestamp(:begin_date, 'YYYY-MM-DD')
+ AND to_timestamp(:end_date, 'YYYY-MM-DD')
+ ORDER BY pull_requests.repo_id, pull_request_id
+ """)
+
+ results = pd.read_sql(review_duration_SQL, self.db,
+ params={'repo_id': repo_id,
+ 'begin_date': begin_date,
+ 'end_date': end_date})
+ results['duration'] = results['duration'].astype(str)
+ return results
+
@annotate(tag='issue-duration')
def issue_duration(self, repo_group_id, repo_id=None, begin_date=None, end_date=None):
"""Returns the duration of each issue.
@@ -1388,7 +1628,7 @@ def license_declared(self, repo_group_id, repo_id=None):
repo_name = pd.read_sql(s.sql.text('SELECT repo_name FROM repo WHERE repo_group_id = :repo_group_id'), self.spdx_db, params={'repo_group_id', repo_group_id})
if repo_name.empty:
return pd.DataFrame()
-
+
repo_name_list = repo_name['repo_name'].tolist()
license_declared_SQL = s.sql.text("""
SELECT packages.name as repo_name, licenses.short_name, COUNT(files_licenses.file_id) as count
@@ -1399,11 +1639,11 @@ def license_declared(self, repo_group_id, repo_id=None):
GROUP BY licenses.short_name, repo_name
ORDER BY count DESC
""")
-
+
results = pd.read_sql(license_declared_SQL, self.spdx_db, params={'repo_name_list': repo_name_list})
return results
-
+
@annotate(tag='license-coverage')
def license_coverage(self, repo_group_id, repo_id=None):
"""Returns the declared license
@@ -1475,11 +1715,11 @@ def license_coverage(self, repo_group_id, repo_id=None):
)b
WHERE a.name = b.name
""")
-
+
results = pd.read_sql(license_declared_SQL, self.spdx_db, params={'repo_name_list': repo_name_list})
return results
-
+
@annotate(tag='license_count')
def license_count(self, repo_group_id, repo_id=None):
"""Returns the declared license
@@ -1579,13 +1819,13 @@ def license_count(self, repo_group_id, repo_id=None):
ORDER BY license_declared_file DESC
) c
WHERE a.name = b.name
- AND b.name = c.name
+ AND b.name = c.name
""")
-
+
results = pd.read_sql(license_declared_SQL, self.spdx_db, params={'repo_name_list': repo_name_list})
return results
-
+
@annotate(tag='issues-maintainer-response-duration')
def issues_maintainer_response_duration(self, repo_group_id, repo_id=None, begin_date=None, end_date=None):
@@ -1661,7 +1901,7 @@ def issues_maintainer_response_duration(self, repo_group_id, repo_id=None, begin
@annotate(tag='committers')
def committers(self, repo_group_id, repo_id=None, begin_date=None, end_date=None, period='day'):
-
+
if not begin_date:
begin_date = '1970-1-1 00:00:01'
if not end_date:
@@ -1706,7 +1946,7 @@ def committers(self, repo_group_id, repo_id=None, begin_date=None, end_date=None
results = pd.read_sql(committersSQL, self.db, params={'repo_id': repo_id, 'repo_group_id': repo_group_id,'begin_date': begin_date, 'end_date': end_date, 'period':period})
- return results
+ return results
#####################################
diff --git a/augur/datasources/augur_db/routes.py b/augur/datasources/augur_db/routes.py
index 77d686df82..5b1a675d35 100644
--- a/augur/datasources/augur_db/routes.py
+++ b/augur/datasources/augur_db/routes.py
@@ -294,6 +294,210 @@ def get_repos_for_dosocs():
"""
server.addRepoMetric(augur_db.code_changes_lines, 'code-changes-lines')
+ """
+ @api {get} /repo-groups/:repo_group_id/reviews Reviews (Repo Group)
+ @apiName reviews-repo-group
+ @apiGroup Evolution
+ @apiDescription Time series of number of new reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_id": 21035,
+ "repo_name": "prototype-ujs",
+ "date": "2010-01-01T00:00:00.000Z",
+ "pull_requests": 1
+ },
+ {
+ "repo_id": 21035,
+ "repo_name": "prototype-ujs",
+ "date": "2011-01-01T00:00:00.000Z",
+ "pull_requests": 5
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2011-01-01T00:00:00.000Z",
+ "pull_requests": 16
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2012-01-01T00:00:00.000Z",
+ "pull_requests": 14
+ }
+ ]
+ """
+ server.addRepoGroupMetric(augur_db.reviews, 'reviews')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/repos/:repo_id/reviews Reviews (Repo)
+ @apiName reviews-repo
+ @apiGroup Evolution
+ @apiDescription Time series of number of new reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID.
+ @apiParam {string} repo_id Repository ID.
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_name": "graphql-spec",
+ "date": "2016-01-01T00:00:00.000Z",
+ "pull_requests": 37
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2017-01-01T00:00:00.000Z",
+ "pull_requests": 49
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2018-01-01T00:00:00.000Z",
+ "pull_requests": 63
+ }
+ ]
+ """
+ server.addRepoMetric(augur_db.reviews, 'reviews')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/reviews-accepted Reviews Accepted (Repo Group)
+ @apiName reviews-accepted-repo-group
+ @apiGroup Evolution
+ @apiDescription Time series of number of accepted reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_id": 21035,
+ "repo_name": "prototype-ujs",
+ "date": "2010-01-01T00:00:00.000Z",
+ "pull_requests": 1
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2011-01-01T00:00:00.000Z",
+ "pull_requests": 4
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2012-01-01T00:00:00.000Z",
+ "pull_requests": 4
+ }
+ ]
+ """
+ server.addRepoGroupMetric(augur_db.reviews_accepted, 'reviews-accepted')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/repos/:repo_id/reviews-accepted Reviews Accepted (Repo)
+ @apiName reviews-accepted-repo
+ @apiGroup Evolution
+ @apiDescription Time series of number of accepted reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID.
+ @apiParam {string} repo_id Repository ID.
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_name": "graphql-spec",
+ "date": "2016-01-01T00:00:00.000Z",
+ "pull_requests": 30
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2017-01-01T00:00:00.000Z",
+ "pull_requests": 37
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2018-01-01T00:00:00.000Z",
+ "pull_requests": 46
+ }
+ ]
+ """
+ server.addRepoMetric(augur_db.reviews_accepted, 'reviews-accepted')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/reviews-declined Reviews Declined (Repo Group)
+ @apiName reviews-declined-repo-group
+ @apiGroup Evolution
+ @apiDescription Time series of number of declined reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_id": 21035,
+ "repo_name": "prototype-ujs",
+ "date": "2010-01-01T00:00:00.000Z",
+ "pull_requests": 1
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2011-01-01T00:00:00.000Z",
+ "pull_requests": 3
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "date": "2012-01-01T00:00:00.000Z",
+ "pull_requests": 6
+ }
+ ]
+ """
+ server.addRepoGroupMetric(augur_db.reviews_declined, 'reviews-declined')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/repos/:repo_id/reviews-declined Reviews Declined (Repo)
+ @apiName reviews-declined-repo
+ @apiGroup Evolution
+ @apiDescription Time series of number of declined reviews / pull requests opened within a certain period.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID.
+ @apiParam {string} repo_id Repository ID.
+ @apiParam {string=day, week, month, year} [period="day"] Periodicity specification.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_name": "graphql-spec",
+ "date": "2016-01-01T00:00:00.000Z",
+ "pull_requests": 11
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2017-01-01T00:00:00.000Z",
+ "pull_requests": 16
+ },
+ {
+ "repo_name": "graphql-spec",
+ "date": "2018-01-01T00:00:00.000Z",
+ "pull_requests": 4
+ }
+ ]
+ """
+ server.addRepoMetric(augur_db.reviews_declined, 'reviews-declined')
+
"""
@api {get} /repo-groups/:repo_group_id/issues-new Issues New (Repo Group)
@apiName issues-new-repo-group
@@ -492,6 +696,75 @@ def get_repos_for_dosocs():
"""
server.addRepoMetric(augur_db.issues_closed, 'issues-closed')
+ """
+ @api {get} /repo-groups/:repo_group_id/review-duration Review Duration (Repo Group)
+ @apiName review-duration-repo-group
+ @apiGroup Evolution
+ @apiDescription Time since an review/pull request is proposed until it is accepted.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_id": 21035,
+ "repo_name": "prototype-ujs",
+ "pull_request_id": 25386,
+ "created_at": "2010-09-28T19:07:15.000Z",
+ "merged_at": "2010-09-29T17:46:59.000Z",
+ "duration": "0 days 22:39:44.000000000"
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "pull_request_id": 25392,
+ "created_at": "2011-05-18T14:11:23.000Z",
+ "merged_at": "2011-05-18T19:03:01.000Z",
+ "duration": "0 days 04:51:38.000000000"
+ },
+ {
+ "repo_id": 21042,
+ "repo_name": "pjax_rails",
+ "pull_request_id": 25396,
+ "created_at": "2011-05-25T10:09:01.000Z",
+ "merged_at": "2011-05-25T19:30:01.000Z",
+ "duration": "0 days 09:21:00.000000000"
+ }
+ ]
+ """
+ server.addRepoGroupMetric(augur_db.review_duration, 'review-duration')
+
+ """
+ @api {get} /repo-groups/:repo_group_id/repos/:repo_id/review-duration review Duration (Repo)
+ @apiName review-duration-repo
+ @apiGroup Evolution
+ @apiDescription Time since an review/pull request is proposed until it is accepted.
+ CHAOSS Metric Definition
+ @apiParam {string} repo_group_id Repository Group ID.
+ @apiParam {string} repo_id Repository ID.
+ @apiParam {string} [begin_date="1970-1-1 0:0:0"] Beginning date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiParam {string} [end_date="current date"] Ending date specification. E.g. values: `2018`, `2018-05`, `2019-05-01`
+ @apiSuccessExample {json} Success-Response:
+ [
+ {
+ "repo_name": "graphql-spec",
+ "pull_request_id": 25374,
+ "created_at": "2019-01-02T11:02:08.000Z",
+ "merged_at": "2019-07-05T09:10:45.000Z",
+ "duration": "183 days 22:08:37.000000000"
+ },
+ {
+ "repo_name": "graphql-spec",
+ "pull_request_id": 25378,
+ "created_at": "2019-03-28T13:44:04.000Z",
+ "merged_at": "2019-07-03T23:10:36.000Z",
+ "duration": "97 days 09:26:32.000000000"
+ }
+ ]
+ """
+ server.addRepoMetric(augur_db.review_duration, 'review-duration')
+
"""
@api {get} /repo-groups/:repo_group_id/issue-duration Issue Duration (Repo Group)
@apiName issue-duration-repo-group
diff --git a/workers/gh_pr_worker/gh_pr_worker/worker.py b/workers/gh_pr_worker/gh_pr_worker/worker.py
index 36183fd7ef..4f0a6ed5ef 100644
--- a/workers/gh_pr_worker/gh_pr_worker/worker.py
+++ b/workers/gh_pr_worker/gh_pr_worker/worker.py
@@ -4,6 +4,7 @@
import os
import sys
import time
+import traceback
from datetime import datetime
from multiprocessing import Process, Queue
from urllib.parse import urlparse
@@ -260,18 +261,19 @@ def collect(self):
raise ValueError(f'{message.type} is not a recognized task type')
if message.type == 'TASK':
- try:
- git_url = message.entry_info['task']['given']['git_url']
- self.query_pr({'git_url': git_url, 'repo_id': message.entry_info['repo_id']})
- except Exception as e:
- logging.info("Worker ran into an error for task: {}\n".format(message.entry_info['task']))
- logging.info("Error encountered: " + str(e) + "\n")
- logging.info("Notifying broker and logging task failure in database...\n")
+ # try:
+ git_url = message.entry_info['task']['given']['git_url']
+ self.query_pr({'git_url': git_url, 'repo_id': message.entry_info['repo_id']})
+ # except Exception as e:
+ # logging.error("Worker ran into an error for task: {}\n".format(message.entry_info['task']))
+ # logging.error("Error encountered: " + str(e) + "\n")
+ # traceback.format_exc()
+ # logging.info("Notifying broker and logging task failure in database...\n")
- message.entry_info['task']['worker_id'] = self.config['id']
+ # message.entry_info['task']['worker_id'] = self.config['id']
- requests.post("http://localhost:{}/api/unstable/task_error".format(
- self.config['broker_port']), json=message.entry_info['task'])
+ # requests.post("http://localhost:{}/api/unstable/task_error".format(
+ # self.config['broker_port']), json=message.entry_info['task'])
# Add to history table
# task_history = {
@@ -298,9 +300,7 @@ def collect(self):
# logging.info("Updated job process for model: " + message.entry_info['task']['models'][0] + "\n")
# Reset results counter for next task
- self.results_counter = 0
- logging.info("passing")
- pass
+ self.results_counter = 0
logging.info("passed")
def query_pr(self, entry_info):
@@ -356,6 +356,7 @@ def query_pr(self, entry_info):
pr = {
'pull_request_id': self.pr_id_inc,
+ 'repo_id': repo_id,
'pr_url': pr_dict['url'],
'pr_src_id': pr_dict['id'],
'pr_src_node_id': None,
@@ -486,10 +487,10 @@ def query_pr_events(self, owner, repo, gh_pr_no, pr_id):
for pr_event_dict in pr_events:
- if 'actor' in pr_event_dict:
+ if pr_event_dict['actor']:
cntrb_id = self.find_id_from_login(pr_event_dict['actor']['login'])
else:
- cntrb_id = None
+ cntrb_id = 1
pr_event = {
'pr_event_id': self.event_id_inc,