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

def initialize(obj)
  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

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

Instance Attribute Details

#original_filenameObject (readonly)

Returns the value of attribute original_filename



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

def original_filename
  @original_filename
end

Instance Method Details

#closeObject



137
138
139
140
141
# File 'lib/dragonfly/temp_object.rb', line 137

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

#closed?Boolean

Returns:

  • (Boolean)


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

def closed?
  !!@closed
end

#dataObject

Raises:



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

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

#each(&block) ⇒ Object



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

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

#extObject



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

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

#file(&block) ⇒ Object



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

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



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

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



97
98
99
# File 'lib/dragonfly/temp_object.rb', line 97

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

#sizeObject



101
102
103
104
105
# File 'lib/dragonfly/temp_object.rb', line 101

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

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



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

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



133
134
135
# File 'lib/dragonfly/temp_object.rb', line 133

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

#to_tempfileObject



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

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