From 2314f2a3b0a60f5810ebc9870b46f7a1492bb1e9 Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Mon, 6 Jan 2025 19:21:15 +0700 Subject: [PATCH 01/10] Feature: Remove validations and fix months comments --- build/index.js | 588 +++--------------- configs/lastMonthsReport.yml | 2 +- configs/manualTriggerForAllReposOfOrg.yml | 2 +- configs/updateReportOnPRClose.yml | 2 +- configs/yearReportWithoutDevelopers.yml | 2 +- package.json | 2 +- src/common/utils/index.ts | 1 - src/common/utils/validate.ts | 96 --- src/common/utils/validators/index.ts | 5 - src/common/utils/validators/validateDate.ts | 68 -- .../validators/validateMultipleValues.ts | 67 -- src/common/utils/validators/validateNumber.ts | 47 -- .../utils/validators/validateRequired.ts | 17 - .../utils/validators/validateSingleValue.ts | 34 - .../utils/calculations/getApproveTime.spec.ts | 23 + src/createOutput.ts | 2 +- src/index.ts | 8 - 17 files changed, 109 insertions(+), 857 deletions(-) delete mode 100644 src/common/utils/validate.ts delete mode 100644 src/common/utils/validators/index.ts delete mode 100644 src/common/utils/validators/validateDate.ts delete mode 100644 src/common/utils/validators/validateMultipleValues.ts delete mode 100644 src/common/utils/validators/validateNumber.ts delete mode 100644 src/common/utils/validators/validateRequired.ts delete mode 100644 src/common/utils/validators/validateSingleValue.ts diff --git a/build/index.js b/build/index.js index 0f600fc..bba3608 100644 --- a/build/index.js +++ b/build/index.js @@ -349,7 +349,7 @@ exports.getValueAsIs = getValueAsIs; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOrgs = exports.encrypt = exports.checkCommentSkip = exports.validate = exports.getMultipleValuesInput = exports.setTimezone = exports.getValueAsIs = exports.getDateFormat = void 0; +exports.getOrgs = exports.encrypt = exports.checkCommentSkip = exports.getMultipleValuesInput = exports.setTimezone = exports.getValueAsIs = exports.getDateFormat = void 0; var getDateFormat_1 = __nccwpck_require__(15010); Object.defineProperty(exports, "getDateFormat", ({ enumerable: true, get: function () { return getDateFormat_1.getDateFormat; } })); var getValueAsIs_1 = __nccwpck_require__(18863); @@ -358,8 +358,6 @@ var setTimezone_1 = __nccwpck_require__(73220); Object.defineProperty(exports, "setTimezone", ({ enumerable: true, get: function () { return setTimezone_1.setTimezone; } })); var getMultipleValuesInput_1 = __nccwpck_require__(31437); Object.defineProperty(exports, "getMultipleValuesInput", ({ enumerable: true, get: function () { return getMultipleValuesInput_1.getMultipleValuesInput; } })); -var validate_1 = __nccwpck_require__(43373); -Object.defineProperty(exports, "validate", ({ enumerable: true, get: function () { return validate_1.validate; } })); var checkCommentSkip_1 = __nccwpck_require__(61585); Object.defineProperty(exports, "checkCommentSkip", ({ enumerable: true, get: function () { return checkCommentSkip_1.checkCommentSkip; } })); var encrypt_1 = __nccwpck_require__(30625); @@ -387,397 +385,6 @@ const setTimezone = () => { exports.setTimezone = setTimezone; -/***/ }), - -/***/ 43373: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validate = void 0; -const core = __importStar(__nccwpck_require__(42186)); -const validators_1 = __nccwpck_require__(75733); -const validators_2 = __nccwpck_require__(75733); -const getMultipleValuesInput_1 = __nccwpck_require__(31437); -const getValueAsIs_1 = __nccwpck_require__(18863); -const validate = () => { - const requiredErrors = (0, validators_1.validateRequired)([ - "GITHUB_TOKEN", - ["GITHUB_OWNERS_REPOS", "ORGANIZATIONS"], - ...((0, getMultipleValuesInput_1.getMultipleValuesInput)("EXECUTION_OUTCOME").includes("new-issue") || - (0, getMultipleValuesInput_1.getMultipleValuesInput)("EXECUTION_OUTCOME").includes("existing-issue") - ? ["GITHUB_OWNER_FOR_ISSUE", "GITHUB_REPO_FOR_ISSUE"] - : []), - ]); - const { errors: multipleValuesErrors, warnings: multipleValuesWarnings } = (0, validators_2.validateMultipleValues)({ - SHOW_STATS_TYPES: { - validValues: [ - "timeline", - "workload", - "pr-quality", - "code-review-engagement", - "response-time", - ], - required: true, - }, - AGGREGATE_VALUE_METHODS: { - validValues: ["percentile", "average", "median"], - required: false, - }, - EXECUTION_OUTCOME: { - validValues: ["new-issue", "collection", "markdown", "existing-issue"], - required: true, - }, - }); - const { warnings: singleValueWarnings, errors: singleValueErrors } = (0, validators_1.validateSingleValue)({ - PERIOD_SPLIT_UNIT: { - validValues: ["quarters", "none", "months", "years"], - required: false, - }, - }); - const { warnings: numbersWarnings, errors: numbersErrors } = (0, validators_1.validateNumber)({ - AMOUNT: { - min: 0, - isCritical: !(0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_START") && - !(0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_END") && - !(0, getValueAsIs_1.getValueAsIs)("REPORT_PERIOD"), - }, - PERCENTILE: { - max: 100, - min: 0, - isCritical: (0, getMultipleValuesInput_1.getMultipleValuesInput)("AGGREGATE_VALUE_METHODS").length === 1 && - (0, getMultipleValuesInput_1.getMultipleValuesInput)("AGGREGATE_VALUE_METHODS")[0] === "percentile", - }, - ISSUE_NUMBER: { - min: 1, - isCritical: (0, getMultipleValuesInput_1.getMultipleValuesInput)("EXECUTION_OUTCOME").length === 1 && - (0, getMultipleValuesInput_1.getMultipleValuesInput)("EXECUTION_OUTCOME")[0] === "existing-issue", - }, - TOP_LIST_AMOUNT: { min: 0, isCritical: false }, - }); - const dateErrors = (0, validators_1.validateDate)(); - const errors = { - ...multipleValuesErrors, - ...numbersErrors, - ...dateErrors, - ...singleValueErrors, - ...requiredErrors, - }; - const warnings = { - ...multipleValuesWarnings, - ...singleValueWarnings, - ...numbersWarnings, - }; - Object.values(errors).forEach((message) => { - core.error(message); - }); - Object.values(warnings).forEach((message) => { - core.warning(message); - }); - return errors; -}; -exports.validate = validate; - - -/***/ }), - -/***/ 75733: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateDate = exports.validateNumber = exports.validateSingleValue = exports.validateMultipleValues = exports.validateRequired = void 0; -var validateRequired_1 = __nccwpck_require__(85069); -Object.defineProperty(exports, "validateRequired", ({ enumerable: true, get: function () { return validateRequired_1.validateRequired; } })); -var validateMultipleValues_1 = __nccwpck_require__(11886); -Object.defineProperty(exports, "validateMultipleValues", ({ enumerable: true, get: function () { return validateMultipleValues_1.validateMultipleValues; } })); -var validateSingleValue_1 = __nccwpck_require__(14242); -Object.defineProperty(exports, "validateSingleValue", ({ enumerable: true, get: function () { return validateSingleValue_1.validateSingleValue; } })); -var validateNumber_1 = __nccwpck_require__(20839); -Object.defineProperty(exports, "validateNumber", ({ enumerable: true, get: function () { return validateNumber_1.validateNumber; } })); -var validateDate_1 = __nccwpck_require__(39974); -Object.defineProperty(exports, "validateDate", ({ enumerable: true, get: function () { return validateDate_1.validateDate; } })); - - -/***/ }), - -/***/ 39974: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateDate = void 0; -const parse_1 = __importDefault(__nccwpck_require__(71287)); -const getValueAsIs_1 = __nccwpck_require__(18863); -const date_fns_1 = __nccwpck_require__(73314); -const validateDate = () => { - let errors = {}; - if ((0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_START") && (0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_END")) { - const startDate = (0, parse_1.default)((0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_START"), "d/MM/yyyy", new Date()); - const endDate = (0, parse_1.default)((0, getValueAsIs_1.getValueAsIs)("REPORT_DATE_END"), "d/MM/yyyy", new Date()); - if ((0, date_fns_1.isAfter)(startDate, endDate)) { - errors = { - ...errors, - REPORT_DATE_START: "REPORT_DATE_START is after REPORT_DATE_END", - }; - } - if (!(0, date_fns_1.isValid)(startDate)) { - errors = { - ...errors, - REPORT_DATE_START: "REPORT_DATE_START is invalid", - }; - } - if (!(0, date_fns_1.isValid)(endDate)) { - errors = { - ...errors, - REPORT_DATE_END: "REPORT_DATE_END is invalid", - }; - } - } - if ((0, getValueAsIs_1.getValueAsIs)("CORE_HOURS_START") && (0, getValueAsIs_1.getValueAsIs)("CORE_HOURS_END")) { - const startCoreHours = (0, parse_1.default)((0, getValueAsIs_1.getValueAsIs)("CORE_HOURS_START"), "HH:mm", new Date()); - const endCoreHours = (0, parse_1.default)((0, getValueAsIs_1.getValueAsIs)("CORE_HOURS_END"), "HH:mm", new Date()); - if ((0, date_fns_1.isAfter)(startCoreHours, endCoreHours)) { - errors = { - ...errors, - CORE_HOURS_START: "CORE_HOURS_START is after CORE_HOURS_END", - }; - } - if (!(0, date_fns_1.isValid)(startCoreHours)) { - errors = { - ...errors, - CORE_HOURS_START: "CORE_HOURS_START is invalid", - }; - } - if (!(0, date_fns_1.isValid)(endCoreHours)) { - errors = { - ...errors, - CORE_HOURS_END: "CORE_HOURS_END is invalid", - }; - } - } - return errors; -}; -exports.validateDate = validateDate; - - -/***/ }), - -/***/ 11886: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateMultipleValues = void 0; -const getMultipleValuesInput_1 = __nccwpck_require__(31437); -const validateMultipleValues = (fields) => { - return Object.entries(fields).reduce((acc, [key, value]) => { - const inputValues = (0, getMultipleValuesInput_1.getMultipleValuesInput)(key); - if (inputValues.length === 0) { - return value.required - ? { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} is empty.`, - }, - } - : { - ...acc, - warnings: { - ...acc.warnings, - [key]: `${key} is empty.`, - }, - }; - } - if (value.required && - inputValues.length > 0 && - inputValues.every((input) => !value.validValues.includes(input))) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} doesn't contain any valid value. At least one value should be valid.`, - }, - }; - } - else if (value.required && - inputValues.length > 0 && - inputValues.some((input) => !value.validValues.includes(input))) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: `Some values in ${key} are invalid.`, - }, - }; - } - if (value.required === false && - inputValues.length > 0 && - inputValues.some((input) => !value.validValues.includes(input))) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: `Some values in ${key} are invalid.`, - }, - }; - } - return acc; - }, { errors: {}, warnings: {} }); -}; -exports.validateMultipleValues = validateMultipleValues; - - -/***/ }), - -/***/ 20839: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateNumber = void 0; -const getValueAsIs_1 = __nccwpck_require__(18863); -const validateNumber = (field) => { - return Object.entries(field).reduce((acc, [key, value]) => { - const input = (0, getValueAsIs_1.getValueAsIs)(key); - const number = parseInt(input); - if (Number.isNaN(number) && value.isCritical) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} is not a number`, - }, - }; - } - const isLessMinValue = typeof value.min === "number" && number < value.min; - const isMoreMaxValue = typeof value.max === "number" && number > value.max; - if (isLessMinValue) { - return { - ...acc, - [value.isCritical ? "errors" : "warnings"]: { - ...acc[value.isCritical ? "errors" : "warnings"], - [key]: `${key} should be more than ${value.min}`, - }, - }; - } - if (isMoreMaxValue) { - return { - ...acc, - [value.isCritical ? "errors" : "warnings"]: { - ...acc[value.isCritical ? "errors" : "warnings"], - [key]: `${key} should be less than ${value.max}`, - }, - }; - } - return acc; - }, { errors: {}, warnings: {} }); -}; -exports.validateNumber = validateNumber; - - -/***/ }), - -/***/ 85069: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateRequired = void 0; -const getValueAsIs_1 = __nccwpck_require__(18863); -const validateRequired = (names) => { - return names.reduce((acc, name) => { - if (Array.isArray(name)) { - const isValid = name.some((el) => (0, getValueAsIs_1.getValueAsIs)(el)); - if (isValid) - return acc; - return { ...acc, [name.join(", ")]: `${name.join(", ")} - One of these inputs must be filled` }; - } - if (typeof name === "string") { - const value = (0, getValueAsIs_1.getValueAsIs)(name); - if (value) - return acc; - return { ...acc, [name]: `${name} is required` }; - } - return acc; - }, {}); -}; -exports.validateRequired = validateRequired; - - -/***/ }), - -/***/ 14242: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.validateSingleValue = void 0; -const __1 = __nccwpck_require__(41002); -const validateSingleValue = (fields) => { - return Object.entries(fields).reduce((acc, [key, value]) => { - const inputValue = (0, __1.getValueAsIs)(key); - if (value.required && !value.validValues.includes(inputValue)) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: inputValue ? `${key} is invalid.` : `${key} is empty.`, - }, - }; - } - if (!value.required && !value.validValues.includes(inputValue)) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: inputValue ? `${key} is invalid.` : `${key} is empty.`, - }, - }; - } - return acc; - }, { - errors: {}, - warnings: {}, - }); -}; -exports.validateSingleValue = validateSingleValue; - - /***/ }), /***/ 18465: @@ -2163,7 +1770,7 @@ const createOutput = async (data) => { link: `${issue.data.html_url}#`, }, ]); - if (commentMarkdown === "") + if (commentMarkdown === "" || dates.length < 3) continue; const comment = await (0, requests_1.createComment)(issue.data.number, commentMarkdown); comments.push({ comment, title: date }); @@ -2189,112 +1796,6 @@ const createOutput = async (data) => { exports.createOutput = createOutput; -/***/ }), - -/***/ 79283: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -__nccwpck_require__(44227); -const core = __importStar(__nccwpck_require__(42186)); -const createOutput_1 = __nccwpck_require__(63119); -const requests_1 = __nccwpck_require__(49591); -const converters_1 = __nccwpck_require__(86200); -const utils_1 = __nccwpck_require__(41002); -const getRateLimit_1 = __nccwpck_require__(78028); -const analytics_1 = __nccwpck_require__(88345); -async function main() { - try { - (0, utils_1.setTimezone)(); - const errors = (0, utils_1.validate)(); - (0, analytics_1.sendActionRun)(); - if (Object.entries(errors).length > 0) { - core.setFailed("Inputs are invalid. Action is failed with validation error"); - return; - } - try { - const rateLimitAtBeginning = await (0, getRateLimit_1.getRateLimit)(); - console.log("RATE LIMIT REMAINING BEFORE REQUESTS: ", rateLimitAtBeginning.data.rate.remaining); - } - catch (error) { - console.log("Rate limit could not be retrieved at the beginning of the action"); - } - const ownersRepos = (0, requests_1.getOwnersRepositories)(); - const organizationsRepos = await (0, requests_1.getOrganizationsRepositories)(); - const repos = Object.keys([...ownersRepos, ...organizationsRepos].reduce((acc, element) => { - return { ...acc, [element.join("/")]: 1 }; - }, {})).map((el) => el.split("/")); - console.log("Initiating data request."); - const data = []; - const orgs = (0, utils_1.getOrgs)(); - const teams = await (0, requests_1.getTeams)(orgs); - for (let i = 0; i < repos.length; i++) { - const result = await (0, requests_1.makeComplexRequest)(parseInt((0, utils_1.getValueAsIs)("AMOUNT")), { - owner: repos[i][0], - repo: repos[i][1], - }, { - skipComments: (0, utils_1.checkCommentSkip)(), - }); - data.push(result); - } - console.log("Data successfully retrieved. Starting report calculations."); - const mergedData = data.reduce((acc, element) => ({ - ownerRepo: acc.ownerRepo - ? acc.ownerRepo.concat(",", element.ownerRepo) - : element.ownerRepo, - events: [...acc.events, ...element.events], - pullRequestInfo: [...acc?.pullRequestInfo, ...element.pullRequestInfo], - comments: [...acc?.comments, ...element.comments], - }), { - ownerRepo: "", - events: [], - pullRequestInfo: [], - comments: [], - }); - const preparedData = (0, converters_1.collectData)(mergedData, teams); - console.log("Calculation complete. Generating markdown."); - await (0, createOutput_1.createOutput)(preparedData); - try { - const rateLimitAtEnd = await (0, getRateLimit_1.getRateLimit)(); - console.log("RATE LIMIT REMAINING AFTER REQUESTS: ", rateLimitAtEnd.data.rate.remaining); - } - catch (error) { - console.log("Rate limit could not be retrieved at the end of the action"); - } - } - catch (error) { - (0, analytics_1.sendActionError)(error); - throw error; - } -} -main(); - - /***/ }), /***/ 75455: @@ -93119,12 +92620,83 @@ module.exports = JSON.parse('{"name":"mixpanel","description":"A simple server-s /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; /******/ /************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module is referenced by other modules so it can't be inlined -/******/ var __webpack_exports__ = __nccwpck_require__(79283); -/******/ module.exports = __webpack_exports__; -/******/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +__nccwpck_require__(44227); +const createOutput_1 = __nccwpck_require__(63119); +const requests_1 = __nccwpck_require__(49591); +const converters_1 = __nccwpck_require__(86200); +const utils_1 = __nccwpck_require__(41002); +const getRateLimit_1 = __nccwpck_require__(78028); +const analytics_1 = __nccwpck_require__(88345); +async function main() { + try { + (0, utils_1.setTimezone)(); + (0, analytics_1.sendActionRun)(); + try { + const rateLimitAtBeginning = await (0, getRateLimit_1.getRateLimit)(); + console.log("RATE LIMIT REMAINING BEFORE REQUESTS: ", rateLimitAtBeginning.data.rate.remaining); + } + catch (error) { + console.log("Rate limit could not be retrieved at the beginning of the action"); + } + const ownersRepos = (0, requests_1.getOwnersRepositories)(); + const organizationsRepos = await (0, requests_1.getOrganizationsRepositories)(); + const repos = Object.keys([...ownersRepos, ...organizationsRepos].reduce((acc, element) => { + return { ...acc, [element.join("/")]: 1 }; + }, {})).map((el) => el.split("/")); + console.log("Initiating data request."); + const data = []; + const orgs = (0, utils_1.getOrgs)(); + const teams = await (0, requests_1.getTeams)(orgs); + for (let i = 0; i < repos.length; i++) { + const result = await (0, requests_1.makeComplexRequest)(parseInt((0, utils_1.getValueAsIs)("AMOUNT")), { + owner: repos[i][0], + repo: repos[i][1], + }, { + skipComments: (0, utils_1.checkCommentSkip)(), + }); + data.push(result); + } + console.log("Data successfully retrieved. Starting report calculations."); + const mergedData = data.reduce((acc, element) => ({ + ownerRepo: acc.ownerRepo + ? acc.ownerRepo.concat(",", element.ownerRepo) + : element.ownerRepo, + events: [...acc.events, ...element.events], + pullRequestInfo: [...acc?.pullRequestInfo, ...element.pullRequestInfo], + comments: [...acc?.comments, ...element.comments], + }), { + ownerRepo: "", + events: [], + pullRequestInfo: [], + comments: [], + }); + const preparedData = (0, converters_1.collectData)(mergedData, teams); + console.log("Calculation complete. Generating markdown."); + await (0, createOutput_1.createOutput)(preparedData); + try { + const rateLimitAtEnd = await (0, getRateLimit_1.getRateLimit)(); + console.log("RATE LIMIT REMAINING AFTER REQUESTS: ", rateLimitAtEnd.data.rate.remaining); + } + catch (error) { + console.log("Rate limit could not be retrieved at the end of the action"); + } + } + catch (error) { + (0, analytics_1.sendActionError)(error); + throw error; + } +} +main(); + +})(); + +module.exports = __webpack_exports__; /******/ })() ; \ No newline at end of file diff --git a/configs/lastMonthsReport.yml b/configs/lastMonthsReport.yml index cea95ca..7798514 100644 --- a/configs/lastMonthsReport.yml +++ b/configs/lastMonthsReport.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Runs script for analytics" - uses: AlexSim93/pull-request-analytics-action@v3 + uses: AlexSim93/pull-request-analytics-action@v4 with: GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created diff --git a/configs/manualTriggerForAllReposOfOrg.yml b/configs/manualTriggerForAllReposOfOrg.yml index 2f19c35..1ceb14a 100644 --- a/configs/manualTriggerForAllReposOfOrg.yml +++ b/configs/manualTriggerForAllReposOfOrg.yml @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Run script for analytics" - uses: AlexSim93/pull-request-analytics-action@v3 + uses: AlexSim93/pull-request-analytics-action@v4 with: GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created diff --git a/configs/updateReportOnPRClose.yml b/configs/updateReportOnPRClose.yml index f8c3b16..15d391b 100644 --- a/configs/updateReportOnPRClose.yml +++ b/configs/updateReportOnPRClose.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Run script for analytics" - uses: AlexSim93/pull-request-analytics-action@v3 + uses: AlexSim93/pull-request-analytics-action@v4 with: GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created diff --git a/configs/yearReportWithoutDevelopers.yml b/configs/yearReportWithoutDevelopers.yml index 60b1894..6408817 100644 --- a/configs/yearReportWithoutDevelopers.yml +++ b/configs/yearReportWithoutDevelopers.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: "Runs script for analytics" - uses: AlexSim93/pull-request-analytics-action@v3 + uses: AlexSim93/pull-request-analytics-action@v4 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created diff --git a/package.json b/package.json index f03b547..e370b04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pull-request-analytics-action", - "version": "4.4.2", + "version": "4.5.0", "description": "Generates detailed PR analytics reports within GitHub, focusing on review efficiency and team performance.", "main": "build/index.js", "scripts": { diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts index a214760..5a6d193 100644 --- a/src/common/utils/index.ts +++ b/src/common/utils/index.ts @@ -2,7 +2,6 @@ export { getDateFormat } from "./getDateFormat"; export { getValueAsIs } from "./getValueAsIs"; export { setTimezone } from "./setTimezone"; export { getMultipleValuesInput } from "./getMultipleValuesInput"; -export { validate } from "./validate"; export { checkCommentSkip } from "./checkCommentSkip"; export { encrypt } from "./encrypt"; export { getOrgs } from "./getOrgs"; diff --git a/src/common/utils/validate.ts b/src/common/utils/validate.ts deleted file mode 100644 index bd585b7..0000000 --- a/src/common/utils/validate.ts +++ /dev/null @@ -1,96 +0,0 @@ -import * as core from "@actions/core"; -import { - validateDate, - validateNumber, - validateRequired, - validateSingleValue, -} from "./validators"; -import { validateMultipleValues } from "./validators"; -import { getMultipleValuesInput } from "./getMultipleValuesInput"; -import { getValueAsIs } from "./getValueAsIs"; - -export const validate = () => { - const requiredErrors = validateRequired([ - "GITHUB_TOKEN", - ["GITHUB_OWNERS_REPOS", "ORGANIZATIONS"], - ...(getMultipleValuesInput("EXECUTION_OUTCOME").includes("new-issue") || - getMultipleValuesInput("EXECUTION_OUTCOME").includes("existing-issue") - ? ["GITHUB_OWNER_FOR_ISSUE", "GITHUB_REPO_FOR_ISSUE"] - : []), - ]); - - const { errors: multipleValuesErrors, warnings: multipleValuesWarnings } = - validateMultipleValues({ - SHOW_STATS_TYPES: { - validValues: [ - "timeline", - "workload", - "pr-quality", - "code-review-engagement", - "response-time", - ], - required: true, - }, - AGGREGATE_VALUE_METHODS: { - validValues: ["percentile", "average", "median"], - required: false, - }, - EXECUTION_OUTCOME: { - validValues: ["new-issue", "collection", "markdown", "existing-issue"], - required: true, - }, - }); - - const { warnings: singleValueWarnings, errors: singleValueErrors } = - validateSingleValue({ - PERIOD_SPLIT_UNIT: { - validValues: ["quarters", "none", "months", "years"], - required: false, - }, - }); - - const { warnings: numbersWarnings, errors: numbersErrors } = validateNumber({ - AMOUNT: { - min: 0, - isCritical: - !getValueAsIs("REPORT_DATE_START") && - !getValueAsIs("REPORT_DATE_END") && - !getValueAsIs("REPORT_PERIOD"), - }, - PERCENTILE: { - max: 100, - min: 0, - isCritical: - getMultipleValuesInput("AGGREGATE_VALUE_METHODS").length === 1 && - getMultipleValuesInput("AGGREGATE_VALUE_METHODS")[0] === "percentile", - }, - ISSUE_NUMBER: { - min: 1, - isCritical: - getMultipleValuesInput("EXECUTION_OUTCOME").length === 1 && - getMultipleValuesInput("EXECUTION_OUTCOME")[0] === "existing-issue", - }, - TOP_LIST_AMOUNT: { min: 0, isCritical: false }, - }); - - const dateErrors = validateDate(); - const errors = { - ...multipleValuesErrors, - ...numbersErrors, - ...dateErrors, - ...singleValueErrors, - ...requiredErrors, - }; - const warnings = { - ...multipleValuesWarnings, - ...singleValueWarnings, - ...numbersWarnings, - }; - Object.values(errors).forEach((message) => { - core.error(message as string); - }); - Object.values(warnings).forEach((message) => { - core.warning(message as string); - }); - return errors; -}; diff --git a/src/common/utils/validators/index.ts b/src/common/utils/validators/index.ts deleted file mode 100644 index 4761188..0000000 --- a/src/common/utils/validators/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { validateRequired } from "./validateRequired"; -export { validateMultipleValues } from "./validateMultipleValues"; -export { validateSingleValue } from "./validateSingleValue"; -export { validateNumber } from "./validateNumber"; -export { validateDate } from "./validateDate"; diff --git a/src/common/utils/validators/validateDate.ts b/src/common/utils/validators/validateDate.ts deleted file mode 100644 index 95dda47..0000000 --- a/src/common/utils/validators/validateDate.ts +++ /dev/null @@ -1,68 +0,0 @@ -import parse from "date-fns/parse"; -import { getValueAsIs } from "../getValueAsIs"; -import { isAfter, isValid } from "date-fns"; - -export const validateDate = () => { - let errors = {}; - if (getValueAsIs("REPORT_DATE_START") && getValueAsIs("REPORT_DATE_END")) { - const startDate = parse( - getValueAsIs("REPORT_DATE_START"), - "d/MM/yyyy", - new Date() - ); - const endDate = parse( - getValueAsIs("REPORT_DATE_END"), - "d/MM/yyyy", - new Date() - ); - if (isAfter(startDate, endDate)) { - errors = { - ...errors, - REPORT_DATE_START: "REPORT_DATE_START is after REPORT_DATE_END", - }; - } - if (!isValid(startDate)) { - errors = { - ...errors, - REPORT_DATE_START: "REPORT_DATE_START is invalid", - }; - } - if (!isValid(endDate)) { - errors = { - ...errors, - REPORT_DATE_END: "REPORT_DATE_END is invalid", - }; - } - } - if (getValueAsIs("CORE_HOURS_START") && getValueAsIs("CORE_HOURS_END")) { - const startCoreHours = parse( - getValueAsIs("CORE_HOURS_START"), - "HH:mm", - new Date() - ); - const endCoreHours = parse( - getValueAsIs("CORE_HOURS_END"), - "HH:mm", - new Date() - ); - if (isAfter(startCoreHours, endCoreHours)) { - errors = { - ...errors, - CORE_HOURS_START: "CORE_HOURS_START is after CORE_HOURS_END", - }; - } - if (!isValid(startCoreHours)) { - errors = { - ...errors, - CORE_HOURS_START: "CORE_HOURS_START is invalid", - }; - } - if (!isValid(endCoreHours)) { - errors = { - ...errors, - CORE_HOURS_END: "CORE_HOURS_END is invalid", - }; - } - } - return errors; -}; diff --git a/src/common/utils/validators/validateMultipleValues.ts b/src/common/utils/validators/validateMultipleValues.ts deleted file mode 100644 index 5542354..0000000 --- a/src/common/utils/validators/validateMultipleValues.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { getMultipleValuesInput } from "./../getMultipleValuesInput"; -type Field = Record; -export const validateMultipleValues = (fields: Field) => { - return Object.entries(fields).reduce( - (acc, [key, value]) => { - const inputValues = getMultipleValuesInput(key); - if (inputValues.length === 0) { - return value.required - ? { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} is empty.`, - }, - } - : { - ...acc, - warnings: { - ...acc.warnings, - [key]: `${key} is empty.`, - }, - }; - } - if ( - value.required && - inputValues.length > 0 && - inputValues.every((input) => !value.validValues.includes(input)) - ) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} doesn't contain any valid value. At least one value should be valid.`, - }, - }; - } else if ( - value.required && - inputValues.length > 0 && - inputValues.some((input) => !value.validValues.includes(input)) - ) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: `Some values in ${key} are invalid.`, - }, - }; - } - - if ( - value.required === false && - inputValues.length > 0 && - inputValues.some((input) => !value.validValues.includes(input)) - ) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: `Some values in ${key} are invalid.`, - }, - }; - } - return acc; - }, - { errors: {}, warnings: {} } - ); -}; diff --git a/src/common/utils/validators/validateNumber.ts b/src/common/utils/validators/validateNumber.ts deleted file mode 100644 index e95e1dc..0000000 --- a/src/common/utils/validators/validateNumber.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { getValueAsIs } from "../getValueAsIs"; - -type Field = Record< - string, - { min?: number; max?: number; isCritical: boolean } ->; -export const validateNumber = (field: Field) => { - return Object.entries(field).reduce( - (acc, [key, value]) => { - const input = getValueAsIs(key); - const number = parseInt(input); - if (Number.isNaN(number) && value.isCritical) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: `${key} is not a number`, - }, - }; - } - const isLessMinValue = - typeof value.min === "number" && number < value.min; - const isMoreMaxValue = - typeof value.max === "number" && number > value.max; - if (isLessMinValue) { - return { - ...acc, - [value.isCritical ? "errors" : "warnings"]: { - ...acc[value.isCritical ? "errors" : "warnings"], - [key]: `${key} should be more than ${value.min}`, - }, - }; - } - if (isMoreMaxValue) { - return { - ...acc, - [value.isCritical ? "errors" : "warnings"]: { - ...acc[value.isCritical ? "errors" : "warnings"], - [key]: `${key} should be less than ${value.max}`, - }, - }; - } - return acc; - }, - { errors: {}, warnings: {} } - ); -}; diff --git a/src/common/utils/validators/validateRequired.ts b/src/common/utils/validators/validateRequired.ts deleted file mode 100644 index 1ff4d33..0000000 --- a/src/common/utils/validators/validateRequired.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getValueAsIs } from "../getValueAsIs"; - -export const validateRequired = (names: (string | string[])[]) => { - return names.reduce((acc, name) => { - if (Array.isArray(name)) { - const isValid = name.some((el) => getValueAsIs(el)); - if (isValid) return acc; - return { ...acc, [name.join(", ")]: `${name.join(", ")} - One of these inputs must be filled` }; - } - if (typeof name === "string") { - const value = getValueAsIs(name); - if (value) return acc; - return { ...acc, [name]: `${name} is required` }; - } - return acc; - }, {}); -}; diff --git a/src/common/utils/validators/validateSingleValue.ts b/src/common/utils/validators/validateSingleValue.ts deleted file mode 100644 index e5029a9..0000000 --- a/src/common/utils/validators/validateSingleValue.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { getValueAsIs } from ".."; - -type Field = Record; - -export const validateSingleValue = (fields: Field) => { - return Object.entries(fields).reduce( - (acc, [key, value]) => { - const inputValue = getValueAsIs(key); - if (value.required && !value.validValues.includes(inputValue)) { - return { - ...acc, - errors: { - ...acc.errors, - [key]: inputValue ? `${key} is invalid.` : `${key} is empty.`, - }, - }; - } - if (!value.required && !value.validValues.includes(inputValue)) { - return { - ...acc, - warnings: { - ...acc.warnings, - [key]: inputValue ? `${key} is invalid.` : `${key} is empty.`, - }, - }; - } - return acc; - }, - { - errors: {}, - warnings: {}, - } - ); -}; diff --git a/src/converters/utils/calculations/getApproveTime.spec.ts b/src/converters/utils/calculations/getApproveTime.spec.ts index 4765df2..be4fece 100644 --- a/src/converters/utils/calculations/getApproveTime.spec.ts +++ b/src/converters/utils/calculations/getApproveTime.spec.ts @@ -112,6 +112,24 @@ const commentedReview = [ }, ]; +const dismissedBySecondReviewer = [ + { + state: "approved", + submitted_at: "2024-01-11T09:00:00Z", + user: { login: "dev1" }, + }, + { + state: "changes_requested", + submitted_at: "2024-01-11T11:00:00Z", + user: { login: "dev2" }, + }, + { + state: "dismissed", + submitted_at: "2024-01-11T13:00:00Z", + user: { login: "dev2" }, + }, +]; + describe("check getApproveTime", () => { it("Check PR without reviews and return null", () => { expect(getApproveTime(notReviewed)).toBe(null); @@ -149,4 +167,9 @@ describe("check getApproveTime", () => { it("Check commented PR and return time of the approval", () => { expect(getApproveTime(commentedReview)).toBe("2024-01-12T05:00:00Z"); }); + it("Check PR with dismissed changes requested status from second reviewer and return time of the approval", () => { + expect(getApproveTime(dismissedBySecondReviewer)).toBe( + "2024-01-11T13:00:00Z" + ); + }); }); diff --git a/src/createOutput.ts b/src/createOutput.ts index 0ede172..986e9d9 100644 --- a/src/createOutput.ts +++ b/src/createOutput.ts @@ -108,7 +108,7 @@ export const createOutput = async ( }, ] ); - if (commentMarkdown === "") continue; + if (commentMarkdown === "" || dates.length < 3) continue; const comment = await createComment(issue.data.number, commentMarkdown); comments.push({ comment, title: date }); } diff --git a/src/index.ts b/src/index.ts index b12fe83..e2560d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,6 @@ import { getOrgs, getValueAsIs, setTimezone, - validate, } from "./common/utils"; import { getRateLimit } from "./requests/getRateLimit"; import { sendActionError, sendActionRun } from "./analytics"; @@ -22,15 +21,8 @@ import { sendActionError, sendActionRun } from "./analytics"; async function main() { try { setTimezone(); - const errors = validate(); sendActionRun(); - if (Object.entries(errors).length > 0) { - core.setFailed( - "Inputs are invalid. Action is failed with validation error" - ); - return; - } try { const rateLimitAtBeginning = await getRateLimit(); console.log( From fffdacf008c06b7581612fea4e958fb46a1e530c Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Mon, 6 Jan 2025 19:35:15 +0700 Subject: [PATCH 02/10] Feature: Added GITHUB_OWNER_FOR_ISSUE and GITHUB_REPO_FOR_ISSUE to analytics --- build/index.js | 2 ++ src/analytics/sendActionRun.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/build/index.js b/build/index.js index bba3608..a23c09b 100644 --- a/build/index.js +++ b/build/index.js @@ -103,6 +103,8 @@ const sendActionRun = () => { distinct_id: (0, utils_1.encrypt)((0, utils_1.getMultipleValuesInput)("ORGANIZATIONS")[0] || (0, utils_1.getMultipleValuesInput)("GITHUB_OWNERS_REPOS")[0].split("/")[0]), GITHUB_OWNERS_REPOS: (0, utils_1.getMultipleValuesInput)("GITHUB_OWNERS_REPOS").length, + GITHUB_OWNER_FOR_ISSUE: (0, utils_1.getValueAsIs)("GITHUB_OWNER_FOR_ISSUE")?.length, + GITHUB_REPO_FOR_ISSUE: (0, utils_1.getValueAsIs)("GITHUB_REPO_FOR_ISSUE")?.length, ORGANIZATIONS: (0, utils_1.getMultipleValuesInput)("ORGANIZATIONS").length, SHOW_STATS_TYPES: (0, utils_1.getMultipleValuesInput)("SHOW_STATS_TYPES"), AMOUNT: (0, utils_1.getValueAsIs)("AMOUNT"), diff --git a/src/analytics/sendActionRun.ts b/src/analytics/sendActionRun.ts index ebd0a3a..b7ac044 100644 --- a/src/analytics/sendActionRun.ts +++ b/src/analytics/sendActionRun.ts @@ -9,6 +9,8 @@ export const sendActionRun = () => { getMultipleValuesInput("GITHUB_OWNERS_REPOS")[0].split("/")[0] ), GITHUB_OWNERS_REPOS: getMultipleValuesInput("GITHUB_OWNERS_REPOS").length, + GITHUB_OWNER_FOR_ISSUE: getValueAsIs("GITHUB_OWNER_FOR_ISSUE")?.length, + GITHUB_REPO_FOR_ISSUE: getValueAsIs("GITHUB_REPO_FOR_ISSUE")?.length, ORGANIZATIONS: getMultipleValuesInput("ORGANIZATIONS").length, SHOW_STATS_TYPES: getMultipleValuesInput("SHOW_STATS_TYPES"), AMOUNT: getValueAsIs("AMOUNT"), From 123a74bc15f01fdcc0223474c4638326815be02c Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Mon, 6 Jan 2025 23:56:07 +0700 Subject: [PATCH 03/10] Feature: Added time from rerequest to review --- build/index.js | 38 ++++++++++++++++++- src/converters/types.ts | 2 + .../utils/preparePullRequestStats.ts | 9 +++++ src/converters/utils/prepareResponseTime.ts | 32 ++++++++++++++++ src/view/utils/constants.ts | 2 + src/view/utils/createTimelineMonthXYChart.ts | 17 +++++++++ src/view/utils/createTimelineTable.ts | 5 +++ 7 files changed, 104 insertions(+), 1 deletion(-) diff --git a/build/index.js b/build/index.js index a23c09b..17acd03 100644 --- a/build/index.js +++ b/build/index.js @@ -1383,6 +1383,7 @@ const preparePullRequestStats = (collection) => { timeFromInitialRequestToResponse: (0, calculations_1.calcMedianValue)(collection.timeFromInitialRequestToResponse), timeFromOpenToResponse: (0, calculations_1.calcMedianValue)(collection.timeFromOpenToResponse), timeFromRepeatedRequestToResponse: (0, calculations_1.calcMedianValue)(collection.timeFromRepeatedRequestToResponse), + timeWaitingForRepeatedReview: (0, calculations_1.calcMedianValue)(collection.timeWaitingForRepeatedReview), }, percentile: { timeToReview: (0, calculations_1.calcPercentileValue)(collection.timeToReview), @@ -1393,6 +1394,7 @@ const preparePullRequestStats = (collection) => { timeFromInitialRequestToResponse: (0, calculations_1.calcPercentileValue)(collection.timeFromInitialRequestToResponse), timeFromOpenToResponse: (0, calculations_1.calcPercentileValue)(collection.timeFromOpenToResponse), timeFromRepeatedRequestToResponse: (0, calculations_1.calcPercentileValue)(collection.timeFromRepeatedRequestToResponse), + timeWaitingForRepeatedReview: (0, calculations_1.calcPercentileValue)(collection.timeWaitingForRepeatedReview), }, average: { timeToReview: (0, calculations_1.calcAverageValue)(collection.timeToReview), @@ -1403,6 +1405,7 @@ const preparePullRequestStats = (collection) => { timeFromInitialRequestToResponse: (0, calculations_1.calcAverageValue)(collection.timeFromInitialRequestToResponse), timeFromOpenToResponse: (0, calculations_1.calcAverageValue)(collection.timeFromOpenToResponse), timeFromRepeatedRequestToResponse: (0, calculations_1.calcAverageValue)(collection.timeFromRepeatedRequestToResponse), + timeWaitingForRepeatedReview: (0, calculations_1.calcAverageValue)(collection.timeWaitingForRepeatedReview), }, }; }; @@ -1568,10 +1571,29 @@ const set_1 = __importDefault(__nccwpck_require__(82900)); const get_1 = __importDefault(__nccwpck_require__(56908)); const utils_1 = __nccwpck_require__(41002); const calculations_1 = __nccwpck_require__(16576); +const constants_1 = __nccwpck_require__(95354); const prepareResponseTime = (events = [], pullRequest, collection, dateKey, teams) => { if (!events) return; const responses = (0, calculations_1.getResponses)(events); + const user = pullRequest?.user.login || constants_1.invalidUserLogin; + ["total", user, ...(teams[user] || [])].forEach((userKey) => { + [dateKey, "total"].forEach((key) => { + const awaitingResponse = Object.values(responses) + .reduce((acc, el) => { + const repeatedResponses = el.filter((_, index) => index > 0); + return [...acc, ...repeatedResponses]; + }, []) + .map((element) => (0, calculations_1.calcDifferenceInMinutes)(element?.[0], element?.[1], { + endOfWorkingTime: (0, utils_1.getValueAsIs)("CORE_HOURS_END"), + startOfWorkingTime: (0, utils_1.getValueAsIs)("CORE_HOURS_START"), + }, (0, utils_1.getMultipleValuesInput)("HOLIDAYS"))); + (0, set_1.default)(collection, [userKey, key, "timeWaitingForRepeatedReview"], [ + ...(0, get_1.default)(collection, [userKey, key, "timeWaitingForRepeatedReview"], []), + ...awaitingResponse, + ]); + }); + }); Object.entries(responses).forEach(([user, responses]) => { ["total", dateKey].forEach((key) => { const timeFromInitialRequestToResponse = (0, calculations_1.calcDifferenceInMinutes)(responses[0]?.[0], responses[0]?.[1], { @@ -2685,11 +2707,12 @@ Object.defineProperty(exports, "createList", ({ enumerable: true, get: function "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.timeFromRepeatedRequestToResponseHeader = exports.timeFromOpenToResponseHeader = exports.timeFromRequestToResponseHeader = exports.prSizesHeader = exports.requestChangesReceived = exports.reviewTypesHeader = exports.commentsReceivedHeader = exports.commentsConductedHeader = exports.discussionsConductedHeader = exports.discussionsHeader = exports.reviewRequestConductedHeader = exports.reviewConductedHeader = exports.unapprovedPrsHeader = exports.unreviewedPrsHeader = exports.additionsDeletionsHeader = exports.totalRevertedPrsHeader = exports.totalOpenedPrsHeader = exports.totalMergedPrsHeader = exports.timeToMergeHeader = exports.timeToApproveHeader = exports.timeToReviewHeader = exports.timeInDraftHeader = exports.timeToReviewRequestHeader = void 0; +exports.timeFromRepeatedRequestToResponseHeader = exports.timeFromOpenToResponseHeader = exports.timeFromRequestToResponseHeader = exports.prSizesHeader = exports.requestChangesReceived = exports.reviewTypesHeader = exports.commentsReceivedHeader = exports.commentsConductedHeader = exports.discussionsConductedHeader = exports.discussionsHeader = exports.reviewRequestConductedHeader = exports.reviewConductedHeader = exports.unapprovedPrsHeader = exports.unreviewedPrsHeader = exports.additionsDeletionsHeader = exports.totalRevertedPrsHeader = exports.totalOpenedPrsHeader = exports.totalMergedPrsHeader = exports.timeToMergeHeader = exports.timeAwaitingRepeatedReviewHeader = exports.timeToApproveHeader = exports.timeToReviewHeader = exports.timeInDraftHeader = exports.timeToReviewRequestHeader = void 0; exports.timeToReviewRequestHeader = "Time to review request"; exports.timeInDraftHeader = "Time in draft"; exports.timeToReviewHeader = "Time to review"; exports.timeToApproveHeader = "Time to approve"; +exports.timeAwaitingRepeatedReviewHeader = "Time to Review After Re-request"; exports.timeToMergeHeader = "Time to merge"; exports.totalMergedPrsHeader = "Total merged PRs"; exports.totalOpenedPrsHeader = "Total opened PRs"; @@ -3408,6 +3431,7 @@ const createTimelineMonthsXYChart = (data, type, dates, user) => { "timeFromInitialRequestToResponse", "timeFromOpenToResponse", "timeFromRepeatedRequestToResponse", + "timeWaitingForRepeatedReview", ].map((key) => data[user]?.[date]?.[type]?.[key] || 0))), 1) / 60), title: "hours", }, @@ -3463,6 +3487,16 @@ const createTimelineMonthsXYChart = (data, type, dates, user) => { .map((date) => Math.round(((data[user]?.[date]?.[type]?.timeToReview || 0) / 60) * 100) / 100) .reverse(), }, + { + color: "turquoise", + name: "Time\\ To\\ Review\\ After\\ Rerequest", + values: dates + .map((date) => Math.round(((data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || + 0) / + 60) * + 100) / 100) + .reverse(), + }, { color: "chartreuse", name: "Time\\ To\\ Approve", @@ -3570,6 +3604,7 @@ const createTimelineTable = (data, type, users, date) => { return [ `**${user}**`, (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeInDraft || 0), + (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToReviewRequest || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToReview || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToApprove || 0), @@ -3584,6 +3619,7 @@ const createTimelineTable = (data, type, users, date) => { headers: [ "user", constants_1.timeInDraftHeader, + constants_1.timeAwaitingRepeatedReviewHeader, constants_1.timeToReviewRequestHeader, constants_1.timeToReviewHeader, constants_1.timeToApproveHeader, diff --git a/src/converters/types.ts b/src/converters/types.ts index ccd08ce..1554041 100644 --- a/src/converters/types.ts +++ b/src/converters/types.ts @@ -13,6 +13,7 @@ type TimelinePoints = { timeFromInitialRequestToResponse?: number; timeFromOpenToResponse?: number; timeFromRepeatedRequestToResponse?: number; + timeWaitingForRepeatedReview?: number; }; type DiscussionResult = { @@ -70,6 +71,7 @@ export type Collection = { timeFromInitialRequestToResponse?: number[]; timeFromRepeatedRequestToResponse?: number[]; timeReviewerInDraft?: number[]; + timeWaitingForRepeatedReview?: number[]; unrespondedRequests?: number; comments?: number; totalReviewComments?: number; diff --git a/src/converters/utils/preparePullRequestStats.ts b/src/converters/utils/preparePullRequestStats.ts index 71fe671..a292902 100644 --- a/src/converters/utils/preparePullRequestStats.ts +++ b/src/converters/utils/preparePullRequestStats.ts @@ -73,6 +73,9 @@ export const preparePullRequestStats = (collection: Collection) => { timeFromRepeatedRequestToResponse: calcMedianValue( collection.timeFromRepeatedRequestToResponse ), + timeWaitingForRepeatedReview: calcMedianValue( + collection.timeWaitingForRepeatedReview + ), }, percentile: { timeToReview: calcPercentileValue(collection.timeToReview), @@ -89,6 +92,9 @@ export const preparePullRequestStats = (collection: Collection) => { timeFromRepeatedRequestToResponse: calcPercentileValue( collection.timeFromRepeatedRequestToResponse ), + timeWaitingForRepeatedReview: calcPercentileValue( + collection.timeWaitingForRepeatedReview + ), }, average: { timeToReview: calcAverageValue(collection.timeToReview), @@ -105,6 +111,9 @@ export const preparePullRequestStats = (collection: Collection) => { timeFromRepeatedRequestToResponse: calcAverageValue( collection.timeFromRepeatedRequestToResponse ), + timeWaitingForRepeatedReview: calcAverageValue( + collection.timeWaitingForRepeatedReview + ), }, }; }; diff --git a/src/converters/utils/prepareResponseTime.ts b/src/converters/utils/prepareResponseTime.ts index ce3ea62..30e7456 100644 --- a/src/converters/utils/prepareResponseTime.ts +++ b/src/converters/utils/prepareResponseTime.ts @@ -5,6 +5,7 @@ import { getMultipleValuesInput, getValueAsIs } from "../../common/utils"; import { makeComplexRequest } from "../../requests"; import { Collection } from "../types"; import { calcDifferenceInMinutes, getResponses } from "./calculations"; +import { invalidUserLogin } from "../constants"; export const prepareResponseTime = ( events: any[] | undefined | null = [], @@ -17,6 +18,37 @@ export const prepareResponseTime = ( ) => { if (!events) return; const responses = getResponses(events); + const user = pullRequest?.user.login || invalidUserLogin; + ["total", user, ...(teams[user] || [])].forEach((userKey) => { + [dateKey, "total"].forEach((key) => { + const awaitingResponse = Object.values( + responses as Record + ) + .reduce((acc, el) => { + const repeatedResponses = el.filter((_, index) => index > 0); + return [...acc, ...repeatedResponses]; + }, []) + .map((element) => + calcDifferenceInMinutes( + element?.[0], + element?.[1], + { + endOfWorkingTime: getValueAsIs("CORE_HOURS_END"), + startOfWorkingTime: getValueAsIs("CORE_HOURS_START"), + }, + getMultipleValuesInput("HOLIDAYS") + ) + ); + set( + collection, + [userKey, key, "timeWaitingForRepeatedReview"], + [ + ...get(collection, [userKey, key, "timeWaitingForRepeatedReview"], []), + ...awaitingResponse, + ] + ); + }); + }); Object.entries(responses as Record).forEach( ([user, responses]) => { diff --git a/src/view/utils/constants.ts b/src/view/utils/constants.ts index 4880d65..cbda181 100644 --- a/src/view/utils/constants.ts +++ b/src/view/utils/constants.ts @@ -2,6 +2,8 @@ export const timeToReviewRequestHeader = "Time to review request"; export const timeInDraftHeader = "Time in draft"; export const timeToReviewHeader = "Time to review"; export const timeToApproveHeader = "Time to approve"; +export const timeAwaitingRepeatedReviewHeader = + "Time to Review After Re-request"; export const timeToMergeHeader = "Time to merge"; export const totalMergedPrsHeader = "Total merged PRs"; export const totalOpenedPrsHeader = "Total opened PRs"; diff --git a/src/view/utils/createTimelineMonthXYChart.ts b/src/view/utils/createTimelineMonthXYChart.ts index 97b0cd9..06fb36b 100644 --- a/src/view/utils/createTimelineMonthXYChart.ts +++ b/src/view/utils/createTimelineMonthXYChart.ts @@ -33,6 +33,7 @@ export const createTimelineMonthsXYChart = ( "timeFromInitialRequestToResponse", "timeFromOpenToResponse", "timeFromRepeatedRequestToResponse", + "timeWaitingForRepeatedReview", ].map( (key) => data[user]?.[date]?.[type]?.[ @@ -45,6 +46,7 @@ export const createTimelineMonthsXYChart = ( | "timeFromInitialRequestToResponse" | "timeFromOpenToResponse" | "timeFromRepeatedRequestToResponse" + | "timeWaitingForRepeatedReview" ] || 0 ) ) @@ -136,6 +138,21 @@ export const createTimelineMonthsXYChart = ( ) .reverse(), }, + { + color: "turquoise", + name: "Time\\ To\\ Review\\ After\\ Rerequest", + values: dates + .map( + (date) => + Math.round( + ((data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || + 0) / + 60) * + 100 + ) / 100 + ) + .reverse(), + }, { color: "chartreuse", name: "Time\\ To\\ Approve", diff --git a/src/view/utils/createTimelineTable.ts b/src/view/utils/createTimelineTable.ts index c261e50..7e3a233 100644 --- a/src/view/utils/createTimelineTable.ts +++ b/src/view/utils/createTimelineTable.ts @@ -1,5 +1,6 @@ import { Collection } from "../../converters/types"; import { + timeAwaitingRepeatedReviewHeader, timeInDraftHeader, timeToApproveHeader, timeToMergeHeader, @@ -24,6 +25,9 @@ export const createTimelineTable = ( return [ `**${user}**`, formatMinutesDuration(data[user]?.[date]?.[type]?.timeInDraft || 0), + formatMinutesDuration( + data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0 + ), formatMinutesDuration( data[user]?.[date]?.[type]?.timeToReviewRequest || 0 ), @@ -44,6 +48,7 @@ export const createTimelineTable = ( headers: [ "user", timeInDraftHeader, + timeAwaitingRepeatedReviewHeader, timeToReviewRequestHeader, timeToReviewHeader, timeToApproveHeader, From cfb223eb1dd2142136e01d3b83f8ffeab749845e Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 17:53:21 +0700 Subject: [PATCH 04/10] Feature: Changed column order --- build/index.js | 4 ++-- src/view/utils/createTimelineTable.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/index.js b/build/index.js index 17acd03..c902bca 100644 --- a/build/index.js +++ b/build/index.js @@ -3604,9 +3604,9 @@ const createTimelineTable = (data, type, users, date) => { return [ `**${user}**`, (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeInDraft || 0), - (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToReviewRequest || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToReview || 0), + (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToApprove || 0), (0, formatMinutesDuration_1.formatMinutesDuration)(data[user]?.[date]?.[type]?.timeToMerge || 0), data[user]?.[date]?.merged?.toString() || "0", @@ -3619,9 +3619,9 @@ const createTimelineTable = (data, type, users, date) => { headers: [ "user", constants_1.timeInDraftHeader, - constants_1.timeAwaitingRepeatedReviewHeader, constants_1.timeToReviewRequestHeader, constants_1.timeToReviewHeader, + constants_1.timeAwaitingRepeatedReviewHeader, constants_1.timeToApproveHeader, constants_1.timeToMergeHeader, constants_1.totalMergedPrsHeader, diff --git a/src/view/utils/createTimelineTable.ts b/src/view/utils/createTimelineTable.ts index 7e3a233..ab73fe8 100644 --- a/src/view/utils/createTimelineTable.ts +++ b/src/view/utils/createTimelineTable.ts @@ -25,13 +25,13 @@ export const createTimelineTable = ( return [ `**${user}**`, formatMinutesDuration(data[user]?.[date]?.[type]?.timeInDraft || 0), - formatMinutesDuration( - data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0 - ), formatMinutesDuration( data[user]?.[date]?.[type]?.timeToReviewRequest || 0 ), formatMinutesDuration(data[user]?.[date]?.[type]?.timeToReview || 0), + formatMinutesDuration( + data[user]?.[date]?.[type]?.timeWaitingForRepeatedReview || 0 + ), formatMinutesDuration(data[user]?.[date]?.[type]?.timeToApprove || 0), formatMinutesDuration(data[user]?.[date]?.[type]?.timeToMerge || 0), data[user]?.[date]?.merged?.toString() || "0", @@ -48,9 +48,9 @@ export const createTimelineTable = ( headers: [ "user", timeInDraftHeader, - timeAwaitingRepeatedReviewHeader, timeToReviewRequestHeader, timeToReviewHeader, + timeAwaitingRepeatedReviewHeader, timeToApproveHeader, timeToMergeHeader, totalMergedPrsHeader, From cdf3237d58165215a6f3ab4bdcb7bbc893c86271 Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 21:07:03 +0700 Subject: [PATCH 05/10] Feature: Update markdown example --- examples/periodReport.md | 1272 +++++++++++++++++--------------------- 1 file changed, 557 insertions(+), 715 deletions(-) diff --git a/examples/periodReport.md b/examples/periodReport.md index fa133ae..312bc30 100644 --- a/examples/periodReport.md +++ b/examples/periodReport.md @@ -1,768 +1,610 @@ ## Pull Request report - -This report based on 150 last updated PRs. To learn more about the project and its configuration, please visit [Pull request analytics action](https://github.com/AlexSim93/pull-request-analytics-action). - + This report based on 155 last updated PRs. To learn more about the project and its configuration, please visit [Pull request analytics action](https://github.com/AlexSim93/pull-request-analytics-action). + Below are the settings applied for this report: - ``` -GITHUB_OWNERS_REPOS: owner/repo -GITHUB_OWNER_FOR_ISSUE: owner -GITHUB_REPO_FOR_ISSUE: repo -SHOW_STATS_TYPES: timeline, workload, pr-quality, code-review-engagement -REVIEW_TIME_INTERVALS: 2,4,6,9,12,18 +GITHUB_OWNERS_REPOS: AlexSim93/example-repo +GITHUB_OWNER_FOR_ISSUE: AlexSim93 +GITHUB_REPO_FOR_ISSUE: lang-card +SHOW_STATS_TYPES: timeline, workload, pr-quality, code-review-engagement, response-time +REVIEW_TIME_INTERVALS: 2,4,8,12,16,24 TOP_LIST_AMOUNT: 0 AGGREGATE_VALUE_METHODS: percentile +SHOW_CORRELATION_GRAPHS: true +SHOW_ACTIVITY_TIME_GRAPHS: true PERCENTILE: 75 -HIDE_USERS: dev1, dev2, dev3 +SHOW_USERS: dev1, dev2, dev3, dev4, dev5, total TIMEZONE: Europe/Berlin CORE_HOURS_START: 09:00 -CORE_HOURS_END: 18:00 -REPORT_DATE_START: 01/11/2023 -REPORT_DATE_END: 01/01/2024 -AMOUNT: 100 +CORE_HOURS_END: 19:00 +REPORT_DATE_START: 01/10/2024 +REPORT_DATE_END: 30/11/2024 +AMOUNT: 500 PERIOD_SPLIT_UNIT: months +USE_CHARTS: false EXECUTION_OUTCOME: markdown ``` + + + + + -### Pull requests timeline(75th percentile) 12/2023 - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +### Pull requests timeline(75th percentile) 11/2024 +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 7 minutes | 7 minutes | 4 hours 12 minutes | 7 hours 32 minutes | 15 hours 31 minutes | 29 | -| **dev8** | 8 minutes | 7 minutes | 3 hours 14 minutes | 3 hours 14 minutes | 16 hours 23 minutes | 19 | -| **dev5** | 6 minutes | 6 minutes | 7 hours 43 minutes | 12 hours 13 minutes | 50 hours 11 minutes | 2 | -| **dev6** | 29 minutes | 29 minutes | 3 hours 48 minutes | 3 hours 48 minutes | 32 hours 29 minutes | 6 | -| **dev7** | 13 minutes | 13 minutes | 3 hours 50 minutes | 9 hours 19 minutes | 48 hours 18 minutes | 9 | -| **total** | 8 minutes | 8 minutes | 4 hours 21 minutes | 6 hours 14 minutes | 24 hours 52 minutes | 65 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) 12/2023 / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(4 hours 12 minutes) : 0, 252 -Time to approve(7 hours 32 minutes) : 0, 452 -Time to merge(15 hours 31 minutes) : 0, 931 - -section dev8 - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 14 minutes) : 0, 194 -Time to approve(3 hours 14 minutes) : 0, 194 -Time to merge(16 hours 23 minutes) : 0, 983 - -section dev5 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(7 hours 43 minutes) : 0, 463 -Time to approve(12 hours 13 minutes) : 0, 733 -Time to merge(50 hours 11 minutes) : 0, 3011 - -section dev6 - Time in draft(29 minutes) : 0, 29 -Time to review request(29 minutes) : 0, 29 -Time to review(3 hours 48 minutes) : 0, 228 -Time to approve(3 hours 48 minutes) : 0, 228 -Time to merge(32 hours 29 minutes) : 0, 1949 - -section dev7 - Time in draft(13 minutes) : 0, 13 -Time to review request(13 minutes) : 0, 13 -Time to review(3 hours 50 minutes) : 0, 230 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(48 hours 18 minutes) : 0, 2898 - -section total - Time in draft(8 minutes) : 0, 8 -Time to review request(8 minutes) : 0, 8 -Time to review(4 hours 21 minutes) : 0, 261 -Time to approve(6 hours 14 minutes) : 0, 374 -Time to merge(24 hours 52 minutes) : 0, 1492 - -``` - -```mermaid -pie -title Review time dev4 12/2023 -"0-2 hours(15)":15 -"2-4 hours(5)":5 -"4-6 hours(4)":4 -"9-12 hours(3)":3 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 12/2023 -"0-2 hours(11)":11 -"2-4 hours(3)":3 -"4-6 hours(2)":2 -"12-18 hours(2)":2 -``` - -```mermaid -pie -title Review time dev5 12/2023 -"0-2 hours(1)":1 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev6 12/2023 -"0-2 hours(3)":3 -"2-4 hours(1)":1 -"4-6 hours(2)":2 -``` - -```mermaid -pie -title Review time dev7 12/2023 -"0-2 hours(6)":6 -"4-6 hours(2)":2 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time total 12/2023 -"0-2 hours(36)":36 -"2-4 hours(9)":9 -"4-6 hours(10)":10 -"9-12 hours(3)":3 -"12-18 hours(4)":4 -"18+ hours(1)":1 -``` - -### Workload stats 12/2023 - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 4 minutes | 4 minutes | 1 hour 40 minutes | | 1 hour 42 minutes | 10 hours 1 minute | 4 | +| **dev2** | 45 minutes | 45 minutes | 1 hour 16 minutes | 4 hours 50 minutes | 6 hours 1 minute | 15 hours 53 minutes | 17 | +| **dev3** | 26 minutes | 24 minutes | 1 hour 51 minutes | | 9 hours 33 minutes | 23 hours 16 minutes | 13 | +| **dev4** | 10 minutes | 12 minutes | 1 hour 9 minutes | 57 minutes | 1 hour 9 minutes | 9 hours 17 minutes | 13 | +| **dev5** | 7 minutes | 7 minutes | 4 hours 5 minutes | 3 hours 37 minutes | 13 hours 8 minutes | 27 hours 53 minutes | 15 | +| **total** | 15 minutes | 15 minutes | 1 hour 59 minutes | 3 hours 37 minutes | 7 hours 50 minutes | 23 hours 48 minutes | 62 | + + + +### Review time 11/2024 + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 3(75%) | 1(25%) | 0 | 0 | 0 | 0 | 0 | +| **dev2** | 13(76.5%) | 0 | 1(5.9%) | 1(5.9%) | 1(5.9%) | 0 | 1(5.9%) | +| **dev3** | 10(76.9%) | 1(7.7%) | 1(7.7%) | 1(7.7%) | 0 | 0 | 0 | +| **dev4** | 10(76.9%) | 1(7.7%) | 1(7.7%) | 1(7.7%) | 0 | 0 | 0 | +| **dev5** | 10(66.7%) | 1(6.7%) | 3(20%) | 1(6.7%) | 0 | 0 | 0 | +| **total** | 46(74.2%) | 4(6.5%) | 6(9.7%) | 4(6.5%) | 1(1.6%) | 0 | 1(1.6%) | + + + + + + +### Contribution stats 11/2024 **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 32 | 29 | +2428/-6786 | 20/5/4/0/3 | 44 | 12 | -| **dev8** | 20 | 19 | +954/-2167 | 11/6/1/2/0 | 6 | 28 | -| **dev5** | 2 | 2 | +15/-3 | 2/0/0/0/0 | 1 | 13 | -| **dev6** | 6 | 6 | +1164/-504 | 3/1/1/0/1 | 28 | 4 | -| **dev7** | 9 | 9 | +5553/-4706 | 6/1/1/0/1 | 22 | 11 | -| **total** | 69 | 65 | +10114/-14166 | 42/13/7/2/5 | 101 | 63 | - -### Pull request quality 12/2023 - +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 4 | 4 | 0 | 1 | 0 | +415/-89 | 1/3/0/0/0 | +| **dev2** | 17 | 17 | 0 | 0 | 0 | +3253/-2378 | 7/4/3/2/1 | +| **dev3** | 13 | 13 | 0 | 0 | 0 | +1713/-1742 | 4/6/1/2/0 | +| **dev4** | 14 | 13 | 0 | 1 | 1 | +1116/-1032 | 10/2/1/0/1 | +| **dev5** | 15 | 15 | 0 | 0 | 0 | +1048/-341 | 9/3/3/0/0 | +| **total** | 63 | 62 | 0 | 2 | 1 | +7545/-5582 | 31/18/8/4/2 | + + + +### Pull request quality 11/2024 **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 29 | 5 | 12 / 1 / 12 | 22 | -| **dev8** | 19 | 1 | 2 / 0 / 2 | 3 | -| **dev5** | 2 | 0 | 1 / 1 / 1 | 1 | -| **dev6** | 6 | 1 | 13 / 2 / 15 | 16 | -| **dev7** | 9 | 2 | 8 / 1 / 10 | 12 | -| **total** | 65 | 9 | 36 / 5 / 40 | 54 | +| **dev1** | 4 | 1 | 0 / 0 / 4 | 8 | +| **dev2** | 17 | 7 | 0 / 0 / 23 | 36 | +| **dev3** | 13 | 5 | 0 / 0 / 19 | 24 | +| **dev4** | 13 | 1 | 0 / 0 / 7 | 9 | +| **dev5** | 15 | 6 | 0 / 0 / 14 | 23 | +| **total** | 62 | 20 | 0 / 0 / 67 | 100 | + -```mermaid -pie -title Discussion's types dev4 12/2023 -"Bug(1)":1 -``` -```mermaid -pie -title Discussion's types dev8 12/2023 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev6 12/2023 -"Performance(1)":1 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev7 12/2023 -"Bug(2)":2 -"Formatting(2)":2 -"Performance(1)":1 -``` -```mermaid -pie -title Discussion's types total 12/2023 -"Bug(5)":5 -"Performance(2)":2 -"Formatting(2)":2 -``` - -### Code review engagement 12/2023 - -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +### Code review engagement 11/2024 +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 29 | 4 / 0 / 4 | 4 | 7/3/1/1/0 | 0 / 1 / 12 | 37 | -| **dev8** | 19 | 27 / 4 / 31 | 44 | 14/5/4/0/5 | 8 / 7 / 28 | 49 | -| **dev5** | 2 | 4 / 0 / 4 | 5 | 7/2/1/2/1 | 1 / 0 / 13 | 67 | -| **dev6** | 6 | 1 / 1 / 1 | 1 | 4/0/0/0/0 | 0 / 1 / 4 | 63 | -| **dev7** | 9 | 0 / 0 / 0 | 0 | 8/2/1/0/0 | 0 / 0 / 11 | 59 | -| **total** | 65 | 36 / 5 / 40 | 54 | 42/13/7/2/5 | 9 / 9 / 63 | 275 | - -### Pull requests timeline(75th percentile) 11/2023 - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 19 | 0 / 0 / 39 | 64 | 6/7/3/3/0 | 12 / 3 / 18 | +| **dev2** | 19 | 0 / 0 / 12 | 17 | 11/5/2/0/1 | 5 / 1 / 19 | +| **dev3** | 12 | 0 / 0 / 2 | 3 | 9/2/1/0/0 | 0 / 1 / 12 | +| **dev4** | 18 | 0 / 0 / 11 | 13 | 8/6/2/1/1 | 4 / 0 / 18 | +| **dev5** | 2 | 0 / 0 / 0 | 0 | 2/0/0/0/0 | 0 / 0 / 2 | +| **total** | 62 | 0 / 0 / 67 | 100 | 31/18/8/4/2 | 20 / 9 / 62 | + + +### Review Response Time(75th percentile) 11/2024 +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 58 | 19 | 2 hours 26 minutes | 1 hour 29 minutes | 3 hours 46 minutes | +| **dev2** | 45 | 19 | 3 hours 29 minutes | 3 hours 25 minutes | 3 hours 7 minutes | +| **dev3** | 49 | 12 | 1 hour 40 minutes | 1 hour 36 minutes | | +| **dev4** | 49 | 18 | 1 hour 6 minutes | 44 minutes | | +| **dev5** | 47 | 2 | 1 hour 25 minutes | 1 hour 20 minutes | | +| **total** | 253 | 62 | 3 hours 13 minutes | 1 hour 49 minutes | 6 hours 55 minutes | + + + + + + +### Pull requests timeline(75th percentile) 10/2024 +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 17 minutes | 10 minutes | 55 minutes | 8 hours 4 minutes | 17 hours 1 minute | 9 | -| **dev8** | 6 minutes | 6 minutes | 1 hour 10 minutes | 1 hour 30 minutes | 3 hours 29 minutes | 23 | -| **dev5** | 18 minutes | 18 minutes | 8 hours 3 minutes | 8 hours 7 minutes | 36 hours 28 minutes | 12 | -| **dev6** | 7 minutes | 7 minutes | 1 hour 59 minutes | 2 hours 19 minutes | 35 hours 34 minutes | 17 | -| **dev7** | 6 minutes | 6 minutes | 1 hour 30 minutes | 8 hours | 25 hours 1 minute | 13 | -| **total** | 7 minutes | 7 minutes | 2 hours 16 minutes | 5 hours 9 minutes | 26 hours 13 minutes | 74 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) 11/2023 / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(17 minutes) : 0, 17 -Time to review request(10 minutes) : 0, 10 -Time to review(55 minutes) : 0, 55 -Time to approve(8 hours 4 minutes) : 0, 484 -Time to merge(17 hours 1 minute) : 0, 1021 - -section dev8 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 10 minutes) : 0, 70 -Time to approve(1 hour 30 minutes) : 0, 90 -Time to merge(3 hours 29 minutes) : 0, 209 - -section dev5 - Time in draft(18 minutes) : 0, 18 -Time to review request(18 minutes) : 0, 18 -Time to review(8 hours 3 minutes) : 0, 483 -Time to approve(8 hours 7 minutes) : 0, 487 -Time to merge(36 hours 28 minutes) : 0, 2188 - -section dev6 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(1 hour 59 minutes) : 0, 119 -Time to approve(2 hours 19 minutes) : 0, 139 -Time to merge(35 hours 34 minutes) : 0, 2134 - -section dev7 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 30 minutes) : 0, 90 -Time to approve(8 hours) : 0, 480 -Time to merge(25 hours 1 minute) : 0, 1501 - -section total - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 16 minutes) : 0, 136 -Time to approve(5 hours 9 minutes) : 0, 309 -Time to merge(26 hours 13 minutes) : 0, 1573 - -``` - -```mermaid -pie -title Review time dev4 11/2023 -"0-2 hours(9)":9 -"2-4 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 11/2023 -"0-2 hours(17)":17 -"2-4 hours(1)":1 -"4-6 hours(1)":1 -"6-9 hours(1)":1 -"9-12 hours(1)":1 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time dev5 11/2023 -"0-2 hours(6)":6 -"4-6 hours(1)":1 -"6-9 hours(3)":3 -"9-12 hours(1)":1 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev6 11/2023 -"0-2 hours(12)":12 -"2-4 hours(4)":4 -``` - -```mermaid -pie -title Review time dev7 11/2023 -"0-2 hours(9)":9 -"2-4 hours(2)":2 -"6-9 hours(1)":1 -``` - -```mermaid -pie -title Review time total 11/2023 -"0-2 hours(53)":53 -"2-4 hours(8)":8 -"4-6 hours(2)":2 -"6-9 hours(5)":5 -"9-12 hours(2)":2 -"12-18 hours(1)":1 -"18+ hours(2)":2 -``` - -### Workload stats 11/2023 - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 7 minutes | 7 minutes | 4 hours 15 minutes | | 4 hours 56 minutes | 23 hours 34 minutes | 13 | +| **dev2** | 10 minutes | 10 minutes | 6 hours 49 minutes | | 7 hours 28 minutes | 16 hours 20 minutes | 20 | +| **dev3** | 24 minutes | 24 minutes | 4 hours 57 minutes | | 13 hours 49 minutes | 22 hours 6 minutes | 14 | +| **dev4** | 11 minutes | 11 minutes | 3 hours 8 minutes | 2 hours 4 minutes | 3 hours 32 minutes | 18 hours 42 minutes | 18 | +| **dev5** | 7 minutes | 8 minutes | 6 hours 33 minutes | 9 hours 22 minutes | 10 hours 13 minutes | 30 hours 43 minutes | 22 | +| **total** | 10 minutes | 10 minutes | 5 hours 21 minutes | 6 hours 53 minutes | 8 hours 3 minutes | 21 hours 57 minutes | 88 | + + + +### Review time 10/2024 + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 6(46.2%) | 3(23.1%) | 4(30.8%) | 0 | 0 | 0 | 0 | +| **dev2** | 11(55%) | 1(5%) | 5(25%) | 1(5%) | 0 | 1(5%) | 1(5%) | +| **dev3** | 5(35.7%) | 3(21.4%) | 4(28.6%) | 1(7.1%) | 0 | 1(7.1%) | 0 | +| **dev4** | 11(61.1%) | 3(16.7%) | 2(11.1%) | 0 | 1(5.6%) | 1(5.6%) | 0 | +| **dev5** | 9(37.5%) | 4(16.7%) | 7(29.2%) | 4(16.7%) | 0 | 0 | 0 | +| **total** | 43(47.8%) | 14(15.6%) | 22(24.4%) | 6(6.7%) | 1(1.1%) | 3(3.3%) | 1(1.1%) | + + + + + + +### Contribution stats 10/2024 **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 11 | 9 | +2878/-1919 | 4/3/2/1/1 | 58 | 10 | -| **dev8** | 23 | 23 | +2535/-2379 | 16/4/1/0/2 | 5 | 24 | -| **dev5** | 13 | 12 | +1283/-627 | 10/0/2/1/0 | 10 | 25 | -| **dev6** | 19 | 17 | +2294/-1668 | 11/5/0/1/2 | 42 | 21 | -| **dev7** | 13 | 13 | +1568/-800 | 8/2/1/1/1 | 70 | 8 | -| **total** | 81 | 74 | +18759/-7452 | 50/14/6/4/7 | 190 | 76 | - -### Pull request quality 11/2023 - +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 13 | 13 | 0 | 0 | 0 | +586/-566 | 9/2/2/0/0 | +| **dev2** | 21 | 20 | 1 | 2 | 2 | +2027/-800 | 11/5/4/0/1 | +| **dev3** | 14 | 14 | 0 | 0 | 0 | +795/-2875 | 6/4/4/0/0 | +| **dev4** | 18 | 18 | 0 | 0 | 0 | +1542/-1495 | 9/6/2/1/0 | +| **dev5** | 25 | 22 | 1 | 1 | 2 | +4438/-5324 | 14/5/1/4/1 | +| **total** | 92 | 88 | 2 | 3 | 4 | +9421/-11069 | 50/22/13/5/2 | + + + +### Pull request quality 10/2024 **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 | 5 | 18 / 2 / 21 | 30 | -| **dev8** | 23 | 0 | 3 / 2 / 3 | 3 | -| **dev5** | 12 | 1 | 2 / 0 / 2 | 4 | -| **dev6** | 17 | 4 | 18 / 4 / 21 | 22 | -| **dev7** | 13 | 4 | 28 / 5 / 31 | 34 | -| **total** | 74 | 14 | 71 / 13 / 80 | 95 | +| **dev1** | 13 | 4 | 0 / 0 / 4 | 9 | +| **dev2** | 20 | 5 | 0 / 0 / 12 | 18 | +| **dev3** | 14 | 7 | 0 / 0 / 25 | 29 | +| **dev4** | 18 | 3 | 0 / 0 / 6 | 8 | +| **dev5** | 22 | 5 | 0 / 0 / 16 | 21 | +| **total** | 88 | 24 | 0 / 0 / 63 | 85 | + -```mermaid -pie -title Discussion's types dev4 11/2023 -"Performance(2)":2 -"Formatting(3)":3 -"Bug(1)":1 -"Naming Convention(1)":1 -``` -```mermaid -pie -title Discussion's types dev8 11/2023 -"Bug(1)":1 -``` -```mermaid -pie -title Discussion's types dev5 11/2023 -"Formatting(1)":1 -``` - -```mermaid -pie -title Discussion's types dev6 11/2023 -"Overengineering(1)":1 -"Naming Convention(1)":1 -"Performance(1)":1 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev7 11/2023 -"Naming Convention(1)":1 -"Formatting(3)":3 -"Bug(3)":3 -"Overengineering(1)":1 -"Performance(1)":1 -``` - -```mermaid -pie -title Discussion's types total 11/2023 -"Performance(4)":4 -"Formatting(7)":7 -"Bug(6)":6 -"Naming Convention(3)":3 -"Overengineering(3)":3 -``` - -### Code review engagement 11/2023 - -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +### Code review engagement 10/2024 +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 | 5 / 2 / 5 | 5 | 6/3/0/0/1 | 0 / 5 / 6 | 67 | -| **dev8** | 23 | 44 / 6 / 50 | 63 | 12/4/2/3/3 | 11 / 4 / 24 | 52 | -| **dev5** | 12 | 18 / 5 / 21 | 22 | 16/5/1/1/2 | 3 / 3 / 22 | 64 | -| **dev6** | 17 | 1 / 0 / 1 | 1 | 16/1/2/1/1 | 0 / 1 / 21 | 60 | -| **dev7** | 13 | 2 / 0 / 2 | 2 | 3/4/1/0/0 | 0 / 1 / 8 | 63 | -| **total** | 74 | 71 / 13 / 80 | 95 | 50/14/6/4/7 | 14 / 12 / 75 | 306 | +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 30 | 0 / 0 / 42 | 55 | 13/8/7/1/1 | 15 / 7 / 28 | +| **dev2** | 27 | 0 / 0 / 10 | 18 | 14/9/2/2/0 | 7 / 3 / 27 | +| **dev3** | 18 | 0 / 0 / 1 | 1 | 14/2/1/0/1 | 0 / 1 / 17 | +| **dev4** | 15 | 0 / 0 / 7 | 8 | 6/4/3/1/1 | 3 / 0 / 15 | +| **dev5** | 11 | 0 / 0 / 3 | 3 | 8/2/1/0/0 | 0 / 1 / 10 | +| **total** | 90 | 0 / 0 / 63 | 85 | 50/22/13/5/2 | 24 / 12 / 89 | + + +### Review Response Time(75th percentile) 10/2024 +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 78 | 30 | 6 hours 5 minutes | 6 hours 18 minutes | 5 hours 48 minutes | +| **dev2** | 67 | 27 | 5 hours 41 minutes | 6 hours 29 minutes | 3 hours 4 minutes | +| **dev3** | 76 | 18 | 4 hours 14 minutes | 4 hours 11 minutes | | +| **dev4** | 73 | 15 | 3 hours 1 minute | 1 hour 53 minutes | | +| **dev5** | 66 | 11 | 5 hours 50 minutes | 5 hours 59 minutes | | +| **total** | 360 | 90 | 5 hours 22 minutes | 5 hours 36 minutes | 6 hours 53 minutes | + + + + + ### Pull requests timeline(75th percentile) total - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 minutes | 8 minutes | 3 hours 1 minute | 7 hours 34 minutes | 16 hours 58 minutes | 38 | -| **dev8** | 7 minutes | 7 minutes | 2 hours 29 minutes | 2 hours 27 minutes | 11 hours 6 minutes | 42 | -| **dev5** | 16 minutes | 16 minutes | 8 hours 5 minutes | 9 hours 51 minutes | 42 hours 48 minutes | 14 | -| **dev6** | 7 minutes | 7 minutes | 2 hours 14 minutes | 2 hours 59 minutes | 37 hours 1 minute | 23 | -| **dev7** | 7 minutes | 7 minutes | 2 hours 15 minutes | 9 hours 19 minutes | 28 hours 44 minutes | 22 | -| **total** | 8 minutes | 7 minutes | 3 hours 8 minutes | 5 hours 45 minutes | 25 hours 47 minutes | 139 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) total / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(9 minutes) : 0, 9 -Time to review request(8 minutes) : 0, 8 -Time to review(3 hours 1 minute) : 0, 181 -Time to approve(7 hours 34 minutes) : 0, 454 -Time to merge(16 hours 58 minutes) : 0, 1018 - -section dev8 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 29 minutes) : 0, 149 -Time to approve(2 hours 27 minutes) : 0, 147 -Time to merge(11 hours 6 minutes) : 0, 666 - -section dev5 - Time in draft(16 minutes) : 0, 16 -Time to review request(16 minutes) : 0, 16 -Time to review(8 hours 5 minutes) : 0, 485 -Time to approve(9 hours 51 minutes) : 0, 591 -Time to merge(42 hours 48 minutes) : 0, 2568 - -section dev6 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 14 minutes) : 0, 134 -Time to approve(2 hours 59 minutes) : 0, 179 -Time to merge(37 hours 1 minute) : 0, 2221 - -section dev7 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 15 minutes) : 0, 135 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(28 hours 44 minutes) : 0, 1724 - -section total - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 8 minutes) : 0, 188 -Time to approve(5 hours 45 minutes) : 0, 345 -Time to merge(25 hours 47 minutes) : 0, 1547 - -``` - -```mermaid -pie -title Review time dev4 total -"0-2 hours(24)":24 -"2-4 hours(6)":6 -"4-6 hours(4)":4 -"9-12 hours(3)":3 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 total -"0-2 hours(28)":28 -"2-4 hours(4)":4 -"4-6 hours(3)":3 -"6-9 hours(1)":1 -"9-12 hours(1)":1 -"12-18 hours(2)":2 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time dev5 total -"0-2 hours(7)":7 -"4-6 hours(1)":1 -"6-9 hours(3)":3 -"9-12 hours(1)":1 -"12-18 hours(2)":2 -``` - -```mermaid -pie -title Review time dev6 total -"0-2 hours(15)":15 -"2-4 hours(5)":5 -"4-6 hours(2)":2 -``` - -```mermaid -pie -title Review time dev7 total -"0-2 hours(15)":15 -"2-4 hours(2)":2 -"4-6 hours(2)":2 -"6-9 hours(1)":1 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time total total -"0-2 hours(89)":89 -"2-4 hours(17)":17 -"4-6 hours(12)":12 -"6-9 hours(5)":5 -"9-12 hours(5)":5 -"12-18 hours(5)":5 -"18+ hours(3)":3 -``` - -### Workload stats total - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 6 minutes | 6 minutes | 3 hours 35 minutes | | 4 hours 15 minutes | 17 hours 50 minutes | 17 | +| **dev2** | 17 minutes | 17 minutes | 6 hours 45 minutes | 7 hours 10 minutes | 7 hours 18 minutes | 16 hours 36 minutes | 37 | +| **dev3** | 26 minutes | 26 minutes | 4 hours 21 minutes | | 10 hours 50 minutes | 23 hours 24 minutes | 27 | +| **dev4** | 13 minutes | 13 minutes | 2 hours 18 minutes | 1 hour 54 minutes | 2 hours 58 minutes | 18 hours 26 minutes | 31 | +| **dev5** | 8 minutes | 8 minutes | 6 hours 15 minutes | 7 hours 4 minutes | 10 hours 35 minutes | 30 hours 21 minutes | 37 | +| **total** | 12 minutes | 12 minutes | 4 hours 33 minutes | 6 hours 33 minutes | 8 hours 12 minutes | 22 hours 46 minutes | 150 | + + + +### Review time total + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 9(52.9%) | 4(23.5%) | 4(23.5%) | 0 | 0 | 0 | 0 | +| **dev2** | 24(64.9%) | 1(2.7%) | 6(16.2%) | 2(5.4%) | 1(2.7%) | 1(2.7%) | 2(5.4%) | +| **dev3** | 15(55.6%) | 4(14.8%) | 5(18.5%) | 2(7.4%) | 0 | 1(3.7%) | 0 | +| **dev4** | 21(67.7%) | 4(12.9%) | 3(9.7%) | 1(3.2%) | 1(3.2%) | 1(3.2%) | 0 | +| **dev5** | 19(48.7%) | 5(12.8%) | 10(25.6%) | 5(12.8%) | 0 | 0 | 0 | +| **total** | 89(58.6%) | 18(11.8%) | 28(18.4%) | 10(6.6%) | 2(1.3%) | 3(2%) | 2(1.3%) | + + + + + + +### Contribution stats total **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 43 | 38 | +5306/-8705 | 24/8/6/1/4 | 102 | 22 | -| **dev8** | 43 | 42 | +3489/-4546 | 27/10/2/2/2 | 11 | 52 | -| **dev5** | 15 | 14 | +1298/-630 | 12/0/2/1/0 | 11 | 38 | -| **dev6** | 25 | 23 | +3458/-2172 | 14/6/1/1/3 | 70 | 25 | -| **dev7** | 22 | 22 | +7121/-5506 | 14/3/2/1/2 | 92 | 19 | -| **total** | 150 | 139 | +28873/-21618 | 92/27/13/6/12 | 291 | 139 | +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 17 | 17 | 0 | 1 | 0 | +1001/-655 | 10/5/2/0/0 | +| **dev2** | 38 | 37 | 1 | 2 | 2 | +5280/-3178 | 18/9/7/2/2 | +| **dev3** | 27 | 27 | 0 | 0 | 0 | +2508/-4617 | 10/10/5/2/0 | +| **dev4** | 32 | 31 | 0 | 1 | 1 | +2658/-2527 | 19/8/3/1/1 | +| **dev5** | 40 | 37 | 1 | 1 | 2 | +5486/-5665 | 23/8/4/4/1 | +| **total** | 155 | 150 | 2 | 5 | 5 | +16966/-16651 | 81/40/21/9/4 | + -### Pull request quality total +### Pull request quality total **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 38 | 10 | 30 / 3 / 33 | 52 | -| **dev8** | 42 | 1 | 5 / 2 / 5 | 6 | -| **dev5** | 14 | 1 | 3 / 1 / 3 | 5 | -| **dev6** | 23 | 5 | 31 / 6 / 36 | 38 | -| **dev7** | 22 | 6 | 36 / 6 / 41 | 46 | -| **total** | 139 | 23 | 107 / 18 / 120 | 149 | - -```mermaid -pie -title Discussion's types dev4 total -"Bug(2)":2 -"Performance(2)":2 -"Formatting(3)":3 -"Naming Convention(1)":1 -``` +| **dev1** | 17 | 5 | 0 / 0 / 8 | 17 | +| **dev2** | 37 | 12 | 0 / 0 / 35 | 54 | +| **dev3** | 27 | 12 | 0 / 0 / 44 | 53 | +| **dev4** | 31 | 4 | 0 / 0 / 13 | 17 | +| **dev5** | 37 | 11 | 0 / 0 / 30 | 44 | +| **total** | 150 | 44 | 0 / 0 / 130 | 185 | + -```mermaid -pie -title Discussion's types dev8 total -"Bug(2)":2 -``` - -```mermaid -pie -title Discussion's types dev5 total -"Formatting(1)":1 -``` -```mermaid -pie -title Discussion's types dev6 total -"Performance(2)":2 -"Bug(2)":2 -"Overengineering(1)":1 -"Naming Convention(1)":1 -``` - -```mermaid -pie -title Discussion's types dev7 total -"Bug(5)":5 -"Formatting(5)":5 -"Performance(2)":2 -"Naming Convention(1)":1 -"Overengineering(1)":1 -``` - -```mermaid -pie -title Discussion's types total total -"Bug(11)":11 -"Performance(6)":6 -"Formatting(9)":9 -"Naming Convention(3)":3 -"Overengineering(3)":3 -``` ### Code review engagement total - -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 38 | 9 / 2 / 9 | 9 | 13/6/1/1/1 | 0 / 6 / 18 | 104 | -| **dev8** | 42 | 71 / 10 / 81 | 107 | 26/9/6/3/8 | 19 / 11 / 52 | 101 | -| **dev5** | 14 | 22 / 5 / 25 | 27 | 23/7/2/3/3 | 4 / 3 / 35 | 131 | -| **dev6** | 23 | 2 / 1 / 2 | 2 | 20/1/2/1/1 | 0 / 2 / 25 | 123 | -| **dev7** | 22 | 2 / 0 / 2 | 2 | 11/6/2/0/0 | 0 / 1 / 19 | 122 | -| **total** | 139 | 107 / 18 / 120 | 149 | 92/27/13/6/12 | 23 / 21 / 138 | 581 | - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev4 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(4 hours 12 minutes) : 0, 252 -Time to approve(7 hours 32 minutes) : 0, 452 -Time to merge(15 hours 31 minutes) : 0, 931 - -section 11/2023 - Time in draft(17 minutes) : 0, 17 -Time to review request(10 minutes) : 0, 10 -Time to review(55 minutes) : 0, 55 -Time to approve(8 hours 4 minutes) : 0, 484 -Time to merge(17 hours 1 minute) : 0, 1021 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev8 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 14 minutes) : 0, 194 -Time to approve(3 hours 14 minutes) : 0, 194 -Time to merge(16 hours 23 minutes) : 0, 983 - -section 11/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 10 minutes) : 0, 70 -Time to approve(1 hour 30 minutes) : 0, 90 -Time to merge(3 hours 29 minutes) : 0, 209 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev5 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(7 hours 43 minutes) : 0, 463 -Time to approve(12 hours 13 minutes) : 0, 733 -Time to merge(50 hours 11 minutes) : 0, 3011 - -section 11/2023 - Time in draft(18 minutes) : 0, 18 -Time to review request(18 minutes) : 0, 18 -Time to review(8 hours 3 minutes) : 0, 483 -Time to approve(8 hours 7 minutes) : 0, 487 -Time to merge(36 hours 28 minutes) : 0, 2188 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev6 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(29 minutes) : 0, 29 -Time to review request(29 minutes) : 0, 29 -Time to review(3 hours 48 minutes) : 0, 228 -Time to approve(3 hours 48 minutes) : 0, 228 -Time to merge(32 hours 29 minutes) : 0, 1949 - -section 11/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(1 hour 59 minutes) : 0, 119 -Time to approve(2 hours 19 minutes) : 0, 139 -Time to merge(35 hours 34 minutes) : 0, 2134 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev7 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(13 minutes) : 0, 13 -Time to review request(13 minutes) : 0, 13 -Time to review(3 hours 50 minutes) : 0, 230 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(48 hours 18 minutes) : 0, 2898 - -section 11/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 30 minutes) : 0, 90 -Time to approve(8 hours) : 0, 480 -Time to merge(25 hours 1 minute) : 0, 1501 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) total / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(8 minutes) : 0, 8 -Time to review request(8 minutes) : 0, 8 -Time to review(4 hours 21 minutes) : 0, 261 -Time to approve(6 hours 14 minutes) : 0, 374 -Time to merge(24 hours 52 minutes) : 0, 1492 - -section 11/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 16 minutes) : 0, 136 -Time to approve(5 hours 9 minutes) : 0, 309 -Time to merge(26 hours 13 minutes) : 0, 1573 - -``` +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 49 | 0 / 0 / 81 | 119 | 19/15/10/4/1 | 27 / 10 / 46 | +| **dev2** | 46 | 0 / 0 / 22 | 35 | 25/14/4/2/1 | 12 / 4 / 46 | +| **dev3** | 30 | 0 / 0 / 3 | 4 | 23/4/2/0/1 | 0 / 2 / 29 | +| **dev4** | 33 | 0 / 0 / 18 | 21 | 14/10/5/2/2 | 7 / 0 / 33 | +| **dev5** | 13 | 0 / 0 / 3 | 3 | 10/2/1/0/0 | 0 / 1 / 12 | +| **total** | 152 | 0 / 0 / 130 | 185 | 81/40/21/9/4 | 44 / 21 / 151 | + + +### Review Response Time(75th percentile) total +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 136 | 49 | 5 hours 21 minutes | 4 hours | 6 hours 21 minutes | +| **dev2** | 112 | 46 | 4 hours 24 minutes | 3 hours 55 minutes | 3 hours 21 minutes | +| **dev3** | 125 | 30 | 3 hours 50 minutes | 3 hours 17 minutes | | +| **dev4** | 122 | 33 | 2 hours 11 minutes | 55 minutes | 10 hours 46 minutes | +| **dev5** | 113 | 13 | 5 hours 31 minutes | 5 hours 29 minutes | | +| **total** | 613 | 152 | 5 hours | 3 hours 52 minutes | 7 hours 4 minutes | + + + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev1" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 24 + line [6.3, 1.48] +line [6.08, 2.43] +line [5.8, 3.77] +line [0.12, 0.07] +line [0.12, 0.07] +line [4.25, 1.67] +line [0, 0] +line [4.93, 1.7] +line [23.57, 10.02] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev1" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 42 + line [42, 39] +line [4, 4] +line [15, 12] +line [4, 1] +line [30, 19] +line [13, 4] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev2" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 17 + line [6.48, 3.42] +line [5.68, 3.48] +line [3.07, 3.12] +line [0.17, 0.75] +line [0.17, 0.75] +line [6.82, 1.27] +line [0, 4.83] +line [7.47, 6.02] +line [16.33, 15.88] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev2" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 27 + line [10, 12] +line [12, 23] +line [7, 5] +line [5, 7] +line [27, 19] +line [20, 17] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev3" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 24 + line [4.18, 1.6] +line [4.23, 1.67] +line [0, 0] +line [0.4, 0.43] +line [0.4, 0.4] +line [4.95, 1.85] +line [0, 0] +line [13.82, 9.55] +line [22.1, 23.27] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev3" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 25 + line [1, 2] +line [25, 19] +line [0, 0] +line [7, 5] +line [18, 12] +line [14, 13] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev4" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 19 + line [1.88, 0.73] +line [3.02, 1.1] +line [0, 0] +line [0.18, 0.17] +line [0.18, 0.2] +line [3.13, 1.15] +line [2.07, 0.95] +line [3.53, 1.15] +line [18.7, 9.28] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev4" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 18 + line [7, 11] +line [6, 7] +line [3, 4] +line [3, 1] +line [15, 18] +line [18, 13] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev5" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 31 + line [5.98, 1.33] +line [5.83, 1.42] +line [0, 0] +line [0.12, 0.12] +line [0.13, 0.12] +line [6.55, 4.08] +line [9.37, 3.62] +line [10.22, 13.13] +line [30.72, 27.88] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev5" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 22 + line [3, 0] +line [16, 14] +line [0, 0] +line [5, 6] +line [11, 2] +line [22, 15] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) total" + x-axis ["10/24", "11/24"] + y-axis "hours" 0 --> 24 + line [5.6, 1.82] +line [5.37, 3.22] +line [6.88, 6.92] +line [0.17, 0.25] +line [0.17, 0.25] +line [5.35, 1.98] +line [6.88, 3.62] +line [8.05, 7.83] +line [21.95, 23.8] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution total" + x-axis ["10/24", "11/24"] + y-axis "amount" 0 --> 90 + line [63, 67] +line [63, 67] +line [24, 20] +line [24, 20] +line [90, 62] +line [88, 62] +``` \ No newline at end of file From 9fde18b9334d777bd5cb087fb72f61abcc88d91c Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 21:12:13 +0700 Subject: [PATCH 06/10] Feature: Update markdown example --- examples/nPRsReport.md | 1377 +++++++++++++++++++--------------------- 1 file changed, 666 insertions(+), 711 deletions(-) diff --git a/examples/nPRsReport.md b/examples/nPRsReport.md index 5203e48..229c70a 100644 --- a/examples/nPRsReport.md +++ b/examples/nPRsReport.md @@ -1,766 +1,721 @@ -## Pull Request report - -This report based on 150 last updated PRs. To learn more about the project and its configuration, please visit [Pull request analytics action](https://github.com/AlexSim93/pull-request-analytics-action). +## Pull Request report + This report based on 200 last updated PRs. To learn more about the project and its configuration, please visit [Pull request analytics action](https://github.com/AlexSim93/pull-request-analytics-action). + Below are the settings applied for this report: - ``` -GITHUB_OWNERS_REPOS: owner/repo -GITHUB_OWNER_FOR_ISSUE: owner -GITHUB_REPO_FOR_ISSUE: repo -SHOW_STATS_TYPES: timeline, workload, pr-quality, code-review-engagement -REVIEW_TIME_INTERVALS: 2,4,6,9,12,18 +GITHUB_OWNERS_REPOS: AlexSim93/example-repo +GITHUB_OWNER_FOR_ISSUE: AlexSim93 +GITHUB_REPO_FOR_ISSUE: lang-card +SHOW_STATS_TYPES: timeline, workload, pr-quality, code-review-engagement, response-time +REVIEW_TIME_INTERVALS: 2,4,8,12,16,24 TOP_LIST_AMOUNT: 0 AGGREGATE_VALUE_METHODS: percentile +SHOW_CORRELATION_GRAPHS: true +SHOW_ACTIVITY_TIME_GRAPHS: true PERCENTILE: 75 -HIDE_USERS: dev1, dev2, dev3 +SHOW_USERS: dev1, dev2, dev3, dev4, dev5, total TIMEZONE: Europe/Berlin CORE_HOURS_START: 09:00 -CORE_HOURS_END: 18:00 +CORE_HOURS_END: 19:00 AMOUNT: 150 PERIOD_SPLIT_UNIT: months +USE_CHARTS: false EXECUTION_OUTCOME: markdown ``` + + + + + -### Pull requests timeline(75th percentile) 12/2023 - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +### Pull requests timeline(75th percentile) 12/2024 +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 7 minutes | 7 minutes | 4 hours 12 minutes | 7 hours 32 minutes | 15 hours 31 minutes | 29 | -| **dev8** | 8 minutes | 7 minutes | 3 hours 14 minutes | 3 hours 14 minutes | 16 hours 23 minutes | 19 | -| **dev5** | 6 minutes | 6 minutes | 7 hours 43 minutes | 12 hours 13 minutes | 50 hours 11 minutes | 2 | -| **dev6** | 29 minutes | 29 minutes | 3 hours 48 minutes | 3 hours 48 minutes | 32 hours 29 minutes | 6 | -| **dev7** | 13 minutes | 13 minutes | 3 hours 50 minutes | 9 hours 19 minutes | 48 hours 18 minutes | 9 | -| **total** | 8 minutes | 8 minutes | 4 hours 21 minutes | 6 hours 14 minutes | 24 hours 52 minutes | 65 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) 12/2023 / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(4 hours 12 minutes) : 0, 252 -Time to approve(7 hours 32 minutes) : 0, 452 -Time to merge(15 hours 31 minutes) : 0, 931 - -section dev8 - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 14 minutes) : 0, 194 -Time to approve(3 hours 14 minutes) : 0, 194 -Time to merge(16 hours 23 minutes) : 0, 983 - -section dev5 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(7 hours 43 minutes) : 0, 463 -Time to approve(12 hours 13 minutes) : 0, 733 -Time to merge(50 hours 11 minutes) : 0, 3011 - -section dev6 - Time in draft(29 minutes) : 0, 29 -Time to review request(29 minutes) : 0, 29 -Time to review(3 hours 48 minutes) : 0, 228 -Time to approve(3 hours 48 minutes) : 0, 228 -Time to merge(32 hours 29 minutes) : 0, 1949 - -section dev7 - Time in draft(13 minutes) : 0, 13 -Time to review request(13 minutes) : 0, 13 -Time to review(3 hours 50 minutes) : 0, 230 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(48 hours 18 minutes) : 0, 2898 - -section total - Time in draft(8 minutes) : 0, 8 -Time to review request(8 minutes) : 0, 8 -Time to review(4 hours 21 minutes) : 0, 261 -Time to approve(6 hours 14 minutes) : 0, 374 -Time to merge(24 hours 52 minutes) : 0, 1492 - -``` - -```mermaid -pie -title Review time dev4 12/2023 -"0-2 hours(15)":15 -"2-4 hours(5)":5 -"4-6 hours(4)":4 -"9-12 hours(3)":3 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 12/2023 -"0-2 hours(11)":11 -"2-4 hours(3)":3 -"4-6 hours(2)":2 -"12-18 hours(2)":2 -``` - -```mermaid -pie -title Review time dev5 12/2023 -"0-2 hours(1)":1 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev6 12/2023 -"0-2 hours(3)":3 -"2-4 hours(1)":1 -"4-6 hours(2)":2 -``` - -```mermaid -pie -title Review time dev7 12/2023 -"0-2 hours(6)":6 -"4-6 hours(2)":2 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time total 12/2023 -"0-2 hours(36)":36 -"2-4 hours(9)":9 -"4-6 hours(10)":10 -"9-12 hours(3)":3 -"12-18 hours(4)":4 -"18+ hours(1)":1 -``` - -### Workload stats 12/2023 - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 6 minutes | 6 minutes | 40 minutes | | 3 hours 27 minutes | 8 hours 21 minutes | 15 | +| **dev2** | 6 minutes | 7 minutes | 4 hours 43 minutes | | 8 hours 7 minutes | 14 hours 50 minutes | 23 | +| **dev3** | 6 minutes | 6 minutes | 2 hours 26 minutes | | 8 hours 48 minutes | 21 hours 7 minutes | 10 | +| **dev4** | 27 minutes | 27 minutes | 3 hours 29 minutes | 3 hours 25 minutes | 8 hours 3 minutes | 56 hours 9 minutes | 17 | +| **dev5** | 15 minutes | 9 minutes | 1 hour 8 minutes | 5 hours 29 minutes | 12 hours 2 minutes | 36 hours 31 minutes | 17 | +| **total** | 9 minutes | 7 minutes | 2 hours 21 minutes | 4 hours 21 minutes | 8 hours 43 minutes | 22 hours 53 minutes | 83 | + + + +### Review time 12/2024 + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 12(80%) | 1(6.7%) | 0 | 1(6.7%) | 0 | 0 | 1(6.7%) | +| **dev2** | 16(69.6%) | 0 | 4(17.4%) | 3(13%) | 0 | 0 | 0 | +| **dev3** | 6(60%) | 2(20%) | 2(20%) | 0 | 0 | 0 | 0 | +| **dev4** | 12(70.6%) | 0 | 4(23.5%) | 0 | 0 | 1(5.9%) | 0 | +| **dev5** | 13(76.5%) | 2(11.8%) | 1(5.9%) | 1(5.9%) | 0 | 0 | 0 | +| **total** | 60(72.3%) | 5(6%) | 11(13.3%) | 5(6%) | 0 | 1(1.2%) | 1(1.2%) | + + + + + + +### Contribution stats 12/2024 **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 32 | 29 | +2428/-6786 | 20/5/4/0/3 | 44 | 12 | -| **dev8** | 20 | 19 | +954/-2167 | 11/6/1/2/0 | 6 | 28 | -| **dev5** | 2 | 2 | +15/-3 | 2/0/0/0/0 | 1 | 13 | -| **dev6** | 6 | 6 | +1164/-504 | 3/1/1/0/1 | 28 | 4 | -| **dev7** | 9 | 9 | +5553/-4706 | 6/1/1/0/1 | 22 | 11 | -| **total** | 69 | 65 | +10114/-14166 | 42/13/7/2/5 | 101 | 63 | - -### Pull request quality 12/2023 - +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 15 | 15 | 0 | 1 | 1 | +9316/-8217 | 11/2/0/1/1 | +| **dev2** | 24 | 23 | 2 | 3 | 3 | +1358/-1442 | 19/2/1/2/0 | +| **dev3** | 10 | 10 | 0 | 0 | 0 | +917/-217 | 5/3/2/0/0 | +| **dev4** | 17 | 17 | 0 | 0 | 0 | +1591/-743 | 10/3/3/1/0 | +| **dev5** | 17 | 17 | 1 | 4 | 3 | +3870/-1330 | 5/5/4/2/1 | +| **total** | 84 | 83 | 3 | 8 | 7 | +17057/-11954 | 51/15/10/6/2 | + + + +### Pull request quality 12/2024 **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 29 | 5 | 12 / 1 / 12 | 22 | -| **dev8** | 19 | 1 | 2 / 0 / 2 | 3 | -| **dev5** | 2 | 0 | 1 / 1 / 1 | 1 | -| **dev6** | 6 | 1 | 13 / 2 / 15 | 16 | -| **dev7** | 9 | 2 | 8 / 1 / 10 | 12 | -| **total** | 65 | 9 | 36 / 5 / 40 | 54 | - -```mermaid -pie -title Discussion's types dev4 12/2023 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev8 12/2023 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev6 12/2023 -"Performance(1)":1 -"Bug(1)":1 -``` - -```mermaid -pie -title Discussion's types dev7 12/2023 -"Bug(2)":2 -"Formatting(2)":2 -"Performance(1)":1 -``` - -```mermaid -pie -title Discussion's types total 12/2023 -"Bug(5)":5 -"Performance(2)":2 -"Formatting(2)":2 -``` - -### Code review engagement 12/2023 - -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +| **dev1** | 15 | 2 | 2 / 2 / 12 | 18 | +| **dev2** | 23 | 2 | 3 / 6 / 20 | 24 | +| **dev3** | 10 | 4 | 6 / 0 / 30 | 48 | +| **dev4** | 17 | 5 | 9 / 4 / 68 | 82 | +| **dev5** | 17 | 4 | 9 / 3 / 51 | 63 | +| **total** | 83 | 17 | 29 / 15 / 181 | 235 | + + +### Discussion's types 12/2024 + +| users | imports between modules | browser support | Error handling | locale value getter | array performance | misprint | redux selectors | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 1(33.3%) | 1(33.3%) | 1(33.3%) | 0 | 0 | 0 | 0 | +| **dev4** | 7(41.2%) | 4(23.5%) | 2(11.8%) | 2(11.8%) | 2(11.8%) | 0 | 0 | +| **dev5** | 1(11.1%) | 2(22.2%) | 3(33.3%) | 0 | 0 | 2(22.2%) | 1(11.1%) | +| **total** | 9(31%) | 7(24.1%) | 6(20.7%) | 2(6.9%) | 2(6.9%) | 2(6.9%) | 1(3.4%) | + + + +### Code review engagement 12/2024 +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 29 | 4 / 0 / 4 | 4 | 7/3/1/1/0 | 0 / 1 / 12 | 37 | -| **dev8** | 19 | 27 / 4 / 31 | 44 | 14/5/4/0/5 | 8 / 7 / 28 | 49 | -| **dev5** | 2 | 4 / 0 / 4 | 5 | 7/2/1/2/1 | 1 / 0 / 13 | 67 | -| **dev6** | 6 | 1 / 1 / 1 | 1 | 4/0/0/0/0 | 0 / 1 / 4 | 63 | -| **dev7** | 9 | 0 / 0 / 0 | 0 | 8/2/1/0/0 | 0 / 0 / 11 | 59 | -| **total** | 65 | 36 / 5 / 40 | 54 | 42/13/7/2/5 | 9 / 9 / 63 | 275 | - -### Pull requests timeline(75th percentile) 11/2023 - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 25 | 0 / 0 / 46 | 64 | 8/6/7/3/1 | 8 / 10 / 24 | +| **dev2** | 28 | 0 / 0 / 11 | 12 | 16/6/5/1/0 | 8 / 0 / 28 | +| **dev3** | 8 | 0 / 0 / 1 | 1 | 6/1/0/0/1 | 0 / 1 / 8 | +| **dev4** | 20 | 0 / 0 / 2 | 2 | 16/2/1/1/0 | 1 / 0 / 20 | +| **dev5** | 8 | 0 / 0 / 4 | 5 | 6/1/1/0/0 | 2 / 0 / 8 | +| **total** | 83 | 29 / 15 / 181 | 235 | 51/15/10/6/2 | 17 / 39 / 83 | + + +### Review Response Time(75th percentile) 12/2024 +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 67 | 25 | 6 hours 39 minutes | 7 hours 39 minutes | 5 hours 18 minutes | +| **dev2** | 58 | 28 | 6 hours 3 minutes | 5 hours 55 minutes | 2 hours 56 minutes | +| **dev3** | 73 | 8 | 4 hours | 4 hours | | +| **dev4** | 63 | 20 | 7 hours 13 minutes | 6 hours 57 minutes | | +| **dev5** | 66 | 8 | 3 hours 51 minutes | 3 hours 46 minutes | | +| **total** | 334 | 83 | 6 hours 3 minutes | 6 hours 8 minutes | 4 hours 33 minutes | + + + + + + +### Pull requests timeline(75th percentile) 11/2024 +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 17 minutes | 10 minutes | 55 minutes | 8 hours 4 minutes | 17 hours 1 minute | 9 | -| **dev8** | 6 minutes | 6 minutes | 1 hour 10 minutes | 1 hour 30 minutes | 3 hours 29 minutes | 23 | -| **dev5** | 18 minutes | 18 minutes | 8 hours 3 minutes | 8 hours 7 minutes | 36 hours 28 minutes | 12 | -| **dev6** | 7 minutes | 7 minutes | 1 hour 59 minutes | 2 hours 19 minutes | 35 hours 34 minutes | 17 | -| **dev7** | 6 minutes | 6 minutes | 1 hour 30 minutes | 8 hours | 25 hours 1 minute | 13 | -| **total** | 7 minutes | 7 minutes | 2 hours 16 minutes | 5 hours 9 minutes | 26 hours 13 minutes | 74 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) 11/2023 / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(17 minutes) : 0, 17 -Time to review request(10 minutes) : 0, 10 -Time to review(55 minutes) : 0, 55 -Time to approve(8 hours 4 minutes) : 0, 484 -Time to merge(17 hours 1 minute) : 0, 1021 - -section dev8 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 10 minutes) : 0, 70 -Time to approve(1 hour 30 minutes) : 0, 90 -Time to merge(3 hours 29 minutes) : 0, 209 - -section dev5 - Time in draft(18 minutes) : 0, 18 -Time to review request(18 minutes) : 0, 18 -Time to review(8 hours 3 minutes) : 0, 483 -Time to approve(8 hours 7 minutes) : 0, 487 -Time to merge(36 hours 28 minutes) : 0, 2188 - -section dev6 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(1 hour 59 minutes) : 0, 119 -Time to approve(2 hours 19 minutes) : 0, 139 -Time to merge(35 hours 34 minutes) : 0, 2134 - -section dev7 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 30 minutes) : 0, 90 -Time to approve(8 hours) : 0, 480 -Time to merge(25 hours 1 minute) : 0, 1501 - -section total - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 16 minutes) : 0, 136 -Time to approve(5 hours 9 minutes) : 0, 309 -Time to merge(26 hours 13 minutes) : 0, 1573 - -``` - -```mermaid -pie -title Review time dev4 11/2023 -"0-2 hours(9)":9 -"2-4 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 11/2023 -"0-2 hours(17)":17 -"2-4 hours(1)":1 -"4-6 hours(1)":1 -"6-9 hours(1)":1 -"9-12 hours(1)":1 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time dev5 11/2023 -"0-2 hours(6)":6 -"4-6 hours(1)":1 -"6-9 hours(3)":3 -"9-12 hours(1)":1 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev6 11/2023 -"0-2 hours(12)":12 -"2-4 hours(4)":4 -``` - -```mermaid -pie -title Review time dev7 11/2023 -"0-2 hours(9)":9 -"2-4 hours(2)":2 -"6-9 hours(1)":1 -``` - -```mermaid -pie -title Review time total 11/2023 -"0-2 hours(53)":53 -"2-4 hours(8)":8 -"4-6 hours(2)":2 -"6-9 hours(5)":5 -"9-12 hours(2)":2 -"12-18 hours(1)":1 -"18+ hours(2)":2 -``` - -### Workload stats 11/2023 - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 4 minutes | 4 minutes | 1 hour 40 minutes | | 1 hour 42 minutes | 10 hours 1 minute | 4 | +| **dev2** | 45 minutes | 45 minutes | 1 hour 16 minutes | 4 hours 50 minutes | 6 hours 1 minute | 15 hours 53 minutes | 17 | +| **dev3** | 26 minutes | 24 minutes | 1 hour 51 minutes | | 9 hours 33 minutes | 23 hours 16 minutes | 13 | +| **dev4** | 10 minutes | 12 minutes | 1 hour 9 minutes | 57 minutes | 1 hour 9 minutes | 9 hours 17 minutes | 13 | +| **dev5** | 7 minutes | 7 minutes | 4 hours 5 minutes | 3 hours 37 minutes | 13 hours 8 minutes | 27 hours 53 minutes | 15 | +| **total** | 15 minutes | 15 minutes | 1 hour 59 minutes | 3 hours 37 minutes | 7 hours 50 minutes | 23 hours 48 minutes | 62 | + + + +### Review time 11/2024 + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 3(75%) | 1(25%) | 0 | 0 | 0 | 0 | 0 | +| **dev2** | 13(76.5%) | 0 | 1(5.9%) | 1(5.9%) | 1(5.9%) | 0 | 1(5.9%) | +| **dev3** | 10(76.9%) | 1(7.7%) | 1(7.7%) | 1(7.7%) | 0 | 0 | 0 | +| **dev4** | 10(76.9%) | 1(7.7%) | 1(7.7%) | 1(7.7%) | 0 | 0 | 0 | +| **dev5** | 10(66.7%) | 1(6.7%) | 3(20%) | 1(6.7%) | 0 | 0 | 0 | +| **total** | 46(74.2%) | 4(6.5%) | 6(9.7%) | 4(6.5%) | 1(1.6%) | 0 | 1(1.6%) | + + + + + + +### Contribution stats 11/2024 **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 11 | 9 | +2878/-1919 | 4/3/2/1/1 | 58 | 10 | -| **dev8** | 23 | 23 | +2535/-2379 | 16/4/1/0/2 | 5 | 24 | -| **dev5** | 13 | 12 | +1283/-627 | 10/0/2/1/0 | 10 | 25 | -| **dev6** | 19 | 17 | +2294/-1668 | 11/5/0/1/2 | 42 | 21 | -| **dev7** | 13 | 13 | +1568/-800 | 8/2/1/1/1 | 70 | 8 | -| **total** | 81 | 74 | +18759/-7452 | 50/14/6/4/7 | 190 | 76 | - -### Pull request quality 11/2023 - +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 4 | 4 | 0 | 1 | 0 | +415/-89 | 1/3/0/0/0 | +| **dev2** | 17 | 17 | 0 | 0 | 0 | +3253/-2378 | 7/4/3/2/1 | +| **dev3** | 13 | 13 | 0 | 0 | 0 | +1713/-1742 | 4/6/1/2/0 | +| **dev4** | 14 | 13 | 0 | 1 | 1 | +1116/-1032 | 10/2/1/0/1 | +| **dev5** | 15 | 15 | 0 | 0 | 0 | +1048/-341 | 9/3/3/0/0 | +| **total** | 63 | 62 | 0 | 2 | 1 | +7545/-5582 | 31/18/8/4/2 | + + + +### Pull request quality 11/2024 **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 | 5 | 18 / 2 / 21 | 30 | -| **dev8** | 23 | 0 | 3 / 2 / 3 | 3 | -| **dev5** | 12 | 1 | 2 / 0 / 2 | 4 | -| **dev6** | 17 | 4 | 18 / 4 / 21 | 22 | -| **dev7** | 13 | 4 | 28 / 5 / 31 | 34 | -| **total** | 74 | 14 | 71 / 13 / 80 | 95 | - -```mermaid -pie -title Discussion's types dev4 11/2023 -"Performance(2)":2 -"Formatting(3)":3 -"Bug(1)":1 -"Naming Convention(1)":1 -``` - -```mermaid -pie -title Discussion's types dev8 11/2023 -"Bug(1)":1 -``` +| **dev1** | 4 | 1 | 0 / 0 / 4 | 8 | +| **dev2** | 17 | 7 | 0 / 0 / 23 | 36 | +| **dev3** | 13 | 5 | 0 / 0 / 19 | 24 | +| **dev4** | 13 | 1 | 0 / 0 / 7 | 9 | +| **dev5** | 15 | 6 | 0 / 0 / 14 | 23 | +| **total** | 62 | 20 | 0 / 0 / 67 | 100 | + -```mermaid -pie -title Discussion's types dev5 11/2023 -"Formatting(1)":1 -``` -```mermaid -pie -title Discussion's types dev6 11/2023 -"Overengineering(1)":1 -"Naming Convention(1)":1 -"Performance(1)":1 -"Bug(1)":1 -``` -```mermaid -pie -title Discussion's types dev7 11/2023 -"Naming Convention(1)":1 -"Formatting(3)":3 -"Bug(3)":3 -"Overengineering(1)":1 -"Performance(1)":1 -``` +### Code review engagement 11/2024 +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. +**Agreed** - discussions with at least 1 reaction :+1:. +**Disagreed** - discussions with at least 1 reaction :-1:. +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 19 | 0 / 0 / 39 | 64 | 6/7/3/3/0 | 12 / 3 / 18 | +| **dev2** | 19 | 0 / 0 / 12 | 17 | 11/5/2/0/1 | 5 / 1 / 19 | +| **dev3** | 12 | 0 / 0 / 2 | 3 | 9/2/1/0/0 | 0 / 1 / 12 | +| **dev4** | 18 | 0 / 0 / 11 | 13 | 8/6/2/1/1 | 4 / 0 / 18 | +| **dev5** | 2 | 0 / 0 / 0 | 0 | 2/0/0/0/0 | 0 / 0 / 2 | +| **total** | 62 | 0 / 0 / 67 | 100 | 31/18/8/4/2 | 20 / 9 / 62 | + + +### Review Response Time(75th percentile) 11/2024 +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 58 | 19 | 2 hours 26 minutes | 1 hour 29 minutes | 3 hours 46 minutes | +| **dev2** | 45 | 19 | 3 hours 29 minutes | 3 hours 25 minutes | 3 hours 7 minutes | +| **dev3** | 49 | 12 | 1 hour 40 minutes | 1 hour 36 minutes | | +| **dev4** | 49 | 18 | 1 hour 6 minutes | 44 minutes | | +| **dev5** | 47 | 2 | 1 hour 25 minutes | 1 hour 20 minutes | | +| **total** | 253 | 62 | 3 hours 13 minutes | 1 hour 49 minutes | 6 hours 55 minutes | + + + + + + +### Pull requests timeline(75th percentile) 10/2024 +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. +**Time to merge** - time from PR creation to merge. +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 7 minutes | 7 minutes | 4 hours 15 minutes | | 4 hours 15 minutes | 16 hours 11 minutes | 9 | +| **dev2** | 11 minutes | 11 minutes | 5 hours 31 minutes | | 6 hours 54 minutes | 11 hours 52 minutes | 14 | +| **dev3** | 26 minutes | 26 minutes | 5 hours 31 minutes | | 14 hours 44 minutes | 22 hours 40 minutes | 9 | +| **dev4** | 6 minutes | 6 minutes | 2 hours 8 minutes | | 2 hours 8 minutes | 17 hours 36 minutes | 4 | +| **dev5** | 6 minutes | 6 minutes | 5 hours 55 minutes | 10 hours 12 minutes | 11 hours 8 minutes | 44 hours 47 minutes | 11 | +| **total** | 8 minutes | 8 minutes | 5 hours 21 minutes | 9 hours 22 minutes | 8 hours 29 minutes | 22 hours 18 minutes | 48 | + + + +### Review time 10/2024 + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 3(33.3%) | 3(33.3%) | 3(33.3%) | 0 | 0 | 0 | 0 | +| **dev2** | 9(64.3%) | 1(7.1%) | 2(14.3%) | 1(7.1%) | 0 | 0 | 1(7.1%) | +| **dev3** | 1(11.1%) | 2(22.2%) | 4(44.4%) | 1(11.1%) | 0 | 1(11.1%) | 0 | +| **dev4** | 2(50%) | 1(25%) | 1(25%) | 0 | 0 | 0 | 0 | +| **dev5** | 5(38.5%) | 3(23.1%) | 3(23.1%) | 2(15.4%) | 0 | 0 | 0 | +| **total** | 21(42%) | 10(20%) | 13(26%) | 4(8%) | 0 | 1(2%) | 1(2%) | + + + + + + +### Contribution stats 10/2024 +**Reviews conducted** - number of reviews conducted. 1 PR may have only single review. +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 9 | 9 | 0 | 0 | 0 | +424/-499 | 7/0/2/0/0 | +| **dev2** | 14 | 14 | 0 | 1 | 1 | +952/-531 | 8/3/3/0/0 | +| **dev3** | 9 | 9 | 0 | 0 | 0 | +489/-1576 | 4/3/2/0/0 | +| **dev4** | 4 | 4 | 0 | 0 | 0 | +181/-226 | 3/1/0/0/0 | +| **dev5** | 14 | 11 | 0 | 1 | 2 | +1502/-314 | 8/3/1/2/0 | +| **total** | 51 | 48 | 0 | 2 | 3 | +3581/-3155 | 31/10/8/2/0 | + + + +### Pull request quality 10/2024 +**Agreed** - discussions with at least 1 reaction :+1:. +**Disagreed** - discussions with at least 1 reaction :-1:. +| user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | +| :------: | :------: | :------: | :------: | :------: | +| **dev1** | 9 | 2 | 0 / 0 / 2 | 2 | +| **dev2** | 14 | 4 | 0 / 0 / 9 | 15 | +| **dev3** | 9 | 5 | 0 / 0 / 20 | 23 | +| **dev4** | 4 | 1 | 0 / 0 / 0 | 1 | +| **dev5** | 11 | 4 | 0 / 0 / 10 | 13 | +| **total** | 48 | 16 | 0 / 0 / 41 | 54 | + -```mermaid -pie -title Discussion's types total 11/2023 -"Performance(4)":4 -"Formatting(7)":7 -"Bug(6)":6 -"Naming Convention(3)":3 -"Overengineering(3)":3 -``` -### Code review engagement 11/2023 -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +### Code review engagement 10/2024 +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 | 5 / 2 / 5 | 5 | 6/3/0/0/1 | 0 / 5 / 6 | 67 | -| **dev8** | 23 | 44 / 6 / 50 | 63 | 12/4/2/3/3 | 11 / 4 / 24 | 52 | -| **dev5** | 12 | 18 / 5 / 21 | 22 | 16/5/1/1/2 | 3 / 3 / 22 | 64 | -| **dev6** | 17 | 1 / 0 / 1 | 1 | 16/1/2/1/1 | 0 / 1 / 21 | 60 | -| **dev7** | 13 | 2 / 0 / 2 | 2 | 3/4/1/0/0 | 0 / 1 / 8 | 63 | -| **total** | 74 | 71 / 13 / 80 | 95 | 50/14/6/4/7 | 14 / 12 / 75 | 306 | +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 20 | 0 / 0 / 24 | 33 | 12/5/3/0/0 | 9 / 5 / 18 | +| **dev2** | 13 | 0 / 0 / 7 | 10 | 7/4/2/0/0 | 5 / 2 / 13 | +| **dev3** | 8 | 0 / 0 / 1 | 1 | 6/1/1/0/0 | 0 / 1 / 7 | +| **dev4** | 11 | 0 / 0 / 6 | 7 | 6/2/2/1/0 | 3 / 0 / 11 | +| **dev5** | 4 | 0 / 0 / 3 | 3 | 3/0/1/0/0 | 0 / 1 / 3 | +| **total** | 50 | 0 / 0 / 41 | 54 | 31/10/8/2/0 | 16 / 9 / 49 | + + +### Review Response Time(75th percentile) 10/2024 +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 41 | 20 | 5 hours 21 minutes | 4 hours 27 minutes | 7 hours 26 minutes | +| **dev2** | 35 | 13 | 3 hours 41 minutes | 2 hours 8 minutes | 2 hours 16 minutes | +| **dev3** | 41 | 8 | 5 hours 51 minutes | 6 hours | | +| **dev4** | 46 | 11 | 48 minutes | 29 minutes | | +| **dev5** | 36 | 4 | 5 hours 35 minutes | 6 hours 21 minutes | | +| **total** | 199 | 50 | 5 hours 21 minutes | 5 hours 8 minutes | 9 hours 22 minutes | + + + + + + + ### Pull requests timeline(75th percentile) total - -**Time to review** - time from PR creation to first review. -**Time to approve** - time from PR creation to first approval without requested changes. +**Time to review** - time from PR creation to first review. +**Time to approve** - time from PR creation to first approval without requested changes. **Time to merge** - time from PR creation to merge. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 9 minutes | 8 minutes | 3 hours 1 minute | 7 hours 34 minutes | 16 hours 58 minutes | 38 | -| **dev8** | 7 minutes | 7 minutes | 2 hours 29 minutes | 2 hours 27 minutes | 11 hours 6 minutes | 42 | -| **dev5** | 16 minutes | 16 minutes | 8 hours 5 minutes | 9 hours 51 minutes | 42 hours 48 minutes | 14 | -| **dev6** | 7 minutes | 7 minutes | 2 hours 14 minutes | 2 hours 59 minutes | 37 hours 1 minute | 23 | -| **dev7** | 7 minutes | 7 minutes | 2 hours 15 minutes | 9 hours 19 minutes | 28 hours 44 minutes | 22 | -| **total** | 8 minutes | 7 minutes | 3 hours 8 minutes | 5 hours 45 minutes | 25 hours 47 minutes | 139 | - -```mermaid -gantt -title Pull requests timeline(75th percentile) total / minutes -dateFormat X -axisFormat %s -section dev4 - Time in draft(9 minutes) : 0, 9 -Time to review request(8 minutes) : 0, 8 -Time to review(3 hours 1 minute) : 0, 181 -Time to approve(7 hours 34 minutes) : 0, 454 -Time to merge(16 hours 58 minutes) : 0, 1018 - -section dev8 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 29 minutes) : 0, 149 -Time to approve(2 hours 27 minutes) : 0, 147 -Time to merge(11 hours 6 minutes) : 0, 666 - -section dev5 - Time in draft(16 minutes) : 0, 16 -Time to review request(16 minutes) : 0, 16 -Time to review(8 hours 5 minutes) : 0, 485 -Time to approve(9 hours 51 minutes) : 0, 591 -Time to merge(42 hours 48 minutes) : 0, 2568 - -section dev6 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 14 minutes) : 0, 134 -Time to approve(2 hours 59 minutes) : 0, 179 -Time to merge(37 hours 1 minute) : 0, 2221 - -section dev7 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 15 minutes) : 0, 135 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(28 hours 44 minutes) : 0, 1724 - -section total - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 8 minutes) : 0, 188 -Time to approve(5 hours 45 minutes) : 0, 345 -Time to merge(25 hours 47 minutes) : 0, 1547 - -``` - -```mermaid -pie -title Review time dev4 total -"0-2 hours(24)":24 -"2-4 hours(6)":6 -"4-6 hours(4)":4 -"9-12 hours(3)":3 -"12-18 hours(1)":1 -``` - -```mermaid -pie -title Review time dev8 total -"0-2 hours(28)":28 -"2-4 hours(4)":4 -"4-6 hours(3)":3 -"6-9 hours(1)":1 -"9-12 hours(1)":1 -"12-18 hours(2)":2 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time dev5 total -"0-2 hours(7)":7 -"4-6 hours(1)":1 -"6-9 hours(3)":3 -"9-12 hours(1)":1 -"12-18 hours(2)":2 -``` - -```mermaid -pie -title Review time dev6 total -"0-2 hours(15)":15 -"2-4 hours(5)":5 -"4-6 hours(2)":2 -``` - -```mermaid -pie -title Review time dev7 total -"0-2 hours(15)":15 -"2-4 hours(2)":2 -"4-6 hours(2)":2 -"6-9 hours(1)":1 -"18+ hours(1)":1 -``` - -```mermaid -pie -title Review time total total -"0-2 hours(89)":89 -"2-4 hours(17)":17 -"4-6 hours(12)":12 -"6-9 hours(5)":5 -"9-12 hours(5)":5 -"12-18 hours(5)":5 -"18+ hours(3)":3 -``` - -### Workload stats total - +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 6 minutes | 6 minutes | 2 hours 37 minutes | | 3 hours 44 minutes | 10 hours 1 minute | 28 | +| **dev2** | 12 minutes | 13 minutes | 5 hours 26 minutes | 7 hours 10 minutes | 7 hours 38 minutes | 15 hours 20 minutes | 54 | +| **dev3** | 26 minutes | 26 minutes | 4 hours 17 minutes | | 10 hours 22 minutes | 23 hours 15 minutes | 32 | +| **dev4** | 11 minutes | 12 minutes | 2 hours 5 minutes | 2 hours 53 minutes | 4 hours 56 minutes | 22 hours 27 minutes | 34 | +| **dev5** | 8 minutes | 7 minutes | 3 hours 26 minutes | 7 hours 13 minutes | 13 hours 4 minutes | 37 hours 53 minutes | 43 | +| **total** | 10 minutes | 10 minutes | 3 hours 48 minutes | 6 hours 21 minutes | 8 hours 33 minutes | 23 hours 11 minutes | 193 | + + + +### Review time total + +| users | 0-2h | 2-4h | 4-8h | 8-12h | 12-16h | 16-24h | 24+h | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 18(64.3%) | 5(17.9%) | 3(10.7%) | 1(3.6%) | 0 | 0 | 1(3.6%) | +| **dev2** | 38(70.4%) | 1(1.9%) | 7(13%) | 5(9.3%) | 1(1.9%) | 0 | 2(3.7%) | +| **dev3** | 17(53.1%) | 5(15.6%) | 7(21.9%) | 2(6.3%) | 0 | 1(3.1%) | 0 | +| **dev4** | 24(70.6%) | 2(5.9%) | 6(17.6%) | 1(2.9%) | 0 | 1(2.9%) | 0 | +| **dev5** | 28(62.2%) | 6(13.3%) | 7(15.6%) | 4(8.9%) | 0 | 0 | 0 | +| **total** | 127(65.1%) | 19(9.7%) | 30(15.4%) | 13(6.7%) | 1(0.5%) | 2(1%) | 3(1.5%) | + + + + + + +### Contribution stats total **Reviews conducted** - number of reviews conducted. 1 PR may have only single review. -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl -| user | Total opened PRs | Total merged PRs | Additions/Deletions | PR size: xs/s/m/l/xl | Total comments | Reviews conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 43 | 38 | +5306/-8705 | 24/8/6/1/4 | 102 | 22 | -| **dev8** | 43 | 42 | +3489/-4546 | 27/10/2/2/2 | 11 | 52 | -| **dev5** | 15 | 14 | +1298/-630 | 12/0/2/1/0 | 11 | 38 | -| **dev6** | 25 | 23 | +3458/-2172 | 14/6/1/1/3 | 70 | 25 | -| **dev7** | 22 | 22 | +7121/-5506 | 14/3/2/1/2 | 92 | 19 | -| **total** | 150 | 139 | +28873/-21618 | 92/27/13/6/12 | 291 | 139 | +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**Total reverted PRs** - The number of reverted PRs based on the branch name pattern `/^revert-d+/`. This pattern is used for reverts made via GitHub. +| user | Total opened PRs | Total merged PRs | Total reverted PRs | PRs w/o review | PRs w/o approval | Additions / Deletions | PR size: xs/s/m/l/xl | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 28 | 28 | 0 | 2 | 1 | +10155/-8805 | 19/5/2/1/1 | +| **dev2** | 55 | 54 | 2 | 4 | 4 | +5563/-4351 | 34/9/7/4/1 | +| **dev3** | 32 | 32 | 0 | 0 | 0 | +3119/-3535 | 13/12/5/2/0 | +| **dev4** | 35 | 34 | 0 | 1 | 1 | +2888/-2001 | 23/6/4/1/1 | +| **dev5** | 46 | 43 | 1 | 5 | 5 | +6420/-1985 | 22/11/8/4/1 | +| **total** | 200 | 193 | 3 | 14 | 13 | +28185/-20708 | 115/43/26/12/4 | + -### Pull request quality total +### Pull request quality total **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. | user | Total merged PRs | Changes requested received | Agreed / Disagreed / Total discussions received | Comments received | | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 38 | 10 | 30 / 3 / 33 | 52 | -| **dev8** | 42 | 1 | 5 / 2 / 5 | 6 | -| **dev5** | 14 | 1 | 3 / 1 / 3 | 5 | -| **dev6** | 23 | 5 | 31 / 6 / 36 | 38 | -| **dev7** | 22 | 6 | 36 / 6 / 41 | 46 | -| **total** | 139 | 23 | 107 / 18 / 120 | 149 | +| **dev1** | 28 | 5 | 2 / 2 / 18 | 28 | +| **dev2** | 54 | 13 | 3 / 6 / 52 | 75 | +| **dev3** | 32 | 14 | 6 / 0 / 69 | 95 | +| **dev4** | 34 | 7 | 9 / 4 / 75 | 92 | +| **dev5** | 43 | 14 | 9 / 3 / 75 | 99 | +| **total** | 193 | 53 | 29 / 15 / 289 | 389 | + -```mermaid -pie -title Discussion's types dev4 total -"Bug(2)":2 -"Performance(2)":2 -"Formatting(3)":3 -"Naming Convention(1)":1 -``` - -```mermaid -pie -title Discussion's types dev8 total -"Bug(2)":2 -``` - -```mermaid -pie -title Discussion's types dev5 total -"Formatting(1)":1 -``` - -```mermaid -pie -title Discussion's types dev6 total -"Performance(2)":2 -"Bug(2)":2 -"Overengineering(1)":1 -"Naming Convention(1)":1 -``` +### Discussion's types total -```mermaid -pie -title Discussion's types dev7 total -"Bug(5)":5 -"Formatting(5)":5 -"Performance(2)":2 -"Naming Convention(1)":1 -"Overengineering(1)":1 -``` +| users | imports between modules | browser support | Error handling | locale value getter | array performance | misprint | redux selectors | +| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 1(33.3%) | 1(33.3%) | 1(33.3%) | 0 | 0 | 0 | 0 | +| **dev4** | 7(41.2%) | 4(23.5%) | 2(11.8%) | 2(11.8%) | 2(11.8%) | 0 | 0 | +| **dev5** | 1(11.1%) | 2(22.2%) | 3(33.3%) | 0 | 0 | 2(22.2%) | 1(11.1%) | +| **total** | 9(31%) | 7(24.1%) | 6(20.7%) | 2(6.9%) | 2(6.9%) | 2(6.9%) | 1(3.4%) | + -```mermaid -pie -title Discussion's types total total -"Bug(11)":11 -"Performance(6)":6 -"Formatting(9)":9 -"Naming Convention(3)":3 -"Overengineering(3)":3 -``` ### Code review engagement total - -**PR Size** - determined using the formula: `additions + deletions * 0.5`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl +**PR Size** - determined using the formula: `additions + deletions * 0.2`. Based on this calculation: 0-50: xs, 51-200: s, 201-400: m, 401-700: l, 701+: xl **Changes requested / Comments / Approvals** - number of reviews conducted by user. For a single pull request, only one review of each status will be counted for a user. **Agreed** - discussions with at least 1 reaction :+1:. **Disagreed** - discussions with at least 1 reaction :-1:. -| user | Total merged PRs | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | Review requests conducted | -| :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| **dev4** | 38 | 9 / 2 / 9 | 9 | 13/6/1/1/1 | 0 / 6 / 18 | 104 | -| **dev8** | 42 | 71 / 10 / 81 | 107 | 26/9/6/3/8 | 19 / 11 / 52 | 101 | -| **dev5** | 14 | 22 / 5 / 25 | 27 | 23/7/2/3/3 | 4 / 3 / 35 | 131 | -| **dev6** | 23 | 2 / 1 / 2 | 2 | 20/1/2/1/1 | 0 / 2 / 25 | 123 | -| **dev7** | 22 | 2 / 0 / 2 | 2 | 11/6/2/0/0 | 0 / 1 / 19 | 122 | -| **total** | 139 | 107 / 18 / 120 | 149 | 92/27/13/6/12 | 23 / 21 / 138 | 581 | - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev4 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(4 hours 12 minutes) : 0, 252 -Time to approve(7 hours 32 minutes) : 0, 452 -Time to merge(15 hours 31 minutes) : 0, 931 - -section 11/2023 - Time in draft(17 minutes) : 0, 17 -Time to review request(10 minutes) : 0, 10 -Time to review(55 minutes) : 0, 55 -Time to approve(8 hours 4 minutes) : 0, 484 -Time to merge(17 hours 1 minute) : 0, 1021 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev8 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(8 minutes) : 0, 8 -Time to review request(7 minutes) : 0, 7 -Time to review(3 hours 14 minutes) : 0, 194 -Time to approve(3 hours 14 minutes) : 0, 194 -Time to merge(16 hours 23 minutes) : 0, 983 - -section 11/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 10 minutes) : 0, 70 -Time to approve(1 hour 30 minutes) : 0, 90 -Time to merge(3 hours 29 minutes) : 0, 209 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev5 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(7 hours 43 minutes) : 0, 463 -Time to approve(12 hours 13 minutes) : 0, 733 -Time to merge(50 hours 11 minutes) : 0, 3011 - -section 11/2023 - Time in draft(18 minutes) : 0, 18 -Time to review request(18 minutes) : 0, 18 -Time to review(8 hours 3 minutes) : 0, 483 -Time to approve(8 hours 7 minutes) : 0, 487 -Time to merge(36 hours 28 minutes) : 0, 2188 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev6 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(29 minutes) : 0, 29 -Time to review request(29 minutes) : 0, 29 -Time to review(3 hours 48 minutes) : 0, 228 -Time to approve(3 hours 48 minutes) : 0, 228 -Time to merge(32 hours 29 minutes) : 0, 1949 - -section 11/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(1 hour 59 minutes) : 0, 119 -Time to approve(2 hours 19 minutes) : 0, 139 -Time to merge(35 hours 34 minutes) : 0, 2134 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) dev7 / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(13 minutes) : 0, 13 -Time to review request(13 minutes) : 0, 13 -Time to review(3 hours 50 minutes) : 0, 230 -Time to approve(9 hours 19 minutes) : 0, 559 -Time to merge(48 hours 18 minutes) : 0, 2898 - -section 11/2023 - Time in draft(6 minutes) : 0, 6 -Time to review request(6 minutes) : 0, 6 -Time to review(1 hour 30 minutes) : 0, 90 -Time to approve(8 hours) : 0, 480 -Time to merge(25 hours 1 minute) : 0, 1501 - -``` - -```mermaid -gantt -title Pull request's retrospective timeline(75th percentile) total / minutes -dateFormat X -axisFormat %s -section 12/2023 - Time in draft(8 minutes) : 0, 8 -Time to review request(8 minutes) : 0, 8 -Time to review(4 hours 21 minutes) : 0, 261 -Time to approve(6 hours 14 minutes) : 0, 374 -Time to merge(24 hours 52 minutes) : 0, 1492 - -section 11/2023 - Time in draft(7 minutes) : 0, 7 -Time to review request(7 minutes) : 0, 7 -Time to review(2 hours 16 minutes) : 0, 136 -Time to approve(5 hours 9 minutes) : 0, 309 -Time to merge(26 hours 13 minutes) : 0, 1573 - -``` +| user | Reviews conducted | Agreed / Disagreed / Total discussions conducted | Comments conducted | PR size: xs/s/m/l/xl | Changes requested / Commented / Approved | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 64 | 0 / 0 / 109 | 161 | 26/18/13/6/1 | 29 / 18 / 60 | +| **dev2** | 60 | 0 / 0 / 30 | 39 | 34/15/9/1/1 | 18 / 3 / 60 | +| **dev3** | 28 | 0 / 0 / 4 | 5 | 21/4/2/0/1 | 0 / 3 / 27 | +| **dev4** | 49 | 0 / 0 / 19 | 22 | 30/10/5/3/1 | 8 / 0 / 49 | +| **dev5** | 14 | 0 / 0 / 7 | 8 | 11/1/2/0/0 | 2 / 1 / 13 | +| **total** | 195 | 29 / 15 / 289 | 389 | 115/43/26/12/4 | 53 / 57 / 194 | + + +### Review Response Time(75th percentile) total +**Time from re-request to response** - time from a review re-request to the response. Multiple re-requests and responses can occur in a single pull request +| user | Review requests conducted | Reviews conducted | Time from opening to response | Time from initial request to response | Time from re-request to response | +| :------: | :------: | :------: | :------: | :------: | :------: | +| **dev1** | 168 | 64 | 5 hours 39 minutes | 4 hours 27 minutes | 6 hours 51 minutes | +| **dev2** | 139 | 60 | 4 hours 10 minutes | 4 hours 3 minutes | 3 hours 11 minutes | +| **dev3** | 164 | 28 | 4 hours 56 minutes | 4 hours 22 minutes | | +| **dev4** | 159 | 49 | 2 hours 2 minutes | 1 hour 19 minutes | 10 hours 46 minutes | +| **dev5** | 150 | 14 | 4 hours 45 minutes | 4 hours 59 minutes | | +| **total** | 792 | 195 | 5 hours 20 minutes | 4 hours 4 minutes | 6 hours 55 minutes | + + + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev1" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 17 + line [4.45, 1.48, 7.65] +line [5.35, 2.43, 6.65] +line [7.43, 3.77, 5.3] +line [0.12, 0.07, 0.1] +line [0.12, 0.07, 0.1] +line [4.25, 1.67, 0.67] +line [0, 0, 0] +line [4.25, 1.7, 3.45] +line [16.18, 10.02, 8.35] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev1" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 46 + line [0, 0, 24, 39, 46] +line [0, 0, 2, 4, 12] +line [0, 0, 9, 12, 8] +line [0, 0, 2, 1, 2] +line [0, 0, 20, 19, 25] +line [0, 0, 9, 4, 15] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev2" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 16 + line [2.13, 3.42, 5.92] +line [3.68, 3.48, 6.05] +line [2.27, 3.12, 2.93] +line [0.18, 0.75, 0.1] +line [0.18, 0.75, 0.12] +line [5.52, 1.27, 4.72] +line [0, 4.83, 0] +line [6.9, 6.02, 8.12] +line [11.87, 15.88, 14.83] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev2" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 28 + line [0, 0, 7, 12, 11] +line [0, 0, 9, 23, 20] +line [0, 0, 5, 5, 8] +line [0, 0, 4, 7, 2] +line [0, 0, 13, 19, 28] +line [0, 0, 14, 17, 23] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev3" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 24 + line [6, 1.6, 4] +line [5.85, 1.67, 4] +line [0, 0, 0] +line [0.43, 0.43, 0.1] +line [0.43, 0.4, 0.1] +line [5.52, 1.85, 2.43] +line [0, 0, 0] +line [14.73, 9.55, 8.8] +line [22.67, 23.27, 21.12] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev3" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 30 + line [0, 0, 1, 2, 1] +line [0, 0, 20, 19, 30] +line [0, 0, 0, 0, 0] +line [0, 0, 5, 5, 4] +line [0, 0, 8, 12, 8] +line [0, 0, 9, 13, 10] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev4" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 57 + line [0.48, 0.73, 6.95] +line [0.8, 1.1, 7.22] +line [0, 0, 0] +line [0.1, 0.17, 0.45] +line [0.1, 0.2, 0.45] +line [2.13, 1.15, 3.48] +line [0, 0.95, 3.42] +line [2.13, 1.15, 8.05] +line [17.6, 9.28, 56.15] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev4" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 68 + line [0, 0, 6, 11, 2] +line [0, 0, 0, 7, 68] +line [0, 0, 3, 4, 1] +line [0, 0, 1, 1, 5] +line [0, 0, 11, 18, 20] +line [0, 0, 4, 13, 17] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) dev5" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 45 + line [6.35, 1.33, 3.77] +line [5.58, 1.42, 3.85] +line [0, 0, 0] +line [0.1, 0.12, 0.25] +line [0.1, 0.12, 0.15] +line [5.92, 4.08, 1.13] +line [10.2, 3.62, 5.48] +line [11.13, 13.13, 12.03] +line [44.78, 27.88, 36.52] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution dev5" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 51 + line [0, 0, 3, 0, 4] +line [0, 0, 10, 14, 51] +line [0, 0, 0, 0, 2] +line [0, 0, 4, 6, 4] +line [0, 0, 4, 2, 8] +line [0, 0, 11, 15, 17] +``` + +$$\color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response\ \color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "orange, violet, mediumblue, dimgrey, firebrick, gold, turquoise, chartreuse, blueviolet" +--- +xychart-beta + title "Pull request's retrospective timeline(75th percentile) total" + x-axis ["10/24", "11/24", "12/24"] + y-axis "hours" 0 --> 24 + line [5.13, 1.82, 6.13] +line [5.35, 3.22, 6.05] +line [9.37, 6.92, 4.55] +line [0.13, 0.25, 0.15] +line [0.13, 0.25, 0.12] +line [5.35, 1.98, 2.35] +line [9.37, 3.62, 4.35] +line [8.48, 7.83, 8.72] +line [22.3, 23.8, 22.88] +``` + +$$\color{blueviolet}Discussions\ Conducted\ \color{darkblue}Discussions\ Received\ \color{crimson}Changes\ Requested\ Conducted\ \color{firebrick}Changes\ Requested\ Received\ \color{gold}Reviews\ Conducted\ \color{chartreuse}Merged\ PRs$$ +```mermaid +--- +config: + xyChart: + width: 900 + height: 600 + themeVariables: + xyChart: + titleColor: "black" + plotColorPalette: "blueviolet, darkblue, crimson, firebrick, gold, chartreuse" +--- +xychart-beta + title "Pull request's retrospective contribution total" + x-axis ["11/23", "7/24", "10/24", "11/24", "12/24"] + y-axis "amount" 0 --> 181 + line [0, 0, 41, 67, 181] +line [0, 0, 41, 67, 181] +line [0, 0, 16, 20, 17] +line [0, 0, 16, 20, 17] +line [0, 0, 50, 62, 83] +line [0, 0, 48, 62, 83] +``` \ No newline at end of file From 70dfa4bd5844651f112b1908bfcbbaa831dd5d36 Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 21:26:18 +0700 Subject: [PATCH 07/10] Feature: Updated collection example --- examples/collectionExample.json | 3975 +++++++++++++++++++++++-------- 1 file changed, 3032 insertions(+), 943 deletions(-) diff --git a/examples/collectionExample.json b/examples/collectionExample.json index 9de2912..3a4c571 100644 --- a/examples/collectionExample.json +++ b/examples/collectionExample.json @@ -1,1507 +1,3596 @@ { "total": { - "3/2024": { - "reviewRequestsConducted": 39, - "opened": 10, - "closed": 10, - "merged": 10, - "comments": 1, - "totalReviewComments": 5, - "additions": 387, - "deletions": 299, + "total": { + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + { + "approved": 2 + }, + null, + { + "merged": 4, + "approved": 1, + "changes_requested": 2, + "opened": 2 + }, + { + "approved": 3, + "merged": 2, + "changes_requested": 3 + }, + { + "opened": 2, + "approved": 1 + }, + { + "approved": 2 + }, + { + "opened": 5, + "approved": 2, + "merged": 2 + }, + { + "approved": 3, + "merged": 3, + "changes_requested": 1, + "opened": 2 + }, + { + "merged": 1, + "changes_requested": 1, + "opened": 2 + }, + { + "opened": 1, + "approved": 1 + }, + null, + { + "merged": 1 + } + ], + "reviewRequestsConducted": 55, + "opened": 14, + "closed": 14, + "merged": 13, + "comments": 9, + "totalReviewComments": 18, + "reverted": 1, + "additions": 2230, + "deletions": 4615, "prSizes": [ - "xs", "s", + "m", + "xl", + "s", + "l", + "l", "s", "xs", + "m", "xs", - "xs", - "s", "s", "xs", - "xs" + "m", + "m" ], "timeToReview": [ - 173, - 5, - 34, - 228, - 132, - 344, - 1445, - 1453, - 296, - 4 + 1139, + 1216, + 374, + 409, + 647, + 209, + 71, + 7, + 31, + 10, + 211, + 11, + 51 ], "timeToApprove": [ - 493, - 5, - 34, - 228, - 132, - 540, - 1445, - 1453, - 296, - 4 + 1139, + 1216, + 3159, + 409, + 647, + 209, + 71, + 7, + 923, + 10, + 381, + 11, + 151 ], "timeToMerge": [ - 1740, - 5, - 104, - 350, - 211, - 610, - 4715, - 3050, - 1867, - 20 + 1448, + 1829, + 5721, + 980, + 1641, + 453, + 1574, + 268, + 2116, + 10, + 936, + 239, + 213 ], "timeToReviewRequest": [ + 464, + 20, + 12, 5, - 5, - 30, - 89, - 5, - 17, - 80, - 25, - 20 + 34, + 225, + 6, + 6, + 23, + 6, + 6, + 6, + 9, + 38 ], "timeInDraft": [ + 464, + 20, + 12, 5, - 5, - 30, - 89, - 5, - 17, - 80, - 25, - 20 - ], + 34, + 225, + 6, + 6, + 23, + 6, + 6, + 6, + 9, + 38 + ], + "unreviewed": 1, + "unapproved": 1, + "sizes": { + "s": { + "timeToReview": [ + 1139, + 409, + 71, + 10 + ], + "timeToApprove": [ + 1139, + 409, + 71, + 10 + ], + "timeToMerge": [ + 1448, + 980, + 1574, + 10 + ], + "percentile": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 1448 + }, + "median": { + "timeToReview": 240, + "timeToApprove": 240, + "timeToMerge": 1214 + }, + "average": { + "timeToReview": 408, + "timeToApprove": 408, + "timeToMerge": 1003 + } + }, + "m": { + "timeToReview": [ + 1216, + 31, + 11, + 51 + ], + "timeToApprove": [ + 1216, + 923, + 11, + 151 + ], + "timeToMerge": [ + 1829, + 2116, + 239, + 213 + ], + "percentile": { + "timeToReview": 51, + "timeToApprove": 923, + "timeToMerge": 1829 + }, + "median": { + "timeToReview": 41, + "timeToApprove": 537, + "timeToMerge": 1034 + }, + "average": { + "timeToReview": 328, + "timeToApprove": 576, + "timeToMerge": 1100 + } + }, + "xl": { + "timeToReview": [ + 374 + ], + "timeToApprove": [ + 3159 + ], + "timeToMerge": [ + 5721 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + }, + "average": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + } + }, + "l": { + "timeToReview": [ + 647, + 209 + ], + "timeToApprove": [ + 647, + 209 + ], + "timeToMerge": [ + 1641, + 453 + ], + "percentile": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + }, + "median": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + }, + "average": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + } + }, + "xs": { + "timeToReview": [ + 7, + 211 + ], + "timeToApprove": [ + 7, + 381 + ], + "timeToMerge": [ + 268, + 936 + ], + "percentile": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + }, + "median": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + }, + "average": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + } + } + }, "pullRequestsInfo": [ { - "number": 4046, - "link": "https://github.com/owner/repo/pull/1", - "title": "PR Example", - "comments": 1, - "timeToReview": 173, - "timeToApprove": 320, - "timeToMerge": 1247 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 117, + "additions": 112, + "deletions": 25, + "timeToReview": 1139, + "timeToApprove": 0, + "timeToMerge": 309 }, { - "number": 4055, - "link": "https://github.com/owner/repo/pull/2", - "title": "PR Example", - "comments": 0, - "timeToReview": 5, + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 251, + "additions": 237, + "deletions": 70, + "timeToReview": 1216, "timeToApprove": 0, - "timeToMerge": 0 + "timeToMerge": 613 }, { - "number": 4053, - "link": "https://github.com/owner/repo/pull/3", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 714.4, + "additions": 703, + "deletions": 57, + "timeToReview": 374, + "timeToApprove": 2785, + "timeToMerge": 2562 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 34, + "sizePoints": 72.8, + "additions": 56, + "deletions": 84, + "timeToReview": 409, "timeToApprove": 0, - "timeToMerge": 70 + "timeToMerge": 571 }, { - "number": 4049, - "link": "https://github.com/owner/repo/pull/4", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 228, + "sizePoints": 602.8, + "additions": 126, + "deletions": 2384, + "timeToReview": 647, "timeToApprove": 0, - "timeToMerge": 122 + "timeToMerge": 994 }, { - "number": 4051, - "link": "https://github.com/owner/repo/pull/5", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 132, + "sizePoints": 411, + "additions": 343, + "deletions": 340, + "timeToReview": 209, "timeToApprove": 0, - "timeToMerge": 79 + "timeToMerge": 244 }, { - "number": 4048, - "link": "https://github.com/owner/repo/pull/6", - "title": "PR Example", - "comments": 2, - "timeToReview": 344, - "timeToApprove": 196, - "timeToMerge": 70 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 67.8, + "additions": 67, + "deletions": 4, + "timeToReview": 71, + "timeToApprove": 0, + "timeToMerge": 1503 }, { - "number": 4029, - "link": "https://github.com/owner/repo/pull/7", - "title": "PR Example", - "comments": 2, - "timeToReview": 1445, + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 1.2, + "additions": 1, + "deletions": 1, + "timeToReview": 7, "timeToApprove": 0, - "timeToMerge": 3270 + "timeToMerge": 261 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 6, + "sizePoints": 229, + "additions": 173, + "deletions": 280, + "timeToReview": 31, + "timeToApprove": 892, + "timeToMerge": 1193 }, { - "number": 4038, - "link": "https://github.com/owner/repo/pull/8", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 1453, + "sizePoints": 6.6, + "additions": 4, + "deletions": 13, + "timeToReview": 0, "timeToApprove": 0, - "timeToMerge": 1597 + "timeToMerge": 0 }, { - "number": 4040, - "link": "https://github.com/owner/repo/pull/9", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 296, + "sizePoints": 98.4, + "additions": 87, + "deletions": 57, + "timeToReview": 10, "timeToApprove": 0, - "timeToMerge": 1571 + "timeToMerge": 0 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 13.8, + "additions": 13, + "deletions": 4, + "timeToReview": 211, + "timeToApprove": 170, + "timeToMerge": 555 }, { - "number": 4045, - "link": "https://github.com/owner/repo/pull/10", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 4, + "sizePoints": 217.4, + "additions": 20, + "deletions": 987, + "timeToReview": 11, "timeToApprove": 0, - "timeToMerge": 16 + "timeToMerge": 228 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 349.8, + "additions": 288, + "deletions": 309, + "timeToReview": 51, + "timeToApprove": 100, + "timeToMerge": 62 } ], "reviewsConducted": { - "dev1": { - "commented": 1, - "total": 2, - "approved": 2 + "dev4": { + "approved": 4, + "total": 4, + "changes_requested": 1 }, "total": { - "commented": 2, - "total": 9, - "approved": 9, - "dismissed": 1 + "approved": 13, + "total": 13, + "changes_requested": 4 }, "dev2": { + "approved": 4, + "total": 4, + "changes_requested": 1 + }, + "dev5": { "approved": 1, "total": 1 }, - "dev3": { - "approved": 4, - "total": 4, - "dismissed": 1 + "dev1": { + "approved": 1, + "total": 1 }, - "dev4": { - "commented": 1, - "total": 2, - "approved": 2 + "dev3": { + "changes_requested": 2, + "total": 3, + "approved": 3 } }, "reviewsConductedSize": [ - "xs", "s", + "m", + "xl", + "s", + "l", + "l", "s", "xs", + "m", "xs", - "xs", - "s", "s", "xs", - "xs" + "m", + "m" + ], + "timeWaitingForRepeatedReview": [ + 49 + ], + "timeFromInitialRequestToResponse": [ + 675, + 1196, + 2934, + 362, + 404, + 613, + 65, + 1, + 8, + 4, + 300, + 205, + 2, + 13 + ], + "timeFromOpenToResponse": [ + 1139, + 1216, + 2946, + 374, + 409, + 647, + 209, + 71, + 7, + 31, + 10, + 306, + 211, + 11, + 51 ], - "discussionsTypes": {}, - "commentsConducted": 3, - "reviewComments": 3, + "timeFromRepeatedRequestToResponse": [ + 49 + ], + "reviewComments": 9, "discussions": { - "conducted": { - "total": 3, + "received": { + "total": 8, "agreed": 0, "disagreed": 0 }, - "received": { - "total": 3, + "conducted": { + "total": 8, "agreed": 0, "disagreed": 0 } }, - "reviewTimeIntervals": {}, + "commentsConducted": 9, + "reviewTimeIntervals": { + "0-2": 6, + "2-4": 2, + "4-8": 2, + "8-12": 1, + "12-16": 0, + "16-24": 2, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 200, - "timeToApprove": 262, - "timeToMerge": 480, - "timeToReviewRequest": 20, - "timeInDraft": 20 + "timeToReview": 209, + "timeToApprove": 381, + "timeToMerge": 980, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 252, + "timeFromOpenToResponse": 211, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 49 }, "percentile": { - "timeToReview": 320, - "timeToApprove": 516, - "timeToMerge": 1803, + "timeToReview": 400, + "timeToApprove": 854, + "timeToMerge": 1624, "timeToReviewRequest": 28, - "timeInDraft": 28 + "timeInDraft": 28, + "timeFromInitialRequestToResponse": 508, + "timeFromOpenToResponse": 468, + "timeFromRepeatedRequestToResponse": null, + "timeWaitingForRepeatedReview": null }, "average": { - "timeToReview": 412, - "timeToApprove": 463, - "timeToMerge": 1268, - "timeToReviewRequest": 31, - "timeInDraft": 31 + "timeToReview": 338, + "timeToApprove": 641, + "timeToMerge": 1341, + "timeToReviewRequest": 62, + "timeInDraft": 62, + "timeFromInitialRequestToResponse": 485, + "timeFromOpenToResponse": 510, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 49 } }, - "total": { - "reviewRequestsConducted": 39, - "opened": 10, - "closed": 10, - "merged": 10, - "comments": 1, - "totalReviewComments": 5, - "additions": 387, - "deletions": 299, + "10/2024": { + "reviewRequestsConducted": 55, + "opened": 14, + "closed": 14, + "merged": 13, + "comments": 9, + "totalReviewComments": 18, + "reverted": 1, + "additions": 2230, + "deletions": 4615, "prSizes": [ - "xs", "s", + "m", + "xl", + "s", + "l", + "l", "s", "xs", + "m", "xs", - "xs", - "s", "s", "xs", - "xs" + "m", + "m" ], "timeToReview": [ - 173, - 5, - 34, - 228, - 132, - 344, - 1445, - 1453, - 296, - 4 + 1139, + 1216, + 374, + 409, + 647, + 209, + 71, + 7, + 31, + 10, + 211, + 11, + 51 ], "timeToApprove": [ - 493, - 5, - 34, - 228, - 132, - 540, - 1445, - 1453, - 296, - 4 + 1139, + 1216, + 3159, + 409, + 647, + 209, + 71, + 7, + 923, + 10, + 381, + 11, + 151 ], "timeToMerge": [ - 1740, - 5, - 104, - 350, - 211, - 610, - 4715, - 3050, - 1867, - 20 + 1448, + 1829, + 5721, + 980, + 1641, + 453, + 1574, + 268, + 2116, + 10, + 936, + 239, + 213 ], "timeToReviewRequest": [ + 464, + 20, + 12, 5, - 5, - 30, - 89, - 5, - 17, - 80, - 25, - 20 + 34, + 225, + 6, + 6, + 23, + 6, + 6, + 6, + 9, + 38 ], "timeInDraft": [ + 464, + 20, + 12, 5, - 5, - 30, - 89, - 5, - 17, - 80, - 25, - 20 - ], + 34, + 225, + 6, + 6, + 23, + 6, + 6, + 6, + 9, + 38 + ], + "unreviewed": 1, + "unapproved": 1, + "sizes": { + "s": { + "timeToReview": [ + 1139, + 409, + 71, + 10 + ], + "timeToApprove": [ + 1139, + 409, + 71, + 10 + ], + "timeToMerge": [ + 1448, + 980, + 1574, + 10 + ], + "percentile": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 1448 + }, + "median": { + "timeToReview": 240, + "timeToApprove": 240, + "timeToMerge": 1214 + }, + "average": { + "timeToReview": 408, + "timeToApprove": 408, + "timeToMerge": 1003 + } + }, + "m": { + "timeToReview": [ + 1216, + 31, + 11, + 51 + ], + "timeToApprove": [ + 1216, + 923, + 11, + 151 + ], + "timeToMerge": [ + 1829, + 2116, + 239, + 213 + ], + "percentile": { + "timeToReview": 51, + "timeToApprove": 923, + "timeToMerge": 1829 + }, + "median": { + "timeToReview": 41, + "timeToApprove": 537, + "timeToMerge": 1034 + }, + "average": { + "timeToReview": 328, + "timeToApprove": 576, + "timeToMerge": 1100 + } + }, + "xl": { + "timeToReview": [ + 374 + ], + "timeToApprove": [ + 3159 + ], + "timeToMerge": [ + 5721 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + }, + "average": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + } + }, + "l": { + "timeToReview": [ + 647, + 209 + ], + "timeToApprove": [ + 647, + 209 + ], + "timeToMerge": [ + 1641, + 453 + ], + "percentile": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + }, + "median": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + }, + "average": { + "timeToReview": 428, + "timeToApprove": 428, + "timeToMerge": 1047 + } + }, + "xs": { + "timeToReview": [ + 7, + 211 + ], + "timeToApprove": [ + 7, + 381 + ], + "timeToMerge": [ + 268, + 936 + ], + "percentile": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + }, + "median": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + }, + "average": { + "timeToReview": 109, + "timeToApprove": 194, + "timeToMerge": 602 + } + } + }, "pullRequestsInfo": [ { - "number": 4046, - "link": "https://github.com/owner/repo/pull/11", - "title": "PR Example", - "comments": 1, - "timeToReview": 173, - "timeToApprove": 320, - "timeToMerge": 1247 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 117, + "additions": 112, + "deletions": 25, + "timeToReview": 1139, + "timeToApprove": 0, + "timeToMerge": 309 }, { - "number": 4055, - "link": "https://github.com/owner/repo/pull/12", - "title": "PR Example", - "comments": 0, - "timeToReview": 5, + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 251, + "additions": 237, + "deletions": 70, + "timeToReview": 1216, "timeToApprove": 0, - "timeToMerge": 0 + "timeToMerge": 613 }, { - "number": 4053, - "link": "https://github.com/owner/repo/pull/13", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 714.4, + "additions": 703, + "deletions": 57, + "timeToReview": 374, + "timeToApprove": 2785, + "timeToMerge": 2562 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 34, + "sizePoints": 72.8, + "additions": 56, + "deletions": 84, + "timeToReview": 409, "timeToApprove": 0, - "timeToMerge": 70 + "timeToMerge": 571 }, { - "number": 4049, - "link": "https://github.com/owner/repo/pull/14", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 228, + "sizePoints": 602.8, + "additions": 126, + "deletions": 2384, + "timeToReview": 647, "timeToApprove": 0, - "timeToMerge": 122 + "timeToMerge": 994 }, { - "number": 4051, - "link": "https://github.com/owner/repo/pull/15", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 132, + "sizePoints": 411, + "additions": 343, + "deletions": 340, + "timeToReview": 209, "timeToApprove": 0, - "timeToMerge": 79 + "timeToMerge": 244 }, { - "number": 4048, - "link": "https://github.com/owner/repo/pull/16", - "title": "PR Example", - "comments": 2, - "timeToReview": 344, - "timeToApprove": 196, - "timeToMerge": 70 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 67.8, + "additions": 67, + "deletions": 4, + "timeToReview": 71, + "timeToApprove": 0, + "timeToMerge": 1503 }, { - "number": 4029, - "link": "https://github.com/owner/repo/pull/17", - "title": "PR Example", - "comments": 2, - "timeToReview": 1445, + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 1.2, + "additions": 1, + "deletions": 1, + "timeToReview": 7, "timeToApprove": 0, - "timeToMerge": 3270 + "timeToMerge": 261 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 6, + "sizePoints": 229, + "additions": 173, + "deletions": 280, + "timeToReview": 31, + "timeToApprove": 892, + "timeToMerge": 1193 }, { - "number": 4038, - "link": "https://github.com/owner/repo/pull/18", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 1453, + "sizePoints": 6.6, + "additions": 4, + "deletions": 13, + "timeToReview": 0, "timeToApprove": 0, - "timeToMerge": 1597 + "timeToMerge": 0 }, { - "number": 4040, - "link": "https://github.com/owner/repo/pull/19", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 296, + "sizePoints": 98.4, + "additions": 87, + "deletions": 57, + "timeToReview": 10, "timeToApprove": 0, - "timeToMerge": 1571 + "timeToMerge": 0 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 13.8, + "additions": 13, + "deletions": 4, + "timeToReview": 211, + "timeToApprove": 170, + "timeToMerge": 555 }, { - "number": 4045, - "link": "https://github.com/owner/repo/pull/20", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 4, + "sizePoints": 217.4, + "additions": 20, + "deletions": 987, + "timeToReview": 11, "timeToApprove": 0, - "timeToMerge": 16 + "timeToMerge": 228 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 349.8, + "additions": 288, + "deletions": 309, + "timeToReview": 51, + "timeToApprove": 100, + "timeToMerge": 62 } ], "reviewsConducted": { - "dev1": { - "commented": 1, - "total": 2, - "approved": 2 + "dev4": { + "approved": 4, + "total": 4, + "changes_requested": 1 }, "total": { - "commented": 2, - "total": 9, - "approved": 9, - "dismissed": 1 + "approved": 13, + "total": 13, + "changes_requested": 4 }, "dev2": { + "approved": 4, + "total": 4, + "changes_requested": 1 + }, + "dev5": { "approved": 1, "total": 1 }, - "dev3": { - "approved": 4, - "total": 4, - "dismissed": 1 + "dev1": { + "approved": 1, + "total": 1 }, - "dev4": { - "commented": 1, - "total": 2, - "approved": 2 + "dev3": { + "changes_requested": 2, + "total": 3, + "approved": 3 } }, "reviewsConductedSize": [ - "xs", "s", + "m", + "xl", + "s", + "l", + "l", "s", "xs", + "m", "xs", - "xs", - "s", "s", "xs", - "xs" + "m", + "m" + ], + "timeWaitingForRepeatedReview": [ + 49 + ], + "timeFromInitialRequestToResponse": [ + 675, + 1196, + 2934, + 362, + 404, + 613, + 65, + 1, + 8, + 4, + 300, + 205, + 2, + 13 + ], + "timeFromOpenToResponse": [ + 1139, + 1216, + 2946, + 374, + 409, + 647, + 209, + 71, + 7, + 31, + 10, + 306, + 211, + 11, + 51 ], - "discussionsTypes": {}, - "commentsConducted": 3, - "reviewComments": 3, + "timeFromRepeatedRequestToResponse": [ + 49 + ], + "reviewComments": 9, "discussions": { - "conducted": { - "total": 3, + "received": { + "total": 8, "agreed": 0, "disagreed": 0 }, - "received": { - "total": 3, + "conducted": { + "total": 8, "agreed": 0, "disagreed": 0 } }, - "reviewTimeIntervals": {}, + "commentsConducted": 9, + "reviewTimeIntervals": { + "0-2": 6, + "2-4": 2, + "4-8": 2, + "8-12": 1, + "12-16": 0, + "16-24": 2, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 200, - "timeToApprove": 262, - "timeToMerge": 480, - "timeToReviewRequest": 20, - "timeInDraft": 20 + "timeToReview": 209, + "timeToApprove": 381, + "timeToMerge": 980, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 252, + "timeFromOpenToResponse": 211, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 49 }, "percentile": { - "timeToReview": 320, - "timeToApprove": 516, - "timeToMerge": 1803, + "timeToReview": 400, + "timeToApprove": 854, + "timeToMerge": 1624, "timeToReviewRequest": 28, - "timeInDraft": 28 + "timeInDraft": 28, + "timeFromInitialRequestToResponse": 508, + "timeFromOpenToResponse": 468, + "timeFromRepeatedRequestToResponse": null, + "timeWaitingForRepeatedReview": null }, "average": { - "timeToReview": 412, - "timeToApprove": 463, - "timeToMerge": 1268, - "timeToReviewRequest": 31, - "timeInDraft": 31 + "timeToReview": 338, + "timeToApprove": 641, + "timeToMerge": 1341, + "timeToReviewRequest": 62, + "timeInDraft": 62, + "timeFromInitialRequestToResponse": 485, + "timeFromOpenToResponse": 510, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 49 } } }, - "dev1": { + "dev2": { "total": { - "opened": 3, - "closed": 3, - "merged": 3, + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + { + "approved": 1 + }, + null, + { + "merged": 1, + "approved": 1 + }, + { + "approved": 1, + "merged": 1 + }, + null, + null, + { + "opened": 3, + "approved": 1 + }, + { + "merged": 1, + "opened": 1 + }, + { + "opened": 1 + }, + null, + null, + { + "merged": 1 + } + ], + "reviewRequestsConducted": 8, + "reviewsConducted": { + "dev4": { + "approved": 3, + "total": 3 + }, + "total": { + "approved": 4, + "total": 4 + }, + "dev3": { + "approved": 1, + "total": 1 + } + }, + "reviewsConductedSize": [ + "s", + "l", + "s", + "xs" + ], + "timeFromInitialRequestToResponse": [ + 675, + 4, + 205 + ], + "timeFromOpenToResponse": [ + 1139, + 209, + 10, + 211 + ], + "timeFromRepeatedRequestToResponse": [], + "opened": 5, + "closed": 5, + "merged": 4, "comments": 0, - "totalReviewComments": 1, - "additions": 187, - "deletions": 116, + "totalReviewComments": 6, + "reverted": 1, + "additions": 1001, + "deletions": 225, "prSizes": [ - "xs", + "m", + "xl", "s", - "s" + "xs", + "xs" ], "timeToReview": [ - 173, - 5, - 1453 + 1216, + 374, + 409, + 7 ], "timeToApprove": [ - 493, - 5, - 1453 + 1216, + 3159, + 409, + 7 ], "timeToMerge": [ - 1740, - 5, - 3050 + 1829, + 5721, + 980, + 268 ], "timeToReviewRequest": [ + 20, + 12, 5, - 5, - 80 + 6, + 6 ], "timeInDraft": [ + 20, + 12, 5, - 5, - 80 - ], + 6, + 6 + ], + "unreviewed": 1, + "unapproved": 1, + "sizes": { + "m": { + "timeToReview": [ + 1216 + ], + "timeToApprove": [ + 1216 + ], + "timeToMerge": [ + 1829 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 1216, + "timeToApprove": 1216, + "timeToMerge": 1829 + }, + "average": { + "timeToReview": 1216, + "timeToApprove": 1216, + "timeToMerge": 1829 + } + }, + "xl": { + "timeToReview": [ + 374 + ], + "timeToApprove": [ + 3159 + ], + "timeToMerge": [ + 5721 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + }, + "average": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + } + }, + "s": { + "timeToReview": [ + 409 + ], + "timeToApprove": [ + 409 + ], + "timeToMerge": [ + 980 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 980 + }, + "average": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 980 + } + }, + "xs": { + "timeToReview": [ + 7 + ], + "timeToApprove": [ + 7 + ], + "timeToMerge": [ + 268 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 7, + "timeToApprove": 7, + "timeToMerge": 268 + }, + "average": { + "timeToReview": 7, + "timeToApprove": 7, + "timeToMerge": 268 + } + } + }, "pullRequestsInfo": [ { - "number": 4046, - "link": "https://github.com/owner/repo/pull/21", - "title": "PR Example", - "comments": 1, - "timeToReview": 173, - "timeToApprove": 320, - "timeToMerge": 1247 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 251, + "additions": 237, + "deletions": 70, + "timeToReview": 1216, + "timeToApprove": 0, + "timeToMerge": 613 }, { - "number": 4055, - "link": "https://github.com/owner/repo/pull/22", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 714.4, + "additions": 703, + "deletions": 57, + "timeToReview": 374, + "timeToApprove": 2785, + "timeToMerge": 2562 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 5, + "sizePoints": 72.8, + "additions": 56, + "deletions": 84, + "timeToReview": 409, "timeToApprove": 0, - "timeToMerge": 0 + "timeToMerge": 571 }, { - "number": 4038, - "link": "https://github.com/owner/repo/pull/23", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 1453, + "sizePoints": 1.2, + "additions": 1, + "deletions": 1, + "timeToReview": 7, "timeToApprove": 0, - "timeToMerge": 1597 + "timeToMerge": 261 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 6.6, + "additions": 4, + "deletions": 13, + "timeToReview": 0, + "timeToApprove": 0, + "timeToMerge": 0 } ], - "discussionsTypes": {}, - "reviewComments": 1, + "timeWaitingForRepeatedReview": [], + "reviewComments": 3, "discussions": { "received": { - "total": 1, + "total": 3, "agreed": 0, "disagreed": 0 } }, - "reviewRequestsConducted": 7, - "reviewsConducted": { - "dev2": { - "approved": 1, - "total": 1 - }, - "total": { - "approved": 1, - "total": 1 - } + "reviewTimeIntervals": { + "0-2": 1, + "2-4": 0, + "4-8": 2, + "8-12": 0, + "12-16": 0, + "16-24": 1, + "24-Infinity": 0 }, - "reviewsConductedSize": [ - "s" - ], - "reviewTimeIntervals": {}, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 173, - "timeToApprove": 493, - "timeToMerge": 1740, - "timeToReviewRequest": 5, - "timeInDraft": 5 + "timeToReview": 391, + "timeToApprove": 812, + "timeToMerge": 1404, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 205, + "timeFromOpenToResponse": 210, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 493, - "timeToApprove": 733, - "timeToMerge": 2067, - "timeToReviewRequest": 23, - "timeInDraft": 23 + "timeToReview": 409, + "timeToApprove": 1216, + "timeToMerge": 1829, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 322, + "timeFromOpenToResponse": 211, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 544, - "timeToApprove": 651, - "timeToMerge": 1599, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 502, + "timeToApprove": 1198, + "timeToMerge": 2200, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 295, + "timeFromOpenToResponse": 393, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } }, - "3/2024": { - "opened": 3, - "closed": 3, - "merged": 3, + "10/2024": { + "reviewRequestsConducted": 8, + "reviewsConducted": { + "dev4": { + "approved": 3, + "total": 3 + }, + "total": { + "approved": 4, + "total": 4 + }, + "dev3": { + "approved": 1, + "total": 1 + } + }, + "reviewsConductedSize": [ + "s", + "l", + "s", + "xs" + ], + "timeFromInitialRequestToResponse": [ + 675, + 4, + 205 + ], + "timeFromOpenToResponse": [ + 1139, + 209, + 10, + 211 + ], + "timeFromRepeatedRequestToResponse": [], + "opened": 5, + "closed": 5, + "merged": 4, "comments": 0, - "totalReviewComments": 1, - "additions": 187, - "deletions": 116, + "totalReviewComments": 6, + "reverted": 1, + "additions": 1001, + "deletions": 225, "prSizes": [ - "xs", + "m", + "xl", "s", - "s" + "xs", + "xs" ], "timeToReview": [ - 173, - 5, - 1453 + 1216, + 374, + 409, + 7 ], "timeToApprove": [ - 493, - 5, - 1453 + 1216, + 3159, + 409, + 7 ], "timeToMerge": [ - 1740, - 5, - 3050 + 1829, + 5721, + 980, + 268 ], "timeToReviewRequest": [ + 20, + 12, 5, - 5, - 80 + 6, + 6 ], "timeInDraft": [ + 20, + 12, 5, - 5, - 80 - ], + 6, + 6 + ], + "unreviewed": 1, + "unapproved": 1, + "sizes": { + "m": { + "timeToReview": [ + 1216 + ], + "timeToApprove": [ + 1216 + ], + "timeToMerge": [ + 1829 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 1216, + "timeToApprove": 1216, + "timeToMerge": 1829 + }, + "average": { + "timeToReview": 1216, + "timeToApprove": 1216, + "timeToMerge": 1829 + } + }, + "xl": { + "timeToReview": [ + 374 + ], + "timeToApprove": [ + 3159 + ], + "timeToMerge": [ + 5721 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + }, + "average": { + "timeToReview": 374, + "timeToApprove": 3159, + "timeToMerge": 5721 + } + }, + "s": { + "timeToReview": [ + 409 + ], + "timeToApprove": [ + 409 + ], + "timeToMerge": [ + 980 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 980 + }, + "average": { + "timeToReview": 409, + "timeToApprove": 409, + "timeToMerge": 980 + } + }, + "xs": { + "timeToReview": [ + 7 + ], + "timeToApprove": [ + 7 + ], + "timeToMerge": [ + 268 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 7, + "timeToApprove": 7, + "timeToMerge": 268 + }, + "average": { + "timeToReview": 7, + "timeToApprove": 7, + "timeToMerge": 268 + } + } + }, "pullRequestsInfo": [ { - "number": 4046, - "link": "https://github.com/owner/repo/pull/25", - "title": "PR Example", - "comments": 1, - "timeToReview": 173, - "timeToApprove": 320, - "timeToMerge": 1247 + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 251, + "additions": 237, + "deletions": 70, + "timeToReview": 1216, + "timeToApprove": 0, + "timeToMerge": 613 }, { - "number": 4055, - "link": "https://github.com/owner/repo/pull/26", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 714.4, + "additions": 703, + "deletions": 57, + "timeToReview": 374, + "timeToApprove": 2785, + "timeToMerge": 2562 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 5, + "sizePoints": 72.8, + "additions": 56, + "deletions": 84, + "timeToReview": 409, "timeToApprove": 0, - "timeToMerge": 0 + "timeToMerge": 571 }, { - "number": 4038, - "link": "https://github.com/owner/repo/pull/27", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 1453, + "sizePoints": 1.2, + "additions": 1, + "deletions": 1, + "timeToReview": 7, "timeToApprove": 0, - "timeToMerge": 1597 + "timeToMerge": 261 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 6.6, + "additions": 4, + "deletions": 13, + "timeToReview": 0, + "timeToApprove": 0, + "timeToMerge": 0 } ], - "discussionsTypes": {}, - "reviewComments": 1, + "timeWaitingForRepeatedReview": [], + "reviewComments": 3, "discussions": { "received": { - "total": 1, + "total": 3, "agreed": 0, "disagreed": 0 } }, - "reviewRequestsConducted": 7, - "reviewsConducted": { - "dev2": { - "approved": 1, - "total": 1 - }, - "total": { - "approved": 1, - "total": 1 - } + "reviewTimeIntervals": { + "0-2": 1, + "2-4": 0, + "4-8": 2, + "8-12": 0, + "12-16": 0, + "16-24": 1, + "24-Infinity": 0 }, - "reviewsConductedSize": [ - "s" - ], - "reviewTimeIntervals": {}, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 173, - "timeToApprove": 493, - "timeToMerge": 1740, - "timeToReviewRequest": 5, - "timeInDraft": 5 + "timeToReview": 391, + "timeToApprove": 812, + "timeToMerge": 1404, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 205, + "timeFromOpenToResponse": 210, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 493, - "timeToApprove": 733, - "timeToMerge": 2067, - "timeToReviewRequest": 23, - "timeInDraft": 23 + "timeToReview": 409, + "timeToApprove": 1216, + "timeToMerge": 1829, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 322, + "timeFromOpenToResponse": 211, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 544, - "timeToApprove": 651, - "timeToMerge": 1599, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 502, + "timeToApprove": 1198, + "timeToMerge": 2200, + "timeToReviewRequest": 10, + "timeInDraft": 10, + "timeFromInitialRequestToResponse": 295, + "timeFromOpenToResponse": 393, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } } }, - "dev3": { - "3/2024": { - "reviewRequestsConducted": 6, - "reviewsConducted": { - "dev1": { - "commented": 1, - "total": 1, - "approved": 1 + "dev4": { + "total": { + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + { + "opened": 1 }, - "total": { - "commented": 1, - "total": 1, + null, + { + "opened": 1, "approved": 1 + }, + null, + { + "opened": 1, + "merged": 2 + }, + { + "approved": 1, + "merged": 1 + }, + { + "merged": 1 + }, + { + "opened": 1 + } + ], + "opened": 4, + "closed": 4, + "merged": 4, + "comments": 1, + "totalReviewComments": 2, + "reverted": 0, + "additions": 830, + "deletions": 731, + "prSizes": [ + "s", + "l", + "s", + "m" + ], + "timeToReview": [ + 1139, + 209, + 10, + 51 + ], + "timeToApprove": [ + 1139, + 209, + 10, + 151 + ], + "timeToMerge": [ + 1448, + 453, + 10, + 213 + ], + "timeToReviewRequest": [ + 464, + 225, + 6, + 38 + ], + "timeInDraft": [ + 464, + 225, + 6, + 38 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "s": { + "timeToReview": [ + 1139, + 10 + ], + "timeToApprove": [ + 1139, + 10 + ], + "timeToMerge": [ + 1448, + 10 + ], + "percentile": { + "timeToReview": 574, + "timeToApprove": 574, + "timeToMerge": 729 + }, + "median": { + "timeToReview": 574, + "timeToApprove": 574, + "timeToMerge": 729 + }, + "average": { + "timeToReview": 575, + "timeToApprove": 575, + "timeToMerge": 729 + } + }, + "l": { + "timeToReview": [ + 209 + ], + "timeToApprove": [ + 209 + ], + "timeToMerge": [ + 453 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453 + }, + "average": { + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453 + } + }, + "m": { + "timeToReview": [ + 51 + ], + "timeToApprove": [ + 151 + ], + "timeToMerge": [ + 213 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 51, + "timeToApprove": 151, + "timeToMerge": 213 + }, + "average": { + "timeToReview": 51, + "timeToApprove": 151, + "timeToMerge": 213 + } } }, - "reviewsConductedSize": [ - "xs" + "pullRequestsInfo": [ + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 117, + "additions": 112, + "deletions": 25, + "timeToReview": 1139, + "timeToApprove": 0, + "timeToMerge": 309 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 411, + "additions": 343, + "deletions": 340, + "timeToReview": 209, + "timeToApprove": 0, + "timeToMerge": 244 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 98.4, + "additions": 87, + "deletions": 57, + "timeToReview": 10, + "timeToApprove": 0, + "timeToMerge": 0 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 349.8, + "additions": 288, + "deletions": 309, + "timeToReview": 51, + "timeToApprove": 100, + "timeToMerge": 62 + } ], - "discussionsTypes": {}, - "commentsConducted": 1, + "timeWaitingForRepeatedReview": [ + 49 + ], + "reviewComments": 1, "discussions": { - "conducted": { + "received": { "total": 1, "agreed": 0, "disagreed": 0 }, - "received": { + "conducted": { "total": 1, "agreed": 0, "disagreed": 0 } }, + "reviewRequestsConducted": 10, + "reviewsConducted": { + "dev2": { + "approved": 2, + "total": 2 + }, + "total": { + "approved": 2, + "total": 2 + } + }, + "reviewsConductedSize": [ + "m", + "xl" + ], + "timeFromInitialRequestToResponse": [ + 1196, + 362 + ], + "timeFromOpenToResponse": [ + 1216, + 374 + ], + "timeFromRepeatedRequestToResponse": [], + "commentsConducted": 1, + "reviewTimeIntervals": { + "0-2": 2, + "2-4": 1, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 1, + "24-Infinity": 0 + }, + "approvalTimeIntervals": {}, + "mergeTimeIntervals": {}, + "median": { + "timeToReview": 130, + "timeToApprove": 180, + "timeToMerge": 333, + "timeToReviewRequest": 131, + "timeInDraft": 131, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 49 + }, + "percentile": { + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453, + "timeToReviewRequest": 225, + "timeInDraft": 225, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": null + }, + "average": { + "timeToReview": 353, + "timeToApprove": 378, + "timeToMerge": 531, + "timeToReviewRequest": 184, + "timeInDraft": 184, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 49 + } + }, + "10/2024": { "opened": 4, "closed": 4, "merged": 4, "comments": 1, "totalReviewComments": 2, - "additions": 77, - "deletions": 15, + "reverted": 0, + "additions": 830, + "deletions": 731, "prSizes": [ - "xs", - "xs", - "xs", - "xs" + "s", + "l", + "s", + "m" ], "timeToReview": [ - 228, - 132, - 344, - 296 + 1139, + 209, + 10, + 51 ], "timeToApprove": [ - 228, - 132, - 540, - 296 + 1139, + 209, + 10, + 151 ], "timeToMerge": [ - 350, - 211, - 610, - 1867 + 1448, + 453, + 10, + 213 ], "timeToReviewRequest": [ - 89, - 5, - 25 + 464, + 225, + 6, + 38 ], "timeInDraft": [ - 89, - 5, - 25 - ], + 464, + 225, + 6, + 38 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "s": { + "timeToReview": [ + 1139, + 10 + ], + "timeToApprove": [ + 1139, + 10 + ], + "timeToMerge": [ + 1448, + 10 + ], + "percentile": { + "timeToReview": 574, + "timeToApprove": 574, + "timeToMerge": 729 + }, + "median": { + "timeToReview": 574, + "timeToApprove": 574, + "timeToMerge": 729 + }, + "average": { + "timeToReview": 575, + "timeToApprove": 575, + "timeToMerge": 729 + } + }, + "l": { + "timeToReview": [ + 209 + ], + "timeToApprove": [ + 209 + ], + "timeToMerge": [ + 453 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453 + }, + "average": { + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453 + } + }, + "m": { + "timeToReview": [ + 51 + ], + "timeToApprove": [ + 151 + ], + "timeToMerge": [ + 213 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 51, + "timeToApprove": 151, + "timeToMerge": 213 + }, + "average": { + "timeToReview": 51, + "timeToApprove": 151, + "timeToMerge": 213 + } + } + }, "pullRequestsInfo": [ { - "number": 4049, - "link": "https://github.com/owner/repo/pull/28", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 228, + "sizePoints": 117, + "additions": 112, + "deletions": 25, + "timeToReview": 1139, "timeToApprove": 0, - "timeToMerge": 122 + "timeToMerge": 309 }, { - "number": 4051, - "link": "https://github.com/owner/repo/pull/29", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 132, + "sizePoints": 411, + "additions": 343, + "deletions": 340, + "timeToReview": 209, "timeToApprove": 0, - "timeToMerge": 79 - }, - { - "number": 4048, - "link": "https://github.com/owner/repo/pull/30", - "title": "PR Example", - "comments": 2, - "timeToReview": 344, - "timeToApprove": 196, - "timeToMerge": 70 + "timeToMerge": 244 }, { - "number": 4040, - "link": "https://github.com/owner/repo/pull/31", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 296, + "sizePoints": 98.4, + "additions": 87, + "deletions": 57, + "timeToReview": 10, "timeToApprove": 0, - "timeToMerge": 1571 + "timeToMerge": 0 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 2, + "sizePoints": 349.8, + "additions": 288, + "deletions": 309, + "timeToReview": 51, + "timeToApprove": 100, + "timeToMerge": 62 } ], + "timeWaitingForRepeatedReview": [ + 49 + ], "reviewComments": 1, - "reviewTimeIntervals": {}, + "discussions": { + "received": { + "total": 1, + "agreed": 0, + "disagreed": 0 + }, + "conducted": { + "total": 1, + "agreed": 0, + "disagreed": 0 + } + }, + "reviewRequestsConducted": 10, + "reviewsConducted": { + "dev2": { + "approved": 2, + "total": 2 + }, + "total": { + "approved": 2, + "total": 2 + } + }, + "reviewsConductedSize": [ + "m", + "xl" + ], + "timeFromInitialRequestToResponse": [ + 1196, + 362 + ], + "timeFromOpenToResponse": [ + 1216, + 374 + ], + "timeFromRepeatedRequestToResponse": [], + "commentsConducted": 1, + "reviewTimeIntervals": { + "0-2": 2, + "2-4": 1, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 1, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 262, - "timeToApprove": 262, - "timeToMerge": 480, - "timeToReviewRequest": 25, - "timeInDraft": 25 + "timeToReview": 130, + "timeToApprove": 180, + "timeToMerge": 333, + "timeToReviewRequest": 131, + "timeInDraft": 131, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 49 }, "percentile": { - "timeToReview": 296, - "timeToApprove": 296, - "timeToMerge": 610, - "timeToReviewRequest": 41, - "timeInDraft": 41 + "timeToReview": 209, + "timeToApprove": 209, + "timeToMerge": 453, + "timeToReviewRequest": 225, + "timeInDraft": 225, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": null }, "average": { - "timeToReview": 250, - "timeToApprove": 299, - "timeToMerge": 760, - "timeToReviewRequest": 40, - "timeInDraft": 40 + "timeToReview": 353, + "timeToApprove": 378, + "timeToMerge": 531, + "timeToReviewRequest": 184, + "timeInDraft": 184, + "timeFromInitialRequestToResponse": 779, + "timeFromOpenToResponse": 795, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 49 } - }, - "total": { - "reviewRequestsConducted": 6, + } + }, + "dev1": { + "10/2024": { + "reviewRequestsConducted": 13, + "timeFromInitialRequestToResponse": [ + 2934, + 404, + 613, + 8, + 300, + 2, + 13 + ], + "timeFromOpenToResponse": [ + 2946, + 409, + 647, + 31, + 306, + 11, + 51 + ], + "timeFromRepeatedRequestToResponse": [ + 49 + ], "reviewsConducted": { - "dev1": { - "commented": 1, - "total": 1, - "approved": 1 + "dev2": { + "changes_requested": 1, + "total": 2, + "approved": 2 }, "total": { - "commented": 1, + "changes_requested": 4, + "total": 7, + "approved": 7 + }, + "dev5": { + "approved": 1, + "total": 1 + }, + "dev3": { + "changes_requested": 2, + "total": 3, + "approved": 3 + }, + "dev4": { + "changes_requested": 1, "total": 1, "approved": 1 } }, "reviewsConductedSize": [ - "xs" + "xl", + "s", + "l", + "m", + "xs", + "m", + "m" ], - "discussionsTypes": {}, - "commentsConducted": 1, + "commentsConducted": 8, "discussions": { "conducted": { - "total": 1, + "total": 7, "agreed": 0, "disagreed": 0 }, "received": { - "total": 1, + "total": 0, "agreed": 0, "disagreed": 0 } }, - "opened": 4, - "closed": 4, - "merged": 4, + "opened": 1, + "closed": 1, + "merged": 1, "comments": 1, - "totalReviewComments": 2, - "additions": 77, - "deletions": 15, + "totalReviewComments": 0, + "reverted": 0, + "additions": 67, + "deletions": 4, "prSizes": [ - "xs", - "xs", - "xs", - "xs" + "s" ], "timeToReview": [ - 228, - 132, - 344, - 296 + 71 ], "timeToApprove": [ - 228, - 132, - 540, - 296 + 71 ], "timeToMerge": [ - 350, - 211, - 610, - 1867 + 1574 ], "timeToReviewRequest": [ - 89, - 5, - 25 + 6 ], "timeInDraft": [ - 89, - 5, - 25 - ], + 6 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "s": { + "timeToReview": [ + 71 + ], + "timeToApprove": [ + 71 + ], + "timeToMerge": [ + 1574 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574 + }, + "average": { + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574 + } + } + }, "pullRequestsInfo": [ { - "number": 4049, - "link": "https://github.com/owner/repo/pull/32", - "title": "PR Example", - "comments": 0, - "timeToReview": 228, - "timeToApprove": 0, - "timeToMerge": 122 - }, - { - "number": 4051, - "link": "https://github.com/owner/repo/pull/33", - "title": "PR Example", - "comments": 0, - "timeToReview": 132, - "timeToApprove": 0, - "timeToMerge": 79 - }, - { - "number": 4048, - "link": "https://github.com/owner/repo/pull/34", - "title": "PR Example", - "comments": 2, - "timeToReview": 344, - "timeToApprove": 196, - "timeToMerge": 70 - }, - { - "number": 4040, - "link": "https://github.com/owner/repo/pull/35", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 296, + "sizePoints": 67.8, + "additions": 67, + "deletions": 4, + "timeToReview": 71, "timeToApprove": 0, - "timeToMerge": 1571 + "timeToMerge": 1503 } ], - "reviewComments": 1, - "reviewTimeIntervals": {}, + "timeWaitingForRepeatedReview": [], + "reviewComments": 0, + "reviewTimeIntervals": { + "0-2": 1, + "2-4": 0, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 262, - "timeToApprove": 262, - "timeToMerge": 480, - "timeToReviewRequest": 25, - "timeInDraft": 25 + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 300, + "timeFromOpenToResponse": 306, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 296, - "timeToApprove": 296, - "timeToMerge": 610, - "timeToReviewRequest": 41, - "timeInDraft": 41 + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null, + "timeToReviewRequest": null, + "timeInDraft": null, + "timeFromInitialRequestToResponse": 456, + "timeFromOpenToResponse": 468, + "timeFromRepeatedRequestToResponse": null, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 250, - "timeToApprove": 299, - "timeToMerge": 760, - "timeToReviewRequest": 40, - "timeInDraft": 40 + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 611, + "timeFromOpenToResponse": 629, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 0 } - } - }, - "dev2": { - "3/2024": { - "reviewRequestsConducted": 9, - "reviewsConducted": { - "dev1": { - "approved": 1, - "total": 1 + }, + "total": { + "reviewRequestsConducted": 13, + "timeFromInitialRequestToResponse": [ + 2934, + 404, + 613, + 8, + 300, + 2, + 13 + ], + "timeFromOpenToResponse": [ + 2946, + 409, + 647, + 31, + 306, + 11, + 51 + ], + "timeFromRepeatedRequestToResponse": [ + 49 + ], + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + { + "approved": 1 + }, + null, + { + "merged": 1, + "changes_requested": 2 + }, + { + "approved": 2, + "changes_requested": 3 + }, + null, + { + "approved": 2 + }, + { + "opened": 1 + }, + { + "changes_requested": 1, + "approved": 1 + }, + { + "changes_requested": 1 + }, + { + "approved": 1 + } + ], + "reviewsConducted": { + "dev2": { + "changes_requested": 1, + "total": 2, + "approved": 2 }, "total": { - "approved": 4, - "total": 4, - "dismissed": 1 + "changes_requested": 4, + "total": 7, + "approved": 7 + }, + "dev5": { + "approved": 1, + "total": 1 }, "dev3": { - "approved": 3, + "changes_requested": 2, "total": 3, - "dismissed": 1 + "approved": 3 + }, + "dev4": { + "changes_requested": 1, + "total": 1, + "approved": 1 } }, "reviewsConductedSize": [ + "xl", + "s", + "l", + "m", "xs", - "xs", - "xs", - "xs" + "m", + "m" ], + "commentsConducted": 8, + "discussions": { + "conducted": { + "total": 7, + "agreed": 0, + "disagreed": 0 + }, + "received": { + "total": 0, + "agreed": 0, + "disagreed": 0 + } + }, "opened": 1, "closed": 1, "merged": 1, - "comments": 0, + "comments": 1, "totalReviewComments": 0, - "additions": 57, - "deletions": 57, + "reverted": 0, + "additions": 67, + "deletions": 4, "prSizes": [ "s" ], "timeToReview": [ - 34 + 71 ], "timeToApprove": [ - 34 + 71 ], "timeToMerge": [ - 104 + 1574 ], "timeToReviewRequest": [ - 30 + 6 ], "timeInDraft": [ - 30 - ], + 6 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "s": { + "timeToReview": [ + 71 + ], + "timeToApprove": [ + 71 + ], + "timeToMerge": [ + 1574 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574 + }, + "average": { + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574 + } + } + }, "pullRequestsInfo": [ { - "number": 4053, - "link": "https://github.com/owner/repo/pull/36", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 34, + "sizePoints": 67.8, + "additions": 67, + "deletions": 4, + "timeToReview": 71, "timeToApprove": 0, - "timeToMerge": 70 + "timeToMerge": 1503 } ], + "timeWaitingForRepeatedReview": [], "reviewComments": 0, - "discussions": { - "received": { - "total": 0, - "agreed": 0, - "disagreed": 0 - }, - "conducted": { - "total": 1, - "agreed": 0, - "disagreed": 0 - } + "reviewTimeIntervals": { + "0-2": 1, + "2-4": 0, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 }, - "discussionsTypes": {}, - "commentsConducted": 1, - "reviewTimeIntervals": {}, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 34, - "timeToApprove": 34, - "timeToMerge": 104, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 300, + "timeFromOpenToResponse": 306, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 0 }, "percentile": { "timeToReview": null, "timeToApprove": null, "timeToMerge": null, "timeToReviewRequest": null, - "timeInDraft": null + "timeInDraft": null, + "timeFromInitialRequestToResponse": 456, + "timeFromOpenToResponse": 468, + "timeFromRepeatedRequestToResponse": null, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 34, - "timeToApprove": 34, - "timeToMerge": 104, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 71, + "timeToApprove": 71, + "timeToMerge": 1574, + "timeToReviewRequest": 6, + "timeInDraft": 6, + "timeFromInitialRequestToResponse": 611, + "timeFromOpenToResponse": 629, + "timeFromRepeatedRequestToResponse": 49, + "timeWaitingForRepeatedReview": 0 } - }, - "total": { - "reviewRequestsConducted": 9, + } + }, + "dev3": { + "10/2024": { + "reviewRequestsConducted": 11, + "timeFromInitialRequestToResponse": [ + 65, + 1 + ], + "timeFromOpenToResponse": [ + 71, + 7 + ], + "timeFromRepeatedRequestToResponse": [], "reviewsConducted": { "dev1": { "approved": 1, "total": 1 }, "total": { - "approved": 4, - "total": 4, - "dismissed": 1 + "approved": 2, + "total": 2 }, - "dev3": { - "approved": 3, - "total": 3, - "dismissed": 1 + "dev2": { + "approved": 1, + "total": 1 } }, "reviewsConductedSize": [ - "xs", - "xs", - "xs", + "s", "xs" ], - "opened": 1, - "closed": 1, - "merged": 1, - "comments": 0, - "totalReviewComments": 0, - "additions": 57, - "deletions": 57, + "opened": 3, + "closed": 3, + "merged": 3, + "comments": 5, + "totalReviewComments": 10, + "reverted": 0, + "additions": 206, + "deletions": 1271, "prSizes": [ - "s" + "m", + "xs", + "m" ], "timeToReview": [ - 34 + 31, + 211, + 11 ], "timeToApprove": [ - 34 + 923, + 381, + 11 ], "timeToMerge": [ - 104 + 2116, + 936, + 239 ], "timeToReviewRequest": [ - 30 + 23, + 6, + 9 ], "timeInDraft": [ - 30 - ], + 23, + 6, + 9 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "m": { + "timeToReview": [ + 31, + 11 + ], + "timeToApprove": [ + 923, + 11 + ], + "timeToMerge": [ + 2116, + 239 + ], + "percentile": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1177 + }, + "median": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1177 + }, + "average": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1178 + } + }, + "xs": { + "timeToReview": [ + 211 + ], + "timeToApprove": [ + 381 + ], + "timeToMerge": [ + 936 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 211, + "timeToApprove": 381, + "timeToMerge": 936 + }, + "average": { + "timeToReview": 211, + "timeToApprove": 381, + "timeToMerge": 936 + } + } + }, "pullRequestsInfo": [ { - "number": 4053, - "link": "https://github.com/owner/repo/pull/37", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 6, + "sizePoints": 229, + "additions": 173, + "deletions": 280, + "timeToReview": 31, + "timeToApprove": 892, + "timeToMerge": 1193 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 13.8, + "additions": 13, + "deletions": 4, + "timeToReview": 211, + "timeToApprove": 170, + "timeToMerge": 555 + }, + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 34, + "sizePoints": 217.4, + "additions": 20, + "deletions": 987, + "timeToReview": 11, "timeToApprove": 0, - "timeToMerge": 70 + "timeToMerge": 228 } ], - "reviewComments": 0, + "timeWaitingForRepeatedReview": [], + "reviewComments": 5, "discussions": { "received": { - "total": 0, - "agreed": 0, - "disagreed": 0 - }, - "conducted": { - "total": 1, + "total": 4, "agreed": 0, "disagreed": 0 } }, - "discussionsTypes": {}, - "commentsConducted": 1, - "reviewTimeIntervals": {}, + "reviewTimeIntervals": { + "0-2": 2, + "2-4": 1, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 34, - "timeToApprove": 34, - "timeToMerge": 104, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 31, + "timeToApprove": 381, + "timeToMerge": 936, + "timeToReviewRequest": 9, + "timeInDraft": 9, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": null, - "timeToApprove": null, - "timeToMerge": null, - "timeToReviewRequest": null, - "timeInDraft": null + "timeToReview": 76, + "timeToApprove": 516, + "timeToMerge": 1231, + "timeToReviewRequest": 12, + "timeInDraft": 12, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 34, - "timeToApprove": 34, - "timeToMerge": 104, - "timeToReviewRequest": 30, - "timeInDraft": 30 + "timeToReview": 85, + "timeToApprove": 439, + "timeToMerge": 1097, + "timeToReviewRequest": 13, + "timeInDraft": 13, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } - } - }, - "dev5": { - "3/2024": { - "reviewRequestsConducted": 9, - "reviewsConducted": { - "dev4": { - "commented": 1, - "total": 2, - "approved": 2 + }, + "total": { + "reviewRequestsConducted": 11, + "timeFromInitialRequestToResponse": [ + 65, + 1 + ], + "timeFromOpenToResponse": [ + 71, + 7 + ], + "timeFromRepeatedRequestToResponse": [], + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + { + "opened": 1, + "merged": 1 }, - "total": { - "commented": 1, - "total": 4, - "approved": 4 + { + "merged": 1 + }, + null, + null, + { + "approved": 1 + }, + { + "approved": 1, + "merged": 1, + "opened": 1 }, + { + "opened": 1 + } + ], + "reviewsConducted": { "dev1": { "approved": 1, "total": 1 }, - "dev3": { + "total": { + "approved": 2, + "total": 2 + }, + "dev2": { "approved": 1, "total": 1 } }, "reviewsConductedSize": [ "s", - "s", - "xs", "xs" ], - "discussionsTypes": {}, - "commentsConducted": 1, - "discussions": { - "conducted": { - "total": 1, - "agreed": 0, - "disagreed": 0 + "opened": 3, + "closed": 3, + "merged": 3, + "comments": 5, + "totalReviewComments": 10, + "reverted": 0, + "additions": 206, + "deletions": 1271, + "prSizes": [ + "m", + "xs", + "m" + ], + "timeToReview": [ + 31, + 211, + 11 + ], + "timeToApprove": [ + 923, + 381, + 11 + ], + "timeToMerge": [ + 2116, + 936, + 239 + ], + "timeToReviewRequest": [ + 23, + 6, + 9 + ], + "timeInDraft": [ + 23, + 6, + 9 + ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "m": { + "timeToReview": [ + 31, + 11 + ], + "timeToApprove": [ + 923, + 11 + ], + "timeToMerge": [ + 2116, + 239 + ], + "percentile": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1177 + }, + "median": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1177 + }, + "average": { + "timeToReview": 21, + "timeToApprove": 467, + "timeToMerge": 1178 + } + }, + "xs": { + "timeToReview": [ + 211 + ], + "timeToApprove": [ + 381 + ], + "timeToMerge": [ + 936 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 211, + "timeToApprove": 381, + "timeToMerge": 936 + }, + "average": { + "timeToReview": 211, + "timeToApprove": 381, + "timeToMerge": 936 + } } }, - "median": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 - }, - "percentile": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 - }, - "average": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 - } - }, - "total": { - "reviewRequestsConducted": 9, - "reviewsConducted": { - "dev4": { - "commented": 1, - "total": 2, - "approved": 2 - }, - "total": { - "commented": 1, - "total": 4, - "approved": 4 + "pullRequestsInfo": [ + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 6, + "sizePoints": 229, + "additions": 173, + "deletions": 280, + "timeToReview": 31, + "timeToApprove": 892, + "timeToMerge": 1193 }, - "dev1": { - "approved": 1, - "total": 1 + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 4, + "sizePoints": 13.8, + "additions": 13, + "deletions": 4, + "timeToReview": 211, + "timeToApprove": 170, + "timeToMerge": 555 }, - "dev3": { - "approved": 1, - "total": 1 + { + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", + "comments": 0, + "sizePoints": 217.4, + "additions": 20, + "deletions": 987, + "timeToReview": 11, + "timeToApprove": 0, + "timeToMerge": 228 } - }, - "reviewsConductedSize": [ - "s", - "s", - "xs", - "xs" ], - "discussionsTypes": {}, - "commentsConducted": 1, + "timeWaitingForRepeatedReview": [], + "reviewComments": 5, "discussions": { - "conducted": { - "total": 1, + "received": { + "total": 4, "agreed": 0, "disagreed": 0 } }, + "reviewTimeIntervals": { + "0-2": 2, + "2-4": 1, + "4-8": 0, + "8-12": 0, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 + }, + "approvalTimeIntervals": {}, + "mergeTimeIntervals": {}, "median": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 + "timeToReview": 31, + "timeToApprove": 381, + "timeToMerge": 936, + "timeToReviewRequest": 9, + "timeInDraft": 9, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 + "timeToReview": 76, + "timeToApprove": 516, + "timeToMerge": 1231, + "timeToReviewRequest": 12, + "timeInDraft": 12, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 0, - "timeToApprove": 0, - "timeToMerge": 0, - "timeToReviewRequest": 0, - "timeInDraft": 0 + "timeToReview": 85, + "timeToApprove": 439, + "timeToMerge": 1097, + "timeToReviewRequest": 13, + "timeInDraft": 13, + "timeFromInitialRequestToResponse": 33, + "timeFromOpenToResponse": 39, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } } }, - "dev4": { - "3/2024": { - "reviewRequestsConducted": 8, - "opened": 2, - "closed": 2, - "merged": 2, - "comments": 0, - "totalReviewComments": 2, - "additions": 66, - "deletions": 111, + "dev5": { + "10/2024": { + "reviewRequestsConducted": 13, + "timeFromInitialRequestToResponse": [], + "timeFromOpenToResponse": [], + "timeFromRepeatedRequestToResponse": [], + "opened": 1, + "closed": 1, + "merged": 1, + "comments": 2, + "totalReviewComments": 0, + "reverted": 0, + "additions": 126, + "deletions": 2384, "prSizes": [ - "s", - "xs" + "l" ], "timeToReview": [ - 1445, - 4 + 647 ], "timeToApprove": [ - 1445, - 4 + 647 ], "timeToMerge": [ - 4715, - 20 + 1641 ], "timeToReviewRequest": [ - 17, - 20 + 34 ], "timeInDraft": [ - 17, - 20 + 34 ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "l": { + "timeToReview": [ + 647 + ], + "timeToApprove": [ + 647 + ], + "timeToMerge": [ + 1641 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641 + }, + "average": { + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641 + } + } + }, "pullRequestsInfo": [ { - "number": 4029, - "link": "https://github.com/owner/repo/pull/38", - "title": "[OG-4762] feat: new roles", - "comments": 2, - "timeToReview": 1445, - "timeToApprove": 0, - "timeToMerge": 3270 - }, - { - "number": 4045, - "link": "https://github.com/owner/repo/pull/39", - "title": "[OG-4802] feat: stripe enabled feature flag remove", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 4, + "sizePoints": 602.8, + "additions": 126, + "deletions": 2384, + "timeToReview": 647, "timeToApprove": 0, - "timeToMerge": 16 + "timeToMerge": 994 } ], - "discussionsTypes": {}, - "reviewComments": 1, + "timeWaitingForRepeatedReview": [], + "reviewComments": 0, "discussions": { "received": { - "total": 1, + "total": 0, "agreed": 0, "disagreed": 0 } }, - "reviewTimeIntervals": {}, + "reviewTimeIntervals": { + "0-2": 0, + "2-4": 0, + "4-8": 0, + "8-12": 1, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 724, - "timeToApprove": 724, - "timeToMerge": 2367, - "timeToReviewRequest": 18, - "timeInDraft": 18 + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641, + "timeToReviewRequest": 34, + "timeInDraft": 34, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 724, - "timeToApprove": 724, - "timeToMerge": 2367, - "timeToReviewRequest": 18, - "timeInDraft": 18 + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null, + "timeToReviewRequest": null, + "timeInDraft": null, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 725, - "timeToApprove": 725, - "timeToMerge": 2368, - "timeToReviewRequest": 19, - "timeInDraft": 19 + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641, + "timeToReviewRequest": 34, + "timeInDraft": 34, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } }, "total": { - "reviewRequestsConducted": 8, - "opened": 2, - "closed": 2, - "merged": 2, - "comments": 0, - "totalReviewComments": 2, - "additions": 66, - "deletions": 111, + "reviewRequestsConducted": 13, + "timeFromInitialRequestToResponse": [], + "timeFromOpenToResponse": [], + "timeFromRepeatedRequestToResponse": [], + "actionsTime": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + { + "merged": 1 + }, + null, + { + "opened": 1 + } + ], + "opened": 1, + "closed": 1, + "merged": 1, + "comments": 2, + "totalReviewComments": 0, + "reverted": 0, + "additions": 126, + "deletions": 2384, "prSizes": [ - "s", - "xs" + "l" ], "timeToReview": [ - 1445, - 4 + 647 ], "timeToApprove": [ - 1445, - 4 + 647 ], "timeToMerge": [ - 4715, - 20 + 1641 ], "timeToReviewRequest": [ - 17, - 20 + 34 ], "timeInDraft": [ - 17, - 20 + 34 ], + "unreviewed": 0, + "unapproved": 0, + "sizes": { + "l": { + "timeToReview": [ + 647 + ], + "timeToApprove": [ + 647 + ], + "timeToMerge": [ + 1641 + ], + "percentile": { + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null + }, + "median": { + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641 + }, + "average": { + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641 + } + } + }, "pullRequestsInfo": [ { - "number": 4029, - "link": "https://github.com/owner/repo/pull/40", - "title": "PR Example", - "comments": 2, - "timeToReview": 1445, - "timeToApprove": 0, - "timeToMerge": 3270 - }, - { - "number": 4045, - "link": "https://github.com/owner/repo/pull/41", - "title": "PR Example", + "number": 1, + "link": "https://github.com/owner/repo-example/pull/1", + "title": "Example pull request", "comments": 0, - "timeToReview": 4, + "sizePoints": 602.8, + "additions": 126, + "deletions": 2384, + "timeToReview": 647, "timeToApprove": 0, - "timeToMerge": 16 + "timeToMerge": 994 } ], - "discussionsTypes": {}, - "reviewComments": 1, + "timeWaitingForRepeatedReview": [], + "reviewComments": 0, "discussions": { "received": { - "total": 1, + "total": 0, "agreed": 0, "disagreed": 0 } }, - "reviewTimeIntervals": {}, + "reviewTimeIntervals": { + "0-2": 0, + "2-4": 0, + "4-8": 0, + "8-12": 1, + "12-16": 0, + "16-24": 0, + "24-Infinity": 0 + }, "approvalTimeIntervals": {}, "mergeTimeIntervals": {}, "median": { - "timeToReview": 724, - "timeToApprove": 724, - "timeToMerge": 2367, - "timeToReviewRequest": 18, - "timeInDraft": 18 + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641, + "timeToReviewRequest": 34, + "timeInDraft": 34, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "percentile": { - "timeToReview": 724, - "timeToApprove": 724, - "timeToMerge": 2367, - "timeToReviewRequest": 18, - "timeInDraft": 18 + "timeToReview": null, + "timeToApprove": null, + "timeToMerge": null, + "timeToReviewRequest": null, + "timeInDraft": null, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 }, "average": { - "timeToReview": 725, - "timeToApprove": 725, - "timeToMerge": 2368, - "timeToReviewRequest": 19, - "timeInDraft": 19 + "timeToReview": 647, + "timeToApprove": 647, + "timeToMerge": 1641, + "timeToReviewRequest": 34, + "timeInDraft": 34, + "timeFromInitialRequestToResponse": 0, + "timeFromOpenToResponse": 0, + "timeFromRepeatedRequestToResponse": 0, + "timeWaitingForRepeatedReview": 0 } } } From 69b40358b412dc94f417bb8f381f10d4e25e0565 Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 21:42:23 +0700 Subject: [PATCH 08/10] Feature: Updated configs --- configs/lastMonthsReport.yml | 11 +++---- configs/manualTriggerForAllReposOfOrg.yml | 2 +- configs/updateReportOnPRClose.yml | 2 +- configs/yearReportWithoutDevelopers.yml | 39 +++++++++++++++++++---- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/configs/lastMonthsReport.yml b/configs/lastMonthsReport.yml index 7798514..9c37731 100644 --- a/configs/lastMonthsReport.yml +++ b/configs/lastMonthsReport.yml @@ -10,19 +10,18 @@ jobs: - name: "Runs script for analytics" uses: AlexSim93/pull-request-analytics-action@v4 with: - GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If you're interested in analytics for a single repository without team breakdowns, GITHUB_TOKEN is sufficient. GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created GITHUB_REPO_FOR_ISSUE: "repo" # Make sure to specify the name of the repository where the issue will be created GITHUB_OWNERS_REPOS: "owner/repo" # Be sure to list the owner and repository name in the format owner/repo LABELS: "Report" - ASSIGNEES: "user-1, user-2, user-3" - CORE_HOURS_START: "9:00" - CORE_HOURS_END: "19:00" + CORE_HOURS_START: "8:00" + CORE_HOURS_END: "20:00" TIMEZONE: "Europe/Berlin" REPORT_PERIOD: "months:3" AGGREGATE_VALUE_METHODS: average - SHOW_STATS_TYPES: timeline PERIOD_SPLIT_UNIT: none + ISSUE_TITLE: "Quarterly Report" TOP_LIST_AMOUNT: 5 EXECUTION_OUTCOME: existing-issue - ISSUE_NUMBER: 1 + ISSUE_NUMBER: 999 # Set issue number or change EXECUTION_OUTCOME to new-issue diff --git a/configs/manualTriggerForAllReposOfOrg.yml b/configs/manualTriggerForAllReposOfOrg.yml index 1ceb14a..8579c00 100644 --- a/configs/manualTriggerForAllReposOfOrg.yml +++ b/configs/manualTriggerForAllReposOfOrg.yml @@ -29,7 +29,7 @@ jobs: - name: "Run script for analytics" uses: AlexSim93/pull-request-analytics-action@v4 with: - GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If you're interested in analytics for a single repository without team breakdowns, GITHUB_TOKEN is sufficient. GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created GITHUB_REPO_FOR_ISSUE: "repo" # Make sure to specify the name of the repository where the issue will be created LABELS: "Report" diff --git a/configs/updateReportOnPRClose.yml b/configs/updateReportOnPRClose.yml index 15d391b..9b22dbe 100644 --- a/configs/updateReportOnPRClose.yml +++ b/configs/updateReportOnPRClose.yml @@ -10,7 +10,7 @@ jobs: - name: "Run script for analytics" uses: AlexSim93/pull-request-analytics-action@v4 with: - GITHUB_TOKEN: ${{ secrets.TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If you're interested in analytics for a single repository without team breakdowns, GITHUB_TOKEN is sufficient. GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created GITHUB_REPO_FOR_ISSUE: "repo" # Make sure to specify the name of the repository where the issue will be created GITHUB_OWNERS_REPOS: "owner/repo" # Be sure to list the owner and repository name in the format owner/repo diff --git a/configs/yearReportWithoutDevelopers.yml b/configs/yearReportWithoutDevelopers.yml index 6408817..9bb62bf 100644 --- a/configs/yearReportWithoutDevelopers.yml +++ b/configs/yearReportWithoutDevelopers.yml @@ -1,7 +1,28 @@ -name: "Yearly Statistics Update Every Weekday" +name: "Manual Annual Report" on: - schedule: - - cron: "0 23 * * 1,2,3,4,5" + workflow_dispatch: + inputs: + report_date_start: + description: "Report date start(d/MM/yyyy)" + required: false + default: "01/01/2024" + report_date_end: + description: "Report date end(d/MM/yyyy)" + required: false + default: "31/12/2024" + issue_title: + description: "Issue title" + required: false + period_split_unit: + description: "Unit for time segmentation" + required: false + default: "months" + type: choice + options: + - years + - quarters + - months + - none jobs: create-report: name: "Create report" @@ -10,7 +31,7 @@ jobs: - name: "Runs script for analytics" uses: AlexSim93/pull-request-analytics-action@v4 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Generate a classic token, add it to Actions secrets, and use it in this field + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If you're interested in analytics for a single repository without team breakdowns, GITHUB_TOKEN is sufficient. GITHUB_OWNER_FOR_ISSUE: "owner" # Make sure to specify the owner of the repository where the issue will be created GITHUB_REPO_FOR_ISSUE: "repo" # Make sure to specify the name of the repository where the issue will be created GITHUB_OWNERS_REPOS: "owner/repo" # Be sure to list the owner and repository name in the format owner/repo @@ -18,8 +39,12 @@ jobs: CORE_HOURS_START: "9:00" CORE_HOURS_END: "19:00" TIMEZONE: "Europe/Berlin" - REPORT_DATE_START: 01/01/2024 + REPORT_DATE_START: ${{ inputs.report_date_start }} + REPORT_DATE_END: ${{ inputs.report_date_end }} + ISSUE_TITLE: ${{ inputs.issue_title }} + PERIOD_SPLIT_UNIT: ${{ inputs.period_split_unit }} TOP_LIST_AMOUNT: 5 SHOW_USERS: total - EXECUTION_OUTCOME: existing-issue - ISSUE_NUMBER: 1 # Set issue number or change EXECUTION_OUTCOME to new-issue + EXECUTION_OUTCOME: new-issue + SHOW_CORRELATION_GRAPHS: true + SHOW_ACTIVITY_TIME_GRAPHS: true From c1527282801c620849265a5a937c7a0a45d05e75 Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 21:53:36 +0700 Subject: [PATCH 09/10] Feature: Updated readme --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8f1c3ce..cf01123 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,12 @@ All metrics are presented in the form of tables, charts, and lists ([Report exam Displays the time from PR creation to each displayed status. Helps identify bottlenecks in the code review process. Use the `timeline` value in the `SHOW_STATS_TYPES` parameter. -| user | Time in draft | Time to review request | Time to review | Time to approve | Time to merge | Total merged PRs | -| :-------: | :-----------: | :--------------------: | :-----------------: | :----------------: | :-----------------: | :--------------: | -| **dev1** | 34 minutes | 17 minutes | 3 hours 34 minutes | 7 hours 32 minutes | 14 hours 9 minutes | 22 | -| **dev2** | 21 minutes | 20 minutes | 4 hours | 4 hours | 23 hours 1 minute | 13 | -| **dev3** | 15 minutes | 18 minutes | 15 hours 16 minutes | 24 hours 7 minutes | 53 hours 43 minutes | 2 | -| **total** | 27 minutes | 18 minutes | 4 hours 21 minutes | 7 hours 36 minutes | 26 hours 14 minutes | 47 | +| user | Time in draft | Time to review request | Time to review | Time to Review After Re-request | Time to approve | Time to merge | Total merged PRs | +| :-------: | :-----------: | :--------------------: | :----------------: | :-----------------------------: | :----------------: | :-----------------: | :--------------: | +| **dev1** | 6 minutes | 6 minutes | 3 hours 27 minutes | 5 hours 17 minutes | 4 hours 26 minutes | 17 hours 50 minutes | 29 | +| **dev2** | 9 minutes | 9 minutes | 4 hours 53 minutes | 7 hours 10 minutes | 6 hours 36 minutes | 13 hours 21 minutes | 54 | +| **dev3** | 13 minutes | 13 minutes | 4 hours 12 minutes | 2 hours 21 minutes | 4 hours 48 minutes | 22 hours 8 minutes | 54 | +| **total** | 10 minutes | 10 minutes | 4 hours 15 minutes | 4 hours 43 minutes | 7 hours 21 minutes | 22 hours 36 minutes | 232 | ```mermaid gantt @@ -144,7 +144,7 @@ Shows how quickly reviewers respond to review requests. Helps better understand This section displays metric changes over time using graphs, helping to understand how metrics have evolved over extended periods. To enable these graphs, ensure that `PERIOD_SPLIT_UNIT` is set and that the collected data covers at least two time periods (e.g., quarters or months). -$$\color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge\ \color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response$$ +$$\color{dimgrey}Time\ In\ Draft\ \color{firebrick}Time\ To\ Review\ Request\ \color{gold}Time\ To\ Review\ \color{turquoise}Time\ To\ Review\ After\ Rerequest\ \color{chartreuse}Time\ To\ Approve\ \color{blueviolet}Time\ To\ Merge\ \color{orange}Time\ From\ Initial\ Request\ To\ Response\ \color{violet}Time\ From\ Opening\ To\ Response\ \color{mediumblue}Time\ From\ Rerequest\ To\ Response$$ ```mermaid --- @@ -167,6 +167,7 @@ line [0.77, 0.65, 1.52, 2.35, 1.42, 2.52, 3.2, 2.13, 4.7, 2.87, 5.95, 4.75, 5.85 line [2.28, 4.95, 4.1, 4.6, 4.07, 3.3, 6.82, 5.65, 6.72, 4.08, 6.77, 10.43, 7.18, 9.58, 6.9, 4.2, 7.13, 6.35, 8.05] line [21.52, 28.9, 23.47, 21.2, 23.63, 24.9, 20.72, 29.22, 26.07, 25.52, 22.33, 46.33, 23.43, 26.47, 17.22, 24.28, 21.32, 22.97, 21.95] line [0, 1.67, 2.62, 3.8, 2.33, 3.15, 4.8, 2.72, 4.9, 2.6, 5.55, 6.12, 5.75, 5.82, 2.98, 1.68, 2.95, 3.92, 5.6] +line [0.41, 0.65, 1.57, 2.17, 1.11, 2.17, 3.22, 2.13, 4.13, 3.07, 5, 7.02, 4.03, 4.27, 2.62, 1.75, 1.28, 2.9, 3.35] line [0.5, 0.75, 2.07, 2.28, 1.4, 2.98, 5.17, 2.52, 4.93, 3.57, 6, 7.22, 6.33, 5.77, 3.62, 2.75, 3.28, 3.9, 5.35] line [0, 2.18, 0.92, 0.77, 5.47, 0.83, 4.85, 2.42, 4.28, 23.18, 0, 1.63, 1.98, 4.13, 1.32, 1.85, 1.63, 2.5, 6.72] ``` From 4b85b2ba34a8f7a1af25cfccc450f7f522d89d6f Mon Sep 17 00:00:00 2001 From: Aleksei Simatov Date: Tue, 7 Jan 2025 23:06:49 +0700 Subject: [PATCH 10/10] Feature: Fix time calculation --- build/index.js | 3 ++- src/converters/utils/prepareResponseTime.ts | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/build/index.js b/build/index.js index c902bca..041757a 100644 --- a/build/index.js +++ b/build/index.js @@ -1587,7 +1587,8 @@ const prepareResponseTime = (events = [], pullRequest, collection, dateKey, team .map((element) => (0, calculations_1.calcDifferenceInMinutes)(element?.[0], element?.[1], { endOfWorkingTime: (0, utils_1.getValueAsIs)("CORE_HOURS_END"), startOfWorkingTime: (0, utils_1.getValueAsIs)("CORE_HOURS_START"), - }, (0, utils_1.getMultipleValuesInput)("HOLIDAYS"))); + }, (0, utils_1.getMultipleValuesInput)("HOLIDAYS"))) + .filter((el) => typeof el === "number"); (0, set_1.default)(collection, [userKey, key, "timeWaitingForRepeatedReview"], [ ...(0, get_1.default)(collection, [userKey, key, "timeWaitingForRepeatedReview"], []), ...awaitingResponse, diff --git a/src/converters/utils/prepareResponseTime.ts b/src/converters/utils/prepareResponseTime.ts index 30e7456..f9fe03d 100644 --- a/src/converters/utils/prepareResponseTime.ts +++ b/src/converters/utils/prepareResponseTime.ts @@ -38,12 +38,17 @@ export const prepareResponseTime = ( }, getMultipleValuesInput("HOLIDAYS") ) - ); + ) + .filter((el) => typeof el === "number") as number[]; set( collection, [userKey, key, "timeWaitingForRepeatedReview"], [ - ...get(collection, [userKey, key, "timeWaitingForRepeatedReview"], []), + ...get( + collection, + [userKey, key, "timeWaitingForRepeatedReview"], + [] + ), ...awaitingResponse, ] );