Skip to content

Fix ScoreCard update and save pana report. #1597

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

Merged
merged 2 commits into from
Sep 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions app/bin/service/analyzer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@ import 'dart:isolate';

import 'package:appengine/appengine.dart';
import 'package:gcloud/db.dart' as db;
import 'package:gcloud/storage.dart';
import 'package:logging/logging.dart';

import 'package:pub_dartlang_org/history/backend.dart';
import 'package:pub_dartlang_org/job/backend.dart';
import 'package:pub_dartlang_org/job/job.dart';
import 'package:pub_dartlang_org/scorecard/backend.dart';
import 'package:pub_dartlang_org/scorecard/scorecard_memcache.dart';
import 'package:pub_dartlang_org/shared/analyzer_memcache.dart';
import 'package:pub_dartlang_org/shared/configuration.dart';
import 'package:pub_dartlang_org/shared/dartdoc_client.dart';
import 'package:pub_dartlang_org/shared/dartdoc_memcache.dart';
import 'package:pub_dartlang_org/shared/handler_helpers.dart';
import 'package:pub_dartlang_org/shared/popularity_storage.dart';
import 'package:pub_dartlang_org/shared/scheduler_stats.dart';
import 'package:pub_dartlang_org/shared/service_utils.dart';

Expand Down Expand Up @@ -48,7 +53,7 @@ Future _frontendMain(FrontendEntryMessage message) async {
));

