Class: Chef::MultipartStream

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/streaming_cookbook_uploader.rb

Instance Method Summary collapse

Constructor Details

#initialize(parts) ⇒ MultipartStream

Returns a new instance of MultipartStream.



135
136
137
138
139
# File 'lib/chef/streaming_cookbook_uploader.rb', line 135

def initialize(parts)
  @parts = parts
  @part_no = 0
  @part_offset = 0
end

Instance Method Details

#read(how_much) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/chef/streaming_cookbook_uploader.rb', line 145

def read(how_much)
  return nil if @part_no >= @parts.size

  how_much_current_part = @parts[@part_no].size - @part_offset

  how_much_current_part = if how_much_current_part > how_much
    how_much
  else
    how_much_current_part
  end

  how_much_next_part = how_much - how_much_current_part

  current_part = @parts[@part_no].read(@part_offset, how_much_current_part)

  # recurse into the next part if the current one was not large enough
  if how_much_next_part > 0
    @part_no += 1
    @part_offset = 0
    next_part = read(how_much_next_part)
    current_part + if next_part
      next_part
    else
      ''
    end
  else
    @part_offset += how_much_current_part
    current_part
  end
end

#sizeObject



141
142
143
# File 'lib/chef/streaming_cookbook_uploader.rb', line 141

def size
  @parts.inject(0) {|size, part| size + part.size}
end