Class: Dragonfly::TempObject

Inherits:
Object
  • Object
show all
Defined in:
lib/dragonfly/temp_object.rb

Overview

A TempObject is used for HOLDING DATA. It’s the thing that is passed between the datastore and the processor, and is useful for separating how the data was created and how it is later accessed.

You can initialize it various ways:

temp_object = Dragonfly::TempObject.new('this is the content')           # with a String
temp_object = Dragonfly::TempObject.new(Pathname.new('path/to/content')) # with a Pathname
temp_object = Dragonfly::TempObject.new(File.new('path/to/content'))     # with a File
temp_object = Dragonfly::TempObject.new(some_tempfile)                   # with a Tempfile
temp_object = Dragonfly::TempObject.new(some_other_temp_object)          # with another TempObject

However, no matter how it was initialized, you can always access the data a number of ways:

temp_object.data      # returns a data string
temp_object.file      # returns a file object holding the data
temp_object.path      # returns a path for the file

The data/file are created lazily, something which you may wish to take advantage of.

For example, if a TempObject is initialized with a file, and temp_object.data is never called, then the data string will never be loaded into memory.

Conversely, if the TempObject is initialized with a data string, and neither temp_object.file nor temp_object.path are ever called, then the filesystem will never be hit.

Defined Under Namespace

Classes: Closed

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(obj, name = nil) ⇒ TempObject

Instance Methods



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/dragonfly/temp_object.rb', line 41

def initialize(obj, name=nil)
  if obj.is_a? TempObject
    @data = obj.get_data
    @tempfile = obj.get_tempfile
    @pathname = obj.get_pathname
  elsif obj.is_a? String
    @data = obj
  elsif obj.is_a? Tempfile
    @tempfile = obj
  elsif obj.is_a? File
    @pathname = Pathname.new(obj.path)
  elsif obj.is_a? Pathname
    @pathname = obj
  elsif obj.respond_to?(:tempfile)
    @tempfile = obj.tempfile
  elsif obj.respond_to?(:path) # e.g. Rack::Test::UploadedFile
    @pathname = Pathname.new(obj.path)
  else
    raise ArgumentError, "#{self.class.name} must be initialized with a String, a Pathname, a File, a Tempfile, another TempObject, something that responds to .tempfile, or something that responds to .path - you gave #{obj.inspect}"
  end

  @tempfile.close if @tempfile

  # Name
  @name = if name
    name
  elsif obj.respond_to?(:original_filename)
    obj.original_filename
  elsif @pathname
    @pathname.basename.to_s
  end
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



74
75
76
# File 'lib/dragonfly/temp_object.rb', line 74

def name
  @name
end

Instance Method Details

#closeObject



139
140
141
142
143
# File 'lib/dragonfly/temp_object.rb', line 139

def close
  @tempfile.close! if @tempfile
  @data = nil
  @closed = true
end

#closed?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'lib/dragonfly/temp_object.rb', line 145

def closed?
  !!@closed
end

#dataObject

Raises:



82
83
84
85
# File 'lib/dragonfly/temp_object.rb', line 82

def data
  raise Closed, "can't read data as TempObject has been closed" if closed?
  @data ||= file{|f| f.read }
end

#each(&block) ⇒ Object



109
110
111
112
113
114
115
# File 'lib/dragonfly/temp_object.rb', line 109

def each(&block)
  to_io do |io|
    while part = io.read(block_size)
      yield part
    end
  end
end

#extObject



76
77
78
79
80
# File 'lib/dragonfly/temp_object.rb', line 76

def ext
  if n = name
    n.split('.').last
  end
end

#file(&block) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/dragonfly/temp_object.rb', line 87

def file(&block)
  f = tempfile.open
  tempfile.binmode
  if block_given?
    ret = yield f
    tempfile.close unless tempfile.closed?
  else
    ret = f
  end
  ret
end

#inspectObject



149
150
151
152
153
154
155
156
157
158
# File 'lib/dragonfly/temp_object.rb', line 149

def inspect
  content_string = case
  when @data
    data_string = size > 20 ? "#{@data[0..20]}..." : @data
    "data=#{data_string.inspect}"
  when @pathname then "pathname=#{@pathname.inspect}"
  when @tempfile then "tempfile=#{@tempfile.inspect}"
  end
  "<#{self.class.name} #{content_string} >"
end

#pathObject



99
100
101
# File 'lib/dragonfly/temp_object.rb', line 99

def path
  @pathname ? @pathname.expand_path.to_s : tempfile.path
end

#sizeObject



103
104
105
106
107
# File 'lib/dragonfly/temp_object.rb', line 103

def size
  @tempfile && @tempfile.size ||
  @data && @data.bytesize ||
  File.size(path)
end

#to_file(path, opts = {}) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
# File 'lib/dragonfly/temp_object.rb', line 117

def to_file(path, opts={})
  mode = opts[:mode] || 0644
  prepare_path(path) unless opts[:mkdirs] == false
  if @data
    File.open(path, 'wb', mode){|f| f.write(@data) }
  else
    FileUtils.cp(self.path, path)
    File.chmod(mode, path)
  end
  File.new(path, 'rb')
end

#to_io(&block) ⇒ Object



135
136
137
# File 'lib/dragonfly/temp_object.rb', line 135

def to_io(&block)
  @data ? StringIO.open(@data, 'rb', &block) : file(&block)
end

#to_tempfileObject



129
130
131
132
133
# File 'lib/dragonfly/temp_object.rb', line 129

def to_tempfile
  tempfile = copy_to_tempfile(path)
  tempfile.open
  tempfile
end