vfs 0.3.10 → 0.3.11
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/vfs.rb +0 -1
- data/lib/vfs/entries/dir.rb +68 -60
- data/lib/vfs/entries/file.rb +4 -4
- data/lib/vfs/storages/local.rb +25 -31
- data/spec/container_spec.rb +11 -12
- data/spec/dir_spec.rb +19 -18
- data/spec/entry_spec.rb +5 -4
- data/spec/file_spec.rb +35 -11
- data/spec/spec_helper.rb +47 -1
- data/spec/universal_entry_spec.rb +3 -2
- metadata +18 -31
- data/lib/vfs/storages/hash_fs.rb +0 -216
- data/spec/storages/hash_fs_spec.rb +0 -10
data/lib/vfs.rb
CHANGED
data/lib/vfs/entries/dir.rb
CHANGED
@@ -177,7 +177,8 @@ module Vfs
|
|
177
177
|
raise "can't copy to unknown Entry!"
|
178
178
|
end
|
179
179
|
|
180
|
-
efficient_dir_copy(target, options) || unefficient_dir_copy(target, options)
|
180
|
+
# efficient_dir_copy(target, options) || unefficient_dir_copy(target, options)
|
181
|
+
unefficient_dir_copy(target, options)
|
181
182
|
|
182
183
|
target
|
183
184
|
end
|
@@ -196,8 +197,12 @@ module Vfs
|
|
196
197
|
move_to to, options
|
197
198
|
end
|
198
199
|
|
200
|
+
# class << self
|
201
|
+
# attr_accessor :dont_use_efficient_dir_copy
|
202
|
+
# end
|
203
|
+
|
199
204
|
protected
|
200
|
-
def unefficient_dir_copy to, options
|
205
|
+
def unefficient_dir_copy to, options
|
201
206
|
to.create options
|
202
207
|
entries options do |e|
|
203
208
|
if e.is_a? Dir
|
@@ -210,64 +215,67 @@ module Vfs
|
|
210
215
|
end
|
211
216
|
end
|
212
217
|
|
213
|
-
def efficient_dir_copy to, options
|
214
|
-
storage.open_fs do |fs|
|
215
|
-
try = 0
|
216
|
-
begin
|
217
|
-
try += 1
|
218
|
-
self.class.efficient_dir_copy(self, to, options[:override])
|
219
|
-
rescue StandardError => error
|
220
|
-
unknown_errors = 0
|
221
|
-
|
222
|
-
attrs = get
|
223
|
-
if attrs[:file]
|
224
|
-
raise Error, "can't copy File as a Dir ('#{self}')!"
|
225
|
-
elsif attrs[:dir]
|
226
|
-
# some unknown error (but it also maybe caused by to be fixed error in 'to')
|
227
|
-
unknown_errors += 1
|
228
|
-
else
|
229
|
-
raise Error, "'#{self}' not exist!" if options[:bang]
|
230
|
-
return true
|
231
|
-
end
|
232
|
-
|
233
|
-
attrs = to.get
|
234
|
-
if attrs[:file]
|
235
|
-
if options[:override]
|
236
|
-
to.destroy
|
237
|
-
else
|
238
|
-
raise Vfs::Error, "entry #{to} already exist!"
|
239
|
-
end
|
240
|
-
elsif attrs[:dir]
|
241
|
-
unknown_errors += 1
|
242
|
-
# if options[:override]
|
243
|
-
# to.destroy
|
244
|
-
# else
|
245
|
-
# dir_already_exist = true
|
246
|
-
# # raise Vfs::Error, "entry #{to} already exist!"
|
247
|
-
# end
|
248
|
-
else # parent not exist
|
249
|
-
parent = to.parent
|
250
|
-
if parent.exist?
|
251
|
-
# some unknown error (but it also maybe caused by already fixed error in 'from')
|
252
|
-
unknown_errors += 1
|
253
|
-
else
|
254
|
-
parent.create(options)
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
raise error if unknown_errors > 1
|
259
|
-
try < 2 ? retry : raise(error)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
218
|
|
264
|
-
def
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
219
|
+
# def efficient_dir_copy to, options
|
220
|
+
# return false if self.class.dont_use_efficient_dir_copy
|
221
|
+
#
|
222
|
+
# storage.open_fs do |fs|
|
223
|
+
# try = 0
|
224
|
+
# begin
|
225
|
+
# try += 1
|
226
|
+
# self.class.efficient_dir_copy(self, to, options[:override])
|
227
|
+
# rescue StandardError => error
|
228
|
+
# unknown_errors = 0
|
229
|
+
#
|
230
|
+
# attrs = get
|
231
|
+
# if attrs[:file]
|
232
|
+
# raise Error, "can't copy File as a Dir ('#{self}')!"
|
233
|
+
# elsif attrs[:dir]
|
234
|
+
# # some unknown error (but it also maybe caused by to be fixed error in 'to')
|
235
|
+
# unknown_errors += 1
|
236
|
+
# else
|
237
|
+
# raise Error, "'#{self}' not exist!" if options[:bang]
|
238
|
+
# return true
|
239
|
+
# end
|
240
|
+
#
|
241
|
+
# attrs = to.get
|
242
|
+
# if attrs[:file]
|
243
|
+
# if options[:override]
|
244
|
+
# to.destroy
|
245
|
+
# else
|
246
|
+
# raise Vfs::Error, "entry #{to} already exist!"
|
247
|
+
# end
|
248
|
+
# elsif attrs[:dir]
|
249
|
+
# unknown_errors += 1
|
250
|
+
# # if options[:override]
|
251
|
+
# # to.destroy
|
252
|
+
# # else
|
253
|
+
# # dir_already_exist = true
|
254
|
+
# # # raise Vfs::Error, "entry #{to} already exist!"
|
255
|
+
# # end
|
256
|
+
# else # parent not exist
|
257
|
+
# parent = to.parent
|
258
|
+
# if parent.exist?
|
259
|
+
# # some unknown error (but it also maybe caused by already fixed error in 'from')
|
260
|
+
# unknown_errors += 1
|
261
|
+
# else
|
262
|
+
# parent.create(options)
|
263
|
+
# end
|
264
|
+
# end
|
265
|
+
#
|
266
|
+
# raise error if unknown_errors > 1
|
267
|
+
# try < 2 ? retry : raise(error)
|
268
|
+
# end
|
269
|
+
# end
|
270
|
+
# end
|
271
|
+
#
|
272
|
+
# def self.efficient_dir_copy from, to, override
|
273
|
+
# from.storage.open_fs{|fs|
|
274
|
+
# fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to, override)
|
275
|
+
# } or
|
276
|
+
# to.storage.open_fs{|fs|
|
277
|
+
# fs.respond_to?(:efficient_dir_copy) and fs.efficient_dir_copy(from, to, override)
|
278
|
+
# }
|
279
|
+
# end
|
272
280
|
end
|
273
281
|
end
|
data/lib/vfs/entries/file.rb
CHANGED
@@ -69,7 +69,7 @@ module Vfs
|
|
69
69
|
else
|
70
70
|
fs.write_file(path, options[:append]){|writer| writer.call data}
|
71
71
|
end
|
72
|
-
rescue StandardError => error
|
72
|
+
rescue StandardError => error
|
73
73
|
entry = self.entry
|
74
74
|
if entry.exist?
|
75
75
|
if options[:override]
|
@@ -86,7 +86,7 @@ module Vfs
|
|
86
86
|
parent.create(options)
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
retry if try < 2
|
91
91
|
end
|
92
92
|
end
|
@@ -159,7 +159,7 @@ module Vfs
|
|
159
159
|
to.file
|
160
160
|
else
|
161
161
|
raise "can't copy to unknown Entry!"
|
162
|
-
end
|
162
|
+
end
|
163
163
|
|
164
164
|
target.write options do |writer|
|
165
165
|
read(options){|buff| writer.call buff}
|
@@ -191,7 +191,7 @@ module Vfs
|
|
191
191
|
|
192
192
|
args.unshift Object.new if args.size == 1 and args.first.is_a?(Hash)
|
193
193
|
|
194
|
-
template = Tilt.new
|
194
|
+
template = Tilt.new(path){read}
|
195
195
|
template.render *args
|
196
196
|
end
|
197
197
|
|
data/lib/vfs/storages/local.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
warn 'remove trailing spaces'
|
1
2
|
require 'tempfile'
|
2
3
|
|
3
4
|
module Vfs
|
4
5
|
module Storages
|
5
6
|
class Local
|
6
7
|
module LocalVfsHelper
|
7
|
-
DEFAULT_BUFFER = 1024
|
8
|
+
DEFAULT_BUFFER = 1000 * 1024
|
8
9
|
|
9
10
|
attr_writer :buffer
|
10
11
|
def buffer
|
@@ -23,7 +24,7 @@ module Vfs
|
|
23
24
|
# attributes special for file system
|
24
25
|
attrs[:created_at] = stat.ctime
|
25
26
|
attrs[:updated_at] = stat.mtime
|
26
|
-
attrs[:size] = stat.size
|
27
|
+
attrs[:size] = stat.size if stat.file?
|
27
28
|
attrs
|
28
29
|
rescue Errno::ENOENT
|
29
30
|
{}
|
@@ -45,15 +46,18 @@ module Vfs
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
|
-
def write_file path, append, &block
|
49
|
-
|
49
|
+
def write_file path, append, &block
|
50
|
+
# TODO2 Performance lost, extra call to check file existence
|
51
|
+
raise "can't write, entry #{path} already exist!" if !append and ::File.exist?(path)
|
52
|
+
|
53
|
+
option = append ? 'a' : 'w'
|
50
54
|
::File.open path, option do |os|
|
51
55
|
writer = -> buff {os.write buff}
|
52
56
|
block.call writer
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
56
|
-
def delete_file path
|
60
|
+
def delete_file path
|
57
61
|
::File.delete path
|
58
62
|
end
|
59
63
|
|
@@ -70,6 +74,9 @@ module Vfs
|
|
70
74
|
end
|
71
75
|
|
72
76
|
def delete_dir path
|
77
|
+
# TODO2 Performance lost, extra call to check file existence
|
78
|
+
raise "can't delete file (#{path})!" if ::File.file?(path)
|
79
|
+
|
73
80
|
FileUtils.rm_r path
|
74
81
|
end
|
75
82
|
|
@@ -96,33 +103,20 @@ module Vfs
|
|
96
103
|
end
|
97
104
|
end
|
98
105
|
|
99
|
-
def efficient_dir_copy from, to, override
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
# def move_dir path
|
115
|
-
# raise 'not supported'
|
116
|
-
# end
|
117
|
-
|
118
|
-
# def upload_directory from_local_path, to_remote_path
|
119
|
-
# FileUtils.cp_r from_local_path, to_remote_path
|
106
|
+
# def efficient_dir_copy from, to, override
|
107
|
+
# return false if override # FileUtils.cp_r doesn't support this behaviour
|
108
|
+
#
|
109
|
+
# from.storage.open_fs do |from_fs|
|
110
|
+
# to.storage.open_fs do |to_fs|
|
111
|
+
# if from_fs.local? and to_fs.local?
|
112
|
+
# FileUtils.cp_r from.path, to.path
|
113
|
+
# true
|
114
|
+
# else
|
115
|
+
# false
|
116
|
+
# end
|
117
|
+
# end
|
118
|
+
# end
|
120
119
|
# end
|
121
|
-
#
|
122
|
-
# def download_directory from_remote_path, to_local_path
|
123
|
-
# FileUtils.cp_r from_remote_path, to_local_path
|
124
|
-
# end
|
125
|
-
|
126
120
|
|
127
121
|
#
|
128
122
|
# Other
|
data/spec/container_spec.rb
CHANGED
@@ -1,30 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Container' do
|
4
|
-
|
5
|
-
@fs = '/'.to_entry_on(Vfs::Storages::HashFs.new)
|
6
|
-
end
|
4
|
+
with_test_fs
|
7
5
|
|
8
6
|
it "should threat paths as UniversalEntry except it ends with '/'" do
|
9
|
-
|
10
|
-
|
7
|
+
test_fs.should_receive(:entry).with('tmp/a/b')
|
8
|
+
test_fs['tmp/a/b']
|
11
9
|
|
12
|
-
|
13
|
-
|
10
|
+
test_fs.should_receive(:dir).with('tmp/a/b')
|
11
|
+
test_fs['tmp/a/b/']
|
14
12
|
end
|
15
13
|
|
16
14
|
it '/' do
|
17
|
-
|
15
|
+
test_fs[:some_path].should == test_fs / :some_path
|
16
|
+
test_fs[:some_path][:another_path].should == test_fs / :some_path / :another_path
|
18
17
|
end
|
19
18
|
|
20
19
|
it "UniversalEntry should be wrapped inside of proxy, Dir and File should not" do
|
21
|
-
-> {
|
22
|
-
-> {
|
23
|
-
|
20
|
+
-> {test_fs.dir.proxy?}.should raise_error(NoMethodError)
|
21
|
+
-> {test_fs.file.proxy?}.should raise_error(NoMethodError)
|
22
|
+
test_fs.entry.proxy?.should be_true
|
24
23
|
end
|
25
24
|
|
26
25
|
it "sometimes it also should inexplicitly guess that path is a Dir instead of UniversalEntry (but still wrap it inside of Proxy)" do
|
27
|
-
dir =
|
26
|
+
dir = test_fs['tmp/a/..']
|
28
27
|
dir.proxy?.should be_true
|
29
28
|
dir.should be_a(Vfs::Dir)
|
30
29
|
end
|
data/spec/dir_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Dir' do
|
4
|
+
with_test_fs
|
5
|
+
|
4
6
|
before do
|
5
|
-
@
|
6
|
-
@path = @fs['/a/b/c']
|
7
|
+
@path = test_fs['a/b/c']
|
7
8
|
end
|
8
9
|
|
9
10
|
describe 'existence' do
|
@@ -195,28 +196,28 @@ describe 'Dir' do
|
|
195
196
|
@to.file('other_file').read.should == 'other'
|
196
197
|
end
|
197
198
|
end
|
198
|
-
|
199
|
+
|
199
200
|
describe 'general copy' do
|
200
201
|
it_should_behave_like 'copy_to behavior'
|
201
202
|
|
202
203
|
before do
|
203
|
-
#
|
204
|
-
|
205
|
-
|
206
|
-
@
|
207
|
-
end
|
204
|
+
# prevenging usage of :efficient_dir_copy
|
205
|
+
# Vfs::Dir.dont_use_efficient_dir_copy = true
|
206
|
+
|
207
|
+
@to = test_fs['to']
|
208
|
+
end
|
209
|
+
# after do
|
210
|
+
# Vfs::Dir.dont_use_efficient_dir_copy = false
|
211
|
+
# end
|
208
212
|
end
|
209
213
|
|
210
|
-
describe 'effective copy' do
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
# @from.storage.should_receive(:for_spec_helper_effective_copy_used).at_least(1).times
|
218
|
-
end
|
219
|
-
end
|
214
|
+
# describe 'effective copy' do
|
215
|
+
# it_should_behave_like 'copy_to behavior'
|
216
|
+
#
|
217
|
+
# before do
|
218
|
+
# @to = test_fs['to']
|
219
|
+
# end
|
220
|
+
# end
|
220
221
|
end
|
221
222
|
|
222
223
|
describe 'moving' do
|
data/spec/entry_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Entry' do
|
4
|
+
with_test_fs
|
5
|
+
|
4
6
|
before do
|
5
|
-
@
|
6
|
-
@path = @fs['/a/b/c']
|
7
|
+
@path = test_fs['a/b/c']
|
7
8
|
end
|
8
9
|
|
9
10
|
it "name" do
|
@@ -11,11 +12,11 @@ describe 'Entry' do
|
|
11
12
|
end
|
12
13
|
|
13
14
|
it 'tmp' do
|
14
|
-
tmp =
|
15
|
+
tmp = test_fs.tmp
|
15
16
|
tmp.should be_dir
|
16
17
|
|
17
18
|
tmp = nil
|
18
|
-
|
19
|
+
test_fs.tmp do |path|
|
19
20
|
tmp = path
|
20
21
|
tmp.should be_dir
|
21
22
|
end
|
data/spec/file_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'File' do
|
4
|
+
with_test_fs
|
5
|
+
|
4
6
|
before do
|
5
|
-
@
|
6
|
-
@path = @fs['/a/b/c']
|
7
|
+
@path = test_fs['a/b/c']
|
7
8
|
end
|
8
9
|
|
9
10
|
describe 'existence' do
|
@@ -67,15 +68,16 @@ describe 'File' do
|
|
67
68
|
@path.read.should == 'something'
|
68
69
|
end
|
69
70
|
|
70
|
-
it 'should override existing file if override specified' do
|
71
|
+
it 'should not override existing file, only if :override specified' do
|
71
72
|
@path.write 'something'
|
72
73
|
@path.should be_file
|
73
74
|
-> {@path.write 'another'}.should raise_error(Vfs::Error, /exist/)
|
74
|
-
|
75
|
-
@path.
|
75
|
+
|
76
|
+
@path.write! 'other'
|
77
|
+
@path.read.should == 'other'
|
76
78
|
end
|
77
79
|
|
78
|
-
it 'should override existing dir if override specified' do
|
80
|
+
it 'should override existing dir if :override specified' do
|
79
81
|
@path.dir.create
|
80
82
|
@path.should be_dir
|
81
83
|
-> {@path.write 'another'}.should raise_error(Vfs::Error, /exist/)
|
@@ -132,22 +134,28 @@ describe 'File' do
|
|
132
134
|
end
|
133
135
|
|
134
136
|
it 'should copy to file (and overwrite if forced)' do
|
135
|
-
check_copy_for
|
137
|
+
check_copy_for test_fs.file('to')
|
136
138
|
end
|
137
139
|
|
138
140
|
it 'should copy to dir (and overwrite if forced)' do
|
139
|
-
check_copy_for
|
141
|
+
check_copy_for test_fs.dir("to")
|
140
142
|
end
|
141
143
|
|
142
144
|
it 'should copy to UniversalEntry (and overwrite if forced)' do
|
143
|
-
check_copy_for
|
145
|
+
check_copy_for test_fs.entry('to')
|
144
146
|
end
|
145
147
|
|
146
148
|
it 'should be chainable' do
|
147
|
-
to =
|
149
|
+
to = test_fs['to']
|
148
150
|
@from.copy_to(to).should == to
|
149
151
|
@from.copy_to!(to).should == to
|
150
152
|
end
|
153
|
+
|
154
|
+
it "should autocreate parent's path if not exist (from error)" do
|
155
|
+
to = test_fs['parent_path/to']
|
156
|
+
@from.copy_to(to)
|
157
|
+
to.read.should == 'something'
|
158
|
+
end
|
151
159
|
end
|
152
160
|
|
153
161
|
describe 'moving' do
|
@@ -188,7 +196,23 @@ describe 'File' do
|
|
188
196
|
end
|
189
197
|
|
190
198
|
describe "extra stuff" do
|
191
|
-
it 'render'
|
199
|
+
it 'render' do
|
200
|
+
template = test_fs / 'letter.erb'
|
201
|
+
template.write "Hello dear <%= name %>"
|
202
|
+
template.render(name: 'Mary').should == "Hello dear Mary"
|
203
|
+
end
|
204
|
+
|
205
|
+
begin
|
206
|
+
require 'haml'
|
207
|
+
|
208
|
+
it 'render using other template engines' do
|
209
|
+
template = test_fs / 'letter.haml'
|
210
|
+
template.write "Hello dear \#{name}"
|
211
|
+
template.render(name: 'Mary').should =~ /Hello dear Mary/
|
212
|
+
end
|
213
|
+
rescue LoadError
|
214
|
+
warn "no :haml template engine, skipping rendering with haml specs"
|
215
|
+
end
|
192
216
|
|
193
217
|
it 'size'
|
194
218
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,50 @@
|
|
1
1
|
require 'rspec_ext'
|
2
2
|
require 'ruby_ext'
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'tilt'
|
5
|
+
require 'vfs'
|
6
|
+
|
7
|
+
rspec do
|
8
|
+
def self.with_test_fs
|
9
|
+
before do
|
10
|
+
@test_fs = "/tmp/test_fs".to_dir
|
11
|
+
|
12
|
+
FileUtils.rm_r test_fs.path if File.exist? test_fs.path
|
13
|
+
FileUtils.mkdir_p test_fs.path
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
FileUtils.rm_r test_fs.path if File.exist? test_fs.path
|
18
|
+
@test_fs = nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_fs
|
23
|
+
@test_fs
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# require 'fakefs/spec_helpers'
|
28
|
+
#
|
29
|
+
# include FakeFS::SpecHelpers
|
30
|
+
# use_fakefs self
|
31
|
+
#
|
32
|
+
#
|
33
|
+
# #
|
34
|
+
# # FakeFS fixes
|
35
|
+
# #
|
36
|
+
# FakeFS::File::Stat.class_eval do
|
37
|
+
# # there's also file? method defined on File::Stat
|
38
|
+
# def file?; !directory? end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# FakeFS::File.class_eval do
|
42
|
+
# class << self
|
43
|
+
# # File.delete should raise error if it's directory
|
44
|
+
# alias_method :delete_without_bang, :delete
|
45
|
+
# def delete path
|
46
|
+
# raise Errno::EPERM, "Operation not permitted - #{path}" if directory?(path)
|
47
|
+
# delete_without_bang path
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
# end
|
metadata
CHANGED
@@ -1,28 +1,22 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: vfs
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Alexey Petrushin
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-08-08 00:00:00 +04:00
|
14
|
-
default_executable:
|
12
|
+
date: 2011-08-10 00:00:00.000000000Z
|
15
13
|
dependencies: []
|
16
|
-
|
17
14
|
description:
|
18
15
|
email:
|
19
16
|
executables: []
|
20
|
-
|
21
17
|
extensions: []
|
22
|
-
|
23
18
|
extra_rdoc_files: []
|
24
|
-
|
25
|
-
files:
|
19
|
+
files:
|
26
20
|
- Rakefile
|
27
21
|
- readme.md
|
28
22
|
- lib/vfs/entries/dir.rb
|
@@ -34,7 +28,6 @@ files:
|
|
34
28
|
- lib/vfs/error.rb
|
35
29
|
- lib/vfs/integration/string.rb
|
36
30
|
- lib/vfs/path.rb
|
37
|
-
- lib/vfs/storages/hash_fs.rb
|
38
31
|
- lib/vfs/storages/local.rb
|
39
32
|
- lib/vfs/storages/specification.rb
|
40
33
|
- lib/vfs/support.rb
|
@@ -46,36 +39,30 @@ files:
|
|
46
39
|
- spec/file_spec.rb
|
47
40
|
- spec/path_spec.rb
|
48
41
|
- spec/spec_helper.rb
|
49
|
-
- spec/storages/hash_fs_spec.rb
|
50
42
|
- spec/storages/local_spec.rb
|
51
43
|
- spec/universal_entry_spec.rb
|
52
|
-
has_rdoc: true
|
53
44
|
homepage: http://github.com/alexeypetrushin/vfs
|
54
45
|
licenses: []
|
55
|
-
|
56
46
|
post_install_message:
|
57
47
|
rdoc_options: []
|
58
|
-
|
59
|
-
require_paths:
|
48
|
+
require_paths:
|
60
49
|
- lib
|
61
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
51
|
none: false
|
63
|
-
requirements:
|
64
|
-
- -
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version:
|
67
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
57
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version:
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
73
62
|
requirements: []
|
74
|
-
|
75
63
|
rubyforge_project:
|
76
|
-
rubygems_version: 1.
|
64
|
+
rubygems_version: 1.8.6
|
77
65
|
signing_key:
|
78
66
|
specification_version: 3
|
79
67
|
summary: Virtual File System
|
80
68
|
test_files: []
|
81
|
-
|
data/lib/vfs/storages/hash_fs.rb
DELETED
@@ -1,216 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Very dirty and inefficient In Memory File System, mainly for tests.
|
3
|
-
#
|
4
|
-
module Vfs
|
5
|
-
module Storages
|
6
|
-
class HashFs < Hash
|
7
|
-
def initialize
|
8
|
-
super
|
9
|
-
self['/'] = {dir: true}
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
def open_fs &block
|
14
|
-
block.call self
|
15
|
-
end
|
16
|
-
|
17
|
-
#
|
18
|
-
# Attributes
|
19
|
-
#
|
20
|
-
def attributes path
|
21
|
-
base, name = split_path path
|
22
|
-
|
23
|
-
# if path == '/'
|
24
|
-
# return {dir: true, file: false}
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
stat = cd(base)[name]
|
28
|
-
attrs = {}
|
29
|
-
attrs[:file] = !!stat[:file]
|
30
|
-
attrs[:dir] = !!stat[:dir]
|
31
|
-
attrs
|
32
|
-
rescue Exception
|
33
|
-
{}
|
34
|
-
end
|
35
|
-
|
36
|
-
def set_attributes path, attrs
|
37
|
-
raise 'not supported'
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
#
|
42
|
-
# File
|
43
|
-
#
|
44
|
-
def read_file path, &block
|
45
|
-
base, name = split_path path
|
46
|
-
assert cd(base)[name], :include?, :file
|
47
|
-
block.call cd(base)[name][:content]
|
48
|
-
end
|
49
|
-
|
50
|
-
def write_file path, append, &block
|
51
|
-
base, name = split_path path
|
52
|
-
|
53
|
-
os = if append
|
54
|
-
file = cd(base)[name]
|
55
|
-
file ? file[:content] : ''
|
56
|
-
else
|
57
|
-
assert_not cd(base), :include?, name
|
58
|
-
''
|
59
|
-
end
|
60
|
-
writer = -> buff {os << buff}
|
61
|
-
block.call writer
|
62
|
-
|
63
|
-
cd(base)[name] = {file: true, content: os}
|
64
|
-
end
|
65
|
-
|
66
|
-
def delete_file path
|
67
|
-
base, name = split_path path
|
68
|
-
assert cd(base)[name], :include?, :file
|
69
|
-
cd(base).delete name
|
70
|
-
end
|
71
|
-
|
72
|
-
# def move_file path
|
73
|
-
# raise 'not supported'
|
74
|
-
# end
|
75
|
-
|
76
|
-
|
77
|
-
#
|
78
|
-
# Dir
|
79
|
-
#
|
80
|
-
def create_dir path
|
81
|
-
base, name = split_path path
|
82
|
-
assert_not cd(base), :include?, name
|
83
|
-
cd(base)[name] = {dir: true}
|
84
|
-
end
|
85
|
-
|
86
|
-
def delete_dir path
|
87
|
-
base, name = split_path path
|
88
|
-
assert cd(base)[name], :include?, :dir
|
89
|
-
# empty = true
|
90
|
-
# cd(base)[name].each do |key, value|
|
91
|
-
# empty = false if key.is_a? String
|
92
|
-
# end
|
93
|
-
# raise 'you are trying to delete not empty dir!' unless empty
|
94
|
-
cd(base).delete name
|
95
|
-
end
|
96
|
-
|
97
|
-
# def move_dir path
|
98
|
-
# raise 'not supported'
|
99
|
-
# end
|
100
|
-
|
101
|
-
def each_entry path, query, &block
|
102
|
-
raise "hash_fs not support :each_entry with query!" if query
|
103
|
-
|
104
|
-
base, name = split_path path
|
105
|
-
assert cd(base)[name], :include?, :dir
|
106
|
-
cd(base)[name].each do |relative_name, content|
|
107
|
-
next if relative_name.is_a? Symbol
|
108
|
-
if content[:dir]
|
109
|
-
block.call relative_name, :dir
|
110
|
-
else
|
111
|
-
block.call relative_name, :file
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def efficient_dir_copy from, to, override
|
117
|
-
from.storage.open_fs do |from_fs|
|
118
|
-
to.storage.open_fs do |to_fs|
|
119
|
-
if from_fs == to_fs
|
120
|
-
for_spec_helper_effective_copy_used
|
121
|
-
|
122
|
-
_efficient_dir_copy from.path, to.path, override
|
123
|
-
true
|
124
|
-
else
|
125
|
-
false
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def _efficient_dir_copy from_path, to_path, override
|
132
|
-
from_base, from_name = split_path from_path
|
133
|
-
assert cd(from_base)[from_name], :include?, :dir
|
134
|
-
|
135
|
-
to_base, to_name = split_path to_path
|
136
|
-
# assert_not cd(to_base), :include?, to_name
|
137
|
-
|
138
|
-
if cd(to_base).include? to_name
|
139
|
-
if cd(to_base)[to_name][:dir]
|
140
|
-
each_entry from_path, nil do |name, type|
|
141
|
-
if type == :dir
|
142
|
-
_efficient_dir_copy "#{from_path}/#{name}", "#{to_path}/#{name}", override
|
143
|
-
else
|
144
|
-
raise "file #{to_path}/#{name} already exist!" if cd(to_base)[to_name].include?(name) and !override
|
145
|
-
cd(to_base)[to_name][name] = cd(from_base)[from_name][name].clone
|
146
|
-
end
|
147
|
-
end
|
148
|
-
else
|
149
|
-
raise "can't copy dir #{from_path} to file #{to_path}!"
|
150
|
-
end
|
151
|
-
else
|
152
|
-
cd(to_base)[to_name] = {dir: true}
|
153
|
-
_efficient_dir_copy from_path, to_path, override
|
154
|
-
end
|
155
|
-
end
|
156
|
-
protected :_efficient_dir_copy
|
157
|
-
def for_spec_helper_effective_copy_used; end
|
158
|
-
|
159
|
-
# def upload_directory from_local_path, to_remote_path
|
160
|
-
# FileUtils.cp_r from_local_path, to_remote_path
|
161
|
-
# end
|
162
|
-
#
|
163
|
-
# def download_directory from_remote_path, to_local_path
|
164
|
-
# FileUtils.cp_r from_remote_path, to_local_path
|
165
|
-
# end
|
166
|
-
|
167
|
-
|
168
|
-
#
|
169
|
-
# Other
|
170
|
-
#
|
171
|
-
def local?; true end
|
172
|
-
|
173
|
-
def to_s; 'hash_fs' end
|
174
|
-
|
175
|
-
def tmp &block
|
176
|
-
tmp_dir = "/tmp_#{rand(10**6)}"
|
177
|
-
create_dir tmp_dir
|
178
|
-
if block
|
179
|
-
begin
|
180
|
-
block.call tmp_dir
|
181
|
-
ensure
|
182
|
-
delete_dir tmp_dir
|
183
|
-
end
|
184
|
-
else
|
185
|
-
tmp_dir
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
protected
|
190
|
-
def assert obj, method, arg
|
191
|
-
raise "#{obj} should #{method} #{arg}" unless obj.send method, arg
|
192
|
-
end
|
193
|
-
|
194
|
-
def assert_not obj, method, arg
|
195
|
-
raise "#{obj} should not #{method} #{arg}" if obj.send method, arg
|
196
|
-
end
|
197
|
-
|
198
|
-
def split_path path
|
199
|
-
parts = path[1..-1].split('/')
|
200
|
-
parts.unshift '/'
|
201
|
-
name = parts.pop
|
202
|
-
return parts, name
|
203
|
-
end
|
204
|
-
|
205
|
-
def cd parts
|
206
|
-
current = self
|
207
|
-
iterator = parts.clone
|
208
|
-
while iterator.first
|
209
|
-
current = current[iterator.first]
|
210
|
-
iterator.shift
|
211
|
-
end
|
212
|
-
current
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|