vfs 0.3.12 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/vfs.rb +5 -5
- data/lib/vfs/entries/dir.rb +65 -65
- data/lib/vfs/entries/entry.rb +38 -38
- data/lib/vfs/entries/entry/special_attributes.rb +2 -2
- data/lib/vfs/entries/file.rb +46 -46
- data/lib/vfs/entries/universal_entry.rb +5 -5
- data/lib/vfs/entry_proxy.rb +10 -10
- data/lib/vfs/integration/string.rb +4 -4
- data/lib/vfs/path.rb +25 -25
- data/lib/vfs/storages/local.rb +29 -29
- data/lib/vfs/storages/specification.rb +27 -27
- data/lib/vfs/vfs.rb +7 -7
- data/readme.md +14 -35
- data/spec/container_spec.rb +5 -5
- data/spec/dir_spec.rb +49 -49
- data/spec/entry_spec.rb +9 -9
- data/spec/file_spec.rb +47 -47
- data/spec/path_spec.rb +31 -31
- data/spec/spec_helper.rb +11 -11
- data/spec/storages/local_spec.rb +4 -4
- data/spec/universal_entry_spec.rb +9 -9
- metadata +1 -1
data/lib/vfs.rb
CHANGED
@@ -3,18 +3,18 @@
|
|
3
3
|
|
4
4
|
path
|
5
5
|
error
|
6
|
-
|
6
|
+
|
7
7
|
entries/entry/special_attributes
|
8
8
|
entries/entry
|
9
9
|
entries/file
|
10
10
|
entries/dir
|
11
11
|
entries/universal_entry
|
12
|
-
|
12
|
+
|
13
13
|
entry_proxy
|
14
|
-
|
14
|
+
|
15
15
|
storages/local
|
16
|
-
|
16
|
+
|
17
17
|
integration/string
|
18
|
-
|
18
|
+
|
19
19
|
vfs
|
20
20
|
).each{|f| require "vfs/#{f}"}
|
data/lib/vfs/entries/dir.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
module Vfs
|
2
2
|
class Dir < Entry
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# Container
|
5
|
-
#
|
5
|
+
#
|
6
6
|
def [] path
|
7
7
|
path = path.to_s
|
8
8
|
if path =~ /.+[\/]$/
|
9
9
|
path = path.sub /\/$/, ''
|
10
10
|
dir path
|
11
11
|
else
|
12
|
-
entry path
|
13
|
-
end
|
12
|
+
entry path
|
13
|
+
end
|
14
14
|
end
|
15
15
|
alias_method :/, :[]
|
16
|
-
|
17
|
-
|
18
|
-
#
|
16
|
+
|
17
|
+
|
18
|
+
#
|
19
19
|
# Attributes
|
20
|
-
#
|
20
|
+
#
|
21
21
|
alias_method :exist?, :dir?
|
22
|
-
|
23
|
-
|
22
|
+
|
23
|
+
|
24
24
|
#
|
25
25
|
# CRUD
|
26
26
|
#
|
@@ -30,9 +30,9 @@ module Vfs
|
|
30
30
|
begin
|
31
31
|
try += 1
|
32
32
|
fs.create_dir path
|
33
|
-
rescue StandardError => error
|
33
|
+
rescue StandardError => error
|
34
34
|
entry = self.entry
|
35
|
-
attrs = entry.get
|
35
|
+
attrs = entry.get
|
36
36
|
if attrs[:file] #entry.exist?
|
37
37
|
if options[:override]
|
38
38
|
entry.destroy
|
@@ -45,31 +45,31 @@ module Vfs
|
|
45
45
|
parent = self.parent
|
46
46
|
if parent.exist?
|
47
47
|
# some unknown error
|
48
|
-
raise error
|
48
|
+
raise error
|
49
49
|
else
|
50
|
-
parent.create(options)
|
51
|
-
end
|
50
|
+
parent.create(options)
|
51
|
+
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
retry if try < 2
|
55
55
|
end
|
56
56
|
end
|
57
57
|
self
|
58
|
-
end
|
58
|
+
end
|
59
59
|
def create! options = {}
|
60
60
|
options[:override] = true
|
61
61
|
create options
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def destroy options = {}
|
65
65
|
storage.open_fs do |fs|
|
66
66
|
begin
|
67
|
-
fs.delete_dir path
|
67
|
+
fs.delete_dir path
|
68
68
|
rescue StandardError => e
|
69
69
|
attrs = get
|
70
70
|
if attrs[:file]
|
71
71
|
if options[:force]
|
72
|
-
file.destroy
|
72
|
+
file.destroy
|
73
73
|
else
|
74
74
|
raise Error, "can't destroy File #{dir} (You are trying to destroy it as if it's a Dir)"
|
75
75
|
end
|
@@ -80,28 +80,28 @@ module Vfs
|
|
80
80
|
# do nothing, file already not exist
|
81
81
|
end
|
82
82
|
end
|
83
|
-
end
|
83
|
+
end
|
84
84
|
self
|
85
85
|
end
|
86
86
|
def destroy! options = {}
|
87
87
|
options[:force] = true
|
88
88
|
destroy options
|
89
89
|
end
|
90
|
-
|
91
|
-
|
92
|
-
#
|
90
|
+
|
91
|
+
|
92
|
+
#
|
93
93
|
# Content
|
94
|
-
#
|
94
|
+
#
|
95
95
|
def entries *args, &block
|
96
96
|
raise "invalid arguments #{args.inspect}!" if args.size > 2
|
97
97
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
98
98
|
query = args.first
|
99
|
-
options[:bang] = true unless options.include? :bang
|
100
|
-
|
101
|
-
storage.open_fs do |fs|
|
99
|
+
options[:bang] = true unless options.include? :bang
|
100
|
+
|
101
|
+
storage.open_fs do |fs|
|
102
102
|
begin
|
103
103
|
list = []
|
104
|
-
# query option is optional and supported only for some storages (local fs for example)
|
104
|
+
# query option is optional and supported only for some storages (local fs for example)
|
105
105
|
fs.each_entry path, query do |name, type|
|
106
106
|
next if options[:filter] and options[:filter] != type
|
107
107
|
entry = if type == :dir
|
@@ -123,45 +123,45 @@ module Vfs
|
|
123
123
|
raise error
|
124
124
|
else
|
125
125
|
raise Error, "'#{self}' not exist!" if options[:bang]
|
126
|
-
[]
|
126
|
+
[]
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
131
|
alias_method :each, :entries
|
132
|
-
|
132
|
+
|
133
133
|
def files *args, &block
|
134
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
135
|
-
|
134
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
135
|
+
|
136
136
|
options[:filter] = :file
|
137
137
|
args << options
|
138
138
|
entries *args, &block
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
def dirs *args, &block
|
142
142
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
143
|
-
|
143
|
+
|
144
144
|
options[:filter] = :dir
|
145
145
|
args << options
|
146
146
|
entries *args, &block
|
147
|
-
end
|
148
|
-
|
147
|
+
end
|
148
|
+
|
149
149
|
def include? name
|
150
150
|
entry[name].exist?
|
151
151
|
end
|
152
152
|
alias_method :has?, :include?
|
153
|
-
|
153
|
+
|
154
154
|
def empty?
|
155
155
|
entries.empty?
|
156
156
|
end
|
157
|
-
|
158
|
-
|
159
|
-
#
|
157
|
+
|
158
|
+
|
159
|
+
#
|
160
160
|
# Transfers
|
161
|
-
#
|
161
|
+
#
|
162
162
|
def copy_to to, options = {}
|
163
163
|
options[:bang] = true unless options.include? :bang
|
164
|
-
|
164
|
+
|
165
165
|
raise Error, "invalid argument, destination should be a Entry (#{to})!" unless to.is_a? Entry
|
166
166
|
raise Error, "you can't copy to itself" if self == to
|
167
167
|
|
@@ -176,10 +176,10 @@ module Vfs
|
|
176
176
|
else
|
177
177
|
raise "can't copy to unknown Entry!"
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
# efficient_dir_copy(target, options) || unefficient_dir_copy(target, options)
|
181
|
-
unefficient_dir_copy(target, options)
|
182
|
-
|
181
|
+
unefficient_dir_copy(target, options)
|
182
|
+
|
183
183
|
target
|
184
184
|
end
|
185
185
|
def copy_to! to, options = {}
|
@@ -196,48 +196,48 @@ module Vfs
|
|
196
196
|
options[:override] = true
|
197
197
|
move_to to, options
|
198
198
|
end
|
199
|
-
|
199
|
+
|
200
200
|
# class << self
|
201
201
|
# attr_accessor :dont_use_efficient_dir_copy
|
202
202
|
# end
|
203
|
-
|
203
|
+
|
204
204
|
protected
|
205
|
-
def unefficient_dir_copy to, options
|
205
|
+
def unefficient_dir_copy to, options
|
206
206
|
to.create options
|
207
|
-
entries options do |e|
|
207
|
+
entries options do |e|
|
208
208
|
if e.is_a? Dir
|
209
209
|
e.copy_to to.dir(e.name), options
|
210
210
|
elsif e.is_a? File
|
211
211
|
e.copy_to to.file(e.name), options
|
212
212
|
else
|
213
213
|
raise 'internal error'
|
214
|
-
end
|
214
|
+
end
|
215
215
|
end
|
216
216
|
end
|
217
|
-
|
218
|
-
|
217
|
+
|
218
|
+
|
219
219
|
# def efficient_dir_copy to, options
|
220
220
|
# return false if self.class.dont_use_efficient_dir_copy
|
221
|
-
#
|
221
|
+
#
|
222
222
|
# storage.open_fs do |fs|
|
223
223
|
# try = 0
|
224
|
-
# begin
|
225
|
-
# try += 1
|
224
|
+
# begin
|
225
|
+
# try += 1
|
226
226
|
# self.class.efficient_dir_copy(self, to, options[:override])
|
227
|
-
# rescue StandardError => error
|
227
|
+
# rescue StandardError => error
|
228
228
|
# unknown_errors = 0
|
229
|
-
#
|
229
|
+
#
|
230
230
|
# attrs = get
|
231
231
|
# if attrs[:file]
|
232
232
|
# raise Error, "can't copy File as a Dir ('#{self}')!"
|
233
233
|
# elsif attrs[:dir]
|
234
234
|
# # some unknown error (but it also maybe caused by to be fixed error in 'to')
|
235
|
-
# unknown_errors += 1
|
235
|
+
# unknown_errors += 1
|
236
236
|
# else
|
237
237
|
# raise Error, "'#{self}' not exist!" if options[:bang]
|
238
238
|
# return true
|
239
239
|
# end
|
240
|
-
#
|
240
|
+
#
|
241
241
|
# attrs = to.get
|
242
242
|
# if attrs[:file]
|
243
243
|
# if options[:override]
|
@@ -250,7 +250,7 @@ module Vfs
|
|
250
250
|
# # if options[:override]
|
251
251
|
# # to.destroy
|
252
252
|
# # else
|
253
|
-
# # dir_already_exist = true
|
253
|
+
# # dir_already_exist = true
|
254
254
|
# # # raise Vfs::Error, "entry #{to} already exist!"
|
255
255
|
# # end
|
256
256
|
# else # parent not exist
|
@@ -259,16 +259,16 @@ module Vfs
|
|
259
259
|
# # some unknown error (but it also maybe caused by already fixed error in 'from')
|
260
260
|
# unknown_errors += 1
|
261
261
|
# else
|
262
|
-
# parent.create(options)
|
263
|
-
# end
|
262
|
+
# parent.create(options)
|
263
|
+
# end
|
264
264
|
# end
|
265
|
-
#
|
265
|
+
#
|
266
266
|
# raise error if unknown_errors > 1
|
267
267
|
# try < 2 ? retry : raise(error)
|
268
268
|
# end
|
269
269
|
# end
|
270
270
|
# end
|
271
|
-
#
|
271
|
+
#
|
272
272
|
# def self.efficient_dir_copy from, to, override
|
273
273
|
# from.storage.open_fs{|fs|
|
274
274
|
# fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to, override)
|
data/lib/vfs/entries/entry.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Vfs
|
2
2
|
class Entry
|
3
3
|
attr_reader :storage, :path, :path_cache
|
4
|
-
|
4
|
+
|
5
5
|
def initialize *args
|
6
6
|
if args.size == 1 and args.first.is_a? Entry
|
7
7
|
entry = args.first
|
8
|
-
@path_cache = entry.path_cache
|
8
|
+
@path_cache = entry.path_cache
|
9
9
|
@storage, @path = entry.storage, entry.path
|
10
10
|
else
|
11
11
|
storage, path = *args
|
@@ -13,20 +13,20 @@ module Vfs
|
|
13
13
|
@storage, @path = storage, path_cache.to_s
|
14
14
|
end
|
15
15
|
raise "storage not defined!" unless self.storage
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
#
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
#
|
20
20
|
# Navigation
|
21
|
-
#
|
21
|
+
#
|
22
22
|
def parent
|
23
23
|
Dir.new(storage, path_cache + '..')
|
24
24
|
end
|
25
|
-
|
26
|
-
|
27
|
-
#
|
25
|
+
|
26
|
+
|
27
|
+
#
|
28
28
|
# Transformations
|
29
|
-
#
|
29
|
+
#
|
30
30
|
def dir path = nil
|
31
31
|
if path
|
32
32
|
new_path = path_cache + path
|
@@ -36,7 +36,7 @@ module Vfs
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
alias_method :to_dir, :dir
|
39
|
-
|
39
|
+
|
40
40
|
def file path = nil
|
41
41
|
if path
|
42
42
|
new_path = path_cache + path
|
@@ -46,46 +46,46 @@ module Vfs
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
alias_method :to_file, :file
|
49
|
-
|
49
|
+
|
50
50
|
def entry path = nil
|
51
51
|
entry = if path
|
52
|
-
|
52
|
+
|
53
53
|
new_path = path_cache + path
|
54
54
|
klass = new_path.probably_dir? ? Dir : UniversalEntry
|
55
|
-
entry = klass.new storage, new_path
|
55
|
+
entry = klass.new storage, new_path
|
56
56
|
else
|
57
57
|
UniversalEntry.new self
|
58
58
|
end
|
59
59
|
EntryProxy.new entry
|
60
60
|
end
|
61
61
|
alias_method :to_entry, :entry
|
62
|
-
|
63
|
-
|
64
|
-
#
|
62
|
+
|
63
|
+
|
64
|
+
#
|
65
65
|
# Attributes
|
66
|
-
#
|
66
|
+
#
|
67
67
|
def get attr_name = nil
|
68
68
|
attrs = storage.open_fs{|fs| fs.attributes(path)}
|
69
69
|
attr_name ? attrs[attr_name] : attrs
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def set options
|
73
73
|
not_implemented
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
def dir?; !!get(:dir) end
|
77
|
-
def file?; !!get(:file) end
|
78
|
-
|
77
|
+
def file?; !!get(:file) end
|
78
|
+
|
79
79
|
include SpecialAttributes
|
80
|
-
|
81
|
-
|
82
|
-
#
|
80
|
+
|
81
|
+
|
82
|
+
#
|
83
83
|
# Miscellaneous
|
84
|
-
#
|
84
|
+
#
|
85
85
|
def name
|
86
86
|
path_cache.name
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def tmp &block
|
90
90
|
storage.open_fs do |fs|
|
91
91
|
if block
|
@@ -97,29 +97,29 @@ module Vfs
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def local?
|
102
102
|
storage.local?
|
103
103
|
end
|
104
|
-
|
105
|
-
|
106
|
-
#
|
104
|
+
|
105
|
+
|
106
|
+
#
|
107
107
|
# Utils
|
108
|
-
#
|
108
|
+
#
|
109
109
|
def inspect
|
110
110
|
"#{storage}#{':' unless storage.to_s.empty?}#{path}"
|
111
111
|
end
|
112
|
-
alias_method :to_s, :inspect
|
113
|
-
|
112
|
+
alias_method :to_s, :inspect
|
113
|
+
|
114
114
|
def == other
|
115
115
|
return false unless other.is_a? Entry
|
116
116
|
storage == other.storage and path == other.path
|
117
117
|
end
|
118
|
-
|
119
|
-
def hash
|
118
|
+
|
119
|
+
def hash
|
120
120
|
storage.hash + path.hash
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
def eql? other
|
124
124
|
return false unless other.class == self.class
|
125
125
|
storage.eql?(other.storage) and path.eql?(other.path)
|