vfs 0.3.12 → 0.3.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
  require 'rspec_ext'
3
3
  require 'ruby_ext'
4
4
 
5
- shared_examples_for 'vfs storage' do
5
+ shared_examples_for 'vfs storage' do
6
6
  before do
7
7
  @storage.open_fs do |fs|
8
8
  @tmp_dir = fs.tmp
@@ -15,29 +15,29 @@ shared_examples_for 'vfs storage' do
15
15
  fs.delete_dir @tmp_dir if attrs && attrs[:dir]
16
16
  end
17
17
  end
18
-
18
+
19
19
  it 'should respond to :local?' do
20
20
  @storage.open_fs{|fs| fs.should respond_to(:local?)}
21
21
  end
22
-
22
+
23
23
  it 'should respond to :host'
24
-
24
+
25
25
  it 'should have root dir' do
26
26
  @storage.open_fs do |fs|
27
27
  fs.attributes('/').subset(:file, :dir).should == {file: false, dir: true}
28
28
  end
29
29
  end
30
-
31
- describe "files" do
30
+
31
+ describe "files" do
32
32
  before do
33
33
  @remote_file = "#{@tmp_dir}/remote_file"
34
34
  end
35
-
35
+
36
36
  it "file attributes" do
37
37
  @storage.open_fs do |fs|
38
38
  fs.attributes(@remote_file).should == {}
39
39
  fs.write_file(@remote_file, false){|w| w.write 'something'}
40
- attrs = fs.attributes(@remote_file)
40
+ attrs = fs.attributes(@remote_file)
41
41
  fs.attributes(@remote_file).subset(:file, :dir).should == {file: true, dir: false}
42
42
  end
43
43
  end
@@ -46,39 +46,39 @@ shared_examples_for 'vfs storage' do
46
46
  @storage.open_fs do |fs|
47
47
  fs.write_file(@remote_file, false){|w| w.write 'something'}
48
48
  fs.attributes(@remote_file)[:file].should be_true
49
-
50
- data = ""
49
+
50
+ data = ""
51
51
  fs.read_file(@remote_file){|buff| data << buff}
52
52
  data.should == 'something'
53
-
53
+
54
54
  # append
55
55
  fs.write_file(@remote_file, true){|w| w.write ' another'}
56
- data = ""
56
+ data = ""
57
57
  fs.read_file(@remote_file){|buff| data << buff}
58
58
  data.should == 'something another'
59
59
  end
60
60
  end
61
-
61
+
62
62
  it "delete_file" do
63
63
  @storage.open_fs do |fs|
64
- fs.write_file(@remote_file, false){|w| w.write 'something'}
64
+ fs.write_file(@remote_file, false){|w| w.write 'something'}
65
65
  fs.attributes(@remote_file)[:file].should be_true
66
66
  fs.delete_file(@remote_file)
67
67
  fs.attributes(@remote_file).should == {}
68
68
  end
69
69
  end
70
70
  end
71
-
71
+
72
72
  describe 'directories' do
73
73
  # before do
74
74
  # @from_local, @remote_path, @to_local = "#{@local_dir}/dir", "#{@tmp_dir}/upload", "#{@local_dir}/download"
75
75
  # end
76
-
76
+
77
77
  before do
78
78
  @remote_dir = "#{@tmp_dir}/some_dir"
79
79
  end
80
-
81
- it "directory_exist?, create_dir, delete_dir" do
80
+
81
+ it "directory_exist?, create_dir, delete_dir" do
82
82
  @storage.open_fs do |fs|
83
83
  fs.attributes(@remote_dir).should == {}
84
84
  fs.create_dir(@remote_dir)
@@ -87,43 +87,43 @@ shared_examples_for 'vfs storage' do
87
87
  fs.attributes(@remote_dir).should == {}
88
88
  end
89
89
  end
90
-
90
+
91
91
  it 'should delete not-empty directories' do
92
92
  @storage.open_fs do |fs|
93
93
  fs.create_dir(@remote_dir)
94
94
  fs.create_dir("#{@remote_dir}/dir")
95
- fs.write_file("#{@remote_dir}/dir/file", false){|w| w.write 'something'}
95
+ fs.write_file("#{@remote_dir}/dir/file", false){|w| w.write 'something'}
96
96
  fs.delete_dir(@remote_dir)
97
97
  fs.attributes(@remote_dir).should == {}
98
98
  end
99
99
  end
