ui/intermittent-failures/helpers.js (122 lines of code) (raw):

import moment from 'moment'; // be sure to wrap date arg in a moment() export const ISODate = function formatISODate(date) { return date.format('YYYY-MM-DD'); }; export const prettyDate = function formatPrettyDate(date) { return moment(date).format('ddd MMM D, YYYY'); }; export const formatBugs = function formatBugsForBugzilla(data) { const bugs = []; for (let i = 0; i < data.length; i++) { bugs.push(`${data[i].bug_id}`); } return bugs; }; export const mergeData = function mergeDataFromTwoApis(data, bugs) { const dict = {}; for (let i = 0; i < data.length; i++) { dict[data[i].bug_id] = data[i].bug_count; } for (let i = 0; i < bugs.length; i++) { const match = dict[bugs[i].id]; if (match) { bugs[i].count = match; } } bugs.sort((a, b) => b.count - a.count); return bugs; }; export const calculateMetrics = function calculateMetricsForGraphs(data) { const dateCounts = { color: 'blue', data: [] }; const dateTestRunCounts = { color: 'green', data: [] }; const dateFreqs = { color: '#dd6602', data: [] }; let totalFailures = 0; let totalRuns = 0; for (let i = 0; i < data.length; i++) { const failures = data[i].failure_count; const testRuns = data[i].test_runs; const freq = testRuns < 1 || failures < 1 ? 0 : failures / testRuns; const date = moment(data[i].date).format('MMM DD'); const dateObj = moment(data[i].date).toDate(); totalFailures += failures; totalRuns += testRuns; dateCounts.data.push({ date, failureCount: failures, x: dateObj, y: failures, }); dateTestRunCounts.data.push({ date, pushCount: testRuns, x: dateObj, y: testRuns, }); dateFreqs.data.push({ date, failurePerPush: freq.toFixed(2), x: dateObj, y: freq, }); } return { graphOneData: [dateFreqs], graphTwoData: [dateCounts, dateTestRunCounts], totalFailures, totalRuns, }; }; export const sortData = function sortData(data, sortBy, desc) { data.sort((a, b) => { const item1 = desc ? b[sortBy] : a[sortBy]; const item2 = desc ? a[sortBy] : b[sortBy]; if (item1 < item2) { return -1; } if (item1 > item2) { return 1; } return 0; }); return data; }; export const validateQueryParams = function validateQueryParams( params, bugRequired = false, ) { const messages = []; const dateFormat = /\d{4}[-]\d{2}[-]\d{2}/; if (!params.tree) { messages.push( 'tree is required and must be a valid repository or repository group.', ); } if (!params.startday || params.startday.search(dateFormat) === -1) { messages.push('startday is required and must be in YYYY-MM-DD format.'); } if (!params.endday || params.endday.search(dateFormat) === -1) { messages.push('endday is required and must be in YYYY-MM-DD format.'); } if (bugRequired && (!params.bug || Number.isNaN(params.bug))) { messages.push('bug is required and must be a valid integer.'); } return messages; }; export const tableRowStyling = function tableRowStyling(state, bug) { if (bug) { const style = { color: 'rgb(117, 117, 117)', backgroundColor: 'rgba(0, 0, 0, 0.009)', }; if (bug.row.status === 'RESOLVED' || bug.row.status === 'VERIFIED') { style.textDecoration = 'line-through'; return { style }; } const disabledStrings = /(disabled|annotated|marked)/i; if (disabledStrings.test(bug.row.whiteboard)) { return { style }; } } return {}; }; export const removePath = (line = '') => line.replace(/\/?([\w\d-.]+\/)+/, '');