Class: S3FileManager

Inherits:
FileManager show all
Defined in:
lib/s3_file_manager.rb

Instance Attribute Summary

Attributes inherited from FileManager

#options

Instance Method Summary collapse

Methods inherited from FileManager

#initialize

Constructor Details

This class inherits a constructor from FileManager

Instance Method Details

#bucket_nameObject



19
20
21
# File 'lib/s3_file_manager.rb', line 19

def bucket_name
  options.fetch(:bucket)
end

#copy_file(source_file_name, target_file_name) ⇒ Object



95
96
97
98
99
100
101
102
103
# File 'lib/s3_file_manager.rb', line 95

def copy_file source_file_name, target_file_name
  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)
  logger.print "Copying file \"#{source_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
  bucket.object(source_file_name).copy_to(bucket: bucket_name, key: target_file_name)
  logger.puts 'done.'
rescue Aws::S3::Errors::NoSuchKey
  raise FileNotFoundError.new("#{bucket_name}/#{source_file_name}")
end

#delete_file(file_name) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/s3_file_manager.rb', line 77

def delete_file file_name
  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)
  logger.print "Deleting file \"#{file_name}\" from bucket \"#{bucket_name}\"..."
  bucket.object(file_name).delete
  logger.puts 'done.'
end

#download_to_temp_file(file_name) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/s3_file_manager.rb', line 33

def download_to_temp_file(file_name)
  Dir.mktmpdir do |dir|
    @logger.print "Downloading file \"#{bucket_name}/#{file_name}\" to temp folder \"#{dir}\"..."
    temp_file = "#{dir}/#{Pathname(file_name).basename}"

    s3_client = connect_s3_client
    s3_client.get_object({ bucket: bucket_name, key: file_name }, target: temp_file)

    yield(temp_file)
  end
  logger.puts 'done.'
rescue Aws::S3::Errors::NoSuchKey
  raise FileNotFoundError.new("#{bucket_name}/#{file_name}")
end

#list_files(prefix = '', file_extension = '*') ⇒ Object



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/s3_file_manager.rb', line 48

def list_files(prefix = '', file_extension = '*')
  # objects = []
  # last_key = nil
  # begin
  #   new_objects = AWS::S3::Bucket.objects(bucket_name, :marker => last_key)
  #   objects    += new_objects
  #   last_key    = objects.last.key
  # end while new_objects.size > 0
  #
  # bucket = s3_service.buckets[options[:bucket]]
  # bucket.each do |object|
  #    puts "#{object.key}\t#{object.about['content-length']}\t#{object.about['last-modified']}"
  # end

  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)

  logger.print "Listing \"#{prefix}*.#{file_extension}\" from bucket \"#{bucket_name}\"..."

  files = []
  bucket.objects(prefix: prefix).each do |obj|
    if file_extension == '*' || obj.key.end_with?(".#{file_extension}")
      files << obj.key
    end
  end
  logger.puts 'done.'
  files
end

#read_file(file_name) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/s3_file_manager.rb', line 6

def read_file file_name
  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)

  logger.print "Reading file \"#{file_name}\" from bucket \"#{bucket_name}\"..."
  contents = bucket.object(file_name).get.body.read
  logger.puts 'done.'

  contents
rescue Aws::S3::Errors::NoSuchKey
  raise FileNotFoundError.new("#{bucket_name}/#{file_name}")
end

#rename_file(original_file_name, target_file_name) ⇒ Object



85
86
87
88
89
90
91
92
93
# File 'lib/s3_file_manager.rb', line 85

def rename_file original_file_name, target_file_name
  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)
  logger.print "Renaming file \"#{original_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
  bucket.object(original_file_name).move_to(bucket: bucket_name, key: target_file_name)
  logger.puts 'done.'
rescue Aws::S3::Errors::NoSuchKey
  raise FileNotFoundError.new("#{bucket_name}/#{original_file_name}")
end

#save_file(file_name, file_contents, write_options = {}) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/s3_file_manager.rb', line 23

def save_file(file_name, file_contents, write_options = {})
  logger.print "Saving file \"#{file_name}\" to bucket \"#{bucket_name}\"..."
  s3_service = connect_s3_service
  bucket = s3_service.bucket(bucket_name)

  obj = bucket.object(file_name)
  obj.put(write_options.merge(body: file_contents.to_s))
  logger.puts 'done.'
end