Skip to content

Commit 324eada

Browse files
authored
Support workspaces, prepare release (#92)
1 parent c3b5962 commit 324eada

16 files changed

+3154
-1437
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 4.0.0
2+
3+
- Support (Dart 3.6) workspaces.
4+
- API refactoring to support workspaces.
5+
16
## 3.0.1
27

38
- require at least Dart 3.5

lib/src/deps_list.dart

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,19 @@ import 'package:collection/collection.dart';
22
import 'package:pub_semver/pub_semver.dart';
33
import 'package:string_scanner/string_scanner.dart';
44

5-
class DepsList extends VersionedEntry {
5+
class DepsList {
66
static final _sdkLine = RegExp(r'(\w+) SDK (.+)\n');
7-
static final _sourcePackageLine = RegExp('($_pkgName) (.+)\n');
8-
static final _emptyLine = RegExp(r'\n');
97

108
final Map<String, Version> sdks;
11-
final Map<String, Map<VersionedEntry, Map<String, VersionConstraint>>>
12-
sections;
13-
14-
Map<VersionedEntry, Map<String, VersionConstraint>> get allEntries =>
15-
CombinedMapView(sections.values);
9+
final Map<String, DepsPackageEntry> packages;
10+
final Map<VersionedEntry, Map<String, VersionConstraint>>
11+
transitiveDependencies;
1612

17-
DepsList._(
18-
super.entry,
19-
this.sdks,
20-
this.sections,
21-
) : super.copy();
13+
DepsList._(this.sdks, this.packages, {required this.transitiveDependencies}) {
14+
for (var entry in packages.values) {
15+
entry._parent = this;
16+
}
17+
}
2218

2319
factory DepsList.parse(String input) {
2420
final scanner = StringScanner(input);
@@ -36,32 +32,77 @@ class DepsList extends VersionedEntry {
3632
scanSdk();
3733
} while (scanner.matches(_sdkLine));
3834

39-
scanner.expect(_sourcePackageLine, name: 'Source package');
35+
final pkgs = <String, DepsPackageEntry>{};
36+
while (scanner.matches(_packageLine)) {
37+
final entry = DepsPackageEntry._parse(scanner);
38+
pkgs[entry.name] = entry;
39+
}
40+
41+
final section = scanner.matches(_transitiveDepsHeaderLine)
42+
? _scanSection(scanner, headerPattern: _transitiveDepsHeaderLine)
43+
.entries
44+
: <VersionedEntry, Map<String, VersionConstraint>>{};
45+
46+
return DepsList._(
47+
sdks,
48+
pkgs,
49+
transitiveDependencies: section,
50+
);
51+
}
52+
53+
Map<String, dynamic> toJson() => {
54+
'sdks': sdks,
55+
'packages': packages,
56+
'transitiveDependencies':
57+
transitiveDependencies.map((k, v) => MapEntry(k.toString(), v)),
58+
};
59+
}
60+
61+
class DepsPackageEntry extends VersionedEntry {
62+
static final _emptyLine = RegExp(r'\n');
63+
64+
final Map<String, Map<VersionedEntry, Map<String, VersionConstraint>>>
65+
sections;
66+
67+
late final DepsList _parent;
68+
69+
Map<VersionedEntry, Map<String, VersionConstraint>> get allEntries =>
70+
CombinedMapView([
71+
..._parent.packages.values.expand((e) => e.sections.values),
72+
_parent.transitiveDependencies,
73+
]);
74+
75+
DepsPackageEntry._(
76+
super.entry,
77+
this.sections,
78+
) : super.copy();
79+
80+
factory DepsPackageEntry._parse(StringScanner scanner) {
81+
scanner.expect(_packageLine, name: 'Source package');
82+
4083
final sourcePackage = VersionedEntry.fromMatch(scanner.lastMatch!);
4184

4285
final sections =
4386
<String, Map<VersionedEntry, Map<String, VersionConstraint>>>{};
4487

4588
while (scanner.scan(_emptyLine)) {
46-
final section = _scanSection(scanner);
47-
sections[section.key] = section.value;
48-
}
89+
if (!scanner.matches(_sectionHeaderLine)) {
90+
break;
91+
}
4992

50-
assert(scanner.isDone, '${scanner.position} of ${input.length}');
93+
final section = _scanSection(scanner, headerPattern: _sectionHeaderLine);
94+
sections[section.name] = section.entries;
95+
}
5196

52-
return DepsList._(
97+
return DepsPackageEntry._(
5398
sourcePackage,
54-
sdks,
5599
sections,
56100
);
57101
}
58102

59103
Map<String, dynamic> toJson() => {
60104
'name': name,
61105
'version': version.toString(),
62-
'sdks': {
63-
for (var sdk in sdks.entries) sdk.key: sdk.value.toString(),
64-
},
65106
'sections': {
66107
for (var section in sections.entries)
67108
section.key: {
@@ -87,13 +128,15 @@ const _identifierRegExp = r'[a-zA-Z_]\w*';
87128
/// when publishing a package to pub.dev.
88129
const _pkgName = '$_identifierRegExp(?:\\.$_identifierRegExp)*';
89130

90-
final _sectionHeaderLine = RegExp(r'([a-zA-Z ]+):\n');
131+
final _sectionHeaderLine = RegExp(r'(dependencies|dev dependencies):\n');
132+
final _transitiveDepsHeaderLine = RegExp(r'(transitive dependencies):\n');
133+
final _packageLine = RegExp('($_pkgName) (\\d.+)\n');
91134
final _usageLine = RegExp('- ($_pkgName) (.+)\n');
92135
final _depLine = RegExp(' - ($_pkgName) (.+)\n');
93136

94-
MapEntry<String, Map<VersionedEntry, Map<String, VersionConstraint>>>
95-
_scanSection(StringScanner scanner) {
96-
scanner.expect(_sectionHeaderLine, name: 'section header');
137+
({String name, Map<VersionedEntry, Map<String, VersionConstraint>> entries})
138+
_scanSection(StringScanner scanner, {required Pattern headerPattern}) {
139+
scanner.expect(headerPattern, name: 'section header');
97140
final header = scanner.lastMatch![1]!;
98141

99142
final entries = <VersionedEntry, Map<String, VersionConstraint>>{};
@@ -115,7 +158,7 @@ MapEntry<String, Map<VersionedEntry, Map<String, VersionConstraint>>>
115158
scanUsage();
116159
} while (scanner.matches(_usageLine));
117160

118-
return MapEntry(header, entries);
161+
return (name: header, entries: entries);
119162
}
120163

121164
class VersionedEntry {

lib/src/pub_data_service.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@ class PubDataService extends Service {
99
@override
1010
final String rootPackageDir;
1111
final bool _debug;
12-
final bool _isFlutterPkg;
12+
late final bool _isFlutterPkg;
13+
late final String packageName;
1314

14-
PubDataService(this.rootPackageDir, {bool debug = false})
15-
: _debug = debug,
16-
_isFlutterPkg = isFlutterPackage(rootPackageDir);
15+
PubDataService(this.rootPackageDir, {bool debug = false}) : _debug = debug {
16+
final details = packageDeets(rootPackageDir);
17+
_isFlutterPkg = details.isFlutterPackage;
18+
packageName = details.packageName;
19+
}
1720

1821
@override
1922
Map<String, dynamic> outdated() {
@@ -32,9 +35,11 @@ class PubDataService extends Service {
3235
}
3336

3437
@override
35-
DepsList rootDeps() {
38+
DepsPackageEntry rootDeps() {
3639
final commandOutput = _pubCommand(['deps', '-s', 'list']);
37-
return DepsList.parse(commandOutput);
40+
final list = DepsList.parse(commandOutput);
41+
42+
return list.packages[packageName]!;
3843
}
3944

4045
String _pubCommand(List<String> commandArgs) {

lib/src/pubspek.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:pubspec_parse/pubspec_parse.dart' as pubspek show Pubspec;
99
import 'package:pubspec_parse/pubspec_parse.dart' hide Pubspec;
1010
import 'package:yaml/yaml.dart' as yaml;
1111

12-
bool isFlutterPackage(String packageDir) {
12+
({String packageName, bool isFlutterPackage}) packageDeets(String packageDir) {
1313
final path = p.join(packageDir, 'pubspec.yaml');
1414

1515
final map = yaml.loadYaml(
@@ -19,7 +19,10 @@ bool isFlutterPackage(String packageDir) {
1919

2020
final pubspec = _Pubspec(map);
2121

22-
return pubspec.usesFlutter;
22+
return (
23+
packageName: pubspec._inner.name,
24+
isFlutterPackage: pubspec.usesFlutter,
25+
);
2326
}
2427

2528
class _Pubspec {

lib/src/service.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ abstract class Service {
3030
);
3131
}
3232

33-
DepsList rootDeps();
33+
DepsPackageEntry rootDeps();
3434

3535
Future<Map<String, VizPackage>> getReferencedPackages(
3636
bool flagOutdated,

lib/src/version.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: pubviz
2-
version: 3.0.1
2+
version: 4.0.0
33
description: >-
44
A tool to visualize package dependencies and version constraints in your Dart
55
project.

test/deps/empty_deps.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
{
2-
"name": "meta",
3-
"version": "1.1.8",
42
"sdks": {
53
"Dart": "2.8.0-dev.20.7"
64
},
7-
"sections": {}
5+
"packages": {
6+
"meta": {
7+
"name": "meta",
8+
"version": "1.1.8",
9+
"sections": {}
10+
}
11+
},
12+
"transitiveDependencies": {}
813
}
14+

0 commit comments

Comments
 (0)