From 8fe1437f0ed07f13e594c3eddcfa87d459ccccef Mon Sep 17 00:00:00 2001 From: Moritz Date: Wed, 9 Nov 2022 16:54:07 +0100 Subject: [PATCH 1/3] Small changes --- packages/corpus/lib/api.dart | 2 +- packages/corpus/lib/api_usage.dart | 45 +++++++++------------ packages/corpus/lib/pub.dart | 7 +--- packages/corpus/lib/report.dart | 56 +++++++++++++++++--------- packages/corpus/test/visitor_test.dart | 14 ++++--- 5 files changed, 68 insertions(+), 56 deletions(-) diff --git a/packages/corpus/lib/api.dart b/packages/corpus/lib/api.dart index 80503eb8..a449a484 100644 --- a/packages/corpus/lib/api.dart +++ b/packages/corpus/lib/api.dart @@ -134,7 +134,7 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor { if (uri != null && uri.startsWith('$targetType:')) { bool matches; - if (reportTarget.isDartLibrary) { + if (reportTarget is DartLibrary) { matches = uri == 'dart:$targetName'; } else { matches = uri.startsWith('package:$targetName/'); diff --git a/packages/corpus/lib/api_usage.dart b/packages/corpus/lib/api_usage.dart index ae488c12..d8f7a9eb 100644 --- a/packages/corpus/lib/api_usage.dart +++ b/packages/corpus/lib/api_usage.dart @@ -22,34 +22,29 @@ 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 = DartLibrary(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); @@ -61,8 +56,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) { @@ -109,7 +104,8 @@ Future analyzeUsage({ localPackage.directory, ); var message = usage.describeUsage(); - if (reportTarget.isDartLibrary && !usage.hadAnyReferences) { + var hasNoUsage = reportTarget is DartLibrary && !usage.hadAnyReferences; + if (hasNoUsage) { message = 'skipping - no dart:${reportTarget.name} references'; } progress.finish(message: message); @@ -117,14 +113,13 @@ Future analyzeUsage({ // 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; } diff --git a/packages/corpus/lib/pub.dart b/packages/corpus/lib/pub.dart index 9f983e12..b2a47269 100644 --- a/packages/corpus/lib/pub.dart +++ b/packages/corpus/lib/pub.dart @@ -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); } diff --git a/packages/corpus/lib/report.dart b/packages/corpus/lib/report.dart index f3b636d3..46a592b3 100644 --- a/packages/corpus/lib/report.dart +++ b/packages/corpus/lib/report.dart @@ -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 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 getPackages(Pub pub) => pub.popularDependenciesOf(name); +} + +class DartLibrary extends ReportTarget { + DartLibrary({required super.name, required super.version}); + + @override + String get type => 'dart'; - bool get isPackage => !isDartLibrary; + @override + Stream getPackages(Pub pub) => pub.allPubPackages(); } class Report { @@ -58,11 +76,11 @@ class Report { buf.writeln(); buf.writeln('## General info'); buf.writeln(); - if (reportTarget.isDartLibrary) { + if (reportTarget is DartLibrary) { buf.writeln('https://api.dart.dev/dart-${reportTarget.name}/' 'dart-${reportTarget.name}-library.html'); } else { - buf.writeln(reportTarget.description); + buf.writeln((reportTarget as PackageTarget).description); buf.writeln(); buf.writeln('- pub page: https://pub.dev/packages/${reportTarget.name}'); buf.writeln( diff --git a/packages/corpus/test/visitor_test.dart b/packages/corpus/test/visitor_test.dart index 0295d748..0b3ad4a9 100644 --- a/packages/corpus/test/visitor_test.dart +++ b/packages/corpus/test/visitor_test.dart @@ -20,7 +20,7 @@ void main() { 'pubspec': {}, } }); - ReportTarget reportTarget = ReportTarget.fromPackage(targetPackage); + ReportTarget reportTarget = PackageTarget.fromPackage(targetPackage); PackageInfo referencingPackage = PackageInfo.from({'name': 'foo'}); Directory packageDir = Directory('test/data'); @@ -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', @@ -118,8 +118,10 @@ void main() { }); group('ApiUseCollector - dart:', () { - ReportTarget reportTarget = - ReportTarget.fromDartLibrary('collection', _sdkVersion); + ReportTarget reportTarget = DartLibrary( + name: 'collection', + version: _sdkVersion, + ); PackageInfo referencingPackage = PackageInfo.from({'name': 'foo'}); Directory packageDir = Directory('test/data'); @@ -170,7 +172,7 @@ void main() { test('top-level symbol references', () async { apiUsageCollector = ApiUseCollector( - ReportTarget.fromDartLibrary('convert', _sdkVersion), + DartLibrary(name: 'convert', version: _sdkVersion), referencingPackage, packageDir, ); @@ -199,7 +201,7 @@ void main() { test('extension references', () async { apiUsageCollector = ApiUseCollector( - ReportTarget.fromDartLibrary('async', _sdkVersion), + DartLibrary(name: 'async', version: _sdkVersion), referencingPackage, packageDir, ); From 73b2f6a4f3344ded83e6dc0c9c54590b606365de Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 10 Nov 2022 09:27:48 +0100 Subject: [PATCH 2/3] Rename class --- packages/corpus/lib/api.dart | 2 +- packages/corpus/lib/api_usage.dart | 9 +++++---- packages/corpus/lib/report.dart | 11 ++++++----- packages/corpus/test/visitor_test.dart | 6 +++--- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/corpus/lib/api.dart b/packages/corpus/lib/api.dart index a449a484..51c45746 100644 --- a/packages/corpus/lib/api.dart +++ b/packages/corpus/lib/api.dart @@ -134,7 +134,7 @@ class ApiUseCollector extends RecursiveAstVisitor implements SurveyorVisitor { if (uri != null && uri.startsWith('$targetType:')) { bool matches; - if (reportTarget is DartLibrary) { + if (reportTarget is DartLibraryTarget) { matches = uri == 'dart:$targetName'; } else { matches = uri.startsWith('package:$targetName/'); diff --git a/packages/corpus/lib/api_usage.dart b/packages/corpus/lib/api_usage.dart index d8f7a9eb..0d436620 100644 --- a/packages/corpus/lib/api_usage.dart +++ b/packages/corpus/lib/api_usage.dart @@ -33,7 +33,8 @@ Future analyzeUsage({ ReportTarget reportTarget; if (packageName.startsWith('dart:')) { var nameWithoutPrefix = packageName.substring('dart:'.length); - reportTarget = DartLibrary(name: nameWithoutPrefix, version: sdkVersion); + reportTarget = + DartLibraryTarget(name: nameWithoutPrefix, version: sdkVersion); } else { var packageInfo = await pub.getPackageInfo(packageName); reportTarget = PackageTarget.fromPackage(packageInfo); @@ -104,7 +105,8 @@ Future analyzeUsage({ localPackage.directory, ); var message = usage.describeUsage(); - var hasNoUsage = reportTarget is DartLibrary && !usage.hadAnyReferences; + var hasNoUsage = + reportTarget is DartLibraryTarget && !usage.hadAnyReferences; if (hasNoUsage) { message = 'skipping - no dart:${reportTarget.name} references'; } @@ -125,8 +127,7 @@ Future analyzeUsage({ } } - var report = Report(reportTarget); - var file = report.generateReport( + var file = Report(reportTarget).generateReport( usageInfo, showSrcReferences: showSrcReferences, ); diff --git a/packages/corpus/lib/report.dart b/packages/corpus/lib/report.dart index 46a592b3..0f15d8d6 100644 --- a/packages/corpus/lib/report.dart +++ b/packages/corpus/lib/report.dart @@ -50,8 +50,8 @@ class PackageTarget extends ReportTarget { Stream getPackages(Pub pub) => pub.popularDependenciesOf(name); } -class DartLibrary extends ReportTarget { - DartLibrary({required super.name, required super.version}); +class DartLibraryTarget extends ReportTarget { + DartLibraryTarget({required super.name, required super.version}); @override String get type => 'dart'; @@ -76,11 +76,12 @@ class Report { buf.writeln(); buf.writeln('## General info'); buf.writeln(); - if (reportTarget is DartLibrary) { + if (reportTarget is DartLibraryTarget) { buf.writeln('https://api.dart.dev/dart-${reportTarget.name}/' 'dart-${reportTarget.name}-library.html'); - } else { - buf.writeln((reportTarget as PackageTarget).description); + } else if (reportTarget is PackageTarget) { + var packageTarget = reportTarget as PackageTarget; + buf.writeln(packageTarget.description); buf.writeln(); buf.writeln('- pub page: https://pub.dev/packages/${reportTarget.name}'); buf.writeln( diff --git a/packages/corpus/test/visitor_test.dart b/packages/corpus/test/visitor_test.dart index 0b3ad4a9..c4a4e259 100644 --- a/packages/corpus/test/visitor_test.dart +++ b/packages/corpus/test/visitor_test.dart @@ -118,7 +118,7 @@ void main() { }); group('ApiUseCollector - dart:', () { - ReportTarget reportTarget = DartLibrary( + ReportTarget reportTarget = DartLibraryTarget( name: 'collection', version: _sdkVersion, ); @@ -172,7 +172,7 @@ void main() { test('top-level symbol references', () async { apiUsageCollector = ApiUseCollector( - DartLibrary(name: 'convert', version: _sdkVersion), + DartLibraryTarget(name: 'convert', version: _sdkVersion), referencingPackage, packageDir, ); @@ -201,7 +201,7 @@ void main() { test('extension references', () async { apiUsageCollector = ApiUseCollector( - DartLibrary(name: 'async', version: _sdkVersion), + DartLibraryTarget(name: 'async', version: _sdkVersion), referencingPackage, packageDir, ); From 768c73da46d38f690c71dc1b97b22d111108095c Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 10 Nov 2022 09:31:15 +0100 Subject: [PATCH 3/3] Inline variable --- packages/corpus/lib/report.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/corpus/lib/report.dart b/packages/corpus/lib/report.dart index 0f15d8d6..86bd72d9 100644 --- a/packages/corpus/lib/report.dart +++ b/packages/corpus/lib/report.dart @@ -80,8 +80,7 @@ class Report { buf.writeln('https://api.dart.dev/dart-${reportTarget.name}/' 'dart-${reportTarget.name}-library.html'); } else if (reportTarget is PackageTarget) { - var packageTarget = reportTarget as PackageTarget; - buf.writeln(packageTarget.description); + buf.writeln((reportTarget as PackageTarget).description); buf.writeln(); buf.writeln('- pub page: https://pub.dev/packages/${reportTarget.name}'); buf.writeln(