Merge branch 'fionatay-master'

This commit is contained in:
Piotr Sarnacki 2013-04-30 02:47:34 +02:00
commit 7ebd2bfcad
13 changed files with 233 additions and 127 deletions

View File

@ -13,20 +13,23 @@
Travis.setLocale Travis.default_locale Travis.setLocale Travis.default_locale
@set('state', 'signed-out') @set('state', 'signed-out')
@set('user', undefined) @set('user', undefined)
user = Travis.__container__.lookup('controller:currentUser').get('content') if user = Travis.__container__.lookup('controller:currentUser').get('content')
if user.get('stateManager.currentPath') == 'rootState.loaded.updated.uncommitted' if user.get('stateManager.currentPath') == 'rootState.loaded.updated.uncommitted'
user.send('rollback') user.send('rollback')
user.unloadRecord() user.unloadRecord()
Travis.__container__.lookup('controller:currentUser').set('content', null) Travis.__container__.lookup('controller:currentUser').set('content', null)
Travis.__container__.lookup('router:main').send('afterSignOut') Travis.__container__.lookup('router:main').send('afterSignOut')
signIn: -> signIn: (data) ->
@set('state', 'signing-in') if data
url = "#{@endpoint}/auth/post_message?origin=#{@receivingEnd}" @autoSignIn(data)
$('<iframe id="auth-frame" />').hide().appendTo('body').attr('src', url) else
@set('state', 'signing-in')
url = "#{@endpoint}/auth/post_message?origin=#{@receivingEnd}"
$('<iframe id="auth-frame" />').hide().appendTo('body').attr('src', url)
autoSignIn: -> autoSignIn: (data) ->
data = @userDataFrom(Travis.sessionStorage) || @userDataFrom(Travis.storage) data ||= @userDataFrom(Travis.sessionStorage) || @userDataFrom(Travis.storage)
@setData(data) if data @setData(data) if data
userDataFrom: (storage) -> userDataFrom: (storage) ->

View File

@ -1,7 +1,20 @@
require 'travis/limited_array' require 'travis/limited_array'
Travis.ReposController = Ember.ArrayController.extend Travis.ReposController = Ember.ArrayController.extend
defaultTab: 'recent' defaultTab: ( ->
if @get('currentUser.id')
'owned'
else
'recent'
).property('currentUser')
currentUserIdDidChange: (->
if @get('currentUser.id')
@activate('owned')
else if @get('tab') == 'owned'
@activate('recent')
).observes('currentUser.id')
isLoadedBinding: 'content.isLoaded' isLoadedBinding: 'content.isLoaded'
needs: ['currentUser', 'repo'] needs: ['currentUser', 'repo']
currentUserBinding: 'controllers.currentUser' currentUserBinding: 'controllers.currentUser'
@ -34,7 +47,7 @@ Travis.ReposController = Ember.ArrayController.extend
Ember.run.later(@updateTimes.bind(this), Travis.INTERVALS.updateTimes) Ember.run.later(@updateTimes.bind(this), Travis.INTERVALS.updateTimes)
activate: (tab, params) -> activate: (tab, params) ->
tab ||= @defaultTab tab ||= @get('defaultTab')
@set('tab', tab) @set('tab', tab)
this["view#{$.camelize(tab)}"](params) this["view#{$.camelize(tab)}"](params)

View File

@ -1,10 +1,12 @@
<ul class="tabs"> <ul class="tabs">
<li id="tab_recent" {{bindAttr class="view.classRecent"}}>
<h5><a {{action activate "recent" target="view"}}>{{t layouts.application.recent}}</a></h5>
</li>
<li id="tab_owned" {{bindAttr class="view.classOwned"}}> <li id="tab_owned" {{bindAttr class="view.classOwned"}}>
<h5><a {{action activate "owned" target="view"}}>{{t layouts.application.my_repositories}}</a></h5> <h5><a {{action activate "owned" target="view"}}>{{t layouts.application.my_repositories}}</a></h5>
</li> </li>
<li id="tab_recent" {{bindAttr class="view.classRecent"}}>
<h5><a {{action activate "recent" target="view"}}>{{t layouts.application.recent}}</a></h5>
</li>
<li id="tab_search" {{bindAttr class="view.classSearch"}}> <li id="tab_search" {{bindAttr class="view.classSearch"}}>
<h5><a {{action activate "search" target="view"}}>{{t layouts.application.search}}</a></h5> <h5><a {{action activate "search" target="view"}}>{{t layouts.application.search}}</a></h5>
</li> </li>

