This commit is contained in:
Sven Fuchs 2012-07-07 18:17:38 +02:00
parent 1150a5f703
commit 54b140d91b
17 changed files with 447 additions and 401 deletions

View File

@ -2,6 +2,17 @@ require 'helpers'
require 'travis/ticker' require 'travis/ticker'
Travis.reopen Travis.reopen
Controller: Em.Controller.extend
init: ->
for name in Array.prototype.slice.apply(arguments)
name = "#{$.camelize(name, false)}Controller"
klass = Travis[$.camelize(name)] || Em.Controller
this[name] = klass.create(parent: this, namespace: Travis, controllers: this)
connectTop: ->
@connectOutlet(outletName: 'top', controller: @topController, viewClass: Travis.TopView)
@topController.set('tab', @get('name'))
RepositoriesController: Ember.ArrayController.extend RepositoriesController: Ember.ArrayController.extend
# sortProperties: ['sortOrder'] # sortProperties: ['sortOrder']
# sortAscending: false # sortAscending: false
@ -19,7 +30,6 @@ Travis.reopen
# TopController: Em.Controller.extend # TopController: Em.Controller.extend
# userBinding: 'Travis.app.currentUser' # userBinding: 'Travis.app.currentUser'
require 'controllers/base'
require 'controllers/home' require 'controllers/home'
require 'controllers/profile' require 'controllers/profile'
require 'controllers/repository' require 'controllers/repository'

View File

@ -1,11 +0,0 @@
Travis.Controller = Em.Controller.extend
init: ->
for name in Array.prototype.slice.apply(arguments)
name = "#{$.camelize(name, false)}Controller"
klass = Travis[$.camelize(name)] || Em.Controller
this[name] = klass.create(parent: this, namespace: Travis, controllers: this)
connectTop: ->
@connectOutlet(outletName: 'top', controller: @topController, viewClass: Travis.TopView)
@topController.set('tab', @get('name'))

View File

@ -1,43 +1,45 @@
Travis.RepositoryController = Travis.Controller.extend Travis.RepositoryController = Travis.Controller.extend
bindings: [] bindings: []
params: {}
init: -> init: ->
@_super('builds', 'build', 'job') @_super('builds', 'build', 'job')
activate: (action, params) -> activate: (action, params) ->
@_unbind() @_unbind()
@setParams(params)
# console.log "view#{$.camelize(action)}"
this["view#{$.camelize(action)}"]() this["view#{$.camelize(action)}"]()
@set('params', params)
viewIndex: -> viewIndex: ->
@connectTab('current')
@_bind('repository', 'controllers.repositoriesController.firstObject') @_bind('repository', 'controllers.repositoriesController.firstObject')
@_bind('build', 'repository.lastBuild') @_bind('build', 'repository.lastBuild')
@connectTab('current')
viewCurrent: -> viewCurrent: ->
@connectTab('current')
@_bind('repository', 'repositoriesByParams.firstObject') @_bind('repository', 'repositoriesByParams.firstObject')
@_bind('build', 'repository.lastBuild') @_bind('build', 'repository.lastBuild')
@connectTab('current')
viewBuilds: -> viewBuilds: ->
@connectTab('builds')
@_bind('repository', 'repositoriesByParams.firstObject') @_bind('repository', 'repositoriesByParams.firstObject')
@_bind('builds', 'repository.builds') @_bind('builds', 'repository.builds')
@connectTab('builds')
viewBuild: -> viewBuild: ->
@connectTab('build')
@_bind('repository', 'repositoriesByParams.firstObject') @_bind('repository', 'repositoriesByParams.firstObject')
@_bind('build', 'buildById') @_bind('build', 'buildById')
@connectTab('build')
viewJob: -> viewJob: ->
@connectTab('job')
@_bind('repository', 'repositoriesByParams.firstObject') @_bind('repository', 'repositoriesByParams.firstObject')
@_bind('build', 'job.build') @_bind('build', 'job.build')
@_bind('job', 'jobById') @_bind('job', 'jobById')
@connectTab('job')
repositoriesByParams: (-> repositoriesByParams: (->
Travis.Repository.bySlug("#{params.owner}/#{params.name}") if params = @get('params') Travis.Repository.bySlug("#{@getPath('params.owner')}/#{@getPath('params.name')}")
).property('params') ).property('params.owner', 'params.name')
buildById: (-> buildById: (->
Travis.Build.find(id) if id = @getPath('params.id') Travis.Build.find(id) if id = @getPath('params.id')
@ -48,9 +50,14 @@ Travis.RepositoryController = Travis.Controller.extend
).property('params.id') ).property('params.id')
connectTab: (tab) -> connectTab: (tab) ->
@set('tab', tab) unless tab == @get('tab')
name = if tab == 'current' then 'build' else tab @set('tab', tab)
@connectOutlet(outletName: 'pane', controller: this, viewClass: Travis["#{$.camelize(name)}View"]) name = if tab == 'current' then 'build' else tab
@connectOutlet(outletName: 'pane', controller: this, viewClass: Travis["#{$.camelize(name)}View"])
setParams: (params) ->
# TODO if we just @set('params', params) it will update the repositoriesByParams property
@setPath("params.#{key}", params[key]) for key, value of params
_bind: (to, from) -> _bind: (to, from) ->
@bindings.push Ember.oneWay(this, to, from) @bindings.push Ember.oneWay(this, to, from)

