tools/package_deps: allow "normal" deps as long as there is a path override

Also migrate to null safety, drop unused pedantic dep

Change-Id: Ic3be5af7e7933f2bd757e9dcdda62eb5be99c5bf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/218085
Auto-Submit: Kevin Moore <kevmoo@google.com>
Reviewed-by: Devon Carew <devoncarew@google.com>
Commit-Queue: Devon Carew <devoncarew@google.com>
Commit-Queue: Kevin Moore <kevmoo@google.com>
This commit is contained in:
Kevin Moore 2021-10-26 18:26:01 +00:00 committed by commit-bot@chromium.org
parent 9a873bc23f
commit ada6029976
3 changed files with 53 additions and 56 deletions

View file

@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
"generated": "2021-10-15T13:46:59.969883",
"generated": "2021-10-26T10:20:01.277340",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@ -515,7 +515,7 @@
{
"name": "package_deps",
"rootUri": "../tools/package_deps",
"languageVersion": "2.8"
"languageVersion": "2.12"
},
{
"name": "path",

View file

@ -1,6 +1,7 @@
import 'dart:io';
import 'package:cli_util/cli_logging.dart';
import 'package:collection/collection.dart';
import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart' as yaml;
@ -85,34 +86,59 @@ void main(List<String> arguments) {
}
if (validateFailure) {
exit(1);
exitCode = 1;
}
}
class Package implements Comparable<Package> {
final String dir;
final _regularDependencies = <String>{};
final _devDependencies = <String>{};
final _declaredPubDeps = <PubDep>[];
final _declaredDevPubDeps = <PubDep>[];
final _declaredOverridePubDeps = <PubDep>[];
late final String _packageName;
late final Set<String> _declaredDependencies;
late final Set<String> _declaredDevDependencies;
late final Set<String> _declaredOverrideDependencies;
late final bool _publishToNone;
Package(this.dir) {
_parsePubspec();
var pubspec = File(path.join(dir, 'pubspec.yaml'));
var doc = yaml.loadYamlDocument(pubspec.readAsStringSync());
dynamic docContents = doc.contents.value;
_packageName = docContents['name'];
_publishToNone = docContents['publish_to'] == 'none';
Set<String> process(String section, List<PubDep> target) {
if (docContents[section] != null) {
final value = Set<String>.from(docContents[section].keys);
var deps = docContents[section];
for (var package in deps.keys) {
target.add(PubDep.parse(package, deps[package]));
}
return value;
} else {
return {};
}
}
_declaredDependencies = process('dependencies', _declaredPubDeps);
_declaredDevDependencies = process('dev_dependencies', _declaredDevPubDeps);
_declaredOverrideDependencies =
process('dependency_overrides', _declaredOverridePubDeps);
}
String get dirName => path.basename(dir);
final Set<String> _regularDependencies = {};
final Set<String> _devDependencies = {};
String _packageName;
String get packageName => _packageName;
Set<String> _declaredDependencies;
List<PubDep> _declaredPubDeps;
Set<String> _declaredDevDependencies;
List<PubDep> _declaredDevPubDeps;
List<String> get regularDependencies => _regularDependencies.toList()..sort();
List<String> get devDependencies => _devDependencies.toList()..sort();
bool _publishToNone;
bool get publishable => !_publishToNone;
@override
@ -161,40 +187,6 @@ class Package implements Comparable<Package> {
}
}
void _parsePubspec() {
var pubspec = File(path.join(dir, 'pubspec.yaml'));
var doc = yaml.loadYamlDocument(pubspec.readAsStringSync());
dynamic docContents = doc.contents.value;
_packageName = docContents['name'];
_publishToNone = docContents['publish_to'] == 'none';
_declaredPubDeps = [];
if (docContents['dependencies'] != null) {
_declaredDependencies =
Set<String>.from(docContents['dependencies'].keys);
var deps = docContents['dependencies'];
for (var package in deps.keys) {
_declaredPubDeps.add(PubDep.parse(package, deps[package]));
}
} else {
_declaredDependencies = {};
}
_declaredDevPubDeps = [];
if (docContents['dev_dependencies'] != null) {
_declaredDevDependencies =
Set<String>.from(docContents['dev_dependencies'].keys);
var deps = docContents['dev_dependencies'];
for (var package in deps.keys) {
_declaredDevPubDeps.add(PubDep.parse(package, deps[package]));
}
} else {
_declaredDevDependencies = {};
}
}
bool _validatePubspecDeps(Logger logger, List<String> pkgPackages) {
var fail = false;
@ -300,6 +292,13 @@ class Package implements Comparable<Package> {
if (!publishable) {
for (PubDep dep in [..._declaredPubDeps, ..._declaredDevPubDeps]) {
if (pkgPackages.contains(dep.name) && dep is! PathPubDep) {
// check to see if there is a dependency_override to a path dependency
final override = _declaredOverridePubDeps
.singleWhereOrNull((element) => element.name == dep.name);
if (override != null && override is PathPubDep) {
continue;
}
out(' Prefer a relative path dep for pkg/ packages:');
out(' $dep');
fail = true;
@ -368,13 +367,13 @@ class Package implements Comparable<Package> {
var match = importRegex1.firstMatch(line);
if (match != null) {
results.add(match.group(2));
results.add(match.group(2)!);
continue;
}
match = importRegex2.firstMatch(line);
if (match != null) {
results.add(match.group(2));
results.add(match.group(2)!);
continue;
}
}
@ -418,9 +417,9 @@ class SdkDeps {
var testedPkgDep = testedPkgRegExp.firstMatch(line);
if (pkgDep != null) {
pkgs.add(pkgDep.group(1));
pkgs.add(pkgDep.group(1)!);
} else if (testedPkgDep != null) {
testedPkgs.add(testedPkgDep.group(1));
testedPkgs.add(testedPkgDep.group(1)!);
}
}

View file

@ -5,12 +5,10 @@ description: A tool to validate pubspec files in pkg/.
publish_to: none
environment:
sdk: '>=2.8.1 <3.0.0'
sdk: '>=2.12.0 <3.0.0'
dependencies:
cli_util: any
collection: any
path: any
yaml: any
dev_dependencies:
pedantic: ^1.9.0