Sha256: ca3679bc42d58a1ce70e0d14f0574c17cf9e0722520838f09fd00310bcea0a58

Contents?: true

Size: 1.83 KB

Versions: 39

Compression:

Stored size: 1.83 KB

Contents

module Lipsiadmin
  module Attachment
    # Provides method that can be included on File-type objects (IO, StringIO, Tempfile, etc) to allow stream copying
    # and Tempfile conversion.
    module IOStream

      # Returns a Tempfile containing the contents of the readable object.
      def to_tempfile
        tempfile = Tempfile.new("stream")
        tempfile.binmode
        self.stream_to(tempfile)
      end

      # Copies one read-able object from one place to another in blocks, obviating the need to load
      # the whole thing into memory. Defaults to 8k blocks. If this module is included in both
      # StringIO and Tempfile, then either can have its data copied anywhere else without typing
      # worries or memory overhead worries. Returns a File if a String is passed in as the destination
      # and returns the IO or Tempfile as passed in if one is sent as the destination.
      def stream_to(path_or_file, in_blocks_of = 8192)
        dstio = case path_or_file
                when String   then File.new(path_or_file, "wb+")
                when IO       then path_or_file
                when Tempfile then path_or_file
                end
        buffer = ""
        self.rewind
        while self.read(in_blocks_of, buffer) do
          dstio.write(buffer)
        end
        dstio.rewind    
        dstio
      end
    end
  end
end

class IO #:nodoc:
  include Lipsiadmin::Attachment::IOStream
end

%w( Tempfile StringIO ).each do |klass|
  if Object.const_defined? klass
    Object.const_get(klass).class_eval do
      include Lipsiadmin::Attachment::IOStream
    end
  end
end

# Corrects a bug in Windows when asking for Tempfile size.
if defined? Tempfile
  class Tempfile#:nodoc:
    def size
      if @tmpfile
        @tmpfile.fsync
        @tmpfile.flush
        @tmpfile.stat.size
      else
        0
      end
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
lipsiadmin-5.1.6 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.5 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.4 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.3 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.2 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.1 lib/data_base/attachment/iostream.rb
lipsiadmin-5.1.0 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.9 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.8 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.7 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.6 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.5 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.4 lib/data_base/attachment/iostream.rb
lipsiadmin-4.1.8 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.0 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.1 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.2 lib/data_base/attachment/iostream.rb
lipsiadmin-5.0.3 lib/data_base/attachment/iostream.rb
lipsiadmin-3.0 lib/data_base/attachment/iostream.rb
lipsiadmin-3.3.1 lib/data_base/attachment/iostream.rb