100
-
100
+
101
101
  it 'each' do
102
102
  @storage.open_fs do |fs|
103
103
  list = {}
104
104
  fs.each_entry(@tmp_dir, nil){|path, type| list[path] = type}
105
105
  list.should be_empty
106
-
106
+
107
107
  dir, file = "#{@tmp_dir}/dir", "#{@tmp_dir}/file"
108
108
  fs.create_dir(dir)
109
109
  fs.write_file(file, false){|w| w.write 'something'}
110
-
110
+
111
111
  list = {}
112
112
  fs.each_entry(@tmp_dir, nil){|path, type| list[path] = type}
113
113
  list.should == {'dir' => :dir, 'file' => :file}
114
114
  end
115
115
  end
116
-
116
+
117
117
  # it "upload_directory & download_directory" do
118
118
  # upload_path_check = "#{@remote_path}/dir2/file"
119
- # check_attributes upload_path_check, nil
119
+ # check_attributes upload_path_check, nil
120
120
  # fs.upload_directory(@from_local, @remote_path)
121
121
  # check_attributes upload_path_check, file: true, dir: false
122
- #
122
+ #
123
123
  # download_path_check = "#{@to_local}/dir2/file"
124
124
  # File.exist?(download_path_check).should be_false
125
125
  # fs.download_directory(@remote_path, @to_local)
126
126
  # File.exist?(download_path_check).should be_true
127
127
  # end
128
- end
128
+ end
129
129
  end
@@ -3,28 +3,28 @@ module Vfs
3
3
  def default_storage
4
4
  ::Vfs::Storages::Local.new
5
5
  end
6
-
6
+
7
7
  def to_entry
8
8
  '/'.to_entry
9
9
  end
10
-
10
+
11
11
  def to_file
12
12
  to_entry.file
13
13
  end
14
-
14
+
15
15
  def to_dir
16
16
  to_entry.dir
17
17
  end
18
-
18
+
19
19
  # def [] path
20
20
  # to_entry[path]
21
21
  # end
22
22
  # alias_method :/, :[]
23
-
23
+
24
24
  %w(
25
- entry dir file
25
+ entry dir file
26
26
  entries dirs files
27
- [] /
27
+ [] /
28
28
  tmp
29
29
  ).each do |m|
30
30
  script = <<-RUBY
data/readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vfs - Virtual File System
2
2
 
3
- Handy and simple abstraction over any storage that can represent concept of File and Directory (or at least part of it).
3
+ Handy and simple abstraction over any storage that can represent concept of File and Directory (or at least part of it).
4
4
  The Vfs for File System is kinda the same as ActiveRecord is for Relational Databases.
5
5
 
6
6
  Currently, there are following implementations available:
@@ -19,7 +19,7 @@ Currently, there are following implementations available:
19
19
  **Performance**:
20
20
 
21
21
  - sometimes there's extra call to check if file or dir exist before overriding it
22
- - copy: it doesn't use FileUtils.cp_r, it walks on the directory tree and copy each entry individually, so it's probably a little slover.
22
+ - copy: right now it doesn't use FileUtils.cp_r, it walks on the directory tree and copy each entry individually, so it's probably a little slover.
23
23
  - right now :move and :rename implemented ASAP by copy & destroy, will be fixed as soon as I'll have time to do it.
24
24
 
25
25
  ## Installation
@@ -33,7 +33,7 @@ $ gem install vos
33
33
 
34
34
  ``` ruby
35
35
  gem 'vfs' # Virtual File System
36
- require 'vfs'
36
+ require 'vfs'
37
37
 
38
38
  gem 'vos' # Virtual Operating System
39
39
  require 'vos'
@@ -42,7 +42,7 @@ require 'vos'
42
42
  # Connections, let's deploy our 'cool_app' project from our local box to remote server
43
43
 
44
44
  ``` ruby
45
- server = Box.new('cool_app.com') # it will use id_rsa, or You can add {user: 'me', password: 'secret'}
45
+ server = Box.new('cool_app.com') # it will use id_rsa, or You can add {user: 'me', password: 'secret'}
46
46
  me = '~'.to_dir # handy shortcut for local FS
47
47
 
48
48
  deploy_dir = server['apps/cool_app']
@@ -52,7 +52,7 @@ projects = me['projects']
52
52
  # Working with dirs, copying dir from any source to any destination (local/remote/custom_storage_type)
53
53
 
