From 50ff39d5c029ad1af8cf3a6a4ac20b84abb18164 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 27 Jun 2012 17:52:49 +0200 Subject: [PATCH 01/13] go back to sc-router --- AssetFile | 1 + assets/javascripts/app/app.coffee | 54 +- assets/javascripts/app/helpers/urls.coffee | 35 +- .../javascripts/app/models/repository.coffee | 12 +- assets/javascripts/app/router.coffee | 166 ++--- .../javascripts/app/templates/builds/list.hbs | 2 +- .../javascripts/app/templates/builds/show.hbs | 74 +- .../javascripts/app/templates/jobs/list.hbs | 20 +- .../javascripts/app/templates/jobs/show.hbs | 2 +- .../app/templates/repositories/list.hbs | 10 +- .../app/templates/repositories/show.hbs | 32 +- .../app/templates/repositories/tabs.hbs | 8 +- assets/javascripts/app/views.coffee | 51 +- assets/javascripts/lib/mocks.coffee | 24 +- assets/javascripts/spec/current_spec.coffee | 12 +- .../javascripts/spec/repositories_spec.coffee | 8 +- .../javascripts/spec/repository_spec.coffee | 2 +- assets/javascripts/spec/spec_helper.coffee | 14 +- .../spec/support/conditions.coffee | 2 +- .../spec/support/expectations.coffee | 4 +- assets/javascripts/spec/tabs_spec.coffee | 48 +- assets/javascripts/vendor/ember.js | 142 ++-- assets/javascripts/vendor/sc-routes.js | 546 ++++++++++++++ public/javascripts/application.js | 2 +- public/javascripts/mocks.js | 26 +- public/javascripts/specs/specs.js | 69 +- public/javascripts/vendor.js | 688 ++++++++++++++++-- public/spec.html | 1 - 28 files changed, 1611 insertions(+), 444 deletions(-) create mode 100644 assets/javascripts/vendor/sc-routes.js diff --git a/AssetFile b/AssetFile index b5728ab0..9d275f62 100644 --- a/AssetFile +++ b/AssetFile @@ -16,6 +16,7 @@ input 'assets/javascripts' do vendor/ansiparse.js vendor/i18n.js vendor/jquery.timeago.js + vendor/sc-routes.js ) concat files, 'vendor.js' end diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee index 33befe2c..38e1d932 100644 --- a/assets/javascripts/app/app.coffee +++ b/assets/javascripts/app/app.coffee @@ -1,16 +1,54 @@ -$.mockjaxSettings.log = false +require 'hax0rs' + +# $.mockjaxSettings.log = false @Travis = Em.Namespace.create + run: -> + @app = Travis.App.create(this) + @app.initialize() + App: Em.Application.extend initialize: (router) -> - $.extend(this, Travis.Controllers) - $.extend(this, Travis.Views) - @store = Travis.Store.create() - @_super(router || Travis.Router.create()) + # ember wants this dependencies setup for connectOutlet + $.extend this, Travis.Controllers + $.extend this, Travis.Views + for name, controller of Travis.Controllers + name = name.charAt(0).toLowerCase() + name.substr(1) + this[name] = controller.create(namespace: this, controllers: this) - run: -> - @app = Travis.App.create() - @app.initialize() + @store = Travis.Store.create() + @routes = Travis.Router.create(app: this) + + @_super(Em.Object.create()) + @routes.start() + + connectLayout: -> + view = Travis.Views.ApplicationView.create() + view.set('controller', @applicationController) + view.appendTo(@get('rootElement') || 'body') + + connectLeft: (repositories) -> + @set('repositories', repositories) + @get('applicationController').connectOutlet(outletName: 'left', name: 'repositories', context: repositories) + + connectRepository: (repository) -> + @set('repository', repository) + @get('applicationController').connectOutlet(outletName: 'main', name: 'repository', context: repository) + + connectTabs: (build, job) -> + @setPath('tabsController.repository', @get('repository')) + @setPath('tabsController.build', build) + @setPath('tabsController.job', job) + @get('repositoryController').connectOutlet(outletName: 'tabs', name: 'tabs') + + connectBuilds: (builds) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds) + + connectBuild: (build) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'build', context: build) + + connectJob: (job) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'job', context: job) require 'ext/jquery' diff --git a/assets/javascripts/app/helpers/urls.coffee b/assets/javascripts/app/helpers/urls.coffee index 45d74704..1540a6ca 100644 --- a/assets/javascripts/app/helpers/urls.coffee +++ b/assets/javascripts/app/helpers/urls.coffee @@ -1,35 +1,50 @@ @Travis.Urls = + repository: (repository) -> + "#!/#{repository.get('slug')}" if repository + + lastBuild: (repository) -> + "#!/#{repository.get('slug')}/builds/#{repository.get('lastBuildId')}" if repository + + builds: (repository) -> + "#!/#{repository.get('slug')}/builds" if repository + + build: (repository, build) -> + "#!/#{repository.get('slug')}/builds/#{build.get('id')}" if repository && build + + job: (repository, job) -> + "#!/#{repository.get('slug')}/jobs/#{job.get('id')}" if repository && job + Repository: urlGithub: (-> - 'http://github.com/%@'.fmt @get('slug') + "http://github.com/#{@get('slug')}" ).property('slug'), urlGithubWatchers: (-> - 'http://github.com/%@/watchers'.fmt @get('slug') + "http://github.com/#{@get('slug')}/watchers" ).property('slug'), urlGithubNetwork: (-> - 'http://github.com/%@/network'.fmt @get('slug') + "http://github.com/#{@get('slug')}/network" ).property('slug'), urlGithubAdmin: (-> - 'http://github.com/%@/admin/hooks#travis_minibucket'.fmt @get('slug') + "http://github.com/#{@get('slug')}/admin/hooks#travis_minibucket" ).property('slug') statusImage: (-> - '%@.png'.fmt @get('slug') + "#{@get('slug')}.png" ).property('slug') Commit: urlGithubCommit: (-> - 'http://github.com/%@/commit/%@'.fmt @getPath('repository.slug'), @getPath('commit.sha') + "http://github.com/#{@getPath('repository.slug')}/commit/#{@getPath('commit.sha')}" ).property('repository.slug', 'commit.sha') urlAuthor: (-> - 'mailto:%@'.fmt @getPath('commit.authorEmail') - ).property() + "mailto:#{@getPath('commit.authorEmail')}" + ).property('commit.authorEmail') urlCommitter: (-> - 'mailto:%@'.fmt @getPath('commit.committerEmail') - ).property() + "mailto:#{@getPath('commit.committerEmail')}" + ).property('commit.committerEmail') diff --git a/assets/javascripts/app/models/repository.coffee b/assets/javascripts/app/models/repository.coffee index eca5e446..10391ba5 100644 --- a/assets/javascripts/app/models/repository.coffee +++ b/assets/javascripts/app/models/repository.coffee @@ -2,6 +2,8 @@ require 'travis/model' @Travis.Repository = Travis.Model.extend slug: DS.attr('string') + owner: DS.attr('string') + name: DS.attr('string') description: DS.attr('string') lastBuildId: DS.attr('number') lastBuildNumber: DS.attr('string') @@ -9,8 +11,6 @@ require 'travis/model' lastBuildStarted_at: DS.attr('string') lastBuildFinished_at: DS.attr('string') - primaryKey: 'slug' - lastBuild: DS.belongsTo('Travis.Build') builds: (-> @@ -21,14 +21,6 @@ require 'travis/model' Travis.Build.byRepositoryId @get('id'), event_type: 'pull_request' ).property() - owner: (-> - (@get('slug') || @_id).split('/')[0] - ).property('owner', 'name'), - - name: (-> - (@get('slug') || @_id).split('/')[1] - ).property('owner', 'name'), - lastBuildDuration: (-> duration = @getPath('data.lastBuildDuration') duration = Travis.Helpers.durationFrom(@get('lastBuildStarted_at'), @get('lastBuildFinished_at')) unless duration diff --git a/assets/javascripts/app/router.coffee b/assets/javascripts/app/router.coffee index 715e0bfb..8eb90b6f 100644 --- a/assets/javascripts/app/router.coffee +++ b/assets/javascripts/app/router.coffee @@ -1,119 +1,71 @@ -require 'hax0rs' +Travis.Router = Em.Object.extend + ROUTES: + '!/:owner/:name/jobs/:id/:line': 'job' + '!/:owner/:name/jobs/:id': 'job' + '!/:owner/:name/builds/:id': 'build' + '!/:owner/:name/builds': 'builds' + '!/:owner/:name/pull_requests': 'pullRequests' + '!/:owner/:name/branch_summary': 'branches' + '!/:owner/:name': 'current' + '': 'index' -@Travis.Router = Em.Router.extend - # enableLogging: true - location: 'hash' + init: () -> + @app = @get('app') - root: Em.Route.extend - # common "layout" state for all states that show a repo list on the left. - # there also will be "profile" and "stats" states next to "default" that do - # not have a 3-column layout - default: Em.Route.extend - route: '/' + start: -> + @app.connectLayout() + @app.connectLeft(Travis.Repository.find()) + @route(route, action) for route, action of @ROUTES - viewCurrent: Ember.Route.transitionTo('repository.current') - viewBuilds: Ember.Route.transitionTo('repository.builds') - viewBuild: Ember.Route.transitionTo('repository.build') - viewJob: Ember.Route.transitionTo('repository.job') + route: (route, tab) -> + Em.routes.add(route, (params) => this[tab](params)) - connectOutlets: (router) -> - repositories = Travis.Repository.find() - router.set('repositories', repositories) - router.set('job', undefined) - router.connectLeft(repositories) + index: (params) -> + repositories = @app.get('repositories') + onceLoaded repositories, => + repository = repositories.get('firstObject') + @app.connectRepository(repository) + @app.connectTabs() + @app.connectBuild(repository.get('lastBuild')) - index: Em.Route.extend - route: '/' + current: (params) -> + @repository params, (repository) => + @app.connectTabs() + @app.connectBuild(repository.get('lastBuild')) - # on / we show the most recent repository from the repos list, so we - # have to wait until it's loaded - connectOutlets: (router) -> - repositories = router.get('repositories') - onceLoaded repositories, => - repository = repositories.get('firstObject') - build = Travis.Build.find(repository.get('lastBuildId')) - router.connectRepository(repository) - router.connectTabs() - router.connectBuild(build) + builds: (params) -> + @repository params, (repository) => + @app.connectTabs() + @app.connectBuilds(repository.get('builds')) - repository: Em.Route.extend - route: '/:owner/:name' + build: (params) -> + @repository params + @buildBy params.id, (build) => + @app.connectTabs(build) + @app.connectBuild(build) - serialize: (router, repository) -> - router.serializeRepository(repository) + job: (params) -> + @repository params + @jobBy params.id, (job) => + @app.connectTabs(job.get('build'), job) + @app.connectJob(job) - deserialize: (router, params) -> - router.deserializeRepository(params) + repository: (params, callback) -> + @repositoryBy params, (repository) => + @app.connectRepository(repository) + callback(repository) if callback - connectOutlets: (router, repository) -> - router.connectRepository(repository) + repositoryBy: (params, callback) -> + repositories = Travis.Repository.bySlug("#{params.owner}/#{params.name}") + onceLoaded repositories, => + callback(repositories.get('firstObject')) - current: Em.Route.extend - route: '/' - - connectOutlets: (router) -> - repository = router.get('repository') - onceLoaded repository, -> # TODO should not need to wait here, right? - build = repository.get('lastBuild') - router.connectTabs() - router.connectBuild(build) - - builds: Em.Route.extend - route: '/builds' - - connectOutlets: (router) -> - repository = router.get('repository') - onceLoaded repository, => # TODO hrm, otherwise it gets builds?repository_id=null - router.connectTabs() - router.connectBuilds(repository.get('builds')) - - build: Em.Route.extend - route: '/builds/:build_id' - - connectOutlets: (router, build) -> - build = Travis.Build.find(build.id) unless build instanceof Travis.Build # what? - router.connectTabs(build) - router.connectBuild(build) - - job: Em.Route.extend - route: '/jobs/:job_id' - - connectOutlets: (router, job) -> - job = Travis.Job.find(job.id) unless job instanceof Travis.Job # what? - router.connectTabs(job.get('build'), job) - router.connectJob(job) - - - connectLeft: (repositories) -> - @get('applicationController').connectOutlet(outletName: 'left', name: 'repositories', context: repositories) - - connectRepository: (repository) -> - @set('repository', repository) - @get('applicationController').connectOutlet(outletName: 'main', name: 'repository', context: repository) - - connectTabs: (build, job) -> - @setPath('tabsController.repository', @get('repository')) - @setPath('tabsController.build', build) - @setPath('tabsController.job', job) - @get('repositoryController').connectOutlet(outletName: 'tabs', name: 'tabs') - - connectBuilds: (builds) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds) - - connectBuild: (build) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'build', context: build) - - connectJob: (job) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'job', context: job) - - - serializeRepository: (object) -> - if object instanceof Travis.Repository - slug = object.get('slug') || object._id # wat. - { owner: slug.split('/')[0], name: slug.split('/')[1] } - else - object - - deserializeRepository: (params) -> - Travis.Repository.find("#{params.owner}/#{params.name}") + buildBy: (id, callback) => + build = Travis.Build.find(id) + onceLoaded build, => + callback(build) + jobBy: (id, callback) -> + job = Travis.Job.find(id) + onceLoaded job, => + callback(job) diff --git a/assets/javascripts/app/templates/builds/list.hbs b/assets/javascripts/app/templates/builds/list.hbs index 2869b9ff..0beced9b 100644 --- a/assets/javascripts/app/templates/builds/list.hbs +++ b/assets/javascripts/app/templates/builds/list.hbs @@ -13,7 +13,7 @@ {{#each build in content}} {{#view Travis.Views.BuildsItemView contextBinding="build"}} - {{number}} + #{{number}} {{formatCommit commit}} {{{formatMessage commit.message short="true"}}} {{formatDuration duration}} diff --git a/assets/javascripts/app/templates/builds/show.hbs b/assets/javascripts/app/templates/builds/show.hbs index 51b5a0f7..454a2eb9 100644 --- a/assets/javascripts/app/templates/builds/show.hbs +++ b/assets/javascripts/app/templates/builds/show.hbs @@ -1,46 +1,48 @@ -
-
-
-
{{t builds.name}}
-
{{number}}
-
{{t builds.finished_at}}
-
{{formatTime finished_at}}
-
{{t builds.duration}}
-
{{formatDuration duration}}
-
+{{#unless isLoaded}} + Loading ... +{{else}} +
+
+
+
{{t builds.name}}
+
{{number}}
+
{{t builds.finished_at}}
+
{{formatTime finished_at}}
+
{{t builds.duration}}
+
{{formatDuration duration}}
+
-
-
{{t builds.commit}}
-
{{formatCommit commit}}
- {{#if commit.compareUrl}} -
{{t builds.compare}}
-
{{pathFrom commit.compareUrl}}
- {{/if}} - {{#if commit.authorName}} -
{{t builds.author}}
-
{{commit.authorName}}
- {{/if}} - {{#if commit.committerName}} -
{{t builds.committer}}
-
{{commit.committerName}}
- {{/if}} -
+
+
{{t builds.commit}}
+
{{formatCommit commit}}
+ {{#if commit.compareUrl}} +
{{t builds.compare}}
+
{{pathFrom commit.compareUrl}}
+ {{/if}} + {{#if commit.authorName}} +
{{t builds.author}}
+
{{commit.authorName}}
+ {{/if}} + {{#if commit.committerName}} +
{{t builds.committer}}
+
{{commit.committerName}}
+ {{/if}} +
-
{{t builds.message}}
-
{{{formatMessage commit.message}}}
+
{{t builds.message}}
+
{{{formatMessage commit.message}}}
- {{#unless isMatrix}} -
{{t builds.config}}
-
{{formatConfig config}}
- {{/unless}} -
+ {{#unless isMatrix}} +
{{t builds.config}}
+
{{formatConfig config}}
+ {{/unless}} +
- {{#if isLoaded}} {{#if isMatrix}} {{view Travis.Views.JobsView jobsBinding="view.requiredJobs" required="true"}} {{view Travis.Views.JobsView jobsBinding="view.allowedFailureJobs"}} {{else}} {{view Travis.Views.LogView contextBinding="jobs.firstObject"}} {{/if}} - {{/if}} -
+ +{{/unless}} diff --git a/assets/javascripts/app/templates/jobs/list.hbs b/assets/javascripts/app/templates/jobs/list.hbs index 57399898..9bdeadf6 100644 --- a/assets/javascripts/app/templates/jobs/list.hbs +++ b/assets/javascripts/app/templates/jobs/list.hbs @@ -15,15 +15,17 @@ - {{#each view.jobs}} - - #{{number}} - {{formatDuration duration}} - {{formatTime finished_at}} - {{#each configValues}} - {{this}} - {{/each}} - + {{#each job in view.jobs}} + {{#view Travis.Views.JobsItemView contextBinding="job"}} + + #{{number}} + {{formatDuration duration}} + {{formatTime finished_at}} + {{#each configValues}} + {{this}} + {{/each}} + + {{/view}} {{/each}} diff --git a/assets/javascripts/app/templates/jobs/show.hbs b/assets/javascripts/app/templates/jobs/show.hbs index 97919933..8039f593 100644 --- a/assets/javascripts/app/templates/jobs/show.hbs +++ b/assets/javascripts/app/templates/jobs/show.hbs @@ -2,7 +2,7 @@
Job
-
{{number}}
+
{{number}}
{{t jobs.finished_at}}
{{formatTime finished_at}}
{{t jobs.duration}}
diff --git a/assets/javascripts/app/templates/repositories/list.hbs b/assets/javascripts/app/templates/repositories/list.hbs index b4c503ba..b6c5d417 100644 --- a/assets/javascripts/app/templates/repositories/list.hbs +++ b/assets/javascripts/app/templates/repositories/list.hbs @@ -1,10 +1,12 @@ -{{#if content.lastObject.isLoaded}} +{{#unless content.lastObject.isLoaded}} + Loading ... +{{else}}