Separate out VM dependencies.
The Packages interface class should not depend on a platform specific
library (dart:io).
This removed the dependency, and also splits the implementation
classes into those that are generally applicable and those that
requite dart:io to operate (the "local packages directory" which
allows iterating the package names by scanning the directory).
Bump version to 0.0.2+4
diff --git a/lib/discovery.dart b/lib/discovery.dart
index f298a0a..f8e45d4 100644
--- a/lib/discovery.dart
+++ b/lib/discovery.dart
@@ -11,6 +11,7 @@
import "packages.dart";
import "packages_file.dart" as pkgfile show parse;
import "src/packages_impl.dart";
+import "src/packages_io_impl.dart";
/// Discover the package configuration for a Dart script.
///
diff --git a/lib/packages.dart b/lib/packages.dart
index 3fba062..dbaa06d 100644
--- a/lib/packages.dart
+++ b/lib/packages.dart
@@ -4,8 +4,6 @@
library package_config.packages;
-import "dart:async" show Future;
-import "discovery.dart" show findPackages;
import "src/packages_impl.dart";
/// A package resolution strategy.
@@ -26,42 +24,6 @@
/// package resolution strategy is found.
static const Packages noPackages = const NoPackages();
- /// Create a `Packages` object based on a map from package name to base URI.
- ///
- /// The resulting `Packages` object will resolve package URIs by using this
- /// map.
- /// There is no validation of the map containing only valid package names,
- factory Packages(Map<String, Uri> packageMapping) =>
- new MapPackages(packageMapping);
-
- /// Attempts to find a package resolution strategy for a Dart script.
- ///
- /// The [baseLocation] should point to a Dart script or to its directory.
- /// The function goes through the following steps in order to search for
- /// a packages resolution strategy:
- ///
- /// * First check if a `.packages` file in the script's directory.
- /// If a file is found, its content is loaded and interpreted as a map
- /// from package names to package location URIs.
- /// If loading or parsing of the file fails, so does this function.
- /// * Then if `baseLocation` is not a `file:` URI,
- /// assume that a `packages/` directory exists in the script's directory,
- /// and return a `Packages` object that resolves package URIs as
- /// paths into that directory.
- /// * If `baseLocation` is a `file:` URI, instead *check* whether
- /// a `packages/` directory exists in the script directory.
- /// If it does, return a `Packages` object that resolves package URIs
- /// as paths into that directory. This `Packages` object is able to
- /// read the directory and see which packages are available.
- /// * Otherwise, check each directory in the parent path of `baseLocation`
- /// for the existence of a `.packages` file. If one is found, it is loaded
- /// just as in the first step.
- /// * If no file is found before reaching the file system root,
- /// the constant [noPackages] is returned. It's a `Packages` object
- /// with no available packages.
- ///
- static Future<Packages> find(Uri baseLocation) => findPackages(baseLocation);
-
/// Resolve a package URI into a non-package URI.
///
/// Translates a `package:` URI, according to the package resolution
diff --git a/lib/src/packages_impl.dart b/lib/src/packages_impl.dart
index 645d765..e85f755 100644
--- a/lib/src/packages_impl.dart
+++ b/lib/src/packages_impl.dart
@@ -2,11 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/// Implementations of [Packages] that may be used in either server or browser
+/// based applications. For implementations that can only run in the browser,
+/// see [package_config.packages_io_impl].
library package_config.packages_impl;
import "dart:collection" show UnmodifiableMapView;
-import "dart:io" show Directory;
-import "package:path/path.dart" as path;
import "../packages.dart";
import "util.dart" show checkValidPackageUri;
@@ -26,16 +27,15 @@
Map<String, Uri> asMap() => const<String,Uri>{};
}
-
/// Base class for [Packages] implementations.
///
/// This class implements the [resolve] method in terms of a private
/// member
-abstract class _PackagesBase implements Packages {
+abstract class PackagesBase implements Packages {
Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
packageUri = _normalizePath(packageUri);
String packageName = checkValidPackageUri(packageUri);
- Uri packageBase = _getBase(packageName);
+ Uri packageBase = getBase(packageName);
if (packageBase == null) {
if (notFound != null) return notFound(packageUri);
throw new ArgumentError.value(packageUri, "packageUri",
@@ -49,61 +49,34 @@
///
/// Returns `null` if no package exists with that name, and that can be
/// determined.
- Uri _getBase(String packageName);
+ Uri getBase(String packageName);
// TODO: inline to uri.normalizePath() when we move to 1.11
static Uri _normalizePath(Uri uri) => new Uri().resolveUri(uri);
}
/// A [Packages] implementation based on an existing map.
-class MapPackages extends _PackagesBase {
+class MapPackages extends PackagesBase {
final Map<String, Uri> _mapping;
MapPackages(this._mapping);
- Uri _getBase(String packageName) => _mapping[packageName];
+ Uri getBase(String packageName) => _mapping[packageName];
Iterable<String> get packages => _mapping.keys;
Map<String, Uri> asMap() => new UnmodifiableMapView<String, Uri>(_mapping);
}
-/// A [Packages] implementation based on a local directory.
-class FilePackagesDirectoryPackages extends _PackagesBase {
- final Directory _packageDir;
- FilePackagesDirectoryPackages(this._packageDir);
-
- Uri _getBase(String packageName) =>
- new Uri.file(path.join(_packageDir.path, packageName, '.'));
-
- Iterable<String> _listPackageNames() {
- return _packageDir.listSync()
- .where((e) => e is Directory)
- .map((e) => path.basename(e.path));
- }
-
- Iterable<String> get packages {
- return _listPackageNames();
- }
-
- Map<String, Uri> asMap() {
- var result = <String, Uri>{};
- for (var packageName in _listPackageNames()) {
- result[packageName] = _getBase(packageName);
- }
- return new UnmodifiableMapView<String, Uri>(result);
- }
-}
-
/// A [Packages] implementation based on a remote (e.g., HTTP) directory.
///
/// There is no way to detect which packages exist short of trying to use
/// them. You can't necessarily check whether a directory exists,
/// except by checking for a know file in the directory.
-class NonFilePackagesDirectoryPackages extends _PackagesBase {
+class NonFilePackagesDirectoryPackages extends PackagesBase {
final Uri _packageBase;
NonFilePackagesDirectoryPackages(this._packageBase);
- Uri _getBase(String packageName) => _packageBase.resolve("$packageName/");
+ Uri getBase(String packageName) => _packageBase.resolve("$packageName/");
Error _failListingPackages() {
return new UnsupportedError(
diff --git a/lib/src/packages_io_impl.dart b/lib/src/packages_io_impl.dart
new file mode 100644
index 0000000..21b61fd
--- /dev/null
+++ b/lib/src/packages_io_impl.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Implementations of [Packages] that can only be used in server based
+/// applications.
+library package_config.packages_io_impl;
+
+import "dart:collection" show UnmodifiableMapView;
+import "dart:io" show Directory;
+import "package:path/path.dart" as path;
+import "packages_impl.dart";
+
+/// A [Packages] implementation based on a local directory.
+class FilePackagesDirectoryPackages extends PackagesBase {
+ final Directory _packageDir;
+ FilePackagesDirectoryPackages(this._packageDir);
+
+ Uri getBase(String packageName) =>
+ new Uri.file(path.join(_packageDir.path, packageName, '.'));
+
+ Iterable<String> _listPackageNames() {
+ return _packageDir.listSync()
+ .where((e) => e is Directory)
+ .map((e) => path.basename(e.path));
+ }
+
+ Iterable<String> get packages => _listPackageNames();
+
+ Map<String, Uri> asMap() {
+ var result = <String, Uri>{};
+ for (var packageName in _listPackageNames()) {
+ result[packageName] = getBase(packageName);
+ }
+ return new UnmodifiableMapView<String, Uri>(result);
+ }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index aca9c83..338aab5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: package_config
-version: 0.0.2+4
+version: 0.0.3
description: Support for working with Package Resolution config files.
author: Dart Team <misc@dartlang.org>
homepage: https://github.com/dart-lang/package_config
diff --git a/test/parse_test.dart b/test/parse_test.dart
index f7f68f1..ddd8ff6 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -6,6 +6,7 @@
import "package:package_config/packages.dart";
import "package:package_config/packages_file.dart" show parse;
+import "package:package_config/src/packages_impl.dart";
import "package:test/test.dart";
main() {
@@ -123,7 +124,7 @@
Packages doParse(String sample, Uri baseUri) {
Map<String, Uri> map = parse(sample.codeUnits, baseUri);
- return new Packages(map);
+ return new MapPackages(map);
}
// Valid samples.