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



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

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.



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

def name
  @name
end

Instance Method Details

#closeObject



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

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

#closed?Boolean

Returns:

  • (Boolean)


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

def closed?
  !!@closed
end

#dataObject

Raises:



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

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

#each(&block) ⇒ Object



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

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

#extObject



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

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

#file(&block) ⇒ Object



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

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



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

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



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

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

#sizeObject



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

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

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



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

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



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

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

#to_tempfileObject



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

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