remote_files 3.3.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: f2bdd40ed1be30e3649f6089e603134e8cbc4bf8445d8b355f769b4ce29c2b25
4
- data.tar.gz: 9a4d13593c4022eff78130eaf61d61e83a6bd8cfaae164636dfd81fca95fd7d2
3
+ metadata.gz: 2c031b3f95c929678e3ab56a3cc98c6aea47db1c294bfbd7b20a4390e90d06b6
4
+ data.tar.gz: c0665d4387cb9e15fca35e89387e6ac687b8b3c616d4d004892c6787596efe89
5
5
  SHA512:
6
- metadata.gz: 648b24549307387c950a8ef5f72b0df42f6274eb53889b8c207e0aaba40618bbe1d1bbb43192baf6b037d43c885d492739994ee204a4e65e041321c4640e5d92
7
- data.tar.gz: 8ad800c0ddd17a85e4631d6b38e960287c278127b88ec349cb2df890e37442e3fba4239e1219b6b54d66b6cebaf328bb92571607a6e3fd9817e2ef0dbc0ee7c0
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,16 +1,17 @@
1
1
  module RemoteFiles
2
2
  class File
3
- attr_reader :content, :content_type, :identifier, :stored_in, :configuration, :populate_stored_in
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, :populate_stored_in]
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]
@@ -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
@@ -70,6 +76,23 @@ module RemoteFiles
70
76
  options[:directory]
71
77
  end
72
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
+
73
96
  def directory
74
97
  @directory ||= lookup_directory || create_directory
75
98
  end
@@ -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.3.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.3.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: 2022-05-03 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