54
54
  ``` ruby
55
- projects['cool_app'].copy_to deploy_dir
55
+ projects['cool_app'].copy_to deploy_dir
56
56
  ```
57
57
 
58
58
  # Working with files
@@ -65,12 +65,12 @@ dbc.append("\ndatabase: mysql") # let's do it
65
65
 
66
66
  dbc.update do |content| # and add host info
67
67
  content + "\nhost: cool_app.com "
68
- end
68
+ end
69
69
 
70
70
  projects['cool_app/config/database.yml']. # or just overwrite it with our local dev version
71
71
  copy_to! dbc
72
72
  ```
73
-
73
+
74
74
  There are also streaming support (read/write/append) with &block, please go to specs for details
75
75
 
76
76
  # Checks
@@ -94,15 +94,15 @@ deploy_dir.dirs # => list of dirs, also support &bl
94
94
  ```
95
95
 
96
96
  For more please go to specs (create/update/move/copy/destroy/...)
97
-
97
+
98
98
  ## Integration with [Vos][vos] (Virtual Operating System)
99
-
100
- ```ruby
99
+
100
+ ```ruby
101
101
  server['apps/cool_app'].bash 'rails production'
102
102
  ```
103
103
 
104
- For more details please go to [Vos][vos] project page.
105
- Or checkout configuration I use to control my production servers [My Cluster][my_cluster] in conjunction with small
104
+ For more details please go to [Vos][vos] project page.
105
+ Or checkout configuration I use to control my production servers [My Cluster][my_cluster] in conjunction with small
106
106
  configuration tool [Cluster Management][cluster_management].
107
107
 
108
108
  # Why?
@@ -114,31 +114,10 @@ is to provide 1-to-1 clone of underlying OS API, instead of provididing handy to
114
114
 
115
115
  And if you want to use remote FS - things are getting even worse and more complicated (Net::SSH & Net::SFTP use a little
116
116
  different API than local FS, and you has to remember all thouse little quirks).
117
-
118
- ## Roadmap
119
-
120
- ### some future
121
-
122
- - add storages: Hadoop DFS, MongoDB, Amazon S3
123
-
124
- ### v 0.2
125
-
126
- - refactor specs with :fakefs
127
- - remove :host from Vfs to Vos
128
- - efficient (not copy/destroy) versions of move_to, rename
129
- - access via attributes and helpers for unix chmod
130
- - add storages: remote FS over HTTP.
131
-
132
- Done:
133
-
134
- - glob search for directories: Dir['**/*.yml']
135
117
 
136
- ### v 0.1 (all done)
118
+ Copyright (c) Alexey Petrushin http://petrush.in, released under the MIT license.
137
119
 
138
- - Vos: Dir.bash
139
- - File.append
140
- - list of entries/files/dirs
141
- - support for efficient copy for Local and SSH storages
120
+ ## Please let me know about bugs and Your proposals, there's the 'Issues' tab at the top, feel free to submit.
142
121
 
143
122
  [vos]: http://github.com/alexeypetrushin/vos
144
123
  [cluster_management]: http://github.com/alexeypetrushin/cluster_management
@@ -2,26 +2,26 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Container' do
4
4
  with_test_fs
5
-
5
+
6
6
  it "should threat paths as UniversalEntry except it ends with '/'" do
7
7
  test_fs.should_receive(:entry).with('tmp/a/b')
8
8
  test_fs['tmp/a/b']
9
-
9
+
10
10
  test_fs.should_receive(:dir).with('tmp/a/b')
11
11
  test_fs['tmp/a/b/']
12
12
  end
13
-
13
+
14
14
  it '/' do
15
15
  test_fs[:some_path].should == test_fs / :some_path
16
16
  test_fs[:some_path][:another_path].should == test_fs / :some_path / :another_path
17
17
  end
18
-
18
+
19
19
  it "UniversalEntry should be wrapped inside of proxy, Dir and File should not" do
20
20
  -> {test_fs.dir.proxy?}.should raise_error(NoMethodError)
21
21
  -> {test_fs.file.proxy?}.should raise_error(NoMethodError)
22
22
  test_fs.entry.proxy?.should be_true
23
23
  end
24
-
24
+
25
25
  it "sometimes it also should inexplicitly guess that path is a Dir instead of UniversalEntry (but still wrap it inside of Proxy)" do
26
26
  dir = test_fs['tmp/a/..']
27
27
  dir.proxy?.should be_true
@@ -2,11 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Dir' do
4
4
  with_test_fs
5
-
5
+
6
6
  before do
7
7
  @path = test_fs['a/b/c']
8
8
  end
9
-
9
+
10
10
  describe 'existence' do
11
11
  it "should check only dirs" do
12
12
  @path.should_not exist
@@ -18,29 +18,29 @@ describe 'Dir' do
18
18
  @path.dir.should exist
19
19
  end
20
20
  end
21
-
21
+
22
22
  it "should not respond to read and write methods" do
23
23
  -> {@path.dir.read}.should raise_error(NoMethodError)
24
24
  -> {@path.dir.write}.should raise_error(NoMethodError)
25
25
  end
26
-
26
+
27
27
  describe 'create' do
28
28
  it 'should be chainable' do
29
29
  @path.dir.create.should == @path
30
30
  @path.dir.create!.should == @path
31
31
  end
32
-
32
+
33
33
  it 'should create parent dirs if not exists' do
34
34
  @path.parent.should_not exist
35
35
  @path.dir.create
36
36
  @path.should be_dir
37
37
  end
38
-
38
+
39
39
  it 'should silently exit if dir already exist' do
40
40
  @path.dir.create
41
41
  @path.dir.create
42
42
  end
43
-
43
+
44
44
  it 'should override existing file if override specified' do
45
45
  @path.file.create
46
46
  @path.should be_file
@@ -48,7 +48,7 @@ describe 'Dir' do
48
48
  @path.dir.create!
49
49
  @path.should be_dir
50
50
  end
51
-
51
+
52
52
  it 'should override existing dir if override specified' do
53
53
  @path.dir.create
54
54
  @path.should be_dir
@@ -56,7 +56,7 @@ describe 'Dir' do
56
56
  @path.should be_dir
57
57
  end
58
58
  end
59
-
59
+
60
60
  describe 'destroying' do
61
61
  it "should raise error if it's trying to destroy a file (unless force specified)" do
62
62
  @path.file.create
@@ -64,36 +64,36 @@ describe 'Dir' do
64
64
  @path.dir.destroy!
65
65
  @path.entry.should_not exist
66
66
  end
67
-
67
+
68
68
  it "shouldn't raise if dir not exist" do
69
69
  @path.dir.destroy
70
70
  end
71
-
71
+
72
72
  it 'should destroy recursivelly' do
73
73
  dir = @path.dir
74
74
  dir.create
75
75
  dir.file('file').write 'something'
76
76
  dir.dir('dir').create.tap do |dir|
77
- dir.file('file2').write 'something2'
77
+ dir.file('file2').write 'something2'
78
78
  end
79
-
79
+
80
80
  dir.destroy
81
81
  dir.should_not exist
82
82
  end
83
-
83
+
84
84
  it 'should be chainable' do
85
85
  @path.dir.destroy.should == @path
86
86
  @path.dir.destroy!.should == @path
87
87
  end
88
88
  end
89
-
89
+
90
90
  describe 'entries, files, dirs' do
91
91
  before do
92
92
  @path.dir('dir').create
93
93
  @path.dir('dir/another_dir').create
94
- @path.file('file').create
94
+ @path.file('file').create
95
95
  end
96
-
96
+
97
97
  it 'entries' do
98
98
  -> {@path['non_existing'].entries}.should raise_error(Vfs::Error, /not exist/)
99
99
  @path['non_existing'].entries(bang: false).should == []
@@ -102,71 +102,71 @@ describe 'Dir' do
102
102
  @path.entries{|e| list << e}
103
103
  list.to_set.should be_eql([@path.dir('dir'), @path.file('file')].to_set)
104
104
  end
105
-
105
+
106
106
  it "glob search support"
107
-
107
+
108
108
  it 'should raise error if trying :entries on file' do
109
109
  @path.file('some_file').create
110
110
  -> {@path.dir('some_file').entries}.should raise_error(/File/)
111
111
  end
112
-
112
+
113
113
  it 'files' do
114
114
  @path.files.should be_eql([@path.file('file')])
115
115
  end
116
-
116
+
117
117
  it 'dirs' do
118
118
  @path.dirs.should be_eql([@path.dir('dir')])
119
119
  end
120
-
120
+
121
121
  it 'has? & include?' do
122
122
  @path.include?('dir').should be_true
123
123
  @path.include?('dir/another_dir').should be_true
124
124
  @path.include?('file').should be_true
125
125
  @path.include?('non_existing').should be_false
126
126
  end
127
-
127
+
128
128
  it 'empty?'
129
129
  end
130
-
130
+
131
131
  describe 'copying' do
132
- before do
132
+ before do
133
133
  @from = @path.dir
134
134
  @from.create
135
135
  @from.file('file').write 'something'
136
136
  @from.dir('dir').create.tap do |dir|
137
- dir.file('file2').write 'something2'
137
+ dir.file('file2').write 'something2'
138
138
  end
139
139
  end
140
-
140
+
141
141
  it 'should not copy to itself' do
142
142
  -> {@from.copy_to @from}.should raise_error(Vfs::Error, /itself/)
143
143
  end
144
-
144
+
145
145
  shared_examples_for 'copy_to behavior' do
146
146
  it 'should not copy to file (and overwrite if forced)' do
147
147
  -> {@from.copy_to @to.file}.should raise_error(/can't copy Dir to File/)
148
-
148
+
149
149
  @from.copy_to! @to.file
150
150
  @to['file'].read.should == 'something'
151
151
  end
152
-
152
+
153
153
  it 'should not override files (and override if forced)' do
154
154
  @from.copy_to @to
155
155
  -> {@from.copy_to @to}.should raise_error(/already exist/)
156
-
156
+
157
157
  @from['dir/file2'].write! 'another'
158
158
  @from.copy_to! @to
159
159
  @to['dir/file2'].read.should == 'another'
160
160
  end
161
-
161
+
162
162
  it 'should copy to UniversalEntry (and overwrite if forced)' do
163
163
  @from.copy_to @to.entry
164
164
  -> {@from.copy_to @to.entry}.should raise_error(/already exist/)
165
-
165
+
166
166
  @from.copy_to! @to.entry
167
- @to['file'].read.should == 'something'
167
+ @to['file'].read.should == 'something'
168
168
  end
169
-
169
+
170
170
  it "shouldn't delete existing content of directory" do
171
171
  @to.dir.create!
172
172
  @to.file('existing_file').write 'existing_content'
@@ -181,25 +181,25 @@ describe 'Dir' do
181
181
  @to.file('existing_file').read.should == 'existing_content'
182
182
  @to.dir('existing_dir').should exist
183
183
  @to.file('dir/existing_file2').read.should == 'existing_content2'
184
- end
185
-
184
+ end
185
+
186
186
  it 'should be chainable' do
187
187
  @from.copy_to(@to).should == @to
188
188
  @from.copy_to!(@to).should == @to
189
189
  end
190
-
190
+
191
191
  it "should override without deleting other files" do
192
- @from.copy_to(@to).should == @to
192
+ @from.copy_to(@to).should == @to
193
193
  @to.file('other_file').write 'other'
194
-
194
+
195
195
  @from.copy_to!(@to).should == @to
196
196
  @to.file('other_file').read.should == 'other'
197
197
  end
198
198
  end
199
199
 
200
- describe 'general copy' do
200
+ describe 'general copy' do
201
201
  it_should_behave_like 'copy_to behavior'
202
-
202
+
203
203
  before do
204
204
  # prevenging usage of :efficient_dir_copy
205
205
  # Vfs::Dir.dont_use_efficient_dir_copy = true
@@ -209,29 +209,29 @@ describe 'Dir' do
209
209
  # after do
210
210
  # Vfs::Dir.dont_use_efficient_dir_copy = false
211
211
  # end
212
- end
213
-
212
+ end
213
+
214
214
  # describe 'effective copy' do
215
215
  # it_should_behave_like 'copy_to behavior'
216
- #
216
+ #
217
217
  # before do
218
218
  # @to = test_fs['to']
219
219
  # end
220
220
  # end
221
221
  end
222
-
222
+
223
223
  describe 'moving' do
224
224
  it 'move_to' do
225
225
  from, to = @path.file('from'), @path.file('to')
226
226
  from.should_receive(:copy_to).with(to, {})
227
227
  from.should_receive(:destroy).with({})
228
228
  from.move_to to
229
-
229
+
230
230
  from.should_receive(:move_to).with(to, override: true)
231
231
  from.move_to! to
232
232
  end
233
-
234
- it 'should be chainable' do
233
+
234
+ it 'should be chainable' do
235
235
  from, to = @path.dir('from').create, @path.dir('to')
236
236
  from.move_to(to).should == to
237
237
  from.create