View File

@ -60,15 +60,13 @@ require 'travis/model'
@find(search: query, orderBy: 'name') @find(search: query, orderBy: 'name')
bySlug: (slug) -> bySlug: (slug) ->
# TODO use filter? @find(slug: slug)
repo = $.detect(@find().toArray(), (repo) -> repo.get('slug') == slug)
if repo then Ember.ArrayProxy.create(content: [repo]) else @find(slug: slug)
select: (id) -> select: (id) ->
@find().forEach (repository) -> @find().forEach (repository) ->
repository.set 'selected', repository.get('id') is id repository.set 'selected', repository.get('id') is id
buildURL: (slug) -> # buildURL: (slug) ->
if slug then slug else 'repositories' # if slug then slug else 'repositories'

View File

@ -23,5 +23,5 @@ Travis.Router = Em.Object.extend
action: (name, action, params) -> action: (name, action, params) ->
# this needs to be a global reference because Em.routes is global # this needs to be a global reference because Em.routes is global
layout = Travis.app.connectLayout(name) layout = Travis.app.connectLayout(name)
layout.activate(action, params) layout.activate(action, params || {})
$('body').attr('id', name) $('body').attr('id', name)

View File

@ -1,8 +1,14 @@
<pre id="log">{{{formatLog log.body}}}</pre> {{#if log.isLoaded}}
<pre id="log">{{{formatLog log.body}}}</pre>
{{#if sponsor.name}} {{#if sponsor.name}}
<p class="sponsor"> <p class="sponsor">
{{t builds.messages.sponsored_by}} {{t builds.messages.sponsored_by}}
<a {{bindAttr href="sponsor.url"}}>{{sponsor.name}}</a> <a {{bindAttr href="sponsor.url"}}>{{sponsor.name}}</a>
</p> </p>
{{/if}}
{{else}}
<div id="log" class="loading">
<span>Loading</span>
</div>
{{/if}} {{/if}}

View File

@ -36,5 +36,9 @@
{{view Travis.LogView contextBinding="job"}}} {{view Travis.LogView contextBinding="job"}}}
</div> </div>
{{else}}
<div id="job" class="loading">
<span>Loading</span>
</div>
{{/if}} {{/if}}
{{/with}} {{/with}}

View File

@ -20,5 +20,6 @@ require 'views/build'
require 'views/job' require 'views/job'
require 'views/repo' require 'views/repo'
require 'views/profile' require 'views/profile'
require 'views/tabs'
require 'views/top' require 'views/top'

View File

@ -41,75 +41,3 @@
urlGithubNetwork: (-> urlGithubNetwork: (->
Travis.Urls.githubNetwork(@getPath('repository.slug')) Travis.Urls.githubNetwork(@getPath('repository.slug'))
).property('repository.slug'), ).property('repository.slug'),
TabsView: Em.View.extend
templateName: 'repositories/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')
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(@getPath('repository.slug'))
).property('repository.slug')
urlBuilds: (->
Travis.Urls.builds(@getPath('repository.slug'))
).property('repository.slug')
urlBuild: (->
Travis.Urls.build(@getPath('repository.slug'), @getPath('build.id'))
).property('repository.slug', 'build.id')
urlJob: (->
Travis.Urls.job(@getPath('repository.slug'), @getPath('job.id'))
).property('repository.slug', 'job.id')
branches: (->
@getPath('repository.branches')
).property('repository.id')
urlStatusImage: (->
Travis.Urls.statusImage(@getPath('repository.slug'), @getPath('branch.commit.branch'))
).property('repository.slug', 'branch')
markdownStatusImage: (->
"[![Build Status](#{@get('urlStatusImage')})](#{@get('urlRepository')})"
).property('urlStatusImage')
textileStatusImage: (->
"!#{@get('urlStatusImage')}!:#{@get('urlRepository')}"
).property('urlStatusImage')
rdocStatusImage: (->
"{<img src=\"#{@get('urlStatusImage')}\" alt=\"Build Status\" />}[#{@get('urlRepository')}]"
).property('urlStatusImage')

View File