View File

@ -10,6 +10,20 @@ Travis.reopen
@get('repos.isLoaded') && @get('repos.length') == 0 @get('repos.isLoaded') && @get('repos.length') == 0
).property('repos.isLoaded', 'repos.length') ).property('repos.isLoaded', 'repos.length')
repoIsLoadedDidChange: (->
# Ember does not automatically rerender outlets and sometimes 'pane' outlet
# in repos/show.hbs is empty when view is rerendered without routing
# taking place. Try to render the default outlet in such case
# TODO: look into fixing it in more general way
pane = Ember.get('_outlets.pane')
if @get('controller.repo.isLoaded') && @state == 'inDOM' &&
@get('controller.tab') == 'current' && (!pane || pane.state == 'destroyed')
view = @get('controller.container').lookup('view:build')
view.set('controller', @get('controller.container').lookup('controller:build'))
Ember.run.next =>
@connectOutlet('pane', view)
).observes('controller.repo.isLoaded')
ReposEmptyView: Travis.View.extend ReposEmptyView: Travis.View.extend
template: '' template: ''

View File

@ -2,10 +2,8 @@ describe 'on the "build" state', ->
beforeEach -> beforeEach ->
app '/travis-ci/travis-core/builds/1' app '/travis-ci/travis-core/builds/1'
console.log 'wait for repos'
waitFor reposRendered waitFor reposRendered
runs -> runs ->
console.log 'wait for build'
waitFor buildRendered waitFor buildRendered
it 'displays the expected stuff', -> it 'displays the expected stuff', ->

View File

