remote_files 3.1.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a7fc219e4fd9f86ae482ca50d7eb34a002f191de97f932e01e44f1020846403
4
- data.tar.gz: 530d0f1e212e46e3737334f3cf8a7f5bc8b6249176b59c774d272bf54fb8420a
3
+ metadata.gz: 2c031b3f95c929678e3ab56a3cc98c6aea47db1c294bfbd7b20a4390e90d06b6
4
+ data.tar.gz: c0665d4387cb9e15fca35e89387e6ac687b8b3c616d4d004892c6787596efe89
5
5
  SHA512:
6
- metadata.gz: 6631796ee3ab3daeefb2bcb9807422ae616a65b32372d792ebd88441f6eb8a933a7c798e691ed2a81e4b48fdabf3e1f1766ed13c2d71df492333724b6067e4c3
7
- data.tar.gz: 9b2e193ded1126905277c4a05475944c05c508e653dfda19e82de70236a9bc9488c20540f7955c8bf125a31fefd27dc46de4b7a4addf69d053de426e0c72d12c
6
+ metadata.gz: 646ff0467bf953702039d0240ca72fe56c0989d5639caa21778079ff4d5ae84014e85e9a191b48095b22dcafe70ba65819e52d771acb5da040fe418b6865b482
7
+ data.tar.gz: 45cdccb5afa27109216a3c4b56ba220de6410935dddcfde320b61a0642ffea945c3722f179c22b40fd8c8427098534fc93a06f7fc4042a8e2224fcf1d0707ad1
@@ -22,6 +22,14 @@ module RemoteFiles
22
22
  raise "You need to implement #{self.class.name}:#directory_name"
23
23
  end
24
24
 
25
+ def files(prefix = '')
26
+ raise "You need to implement #{self.class.name} #files"
27
+ end
28
+
29
+ def copy_to_store!(file, target_store)
30
+ raise "You need to implement #{self.class.name} #copy_to_store!"
31
+ end
32
+
25
33
  def store!(file)
26
34
  raise "You need to implement #{self.class.name}#store!"
27
35
  end
@@ -1,19 +1,21 @@
1
1
  module RemoteFiles
2
2
  class File
3
- attr_reader :content, :content_type, :identifier, :stored_in, :configuration
3
+ attr_reader :content, :content_type, :identifier, :stored_in, :configuration, :populate_stored_in, :last_update_ts
4
4
 
5
5
  def initialize(identifier, options = {})
6
- known_keys = [:identifier, :stored_in, :content_type, :configuration, :content]
6
+ known_keys = [:identifier, :stored_in, :content_type, :configuration, :content, :populate_stored_in, :last_update_ts]
7
7
  known_keys.each do |key|
8
8
  options[key] ||= options.delete(key.to_s)
9
9
  end
10
10
 
11
11
  @identifier = identifier
12
- @stored_in = (options[:stored_in] || []).map(&:to_sym)
12
+ @stored_in = (options[:stored_in] || []).map(&:to_sym) # TODO: Refactor so that there are two classes: `File` and `FileCopy`
13
13
  @content = options.delete(:content)
14
+ @last_update_ts = options[:last_update_ts] || Time.now
14
15
  @content_type = options[:content_type]
15
16
  @configuration = RemoteFiles::CONFIGURATIONS[(options[:configuration] || :default).to_sym]
16
17
  @logger = options[:logger]
18
+ @populate_stored_in = options[:populate_stored_in]
17
19
  @options = options
18
20
  end
19
21
 
@@ -34,7 +36,8 @@ module RemoteFiles
34
36
  :identifier => identifier,
35
37
  :stored_in => stored_in,
36
38
  :content_type => content_type,
37
- :configuration => configuration.name
39
+ :configuration => configuration.name,
40
+ :populate_stored_in => populate_stored_in
38
41
  )
39
42
  end
40
43
 
@@ -79,6 +82,8 @@ module RemoteFiles
79
82
  next unless file
80
83
  @content = file.content
81
84
  @content_type = file.content_type
85
+ # :populate_stored_in is a boolean
86
+ @stored_in = file.stored_in if @populate_stored_in
82
87
  return true
83
88
  rescue Error => e
84
89
  end
@@ -1,7 +1,7 @@
1
1
  require 'pathname'
2
2
  require 'fileutils'
3
3
 
4
- # This is good for use in deveopment
4
+ # This is good for use in development
5
5
 
6
6
  module RemoteFiles
7
7
  class FileStore < AbstractStore
@@ -13,6 +13,21 @@ module RemoteFiles
13
13
  end
14
14
  end
15
15
 
16
+ def files(prefix = '')
17
+ dir = directory + prefix
18
+
19
+ return [] unless dir.exist?
20
+
21
+ dir.children.reject do |child|
22
+ child.directory?
23
+ end.map do |child|
24
+ File.new(child.basename.to_s,
25
+ :stored_in => [self],
26
+ :last_update_ts => child.mtime
27
+ )
28
+ end
29
+ end
30
+
16
31
  def store!(file)
17
32
  file_name = directory + file.identifier
18
33
 
@@ -30,12 +45,19 @@ module RemoteFiles
30
45
  end
31
46
  end
32
47
 
48
+ def copy_to_store!(file, target_store)
49
+ FileUtils.cp(directory + file.identifier, target_store.directory + file.identifier)
50
+ end
51
+
33
52
  def retrieve!(identifier)
34
- content = (directory + identifier).read
53
+ path = directory + identifier
54
+
55
+ content = (path).read
35
56
 
