diff --git a/AssetFile b/AssetFile index 2112d8b4..5c2434d8 100644 --- a/AssetFile +++ b/AssetFile @@ -20,6 +20,7 @@ input 'assets/javascripts' do vendor/i18n.js vendor/facebox.js vendor/pusher.js + vendor/jquery.cookie.js vendor/jquery.timeago.js vendor/sc-routes.js ) diff --git a/Rakefile b/Rakefile index f09004bd..c0138d22 100644 --- a/Rakefile +++ b/Rakefile @@ -9,6 +9,7 @@ namespace :ember do system 'git clone https://github.com/emberjs/ember.js.git tmp/ember.js' end + system 'cd tmp/ember.js; bundle update' system 'cd tmp/ember.js; rake dist' system 'cp tmp/ember.js/dist/ember.js assets/javascripts/vendor/ember.js' end diff --git a/assets/images/icons/group.png b/assets/images/icons/group.png new file mode 100644 index 00000000..1572a32e Binary files /dev/null and b/assets/images/icons/group.png differ diff --git a/assets/images/icons/group.small.png b/assets/images/icons/group.small.png new file mode 100644 index 00000000..056e99b2 Binary files /dev/null and b/assets/images/icons/group.small.png differ diff --git a/assets/images/icons/link.png b/assets/images/icons/link.png new file mode 100644 index 00000000..59def874 Binary files /dev/null and b/assets/images/icons/link.png differ diff --git a/assets/images/icons/link.small.png b/assets/images/icons/link.small.png new file mode 100644 index 00000000..10dd6fed Binary files /dev/null and b/assets/images/icons/link.small.png differ diff --git a/assets/images/icons/org.small.png b/assets/images/icons/org.small.png new file mode 100644 index 00000000..b5afd5fa Binary files /dev/null and b/assets/images/icons/org.small.png differ diff --git a/assets/images/icons/user.png b/assets/images/icons/user.png new file mode 100644 index 00000000..eb9d8265 Binary files /dev/null and b/assets/images/icons/user.png differ diff --git a/assets/images/icons/user.small.png b/assets/images/icons/user.small.png new file mode 100644 index 00000000..a414e485 Binary files /dev/null and b/assets/images/icons/user.small.png differ diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee index e13f9f10..7d947df4 100644 --- a/assets/javascripts/app/app.coffee +++ b/assets/javascripts/app/app.coffee @@ -28,12 +28,26 @@ Travis.reopen @routes = new Travis.Routes() @pusher = new Travis.Pusher() - connect: -> - @controller = Em.Controller.create() - view = Em.View.create - template: Em.Handlebars.compile('{{outlet layout}}') - controller: @controller - view.appendTo(@get('rootElement') || 'body') + @setCurrentUser(JSON.parse($.cookie('user'))) + + signIn: -> + # Travis.Auth.signIn() + @setCurrentUser({ id: 1, login: 'svenfuchs', name: 'Sven Fuchs', email: 'me@svenfuchs.com', token: '1234567890', gravatar: '402602a60e500e85f2f5dc1ff3648ecb', locale: 'en' }) + @render.apply(this, @get('returnTo') || ['home', 'index']) + + signOut: -> + @setCurrentUser() + + setCurrentUser: (user) -> + user = JSON.parse(user) if typeof user == 'string' + $.cookie('user', JSON.stringify(user)) + @store.load(Travis.User, user) if user + @set('currentUser', if user then Travis.User.find(user.id) else undefined) + + render: (name, action, params) -> + layout = @connectLayout(name) + layout.activate(action, params || {}) + $('body').attr('id', name) receive: -> @store.receive.apply(@store, arguments) @@ -46,4 +60,20 @@ Travis.reopen @controller.connectOutlet(outletName: 'layout', controller: @layout, viewClass: viewClass) @layout + connect: -> + @controller = Em.Controller.create() + view = Em.View.create + template: Em.Handlebars.compile('{{outlet layout}}') + controller: @controller + view.appendTo(@get('rootElement') || 'body') + + toggleSidebar: -> + $('body').toggleClass('maximized') + # TODO gotta force redraws here :/ + element = $('') + $('#top .profile').append(element) + Em.run.later (-> element.remove()), 10 + element = $('') + $('#repository').append(element) + Em.run.later (-> element.remove()), 10 diff --git a/assets/javascripts/app/controllers.coffee b/assets/javascripts/app/controllers.coffee index 79f7ad69..2da93b6c 100644 --- a/assets/javascripts/app/controllers.coffee +++ b/assets/javascripts/app/controllers.coffee @@ -27,10 +27,12 @@ Travis.reopen view TopController: Em.Controller.extend - userBinding: 'Travis.currentUser' + userBinding: 'Travis.app.currentUser' +require 'controllers/auth' require 'controllers/builds' require 'controllers/home' +require 'controllers/owners' require 'controllers/profile' require 'controllers/repositories' require 'controllers/repository' diff --git a/assets/javascripts/app/controllers/auth.coffee b/assets/javascripts/app/controllers/auth.coffee new file mode 100644 index 00000000..11f2f78b --- /dev/null +++ b/assets/javascripts/app/controllers/auth.coffee @@ -0,0 +1,14 @@ +require 'controllers' + +@Travis.AuthController = Travis.Controller.extend + name: 'auth' + + init: -> + @_super('top') + @connectTop() + @connectOutlet(outletName: 'main', controller: this, viewClass: Travis.AuthView) + + activate: (action, params) -> + # noop + + diff --git a/assets/javascripts/app/controllers/owners.coffee b/assets/javascripts/app/controllers/owners.coffee new file mode 100644 index 00000000..5a11cfe1 --- /dev/null +++ b/assets/javascripts/app/controllers/owners.coffee @@ -0,0 +1,12 @@ +Travis.OwnersController = Ember.ArrayController.extend + defaultTab: 'accounts' + + init: -> + @activate(@defaultTab) + + activate: (tab, params) -> + @set('tab', tab) + this["view#{$.camelize(tab)}"](params) + + viewAccounts: -> + @set('content', Travis.Owner.find()) diff --git a/assets/javascripts/app/controllers/profile.coffee b/assets/javascripts/app/controllers/profile.coffee index e7caaedd..ca3c0395 100644 --- a/assets/javascripts/app/controllers/profile.coffee +++ b/assets/javascripts/app/controllers/profile.coffee @@ -1,24 +1,37 @@ -Travis.reopen - ProfileController: Travis.Controller.extend - name: 'profile' +Travis.ProfileController = Travis.Controller.extend + name: 'profile' + userBinding: 'Travis.app.currentUser' - init: -> - @_super('top', 'user', 'hooks') + init: -> + @_super('top', 'owners') + @connectTop() + @connectOutlet outletName: 'left', controller: @ownersController, viewClass: Travis.OwnersView + @connectOutlet(outletName: 'main', controller: this, viewClass: Travis.ProfileView) + @owners = @ownersController.get('content') - connect: (parent) -> - @_super(parent) - @connectTop() + owner: (-> + login = @get('params.login') || Travis.app.get('currentUser.login') + @owners.toArray().filter((owner) -> owner if owner.get('login') == login)[0] + ).property('owners.length', 'params.login') - viewShow: (params) -> - @connectUser(@currentUser) - @connectHooks(Travis.Hook.find()) + activate: (action, params) -> + @setParams(params || @get('params')) + this["view#{$.camelize(action)}"]() - connectUser: (user) -> - @profileController.connectOutlet(outletName: 'main', name: 'user', context: user) + viewHooks: -> + @connectTab('hooks') + @set('hooks', Travis.Hook.find(login: @get('params.login') || Travis.app.get('currentUser.login'))) - connectHooks: (hooks) -> - @userController.connectOutlet(outletName: 'hooks', name: 'hooks', context: hooks) if hooks + viewUser: -> + @connectTab('user') + + connectTab: (tab) -> + viewClass = Travis["#{$.camelize(tab)}View"] + @set('tab', tab) + @connectOutlet(outletName: 'pane', controller: this, viewClass: viewClass) + + setParams: (params) -> + @set('params', {}) + @set("params.#{key}", params[key]) for key, value of params - UserController: Em.Controller.extend() - HooksController: Em.ArrayController.extend() diff --git a/assets/javascripts/app/helpers/urls.coffee b/assets/javascripts/app/helpers/urls.coffee index e5edada9..699c1993 100644 --- a/assets/javascripts/app/helpers/urls.coffee +++ b/assets/javascripts/app/helpers/urls.coffee @@ -37,3 +37,7 @@ email: (email) -> "mailto:#{email}" + + owner: (login) -> + "/profile/#{login}" + diff --git a/assets/javascripts/app/models.coffee b/assets/javascripts/app/models.coffee index b4a4184f..80b40a02 100644 --- a/assets/javascripts/app/models.coffee +++ b/assets/javascripts/app/models.coffee @@ -5,6 +5,7 @@ require 'models/build' require 'models/commit' require 'models/hook' require 'models/job' +require 'models/owner' require 'models/repository' require 'models/sponsor' require 'models/user' diff --git a/assets/javascripts/app/models/hook.coffee b/assets/javascripts/app/models/hook.coffee index 44f06323..efffebe2 100644 --- a/assets/javascripts/app/models/hook.coffee +++ b/assets/javascripts/app/models/hook.coffee @@ -1,7 +1,6 @@ require 'travis/model' @Travis.Hook = Travis.Model.extend - primaryKey: 'slug' slug: DS.attr('string') description: DS.attr('string') active: DS.attr('boolean') @@ -11,7 +10,7 @@ require 'travis/model' ).property('slug') name: (-> - @get('slug').split('/')[1] + @get('slug').split('/')[1] if @get('isLoaded') ).property('slug') urlGithub: (-> @@ -25,8 +24,3 @@ require 'travis/model' toggle: -> @set 'active', !@get('active') Travis.app.store.commit() - -@Travis.Hook.reopenClass - url: 'profile/hooks' - - diff --git a/assets/javascripts/app/models/owner.coffee b/assets/javascripts/app/models/owner.coffee new file mode 100644 index 00000000..282b01c0 --- /dev/null +++ b/assets/javascripts/app/models/owner.coffee @@ -0,0 +1,13 @@ +require 'travis/model' + +@Travis.Owner = Travis.Model.extend + primaryKey: 'login' + login: DS.attr('string') + name: DS.attr('string') + type: DS.attr('string') + reposCount: DS.attr('number') + + urlGithub: (-> + "http://github.com/#{@get('login')}" + ).property() + diff --git a/assets/javascripts/app/models/user.coffee b/assets/javascripts/app/models/user.coffee index ebcd12af..3164b229 100644 --- a/assets/javascripts/app/models/user.coffee +++ b/assets/javascripts/app/models/user.coffee @@ -5,8 +5,13 @@ require 'travis/model' email: DS.attr('string') login: DS.attr('string') token: DS.attr('string') + locale: DS.attr('string') gravatar: DS.attr('string') urlGithub: (-> "http://github.com/#{@get('login')}" ).property() + + updateLocale: (locale) -> + @set('locale', locale) + Travis.app.store.commit() diff --git a/assets/javascripts/app/routes.coffee b/assets/javascripts/app/routes.coffee index b5760b6e..15af1b66 100644 --- a/assets/javascripts/app/routes.coffee +++ b/assets/javascripts/app/routes.coffee @@ -18,14 +18,22 @@ $.extend Travis.Routes.prototype, Em.routes.set('location', event.target.href.replace("#{@base_uri}/", '')) action: (name, action, params) -> - @render(name, action, params) if @before(name, action, params) - - render: (name, action, params) -> - console.log [name, action, params] # this needs to be a global reference because Em.routes is global - layout = Travis.app.connectLayout(name) - layout.activate(action, params || {}) - $('body').attr('id', name) + Travis.app.render(name, action, params) if @before(name, action, params) before: (name, action, params) -> - true + if @requiresAuth(name, action, params) + true + else + @requireAuth(name, action, params) + + signedIn: -> + !!Travis.app.get('currentUser') + + requiresAuth: (name, action, params) -> + name != 'profile' || @signedIn() + + requireAuth: (name, action, params) -> + Travis.app.set('returnTo', [name, action, params]) + Travis.app.render('auth', 'show') + false diff --git a/assets/javascripts/app/store/rest_adapter.coffee b/assets/javascripts/app/store/rest_adapter.coffee index ac82cd24..c7f4ee51 100644 --- a/assets/javascripts/app/store/rest_adapter.coffee +++ b/assets/javascripts/app/store/rest_adapter.coffee @@ -16,6 +16,8 @@ jQuery.support.cors = true commit: Travis.Commit jobs: Travis.Job job: Travis.Job + owner: Travis.Owner + owners: Travis.Owner worker: Travis.Worker workers: Travis.Worker diff --git a/assets/javascripts/app/templates/auth/show.hbs b/assets/javascripts/app/templates/auth/show.hbs new file mode 100644 index 00000000..0c82746b --- /dev/null +++ b/assets/javascripts/app/templates/auth/show.hbs @@ -0,0 +1,8 @@ +

Sign in

+ +

+ + Sign in with GitHub + +

+ diff --git a/assets/javascripts/app/templates/layouts/profile.hbs b/assets/javascripts/app/templates/layouts/profile.hbs new file mode 100644 index 00000000..2a0c303e --- /dev/null +++ b/assets/javascripts/app/templates/layouts/profile.hbs @@ -0,0 +1,34 @@ +
+ {{outlet top}} +
+ +
+ {{outlet left}} +
+ +
+ {{outlet main}} + + +
+ diff --git a/assets/javascripts/app/templates/layouts/sidebar.hbs b/assets/javascripts/app/templates/layouts/sidebar.hbs index a7e9449e..9a631602 100644 --- a/assets/javascripts/app/templates/layouts/sidebar.hbs +++ b/assets/javascripts/app/templates/layouts/sidebar.hbs @@ -2,7 +2,7 @@ {{t layouts.application.fork_me}} -
+
 
