Skip to content
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

Small changes #11

Merged
merged 3 commits into from
Nov 10, 2022
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 packages/corpus/lib/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor {
if (uri != null && uri.startsWith('$targetType:')) {
bool matches;

if (reportTarget.isDartLibrary) {
if (reportTarget is DartLibraryTarget) {
matches = uri == 'dart:$targetName';
} else {
matches = uri.startsWith('package:$targetName/');
Expand Down
50 changes: 23 additions & 27 deletions packages/corpus/lib/api_usage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,34 +22,30 @@ Future analyzeUsage({
}) async {
var log = Logger.standard();

var dartLibStrategy = packageName.startsWith('dart:');
if (dartLibStrategy) {
packageName = packageName.substring('dart:'.length);

log.stdout('API usage analysis for dart:$packageName.');
log.stdout('');
} else {
log.stdout('API usage analysis for package:$packageName.');
log.stdout('');
}

var pub = Pub();
var packageManager = PackageManager();

var progress = log.progress('querying pub.dev');

var sdkVersion = Platform.version;
if (sdkVersion.contains('-')) {
sdkVersion = sdkVersion.substring(0, sdkVersion.indexOf('-'));
}

var reportTarget = dartLibStrategy
? ReportTarget.fromDartLibrary(packageName, sdkVersion)
: ReportTarget.fromPackage(await pub.getPackageInfo(packageName));
ReportTarget reportTarget;
if (packageName.startsWith('dart:')) {
var nameWithoutPrefix = packageName.substring('dart:'.length);
reportTarget =
DartLibraryTarget(name: nameWithoutPrefix, version: sdkVersion);
} else {
var packageInfo = await pub.getPackageInfo(packageName);
reportTarget = PackageTarget.fromPackage(packageInfo);
}

log.stdout('API usage analysis for $reportTarget.');
log.stdout('');

var progress = log.progress('querying pub.dev');

var packageStream = dartLibStrategy
? pub.allPubPackages()
: pub.popularDependenciesOf(packageName);
var packageStream = reportTarget.getPackages(pub);

progress.finish(showTiming: true);

Expand All @@ -61,8 +57,8 @@ Future analyzeUsage({
log.stdout('');
log.stdout('${package.name} v${package.version}');

if (reportTarget.isPackage) {
var targetPackage = reportTarget.targetPackage!;
if (reportTarget is PackageTarget) {
var targetPackage = reportTarget.targetPackage;
// Skip a package when its constraints don't include the latest stable.
var constraint = package.constraintFor(targetPackage.name);
if (constraint == null) {
Expand Down Expand Up @@ -109,29 +105,29 @@ Future analyzeUsage({
localPackage.directory,
);
var message = usage.describeUsage();
if (reportTarget.isDartLibrary && !usage.hadAnyReferences) {
var hasNoUsage =
reportTarget is DartLibraryTarget && !usage.hadAnyReferences;
if (hasNoUsage) {
message = 'skipping - no dart:${reportTarget.name} references';
}
progress.finish(message: message);

// If collecting usage data for a dart: library, we check if the package
// we've just analyzed references the dart: lib. We do this after the fact
// as we don't know ahead of time wrt dart: usage.
if (reportTarget.isDartLibrary && !usage.hadAnyReferences) {
if (hasNoUsage) {
continue;
}

count++;

usageInfo.add(usage);

count++;
if (count >= packageLimit) {
break;
}
}

var report = Report(reportTarget);
var file = report.generateReport(
var file = Report(reportTarget).generateReport(
usageInfo,
showSrcReferences: showSrcReferences,
);
Expand Down
7 changes: 2 additions & 5 deletions packages/corpus/lib/pub.dart
Original file line number Diff line number Diff line change
Expand Up @@ -231,12 +231,9 @@ class PackageInfo {
}

VersionConstraint? get sdkContraint {
var environment = _pubspec['environment'] as Map?;
if (environment == null) return null;

var sdk = environment['sdk'] as String?;
var environment = (_pubspec['environment'] as Map?);
var sdk = environment?['sdk'] as String?;
if (sdk == null) return null;

return VersionConstraint.parse(sdk);
}

Expand Down
58 changes: 38 additions & 20 deletions packages/corpus/lib/report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,55 @@ import 'package:corpus/pub.dart';
import 'api.dart';
import 'utils.dart';

class ReportTarget {
final bool isDartLibrary;
abstract class ReportTarget {
final String name;
final String version;

ReportTarget({required this.name, required this.version});

String get type;

Stream<PackageInfo> getPackages(Pub pub);

@override
String toString() => '$type:$name';
}

class PackageTarget extends ReportTarget {
final PackageInfo targetPackage;
final String? description;
final PackageInfo? targetPackage;

ReportTarget({
required this.name,
required this.version,
this.isDartLibrary = false,
PackageTarget({
required super.name,
required super.version,
required this.targetPackage,
this.description,
this.targetPackage,
});

factory ReportTarget.fromDartLibrary(String name, String sdkVersion) {
return ReportTarget(name: name, version: sdkVersion, isDartLibrary: true);
}

factory ReportTarget.fromPackage(PackageInfo package) {
return ReportTarget(
factory PackageTarget.fromPackage(PackageInfo package) {
return PackageTarget(
name: package.name,
version: package.version,
description: package.description,
targetPackage: package,
description: package.description,
);
}

String get type => isDartLibrary ? 'dart' : 'package';
@override
String get type => 'package';

@override
Stream<PackageInfo> getPackages(Pub pub) => pub.popularDependenciesOf(name);
}

class DartLibraryTarget extends ReportTarget {
DartLibraryTarget({required super.name, required super.version});

@override
String get type => 'dart';

bool get isPackage => !isDartLibrary;
@override
Stream<PackageInfo> getPackages(Pub pub) => pub.allPubPackages();
}

class Report {
Expand All @@ -58,11 +76,11 @@ class Report {
buf.writeln();
buf.writeln('## General info');
buf.writeln();
if (reportTarget.isDartLibrary) {
if (reportTarget is DartLibraryTarget) {
buf.writeln('https://api.dart.dev/dart-${reportTarget.name}/'
'dart-${reportTarget.name}-library.html');
} else {
buf.writeln(reportTarget.description);
} else if (reportTarget is PackageTarget) {
buf.writeln((reportTarget as PackageTarget).description);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If description were a nullable property of ReportTarget we could avoid this cast.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the type check to clarify, but I would rather not make this a property of ReportTarget as a DartLibraryTarget really has no description (so far).

buf.writeln();
buf.writeln('- pub page: https://pub.dev/packages/${reportTarget.name}');
buf.writeln(
Expand Down
14 changes: 8 additions & 6 deletions packages/corpus/test/visitor_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ void main() {
'pubspec': <String, dynamic>{},
}
});
ReportTarget reportTarget = ReportTarget.fromPackage(targetPackage);
ReportTarget reportTarget = PackageTarget.fromPackage(targetPackage);
PackageInfo referencingPackage = PackageInfo.from({'name': 'foo'});
Directory packageDir = Directory('test/data');

Expand Down Expand Up @@ -71,7 +71,7 @@ void main() {

test('extension references', () async {
apiUsageCollector = ApiUseCollector(
ReportTarget.fromPackage(PackageInfo.from({
PackageTarget.fromPackage(PackageInfo.from({
'name': 'collection',
'latest': {
'version': '0.1.2',
Expand Down Expand Up @@ -118,8 +118,10 @@ void main() {
});

group('ApiUseCollector - dart:', () {
ReportTarget reportTarget =
ReportTarget.fromDartLibrary('collection', _sdkVersion);
ReportTarget reportTarget = DartLibraryTarget(
name: 'collection',
version: _sdkVersion,
);
PackageInfo referencingPackage = PackageInfo.from({'name': 'foo'});
Directory packageDir = Directory('test/data');

Expand Down Expand Up @@ -170,7 +172,7 @@ void main() {

test('top-level symbol references', () async {
apiUsageCollector = ApiUseCollector(
ReportTarget.fromDartLibrary('convert', _sdkVersion),
DartLibraryTarget(name: 'convert', version: _sdkVersion),
referencingPackage,
packageDir,
);
Expand Down Expand Up @@ -199,7 +201,7 @@ void main() {

test('extension references', () async {
apiUsageCollector = ApiUseCollector(
ReportTarget.fromDartLibrary('async', _sdkVersion),
DartLibraryTarget(name: 'async', version: _sdkVersion),
referencingPackage,
packageDir,
);
Expand Down