Class: Dragonfly::TempObject

Inherits:
Object
  • Object
show all
Includes:
HasFilename
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, the processor and the encoder, 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

Methods included from HasFilename

#basename, #basename=, #ext, #ext=

Constructor Details

#initialize(obj, meta = {}) ⇒ TempObject

Instance Methods


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
73
74
75
# File 'lib/dragonfly/temp_object.rb', line 42

def initialize(obj, meta={})
  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"
  end
  
  @tempfile.close if @tempfile

  # Original filename
  @original_filename = if obj.respond_to?(:original_filename)
    obj.original_filename
  elsif @pathname
    @pathname.basename.to_s
  end
  
  # Meta
  @meta = meta
  @meta[:name] ||= @original_filename if @original_filename
end

Instance Attribute Details

#metaObject

Returns the value of attribute meta


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

def meta
  @meta
end

#original_filenameObject (readonly)

Returns the value of attribute original_filename


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

def original_filename
  @original_filename
end

Instance Method Details

#closeObject


150
151
152
153
154
# File 'lib/dragonfly/temp_object.rb', line 150

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

#closed?Boolean


156
157
158
# File 'lib/dragonfly/temp_object.rb', line 156

def closed?
  !!@closed
end

#dataObject

Raises:


88
89
90
91
# File 'lib/dragonfly/temp_object.rb', line 88

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

#each(&block) ⇒ Object


126
127
128
129
130
131
132
# File 'lib/dragonfly/temp_object.rb', line 126

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

#file(&block) ⇒ Object


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

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


160
161
162
163
164
165
166
167
168
169
# File 'lib/dragonfly/temp_object.rb', line 160

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

#nameObject


80
81
82
# File 'lib/dragonfly/temp_object.rb', line 80

def name
  meta[:name]
end

#name=(name) ⇒ Object


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

def name=(name)
  meta[:name] = name
end

#pathObject


118
119
120
# File 'lib/dragonfly/temp_object.rb', line 118

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

#sizeObject


122
123
124
# File 'lib/dragonfly/temp_object.rb', line 122

def size
  @data ? @data.bytesize : File.size(path)
end

#tempfileObject

Raises:


93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/dragonfly/temp_object.rb', line 93

def tempfile
  raise Closed, "can't read from tempfile as TempObject has been closed" if closed?
  @tempfile ||= begin
    case
    when @data
      @tempfile = new_tempfile(@data)
    when @pathname
      @tempfile = copy_to_tempfile(@pathname.expand_path)
    end
    @tempfile
  end
end

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


134
135
136
137
138
139
140
141
142
143
144
# File 'lib/dragonfly/temp_object.rb', line 134

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


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

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

#unique_idObject


171
172
173
# File 'lib/dragonfly/temp_object.rb', line 171

def unique_id
  @unique_id ||= "#{object_id}#{rand(1000000)}"
end