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


152
153
154
155
156
# File 'lib/dragonfly/temp_object.rb', line 152

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

#closed?Boolean

Returns:

  • (Boolean)

158
159
160
# File 'lib/dragonfly/temp_object.rb', line 158

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


122
123
124
125
126
127
128
# File 'lib/dragonfly/temp_object.rb', line 122

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


100
101
102
103
104
105
106
107
108
109
110
# File 'lib/dragonfly/temp_object.rb', line 100

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


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

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


112
113
114
# File 'lib/dragonfly/temp_object.rb', line 112

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

#sizeObject


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

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

#tempfileObject

Raises:


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

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

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


130
131
132
133
134
135
136
137
138
139
140
# File 'lib/dragonfly/temp_object.rb', line 130

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


148
149
150
# File 'lib/dragonfly/temp_object.rb', line 148

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

#to_tempfileObject


142
143
144
145
146
# File 'lib/dragonfly/temp_object.rb', line 142

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