36
57
  RemoteFiles::File.new(identifier,
37
58
  :content => content,
38
- :stored_in => [self]
59
+ :stored_in => [self],
60
+ :last_update_ts => path.mtime
39
61
  # what about content-type? maybe use the mime-types gem?
40
62
  )
41
63
  rescue Errno::ENOENT
@@ -7,6 +7,7 @@ module RemoteFiles
7
7
 
8
8
  def store!(file)
9
9
  success = directory.files.create(store_options(file))
10
+ # TODO: Probably get the last modified time
10
11
 
11
12
  raise RemoteFiles::Error unless success
12
13
 
@@ -15,6 +16,10 @@ module RemoteFiles
15
16
  raise RemoteFiles::Error, $!.message, $!.backtrace
16
17
  end
17
18
 
19
+ def copy_to_store!(file, target_store)
20
+ target_store.connection.copy_object(directory_name, file.identifier, target_store.directory_name, file.identifier)
21
+ end
22
+
18
23
  def retrieve!(identifier)
19
24
  fog_file = directory.files.get(identifier)
20
25
 
@@ -23,7 +28,8 @@ module RemoteFiles
23
28
  File.new(identifier,
24
29
  :content => fog_file.body,
25
30
  :content_type => fog_file.content_type,
26
- :stored_in => [self]
31
+ :stored_in => [self],
32
+ :last_update_ts => fog_file.last_modified
27
33
  )
28
34
  rescue Fog::Errors::Error, Excon::Errors::Error
29
35
  raise RemoteFiles::Error, $!.message, $!.backtrace
@@ -53,28 +59,53 @@ module RemoteFiles
53
59
  raise RemoteFiles::Error, message
54
60
  end
55
61
 
56
- connection.delete_object(directory.key, identifier)
62
+ connection.delete_object(directory_name, identifier)
57
63
  rescue Fog::Errors::NotFound, Excon::Errors::NotFound
58
64
  raise NotFoundError, $!.message, $!.backtrace
59
65
  end
60
66
 
61
67
  def connection
62
- connection_options = options.dup
63
- connection_options.delete(:directory)
64
- connection_options.delete(:public)
65
- @connection ||= Fog::Storage.new(connection_options)
68
+ opts = options.dup
69
+ opts.delete(:directory)
70
+ opts.delete(:public)
71
+ opts[:connection_options] ||= default_connection_options
72
+ @connection ||= Fog::Storage.new(opts)
66
73
  end
67
74
 
68
75
  def directory_name
69
76
  options[:directory]
70
77
  end
71
78
 
79
+ # TODO: Add file bodies if we think it's worth it
80
+ def files(prefix = '')
81
+ full_list = []
82
+
83
+ directory.files.all(:prefix => prefix).each do |file|
84
+ full_list.push(
85
+ File.new(file.identity,
86
+ :content_type => file.content_type,
87
+ :stored_in => [self],
88
+ :last_update_ts => file.last_modified
89
+ )
90
+ )
91
+ end
92
+
93
+ full_list
94
+ end
95
+
72
96
  def directory
73
97
  @directory ||= lookup_directory || create_directory
74
98
  end
75
99
 
76
100
  protected
77
101
 
102
+ def default_connection_options
103
+ {
104
+ retry_limit: 0,
105
+ retry_interval: 0
106
+ }
107
+ end
108
+
78
109
  def aws_host
79
110
  case options[:region]
80
111
  when nil, 'us-east-1'
@@ -22,7 +22,11 @@ module RemoteFiles
22
22
 
23
23
  def store!(file)
24
24
  content = file.content.respond_to?(:read) ? file.content.read : file.content
25
- data[file.identifier] = { :content => content, :content_type => file.content_type}
25
+ data[file.identifier] = { :content => content, :content_type => file.content_type, :last_update_ts => file.last_update_ts}
26
+ end
27
+
28
+ def copy_to_store!(file, target_store)
29
+ target_store.data[file.identifier] = data[file.identifier]
26
30
  end
27
31
 
28
32
  def retrieve!(identifier)
@@ -31,10 +35,23 @@ module RemoteFiles
31
35
  File.new(identifier,
32
36
  :content => data[identifier][:content],
33
37
  :content_type => data[identifier][:content_type],
38
+ :last_update_ts => data[identifier][:last_update_ts],
34
39
  :stored_in => [self]
35
40
  )
36
41
  end
37
42
 
43
+ def files(prefix = '')
44
+ @data.reject do |identifier|
45
+ !identifier.start_with? prefix
46
+ end.map do |identifier, data|
47
+ File.new(identifier,
48
+ :content_type => data[:content_type],
49
+ :last_update_ts => data[:last_update_ts],
50
+ :stored_in => [self]
51
+ )
52
+ end
53
+ end
54
+
38
55
  def directory_name
39
56
  self.identifier.to_s
40
57
  end
@@ -1,3 +1,3 @@
1
1
  module RemoteFiles
2
- VERSION = '3.1.0'
2
+ VERSION = '3.4.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remote_files
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mick Staugaard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-01 00:00:00.000000000 Z
11
+ date: 2022-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-aws
@@ -59,7 +59,7 @@ files:
59
59
  - lib/remote_files/version.rb
60
60
  homepage: https://github.com/zendesk/remote_files
61
61
  licenses:
62
- - Apache License Version 2.0
62
+ - Apache-2.0
63
63
  metadata: {}
64
64
  post_install_message:
65
65
  rdoc_options: []
@@ -76,8 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.7.6
79
+ rubygems_version: 3.0.3.1
81
80
  signing_key:
82
81
  specification_version: 4
83
82
  summary: The purpose of the library is to implement a simple interface for uploading