From af02f2b2f380cc44a761154a2fa0802bd98094f9 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 26 Sep 2012 12:34:40 +0200 Subject: [PATCH] fix hooks, sync and try fixing locale --- Gemfile | 3 + Gemfile.lock | 23 +++++-- assets/javascripts/app/models/user.coffee | 22 +++++-- assets/javascripts/app/pusher.coffee | 4 +- .../javascripts/app/store/rest_adapter.coffee | 1 + .../app/templates/profile/tabs/user.hbs | 4 +- assets/javascripts/app/views/profile.coffee | 5 ++ public/javascripts/application.js | 2 +- public/javascripts/vendor.js | 66 ++++++++++++------- 9 files changed, 91 insertions(+), 39 deletions(-) diff --git a/Gemfile b/Gemfile index f2716cfb..7cf60c0b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,7 @@ source :rubygems +gem 'debugger' + gem 'travis-api', github: 'travis-ci/travis-api' gem 'travis-core', github: 'travis-ci/travis-core', branch: 'sf-more-services' gem 'travis-support', github: 'travis-ci/travis-support' @@ -8,6 +10,7 @@ gem 'gh', github: 'rkh/gh' gem 'unicorn' gem 'sinatra' gem 'sinatra-contrib' +gem 'rack-contrib', github: 'rack/rack-contrib' gem 'yard-sinatra', github: 'rkh/yard-sinatra' gem 'bunny' diff --git a/Gemfile.lock b/Gemfile.lock index bfc7c78d..7210145a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,6 +6,13 @@ GIT rake (~> 0.9.0) thor +GIT + remote: git://github.com/rack/rack-contrib.git + revision: b7e7c38fd02c3b5da91aa57af78b3f571c6ebcd0 + specs: + rack-contrib (1.1.0) + rack (>= 0.9.1) + GIT remote: git://github.com/rkh/gh.git revision: affde20a4fecb1023f2e7031734b9386a76d22c2 @@ -35,7 +42,7 @@ GIT GIT remote: git://github.com/travis-ci/travis-api.git - revision: f09cb3cac0290dcb745ae6a913b73188c375199b + revision: 6dc28f0c49cef93dd24ee980b018719af02180df specs: travis-api (0.0.1) backports (~> 2.5) @@ -53,7 +60,7 @@ GIT GIT remote: git://github.com/travis-ci/travis-core.git - revision: ea7a1678a0388e586ac4778a9b6ee56a11dfb0aa + revision: a4b1446e3746a5ff59a5438a34f7b2471e33a731 branch: sf-more-services specs: travis-core (0.0.1) @@ -126,6 +133,7 @@ GEM coffee-script-source execjs coffee-script-source (1.3.3) + columnize (0.3.6) compass (0.12.2) chunky_png (~> 1.2) fssm (>= 0.2.7) @@ -134,6 +142,13 @@ GEM data_migrations (0.0.1) activerecord rake + debugger (1.2.0) + columnize (>= 0.3.1) + debugger-linecache (~> 1.1.1) + debugger-ruby_core_source (~> 1.1.3) + debugger-linecache (1.1.2) + debugger-ruby_core_source (>= 1.1.1) + debugger-ruby_core_source (1.1.3) erubis (2.7.0) eventmachine (1.0.0) execjs (1.4.0) @@ -181,8 +196,6 @@ GEM rack (1.4.1) rack-cache (1.2) rack (>= 0.4) - rack-contrib (1.1.0) - rack (>= 0.9.1) rack-protection (1.2.0) rack rack-ssl (1.3.2) @@ -246,11 +259,13 @@ DEPENDENCIES bunny coffee-script compass + debugger gh! guard hubble! newrelic_rpm (~> 3.3.0) pg (~> 0.13.2) + rack-contrib! rake-pipeline! rake-pipeline-web-filters! sinatra diff --git a/assets/javascripts/app/models/user.coffee b/assets/javascripts/app/models/user.coffee index f3b5be69..a00a8af7 100644 --- a/assets/javascripts/app/models/user.coffee +++ b/assets/javascripts/app/models/user.coffee @@ -22,7 +22,7 @@ require 'travis/model' ).property() updateLocale: (locale) -> - @set('locale', locale) + @setWithSession('locale', locale) Travis.app.store.commit() type: (-> @@ -38,7 +38,19 @@ require 'travis/model' @ajax '/profile', 'get', success: (data) => if data.user.is_syncing Ember.run.later(this, this.poll.bind(this), 3000) - else if this.get('isSyncing') - # TODO this doesn't seem to work properly - Travis.app.store.load(Travis.User, data.user) - Travis.app.store.loadMany(Travis.Account, data.accounts) + else + @set('isSyncing', false) + @setWithSession('syncedAt', data.user.synced_at) + + # # TODO this doesn't work properly + # Travis.app.store.loadMany(Travis.Account, data.accounts) + + setWithSession: (name, value) -> + @set(name, value) + data = JSON.parse(sessionStorage?.getItem('travis.user')) + data.user[$.underscore(name)] = @get(name) + sessionStorage?.setItem('travis.user', JSON.stringify(data)) + + +@Travis.User.reopenClass + url: 'profile' diff --git a/assets/javascripts/app/pusher.coffee b/assets/javascripts/app/pusher.coffee index b0b60c9a..12c911ed 100644 --- a/assets/javascripts/app/pusher.coffee +++ b/assets/javascripts/app/pusher.coffee @@ -25,8 +25,8 @@ $.extend Travis.Pusher.prototype, "#{Travis.Pusher.CHANNEL_PREFIX}#{channel}" receive: (event, data) -> - if data.id - data = @normalize(event, data) + return if event.substr(0, 6) == 'pusher' + data = @normalize(event, data) if data.id Ember.run.next -> Travis.app.store.receive(event, data) diff --git a/assets/javascripts/app/store/rest_adapter.coffee b/assets/javascripts/app/store/rest_adapter.coffee index 77946c45..8158288b 100644 --- a/assets/javascripts/app/store/rest_adapter.coffee +++ b/assets/javascripts/app/store/rest_adapter.coffee @@ -22,3 +22,4 @@ require 'models' branch: 'branches' job: 'jobs' worker: 'workers' + profile: 'profile' diff --git a/assets/javascripts/app/templates/profile/tabs/user.hbs b/assets/javascripts/app/templates/profile/tabs/user.hbs index 5856502f..44907e8d 100644 --- a/assets/javascripts/app/templates/profile/tabs/user.hbs +++ b/assets/javascripts/app/templates/profile/tabs/user.hbs @@ -22,9 +22,9 @@
- {{view Ember.Select + {{view Ember.Select id="locale" contentBinding="view.locales" - selectionBinding="user.locale" + valueBinding="Travis.app.currentUser.locale" optionLabelPath="content.name" optionValuePath="content.key"}} diff --git a/assets/javascripts/app/views/profile.coffee b/assets/javascripts/app/views/profile.coffee index 7084606a..81dc1ed8 100644 --- a/assets/javascripts/app/views/profile.coffee +++ b/assets/javascripts/app/views/profile.coffee @@ -81,8 +81,13 @@ "#{location.protocol}//www.gravatar.com/avatar/#{@get('user.gravatarId')}?s=48&d=mm" ).property('user.gravatarId') + # locale: (-> + # @get('user.locale') + # ).property('user.locale') + locales: (-> [ + { key: null, name: '' } { key: 'en', name: 'English' } { key: 'ca', name: 'Catalan' } { key: 'cs', name: 'Čeština' } diff --git a/public/javascripts/application.js b/public/javascripts/application.js index be69b6b6..4fc2d5a5 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1 +1 @@ -minispade.register('templates', "(function() {Ember.TEMPLATES['builds/list']=Ember.Handlebars.compile(\"{{#if builds.isLoaded}}\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n {{#each build in builds}}\\n {{#view Travis.BuildsItemView contextBinding=\\\"build\\\"}}\\n \\n \\n \\n \\n \\n \\n \\n {{/view}}\\n {{/each}}\\n \\n
{{t builds.name}}{{t builds.commit}}{{t builds.message}}{{t builds.duration}}{{t builds.finished_at}}
\\n \\n \\n {{number}}\\n \\n \\n \\n {{formatCommit commit}}\\n \\n \\n {{{formatMessage commit.message short=\\\"true\\\"}}}\\n \\n {{formatDuration duration}}\\n \\n {{formatTime finishedAt}}\\n
\\n\\n

\\n \\n

\\n{{else}}\\n
Loading
\\n{{/if}}\\n\");Ember.TEMPLATES['builds/show']=Ember.Handlebars.compile(\"{{#with view}}\\n {{#if build.isLoaded}}\\n
\\n
\\n
\\n
{{t builds.name}}
\\n
\\n \\n \\n {{build.number}}\\n \\n
\\n
{{t builds.finished_at}}
\\n
{{formatTime build.finishedAt}}
\\n
{{t builds.duration}}
\\n
{{formatDuration build.duration}}
\\n
\\n\\n
\\n
{{t builds.commit}}
\\n
{{formatCommit build.commit}}
\\n {{#if commit.compareUrl}}\\n
{{t builds.compare}}
\\n
{{pathFrom build.commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t builds.author}}
\\n
{{build.commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t builds.committer}}
\\n
{{build.commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t builds.message}}
\\n
{{{formatMessage build.commit.message}}}
\\n\\n {{#unless isMatrix}}\\n
{{t builds.config}}
\\n
{{formatConfig build.config}}
\\n {{/unless}}\\n
\\n
\\n\\n {{#if build.isMatrix}}\\n {{view Travis.JobsView jobsBinding=\\\"build.requiredJobs\\\" required=\\\"true\\\"}}\\n {{view Travis.JobsView jobsBinding=\\\"build.allowedFailureJobs\\\"}}\\n {{else}}\\n {{view Travis.LogView contextBinding=\\\"build.jobs.firstObject\\\"}}\\n {{/if}}\\n {{else}}\\n
\\n Loading\\n
\\n {{/if}}\\n{{/with}}\\n\");Ember.TEMPLATES['jobs/list']=Ember.Handlebars.compile(\"{{#if view.jobs.length}}\\n {{#if view.required}}\\n \\n \\n {{else}}\\n
\\n {{t jobs.build_matrix}}\\n
\\n \\n {{/if}}\\n \\n \\n {{#each key in view.build.configKeys}}\\n \\n {{/each}}\\n \\n \\n \\n {{#each job in view.jobs}}\\n {{#view Travis.JobsItemView contextBinding=\\\"job\\\"}}\\n \\n \\n \\n {{#each value in configValues}}\\n \\n {{/each}}\\n {{/view}}\\n {{/each}}\\n \\n
\\n {{t jobs.allowed_failures}}\\n \\n
{{key}}
\\n \\n \\n {{number}}\\n \\n \\n {{formatDuration duration}}\\n \\n {{formatTime finishedAt}}\\n {{value}}
\\n\\n {{#unless view.required}}\\n
\\n

{{t \\\"jobs.allowed_failures\\\"}}

\\n

\\n Allowed Failures are items in your build matrix that are allowed to\\n fail without causing the entire build to be shown as failed.\\n

\\n

\\n You can define allowed failures in the build matrix as follows:\\n

\\n
matrix:\\n  allow_failures:\\n    - rvm: ruby-head
\\n

\\n This lets you add in experimental and preparatory builds to test against versions or\\n configurations that you are not ready to officially support.\\n

\\n
\\n {{/unless}}\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/log']=Ember.Handlebars.compile(\"{{view.logSubscriber}}\\n\\n{{#if log.isLoaded}}\\n
\\n    \\n    \\n  {{{formatLog log.body}}}
\\n\\n {{#if sponsor.name}}\\n

\\n {{t builds.messages.sponsored_by}}\\n {{sponsor.name}}\\n

\\n {{/if}}\\n\\n To top\\n{{else}}\\n
\\n Loading\\n
\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/show']=Ember.Handlebars.compile(\"{{#with view}}\\n {{#if job.isLoaded}}\\n
\\n
\\n
\\n
Job
\\n
{{job.number}}
\\n
{{t jobs.finished_at}}
\\n
{{formatTime job.finishedAt}}
\\n
{{t jobs.duration}}
\\n
{{formatDuration job.duration}}
\\n
\\n\\n
\\n
{{t jobs.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compareUrl}}\\n
{{t jobs.compare}}
\\n
{{pathFrom commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t jobs.author}}
\\n
{{commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t jobs.committer}}
\\n
{{commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t jobs.message}}
\\n
{{formatMessage commit.message}}
\\n
{{t jobs.config}}
\\n
{{formatConfig job.config}}
\\n
\\n\\n {{view Travis.LogView contextBinding=\\\"job\\\"}}}\\n
\\n {{else}}\\n
\\n Loading\\n
\\n {{/if}}\\n{{/with}}\\n\");Ember.TEMPLATES['layouts/home']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\\n
\\n {{outlet right}}\\n
\\n
\\n\");Ember.TEMPLATES['layouts/profile']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\\n
\\n
\\n
 \\n
\\n\\n
\\n

Getting started?

\\n

\\n Please read our guide.\\n It will only take a few minutes :)\\n

\\n

\\n You can find detailled docs on our about site.\\n

\\n

\\n If you need help please don't hesitate to join\\n #travis on irc.freenode.net\\n or our mailinglist.\\n

\\n
\\n
\\n
\\n\");Ember.TEMPLATES['layouts/sidebar']=Ember.Handlebars.compile(\"\\n {{t layouts.application.fork_me}}\\n\\n\\n
\\n
 \\n
\\n\\n{{outlet decks}}\\n{{outlet workers}}\\n{{outlet queues}}\\n{{outlet links}}\\n\\n
\\n

{{t layouts.about.join}}

\\n \\n
\\n\");Ember.TEMPLATES['layouts/simple']=Ember.Handlebars.compile(\"
\\n {{outlet top}}\\n
\\n\\n
\\n
\\n {{outlet main}}\\n
\\n
\\n\\n\");Ember.TEMPLATES['layouts/top']=Ember.Handlebars.compile(\"\\n

Travis

\\n
\\n\\n\\n\");Ember.TEMPLATES['profile/accounts']=Ember.Handlebars.compile(\"
\\n
\\n\\n\\n\\n
\\n {{#collection Travis.AccountsListView contentBinding=\\\"controller\\\"}}\\n {{view.name}}\\n

\\n Repositories:\\n {{view.content.reposCount}}\\n

\\n {{/collection}}\\n
\\n\");Ember.TEMPLATES['profile/show']=Ember.Handlebars.compile(\"

{{view.name}}

\\n\\n{{view Travis.ProfileTabsView}}\\n\\n
\\n {{outlet pane}}\\n
\\n\\n\\n\");Ember.TEMPLATES['profile/tabs']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['profile/tabs/hooks']=Ember.Handlebars.compile(\"

\\n {{{t profiles.show.message.your_repos}}}\\n

\\n\\n{{#if hooks.isLoaded}}\\n {{#if user.isSyncing}}\\n

\\n Please wait while we sync from GitHub\\n

\\n {{else}}\\n

\\n Last synchronized from GitHub: {{formatTime user.syncedAt}}\\n \\n

\\n\\n \\n {{/if}}\\n{{else}}\\n

\\n Loading\\n

\\n{{/if}}\\n\\n\\n\");Ember.TEMPLATES['profile/tabs/user']=Ember.Handlebars.compile(\"\\n\\n
\\n
\\n {{t profiles.show.github}}:\\n
\\n
\\n {{user.login}}\\n
\\n
\\n {{t profiles.show.email}}:\\n
\\n
\\n {{user.email}}\\n
\\n
\\n {{t profiles.show.token}}:\\n
\\n
\\n {{user.token}}\\n
\\n
\\n\\n\\n {{view Ember.Select\\n contentBinding=\\\"view.locales\\\"\\n selectionBinding=\\\"user.locale\\\"\\n optionLabelPath=\\\"content.name\\\"\\n optionValuePath=\\\"content.key\\\"}}\\n\\n \\n
\\n\\n\\n\");Ember.TEMPLATES['queues/list']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['repos/list']=Ember.Handlebars.compile(\"
\\n {{view Ember.TextField valueBinding=\\\"controller.search\\\"}}\\n
\\n\\n{{view Travis.ReposListTabsView}}\\n\\n\\n\\n
\\n {{#collection Travis.RepositoriesListView contentBinding=\\\"controller\\\"}}\\n {{#with view.repository}}\\n
\\n \\n {{slug}}\\n
\\n {{lastBuildNumber}}\\n\\n

\\n {{t repositories.duration}}:\\n {{formatDuration lastBuildDuration}},\\n {{t repositories.finished_at}}:\\n {{formatTime lastBuildFinishedAt}}\\n

\\n\\n
\\n\\n {{#if description}}\\n
\\n

{{description}}

\\n
\\n {{/if}}\\n {{/with}}\\n {{/collection}}\\n
\\n\");Ember.TEMPLATES['repos/list/tabs']=Ember.Handlebars.compile(\"\\n\\n\");Ember.TEMPLATES['repos/show']=Ember.Handlebars.compile(\"
\\n {{#if view.repository.isLoaded}}\\n {{#with view.repository}}\\n

\\n {{slug}}\\n

\\n\\n

{{description}}

\\n\\n \\n\\n {{view Travis.RepoShowTabsView}}\\n {{view Travis.RepoShowToolsView}}\\n {{/with}}\\n\\n {{else}}\\n Loading\\n {{/if}}\\n\\n
\\n {{outlet pane}}\\n
\\n
\\n\\n\");Ember.TEMPLATES['repos/show/tabs']=Ember.Handlebars.compile(\"\\n\");Ember.TEMPLATES['repos/show/tools']=Ember.Handlebars.compile(\"
\\n \\n
\\n

\\n \\n {{#if view.branches.isLoaded}}\\n {{view Ember.Select contentBinding=\\\"view.branches\\\" selectionBinding=\\\"view.branch\\\" optionLabelPath=\\\"content.commit.branch\\\" optionValuePath=\\\"content.commit.branch\\\"}}\\n {{else}}\\n \\n {{/if}}\\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n

\\n \\n \\n

\\n
\\n
\\n\");Ember.TEMPLATES['sponsors/decks']=Ember.Handlebars.compile(\"

{{t layouts.application.sponsers}}

\\n\\n\\n\\n

\\n \\n {{{t layouts.application.sponsors_link}}}\\n \\n

\\n\");Ember.TEMPLATES['sponsors/links']=Ember.Handlebars.compile(\"
\\n

{{t layouts.application.sponsers}}

\\n\\n \\n\\n

\\n \\n {{{t layouts.application.sponsors_link}}}\\n \\n

\\n
\\n\\n\");Ember.TEMPLATES['stats/show']=Ember.Handlebars.compile(\"
\\n
\\n\");Ember.TEMPLATES['workers/list']=Ember.Handlebars.compile(\"{{#view Travis.WorkersView}}\\n

\\n {{t workers}}\\n \\n

\\n \\n{{/view}}\\n\");\n})();\n//@ sourceURL=templates");minispade.register('app', "(function() {(function() {\nminispade.require('travis');\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 currentUserBinding: 'auth.user',\n accessTokenBinding: 'auth.user.accessToken',\n authStateBinding: 'auth.state',\n init: function() {\n this._super();\n this.connect();\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n store: this.store,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.routes = new Travis.Routes();\n this.pusher = new Travis.Pusher();\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.routes.route('');\n },\n render: function(name, action, params) {\n var layout;\n layout = this.connectLayout(name);\n layout.activate(action, params || {});\n return $('body').attr('id', name);\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n connectLayout: function(name) {\n var viewClass;\n if (this.get('layout.name') !== name) {\n name = $.camelize(name);\n viewClass = Travis[\"\" + name + \"Layout\"];\n this.layout = Travis[\"\" + name + \"Controller\"].create({\n parent: this.controller\n });\n this.controller.connectOutlet({\n outletName: 'layout',\n controller: this.layout,\n viewClass: viewClass\n });\n }\n return this.layout;\n },\n connect: function() {\n var view;\n this.controller = Em.Controller.create();\n view = Em.View.create({\n template: Em.Handlebars.compile('{{outlet layout}}'),\n controller: this.controller\n });\n return view.appendTo(this.get('rootElement') || 'body');\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: $('