diff --git a/assets/javascripts/app/templates/layouts/top.hbs b/assets/javascripts/app/templates/layouts/top.hbs index 0d17dc7c..d0423802 100644 --- a/assets/javascripts/app/templates/layouts/top.hbs +++ b/assets/javascripts/app/templates/layouts/top.hbs @@ -16,23 +16,23 @@ Docs {{#if user}} -
  • - +
  • + {{user.name}}
  • {{else}}
  • - {{t layouts.top.github_login}} + {{t layouts.top.github_login}}
  • {{/if}} diff --git a/assets/javascripts/app/templates/profile/hooks.hbs b/assets/javascripts/app/templates/profile/hooks.hbs deleted file mode 100644 index 4c565684..00000000 --- a/assets/javascripts/app/templates/profile/hooks.hbs +++ /dev/null @@ -1,18 +0,0 @@ -{{#if content.length}} - -{{else}} -

    Please wait while we sync with GitHub

    -{{/if}} - diff --git a/assets/javascripts/app/templates/profile/owners.hbs b/assets/javascripts/app/templates/profile/owners.hbs new file mode 100644 index 00000000..e1a46a63 --- /dev/null +++ b/assets/javascripts/app/templates/profile/owners.hbs @@ -0,0 +1,18 @@ + + + + +
    + {{#collection Travis.OwnersListView contentBinding="controller"}} + {{view.name}} +

    + Repositories: + {{view.content.reposCount}} +

    + {{/collection}} +
    diff --git a/assets/javascripts/app/templates/profile/show.hbs b/assets/javascripts/app/templates/profile/show.hbs index c998e29a..785ccbf8 100644 --- a/assets/javascripts/app/templates/profile/show.hbs +++ b/assets/javascripts/app/templates/profile/show.hbs @@ -1,46 +1,9 @@ -

    {{name}}

    - +

    {{owner.name}}

    -
    -
    - {{t profiles.show.github}}: -
    -
    - {{login}} -
    -
    - {{t profiles.show.email}}: -
    -
    - {{email}} -
    -
    - {{t profiles.show.token}}: -
    -
    - {{token}} -
    -
    +{{view Travis.ProfileTabsView}} -

    - {{{t profiles.show.messages.notice}}} -

    +
    + {{outlet pane}} +
    -

    {{t profiles.show.your_locale}}

    -
    - - -
    -

    {{t profiles.show.your_repos}}

    -

    - {{{t profiles.show.message.your_repos}}} - - {{{t profiles.show.message.config}}} - -

    - -{{outlet hooks}} diff --git a/assets/javascripts/app/templates/profile/tabs.hbs b/assets/javascripts/app/templates/profile/tabs.hbs new file mode 100644 index 00000000..d30f61b5 --- /dev/null +++ b/assets/javascripts/app/templates/profile/tabs.hbs @@ -0,0 +1,10 @@ + diff --git a/assets/javascripts/app/templates/profile/tabs/hooks.hbs b/assets/javascripts/app/templates/profile/tabs/hooks.hbs new file mode 100644 index 00000000..d1819da0 --- /dev/null +++ b/assets/javascripts/app/templates/profile/tabs/hooks.hbs @@ -0,0 +1,23 @@ +

    + {{{t profiles.show.message.your_repos}}} +

    + +{{#if hooks.length}} + +{{else}} +

    Please wait while we sync with GitHub

    +{{/if}} + + diff --git a/assets/javascripts/app/templates/profile/tabs/user.hbs b/assets/javascripts/app/templates/profile/tabs/user.hbs new file mode 100644 index 00000000..5856502f --- /dev/null +++ b/assets/javascripts/app/templates/profile/tabs/user.hbs @@ -0,0 +1,36 @@ + + +
    +
    + {{t profiles.show.github}}: +
    +
    + {{user.login}} +
    +
    + {{t profiles.show.email}}: +
    +
    + {{user.email}} +
    +
    + {{t profiles.show.token}}: +
    +
    + {{user.token}} +
    +
    + +
    + {{view Ember.Select + contentBinding="view.locales" + selectionBinding="user.locale" + optionLabelPath="content.name" + optionValuePath="content.key"}} + + +
    + + diff --git a/assets/javascripts/app/templates/repos/show.hbs b/assets/javascripts/app/templates/repos/show.hbs index fc70f063..91e03cc9 100644 --- a/assets/javascripts/app/templates/repos/show.hbs +++ b/assets/javascripts/app/templates/repos/show.hbs @@ -31,7 +31,6 @@ {{/if}}
    - {{outlet pane}}
    diff --git a/assets/javascripts/app/views.coffee b/assets/javascripts/app/views.coffee index c5e15631..f2fe9a01 100644 --- a/assets/javascripts/app/views.coffee +++ b/assets/javascripts/app/views.coffee @@ -7,8 +7,10 @@ require 'ext/ember/namespace' @Travis.reopen HomeLayout: Travis.View.extend(templateName: 'layouts/home') - ProfileLayout: Travis.View.extend(templateName: 'layouts/simple') + ProfileLayout: Travis.View.extend(templateName: 'layouts/profile') StatsLayout: Travis.View.extend(templateName: 'layouts/simple') + AuthLayout: Travis.View.extend(templateName: 'layouts/simple') + AuthView: Travis.View.extend(templateName: 'auth/show') require 'views/build' require 'views/job' diff --git a/assets/javascripts/app/views/profile.coffee b/assets/javascripts/app/views/profile.coffee index 4adafe6c..df51c115 100644 --- a/assets/javascripts/app/views/profile.coffee +++ b/assets/javascripts/app/views/profile.coffee @@ -1,17 +1,87 @@ @Travis.reopen - UserView: Travis.View.extend + OwnersView: Travis.View.extend + tabBinding: 'controller.tab' + templateName: 'profile/owners' + classAccounts: (-> + 'active' if @get('tab') == 'accounts' + ).property('tab') + + OwnersListView: Em.CollectionView.extend + elementId: 'owners' + ownerBinding: 'content' + tagName: 'ul' + + emptyView: Ember.View.extend + template: Ember.Handlebars.compile('
    Loading
    ') + + itemViewClass: Travis.View.extend + ownerBinding: 'content' + typeBinding: 'content.type' + selectedBinding: 'owner.selected' + + classNames: ['owner'] + classNameBindings: ['type', 'selected'] + + name: (-> + @get('content.name') || @get('content.login') + ).property('content.login', 'content.name') + + urlOwner: (-> + Travis.Urls.owner(@get('owner.login')) + ).property('owner.login') + + ProfileView: Travis.View.extend templateName: 'profile/show' + ProfileTabsView: Travis.View.extend + templateName: 'profile/tabs' + tabBinding: 'controller.tab' + + activate: (event) -> + @get('controller').activate(event.target.name) + + classHooks: (-> + 'active' if @get('tab') == 'hooks' + ).property('tab') + + classUser: (-> + 'active' if @get('tab') == 'user' + ).property('tab') + + displayUser: (-> + @get('controller.owner.login') == @get('controller.user.login') + ).property('controller.owner.login', 'controller.user.login') + + HooksView: Travis.View.extend + templateName: 'profile/tabs/hooks' + + urlGithubAdmin: (-> + Travis.Urls.githubAdmin(@get('hook.slug')) + ).property('hook.slug') + + UserView: Travis.View.extend + templateName: 'profile/tabs/user' userBinding: 'controller.user' gravatarUrl: (-> "http://www.gravatar.com/avatar/#{@get('user.gravatar')}?s=48&d=mm" ).property('user.gravatar') - HooksView: Travis.View.extend - templateName: 'profile/hooks' - - urlGithubAdmin: (-> - Travis.Urls.githubAdmin(@get('hook.slug')) - ).property('hook.slug') + locales: (-> + [ + { key: 'en', name: 'English' } + { key: 'ca', name: 'Catalan' } + { key: 'cs', name: 'Čeština' } + { key: 'es', name: 'Español' } + { key: 'fr', name: 'Français' } + { key: 'ja', name: '日本語' } + { key: 'nl', name: 'Nederlands' } + { key: 'nb', name: 'Norsk Bokmål' } + { key: 'pl', name: 'Polski' } + { key: 'pt-BR': name: 'Português brasileiro' } + { key: 'ru', name: 'Русский' } + ] + ).property() + saveLocale: (event) -> + @get('user').updateLocale($('#locale').val()) diff --git a/assets/javascripts/app/views/repo.coffee b/assets/javascripts/app/views/repo.coffee index 6379d5c1..d4e7a7b6 100644 --- a/assets/javascripts/app/views/repo.coffee +++ b/assets/javascripts/app/views/repo.coffee @@ -1,7 +1,2 @@ -require 'views/repo/repos' - require 'views/repo/list' -require 'views/repo/list/tabs' require 'views/repo/show' -require 'views/repo/show/tabs' - diff --git a/assets/javascripts/app/views/repo/list.coffee b/assets/javascripts/app/views/repo/list.coffee index dbe980b9..b40ed57b 100644 --- a/assets/javascripts/app/views/repo/list.coffee +++ b/assets/javascripts/app/views/repo/list.coffee @@ -1,4 +1,7 @@ @Travis.reopen + RepositoriesView: Travis.View.extend + templateName: 'repos/list' + RepositoriesListView: Em.CollectionView.extend elementId: 'repositories' repositoryBinding: 'content' @@ -24,3 +27,25 @@ urlLastBuild: (-> Travis.Urls.build(@get('repository.slug'), @get('repository.lastBuildId')) ).property('repository.slug', 'repository.lastBuildId') + + ReposListTabsView: Travis.View.extend + templateName: 'repos/list/tabs' + tabBinding: 'controller.tab' + + activate: (event) -> + @get('controller').activate(event.target.name) + + classRecent: (-> + 'active' if @get('tab') == 'recent' + ).property('tab') + + classOwned: (-> + classes = [] + classes.push('active') if @get('tab') == 'owned' + classes.push('display') if Em.get('Travis.currentUser') + classes.join(' ') + ).property('tab', 'Travis.currentUser') + + classSearch: (-> + 'active' if @get('tab') == 'search' + ).property('tab') diff --git a/assets/javascripts/app/views/repo/list/tabs.coffee b/assets/javascripts/app/views/repo/list/tabs.coffee deleted file mode 100644 index d19cbbb9..00000000 --- a/assets/javascripts/app/views/repo/list/tabs.coffee +++ /dev/null @@ -1,24 +0,0 @@ -@Travis.reopen - ReposListTabsView: Travis.View.extend - templateName: 'repos/list/tabs' - tabBinding: 'controller.tab' - - activate: (event) -> - @get('controller').activate(event.target.name) - - classRecent: (-> - 'active' if @get('tab') == 'recent' - ).property('tab') - - classOwned: (-> - classes = [] - classes.push('active') if @get('tab') == 'owned' - classes.push('display') if Em.get('Travis.currentUser') - classes.join(' ') - ).property('tab', 'Travis.currentUser') - - classSearch: (-> - 'active' if @get('tab') == 'search' - ).property('tab') - - diff --git a/assets/javascripts/app/views/repo/repos.coffee b/assets/javascripts/app/views/repo/repos.coffee deleted file mode 100644 index d4bb2003..00000000 --- a/assets/javascripts/app/views/repo/repos.coffee +++ /dev/null @@ -1,3 +0,0 @@ -@Travis.reopen - RepositoriesView: Travis.View.extend - templateName: 'repos/list' diff --git a/assets/javascripts/app/views/repo/show.coffee b/assets/javascripts/app/views/repo/show.coffee index 5727c453..4b89373c 100644 --- a/assets/javascripts/app/views/repo/show.coffee +++ b/assets/javascripts/app/views/repo/show.coffee @@ -1,5 +1,3 @@ -require 'views/repo/show/tabs' - @Travis.reopen RepositoryView: Travis.View.extend templateName: 'repos/show' @@ -21,3 +19,84 @@ require 'views/repo/show/tabs' urlGithubNetwork: (-> Travis.Urls.githubNetwork(@get('repository.slug')) ).property('repository.slug'), + + RepoShowTabsView: Travis.View.extend + templateName: 'repos/show/tabs' + + repositoryBinding: 'controller.repository' + buildBinding: 'controller.build' + jobBinding: 'controller.job' + tabBinding: 'controller.tab' + + toggleTools: -> + $('#tools .pane').toggle() + + # hrm. how to parametrize bindAttr? + classCurrent: (-> + 'active' if @get('tab') == 'current' + ).property('tab') + + classBuilds: (-> + 'active' if @get('tab') == 'builds' + ).property('tab') + + classPullRequests: (-> + 'active' if @get('tab') == 'pull_requests' + ).property('tab') + + classBranches: (-> + 'active' if @get('tab') == 'branches' + ).property('tab') + + classBuild: (-> + tab = @get('tab') + classes = [] + classes.push('active') if tab == 'build' + classes.push('display') if tab == 'build' || tab == 'job' + classes.join(' ') + ).property('tab') + + classJob: (-> + 'active display' if @get('tab') == 'job' + ).property('tab') + + urlRepository: (-> + Travis.Urls.repository(@get('repository.slug')) + ).property('repository.slug') + + urlBuilds: (-> + Travis.Urls.builds(@get('repository.slug')) + ).property('repository.slug') + + urlPullRequests: (-> + Travis.Urls.pullRequests(@get('repository.slug')) + ).property('repository.slug') + + urlBranches: (-> + Travis.Urls.branches(@get('repository.slug')) + ).property('repository.slug') + + urlBuild: (-> + Travis.Urls.build(@get('repository.slug'), @get('build.id')) + ).property('repository.slug', 'build.id') + + urlJob: (-> + Travis.Urls.job(@get('repository.slug'), @get('job.id')) + ).property('repository.slug', 'job.id') + + urlStatusImage: (-> + Travis.Urls.statusImage(@get('repository.slug'), @get('branch.commit.branch')) + ).property('repository.slug', 'branch') + + markdownStatusImage: (-> + "[![Build Status](#{@get('urlStatusImage')})](#{@get('urlRepository')})" + ).property('urlStatusImage') + + textileStatusImage: (-> + "!#{@get('urlStatusImage')}!:#{@get('urlRepository')}" + ).property('urlStatusImage') + + rdocStatusImage: (-> + "{\"Build}[#{@get('urlRepository')}]" + ).property('urlStatusImage') + diff --git a/assets/javascripts/app/views/repo/show/tabs.coffee b/assets/javascripts/app/views/repo/show/tabs.coffee deleted file mode 100644 index f1b3d44a..00000000 --- a/assets/javascripts/app/views/repo/show/tabs.coffee +++ /dev/null @@ -1,81 +0,0 @@ -@Travis.reopen - RepoShowTabsView: Travis.View.extend - templateName: 'repos/show/tabs' - - repositoryBinding: 'controller.repository' - buildBinding: 'controller.build' - jobBinding: 'controller.job' - tabBinding: 'controller.tab' - - toggleTools: -> - $('#tools .pane').toggle() - - # hrm. how to parametrize bindAttr? - classCurrent: (-> - 'active' if @get('tab') == 'current' - ).property('tab') - - classBuilds: (-> - 'active' if @get('tab') == 'builds' - ).property('tab') - - classPullRequests: (-> - 'active' if @get('tab') == 'pull_requests' - ).property('tab') - - classBranches: (-> - 'active' if @get('tab') == 'branches' - ).property('tab') - - classBuild: (-> - tab = @get('tab') - classes = [] - classes.push('active') if tab == 'build' - classes.push('display') if tab == 'build' || tab == 'job' - classes.join(' ') - ).property('tab') - - classJob: (-> - 'active display' if @get('tab') == 'job' - ).property('tab') - - urlRepository: (-> - Travis.Urls.repository(@get('repository.slug')) - ).property('repository.slug') - - urlBuilds: (-> - Travis.Urls.builds(@get('repository.slug')) - ).property('repository.slug') - - urlPullRequests: (-> - Travis.Urls.pullRequests(@get('repository.slug')) - ).property('repository.slug') - - urlBranches: (-> - Travis.Urls.branches(@get('repository.slug')) - ).property('repository.slug') - - urlBuild: (-> - Travis.Urls.build(@get('repository.slug'), @get('build.id')) - ).property('repository.slug', 'build.id') - - urlJob: (-> - Travis.Urls.job(@get('repository.slug'), @get('job.id')) - ).property('repository.slug', 'job.id') - - urlStatusImage: (-> - Travis.Urls.statusImage(@get('repository.slug'), @get('branch.commit.branch')) - ).property('repository.slug', 'branch') - - markdownStatusImage: (-> - "[![Build Status](#{@get('urlStatusImage')})](#{@get('urlRepository')})" - ).property('urlStatusImage') - - textileStatusImage: (-> - "!#{@get('urlStatusImage')}!:#{@get('urlRepository')}" - ).property('urlStatusImage') - - rdocStatusImage: (-> - "{\"Build}[#{@get('urlRepository')}]" - ).property('urlStatusImage') - diff --git a/assets/javascripts/app/views/sidebar.coffee b/assets/javascripts/app/views/sidebar.coffee index f3528fb6..9bcaacf2 100644 --- a/assets/javascripts/app/views/sidebar.coffee +++ b/assets/javascripts/app/views/sidebar.coffee @@ -2,12 +2,6 @@ SidebarView: Travis.View.extend templateName: 'layouts/sidebar' - toggleSidebar: -> - $('body').toggleClass('maximized') - element = $('') # TODO gotta force redraw here :/ - $('#repository').append(element) - Em.run.later (-> element.remove()), 10 - WorkersView: Travis.View.extend toggle: (event) -> $(event.target).closest('li').toggleClass('open') diff --git a/assets/javascripts/app/views/top.coffee b/assets/javascripts/app/views/top.coffee index 510aaa1c..a995f51f 100644 --- a/assets/javascripts/app/views/top.coffee +++ b/assets/javascripts/app/views/top.coffee @@ -7,10 +7,6 @@ require 'travis/auth' tabBinding: 'controller.tab' userBinding: 'controller.user' - # currentUser: (-> - # Travis.app.currentUser - # ).property('Travis.app.currentUser') - gravatarUrl: (-> "http://www.gravatar.com/avatar/#{@get('user.gravatar')}?s=24&d=mm" ).property('user.gravatar') @@ -34,6 +30,3 @@ require 'travis/auth' hideProfile: -> $('#top .profile ul').hide() - signIn: -> - Travis.Auth.signIn() - diff --git a/assets/javascripts/config/locales.js b/assets/javascripts/config/locales.js index d630196e..dfce4e36 100644 --- a/assets/javascripts/config/locales.js +++ b/assets/javascripts/config/locales.js @@ -1,2 +1,2 @@ -window.I18n.translations = {"ca":{"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","pt-BR":"português brasileiro","ru":"Русский"}},"en":{"errors":{"messages":{"not_found":"not found","already_confirmed":"was already confirmed","not_locked":"was not locked"}},"devise":{"failure":{"unauthenticated":"You need to sign in or sign up before continuing.","unconfirmed":"You have to confirm your account before continuing.","locked":"Your account is locked.","invalid":"Invalid email or password.","invalid_token":"Invalid authentication token.","timeout":"Your session expired, please sign in again to continue.","inactive":"Your account was not activated yet."},"sessions":{"signed_in":"Signed in successfully.","signed_out":"Signed out successfully."},"passwords":{"send_instructions":"You will receive an email with instructions about how to reset your password in a few minutes.","updated":"Your password was changed successfully. You are now signed in."},"confirmations":{"send_instructions":"You will receive an email with instructions about how to confirm your account in a few minutes.","confirmed":"Your account was successfully confirmed. You are now signed in."},"registrations":{"signed_up":"You have signed up successfully. If enabled, a confirmation was sent to your e-mail.","updated":"You updated your account successfully.","destroyed":"Bye! Your account was successfully cancelled. We hope to see you again soon."},"unlocks":{"send_instructions":"You will receive an email with instructions about how to unlock your account in a few minutes.","unlocked":"Your account was successfully unlocked. You are now signed in."},"mailer":{"confirmation_instructions":{"subject":"Confirmation instructions"},"reset_password_instructions":{"subject":"Reset password instructions"},"unlock_instructions":{"subject":"Unlock Instructions"}}},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hour","other":"%{count} hours"},"minutes_exact":{"one":"%{count} minute","other":"%{count} minutes"},"seconds_exact":{"one":"%{count} second","other":"%{count} seconds"}}},"workers":"Workers","queue":"Queue","no_job":"There are no jobs","repositories":{"branch":"Branch","image_url":"Image URL","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished","tabs":{"current":"Current","build_history":"Build History","branches":"Branch Summary","pull_requests":"Pull Requests","build":"Build","job":"Job"}},"build":{"job":"Job","duration":"Duration","finished_at":"Finished"},"jobs":{"messages":{"sponsored_by":"This test suite was run on a worker box sponsored by"},"build_matrix":"Build Matrix","allowed_failures":"Allowed Failures","author":"Author","config":"Config","compare":"Compare","committer":"Committer","branch":"Branch","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished"},"builds":{"name":"Build","messages":{"sponsored_by":"This test suite was run on a worker box sponsored by"},"build_matrix":"Build Matrix","allowed_failures":"Allowed Failures","author":"Author","config":"Config","compare":"Compare","committer":"Committer","branch":"Branch","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished","show_more":"Show more"},"layouts":{"top":{"home":"Home","blog":"Blog","docs":"Docs","stats":"Stats","github_login":"Sign in with Github","profile":"Profile","sign_out":"Sign Out","admin":"Admin"},"application":{"fork_me":"Fork me on Github","recent":"Recent","search":"Search","sponsers":"Sponsors","sponsors_link":"See all of our amazing sponsors →","my_repositories":"My Repositories"},"about":{"alpha":"This stuff is alpha.","messages":{"alpha":"Please do not consider this a stable service. We're still far from that! More info here."},"join":"Join us and help!","mailing_list":"Mailing List","repository":"Repository","twitter":"Twitter"},"mobile":{"author":"Author","build":"Build","build_matrix":"Build Matrix","commit":"Commit","committer":"Committer","compare":"Compare","config":"Config","duration":"Duration","finished_at":"Finished at","job":"Job","log":"Log"}},"profiles":{"show":{"email":"Email","github":"Github","message":{"your_repos":" Flick the switches below to turn on the Travis service hook for your projects, then push to GitHub.
    \n To test against multiple rubies, see","config":"how to configure custom build options"},"messages":{"notice":"To get started, please read our Getting Started guide.\n It will only take a couple of minutes."},"token":"Token","your_repos":"Your Repositories","update":"Update","update_locale":"Update","your_locale":"Your Locale"}},"statistics":{"index":{"count":"Count","repo_growth":"Repository Growth","total_projects":"Total Projects/Repositories","build_count":"Build Count","last_month":"last month","total_builds":"Total Builds"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"es":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hora","other":"%{count} horas"},"minutes_exact":{"one":"%{count} minuto","other":"%{count} minutos"},"seconds_exact":{"one":"%{count} segundo","other":"%{count} segundos"}}},"workers":"Procesos","queue":"Cola","no_job":"No hay trabajos","repositories":{"branch":"Rama","image_url":"Imagen URL","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado","tabs":{"current":"Actual","build_history":"Histórico","branches":"Ramas","build":"Builds","job":"Trabajo"}},"build":{"job":"Trabajo","duration":"Duración","finished_at":"Finalizado"},"jobs":{"messages":{"sponsored_by":"Esta serie de tests han sido ejecutados en una caja de Proceso patrocinada por"},"build_matrix":"Matriz de Builds","allowed_failures":"Fallos Permitidos","author":"Autor","config":"Configuración","compare":"Comparar","committer":"Committer","branch":"Rama","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado","sponsored_by":"Patrocinado por"},"builds":{"name":"Build","messages":{"sponsored_by":"Esta serie de tests han sido ejecutados en una caja de Proceso patrocinada por"},"build_matrix":"Matriz de Builds","allowed_failures":"Fallos Permitidos","author":"Autor","config":"Configuración","compare":"Comparar","committer":"Committer","branch":"Rama","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado"},"layouts":{"top":{"home":"Inicio","blog":"Blog","docs":"Documentación","stats":"Estadísticas","github_login":"Iniciar sesión con Github","profile":"Perfil","sign_out":"Desconectar","admin":"Admin"},"application":{"fork_me":"Hazme un Fork en Github","recent":"Reciente","search":"Buscar","sponsers":"Patrocinadores","sponsors_link":"Ver todos nuestros patrocinadores →","my_repositories":"Mis Repositorios"},"about":{"alpha":"Esto es alpha.","messages":{"alpha":"Por favor no considereis esto un servicio estable. Estamos estamos aún lejos de ello! Más información aquí."},"join":"Únetenos y ayudanos!","mailing_list":"Lista de Correos","repository":"Repositorio","twitter":"Twitter"}},"profiles":{"show":{"email":"Correo electrónico","github":"Github","message":{"your_repos":" Activa los interruptores para inicial el Travis service hook para tus proyectos, y haz un Push en GitHub.
    \n Para probar varias versiones de ruby, mira","config":"como configurar tus propias opciones para el Build"},"messages":{"notice":"Para comenzar, por favor lee nuestra Guía de Inicio .\n Solo tomará unos pocos minutos."},"token":"Token","your_repos":"Tus repositorios","update":"Actualizar","update_locale":"Actualizar","your_locale":"Tu Idioma"}},"statistics":{"index":{"count":"Número","repo_growth":"Crecimiento de Repositorios","total_projects":"Total de Proyectos/Repositorios","build_count":"Número de Builds","last_month":"mes anterior","total_builds":"Total de Builds"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"fr":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} heure","other":"%{count} heures"},"minutes_exact":{"one":"%{count} minute","other":"%{count} minutes"},"seconds_exact":{"one":"%{count} seconde","other":"%{count} secondes"}}},"workers":"Processus","queue":"File","no_job":"Pas de tâches","repositories":{"branch":"Branche","image_url":"Image","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé","tabs":{"current":"Actuel","build_history":"Historique des tâches","branches":"Résumé des branches","build":"Construction","job":"Tâche"}},"build":{"job":"Tâche","duration":"Durée","finished_at":"Terminé"},"jobs":{"messages":{"sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"build_matrix":"Matrice des versions","allowed_failures":"Échecs autorisés","author":"Auteur","config":"Config","compare":"Comparer","committer":"Committeur","branch":"Branche","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé","sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"builds":{"name":"Version","messages":{"sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"build_matrix":"Matrice des versions","allowed_failures":"Échecs autorisés","author":"Auteur","config":"Config","compare":"Comparer","committer":"Committeur","branch":"Branche","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé"},"layouts":{"top":{"home":"Accueil","blog":"Blog","docs":"Documentation","stats":"Statistiques","github_login":"Connection Github","profile":"Profil","sign_out":"Déconnection","admin":"Admin"},"application":{"fork_me":"Faites un Fork sur Github","recent":"Récent","search":"Chercher","sponsers":"Sponsors","sponsors_link":"Voir tous nos extraordinaire sponsors →","my_repositories":"Mes dépôts"},"about":{"alpha":"Ceci est en alpha.","messages":{"alpha":"S'il vous plaît ne considérez pas ce service comme étant stable. Nous sommes loin de ça! Plus d'infos ici."},"join":"Joignez-vous à nous et aidez-nous!","mailing_list":"Liste de distribution","repository":"Dépôt","twitter":"Twitter"},"mobile":{"author":"Auteur","build":"Version","build_matrix":"Matrice des versions","commit":"Commit","committer":"Committeur","compare":"Comparer","config":"Config","duration":"Durée","finished_at":"Terminé à","job":"Tâche","log":"Journal"}},"profiles":{"show":{"github":"Github","message":{"your_repos":"Utilisez les boutons ci-dessous pour activer Travis sur vos projets puis déployez sur GitHub.
    \nPour tester sur plus de versions de ruby, voir","config":"comment configurer des options de version personnalisées"},"messages":{"notice":"Pour commencer, veuillez lire notre guide de démarrage.\n Cela ne vous prendra que quelques minutes."},"token":"Jeton","your_repos":"Vos dépôts","email":"Courriel","update":"Modifier","update_locale":"Modifier","your_locale":"Votre langue"}},"statistics":{"index":{"count":"Décompte","repo_growth":"Croissance de dépôt","total_projects":"Total des projets/dépôts","build_count":"Décompte des versions","last_month":"mois dernier","total_builds":"Total des versions"}},"admin":{"actions":{"create":"créer","created":"créé","delete":"supprimer","deleted":"supprimé","update":"mise à jour","updated":"mis à jour"},"credentials":{"log_out":"Déconnection"},"delete":{"confirmation":"Oui, je suis sure","flash_confirmation":"%{name} a été détruit avec succès"},"flash":{"error":"%{name} n'a pas pu être %{action}","noaction":"Aucune action n'a été entreprise","successful":"%{name} a réussi à %{action}"},"history":{"name":"Historique","no_activity":"Aucune activité","page_name":"Historique pour %{name}"},"list":{"add_new":"Ajouter un nouveau","delete_action":"Supprimer","delete_selected":"Supprimer la sélection","edit_action":"Modifier","search":"Rechercher","select":"Sélectionner le %{name} à modifier","select_action":"Sélectionner","show_all":"Montrer tout"},"new":{"basic_info":"Information de base","cancel":"Annuler","chosen":"%{name} choisi","chose_all":"Choisir tout","clear_all":"Déselectionner tout","many_chars":"caractères ou moins","one_char":"caractère.","optional":"Optionnel","required":"Requis","save":"Sauvegarder","save_and_add_another":"Sauvegarder et en ajouter un autre","save_and_edit":"Sauvegarder et modifier","select_choice":"Faites vos choix et cliquez"},"dashboard":{"add_new":"Ajouter un nouveau","last_used":"Dernière utilisation","model_name":"Nom du modèle","modify":"Modification","name":"Tableau de bord","pagename":"Administration du site","records":"Enregistrements","show":"Voir","ago":"plus tôt"}},"home":{"name":"accueil"},"repository":{"duration":"Durée"},"devise":{"confirmations":{"confirmed":"Votre compte a été crée avec succès. Vous être maintenant connecté.","send_instructions":"Vous allez recevoir un courriel avec les instructions de confirmation de votre compte dans quelques minutes."},"failure":{"inactive":"Votre compte n'a pas encore été activé.","invalid":"Adresse courriel ou mot de passe invalide.","invalid_token":"Jeton d'authentification invalide.","locked":"Votre compte est bloqué.","timeout":"Votre session est expirée, veuillez vous reconnecter pour continuer.","unauthenticated":"Vous devez vous connecter ou vous enregistrer afin de continuer","unconfirmed":"Vous devez confirmer votre compte avant de continuer."},"mailer":{"confirmation_instructions":{"subject":"Instructions de confirmations"},"reset_password_instructions":{"subject":"Instruction de remise à zéro du mot de passe"},"unlock_instructions":{"subject":"Instruction de débloquage"}},"passwords":{"send_instructions":"Vous recevrez un courriel avec les instructions de remise à zéro du mot de passe dans quelques minutes.","updated":"Votre mot de passe a été changé avec succès. Vous êtes maintenant connecté."},"registrations":{"destroyed":"Au revoir! Votre compte a été annulé avec succès. Nous espérons vous revoir bientôt.","signed_up":"Vous êtes enregistré avec succès. Si activé, une confirmation vous a été envoyé par courriel.","updated":"Votre compte a été mis a jour avec succès"},"sessions":{"signed_in":"Connecté avec succès","signed_out":"Déconnecté avec succès"},"unlocks":{"send_instructions":"Vous recevrez un courriel contenant les instructions pour débloquer votre compte dans quelques minutes.","unlocked":"Votre compte a été débloqué avec succès."}},"errors":{"messages":{"already_confirmed":"étais déja confirmé","not_found":"n'a pas été trouvé","not_locked":"n'étais pas bloqué"}},"locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"ja":{"workers":"ワーカー","queue":"キュー","no_job":"ジョブはありません","repositories":{"branch":"ブランチ","image_url":"画像URL","markdown":".md","textile":".textile","rdoc":".rdoc","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻","tabs":{"current":"最新","build_history":"ビルド履歴","branches":"ブランチまとめ","build":"ビルド","job":"ジョブ"}},"build":{"job":"ジョブ","duration":"処理時間","finished_at":"終了時刻"},"jobs":{"messages":{"sponsored_by":"このテストは以下のスポンサーの協力で行いました。"},"build_matrix":"ビルドマトリクス","allowed_failures":"失敗許容範囲内","author":"制作者","config":"設定","compare":"比較","committer":"コミット者","branch":"ブランチ","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻"},"builds":{"name":"ビルド","messages":{"sponsored_by":"このテストは以下のスポンサーの協力で行いました。"},"build_matrix":"失敗許容範囲外","allowed_failures":"失敗許容範囲内","author":"制作者","config":"設定","compare":"比較","committer":"コミット者","branch":"ブランチ","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻"},"layouts":{"about":{"alpha":"まだアルファですよ!","join":"参加してみよう!","mailing_list":"メールリスト","messages":{"alpha":"Travis-ciは安定したサービスまで後一歩!詳しくはこちら"},"repository":"リポジトリ","twitter":"ツイッター"},"application":{"fork_me":"Githubでフォークしよう","my_repositories":"マイリポジトリ","recent":"最近","search":"検索","sponsers":"スポンサー","sponsors_link":"スポンサーをもっと見る →"},"top":{"blog":"ブログ","docs":"Travisとは?","github_login":"Githubでログイン","home":"ホーム","profile":"プロフィール","sign_out":"ログアウト","stats":"統計","admin":"管理"},"mobile":{"author":"制作者","build":"ビルド","build_matrix":"ビルドマトリクス","commit":"コミット","committer":"コミット者","compare":"比較","config":"設定","duration":"処理時間","finished_at":"終了時刻","job":"ジョブ","log":"ログ"}},"profiles":{"show":{"github":"Github","email":"メール","message":{"config":"詳細設定","your_repos":"以下のスイッチを設定し、Travis-ciを有効にします。Githubへプッシュしたらビルドは自動的に開始します。複数バーションや細かい設定はこちらへ:"},"messages":{"notice":"まずはTravisのはじめ方を参照してください。"},"token":"トークン","your_repos":"リポジトリ","update":"更新","update_locale":"更新","your_locale":"言語設定"}},"statistics":{"index":{"build_count":"ビルド数","count":"数","last_month":"先月","repo_growth":"リポジトリ","total_builds":"合計ビルド数","total_projects":"合計リポジトリ"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"nb":{"admin":{"actions":{"create":"opprett","created":"opprettet","delete":"slett","deleted":"slettet","update":"oppdater","updated":"oppdatert"},"credentials":{"log_out":"Logg ut"},"dashboard":{"add_new":"Legg til ny","ago":"siden","last_used":"Sist brukt","model_name":"Modell","modify":"Rediger","name":"Dashbord","pagename":"Nettstedsadministrasjon","records":"Oppføringer","show":"Vis"},"delete":{"confirmation":"Ja, jeg er sikker","flash_confirmation":"%{name} ble slettet"},"flash":{"error":"%{name} kunne ikke bli %{action}","noaction":"Ingen handlinger ble utført","successful":"%{name} ble %{action}"},"history":{"name":"Logg","no_activity":"Ingen aktivitet","page_name":"Logg for %{name}"},"list":{"add_new":"Legg til ny","delete_action":"Slett","delete_selected":"Slett valgte","edit_action":"Rediger","search":"Søk","select":"Velg %{name} for å redigere","select_action":"Velg","show_all":"Vis alle "},"new":{"basic_info":"Basisinformasjon","cancel":"Avbryt","chosen":"Valgt %{name}","chose_all":"Velg alle","clear_all":"Fjern alle","many_chars":"eller færre tegn.","one_char":"tegn.","optional":"Valgfri","required":"Påkrevd","save":"Lagre","save_and_add_another":"Lagre og legg til ny","save_and_edit":"Lagre og rediger","select_choice":"Kryss av for dine valg og klikk"}},"build":{"duration":"Varighet","finished_at":"Fullført","job":"Jobb"},"builds":{"allowed_failures":"Tillatte feil","author":"Forfatter","branch":"Gren","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","message":"Beskrivelse","messages":{"sponsored_by":"Denne testen ble kjørt på en maskin sponset av"},"name":"Jobb","started_at":"Startet"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} time","other":"%{count} timer"},"minutes_exact":{"one":"%{count} minutt","other":"%{count} minutter"},"seconds_exact":{"one":"%{count} sekund","other":"%{count} sekunder"}}},"devise":{"confirmations":{"confirmed":"Din konto er aktivert og du er nå innlogget.","send_instructions":"Om noen få minutter så vil du få en e-post med informasjon om hvordan du bekrefter kontoen din."},"failure":{"inactive":"Kontoen din har ikke blitt aktivert enda.","invalid":"Ugyldig e-post eller passord.","invalid_token":"Ugyldig autentiseringskode.","locked":"Kontoen din er låst.","timeout":"Du ble logget ut siden på grunn av mangel på aktivitet, vennligst logg inn på nytt.","unauthenticated":"Du må logge inn eller registrere deg for å fortsette.","unconfirmed":"Du må bekrefte kontoen din før du kan fortsette."},"mailer":{"confirmation_instructions":{"subject":"Bekreftelsesinformasjon"},"reset_password_instructions":{"subject":"Instruksjoner for å få nytt passord"},"unlock_instructions":{"subject":"Opplåsningsinstruksjoner"}},"passwords":{"send_instructions":"Om noen få minutter så vil du få en epost med informasjon om hvordan du kan få et nytt passord.","updated":"Passordet ditt ble endret, og du er logget inn."},"registrations":{"destroyed":"Adjø! Kontoen din ble kansellert. Vi håper vi ser deg igjen snart.","signed_up":"Du er nå registrert.","updated":"Kontoen din ble oppdatert."},"sessions":{"signed_in":"Du er nå logget inn.","signed_out":"Du er nå logget ut."},"unlocks":{"send_instructions":"Om noen få minutter så kommer du til å få en e-post med informasjon om hvordan du kan låse opp kontoen din.","unlocked":"Kontoen din ble låst opp, og du er nå logget inn igjen."}},"errors":{"messages":{"already_confirmed":"har allerede blitt bekreftet","not_found":"ikke funnnet","not_locked":"var ikke låst"}},"home":{"name":"hjem"},"jobs":{"allowed_failures":"Tillatte feil","author":"Forfatter","branch":"Gren","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","message":"Beskrivelse","messages":{"sponsored_by":"Denne testserien ble kjørt på en maskin sponset av"},"started_at":"Startet"},"layouts":{"about":{"alpha":"Dette er alfa-greier.","join":"Bli med og hjelp oss!","mailing_list":"E-postliste","messages":{"alpha":"Dette er ikke en stabil tjeneste. Vi har fremdeles et stykke igjen! Mer informasjon finner du her."},"repository":"Kodelager","twitter":"Twitter."},"application":{"fork_me":"Se koden på Github","my_repositories":"Mine kodelagre","recent":"Nylig","search":"Søk","sponsers":"Sponsorer","sponsors_link":"Se alle de flotte sponsorene våre →"},"mobile":{"author":"Forfatter","build":"Jobb","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","job":"Jobb","log":"Logg"},"top":{"admin":"Administrator","blog":"Blogg","docs":"Dokumentasjon","github_login":"Logg inn med Github","home":"Hjem","profile":"Profil","sign_out":"Logg ut","stats":"Statistikk"}},"no_job":"Ingen jobber finnnes","profiles":{"show":{"email":"E-post","github":"Github","message":{"config":"hvordan sette opp egne jobbinnstillinger","your_repos":"Slå\u0010 på Travis for prosjektene dine ved å dra i bryterne under, og send koden til Github.
    \nFor å teste mot flere ruby-versjoner, se dokumentasjonen for"},"messages":{"notice":"For å komme i gang, vennligst les kom-i-gang-veivisereren vår. Det tar bare et par minutter."},"token":"Kode","update":"Oppdater","update_locale":"Oppdater","your_locale":"Ditt språk","your_repos":"Dine kodelagre"}},"queue":"Kø","repositories":{"branch":"Gren","commit":"Innsender","duration":"Varighet","finished_at":"Fullført","image_url":"Bilde-URL","markdown":"Markdown","message":"Beskrivelse","rdoc":"RDOC","started_at":"Startet","tabs":{"branches":"Grensammendrag","build":"Jobb","build_history":"Jobblogg","current":"Siste","job":"Jobb"},"textile":"Textile"},"repository":{"duration":"Varighet"},"statistics":{"index":{"build_count":"Antall jobber","count":"Antall","last_month":"siste måned","repo_growth":"Vekst i kodelager","total_builds":"Totale jobber","total_projects":"Antall prosjekter/kodelagre"}},"workers":"Arbeidere","locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"nl":{"admin":{"actions":{"create":"aanmaken","created":"aangemaakt","delete":"verwijderen","deleted":"verwijderd","update":"bijwerken","updated":"bijgewerkt"},"credentials":{"log_out":"Afmelden"},"dashboard":{"add_new":"Nieuwe toevoegen","ago":"geleden","last_used":"Laatst gebruikt","model_name":"Model naam","modify":"Wijzigen","pagename":"Site administratie","show":"Laten zien","records":"Gegevens"},"delete":{"confirmation":"Ja, ik ben zeker","flash_confirmation":"%{name} is vernietigd"},"flash":{"error":"%{name} kon niet worden %{action}","noaction":"Er zijn geen acties genomen","successful":"%{name} is %{action}"},"history":{"name":"Geschiedenis","no_activity":"Geen activiteit","page_name":"Geschiedenis van %{name}"},"list":{"add_new":"Nieuwe toevoegen","delete_action":"Verwijderen","delete_selected":"Verwijder geselecteerden","edit_action":"Bewerken","search":"Zoeken","select":"Selecteer %{name} om te bewerken","select_action":"Selecteer","show_all":"Laat allen zien"},"new":{"basic_info":"Basisinfo","cancel":"Annuleren","chosen":"%{name} gekozen","chose_all":"Kies allen","clear_all":"Deselecteer allen","many_chars":"tekens of minder.","one_char":"teken.","optional":"Optioneel","required":"Vereist","save":"Opslaan","save_and_add_another":"Opslaan en een nieuwe toevoegen","save_and_edit":"Opslaan en bewerken","select_choice":"Selecteer uw keuzes en klik"}},"build":{"duration":"Duur","finished_at":"Voltooid","job":"Taak"},"builds":{"allowed_failures":"Toegestane mislukkingen","author":"Auteur","branch":"Tak","build_matrix":"Bouw Matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid","message":"Bericht","messages":{"sponsored_by":"Deze tests zijn gedraaid op een machine gesponsord door"},"name":"Bouw","started_at":"Gestart","commit":"Commit","committer":"Committer"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} uur","other":"%{count} uren"},"minutes_exact":{"one":"%{count} minuut","other":"%{count} minuten"},"seconds_exact":{"one":"%{count} seconde","other":"%{count} seconden"}}},"devise":{"confirmations":{"confirmed":"Uw account is bevestigd. U wordt nu ingelogd.","send_instructions":"Binnen enkele minuten zal u een email ontvangen met instructies om uw account te bevestigen."},"failure":{"inactive":"Uw account is nog niet geactiveerd.","invalid":"Ongeldig email adres of wachtwoord.","invalid_token":"Ongeldig authenticatie token.","locked":"Uw account is vergrendeld.","timeout":"Uw sessie is verlopen, gelieve opnieuw in te loggen om verder te gaan.","unauthenticated":"U moet inloggen of u registeren voordat u verder gaat.","unconfirmed":"U moet uw account bevestigen voordat u verder gaat."},"mailer":{"confirmation_instructions":{"subject":"Bevestigings-instructies"},"reset_password_instructions":{"subject":"Wachtwoord herstel instructies"},"unlock_instructions":{"subject":"Ontgrendel-instructies"}},"passwords":{"send_instructions":"Binnen enkele minuten zal u een email krijgen met instructies om uw wachtwoord opnieuw in te stellen.","updated":"Uw wachtwoord is veranderd. U wordt nu ingelogd."},"registrations":{"destroyed":"Dag! Uw account is geannuleerd. We hopen u vlug terug te zien.","signed_up":"Uw registratie is voltooid. Als het ingeschakeld is wordt een bevestiging naar uw email adres verzonden.","updated":"Het bijwerken van uw account is gelukt."},"sessions":{"signed_in":"Inloggen gelukt.","signed_out":"Uitloggen gelukt."},"unlocks":{"send_instructions":"Binnen enkele minuten zal u een email krijgen met instructies om uw account te ontgrendelen.","unlocked":"Uw account is ontgrendeld. U wordt nu ingelogd."}},"errors":{"messages":{"already_confirmed":"was al bevestigd","not_found":"niet gevonden","not_locked":"was niet vergrendeld"}},"jobs":{"allowed_failures":"Toegestane mislukkingen","author":"Auteur","branch":"Tak","build_matrix":"Bouw matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid","message":"Bericht","messages":{"sponsored_by":"Deze testen zijn uitgevoerd op een machine gesponsord door"},"started_at":"Gestart","commit":"Commit","committer":"Committer"},"layouts":{"about":{"alpha":"Dit is in alfa-stadium.","join":"Doe met ons mee en help!","mailing_list":"Mailing lijst","messages":{"alpha":"Gelieve deze service niet te beschouwen als stabiel. Daar zijn we nog lang niet! Meer info hier."},"repository":"Repository","twitter":"Twitter"},"application":{"fork_me":"Maak een fork op Github","my_repositories":"Mijn repositories","recent":"Recent","search":"Zoeken","sponsers":"Sponsors","sponsors_link":"Bekijk al onze geweldige sponsors →"},"mobile":{"author":"Auteur","build":"Bouw","build_matrix":"Bouw matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid op","job":"Taak","commit":"Commit","committer":"Committer","log":"Logboek"},"top":{"admin":"Administratie","blog":"Blog","docs":"Documentatie","github_login":"Inloggen met Github","home":"Home","profile":"Profiel","sign_out":"Uitloggen","stats":"Statistieken"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","ru":"Русский","pt-BR":"português brasileiro"},"no_job":"Er zijn geen taken","profiles":{"show":{"email":"Email adres","github":"Github","message":{"config":"hoe eigen bouw-opties in te stellen","your_repos":"Zet de schakelaars hieronder aan om de Travis hook voor uw projecten te activeren en push daarna naar Github
    \nOm te testen tegen meerdere rubies, zie"},"messages":{"notice":"Om te beginnen kunt u onze startersgids lezen.\\n Het zal maar enkele minuten van uw tijd vergen."},"update":"Bijwerken","update_locale":"Bijwerken","your_locale":"Uw taal","your_repos":"Uw repositories","token":"Token"}},"queue":"Wachtrij","repositories":{"branch":"Tak","duration":"Duur","finished_at":"Voltooid","image_url":"Afbeeldings URL","message":"Bericht","started_at":"Gestart","tabs":{"branches":"Tak samenvatting","build":"Bouw","build_history":"Bouw geschiedenis","current":"Huidig","job":"Taak"},"commit":"Commit","markdown":"Markdown","rdoc":"RDOC","textile":"Textile"},"repository":{"duration":"Duur"},"statistics":{"index":{"build_count":"Bouw aantal","count":"Aantal","last_month":"voorbije maand","repo_growth":"Repository groei","total_builds":"Bouw totaal","total_projects":"Projecten/Repository totaal"}},"workers":"Machines","home":{"name":"Hoofdpagina"}},"pl":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} godzina","other":"%{count} godziny"},"minutes_exact":{"one":"%{count} minuta","other":"%{count} minuty"},"seconds_exact":{"one":"%{count} sekunda","other":"%{count} sekundy"}}},"workers":"Workers","queue":"Kolejka","no_job":"Brak zadań","repositories":{"branch":"Gałąź","image_url":"URL obrazka","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono","tabs":{"current":"Aktualny","build_history":"Historia Buildów","branches":"Wszystkie Gałęzie","build":"Build","job":"Zadanie"}},"build":{"job":"Zadanie","duration":"Czas trwania","finished_at":"Zakończono"},"jobs":{"messages":{"sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"build_matrix":"Macierz Buildów","allowed_failures":"Dopuszczalne Niepowodzenia","author":"Autor","config":"Konfiguracja","compare":"Porównanie","committer":"Committer","branch":"Gałąź","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono","sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"builds":{"name":"Build","messages":{"sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"build_matrix":"Macierz Buildów","allowed_failures":"Dopuszczalne Niepowodzenia","author":"Autor","config":"Konfiguracja","compare":"Porównanie","committer":"Komitujący","branch":"Gałąź","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono"},"layouts":{"top":{"home":"Start","blog":"Blog","docs":"Dokumentacja","stats":"Statystki","github_login":"Zaloguj się przy pomocy Githuba","profile":"Profil","sign_out":"Wyloguj się"},"application":{"fork_me":"Fork me on Github","recent":"Ostatnie","search":"Wyniki","sponsers":"Sponsorzy","sponsors_link":"Zobacz naszych wszystkich wspaniałych sponsorów →","my_repositories":"Moje repozytoria"},"about":{"alpha":"To wciąż jest wersja alpha.","messages":{"alpha":"Proszę nie traktuj tego jako stabilnej usługi. Wciąż nam wiele do tego brakuje! Więcej informacji znajdziesz tutaj."},"join":"Pomóż i dołącz do nas!","mailing_list":"Lista mailingowa","repository":"Repozytorium","twitter":"Twitter"},"mobile":{"author":"Autor","build":"Build","build_matrix":"Macierz Buildów","commit":"Commit","committer":"Komitujący","compare":"Porównianie","config":"Konfiguracja","duration":"Czas trwania","finished_at":"Zakończono","job":"Zadanie","log":"Log"}},"profiles":{"show":{"email":"Email","github":"Github","message":{"your_repos":" Przesuń suwak poniżej, aby włączyć Travisa, dla twoich projektów, a następnie umieść swój kod na GitHubie.
    \n Aby testować swój kod przy użyciu wielu wersji Rubiego, zobacz","config":"jak skonfigurować niestandardowe opcje builda"},"messages":{"notice":"Aby zacząć, przeczytaj nasz Przewodnik .\n Zajmie ci to tylko kilka minut."},"token":"Token","your_repos":"Twoje repozytoria"}},"statistics":{"index":{"count":"Ilość","repo_growth":"Przyrost repozytoriów","total_projects":"Łącznie projektów/repozytoriów","build_count":"Liczba buildów","last_month":"ostatni miesiąc","total_builds":"Łącznie Buildów"}},"date":{"abbr_day_names":["nie","pon","wto","śro","czw","pią","sob"],"abbr_month_names":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"day_names":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"formats":{"default":"%d-%m-%Y","long":"%B %d, %Y","short":"%d %b"},"month_names":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"order":["day","month","year"]},"errors":{"format":"%{attribute} %{message}","messages":{"accepted":"musi zostać zaakceptowane","blank":"nie może być puste"}},"locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"pt-BR":{"admin":{"actions":{"create":"criar","created":"criado","delete":"deletar","deleted":"deletado","update":"atualizar","updated":"atualizado"},"credentials":{"log_out":"Deslogar"},"dashboard":{"add_new":"Adicionar novo","ago":"atrás","last_used":"Última utilização","model_name":"Nome do modelo","modify":"Modificar","name":"Dashboard","pagename":"Administração do site","records":"Registros","show":"Mostrar"},"delete":{"confirmation":"Sim, tenho certeza","flash_confirmation":"%{name} foi destruído com sucesso"},"flash":{"error":"%{name} falhou ao %{action}","noaction":"Nenhuma ação foi tomada","successful":"%{name} foi %{action} com sucesso"},"history":{"name":"Histórico","no_activity":"Nenhuma Atividade","page_name":"Histórico para %{name}"},"list":{"add_new":"Adicionar novo","delete_action":"Deletar","delete_selected":"Deletar selecionados","edit_action":"Editar","search":"Buscar","select":"Selecionar %{name} para editar","select_action":"Selecionar","show_all":"Mostrar todos"},"new":{"basic_info":"Informações básicas","cancel":"Cancelar","chosen":"Escolhido %{name}","chose_all":"Escolher todos","clear_all":"Limpar todos","many_chars":"caracteres ou menos.","one_char":"caractere.","optional":"Opcional","required":"Requerido","save":"Salvar","save_and_add_another":"Salvar e adicionar outro","save_and_edit":"Salvar e alterar","select_choice":"Selecione e clique"}},"build":{"duration":"Duração","finished_at":"Concluído em","job":"Trabalho"},"builds":{"allowed_failures":"Falhas Permitidas","author":"Autor","branch":"Branch","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","message":"Mensagem","messages":{"sponsored_by":"Esta série de testes foi executada em uma caixa de processos patrocinada por"},"name":"Build","started_at":"Iniciou em"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hora","other":"%{count} horas"},"minutes_exact":{"one":"%{count} minuto","other":"%{count} minutos"},"seconds_exact":{"one":"%{count} segundo","other":"%{count} segundos"}}},"devise":{"confirmations":{"confirmed":"Sua conta foi confirmada com sucesso. Você agora está logado.","send_instructions":"Você receberá um email com instruções de como confirmar sua conta em alguns minutos."},"failure":{"inactive":"Sua conta ainda não foi ativada.","invalid":"Email ou senha inválidos.","invalid_token":"Token de autenticação inválido.","locked":"Sua conta está trancada.","timeout":"Sua sessão expirou, por favor faça seu login novamente.","unauthenticated":"Você precisa fazer o login ou cadastrar-se antes de continuar.","unconfirmed":"Você precisa confirmar sua conta antes de continuar."},"mailer":{"confirmation_instructions":{"subject":"Instruções de confirmação"},"reset_password_instructions":{"subject":"Instruções de atualização de senha"},"unlock_instructions":{"subject":"Instruções de destrancamento"}},"passwords":{"send_instructions":"Você receberá um email com instruções de como atualizar sua senha em alguns minutos.","updated":"Sua senha foi alterada com sucesso. Você agora está logado."},"registrations":{"destroyed":"Tchau! Sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve!","signed_up":"Você se cadastrou com sucesso. Se ativada, uma confirmação foi enviada para seu email.","updated":"Você atualizou sua conta com sucesso."},"sessions":{"signed_in":"Logado com sucesso.","signed_out":"Deslogado com sucesso."},"unlocks":{"send_instructions":"Você receberá um email com instruções de como destrancar sua conta em alguns minutos.","unlocked":"Sua conta foi destrancada com sucesso. Você agora está logado."}},"errors":{"messages":{"already_confirmed":"já foi confirmado","not_found":"não encontrado","not_locked":"não estava trancado"}},"home":{"name":"home"},"jobs":{"allowed_failures":"Falhas Permitidas","author":"Autor","branch":"Branch","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","message":"Mensagem","messages":{"sponsored_by":"Esta série de testes foi executada em uma caixa de processos patrocinada por"},"started_at":"Iniciou em"},"layouts":{"about":{"alpha":"Isto é um alpha.","join":"Junte-se à nós e ajude!","mailing_list":"Lista de email","messages":{"alpha":"Por favor, não considere isto um serviço estável. Estamos muito longe disso! Mais informações aqui."},"repository":"Repositório","twitter":"Twitter"},"application":{"fork_me":"Faça fork no Github","my_repositories":"Meus Repositórios","recent":"Recentes","search":"Buscar","sponsers":"Patrocinadores","sponsors_link":"Conheça todos os nossos patrocinadores →"},"mobile":{"author":"Autor","build":"Build","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","job":"Trabalho","log":"Log"},"top":{"admin":"Admin","blog":"Blog","docs":"Documentação","github_login":"Logue com o Github","home":"Home","profile":"Perfil","sign_out":"Sair","stats":"Estatísticas"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","ru":"Русский","pt-BR":"português brasileiro"},"no_job":"Não há trabalhos","profiles":{"show":{"email":"Email","github":"Github","message":{"config":"como configurar opções de build","your_repos":"Use os botões abaixo para ligar ou desligar o hook de serviço do Travis para seus projetos, e então, faça um push para o Github.
    Para testar com múltiplas versões do Ruby, leia"},"messages":{"notice":"Para começar, leia nosso Guia de início. Só leva alguns minutinhos."},"token":"Token","update":"Atualizar","update_locale":"Atualizar","your_locale":"Sua língua","your_repos":"Seus Repositórios"}},"queue":"Fila","repositories":{"branch":"Branch","commit":"Commit","duration":"Duração","finished_at":"Concluído em","image_url":"URL da imagem","markdown":"Markdown","message":"Mensagem","rdoc":"RDOC","started_at":"Iniciou em","tabs":{"branches":"Sumário do Branch","build":"Build","build_history":"Histórico de Build","current":"Atual","job":"Trabalho"},"textile":"Textile"},"repository":{"duration":"Duração"},"statistics":{"index":{"build_count":"Número de Builds","count":"Número","last_month":"último mês","repo_growth":"Crescimento de Repositório","total_builds":"Total de Builds","total_projects":"Total de Projetos/Repositórios"}},"workers":"Processos"},"ru":{"admin":{"actions":{"create":"создать","created":"создано","delete":"удалить","deleted":"удалено","update":"обновить","updated":"обновлено"},"credentials":{"log_out":"Выход"},"dashboard":{"add_new":"Добавить","ago":"назад","last_used":"Использовалось в последний раз","model_name":"Имя модели","modify":"Изменить","name":"Панель управления","pagename":"Управление сайтом","records":"Записи","show":"Показать"},"delete":{"confirmation":"Да, я уверен","flash_confirmation":"%{name} успешно удалено"},"history":{"name":"История","no_activity":"Нет активности","page_name":"История %{name}"},"list":{"add_new":"Добавить","delete_action":"Удалить","delete_selected":"Удалить выбранные","edit_action":"Редактировать","search":"Поиск","select":"Для редактирования выберите %{name}","select_action":"Выбрать","show_all":"Показать все"},"new":{"basic_info":"Основная информация","cancel":"Отмена","chosen":"Выбрано %{name}","chose_all":"Выбрать все","clear_all":"Очистить все","one_char":"символ.","optional":"Необязательно","required":"Обязательно","save":"Сохранить","save_and_add_another":"Сохранить и добавить другое","save_and_edit":"Сохранить и продолжить редактирование","select_choice":"Выберите и кликните","many_chars":"символов или меньше."},"flash":{"error":"%{name} не удалось %{action}","noaction":"Никаких действий не произведено","successful":"%{name} было успешно %{action}"}},"build":{"duration":"Длительность","finished_at":"Завершен","job":"Задача"},"builds":{"allowed_failures":"Допустимые неудачи","author":"Автор","branch":"Ветка","build_matrix":"Матрица","commit":"Коммит","committer":"Коммитер","compare":"Дифф","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","message":"Комментарий","messages":{"sponsored_by":"Эта серия тестов была запущена на машине, спонсируемой"},"name":"Билд","started_at":"Начало"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} час","few":"%{count} часа","many":"%{count} часов","other":"%{count} часа"},"minutes_exact":{"one":"%{count} минута","few":"%{count} минуты","many":"%{count} минут","other":"%{count} минуты"},"seconds_exact":{"one":"%{count} секунда","few":"%{count} секунды","many":"%{count} секунд","other":"%{count} секунды"}}},"devise":{"confirmations":{"confirmed":"Ваш аккаунт успешно подтвержден. Приветствуем!","send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциями для прохождения процедуры подтверждения аккаунта."},"failure":{"inactive":"Ваш аккаунт еще не активирован.","invalid":"Ошибка в адресе почты или пароле.","invalid_token":"Неправильный токен аутентификации.","locked":"Ваш аккаунт заблокирован.","timeout":"Сессия окончена. Для продолжения работы войдите снова.","unauthenticated":"Вам нужно войти или зарегистрироваться.","unconfirmed":"Вы должны сначала подтвердить свой аккаунт."},"mailer":{"confirmation_instructions":{"subject":"Инструкции для подтверждению аккаунта"},"reset_password_instructions":{"subject":"Инструкции для сброса пароля"},"unlock_instructions":{"subject":"Инструкции для разблокирования аккаунта"}},"passwords":{"send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциями для сброса пароля.","updated":"Ваш пароль успешно изменен. Приветствуем!"},"registrations":{"destroyed":"Ваш аккаунт был успешно удален. Живите долго и процветайте!","signed_up":"Вы успешно прошли регистрацию. Инструкции для подтверждения аккаунта отправлены на ваш электронный адрес.","updated":"Аккаунт успешно обновлен."},"sessions":{"signed_in":"Приветствуем!","signed_out":"Удачи!"},"unlocks":{"send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциям для разблокировния аккаунта.","unlocked":"Ваш аккаунт успешно разблокирован. Приветствуем!"}},"errors":{"messages":{"already_confirmed":"уже подтвержден","not_found":"не найден","not_locked":"не заблокирован"}},"home":{"name":"Главная"},"jobs":{"allowed_failures":"Допустимые неудачи","author":"Автор","branch":"Ветка","build_matrix":"Матрица","commit":"Коммит","committer":"Коммитер","compare":"Сравнение","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","message":"Комментарий","messages":{"sponsored_by":"Эта серия тестов была запущена на машине спонсируемой"},"started_at":"Начало"},"layouts":{"about":{"alpha":"Это альфа-версия","join":"Присоединяйтесь к нам и помогайте!","mailing_list":"Лист рассылки","messages":{"alpha":"Пожалуйста, не считайте данный сервис стабильным. Мы еще очень далеки от стабильности! Подробности"},"repository":"Репозиторий","twitter":"Twitter"},"application":{"fork_me":"Fork me on Github","my_repositories":"Мои репозитории","recent":"Недавние","search":"Поиск","sponsers":"Спонсоры","sponsors_link":"Список всех наших замечательных спонсоров →"},"mobile":{"author":"Автор","build":"Сборка","build_matrix":"Матрица сборок","commit":"Коммит","committer":"Коммитер","compare":"Сравнение","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","job":"Задача","log":"Журнал"},"top":{"admin":"Управление","blog":"Блог","docs":"Документация","github_login":"Войти через Github","home":"Главная","profile":"Профиль","sign_out":"Выход","stats":"Статистика"}},"no_job":"Очередь пуста","profiles":{"show":{"email":"Электронная почта","github":"Github","message":{"config":"как настроить специальные опции билда","your_repos":"Используйте переключатели, чтобы включить Travis service hook для вашего проекта, а потом отправьте код на GitHub.
    \nДля тестирования на нескольких версиях Ruby смотрите"},"messages":{"notice":"Перед началом, пожалуйста, прочтите Руководство для быстрого старта. Это займет всего несколько минут."},"token":"Токен","update":"Обновить","update_locale":"Обновить","your_locale":"Ваш язык","your_repos":"Ваши репозитории"}},"queue":"Очередь","repositories":{"branch":"Ветка","commit":"Коммит","duration":"Длительность","finished_at":"Завершен","image_url":"URL изображения","markdown":"Markdown","message":"Комментарий","rdoc":"RDOC","started_at":"Начало","tabs":{"branches":"Статус веток","build":"Билд","build_history":"История","current":"Текущий","job":"Задача"},"textile":"Textile"},"repository":{"duration":"Длительность"},"statistics":{"index":{"build_count":"Количество билдов","count":"Количество","last_month":"прошлый месяц","repo_growth":"Рост числа репозиториев","total_builds":"Всего билдов","total_projects":"Всего проектов/репозиториев"}},"workers":"Машины","locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}}}; +window.I18n.translations = {"ca":{"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","pt-BR":"português brasileiro","ru":"Русский"}},"en":{"errors":{"messages":{"not_found":"not found","already_confirmed":"was already confirmed","not_locked":"was not locked"}},"devise":{"failure":{"unauthenticated":"You need to sign in or sign up before continuing.","unconfirmed":"You have to confirm your account before continuing.","locked":"Your account is locked.","invalid":"Invalid email or password.","invalid_token":"Invalid authentication token.","timeout":"Your session expired, please sign in again to continue.","inactive":"Your account was not activated yet."},"sessions":{"signed_in":"Signed in successfully.","signed_out":"Signed out successfully."},"passwords":{"send_instructions":"You will receive an email with instructions about how to reset your password in a few minutes.","updated":"Your password was changed successfully. You are now signed in."},"confirmations":{"send_instructions":"You will receive an email with instructions about how to confirm your account in a few minutes.","confirmed":"Your account was successfully confirmed. You are now signed in."},"registrations":{"signed_up":"You have signed up successfully. If enabled, a confirmation was sent to your e-mail.","updated":"You updated your account successfully.","destroyed":"Bye! Your account was successfully cancelled. We hope to see you again soon."},"unlocks":{"send_instructions":"You will receive an email with instructions about how to unlock your account in a few minutes.","unlocked":"Your account was successfully unlocked. You are now signed in."},"mailer":{"confirmation_instructions":{"subject":"Confirmation instructions"},"reset_password_instructions":{"subject":"Reset password instructions"},"unlock_instructions":{"subject":"Unlock Instructions"}}},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hour","other":"%{count} hours"},"minutes_exact":{"one":"%{count} minute","other":"%{count} minutes"},"seconds_exact":{"one":"%{count} second","other":"%{count} seconds"}}},"workers":"Workers","queue":"Queue","no_job":"There are no jobs","repositories":{"branch":"Branch","image_url":"Image URL","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished","tabs":{"current":"Current","build_history":"Build History","branches":"Branch Summary","pull_requests":"Pull Requests","build":"Build","job":"Job"}},"build":{"job":"Job","duration":"Duration","finished_at":"Finished"},"jobs":{"messages":{"sponsored_by":"This test suite was run on a worker box sponsored by"},"build_matrix":"Build Matrix","allowed_failures":"Allowed Failures","author":"Author","config":"Config","compare":"Compare","committer":"Committer","branch":"Branch","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished"},"builds":{"name":"Build","messages":{"sponsored_by":"This test suite was run on a worker box sponsored by"},"build_matrix":"Build Matrix","allowed_failures":"Allowed Failures","author":"Author","config":"Config","compare":"Compare","committer":"Committer","branch":"Branch","commit":"Commit","message":"Message","started_at":"Started","duration":"Duration","finished_at":"Finished","show_more":"Show more"},"layouts":{"top":{"home":"Home","blog":"Blog","docs":"Docs","stats":"Stats","github_login":"Sign in with Github","profile":"Profile","sign_out":"Sign Out","admin":"Admin"},"application":{"fork_me":"Fork me on Github","recent":"Recent","search":"Search","sponsers":"Sponsors","sponsors_link":"See all of our amazing sponsors →","my_repositories":"My Repositories"},"about":{"alpha":"This stuff is alpha.","messages":{"alpha":"Please do not consider this a stable service. We're still far from that! More info here."},"join":"Join us and help!","mailing_list":"Mailing List","repository":"Repository","twitter":"Twitter"},"mobile":{"author":"Author","build":"Build","build_matrix":"Build Matrix","commit":"Commit","committer":"Committer","compare":"Compare","config":"Config","duration":"Duration","finished_at":"Finished at","job":"Job","log":"Log"}},"profiles":{"show":{"email":"Email","github":"Github","message":{"your_repos":" Flick the switches below to turn on the Travis service hook for your projects, then push to GitHub.","config":"how to configure custom build options"},"messages":{"notice":"To get started, please read our Getting Started guide.\n It will only take a couple of minutes."},"token":"Token","your_repos":"Your Repositories","update":"Update","update_locale":"Update","your_locale":"Your Locale"}},"statistics":{"index":{"count":"Count","repo_growth":"Repository Growth","total_projects":"Total Projects/Repositories","build_count":"Build Count","last_month":"last month","total_builds":"Total Builds"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"es":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hora","other":"%{count} horas"},"minutes_exact":{"one":"%{count} minuto","other":"%{count} minutos"},"seconds_exact":{"one":"%{count} segundo","other":"%{count} segundos"}}},"workers":"Procesos","queue":"Cola","no_job":"No hay trabajos","repositories":{"branch":"Rama","image_url":"Imagen URL","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado","tabs":{"current":"Actual","build_history":"Histórico","branches":"Ramas","build":"Builds","job":"Trabajo"}},"build":{"job":"Trabajo","duration":"Duración","finished_at":"Finalizado"},"jobs":{"messages":{"sponsored_by":"Esta serie de tests han sido ejecutados en una caja de Proceso patrocinada por"},"build_matrix":"Matriz de Builds","allowed_failures":"Fallos Permitidos","author":"Autor","config":"Configuración","compare":"Comparar","committer":"Committer","branch":"Rama","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado","sponsored_by":"Patrocinado por"},"builds":{"name":"Build","messages":{"sponsored_by":"Esta serie de tests han sido ejecutados en una caja de Proceso patrocinada por"},"build_matrix":"Matriz de Builds","allowed_failures":"Fallos Permitidos","author":"Autor","config":"Configuración","compare":"Comparar","committer":"Committer","branch":"Rama","commit":"Commit","message":"Mensaje","started_at":"Iniciado","duration":"Duración","finished_at":"Finalizado"},"layouts":{"top":{"home":"Inicio","blog":"Blog","docs":"Documentación","stats":"Estadísticas","github_login":"Iniciar sesión con Github","profile":"Perfil","sign_out":"Desconectar","admin":"Admin"},"application":{"fork_me":"Hazme un Fork en Github","recent":"Reciente","search":"Buscar","sponsers":"Patrocinadores","sponsors_link":"Ver todos nuestros patrocinadores →","my_repositories":"Mis Repositorios"},"about":{"alpha":"Esto es alpha.","messages":{"alpha":"Por favor no considereis esto un servicio estable. Estamos estamos aún lejos de ello! Más información aquí."},"join":"Únetenos y ayudanos!","mailing_list":"Lista de Correos","repository":"Repositorio","twitter":"Twitter"}},"profiles":{"show":{"email":"Correo electrónico","github":"Github","message":{"your_repos":" Activa los interruptores para inicial el Travis service hook para tus proyectos, y haz un Push en GitHub.
    \n Para probar varias versiones de ruby, mira","config":"como configurar tus propias opciones para el Build"},"messages":{"notice":"Para comenzar, por favor lee nuestra Guía de Inicio .\n Solo tomará unos pocos minutos."},"token":"Token","your_repos":"Tus repositorios","update":"Actualizar","update_locale":"Actualizar","your_locale":"Tu Idioma"}},"statistics":{"index":{"count":"Número","repo_growth":"Crecimiento de Repositorios","total_projects":"Total de Proyectos/Repositorios","build_count":"Número de Builds","last_month":"mes anterior","total_builds":"Total de Builds"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"fr":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} heure","other":"%{count} heures"},"minutes_exact":{"one":"%{count} minute","other":"%{count} minutes"},"seconds_exact":{"one":"%{count} seconde","other":"%{count} secondes"}}},"workers":"Processus","queue":"File","no_job":"Pas de tâches","repositories":{"branch":"Branche","image_url":"Image","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé","tabs":{"current":"Actuel","build_history":"Historique des tâches","branches":"Résumé des branches","build":"Construction","job":"Tâche"}},"build":{"job":"Tâche","duration":"Durée","finished_at":"Terminé"},"jobs":{"messages":{"sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"build_matrix":"Matrice des versions","allowed_failures":"Échecs autorisés","author":"Auteur","config":"Config","compare":"Comparer","committer":"Committeur","branch":"Branche","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé","sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"builds":{"name":"Version","messages":{"sponsored_by":"Cette série de tests a été exécutée sur une machine sponsorisée par"},"build_matrix":"Matrice des versions","allowed_failures":"Échecs autorisés","author":"Auteur","config":"Config","compare":"Comparer","committer":"Committeur","branch":"Branche","commit":"Commit","message":"Message","started_at":"Commencé","duration":"Durée","finished_at":"Terminé"},"layouts":{"top":{"home":"Accueil","blog":"Blog","docs":"Documentation","stats":"Statistiques","github_login":"Connection Github","profile":"Profil","sign_out":"Déconnection","admin":"Admin"},"application":{"fork_me":"Faites un Fork sur Github","recent":"Récent","search":"Chercher","sponsers":"Sponsors","sponsors_link":"Voir tous nos extraordinaire sponsors →","my_repositories":"Mes dépôts"},"about":{"alpha":"Ceci est en alpha.","messages":{"alpha":"S'il vous plaît ne considérez pas ce service comme étant stable. Nous sommes loin de ça! Plus d'infos ici."},"join":"Joignez-vous à nous et aidez-nous!","mailing_list":"Liste de distribution","repository":"Dépôt","twitter":"Twitter"},"mobile":{"author":"Auteur","build":"Version","build_matrix":"Matrice des versions","commit":"Commit","committer":"Committeur","compare":"Comparer","config":"Config","duration":"Durée","finished_at":"Terminé à","job":"Tâche","log":"Journal"}},"profiles":{"show":{"github":"Github","message":{"your_repos":"Utilisez les boutons ci-dessous pour activer Travis sur vos projets puis déployez sur GitHub.
    \nPour tester sur plus de versions de ruby, voir","config":"comment configurer des options de version personnalisées"},"messages":{"notice":"Pour commencer, veuillez lire notre guide de démarrage.\n Cela ne vous prendra que quelques minutes."},"token":"Jeton","your_repos":"Vos dépôts","email":"Courriel","update":"Modifier","update_locale":"Modifier","your_locale":"Votre langue"}},"statistics":{"index":{"count":"Décompte","repo_growth":"Croissance de dépôt","total_projects":"Total des projets/dépôts","build_count":"Décompte des versions","last_month":"mois dernier","total_builds":"Total des versions"}},"admin":{"actions":{"create":"créer","created":"créé","delete":"supprimer","deleted":"supprimé","update":"mise à jour","updated":"mis à jour"},"credentials":{"log_out":"Déconnection"},"delete":{"confirmation":"Oui, je suis sure","flash_confirmation":"%{name} a été détruit avec succès"},"flash":{"error":"%{name} n'a pas pu être %{action}","noaction":"Aucune action n'a été entreprise","successful":"%{name} a réussi à %{action}"},"history":{"name":"Historique","no_activity":"Aucune activité","page_name":"Historique pour %{name}"},"list":{"add_new":"Ajouter un nouveau","delete_action":"Supprimer","delete_selected":"Supprimer la sélection","edit_action":"Modifier","search":"Rechercher","select":"Sélectionner le %{name} à modifier","select_action":"Sélectionner","show_all":"Montrer tout"},"new":{"basic_info":"Information de base","cancel":"Annuler","chosen":"%{name} choisi","chose_all":"Choisir tout","clear_all":"Déselectionner tout","many_chars":"caractères ou moins","one_char":"caractère.","optional":"Optionnel","required":"Requis","save":"Sauvegarder","save_and_add_another":"Sauvegarder et en ajouter un autre","save_and_edit":"Sauvegarder et modifier","select_choice":"Faites vos choix et cliquez"},"dashboard":{"add_new":"Ajouter un nouveau","last_used":"Dernière utilisation","model_name":"Nom du modèle","modify":"Modification","name":"Tableau de bord","pagename":"Administration du site","records":"Enregistrements","show":"Voir","ago":"plus tôt"}},"home":{"name":"accueil"},"repository":{"duration":"Durée"},"devise":{"confirmations":{"confirmed":"Votre compte a été crée avec succès. Vous être maintenant connecté.","send_instructions":"Vous allez recevoir un courriel avec les instructions de confirmation de votre compte dans quelques minutes."},"failure":{"inactive":"Votre compte n'a pas encore été activé.","invalid":"Adresse courriel ou mot de passe invalide.","invalid_token":"Jeton d'authentification invalide.","locked":"Votre compte est bloqué.","timeout":"Votre session est expirée, veuillez vous reconnecter pour continuer.","unauthenticated":"Vous devez vous connecter ou vous enregistrer afin de continuer","unconfirmed":"Vous devez confirmer votre compte avant de continuer."},"mailer":{"confirmation_instructions":{"subject":"Instructions de confirmations"},"reset_password_instructions":{"subject":"Instruction de remise à zéro du mot de passe"},"unlock_instructions":{"subject":"Instruction de débloquage"}},"passwords":{"send_instructions":"Vous recevrez un courriel avec les instructions de remise à zéro du mot de passe dans quelques minutes.","updated":"Votre mot de passe a été changé avec succès. Vous êtes maintenant connecté."},"registrations":{"destroyed":"Au revoir! Votre compte a été annulé avec succès. Nous espérons vous revoir bientôt.","signed_up":"Vous êtes enregistré avec succès. Si activé, une confirmation vous a été envoyé par courriel.","updated":"Votre compte a été mis a jour avec succès"},"sessions":{"signed_in":"Connecté avec succès","signed_out":"Déconnecté avec succès"},"unlocks":{"send_instructions":"Vous recevrez un courriel contenant les instructions pour débloquer votre compte dans quelques minutes.","unlocked":"Votre compte a été débloqué avec succès."}},"errors":{"messages":{"already_confirmed":"étais déja confirmé","not_found":"n'a pas été trouvé","not_locked":"n'étais pas bloqué"}},"locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"ja":{"workers":"ワーカー","queue":"キュー","no_job":"ジョブはありません","repositories":{"branch":"ブランチ","image_url":"画像URL","markdown":".md","textile":".textile","rdoc":".rdoc","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻","tabs":{"current":"最新","build_history":"ビルド履歴","branches":"ブランチまとめ","build":"ビルド","job":"ジョブ"}},"build":{"job":"ジョブ","duration":"処理時間","finished_at":"終了時刻"},"jobs":{"messages":{"sponsored_by":"このテストは以下のスポンサーの協力で行いました。"},"build_matrix":"ビルドマトリクス","allowed_failures":"失敗許容範囲内","author":"制作者","config":"設定","compare":"比較","committer":"コミット者","branch":"ブランチ","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻"},"builds":{"name":"ビルド","messages":{"sponsored_by":"このテストは以下のスポンサーの協力で行いました。"},"build_matrix":"失敗許容範囲外","allowed_failures":"失敗許容範囲内","author":"制作者","config":"設定","compare":"比較","committer":"コミット者","branch":"ブランチ","commit":"コミット","message":"メッセージ","started_at":"開始時刻","duration":"処理時間","finished_at":"終了時刻"},"layouts":{"about":{"alpha":"まだアルファですよ!","join":"参加してみよう!","mailing_list":"メールリスト","messages":{"alpha":"Travis-ciは安定したサービスまで後一歩!詳しくはこちら"},"repository":"リポジトリ","twitter":"ツイッター"},"application":{"fork_me":"Githubでフォークしよう","my_repositories":"マイリポジトリ","recent":"最近","search":"検索","sponsers":"スポンサー","sponsors_link":"スポンサーをもっと見る →"},"top":{"blog":"ブログ","docs":"Travisとは?","github_login":"Githubでログイン","home":"ホーム","profile":"プロフィール","sign_out":"ログアウト","stats":"統計","admin":"管理"},"mobile":{"author":"制作者","build":"ビルド","build_matrix":"ビルドマトリクス","commit":"コミット","committer":"コミット者","compare":"比較","config":"設定","duration":"処理時間","finished_at":"終了時刻","job":"ジョブ","log":"ログ"}},"profiles":{"show":{"github":"Github","email":"メール","message":{"config":"詳細設定","your_repos":"以下のスイッチを設定し、Travis-ciを有効にします。Githubへプッシュしたらビルドは自動的に開始します。複数バーションや細かい設定はこちらへ:"},"messages":{"notice":"まずはTravisのはじめ方を参照してください。"},"token":"トークン","your_repos":"リポジトリ","update":"更新","update_locale":"更新","your_locale":"言語設定"}},"statistics":{"index":{"build_count":"ビルド数","count":"数","last_month":"先月","repo_growth":"リポジトリ","total_builds":"合計ビルド数","total_projects":"合計リポジトリ"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","pl":"Polski","ru":"Русский","nl":"Nederlands","pt-BR":"português brasileiro"}},"nb":{"admin":{"actions":{"create":"opprett","created":"opprettet","delete":"slett","deleted":"slettet","update":"oppdater","updated":"oppdatert"},"credentials":{"log_out":"Logg ut"},"dashboard":{"add_new":"Legg til ny","ago":"siden","last_used":"Sist brukt","model_name":"Modell","modify":"Rediger","name":"Dashbord","pagename":"Nettstedsadministrasjon","records":"Oppføringer","show":"Vis"},"delete":{"confirmation":"Ja, jeg er sikker","flash_confirmation":"%{name} ble slettet"},"flash":{"error":"%{name} kunne ikke bli %{action}","noaction":"Ingen handlinger ble utført","successful":"%{name} ble %{action}"},"history":{"name":"Logg","no_activity":"Ingen aktivitet","page_name":"Logg for %{name}"},"list":{"add_new":"Legg til ny","delete_action":"Slett","delete_selected":"Slett valgte","edit_action":"Rediger","search":"Søk","select":"Velg %{name} for å redigere","select_action":"Velg","show_all":"Vis alle "},"new":{"basic_info":"Basisinformasjon","cancel":"Avbryt","chosen":"Valgt %{name}","chose_all":"Velg alle","clear_all":"Fjern alle","many_chars":"eller færre tegn.","one_char":"tegn.","optional":"Valgfri","required":"Påkrevd","save":"Lagre","save_and_add_another":"Lagre og legg til ny","save_and_edit":"Lagre og rediger","select_choice":"Kryss av for dine valg og klikk"}},"build":{"duration":"Varighet","finished_at":"Fullført","job":"Jobb"},"builds":{"allowed_failures":"Tillatte feil","author":"Forfatter","branch":"Gren","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","message":"Beskrivelse","messages":{"sponsored_by":"Denne testen ble kjørt på en maskin sponset av"},"name":"Jobb","started_at":"Startet"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} time","other":"%{count} timer"},"minutes_exact":{"one":"%{count} minutt","other":"%{count} minutter"},"seconds_exact":{"one":"%{count} sekund","other":"%{count} sekunder"}}},"devise":{"confirmations":{"confirmed":"Din konto er aktivert og du er nå innlogget.","send_instructions":"Om noen få minutter så vil du få en e-post med informasjon om hvordan du bekrefter kontoen din."},"failure":{"inactive":"Kontoen din har ikke blitt aktivert enda.","invalid":"Ugyldig e-post eller passord.","invalid_token":"Ugyldig autentiseringskode.","locked":"Kontoen din er låst.","timeout":"Du ble logget ut siden på grunn av mangel på aktivitet, vennligst logg inn på nytt.","unauthenticated":"Du må logge inn eller registrere deg for å fortsette.","unconfirmed":"Du må bekrefte kontoen din før du kan fortsette."},"mailer":{"confirmation_instructions":{"subject":"Bekreftelsesinformasjon"},"reset_password_instructions":{"subject":"Instruksjoner for å få nytt passord"},"unlock_instructions":{"subject":"Opplåsningsinstruksjoner"}},"passwords":{"send_instructions":"Om noen få minutter så vil du få en epost med informasjon om hvordan du kan få et nytt passord.","updated":"Passordet ditt ble endret, og du er logget inn."},"registrations":{"destroyed":"Adjø! Kontoen din ble kansellert. Vi håper vi ser deg igjen snart.","signed_up":"Du er nå registrert.","updated":"Kontoen din ble oppdatert."},"sessions":{"signed_in":"Du er nå logget inn.","signed_out":"Du er nå logget ut."},"unlocks":{"send_instructions":"Om noen få minutter så kommer du til å få en e-post med informasjon om hvordan du kan låse opp kontoen din.","unlocked":"Kontoen din ble låst opp, og du er nå logget inn igjen."}},"errors":{"messages":{"already_confirmed":"har allerede blitt bekreftet","not_found":"ikke funnnet","not_locked":"var ikke låst"}},"home":{"name":"hjem"},"jobs":{"allowed_failures":"Tillatte feil","author":"Forfatter","branch":"Gren","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","message":"Beskrivelse","messages":{"sponsored_by":"Denne testserien ble kjørt på en maskin sponset av"},"started_at":"Startet"},"layouts":{"about":{"alpha":"Dette er alfa-greier.","join":"Bli med og hjelp oss!","mailing_list":"E-postliste","messages":{"alpha":"Dette er ikke en stabil tjeneste. Vi har fremdeles et stykke igjen! Mer informasjon finner du her."},"repository":"Kodelager","twitter":"Twitter."},"application":{"fork_me":"Se koden på Github","my_repositories":"Mine kodelagre","recent":"Nylig","search":"Søk","sponsers":"Sponsorer","sponsors_link":"Se alle de flotte sponsorene våre →"},"mobile":{"author":"Forfatter","build":"Jobb","build_matrix":"Jobbmatrise","commit":"Innsending","committer":"Innsender","compare":"Sammenlign","config":"Oppsett","duration":"Varighet","finished_at":"Fullført","job":"Jobb","log":"Logg"},"top":{"admin":"Administrator","blog":"Blogg","docs":"Dokumentasjon","github_login":"Logg inn med Github","home":"Hjem","profile":"Profil","sign_out":"Logg ut","stats":"Statistikk"}},"no_job":"Ingen jobber finnnes","profiles":{"show":{"email":"E-post","github":"Github","message":{"config":"hvordan sette opp egne jobbinnstillinger","your_repos":"Slå\u0010 på Travis for prosjektene dine ved å dra i bryterne under, og send koden til Github.
    \nFor å teste mot flere ruby-versjoner, se dokumentasjonen for"},"messages":{"notice":"For å komme i gang, vennligst les kom-i-gang-veivisereren vår. Det tar bare et par minutter."},"token":"Kode","update":"Oppdater","update_locale":"Oppdater","your_locale":"Ditt språk","your_repos":"Dine kodelagre"}},"queue":"Kø","repositories":{"branch":"Gren","commit":"Innsender","duration":"Varighet","finished_at":"Fullført","image_url":"Bilde-URL","markdown":"Markdown","message":"Beskrivelse","rdoc":"RDOC","started_at":"Startet","tabs":{"branches":"Grensammendrag","build":"Jobb","build_history":"Jobblogg","current":"Siste","job":"Jobb"},"textile":"Textile"},"repository":{"duration":"Varighet"},"statistics":{"index":{"build_count":"Antall jobber","count":"Antall","last_month":"siste måned","repo_growth":"Vekst i kodelager","total_builds":"Totale jobber","total_projects":"Antall prosjekter/kodelagre"}},"workers":"Arbeidere","locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"nl":{"admin":{"actions":{"create":"aanmaken","created":"aangemaakt","delete":"verwijderen","deleted":"verwijderd","update":"bijwerken","updated":"bijgewerkt"},"credentials":{"log_out":"Afmelden"},"dashboard":{"add_new":"Nieuwe toevoegen","ago":"geleden","last_used":"Laatst gebruikt","model_name":"Model naam","modify":"Wijzigen","pagename":"Site administratie","show":"Laten zien","records":"Gegevens"},"delete":{"confirmation":"Ja, ik ben zeker","flash_confirmation":"%{name} is vernietigd"},"flash":{"error":"%{name} kon niet worden %{action}","noaction":"Er zijn geen acties genomen","successful":"%{name} is %{action}"},"history":{"name":"Geschiedenis","no_activity":"Geen activiteit","page_name":"Geschiedenis van %{name}"},"list":{"add_new":"Nieuwe toevoegen","delete_action":"Verwijderen","delete_selected":"Verwijder geselecteerden","edit_action":"Bewerken","search":"Zoeken","select":"Selecteer %{name} om te bewerken","select_action":"Selecteer","show_all":"Laat allen zien"},"new":{"basic_info":"Basisinfo","cancel":"Annuleren","chosen":"%{name} gekozen","chose_all":"Kies allen","clear_all":"Deselecteer allen","many_chars":"tekens of minder.","one_char":"teken.","optional":"Optioneel","required":"Vereist","save":"Opslaan","save_and_add_another":"Opslaan en een nieuwe toevoegen","save_and_edit":"Opslaan en bewerken","select_choice":"Selecteer uw keuzes en klik"}},"build":{"duration":"Duur","finished_at":"Voltooid","job":"Taak"},"builds":{"allowed_failures":"Toegestane mislukkingen","author":"Auteur","branch":"Tak","build_matrix":"Bouw Matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid","message":"Bericht","messages":{"sponsored_by":"Deze tests zijn gedraaid op een machine gesponsord door"},"name":"Bouw","started_at":"Gestart","commit":"Commit","committer":"Committer"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} uur","other":"%{count} uren"},"minutes_exact":{"one":"%{count} minuut","other":"%{count} minuten"},"seconds_exact":{"one":"%{count} seconde","other":"%{count} seconden"}}},"devise":{"confirmations":{"confirmed":"Uw account is bevestigd. U wordt nu ingelogd.","send_instructions":"Binnen enkele minuten zal u een email ontvangen met instructies om uw account te bevestigen."},"failure":{"inactive":"Uw account is nog niet geactiveerd.","invalid":"Ongeldig email adres of wachtwoord.","invalid_token":"Ongeldig authenticatie token.","locked":"Uw account is vergrendeld.","timeout":"Uw sessie is verlopen, gelieve opnieuw in te loggen om verder te gaan.","unauthenticated":"U moet inloggen of u registeren voordat u verder gaat.","unconfirmed":"U moet uw account bevestigen voordat u verder gaat."},"mailer":{"confirmation_instructions":{"subject":"Bevestigings-instructies"},"reset_password_instructions":{"subject":"Wachtwoord herstel instructies"},"unlock_instructions":{"subject":"Ontgrendel-instructies"}},"passwords":{"send_instructions":"Binnen enkele minuten zal u een email krijgen met instructies om uw wachtwoord opnieuw in te stellen.","updated":"Uw wachtwoord is veranderd. U wordt nu ingelogd."},"registrations":{"destroyed":"Dag! Uw account is geannuleerd. We hopen u vlug terug te zien.","signed_up":"Uw registratie is voltooid. Als het ingeschakeld is wordt een bevestiging naar uw email adres verzonden.","updated":"Het bijwerken van uw account is gelukt."},"sessions":{"signed_in":"Inloggen gelukt.","signed_out":"Uitloggen gelukt."},"unlocks":{"send_instructions":"Binnen enkele minuten zal u een email krijgen met instructies om uw account te ontgrendelen.","unlocked":"Uw account is ontgrendeld. U wordt nu ingelogd."}},"errors":{"messages":{"already_confirmed":"was al bevestigd","not_found":"niet gevonden","not_locked":"was niet vergrendeld"}},"jobs":{"allowed_failures":"Toegestane mislukkingen","author":"Auteur","branch":"Tak","build_matrix":"Bouw matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid","message":"Bericht","messages":{"sponsored_by":"Deze testen zijn uitgevoerd op een machine gesponsord door"},"started_at":"Gestart","commit":"Commit","committer":"Committer"},"layouts":{"about":{"alpha":"Dit is in alfa-stadium.","join":"Doe met ons mee en help!","mailing_list":"Mailing lijst","messages":{"alpha":"Gelieve deze service niet te beschouwen als stabiel. Daar zijn we nog lang niet! Meer info hier."},"repository":"Repository","twitter":"Twitter"},"application":{"fork_me":"Maak een fork op Github","my_repositories":"Mijn repositories","recent":"Recent","search":"Zoeken","sponsers":"Sponsors","sponsors_link":"Bekijk al onze geweldige sponsors →"},"mobile":{"author":"Auteur","build":"Bouw","build_matrix":"Bouw matrix","compare":"Vergelijk","config":"Configuratie","duration":"Duur","finished_at":"Voltooid op","job":"Taak","commit":"Commit","committer":"Committer","log":"Logboek"},"top":{"admin":"Administratie","blog":"Blog","docs":"Documentatie","github_login":"Inloggen met Github","home":"Home","profile":"Profiel","sign_out":"Uitloggen","stats":"Statistieken"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","ru":"Русский","pt-BR":"português brasileiro"},"no_job":"Er zijn geen taken","profiles":{"show":{"email":"Email adres","github":"Github","message":{"config":"hoe eigen bouw-opties in te stellen","your_repos":"Zet de schakelaars hieronder aan om de Travis hook voor uw projecten te activeren en push daarna naar Github
    \nOm te testen tegen meerdere rubies, zie"},"messages":{"notice":"Om te beginnen kunt u onze startersgids lezen.\\n Het zal maar enkele minuten van uw tijd vergen."},"update":"Bijwerken","update_locale":"Bijwerken","your_locale":"Uw taal","your_repos":"Uw repositories","token":"Token"}},"queue":"Wachtrij","repositories":{"branch":"Tak","duration":"Duur","finished_at":"Voltooid","image_url":"Afbeeldings URL","message":"Bericht","started_at":"Gestart","tabs":{"branches":"Tak samenvatting","build":"Bouw","build_history":"Bouw geschiedenis","current":"Huidig","job":"Taak"},"commit":"Commit","markdown":"Markdown","rdoc":"RDOC","textile":"Textile"},"repository":{"duration":"Duur"},"statistics":{"index":{"build_count":"Bouw aantal","count":"Aantal","last_month":"voorbije maand","repo_growth":"Repository groei","total_builds":"Bouw totaal","total_projects":"Projecten/Repository totaal"}},"workers":"Machines","home":{"name":"Hoofdpagina"}},"pl":{"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} godzina","other":"%{count} godziny"},"minutes_exact":{"one":"%{count} minuta","other":"%{count} minuty"},"seconds_exact":{"one":"%{count} sekunda","other":"%{count} sekundy"}}},"workers":"Workers","queue":"Kolejka","no_job":"Brak zadań","repositories":{"branch":"Gałąź","image_url":"URL obrazka","markdown":"Markdown","textile":"Textile","rdoc":"RDOC","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono","tabs":{"current":"Aktualny","build_history":"Historia Buildów","branches":"Wszystkie Gałęzie","build":"Build","job":"Zadanie"}},"build":{"job":"Zadanie","duration":"Czas trwania","finished_at":"Zakończono"},"jobs":{"messages":{"sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"build_matrix":"Macierz Buildów","allowed_failures":"Dopuszczalne Niepowodzenia","author":"Autor","config":"Konfiguracja","compare":"Porównanie","committer":"Committer","branch":"Gałąź","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono","sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"builds":{"name":"Build","messages":{"sponsored_by":"Te testy zostały uruchomione na maszynie sponsorowanej przez"},"build_matrix":"Macierz Buildów","allowed_failures":"Dopuszczalne Niepowodzenia","author":"Autor","config":"Konfiguracja","compare":"Porównanie","committer":"Komitujący","branch":"Gałąź","commit":"Commit","message":"Opis","started_at":"Rozpoczęto","duration":"Czas trwania","finished_at":"Zakończono"},"layouts":{"top":{"home":"Start","blog":"Blog","docs":"Dokumentacja","stats":"Statystki","github_login":"Zaloguj się przy pomocy Githuba","profile":"Profil","sign_out":"Wyloguj się"},"application":{"fork_me":"Fork me on Github","recent":"Ostatnie","search":"Wyniki","sponsers":"Sponsorzy","sponsors_link":"Zobacz naszych wszystkich wspaniałych sponsorów →","my_repositories":"Moje repozytoria"},"about":{"alpha":"To wciąż jest wersja alpha.","messages":{"alpha":"Proszę nie traktuj tego jako stabilnej usługi. Wciąż nam wiele do tego brakuje! Więcej informacji znajdziesz tutaj."},"join":"Pomóż i dołącz do nas!","mailing_list":"Lista mailingowa","repository":"Repozytorium","twitter":"Twitter"},"mobile":{"author":"Autor","build":"Build","build_matrix":"Macierz Buildów","commit":"Commit","committer":"Komitujący","compare":"Porównianie","config":"Konfiguracja","duration":"Czas trwania","finished_at":"Zakończono","job":"Zadanie","log":"Log"}},"profiles":{"show":{"email":"Email","github":"Github","message":{"your_repos":" Przesuń suwak poniżej, aby włączyć Travisa, dla twoich projektów, a następnie umieść swój kod na GitHubie.
    \n Aby testować swój kod przy użyciu wielu wersji Rubiego, zobacz","config":"jak skonfigurować niestandardowe opcje builda"},"messages":{"notice":"Aby zacząć, przeczytaj nasz Przewodnik .\n Zajmie ci to tylko kilka minut."},"token":"Token","your_repos":"Twoje repozytoria"}},"statistics":{"index":{"count":"Ilość","repo_growth":"Przyrost repozytoriów","total_projects":"Łącznie projektów/repozytoriów","build_count":"Liczba buildów","last_month":"ostatni miesiąc","total_builds":"Łącznie Buildów"}},"date":{"abbr_day_names":["nie","pon","wto","śro","czw","pią","sob"],"abbr_month_names":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"day_names":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"formats":{"default":"%d-%m-%Y","long":"%B %d, %Y","short":"%d %b"},"month_names":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"order":["day","month","year"]},"errors":{"format":"%{attribute} %{message}","messages":{"accepted":"musi zostać zaakceptowane","blank":"nie może być puste"}},"locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}},"pt-BR":{"admin":{"actions":{"create":"criar","created":"criado","delete":"deletar","deleted":"deletado","update":"atualizar","updated":"atualizado"},"credentials":{"log_out":"Deslogar"},"dashboard":{"add_new":"Adicionar novo","ago":"atrás","last_used":"Última utilização","model_name":"Nome do modelo","modify":"Modificar","name":"Dashboard","pagename":"Administração do site","records":"Registros","show":"Mostrar"},"delete":{"confirmation":"Sim, tenho certeza","flash_confirmation":"%{name} foi destruído com sucesso"},"flash":{"error":"%{name} falhou ao %{action}","noaction":"Nenhuma ação foi tomada","successful":"%{name} foi %{action} com sucesso"},"history":{"name":"Histórico","no_activity":"Nenhuma Atividade","page_name":"Histórico para %{name}"},"list":{"add_new":"Adicionar novo","delete_action":"Deletar","delete_selected":"Deletar selecionados","edit_action":"Editar","search":"Buscar","select":"Selecionar %{name} para editar","select_action":"Selecionar","show_all":"Mostrar todos"},"new":{"basic_info":"Informações básicas","cancel":"Cancelar","chosen":"Escolhido %{name}","chose_all":"Escolher todos","clear_all":"Limpar todos","many_chars":"caracteres ou menos.","one_char":"caractere.","optional":"Opcional","required":"Requerido","save":"Salvar","save_and_add_another":"Salvar e adicionar outro","save_and_edit":"Salvar e alterar","select_choice":"Selecione e clique"}},"build":{"duration":"Duração","finished_at":"Concluído em","job":"Trabalho"},"builds":{"allowed_failures":"Falhas Permitidas","author":"Autor","branch":"Branch","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","message":"Mensagem","messages":{"sponsored_by":"Esta série de testes foi executada em uma caixa de processos patrocinada por"},"name":"Build","started_at":"Iniciou em"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} hora","other":"%{count} horas"},"minutes_exact":{"one":"%{count} minuto","other":"%{count} minutos"},"seconds_exact":{"one":"%{count} segundo","other":"%{count} segundos"}}},"devise":{"confirmations":{"confirmed":"Sua conta foi confirmada com sucesso. Você agora está logado.","send_instructions":"Você receberá um email com instruções de como confirmar sua conta em alguns minutos."},"failure":{"inactive":"Sua conta ainda não foi ativada.","invalid":"Email ou senha inválidos.","invalid_token":"Token de autenticação inválido.","locked":"Sua conta está trancada.","timeout":"Sua sessão expirou, por favor faça seu login novamente.","unauthenticated":"Você precisa fazer o login ou cadastrar-se antes de continuar.","unconfirmed":"Você precisa confirmar sua conta antes de continuar."},"mailer":{"confirmation_instructions":{"subject":"Instruções de confirmação"},"reset_password_instructions":{"subject":"Instruções de atualização de senha"},"unlock_instructions":{"subject":"Instruções de destrancamento"}},"passwords":{"send_instructions":"Você receberá um email com instruções de como atualizar sua senha em alguns minutos.","updated":"Sua senha foi alterada com sucesso. Você agora está logado."},"registrations":{"destroyed":"Tchau! Sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve!","signed_up":"Você se cadastrou com sucesso. Se ativada, uma confirmação foi enviada para seu email.","updated":"Você atualizou sua conta com sucesso."},"sessions":{"signed_in":"Logado com sucesso.","signed_out":"Deslogado com sucesso."},"unlocks":{"send_instructions":"Você receberá um email com instruções de como destrancar sua conta em alguns minutos.","unlocked":"Sua conta foi destrancada com sucesso. Você agora está logado."}},"errors":{"messages":{"already_confirmed":"já foi confirmado","not_found":"não encontrado","not_locked":"não estava trancado"}},"home":{"name":"home"},"jobs":{"allowed_failures":"Falhas Permitidas","author":"Autor","branch":"Branch","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","message":"Mensagem","messages":{"sponsored_by":"Esta série de testes foi executada em uma caixa de processos patrocinada por"},"started_at":"Iniciou em"},"layouts":{"about":{"alpha":"Isto é um alpha.","join":"Junte-se à nós e ajude!","mailing_list":"Lista de email","messages":{"alpha":"Por favor, não considere isto um serviço estável. Estamos muito longe disso! Mais informações aqui."},"repository":"Repositório","twitter":"Twitter"},"application":{"fork_me":"Faça fork no Github","my_repositories":"Meus Repositórios","recent":"Recentes","search":"Buscar","sponsers":"Patrocinadores","sponsors_link":"Conheça todos os nossos patrocinadores →"},"mobile":{"author":"Autor","build":"Build","build_matrix":"Matriz de Build","commit":"Commit","committer":"Committer","compare":"Comparar","config":"Config","duration":"Duração","finished_at":"Concluído em","job":"Trabalho","log":"Log"},"top":{"admin":"Admin","blog":"Blog","docs":"Documentação","github_login":"Logue com o Github","home":"Home","profile":"Perfil","sign_out":"Sair","stats":"Estatísticas"}},"locales":{"en":"English","es":"Español","fr":"Français","ja":"日本語","nb":"Norsk Bokmål","nl":"Nederlands","pl":"Polski","ru":"Русский","pt-BR":"português brasileiro"},"no_job":"Não há trabalhos","profiles":{"show":{"email":"Email","github":"Github","message":{"config":"como configurar opções de build","your_repos":"Use os botões abaixo para ligar ou desligar o hook de serviço do Travis para seus projetos, e então, faça um push para o Github.
    Para testar com múltiplas versões do Ruby, leia"},"messages":{"notice":"Para começar, leia nosso Guia de início. Só leva alguns minutinhos."},"token":"Token","update":"Atualizar","update_locale":"Atualizar","your_locale":"Sua língua","your_repos":"Seus Repositórios"}},"queue":"Fila","repositories":{"branch":"Branch","commit":"Commit","duration":"Duração","finished_at":"Concluído em","image_url":"URL da imagem","markdown":"Markdown","message":"Mensagem","rdoc":"RDOC","started_at":"Iniciou em","tabs":{"branches":"Sumário do Branch","build":"Build","build_history":"Histórico de Build","current":"Atual","job":"Trabalho"},"textile":"Textile"},"repository":{"duration":"Duração"},"statistics":{"index":{"build_count":"Número de Builds","count":"Número","last_month":"último mês","repo_growth":"Crescimento de Repositório","total_builds":"Total de Builds","total_projects":"Total de Projetos/Repositórios"}},"workers":"Processos"},"ru":{"admin":{"actions":{"create":"создать","created":"создано","delete":"удалить","deleted":"удалено","update":"обновить","updated":"обновлено"},"credentials":{"log_out":"Выход"},"dashboard":{"add_new":"Добавить","ago":"назад","last_used":"Использовалось в последний раз","model_name":"Имя модели","modify":"Изменить","name":"Панель управления","pagename":"Управление сайтом","records":"Записи","show":"Показать"},"delete":{"confirmation":"Да, я уверен","flash_confirmation":"%{name} успешно удалено"},"history":{"name":"История","no_activity":"Нет активности","page_name":"История %{name}"},"list":{"add_new":"Добавить","delete_action":"Удалить","delete_selected":"Удалить выбранные","edit_action":"Редактировать","search":"Поиск","select":"Для редактирования выберите %{name}","select_action":"Выбрать","show_all":"Показать все"},"new":{"basic_info":"Основная информация","cancel":"Отмена","chosen":"Выбрано %{name}","chose_all":"Выбрать все","clear_all":"Очистить все","one_char":"символ.","optional":"Необязательно","required":"Обязательно","save":"Сохранить","save_and_add_another":"Сохранить и добавить другое","save_and_edit":"Сохранить и продолжить редактирование","select_choice":"Выберите и кликните","many_chars":"символов или меньше."},"flash":{"error":"%{name} не удалось %{action}","noaction":"Никаких действий не произведено","successful":"%{name} было успешно %{action}"}},"build":{"duration":"Длительность","finished_at":"Завершен","job":"Задача"},"builds":{"allowed_failures":"Допустимые неудачи","author":"Автор","branch":"Ветка","build_matrix":"Матрица","commit":"Коммит","committer":"Коммитер","compare":"Дифф","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","message":"Комментарий","messages":{"sponsored_by":"Эта серия тестов была запущена на машине, спонсируемой"},"name":"Билд","started_at":"Начало"},"datetime":{"distance_in_words":{"hours_exact":{"one":"%{count} час","few":"%{count} часа","many":"%{count} часов","other":"%{count} часа"},"minutes_exact":{"one":"%{count} минута","few":"%{count} минуты","many":"%{count} минут","other":"%{count} минуты"},"seconds_exact":{"one":"%{count} секунда","few":"%{count} секунды","many":"%{count} секунд","other":"%{count} секунды"}}},"devise":{"confirmations":{"confirmed":"Ваш аккаунт успешно подтвержден. Приветствуем!","send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциями для прохождения процедуры подтверждения аккаунта."},"failure":{"inactive":"Ваш аккаунт еще не активирован.","invalid":"Ошибка в адресе почты или пароле.","invalid_token":"Неправильный токен аутентификации.","locked":"Ваш аккаунт заблокирован.","timeout":"Сессия окончена. Для продолжения работы войдите снова.","unauthenticated":"Вам нужно войти или зарегистрироваться.","unconfirmed":"Вы должны сначала подтвердить свой аккаунт."},"mailer":{"confirmation_instructions":{"subject":"Инструкции для подтверждению аккаунта"},"reset_password_instructions":{"subject":"Инструкции для сброса пароля"},"unlock_instructions":{"subject":"Инструкции для разблокирования аккаунта"}},"passwords":{"send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциями для сброса пароля.","updated":"Ваш пароль успешно изменен. Приветствуем!"},"registrations":{"destroyed":"Ваш аккаунт был успешно удален. Живите долго и процветайте!","signed_up":"Вы успешно прошли регистрацию. Инструкции для подтверждения аккаунта отправлены на ваш электронный адрес.","updated":"Аккаунт успешно обновлен."},"sessions":{"signed_in":"Приветствуем!","signed_out":"Удачи!"},"unlocks":{"send_instructions":"В течении нескольких минут вы получите электронное письмо с инструкциям для разблокировния аккаунта.","unlocked":"Ваш аккаунт успешно разблокирован. Приветствуем!"}},"errors":{"messages":{"already_confirmed":"уже подтвержден","not_found":"не найден","not_locked":"не заблокирован"}},"home":{"name":"Главная"},"jobs":{"allowed_failures":"Допустимые неудачи","author":"Автор","branch":"Ветка","build_matrix":"Матрица","commit":"Коммит","committer":"Коммитер","compare":"Сравнение","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","message":"Комментарий","messages":{"sponsored_by":"Эта серия тестов была запущена на машине спонсируемой"},"started_at":"Начало"},"layouts":{"about":{"alpha":"Это альфа-версия","join":"Присоединяйтесь к нам и помогайте!","mailing_list":"Лист рассылки","messages":{"alpha":"Пожалуйста, не считайте данный сервис стабильным. Мы еще очень далеки от стабильности! Подробности"},"repository":"Репозиторий","twitter":"Twitter"},"application":{"fork_me":"Fork me on Github","my_repositories":"Мои репозитории","recent":"Недавние","search":"Поиск","sponsers":"Спонсоры","sponsors_link":"Список всех наших замечательных спонсоров →"},"mobile":{"author":"Автор","build":"Сборка","build_matrix":"Матрица сборок","commit":"Коммит","committer":"Коммитер","compare":"Сравнение","config":"Конфигурация","duration":"Длительность","finished_at":"Завершен","job":"Задача","log":"Журнал"},"top":{"admin":"Управление","blog":"Блог","docs":"Документация","github_login":"Войти через Github","home":"Главная","profile":"Профиль","sign_out":"Выход","stats":"Статистика"}},"no_job":"Очередь пуста","profiles":{"show":{"email":"Электронная почта","github":"Github","message":{"config":"как настроить специальные опции билда","your_repos":"Используйте переключатели, чтобы включить Travis service hook для вашего проекта, а потом отправьте код на GitHub.
    \nДля тестирования на нескольких версиях Ruby смотрите"},"messages":{"notice":"Перед началом, пожалуйста, прочтите Руководство для быстрого старта. Это займет всего несколько минут."},"token":"Токен","update":"Обновить","update_locale":"Обновить","your_locale":"Ваш язык","your_repos":"Ваши репозитории"}},"queue":"Очередь","repositories":{"branch":"Ветка","commit":"Коммит","duration":"Длительность","finished_at":"Завершен","image_url":"URL изображения","markdown":"Markdown","message":"Комментарий","rdoc":"RDOC","started_at":"Начало","tabs":{"branches":"Статус веток","build":"Билд","build_history":"История","current":"Текущий","job":"Задача"},"textile":"Textile"},"repository":{"duration":"Длительность"},"statistics":{"index":{"build_count":"Количество билдов","count":"Количество","last_month":"прошлый месяц","repo_growth":"Рост числа репозиториев","total_builds":"Всего билдов","total_projects":"Всего проектов/репозиториев"}},"workers":"Машины","locales":{"en":"English","es":"Español","ja":"日本語","ru":"Русский","fr":"Français","nb":"Norsk Bokmål","pl":"Polski","nl":"Nederlands","pt-BR":"português brasileiro"}}}; diff --git a/assets/javascripts/travis.coffee b/assets/javascripts/travis.coffee index 7c995bea..4e8093a8 100644 --- a/assets/javascripts/travis.coffee +++ b/assets/javascripts/travis.coffee @@ -8,7 +8,9 @@ require 'ext/ember/namespace' CONFIG_KEYS: ['rvm', 'gemfile', 'env', 'jdk', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala'] ROUTES: - 'profile': ['profile', 'show'] + 'profile': ['profile', 'hooks'] + 'profile/:login': ['profile', 'hooks'] + 'profile/:login/profile': ['profile', 'user'] 'stats': ['stats', 'show'] ':owner/:name/jobs/:id/:line': ['home', 'job'] ':owner/:name/jobs/:id': ['home', 'job'] diff --git a/assets/javascripts/vendor/ember-data.js b/assets/javascripts/vendor/ember-data.js index 82dd91f1..823d77df 100644 --- a/assets/javascripts/vendor/ember-data.js +++ b/assets/javascripts/vendor/ember-data.js @@ -1748,7 +1748,6 @@ DS.Store = Ember.Object.extend({ loadMany: function(type, ids, hashes) { var clientIds = Ember.A([]); - if (hashes === undefined) { hashes = ids; ids = []; @@ -3132,8 +3131,8 @@ DS.Model = Ember.Object.extend(Ember.Evented, { if (cachedValue) { var key = association.options.key || get(this, 'namingConvention').keyToJSONKey(name), ids = data.get(key) || []; - - var clientIds; + + var clientIds; if(association.options.embedded) { clientIds = store.loadMany(association.type, ids).clientIds; } else { @@ -3141,7 +3140,7 @@ DS.Model = Ember.Object.extend(Ember.Evented, { return store.clientIdForId(association.type, id); }); } - + set(cachedValue, 'content', Ember.A(clientIds)); cachedValue.fetch(); } @@ -3766,7 +3765,7 @@ DS.FixtureAdapter = DS.Adapter.extend({ return ids.indexOf(item.id) !== -1; }); } - + if (fixtures) { this.simulateRemoteCall(function() { store.loadMany(type, fixtures); @@ -3786,7 +3785,7 @@ DS.FixtureAdapter = DS.Adapter.extend({ findQuery: function(store, type, query, array) { var fixtures = this.fixturesForType(type); - + Ember.assert("Unable to find fixtures for model type "+type.toString(), !!fixtures); fixtures = this.queryFixtures(fixtures, query); @@ -3847,7 +3846,7 @@ var get = Ember.get, set = Ember.set; DS.RESTAdapter = DS.Adapter.extend({ bulkCommit: false, - + createRecord: function(store, type, record) { var root = this.rootForType(type); diff --git a/assets/javascripts/vendor/jquery.cookie.js b/assets/javascripts/vendor/jquery.cookie.js new file mode 100644 index 00000000..dca4d2ef --- /dev/null +++ b/assets/javascripts/vendor/jquery.cookie.js @@ -0,0 +1,40 @@ +/** + * jQuery Cookie plugin + * + * Copyright (c) 2010 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ +jQuery.cookie = function (key, value, options) { + // key and at least value given, set cookie... + if (arguments.length > 1 && String(value) !== "[object Object]") { + options = jQuery.extend({}, options); + + if (value === null || value === undefined) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + value = String(value); + return (document.cookie = [ + encodeURIComponent(key), '=', + options.raw ? value : encodeURIComponent(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // key and possibly options given, get cookie... + options = value || {}; + var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; + return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; +}; + diff --git a/assets/stylesheets/left.sass b/assets/stylesheets/left.sass index 66bdf7a2..c74a5989 100644 --- a/assets/stylesheets/left.sass +++ b/assets/stylesheets/left.sass @@ -1,6 +1,7 @@ @import "compass" -body#home +body#home, +body#profile background: inline-image('ui/background-left.png') repeat-y -27px top #left diff --git a/assets/stylesheets/left/list.sass b/assets/stylesheets/left/list.sass new file mode 100644 index 00000000..a50577b7 --- /dev/null +++ b/assets/stylesheets/left/list.sass @@ -0,0 +1,62 @@ +@import "compass" + +#owners, +#repositories + li + position: relative + font-size: 16px + overflow: visible + padding: 15px 25px 15px 45px + border-bottom: 1px solid #ccc + background-position: 24px 16px + background-repeat: no-repeat + + &:nth-child(odd) + background-color: #fff + &:nth-child(even) + background-color: #f6f6f6 + + &.green a + color: green + &.red a + color: #c00 + + .last_build + float: right + + .summary + margin: 5px 0 0 0 + font-size: 13px + color: #666 + + .description + margin: 5px 0 0 0 + font-size: 13px + color: #666 + display: none + + .indicator + display: none + + &.selected .indicator + display: block + position: absolute + top: 0px + right: -17px + width: 17px + height: 100% + background: no-repeat center left + + .loading + padding: 15px 25px 15px 30px + background-color: #fff + +#owners + li + margin-left: -4px + padding-left: 52px + &.user + background-image: inline-image('icons/user.small.png') + background-position: 29px 17px + &.org + background-image: inline-image('icons/org.small.png') diff --git a/assets/stylesheets/left/repositories.sass b/assets/stylesheets/left/repositories.sass deleted file mode 100644 index 43f6e11e..00000000 --- a/assets/stylesheets/left/repositories.sass +++ /dev/null @@ -1,51 +0,0 @@ -@import "compass" - -#repositories li - position: relative - font-size: 16px - overflow: visible - padding: 15px 25px 15px 45px - border-bottom: 1px solid #ccc - background-position: 24px 16px - background-repeat: no-repeat - - &:nth-child(odd) - background-color: #fff - &:nth-child(even) - background-color: #f6f6f6 - - &.green a - color: green - &.red a - color: #c00 - - .last_build - float: right - - .summary - margin: 5px 0 0 0 - font-size: 13px - color: #666 - - .description - margin: 5px 0 0 0 - font-size: 13px - color: #666 - display: none - - .indicator - display: none - - &.selected .indicator - display: block - position: absolute - top: 0px - right: -17px - width: 17px - height: 100% - background: no-repeat center left - -#repositories - .loading - padding: 15px 25px 15px 30px - background-color: #fff diff --git a/assets/stylesheets/main.sass b/assets/stylesheets/main.sass index 329bffbb..4a39c645 100644 --- a/assets/stylesheets/main.sass +++ b/assets/stylesheets/main.sass @@ -1,7 +1,8 @@ #main position: relative -#home +#home, +#profile #main min-height: 1000px padding: 20px 270px 30px 430px @@ -12,17 +13,17 @@ &.maximized padding: 60px 100px 30px 440px - .tabs - #tab_build, - #tab_job - display: none + .tabs + #tab_build, + #tab_job + display: none - .tabs - #tab_build.display, - #tab_job.display - display: inline-block -#stats, -#profile + .tabs + #tab_build.display, + #tab_job.display + display: inline-block + +#stats #main width: 600px padding: 20px 0 0 0 diff --git a/assets/stylesheets/profile.sass b/assets/stylesheets/profile.sass index d1a28678..1f2f5606 100644 --- a/assets/stylesheets/profile.sass +++ b/assets/stylesheets/profile.sass @@ -1,47 +1,55 @@ @import "compass" #profile - a - text-decoration: underline + #main + h3 + margin: 15px 60px 0 0 + font-size: 24px + line-height: 24px + color: #666 - img - float: left - margin: 3px 15px 0 0 - @include border-radius(4px) + h4 + font-size: 15px + color: #666 - dl - margin: 0 0 20px 18px - color: #666 - font-size: 13px + img + float: left + margin: 3px 15px 0 0 + @include border-radius(4px) - dt - display: block - float: left - width: 50px - - dd - clear: right - - #welcome - margin-top: -35px - margin-bottom: 35px - font-size: 13px - h4, p - margin-bottom: 4px - - p.notice - background-color: #a8eb75 - padding: 10px - @include border-radius(4px) - a - text-decoration: underline - small + dl + margin: 0 0 20px 18px + color: #666 font-size: 13px + + dt display: block + float: left + width: 50px - p.tip - font-size: 13px - margin-top: -10px + dd + clear: right - .highlight - color: #C7371A + #welcome + margin-top: -35px + margin-bottom: 35px + font-size: 13px + h4, p + margin-bottom: 4px + + p.notice + background-color: #a8eb75 + padding: 10px + @include border-radius(4px) + a + text-decoration: underline + small + font-size: 13px + display: block + + p.tip + font-size: 13px + margin-top: -10px + + .highlight + color: #C7371A diff --git a/assets/stylesheets/right/slider.sass b/assets/stylesheets/right/slider.sass index 9e1ddc08..200cb1b4 100644 --- a/assets/stylesheets/right/slider.sass +++ b/assets/stylesheets/right/slider.sass @@ -29,27 +29,26 @@ $slider-border-hover: #e1e2e6 .icon border-color: $slider-border-hover $slider-border-hover $slider-border-hover $slider-border-light -#home.maximized - #top .profile - margin-right: 10px +#home, +#profile + &.maximized + #main + padding-right: 40px - #main - padding-right: 40px + #right + width: 0 + padding: 0 + *:not(#slider):not(.icon):not(.ember-view) + display: none - #right - width: 0 - padding: 0 - *:not(#slider):not(.icon):not(.ember-view) - display: none - - #slider - left: -20px - width: 20px - z-index: 50 - .icon - border-color: $slider-border-normal $slider-border-light $slider-border-normal $slider-border-normal - border-width: 5px 5px 5px 0 - - &:hover + #slider + left: -20px + width: 20px + z-index: 50 .icon - border-color: $slider-border-hover $slider-border-light $slider-border-hover $slider-border-hover + border-color: $slider-border-normal $slider-border-light $slider-border-normal $slider-border-normal + border-width: 5px 5px 5px 0 + + &:hover + .icon + border-color: $slider-border-hover $slider-border-light $slider-border-hover $slider-border-hover diff --git a/assets/stylesheets/tabs.sass b/assets/stylesheets/tabs.sass index 08f16c12..bbacab73 100644 --- a/assets/stylesheets/tabs.sass +++ b/assets/stylesheets/tabs.sass @@ -49,3 +49,8 @@ .tab margin-top: 20px + +#profile + #main + .tab + margin: 30px 0 0 12px diff --git a/assets/stylesheets/top.sass b/assets/stylesheets/top.sass index e9aaca0a..6528a626 100644 --- a/assets/stylesheets/top.sass +++ b/assets/stylesheets/top.sass @@ -2,9 +2,9 @@ #top color: #ccc - width: 100% line-height: 40px font-size: 13px + padding-right: 30px @include background(linear-gradient(#444, #111)) h1 @@ -22,6 +22,10 @@ color: #ccc text-decoration: none +#home:not(.maximized) + #top + padding-right: 140px + #navigation li display: inline-block @@ -37,19 +41,23 @@ &:hover color: white - .profile + li.profile position: relative float: right - margin-right: 120px img position: absolute top: 7px - left: 12px + left: 15px + width: 24px + height: 24px @include border-radius(3px) - a - padding: 0 35px 0 45px + & > a + padding: 0 15px 0 54px + + &:hover > ul + display: block ul display: none @@ -69,10 +77,9 @@ a display: block - padding: 5px 35px 5px 45px + padding: 5px 0 5px 54px line-height: 24px white-space: nowrap &:hover background-color: #555 - diff --git a/public/images/icons/glyphicons_003_user.png b/public/images/icons/glyphicons_003_user.png new file mode 100644 index 00000000..8e49bf4d Binary files /dev/null and b/public/images/icons/glyphicons_003_user.png differ diff --git a/public/images/icons/glyphicons_043_group.png b/public/images/icons/glyphicons_043_group.png new file mode 100644 index 00000000..25689ddb Binary files /dev/null and b/public/images/icons/glyphicons_043_group.png differ diff --git a/public/images/icons/glyphicons_050_link.png b/public/images/icons/glyphicons_050_link.png new file mode 100644 index 00000000..59def874 Binary files /dev/null and b/public/images/icons/glyphicons_050_link.png differ diff --git a/public/images/icons/group.png b/public/images/icons/group.png new file mode 100644 index 00000000..1572a32e Binary files /dev/null and b/public/images/icons/group.png differ diff --git a/public/images/icons/group.small.png b/public/images/icons/group.small.png new file mode 100644 index 00000000..056e99b2 Binary files /dev/null and b/public/images/icons/group.small.png differ diff --git a/public/images/icons/link.png b/public/images/icons/link.png new file mode 100644 index 00000000..59def874 Binary files /dev/null and b/public/images/icons/link.png differ diff --git a/public/images/icons/link.small.png b/public/images/icons/link.small.png new file mode 100644 index 00000000..10dd6fed Binary files /dev/null and b/public/images/icons/link.small.png differ diff --git a/public/images/icons/org.png b/public/images/icons/org.png new file mode 100644 index 00000000..25689ddb Binary files /dev/null and b/public/images/icons/org.png differ diff --git a/public/images/icons/org.small.png b/public/images/icons/org.small.png new file mode 100644 index 00000000..b5afd5fa Binary files /dev/null and b/public/images/icons/org.small.png differ diff --git a/public/images/icons/user.png b/public/images/icons/user.png new file mode 100644 index 00000000..eb9d8265 Binary files /dev/null and b/public/images/icons/user.png differ diff --git a/public/images/icons/user.small.png b/public/images/icons/user.small.png new file mode 100644 index 00000000..a414e485 Binary files /dev/null and b/public/images/icons/user.small.png differ diff --git a/public/index.html b/public/index.html index 70baed39..6434e9a3 100644 --- a/public/index.html +++ b/public/index.html @@ -14,8 +14,8 @@ Travis.Pusher.KEY = '23ed642e81512118260e' Travis.run() - Travis.app.store.load(Travis.User, { id: 1, login: 'svenfuchs', name: 'Sven Fuchs', email: 'me@svenfuchs.com', token: '1234567890', gravatar: '402602a60e500e85f2f5dc1ff3648ecb' }); - Travis.set('currentUser', Travis.User.find(1)) + // Travis.app.store.load(Travis.User, { id: 1, login: 'svenfuchs', name: 'Sven Fuchs', email: 'me@svenfuchs.com', token: '1234567890', gravatar: '402602a60e500e85f2f5dc1ff3648ecb' }); + // Travis.set('currentUser', Travis.User.find(1)) diff --git a/public/javascripts/application.js b/public/javascripts/application.js index d63be4fe..a8b90492 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1 +1 @@ -minispade.register('templates', "(function() {Ember.TEMPLATES['builds/list']=Ember.Handlebars.compile(\"\\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 {{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\");Ember.TEMPLATES['builds/show']=Ember.Handlebars.compile(\"{{#with view}}\\n {{#if build.isLoaded}}\\n
    \\n
    \\n
    \\n
    {{t builds.name}}
    \\n
    {{build.number}}
    \\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 {{#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
    \\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}}
    {{number}}{{formatDuration duration}}{{formatTime finishedAt}}{{value}}
    \\n\\n {{#unless required}}\\n
    \\n
    {{t \\\"jobs.allowed_failures\\\"}}
    \\n
    \\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. This lets you add\\n in experimental and preparatory builds to test against versions or\\n configurations that you are not ready to officially support.\\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
    \\n {{/unless}}\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/log']=Ember.Handlebars.compile(\"{{view.logSubscriber}}\\n\\n{{#if log.isLoaded}}\\n
    {{{formatLog log.body}}}
    \\n\\n {{#if sponsor.name}}\\n

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

    \\n {{/if}}\\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 {{outlet left}}\\n
    \\n\\n
    \\n {{outlet main}}\\n\\n
    \\n {{outlet right}}\\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.alpha}}

    \\n

    {{{t layouts.about.messages.alpha}}}

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

    {{t layouts.about.join}}

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

    Travis

    \\n
    \\n\\n\\n\");Ember.TEMPLATES['profile/hooks']=Ember.Handlebars.compile(\"{{#if content.length}}\\n \\n{{else}}\\n

    Please wait while we sync with GitHub

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

    {{name}}

    \\n\\n\\n
    \\n
    \\n {{t profiles.show.github}}:\\n
    \\n
    \\n {{login}}\\n
    \\n
    \\n {{t profiles.show.email}}:\\n
    \\n
    \\n {{email}}\\n
    \\n
    \\n {{t profiles.show.token}}:\\n
    \\n
    \\n {{token}}\\n
    \\n
    \\n\\n

    \\n {{{t profiles.show.messages.notice}}}\\n

    \\n\\n

    {{t profiles.show.your_locale}}

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

    {{t profiles.show.your_repos}}

    \\n

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

    \\n\\n{{outlet hooks}}\\n\");Ember.TEMPLATES['queues/list']=Ember.Handlebars.compile(\"{{#each queue in controller}}\\n

    {{t queue}}: {{queue.name}}

    \\n \\n{{/each}}\\n\");Ember.TEMPLATES['repos/list']=Ember.Handlebars.compile(\"
    \\n {{view Ember.TextField valueBinding=\\\"controller.search\\\"}}\\n
    \\n\\n{{view Travis.ReposListTabsView}}\\n\\n
    \\n {{#collection Travis.RepositoriesListView contentBinding=\\\"controller\\\"}}\\n {{#with view.repository}}\\n {{slug}}\\n #{{lastBuildNumber}}\\n\\n

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

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

    {{description}}

    \\n {{/if}}\\n \\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 {{/with}}\\n\\n {{else}}\\n Loading\\n {{/if}}\\n\\n
    \\n\\n {{outlet pane}}\\n
    \\n
    \\n\\n\");Ember.TEMPLATES['repos/show/tabs']=Ember.Handlebars.compile(\"\\n\\n
    \\n \\n
    \\n

    \\n \\n {{view Ember.Select contentBinding=\\\"view.branches\\\" selectionBinding=\\\"view.branch\\\" optionLabelPath=\\\"content.commit.branch\\\" optionValuePath=\\\"content.commit.branch\\\"}}\\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(\"

    {{t workers}}

    \\n\\n\\n\");\n})();\n//@ sourceURL=templates");minispade.register('app', "(function() {(function() {\nminispade.require('travis');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('store');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Ember.ENV.RAISE_ON_DEPRECATION = true;\n\n Travis.reopen({\n App: Em.Application.extend({\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.routes = new Travis.Routes();\n return this.pusher = new Travis.Pusher();\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 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 })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('controllers', "(function() {(function() {\nminispade.require('helpers');\nminispade.require('travis/ticker');\n\n Travis.reopen({\n Controller: Em.Controller.extend({\n init: function() {\n var klass, name, _i, _len, _ref, _results;\n _ref = Array.prototype.slice.apply(arguments);\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n name = _ref[_i];\n name = \"\" + ($.camelize(name, false)) + \"Controller\";\n klass = Travis[$.camelize(name)] || Em.Controller;\n _results.push(this[name] = klass.create({\n parent: this,\n namespace: Travis,\n controllers: this\n }));\n }\n return _results;\n },\n connectTop: function() {\n this.connectOutlet({\n outletName: 'top',\n controller: this.topController,\n viewClass: Travis.TopView\n });\n return this.topController.set('tab', this.get('name'));\n },\n connectOutlet: function() {\n var view, _connectedOutletViews;\n view = this._super.apply(this, arguments);\n if (view) {\n _connectedOutletViews = Travis.app.get('_connectedOutletViews');\n if (!_connectedOutletViews) {\n _connectedOutletViews = [];\n }\n _connectedOutletViews.pushObject(view);\n Travis.app.set('_connectedOutletViews', _connectedOutletViews);\n }\n return view;\n }\n }),\n TopController: Em.Controller.extend({\n userBinding: 'Travis.currentUser'\n })\n });\nminispade.require('controllers/builds');\nminispade.require('controllers/home');\nminispade.require('controllers/profile');\nminispade.require('controllers/repositories');\nminispade.require('controllers/repository');\nminispade.require('controllers/sidebar');\nminispade.require('controllers/stats');\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers");minispade.register('controllers/builds', "(function() {(function() {\n\n Travis.BuildsController = Em.ArrayController.extend({\n repositoryBinding: 'parent.repository',\n contentBinding: 'parent.builds'\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/builds");minispade.register('controllers/home', "(function() {(function() {\n\n Travis.HomeController = Travis.Controller.extend({\n name: 'home',\n init: function() {\n this._super('top', 'repositories', 'repository', 'sidebar');\n this.connectTop();\n this.connectOutlet({\n outletName: 'left',\n controller: this.repositoriesController,\n viewClass: Travis.RepositoriesView\n });\n this.connectOutlet({\n outletName: 'main',\n controller: this.repositoryController,\n viewClass: Travis.RepositoryView\n });\n return this.connectOutlet({\n outletName: 'right',\n controller: this.sidebarController,\n viewClass: Travis.SidebarView\n });\n },\n activate: function(action, params) {\n return this.repositoryController.activate(action, params);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/home");minispade.register('controllers/profile', "(function() {(function() {\n\n Travis.reopen({\n ProfileController: Travis.Controller.extend({\n name: 'profile',\n init: function() {\n return this._super('top', 'user', 'hooks');\n },\n connect: function(parent) {\n this._super(parent);\n return this.connectTop();\n },\n viewShow: function(params) {\n this.connectUser(this.currentUser);\n return this.connectHooks(Travis.Hook.find());\n },\n connectUser: function(user) {\n return this.profileController.connectOutlet({\n outletName: 'main',\n name: 'user',\n context: user\n });\n },\n connectHooks: function(hooks) {\n if (hooks) {\n return this.userController.connectOutlet({\n outletName: 'hooks',\n name: 'hooks',\n context: hooks\n });\n }\n }\n }),\n UserController: Em.Controller.extend(),\n HooksController: Em.ArrayController.extend()\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/profile");minispade.register('controllers/repositories', "(function() {(function() {\n\n Travis.RepositoriesController = Ember.ArrayController.extend({\n defaultTab: 'recent',\n sortProperties: ['sortOrder'],\n init: function() {\n this.activate(this.defaultTab);\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n updateTimes: function() {\n var content;\n if (content = this.get('content')) {\n content.forEach(function(r) {\n return r.updateTimes();\n });\n }\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n activate: function(tab, params) {\n this.set('tab', tab);\n return this[\"view\" + ($.camelize(tab))](params);\n },\n viewRecent: function() {\n return this.set('content', Travis.Repository.find());\n },\n viewOwned: function() {\n return this.set('content', Travis.Repository.ownedBy(Travis.get('currentUser.login')));\n },\n viewSearch: function(params) {\n return this.set('content', Travis.Repository.search(params.search));\n },\n searchObserver: (function() {\n var search, tab;\n search = this.get('search');\n tab = search ? 'search' : 'recent';\n return this.activate(tab, {\n search: search\n });\n }).observes('search')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/repositories");minispade.register('controllers/repository', "(function() {(function() {\n\n Travis.RepositoryController = Travis.Controller.extend({\n bindings: [],\n params: {},\n init: function() {\n this._super('builds', 'build', 'job');\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n updateTimes: function() {\n var build, builds;\n if (builds = this.get('builds')) {\n builds.forEach(function(b) {\n return b.updateTimes();\n });\n }\n if (build = this.get('build')) {\n build.updateTimes();\n build.get('jobs').forEach(function(j) {\n return j.updateTimes();\n });\n }\n return Ember.run.later(this.updateTimes.bind(this), Travis.INTERVALS.updateTimes);\n },\n activate: function(action, params) {\n this._unbind();\n this.setParams(params);\n return this[\"view\" + ($.camelize(action))]();\n },\n viewIndex: function() {\n this._bind('repository', 'controllers.repositoriesController.firstObject');\n this._bind('build', 'repository.lastBuild');\n return this.connectTab('current');\n },\n viewCurrent: function() {\n this.connectTab('current');\n this._bind('repository', 'repositoriesByParams.firstObject');\n return this._bind('build', 'repository.lastBuild');\n },\n viewBuilds: function() {\n this.connectTab('builds');\n this._bind('repository', 'repositoriesByParams.firstObject');\n return this._bind('builds', 'repository.builds');\n },\n viewPullRequests: function() {\n this.connectTab('pull_requests');\n this._bind('repository', 'repositoriesByParams.firstObject');\n return this._bind('builds', 'repository.pullRequests');\n },\n viewBranches: function() {\n this.connectTab('branches');\n this._bind('repository', 'repositoriesByParams.firstObject');\n return this._bind('builds', 'repository.branches');\n },\n viewBuild: function() {\n this._bind('repository', 'repositoriesByParams.firstObject');\n this._bind('build', 'buildById');\n return this.connectTab('build');\n },\n viewJob: function() {\n this._bind('repository', 'repositoriesByParams.firstObject');\n this._bind('build', 'job.build');\n this._bind('job', 'jobById');\n return this.connectTab('job');\n },\n repositoriesByParams: (function() {\n return Travis.Repository.bySlug(\"\" + (this.get('params.owner')) + \"/\" + (this.get('params.name')));\n }).property('params.owner', 'params.name'),\n buildById: (function() {\n var id;\n if (id = this.get('params.id')) {\n return Travis.Build.find(id);\n }\n }).property('params.id'),\n jobById: (function() {\n var id;\n if (id = this.get('params.id')) {\n return Travis.Job.find(id);\n }\n }).property('params.id'),\n connectTab: function(tab) {\n var name, viewClass;\n name = tab === 'current' ? 'build' : tab;\n viewClass = name === 'builds' || name === 'branches' || name === 'pull_requests' ? Travis.BuildsView : Travis[\"\" + ($.camelize(name)) + \"View\"];\n this.set('tab', tab);\n return this.connectOutlet({\n outletName: 'pane',\n controller: this,\n viewClass: viewClass\n });\n },\n setParams: function(params) {\n var key, value, _results;\n _results = [];\n for (key in params) {\n value = params[key];\n _results.push(this.set(\"params.\" + key, params[key]));\n }\n return _results;\n },\n _bind: function(to, from) {\n return this.bindings.push(Ember.oneWay(this, to, from));\n },\n _unbind: function() {\n var binding, _i, _len, _ref;\n _ref = this.bindings;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n binding = _ref[_i];\n binding.disconnect(this);\n }\n return this.bindings.length = 0;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/repository");minispade.register('controllers/sidebar', "(function() {(function() {\n\n Travis.reopen({\n SidebarController: Em.ArrayController.extend({\n init: function() {\n this.tickables = [];\n Travis.Ticker.create({\n target: this,\n interval: Travis.INTERVALS.sponsors\n });\n this.connectWorkers(Travis.Worker.find());\n this.connectQueues(Travis.QUEUES);\n this.connectSponsors('decks', Travis.Sponsor.decks(), 1);\n return this.connectSponsors('links', Travis.Sponsor.links(), 6);\n },\n connectSponsors: function(name, sponsors, perPage) {\n var controller, viewClass;\n controller = Travis.SponsorsController.create({\n perPage: perPage,\n content: sponsors\n });\n viewClass = Em.View.extend({\n templateName: \"sponsors/\" + name\n });\n this.connectOutlet({\n outletName: name,\n controller: controller,\n viewClass: viewClass\n });\n return this.tickables.push(controller);\n },\n connectWorkers: function(workers) {\n var controller, viewClass;\n controller = Travis.WorkersController.create({\n content: workers\n });\n viewClass = Em.View.extend({\n templateName: 'workers/list'\n });\n return this.connectOutlet({\n outletName: 'workers',\n controller: controller,\n viewClass: viewClass\n });\n },\n connectQueues: function(queues) {\n var controller, queue, viewClass;\n queues = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = queues.length; _i < _len; _i++) {\n queue = queues[_i];\n _results.push(Em.ArrayController.create({\n content: Travis.Job.queued(queue.name),\n id: \"queue_\" + queue.name,\n name: queue.display\n }));\n }\n return _results;\n })();\n controller = Travis.QueuesController.create({\n content: queues\n });\n viewClass = Em.View.extend({\n templateName: 'queues/list'\n });\n return this.connectOutlet({\n outletName: 'queues',\n controller: controller,\n viewClass: viewClass\n });\n },\n tick: function() {\n var tickable, _i, _len, _ref, _results;\n _ref = this.tickables;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n tickable = _ref[_i];\n _results.push(tickable.tick());\n }\n return _results;\n }\n }),\n QueuesController: Em.ArrayController.extend(),\n WorkersController: Em.ArrayController.extend({\n groups: (function() {\n var groups, host, worker, _i, _len, _ref;\n groups = {};\n _ref = this.get('content').toArray();\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n worker = _ref[_i];\n host = worker.get('host');\n if (!groups[host]) {\n groups[host] = Em.ArrayProxy.create({\n content: []\n });\n }\n groups[host].pushObject(worker);\n }\n return $.values(groups);\n }).property('content.length')\n }),\n SponsorsController: Em.ArrayController.extend({\n page: 0,\n arrangedContent: (function() {\n return this.get('shuffled').slice(this.start(), this.end());\n }).property('shuffled.length', 'page'),\n shuffled: (function() {\n var content;\n if (content = this.get('content')) {\n return $.shuffle(content);\n } else {\n return [];\n }\n }).property('content.length'),\n tick: function() {\n return this.set('page', this.isLast() ? 0 : this.get('page') + 1);\n },\n pages: (function() {\n var length;\n length = this.get('content.length');\n if (length) {\n return parseInt(length / this.get('perPage') + 1);\n } else {\n return 1;\n }\n }).property('length'),\n isLast: function() {\n return this.get('page') === this.get('pages') - 1;\n },\n start: function() {\n return this.get('page') * this.get('perPage');\n },\n end: function() {\n return this.start() + this.get('perPage');\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/sidebar");minispade.register('controllers/stats', "(function() {(function() {\n\n Travis.StatsController = Travis.Controller.extend({\n name: 'stats',\n init: function() {\n this._super('top');\n this.connectTop();\n return this.connectOutlet({\n outletName: 'main',\n controller: this,\n viewClass: Travis.StatsView\n });\n },\n activate: function(action, params) {}\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=controllers/stats");minispade.register('helpers', "(function() {(function() {\nminispade.require('helpers/handlebars');\nminispade.require('helpers/helpers');\nminispade.require('helpers/urls');\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers");minispade.register('helpers/handlebars', "(function() {(function() {\n var safe;\nminispade.require('ext/ember/bound_helper');\n\n safe = function(string) {\n return new Handlebars.SafeString(string);\n };\n\n Handlebars.registerHelper('tipsy', function(text, tip) {\n return safe('' + text + '');\n });\n\n Handlebars.registerHelper('t', function(key) {\n return safe(I18n.t(key));\n });\n\n Ember.registerBoundHelper('formatTime', function(value, options) {\n return safe(Travis.Helpers.timeAgoInWords(value) || '-');\n });\n\n Ember.registerBoundHelper('formatDuration', function(duration, options) {\n return safe(Travis.Helpers.timeInWords(duration));\n });\n\n Ember.registerBoundHelper('formatCommit', function(commit, options) {\n if (commit) {\n return safe(Travis.Helpers.formatCommit(commit.get('sha'), commit.get('branch')));\n }\n });\n\n Ember.registerBoundHelper('formatSha', function(sha, options) {\n return safe(Travis.Helpers.formatSha(sha));\n });\n\n Ember.registerBoundHelper('pathFrom', function(url, options) {\n return safe(Travis.Helpers.pathFrom(url));\n });\n\n Ember.registerBoundHelper('formatMessage', function(message, options) {\n return safe(Travis.Helpers.formatMessage(message, options));\n });\n\n Ember.registerBoundHelper('formatConfig', function(config, options) {\n return safe(Travis.Helpers.formatConfig(config));\n });\n\n Ember.registerBoundHelper('formatLog', function(log, options) {\n return Travis.Helpers.formatLog(log) || '';\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/handlebars");minispade.register('helpers/helpers', "(function() {(function() {\nminispade.require('travis/log');\nminispade.require('emoij');\n\n this.Travis.Helpers = {\n compact: function(object) {\n var key, result, value, _ref;\n result = {};\n _ref = object || {};\n for (key in _ref) {\n value = _ref[key];\n if (!$.isEmpty(value)) {\n result[key] = value;\n }\n }\n return result;\n },\n safe: function(string) {\n return new Handlebars.SafeString(string);\n },\n colorForResult: function(result) {\n if (result === 0) {\n return 'green';\n } else {\n if (result === 1) {\n return 'red';\n } else {\n return null;\n }\n }\n },\n formatCommit: function(sha, branch) {\n return Travis.Helpers.formatSha(sha) + (branch ? \" (\" + branch + \")\" : '');\n },\n formatSha: function(sha) {\n return (sha || '').substr(0, 7);\n },\n formatConfig: function(config) {\n var values;\n config = $.only(config, 'rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'scala', 'jdk', 'python', 'perl');\n values = $.map(config, function(value, key) {\n value = (value && value.join ? value.join(', ') : value) || '';\n return '%@: %@'.fmt($.camelize(key), value);\n });\n if (values.length === 0) {\n return '-';\n } else {\n return values.join(', ');\n }\n },\n formatMessage: function(message, options) {\n message = message || '';\n if (options.short) {\n message = message.split(/\\n/)[0];\n }\n return this._emojize(this._escape(message)).replace(/\\n/g, '
    ');\n },\n formatLog: function(log) {\n return Travis.Log.filter(log);\n },\n pathFrom: function(url) {\n return (url || '').split('/').pop();\n },\n timeAgoInWords: function(date) {\n return $.timeago.distanceInWords(date);\n },\n durationFrom: function(started, finished) {\n started = started && this._toUtc(new Date(this._normalizeDateString(started)));\n finished = finished ? this._toUtc(new Date(this._normalizeDateString(finished))) : this._nowUtc();\n if (started && finished) {\n return Math.round((finished - started) / 1000);\n } else {\n return 0;\n }\n },\n timeInWords: function(duration) {\n var days, hours, minutes, result, seconds;\n days = Math.floor(duration / 86400);\n hours = Math.floor(duration % 86400 / 3600);\n minutes = Math.floor(duration % 3600 / 60);\n seconds = duration % 60;\n if (days > 0) {\n return 'more than 24 hrs';\n } else {\n result = [];\n if (hours === 1) {\n result.push(hours + ' hr');\n }\n if (hours > 1) {\n result.push(hours + ' hrs');\n }\n if (minutes > 0) {\n result.push(minutes + ' min');\n }\n if (seconds > 0) {\n result.push(seconds + ' sec');\n }\n if (result.length > 0) {\n return result.join(' ');\n } else {\n return '-';\n }\n }\n },\n _normalizeDateString: function(string) {\n if (window.JHW) {\n string = string.replace('T', ' ').replace(/-/g, '/');\n string = string.replace('Z', '').replace(/\\..*$/, '');\n }\n return string;\n },\n _nowUtc: function() {\n return this._toUtc(new Date());\n },\n _toUtc: function(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n },\n _emojize: function(text) {\n var emojis;\n emojis = text.match(/:\\S+?:/g);\n if (emojis !== null) {\n $.each(emojis.uniq(), function(ix, emoji) {\n var image, strippedEmoji;\n strippedEmoji = emoji.substring(1, emoji.length - 1);\n if (EmojiDictionary.indexOf(strippedEmoji) !== -1) {\n image = '\\''';\n return text = text.replace(new RegExp(emoji, 'g'), image);\n }\n });\n }\n return text;\n },\n _escape: function(text) {\n return text.replace(/&/g, '&').replace(//g, '>');\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/helpers");minispade.register('helpers/urls', "(function() {(function() {\n\n this.Travis.Urls = {\n repository: function(slug) {\n return \"/\" + slug;\n },\n builds: function(slug) {\n return \"/\" + slug + \"/builds\";\n },\n pullRequests: function(slug) {\n return \"/\" + slug + \"/pull_requests\";\n },\n branches: function(slug) {\n return \"/\" + slug + \"/branches\";\n },\n build: function(slug, id) {\n return \"/\" + slug + \"/builds/\" + id;\n },\n job: function(slug, id) {\n return \"/\" + slug + \"/jobs/\" + id;\n },\n githubCommit: function(slug, sha) {\n return \"http://github.com/\" + slug + \"/commit/\" + sha;\n },\n githubRepository: function(slug) {\n return \"http://github.com/\" + slug;\n },\n githubWatchers: function(slug) {\n return \"http://github.com/\" + slug + \"/watchers\";\n },\n githubNetwork: function(slug) {\n return \"http://github.com/\" + slug + \"/network\";\n },\n githubAdmin: function(slug) {\n return \"http://github.com/\" + slug + \"/admin/hooks#travis_minibucket\";\n },\n statusImage: function(slug, branch) {\n return (\"https://secure.travis-ci.org/\" + slug + \".png\") + (branch ? \"?branch=\" + branch : '');\n },\n email: function(email) {\n return \"mailto:\" + email;\n }\n };\n\n}).call(this);\n\n})();\n//@ sourceURL=helpers/urls");minispade.register('models', "(function() {(function() {\nminispade.require('models/extensions');\nminispade.require('models/artifact');\nminispade.require('models/branch');\nminispade.require('models/build');\nminispade.require('models/commit');\nminispade.require('models/hook');\nminispade.require('models/job');\nminispade.require('models/repository');\nminispade.require('models/sponsor');\nminispade.require('models/user');\nminispade.require('models/worker');\n\n}).call(this);\n\n})();\n//@ sourceURL=models");minispade.register('models/artifact', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Artifact = Travis.Model.extend({\n body: DS.attr('string'),\n append: function(body) {\n return this.set('body', this.get('body') + body);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/artifact");minispade.register('models/branch', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Branch = Travis.Model.extend(Travis.Helpers, {\n repositoryId: DS.attr('number'),\n commitId: DS.attr('number'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n duration: DS.attr('number'),\n started_at: DS.attr('string'),\n finished_at: DS.attr('string'),\n commit: DS.belongsTo('Travis.Commit'),\n repository: (function() {\n if (this.get('repositoryId')) {\n return Travis.Repository.find(this.get('repositoryId'));\n }\n }).property('repositoryId'),\n tick: function() {\n this.notifyPropertyChange('started_at');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n this.Travis.Branch.reopenClass({\n byRepositoryId: function(id) {\n return this.find({\n repository_id: id\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/branch");minispade.register('models/build', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Build = Travis.Model.extend(Travis.DurationCalculations, {\n eventType: DS.attr('string'),\n repositoryId: DS.attr('number'),\n commitId: DS.attr('number'),\n state: DS.attr('string'),\n number: DS.attr('number'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n result: DS.attr('number'),\n _duration: DS.attr('number', {\n key: 'duration'\n }),\n startedAt: DS.attr('string', {\n key: 'started_at'\n }),\n finishedAt: DS.attr('string', {\n key: 'finished_at'\n }),\n repository: DS.belongsTo('Travis.Repository'),\n commit: DS.belongsTo('Travis.Commit'),\n jobs: DS.hasMany('Travis.Job', {\n key: 'job_ids'\n }),\n config: (function() {\n return Travis.Helpers.compact(this.get('data.config'));\n }).property('data.config'),\n isMatrix: (function() {\n return this.get('data.job_ids.length') > 1;\n }).property('data.job_ids.length'),\n requiredJobs: (function() {\n return this.get('jobs').filter(function(data) {\n return !data.get('allowFailure');\n });\n }).property('jobs.@each.allowFailure'),\n allowedFailureJobs: (function() {\n return this.get('jobs').filter(function(data) {\n return data.get('allowFailure');\n });\n }).property('jobs.@each.allowFailure'),\n configKeys: (function() {\n var config, headers, key, keys;\n if (!(config = this.get('config'))) {\n return [];\n }\n keys = $.intersect($.keys(config), Travis.CONFIG_KEYS);\n headers = (function() {\n var _i, _len, _ref, _results;\n _ref = ['build.job', 'build.duration', 'build.finished_at'];\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n key = _ref[_i];\n _results.push(I18n.t(key));\n }\n return _results;\n })();\n return $.map(headers.concat(keys), function(key) {\n return $.camelize(key);\n });\n }).property('config')\n });\n\n this.Travis.Build.reopenClass({\n byRepositoryId: function(id, parameters) {\n return this.find($.extend(parameters || {}, {\n repository_id: id,\n orderBy: 'number DESC'\n }));\n },\n olderThanNumber: function(id, build_number) {\n return this.find({\n url: \"/builds\",\n repository_id: id,\n after: build_number\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/build");minispade.register('models/commit', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Commit = Travis.Model.extend({\n buildId: DS.attr('number'),\n sha: DS.attr('string'),\n branch: DS.attr('string'),\n message: DS.attr('string'),\n compareUrl: DS.attr('string'),\n authorName: DS.attr('string'),\n authorEmail: DS.attr('string'),\n committerName: DS.attr('string'),\n committerEmail: DS.attr('string'),\n build: DS.belongsTo('Travis.Build', {\n key: 'buildId'\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/commit");minispade.register('models/extensions', "(function() {(function() {\n\n Travis.DurationCalculations = Ember.Mixin.create({\n duration: (function() {\n var duration;\n if (duration = this.get('_duration')) {\n return duration;\n } else {\n return Travis.Helpers.durationFrom(this.get('startedAt'), this.get('finishedAt'));\n }\n }).property('_duration', 'finishedAt', 'startedAt'),\n updateTimes: function() {\n this.notifyPropertyChange('_duration');\n return this.notifyPropertyChange('finished_at');\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/extensions");minispade.register('models/hook', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Hook = Travis.Model.extend({\n primaryKey: 'slug',\n slug: DS.attr('string'),\n description: DS.attr('string'),\n active: DS.attr('boolean'),\n owner: (function() {\n return this.get('slug').split('/')[0];\n }).property('slug'),\n name: (function() {\n return this.get('slug').split('/')[1];\n }).property('slug'),\n urlGithub: (function() {\n return \"http://github.com/\" + (this.get('slug'));\n }).property(),\n urlGithubAdmin: (function() {\n return \"http://github.com/\" + (this.get('slug')) + \"/admin/hooks#travis_minibucket\";\n }).property(),\n toggle: function() {\n this.set('active', !this.get('active'));\n return Travis.app.store.commit();\n }\n });\n\n this.Travis.Hook.reopenClass({\n url: 'profile/hooks'\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/hook");minispade.register('models/job', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Job = Travis.Model.extend(Travis.DurationCalculations, {\n repositoryId: DS.attr('number'),\n buildId: DS.attr('number'),\n commitId: DS.attr('number'),\n logId: DS.attr('number'),\n queue: DS.attr('string'),\n state: DS.attr('string'),\n number: DS.attr('string'),\n result: DS.attr('number'),\n _duration: DS.attr('number', {\n key: 'duration'\n }),\n startedAt: DS.attr('string'),\n finishedAt: DS.attr('string'),\n allowFailure: DS.attr('boolean', {\n key: 'allow_failure'\n }),\n repository: DS.belongsTo('Travis.Repository', {\n key: 'repository_id'\n }),\n build: DS.belongsTo('Travis.Build', {\n key: 'build_id'\n }),\n commit: DS.belongsTo('Travis.Commit', {\n key: 'commit_id'\n }),\n log: DS.belongsTo('Travis.Artifact', {\n key: 'log_id'\n }),\n config: (function() {\n return Travis.Helpers.compact(this.get('data.config'));\n }).property('data.config'),\n sponsor: (function() {\n return this.get('data.sponsor');\n }).property('data.sponsor'),\n configValues: (function() {\n var config;\n if (config = this.get('config')) {\n return $.values($.only.apply(config, Travis.CONFIG_KEYS));\n } else {\n return [];\n }\n }).property('config'),\n appendLog: function(text) {\n var log;\n if (log = this.get('log')) {\n return log.append(text);\n }\n },\n subscribe: function() {\n var id;\n if (id = this.get('id')) {\n return Travis.app.pusher.subscribe(\"job-\" + id);\n }\n },\n onStateChange: (function() {\n if (this.get('state') === 'finished') {\n return Travis.app.pusher.unsubscribe(\"job-\" + (this.get('id')));\n }\n }).observes('state')\n });\n\n this.Travis.Job.reopenClass({\n queued: function(queue) {\n this.find();\n return Travis.app.store.filter(this, function(job) {\n return job.get('queue') === queue;\n });\n },\n findMany: function(ids) {\n return Travis.app.store.findMany(this, ids);\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/job");minispade.register('models/repository', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Repository = Travis.Model.extend({\n slug: DS.attr('string'),\n description: DS.attr('string'),\n lastBuildId: DS.attr('number'),\n lastBuildNumber: DS.attr('string'),\n lastBuildResult: DS.attr('number'),\n lastBuildStartedAt: DS.attr('string'),\n lastBuildFinishedAt: DS.attr('string'),\n lastBuild: DS.belongsTo('Travis.Build'),\n builds: (function() {\n var id;\n id = this.get('id');\n Travis.Build.byRepositoryId(id, {\n event_type: 'push'\n });\n return Travis.Build.filter(function(data) {\n return parseInt(data.get('repository_id')) === id && !data.get('pull_request');\n });\n }).property(),\n pullRequests: (function() {\n var id;\n id = this.get('id');\n Travis.Build.byRepositoryId(id, {\n event_type: 'pull_request'\n });\n return Travis.Build.filter(function(data) {\n return parseInt(data.get('repository_id')) === id && data.get('pull_request');\n });\n }).property(),\n branches: (function() {\n return Travis.Branch.byRepositoryId(this.get('id'));\n }).property(),\n owner: (function() {\n return (this.get('slug') || '').split('/')[0];\n }).property('slug'),\n name: (function() {\n return (this.get('slug') || '').split('/')[1];\n }).property('slug'),\n lastBuildDuration: (function() {\n var duration;\n duration = this.get('data.last_build_duration');\n if (!duration) {\n duration = Travis.Helpers.durationFrom(this.get('lastBuildStartedAt'), this.get('lastBuildFinishedAt'));\n }\n return duration;\n }).property('data.last_build_duration', 'lastBuildStartedAt', 'lastBuildFinishedAt'),\n sortOrder: (function() {\n var lastBuildFinishedAt;\n if (lastBuildFinishedAt = this.get('lastBuildFinishedAt')) {\n return -new Date(lastBuildFinishedAt).getTime();\n } else {\n return -new Date('9999').getTime() - parseInt(this.get('id'));\n }\n }).property('lastBuildFinishedAt'),\n stats: (function() {\n var _this = this;\n return this.get('_stats') || $.get(\"https://api.github.com/repos/\" + (this.get('slug')), function(data) {\n _this.set('_stats', data);\n return _this.notifyPropertyChange('stats');\n }) && {};\n }).property(),\n select: function() {\n return Travis.Repository.select(self.get('id'));\n },\n updateTimes: function() {\n return this.notifyPropertyChange('lastBuildDuration');\n }\n });\n\n this.Travis.Repository.reopenClass({\n recent: function() {\n return this.find();\n },\n ownedBy: function(login) {\n return this.find({\n owner: login,\n orderBy: 'name'\n });\n },\n search: function(query) {\n return this.find({\n search: query,\n orderBy: 'name'\n });\n },\n bySlug: function(slug) {\n return this.find({\n slug: slug\n });\n },\n select: function(id) {\n return this.find().forEach(function(repository) {\n return repository.set('selected', repository.get('id') === id);\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/repository");minispade.register('models/sponsor', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Sponsor = Travis.Model.extend({\n type: DS.attr('string'),\n url: DS.attr('string'),\n link: DS.attr('string'),\n image: (function() {\n return \"/images/sponsors/\" + (this.get('data.image'));\n }).property('data.image')\n });\n\n Travis.Sponsor.reopenClass({\n decks: function() {\n return this.platinum().concat(this.gold());\n },\n platinum: function() {\n var platinum, sponsor, _i, _len, _results;\n platinum = this.byType('platinum').toArray();\n _results = [];\n for (_i = 0, _len = platinum.length; _i < _len; _i++) {\n sponsor = platinum[_i];\n _results.push([sponsor]);\n }\n return _results;\n },\n gold: function() {\n var gold, _results;\n gold = this.byType('gold').toArray();\n _results = [];\n while (gold.length > 0) {\n _results.push(gold.splice(0, 2));\n }\n return _results;\n },\n links: function() {\n return this.byType('silver');\n },\n byType: function() {\n var types;\n types = Array.prototype.slice.apply(arguments);\n return Travis.Sponsor.filter(function(sponsor) {\n return types.indexOf(sponsor.get('type')) !== -1;\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/sponsor");minispade.register('models/user', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.User = Travis.Model.extend({\n name: DS.attr('string'),\n email: DS.attr('string'),\n login: DS.attr('string'),\n token: DS.attr('string'),\n gravatar: DS.attr('string'),\n urlGithub: (function() {\n return \"http://github.com/\" + (this.get('login'));\n }).property()\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/user");minispade.register('models/worker', "(function() {(function() {\nminispade.require('travis/model');\n\n this.Travis.Worker = Travis.Model.extend({\n state: DS.attr('string'),\n name: DS.attr('string'),\n host: DS.attr('string'),\n lastSeenAt: DS.attr('string'),\n payload: (function() {\n return this.get('data.payload');\n }).property('data.payload'),\n number: (function() {\n return this.get('name').match(/\\d+$/)[0];\n }).property('name'),\n display: (function() {\n var name, number, payload, repo, state;\n name = this.get('name');\n state = this.get('state');\n payload = this.get('payload');\n if (name) {\n name = name.replace('travis-', '');\n if (state === 'working' && payload !== void 0) {\n repo = payload.repository ? $.truncate(payload.repository.slug, 18) : void 0;\n number = payload.build && payload.build.number ? ' #' + payload.build.number : '';\n state = repo ? repo + number : state;\n }\n return name + ': ' + state;\n }\n }).property('state', 'name', 'payload'),\n urlJob: (function() {\n if (this.get('state') === 'working') {\n return \"/\" + (this.get('repository')) + \"/jobs/\" + (this.get('job_id'));\n }\n }).property('repository', 'job_id', 'state'),\n repository: (function() {\n return this.get('payload.repository.slug');\n }).property('payload.repository.slug'),\n job_id: (function() {\n return this.get('payload.job.id');\n }).property('payload.job.id')\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=models/worker");minispade.register('pusher', "(function() {(function() {\n\n Travis.Pusher = function() {\n this.active_channels = [];\n if (Travis.Pusher.KEY) {\n this.pusher = new Pusher(Travis.Pusher.KEY);\n }\n return this;\n };\n\n $.extend(Travis.Pusher, {\n CHANNELS: ['common'],\n CHANNEL_PREFIX: '',\n KEY: ''\n });\n\n $.extend(Travis.Pusher.prototype, {\n subscribe: function(channel) {\n var _this = this;\n if (this.pusher && this.active_channels.indexOf(channel) === -1) {\n this.active_channels.push(channel);\n return this.pusher.subscribe(this.prefix(channel)).bind_all(function(event, data) {\n return _this.receive(event, data);\n });\n }\n },\n unsubscribe: function(channel) {\n var ix;\n ix = this.active_channels.indexOf(channel);\n if (this.pusher && ix === -1) {\n this.active_channels.splice(ix, 1);\n return this.pusher.unsubscribe(this.prefix(channel));\n }\n },\n prefix: function(channel) {\n return \"\" + Travis.Pusher.CHANNEL_PREFIX + channel;\n },\n receive: function(event, data) {\n if (data.id) {\n data = this.normalize(event, data);\n }\n return Travis.app.store.receive(event, data);\n },\n normalize: function(event, data) {\n switch (event) {\n case 'build:started':\n case 'build:finished':\n return data;\n case 'job:created':\n case 'job:started':\n case 'job:finished':\n case 'job:log':\n if (data.queue) {\n data.queue = data.queue.replace('builds.', '');\n }\n return {\n job: data\n };\n case 'worker:added':\n case 'worker:updated':\n case 'worker:removed':\n return {\n worker: data\n };\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=pusher");minispade.register('routes', "(function() {(function() {\n\n Travis.Routes = function() {\n var route, target, _ref;\n if (!Travis.Routes.initialized) {\n Em.routes.set('usesHistory', true);\n Em.routes.set('wantsHistory', true);\n Em.routes.set('baseURI', this.base_uri);\n _ref = Travis.ROUTES;\n for (route in _ref) {\n target = _ref[route];\n this.add(route, target[0], target[1]);\n }\n return Travis.Routes.initialized = true;\n }\n };\n\n $.extend(Travis.Routes.prototype, {\n base_uri: \"\" + document.location.protocol + \"//\" + document.location.host,\n add: function(route, layout, action) {\n var _this = this;\n return Em.routes.add(route, function(params) {\n return _this.action(layout, action, params);\n });\n },\n route: function(event) {\n return Em.routes.set('location', event.target.href.replace(\"\" + this.base_uri + \"/\", ''));\n },\n action: function(name, action, params) {\n if (this.before(name, action, params)) {\n return this.render(name, action, params);\n }\n },\n render: function(name, action, params) {\n var layout;\n console.log([name, action, params]);\n layout = Travis.app.connectLayout(name);\n layout.activate(action, params || {});\n return $('body').attr('id', name);\n },\n before: function(name, action, params) {\n return true;\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=routes");minispade.register('store', "(function() {(function() {\n var DATA_PROXY,\n __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\nminispade.require('store/rest_adapter');\n\n DATA_PROXY = {\n get: function(name) {\n return this.savedData[name];\n }\n };\n\n Travis.Store = DS.Store.extend({\n revision: 4,\n adapter: Travis.RestAdapter.create(),\n merge: function(type, id, hash) {\n var clientId, data, dataCache, primaryKey, record, recordCache, typeMap;\n if (hash === void 0) {\n hash = id;\n primaryKey = type.proto().primaryKey;\n Ember.assert(\"A data hash was loaded for a record of type \" + type.toString() + \" but no primary key '\" + primaryKey + \"' was provided.\", hash[primaryKey]);\n id = hash[primaryKey];\n }\n typeMap = this.typeMapFor(type);\n dataCache = typeMap.cidToHash;\n clientId = typeMap.idToCid[id];\n recordCache = this.get('recordCache');\n if (clientId !== void 0) {\n if (data = dataCache[clientId]) {\n $.extend(data, hash);\n } else {\n dataCache[clientId] = hash;\n }\n if (record = recordCache[clientId]) {\n record.send('didChangeData');\n }\n } else {\n clientId = this.find(type, id).get('clientId');\n }\n if (clientId) {\n DATA_PROXY.savedData = hash;\n this.updateRecordArrays(type, clientId, DATA_PROXY);\n return {\n id: id,\n clientId: clientId\n };\n }\n },\n receive: function(event, data) {\n var job, mappings, name, type, _ref;\n _ref = event.split(':'), name = _ref[0], type = _ref[1];\n mappings = this.adapter.get('mappings');\n type = mappings[name];\n if (event === 'job:log') {\n if (job = this.find(Travis.Job, data['job']['id'])) {\n return job.appendLog(data['job']['_log']);\n }\n } else if (data[type.singularName()]) {\n return this._loadOne(this, type, data);\n } else if (data[type.pluralName()]) {\n return this._loadMany(this, type, data);\n } else {\n if (!type) {\n throw \"can't load data for \" + name;\n }\n }\n },\n _loadOne: function(store, type, json) {\n var root;\n root = type.singularName();\n this.adapter.sideload(store, type, json, root);\n this.merge(type, json[root]);\n return this._updateAssociations(type, root, json[root]);\n },\n _loadMany: function(store, type, json) {\n var root;\n console.log('loadMany');\n root = type.pluralName();\n this.adapter.sideload(store, type, json, root);\n return this.loadMany(type, json[root]);\n },\n _updateAssociations: function(type, name, data) {\n var _this = this;\n return Em.get(type, 'associationsByName').forEach(function(key, meta) {\n var clientId, dataProxy, id, ids, parent, _ref;\n if (meta.kind === 'belongsTo') {\n id = data[\"\" + key + \"_id\"];\n if (clientId = _this.typeMapFor(meta.type).idToCid[id]) {\n if (parent = _this.findByClientId(meta.type, clientId, id)) {\n dataProxy = parent.get('data');\n if (ids = dataProxy.get(\"\" + name + \"_ids\")) {\n if (_ref = data.id, __indexOf.call(ids, _ref) < 0) {\n ids.pushObject(data.id);\n }\n return parent.send('didChangeData');\n }\n }\n }\n }\n });\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store");minispade.register('store/fixture_adapter', "(function() {(function() {\n\n this.Travis.FixtureAdapter = DS.Adapter.extend({\n find: function(store, type, id) {\n var fixtures;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n if (fixtures.hasLoaded) {\n return;\n }\n return setTimeout((function() {\n store.loadMany(type, fixtures);\n return fixtures.hasLoaded = true;\n }), 300);\n },\n findMany: function() {\n return this.find.apply(this, arguments);\n },\n findAll: function(store, type) {\n var fixtures, ids;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n ids = fixtures.map(function(item, index, self) {\n return item.id;\n });\n return store.loadMany(type, ids, fixtures);\n },\n findQuery: function(store, type, params, array) {\n var fixture, fixtures, hashes, key, matches, value;\n fixtures = type.FIXTURES;\n Ember.assert(\"Unable to find fixtures for model type \" + type.toString(), !!fixtures);\n hashes = (function() {\n var _i, _len, _results;\n _results = [];\n for (_i = 0, _len = fixtures.length; _i < _len; _i++) {\n fixture = fixtures[_i];\n matches = (function() {\n var _results1;\n _results1 = [];\n for (key in params) {\n value = params[key];\n _results1.push(key === 'orderBy' || fixture[key] === value);\n }\n return _results1;\n })();\n if (matches.reduce(function(a, b) {\n return a && b;\n })) {\n _results.push(fixture);\n } else {\n _results.push(null);\n }\n }\n return _results;\n })();\n return array.load(hashes.compact());\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store/fixture_adapter");minispade.register('store/rest_adapter', "(function() {(function() {\nminispade.require('models');\n\n jQuery.support.cors = true;\n\n this.Travis.RestAdapter = DS.RESTAdapter.extend({\n DEFAULT_OPTIONS: {\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n }\n },\n mappings: {\n repositories: Travis.Repository,\n repository: Travis.Repository,\n builds: Travis.Build,\n build: Travis.Build,\n commits: Travis.Commit,\n commit: Travis.Commit,\n jobs: Travis.Job,\n job: Travis.Job,\n worker: Travis.Worker,\n workers: Travis.Worker\n },\n plurals: {\n repository: 'repositories',\n build: 'builds',\n branch: 'branches',\n job: 'jobs',\n worker: 'workers'\n },\n ajax: function(url, method, options) {\n var endpoint;\n endpoint = Travis.config.api_endpoint || '';\n return this._super(\"\" + endpoint + url, method, $.extend(options, this.DEFAULT_OPTIONS));\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=store/rest_adapter");minispade.register('views', "(function() {(function() {\nminispade.require('ext/ember/namespace');\n\n this.Travis.reopen({\n View: Em.View.extend({\n route: function(event) {\n return Travis.app.routes.route(event);\n }\n })\n });\n\n this.Travis.reopen({\n HomeLayout: Travis.View.extend({\n templateName: 'layouts/home'\n }),\n ProfileLayout: Travis.View.extend({\n templateName: 'layouts/simple'\n }),\n StatsLayout: Travis.View.extend({\n templateName: 'layouts/simple'\n })\n });\nminispade.require('views/build');\nminispade.require('views/job');\nminispade.require('views/repo');\nminispade.require('views/profile');\nminispade.require('views/sidebar');\nminispade.require('views/stats');\nminispade.require('views/top');\n\n}).call(this);\n\n})();\n//@ sourceURL=views");minispade.register('views/build', "(function() {(function() {\n\n this.Travis.reopen({\n BuildsView: Travis.View.extend({\n templateName: 'builds/list',\n buildsBinding: 'controller',\n showMore: function() {\n var id, number;\n id = this.get('controller.repository.id');\n number = this.get('controller.builds.lastObject.number');\n return Travis.Build.olderThanNumber(id, number);\n }\n }),\n BuildsItemView: Travis.View.extend({\n repositoryBinding: 'controller.repository',\n buildBinding: 'context',\n commitBinding: 'build.commit',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('build.result'));\n }).property('build.result'),\n urlBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('build.id'));\n }).property('repository.slug', 'build.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha')\n }),\n BuildView: Travis.View.extend({\n templateName: 'builds/show',\n repositoryBinding: 'controller.repository',\n buildBinding: 'controller.build',\n commitBinding: 'build.commit',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('build.result'));\n }).property('build.result'),\n urlBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('build.id'));\n }).property('repository.slug', 'build.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha'),\n urlAuthor: (function() {\n return Travis.Urls.email(this.get('commit.authorEmail'));\n }).property('commit.authorEmail'),\n urlCommitter: (function() {\n return Travis.Urls.email(this.get('commit.committerEmail'));\n }).property('commit.committerEmail')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/build");minispade.register('views/job', "(function() {(function() {\n\n this.Travis.reopen({\n JobsView: Travis.View.extend({\n templateName: 'jobs/list',\n buildBinding: 'controller.build',\n toggleHelp: function() {\n return $.facebox({\n div: '#allow_failure_help'\n });\n }\n }),\n JobsItemView: Travis.View.extend({\n tagName: 'tr',\n classNameBindings: ['color'],\n repositoryBinding: 'context.repository',\n jobBinding: 'context',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('job.result'));\n }).property('job.result'),\n urlJob: (function() {\n return Travis.Urls.job(this.get('repository.slug'), this.get('job.id'));\n }).property('repository.slug', 'job.id')\n }),\n JobView: Travis.View.extend({\n templateName: 'jobs/show',\n repositoryBinding: 'controller.repository',\n jobBinding: 'controller.job',\n commitBinding: 'job.commit',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('job.result'));\n }).property('job.result'),\n urlJob: (function() {\n return Travis.Urls.job(this.get('repository.slug'), this.get('job.id'));\n }).property('repository.slug', 'job.id'),\n urlGithubCommit: (function() {\n return Travis.Urls.githubCommit(this.get('repository.slug'), this.get('commit.sha'));\n }).property('repository.slug', 'commit.sha'),\n urlAuthor: (function() {\n return Travis.Urls.email(this.get('commit.authorEmail'));\n }).property('commit.authorEmail'),\n urlCommitter: (function() {\n return Travis.Urls.email(this.get('commit.committerEmail'));\n }).property('commit.committerEmail')\n }),\n LogView: Travis.View.extend({\n templateName: 'jobs/log',\n logBinding: 'job.log',\n click: function(event) {\n return $(event.target).closest('.fold').toggleClass('open');\n },\n jobBinding: 'context',\n logSubscriber: (function() {\n var job, state;\n job = this.get('job');\n state = this.get('job.state');\n if (job && state !== 'finished') {\n job.subscribe();\n }\n return null;\n }).property('job', 'job.state')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/job");minispade.register('views/left', "(function() {(function() {\n\n this.Travis.reopen({\n ReposView: Travis.View.extend({\n templateName: 'repos/list',\n tabBinding: 'controller.tab',\n classRecent: (function() {\n if (this.get('tab') === 'recent') {\n return 'active';\n }\n }).property('tab'),\n classOwned: (function() {\n var classes;\n classes = [];\n if (this.get('tab') === 'owned') {\n classes.push('active');\n }\n if (Em.get('Travis.currentUser')) {\n classes.push('display');\n }\n return classes.join(' ');\n }).property('tab', 'Travis.currentUser'),\n classSearch: (function() {\n if (this.get('tab') === 'search') {\n return 'active';\n }\n }).property('tab')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/left");minispade.register('views/profile', "(function() {(function() {\n\n this.Travis.reopen({\n UserView: Travis.View.extend({\n templateName: 'profile/show',\n userBinding: 'controller.user',\n gravatarUrl: (function() {\n return \"http://www.gravatar.com/avatar/\" + (this.get('user.gravatar')) + \"?s=48&d=mm\";\n }).property('user.gravatar')\n }),\n HooksView: Travis.View.extend({\n templateName: 'profile/hooks',\n urlGithubAdmin: (function() {\n return Travis.Urls.githubAdmin(this.get('hook.slug'));\n }).property('hook.slug')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/profile");minispade.register('views/repo', "(function() {(function() {\nminispade.require('views/repo/repos');\nminispade.require('views/repo/list');\nminispade.require('views/repo/list/tabs');\nminispade.require('views/repo/show');\nminispade.require('views/repo/show/tabs');\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo");minispade.register('views/repo/list', "(function() {(function() {\n\n this.Travis.reopen({\n RepositoriesListView: Em.CollectionView.extend({\n elementId: 'repositories',\n repositoryBinding: 'content',\n tagName: 'ul',\n emptyView: Ember.View.extend({\n template: Ember.Handlebars.compile('
    Loading
    ')\n }),\n itemViewClass: Travis.View.extend({\n repositoryBinding: 'content',\n classNames: ['repository'],\n classNameBindings: ['color', 'selected'],\n selectedBinding: 'repository.selected',\n color: (function() {\n return Travis.Helpers.colorForResult(this.get('repository.lastBuildResult'));\n }).property('repository.lastBuildResult'),\n urlRepository: (function() {\n return Travis.Urls.repository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlLastBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('repository.lastBuildId'));\n }).property('repository.slug', 'repository.lastBuildId')\n })\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/list");minispade.register('views/repo/list/tabs', "(function() {(function() {\n\n this.Travis.reopen({\n ReposListTabsView: Travis.View.extend({\n templateName: 'repos/list/tabs',\n tabBinding: 'controller.tab',\n activate: function(event) {\n return this.get('controller').activate(event.target.name);\n },\n classRecent: (function() {\n if (this.get('tab') === 'recent') {\n return 'active';\n }\n }).property('tab'),\n classOwned: (function() {\n var classes;\n classes = [];\n if (this.get('tab') === 'owned') {\n classes.push('active');\n }\n if (Em.get('Travis.currentUser')) {\n classes.push('display');\n }\n return classes.join(' ');\n }).property('tab', 'Travis.currentUser'),\n classSearch: (function() {\n if (this.get('tab') === 'search') {\n return 'active';\n }\n }).property('tab')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/list/tabs");minispade.register('views/repo/repos', "(function() {(function() {\n\n this.Travis.reopen({\n RepositoriesView: Travis.View.extend({\n templateName: 'repos/list'\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/repos");minispade.register('views/repo/show', "(function() {(function() {\nminispade.require('views/repo/show/tabs');\n\n this.Travis.reopen({\n RepositoryView: Travis.View.extend({\n templateName: 'repos/show',\n repositoryBinding: 'controller.repository',\n \"class\": (function() {\n if (!this.get('repository.isLoaded')) {\n return 'loading';\n }\n }).property('repository.isLoaded'),\n urlGithub: (function() {\n return Travis.Urls.githubRepository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlGithubWatchers: (function() {\n return Travis.Urls.githubWatchers(this.get('repository.slug'));\n }).property('repository.slug'),\n urlGithubNetwork: (function() {\n return Travis.Urls.githubNetwork(this.get('repository.slug'));\n }).property('repository.slug')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/show");minispade.register('views/repo/show/tabs', "(function() {(function() {\n\n this.Travis.reopen({\n RepoShowTabsView: Travis.View.extend({\n templateName: 'repos/show/tabs',\n repositoryBinding: 'controller.repository',\n buildBinding: 'controller.build',\n jobBinding: 'controller.job',\n tabBinding: 'controller.tab',\n toggleTools: function() {\n return $('#tools .pane').toggle();\n },\n classCurrent: (function() {\n if (this.get('tab') === 'current') {\n return 'active';\n }\n }).property('tab'),\n classBuilds: (function() {\n if (this.get('tab') === 'builds') {\n return 'active';\n }\n }).property('tab'),\n classPullRequests: (function() {\n if (this.get('tab') === 'pull_requests') {\n return 'active';\n }\n }).property('tab'),\n classBranches: (function() {\n if (this.get('tab') === 'branches') {\n return 'active';\n }\n }).property('tab'),\n classBuild: (function() {\n var classes, tab;\n tab = this.get('tab');\n classes = [];\n if (tab === 'build') {\n classes.push('active');\n }\n if (tab === 'build' || tab === 'job') {\n classes.push('display');\n }\n return classes.join(' ');\n }).property('tab'),\n classJob: (function() {\n if (this.get('tab') === 'job') {\n return 'active display';\n }\n }).property('tab'),\n urlRepository: (function() {\n return Travis.Urls.repository(this.get('repository.slug'));\n }).property('repository.slug'),\n urlBuilds: (function() {\n return Travis.Urls.builds(this.get('repository.slug'));\n }).property('repository.slug'),\n urlPullRequests: (function() {\n return Travis.Urls.pullRequests(this.get('repository.slug'));\n }).property('repository.slug'),\n urlBranches: (function() {\n return Travis.Urls.branches(this.get('repository.slug'));\n }).property('repository.slug'),\n urlBuild: (function() {\n return Travis.Urls.build(this.get('repository.slug'), this.get('build.id'));\n }).property('repository.slug', 'build.id'),\n urlJob: (function() {\n return Travis.Urls.job(this.get('repository.slug'), this.get('job.id'));\n }).property('repository.slug', 'job.id'),\n urlStatusImage: (function() {\n return Travis.Urls.statusImage(this.get('repository.slug'), this.get('branch.commit.branch'));\n }).property('repository.slug', 'branch'),\n markdownStatusImage: (function() {\n return \"[![Build Status](\" + (this.get('urlStatusImage')) + \")](\" + (this.get('urlRepository')) + \")\";\n }).property('urlStatusImage'),\n textileStatusImage: (function() {\n return \"!\" + (this.get('urlStatusImage')) + \"!:\" + (this.get('urlRepository'));\n }).property('urlStatusImage'),\n rdocStatusImage: (function() {\n return \"{\\\"Build}[\" + (this.get('urlRepository')) + \"]\";\n }).property('urlStatusImage')\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/repo/show/tabs");minispade.register('views/sidebar', "(function() {(function() {\n\n this.Travis.reopen({\n SidebarView: Travis.View.extend({\n templateName: 'layouts/sidebar',\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#repository').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n }),\n WorkersView: Travis.View.extend({\n toggle: function(event) {\n return $(event.target).closest('li').toggleClass('open');\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/sidebar");minispade.register('views/stats', "(function() {(function() {\n\n this.Travis.reopen({\n StatsView: Travis.View.extend({\n templateName: 'stats/show',\n didInsertElement: function() {\n var config, name, _ref, _results;\n _ref = this.CHARTS;\n _results = [];\n for (name in _ref) {\n config = _ref[name];\n _results.push(this.renderChart(config));\n }\n return _results;\n },\n renderChart: function(config) {\n var chart;\n chart = new Highcharts.Chart(config);\n return this.fetch(config.source, function(data) {\n var stats;\n stats = (function() {\n var _i, _len, _ref, _results;\n _ref = data.stats;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n stats = _ref[_i];\n _results.push(config.map(stats));\n }\n return _results;\n })();\n return chart.series[0].setData(stats);\n });\n },\n fetch: function(url, callback) {\n return $.ajax({\n type: 'GET',\n url: url,\n accepts: {\n json: 'application/vnd.travis-ci.2+json'\n },\n success: callback\n });\n },\n CHARTS: {\n repos: {\n source: '/stats/repos',\n map: function(data) {\n return [Date.parse(data.date), data.total_growth];\n },\n chart: {\n renderTo: \"repos_stats\"\n },\n title: {\n text: \"Total Projects/Repositories\"\n },\n xAxis: {\n type: \"datetime\",\n dateTimeLabelFormats: {\n month: \"%e. %b\",\n year: \"%b\"\n }\n },\n yAxis: {\n title: {\n text: \"Count\"\n },\n min: 0\n },\n tooltip: {\n formatter: function() {\n return Highcharts.dateFormat(\"%e. %b\", this.x) + \": \" + this.y + \" repos\";\n }\n },\n series: [\n {\n name: \"Repository Growth\",\n data: []\n }\n ]\n },\n builds: {\n source: '/stats/tests',\n map: function(data) {\n return [Date.parse(data.date), data.run_on_date];\n },\n chart: {\n renderTo: \"tests_stats\",\n type: \"column\"\n },\n title: {\n text: \"Build Count\"\n },\n subtitle: {\n text: \"last month\"\n },\n xAxis: {\n type: \"datetime\",\n dateTimeLabelFormats: {\n month: \"%e. %b\",\n year: \"%b\"\n }\n },\n yAxis: {\n title: {\n text: \"Count\"\n },\n min: 0\n },\n tooltip: {\n formatter: function() {\n return Highcharts.dateFormat(\"%e. %b\", this.x) + \": \" + this.y + \" builds\";\n }\n },\n series: [\n {\n name: \"Total Builds\",\n data: []\n }\n ]\n }\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/stats");minispade.register('views/top', "(function() {(function() {\nminispade.require('travis/auth');\n\n this.Travis.reopen({\n TopView: Travis.View.extend({\n templateName: 'layouts/top',\n tabBinding: 'controller.tab',\n userBinding: 'controller.user',\n gravatarUrl: (function() {\n return \"http://www.gravatar.com/avatar/\" + (this.get('user.gravatar')) + \"?s=24&d=mm\";\n }).property('user.gravatar'),\n classHome: (function() {\n if (this.get('tab') === 'home') {\n return 'active';\n }\n }).property('tab'),\n classStats: (function() {\n if (this.get('tab') === 'stats') {\n return 'active';\n }\n }).property('tab'),\n classProfile: (function() {\n if (this.get('tab') === 'profile') {\n return 'profile active';\n } else {\n return 'profile';\n }\n }).property('tab'),\n showProfile: function() {\n return $('#top .profile ul').show();\n },\n hideProfile: function() {\n return $('#top .profile ul').hide();\n },\n signIn: function() {\n return Travis.Auth.signIn();\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=views/top");minispade.register('data/sponsors', "(function() {(function() {\n\n this.Travis.SPONSORS = [\n {\n type: 'platinum',\n url: \"http://www.wooga.com\",\n image: \"wooga-205x130.png\"\n }, {\n type: 'platinum',\n url: \"http://bendyworks.com\",\n image: \"bendyworks-205x130.png\"\n }, {\n type: 'platinum',\n url: \"http://cloudcontrol.com\",\n image: \"cloudcontrol-205x130.png\"\n }, {\n type: 'platinum',\n url: \"http://xing.de\",\n image: \"xing-205x130.png\"\n }, {\n type: 'gold',\n url: \"http://heroku.com\",\n image: \"heroku-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://soundcloud.com\",\n image: \"soundcloud-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://nedap.com\",\n image: \"nedap-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://mongohq.com\",\n image: \"mongohq-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://zweitag.de\",\n image: \"zweitag-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://kanbanery.com\",\n image: \"kanbanery-205x60.png\"\n }, {\n type: 'gold',\n url: \"http://ticketevolution.com\",\n image: \"ticketevolution-205x60.jpg\"\n }, {\n type: 'gold',\n url: \"http://plan.io/travis\",\n image: \"planio-205x60.png\"\n }, {\n type: 'silver',\n link: \"Cobot: The one tool to run your coworking space\"\n }, {\n type: 'silver',\n link: \"JumpstartLab: We build developers\"\n }, {\n type: 'silver',\n link: \"Evil Martians: Agile Ruby on Rails development\"\n }, {\n type: 'silver',\n link: \"Zendesk: Love your helpdesk\"\n }, {\n type: 'silver',\n link: \"Stripe: Payments for developers\"\n }, {\n type: 'silver',\n link: \"Basho: We make Riak!\"\n }, {\n type: 'silver',\n link: \"Relevance: We deliver software solutions\"\n }, {\n type: 'silver',\n link: \"Mindmatters: Software für Menschen\"\n }, {\n type: 'silver',\n link: \"Amen: The best and worst of everything\"\n }, {\n type: 'silver',\n link: \"Site5: Premium Web Hosting Solutions\"\n }, {\n type: 'silver',\n link: \"Crowd Interactive: Leading Rails consultancy in Mexico\"\n }, {\n type: 'silver',\n link: \"Atomic Object: Work with really smart people\"\n }, {\n type: 'silver',\n link: \"Codeminer: smart services for your startup\"\n }, {\n type: 'silver',\n link: \"Cloudant: grow into your data layer, not out of it\"\n }, {\n type: 'silver',\n link: \"Gidsy: Explore, organize & book unique things to do!\"\n }, {\n type: 'silver',\n link: \"5apps: Package & deploy HTML5 apps automatically\"\n }, {\n type: 'silver',\n link: \"Meltmedia: We are Interactive Superheroes\"\n }, {\n type: 'silver',\n link: \"Fingertips offers design and development services\"\n }, {\n type: 'silver',\n link: \"Engine Yard: Build epic apps, let us handle the rest\"\n }, {\n type: 'silver',\n link: \"Malwarebytes: Defeat Malware once and for all.\"\n }, {\n type: 'silver',\n link: \"Readmill: The best reading app on the iPad.\"\n }, {\n type: 'silver',\n link: \"Medidata: clinical tech improving quality of life\"\n }, {\n type: 'silver',\n link: \"ESM: Japan's best agile Ruby/Rails consultancy\"\n }, {\n type: 'silver',\n link: \"Twitter: instantly connects people everywhere\"\n }, {\n type: 'silver',\n link: \"AGiLE ANiMAL: we <3 Travis CI.\"\n }, {\n type: 'silver',\n link: \"Tupalo: Discover, review & share local businesses.\"\n }\n ];\n\n}).call(this);\n\n})();\n//@ sourceURL=data/sponsors");minispade.register('emoij', "(function() {(function() {\n\n this.EmojiDictionary = ['-1', '0', '1', '109', '2', '3', '4', '5', '6', '7', '8', '8ball', '9', 'a', 'ab', 'airplane', 'alien', 'ambulance', 'angel', 'anger', 'angry', 'apple', 'aquarius', 'aries', 'arrow_backward', 'arrow_down', 'arrow_forward', 'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right', 'arrow_up', 'arrow_upper_left', 'arrow_upper_right', 'art', 'astonished', 'atm', 'b', 'baby', 'baby_chick', 'baby_symbol', 'balloon', 'bamboo', 'bank', 'barber', 'baseball', 'basketball', 'bath', 'bear', 'beer', 'beers', 'beginner', 'bell', 'bento', 'bike', 'bikini', 'bird', 'birthday', 'black_square', 'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', 'boot', 'bouquet', 'bow', 'bowtie', 'boy', 'bread', 'briefcase', 'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus', 'busstop', 'cactus', 'cake', 'calling', 'camel', 'camera', 'cancer', 'capricorn', 'car', 'cat', 'cd', 'chart', 'checkered_flag', 'cherry_blossom', 'chicken', 'christmas_tree', 'church', 'cinema', 'city_sunrise', 'city_sunset', 'clap', 'clapper', 'clock1', 'clock10', 'clock11', 'clock12', 'clock2', 'clock3', 'clock4', 'clock5', 'clock6', 'clock7', 'clock8', 'clock9', 'closed_umbrella', 'cloud', 'clubs', 'cn', 'cocktail', 'coffee', 'cold_sweat', 'computer', 'confounded', 'congratulations', 'construction', 'construction_worker', 'convenience_store', 'cool', 'cop', 'copyright', 'couple', 'couple_with_heart', 'couplekiss', 'cow', 'crossed_flags', 'crown', 'cry', 'cupid', 'currency_exchange', 'curry', 'cyclone', 'dancer', 'dancers', 'dango', 'dart', 'dash', 'de', 'department_store', 'diamonds', 'disappointed', 'dog', 'dolls', 'dolphin', 'dress', 'dvd', 'ear', 'ear_of_rice', 'egg', 'eggplant', 'egplant', 'eight_pointed_black_star', 'eight_spoked_asterisk', 'elephant', 'email', 'es', 'european_castle', 'exclamation', 'eyes', 'factory', 'fallen_leaf', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel', 'finnadie', 'fire', 'fire_engine', 'fireworks', 'fish', 'fist', 'flags', 'flushed', 'football', 'fork_and_knife', 'fountain', 'four_leaf_clover', 'fr', 'fries', 'frog', 'fuelpump', 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl', 'goberserk', 'godmode', 'golf', 'green_heart', 'grey_exclamation', 'grey_question', 'grin', 'guardsman', 'guitar', 'gun', 'haircut', 'hamburger', 'hammer', 'hamster', 'hand', 'handbag', 'hankey', 'hash', 'headphones', 'heart', 'heart_decoration', 'heart_eyes', 'heartbeat', 'heartpulse', 'hearts', 'hibiscus', 'high_heel', 'horse', 'hospital', 'hotel', 'hotsprings', 'house', 'hurtrealbad', 'icecream', 'id', 'ideograph_advantage', 'imp', 'information_desk_person', 'iphone', 'it', 'jack_o_lantern', 'japanese_castle', 'joy', 'jp', 'key', 'kimono', 'kiss', 'kissing_face', 'kissing_heart', 'koala', 'koko', 'kr', 'leaves', 'leo', 'libra', 'lips', 'lipstick', 'lock', 'loop', 'loudspeaker', 'love_hotel', 'mag', 'mahjong', 'mailbox', 'man', 'man_with_gua_pi_mao', 'man_with_turban', 'maple_leaf', 'mask', 'massage', 'mega', 'memo', 'mens', 'metal', 'metro', 'microphone', 'minidisc', 'mobile_phone_off', 'moneybag', 'monkey', 'monkey_face', 'moon', 'mortar_board', 'mount_fuji', 'mouse', 'movie_camera', 'muscle', 'musical_note', 'nail_care', 'necktie', 'new', 'no_good', 'no_smoking', 'nose', 'notes', 'o', 'o2', 'ocean', 'octocat', 'octopus', 'oden', 'office', 'ok', 'ok_hand', 'ok_woman', 'older_man', 'older_woman', 'open_hands', 'ophiuchus', 'palm_tree', 'parking', 'part_alternation_mark', 'pencil', 'penguin', 'pensive', 'persevere', 'person_with_blond_hair', 'phone', 'pig', 'pill', 'pisces', 'plus1', 'point_down', 'point_left', 'point_right', 'point_up', 'point_up_2', 'police_car', 'poop', 'post_office', 'postbox', 'pray', 'princess', 'punch', 'purple_heart', 'question', 'rabbit', 'racehorse', 'radio', 'rage', 'rage1', 'rage2', 'rage3', 'rage4', 'rainbow', 'raised_hands', 'ramen', 'red_car', 'red_circle', 'registered', 'relaxed', 'relieved', 'restroom', 'rewind', 'ribbon', 'rice', 'rice_ball', 'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', 'rose', 'ru', 'runner', 'sa', 'sagittarius', 'sailboat', 'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school', 'school_satchel', 'scissors', 'scorpius', 'scream', 'seat', 'secret', 'shaved_ice', 'sheep', 'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'signal_strength', 'six_pointed_star', 'ski', 'skull', 'sleepy', 'slot_machine', 'smile', 'smiley', 'smirk', 'smoking', 'snake', 'snowman', 'sob', 'soccer', 'space_invader', 'spades', 'spaghetti', 'sparkler', 'sparkles', 'speaker', 'speedboat', 'squirrel', 'star', 'star2', 'stars', 'station', 'statue_of_liberty', 'stew', 'strawberry', 'sunflower', 'sunny', 'sunrise', 'sunrise_over_mountains', 'surfer', 'sushi', 'suspect', 'sweat', 'sweat_drops', 'swimmer', 'syringe', 'tada', 'tangerine', 'taurus', 'taxi', 'tea', 'telephone', 'tennis', 'tent', 'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tm', 'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', 'traffic_light', 'train', 'trident', 'trophy', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip', 'tv', 'u5272', 'u55b6', 'u6307', 'u6708', 'u6709', 'u6e80', 'u7121', 'u7533', 'u7a7a', 'umbrella', 'unamused', 'underage', 'unlock', 'up', 'us', 'v', 'vhs', 'vibration_mode', 'virgo', 'vs', 'walking', 'warning', 'watermelon', 'wave', 'wc', 'wedding', 'whale', 'wheelchair', 'white_square', 'wind_chime', 'wink', 'wink2', 'wolf', 'woman', 'womans_hat', 'womens', 'x', 'yellow_heart', 'zap', 'zzz'];\n\n}).call(this);\n\n})();\n//@ sourceURL=emoij");minispade.register('ext/jquery', "(function() {(function() {\n\n $.fn.extend({\n outerHtml: function() {\n return $(this).wrap('
    ').parent().html();\n },\n outerElement: function() {\n return $($(this).outerHtml()).empty();\n },\n flash: function() {\n return Utils.flash(this);\n },\n unflash: function() {\n return Utils.unflash(this);\n },\n filterLog: function() {\n this.deansi();\n return this.foldLog();\n },\n deansi: function() {\n return this.html(Utils.deansi(this.html()));\n },\n foldLog: function() {\n return this.html(Utils.foldLog(this.html()));\n },\n unfoldLog: function() {\n return this.html(Utils.unfoldLog(this.html()));\n },\n updateTimes: function() {\n return Utils.updateTimes(this);\n },\n activateTab: function(tab) {\n return Utils.activateTab(this, tab);\n },\n timeInWords: function() {\n return $(this).each(function() {\n return $(this).text(Utils.timeInWords(parseInt($(this).attr('title'))));\n });\n },\n updateGithubStats: function(repository) {\n return Utils.updateGithubStats(repository, $(this));\n }\n });\n\n $.extend({\n isEmpty: function(obj) {\n if ($.isArray(obj)) {\n return !obj.length;\n } else if ($.isObject(obj)) {\n return !$.keys(obj).length;\n } else {\n return !obj;\n }\n },\n isObject: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n },\n keys: function(obj) {\n var keys;\n keys = [];\n $.each(obj, function(key) {\n return keys.push(key);\n });\n return keys;\n },\n values: function(obj) {\n var values;\n values = [];\n $.each(obj, function(key, value) {\n return values.push(value);\n });\n return values;\n },\n underscore: function(string) {\n return string[0].toLowerCase() + string.substring(1).replace(/([A-Z])?/g, function(match, chr) {\n if (chr) {\n return \"_\" + (chr.toUpperCase());\n } else {\n return '';\n }\n });\n },\n camelize: function(string, uppercase) {\n string = uppercase === false ? $.underscore(string) : $.capitalize(string);\n return string.replace(/_(.)?/g, function(match, chr) {\n if (chr) {\n return chr.toUpperCase();\n } else {\n return '';\n }\n });\n },\n capitalize: function(string) {\n return string[0].toUpperCase() + string.substring(1);\n },\n compact: function(object) {\n return $.grep(object, function(value) {\n return !!value;\n });\n },\n all: function(array, callback) {\n var args, i;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n return false;\n }\n i++;\n }\n return true;\n },\n detect: function(array, callback) {\n var args, i;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n return array[i];\n }\n i++;\n }\n },\n select: function(array, callback) {\n var args, i, result;\n args = Array.prototype.slice.apply(arguments);\n callback = args.pop();\n array = args.pop() || this;\n result = [];\n i = 0;\n while (i < array.length) {\n if (callback(array[i])) {\n result.push(array[i]);\n }\n i++;\n }\n return result;\n },\n slice: function(object, key) {\n var keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) > -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n only: function(object) {\n var key, keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) !== -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n except: function(object) {\n var key, keys, result;\n keys = Array.prototype.slice.apply(arguments);\n object = (typeof keys[0] === 'object' ? keys.shift() : this);\n result = {};\n for (key in object) {\n if (keys.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n },\n intersect: function(array, other) {\n return array.filter(function(element) {\n return other.indexOf(element) !== -1;\n });\n },\n map: function(elems, callback, arg) {\n var i, isArray, key, length, ret, value;\n value = void 0;\n key = void 0;\n ret = [];\n i = 0;\n length = elems.length;\n isArray = elems instanceof jQuery || length !== void 0 && typeof length === 'number' && (length > 0 && elems[0] && elems[length - 1]) || length === 0 || jQuery.isArray(elems);\n if (isArray) {\n while (i < length) {\n value = callback(elems[i], i, arg);\n if (value != null) {\n ret[ret.length] = value;\n }\n i++;\n }\n } else {\n for (key in elems) {\n value = callback(elems[key], key, arg);\n if (value != null) {\n ret[ret.length] = value;\n }\n }\n }\n return ret.concat.apply([], ret);\n },\n shuffle: function(array) {\n var current, tmp, top;\n array = array.slice();\n top = array.length;\n while (top && --top) {\n current = Math.floor(Math.random() * (top + 1));\n tmp = array[current];\n array[current] = array[top];\n array[top] = tmp;\n }\n return array;\n },\n truncate: function(string, length) {\n if (string.length > length) {\n return string.trim().substring(0, length) + '...';\n } else {\n return string;\n }\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=ext/jquery");minispade.register('hax0rs', "(function() {(function() {\n\n\n\n}).call(this);\n\n})();\n//@ sourceURL=hax0rs");minispade.register('mocks', "(function() {(function() {\n var artifact, artifacts, branches, build, builds, commits, data, hooks, id, job, jobs, repositories, repository, responseTime, workers, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m;\nminispade.require('ext/jquery');\n\n responseTime = 0;\n\n repositories = [\n {\n id: 1,\n owner: 'travis-ci',\n name: 'travis-core',\n slug: 'travis-ci/travis-core',\n build_ids: [1, 2],\n last_build_id: 1,\n last_build_number: 1,\n last_build_result: 0,\n last_build_duration: 30,\n last_build_started_at: '2012-07-02T00:00:00Z',\n last_build_finished_at: '2012-07-02T00:00:30Z',\n description: 'Description of travis-core'\n }, {\n id: 2,\n owner: 'travis-ci',\n name: 'travis-assets',\n slug: 'travis-ci/travis-assets',\n build_ids: [3],\n last_build_id: 3,\n last_build_number: 3,\n last_build_result: 1,\n last_build_duration: 30,\n last_build_started_at: '2012-07-02T00:01:00Z',\n last_build_finished_at: '2012-07-01T00:01:30Z',\n description: 'Description of travis-assets'\n }, {\n id: 3,\n owner: 'travis-ci',\n name: 'travis-hub',\n slug: 'travis-ci/travis-hub',\n build_ids: [4],\n last_build_id: 4,\n last_build_number: 4,\n last_build_result: void 0,\n last_build_duration: void 0,\n last_build_started_at: '2012-07-02T00:02:00Z',\n last_build_finished_at: void 0,\n description: 'Description of travis-hub'\n }\n ];\n\n builds = [\n {\n id: 1,\n repository_id: '1',\n commit_id: 1,\n job_ids: [1, 2, 3],\n number: 1,\n pull_request: false,\n config: {\n rvm: ['rbx', '1.9.3', 'jruby']\n },\n duration: 30,\n started_at: '2012-07-02T00:00:00Z',\n finished_at: '2012-07-02T00:00:30Z',\n result: 0\n }, {\n id: 2,\n repository_id: '1',\n commit_id: 2,\n job_ids: [4],\n number: 2,\n pull_request: false,\n config: {\n rvm: ['rbx']\n }\n }, {\n id: 3,\n repository_id: '2',\n commit_id: 3,\n job_ids: [5],\n number: 3,\n pull_request: false,\n config: {\n rvm: ['rbx']\n },\n duration: 30,\n started_at: '2012-07-02T00:01:00Z',\n finished_at: '2012-07-01T00:01:30Z',\n result: 1\n }, {\n id: 4,\n repository_id: '3',\n commit_id: 4,\n job_ids: [6],\n number: 4,\n pull_request: false,\n config: {\n rvm: ['rbx']\n },\n started_at: '2012-07-02T00:02:00Z'\n }\n ];\n\n commits = [\n {\n id: 1,\n sha: '1234567',\n branch: 'master',\n message: 'commit message 1',\n author_name: 'author name',\n author_email: 'author@email.com',\n committer_name: 'committer name',\n committer_email: 'committer@email.com',\n compare_url: 'http://github.com/compare/0123456..1234567'\n }, {\n id: 2,\n sha: '2345678',\n branch: 'feature',\n message: 'commit message 2',\n author_name: 'author name',\n author_email: 'author@email.com',\n committer_name: 'committer name',\n committer_email: 'committer@email.com',\n compare_url: 'http://github.com/compare/0123456..2345678'\n }, {\n id: 3,\n sha: '3456789',\n branch: 'master',\n message: 'commit message 3',\n author_name: 'author name',\n author_email: 'author@email.com',\n committer_name: 'committer name',\n committer_email: 'committer@email.com',\n compare_url: 'http://github.com/compare/0123456..3456789'\n }, {\n id: 4,\n sha: '4567890',\n branch: 'master',\n message: 'commit message 4',\n author_name: 'author name',\n author_email: 'author@email.com',\n committer_name: 'committer name',\n committer_email: 'committer@email.com',\n compare_url: 'http://github.com/compare/0123456..4567890'\n }\n ];\n\n jobs = [\n {\n id: 1,\n repository_id: 1,\n build_id: 1,\n commit_id: 1,\n log_id: 1,\n number: '1.1',\n config: {\n rvm: 'rbx'\n },\n duration: 30,\n started_at: '2012-07-02T00:00:00Z',\n finished_at: '2012-07-02T00:00:30Z',\n result: 0\n }, {\n id: 2,\n repository_id: 1,\n build_id: 1,\n commit_id: 1,\n log_id: 2,\n number: '1.2',\n config: {\n rvm: '1.9.3'\n },\n duration: 40,\n started_at: '2012-07-02T00:00:00Z',\n finished_at: '2012-07-02T00:00:40Z',\n result: 1\n }, {\n id: 3,\n repository_id: 1,\n build_id: 1,\n commit_id: 1,\n log_id: 3,\n number: '1.3',\n config: {\n rvm: 'jruby'\n },\n allow_failure: true\n }, {\n id: 4,\n repository_id: 1,\n build_id: 2,\n commit_id: 2,\n log_id: 4,\n number: '2.1',\n config: {\n rvm: 'rbx'\n }\n }, {\n id: 5,\n repository_id: 2,\n build_id: 3,\n commit_id: 3,\n log_id: 5,\n number: '3.1',\n config: {\n rvm: 'rbx'\n },\n duration: 30,\n started_at: '2012-07-02T00:01:00Z',\n finished_at: '2012-07-02T00:01:30Z',\n result: 1\n }, {\n id: 6,\n repository_id: 3,\n build_id: 4,\n commit_id: 4,\n log_id: 6,\n number: '4.1',\n config: {\n rvm: 'rbx'\n },\n started_at: '2012-07-02T00:02:00Z'\n }, {\n id: 7,\n repository_id: 1,\n build_id: 5,\n commit_id: 5,\n log_id: 7,\n number: '5.1',\n config: {\n rvm: 'rbx'\n },\n state: 'created',\n queue: 'common'\n }, {\n id: 8,\n repository_id: 1,\n build_id: 5,\n commit_id: 5,\n log_id: 8,\n number: '5.2',\n config: {\n rvm: 'rbx'\n },\n state: 'created',\n queue: 'common'\n }\n ];\n\n artifacts = [\n {\n id: 1,\n body: 'log 1'\n }, {\n id: 2,\n body: 'log 2'\n }, {\n id: 3,\n body: 'log 3'\n }, {\n id: 4,\n body: 'log 4'\n }, {\n id: 5,\n body: 'log 5'\n }, {\n id: 6,\n body: 'log 6'\n }, {\n id: 7,\n body: 'log 7'\n }, {\n id: 8,\n body: 'log 8'\n }\n ];\n\n branches = [\n {\n branches: [builds[0], builds[1]],\n commits: [commits[0], commits[1]]\n }, {\n branches: [builds[2]],\n commits: [commits[2]]\n }, {\n branches: [builds[3]],\n commits: [commits[3]]\n }\n ];\n\n workers = [\n {\n id: 1,\n name: 'ruby-1',\n host: 'worker.travis-ci.org',\n state: 'ready'\n }, {\n id: 2,\n name: 'ruby-2',\n host: 'worker.travis-ci.org',\n state: 'ready'\n }\n ];\n\n hooks = [\n {\n slug: 'travis-ci/travis-core',\n description: 'description of travis-core',\n active: true,\n \"private\": false\n }, {\n slug: 'travis-ci/travis-assets',\n description: 'description of travis-assets',\n active: false,\n \"private\": false\n }, {\n slug: 'svenfuchs/minimal',\n description: 'description of minimal',\n active: true,\n \"private\": false\n }\n ];\n\n $.mockjax({\n url: '/repositories',\n responseTime: responseTime,\n response: function(settings) {\n var search, slug;\n if (!settings.data) {\n return this.responseText = {\n repositories: repositories\n };\n } else if (slug = settings.data.slug) {\n return this.responseText = {\n repositories: [\n $.detect(repositories, function(repository) {\n return repository.slug === slug;\n })\n ]\n };\n } else if (search = settings.data.search) {\n return this.responseText = {\n repositories: $.select(repositories, function(repository) {\n return repository.slug.indexOf(search) > -1;\n }).toArray()\n };\n } else {\n return raise(\"don't know this ditty\");\n }\n }\n });\n\n for (_i = 0, _len = repositories.length; _i < _len; _i++) {\n repository = repositories[_i];\n $.mockjax({\n url: '/' + repository.slug,\n responseTime: responseTime,\n responseText: {\n repository: repository\n }\n });\n $.mockjax({\n url: '/repositories',\n data: {\n slug: repository.slug\n },\n responseTime: responseTime,\n responseText: {\n repositories: [repository]\n }\n });\n $.mockjax({\n url: '/builds',\n data: {\n ids: repository.build_ids\n },\n responseTime: responseTime,\n responseText: {\n builds: $.select(builds, function(build) {\n return repository.build_ids.indexOf(build.id) !== -1;\n })\n }\n });\n $.mockjax({\n url: '/builds',\n data: {\n repository_id: repository.id,\n event_type: 'push',\n orderBy: 'number DESC'\n },\n responseTime: responseTime,\n responseText: {\n builds: (function() {\n var _j, _len1, _ref, _results;\n _ref = repository.build_ids;\n _results = [];\n for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n id = _ref[_j];\n _results.push(builds[id - 1]);\n }\n return _results;\n })(),\n commits: (function() {\n var _j, _len1, _ref, _results;\n _ref = repository.build_ids;\n _results = [];\n for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n id = _ref[_j];\n _results.push(commits[builds[id - 1].commit_id - 1]);\n }\n return _results;\n })()\n }\n });\n }\n\n for (_j = 0, _len1 = builds.length; _j < _len1; _j++) {\n build = builds[_j];\n $.mockjax({\n url: '/builds/' + build.id,\n responseTime: responseTime,\n responseText: {\n build: build,\n commit: commits[build.commit_id - 1],\n jobs: (function() {\n var _k, _len2, _ref, _results;\n _ref = build.job_ids;\n _results = [];\n for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) {\n id = _ref[_k];\n _results.push(jobs[id - 1]);\n }\n return _results;\n })()\n }\n });\n }\n\n for (_k = 0, _len2 = jobs.length; _k < _len2; _k++) {\n job = jobs[_k];\n $.mockjax({\n url: '/jobs/' + job.id,\n responseTime: responseTime,\n responseText: {\n job: job,\n commit: commits[job.commit_id - 1]\n }\n });\n }\n\n $.mockjax({\n url: '/jobs',\n responseTime: responseTime,\n responseText: {\n jobs: $.select(jobs, function(job) {\n return job.state === 'created';\n })\n }\n });\n\n for (_l = 0, _len3 = branches.length; _l < _len3; _l++) {\n data = branches[_l];\n $.mockjax({\n url: '/branches',\n data: {\n repository_id: data.branches[0].repository_id\n },\n responseTime: responseTime,\n responseText: data\n });\n }\n\n for (_m = 0, _len4 = artifacts.length; _m < _len4; _m++) {\n artifact = artifacts[_m];\n $.mockjax({\n url: '/artifacts/' + artifact.id,\n responseTime: responseTime,\n responseText: {\n artifact: artifact\n }\n });\n }\n\n $.mockjax({\n url: '/workers',\n responseTime: responseTime,\n responseText: {\n workers: workers\n }\n });\n\n $.mockjax({\n url: '/profile/hooks',\n responseTime: responseTime,\n responseText: {\n hooks: hooks\n }\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=mocks");minispade.register('travis/auth', "(function() {(function() {\n\n this.Travis.Auth = (function() {\n\n function Auth() {\n this.iframe = $('