From ec24b21e81f64382223e5f439d8f95968e821b8b Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 27 Jan 2015 20:33:16 +0100 Subject: [PATCH] Switch to Ember Data --- .../scripts/app/adapters/application.coffee | 13 ++ assets/scripts/app/adapters/env_var.coffee | 23 ++++ assets/scripts/app/adapters/ssh_key.coffee | 11 ++ assets/scripts/app/app.coffee | 50 +------ assets/scripts/app/auth.coffee | 8 +- assets/scripts/app/controllers/account.coffee | 7 +- assets/scripts/app/controllers/flash.coffee | 2 +- assets/scripts/app/controllers/repo.coffee | 6 +- assets/scripts/app/controllers/repos.coffee | 12 +- assets/scripts/app/models.coffee | 1 - assets/scripts/app/models/account.coffee | 19 +-- assets/scripts/app/models/annotation.coffee | 14 +- assets/scripts/app/models/branch.coffee | 32 +++-- assets/scripts/app/models/broadcast.coffee | 13 +- assets/scripts/app/models/build.coffee | 35 +++-- assets/scripts/app/models/commit.coffee | 24 ++-- assets/scripts/app/models/env_var.coffee | 8 +- assets/scripts/app/models/event.coffee | 10 +- assets/scripts/app/models/hook.coffee | 15 ++- assets/scripts/app/models/job.coffee | 29 ++--- assets/scripts/app/models/repo.coffee | 90 +++++++------ assets/scripts/app/models/request.coffee | 29 ++--- assets/scripts/app/models/ssh_key.coffee | 7 +- assets/scripts/app/models/user.coffee | 27 ++-- assets/scripts/app/models/worker.coffee | 61 --------- assets/scripts/app/pusher.coffee | 6 +- assets/scripts/app/routes/accounts.coffee | 2 +- assets/scripts/app/routes/job.coffee | 4 +- assets/scripts/app/routes/repo.coffee | 4 +- assets/scripts/app/serializers/account.coffee | 2 + .../app/serializers/application.coffee | 13 ++ assets/scripts/app/serializers/build.coffee | 13 ++ assets/scripts/app/serializers/env_var.coffee | 4 + assets/scripts/app/serializers/job.coffee | 13 ++ assets/scripts/app/serializers/repo.coffee | 4 + assets/scripts/app/serializers/request.coffee | 6 + assets/scripts/app/store.coffee | 3 + assets/scripts/app/transforms/object.coffee | 6 + assets/scripts/app/views/repo-actions.coffee | 2 +- .../lib/travis/expandable_record_array.coffee | 120 ++++++++--------- assets/scripts/lib/travis/model.coffee | 122 +----------------- assets/scripts/travis.coffee | 48 +++---- 42 files changed, 395 insertions(+), 523 deletions(-) create mode 100644 assets/scripts/app/adapters/application.coffee create mode 100644 assets/scripts/app/adapters/env_var.coffee create mode 100644 assets/scripts/app/adapters/ssh_key.coffee delete mode 100644 assets/scripts/app/models/worker.coffee create mode 100644 assets/scripts/app/serializers/account.coffee create mode 100644 assets/scripts/app/serializers/application.coffee create mode 100644 assets/scripts/app/serializers/build.coffee create mode 100644 assets/scripts/app/serializers/env_var.coffee create mode 100644 assets/scripts/app/serializers/job.coffee create mode 100644 assets/scripts/app/serializers/repo.coffee create mode 100644 assets/scripts/app/serializers/request.coffee create mode 100644 assets/scripts/app/store.coffee create mode 100644 assets/scripts/app/transforms/object.coffee diff --git a/assets/scripts/app/adapters/application.coffee b/assets/scripts/app/adapters/application.coffee new file mode 100644 index 00000000..49bc671c --- /dev/null +++ b/assets/scripts/app/adapters/application.coffee @@ -0,0 +1,13 @@ +Travis.ApplicationAdapter = DS.ActiveModelAdapter.extend + host: Travis.config.api_endpoint + ajaxOptions: (url, type, options) -> + hash = @_super(url, type, options) + + hash.headers ||= {} + + hash.headers['accept'] = 'application/json; version=2' + + token = Travis.sessionStorage.getItem('travis.token') + hash.headers['Authorization'] ||= "token #{token}" + + hash diff --git a/assets/scripts/app/adapters/env_var.coffee b/assets/scripts/app/adapters/env_var.coffee new file mode 100644 index 00000000..d5a717e7 --- /dev/null +++ b/assets/scripts/app/adapters/env_var.coffee @@ -0,0 +1,23 @@ +get = Ember.get + +Travis.EnvVarAdapter = Travis.ApplicationAdapter.extend + namespace: 'settings' + + buildURL: (type, id, record) -> + url = @_super.apply this, arguments + + if record && (repoId = get(record, 'repo.id')) + delimiter = if url.indexOf('?') != -1 then '&' else '?' + url = "#{url}#{delimiter}repository_id=#{repo_id}" + + url + + updateRecord: (store, type, record) -> + data = {}; + serializer = store.serializerFor(type.typeKey); + + serializer.serializeIntoHash(data, type, record); + + id = Ember.get(record, 'id'); + + this.ajax(this.buildURL(type.typeKey, id, record), "PATCH", { data: data }) diff --git a/assets/scripts/app/adapters/ssh_key.coffee b/assets/scripts/app/adapters/ssh_key.coffee new file mode 100644 index 00000000..603c78c2 --- /dev/null +++ b/assets/scripts/app/adapters/ssh_key.coffee @@ -0,0 +1,11 @@ +get = Ember.get + +Travis.SshKeyAdapter = Travis.ApplicationAdapter.extend + namespace: 'settings' + + createRecord: (store, type, record) -> + data = {}; + serializer = store.serializerFor(type.typeKey); + serializer.serializeIntoHash(data, type, record, { includeId: true }); + + this.ajax(this.buildURL(type.typeKey, null, record), "POST", { data: data }) diff --git a/assets/scripts/app/app.coffee b/assets/scripts/app/app.coffee index 59df5884..e6297393 100644 --- a/assets/scripts/app/app.coffee +++ b/assets/scripts/app/app.coffee @@ -2,46 +2,7 @@ unless window.TravisApplication window.TravisApplication = Em.Application.extend(Ember.Evented, LOG_TRANSITIONS: true, - mappings: (-> - broadcasts: Travis.Broadcast - repositories: Travis.Repo - repository: Travis.Repo - repos: Travis.Repo - repo: Travis.Repo - builds: Travis.Build - build: Travis.Build - commits: Travis.Commit - commit: Travis.Commit - jobs: Travis.Job - job: Travis.Job - account: Travis.Account - accounts: Travis.Account - worker: Travis.Worker - workers: Travis.Worker - annotation: Travis.Annotation - annotations: Travis.Annotation - request: Travis.Request - requests: Travis.Request - env_var: Travis.EnvVar - env_vars: Travis.EnvVar - ssh_key: Travis.SshKey - ).property() - - modelClasses: (-> - [Travis.User, Travis.Build, Travis.Job, Travis.Repo, Travis.Commit, Travis.Worker, Travis.Account, Travis.Broadcast, Travis.Hook, Travis.Annotation, Travis.Request, Travis.EnvVar, Travis.SshKey] - ).property() - setup: -> - @get('modelClasses').forEach (klass) -> - klass.adapter = Travis.Adapter.create() - klass.url = "/#{klass.pluralName()}" - - Travis.EnvVar.url = "/settings/env_vars" - Travis.EnvVar.adapter = Travis.EnvVarsAdapter.create() - - Travis.SshKey.url = "/settings/ssh_key" - Travis.SshKey.adapter = Travis.SshKeyAdapter.create() - @pusher = new Travis.Pusher(key: Travis.config.pusher_key, host: Travis.config.pusher_host) if Travis.config.pusher_key @tailing = new Travis.Tailing($(window), '#tail', '#log') @toTop = new Travis.ToTop($(window), '.to-top', '#log-container') @@ -65,12 +26,15 @@ unless window.TravisApplication Travis.lookup('controller:flash').loadFlashes([options]) receive: (event, data) -> + return [name, type] = event.split(':') - type = Ember.get(Travis, 'mappings')[name] + store = @__container__.lookup('store:main') + + type = store.modelFor(name) if name == 'job' && data.job?.commit - @loadOrMerge(Travis.Commit, data.job.commit) + store.pushPayload(commits: [data.job.commit]) if name == 'build' && data.build?.commit # TODO: commit should be a sideload record on build, not mixed with it @@ -88,13 +52,13 @@ unless window.TravisApplication sha: build.commit } delete(data.build.commit) - @loadOrMerge(Travis.Commit, commit) + store.pushPayload(commits: [commit]) if event == 'job:log' console.log 'store: received job:log event', data if Log.DEBUG data = data.job - job = Travis.Job.find(data.id) + job = store.find('job', data.id) job.appendLog(number: parseInt(data.number), content: data._log, final: data.final) else if data[type.singularName()] @_loadOne(this, type, data) diff --git a/assets/scripts/app/auth.coffee b/assets/scripts/app/auth.coffee index 58e30838..38af83d4 100644 --- a/assets/scripts/app/auth.coffee +++ b/assets/scripts/app/auth.coffee @@ -75,7 +75,7 @@ window.Auth = Ember.Object.extend refreshUserData: (user) -> Travis.ajax.get "/users/#{user.id}", (data) => - Travis.loadOrMerge(Travis.User, data.user) + @store.push('user', data.user) # if user is still signed in, update saved data if @get('signedIn') data.user.token = user.token @@ -101,8 +101,8 @@ window.Auth = Ember.Object.extend storage.setItem('travis.user', JSON.stringify(data.user)) loadUser: (user) -> - Travis.loadOrMerge(Travis.User, user) - user = Travis.User.find(user.id) + @store.push('user', user) + user = @store.find('user', user.id) user.get('permissions') user @@ -151,3 +151,5 @@ Ember.onLoad 'Ember.Application', (Application) -> application.inject('route', 'auth', 'auth:main') application.inject('controller', 'auth', 'auth:main') application.inject('application', 'auth', 'auth:main') + + application.inject('auth', 'store', 'store:main') diff --git a/assets/scripts/app/controllers/account.coffee b/assets/scripts/app/controllers/account.coffee index 182a2ab6..8b692219 100644 --- a/assets/scripts/app/controllers/account.coffee +++ b/assets/scripts/app/controllers/account.coffee @@ -20,7 +20,12 @@ Travis.AccountController = Ember.ObjectController.extend reloadHooks: -> if login = @get('login') - @set('allHooks', Travis.Hook.find(all: true, owner_name: login)) + hooks = @store.find('hook', all: true, owner_name: login) + + hooks.then () -> + hooks.set('isLoaded', true) + + @set('allHooks', hooks) hooks: (-> @reloadHooks() unless hooks = @get('allHooks') diff --git a/assets/scripts/app/controllers/flash.coffee b/assets/scripts/app/controllers/flash.coffee index 8c48feb3..e5d51a08 100644 --- a/assets/scripts/app/controllers/flash.coffee +++ b/assets/scripts/app/controllers/flash.coffee @@ -20,7 +20,7 @@ Travis.FlashController = Ember.ArrayController.extend ).property('broadcasts.isLoaded', 'broadcasts.length') broadcasts: (-> - if @get('currentUser.id') then Travis.Broadcast.find() else Ember.A() + if @get('currentUser.id') then @store.find('broadcast') else Ember.A() ).property('currentUser.id') loadFlashes: (msgs) -> diff --git a/assets/scripts/app/controllers/repo.coffee b/assets/scripts/app/controllers/repo.coffee index 900127f8..1a700a01 100644 --- a/assets/scripts/app/controllers/repo.coffee +++ b/assets/scripts/app/controllers/repo.coffee @@ -13,8 +13,8 @@ Controller = Ember.Controller.extend init: -> @_super.apply this, arguments - if !Ember.testing - Visibility.every Travis.INTERVALS.updateTimes, @updateTimes.bind(this) + #if !Ember.testing + # Visibility.every Travis.INTERVALS.updateTimes, @updateTimes.bind(this) updateTimes: -> Ember.run this, -> @@ -70,7 +70,7 @@ Controller = Ember.Controller.extend @connectTab('settings') lastBuildDidChange: -> - Ember.run.scheduleOnce('data', this, @_lastBuildDidChange); + Ember.run.scheduleOnce('actions', this, @_lastBuildDidChange); _lastBuildDidChange: -> build = @get('repo.lastBuild') diff --git a/assets/scripts/app/controllers/repos.coffee b/assets/scripts/app/controllers/repos.coffee index b445fb39..8a88b856 100644 --- a/assets/scripts/app/controllers/repos.coffee +++ b/assets/scripts/app/controllers/repos.coffee @@ -28,13 +28,13 @@ Travis.ReposController = Ember.ArrayController.extend init: -> @_super.apply this, arguments - if !Ember.testing - Visibility.every Travis.INTERVALS.updateTimes, @updateTimes.bind(this) + #if !Ember.testing + # Visibility.every Travis.INTERVALS.updateTimes, @updateTimes.bind(this) recentRepos: (-> Ember.ArrayProxy.extend( isLoadedBinding: 'repos.isLoaded' - repos: Repo.withLastBuild() + repos: Repo.withLastBuild(@store) sorted: Ember.computed.sort('repos', 'sortedReposKeys') content: Ember.computed.limit('sorted', 'limit') sortedReposKeys: ['sortOrder:asc'] @@ -49,7 +49,7 @@ Travis.ReposController = Ember.ArrayController.extend activate: (tab, params) -> @set('sortProperties', ['sortOrder']) @set('tab', tab) - this["view_#{tab}".camelize()]() + this["view_#{tab}".camelize()](params) viewRecent: -> @set('content', @get('recentRepos')) @@ -59,14 +59,14 @@ Travis.ReposController = Ember.ArrayController.extend userRepos: (-> if login = @get('currentUser.login') - Travis.Repo.accessibleBy(login) + Travis.Repo.accessibleBy(@store, login) else [] ).property('currentUser.login') viewSearch: (phrase) -> @set('search', phrase) - @set('content', Travis.Repo.search(phrase)) + @set('content', Travis.Repo.search(@store, phrase)) searchObserver: (-> search = @get('search') diff --git a/assets/scripts/app/models.coffee b/assets/scripts/app/models.coffee index 937eb98b..657f9ce4 100644 --- a/assets/scripts/app/models.coffee +++ b/assets/scripts/app/models.coffee @@ -12,6 +12,5 @@ require 'models/annotation' require 'models/repo' require 'models/request' require 'models/user' -require 'models/worker' require 'models/env_var' require 'models/ssh_key' diff --git a/assets/scripts/app/models/account.coffee b/assets/scripts/app/models/account.coffee index 3d29fc60..ac9ec1bb 100644 --- a/assets/scripts/app/models/account.coffee +++ b/assets/scripts/app/models/account.coffee @@ -1,16 +1,9 @@ require 'travis/model' Travis.Account = Travis.Model.extend - login: Ember.attr('string') - name: Ember.attr('string') - type: Ember.attr('string') - _reposCount: Ember.attr(Number, key: 'repos_count') - subscribed: Ember.attr(Boolean) - education: Ember.attr(Boolean) - - # TODO: maybe it would be good to add a "default" value for Ember.attr - reposCount: (-> - @get('_reposCount') || 0 - ).property('_reposCount') - -Travis.Account.primaryKey = 'login' + name: DS.attr() + type: DS.attr() + reposCount: DS.attr('number') + subscribed: DS.attr('boolean') + education: DS.attr('boolean') + loginBinding: 'id' diff --git a/assets/scripts/app/models/annotation.coffee b/assets/scripts/app/models/annotation.coffee index 471ad76e..1ffed232 100644 --- a/assets/scripts/app/models/annotation.coffee +++ b/assets/scripts/app/models/annotation.coffee @@ -1,10 +1,10 @@ require 'travis/model' -@Travis.Annotation = Travis.Model.extend - jobId: Ember.attr('number') - description: Ember.attr('string') - url: Ember.attr('string') - status: Ember.attr('string') - providerName: Ember.attr('string') +Travis.Annotation = Travis.Model.extend + jobId: DS.attr('number') + description: DS.attr() + url: DS.attr() + status: DS.attr() + providerName: DS.attr() - job: Ember.belongsTo('Travis.Job') + job: DS.belongsTo('job') diff --git a/assets/scripts/app/models/branch.coffee b/assets/scripts/app/models/branch.coffee index 6defebec..66de4c5a 100644 --- a/assets/scripts/app/models/branch.coffee +++ b/assets/scripts/app/models/branch.coffee @@ -1,29 +1,27 @@ require 'travis/model' -Repo = Travis.Repo +Travis.Branch = Travis.Model.extend + repositoryId: DS.attr('number') + commitId: DS.attr('number') + state: DS.attr() + number: DS.attr('number') + branch: DS.attr() + message: DS.attr() + result: DS.attr('number') + duration: DS.attr('number') + startedAt: DS.attr() + finishedAt: DS.attr() -@Travis.Branch = Travis.Model.extend - repoId: Ember.attr('number', key: 'repository_id') - commitId: Ember.attr('number') - state: Ember.attr('string') - number: Ember.attr('number') - branch: Ember.attr('string') - message: Ember.attr('string') - result: Ember.attr('number') - duration: Ember.attr('number') - startedAt: Ember.attr('string') - finishedAt: Ember.attr('string') - - commit: Ember.belongsTo('Travis.Commit') + commit: DS.belongsTo('commit') repo: (-> - Repo.find @get('repoId') if @get('repoId') - ).property('repoId') + @store.find('repo', @get('repositoryId')) if @get('repositoryId') + ).property('repositoryId') updateTimes: -> @notifyPropertyChange 'started_at' @notifyPropertyChange 'finished_at' -@Travis.Branch.reopenClass +Travis.Branch.reopenClass byRepoId: (id) -> @find repository_id: id diff --git a/assets/scripts/app/models/broadcast.coffee b/assets/scripts/app/models/broadcast.coffee index ca3a0c3b..e8201299 100644 --- a/assets/scripts/app/models/broadcast.coffee +++ b/assets/scripts/app/models/broadcast.coffee @@ -1,21 +1,21 @@ require 'travis/model' -@Travis.Broadcast = Travis.Model.extend - message: Ember.attr('string') +Broadcast = Travis.Model.extend + message: DS.attr() toObject: -> { type: 'broadcast', id: @get('id'), message: @get('message') } isSeen: (-> - @get('id') in Travis.Broadcast.get('seen') + @get('id') in Broadcast.get('seen') ).property() setSeen: -> - Travis.Broadcast.get('seen').pushObject(@get('id')) - Travis.storage.setItem('travis.seen_broadcasts', JSON.stringify(Travis.Broadcast.get('seen'))) + Broadcast.get('seen').pushObject(@get('id')) + Travis.storage.setItem('travis.seen_broadcasts', JSON.stringify(Broadcast.get('seen'))) @notifyPropertyChange('isSeen') -@Travis.Broadcast.reopenClass +Broadcast.reopenClass seen: (-> seenBroadcasts = Travis.storage.getItem('travis.seen_broadcasts') seenBroadcasts = JSON.parse(seenBroadcasts) if seenBroadcasts? @@ -25,3 +25,4 @@ require 'travis/model' # TODO fix or monkey-patch the adapter's url and key lookup/generation crap # url: 'users/broadcasts' +Travis.Broadcast = Broadcast diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index 180cd9dd..37ea927f 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -8,27 +8,22 @@ Ajax = Travis.ajax config_keys_map = Travis.CONFIG_KEYS_MAP DurationCalculations = Travis.DurationCalculations -@Travis.Build = Travis.Model.extend DurationCalculations, - repositoryId: Ember.attr('number') - commitId: Ember.attr('number') +Travis.Build = Travis.Model.extend DurationCalculations, + state: DS.attr() + number: DS.attr('number') + branch: DS.attr('string') + message: DS.attr('string') + _duration: DS.attr('number') + _config: DS.attr('object') + _startedAt: DS.attr() + _finishedAt: DS.attr() + pullRequest: DS.attr('boolean') + pullRequestTitle: DS.attr() + pullRequestNumber: DS.attr('number') - state: Ember.attr('string') - number: Ember.attr(Number) - branch: Ember.attr('string') - message: Ember.attr('string') - _duration: Ember.attr(Number, key: 'duration') - _config: Ember.attr('object', key: 'config') - _startedAt: Ember.attr('string', key: 'started_at') - _finishedAt: Ember.attr('string', key: 'finished_at') - pullRequest: Ember.attr('boolean') - pullRequestTitle: Ember.attr('string') - pullRequestNumber: Ember.attr(Number) - # TODO add eventType to the api for api build requests - # eventType: Ember.attr('string') - - repo: Ember.belongsTo('Travis.Repo', key: 'repository_id') - commit: Ember.belongsTo('Travis.Commit') - jobs: Ember.hasMany('Travis.Job') + repo: DS.belongsTo('repo', async: true) + commit: DS.belongsTo('commit', async: true) + jobs: DS.hasMany('job', async: true) config: (-> console.log('config') diff --git a/assets/scripts/app/models/commit.coffee b/assets/scripts/app/models/commit.coffee index e654af68..f716b9d1 100644 --- a/assets/scripts/app/models/commit.coffee +++ b/assets/scripts/app/models/commit.coffee @@ -1,19 +1,19 @@ require 'travis/model' @Travis.Commit = Travis.Model.extend - buildId: Ember.attr('number') - sha: Ember.attr('string') - branch: Ember.attr('string') - message: Ember.attr('string') - compareUrl: Ember.attr('string') - authorName: Ember.attr('string') - authorEmail: Ember.attr('string') - committerName: Ember.attr('string') - committerEmail: Ember.attr('string') - subject: Ember.attr('string') - body: Ember.attr('string') + sha: DS.attr() + branch: DS.attr() + message: DS.attr() + compareUrl: DS.attr() + authorName: DS.attr() + authorEmail: DS.attr() + committerName: DS.attr() + committerEmail: DS.attr() + subject: DS.attr() + body: DS.attr() + commitedAt: DS.attr() - build: Ember.belongsTo('Travis.Build') + build: DS.belongsTo('build') subject: ( -> @get('message').split("\n", 1)[0] diff --git a/assets/scripts/app/models/env_var.coffee b/assets/scripts/app/models/env_var.coffee index 168df98f..9de243de 100644 --- a/assets/scripts/app/models/env_var.coffee +++ b/assets/scripts/app/models/env_var.coffee @@ -1,8 +1,8 @@ require 'travis/model' Travis.EnvVar = Travis.Model.extend - name: Ember.attr('string') - value: Ember.attr('string') - public: Ember.attr('boolean') + name: DS.attr() + value: DS.attr() + public: DS.attr('boolean') - repo: Ember.belongsTo('Travis.Repo', key: 'repository_id') + repo: DS.belongsTo('repo', async: true) diff --git a/assets/scripts/app/models/event.coffee b/assets/scripts/app/models/event.coffee index 357d9abd..c3e6eea5 100644 --- a/assets/scripts/app/models/event.coffee +++ b/assets/scripts/app/models/event.coffee @@ -1,11 +1,11 @@ require 'travis/model' @Travis.Event = Travis.Model.extend - event: Ember.attr('string') - repoId: Ember.attr('number', key: 'repository_id') - sourceId: Ember.attr('number', key: 'source_id') - sourceType: Ember.attr('string', key: 'source_type') - createdAt: Ember.attr('string', key: 'created_at') + event: DS.attr() + repositoryId: DS.attr('number') + sourceId: DS.attr('number') + sourceType: DS.attr() + createdAt: DS.attr() event_: (-> @get('event') diff --git a/assets/scripts/app/models/hook.coffee b/assets/scripts/app/models/hook.coffee index 7af2a5a6..827b4e80 100644 --- a/assets/scripts/app/models/hook.coffee +++ b/assets/scripts/app/models/hook.coffee @@ -4,11 +4,12 @@ loadOrMerge = Travis.loadOrMerge Repo = Travis.Repo @Travis.Hook = Travis.Model.extend - name: Ember.attr('string') - ownerName: Ember.attr('string') - description: Ember.attr('string') - active: Ember.attr('boolean') - admin: Ember.attr('boolean') + name: DS.attr() + ownerName: DS.attr() + description: DS.attr() + active: DS.attr('boolean') + admin: DS.attr('boolean') + private: DS.attr('boolean') account: (-> @get('slug').split('/')[0] @@ -37,6 +38,6 @@ Repo = Travis.Repo # I add an info which we have here to the store - this will allow to display # a link to the repo and if more info is needed, it will be requested when the # link is used - loadOrMerge(Repo, @getProperties('id', 'slug', 'name', 'ownerName'), skipIfExists: true) - Repo.find(@get('id')) + @store.push('repo', @getProperties('id', 'slug')) + @store.getById('repo', @get('id')) ).property('id') diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index 77d5628f..a5a5f9b5 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -7,26 +7,23 @@ Log = Travis.Log compact = Travis.Helpers.compact @Travis.Job = Travis.Model.extend DurationCalculations, - repoId: Ember.attr('string', key: 'repository_id') - buildId: Ember.attr('string') - commitId: Ember.attr('string') - logId: Ember.attr('string') + logId: DS.attr() - queue: Ember.attr('string') - state: Ember.attr('string') - number: Ember.attr('string') - _startedAt: Ember.attr('string', key: 'started_at') - _finishedAt: Ember.attr('string', key: 'finished_at') - allowFailure: Ember.attr('boolean') + queue: DS.attr() + state: DS.attr() + number: DS.attr() + _startedAt: DS.attr() + _finishedAt: DS.attr() + allowFailure: DS.attr('boolean') - repositorySlug: Ember.attr('string') - repo: Ember.belongsTo('Travis.Repo', key: 'repository_id') - build: Ember.belongsTo('Travis.Build') - commit: Ember.belongsTo('Travis.Commit') + repositorySlug: DS.attr() + repo: DS.belongsTo('repo', async: true) + build: DS.belongsTo('build', async: true) + commit: DS.belongsTo('commit', async: true) - annotations: Ember.hasMany('Travis.Annotation') + annotations: DS.hasMany('annotation') - _config: Ember.attr('object', key: 'config') + _config: DS.attr('object') log: ( -> @set('isLogAccessed', true) diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index f4d9a384..9a55a40b 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -5,26 +5,23 @@ require 'helpers/helpers' EnvVar = Travis.EnvVar Build = Travis.Build SshKey = Travis.SshKey -ExpandableRecordArray = Travis.ExpandableRecordArray Event = Travis.Event durationFrom = Travis.Helpers.durationFrom Ajax = Travis.ajax -@Travis.Repo = Travis.Model.extend - id: Ember.attr('string') - slug: Ember.attr('string') - description: Ember.attr('string') - private: Ember.attr('boolean') - lastBuildId: Ember.attr('string') - lastBuildNumber: Ember.attr(Number) - lastBuildState: Ember.attr('string') - lastBuildStartedAt: Ember.attr('string') - lastBuildFinishedAt: Ember.attr('string') - githubLanguage: Ember.attr('string') - _lastBuildDuration: Ember.attr(Number, key: 'last_build_duration') - - lastBuild: Ember.belongsTo('Travis.Build', key: 'last_build_id') - +Travis.Repo = Travis.Model.extend + slug: DS.attr() + description: DS.attr() + private: DS.attr('boolean') + lastBuildNumber: DS.attr('number') + lastBuildState: DS.attr() + lastBuildStartedAt: DS.attr() + lastBuildFinishedAt: DS.attr() + githubLanguage: DS.attr() + _lastBuildDuration: DS.attr('number') + lastBuildLanguage: DS.attr() + active: DS.attr() + lastBuildId: DS.attr('number') lastBuildHash: (-> { id: @get('lastBuildId') @@ -33,6 +30,10 @@ Ajax = Travis.ajax } ).property('lastBuildId', 'lastBuildNumber') + lastBuild: (-> + @store.find('build', @get('lastBuildId')) + ).property('lastBuildId') + withLastBuild: -> @filter( (repo) -> repo.get('lastBuildId') ) @@ -42,7 +43,11 @@ Ajax = Travis.ajax envVars: (-> id = @get('id') - envVars = EnvVar.find repository_id: id + envVars = @store.filter('env_var', { repository_id: id }, (envVar) -> +# envVar.get(' + ) + + EnvVar.find repository_id: id # TODO: move to controller array = ExpandableRecordArray.create @@ -152,38 +157,41 @@ Travis.Repo.reopenClass recent: -> @find() - ownedBy: (login) -> - @find(owner_name: login, orderBy: 'name') + accessibleBy: (store, login) -> + repos = store.find('repo', { member: login, orderBy: 'name' }) - accessibleBy: (login) -> - @find(member: login, orderBy: 'name') + repos.then () -> + repos.set('isLoaded', true) - search: (query) -> - @find(search: query, orderBy: 'name') + repos - withLastBuild: -> - filtered = Ember.FilteredRecordArray.create( - modelClass: this - filterFunction: (repo) -> repo.get('lastBuildId') - filterProperties: ['lastBuildId'] + search: (store, query) -> + store.find('repo', search: query, orderBy: 'name') + + withLastBuild: (store) -> + repos = store.filter('repo', {}, (build) -> + build.get('lastBuildId') ) - @fetch().then (array) -> - filtered.updateFilter() - filtered.set('isLoaded', true) + repos.then () -> + repos.set('isLoaded', true) - filtered + repos - bySlug: (slug) -> - repo = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug) - if repo.length > 0 then repo else @find(slug: slug) - - fetchBySlug: (slug) -> - repos = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug) - if repos.length > 0 - repos[0] + bySlug: (store, slug) -> + # first check if there is a repo with a given slug already ordered + repos = store.all('repo').filterBy('slug', slug) + if repos.get('length') > 0 + repos else - @fetch(slug: slug).then (repos) -> + store.find('repo', { slug: slug }) + + fetchBySlug: (store, slug) -> + repos = @bySlug(store, slug) + if repos.get('length') > 0 + repos.get('firstObject') + else + repos.then (repos) -> error = new Error('repo not found') error.slug = slug Ember.get(repos, 'firstObject') || throw(error) diff --git a/assets/scripts/app/models/request.coffee b/assets/scripts/app/models/request.coffee index 6f238a05..f0ca91e6 100644 --- a/assets/scripts/app/models/request.coffee +++ b/assets/scripts/app/models/request.coffee @@ -1,22 +1,21 @@ require 'travis/model' @Travis.Request = Travis.Model.extend - id: Ember.attr('string') - created_at: Ember.attr('string') - event_type: Ember.attr('string') - result: Ember.attr('string') - message: Ember.attr('string') - headCommit: Ember.attr('string') - baseCommit: Ember.attr('string') - branchName: Ember.attr('string', key: 'branch') - tagName: Ember.attr('string', key: 'tag') - pullRequest: Ember.attr('boolean') - pullRequestTitle: Ember.attr('string') - pullRequestNumber: Ember.attr(Number) + created_at: DS.attr() + event_type: DS.attr() + result: DS.attr() + message: DS.attr() + headCommit: DS.attr() + baseCommit: DS.attr() + branchName: DS.attr() + tagName: DS.attr() + pullRequest: DS.attr('boolean') + pullRequestTitle: DS.attr() + pullRequestNumber: DS.attr('number') - repo: Ember.belongsTo('Travis.Repo', key: 'repository_id') - commit: Ember.belongsTo('Travis.Commit', key: 'commit_id') - build: Ember.belongsTo('Travis.Build', key: 'build_id') + repo: DS.belongsTo('repo') + commit: DS.belongsTo('commit') + build: DS.belongsTo('build') isAccepted: (-> # For some reason some of the requests have a null result beside the fact that diff --git a/assets/scripts/app/models/ssh_key.coffee b/assets/scripts/app/models/ssh_key.coffee index 40d83fb0..7bb3d7cd 100644 --- a/assets/scripts/app/models/ssh_key.coffee +++ b/assets/scripts/app/models/ssh_key.coffee @@ -1,5 +1,4 @@ Travis.SshKey = Travis.Model.extend - id: Ember.attr('string') - value: Ember.attr('string') - description: Ember.attr('string') - fingerprint: Ember.attr('string') + value: DS.attr() + description: DS.attr() + fingerprint: DS.attr() diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index ed8165db..ceb1f80f 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -6,23 +6,18 @@ trigger = Travis.trigger Account = Travis.Account @Travis.User = Travis.Model.extend - _name: Ember.attr('string', key: 'name') - email: Ember.attr('string') - login: Ember.attr('string') - token: Ember.attr('string') - gravatarId: Ember.attr('string') - isSyncing: Ember.attr('boolean') - syncedAt: Ember.attr('string') - repoCount: Ember.attr('number') + name: DS.attr() + email: DS.attr() + login: DS.attr() + token: DS.attr() + gravatarId: DS.attr() + isSyncing: DS.attr('boolean') + syncedAt: DS.attr() + repoCount: DS.attr('number') - # This is the only way I found to override the attribue created with Ember.attr - name: Ember.computed( (key, value) -> - if arguments.length == 1 - @get('_name') || @get('login') - else - @set('_name', value) - value - ).property('login', '_name') + fullName: (-> + @get('name') || @get('login') + ).property('name', 'login') isSyncingDidChange: (-> Ember.run.next this, -> diff --git a/assets/scripts/app/models/worker.coffee b/assets/scripts/app/models/worker.coffee deleted file mode 100644 index c5bc8539..00000000 --- a/assets/scripts/app/models/worker.coffee +++ /dev/null @@ -1,61 +0,0 @@ -require 'travis/model' - -@Travis.Worker = Travis.Model.extend - state: Ember.attr('string') - name: Ember.attr('string') - host: Ember.attr('string') - payload: Ember.attr('object') - - number: (-> - @get('name').match(/\d+$/)[0] - ).property('name') - - isWorking: (-> - @get('state') == 'working' - ).property('state') - - jobId: (-> - @get('payload.build.id') || @get('payload.job.id') - ).property('payload.job.id', 'payload.build.id') - - job: (-> - Travis.Job.find @get('job_id') - ).property('jobId') - - jobNumber: (-> - @get('payload.job.number') - ).property('jobNumber') - - repo: (-> - id = @get('payload.repository.id') || @get('payload.repo.id') - slug = @get('repoSlug') - - @get('store').loadIncomplete(Travis.Repo, { - id: id, - slug: slug - }, { skipIfExists: true }) - - Travis.Repo.find(@get('payload.repository.id') || @get('payload.repo.id')) - ).property('payload.repository.id', 'payload.repo.id') - - repoSlug: (-> - @get('payload.repo.slug') || @get('payload.repository.slug') - ).property('payload.repo.slug', 'payload.repository.slug') - - repoId: (-> - @get('payload.repo.id') || @get('payload.repository.id') - ).property('payload.repo.id', 'payload.repository.id') - - nameForSort: (-> - if name = @get('name') - match = name.match /(.*?)-(\d+)/ - if match - name = match[1] - id = match[2].toString() - if id.length < 2 - id = "00#{id}" - else if id.length < 3 - id = "0#{id}" - - "#{name}-#{id}" - ).property('name') diff --git a/assets/scripts/app/pusher.coffee b/assets/scripts/app/pusher.coffee index 67935245..b10de488 100644 --- a/assets/scripts/app/pusher.coffee +++ b/assets/scripts/app/pusher.coffee @@ -61,12 +61,12 @@ $.extend Travis.Pusher.prototype, return if event.substr(0, 6) == 'pusher' data = @normalize(event, data) if data.id - @processWhenVisible -> + @processWhenVisible => # TODO remove job:requeued, once sf-restart-event has been merged # TODO this also needs to clear logs on build:created if matrix jobs are already loaded if event == 'job:created' || event == 'job:requeued' - if Travis.Job.isRecordLoaded(data.job.id) - Travis.Job.find(data.job.id).clearLog() + if job = Travis.__container__.lookup('store:main').getById('job', data.job.id) + job.clearLog() Ember.run.next -> Travis.receive(event, data) diff --git a/assets/scripts/app/routes/accounts.coffee b/assets/scripts/app/routes/accounts.coffee index f5948f85..16f211c3 100644 --- a/assets/scripts/app/routes/accounts.coffee +++ b/assets/scripts/app/routes/accounts.coffee @@ -6,7 +6,7 @@ TravisRoute = Travis.Route Route = TravisRoute.extend model: -> - Account.fetch(all: true) + @store.find('account', { all: true }) renderTemplate: -> @_super.apply(this, arguments) diff --git a/assets/scripts/app/routes/job.coffee b/assets/scripts/app/routes/job.coffee index e0fcd136..7ec6c6dc 100644 --- a/assets/scripts/app/routes/job.coffee +++ b/assets/scripts/app/routes/job.coffee @@ -11,7 +11,7 @@ Route = TravisRoute.extend { job_id: id } setupController: (controller, model) -> - model = Job.find(model) if model && !model.get + model = @store.find('job', model) if model && !model.get repo = @controllerFor('repo') @controllerFor('job').set('job', model) @@ -21,7 +21,7 @@ Route = TravisRoute.extend @controllerFor('build').set('build', build) model: (params) -> - Job.fetch(params.job_id) + @store.find('job', params.job_id) deactivate: -> @controllerFor('build').set('build', null) diff --git a/assets/scripts/app/routes/repo.coffee b/assets/scripts/app/routes/repo.coffee index 9fe65b3b..699b022f 100644 --- a/assets/scripts/app/routes/repo.coffee +++ b/assets/scripts/app/routes/repo.coffee @@ -11,7 +11,7 @@ Route = TravisRoute.extend setupController: (controller, model) -> # TODO: if repo is just a data hash with id and slug load it # as incomplete record - model = Repo.find(model.id) if model && !model.get + model = @store.find('repo', model.id) if model && !model.get controller.set('repo', model) serialize: (repo) -> @@ -21,7 +21,7 @@ Route = TravisRoute.extend model: (params) -> slug = "#{params.owner}/#{params.name}" - Repo.fetchBySlug(slug) + Repo.fetchBySlug(@store, slug) resetController: -> @controllerFor('repo').deactivate() diff --git a/assets/scripts/app/serializers/account.coffee b/assets/scripts/app/serializers/account.coffee new file mode 100644 index 00000000..307d01ea --- /dev/null +++ b/assets/scripts/app/serializers/account.coffee @@ -0,0 +1,2 @@ +Travis.AccountSerializer = Travis.ApplicationSerializer.extend + primaryKey: 'login' diff --git a/assets/scripts/app/serializers/application.coffee b/assets/scripts/app/serializers/application.coffee new file mode 100644 index 00000000..3f66ffc7 --- /dev/null +++ b/assets/scripts/app/serializers/application.coffee @@ -0,0 +1,13 @@ +Travis.ApplicationSerializer = DS.ActiveModelSerializer.extend + defaultSerializer: 'application' + serializer: 'application' + + extractSingle: (store, primaryType, rawPayload, recordId) -> + #newPayload = {} + + #if payload.build + + @_super.apply(this, arguments) + + extractArray: (store, type, payload) -> + @_super.apply(this, arguments) diff --git a/assets/scripts/app/serializers/build.coffee b/assets/scripts/app/serializers/build.coffee new file mode 100644 index 00000000..001b6771 --- /dev/null +++ b/assets/scripts/app/serializers/build.coffee @@ -0,0 +1,13 @@ +Travis.BuildSerializer = Travis.ApplicationSerializer.extend + attrs: { + repo: { key: 'repository_id' } + _config: { key: 'config' } + _finishedAt: { key: 'finished_at' } + _startedAt: { key: 'started_at' } + } + + extractSingle: (store, primaryType, rawPayload, recordId) -> + if commit = rawPayload.commit + rawPayload.commits = [commit] + + @_super(store, primaryType, rawPayload, recordId) diff --git a/assets/scripts/app/serializers/env_var.coffee b/assets/scripts/app/serializers/env_var.coffee new file mode 100644 index 00000000..41e8eaaa --- /dev/null +++ b/assets/scripts/app/serializers/env_var.coffee @@ -0,0 +1,4 @@ +Travis.EnvVarSerializer = Travis.ApplicationSerializer.extend + attrs: { + repo: { key: 'repository_id' } + } diff --git a/assets/scripts/app/serializers/job.coffee b/assets/scripts/app/serializers/job.coffee new file mode 100644 index 00000000..ce57c099 --- /dev/null +++ b/assets/scripts/app/serializers/job.coffee @@ -0,0 +1,13 @@ +Travis.JobSerializer = Travis.ApplicationSerializer.extend + attrs: { + repo: { key: 'repository_id' } + _config: { key: 'config' } + _finishedAt: { key: 'finished_at' } + _startedAt: { key: 'started_at' } + } + + extractSingle: (store, primaryType, rawPayload, recordId) -> + if commit = rawPayload.commit + rawPayload.commits = [commit] + + @_super(store, primaryType, rawPayload, recordId) diff --git a/assets/scripts/app/serializers/repo.coffee b/assets/scripts/app/serializers/repo.coffee new file mode 100644 index 00000000..feb53f76 --- /dev/null +++ b/assets/scripts/app/serializers/repo.coffee @@ -0,0 +1,4 @@ +Travis.RepoSerializer = Travis.ApplicationSerializer.extend + attrs: { + _lastBuildDuration: { key: 'last_build_duration' } + } diff --git a/assets/scripts/app/serializers/request.coffee b/assets/scripts/app/serializers/request.coffee new file mode 100644 index 00000000..65b39ae6 --- /dev/null +++ b/assets/scripts/app/serializers/request.coffee @@ -0,0 +1,6 @@ +Travis.RequestSerializer = Travis.ApplicationSerializer.extend + attrs: { + branchName: { key: 'branch' } + tagName: { key: 'tag' } + repo: { key: 'repository_id' } + } diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee new file mode 100644 index 00000000..fc637f2b --- /dev/null +++ b/assets/scripts/app/store.coffee @@ -0,0 +1,3 @@ +Travis.Store = DS.Store.extend + defaultAdapter: 'application' + adapter: 'application' diff --git a/assets/scripts/app/transforms/object.coffee b/assets/scripts/app/transforms/object.coffee new file mode 100644 index 00000000..1b7d6e55 --- /dev/null +++ b/assets/scripts/app/transforms/object.coffee @@ -0,0 +1,6 @@ +Travis.ObjectTransform = DS.Transform.extend + deserialize: (serialized) -> + serialized + + serialize: (deserialized) -> + deserialized diff --git a/assets/scripts/app/views/repo-actions.coffee b/assets/scripts/app/views/repo-actions.coffee index ac019ee9..6ba25461 100644 --- a/assets/scripts/app/views/repo-actions.coffee +++ b/assets/scripts/app/views/repo-actions.coffee @@ -100,7 +100,7 @@ View = Travis.View.extend _job: (-> if id = @get('jobIdForLog') - Travis.Job.find(id) + Travis.__container__.lookup('store:main').find('job', id) ).property('jobIdForLog') jobIdForLog: (-> diff --git a/assets/scripts/lib/travis/expandable_record_array.coffee b/assets/scripts/lib/travis/expandable_record_array.coffee index 4db4321e..3bf2e7cb 100644 --- a/assets/scripts/lib/travis/expandable_record_array.coffee +++ b/assets/scripts/lib/travis/expandable_record_array.coffee @@ -1,60 +1,60 @@ -Travis.ExpandableRecordArray = Ember.RecordArray.extend - isLoaded: false - isLoading: false - - promise: (-> - console.log 'promise' - self = this - new Ember.RSVP.Promise (resolve, reject) -> - console.log 'inside promise' - observer = -> - console.log 'observer', self.get('isLoaded') - if self.get('isLoaded') - console.log 'resolve' - resolve(self) - self.removeObserver('isLoaded', observer) - true - - unless observer() - self.addObserver 'isLoaded', observer - ).property() - - load: (array) -> - @set 'isLoading', true - self = this - - observer = -> - if @get 'isLoaded' - content = self.get 'content' - - array.removeObserver 'isLoaded', observer - array.forEach (record) -> - self.pushObject(record) unless self.contains(record) - - self.set 'isLoading', false - self.set 'isLoaded', true - - array.addObserver 'isLoaded', observer - - observe: (collection, filterWith) -> - @set 'filterWith', filterWith - collection.addArrayObserver this, - willChange: 'observedArrayWillChange' - didChange: 'observedArraydidChange' - - observedArrayWillChange: (array, index, removedCount, addedCount) -> - removedObjects = array.slice index, index + removedCount - for object in removedObjects - @removeObject(object) - - observedArraydidChange: (array, index, removedCount, addedCount) -> - addedObjects = array.slice index, index + addedCount - for object in addedObjects - # TODO: I'm not sure why deleted objects get here, but I'll just filter them - # for now - if !object.get('isDeleted') && @get('filterWith').call(this, object) - @pushObject(object) unless @contains(object) - - pushObject: (record) -> - if content = @get('content') - content.pushObject(record) unless content.contains(record) +#Travis.ExpandableRecordArray = Ember.RecordArray.extend +# isLoaded: false +# isLoading: false +# +# promise: (-> +# console.log 'promise' +# self = this +# new Ember.RSVP.Promise (resolve, reject) -> +# console.log 'inside promise' +# observer = -> +# console.log 'observer', self.get('isLoaded') +# if self.get('isLoaded') +# console.log 'resolve' +# resolve(self) +# self.removeObserver('isLoaded', observer) +# true +# +# unless observer() +# self.addObserver 'isLoaded', observer +# ).property() +# +# load: (array) -> +# @set 'isLoading', true +# self = this +# +# observer = -> +# if @get 'isLoaded' +# content = self.get 'content' +# +# array.removeObserver 'isLoaded', observer +# array.forEach (record) -> +# self.pushObject(record) unless self.contains(record) +# +# self.set 'isLoading', false +# self.set 'isLoaded', true +# +# array.addObserver 'isLoaded', observer +# +# observe: (collection, filterWith) -> +# @set 'filterWith', filterWith +# collection.addArrayObserver this, +# willChange: 'observedArrayWillChange' +# didChange: 'observedArraydidChange' +# +# observedArrayWillChange: (array, index, removedCount, addedCount) -> +# removedObjects = array.slice index, index + removedCount +# for object in removedObjects +# @removeObject(object) +# +# observedArraydidChange: (array, index, removedCount, addedCount) -> +# addedObjects = array.slice index, index + addedCount +# for object in addedObjects +# # TODO: I'm not sure why deleted objects get here, but I'll just filter them +# # for now +# if !object.get('isDeleted') && @get('filterWith').call(this, object) +# @pushObject(object) unless @contains(object) +# +# pushObject: (record) -> +# if content = @get('content') +# content.pushObject(record) unless content.contains(record) diff --git a/assets/scripts/lib/travis/model.coffee b/assets/scripts/lib/travis/model.coffee index d5e9ba91..c60797bc 100644 --- a/assets/scripts/lib/travis/model.coffee +++ b/assets/scripts/lib/travis/model.coffee @@ -5,124 +5,4 @@ Array.prototype.diff = (a) -> this.filter (i) -> !(a.indexOf(i) > -1) -@Travis.Model = Ember.Model.extend - id: Ember.attr('number') - - init: -> - @_super.apply this, arguments - this - - merge: (hash) -> - data = @get('_data') - Ember.merge(data, hash) - @notifyPropertyChange('_data') - - unload: -> - @constructor.unload(this) - - dataKey: (key) -> - meta = @constructor.metaForProperty(key) - if meta.isRelationship && !meta.options?.key? - type = meta.type - if typeof type == "string" - type = Ember.get(Ember.lookup, type) - - if meta.kind == 'belongsTo' - return type.singularName() + '_id' - else - return type.singularName() + '_ids' - - @_super(key) - - getBelongsTo: (key, type, meta) -> - unless key - key = type.singularName() + '_id' - @_super(key, type, meta) - - getHasMany: (key, type, meta) -> - unless key - key = type.singularName() + '_ids' - @_super(key, type, meta) - - select: -> - @constructor.select(@get('id')) - -@Travis.Model.reopenClass - select: (id) -> - @find().forEach (record) -> - record.set('selected', record.get('id') == id) - - buildURL: (suffix) -> - base = @url || @pluralName() - Ember.assert('Base URL (' + base + ') must not start with slash', !base || base.toString().charAt(0) != '/') - Ember.assert('URL suffix (' + suffix + ') must not start with slash', !suffix || suffix.toString().charAt(0) != '/') - url = [base] - url.push(suffix) if (suffix != undefined) - url.join('/') - - singularName: -> - parts = @toString().split('.') - name = parts[parts.length - 1] - name.replace(/([A-Z])/g, '_$1').toLowerCase().slice(1) - - pluralName: -> - @singularName() + 's' - - collectionKey: (-> - @pluralName() - ).property() - - rootKey: (-> - @singularName() - ).property() - - isModel: (-> - true - ).property() - - isRecordLoaded: (id) -> - reference = @_getReferenceById(id) - reference && reference.record - - camelizeKeys: true - - # TODO: the functions below will be added to Ember Model, remove them when that - # happens - resetData: -> - @_referenceCache = {} - @sideloadedData = {} - @recordArrays = [] - @_currentBatchIds = [] - @_hasManyArrays = [] - @_findAllRecordArray = null - - unload: (record) -> - @removeFromRecordArrays(record) - primaryKey = record.get(get(this, 'primaryKey')) - @removeFromCache(primaryKey) - - removeFromCache: (key) -> - if @sideloadedData && @sideloadedData[key] - delete this.sideloadedData[key] - if @recordCache && @recordCache[key] - delete this.recordCache[key] - - loadRecordForReference: (reference) -> - record = @create({ _reference: reference, id: reference.id }) - @sideloadedData = {} unless @sideloadedData - reference.record = record - record.load(reference.id, @sideloadedData[reference.id]) - # TODO: find a nicer way to not add record to record arrays twice - if @currentRecordsToAdd - @currentRecordsToAdd.pushObject(record) unless @currentRecordsToAdd.contains(record) - else - @currentRecordsToAdd = [record] - - Ember.run.scheduleOnce('data', this, @_batchAddToRecordArrays); - - _batchAddToRecordArrays: -> - for record in @currentRecordsToAdd - if !@_findAllRecordArray || !@_findAllRecordArray.contains(record) - @addToRecordArrays(record) - - @currentRecordsToAdd = null +@Travis.Model = DS.Model.extend() diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index 9cd4cb36..c38ef10e 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -20,34 +20,6 @@ Storage = Em.Object.extend clear: -> @set('storage', {}) -Ember.RecordArray.reopen - # TODO: ember.js changed a way ArrayProxies behave, so that check for content is done - # in _replace method. I should not be overriding it, because it's private, but - # there is no easy other way to do it at this point - _replace: (index, removedCount, records) -> - # in Travis it's sometimes the case that we add new records to RecordArrays - # from pusher before its content has loaded from an ajax query. In order to handle - # this case nicer I'm extending record array to buffer those records and push them - # to content when it's available - @bufferedRecords = [] unless @bufferedRecords - - if !@get('content') - for record in records - @bufferedRecords.pushObject(record) unless @bufferedRecords.contains(record) - - records = [] - - # call super only if there's anything more to add - if removedCount || records.length - @_super(index, removedCount, records) - - contentDidChange: (-> - if (content = @get('content')) && @bufferedRecords && @bufferedRecords.length - for record in @bufferedRecords - content.pushObject(record) unless content.contains(record) - @bufferedRecords = [] - ).observes('content') - window.Travis = TravisApplication.create( LOG_ACTIVE_GENERATION: true, LOG_MODULE_RESOLVER: true, @@ -202,6 +174,8 @@ Travis.initializer application.inject('route', 'pusher', 'pusher:main') + Travis.pusher.store = container.lookup('store:main') + stylesheetsManager = Ember.Object.create enable: (id) -> $("##{id}").removeAttr('disabled') @@ -238,9 +212,21 @@ require 'travis/ajax' Travis.ajax.pro = Travis.config.pro -require 'travis/adapter' -require 'travis/adapters/env_vars' -require 'travis/adapters/ssh_key' +require 'adapters/application' +require 'serializers/application' +require 'serializers/repo' +require 'serializers/job' +require 'serializers/build' +require 'serializers/account' +require 'serializers/request' +require 'serializers/env_var' +require 'adapters/env_var' +require 'adapters/ssh_key' +require 'transforms/object' +require 'store' +#require 'travis/adapter' +#require 'travis/adapters/env_vars' +#require 'travis/adapters/ssh_key' require 'routes' require 'auth' require 'controllers'