@ -71,38 +71,38 @@ describe 'events', ->
beforeEach -> beforeEach ->
app 'travis-ci/travis-core' app 'travis-ci/travis-core'
waitFor jobsRendered, 'jobs should be rendered' waitFor jobsRendered, 'jobs should be rendered'
runs -> #runs ->
waitFor queuesRendered, 'queues should be rendered' # waitFor queuesRendered, 'queues should be rendered'
it 'adds a job to the jobs queue', -> #it 'adds a job to the jobs queue', ->
payload = # payload =
job: # job:
id: 12 # id: 12
repository_id: 1 # repository_id: 1
number: '1.4' # number: '1.4'
queue: 'builds.linux' # queue: 'builds.linux'
$.mockjax # $.mockjax
url: '/jobs/12' # url: '/jobs/12'
responseTime: 0 # responseTime: 0
responseText: payload # responseText: payload
Em.run -> # Em.run ->
Travis.receive 'job:started', # Travis.receive 'job:started',
job: # job:
id: 12 # id: 12
repository_id: 1 # repository_id: 1
repository_slug: 'travis-ci/travis-core' # repository_slug: 'travis-ci/travis-core'
number: '1.4' # number: '1.4'
queue: 'builds.linux' # queue: 'builds.linux'
state: 'created' # state: 'created'
waits(1000) # waits(1000)
runs -> # runs ->
listsQueuedJob # listsQueuedJob
name: 'linux' # name: 'linux'
row: 3 # row: 3
item: { number: '1.4', repo: 'travis-ci/travis-core' } # item: { number: '1.4', repo: 'travis-ci/travis-core' }
it 'updates only keys that are available', -> it 'updates only keys that are available', ->
Em.run -> Em.run ->
@ -118,72 +118,72 @@ describe 'events', ->
row: 1 row: 1
item: { id: 1, number: '1.1', repo: 'travis-ci/travis-core', finishedAt: '3 minutes ago', duration: '30 sec', rvm: 'rbx' } item: { id: 1, number: '1.1', repo: 'travis-ci/travis-core', finishedAt: '3 minutes ago', duration: '30 sec', rvm: 'rbx' }
describe 'an event adding a worker', -> #describe 'an event adding a worker', ->
beforeEach -> # beforeEach ->
app '' # app ''
waitFor sidebarTabsRendered # waitFor sidebarTabsRendered
runs -> # runs ->
$('#right #tab_workers a').trigger('click') # $('#right #tab_workers a').trigger('click')
waitFor workersRendered # waitFor workersRendered
it 'adds a worker to the workers list', -> # it 'adds a worker to the workers list', ->
payload = # payload =
worker: # worker:
id: 10 # id: 10
host: 'worker.travis-ci.org' # host: 'worker.travis-ci.org'
name: 'ruby-3' # name: 'ruby-3'
state: 'ready' # state: 'ready'
$.mockjax # $.mockjax
url: '/workers/10' # url: '/workers/10'
responseTime: 0 # responseTime: 0
responseText: payload # responseText: payload
Em.run -> # Em.run ->
Travis.receive 'worker:created', # Travis.receive 'worker:created',
worker: # worker:
id: 10 # id: 10
name: 'ruby-3' # name: 'ruby-3'
host: 'worker.travis-ci.org' # host: 'worker.travis-ci.org'
state: 'ready' # state: 'ready'
waits(100) # waits(100)
runs -> # runs ->
listsWorker # listsWorker
group: 'worker.travis-ci.org' # group: 'worker.travis-ci.org'
row: 3 # row: 3
item: { name: 'ruby-3', state: 'ready' } # item: { name: 'ruby-3', state: 'ready' }
describe 'an event updating a worker', -> #describe 'an event updating a worker', ->
beforeEach -> # beforeEach ->
app '/travis-ci/travis-core' # app '/travis-ci/travis-core'
waitFor sidebarTabsRendered # waitFor sidebarTabsRendered
runs -> # runs ->
$('#right #tab_workers a').trigger('click') # $('#right #tab_workers a').trigger('click')
waitFor workersRendered # waitFor workersRendered
it 'does not update repository if it\'s already in the store', -> # it 'does not update repository if it\'s already in the store', ->
payload = # payload =
worker: # worker:
id: 1 # id: 1
host: 'worker.travis-ci.org' # host: 'worker.travis-ci.org'
name: 'ruby-2' # name: 'ruby-2'
state: 'working' # state: 'working'
payload: # payload:
repository: # repository:
id: 1 # id: 1
last_build_id: 999 # last_build_id: 999
last_build_number: '999' # last_build_number: '999'
Em.run -> # Em.run ->
Travis.receive 'worker:updated', payload # Travis.receive 'worker:updated', payload
waits(100) # waits(100)
runs -> # runs ->
listsRepo # listsRepo
row: 2 # row: 2
item: { slug: 'travis-ci/travis-core', build: { number: 1, url: '/travis-ci/travis-core/builds/1', duration: '30 sec', finishedAt: '3 minutes ago' } } # item: { slug: 'travis-ci/travis-core', build: { number: 1, url: '/travis-ci/travis-core/builds/1', duration: '30 sec', finishedAt: '3 minutes ago' } }

View File

