From 5eb3ab3b019dc9c5983a81781bc2b7728504454e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Fri, 26 Oct 2012 22:35:10 +0200 Subject: [PATCH 01/14] Fix adding builds to a build list on pusher event --- assets/scripts/app/models/build.coffee | 4 ++ assets/scripts/app/models/repo.coffee | 16 +++++ assets/scripts/app/store.coffee | 2 +- .../lib/travis/expandable_record_array.coffee | 14 ++++ assets/scripts/spec/event_spec.coffee | 67 ++++++++----------- public/scripts/app.js | 2 +- public/scripts/min/app.js | 2 +- public/scripts/specs.js | 44 ++++++++++++ public/version | 2 +- 9 files changed, 110 insertions(+), 43 deletions(-) diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index ca931d3e..d2eedb31 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -22,6 +22,10 @@ require 'travis/model' Travis.Helpers.compact(@get('data.config')) ).property('data.config') + isPullRequest: (-> + @get('eventType') == 'pull_request' + ).property('eventType') + isMatrix: (-> @get('data.job_ids.length') > 1 ).property('data.job_ids.length') diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index 494e4a17..5120ae4d 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -12,6 +12,15 @@ require 'travis/model' lastBuild: DS.belongsTo('Travis.Build') + allBuilds: (-> + allBuilds = DS.RecordArray.create + type: Travis.Build + content: Ember.A([]) + store: @get('store') + @get('store').registerRecordArray(allBuilds, Travis.Build); + allBuilds + ).property() + builds: (-> id = @get('id') builds = Travis.Build.byRepoId id, event_type: 'push' @@ -21,6 +30,10 @@ require 'travis/model' store: @get('store') array.load(builds) + + id = @get('id') + array.observe(@get('allBuilds'), (build) -> build.get('repo.id') == id && !build.get('isPullRequest') ) + array ).property() @@ -34,6 +47,9 @@ require 'travis/model' array.load(builds) + id = @get('id') + array.observe(@get('allBuilds'), (build) -> @get('repositoryId') == id && build.get('isPullRequest') ) + array ).property() diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee index a4154358..3b1d6b93 100644 --- a/assets/scripts/app/store.coffee +++ b/assets/scripts/app/store.coffee @@ -85,7 +85,7 @@ Travis.Store = DS.Store.extend @loadIncomplete(Travis.Repo, json.repository || json.repo) else if type == Travis.Worker && json.worker.payload if repo = (json.worker.payload.repo || json.worker.payload.repository) - @loadIncomplete(Travis.Repo, repo) + @loadIncomplete(Travis.Repo, repo, skipIfExists: true) if job = json.worker.payload.job @loadIncomplete(Travis.Job, job) @loadIncomplete(type, json[root]) diff --git a/assets/scripts/lib/travis/expandable_record_array.coffee b/assets/scripts/lib/travis/expandable_record_array.coffee index 06ce4199..eb004fdc 100644 --- a/assets/scripts/lib/travis/expandable_record_array.coffee +++ b/assets/scripts/lib/travis/expandable_record_array.coffee @@ -19,6 +19,20 @@ Travis.ExpandableRecordArray = DS.RecordArray.extend array.addObserver 'isLoaded', observer + observe: (collection, filterWith) -> + @set 'filterWith', filterWith + collection.addArrayObserver this, + willChange: 'observedArrayWillChange' + didChange: 'observedArraydidChange' + + observedArrayWillChange: (->) + observedArraydidChange: (array, index, removedCount, addedCount) -> + addedObjects = array.slice index, index + addedCount + for object in addedObjects + console.log 'observedArraydidChange', object, object.toString(), object.get('repo.id'), object.get('id'), object.get('number') + if @get('filterWith').call this, object + @pushObject object + pushObject: (record) -> ids = @get 'content' id = record.get 'id' diff --git a/assets/scripts/spec/event_spec.coffee b/assets/scripts/spec/event_spec.coffee index c6c3f9d9..73ea19dc 100644 --- a/assets/scripts/spec/event_spec.coffee +++ b/assets/scripts/spec/event_spec.coffee @@ -41,45 +41,34 @@ describe 'events', -> row: 2 item: { slug: 'travis-ci/travis-support', build: { number: 4, url: '/travis-ci/travis-support/builds/10', duration: '1 min 30 sec', finishedAt: 'less than a minute ago' } } -# describe 'an event adding a build', -> -# beforeEach -> -# app 'travis-ci/travis-core/builds' -# waitFor buildsRendered -# -# it 'adds a build to the builds list', -> -# payload = -# build: -# id: 11 -# repository_id: 1 -# commit_id: 11 -# number: '3' -# duration: 55 -# started_at: '2012-07-02T00:02:00Z' -# finished_at: '2012-07-02T00:02:55Z' -# event_type: 'push' -# result: 1 -# commit: -# id: 11 -# sha: '1234567' -# branch: 'master' -# message: 'commit message 3' -# -# -# $.mockjax -# url: '/builds/11' -# responseTime: 0 -# responseText: payload -# -# Em.run -> -# Travis.app.receive 'build:started', -# build: -# id: 11 -# -# waits(100) -# runs -> -# listsBuild -# row: 3 -# item: { id: 11, slug: 'travis-ci/travis-core', number: '3', sha: '1234567', branch: 'master', message: 'commit message 3', finishedAt: 'less than a minute ago', duration: '55 sec', color: 'red' } + describe 'an event adding a build', -> + beforeEach -> + app 'travis-ci/travis-core/builds' + waitFor buildsRendered + + it 'adds a build to the builds list', -> + payload = + build: + id: 11 + repository_id: 1 + commit_id: 1 + number: '3' + duration: 55 + started_at: '2012-07-02T00:02:00Z' + finished_at: '2012-07-02T00:02:55Z' + event_type: 'push' + result: 1 + commit_message: 'commit message 3' + commit: '1234567' + + Em.run -> + Travis.app.receive 'build:started', payload + + waits(100) + runs -> + listsBuild + row: 3 + item: { id: 11, slug: 'travis-ci/travis-core', number: '3', sha: '1234567', branch: 'master', message: 'commit message 1', finishedAt: 'less than a minute ago', duration: '55 sec', color: 'red' } describe 'an event adding a job', -> beforeEach -> diff --git a/public/scripts/app.js b/public/scripts/app.js index 9d7cc1f8..78e38393 100644 --- a/public/scripts/app.js +++ b/public/scripts/app.js @@ -30753,4 +30753,4 @@ var _require=function(){function c(a,c){document.addEventListener?a.addEventList ++g&&setTimeout(c,0)})}}(); (function(){!window.WebSocket&&window.MozWebSocket&&(window.WebSocket=window.MozWebSocket);if(window.WebSocket)Pusher.Transport=window.WebSocket,Pusher.TransportType="native";var c=(document.location.protocol=="http:"?Pusher.cdn_http:Pusher.cdn_https)+Pusher.VERSION,a=[];window.JSON||a.push(c+"/json2"+Pusher.dependency_suffix+".js");if(!window.WebSocket)window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION=!0,a.push(c+"/flashfallback"+Pusher.dependency_suffix+".js");var b=function(){return window.WebSocket?function(){Pusher.ready()}: function(){window.WebSocket?(Pusher.Transport=window.WebSocket,Pusher.TransportType="flash",window.WEB_SOCKET_SWF_LOCATION=c+"/WebSocketMain.swf",WebSocket.__addTask(function(){Pusher.ready()}),WebSocket.__initialize()):(Pusher.Transport=null,Pusher.TransportType="none",Pusher.ready())}}(),e=function(a){var b=function(){document.body?a():setTimeout(b,0)};b()},g=function(){e(b)};a.length>0?_require(a,g):g()})(); -;minispade.register('app', "(function() {(function() {\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher(Travis.config.pusher_key);\n this.tailing = new Travis.Tailing();\n return this.set('auth', Travis.Auth.create({\n app: this,\n endpoint: Travis.config.api_endpoint\n }));\n },\n storeAfterSignInPath: function(path) {\n return this.get('auth').storeAfterSignInPath(path);\n },\n autoSignIn: function(path) {\n return this.get('auth').autoSignIn(path);\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('afterSignOut');\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repo').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('auth', "(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('