vfs 0.3.13 → 0.3.14
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/entries/dir.rb +3 -2
- data/lib/vfs/entries/file.rb +39 -40
- data/lib/vfs/entries/universal_entry.rb +2 -1
- data/lib/vfs/entry_proxy.rb +1 -4
- data/lib/vfs/integration/string.rb +2 -1
- data/lib/vfs/storages/local.rb +3 -8
- data/readme.md +9 -14
- data/spec/entry_spec.rb +5 -0
- data/spec/file_spec.rb +5 -0
- data/spec/universal_entry_spec.rb +4 -0
- metadata +2 -2
data/lib/vfs/entries/dir.rb
CHANGED
@@ -40,7 +40,8 @@ module Vfs
|
|
40
40
|
raise Error, "entry #{self} already exist!"
|
41
41
|
end
|
42
42
|
elsif attrs[:dir]
|
43
|
-
#
|
43
|
+
# dir already exist, no need to recreate it
|
44
|
+
return self
|
44
45
|
else
|
45
46
|
parent = self.parent
|
46
47
|
if parent.exist?
|
@@ -51,7 +52,7 @@ module Vfs
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
54
|
-
|
55
|
+
try < 2 ? retry : raise(error)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
self
|
data/lib/vfs/entries/file.rb
CHANGED
@@ -53,41 +53,46 @@ module Vfs
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def write *args, &block
|
56
|
+
if block
|
57
|
+
options = args.first || {}
|
58
|
+
else
|
59
|
+
data, options = *args
|
60
|
+
options ||= {}
|
61
|
+
end
|
62
|
+
raise "can't do :override and :append at the same time!" if options[:override] and options[:append]
|
63
|
+
|
56
64
|
storage.open_fs do |fs|
|
65
|
+
# TODO2 Performance lost, extra call to check file existence
|
66
|
+
# We need to check if the file exist before writing to it, otherwise it's
|
67
|
+
# impossible to distinguish if the StandardError caused by the 'already exist' error or
|
68
|
+
# some other error.
|
69
|
+
entry = self.entry
|
70
|
+
if entry.exist?
|
71
|
+
if options[:override]
|
72
|
+
entry.destroy
|
73
|
+
else
|
74
|
+
raise Error, "entry #{self} already exist!"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
57
78
|
try = 0
|
58
79
|
begin
|
59
80
|
try += 1
|
60
|
-
if block
|
61
|
-
options = args.first || {}
|
62
|
-
else
|
63
|
-
data, options = *args
|
64
|
-
options ||= {}
|
65
|
-
end
|
66
|
-
raise "can't do :override and :append at the same time!" if options[:override] and options[:append]
|
67
81
|
if block
|
68
82
|
fs.write_file(path, options[:append], &block)
|
69
83
|
else
|
70
84
|
fs.write_file(path, options[:append]){|writer| writer.write data}
|
71
85
|
end
|
72
86
|
rescue StandardError => error
|
73
|
-
|
74
|
-
if
|
75
|
-
|
76
|
-
|
77
|
-
else
|
78
|
-
raise Error, "entry #{self} already exist!"
|
79
|
-
end
|
87
|
+
parent = self.parent
|
88
|
+
if parent.exist?
|
89
|
+
# some unknown error
|
90
|
+
raise error
|
80
91
|
else
|
81
|
-
parent
|
82
|
-
if parent.exist?
|
83
|
-
# some unknown error
|
84
|
-
raise error
|
85
|
-
else
|
86
|
-
parent.create(options)
|
87
|
-
end
|
92
|
+
parent.create(options)
|
88
93
|
end
|
89
94
|
|
90
|
-
|
95
|
+
try < 2 ? retry : raise(error)
|
91
96
|
end
|
92
97
|
end
|
93
98
|
self
|
@@ -98,6 +103,18 @@ module Vfs
|
|
98
103
|
write *args, &block
|
99
104
|
end
|
100
105
|
|
106
|
+
def append *args, &block
|
107
|
+
options = (args.last.is_a?(Hash) && args.pop) || {}
|
108
|
+
options[:append] = true
|
109
|
+
write(*(args << options), &block)
|
110
|
+
end
|
111
|
+
|
112
|
+
def update options = {}, &block
|
113
|
+
options[:override] = true
|
114
|
+
data = read options
|
115
|
+
write block.call(data), options
|
116
|
+
end
|
117
|
+
|
101
118
|
def destroy options = {}
|
102
119
|
storage.open_fs do |fs|
|
103
120
|
begin
|
@@ -126,24 +143,6 @@ module Vfs
|
|
126
143
|
destroy options
|
127
144
|
end
|
128
145
|
|
129
|
-
def append *args, &block
|
130
|
-
if block
|
131
|
-
options = args.first || {}
|
132
|
-
else
|
133
|
-
data, options = *args
|
134
|
-
options ||= {}
|
135
|
-
end
|
136
|
-
|
137
|
-
options[:append] = true
|
138
|
-
write data, options, &block
|
139
|
-
end
|
140
|
-
|
141
|
-
def update options = {}, &block
|
142
|
-
options[:override] = true
|
143
|
-
data = read options
|
144
|
-
write block.call(data), options
|
145
|
-
end
|
146
|
-
|
147
146
|
|
148
147
|
#
|
149
148
|
# Transfers
|
@@ -12,7 +12,7 @@ module Vfs
|
|
12
12
|
#
|
13
13
|
# CRUD
|
14
14
|
#
|
15
|
-
def destroy
|
15
|
+
def destroy options = {}
|
16
16
|
storage.open_fs do |fs|
|
17
17
|
attrs = get
|
18
18
|
fs.delete_dir path if attrs[:dir]
|
@@ -20,5 +20,6 @@ module Vfs
|
|
20
20
|
end
|
21
21
|
self
|
22
22
|
end
|
23
|
+
alias_method :destroy!, :destroy
|
23
24
|
end
|
24
25
|
end
|
data/lib/vfs/entry_proxy.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
#
|
2
|
-
# It allows
|
2
|
+
# It allows dynamically (magically) switching between UniversalEntry/Dir/File
|
3
3
|
#
|
4
4
|
module Vfs
|
5
5
|
class EntryProxy < BasicObject
|
6
6
|
attr_reader :_target
|
7
|
-
# WRAP = [:[], :entry, :dir, :file].to_set
|
8
7
|
|
9
8
|
def initialize entry
|
10
9
|
raise 'something wrong happening here!' if entry.respond_to?(:proxy?) and entry.proxy?
|
@@ -31,8 +30,6 @@ module Vfs
|
|
31
30
|
end
|
32
31
|
|
33
32
|
_target.send m, *a, &b
|
34
|
-
|
35
|
-
# return WRAP.include?(m) ? EntryProxy.new(result) : result
|
36
33
|
end
|
37
34
|
end
|
38
35
|
end
|
data/lib/vfs/storages/local.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
|
-
warn 'remove trailing spaces'
|
2
1
|
require 'tempfile'
|
3
2
|
|
4
3
|
module Vfs
|
5
4
|
module Storages
|
6
5
|
class Local
|
7
6
|
class Writer
|
8
|
-
def initialize out
|
9
|
-
@out = out
|
10
|
-
end
|
7
|
+
def initialize out; @out = out end
|
11
8
|
|
12
|
-
def write data
|
13
|
-
@out.write data
|
14
|
-
end
|
9
|
+
def write data; @out.write data end
|
15
10
|
end
|
16
11
|
|
17
12
|
module LocalVfsHelper
|
@@ -133,7 +128,7 @@ module Vfs
|
|
133
128
|
def local?; true end
|
134
129
|
|
135
130
|
def tmp &block
|
136
|
-
tmp_dir = "#{::Dir.tmpdir}/#{rand(10**
|
131
|
+
tmp_dir = "#{::Dir.tmpdir}/#{rand(10**6)}"
|
137
132
|
if block
|
138
133
|
begin
|
139
134
|
create_dir tmp_dir
|
data/readme.md
CHANGED
@@ -32,32 +32,23 @@ $ gem install vos
|
|
32
32
|
## Code samples:
|
33
33
|
|
34
34
|
``` ruby
|
35
|
-
|
36
|
-
require '
|
37
|
-
|
38
|
-
gem 'vos' # Virtual Operating System
|
39
|
-
require 'vos'
|
40
|
-
```
|
35
|
+
require 'vfs' # Virtual File System
|
36
|
+
require 'vos' # Virtual Operating System
|
41
37
|
|
42
38
|
# Connections, let's deploy our 'cool_app' project from our local box to remote server
|
43
39
|
|
44
|
-
``` ruby
|
45
40
|
server = Box.new('cool_app.com') # it will use id_rsa, or You can add {user: 'me', password: 'secret'}
|
46
41
|
me = '~'.to_dir # handy shortcut for local FS
|
47
42
|
|
48
43
|
deploy_dir = server['apps/cool_app']
|
49
44
|
projects = me['projects']
|
50
|
-
```
|
51
45
|
|
52
46
|
# Working with dirs, copying dir from any source to any destination (local/remote/custom_storage_type)
|
53
47
|
|
54
|
-
``` ruby
|
55
48
|
projects['cool_app'].copy_to deploy_dir
|
56
|
-
```
|
57
49
|
|
58
50
|
# Working with files
|
59
51
|
|
60
|
-
``` ruby
|
61
52
|
dbc = deploy_dir.file('config/database.yml') # <= the 'config' dir not exist yet
|
62
53
|
dbc.write("user: root\npassword: secret") # <= now the 'database.yml' and parent 'config' has been created
|
63
54
|
dbc.content =~ /database/ # => false, we forgot to add the database
|
@@ -74,15 +65,19 @@ projects['cool_app/config/database.yml']. # or just overwrite it with our loc
|
|
74
65
|
There are also streaming support (read/write/append) with &block, please go to specs for details
|
75
66
|
|
76
67
|
# Checks
|
68
|
+
|
69
|
+
``` ruby
|
77
70
|
deploy_dir['config'].exist? # => true
|
78
71
|
deploy_dir.dir('config').exist? # => true
|
79
72
|
deploy_dir.file('config').exist? # => false
|
80
73
|
|
81
74
|
deploy_dir['config'].dir? # => true
|
82
75
|
deploy_dir['config'].file? # => false
|
83
|
-
|
76
|
+
```
|
84
77
|
|
85
78
|
# Navigation
|
79
|
+
|
80
|
+
``` ruby
|
86
81
|
config = deploy_dir['config']
|
87
82
|
config.parent # => </apps/cool_app>
|
88
83
|
config['../..'] # => </>
|
@@ -115,9 +110,9 @@ is to provide 1-to-1 clone of underlying OS API, instead of provididing handy to
|
|
115
110
|
And if you want to use remote FS - things are getting even worse and more complicated (Net::SSH & Net::SFTP use a little
|
116
111
|
different API than local FS, and you has to remember all thouse little quirks).
|
117
112
|
|
118
|
-
|
113
|
+
## License
|
119
114
|
|
120
|
-
|
115
|
+
Copyright (c) Alexey Petrushin http://petrush.in, released under the MIT license.
|
121
116
|
|
122
117
|
[vos]: http://github.com/alexeypetrushin/vos
|
123
118
|
[cluster_management]: http://github.com/alexeypetrushin/cluster_management
|
data/spec/entry_spec.rb
CHANGED
data/spec/file_spec.rb
CHANGED
@@ -100,6 +100,11 @@ describe 'File' do
|
|
100
100
|
file.should_receive(:write).with('something', append: true)
|
101
101
|
file.append 'something'
|
102
102
|
end
|
103
|
+
|
104
|
+
it 'should correctly display errors (from error)' do
|
105
|
+
-> {test_fs['test'].write{|writer| raise 'some error'}}.should raise_error(/some error/)
|
106
|
+
-> {test_fs['test'].write!{|writer| raise 'some error'}}.should raise_error(/some error/)
|
107
|
+
end
|
103
108
|
end
|
104
109
|
|
105
110
|
it 'update' do
|
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.14
|
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-20 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|