@ -0,0 +1,52 @@
describe 'my repos tab', ->
describe 'when user is signed in', ->
beforeEach ->
app '/', user: true
waitFor myReposRendered, 'my repositories'
runs ->
waitFor buildRendered, 'build view'
it 'is active', ->
listsRepos [
{ slug: 'travis-ci/travis-core', build: { number: 1, url: '/travis-ci/travis-core/builds/1', duration: '30 sec', finishedAt: '3 minutes ago' } }
{ slug: 'travis-ci/travis-hub', build: { number: 4, url: '/travis-ci/travis-hub/builds/4', duration: '1 min', finishedAt: '-' } }
]
displaysRepository
href: 'http://github.com/travis-ci/travis-core'
displaysSummary
type: 'build'
id: 1
repo: 'travis-ci/travis-core'
commit: '1234567'
branch: 'master'
compare: '0123456..1234567'
finishedAt: '3 minutes ago'
duration: '30 sec'
message: 'commit message 1'
describe 'when user is not signed in', ->
beforeEach ->
app '/'
waitFor reposRendered, 'repositories list'
runs ->
waitFor buildRendered, 'build view'
it 'is activated when user signs in', ->
listsRepos [
{ slug: 'travis-ci/travis-hub', build: { number: 4, url: '/travis-ci/travis-hub/builds/4', duration: '1 min', finishedAt: '-' } }
{ slug: 'travis-ci/travis-core', build: { number: 1, url: '/travis-ci/travis-core/builds/1', duration: '30 sec', finishedAt: '3 minutes ago' } }
{ slug: 'travis-ci/travis-assets', build: { number: 3, url: '/travis-ci/travis-assets/builds/3', duration: '30 sec', finishedAt: 'a day ago' } }
]
signInUser()
waitFor myReposRendered, 'my repositories'
runs ->
waitFor buildRendered, 'build view'
runs ->
listsRepos [
{ slug: 'travis-ci/travis-core', build: { number: 1, url: '/travis-ci/travis-core/builds/1', duration: '30 sec', finishedAt: '3 minutes ago' } }
{ slug: 'travis-ci/travis-hub', build: { number: 4, url: '/travis-ci/travis-hub/builds/4', duration: '1 min', finishedAt: '-' } }
]

View File

@ -1,12 +1,12 @@
describe 'the sidebar', -> #describe 'the sidebar', ->
beforeEach -> # beforeEach ->
app 'travis-ci/travis-core/jobs/1' # app 'travis-ci/travis-core/jobs/1'
waitFor jobRendered # waitFor jobRendered
runs -> # runs ->
waitFor hasText('#tab_build', 'Build #1') # waitFor hasText('#tab_build', 'Build #1')
#
it 'displays the expected stuff', -> # it 'displays the expected stuff', ->
listsQueues [ # listsQueues [
{ name: 'linux', item: { number: '5.1', repo: 'travis-ci/travis-core' } } # { name: 'linux', item: { number: '5.1', repo: 'travis-ci/travis-core' } }
{ name: 'linux', item: { number: '5.2', repo: 'travis-ci/travis-core' } } # { name: 'linux', item: { number: '5.2', repo: 'travis-ci/travis-core' } }
] # ]

View File

@ -1,11 +1,26 @@
minispade.require 'app' minispade.require 'app'
@app = (url) -> @signInUser = ->
# for now let's just use harcoded data to log in the user,
# we may extend it in the future to pass specific user data
Travis.auth.signIn
user:
id: 1
email: 'tyrion@example.org'
login: 'tyrion'
token: 'abcdef'
token: 'abcdef'
@app = (url, options = {}) ->
# TODO: this should wait till app is initialized, not some # TODO: this should wait till app is initialized, not some
# arbitrary amount of time # arbitrary amount of time
waits(50) waits(50)
runs -> runs ->
Travis.reset() Travis.reset()
Travis.auth.signOut()
if options.user
signInUser()
url = "/#{url}" unless url.match /^\// url = "/#{url}" unless url.match /^\//
Travis.__container__.lookup('router:main').handleURL(url) Travis.__container__.lookup('router:main').handleURL(url)

View File

@ -5,6 +5,7 @@
-> $(selector).text().trim() == text -> $(selector).text().trim() == text
@reposRendered = notEmpty('#repos li.selected') @reposRendered = notEmpty('#repos li.selected')
@myReposRendered = -> notEmpty('#repos li.selected')() && $('#left #tab_owned').hasClass('active')
@buildRendered = notEmpty('#summary .number') @buildRendered = notEmpty('#summary .number')
@buildsRendered = notEmpty('#builds .number') @buildsRendered = notEmpty('#builds .number')
@jobRendered = notEmpty('#summary .number') @jobRendered = notEmpty('#summary .number')

