Skip to content
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
2 changes: 1 addition & 1 deletion .github/workflows/corpus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
strategy:
fail-fast: false
matrix:
sdk: [3.6, dev]
sdk: [stable, dev]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c
Expand Down
22 changes: 15 additions & 7 deletions pkgs/corpus/bin/deps.dart
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,9 @@ class PackageUsageInfo {
}

Future<PackageUsageInfo> getPackageUsageInfo(
Pub pub, PackageInfo package) async {
Pub pub,
PackageInfo package,
) async {
var packageOptions = await pub.getPackageOptions(package.name);
var packageScore = await pub.getPackageScore(package.name);

Expand All @@ -146,13 +148,19 @@ File generateCsvReport(
var score = usage.packageScore;
return printDouble(score.grantedPoints * 100 / score.maxPoints);
}),
Column('Popularity',
(usage) => printDouble(usage.packageScore.popularityScore * 100)),
Column(
'Popularity',
(usage) => printDouble(usage.packageScore.popularityScore * 100),
),
Column('Likes', (usage) => '${usage.packageScore.likeCount}'),
Column('Constraint',
(usage) => '${usage.packageInfo.constraintFor(targetPackage.name)}'),
Column('Dep Type',
(usage) => '${usage.packageInfo.constraintType(targetPackage.name)}'),
Column(
'Constraint',
(usage) => '${usage.packageInfo.constraintFor(targetPackage.name)}',
),
Column(
'Dep Type',
(usage) => '${usage.packageInfo.constraintType(targetPackage.name)}',
),
Column('SDK', (usage) => '${usage.packageInfo.sdkConstraint}'),
Column('Repo', (usage) => '${usage.packageInfo.repo}'),
];
Expand Down
84 changes: 64 additions & 20 deletions pkgs/corpus/lib/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,9 @@ class ApiUsage {
}

static ApiUsage fromFile(PackageInfo packageInfo, File file) {
var json = const JsonDecoder().convert(file.readAsStringSync())
as Map<String, dynamic>;
var json =
const JsonDecoder().convert(file.readAsStringSync())
as Map<String, dynamic>;
return ApiUsage(
packageInfo,
References.fromJson(json['packages'] as Map<String, dynamic>),
Expand Down Expand Up @@ -106,7 +107,7 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
References referringLibraries = References();

ApiUseCollector(this.reportTarget, this.packageInfo, this.packageDir)
: packageEntity = PackageEntity(packageInfo.name);
: packageEntity = PackageEntity(packageInfo.name);

String get targetName => reportTarget.name;
String get targetType => reportTarget.type;
Expand Down Expand Up @@ -143,10 +144,14 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {

if (matches) {
referringPackages.addLibraryReference(uri, packageEntity);
var relativeLibraryPath =
path.relative(currentFilePath, from: packageDir.path);
var relativeLibraryPath = path.relative(
currentFilePath,
from: packageDir.path,
);
referringLibraries.addLibraryReference(
uri, LibraryEntity(packageName, relativeLibraryPath));
uri,
LibraryEntity(packageName, relativeLibraryPath),
);
}
}

Expand All @@ -164,7 +169,7 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
void visitSimpleIdentifier(SimpleIdentifier node) {
super.visitSimpleIdentifier(node);

var element = node.staticElement;
var element = node.element;
if (element == null) {
return;
}
Expand All @@ -174,26 +179,38 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
return;
}

var libraryUri = library.librarySource.uri;
var libraryUri = library.uri;
if (libraryUri.scheme != targetType ||
libraryUri.pathSegments.first != targetName) {
return;
}

var enclosingElement = element.enclosingElement3!;
var enclosingElement = element.enclosingElement!;

if (enclosingElement.kind == ElementKind.CLASS) {
final name = enclosingElement.name!;
referringPackages.addClassReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addClassReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.EXTENSION) {
final name = enclosingElement.name!;
referringPackages.addExtensionReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addExtensionReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.LIBRARY) {
final name = enclosingElement.name!;
referringPackages.addLibraryReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addLibraryReference(
name,
LibraryEntity(packageName, relPath),
);
}

if (element.kind == ElementKind.GETTER) {
Expand All @@ -203,14 +220,26 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
referringPackages.addTopLevelReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addTopLevelReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.EXTENSION) {
// Record extensions.
final name = enclosingElement.name!;
referringPackages.addExtensionReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addExtensionReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.LIBRARY) {
final name = element.name!;
referringPackages.addTopLevelReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addTopLevelReference(
name,
LibraryEntity(packageName, relPath),
);
}
} else if (element.kind == ElementKind.FUNCTION) {
if (enclosingElement.kind == ElementKind.COMPILATION_UNIT) {
Expand All @@ -219,14 +248,26 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
referringPackages.addTopLevelReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addTopLevelReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.EXTENSION) {
// Record extensions.
final name = enclosingElement.name!;
referringPackages.addExtensionReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addExtensionReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
} else if (enclosingElement.kind == ElementKind.LIBRARY) {
final name = element.name!;
referringPackages.addTopLevelReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addTopLevelReference(
name,
LibraryEntity(packageName, relPath),
);
}
}
}
Expand All @@ -239,14 +280,16 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
return;
}

