vfs 0.3.15 → 0.4.0
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/Rakefile +1 -0
- data/lib/vfs.rb +5 -4
- data/lib/vfs/drivers/local.rb +179 -0
- data/lib/vfs/drivers/specification.rb +169 -0
- data/lib/vfs/entries/dir.rb +28 -57
- data/lib/vfs/entries/entry.rb +39 -21
- data/lib/vfs/entries/file.rb +20 -73
- data/lib/vfs/entries/universal_entry.rb +8 -8
- data/lib/vfs/integration.rb +30 -0
- data/lib/vfs/vfs.rb +2 -2
- data/readme.md +1 -1
- data/spec/container_spec.rb +12 -11
- data/spec/dir_spec.rb +44 -44
- data/spec/entry_spec.rb +6 -6
- data/spec/file_spec.rb +30 -46
- data/spec/misc_spec.rb +19 -0
- data/spec/spec_helper.rb +8 -8
- data/spec/storages/local_spec.rb +14 -14
- data/spec/universal_entry_spec.rb +32 -10
- metadata +6 -6
- data/lib/vfs/integration/string.rb +0 -20
- data/lib/vfs/storages/local.rb +0 -183
- data/lib/vfs/storages/specification.rb +0 -161
- data/lib/vfs/support.rb +0 -2
data/lib/vfs/storages/local.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
|
3
|
-
module Vfs
|
4
|
-
module Storages
|
5
|
-
class Local
|
6
|
-
class Writer
|
7
|
-
def initialize out; @out = out end
|
8
|
-
|
9
|
-
def write data; @out.write data end
|
10
|
-
end
|
11
|
-
|
12
|
-
module LocalVfsHelper
|
13
|
-
DEFAULT_BUFFER = 1000 * 1024
|
14
|
-
|
15
|
-
attr_writer :buffer
|
16
|
-
def buffer
|
17
|
-
@buffer || DEFAULT_BUFFER
|
18
|
-
end
|
19
|
-
|
20
|
-
#
|
21
|
-
# Attributes
|
22
|
-
#
|
23
|
-
def attributes path
|
24
|
-
path = with_root path
|
25
|
-
|
26
|
-
stat = ::File.stat path
|
27
|
-
attrs = {}
|
28
|
-
attrs[:file] = !!stat.file?
|
29
|
-
attrs[:dir] = !!stat.directory?
|
30
|
-
|
31
|
-
# attributes special for file system
|
32
|
-
attrs[:created_at] = stat.ctime
|
33
|
-
attrs[:updated_at] = stat.mtime
|
34
|
-
attrs[:size] = stat.size if attrs[:file]
|
35
|
-
attrs
|
36
|
-
rescue Errno::ENOENT
|
37
|
-
nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def set_attributes path, attrs
|
41
|
-
# TODO2 set attributes
|
42
|
-
not_implemented
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
#
|
47
|
-
# File
|
48
|
-
#
|
49
|
-
def read_file path, &block
|
50
|
-
path = with_root path
|
51
|
-
::File.open path, 'r' do |is|
|
52
|
-
while buff = is.gets(self.buffer || DEFAULT_BUFFER)
|
53
|
-
block.call buff
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def write_file original_path, append, &block
|
59
|
-
path = with_root original_path
|
60
|
-
|
61
|
-
# TODO2 Performance lost, extra call to check file existence
|
62
|
-
raise "can't write, entry #{original_path} already exist!" if !append and ::File.exist?(path)
|
63
|
-
|
64
|
-
option = append ? 'a' : 'w'
|
65
|
-
::File.open path, option do |out|
|
66
|
-
block.call Writer.new(out)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def delete_file path
|
71
|
-
path = with_root path
|
72
|
-
::File.delete path
|
73
|
-
end
|
74
|
-
|
75
|
-
# def move_file from, to
|
76
|
-
# FileUtils.mv from, to
|
77
|
-
# end
|
78
|
-
|
79
|
-
|
80
|
-
#
|
81
|
-
# Dir
|
82
|
-
#
|
83
|
-
def create_dir path
|
84
|
-
path = with_root path
|
85
|
-
::Dir.mkdir path
|
86
|
-
end
|
87
|
-
|
88
|
-
def delete_dir original_path
|
89
|
-
path = with_root original_path
|
90
|
-
|
91
|
-
# TODO2 Performance lost, extra call to check file existence
|
92
|
-
raise "can't delete file (#{original_path})!" if ::File.file?(path)
|
93
|
-
|
94
|
-
::FileUtils.rm_r path
|
95
|
-
end
|
96
|
-
|
97
|
-
def each_entry path, query, &block
|
98
|
-
path = with_root path
|
99
|
-
|
100
|
-
if query
|
101
|
-
path_with_trailing_slash = path == '/' ? path : "#{path}/"
|
102
|
-
::Dir["#{path_with_trailing_slash}#{query}"].each do |absolute_path|
|
103
|
-
relative_path = absolute_path.sub path_with_trailing_slash, ''
|
104
|
-
# TODO2 Performance loss
|
105
|
-
if ::File.directory? absolute_path
|
106
|
-
block.call relative_path, :dir
|
107
|
-
else
|
108
|
-
block.call relative_path, :file
|
109
|
-
end
|
110
|
-
end
|
111
|
-
else
|
112
|
-
::Dir.foreach path do |relative_name|
|
113
|
-
next if relative_name == '.' or relative_name == '..'
|
114
|
-
if ::File.directory? "#{path}/#{relative_name}"
|
115
|
-
block.call relative_name, :dir
|
116
|
-
else
|
117
|
-
block.call relative_name, :file
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# def efficient_dir_copy from, to, override
|
124
|
-
# return false if override # FileUtils.cp_r doesn't support this behaviour
|
125
|
-
#
|
126
|
-
# from.storage.open_fs do |from_fs|
|
127
|
-
# to.storage.open_fs do |to_fs|
|
128
|
-
# if from_fs.local? and to_fs.local?
|
129
|
-
# FileUtils.cp_r from.path, to.path
|
130
|
-
# true
|
131
|
-
# else
|
132
|
-
# false
|
133
|
-
# end
|
134
|
-
# end
|
135
|
-
# end
|
136
|
-
# end
|
137
|
-
|
138
|
-
#
|
139
|
-
# Other
|
140
|
-
#
|
141
|
-
def local?; true end
|
142
|
-
|
143
|
-
def tmp &block
|
144
|
-
path = "/tmp/#{rand(10**6)}"
|
145
|
-
# tmp_dir = "#{::Dir.tmpdir}/#{rand(10**6)}"
|
146
|
-
if block
|
147
|
-
begin
|
148
|
-
::FileUtils.mkdir_p with_root(path)
|
149
|
-
block.call path
|
150
|
-
ensure
|
151
|
-
::FileUtils.rm_r with_root(path) if ::File.exist? with_root(path)
|
152
|
-
end
|
153
|
-
else
|
154
|
-
::FileUtils.mkdir_p with_root(path)
|
155
|
-
path
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def to_s; '' end
|
160
|
-
|
161
|
-
protected
|
162
|
-
def root
|
163
|
-
@root || raise('root not defined!')
|
164
|
-
end
|
165
|
-
|
166
|
-
def with_root path
|
167
|
-
path == '/' ? root : root + path
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
include LocalVfsHelper
|
172
|
-
|
173
|
-
def initialize root = ''
|
174
|
-
@root = root
|
175
|
-
end
|
176
|
-
|
177
|
-
def open &block
|
178
|
-
block.call self if block
|
179
|
-
end
|
180
|
-
def close; end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'rspec_ext'
|
2
|
-
require 'ruby_ext'
|
3
|
-
|
4
|
-
shared_examples_for 'vfs storage basic' do
|
5
|
-
it 'should respond to :local?' do
|
6
|
-
@storage.should respond_to(:local?)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should provide open method" do
|
10
|
-
@storage.open
|
11
|
-
@storage.open{'result'}.should == 'result'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
shared_examples_for 'vfs storage attributes basic' do
|
16
|
-
it 'should have root dir' do
|
17
|
-
attrs = @storage.attributes('/')
|
18
|
-
attrs[:dir].should be_true
|
19
|
-
attrs[:file].should be_false
|
20
|
-
end
|
21
|
-
|
22
|
-
it "attributes should return nil if there's no entry" do
|
23
|
-
@storage.attributes('/non_existing_entry').should be_nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
shared_examples_for 'vfs storage files' do
|
28
|
-
it "file attributes" do
|
29
|
-
@storage.attributes('/file').should be_nil
|
30
|
-
|
31
|
-
@storage.write_file('/file', false){|w| w.write 'something'}
|
32
|
-
attrs = @storage.attributes('/file')
|
33
|
-
attrs[:file].should be_true
|
34
|
-
attrs[:dir].should be_false
|
35
|
-
end
|
36
|
-
|
37
|
-
it "read, write, append" do
|
38
|
-
# write
|
39
|
-
@storage.write_file('/file', false){|w| w.write 'something'}
|
40
|
-
@storage.attributes('/file')[:file].should == true
|
41
|
-
|
42
|
-
# read
|
43
|
-
data = ""
|
44
|
-
@storage.read_file('/file'){|buff| data << buff}
|
45
|
-
data.should == 'something'
|
46
|
-
|
47
|
-
# append
|
48
|
-
@storage.write_file('/file', true){|w| w.write ' another'}
|
49
|
-
data = ""
|
50
|
-
@storage.read_file('/file'){|buff| data << buff}
|
51
|
-
data.should == 'something another'
|
52
|
-
end
|
53
|
-
|
54
|
-
it "delete_file" do
|
55
|
-
@storage.write_file('/file', false){|w| w.write 'something'}
|
56
|
-
@storage.attributes('/file')[:file].should be_true
|
57
|
-
@storage.delete_file('/file')
|
58
|
-
@storage.attributes('/file').should be_nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
shared_examples_for 'vfs storage full attributes for files' do
|
63
|
-
it "attributes for files" do
|
64
|
-
@storage.write_file('/file', false){|w| w.write 'something'}
|
65
|
-
attrs = @storage.attributes('/file')
|
66
|
-
attrs[:file].should be_true
|
67
|
-
attrs[:dir].should be_false
|
68
|
-
attrs[:created_at].class.should == Time
|
69
|
-
attrs[:updated_at].class.should == Time
|
70
|
-
attrs[:size].should == 9
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
shared_examples_for 'vfs storage dirs' do
|
75
|
-
it "directory crud" do
|
76
|
-
@storage.attributes('/dir').should be_nil
|
77
|
-
|
78
|
-
@storage.create_dir('/dir')
|
79
|
-
attrs = @storage.attributes('/dir')
|
80
|
-
attrs[:file].should be_false
|
81
|
-
attrs[:dir].should be_true
|
82
|
-
|
83
|
-
@storage.delete_dir('/dir')
|
84
|
-
@storage.attributes('/dir').should be_nil
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'should delete not-empty directories' do
|
88
|
-
@storage.create_dir('/dir')
|
89
|
-
@storage.create_dir('/dir/dir2')
|
90
|
-
@storage.write_file('/dir/dir2/file', false){|w| w.write 'something'}
|
91
|
-
@storage.attributes('/dir').should_not be_nil
|
92
|
-
|
93
|
-
@storage.delete_dir('/dir')
|
94
|
-
@storage.attributes('/dir').should be_nil
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'each' do
|
98
|
-
-> {@storage.each_entry('/not_existing_dir', nil){|path, type| list[path] = type}}.should raise_error
|
99
|
-
|
100
|
-
@storage.create_dir '/dir'
|
101
|
-
@storage.create_dir('/dir/dir2')
|
102
|
-
@storage.write_file('/dir/file', false){|w| w.write 'something'}
|
103
|
-
|
104
|
-
list = {}
|
105
|
-
@storage.each_entry('/dir', nil){|path, type| list[path] = type}
|
106
|
-
list.should == {'dir2' => :dir, 'file' => :file}
|
107
|
-
end
|
108
|
-
|
109
|
-
# it "upload_directory & download_directory" do
|
110
|
-
# upload_path_check = "#{@remote_path}/dir2/file"
|
111
|
-
# check_attributes upload_path_check, nil
|
112
|
-
# @storage.upload_directory(@from_local, @remote_path)
|
113
|
-
# check_attributes upload_path_check, file: true, dir: false
|
114
|
-
#
|
115
|
-
# download_path_check = "#{@to_local}/dir2/file"
|
116
|
-
# File.exist?(download_path_check).should be_false
|
117
|
-
# @storage.download_directory(@remote_path, @to_local)
|
118
|
-
# File.exist?(download_path_check).should be_true
|
119
|
-
# end
|
120
|
-
end
|
121
|
-
|
122
|
-
shared_examples_for 'vfs storage query' do
|
123
|
-
it 'each with query' do
|
124
|
-
@storage.create_dir '/dir'
|
125
|
-
@storage.create_dir('/dir/dir_a')
|
126
|
-
@storage.create_dir('/dir/dir_b')
|
127
|
-
@storage.write_file('/dir/file_a', false){|w| w.write 'something'}
|
128
|
-
|
129
|
-
list = {}
|
130
|
-
@storage.each_entry('/dir', '*_a'){|path, type| list[path] = type}
|
131
|
-
list.should == {'dir_a' => :dir, 'file_a' => :file}
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
shared_examples_for 'vfs storage full attributes for dirs' do
|
136
|
-
it "attributes for dirs" do
|
137
|
-
@storage.create_dir('/dir')
|
138
|
-
attrs = @storage.attributes('/dir')
|
139
|
-
attrs[:file].should be_false
|
140
|
-
attrs[:dir].should be_true
|
141
|
-
attrs[:created_at].class.should == Time
|
142
|
-
attrs[:updated_at].class.should == Time
|
143
|
-
attrs.should_not include(:size)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
shared_examples_for 'vfs storage tmp dir' do
|
148
|
-
it "tmp dir" do
|
149
|
-
dir = @storage.tmp
|
150
|
-
@storage.attributes(dir).should_not be_nil
|
151
|
-
@storage.delete_dir dir
|
152
|
-
@storage.attributes(dir).should be_nil
|
153
|
-
|
154
|
-
dir = nil
|
155
|
-
@storage.tmp do |tmp_dir|
|
156
|
-
dir = tmp_dir
|
157
|
-
@storage.attributes(dir).should_not be_nil
|
158
|
-
end
|
159
|
-
@storage.attributes(dir).should be_nil
|
160
|
-
end
|
161
|
-
end
|
data/lib/vfs/support.rb
DELETED