Skip to content

Commit

Permalink
Expose wasm readiness analysis in the report (without any score)
Browse files Browse the repository at this point in the history
  • Loading branch information
isoos committed Aug 15, 2024
1 parent c5894c5 commit 817547d
Show file tree
Hide file tree
Showing 38 changed files with 206 additions and 40 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.22.11

- Expose `wasm` readiness analysis in the report (without any score).

## 0.22.10

- Remove `workspace` and `resolution` properties from pubspec before analyzing.
Expand Down
10 changes: 7 additions & 3 deletions lib/src/internal_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
// BSD-style license that can be found in the LICENSE file.

import 'package:json_annotation/json_annotation.dart';
import 'package:pana/src/tag/pana_tags.dart';
import 'package:pana/src/tool/run_constrained.dart';

import 'model.dart';
import 'tag/_common.dart';
import 'tag/pana_tags.dart';
import 'tool/run_constrained.dart';

part 'internal_model.g.dart';

Expand Down Expand Up @@ -52,16 +53,19 @@ class VersionDescriptor {
class AnalyzeToolResult {
final List<CodeProblem>? items;
final List<String> tags;
final List<Explanation> explanations;
final ToolException? toolError;

AnalyzeToolResult({
required this.items,
required this.tags,
required this.explanations,
}) : toolError = null;

AnalyzeToolResult.toolError(this.toolError)
: items = null,
tags = [PanaTags.hasError];
tags = [PanaTags.hasError],
explanations = [];

bool get hasError => toolError != null;
}
Expand Down
11 changes: 7 additions & 4 deletions lib/src/package_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,9 @@ class PackageContext {
}();

late final Future<AnalyzeToolResult> staticAnalysis = () async {
final tags = <String>[];
List<CodeProblem>? items;
final tags = <String>[];
final explanations = <Explanation>[];
final dartFiles = await _dartFiles;

if (!await resolveDependencies()) {
Expand All @@ -264,8 +265,6 @@ class PackageContext {

if (items != null && !items.any((item) => item.isError)) {
final tagger = Tagger(packageDir);
// tags are exposed, explanations are ignored
final explanations = <Explanation>[];
// TODO: refactor these methods to return the tags+explanations
tagger.sdkTags(tags, explanations);
tagger.platformTags(tags, explanations);
Expand All @@ -279,7 +278,11 @@ class PackageContext {
} else {
tags.add(PanaTags.hasError);
}
return AnalyzeToolResult(items: items, tags: tags);
return AnalyzeToolResult(
items: items,
tags: tags,
explanations: explanations,
);
}();

Future<List<CodeProblem>> _staticAnalysis({
Expand Down
6 changes: 2 additions & 4 deletions lib/src/report/create_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import '../model.dart';
import '../package_context.dart';
import '../pubspec.dart';

import 'dependencies.dart';
import 'documentation.dart';
Expand All @@ -19,9 +18,8 @@ import 'template.dart';
export '_common.dart' show renderSimpleSectionSummary;

Future<Report> createReport(PackageContext context) async {
Pubspec pubspec;
try {
pubspec = context.pubspec;
context.pubspec;
} on Exception catch (e) {
return Report(
sections: [
Expand All @@ -38,7 +36,7 @@ Future<Report> createReport(PackageContext context) async {
}

final templateReport = await followsTemplate(context);
final platformReport = await multiPlatform(context.packageDir, pubspec);
final platformReport = await multiPlatform(context);
final staticAnalysisReport = await staticAnalysis(context);
final dependenciesReport = await trustworthyDependency(context);

Expand Down
50 changes: 43 additions & 7 deletions lib/src/report/multi_platform.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ import 'dart:io';
import 'package:path/path.dart' as p;

import '../model.dart';
import '../pubspec.dart';
import '../package_context.dart';
import '../tag/pana_tags.dart';
import '../tag/tagger.dart';
import '_common.dart';

Future<ReportSection> multiPlatform(String packageDir, Pubspec pubspec) async {
Future<ReportSection> multiPlatform(PackageContext context) async {
Subsection subsection;
final flutterPackage = pubspec.usesFlutter;
final flutterPackage = context.pubspec.usesFlutter;

if (File(p.join(packageDir, '.dart_tool', 'package_config.json'))
if (File(p.join(context.packageDir, '.dart_tool', 'package_config.json'))
.existsSync()) {
final tags = <String>[];
final explanations = <Explanation>[];
final tagger = Tagger(packageDir);
final tagger = Tagger(context.packageDir);
final sdkTags = <String>[];
final sdkExplanations = <Explanation>[];
tagger.sdkTags(sdkTags, sdkExplanations);
Expand Down Expand Up @@ -117,11 +117,47 @@ Future<ReportSection> multiPlatform(String packageDir, Pubspec pubspec) async {
);
}

final wasmSubsection = await _createWasmSubsection(context);

return makeSection(
id: ReportSectionId.platform,
title: 'Platform support',
maxPoints: 20,
basePath: packageDir,
subsections: [subsection],
basePath: context.packageDir,
subsections: [subsection, wasmSubsection],
maxIssues: 20);
}

Future<Subsection> _createWasmSubsection(PackageContext context) async {
final tr = await context.staticAnalysis;
final description = 'WASM readiness';
final explanation =
tr.explanations.where((e) => e.tag == PanaTags.isWasmReady).firstOrNull;
if (explanation != null) {
return Subsection(
description,
[explanationToIssue(explanation)],
0,
0,
ReportStatus.failed,
);
}

if (tr.tags.contains(PanaTags.isWasmReady)) {
return Subsection(
description,
[RawParagraph('Package is compatible with runtime `wasm`.')],
0,
0,
ReportStatus.passed,
);
} else {
return Subsection(
description,
[RawParagraph('Unable to detect compatibility with runtime `wasm`.')],
0,
0,
ReportStatus.failed,
);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: pana
description: PAckage aNAlyzer - produce a report summarizing the health and quality of a Dart package.
version: 0.22.10
version: 0.22.11
repository: https://github.com/dart-lang/pana
topics:
- tool
Expand Down
2 changes: 1 addition & 1 deletion test/goldens/end2end/_dummy_pkg-1.0.0-null-safety.1.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"grantedPoints": 0,
"maxPoints": 20,
"status": "failed",
"summary": "### [x] 0/20 points: Platform support detection failed\n\n<details>\n<summary>\nCould not determine supported platforms as package resolution failed.\n</summary>\n\nRun `dart pub get` for more information.\n</details>"
"summary": "### [x] 0/20 points: Platform support detection failed\n\n<details>\n<summary>\nCould not determine supported platforms as package resolution failed.\n</summary>\n\nRun `dart pub get` for more information.\n</details>\n\n### [x] 0/0 points: WASM readiness\n\nUnable to detect compatibility with runtime `wasm`."
},
{
"id": "analysis",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ Could not determine supported platforms as package resolution failed.
Run `dart pub get` for more information.
</details>

### [x] 0/0 points: WASM readiness

Unable to detect compatibility with runtime `wasm`.

## 0/50 Pass static analysis

### [x] 0/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
2 changes: 1 addition & 1 deletion test/goldens/end2end/async-2.11.0.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
"grantedPoints": 20,
"maxPoints": 20,
"status": "passed",
"summary": "### [*] 20/20 points: Supports 6 of 6 possible platforms (**iOS**, **Android**, **Web**, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n* ✓ Web"
"summary": "### [*] 20/20 points: Supports 6 of 6 possible platforms (**iOS**, **Android**, **Web**, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n* ✓ Web\n\n### [*] 0/0 points: WASM readiness\n\nPackage is compatible with runtime `wasm`."
},
{
"id": "analysis",
Expand Down
4 changes: 4 additions & 0 deletions test/goldens/end2end/async-2.11.0.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ See [package layout](https://dart.dev/tools/pub/package-layout#examples) guideli
* ✓ macOS
* ✓ Web

### [*] 0/0 points: WASM readiness

Package is compatible with runtime `wasm`.

## 50/50 Pass static analysis

### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
4 changes: 2 additions & 2 deletions test/goldens/end2end/audio_service-0.18.10.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@
"title": "Platform support",
"grantedPoints": 20,
"maxPoints": 20,
"status": "passed",
"summary": "### [*] 20/20 points: Supports 4 of 6 possible platforms (**iOS**, **Android**, **Web**, Windows, **macOS**, Linux)\n\n* ✓ Android\n* ✓ iOS\n* ✓ macOS\n* ✓ Web\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage does not support platform `Windows`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that declares support for platforms: `Android`, `iOS`, `macOS`, `Web`.\n</details>\n<details>\n<summary>\nPackage does not support platform `Linux`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that declares support for platforms: `Android`, `iOS`, `macOS`, `Web`.\n</details>\n\nThese issues are present but do not affect the score, because they may not originate in your package:\n\n<details>\n<summary>\nPackage does not support platform `Web`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that imports:\n* `package:flutter_cache_manager/flutter_cache_manager.dart` that imports:\n* `package:flutter_cache_manager/src/storage/cache_info_repositories/cache_info_repositories.dart` that imports:\n* `package:flutter_cache_manager/src/storage/cache_info_repositories/json_cache_info_repository.dart` that imports:\n* `package:path_provider/path_provider.dart` that declares support for platforms: `Android`, `iOS`, `Windows`, `Linux`, `macOS`.\n</details>"
"status": "failed",
"summary": "### [*] 20/20 points: Supports 4 of 6 possible platforms (**iOS**, **Android**, **Web**, Windows, **macOS**, Linux)\n\n* ✓ Android\n* ✓ iOS\n* ✓ macOS\n* ✓ Web\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage does not support platform `Windows`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that declares support for platforms: `Android`, `iOS`, `macOS`, `Web`.\n</details>\n<details>\n<summary>\nPackage does not support platform `Linux`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that declares support for platforms: `Android`, `iOS`, `macOS`, `Web`.\n</details>\n\nThese issues are present but do not affect the score, because they may not originate in your package:\n\n<details>\n<summary>\nPackage does not support platform `Web`.\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that imports:\n* `package:flutter_cache_manager/flutter_cache_manager.dart` that imports:\n* `package:flutter_cache_manager/src/storage/cache_info_repositories/cache_info_repositories.dart` that imports:\n* `package:flutter_cache_manager/src/storage/cache_info_repositories/json_cache_info_repository.dart` that imports:\n* `package:path_provider/path_provider.dart` that declares support for platforms: `Android`, `iOS`, `Windows`, `Linux`, `macOS`.\n</details>\n\n### [x] 0/0 points: WASM readiness\n\n<details>\n<summary>\nPackage not compatible with runtime wasm\n</summary>\n\nBecause:\n* `package:audio_service/audio_service.dart` that imports:\n* `package:flutter_cache_manager/flutter_cache_manager.dart` that imports:\n* `package:flutter_cache_manager/src/web/web_helper.dart` that imports:\n* `package:flutter_cache_manager/src/cache_store.dart` that imports:\n* `package:flutter_cache_manager/src/storage/file_system/file_system.dart` that imports:\n* `package:file/file.dart` that imports:\n* `package:file/src/interface.dart` that imports:\n* `package:file/src/io.dart` that imports:\n* `dart:io`\n</details>"
},
{
"id": "analysis",
Expand Down
19 changes: 19 additions & 0 deletions test/goldens/end2end/audio_service-0.18.10.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,25 @@ Because:
* `package:path_provider/path_provider.dart` that declares support for platforms: `Android`, `iOS`, `Windows`, `Linux`, `macOS`.
</details>

### [x] 0/0 points: WASM readiness

<details>
<summary>
Package not compatible with runtime wasm
</summary>

Because:
* `package:audio_service/audio_service.dart` that imports:
* `package:flutter_cache_manager/flutter_cache_manager.dart` that imports:
* `package:flutter_cache_manager/src/web/web_helper.dart` that imports:
* `package:flutter_cache_manager/src/cache_store.dart` that imports:
* `package:flutter_cache_manager/src/storage/file_system/file_system.dart` that imports:
* `package:file/file.dart` that imports:
* `package:file/src/interface.dart` that imports:
* `package:file/src/io.dart` that imports:
* `dart:io`
</details>

## 50/50 Pass static analysis

### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
2 changes: 1 addition & 1 deletion test/goldens/end2end/bulma_min-0.7.4.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
"grantedPoints": 0,
"maxPoints": 20,
"status": "failed",
"summary": "### [x] 0/20 points: Platform support detection failed\n\n<details>\n<summary>\nCould not determine supported platforms as package resolution failed.\n</summary>\n\nRun `dart pub get` for more information.\n</details>"
"summary": "### [x] 0/20 points: Platform support detection failed\n\n<details>\n<summary>\nCould not determine supported platforms as package resolution failed.\n</summary>\n\nRun `dart pub get` for more information.\n</details>\n\n### [x] 0/0 points: WASM readiness\n\nUnable to detect compatibility with runtime `wasm`."
},
{
"id": "analysis",
Expand Down
4 changes: 4 additions & 0 deletions test/goldens/end2end/bulma_min-0.7.4.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ Could not determine supported platforms as package resolution failed.
Run `dart pub get` for more information.
</details>

### [x] 0/0 points: WASM readiness

Unable to detect compatibility with runtime `wasm`.

## 0/50 Pass static analysis

### [x] 0/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
4 changes: 2 additions & 2 deletions test/goldens/end2end/dnd-2.0.1.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@
"title": "Platform support",
"grantedPoints": 20,
"maxPoints": 20,
"status": "passed",
"summary": "### [*] 20/20 points: Supports 1 of 6 possible platforms (iOS, Android, **Web**, Windows, macOS, Linux)\n\n* ✓ Web\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage not compatible with platform Android\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform iOS\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform Windows\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform Linux\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform macOS\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>"
"status": "failed",
"summary": "### [*] 20/20 points: Supports 1 of 6 possible platforms (iOS, Android, **Web**, Windows, macOS, Linux)\n\n* ✓ Web\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage not compatible with platform Android\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform iOS\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform Windows\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform Linux\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n<details>\n<summary>\nPackage not compatible with platform macOS\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>\n\n### [x] 0/0 points: WASM readiness\n\n<details>\n<summary>\nPackage not compatible with runtime wasm\n</summary>\n\nBecause:\n* `package:dnd/dnd.dart` that imports:\n* `dart:js`\n</details>"
},
{
"id": "analysis",
Expand Down
12 changes: 12 additions & 0 deletions test/goldens/end2end/dnd-2.0.1.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,18 @@ Because:
* `dart:js`
</details>

### [x] 0/0 points: WASM readiness

<details>
<summary>
Package not compatible with runtime wasm
</summary>

Because:
* `package:dnd/dnd.dart` that imports:
* `dart:js`
</details>

## 30/50 Pass static analysis

### [x] 30/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
4 changes: 2 additions & 2 deletions test/goldens/end2end/gg-1.0.12.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@
"title": "Platform support",
"grantedPoints": 20,
"maxPoints": 20,
"status": "passed",
"summary": "### [*] 20/20 points: Supports 5 of 6 possible platforms (**iOS**, **Android**, Web, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage not compatible with platform Web\n</summary>\n\nBecause:\n* `package:gg/gg.dart` that imports:\n* `package:gg/src/tools/checks.dart` that imports:\n* `package:gg_publish/gg_publish.dart` that imports:\n* `package:gg_publish/src/commands/publish.dart` that imports:\n* `package:gg_version/gg_version.dart` that imports:\n* `package:gg_version/src/commands/published_version.dart` that imports:\n* `package:gg_args/gg_args.dart` that imports:\n* `package:gg_args/src/missing_sub_commands.dart` that imports:\n* `dart:io`\n</details>"
"status": "failed",
"summary": "### [*] 20/20 points: Supports 5 of 6 possible platforms (**iOS**, **Android**, Web, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n\nThese platforms are not supported:\n\n<details>\n<summary>\nPackage not compatible with platform Web\n</summary>\n\nBecause:\n* `package:gg/gg.dart` that imports:\n* `package:gg/src/tools/checks.dart` that imports:\n* `package:gg_publish/gg_publish.dart` that imports:\n* `package:gg_publish/src/commands/publish.dart` that imports:\n* `package:gg_version/gg_version.dart` that imports:\n* `package:gg_version/src/commands/published_version.dart` that imports:\n* `package:gg_args/gg_args.dart` that imports:\n* `package:gg_args/src/missing_sub_commands.dart` that imports:\n* `dart:io`\n</details>\n\n### [x] 0/0 points: WASM readiness\n\n<details>\n<summary>\nPackage not compatible with runtime wasm\n</summary>\n\nBecause:\n* `package:gg/gg.dart` that imports:\n* `package:gg/src/tools/checks.dart` that imports:\n* `package:gg_publish/gg_publish.dart` that imports:\n* `package:gg_publish/src/commands/publish.dart` that imports:\n* `package:gg_version/gg_version.dart` that imports:\n* `package:gg_version/src/commands/published_version.dart` that imports:\n* `package:gg_args/gg_args.dart` that imports:\n* `package:gg_args/src/missing_sub_commands.dart` that imports:\n* `dart:io`\n</details>"
},
{
"id": "analysis",
Expand Down
19 changes: 19 additions & 0 deletions test/goldens/end2end/gg-1.0.12.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,25 @@ Because:
* `dart:io`
</details>

### [x] 0/0 points: WASM readiness

<details>
<summary>
Package not compatible with runtime wasm
</summary>

Because:
* `package:gg/gg.dart` that imports:
* `package:gg/src/tools/checks.dart` that imports:
* `package:gg_publish/gg_publish.dart` that imports:
* `package:gg_publish/src/commands/publish.dart` that imports:
* `package:gg_version/gg_version.dart` that imports:
* `package:gg_version/src/commands/published_version.dart` that imports:
* `package:gg_args/gg_args.dart` that imports:
* `package:gg_args/src/missing_sub_commands.dart` that imports:
* `dart:io`
</details>

## 50/50 Pass static analysis

### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
2 changes: 1 addition & 1 deletion test/goldens/end2end/http-0.13.0.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
"grantedPoints": 20,
"maxPoints": 20,
"status": "passed",
"summary": "### [*] 20/20 points: Supports 6 of 6 possible platforms (**iOS**, **Android**, **Web**, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n* ✓ Web"
"summary": "### [*] 20/20 points: Supports 6 of 6 possible platforms (**iOS**, **Android**, **Web**, **Windows**, **macOS**, **Linux**)\n\n* ✓ Android\n* ✓ iOS\n* ✓ Windows\n* ✓ Linux\n* ✓ macOS\n* ✓ Web\n\n### [*] 0/0 points: WASM readiness\n\nPackage is compatible with runtime `wasm`."
},
{
"id": "analysis",
Expand Down
4 changes: 4 additions & 0 deletions test/goldens/end2end/http-0.13.0.json_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ Detected license: `BSD-3-Clause`.
* ✓ macOS
* ✓ Web

### [*] 0/0 points: WASM readiness

Package is compatible with runtime `wasm`.

## 40/50 Pass static analysis

### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues
Expand Down
Loading

0 comments on commit 817547d

Please sign in to comment.