var libraryUri = library.librarySource.uri;
var libraryUri = library.uri;
if (libraryUri.scheme == targetType &&
libraryUri.pathSegments.first == targetName) {
final name = element.name!;
referringPackages.addClassReference(name, packageEntity);
var relPath = path.relative(currentFilePath, from: packageDir.path);
referringLibraries.addClassReference(
name, LibraryEntity(packageName, relPath));
name,
LibraryEntity(packageName, relPath),
);
}
}
}
Expand Down Expand Up @@ -322,8 +365,9 @@ class References {

refs._libraryReferences.fromJson(json['library'] as Map<String, dynamic>);
refs._classReferences.fromJson(json['class'] as Map<String, dynamic>);
refs._extensionReferences
.fromJson(json['extension'] as Map<String, dynamic>);
refs._extensionReferences.fromJson(
json['extension'] as Map<String, dynamic>,
);
refs._topLevelReferences.fromJson(json['topLevel'] as Map<String, dynamic>);

return refs;
Expand Down Expand Up @@ -446,7 +490,7 @@ class EntityReferences {
Map<String, dynamic> toJson() {
return {
for (var entry in _references.entries)
entry.key: entry.value.map((entity) => entity.toJson()).toList()
entry.key: entry.value.map((entity) => entity.toJson()).toList(),
};
}
}
27 changes: 9 additions & 18 deletions pkgs/corpus/lib/packages.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ class PackageManager {
return true;
}

var progress =
logger?.progress('downloading ${path.basename(archiveFile.path)}');
var progress = logger?.progress(
'downloading ${path.basename(archiveFile.path)}',
);
try {
var data = await _getPackageTarGzArchive(package);
archiveFile.writeAsBytesSync(data);
Expand Down Expand Up @@ -74,14 +75,10 @@ class PackageManager {

localPackage.directory.createSync(recursive: true);

var result = await runProcess(
'tar',
[
'-xf',
'../../archives/${path.basename(archiveFile.path)}',
],
workingDirectory: localPackage.directory.path,
);
var result = await runProcess('tar', [
'-xf',
'../../archives/${path.basename(archiveFile.path)}',
], workingDirectory: localPackage.directory.path);
if (result.exitCode != 0) {
print(result.stdout);
print(result.stderr);
Expand Down Expand Up @@ -109,10 +106,7 @@ class LocalPackage {

LocalPackage(this.packageInfo, this.directory);

Future<bool> pubGet({
bool checkUpToDate = false,
Logger? logger,
}) async {
Future<bool> pubGet({bool checkUpToDate = false, Logger? logger}) async {
if (checkUpToDate) {
var pubspec = File(path.join(directory.path, 'pubspec.yaml'));
var lock = File(path.join(directory.path, 'pubspec.lock'));
Expand All @@ -138,10 +132,7 @@ class LocalPackage {
final progress = logger?.progress('${path.basename(executable)} pub get');
var result = await runProcess(
executable,
[
'pub',
'get',
],
['pub', 'get'],
workingDirectory: directory.path,
logger: logger,
);
Expand Down
37 changes: 18 additions & 19 deletions pkgs/corpus/lib/pub.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,15 @@ class Pub {
/// Return all the packages that depend on [packageName], sorted by package
/// popularity.
Stream<PackageInfo> popularDependenciesOf(String packageName) {
return _packagesForSearch(
query: 'dependency:$packageName',
sort: 'top',
);
return _packagesForSearch(query: 'dependency:$packageName', sort: 'top');
}

/// Return all the pub.dev hosted packages sorted by package popularity.
///
/// Note that this will be tens of thousands of packages, so the caller should
/// plan to limit the number of packages they iterate through.
Stream<PackageInfo> allPubPackages() {
return _packagesForSearch(
query: '',
sort: 'top',
);
return _packagesForSearch(query: '', sort: 'top');
}

Future<PackageInfo> getPackageInfo(String pkgName) async {
Expand All @@ -51,13 +45,15 @@ class Pub {

Future<PackageOptions> getPackageOptions(String packageName) async {
final json = await _getJson(
Uri.https('pub.dev', 'api/packages/$packageName/options'));
Uri.https('pub.dev', 'api/packages/$packageName/options'),
);
return PackageOptions.from(json);
}

Future<PackageScore> getPackageScore(String packageName) async {
final json =
await _getJson(Uri.https('pub.dev', 'api/packages/$packageName/score'));
final json = await _getJson(
Uri.https('pub.dev', 'api/packages/$packageName/score'),
);
return PackageScore.from(json);
}

Expand All @@ -69,17 +65,20 @@ class Pub {
final uri = Uri.parse('https://pub.dev/api/search');

for (;;) {
final targetUri = uri.replace(queryParameters: {
'q': query,
'page': page.toString(),
if (sort != null) 'sort': sort,
});
final targetUri = uri.replace(
queryParameters: {
'q': query,
'page': page.toString(),
if (sort != null) 'sort': sort,
},
);

final map = await _getJson(targetUri);

for (var packageName in (map['packages'] as List)
.cast<Map<String, dynamic>>()
.map((e) => e['package'] as String?)) {
for (var packageName
in (map['packages'] as List).cast<Map<String, dynamic>>().map(
(e) => e['package'] as String?,
)) {
var packageInfo = await getPackageInfo(packageName!);

yield packageInfo;
Expand Down
15 changes: 10 additions & 5 deletions pkgs/corpus/lib/report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,21 @@ class Report {
buf.writeln('## General info');
buf.writeln();
if (reportTarget is DartLibraryTarget) {
buf.writeln('https://api.dart.dev/dart-${reportTarget.name}/'
'dart-${reportTarget.name}-library.html');
buf.writeln(
'https://api.dart.dev/dart-${reportTarget.name}/'
'dart-${reportTarget.name}-library.html',
);
} else if (reportTarget is PackageTarget) {
buf.writeln((reportTarget as PackageTarget).description);
buf.writeln();
buf.writeln('- pub page: https://pub.dev/packages/${reportTarget.name}');
buf.writeln(
'- docs: https://pub.dev/documentation/${reportTarget.name}/latest/');
buf.writeln('- dependent packages: '
'https://pub.dev/packages?q=dependency%3A${reportTarget.name}&sort=top');
'- docs: https://pub.dev/documentation/${reportTarget.name}/latest/',
);
buf.writeln(
'- dependent packages: '
'https://pub.dev/packages?q=dependency%3A${reportTarget.name}&sort=top',
);
}
buf.writeln();
buf.writeln(
Expand Down
Loading