Merge pull request #8 from dart-lang/devoncarew_docs

add docs
diff --git a/example/list.dart b/example/list.dart
index a4fd55a..421bba3 100644
--- a/example/list.dart
+++ b/example/list.dart
@@ -7,9 +7,15 @@
 void main(List<String> args) {
   PubCache cache = new PubCache();
 
-  print('activated applications:');
-
-  cache.getGlobalApplications().forEach((app) {
+  var apps = cache.getGlobalApplications();
+  print('${apps.length} activated applications:');
+  apps.forEach((app) {
     print('  ${app}');
   });
+
+  var packages = cache.getCachedPackages();
+  print('\n${packages.length} packages in cache:');
+  packages.forEach((pkg) {
+    print('  ${pkg}');
+  });
 }
diff --git a/lib/pub_cache.dart b/lib/pub_cache.dart
index ccbadbc..f478d6d 100644
--- a/lib/pub_cache.dart
+++ b/lib/pub_cache.dart
@@ -10,69 +10,84 @@
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart' as yaml;
 
-// TODO: get the latest version for a package?
-
-// TODO: get the latest non-dev version for a package?
-
-// TODO: Scan for git packages.
-
-/**
- * A programattic API for reflecting on Pub's cache directory.
- */
+/// A programmatic API for reflecting on Pub's cache directory.
 class PubCache {
+
+  /// Return the location of Pub's package cache.
   static Directory getSystemCacheLocation() {
-    if (Platform.environment.containsKey('PUB_CACHE')) {
-      return new Directory(Platform.environment['PUB_CACHE']);
+    Map env = Platform.environment;
+
+    if (env.containsKey('PUB_CACHE')) {
+      return new Directory(env['PUB_CACHE']);
     } else if (Platform.operatingSystem == 'windows') {
-      var appData = Platform.environment['APPDATA'];
-      return new Directory(path.join(appData, 'Pub', 'Cache'));
+      return new Directory(path.join(env['APPDATA'], 'Pub', 'Cache'));
     } else {
-      return new Directory('${Platform.environment['HOME']}/.pub-cache');
+      return new Directory('${env['HOME']}/.pub-cache');
     }
   }
 
+  // The location of the pub cache.
   final Directory location;
 
   List<Application> _applications;
   List<PackageRef> _packageRefs;
 
+  /// Create a pubcache instance. [dir] defaults to the default platform pub
+  /// cache location.
   PubCache([Directory dir]) :
       location = dir == null ? getSystemCacheLocation() : dir {
     _parse();
   }
 
-  /**
-   * Return the contents of `bin/` - the scripts for the activated applications.
-   */
-  List<File> getBinaries() {
+  /// Return the contents of `bin/` - the scripts for the activated applications.
+  List<File> getBinScripts() {
     Directory dir = _getSubDir(location, 'bin');
     return dir.existsSync() ? dir.listSync() : [];
   }
 
-  /**
-   * Return applications that have been installed via `pub global activate`.
-   */
+  /// Return applications that have been installed via `pub global activate`.
   List<Application> getGlobalApplications() => _applications;
 
-  /**
-   * Get all the packages and their versions that have been installed into the
-   * cache.
-   */
+  /// Get all the packages and their versions that have been installed into the
+  /// cache.
   List<PackageRef> getPackageRefs() => _packageRefs;
 
-  /**
-   * Return the list of package names (not versions) that are available in the
-   * cache.
-   */
+  /// Return the list of package names (not versions) that are available in the
+  /// cache.
   List<String> getCachedPackages() =>
       new Set.from(getPackageRefs().map((p) => p.name)).toList();
 
-  /**
-   * Return all available cached versions for a given package.
-   */
+  /// Return all available cached versions for a given package.
   List<PackageRef> getAllPackageVersions(String packageName) =>
       getPackageRefs().where((p) => p.name == packageName).toList();
 
+  /// Return the most recent verison of the given package contained in the
+  /// cache. This method will prefer to return only release verions. If
+  /// [includePreRelease] is true, then the very latest verision will be
+  /// returned, include pre-release versions.
+  PackageRef getLatestVersion(String packageName, {bool includePreRelease: false}) {
+    List<PackageRef> refs = getAllPackageVersions(packageName);
+
+    if (refs.isEmpty) return null;
+    if (refs.length == 1) return refs.first;
+
+    PackageRef latest = refs.first;
+
+    if (includePreRelease) {
+      for (int i = 1; i < refs.length; i++) {
+        if (refs[i].version > latest.version) latest = refs[i];
+      }
+    } else {
+      List<Version> versions = refs.map((ref) => ref.version).toList();
+      Version latestVersion = Version.primary(versions);
+      for (PackageRef ref in refs) {
+        if (ref.version == latestVersion) latest = ref;
+      }
+    }
+
+    return latest;
+  }
+
   void _parse() {
     // Read the activated applications.
     _applications = [];
@@ -94,12 +109,18 @@
           .map((dir) => new _DirectoryPackageRef('hosted', dir))
           .toList();
     }
+
+    // TODO: Scan for git packages (ignore the git/cache directory).
+    // ace-a1a140cc933e7d44d2955a6d6033308754bb9235
+
   }
 
   Directory _getSubDir(Directory dir, String name) =>
       new Directory(path.join(dir.path, name));
 }
 
+/// A Dart application; a package with an entry-point, available via `pub global
+/// activate`.
 class Application {
   final PubCache _cache;
   final Directory _dir;
@@ -108,13 +129,17 @@
 
   Application._(this._cache, this._dir);
 
+  /// The name of the defining package.
   String get name => path.basename(_dir.path);
 
+  /// The version of the application and of the defining package.
   Version get version {
     PackageRef ref = getDefiningPackageRef();
     return ref == null ? null : ref.version;
   }
 
+  /// Return the reference to the defining package. This is the package that
+  /// defines the application.
   PackageRef getDefiningPackageRef() {
     for (PackageRef ref in getPackageRefs()) {
       if (ref.name == name) return ref;
@@ -122,6 +147,8 @@
     return null;
   }
 
+  /// Return all the package references for the application. This includes the
+  /// defining package as well as the direct and transitive dependencies.
   List<PackageRef> getPackageRefs() {
     if (_packageRefs == null) _parsePubspecLock();
     return _packageRefs;
@@ -140,11 +167,18 @@
   }
 }
 
+/// A package reference, including the package name and version. This package
+/// reference can be resolved to the actual package on disk.
 abstract class PackageRef {
+  /// The type of the package reference. Valid types include `hosted` and `git`.
   String get sourceType;
+  /// The name of the package.
   String get name;
+  /// The version of the package.
   Version get version;
 
+  /// Resolve the package reference into the actual package, including the
+  /// location on disk.
   Package resolve();
 
   bool operator ==(other) {
@@ -197,6 +231,8 @@
   Package resolve() => new Package(directory, name, version);
 }
 
+/// A representation of a package, including the name, version, and location on
+/// disk.
 class Package {
   final Directory location;
   final String name;
diff --git a/test/pub_cache_test.dart b/test/pub_cache_test.dart
index 3c6ac53..4a5f8a2 100644
--- a/test/pub_cache_test.dart
+++ b/test/pub_cache_test.dart
@@ -29,7 +29,7 @@
 
     test('getBinaries', () {
       PubCache cache = new PubCache();
-      expect(cache.getBinaries(), isNotNull);
+      expect(cache.getBinScripts(), isNotNull);
     });
 
     test('getGlobalApplications', () {
@@ -51,6 +51,16 @@
       PubCache cache = new PubCache();
       expect(cache.getAllPackageVersions('path'), isNotEmpty);
     });
+
+    test('getLatestVersion', () {
+      PubCache cache = new PubCache();
+      expect(cache.getLatestVersion('path'), isNotNull);
+    });
+
+    test('getLatestVersion.dev', () {
+      PubCache cache = new PubCache();
+      expect(cache.getLatestVersion('path', includePreRelease: true), isNotNull);
+    });
   });
 
   group('Application', () {