@ -0,0 +1,74 @@
@Travis.reopen
TabsView: Em.View.extend
templateName: 'repositories/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')
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(@getPath('repository.slug'))
).property('repository.slug')
urlBuilds: (->
Travis.Urls.builds(@getPath('repository.slug'))
).property('repository.slug')
urlBuild: (->
Travis.Urls.build(@getPath('repository.slug'), @getPath('build.id'))
).property('repository.slug', 'build.id')
urlJob: (->
Travis.Urls.job(@getPath('repository.slug'), @getPath('job.id'))
).property('repository.slug', 'job.id')
branches: (->
@getPath('repository.branches')
).property('repository.id')
urlStatusImage: (->
Travis.Urls.statusImage(@getPath('repository.slug'), @getPath('branch.commit.branch'))
).property('repository.slug', 'branch')
markdownStatusImage: (->
"[![Build Status](#{@get('urlStatusImage')})](#{@get('urlRepository')})"
).property('urlStatusImage')
textileStatusImage: (->
"!#{@get('urlStatusImage')}!:#{@get('urlRepository')}"
).property('urlStatusImage')
rdocStatusImage: (->
"{<img src=\"#{@get('urlStatusImage')}\" alt=\"Build Status\" />}[#{@get('urlRepository')}]"
).property('urlStatusImage')

View File

