-
Notifications
You must be signed in to change notification settings - Fork 9.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
core(lhr): make reportCategories shallow; move audit scores to AuditResultJSON #4711
Changes from 3 commits
539ec76
47669a6
e24e3c7
ef10f4f
cf4ae95
010f2fd
e4784a2
fddb987
5e1337d
c2e25b5
b4ac5f0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -93,9 +93,11 @@ class Runner { | |
const resultsById = {}; | ||
for (const audit of runResults.auditResults) resultsById[audit.name] = audit; | ||
|
||
let report; | ||
let categories; | ||
if (opts.config.categories) { | ||
report = Runner._scoreAndCategorize(opts, resultsById); | ||
Runner._scoreAndCategorize(opts, resultsById); | ||
// COMPAT: after dropping Node 6, upgrade to use Object.values | ||
categories = Object.keys(opts.config.categories).map(key => opts.config.categories[key]); | ||
} | ||
|
||
return { | ||
|
@@ -108,8 +110,7 @@ class Runner { | |
audits: resultsById, | ||
artifacts: runResults.artifacts, | ||
runtimeConfig: Runner.getRuntimeConfig(opts.flags), | ||
score: report ? report.score : 0, | ||
reportCategories: report ? report.categories : [], | ||
reportCategories: categories, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. before this defaulted to an empty array. Will it cause problems anywhere as |
||
reportGroups: opts.config.groups, | ||
}; | ||
}).catch(err => { | ||
|
@@ -192,7 +193,7 @@ class Runner { | |
* @param {{}} resultsById | ||
*/ | ||
static _scoreAndCategorize(opts, resultsById) { | ||
return ReportScoring.scoreAllCategories(opts.config, resultsById); | ||
ReportScoring.scoreAllCategories(opts.config, resultsById); | ||
} | ||
|
||
/** | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,30 +13,33 @@ class ReportScoring { | |
* @return {number} | ||
*/ | ||
static arithmeticMean(items) { | ||
const results = items.reduce((result, item) => { | ||
const score = Number(item.score) || 0; | ||
const weight = Number(item.weight) || 0; | ||
return { | ||
weight: result.weight + weight, | ||
sum: result.sum + score * weight, | ||
}; | ||
}, {weight: 0, sum: 0}); | ||
const results = items.reduce( | ||
(result, item) => { | ||
const score = Number(item.score) || 0; | ||
const weight = Number(item.weight) || 0; | ||
return { | ||
weight: result.weight + weight, | ||
sum: result.sum + score * weight, | ||
}; | ||
}, | ||
{weight: 0, sum: 0} | ||
); | ||
|
||
return (results.sum / results.weight) || 0; | ||
return results.sum / results.weight || 0; | ||
} | ||
|
||
/** | ||
* Returns the report JSON object with computed scores. | ||
* @param {{categories: !Object<string, {id: string|undefined, weight: number|undefined, audits: !Array<{id: string, weight: number|undefined}>}>}} config | ||
* @param {{categories: !Object<string, {id: string|undefined, weight: number|undefined, score: number|undefined, audits: !Array<{id: string, weight: number|undefined}>}>}} config | ||
* @param {!Object<{score: ?number|boolean|undefined}>} resultsByAuditId | ||
* @return {{score: number, categories: !Array<{audits: !Array<{score: number, result: !Object}>}>}} | ||
* @void | ||
*/ | ||
static scoreAllCategories(config, resultsByAuditId) { | ||
const categories = Object.keys(config.categories).map(categoryId => { | ||
Object.keys(config.categories).forEach(categoryId => { | ||
const category = config.categories[categoryId]; | ||
category.id = categoryId; | ||
|
||
const audits = category.audits.map(audit => { | ||
category.audits.forEach(audit => { | ||
const result = resultsByAuditId[audit.id]; | ||
// Cast to number to catch `null` and undefined when audits error | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should all of these line just be moved into There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. more a comment for #4690 I suppose There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Aye. It actually already happens in that PR: https://github.com/GoogleChrome/lighthouse/pull/4690/files#diff-488f5da33160a651526463bdb951e5deL31 |
||
let auditScore = Number(result.score) || 0; | ||
|
@@ -53,15 +56,17 @@ class ReportScoring { | |
result.informative = true; | ||
} | ||
|
||
return Object.assign({}, audit, {result, score: auditScore}); | ||
result.score = auditScore; | ||
}); | ||
|
||
const categoryScore = ReportScoring.arithmeticMean(audits); | ||
return Object.assign({}, category, {audits, score: categoryScore}); | ||
const scores = category.audits.map(audit => ({ | ||
score: resultsByAuditId[audit.id].score, | ||
weight: audit.weight, | ||
})); | ||
const categoryScore = ReportScoring.arithmeticMean(scores); | ||
// mutate config.categories[].score | ||
category.score = categoryScore; | ||
}); | ||
|
||
const overallScore = ReportScoring.arithmeticMean(categories); | ||
return {score: overallScore, categories}; | ||
} | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does this mean we can do it now? :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do it!