Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(633)

Unified Diff: lib/src/packages_impl.dart

Issue 1142363005: Added .packages, packages/ discovery. (Closed) Base URL: https://github.com/dart-lang/package_config.git@master
Patch Set: Addressed comments. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/packages_file.dart ('k') | lib/src/util.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/packages_impl.dart
diff --git a/lib/src/packages_impl.dart b/lib/src/packages_impl.dart
new file mode 100644
index 0000000000000000000000000000000000000000..612dc347d39e96ddae4ecacc5901fe67ddb6c6df
--- /dev/null
+++ b/lib/src/packages_impl.dart
@@ -0,0 +1,118 @@
+// 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.
+
+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;
+
+/// A [Packages] null-object.
+class NoPackages implements Packages {
+ const NoPackages();
+
+ Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
+ String packageName = checkValidPackageUri(packageUri);
+ if (notFound != null) return notFound(packageUri);
+ throw new ArgumentError.value(packageUri, "packageUri",
+ 'No package named "$packageName"');
+ }
+
+ Iterable<String> get packages => new Iterable<String>.empty();
+
+ 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 {
+ Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
+ packageUri = packageUri.normalizePath();
+ String packageName = checkValidPackageUri(packageUri);
+ Uri packageBase = _getBase(packageName);
+ if (packageBase == null) {
+ if (notFound != null) return notFound(packageUri);
+ throw new ArgumentError.value(packageUri, "packageUri",
+ 'No package named "$packageName"');
+ }
+ String packagePath = packageUri.path.substring(packageName.length + 1);
+ return packageBase.resolve(packagePath);
+ }
+
+ /// Find a base location for a package name.
+ ///
+ /// Returns `null` if no package exists with that name, and that can be
+ /// determined.
+ Uri _getBase(String packageName);
+}
+
+/// A [Packages] implementation based on an existing map.
+class MapPackages extends _PackagesBase {
+ final Map<String, Uri> _mapping;
+ MapPackages(this._mapping);
+
+ 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.directory(path.join(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 {
+ final Uri _packageBase;
+ NonFilePackagesDirectoryPackages(this._packageBase);
+
+ Uri _getBase(String packageName) => _packageBase.resolve("$packageName/");
+
+ Error _failListingPackages() {
+ return new UnsupportedError(
+ "Cannot list packages for a ${_packageBase.scheme}: "
+ "based package root");
+ }
+
+ Iterable<String> get packages {
+ throw _failListingPackages();
+ }
+
+ Map<String, Uri> asMap() {
+ throw _failListingPackages();
+ }
+}
« no previous file with comments | « lib/packages_file.dart ('k') | lib/src/util.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698