@ -60,6 +60,7 @@ hooks = [
$.mockjax $.mockjax
url: '/repositories' url: '/repositories'
data: {}
responseTime: responseTime responseTime: responseTime
responseText: { repositories: repositories } responseText: { repositories: repositories }
@ -69,6 +70,12 @@ for repository in repositories
responseTime: responseTime responseTime: responseTime
responseText: { repository: repository } responseText: { repository: repository }
$.mockjax
url: '/repositories'
data: { slug: repository.slug }
responseTime: responseTime
responseText: { repositories: [repository] }
for build in builds for build in builds
$.mockjax $.mockjax
url: '/builds/' + build.id url: '/builds/' + build.id

View File

@ -136,8 +136,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})(); })();
// Version: v0.9.8.1-468-g3097ea8 // Version: v0.9.8.1-484-g73ac0a4
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700) // Last commit: 73ac0a4 (2012-07-06 11:52:32 -0700)
(function() { (function() {
@ -9292,6 +9292,8 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
var content = get(this, 'content'), var content = get(this, 'content'),
len = content ? get(content, 'length') : 0; len = content ? get(content, 'length') : 0;
Ember.assert("Can't set ArrayProxy's content to itself", content !== this);
if (content) { if (content) {
content.addArrayObserver(this, { content.addArrayObserver(this, {
willChange: 'contentArrayWillChange', willChange: 'contentArrayWillChange',
@ -9318,6 +9320,8 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
var arrangedContent = get(this, 'arrangedContent'), var arrangedContent = get(this, 'arrangedContent'),
len = arrangedContent ? get(arrangedContent, 'length') : 0; len = arrangedContent ? get(arrangedContent, 'length') : 0;
Ember.assert("Can't set ArrayProxy's content to itself", arrangedContent !== this);
if (arrangedContent) { if (arrangedContent) {
arrangedContent.addArrayObserver(this, { arrangedContent.addArrayObserver(this, {
willChange: 'arrangedContentArrayWillChange', willChange: 'arrangedContentArrayWillChange',
@ -9516,6 +9520,10 @@ Ember.ObjectProxy = Ember.Object.extend(
*/ */
content: null, content: null,
/** @private */ /** @private */
_contentDidChange: Ember.observer(function() {
Ember.assert("Can't set ObjectProxy's content to itself", this.get('content') !== this);
}, 'content'),
/** @private */
delegateGet: function (key) { delegateGet: function (key) {
var content = get(this, 'content'); var content = get(this, 'content');
if (content) { if (content) {
@ -10540,7 +10548,6 @@ var get = Ember.get, set = Ember.set;
Ember.HashLocation = Ember.Object.extend({ Ember.HashLocation = Ember.Object.extend({
init: function() { init: function() {
set(this, 'location', get(this, 'location') || window.location); set(this, 'location', get(this, 'location') || window.location);
set(this, 'callbacks', Ember.A());
}, },
/** /**
@ -10573,22 +10580,16 @@ Ember.HashLocation = Ember.Object.extend({
*/ */
onUpdateURL: function(callback) { onUpdateURL: function(callback) {
var self = this; var self = this;
var guid = Ember.guidFor(this);
var hashchange = function() { Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
var path = location.hash.substr(1); var path = location.hash.substr(1);
if (get(self, 'lastSetURL') === path) { return; } if (get(self, 'lastSetURL') === path) { return; }
set(self, 'lastSetURL', null); set(self, 'lastSetURL', null);
callback(location.hash.substr(1)); callback(location.hash.substr(1));
}; });
get(this, 'callbacks').pushObject(hashchange);
// This won't work on old browsers anyway, but this check prevents errors
if (window.addEventListener) {
window.addEventListener('hashchange', hashchange, false);
}
}, },
/** /**
@ -10605,10 +10606,9 @@ Ember.HashLocation = Ember.Object.extend({
}, },
willDestroy: function() { willDestroy: function() {
get(this, 'callbacks').forEach(function(callback) { var guid = Ember.guidFor(this);
window.removeEventListener('hashchange', callback, false);
}); Ember.$(window).unbind('hashchange.ember-location-'+guid);
set(this, 'callbacks', null);
} }
}); });
@ -10629,7 +10629,6 @@ Ember.HistoryLocation = Ember.Object.extend({
init: function() { init: function() {
set(this, 'location', get(this, 'location') || window.location); set(this, 'location', get(this, 'location') || window.location);
set(this, '_initialURL', get(this, 'location').pathname); set(this, '_initialURL', get(this, 'location').pathname);
set(this, 'callbacks', Ember.A());
}, },
/** /**
@ -10672,18 +10671,11 @@ Ember.HistoryLocation = Ember.Object.extend({
history changes, including using forward and back buttons. history changes, including using forward and back buttons.
*/ */
onUpdateURL: function(callback) { onUpdateURL: function(callback) {
var self = this; var guid = Ember.guidFor(this);
var popstate = function(e) { Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
callback(location.pathname); callback(location.pathname);
}; });
get(this, 'callbacks').pushObject(popstate);
// This won't work on old browsers anyway, but this check prevents errors
if (window.addEventListener) {
window.addEventListener('popstate', popstate, false);
}
}, },
/** /**
@ -10697,10 +10689,9 @@ Ember.HistoryLocation = Ember.Object.extend({
}, },
willDestroy: function() { willDestroy: function() {
get(this, 'callbacks').forEach(function(callback) { var guid = Ember.guidFor(this);
window.removeEventListener('popstate', callback, false);
}); Ember.$(window).unbind('popstate.ember-location-'+guid);
set(this, 'callbacks', null);
} }
}); });
@ -11520,6 +11511,8 @@ Ember.ControllerMixin.reopen({
var viewClassName = name.charAt(0).toUpperCase() + name.substr(1) + "View"; var viewClassName = name.charAt(0).toUpperCase() + name.substr(1) + "View";
viewClass = get(namespace, viewClassName); viewClass = get(namespace, viewClassName);
controller = get(controllers, name + 'Controller');
Ember.assert("The name you supplied " + name + " did not resolve to a view " + viewClassName, !!viewClass); Ember.assert("The name you supplied " + name + " did not resolve to a view " + viewClassName, !!viewClass);
Ember.assert("The name you supplied " + name + " did not resolve to a controller " + name + 'Controller', (!!controller && !!context) || !context); Ember.assert("The name you supplied " + name + " did not resolve to a controller " + name + 'Controller', (!!controller && !!context) || !context);
} }
@ -11578,17 +11571,6 @@ var childViewsProperty = Ember.computed(function() {
return ret; return ret;
}).property().cacheable(); }).property().cacheable();
var controllerProperty = Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable();
var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT; var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT;
Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT); Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT);
@ -12057,7 +12039,17 @@ Ember.View = Ember.Object.extend(Ember.Evented,
@type Object @type Object
*/ */
controller: controllerProperty, controller: Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable(),
/** /**
A view may contain a layout. A layout is a regular template but A view may contain a layout. A layout is a regular template but
supersedes the `template` property during rendering. It is the supersedes the `template` property during rendering. It is the
@ -12122,22 +12114,20 @@ Ember.View = Ember.Object.extend(Ember.Evented,
to be re-rendered. to be re-rendered.
*/ */
_context: Ember.computed(function(key, value) { _context: Ember.computed(function(key, value) {
var parentView, context; var parentView, controller;
if (arguments.length === 2) { if (arguments.length === 2) {
return value; return value;
} }
if (VIEW_PRESERVES_CONTEXT) { if (VIEW_PRESERVES_CONTEXT) {
if (Ember.meta(this).descs.controller !== controllerProperty) { if (controller = get(this, 'controller')) {
if (context = get(this, 'controller')) { return controller;
return context;
}
} }
parentView = get(this, '_parentView'); parentView = get(this, '_parentView');
if (parentView && (context = get(parentView, '_context'))) { if (parentView) {
return context; return get(parentView, '_context');
} }
} }
@ -16539,6 +16529,7 @@ Ember.StateManager.reopen(
view; view;
while (currentState) { while (currentState) {
// TODO: Remove this when view state is removed
if (get(currentState, 'isViewState')) { if (get(currentState, 'isViewState')) {
view = get(currentState, 'view'); view = get(currentState, 'view');
if (view) { return view; } if (view) { return view; }
@ -18950,6 +18941,7 @@ ActionHelper.registerAction = function(actionName, eventName, target, view, cont
if (target.isState && typeof target.send === 'function') { if (target.isState && typeof target.send === 'function') {
return target.send(actionName, event); return target.send(actionName, event);
} else { } else {
Ember.assert(Ember.String.fmt('Target %@ does not have action %@', [target, actionName]), target[actionName]);
return target[actionName].call(target, event); return target[actionName].call(target, event);
} }
} }
@ -19618,7 +19610,12 @@ Ember.TextArea = Ember.View.extend(Ember.TextSupport,
(function() { (function() {
Ember.TabContainerView = Ember.View.extend(); Ember.TabContainerView = Ember.View.extend({
init: function() {
Ember.deprecate("Ember.TabContainerView is deprecated and will be removed from future releases.");
this._super();
}
});
})(); })();
@ -19634,7 +19631,12 @@ Ember.TabPaneView = Ember.View.extend({
isVisible: Ember.computed(function() { isVisible: Ember.computed(function() {
return get(this, 'viewName') === getPath(this, 'tabsContainer.currentView'); return get(this, 'viewName') === getPath(this, 'tabsContainer.currentView');
}).property('tabsContainer.currentView').volatile() }).property('tabsContainer.currentView').volatile(),
init: function() {
Ember.deprecate("Ember.TabPaneView is deprecated and will be removed from future releases.");
this._super();
}
}); });
})(); })();
@ -19651,6 +19653,11 @@ Ember.TabView = Ember.View.extend({
mouseUp: function() { mouseUp: function() {
setPath(this, 'tabsContainer.currentView', get(this, 'value')); setPath(this, 'tabsContainer.currentView', get(this, 'value'));
},
init: function() {
Ember.deprecate("Ember.TabView is deprecated and will be removed from future releases.");
this._super();
} }
}); });
@ -20057,7 +20064,7 @@ Ember.Handlebars.bootstrap = function(ctx) {
// id if no name is found. // id if no name is found.
templateName = script.attr('data-template-name') || script.attr('id'), templateName = script.attr('data-template-name') || script.attr('id'),
template = compile(script.html()), template = compile(script.html()),
view, viewPath, elementId, tagName, options; view, viewPath, elementId, options;
if (templateName) { if (templateName) {
// For templates which have a name, we save them and then remove them from the DOM // For templates which have a name, we save them and then remove them from the DOM
@ -20086,13 +20093,8 @@ Ember.Handlebars.bootstrap = function(ctx) {
// Look for data-element-id attribute. // Look for data-element-id attribute.
elementId = script.attr('data-element-id'); elementId = script.attr('data-element-id');
// Users can optionally specify a custom tag name to use by setting the
// data-tag-name attribute on the script tag.
tagName = script.attr('data-tag-name');
options = { template: template }; options = { template: template };
if (elementId) { options.elementId = elementId; } if (elementId) { options.elementId = elementId; }
if (tagName) { options.tagName = tagName; }
view = view.create(options); view = view.create(options);
@ -20125,8 +20127,8 @@ Ember.$(document).ready(
})(); })();
// Version: v0.9.8.1-468-g3097ea8 // Version: v0.9.8.1-484-g73ac0a4
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700) // Last commit: 73ac0a4 (2012-07-06 11:52:32 -0700)
(function() { (function() {

View File

@ -130,7 +130,13 @@
function logMock( mockHandler, requestSettings ) { function logMock( mockHandler, requestSettings ) {
var c = $.extend({}, $.mockjaxSettings, mockHandler); var c = $.extend({}, $.mockjaxSettings, mockHandler);
if ( c.log && $.isFunction(c.log) ) { if ( c.log && $.isFunction(c.log) ) {
c.log('MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url, $.extend({}, requestSettings)); var url = requestSettings.url
if(requestSettings.data) {
params = []
for(key in requestSettings.data) params.push(key + '=' + requestSettings.data[key])
url = url + '?' + params.join('&')
}
c.log('MOCK ' + requestSettings.type.toUpperCase() + ': ' + url, $.extend({}, requestSettings));
} }
} }

View File

@ -5,7 +5,7 @@
font-size: 13px font-size: 13px
color: #999 color: #999
#log pre#log
clear: left clear: left
white-space: pre-wrap white-space: pre-wrap
word-wrap: break-word word-wrap: break-word
@ -82,6 +82,7 @@
.bg-white .bg-white
background-color: white background-color: white
#log.loading
padding: 25px 0 0 10px

File diff suppressed because one or more lines are too long

View File

@ -2090,8 +2090,8 @@ window.ember_deprecateFunc = Ember.deprecateFunc("ember_deprecateFunc is deprec
})(); })();
// Version: v0.9.8.1-468-g3097ea8 // Version: v0.9.8.1-484-g73ac0a4
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700) // Last commit: 73ac0a4 (2012-07-06 11:52:32 -0700)
(function() { (function() {
@ -11246,6 +11246,8 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
var content = get(this, 'content'), var content = get(this, 'content'),
len = content ? get(content, 'length') : 0; len = content ? get(content, 'length') : 0;
Ember.assert("Can't set ArrayProxy's content to itself", content !== this);
if (content) { if (content) {
content.addArrayObserver(this, { content.addArrayObserver(this, {
willChange: 'contentArrayWillChange', willChange: 'contentArrayWillChange',
@ -11272,6 +11274,8 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,
var arrangedContent = get(this, 'arrangedContent'), var arrangedContent = get(this, 'arrangedContent'),
len = arrangedContent ? get(arrangedContent, 'length') : 0; len = arrangedContent ? get(arrangedContent, 'length') : 0;
Ember.assert("Can't set ArrayProxy's content to itself", arrangedContent !== this);
if (arrangedContent) { if (arrangedContent) {
arrangedContent.addArrayObserver(this, { arrangedContent.addArrayObserver(this, {
willChange: 'arrangedContentArrayWillChange', willChange: 'arrangedContentArrayWillChange',
@ -11470,6 +11474,10 @@ Ember.ObjectProxy = Ember.Object.extend(
*/ */
content: null, content: null,
/** @private */ /** @private */
_contentDidChange: Ember.observer(function() {
Ember.assert("Can't set ObjectProxy's content to itself", this.get('content') !== this);
}, 'content'),
/** @private */
delegateGet: function (key) { delegateGet: function (key) {
var content = get(this, 'content'); var content = get(this, 'content');
if (content) { if (content) {
@ -12494,7 +12502,6 @@ var get = Ember.get, set = Ember.set;
Ember.HashLocation = Ember.Object.extend({ Ember.HashLocation = Ember.Object.extend({
init: function() { init: function() {
set(this, 'location', get(this, 'location') || window.location); set(this, 'location', get(this, 'location') || window.location);
set(this, 'callbacks', Ember.A());
}, },
/** /**
@ -12527,22 +12534,16 @@ Ember.HashLocation = Ember.Object.extend({
*/ */
onUpdateURL: function(callback) { onUpdateURL: function(callback) {
var self = this; var self = this;
var guid = Ember.guidFor(this);
var hashchange = function() { Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
var path = location.hash.substr(1); var path = location.hash.substr(1);
if (get(self, 'lastSetURL') === path) { return; } if (get(self, 'lastSetURL') === path) { return; }
set(self, 'lastSetURL', null); set(self, 'lastSetURL', null);
callback(location.hash.substr(1)); callback(location.hash.substr(1));
}; });
get(this, 'callbacks').pushObject(hashchange);
// This won't work on old browsers anyway, but this check prevents errors
if (window.addEventListener) {
window.addEventListener('hashchange', hashchange, false);
}
}, },
/** /**
@ -12559,10 +12560,9 @@ Ember.HashLocation = Ember.Object.extend({
}, },
willDestroy: function() { willDestroy: function() {
get(this, 'callbacks').forEach(function(callback) { var guid = Ember.guidFor(this);
window.removeEventListener('hashchange', callback, false);
}); Ember.$(window).unbind('hashchange.ember-location-'+guid);
set(this, 'callbacks', null);
} }
}); });
@ -12583,7 +12583,6 @@ Ember.HistoryLocation = Ember.Object.extend({
init: function() { init: function() {
set(this, 'location', get(this, 'location') || window.location); set(this, 'location', get(this, 'location') || window.location);
set(this, '_initialURL', get(this, 'location').pathname); set(this, '_initialURL', get(this, 'location').pathname);
set(this, 'callbacks', Ember.A());
}, },
/** /**
@ -12626,18 +12625,11 @@ Ember.HistoryLocation = Ember.Object.extend({
history changes, including using forward and back buttons. history changes, including using forward and back buttons.
*/ */
onUpdateURL: function(callback) { onUpdateURL: function(callback) {
var self = this; var guid = Ember.guidFor(this);
var popstate = function(e) { Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
callback(location.pathname); callback(location.pathname);
}; });
get(this, 'callbacks').pushObject(popstate);
// This won't work on old browsers anyway, but this check prevents errors
if (window.addEventListener) {
window.addEventListener('popstate', popstate, false);
}
}, },
/** /**
@ -12651,10 +12643,9 @@ Ember.HistoryLocation = Ember.Object.extend({
}, },
willDestroy: function() { willDestroy: function() {
get(this, 'callbacks').forEach(function(callback) { var guid = Ember.guidFor(this);
window.removeEventListener('popstate', callback, false);
}); Ember.$(window).unbind('popstate.ember-location-'+guid);
set(this, 'callbacks', null);
} }
}); });
@ -13474,6 +13465,8 @@ Ember.ControllerMixin.reopen({
var viewClassName = name.charAt(0).toUpperCase() + name.substr(1) + "View"; var viewClassName = name.charAt(0).toUpperCase() + name.substr(1) + "View";
viewClass = get(namespace, viewClassName); viewClass = get(namespace, viewClassName);
controller = get(controllers, name + 'Controller');
Ember.assert("The name you supplied " + name + " did not resolve to a view " + viewClassName, !!viewClass); Ember.assert("The name you supplied " + name + " did not resolve to a view " + viewClassName, !!viewClass);
Ember.assert("The name you supplied " + name + " did not resolve to a controller " + name + 'Controller', (!!controller && !!context) || !context); Ember.assert("The name you supplied " + name + " did not resolve to a controller " + name + 'Controller', (!!controller && !!context) || !context);
} }
@ -13532,17 +13525,6 @@ var childViewsProperty = Ember.computed(function() {
return ret; return ret;
}).property().cacheable(); }).property().cacheable();
var controllerProperty = Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable();
var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT; var VIEW_PRESERVES_CONTEXT = Ember.VIEW_PRESERVES_CONTEXT;
Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT); Ember.warn("The way that the {{view}} helper affects templates is about to change. Previously, templates inside child views would use the new view as the context. Soon, views will preserve their parent context when rendering their template. You can opt-in early to the new behavior by setting `ENV.VIEW_PRESERVES_CONTEXT = true`. For more information, see https://gist.github.com/2494968. You should update your templates as soon as possible; this default will change soon, and the option will be eliminated entirely before the 1.0 release.", VIEW_PRESERVES_CONTEXT);
@ -14011,7 +13993,17 @@ Ember.View = Ember.Object.extend(Ember.Evented,
@type Object @type Object
*/ */
controller: controllerProperty, controller: Ember.computed(function(key, value) {
var parentView;
if (arguments.length === 2) {
return value;
} else {
parentView = get(this, 'parentView');
return parentView ? get(parentView, 'controller') : null;
}
}).property().cacheable(),
/** /**
A view may contain a layout. A layout is a regular template but A view may contain a layout. A layout is a regular template but
supersedes the `template` property during rendering. It is the supersedes the `template` property during rendering. It is the
@ -14076,22 +14068,20 @@ Ember.View = Ember.Object.extend(Ember.Evented,
to be re-rendered. to be re-rendered.
*/ */
_context: Ember.computed(function(key, value) { _context: Ember.computed(function(key, value) {
var parentView, context; var parentView, controller;
if (arguments.length === 2) { if (arguments.length === 2) {
return value; return value;
} }
if (VIEW_PRESERVES_CONTEXT) { if (VIEW_PRESERVES_CONTEXT) {
if (Ember.meta(this).descs.controller !== controllerProperty) { if (controller = get(this, 'controller')) {
if (context = get(this, 'controller')) { return controller;
return context;
}
} }
parentView = get(this, '_parentView'); parentView = get(this, '_parentView');
if (parentView && (context = get(parentView, '_context'))) { if (parentView) {
return context; return get(parentView, '_context');
} }
} }
@ -18493,6 +18483,7 @@ Ember.StateManager.reopen(
view; view;
while (currentState) { while (currentState) {
// TODO: Remove this when view state is removed
if (get(currentState, 'isViewState')) { if (get(currentState, 'isViewState')) {
view = get(currentState, 'view'); view = get(currentState, 'view');
if (view) { return view; } if (view) { return view; }
@ -20904,6 +20895,7 @@ ActionHelper.registerAction = function(actionName, eventName, target, view, cont
if (target.isState && typeof target.send === 'function') { if (target.isState && typeof target.send === 'function') {
return target.send(actionName, event); return target.send(actionName, event);
} else { } else {
Ember.assert(Ember.String.fmt('Target %@ does not have action %@', [target, actionName]), target[actionName]);
return target[actionName].call(target, event); return target[actionName].call(target, event);
} }
} }
@ -21572,7 +21564,12 @@ Ember.TextArea = Ember.View.extend(Ember.TextSupport,
(function() { (function() {
Ember.TabContainerView = Ember.View.extend(); Ember.TabContainerView = Ember.View.extend({
init: function() {
Ember.deprecate("Ember.TabContainerView is deprecated and will be removed from future releases.");
this._super();
}
});
})(); })();
@ -21588,7 +21585,12 @@ Ember.TabPaneView = Ember.View.extend({
isVisible: Ember.computed(function() { isVisible: Ember.computed(function() {
return get(this, 'viewName') === getPath(this, 'tabsContainer.currentView'); return get(this, 'viewName') === getPath(this, 'tabsContainer.currentView');
}).property('tabsContainer.currentView').volatile() }).property('tabsContainer.currentView').volatile(),
init: function() {
Ember.deprecate("Ember.TabPaneView is deprecated and will be removed from future releases.");
this._super();
}
}); });
})(); })();
@ -21605,6 +21607,11 @@ Ember.TabView = Ember.View.extend({
mouseUp: function() { mouseUp: function() {
setPath(this, 'tabsContainer.currentView', get(this, 'value')); setPath(this, 'tabsContainer.currentView', get(this, 'value'));
},
init: function() {
Ember.deprecate("Ember.TabView is deprecated and will be removed from future releases.");
this._super();
} }
}); });
@ -22011,7 +22018,7 @@ Ember.Handlebars.bootstrap = function(ctx) {
// id if no name is found. // id if no name is found.
templateName = script.attr('data-template-name') || script.attr('id'), templateName = script.attr('data-template-name') || script.attr('id'),
template = compile(script.html()), template = compile(script.html()),
view, viewPath, elementId, tagName, options; view, viewPath, elementId, options;
if (templateName) { if (templateName) {
// For templates which have a name, we save them and then remove them from the DOM // For templates which have a name, we save them and then remove them from the DOM
@ -22040,13 +22047,8 @@ Ember.Handlebars.bootstrap = function(ctx) {
// Look for data-element-id attribute. // Look for data-element-id attribute.
elementId = script.attr('data-element-id'); elementId = script.attr('data-element-id');
// Users can optionally specify a custom tag name to use by setting the
// data-tag-name attribute on the script tag.
tagName = script.attr('data-tag-name');
options = { template: template }; options = { template: template };
if (elementId) { options.elementId = elementId; } if (elementId) { options.elementId = elementId; }
if (tagName) { options.tagName = tagName; }
view = view.create(options); view = view.create(options);
@ -22079,8 +22081,8 @@ Ember.$(document).ready(
})(); })();
// Version: v0.9.8.1-468-g3097ea8 // Version: v0.9.8.1-484-g73ac0a4
// Last commit: 3097ea8 (2012-07-04 14:42:40 -0700) // Last commit: 73ac0a4 (2012-07-06 11:52:32 -0700)
(function() { (function() {
@ -27982,7 +27984,13 @@ function popState(event) {
function logMock( mockHandler, requestSettings ) { function logMock( mockHandler, requestSettings ) {
var c = $.extend({}, $.mockjaxSettings, mockHandler); var c = $.extend({}, $.mockjaxSettings, mockHandler);
if ( c.log && $.isFunction(c.log) ) { if ( c.log && $.isFunction(c.log) ) {
c.log('MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url, $.extend({}, requestSettings)); var url = requestSettings.url
if(requestSettings.data) {
params = []
for(key in requestSettings.data) params.push(key + '=' + requestSettings.data[key])
url = url + '?' + params.join('&')
}
c.log('MOCK ' + requestSettings.type.toUpperCase() + ': ' + url, $.extend({}, requestSettings));
} }
} }

View File

@ -343,7 +343,7 @@ table.list td:last-child {
} }
/* line 8, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 8, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log { pre#log {
clear: left; clear: left;
white-space: pre-wrap; white-space: pre-wrap;
word-wrap: break-word; word-wrap: break-word;
@ -360,116 +360,121 @@ table.list td:last-child {
border-radius: 4px; border-radius: 4px;
} }
/* line 21, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 21, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log p { pre#log p {
position: relative; position: relative;
padding: 0 15px 0 50px; padding: 0 15px 0 50px;
margin: 0; margin: 0;
min-height: 16px; min-height: 16px;
} }
/* line 26, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 26, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log p:hover { pre#log p:hover {
background-color: rgba(255, 255, 255, 0.05); background-color: rgba(255, 255, 255, 0.05);
} }
/* line 28, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 28, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log p.highlight { pre#log p.highlight {
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
} }
/* line 30, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 30, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log p a { pre#log p a {
position: absolute; position: absolute;
margin-left: -40px; margin-left: -40px;
cursor: pointer; cursor: pointer;
} }
/* line 35, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 35, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .fold { pre#log .fold {
height: 16px; height: 16px;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;
} }
/* line 39, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 39, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .fold.open { pre#log .fold.open {
height: auto; height: auto;
} }
/* line 42, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 42, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bold { pre#log .bold {
font-weight: bold; font-weight: bold;
} }
/* line 44, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 44, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .italic { pre#log .italic {
font-style: italic; font-style: italic;
} }
/* line 46, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 46, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .underscore { pre#log .underscore {
/* monochrome displays only according to http://ascii-table.com/ansi-escape-sequences.php */ /* monochrome displays only according to http://ascii-table.com/ansi-escape-sequences.php */
} }
/* line 49, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 49, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .black { pre#log .black {
color: black; color: black;
} }
/* line 51, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 51, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .red { pre#log .red {
color: red; color: red;
} }
/* line 53, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 53, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .green { pre#log .green {
color: lime; color: lime;
} }
/* line 55, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 55, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .yellow { pre#log .yellow {
color: yellow; color: yellow;
} }
/* line 57, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 57, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .blue { pre#log .blue {
color: blue; color: blue;
} }
/* line 59, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 59, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .magenta { pre#log .magenta {
color: magenta; color: magenta;
} }
/* line 61, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 61, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .cyan { pre#log .cyan {
color: cyan; color: cyan;
} }
/* line 63, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 63, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .white { pre#log .white {
color: white; color: white;
} }
/* line 65, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 65, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .black.bright { pre#log .black.bright {
color: #999999; color: #999999;
} }
/* line 68, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 68, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-black { pre#log .bg-black {
background-color: black; background-color: black;
} }
/* line 70, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 70, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-red { pre#log .bg-red {
background-color: red; background-color: red;
} }
/* line 72, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 72, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-green { pre#log .bg-green {
background-color: lime; background-color: lime;
} }
/* line 74, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 74, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-yellow { pre#log .bg-yellow {
background-color: yellow; background-color: yellow;
} }
/* line 76, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 76, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-blue { pre#log .bg-blue {
background-color: blue; background-color: blue;
} }
/* line 78, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 78, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-magenta { pre#log .bg-magenta {
background-color: magenta; background-color: magenta;
} }
/* line 80, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 80, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-cyan { pre#log .bg-cyan {
background-color: cyan; background-color: cyan;
} }
/* line 82, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */ /* line 82, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log .bg-white { pre#log .bg-white {
background-color: white; background-color: white;
} }
/* line 85, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/log.sass */
#log.loading {
padding: 25px 0 0 10px;
}
/* line 3, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/repository.sass */ /* line 3, /Volumes/Users/sven/Development/projects/travis/travis-ember/assets/stylesheets/main/repository.sass */
#repository { #repository {
position: relative; position: relative;