vfs 0.3.14 → 0.3.15
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 +13 -13
- data/lib/vfs/entries/entry.rb +6 -5
- data/lib/vfs/entries/file.rb +8 -10
- data/lib/vfs/entries/universal_entry.rb +4 -5
- data/lib/vfs/entry_proxy.rb +7 -0
- data/lib/vfs/storages/local.rb +46 -18
- data/lib/vfs/storages/specification.rb +136 -104
- data/spec/dir_spec.rb +10 -2
- data/spec/entry_spec.rb +9 -9
- data/spec/file_spec.rb +3 -1
- data/spec/path_spec.rb +1 -1
- data/spec/storages/local_spec.rb +14 -6
- data/spec/storages/local_spec/emptygit +0 -0
- metadata +3 -3
- data/lib/vfs/entries/entry/special_attributes.rb +0 -26
data/lib/vfs.rb
CHANGED
data/lib/vfs/entries/dir.rb
CHANGED
@@ -25,7 +25,7 @@ module Vfs
|
|
25
25
|
# CRUD
|
26
26
|
#
|
27
27
|
def create options = {}
|
28
|
-
storage.
|
28
|
+
storage.open do |fs|
|
29
29
|
try = 0
|
30
30
|
begin
|
31
31
|
try += 1
|
@@ -33,13 +33,13 @@ module Vfs
|
|
33
33
|
rescue StandardError => error
|
34
34
|
entry = self.entry
|
35
35
|
attrs = entry.get
|
36
|
-
if attrs[:file] #entry.exist?
|
36
|
+
if attrs and attrs[:file] #entry.exist?
|
37
37
|
if options[:override]
|
38
38
|
entry.destroy
|
39
39
|
else
|
40
40
|
raise Error, "entry #{self} already exist!"
|
41
41
|
end
|
42
|
-
elsif attrs[:dir]
|
42
|
+
elsif attrs and attrs[:dir]
|
43
43
|
# dir already exist, no need to recreate it
|
44
44
|
return self
|
45
45
|
else
|
@@ -63,18 +63,18 @@ module Vfs
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def destroy options = {}
|
66
|
-
storage.
|
66
|
+
storage.open do |fs|
|
67
67
|
begin
|
68
68
|
fs.delete_dir path
|
69
69
|
rescue StandardError => e
|
70
70
|
attrs = get
|
71
|
-
if attrs[:file]
|
71
|
+
if attrs and attrs[:file]
|
72
72
|
if options[:force]
|
73
73
|
file.destroy
|
74
74
|
else
|
75
75
|
raise Error, "can't destroy File #{dir} (You are trying to destroy it as if it's a Dir)"
|
76
76
|
end
|
77
|
-
elsif attrs[:dir]
|
77
|
+
elsif attrs and attrs[:dir]
|
78
78
|
# unknown internal error
|
79
79
|
raise e
|
80
80
|
else
|
@@ -99,7 +99,7 @@ module Vfs
|
|
99
99
|
query = args.first
|
100
100
|
options[:bang] = true unless options.include? :bang
|
101
101
|
|
102
|
-
storage.
|
102
|
+
storage.open do |fs|
|
103
103
|
begin
|
104
104
|
list = []
|
105
105
|
# query option is optional and supported only for some storages (local fs for example)
|
@@ -117,9 +117,9 @@ module Vfs
|
|
117
117
|
block ? nil : list
|
118
118
|
rescue StandardError => error
|
119
119
|
attrs = get
|
120
|
-
if attrs[:file]
|
120
|
+
if attrs and attrs[:file]
|
121
121
|
raise Error, "can't query entries on File ('#{self}')!"
|
122
|
-
elsif attrs[:dir]
|
122
|
+
elsif attrs and attrs[:dir]
|
123
123
|
# unknown error
|
124
124
|
raise error
|
125
125
|
else
|
@@ -229,9 +229,9 @@ module Vfs
|
|
229
229
|
# unknown_errors = 0
|
230
230
|
#
|
231
231
|
# attrs = get
|
232
|
-
# if attrs[:file]
|
232
|
+
# if attrs and attrs[:file]
|
233
233
|
# raise Error, "can't copy File as a Dir ('#{self}')!"
|
234
|
-
# elsif attrs[:dir]
|
234
|
+
# elsif attrs and attrs[:dir]
|
235
235
|
# # some unknown error (but it also maybe caused by to be fixed error in 'to')
|
236
236
|
# unknown_errors += 1
|
237
237
|
# else
|
@@ -240,13 +240,13 @@ module Vfs
|
|
240
240
|
# end
|
241
241
|
#
|
242
242
|
# attrs = to.get
|
243
|
-
# if attrs[:file]
|
243
|
+
# if attrs and attrs[:file]
|
244
244
|
# if options[:override]
|
245
245
|
# to.destroy
|
246
246
|
# else
|
247
247
|
# raise Vfs::Error, "entry #{to} already exist!"
|
248
248
|
# end
|
249
|
-
# elsif attrs[:dir]
|
249
|
+
# elsif attrs and attrs[:dir]
|
250
250
|
# unknown_errors += 1
|
251
251
|
# # if options[:override]
|
252
252
|
# # to.destroy
|
data/lib/vfs/entries/entry.rb
CHANGED
@@ -65,18 +65,19 @@ module Vfs
|
|
65
65
|
# Attributes
|
66
66
|
#
|
67
67
|
def get attr_name = nil
|
68
|
-
attrs = storage.
|
69
|
-
attr_name ? attrs[attr_name] : attrs
|
68
|
+
attrs = storage.open{|fs| fs.attributes(path)}
|
69
|
+
(attr_name and attrs) ? attrs[attr_name] : attrs
|
70
70
|
end
|
71
71
|
|
72
72
|
def set options
|
73
|
+
# TODO2 set attributes
|
73
74
|
not_implemented
|
74
75
|
end
|
75
76
|
|
76
77
|
def dir?; !!get(:dir) end
|
77
78
|
def file?; !!get(:file) end
|
78
|
-
|
79
|
-
|
79
|
+
def created_at; get :created_at end
|
80
|
+
def updated_at; get :updated_at end
|
80
81
|
|
81
82
|
|
82
83
|
#
|
@@ -87,7 +88,7 @@ module Vfs
|
|
87
88
|
end
|
88
89
|
|
89
90
|
def tmp &block
|
90
|
-
storage.
|
91
|
+
storage.open do |fs|
|
91
92
|
if block
|
92
93
|
fs.tmp do |path|
|
93
94
|
block.call Dir.new(storage, path)
|
data/lib/vfs/entries/file.rb
CHANGED
@@ -11,7 +11,7 @@ module Vfs
|
|
11
11
|
#
|
12
12
|
def read options = {}, &block
|
13
13
|
options[:bang] = true unless options.include? :bang
|
14
|
-
storage.
|
14
|
+
storage.open do |fs|
|
15
15
|
begin
|
16
16
|
if block
|
17
17
|
fs.read_file path, &block
|
@@ -23,10 +23,10 @@ module Vfs
|
|
23
23
|
rescue StandardError => e
|
24
24
|
raise Vfs::Error, "can't read Dir #{self}!" if dir.exist?
|
25
25
|
attrs = get
|
26
|
-
if attrs[:file]
|
26
|
+
if attrs and attrs[:file]
|
27
27
|
# unknown internal error
|
28
28
|
raise e
|
29
|
-
elsif attrs[:dir]
|
29
|
+
elsif attrs and attrs[:dir]
|
30
30
|
raise Error, "You are trying to read Dir '#{self}' as if it's a File!"
|
31
31
|
else
|
32
32
|
if options[:bang]
|
@@ -61,7 +61,7 @@ module Vfs
|
|
61
61
|
end
|
62
62
|
raise "can't do :override and :append at the same time!" if options[:override] and options[:append]
|
63
63
|
|
64
|
-
storage.
|
64
|
+
storage.open do |fs|
|
65
65
|
# TODO2 Performance lost, extra call to check file existence
|
66
66
|
# We need to check if the file exist before writing to it, otherwise it's
|
67
67
|
# impossible to distinguish if the StandardError caused by the 'already exist' error or
|
@@ -116,19 +116,19 @@ module Vfs
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def destroy options = {}
|
119
|
-
storage.
|
119
|
+
storage.open do |fs|
|
120
120
|
begin
|
121
121
|
fs.delete_file path
|
122
122
|
self
|
123
123
|
rescue StandardError => e
|
124
124
|
attrs = get
|
125
|
-
if attrs[:dir]
|
125
|
+
if attrs and attrs[:dir]
|
126
126
|
if options[:force]
|
127
127
|
dir.destroy
|
128
128
|
else
|
129
129
|
raise Error, "can't destroy Dir #{dir} (you are trying to destroy it as if it's a File)"
|
130
130
|
end
|
131
|
-
elsif attrs[:file]
|
131
|
+
elsif attrs and attrs[:file]
|
132
132
|
# unknown internal error
|
133
133
|
raise e
|
134
134
|
else
|
@@ -194,9 +194,7 @@ module Vfs
|
|
194
194
|
template.render *args
|
195
195
|
end
|
196
196
|
|
197
|
-
def size
|
198
|
-
get :size
|
199
|
-
end
|
197
|
+
def size; get :size end
|
200
198
|
|
201
199
|
def basename
|
202
200
|
::File.basename(name, File.extname(name))
|
@@ -4,8 +4,7 @@ module Vfs
|
|
4
4
|
# Attributes
|
5
5
|
#
|
6
6
|
def exist?
|
7
|
-
|
8
|
-
!!(attrs[:dir] or attrs[:file])
|
7
|
+
!!get
|
9
8
|
end
|
10
9
|
|
11
10
|
|
@@ -13,10 +12,10 @@ module Vfs
|
|
13
12
|
# CRUD
|
14
13
|
#
|
15
14
|
def destroy options = {}
|
16
|
-
storage.
|
15
|
+
storage.open do |fs|
|
17
16
|
attrs = get
|
18
|
-
fs.delete_dir path if attrs[:dir]
|
19
|
-
fs.delete_file path if attrs[:file]
|
17
|
+
fs.delete_dir path if attrs and attrs[:dir]
|
18
|
+
fs.delete_file path if attrs and attrs[:file]
|
20
19
|
end
|
21
20
|
self
|
22
21
|
end
|
data/lib/vfs/entry_proxy.rb
CHANGED
@@ -18,6 +18,13 @@ module Vfs
|
|
18
18
|
protected
|
19
19
|
attr_writer :_target
|
20
20
|
|
21
|
+
def respond_to? m
|
22
|
+
super or
|
23
|
+
::Vfs::UniversalEntry.method_defined?(m) or
|
24
|
+
::Vfs::Dir.method_defined?(m) or
|
25
|
+
::Vfs::File.method_defined?(m)
|
26
|
+
end
|
27
|
+
|
21
28
|
def method_missing m, *a, &b
|
22
29
|
unless _target.respond_to? m
|
23
30
|
if ::Vfs::UniversalEntry.method_defined? m
|
data/lib/vfs/storages/local.rb
CHANGED
@@ -21,22 +21,25 @@ module Vfs
|
|
21
21
|
# Attributes
|
22
22
|
#
|
23
23
|
def attributes path
|
24
|
+
path = with_root path
|
25
|
+
|
24
26
|
stat = ::File.stat path
|
25
27
|
attrs = {}
|
26
|
-
attrs[:file] = stat.file?
|
27
|
-
attrs[:dir]
|
28
|
+
attrs[:file] = !!stat.file?
|
29
|
+
attrs[:dir] = !!stat.directory?
|
28
30
|
|
29
31
|
# attributes special for file system
|
30
32
|
attrs[:created_at] = stat.ctime
|
31
33
|
attrs[:updated_at] = stat.mtime
|
32
|
-
attrs[:size]
|
34
|
+
attrs[:size] = stat.size if attrs[:file]
|
33
35
|
attrs
|
34
36
|
rescue Errno::ENOENT
|
35
|
-
|
37
|
+
nil
|
36
38
|
end
|
37
39
|
|
38
40
|
def set_attributes path, attrs
|
39
|
-
|
41
|
+
# TODO2 set attributes
|
42
|
+
not_implemented
|
40
43
|
end
|
41
44
|
|
42
45
|
|
@@ -44,6 +47,7 @@ module Vfs
|
|
44
47
|
# File
|
45
48
|
#
|
46
49
|
def read_file path, &block
|
50
|
+
path = with_root path
|
47
51
|
::File.open path, 'r' do |is|
|
48
52
|
while buff = is.gets(self.buffer || DEFAULT_BUFFER)
|
49
53
|
block.call buff
|
@@ -51,9 +55,11 @@ module Vfs
|
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
54
|
-
def write_file
|
58
|
+
def write_file original_path, append, &block
|
59
|
+
path = with_root original_path
|
60
|
+
|
55
61
|
# TODO2 Performance lost, extra call to check file existence
|
56
|
-
raise "can't write, entry #{
|
62
|
+
raise "can't write, entry #{original_path} already exist!" if !append and ::File.exist?(path)
|
57
63
|
|
58
64
|
option = append ? 'a' : 'w'
|
59
65
|
::File.open path, option do |out|
|
@@ -62,6 +68,7 @@ module Vfs
|
|
62
68
|
end
|
63
69
|
|
64
70
|
def delete_file path
|
71
|
+
path = with_root path
|
65
72
|
::File.delete path
|
66
73
|
end
|
67
74
|
|
@@ -74,21 +81,27 @@ module Vfs
|
|
74
81
|
# Dir
|
75
82
|
#
|
76
83
|
def create_dir path
|
84
|
+
path = with_root path
|
77
85
|
::Dir.mkdir path
|
78
86
|
end
|
79
87
|
|
80
|
-
def delete_dir
|
88
|
+
def delete_dir original_path
|
89
|
+
path = with_root original_path
|
90
|
+
|
81
91
|
# TODO2 Performance lost, extra call to check file existence
|
82
|
-
raise "can't delete file (#{
|
92
|
+
raise "can't delete file (#{original_path})!" if ::File.file?(path)
|
83
93
|
|
84
|
-
FileUtils.rm_r path
|
94
|
+
::FileUtils.rm_r path
|
85
95
|
end
|
86
96
|
|
87
97
|
def each_entry path, query, &block
|
98
|
+
path = with_root path
|
99
|
+
|
88
100
|
if query
|
89
101
|
path_with_trailing_slash = path == '/' ? path : "#{path}/"
|
90
102
|
::Dir["#{path_with_trailing_slash}#{query}"].each do |absolute_path|
|
91
103
|
relative_path = absolute_path.sub path_with_trailing_slash, ''
|
104
|
+
# TODO2 Performance loss
|
92
105
|
if ::File.directory? absolute_path
|
93
106
|
block.call relative_path, :dir
|
94
107
|
else
|
@@ -128,28 +141,43 @@ module Vfs
|
|
128
141
|
def local?; true end
|
129
142
|
|
130
143
|
def tmp &block
|
131
|
-
|
144
|
+
path = "/tmp/#{rand(10**6)}"
|
145
|
+
# tmp_dir = "#{::Dir.tmpdir}/#{rand(10**6)}"
|
132
146
|
if block
|
133
147
|
begin
|
134
|
-
|
135
|
-
block.call
|
148
|
+
::FileUtils.mkdir_p with_root(path)
|
149
|
+
block.call path
|
136
150
|
ensure
|
137
|
-
|
151
|
+
::FileUtils.rm_r with_root(path) if ::File.exist? with_root(path)
|
138
152
|
end
|
139
153
|
else
|
140
|
-
|
141
|
-
|
154
|
+
::FileUtils.mkdir_p with_root(path)
|
155
|
+
path
|
142
156
|
end
|
143
157
|
end
|
144
158
|
|
145
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
|
146
169
|
end
|
147
170
|
|
148
171
|
include LocalVfsHelper
|
149
172
|
|
150
|
-
def
|
151
|
-
|
173
|
+
def initialize root = ''
|
174
|
+
@root = root
|
175
|
+
end
|
176
|
+
|
177
|
+
def open &block
|
178
|
+
block.call self if block
|
152
179
|
end
|
180
|
+
def close; end
|
153
181
|
end
|
154
182
|
end
|
155
183
|
end
|
@@ -1,129 +1,161 @@
|
|
1
|
-
# use '$ gem install ruby_ext' to install.
|
2
1
|
require 'rspec_ext'
|
3
2
|
require 'ruby_ext'
|
4
3
|
|
5
|
-
shared_examples_for 'vfs storage' do
|
6
|
-
|
7
|
-
@storage.
|
8
|
-
@tmp_dir = fs.tmp
|
9
|
-
end
|
4
|
+
shared_examples_for 'vfs storage basic' do
|
5
|
+
it 'should respond to :local?' do
|
6
|
+
@storage.should respond_to(:local?)
|
10
7
|
end
|
11
8
|
|
12
|
-
|
13
|
-
@storage.
|
14
|
-
|
15
|
-
fs.delete_dir @tmp_dir if attrs && attrs[:dir]
|
16
|
-
end
|
9
|
+
it "should provide open method" do
|
10
|
+
@storage.open
|
11
|
+
@storage.open{'result'}.should == 'result'
|
17
12
|
end
|
13
|
+
end
|
18
14
|
|
19
|
-
|
20
|
-
|
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
|
21
20
|
end
|
22
21
|
|
23
|
-
it
|
24
|
-
|
25
|
-
it 'should have root dir' do
|
26
|
-
@storage.open_fs do |fs|
|
27
|
-
fs.attributes('/').subset(:file, :dir).should == {file: false, dir: true}
|
28
|
-
end
|
22
|
+
it "attributes should return nil if there's no entry" do
|
23
|
+
@storage.attributes('/non_existing_entry').should be_nil
|
29
24
|
end
|
25
|
+
end
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
27
|
+
shared_examples_for 'vfs storage files' do
|
28
|
+
it "file attributes" do
|
29
|
+
@storage.attributes('/file').should be_nil
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
fs.attributes(@remote_file).subset(:file, :dir).should == {file: true, dir: false}
|
42
|
-
end
|
43
|
-
end
|
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
|
44
36
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
61
53
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
70
71
|
end
|
72
|
+
end
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
# end
|
74
|
+
shared_examples_for 'vfs storage dirs' do
|
75
|
+
it "directory crud" do
|
76
|
+
@storage.attributes('/dir').should be_nil
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
78
|
+
@storage.create_dir('/dir')
|
79
|
+
attrs = @storage.attributes('/dir')
|
80
|
+
attrs[:file].should be_false
|
81
|
+
attrs[:dir].should be_true
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
fs.create_dir(@remote_dir)
|
85
|
-
fs.attributes(@remote_dir).subset(:file, :dir).should == {file: false, dir: true}
|
86
|
-
fs.delete_dir(@remote_dir)
|
87
|
-
fs.attributes(@remote_dir).should == {}
|
88
|
-
end
|
89
|
-
end
|
83
|
+
@storage.delete_dir('/dir')
|
84
|
+
@storage.attributes('/dir').should be_nil
|
85
|
+
end
|
90
86
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
fs.delete_dir(@remote_dir)
|
97
|
-
fs.attributes(@remote_dir).should == {}
|
98
|
-
end
|
99
|
-
end
|
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
|
100
92
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
fs.each_entry(@tmp_dir, nil){|path, type| list[path] = type}
|
105
|
-
list.should be_empty
|
93
|
+
@storage.delete_dir('/dir')
|
94
|
+
@storage.attributes('/dir').should be_nil
|
95
|
+
end
|
106
96
|
|
107
|
-
|
108
|
-
|
109
|
-
fs.write_file(file, false){|w| w.write 'something'}
|
97
|
+
it 'each' do
|
98
|
+
-> {@storage.each_entry('/not_existing_dir', nil){|path, type| list[path] = type}}.should raise_error
|
110
99
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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
|
116
108
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
128
160
|
end
|
129
161
|
end
|
data/spec/dir_spec.rb
CHANGED
@@ -103,7 +103,12 @@ describe 'Dir' do
|
|
103
103
|
list.to_set.should be_eql([@path.dir('dir'), @path.file('file')].to_set)
|
104
104
|
end
|
105
105
|
|
106
|
-
it "glob search support"
|
106
|
+
it "glob search support" do
|
107
|
+
@path.dir('dir_a').create
|
108
|
+
@path.file('file_a').create
|
109
|
+
@path.dir('dir_b').create
|
110
|
+
@path.entries('*_a').collect(&:name).sort.should == %w(dir_a file_a)
|
111
|
+
end
|
107
112
|
|
108
113
|
it 'should raise error if trying :entries on file' do
|
109
114
|
@path.file('some_file').create
|
@@ -125,7 +130,10 @@ describe 'Dir' do
|
|
125
130
|
@path.include?('non_existing').should be_false
|
126
131
|
end
|
127
132
|
|
128
|
-
it 'empty?'
|
133
|
+
it 'empty?' do
|
134
|
+
@path.empty?.should be_false
|
135
|
+
@path.dir('empty_dir').create.empty?.should be_true
|
136
|
+
end
|
129
137
|
end
|
130
138
|
|
131
139
|
describe 'copying' do
|
data/spec/entry_spec.rb
CHANGED
@@ -19,6 +19,7 @@ describe 'Entry' do
|
|
19
19
|
it 'tmp' do
|
20
20
|
tmp = test_fs.tmp
|
21
21
|
tmp.should be_dir
|
22
|
+
tmp.destroy
|
22
23
|
|
23
24
|
tmp = nil
|
24
25
|
test_fs.tmp do |path|
|
@@ -28,15 +29,14 @@ describe 'Entry' do
|
|
28
29
|
tmp.should_not exist
|
29
30
|
end
|
30
31
|
|
31
|
-
it 'should respond to local?'
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
describe 'attributes' do
|
36
|
-
it 'created_at'
|
37
|
-
|
38
|
-
it 'updated_at'
|
32
|
+
it 'should respond to local?' do
|
33
|
+
test_fs.should respond_to(:local?)
|
34
|
+
end
|
39
35
|
|
40
|
-
|
36
|
+
it 'created_at, updated_at, size' do
|
37
|
+
file = test_fs.file('file').write 'data'
|
38
|
+
file.created_at.class.should == Time
|
39
|
+
file.updated_at.class.should == Time
|
40
|
+
file.size.should == 4
|
41
41
|
end
|
42
42
|
end
|
data/spec/file_spec.rb
CHANGED
data/spec/path_spec.rb
CHANGED
data/spec/storages/local_spec.rb
CHANGED
@@ -2,15 +2,23 @@ require 'vfs/storages/local'
|
|
2
2
|
require 'vfs/storages/specification'
|
3
3
|
|
4
4
|
describe Vfs::Storages::Local do
|
5
|
-
|
5
|
+
with_tmp_spec_dir
|
6
6
|
|
7
7
|
before do
|
8
|
-
@storage = Vfs::Storages::Local.new
|
8
|
+
@storage = Vfs::Storages::Local.new spec_dir
|
9
|
+
@storage.open
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
it 'updated_at'
|
12
|
+
after do
|
13
|
+
@storage.close
|
15
14
|
end
|
15
|
+
|
16
|
+
it_should_behave_like 'vfs storage basic'
|
17
|
+
it_should_behave_like 'vfs storage attributes basic'
|
18
|
+
it_should_behave_like 'vfs storage files'
|
19
|
+
it_should_behave_like 'vfs storage full attributes for files'
|
20
|
+
it_should_behave_like 'vfs storage dirs'
|
21
|
+
it_should_behave_like 'vfs storage full attributes for dirs'
|
22
|
+
it_should_behave_like 'vfs storage query'
|
23
|
+
it_should_behave_like 'vfs storage tmp dir'
|
16
24
|
end
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.15
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-25 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -20,7 +20,6 @@ files:
|
|
20
20
|
- Rakefile
|
21
21
|
- readme.md
|
22
22
|
- lib/vfs/entries/dir.rb
|
23
|
-
- lib/vfs/entries/entry/special_attributes.rb
|
24
23
|
- lib/vfs/entries/entry.rb
|
25
24
|
- lib/vfs/entries/file.rb
|
26
25
|
- lib/vfs/entries/universal_entry.rb
|
@@ -39,6 +38,7 @@ files:
|
|
39
38
|
- spec/file_spec.rb
|
40
39
|
- spec/path_spec.rb
|
41
40
|
- spec/spec_helper.rb
|
41
|
+
- spec/storages/local_spec/emptygit
|
42
42
|
- spec/storages/local_spec.rb
|
43
43
|
- spec/universal_entry_spec.rb
|
44
44
|
homepage: http://github.com/alexeypetrushin/vfs
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Vfs
|
2
|
-
class Entry
|
3
|
-
module SpecialAttributes
|
4
|
-
def created_at
|
5
|
-
safe_get :created_at
|
6
|
-
end
|
7
|
-
|
8
|
-
def updated_at
|
9
|
-
safe_get :updated_at
|
10
|
-
end
|
11
|
-
|
12
|
-
protected
|
13
|
-
def safe_get name
|
14
|
-
if value = get[name]
|
15
|
-
value
|
16
|
-
else
|
17
|
-
if get[:dir] or get[:file]
|
18
|
-
raise "attribute :#{name} not supported for #{storage.class}!"
|
19
|
-
else
|
20
|
-
raise "entry #{path} not exist!"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|