Class: Valkyrie::Storage::Memory

Inherits:
Object
  • Object
show all
Defined in:
lib/valkyrie/storage/memory.rb

Overview

Note:

this adapter is used primarily for testing, and is not recommended in cases where you want to preserve real data

Implements the DataMapper Pattern to store binary data in memory

Constant Summary collapse

PROTOCOL =
'memory://'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeMemory



11
12
13
# File 'lib/valkyrie/storage/memory.rb', line 11

def initialize
  @cache = {}
end

Instance Attribute Details

#cacheObject (readonly)

Returns the value of attribute cache.



8
9
10
# File 'lib/valkyrie/storage/memory.rb', line 8

def cache
  @cache
end

Instance Method Details

#delete(id:) ⇒ Object

Delete the file on disk associated with the given identifier.



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

def delete(id:)
  base_id, version = id_and_version(id)
  if version && cache[base_id][:current]&.version_id != id
    cache[base_id][:versions].reject! do |file|
      file.version_id == id
    end
  else
    cache.delete(base_id)
  end
  nil
end

#find_by(id:) ⇒ Valkyrie::StorageAdapter::StreamFile

Return the file associated with the given identifier

Raises:

  • Valkyrie::StorageAdapter::FileNotFound if nothing is found



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/valkyrie/storage/memory.rb', line 54

def find_by(id:)
  no_version_id, _version = id_and_version(id)
  raise Valkyrie::StorageAdapter::FileNotFound unless cache[no_version_id]
  version =
    if id == no_version_id
      cache[id][:current]
    else
      find_versions(id: no_version_id).find do |file|
        file.version_id == id
      end
    end
  raise Valkyrie::StorageAdapter::FileNotFound unless version
  version
end

#find_versions(id:) ⇒ Array<Valkyrie::StorageAdapter::StreamFile>



45
46
47
48
# File 'lib/valkyrie/storage/memory.rb', line 45

def find_versions(id:)
  return [] if cache[id].nil?
  [cache[id][:current] || nil].compact + cache[id].fetch(:versions, [])
end

#handles?(id:) ⇒ Boolean



71
72
73
# File 'lib/valkyrie/storage/memory.rb', line 71

def handles?(id:)
  id.to_s.start_with?(protocol)
end

#id_and_version(id) ⇒ Object



93
94
95
96
# File 'lib/valkyrie/storage/memory.rb', line 93

def id_and_version(id)
  id, version = id.to_s.split("#")
  [Valkyrie::ID.new(id), version]
end

#protocolString



89
90
91
# File 'lib/valkyrie/storage/memory.rb', line 89

def protocol
  PROTOCOL
end

#supports?(feature) ⇒ Boolean



77
78
79
80
81
82
83
84
85
86
# File 'lib/valkyrie/storage/memory.rb', line 77

def supports?(feature)
  case feature
  when :versions
    true
  when :version_deletion
    true
  else
    false
  end
end

#upload(file:, original_filename:, resource: nil, **_extra_arguments) ⇒ Valkyrie::StorageAdapter::StreamFile



20
21
22
23
24
25
# File 'lib/valkyrie/storage/memory.rb', line 20

def upload(file:, original_filename:, resource: nil, **_extra_arguments)
  identifier = Valkyrie::ID.new("#{protocol}#{resource.id}")
  version_id = Valkyrie::ID.new("#{identifier}##{SecureRandom.uuid}")
  cache[identifier] ||= {}
  cache[identifier][:current] = Valkyrie::StorageAdapter::StreamFile.new(id: identifier, io: file, version_id: version_id)
end

#upload_version(id:, file:) ⇒ Valkyrie::StorageAdapter::StreamFile



33
34
35
36
37
38
39
40
41
# File 'lib/valkyrie/storage/memory.rb', line 33

def upload_version(id:, file:)
  # Get previous file and add a UUID to the end of it.
  new_file = Valkyrie::StorageAdapter::StreamFile.new(id: id, io: file, version_id: Valkyrie::ID.new("#{id}##{SecureRandom.uuid}"))
  current_file = cache[id][:current]
  cache[id][:current] = new_file
  cache[id][:versions] ||= []
  cache[id][:versions].prepend(current_file) if current_file
  new_file
end