diff --git a/assets/scripts/app/models/artifact.coffee b/assets/scripts/app/models/artifact.coffee index 26b87921..9177cfb3 100644 --- a/assets/scripts/app/models/artifact.coffee +++ b/assets/scripts/app/models/artifact.coffee @@ -1,4 +1,5 @@ require 'travis/model' +require 'travis/chunk_buffer' @Travis.Artifact = Em.Object.extend version: 1 # used to refresh log on requeue diff --git a/assets/scripts/lib/travis/chunk_buffer.coffee b/assets/scripts/lib/travis/chunk_buffer.coffee index 55379b48..83888df4 100644 --- a/assets/scripts/lib/travis/chunk_buffer.coffee +++ b/assets/scripts/lib/travis/chunk_buffer.coffee @@ -1,4 +1,4 @@ -Travis.ChunkBuffer = Em.ArrayProxy.extend +Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable, timeout: 15000 start: 0 next: 0 @@ -6,6 +6,8 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend init: -> @_super.apply this, arguments + @set('next', @get('start')) + if @get('content.length') @get('queue.content').pushObjects @get('content').toArray() @@ -13,6 +15,15 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend [] ).property('content') + addObject: (obj) -> + @get('content').pushObject(obj) + + removeObject: (obj) -> + @get('content').removeObject(obj) + + replaceContent: (idx, amt, objects) -> + @get('content').replace(idx, amt, objects) + queue: (-> Em.ArrayProxy.create(Em.SortableMixin, content: [] @@ -35,9 +46,12 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend next = @get('next') arrangedContent = @get('arrangedContent') + toPush = [] while queue.get('firstObject.number') == next - arrangedContent.pushObject queue.shiftObject().get('content') + toPush.pushObject queue.shiftObject().get('content') next += 1 + arrangedContent.pushObjects toPush if toPush.length + @set('next', next) diff --git a/assets/scripts/spec/unit/chunk_buffer_spec.coffee b/assets/scripts/spec/unit/chunk_buffer_spec.coffee index fca3cbac..56f98017 100644 --- a/assets/scripts/spec/unit/chunk_buffer_spec.coffee +++ b/assets/scripts/spec/unit/chunk_buffer_spec.coffee @@ -3,15 +3,14 @@ createChunk = (number, content) -> describe 'Travis.ChunkBuffer', -> it 'waits for parts to be in order before revealing them', -> - content = [] - buffer = Travis.ChunkBuffer.create(content: content) + buffer = Travis.ChunkBuffer.create(content: []) - content.pushObject createChunk(2, "baz") - content.pushObject createChunk(1, "bar") + buffer.pushObject createChunk(2, "baz") + buffer.pushObject createChunk(1, "bar") expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(3) @@ -20,14 +19,13 @@ describe 'Travis.ChunkBuffer', -> it 'ignores a part if it fails to be delivered within timeout', -> expect 4 - content = [] - buffer = Travis.ChunkBuffer.create(content: content, timeout: 10) + buffer = Travis.ChunkBuffer.create(content: [], timeout: 10) - content.pushObject createChunk(2, "baz") + buffer.pushObject createChunk(2, "baz") expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(1) @@ -44,9 +42,39 @@ describe 'Travis.ChunkBuffer', -> expect(buffer.get('length')).toEqual(0) - content.pushObject createChunk(0, "foo") + buffer.pushObject createChunk(0, "foo") expect(buffer.get('length')).toEqual(2) expect(buffer.toArray()).toEqual(['foo', 'bar']) + it 'fires array observers properly', -> + changes = [] + buffer = Travis.ChunkBuffer.create(content: []) + observer = Em.Object.extend( + init: -> + @_super.apply this, arguments + + @get('content').addArrayObserver this, + willChange: 'arrayWillChange', + didChange: 'arrayDidChange' + + arrayWillChange: (->) + arrayDidChange: (array, index, removedCount, addedCount) -> + changes.pushObject([index, addedCount]) + ).create(content: buffer) + + buffer.pushObject createChunk(1, "baz") + + expect(buffer.get('length')).toEqual(0) + expect(changes.length).toEqual(0) + + buffer.pushObject createChunk(0, "foo") + + expect(buffer.get('length')).toEqual(2) + expect(changes.length).toEqual(1) + expect(changes[0]).toEqual([0, 2]) + + it 'sets next to start if start is given at init', -> + buffer = Travis.ChunkBuffer.create(content: [], start: 5) + expect(buffer.get('next')).toEqual(5)