A few improvements for ChunkBuffer

* insert available items at once
* allow to use pushObject on buffer itself
* add a test using arrayObserver to make sure that it fires only when
  elements are added to arrangedContent
This commit is contained in:
Piotr Sarnacki 2013-02-18 21:44:33 +01:00
parent d549831c22
commit b4022f5f67
3 changed files with 55 additions and 12 deletions

View File

@ -1,4 +1,5 @@
require 'travis/model'
require 'travis/chunk_buffer'
@Travis.Artifact = Em.Object.extend
version: 1 # used to refresh log on requeue

View File

@ -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)

View File

@ -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)