vfs 0.3.14 → 0.3.15
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 +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
|