View File

@ -6,6 +6,14 @@ repos = [
{ id: '3', owner: 'travis-ci', name: 'travis-hub', slug: 'travis-ci/travis-hub', build_ids: [4], last_build_id: 4, last_build_number: 4, last_build_result: undefined, last_build_duration: undefined, last_build_started_at: '2012-07-02T00:02:00Z', last_build_finished_at: undefined, description: 'Description of travis-hub'}, { id: '3', owner: 'travis-ci', name: 'travis-hub', slug: 'travis-ci/travis-hub', build_ids: [4], last_build_id: 4, last_build_number: 4, last_build_result: undefined, last_build_duration: undefined, last_build_started_at: '2012-07-02T00:02:00Z', last_build_finished_at: undefined, description: 'Description of travis-hub'},
] ]
reposByName = (name) ->
# this is hardcoded as well as user is hardcoded in app() helper,
# please make it more flexible if needed
if name == 'tyrion'
[repos[0], repos[2]]
else
[]
builds = [ builds = [
{ id: '1', repository_id: '1', commit_id: 1, job_ids: [1, 2, 3], number: 1, pull_request: false, config: { rvm: ['rbx', '1.9.3', 'jruby'] }, duration: 30, started_at: '2012-07-02T00:00:00Z', finished_at: '2012-07-02T00:00:30Z', state: 'passed' }, { id: '1', repository_id: '1', commit_id: 1, job_ids: [1, 2, 3], number: 1, pull_request: false, config: { rvm: ['rbx', '1.9.3', 'jruby'] }, duration: 30, started_at: '2012-07-02T00:00:00Z', finished_at: '2012-07-02T00:00:30Z', state: 'passed' },
{ id: '2', repository_id: '1', commit_id: 2, job_ids: [4], number: 2, pull_request: false, config: { rvm: ['rbx'] } }, { id: '2', repository_id: '1', commit_id: 2, job_ids: [4], number: 2, pull_request: false, config: { rvm: ['rbx'] } },
@ -70,8 +78,11 @@ $.mockjax
this.responseText = { repos: [$.detect(repos, (repository) -> repository.slug == slug)] } this.responseText = { repos: [$.detect(repos, (repository) -> repository.slug == slug)] }
else if search = settings.data.search else if search = settings.data.search
this.responseText = { repos: $.select(repos, (repository) -> repository.slug.indexOf(search) > -1).toArray() } this.responseText = { repos: $.select(repos, (repository) -> repository.slug.indexOf(search) > -1).toArray() }
else if settings.data.member
this.responseText = { repos: reposByName(settings.data.member) }
else else
raise "don't know this ditty" console.log settings.data
throw 'unknown params for repos'
for repository in repos for repository in repos
$.mockjax $.mockjax

View File

@ -17,14 +17,6 @@
@include border-radius(4px) @include border-radius(4px)
background: $color-bg-input inline-image('ui/search.png') no-repeat right 8px background: $color-bg-input inline-image('ui/search.png') no-repeat right 8px
.tabs
#tab_owned
display: none
.tabs
#tab_owned.display
display: inline-block
.toggle-info .toggle-info
margin: 8px 20px 0 20px margin: 8px 20px 0 20px
display: inline-block display: inline-block

View File

@ -34,14 +34,19 @@
#left #left
.tabs .tabs
padding-left: 20px
margin-top: -29px margin-top: -29px
li:first-child
margin-left: 20px
#tab_search:not(.active) #tab_search:not(.active)
display: none display: none
#tab_owned
display: none
#tab_owned.display
display: inline-block
#main #main
.tabs .tabs
margin-top: 35px margin-top: 35px