Skip to content

Commit 8fd0eea

Browse files
authored
Migrate uses values to store dart:* references directly (dart-lang#42)
* Migrate `uses` values to store dart:* references directly Makes the values stored in JSON output much less opaque * Add description to PlatformInfo – along with other refactoring * Removed the concept of 'angular' in `uses`
1 parent 057351c commit 8fd0eea

File tree

6 files changed

+181
-116
lines changed

6 files changed

+181
-116
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
## 0.3.0
2+
3+
* Renamed `KnownPlatforms` to `PlatformFlags`. Also:
4+
* Removed `mirrors`, `browser` and `standalone`.
5+
* Renamed `native` to `dartExtension`.
6+
7+
* `PlatformInfo`
8+
* Now store `dart:*` references directly in `uses`.
9+
* `worksInStandalone` renamed to `worksOnServer`.
10+
* Other `.worksIn*` renamed to `worksOn*`.
11+
* Added `String get description` which returns a simple `String` description
12+
of the supported platforms. Examples: `everywhere`, `flutter`,
13+
`server, web`, `conflict`.
14+
* Removed `angular` as a value in `uses`.
15+
116
## 0.2.4
217

318
* Detect native extensions.

lib/src/platform.dart

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
library pana.platform;
22

3+
import 'dart:collection';
34
import 'package:source_gen/generators/json_serializable.dart';
45

56
import 'pubspec.dart';
67

78
part 'platform.g.dart';
89

9-
abstract class KnownPlatforms {
10-
static const String browser = 'browser';
11-
static const String standalone = 'standalone';
10+
abstract class PlatformFlags {
11+
/// Denotes a package that references Flutter in `pubspec.yaml`.
1212
static const String flutter = 'flutter';
13-
static const String mirrors = 'mirrors';
1413

15-
/// Native extensions (Dart VM with C/C++ code).
16-
static const String native = 'native';
17-
18-
static const String angular = 'angular';
14+
/// Denotes a library that depends on a native extensions via `dart-ext:`
15+
static const String dartExtension = 'dart-ext';
1916
}
2017

2118
class PlatformSummary {
@@ -30,8 +27,8 @@ class PlatformSummary {
3027
_conflictsFlutter;
3128

3229
bool get _conflictsFlutter =>
33-
package.uses.contains(KnownPlatforms.flutter) &&
34-
libraries.values.any((p) => !p.worksInFlutter);
30+
package.uses.contains(PlatformFlags.flutter) &&
31+
libraries.values.any((p) => !p.worksOnFlutter);
3532
}
3633

3734
@JsonSerializable()
@@ -48,28 +45,54 @@ class PlatformInfo extends Object with _$PlatformInfoSerializerMixin {
4845

4946
bool get hasConflict =>
5047
(!worksAnywhere) ||
51-
(uses.contains(KnownPlatforms.flutter) && !worksInFlutter) ||
52-
(uses.contains(KnownPlatforms.native) && !worksInStandalone);
48+
(uses.contains(PlatformFlags.flutter) && !worksOnFlutter) ||
49+
(uses.contains(PlatformFlags.dartExtension) && !worksOnServer);
50+
51+
bool get worksEverywhere => worksOnWeb && worksOnServer && worksOnFlutter;
52+
53+
bool get worksAnywhere => worksOnWeb || worksOnServer || worksOnFlutter;
54+
55+
bool get worksOnWeb =>
56+
_hasNoUseOf(
57+
[PlatformFlags.flutter, 'dart:ui', PlatformFlags.dartExtension]) &&
58+
(_webPackages.any(uses.contains) || _hasNoUseOf(['dart:io']));
59+
60+
bool get worksOnServer =>
61+
_hasNoUseOf(_webAnd(['dart:ui', PlatformFlags.flutter]));
5362

54-
bool get worksEverywhere =>
55-
worksInBrowser && worksInStandalone && worksInFlutter;
63+
bool get worksOnFlutter => _hasNoUseOf(_webAnd([
64+
'dart:mirrors',
65+
PlatformFlags.dartExtension,
66+
]));
5667

57-
bool get worksAnywhere =>
58-
worksInBrowser || worksInStandalone || worksInFlutter;
68+
String get description {
69+
if (worksEverywhere) {
70+
return 'everywhere';
71+
}
5972

60-
bool get worksInBrowser =>
61-
_hasNoUseOf([KnownPlatforms.flutter, KnownPlatforms.native]) &&
62-
(uses.contains(KnownPlatforms.browser) ||
63-
_hasNoUseOf([KnownPlatforms.standalone]));
73+
var items = <String>[];
74+
if (worksOnFlutter) {
75+
items.add('flutter');
76+
}
6477

65-
bool get worksInStandalone =>
66-
_hasNoUseOf([KnownPlatforms.browser, KnownPlatforms.flutter]);
78+
if (worksOnServer) {
79+
items.add('server');
80+
}
6781

68-
bool get worksInFlutter => _hasNoUseOf([
69-
KnownPlatforms.browser,
70-
KnownPlatforms.mirrors,
71-
KnownPlatforms.native,
72-
]);
82+
if (worksOnWeb) {
83+
items.add('web');
84+
}
85+
86+
if (items.isEmpty) {
87+
assert(hasConflict);
88+
return 'conflict';
89+
}
90+
91+
return items.join(', ');
92+
}
93+
94+
@override
95+
String toString() => 'PlatformInfo: $description';
7396

7497
bool _hasNoUseOf(Iterable<String> platforms) =>
7598
!platforms.any((p) => uses.contains(p));
@@ -78,7 +101,7 @@ class PlatformInfo extends Object with _$PlatformInfoSerializerMixin {
78101
PlatformInfo classifyPubspec(Pubspec pubspec) {
79102
final Set<String> uses = new Set();
80103
if (pubspec.hasFlutterKey || pubspec.dependsOnFlutterSdk) {
81-
uses.add(KnownPlatforms.flutter);
104+
uses.add(PlatformFlags.flutter);
82105
}
83106
return new PlatformInfo(uses);
84107
}
@@ -94,36 +117,22 @@ PlatformSummary classifyPlatforms(
94117

95118
PlatformInfo classifyPlatform(Iterable<String> dependencies) {
96119
Set<String> libs = dependencies.toSet();
97-
Set<String> uses = new Set();
98-
99-
if (_webPackages.any(libs.contains)) {
100-
uses.add(KnownPlatforms.browser);
101-
}
102-
103-
if (libs.contains('dart:io')) {
104-
uses.add(KnownPlatforms.standalone);
105-
}
106-
107-
if (libs.contains('dart:ui')) {
108-
uses.add(KnownPlatforms.flutter);
109-
}
120+
Set<String> uses = new SplayTreeSet<String>();
110121

111-
if (libs.contains('dart:mirrors')) {
112-
uses.add(KnownPlatforms.mirrors);
113-
}
122+
uses.addAll(libs.where((l) => _dartLibRegexp.hasMatch(l)));
114123

115124
if (libs.any((String lib) => lib.startsWith('dart-ext:'))) {
116-
uses.add(KnownPlatforms.native);
117-
}
118-
119-
// packages
120-
if (libs.any((p) => p.startsWith('package:angular2/'))) {
121-
uses.add(KnownPlatforms.angular);
125+
uses.add(PlatformFlags.dartExtension);
122126
}
123127

124128
return new PlatformInfo(uses);
125129
}
126130

131+
final _dartLibRegexp = new RegExp(r"^dart:[a-z_]+$");
132+
133+
Iterable<String> _webAnd(Iterable<String> other) =>
134+
[_webPackages, other].expand((s) => s);
135+
127136
const List<String> _webPackages = const [
128137
'dart:html',
129138
'dart:indexed_db',

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: pana
22
description: Evaluate the health and quality of a Dart package
3-
version: 0.2.4
3+
version: 0.3.0-dev
44
homepage: https://github.com/dart-lang/pana
55
author: Dart Team <[email protected]>
66

test/end2end/http_data.dart

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,15 @@ final data = {
183183
"package:typed_data/typed_data.dart"
184184
],
185185
"platform": {
186-
"uses": ["browser", "standalone"]
186+
"uses": [
187+
'dart:async',
188+
'dart:collection',
189+
'dart:convert',
190+
'dart:html',
191+
'dart:io',
192+
'dart:math',
193+
'dart:typed_data'
194+
]
187195
}
188196
},
189197
"lib/http.dart": {
@@ -340,7 +348,14 @@ final data = {
340348
"package:typed_data/typed_data.dart"
341349
],
342350
"platform": {
343-
"uses": ["standalone"]
351+
"uses": [
352+
'dart:async',
353+
'dart:collection',
354+
'dart:convert',
355+
'dart:io',
356+
'dart:math',
357+
'dart:typed_data'
358+
]
344359
}
345360
},
346361
"lib/src/base_client.dart": {
@@ -573,7 +588,14 @@ final data = {
573588
"package:typed_data/typed_data.dart"
574589
],
575590
"platform": {
576-
"uses": ["standalone"]
591+
"uses": [
592+
'dart:async',
593+
'dart:collection',
594+
'dart:convert',
595+
'dart:io',
596+
'dart:math',
597+
'dart:typed_data'
598+
]
577599
}
578600
},
579601
"test/html/client_test.dart": {

test/end2end/pub_server_data.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ final data = {
127127
"package:pub_semver/src/version_range.dart",
128128
"package:pub_semver/src/version_union.dart"
129129
],
130-
"platform": {"uses": []}
130+
"platform": {
131+
"uses": ['dart:async', 'dart:collection', 'dart:math']
132+
}
131133
},
132134
"lib/shelf_pubserver.dart": {
133135
"uri": "package:pub_server/shelf_pubserver.dart",
@@ -328,7 +330,16 @@ final data = {
328330
"package:yaml/src/yaml_node_wrapper.dart",
329331
"package:yaml/yaml.dart"
330332
],
331-
"platform": {"uses": []}
333+
"platform": {
334+
"uses": [
335+
'dart:async',
336+
'dart:collection',
337+
'dart:convert',
338+
'dart:isolate',
339+
'dart:math',
340+
'dart:typed_data'
341+
]
342+
}
332343
},
333344
"test/shelf_pubserver_test.dart": {
334345
"uri": "path:pub_server/test/shelf_pubserver_test.dart",

0 commit comments

Comments
 (0)