Repository: ember-cli/ember-cli
Pull request #6030 (2016-06-30 05:39:35)

[ENHANCEMENT] Asset Sizes I moved the creation of asset sizes to an object.
Moved the creation of asset sizes to an object.
Then print command iterates over that object.

I talked a little to @rwjblue and @kellyselden about the refactor. 

If we agree this is worth while I will write a test for the `makeAssetSizesObject` function. 

My use case I want to persist the asset-size data to a graphing server to track an apps size over time. 
 

Turbo87: @kiwiupover looks like there is a failing test for this PR, can you check?
nathanhammond: @kiwiupover I'd call this a good approach. Better-factored code is always better. Can you address the outstanding comments to that we can land it? 😄

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7697d4fa9..873304412 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,24 +1,5 @@
 # ember-cli Changelog
 
-### 2.7.0-beta.4
-
-The following changes are required if you are upgrading from the previous
-version:
-
-- Users
-  + [`ember new` diff](https://github.com/ember-cli/ember-new-output/compare/v2.7.0-beta.4...v2.7.0-beta.4)
-  + Upgrade your project's ember-cli version - [docs](http://ember-cli.com/user-guide/#upgrading)
-- Addon Developers
-  + [`ember addon` diff](https://github.com/ember-cli/ember-addon-output/compare/v2.7.0-beta.4...v2.7.0-beta.4)
-- Core Contributors
-  + No changes required
-
-`2.7.0-beta.3` included changes that should have stayed on `canary` for now. This release removes those
-changes again and only includes the bugfixes from the `beta` branch.
-
-Thank you to all who took the time to contribute!
-
-
 ### 2.7.0-beta.3
 
 The following changes are required if you are upgrading from the previous
@@ -44,7 +25,6 @@ version:
 
 Thank you to all who took the time to contribute!
 
-
 ### 2.7.0-beta.2
 
 The following changes are required if you are upgrading from the previous
diff --git a/RELEASE.md b/RELEASE.md
index 3acb6a324..924c4834a 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -27,91 +27,34 @@ $ npm --version
 
 ## Branching
 
-If you're planning to release a stable/bugfix version _and_ a beta, make sure to release the beta _after_ the stable version.
+This is the example branching/merging for release channels.
 
 ```sh
-# Fetch changes from GitHub
-git fetch origin
-```
-
-Once you're done following these instructions make sure that you push your `master`, `beta`, and `release` branches back to GitHub.
-
-
-### Promoting beta to stable
-
-Follow these steps if you're releasing a new minor or major version (e.g. from `v2.5.0` to `v2.6.0`):
-
-```sh
-# Switch to "release" branch and reset it to "origin/beta"
-git checkout -B release --track origin/beta
-
-# Merge any unmerged changes from "origin/release" back in
-git merge origin/release
-
-# ... do the stable release ...
-
-# Switch to "beta" branch and reset it to "origin/beta"
-git checkout -B beta --track origin/beta
-
-# Merge the new stable release into the "beta" branch
-git merge vX.Y.0
-```
-
-
-### Stable bugfix release
-
-Follow these steps if you're releasing a bugfix for a stable version (e.g. from `v2.5.0` to `v2.5.1`)
-
-```sh
-# Switch to "release" branch and reset it to "origin/release"
-git checkout -B release --track origin/release
+# Get to known good state.
+git checkout master
+git reset --hard origin/master
+git checkout beta
+git reset --hard origin/beta
+git checkout release
+git reset --hard origin/release
+
+# Prep the stable release
+git checkout release
+git merge beta
 
 # ... do the stable release ...
 
-# Switch to "beta" branch and reset it to "origin/beta"
-git checkout -B beta --track origin/beta
-
-# Merge the new stable release into the "beta" branch
-git merge vX.Y.Z
-```
-
-
-### Promoting canary to beta
-
-Follow these steps if you're releasing a beta version after a new minor/major release (e.g. `v2.7.0-beta.1`)
-
-```sh
-# Switch to "beta" branch and reset it to "origin/master"
-git checkout -B beta --track origin/master
-
-# Merge any unmerged changes from "origin/beta" back in
-git merge origin/beta
-
-# ... do the beta release ...
-
-# Switch to "master" branch and reset it to "origin/master"
-git checkout -B master --track origin/master
-
-# Merge the new beta release into the "master" branch
-git merge vX.Y.0-beta.1
-```
-
-
-### Incremental beta release
-
-Follow these steps if you're releasing a beta version following another beta (e.g. `v2.7.0-beta.N` with `N != 1`)
-
-```sh
-# Switch to "beta" branch and reset it to "origin/beta"
-git checkout -B beta --track origin/beta
+# Prep the beta release
+git checkout beta
+git merge master
+git merge vX.Y.Z # whatever the latest stable tag is.
 
 # ... do the beta release ...
 
-# Switch to "master" branch and reset it to "origin/master"
-git checkout -B master --track origin/master
+git checkout master
+git merge vX.Y.Z-beta.N
 
-# Merge the new beta release into the "master" branch
-git merge vX.Y.0-beta.N
+# ... all things back in master ...
 ```
 
 
diff --git a/bin/ember b/bin/ember
index 1692a1886..7ccd04fde 100755
--- a/bin/ember
+++ b/bin/ember
@@ -4,7 +4,6 @@
 // Provide a title to the process in `ps`
 process.title = 'ember';
 
-// require('time-require');
 var resolve = require('resolve');
 var exit = require('exit');
 
diff --git a/blueprints/addon/index.js b/blueprints/addon/index.js
index 9dbe4005b..00af56bf6 100644
--- a/blueprints/addon/index.js
+++ b/blueprints/addon/index.js
@@ -3,7 +3,7 @@ var existsSync  = require('exists-sync');
 var path        = require('path');
 var walkSync    = require('walk-sync');
 var stringUtil  = require('ember-cli-string-utils');
-var uniq        = require('ember-cli-lodash-subset').uniq;
+var uniq        = require('lodash/uniq');
 var SilentError = require('silent-error');
 var date        = new Date();
 
diff --git a/lib/broccoli/ember-addon.js b/lib/broccoli/ember-addon.js
index a792b271c..07192b109 100644
--- a/lib/broccoli/ember-addon.js
+++ b/lib/broccoli/ember-addon.js
@@ -4,7 +4,7 @@
 /**
 @module ember-cli
 */
-var defaultsDeep = require('ember-cli-lodash-subset').defaultsDeep;
+var defaultsDeep = require('lodash/defaultsDeep');
 var Funnel   = require('broccoli-funnel');
 var EmberApp = require('./ember-app');
 
diff --git a/lib/broccoli/ember-app.js b/lib/broccoli/ember-app.js
index 4a450e947..a7f7f1329 100644
--- a/lib/broccoli/ember-app.js
+++ b/lib/broccoli/ember-app.js
@@ -34,10 +34,10 @@ var mergeTrees    = require('./merge-trees');
 var WatchedDir    = require('broccoli-source').WatchedDir;
 var UnwatchedDir  = require('broccoli-source').UnwatchedDir;
 
-var merge         = require('ember-cli-lodash-subset').merge;
-var defaultsDeep  = require('ember-cli-lodash-subset').defaultsDeep;
-var omitBy        = require('ember-cli-lodash-subset').omitBy;
-var isNull        = require('ember-cli-lodash-subset').isNull;
+var merge         = require('lodash/merge');
+var defaultsDeep  = require('lodash/defaultsDeep');
+var omitBy        = require('lodash/omitBy');
+var isNull        = require('lodash/isNull');
 var Funnel        = require('broccoli-funnel');
 var funnelReducer = require('broccoli-funnel-reducer');
 
@@ -198,9 +198,7 @@ EmberApp.prototype._initOptions = function(options) {
   }
 
   var appTree = new WatchedDir(this._resolveLocal('app'));
-
-  var testsPath = this._resolveLocal('tests');
-  var testsTree = existsSync(testsPath) ? new WatchedDir(testsPath) : null;
+  var testsTree = new WatchedDir(this._resolveLocal('tests'));
 
   // these are contained within app/ no need to watch again
   // (we should probably have the builder or the watcher dedup though)
@@ -1609,7 +1607,7 @@ EmberApp.prototype.toArray = function() {
     this.publicTree()
   ];
 
-  if (this.tests && this.trees.tests) {
+  if (this.tests) {
     sourceTrees = sourceTrees.concat(this.testIndex(), this.test());
   }
 
diff --git a/lib/cli/index.js b/lib/cli/index.js
index 6491c79c3..485d8e7aa 100644
--- a/lib/cli/index.js
+++ b/lib/cli/index.js
@@ -10,7 +10,7 @@ var tasks         = requireAsHash('../tasks/*.js', Task);
 var CLI           = require('./cli');
 var packageConfig = require('../../package.json');
 var debug         = require('debug')('ember-cli:cli/index');
-var merge         = require('ember-cli-lodash-subset').merge;
+var merge         = require('lodash/merge');
 var path          = require('path');
 
 // ember-cli and user apps have many dependencies, many of which require
diff --git a/lib/commands/asset-sizes.js b/lib/commands/asset-sizes.js
index 93641c320..07c74e3f7 100644
--- a/lib/commands/asset-sizes.js
+++ b/lib/commands/asset-sizes.js
@@ -7,7 +7,7 @@ module.exports = Command.extend({
   description: 'Shows the sizes of your asset files.',
 
   availableOptions: [
-    { name: 'output-path', type: 'Path', default: 'dist/',       aliases: ['o'] },
+    { name: 'output-path', type: 'Path', default: 'dist/', aliases: ['o'] }
   ],
 
   run: function(commandOptions) {
diff --git a/lib/commands/destroy.js b/lib/commands/destroy.js
index 34dd62219..b87c1fa54 100644
--- a/lib/commands/destroy.js
+++ b/lib/commands/destroy.js
@@ -3,7 +3,7 @@
 var Command               = require('../models/command');
 var Promise               = require('../ext/promise');
 var mergeBlueprintOptions = require('../utilities/merge-blueprint-options');
-var merge                 = require('ember-cli-lodash-subset').merge;
+var merge                 = require('lodash/merge');
 var SilentError           = require('silent-error');
 
 module.exports = Command.extend({
diff --git a/lib/commands/generate.js b/lib/commands/generate.js
index c5e010c36..cfb67b535 100644
--- a/lib/commands/generate.js
+++ b/lib/commands/generate.js
@@ -5,7 +5,8 @@ var Command               = require('../models/command');
 var Promise               = require('../ext/promise');
 var Blueprint             = require('../models/blueprint');
 var mergeBlueprintOptions = require('../utilities/merge-blueprint-options');
-var _                     = require('ember-cli-lodash-subset');
+var merge                 = require('lodash/merge');
+var reject                = require('lodash/reject');
 var EOL                   = require('os').EOL;
 var SilentError           = require('silent-error');
 
@@ -55,7 +56,7 @@ module.exports = Command.extend({
       commandOptions.pod = !commandOptions.pod;
     }
 
-    var taskOptions = _.merge(taskArgs, commandOptions || {});
+    var taskOptions = merge(taskArgs, commandOptions || {});
 
     if (this.project.initializeAddons) {
       this.project.initializeAddons();
@@ -117,7 +118,7 @@ module.exports = Command.extend({
     var blueprints = collection.blueprints;
 
     if (!verbose) {
-      blueprints = _.reject(blueprints, 'overridden');
+      blueprints = reject(blueprints, 'overridden');
     }
 
     var output = '';
diff --git a/lib/commands/help.js b/lib/commands/help.js
index 0e0ba6397..08bb0a93a 100644
--- a/lib/commands/help.js
+++ b/lib/commands/help.js
@@ -3,7 +3,7 @@
 var Command         = require('../models/command');
 var lookupCommand   = require('../cli/lookup-command');
 var stringUtils     = require('ember-cli-string-utils');
-var assign          = require('ember-cli-lodash-subset').assign;
+var assign          = require('lodash/assign');
 var GenerateCommand = require('./generate');
 var RootCommand     = require('../utilities/root-command');
 var JsonGenerator   = require('../utilities/json-generator');
diff --git a/lib/commands/init.js b/lib/commands/init.js
index bd48756fd..5fc4dac2f 100644
--- a/lib/commands/init.js
+++ b/lib/commands/init.js
@@ -1,7 +1,7 @@
 'use strict';
 
-var clone                 = require('ember-cli-lodash-subset').clone;
-var merge                 = require('ember-cli-lodash-subset').merge;
+var clone                 = require('lodash/clone');
+var merge                 = require('lodash/merge');
 var Command               = require('../models/command');
 var Promise               = require('../ext/promise');
 var SilentError           = require('silent-error');
diff --git a/lib/commands/serve.js b/lib/commands/serve.js
index a91146963..9718b5c69 100644
--- a/lib/commands/serve.js
+++ b/lib/commands/serve.js
@@ -1,6 +1,6 @@
 'use strict';
 
-var assign      = require('ember-cli-lodash-subset').assign;
+var assign      = require('lodash/assign');
 var Command     = require('../models/command');
 var Promise     = require('../ext/promise');
 var SilentError = require('silent-error');
@@ -23,7 +23,6 @@ module.exports = Command.extend({
     { name: 'host',                 type: String,                          aliases: ['H'],     description: 'Listens on all interfaces by default' },
     { name: 'proxy',                type: String,                          aliases: ['pr', 'pxy'] },
     { name: 'insecure-proxy',       type: Boolean, default: false,         aliases: ['inspr'], description: 'Set false to proxy self-signed SSL certificates' },
-    { name: 'transparent-proxy',    type: Boolean, default: true,          aliases: ['transp'], description: 'Set to false to omit x-forwarded-* headers when proxying' },
     { name: 'watcher',              type: String,  default: 'events',      aliases: ['w'] },
     { name: 'live-reload',          type: Boolean, default: true,          aliases: ['lr'] },
     { name: 'live-reload-host',     type: String,                          aliases: ['lrh'],   description: 'Defaults to host' },
diff --git a/lib/models/addon-discovery.js b/lib/models/addon-discovery.js
index 03ae3e33c..eb0384b3c 100644
--- a/lib/models/addon-discovery.js
+++ b/lib/models/addon-discovery.js
@@ -4,7 +4,7 @@
 @module ember-cli
 */
 
-var assign     = require('ember-cli-lodash-subset').assign;
+var assign     = require('lodash/assign');
 var debug      = require('debug')('ember-cli:addon-discovery');
 var existsSync = require('exists-sync');
 var path       = require('path');
diff --git a/lib/models/addon.js b/lib/models/addon.js
index 15e23f925..9790e0bbb 100644
--- a/lib/models/addon.js
+++ b/lib/models/addon.js
@@ -6,7 +6,7 @@
 
 var existsSync   = require('exists-sync');
 var path         = require('path');
-var assign       = require('ember-cli-lodash-subset').assign;
+var assign       = require('lodash/assign');
 var SilentError  = require('silent-error');
 var debug        = require('debug')('ember-cli:addon');
 
diff --git a/lib/models/asset-size-printer.js b/lib/models/asset-size-printer.js
index f4d578180..d8c6b3f99 100644
--- a/lib/models/asset-size-printer.js
+++ b/lib/models/asset-size-printer.js
@@ -3,62 +3,60 @@
 var chalk   = require('chalk');
 var path    = require('path');
 var Promise = require('../ext/promise');
-var assign  = require('ember-cli-lodash-subset').assign;
+var assign  = require('lodash/assign');
 
 function AssetPrinterSize(options) {
   assign(this, options);
 }
 
-AssetPrinterSize.prototype.print = function() {
+AssetPrinterSize.prototype.print = function () {
   var ui = this.ui;
 
-  return Promise.resolve()
-    .then(function () {
-      var filesize = require('filesize');
-      var fs = require('fs');
-      var zlib = require('zlib');
-      var gzip = Promise.denodeify(zlib.gzip);
-      var files = this.makeFileGlob();
-      var testFileRegex = /(test-(loader|support))|(testem)/i;
-      var promises = [];
+  return this.makeAssetSizesObject().then(function (files) {
+    this.validateAssetPath(files);
 
-      this.validateAssetPath(files);
-      ui.writeLine(chalk.green('File sizes:'));
+    ui.writeLine(chalk.green('File sizes:'));
+    return files.forEach(function (file) {
+      var sizeOutput = file.size;
+      if (file.showGzipped) {
+        sizeOutput += ' (' + file.gzipSize + ' gzipped)';
+      }
 
-      files
-        // Skip test files
-        .filter(function (file) {
-          var filename = path.basename(file);
-          return !testFileRegex.test(filename);
-        })
-        // Print human-readable file sizes (including gzipped)
-        .forEach(function (file) {
-          var filename = path.basename(file);
-          var contentsBuffer = fs.readFileSync(file);
-          var gzipPromise = gzip(contentsBuffer).then(function (buffer) {
-            return {
-              name: filename,
-              size: filesize(contentsBuffer.length),
-              gzipSize: filesize(buffer.length),
-              showGzipped: contentsBuffer.length > 0
-            };
-          });
+      ui.writeLine(chalk.blue(' - ' + file.name + ': ') + chalk.white(sizeOutput));
+    });
 
-          promises.push(gzipPromise);
-        });
+  }.bind(this));
+};
 
-      return Promise.all(promises);
-    }.bind(this))
-    .then(function (files) {
-      files.forEach(function (file) {
-        var sizeOutput = file.size;
-        if (file.showGzipped) {
-          sizeOutput += ' (' + file.gzipSize + ' gzipped)';
-        }
+AssetPrinterSize.prototype.makeAssetSizesObject = function () {
+  var filesize = require('filesize');
+  var fs = require('fs');
+  var zlib = require('zlib');
+  var gzip = Promise.denodeify(zlib.gzip);
+  var files = this.makeFileGlob();
+  var testFileRegex = /(test-(loader|support))|(testem)/i;
 
-        ui.writeLine(chalk.blue(' - ' + file.name + ': ') + chalk.white(sizeOutput));
+  var assets = files
+    // Skip test files
+    .filter(function (file) {
+      var filename = path.basename(file);
+      return !testFileRegex.test(filename);
+    })
+    // Print human-readable file sizes (including gzipped)
+    .map(function (file) {
+      var filename = path.basename(file);
+      var contentsBuffer = fs.readFileSync(file);
+      return gzip(contentsBuffer).then(function (buffer) {
+        return {
+          name: filename,
+          size: filesize(contentsBuffer.length),
+          gzipSize: filesize(buffer.length),
+          showGzipped: contentsBuffer.length > 0
+        };
       });
     });
+
+  return Promise.all(assets);
 };
 
 AssetPrinterSize.prototype.makeFileGlob = function () {
diff --git a/lib/models/blueprint.js b/lib/models/blueprint.js
index ea0dc91ff..e0cf2dfc9 100644
--- a/lib/models/blueprint.js
+++ b/lib/models/blueprint.js
@@ -17,7 +17,16 @@ var inflector           = require('inflection');
 var minimatch           = require('minimatch');
 var path                = require('path');
 var stringUtils         = require('ember-cli-string-utils');
-var _                   = require('ember-cli-lodash-subset');
+var compact             = require('lodash/compact');
+var intersect           = require('lodash/intersection');
+var uniq                = require('lodash/uniq');
+var zipObject           = require('lodash/zipObject');
+var includes            = require('lodash/includes');
+var any                 = require('lodash/some');
+var cloneDeep           = require('lodash/cloneDeep');
+var keys                = require('lodash/keys');
+var merge               = require('lodash/merge');
+var values              = require('lodash/values');
 var walkSync            = require('walk-sync');
 var SilentError         = require('silent-error');
 var CoreObject          = require('core-object');
@@ -614,7 +623,7 @@ var Blueprint = CoreObject.extend({
     };
 
     var customTokens = this.fileMapTokens(options) || options.fileMapTokens || {};
-    return _.merge(standardTokens, customTokens);
+    return merge(standardTokens, customTokens);
   },
 
   /**
@@ -626,10 +635,10 @@ var Blueprint = CoreObject.extend({
   */
   generateFileMap: function(fileMapVariables) {
     var tokens        = this._fileMapTokens(fileMapVariables);
-    var fileMapValues = _.values(tokens);
+    var fileMapValues = values(tokens);
     var tokenValues   = fileMapValues.map(function(token) { return token(fileMapVariables); });
-    var tokenKeys     = _.keys(tokens);
-    return _.zipObject(tokenKeys,tokenValues);
+    var tokenKeys     = keys(tokens);
+    return zipObject(tokenKeys,tokenValues);
   },
 
   /**
@@ -695,7 +704,7 @@ var Blueprint = CoreObject.extend({
     var files = this.files();
 
     // if we've defined targetFiles, get file info on ones that match
-    return targetFiles && targetFiles.length > 0 && _.intersection(files, targetFiles) || files;
+    return targetFiles && targetFiles.length > 0 && intersect(files, targetFiles) || files;
   },
 
   /**
@@ -830,7 +839,7 @@ var Blueprint = CoreObject.extend({
         rawArgs: options.rawArgs
       };
 
-      return _.merge({}, standardLocals, customLocals);
+      return merge({}, standardLocals, customLocals);
     }.bind(this));
   },
 
@@ -1193,7 +1202,7 @@ var Blueprint = CoreObject.extend({
     printableProperties.forEachWithProperty(function(key) {
       var value = this[key];
       if (key === 'availableOptions') {
-        value = _.cloneDeep(value);
+        value = cloneDeep(value);
         value.forEach(function(option) {
           if (typeof option.type === 'function') {
             option.type = option.type.name;
@@ -1313,7 +1322,7 @@ Blueprint.list = function(options) {
       var blueprint = Blueprint.load(blueprintPath);
       if (blueprint) {
         var name = blueprint.name;
-        blueprint.overridden = _.includes(seen, name);
+        blueprint.overridden = includes(seen, name);
         seen.push(name);
 
         return blueprint;
@@ -1322,7 +1331,7 @@ Blueprint.list = function(options) {
 
     return {
       source: source,
-      blueprints: _.compact(blueprints)
+      blueprints: compact(blueprints)
     };
   });
 };
@@ -1428,7 +1437,7 @@ function isFile(info) {
 function isIgnored(info) {
   var fn = info.inputPath;
 
-  return _.any(Blueprint.ignoredFiles, function(ignoredFile) {
+  return any(Blueprint.ignoredFiles, function(ignoredFile) {
     return minimatch(fn, ignoredFile, { matchBase: true });
   });
 }
@@ -1445,7 +1454,7 @@ function isIgnored(info) {
 function generateLookupPaths(lookupPaths) {
   lookupPaths = lookupPaths || [];
   lookupPaths = lookupPaths.concat(Blueprint.defaultLookupPaths());
-  return _.uniq(lookupPaths);
+  return uniq(lookupPaths);
 }
 
 /**
diff --git a/lib/models/command.js b/lib/models/command.js
index 67daa962e..c33d85414 100644
--- a/lib/models/command.js
+++ b/lib/models/command.js
@@ -9,7 +9,15 @@ var getCallerFile       = require('get-caller-file');
 var printableProperties = require('../utilities/printable-properties').command;
 var printCommand        = require('../utilities/print-command');
 var Promise             = require('../ext/promise');
-var _                   = require('ember-cli-lodash-subset');
+var union               = require('lodash/union');
+var uniq                = require('lodash/uniq');
+var uniqBy              = require('lodash/uniqBy');
+var map                 = require('lodash/map');
+var reject              = require('lodash/reject');
+var filter              = require('lodash/filter');
+var defaults            = require('lodash/defaults');
+var assign              = require('lodash/assign');
+var keys                = require('lodash/keys');
 var EOL                 = require('os').EOL;
 var CoreObject          = require('core-object');
 var debug               = require('debug')('ember-cli:command');
@@ -159,12 +167,12 @@ var Command = CoreObject.extend({
     var extendedAvailableOptions = options && options.availableOptions || [];
     var extendedAnonymousOptions = options && options.anonymousOptions || [];
 
-    this.anonymousOptions = _.union(this.anonymousOptions.slice(0), extendedAnonymousOptions);
+    this.anonymousOptions = union(this.anonymousOptions.slice(0), extendedAnonymousOptions);
 
     // merge any availableOptions
-    this.availableOptions = _.union(this.availableOptions.slice(0), extendedAvailableOptions);
+    this.availableOptions = union(this.availableOptions.slice(0), extendedAvailableOptions);
 
-    var optionKeys = _.uniq(_.map(this.availableOptions, 'name'));
+    var optionKeys = uniq(map(this.availableOptions, 'name'));
 
     optionKeys.map(this.mergeDuplicateOption.bind(this));
 
@@ -210,6 +218,13 @@ var Command = CoreObject.extend({
       ));
     }
 
+    if (this.works === 'outsideProject' && this.isWithinProject) {
+      return Promise.reject(new SilentError(
+        'You cannot use the ' + chalk.green(this.name) +
+        ' command inside an ember-cli project.'
+      ));
+    }
+
     if (this.works === 'insideProject') {
       if (!this.project.hasDependencies()) {
         throw new SilentError('node_modules appears empty, you may need to run `npm install`');
@@ -235,23 +250,23 @@ var Command = CoreObject.extend({
   mergeDuplicateOption: function(key) {
     var duplicateOptions, mergedOption, mergedAliases;
     // get duplicates to merge
-    duplicateOptions = _.filter(this.availableOptions, { 'name': key });
+    duplicateOptions = filter(this.availableOptions, { 'name': key });
 
     if (duplicateOptions.length > 1) {
       // TODO: warn on duplicates and overwriting
       mergedAliases = [];
 
-      _.map(duplicateOptions, 'aliases').map(function(alias) {
+      map(duplicateOptions, 'aliases').map(function(alias) {
         alias.map(function(a) {
           mergedAliases.push(a);
         });
       });
 
       // merge duplicate options
-      mergedOption = _.assign.apply(null,duplicateOptions);
+      mergedOption = assign.apply(null,duplicateOptions);
 
       // replace aliases with unique aliases
-      mergedOption.aliases = _.uniqBy(mergedAliases, function(alias) {
+      mergedOption.aliases = uniqBy(mergedAliases, function(alias) {
         if (typeof alias === 'object') {
           return alias[Object.keys(alias)[0]];
         }
@@ -259,7 +274,7 @@ var Command = CoreObject.extend({
       });
 
       // remove duplicates from options
-      this.availableOptions = _.reject(this.availableOptions, { 'name': key });
+      this.availableOptions = reject(this.availableOptions, { 'name': key });
       this.availableOptions.push(mergedOption);
     }
     return this.availableOptions;
@@ -469,10 +484,10 @@ var Command = CoreObject.extend({
       return null;
     }
 
-    _.keys(parsedOptions).map(validateParsed.bind(this));
+    keys(parsedOptions).map(validateParsed.bind(this));
 
     return {
-      options: _.defaults(commandOptions, this.settings),
+      options: defaults(commandOptions, this.settings),
       args: parsedOptions.argv.remain
     };
   },
diff --git a/lib/models/file-info.js b/lib/models/file-info.js
index 7cd47657c..e8b9415d9 100644
--- a/lib/models/file-info.js
+++ b/lib/models/file-info.js
@@ -8,6 +8,7 @@ var chalk        = require('chalk');
 var EditFileDiff = require('./edit-file-diff');
 var EOL          = require('os').EOL;
 var isBinaryFile = require('isbinaryfile').sync;
+var template     = require('lodash/template');
 var canEdit      = require('../utilities/open-editor').canEdit;
 
 function processTemplate(content, context) {
@@ -16,7 +17,7 @@ function processTemplate(content, context) {
     interpolate: /<%=([\s\S]+?)%>/g,
     escape:      /<%-([\s\S]+?)%>/g
   };
-  return require('lodash.template')(content, options)(context);
+  return template(content, options)(context);
 }
 
 function diffHighlight(line) {
diff --git a/lib/models/project.js b/lib/models/project.js
index fbabedf92..6a44f1b93 100644
--- a/lib/models/project.js
+++ b/lib/models/project.js
@@ -9,7 +9,10 @@ var findup             = require('find-up');
 var resolve            = Promise.denodeify(require('resolve'));
 var fs                 = require('fs-extra');
 var existsSync         = require('exists-sync');
-var _                  = require('ember-cli-lodash-subset');
+var find               = require('lodash/find');
+var assign             = require('lodash/assign');
+var forOwn             = require('lodash/forOwn');
+var merge              = require('lodash/merge');
 var debug              = require('debug')('ember-cli:project');
 var AddonDiscovery     = require('../models/addon-discovery');
 var AddonsFactory      = require('../models/addons-factory');
@@ -198,7 +201,7 @@ Project.prototype.config = function(env) {
     var appConfig = this.require(configPath)(env);
     var addonsConfig = this.getAddonsConfig(env, appConfig);
 
-    return _.merge(addonsConfig, appConfig);
+    return merge(addonsConfig, appConfig);
   } else {
     return this.getAddonsConfig(env, {});
   }
@@ -216,11 +219,11 @@ Project.prototype.config = function(env) {
 Project.prototype.getAddonsConfig = function(env, appConfig) {
   this.initializeAddons();
 
-  var initialConfig = _.merge({}, appConfig);
+  var initialConfig = merge({}, appConfig);
 
   return this.addons.reduce(function(config, addon) {
     if (addon.config) {
-      _.merge(config, addon.config(env, config));
+      merge(config, addon.config(env, config));
     }
 
     return config;
@@ -305,7 +308,7 @@ Project.prototype.dependencies = function(pkg, excludeDevDeps) {
     devDependencies = {};
   }
 
-  return _.assign({}, devDependencies, pkg['dependencies']);
+  return assign({}, devDependencies, pkg['dependencies']);
 };
 
 /**
@@ -321,7 +324,7 @@ Project.prototype.bowerDependencies = function(bower) {
     var bowerPath = path.join(this.root, 'bower.json');
     bower = (existsSync(bowerPath)) ? require(bowerPath) : {};
   }
-  return _.assign({}, bower['devDependencies'], bower['dependencies']);
+  return assign({}, bower['devDependencies'], bower['dependencies']);
 };
 
 /**
@@ -431,7 +434,7 @@ Project.prototype.eachAddonCommand = function(callback) {
     this.initializeAddons();
     var addonCommands = this.addonCommands();
 
-    _.forOwn(addonCommands, function(commands, addonName) {
+    forOwn(addonCommands, function(commands, addonName) {
       return callback(addonName, commands);
     });
   }
@@ -526,7 +529,7 @@ Project.prototype.findAddonByName = function(name) {
     return name === addon.name || (addon.pkg && name === addon.pkg.name);
   }
 
-  return _.find(this.addons, function(addon) {
+  return find(this.addons, function(addon) {
     return matchAddon(name, addon);
   });
 };
diff --git a/lib/tasks/addon-install.js b/lib/tasks/addon-install.js
index f3da9adbd..38dd45b7c 100644
--- a/lib/tasks/addon-install.js
+++ b/lib/tasks/addon-install.js
@@ -2,7 +2,7 @@
 
 var Task                = require('../models/task');
 var SilentError         = require('silent-error');
-var merge               = require('ember-cli-lodash-subset').merge;
+var merge               = require('lodash/merge');
 var getPackageBaseName  = require('../utilities/get-package-base-name');
 var Promise             = require('../ext/promise');
 
diff --git a/lib/tasks/generate-from-blueprint.js b/lib/tasks/generate-from-blueprint.js
index 8b3161233..38cc579a0 100644
--- a/lib/tasks/generate-from-blueprint.js
+++ b/lib/tasks/generate-from-blueprint.js
@@ -4,7 +4,7 @@ var Promise      = require('../ext/promise');
 var Blueprint    = require('../models/blueprint');
 var Task         = require('../models/task');
 var parseOptions = require('../utilities/parse-options');
-var merge        = require('ember-cli-lodash-subset').merge;
+var merge        = require('lodash/merge');
 
 module.exports = Task.extend({
   blueprintFunction: 'install',
diff --git a/lib/tasks/git-init.js b/lib/tasks/git-init.js
index a2e93b2aa..11fcf4e10 100644
--- a/lib/tasks/git-init.js
+++ b/lib/tasks/git-init.js
@@ -6,6 +6,7 @@ var exec     = Promise.denodeify(require('child_process').exec);
 var path     = require('path');
 var pkg      = require('../../package.json');
 var fs       = require('fs');
+var template = require('lodash/template');
 
 var gitEnvironmentVariables = {
   GIT_AUTHOR_NAME: 'Tomster',
@@ -16,7 +17,6 @@ var gitEnvironmentVariables = {
 
 module.exports = Task.extend({
   run: function(commandOptions) {
-    var template = require('lodash.template');
     var chalk  = require('chalk');
     var ui     = this.ui;
 
diff --git a/lib/tasks/install-blueprint.js b/lib/tasks/install-blueprint.js
index 30f71aa74..366217d01 100644
--- a/lib/tasks/install-blueprint.js
+++ b/lib/tasks/install-blueprint.js
@@ -7,7 +7,7 @@ var isGitRepo     = require('is-git-url');
 var temp          = require('temp');
 var childProcess  = require('child_process');
 var path          = require('path');
-var merge         = require('ember-cli-lodash-subset').merge;
+var merge         = require('lodash/merge');
 
 // Automatically track and cleanup temp files at exit
 temp.track();
diff --git a/lib/tasks/server/express-server.js b/lib/tasks/server/express-server.js
index 718c9a4fd..a1edb4cae 100644
--- a/lib/tasks/server/express-server.js
+++ b/lib/tasks/server/express-server.js
@@ -5,7 +5,7 @@ var EventEmitter  = require('events').EventEmitter;
 var chalk         = require('chalk');
 var fs            = require('fs');
 var existsSync    = require('exists-sync');
-var debounce      = require('ember-cli-lodash-subset').debounce;
+var debounce      = require('lodash/debounce');
 var mapSeries     = require('promise-map-series');
 var Promise       = require('../../ext/promise');
 var Task          = require('../../models/task');
diff --git a/lib/tasks/server/middleware/proxy-server/index.js b/lib/tasks/server/middleware/proxy-server/index.js
index a4e21fe84..6aded187f 100644
--- a/lib/tasks/server/middleware/proxy-server/index.js
+++ b/lib/tasks/server/middleware/proxy-server/index.js
@@ -15,7 +15,7 @@ ProxyServerAddon.prototype.serverMiddleware = function(options) {
       ws: true,
       secure: !options.insecureProxy,
       changeOrigin: true,
-      xfwd: options.transparentProxy
+      xfwd: true
     });
 
     proxy.on('error', function (e) {
diff --git a/lib/ui/index.js b/lib/ui/index.js
index 8a62d5279..f921dcb60 100644
--- a/lib/ui/index.js
+++ b/lib/ui/index.js
@@ -1,6 +1,7 @@
 'use strict';
 
 var ora              = require('ora');
+var Promise          = require('../ext/promise');
 var EOL              = require('os').EOL;
 var chalk            = require('chalk');
 var writeError       = require('./write-error');
@@ -191,17 +192,17 @@ UI.prototype.stopProgress = function() {
   }
 };
 
-/**
- * @method writeLevelVisible
- * @param {Object} questions
- * @param {Function} [callback]
- * @return {Promise}
- */
 UI.prototype.prompt = function(questions, callback) {
   var inquirer = require('inquirer');
 
   // If no callback was provided, automatically return a promise
-  return inquirer.prompt(questions, callback);
+  if (callback) {
+    inquirer.prompt(questions, callback);
+  } else {
+    return new Promise(function(resolve) {
+      inquirer.prompt(questions, resolve);
+    });
+  }
 };
 
 /**
diff --git a/lib/utilities/markdown-color.js b/lib/utilities/markdown-color.js
index c45385312..b6b0a62a8 100644
--- a/lib/utilities/markdown-color.js
+++ b/lib/utilities/markdown-color.js
@@ -4,7 +4,8 @@ var fs          = require('fs');
 
 var chalk       = require('chalk');
 var SilentError = require('silent-error');
-var merge       = require('ember-cli-lodash-subset').merge;
+var isArray     = require('lodash/isArray');
+var merge       = require('lodash/merge');
 
 var colors = ['red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black', 'white', 'grey', 'gray'];
 var backgroundColors = ['bgRed', 'bgGreen', 'bgBlue', 'bgCyan', 'bgMagenta', 'bgYellow', 'bgWhite', 'bgBlack'];
@@ -127,7 +128,7 @@ MarkdownColor.prototype.generateTokens = function (renderer) {
 MarkdownColor.prototype.renderStylesFactory = renderStylesFactory;
 function renderStylesFactory(renderer, styleNames) {
   var styles;
-  if (Array.isArray(styleNames)) {
+  if (isArray(styleNames)) {
     styles = styleNames.map(checkStyleName.bind(null, renderer));
   } else {
     styles = [checkStyleName(renderer, styleNames)];
diff --git a/lib/utilities/parse-options.js b/lib/utilities/parse-options.js
index 86a6348be..d2d06f9b0 100644
--- a/lib/utilities/parse-options.js
+++ b/lib/utilities/parse-options.js
@@ -1,7 +1,9 @@
 'use strict';
 
+var reduce = require('lodash/reduce');
+
 module.exports = function parseOptions(args) {
-  return args.reduce(function(result, arg) {
+  return reduce(args, function(result, arg) {
     var parts = arg.split(':');
     result[parts[0]] = parts.slice(1).join(':');
     return result;
diff --git a/package.json b/package.json
index 95e4045b3..170126f35 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ember-cli",
-  "version": "2.7.0-beta.4",
+  "version": "2.7.0-beta.3",
   "main": "lib/cli/index.js",
   "description": "Command line tool for developing ambitious ember.js apps",
   "homepage": "http://ember-cli.com/",
@@ -61,11 +61,10 @@
     "core-object": "^2.0.2",
     "debug": "^2.1.3",
     "diff": "^2.2.2",
-    "ember-cli-broccoli": "0.16.10",
+    "ember-cli-broccoli": "0.16.9",
     "ember-cli-get-component-path-option": "^1.0.0",
     "ember-cli-is-package-missing": "^1.0.0",
     "ember-cli-legacy-blueprints": "^0.1.1",
-    "ember-cli-lodash-subset": "^1.0.1",
     "ember-cli-normalize-entity-name": "^1.0.0",
     "ember-cli-preprocess-registry": "^2.0.0",
     "ember-cli-string-utils": "^1.0.0",
@@ -84,13 +83,12 @@
     "glob": "7.0.5",
     "http-proxy": "^1.9.0",
     "inflection": "^1.7.0",
-    "inquirer": "^1.0.2",
+    "inquirer": "^0.12.0",
     "is-git-url": "^0.2.0",
     "isbinaryfile": "^3.0.0",
     "leek": "0.0.21",
     "lodash": "^4.12.0",
-    "markdown-it": "7.0.0",
-    "lodash.template": "^4.2.5",
+    "markdown-it": "6.1.0",
     "markdown-it-terminal": "0.0.3",
     "minimatch": "^3.0.0",
     "morgan": "^1.5.2",
@@ -106,7 +104,7 @@
     "resolve": "^1.1.6",
     "rsvp": "^3.0.17",
     "sane": "^1.1.1",
-    "semver": "^5.1.1",
+    "semver": "^5.1.0",
     "silent-error": "^1.0.0",
     "symlink-or-copy": "^1.0.1",
     "temp": "0.8.3",
@@ -126,7 +124,7 @@
     "ember-cli-blueprint-test-helpers": "^0.13.0",
     "ember-cli-internal-test-helpers": "^0.8.1",
     "eslint-plugin-chai-expect": "^1.1.1",
-    "github": "^2.0.0",
+    "github": "^1.1.0",
     "istanbul": "^0.4.2",
     "mocha": "^2.4.5",
     "mocha-eslint": "^2.0.1",


Test patch:
diff --git a/lib/commands/test.js b/lib/commands/test.js
index 5d1ce17ca..3ed9ace2b 100644
--- a/lib/commands/test.js
+++ b/lib/commands/test.js
@@ -7,7 +7,7 @@ var SilentError = require('silent-error');
 var path        = require('path');
 var win         = require('../utilities/windows-admin');
 var existsSync  = require('exists-sync');
-var assign      = require('ember-cli-lodash-subset').assign;
+
 var defaultPort = 7357;
 
 module.exports = Command.extend({
@@ -35,6 +35,7 @@ module.exports = Command.extend({
   init: function() {
     this._super.apply(this, arguments);
 
+    this.assign    = require('lodash/assign');
     this.quickTemp = require('quick-temp');
 
     this.Builder = this.Builder || Builder;
@@ -115,7 +116,7 @@ module.exports = Command.extend({
 
     process.env['EMBER_CLI_TEST_OUTPUT'] = outputPath;
 
-    var testOptions = assign({}, commandOptions, {
+    var testOptions = this.assign({}, commandOptions, {
       ui: this.ui,
       outputPath: outputPath,
       project: this.project,
@@ -140,7 +141,7 @@ module.exports = Command.extend({
         var testServer     = new TestServerTask(options);
         var builder        = new this.Builder(testOptions);
 
-        testOptions.watcher = new this.Watcher(assign(options, {
+        testOptions.watcher = new this.Watcher(this.assign(options, {
           builder: builder,
           verbose: false,
           options: commandOptions
diff --git a/tests/acceptance/init-test.js b/tests/acceptance/init-test.js
index daa649738..ff96222d2 100644
--- a/tests/acceptance/init-test.js
+++ b/tests/acceptance/init-test.js
@@ -10,11 +10,10 @@ var root       = process.cwd();
 var util       = require('util');
 var conf       = require('ember-cli-internal-test-helpers/lib/helpers/conf');
 var minimatch  = require('minimatch');
-var lodash = require('ember-cli-lodash-subset');
-var intersect  = lodash.intersection;
-var remove     = lodash.remove;
-var forEach    = lodash.forEach;
-var any        = lodash.some;
+var intersect  = require('lodash/intersection');
+var remove     = require('lodash/remove');
+var forEach    = require('lodash/forEach');
+var any        = require('lodash/some');
 var EOL        = require('os').EOL;
 
 var chai = require('../chai');
diff --git a/tests/acceptance/new-test.js b/tests/acceptance/new-test.js
index 1c7970970..5c526c195 100644
--- a/tests/acceptance/new-test.js
+++ b/tests/acceptance/new-test.js
@@ -2,6 +2,7 @@
 
 var fs         = require('fs-extra');
 var ember      = require('../helpers/ember');
+var forEach    = require('lodash/forEach');
 var walkSync   = require('walk-sync');
 var Blueprint  = require('../../lib/models/blueprint');
 var path       = require('path');
@@ -16,7 +17,6 @@ var chai = require('../chai');
 var expect = chai.expect;
 var file = chai.file;
 var dir = chai.dir;
-var forEach = require('ember-cli-lodash-subset').forEach;
 
 var tmpDir = './tmp/new-test';
 
diff --git a/tests/factories/command-options.js b/tests/factories/command-options.js
index 77826fd15..2e87f3ac4 100644
--- a/tests/factories/command-options.js
+++ b/tests/factories/command-options.js
@@ -1,6 +1,6 @@
 'use strict';
 
-var defaults      = require('ember-cli-lodash-subset').defaults;
+var defaults      = require('lodash/defaults');
 var MockUI        = require('../helpers/mock-ui');
 var MockAnalytics = require('../helpers/mock-analytics');
 var MockProject   = require('../helpers/mock-project');
diff --git a/tests/fixtures/addon/simple/tests/.gitkeep b/tests/fixtures/addon/simple/tests/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tests/fixtures/help/help-with-addon.txt b/tests/fixtures/help/help-with-addon.txt
index 15c0ad5ba..9b57457b2 100644
--- a/tests/fixtures/help/help-with-addon.txt
+++ b/tests/fixtures/help/help-with-addon.txt
@@ -122,8 +122,6 @@ ember serve \u001b[36m<options...>\u001b[39m
     \u001b[90maliases: -pr <value>, -pxy <value>\u001b[39m
   \u001b[36m--insecure-proxy\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: false)\u001b[39m Set false to proxy self-signed SSL certificates
     \u001b[90maliases: --inspr\u001b[39m
-  \u001b[36m--transparent-proxy\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: true)\u001b[39m Set to false to omit x-forwarded-* headers when proxying
-    \u001b[90maliases: --transp\u001b[39m
   \u001b[36m--watcher\u001b[39m \u001b[36m(String)\u001b[39m \u001b[36m(Default: events)\u001b[39m
     \u001b[90maliases: -w <value>\u001b[39m
   \u001b[36m--live-reload\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: true)\u001b[39m
diff --git a/tests/fixtures/help/help.js b/tests/fixtures/help/help.js
index 128f78073..ace25366c 100644
--- a/tests/fixtures/help/help.js
+++ b/tests/fixtures/help/help.js
@@ -480,14 +480,6 @@ module.exports = {
           key: 'insecureProxy',
           required: false
         },
-        {
-          name: 'transparent-proxy',
-          default: true,
-          description: 'Set to false to omit x-forwarded-* headers when proxying',
-          aliases: ['transp'],
-          key: 'transparentProxy',
-          required: false
-        },
         {
           name: 'watcher',
           default: 'events',
diff --git a/tests/fixtures/help/help.txt b/tests/fixtures/help/help.txt
index 743cd2a0c..a67e3c841 100644
--- a/tests/fixtures/help/help.txt
+++ b/tests/fixtures/help/help.txt
@@ -122,8 +122,6 @@ ember serve \u001b[36m<options...>\u001b[39m
     \u001b[90maliases: -pr <value>, -pxy <value>\u001b[39m
   \u001b[36m--insecure-proxy\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: false)\u001b[39m Set false to proxy self-signed SSL certificates
     \u001b[90maliases: --inspr\u001b[39m
-  \u001b[36m--transparent-proxy\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: true)\u001b[39m Set to false to omit x-forwarded-* headers when proxying
-    \u001b[90maliases: --transp\u001b[39m
   \u001b[36m--watcher\u001b[39m \u001b[36m(String)\u001b[39m \u001b[36m(Default: events)\u001b[39m
     \u001b[90maliases: -w <value>\u001b[39m
   \u001b[36m--live-reload\u001b[39m \u001b[36m(Boolean)\u001b[39m \u001b[36m(Default: true)\u001b[39m
diff --git a/tests/fixtures/help/with-addon-blueprints.js b/tests/fixtures/help/with-addon-blueprints.js
index 322feb362..18942a8cb 100644
--- a/tests/fixtures/help/with-addon-blueprints.js
+++ b/tests/fixtures/help/with-addon-blueprints.js
@@ -512,14 +512,6 @@ module.exports = {
           key: 'insecureProxy',
           required: false
         },
-        {
-          name: 'transparent-proxy',
-          default: true,
-          description: 'Set to false to omit x-forwarded-* headers when proxying',
-          aliases: ['transp'],
-          key: 'transparentProxy',
-          required: false
-        },
         {
           name: 'watcher',
           default: 'events',
diff --git a/tests/fixtures/help/with-addon-commands.js b/tests/fixtures/help/with-addon-commands.js
index eddc55ae0..01bdca53d 100644
--- a/tests/fixtures/help/with-addon-commands.js
+++ b/tests/fixtures/help/with-addon-commands.js
@@ -480,14 +480,6 @@ module.exports = {
           key: 'insecureProxy',
           required: false
         },
-        {
-          name: 'transparent-proxy',
-          default: true,
-          description: 'Set to false to omit x-forwarded-* headers when proxying',
-          aliases: ['transp'],
-          key: 'transparentProxy',
-          required: false
-        },
         {
           name: 'watcher',
           default: 'events',
diff --git a/tests/helpers/run-command.js b/tests/helpers/run-command.js
index 688876441..eab745960 100644
--- a/tests/helpers/run-command.js
+++ b/tests/helpers/run-command.js
@@ -4,7 +4,7 @@ var RSVP           = require('rsvp');
 var Promise        = require('../../lib/ext/promise');
 var chalk          = require('chalk');
 var spawn          = require('child_process').spawn;
-var defaults       = require('ember-cli-lodash-subset').defaults;
+var defaults       = require('lodash/defaults');
 var killCliProcess = require('./kill-cli-process');
 var logOnFailure   = require('./log-on-failure');
 
diff --git a/tests/unit/commands/addon-test.js b/tests/unit/commands/addon-test.js
index 599d6f12b..e8314774f 100644
--- a/tests/unit/commands/addon-test.js
+++ b/tests/unit/commands/addon-test.js
@@ -2,7 +2,7 @@
 
 var expect         = require('chai').expect;
 var commandOptions = require('../../factories/command-options');
-var map            = require('ember-cli-lodash-subset').map;
+var map            = require('lodash/map');
 var AddonCommand   = require('../../../lib/commands/addon');
 var Blueprint      = require('../../../lib/models/blueprint');
 var td = require('testdouble');
diff --git a/tests/unit/commands/init-test.js b/tests/unit/commands/init-test.js
index fcd7fea66..969f18324 100644
--- a/tests/unit/commands/init-test.js
+++ b/tests/unit/commands/init-test.js
@@ -4,7 +4,7 @@ var fs            = require('fs');
 var os            = require('os');
 var path          = require('path');
 var expect        = require('chai').expect;
-var map           = require('ember-cli-lodash-subset').map;
+var map           = require('lodash/map');
 var MockUI        = require('../../helpers/mock-ui');
 var MockAnalytics = require('../../helpers/mock-analytics');
 var Promise       = require('../../../lib/ext/promise');
diff --git a/tests/unit/commands/new-test.js b/tests/unit/commands/new-test.js
index 1fb732b6e..d9772940b 100644
--- a/tests/unit/commands/new-test.js
+++ b/tests/unit/commands/new-test.js
@@ -1,7 +1,7 @@
 'use strict';
 
 var expect         = require('chai').expect;
-var map            = require('ember-cli-lodash-subset').map;
+var map          = require('lodash/map');
 var commandOptions = require('../../factories/command-options');
 var NewCommand     = require('../../../lib/commands/new');
 var Promise        = require('../../../lib/ext/promise');
diff --git a/tests/unit/commands/serve-test.js b/tests/unit/commands/serve-test.js
index 66102a9d7..a7273e7cb 100644
--- a/tests/unit/commands/serve-test.js
+++ b/tests/unit/commands/serve-test.js
@@ -183,14 +183,6 @@ describe('serve command', function() {
     });
   });
 
-  it('has correct default value for transparent proxy', function() {
-    return command.validateAndRun().then(function() {
-      var captor = td.matchers.captor();
-      td.verify(tasks.Serve.prototype.run(captor.capture()), {times: 1});
-      expect(captor.value.transparentProxy).to.equal(true, 'has correct transparent proxy option when not set');
-    });
-  });
-
   it('uses baseURL of correct environment', function() {
     options.project.config = function(env) {
       return { baseURL: env };
diff --git a/tests/unit/models/addon-discovery-test.js b/tests/unit/models/addon-discovery-test.js
index 59ea178f7..e44c8e4cb 100644
--- a/tests/unit/models/addon-discovery-test.js
+++ b/tests/unit/models/addon-discovery-test.js
@@ -2,7 +2,7 @@
 
 var path = require('path');
 var expect = require('chai').expect;
-var assign = require('ember-cli-lodash-subset').assign;
+var assign = require('lodash/assign');
 var Project = require('../../../lib/models/project');
 var AddonDiscovery = require('../../../lib/models/addon-discovery');
 var fixturePath = path.resolve(__dirname, '../../fixtures/addon');
diff --git a/tests/unit/models/addon-test.js b/tests/unit/models/addon-test.js
index b1fd92327..236dbbd76 100644
--- a/tests/unit/models/addon-test.js
+++ b/tests/unit/models/addon-test.js
@@ -7,7 +7,7 @@ var Addon   = require('../../../lib/models/addon');
 var Promise = require('../../../lib/ext/promise');
 var expect  = require('chai').expect;
 var remove  = Promise.denodeify(fs.remove);
-var findWhere = require('ember-cli-lodash-subset').find;
+var findWhere = require('lodash/find');
 var MockUI = require('../../helpers/mock-ui');
 var mkTmpDirIn = require('../../../lib/utilities/mk-tmp-dir-in');
 
diff --git a/tests/unit/models/asset-size-printer-test.js b/tests/unit/models/asset-size-printer-test.js
index 3b11004c0..1cdd93181 100644
--- a/tests/unit/models/asset-size-printer-test.js
+++ b/tests/unit/models/asset-size-printer-test.js
@@ -107,6 +107,29 @@ describe('models/asset-size-printer', function () {
       });
   });
 
+  it('creates an array of asset objects', function () {
+    var assetObjectKeys;
+    var sizePrinter = new AssetSizePrinter({
+      ui: new MockUi(),
+      outputPath: storedTmpDir
+    });
+
+    return sizePrinter.makeAssetSizesObject()
+      .then(function (assetObject) {
+        assetObjectKeys = Object.keys(assetObject[0]);
+
+        expect(assetObject.length).to.eql(6);
+        expect(assetObjectKeys).to.deep.equal([ 'name', 'size', 'gzipSize', 'showGzipped' ]);
+        expect(assetObject[0].name).to.include('nested-asset.css');
+        expect(assetObject[1].name).to.include('nested-asset.js');
+        expect(assetObject[2].name).to.include('empty.js');
+        expect(assetObject[3].name).to.include('some-project.css');
+        expect(assetObject[4].name).to.include('some-project.js');
+        expect(assetObject[5].name).to.include('test.js');
+      });
+  });
+
+
   it('prints an error when no files are found', function () {
     var outputPath = path.join('path', 'that', 'does', 'not', 'exist');
     var sizePrinter = new AssetSizePrinter({
diff --git a/tests/unit/models/blueprint-test.js b/tests/unit/models/blueprint-test.js
index a800187b3..f6524785b 100644
--- a/tests/unit/models/blueprint-test.js
+++ b/tests/unit/models/blueprint-test.js
@@ -19,7 +19,7 @@ var SilentError       = require('silent-error');
 var proxyquire        = require('proxyquire');
 var existsSync        = require('exists-sync');
 var MarkdownColor     = require('../../../lib/utilities/markdown-color');
-var assign            = require('ember-cli-lodash-subset').assign;
+var assign            = require('lodash/assign');
 var mkTmpDirIn        = require('../../../lib/utilities/mk-tmp-dir-in');
 var td                = require('testdouble');
 
diff --git a/tests/unit/models/command-test.js b/tests/unit/models/command-test.js
index 7f159ac0f..a0318d9ba 100644
--- a/tests/unit/models/command-test.js
+++ b/tests/unit/models/command-test.js
@@ -4,7 +4,7 @@ var expect            = require('chai').expect;
 var proxyquire        = require('proxyquire');
 var commandOptions    = require('../../factories/command-options');
 var processHelpString = require('../../helpers/process-help-string');
-var assign            = require('ember-cli-lodash-subset').assign;
+var assign            = require('lodash/assign');
 var Yam               = require('yam');
 var EOL               = require('os').EOL;
 var td = require('testdouble')
diff --git a/tests/unit/models/file-info-test.js b/tests/unit/models/file-info-test.js
index 0a4c00512..251da3759 100644
--- a/tests/unit/models/file-info-test.js
+++ b/tests/unit/models/file-info-test.js
@@ -10,7 +10,7 @@ var Promise   = require('../../../lib/ext/promise');
 var writeFile = Promise.denodeify(fs.writeFile);
 var root       = process.cwd();
 var tmproot    = path.join(root, 'tmp');
-var assign     = require('ember-cli-lodash-subset').assign;
+var assign     = require('lodash/assign');
 var mkTmpDirIn = require('../../../lib/utilities/mk-tmp-dir-in');
 var td         = require('testdouble');
 var testOutputPath;
diff --git a/tests/unit/settings-file/precedence-settings-test.js b/tests/unit/settings-file/precedence-settings-test.js
index 4a2843af1..5c1a08dc7 100644
--- a/tests/unit/settings-file/precedence-settings-test.js
+++ b/tests/unit/settings-file/precedence-settings-test.js
@@ -1,7 +1,7 @@
 'use strict';
 
 var expect         = require('chai').expect;
-var merge          = require('ember-cli-lodash-subset').merge;
+var merge          = require('lodash/merge');
 var MockUI         = require('../../helpers/mock-ui');
 var MockAnalytics  = require('../../helpers/mock-analytics');
 var Command        = require('../../../lib/models/command');
diff --git a/tests/unit/utilities/merge-blueprint-options-test-disabled.js b/tests/unit/utilities/merge-blueprint-options-test-disabled.js
index 4542018a7..f5080ba50 100644
--- a/tests/unit/utilities/merge-blueprint-options-test-disabled.js
+++ b/tests/unit/utilities/merge-blueprint-options-test-disabled.js
@@ -1,7 +1,7 @@
 'use strict';
 
 var expect                = require('chai').expect;
-var map                   = require('ember-cli-lodash-subset').map;
+var map                   = require('lodash/map');
 var Blueprint             = require('../../../lib/models/blueprint');
 var Project               = require('../../../lib/models/project');
 var Command               = require('../../../lib/models/command');