await withAppEngineServices(() async {
_registerServices();
await _registerServices();
await runHandler(logger, analyzerServiceHandler);
});
}
Expand All @@ -59,7 +64,7 @@ Future _workerMain(WorkerEntryMessage message) async {
message.protocolSendPort.send(new WorkerProtocolMessage());

await withAppEngineServices(() async {
_registerServices();
await _registerServices();
final jobProcessor = new AnalyzerJobProcessor();
final jobMaintenance = new JobMaintenance(db.dbService, jobProcessor);

Expand All @@ -71,11 +76,18 @@ Future _workerMain(WorkerEntryMessage message) async {
});
}

void _registerServices() {
Future _registerServices() async {
final Bucket popularityBucket =
storageService.bucket(activeConfiguration.popularityDumpBucketName);
registerPopularityStorage(
new PopularityStorage(storageService, popularityBucket));
await popularityStorage.init();
registerAnalysisBackend(new AnalysisBackend(db.dbService));
registerAnalyzerMemcache(new AnalyzerMemcache(memcacheService));
registerDartdocMemcache(new DartdocMemcache(memcacheService));
registerDartdocClient(new DartdocClient());
registerHistoryBackend(new HistoryBackend(db.dbService));
registerJobBackend(new JobBackend(db.dbService));
registerScoreCardMemcache(new ScoreCardMemcache(memcacheService));
registerScoreCardBackend(new ScoreCardBackend(db.dbService));
}
7 changes: 7 additions & 0 deletions app/bin/service/dartdoc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import 'package:pub_dartlang_org/shared/analyzer_client.dart';
import 'package:pub_dartlang_org/shared/configuration.dart';
import 'package:pub_dartlang_org/shared/dartdoc_memcache.dart';
import 'package:pub_dartlang_org/shared/handler_helpers.dart';
import 'package:pub_dartlang_org/shared/popularity_storage.dart';
import 'package:pub_dartlang_org/shared/scheduler_stats.dart';
import 'package:pub_dartlang_org/shared/service_utils.dart';

Expand Down Expand Up @@ -81,6 +82,12 @@ Future _workerMain(WorkerEntryMessage message) async {
}

Future _registerServices() async {
final Bucket popularityBucket =
storageService.bucket(activeConfiguration.popularityDumpBucketName);
registerPopularityStorage(
new PopularityStorage(storageService, popularityBucket));
await popularityStorage.init();

registerDartdocMemcache(new DartdocMemcache(memcacheService));

registerAnalysisBackend(new AnalysisBackend(dbService));
Expand Down
36 changes: 32 additions & 4 deletions app/lib/analyzer/pana_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import 'package:pana/src/maintenance.dart';
import 'package:pana/src/version.dart' as pana_version;

import '../job/job.dart';
import '../shared/analyzer_client.dart' show createPanaSummaryForLegacy;
import '../scorecard/backend.dart';
import '../scorecard/models.dart';
import '../shared/analyzer_client.dart'
show createPanaSummaryForLegacy, getAllSuggestions;
import '../shared/analyzer_service.dart';
import '../shared/dartdoc_client.dart';
import '../shared/packages_overrides.dart';
Expand Down Expand Up @@ -62,6 +65,7 @@ class AnalyzerJobProcessor extends JobProcessor {
analysis.analysisStatus = AnalysisStatus.discontinued;
analysis.maintenanceScore = 0.0;
await analysisBackend.storeAnalysis(analysis);
await _storeScoreCard(job, packageStatus, null);
return JobStatus.skipped;
}

Expand All @@ -71,17 +75,19 @@ class AnalyzerJobProcessor extends JobProcessor {
analysis.analysisStatus = AnalysisStatus.outdated;
analysis.maintenanceScore = 0.0;
await analysisBackend.storeAnalysis(analysis);
await _storeScoreCard(job, packageStatus, null);
return JobStatus.skipped;
}

if (packageStatus.isLegacy) {
_logger.info('Package is on legacy SDK: $job.');
analysis.analysisStatus = AnalysisStatus.legacy;
analysis.analysisJson =
createPanaSummaryForLegacy(job.packageName, job.packageVersion)
.toJson();
final summary =
createPanaSummaryForLegacy(job.packageName, job.packageVersion);
analysis.analysisJson = summary.toJson();
analysis.maintenanceScore = 0.0;
await analysisBackend.storeAnalysis(analysis);
await _storeScoreCard(job, packageStatus, summary);
return JobStatus.skipped;
}

Expand Down Expand Up @@ -124,10 +130,12 @@ class AnalyzerJobProcessor extends JobProcessor {
}

JobStatus status = JobStatus.failed;
Summary scoreCardSummary = summary;
if (summary == null) {
analysis.analysisStatus = AnalysisStatus.aborted;
} else {
summary = applyPlatformOverride(summary);
scoreCardSummary = summary;
summary = await _expandSummary(summary, packageStatus.age);
final bool lastRunWithErrors =
summary.suggestions?.where((s) => s.isError)?.isNotEmpty ?? false;
Expand All @@ -143,6 +151,7 @@ class AnalyzerJobProcessor extends JobProcessor {
}

final backendStatus = await analysisBackend.storeAnalysis(analysis);
await _storeScoreCard(job, packageStatus, scoreCardSummary);

if (backendStatus.isLatestStable &&
analysis.analysisStatus != AnalysisStatus.success &&
Expand Down Expand Up @@ -182,4 +191,23 @@ class AnalyzerJobProcessor extends JobProcessor {
}
return summary;
}

Future _storeScoreCard(Job job, PackageStatus status, Summary summary) async {
final reportStatus =
summary == null ? ReportStatus.aborted : ReportStatus.success;
await scoreCardBackend.updateReport(
job.packageName,
job.packageVersion,
new PanaReport(
reportStatus: reportStatus,
healthScore: summary?.health?.healthScore ?? 0.0,
maintenanceScore:
summary == null ? 0.0 : getMaintenanceScore(summary.maintenance),
platformTags: indexDartPlatform(summary?.platform),
platformReason: summary?.platform?.reason,
pkgDependencies: summary?.pkgResolution?.dependencies,
suggestions: getAllSuggestions(summary),
));
await scoreCardBackend.updateScoreCard(job.packageName, job.packageVersion);
}
}
6 changes: 3 additions & 3 deletions app/lib/scorecard/backend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ class ScoreCardBackend {
Future updateScoreCard(String packageName, String packageVersion) async {
final key = scoreCardKey(packageName, packageVersion);
final pAndPv = await _db.lookup([key.parent, key.parent.parent]);
final package = pAndPv[0] as Package;
final version = pAndPv[1] as PackageVersion;
final version = pAndPv[0] as PackageVersion;
final package = pAndPv[1] as Package;
if (package == null || version == null) {
throw new Exception('Unable to lookup $packageName $packageVersion.');
}
Expand All @@ -168,7 +168,7 @@ class ScoreCardBackend {
scoreCard.updated = new DateTime.now().toUtc();
}

scoreCard.flags = null;
scoreCard.flags.clear();
if (package.isDiscontinued ?? false) {
scoreCard.addFlag(PackageFlags.isDiscontinued);
}
Expand Down
5 changes: 4 additions & 1 deletion app/lib/scorecard/helpers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import 'package:gcloud/db.dart' as db;
import '../frontend/models.dart' show Package, PackageVersion;
import '../shared/versions.dart' as versions;

import 'models.dart';

db.Key scoreCardKey(
String packageName,
String packageVersion, {
Expand All @@ -15,5 +17,6 @@ db.Key scoreCardKey(
runtimeVersion ??= versions.runtimeVersion;
return db.dbService.emptyKey
.append(Package, id: packageName)
.append(PackageVersion, id: packageVersion);
.append(PackageVersion, id: packageVersion)
.append(ScoreCard, id: runtimeVersion);
}
9 changes: 5 additions & 4 deletions app/lib/scorecard/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,17 @@ class ScoreCard extends db.ExpandoModel {

/// The platform tags (flutter, web, other).
@CompatibleStringListProperty()
List<String> platformTags;
List<String> platformTags = <String>[];

/// The flags for the package, version or analysis.
/// Example values: entries from [PackageFlags].
@CompatibleStringListProperty()
List<String> flags;
List<String> flags = <String>[];

/// The report types that are already done for the ScoreCard.
/// Contains values from [ReportType].
@CompatibleStringListProperty()
List<String> reportTypes;
List<String> reportTypes = <String>[];

ScoreCard();

Expand Down Expand Up @@ -141,7 +142,7 @@ class ScoreCard extends db.ExpandoModel {
healthScore = (panaReport?.healthScore ?? 0.0) *
(0.9 + ((dartdocReport?.coverageScore ?? 1.0) * 0.1));
maintenanceScore = panaReport?.maintenanceScore ?? 0.0;
platformTags = panaReport?.platformTags;
platformTags = panaReport?.platformTags ?? <String>[];
reportTypes = [
panaReport == null ? null : ReportType.pana,
dartdocReport == null ? null : ReportType.dartdoc,
Expand Down
31 changes: 17 additions & 14 deletions app/lib/shared/analyzer_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -243,24 +243,27 @@ class AnalysisView {
return _summary?.health?.healthScore ?? 0.0;
}

List<Suggestion> get suggestions {
final list = <Suggestion>[];
if (_summary?.suggestions != null) {
list.addAll(_summary.suggestions);
}
if (_summary?.health?.suggestions != null) {
list.addAll(_summary.health.suggestions);
}
if (_summary?.maintenance?.suggestions != null) {
list.addAll(_summary.maintenance.suggestions);
}
list.sort();
return list;
}
List<Suggestion> get suggestions => getAllSuggestions(_summary);

double get maintenanceScore => _data?.maintenanceScore ?? 0.0;
}

List<Suggestion> getAllSuggestions(Summary summary) {
if (summary == null) return null;
final list = <Suggestion>[];
if (summary.suggestions != null) {
list.addAll(summary.suggestions);
}
if (summary.health?.suggestions != null) {
list.addAll(summary.health.suggestions);
}
if (summary.maintenance?.suggestions != null) {
list.addAll(summary.maintenance.suggestions);
}
list.sort();
return list;
}

Summary createPanaSummaryForLegacy(String packageName, String packageVersion) {
return new Summary(
runtimeInfo: new PanaRuntimeInfo(),
Expand Down