`@each` should be used for observing properties of array elements (#50)

@each should be used for observing properties of array elements (#50)

diff --git a/assets/docker-manager-app.js b/assets/docker-manager-app.js
index 22b7cdb..6b4b532 100644
--- a/assets/docker-manager-app.js
+++ b/assets/docker-manager-app.js
@@ -15,12 +15,12 @@ var n=Ember.Controller.extend({showBanner:Ember.computed("banner","bannerDismiss
 var e=this.get("banner")
 return e&&e.length>0}),appendBannerHtml:function(e){var t=this.get("banner")||[];-1===t.indexOf(e)&&t.pushObject(e),this.set("banner",t)},logoUrl:Ember.computed(function(){return t.default.getURL("/assets/images/docker-manager-aff8eaea0445c0488c19f8cfd14faa8c2b278924438f19048eacc175d7d134e4.png")}),returnToSiteUrl:Ember.computed(function(){return t.default.getURL("/")}),backupsUrl:Ember.computed(function(){return t.default.getURL("/admin/backups")}),actions:{dismiss:function(){this.set("bannerDismissed",!0)}}})
 e.default=n}),define("manager-client/controllers/index",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
-var t=Ember.Controller.extend({managerRepo:null,upgrading:null,upgradeAllButtonDisabled:Ember.computed("managerRepo.upToDate","allUpToDate",function(){return!this.get("managerRepo.upToDate")||this.get("allUpToDate")}),allUpToDate:Ember.computed("model.[].upToDate",function(){return this.get("model").every(function(e){return e.get("upToDate")})}),actions:{upgradeAllButton:function(){this.replaceRoute("upgrade","all")}}})
+var t=Ember.Controller.extend({managerRepo:null,upgrading:null,upgradeAllButtonDisabled:Ember.computed("managerRepo.upToDate","allUpToDate",function(){return!this.get("managerRepo.upToDate")||this.get("allUpToDate")}),allUpToDate:Ember.computed("model.@each.upToDate",function(){return this.get("model").every(function(e){return e.get("upToDate")})}),actions:{upgradeAllButton:function(){this.replaceRoute("upgrade","all")}}})
 e.default=t}),define("manager-client/controllers/processes",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
 var t=Ember.Controller.extend({autoRefresh:!1,init:function(){var e=this
 this._super(),window.setInterval(function(){e.performRefresh()},5e3)},performRefresh:function(){this.get("autoRefresh")&&this.get("model").refresh()}})
 e.default=t}),define("manager-client/controllers/upgrade",["exports","manager-client/models/repo"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
-var n=Ember.Controller.extend({output:null,init:function(){this._super(),this.reset()},complete:Ember.computed.equal("status","complete"),failed:Ember.computed.equal("status","failed"),multiUpgrade:Ember.computed("model.length",function(){return 1!==this.get("model.length")}),title:Ember.computed("model.[].name",function(){return this.get("multiUpgrade")?"All":this.get("model")[0].get("name")}),isUpToDate:Ember.computed("model.[].upToDate",function(){return this.get("model").every(function(e){return e.get("upToDate")})}),upgrading:Ember.computed("model.[].upgrading",function(){return this.get("model").some(function(e){return e.get("upgrading")})}),repos:function(){var e=this.get("model")
+var n=Ember.Controller.extend({output:null,init:function(){this._super(),this.reset()},complete:Ember.computed.equal("status","complete"),failed:Ember.computed.equal("status","failed"),multiUpgrade:Ember.computed("model.length",function(){return 1!==this.get("model.length")}),title:Ember.computed("model.@each.name",function(){return this.get("multiUpgrade")?"All":this.get("model")[0].get("name")}),isUpToDate:Ember.computed("model.@each.upToDate",function(){return this.get("model").every(function(e){return e.get("upToDate")})}),upgrading:Ember.computed("model.@each.upgrading",function(){return this.get("model").some(function(e){return e.get("upgrading")})}),repos:function(){var e=this.get("model")
 return this.get("isMultiple")?e:[e]},updateAttribute:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2]
 this.get("model").forEach(function(r){t=n?r.get(t):t,r.set(e,t)})},messageReceived:function(e){switch(e.type){case"log":this.set("output",this.get("output")+e.value+"\n")
 break
@@ -127,4 +127,4 @@ e.default=t}),define("manager-client/templates/upgrade",["exports"],function(e){
 var t=Ember.HTMLBars.template({id:"22BAD0Z/",block:'{"symbols":[],"statements":[[7,"h3"],[9],[0,"Upgrade "],[1,[21,"title"],false],[10],[0,"\\n\\n"],[1,[27,"progress-bar",null,[["percent"],[[23,["percent"]]]]],false],[0,"\\n\\n"],[4,"if",[[23,["complete"]]],null,{"statements":[[0,"  "],[7,"p"],[9],[0,"Upgrade completed successfully!"],[10],[0,"\\n"]],"parameters":[]},null],[0,"\\n"],[4,"if",[[23,["failed"]]],null,{"statements":[[0,"  "],[7,"p"],[9],[0,"Sorry, there was an error upgrading Discourse. Please check the logs below."],[10],[0,"\\n"]],"parameters":[]},null],[0,"\\n"],[4,"if",[[23,["isUpToDate"]]],null,{"statements":[[4,"unless",[[23,["multiUpgrade"]]],null,{"statements":[[0,"    "],[7,"p"],[9],[1,[21,"title"],false],[0," is at the newest version "],[1,[27,"fmt-commit",[[23,["model","0","version"]],[23,["model","0","url"]],[23,["model","0","branch"]]],null],false],[0,"."],[10],[0,"\\n"]],"parameters":[]},{"statements":[[0,"    "],[7,"p"],[9],[0,"Everything is up-to-date."],[10],[0,"\\n"]],"parameters":[]}]],"parameters":[]},{"statements":[[0,"  "],[7,"div"],[11,"style","clear: both"],[9],[0,"\\n    "],[7,"button"],[12,"disabled",[21,"upgrading"]],[11,"class","btn"],[9],[1,[21,"upgradeButtonText"],false],[3,"action",[[22,0,[]],"start"]],[10],[0,"\\n"],[4,"if",[[23,["upgrading"]]],null,{"statements":[[0,"      "],[7,"button"],[11,"class","btn unlock"],[9],[0,"Reset Upgrade"],[3,"action",[[22,0,[]],"resetUpgrade"]],[10],[0,"\\n"]],"parameters":[]},null],[0,"  "],[10],[0,"\\n"]],"parameters":[]}],[0,"\\n"],[1,[27,"x-console",null,[["output","followOutput"],[[23,["output"]],true]]],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"manager-client/templates/upgrade.hbs"}})
 e.default=t}),define("manager-client/config/environment",[],function(){try{var e="manager-client/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(unescape(t))}
 return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(r){throw new Error('Could not read config from meta tag with name "'+e+'".')}})
-runningTests||require("manager-client/app").default.create({name:"manager-client",version:"0.0.0+167f66c4"})
+runningTests||require("manager-client/app").default.create({name:"manager-client",version:"0.0.0+e7e8181d"})
diff --git a/manager-client/app/controllers/index.js b/manager-client/app/controllers/index.js
index 8c685de..8f2f0b0 100644
--- a/manager-client/app/controllers/index.js
+++ b/manager-client/app/controllers/index.js
@@ -13,7 +13,7 @@ export default Controller.extend({
     }
   ),
 
-  allUpToDate: computed("model.[].upToDate", function() {
+  allUpToDate: computed("model.@each.upToDate", function() {
     return this.get("model").every(repo => repo.get("upToDate"));
   }),
 
diff --git a/manager-client/app/controllers/upgrade.js b/manager-client/app/controllers/upgrade.js
index 10ac991..3856d0a 100644
--- a/manager-client/app/controllers/upgrade.js
+++ b/manager-client/app/controllers/upgrade.js
@@ -19,15 +19,15 @@ export default Controller.extend({
     return this.get("model.length") !== 1;
   }),
 
-  title: computed("model.[].name", function() {
+  title: computed("model.@each.name", function() {
     return this.get("multiUpgrade") ? "All" : this.get("model")[0].get("name");
   }),
 
-  isUpToDate: computed("model.[].upToDate", function() {
+  isUpToDate: computed("model.@each.upToDate", function() {
     return this.get("model").every(repo => repo.get("upToDate"));
   }),
 
-  upgrading: computed("model.[].upgrading", function() {
+  upgrading: computed("model.@each.upgrading", function() {
     return this.get("model").some(repo => repo.get("upgrading"));
   }),

GitHub sha: a82159de