vfs 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -92,12 +92,17 @@ module Vfs
92
92
  #
93
93
  # Content
94
94
  #
95
- def entries options = {}, &block
95
+ def entries *args, &block
96
+ raise "invalid arguments #{args.inspect}!" if args.size > 2
97
+ options = args.last.is_a?(Hash) ? args.pop : {}
98
+ query = args.first
96
99
  options[:bang] = true unless options.include? :bang
100
+
97
101
  storage.open_fs do |fs|
98
102
  begin
99
103
  list = []
100
- fs.each_entry path do |name, type|
104
+ # query option is optional and supported only for some storages (local fs for example)
105
+ fs.each_entry path, query do |name, type|
101
106
  next if options[:filter] and options[:filter] != type
102
107
  entry = if type == :dir
103
108
  dir(name)
@@ -125,14 +130,20 @@ module Vfs
125
130
  end
126
131
  alias_method :each, :entries
127
132
 
128
- def files options = {}, &block
133
+ def files *args, &block
134
+ options = args.last.is_a?(Hash) ? args.pop : {}
135
+
129
136
  options[:filter] = :file
130
- entries options, &block
137
+ args << options
138
+ entries *args, &block
131
139
  end
132
140
 
133
- def dirs options = {}, &block
141
+ def dirs *args, &block
142
+ options = args.last.is_a?(Hash) ? args.pop : {}
143
+
134
144
  options[:filter] = :dir
135
- entries options, &block
145
+ args << options
146
+ entries *args, &block
136
147
  end
137
148
 
138
149
  def include? name
@@ -190,7 +190,13 @@ module Vfs
190
190
  require 'tilt'
191
191
 
192
192
  args.unshift Object.new if args.size == 1 and args.first.is_a?(Hash)
193
- Tilt::ERBTemplate.new(path).render *args
193
+
194
+ template = Tilt.new path
195
+ template.render *args
196
+ end
197
+
198
+ def size
199
+ get :size
194
200
  end
195
201
 
196
202
  def basename
data/lib/vfs/path.rb CHANGED
@@ -44,22 +44,22 @@ module Vfs
44
44
 
45
45
  class << self
46
46
  def absolute? path
47
- path =~ /^[\/~]|^\.$|^\.\//
47
+ path =~ /^[\/~\/]|^\.$|^\.\//
48
48
  end
49
-
49
+
50
50
  def valid? path, forbid_relative = true, &block
51
51
  result, err = if forbid_relative and !absolute?(path)
52
- [false, "path must be started with '/', '~', or '.'"]
53
- elsif path =~ /.+[\/~]$|\/\.$/
54
- [false, "path can't be ended with '/', '~', or '/.'"]
55
- elsif path =~ /\/[\/~]|\/\.\//
52
+ [false, "path must be started with '/', or '.'"]
53
+ elsif path =~ /.+\/~$|.+\/$|\/\.$/
54
+ [false, "path can't be ended with '/', '/~', or '/.'"]
55
+ elsif path =~ /\/\/|\/~\/|\/\.\//
56
56
  [false, "path can't include '/./', '/~/', '//' combinations!"]
57
- elsif path =~ /.+[~]|\/\.\//
58
- [false, "'~', or '.' can be present only at the begining of string"]
57
+ # elsif path =~ /.+[~]|\/\.\//
58
+ # [false, "'~', or '.' can be present only at the begining of string"]
59
59
  else
60
60
  [true, nil]
61
61
  end
62
-
62
+
63
63
  block.call err if block and !result and err
64
64
  result
65
65
  end
@@ -98,7 +98,9 @@ module Vfs
98
98
  # raise 'not supported'
99
99
  # end
100
100
 
101
- def each_entry path, &block
101
+ def each_entry path, query, &block
102
+ raise "hash_fs not support :each_entry with query!" if query
103
+
102
104
  base, name = split_path path
103
105
  assert cd(base)[name], :include?, :dir
104
106
  cd(base)[name].each do |relative_name, content|
@@ -135,7 +137,7 @@ module Vfs
135
137
 
136
138
  if cd(to_base).include? to_name
137
139
  if cd(to_base)[to_name][:dir]
138
- each_entry from_path do |name, type|
140
+ each_entry from_path, nil do |name, type|
139
141
  if type == :dir
140
142
  _efficient_dir_copy "#{from_path}/#{name}", "#{to_path}/#{name}", override
141
143
  else
@@ -23,6 +23,7 @@ module Vfs
23
23
  # attributes special for file system
24
24
  attrs[:created_at] = stat.ctime
25
25
  attrs[:updated_at] = stat.mtime
26
+ attrs[:size] = stat.size
26
27
  attrs
27
28
  rescue Errno::ENOENT
28
29
  {}
@@ -72,13 +73,25 @@ module Vfs
72
73
  FileUtils.rm_r path
73
74
  end
74
75
 
75
- def each_entry path, &block
76
- ::Dir.foreach path do |relative_name|
77
- next if relative_name == '.' or relative_name == '..'
78
- if ::File.directory? "#{path}/#{relative_name}"
79
- block.call relative_name, :dir
80
- else
81
- block.call relative_name, :file
76
+ def each_entry path, query, &block
77
+ if query
78
+ path_with_trailing_slash = path == '/' ? path : "#{path}/"
79
+ ::Dir["#{path_with_trailing_slash}#{query}"].each do |absolute_path|
80
+ relative_path = absolute_path.sub path_with_trailing_slash, ''
81
+ if ::File.directory? absolute_path
82
+ block.call relative_path, :dir
83
+ else
84
+ block.call relative_path, :file
85
+ end
86
+ end
87
+ else
88
+ ::Dir.foreach path do |relative_name|
89
+ next if relative_name == '.' or relative_name == '..'
90
+ if ::File.directory? "#{path}/#{relative_name}"
91
+ block.call relative_name, :dir
92
+ else
93
+ block.call relative_name, :file
94
+ end
82
95
  end
83
96
  end
84
97
  end
@@ -101,7 +101,7 @@ shared_examples_for 'vfs storage' do
101
101
  it 'each' do
102
102
  @storage.open_fs do |fs|
103
103
  list = {}
104
- fs.each_entry(@tmp_dir){|path, type| list[path] = type}
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"
@@ -109,7 +109,7 @@ shared_examples_for 'vfs storage' do
109
109
  fs.write_file(file, false){|w| w.call 'something'}
110
110
 
111
111
  list = {}
112
- fs.each_entry(@tmp_dir){|path, type| list[path] = type}
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
data/readme.md CHANGED
@@ -107,26 +107,30 @@ is to provide 1-to-1 clone of underlying OS API, instead of provididing handy to
107
107
  And if you want to use remote FS - things are getting even worse and more complicated (Net::SSH & Net::SFTP use a little
108
108
  different API than local FS, and you has to remember all thouse little quirks).
109
109
 
110
- ## TODO
110
+ ## Roadmap
111
111
 
112
- ### v 0.1 (all done)
112
+ ### some future
113
113
 
114
- - Vos: Dir.bash
115
- - File.append
116
- - list of entries/files/dirs
117
- - support for efficient copy for Local and SSH storages
114
+ - add storages: Hadoop DFS, MongoDB, Amazon S3
118
115
 
119
116
  ### v 0.2
120
117
 
118
+ - refactor specs with :fakefs
121
119
  - remove :host from Vfs to Vos
122
120
  - efficient (not copy/destroy) versions of move_to, rename
123
- - glob search for directories: Dir['**/*.yml']
124
121
  - access via attributes and helpers for unix chmod
125
122
  - add storages: remote FS over HTTP.
126
123
 
127
- ### future
124
+ Done:
128
125
 
129
- - add storages: Hadoop DFS, MongoDB, Amazon S3
126
+ - glob search for directories: Dir['**/*.yml']
127
+
128
+ ### v 0.1 (all done)
129
+
130
+ - Vos: Dir.bash
131
+ - File.append
132
+ - list of entries/files/dirs
133
+ - support for efficient copy for Local and SSH storages
130
134
 
131
135
  [vos]: http://github.com/alexeypetrushin/vos
132
136
  [cluster_management]: http://github.com/alexeypetrushin/cluster_management
data/spec/dir_spec.rb CHANGED
@@ -86,7 +86,7 @@ describe 'Dir' do
86
86
  end
87
87
  end
88
88
 
89
- describe 'content' do
89
+ describe 'entries, files, dirs' do
90
90
  before do
91
91
  @path.dir('dir').create
92
92
  @path.dir('dir/another_dir').create
@@ -102,6 +102,8 @@ describe 'Dir' do
102
102
  list.to_set.should be_eql([@path.dir('dir'), @path.file('file')].to_set)
103
103
  end
104
104
 
105
+ it "glob search support"
106
+
105
107
  it 'should raise error if trying :entries on file' do
106
108
  @path.file('some_file').create
107
109
  -> {@path.dir('some_file').entries}.should raise_error(/File/)
data/spec/entry_spec.rb CHANGED
@@ -30,5 +30,7 @@ describe 'Entry' do
30
30
  it 'created_at'
31
31
 
32
32
  it 'updated_at'
33
+
34
+ it 'size'
33
35
  end
34
36
  end
data/spec/file_spec.rb CHANGED
@@ -189,5 +189,7 @@ describe 'File' do
189
189
 
190
190
  describe "extra stuff" do
191
191
  it 'render'
192
+
193
+ it 'size'
192
194
  end
193
195
  end
data/spec/path_spec.rb CHANGED
@@ -12,7 +12,10 @@ describe "Path" do
12
12
  /a/../c
13
13
  /a/...
14
14
  ~/a
15
- ./a
15
+ ./a
16
+ /~a
17
+ /a~b
18
+ /a.b~
16
19
  ).each{|path| Path.should be_valid(path)}
17
20
 
18
21
  special = ['']
@@ -35,9 +38,10 @@ describe "Path" do
35
38
  /a /a
36
39
  ~/a ~/a
37
40
  ./a ./a
38
- /a/../c /c
41
+ /a/../c /c
39
42
  / /
40
43
  ~ ~
44
+ /a~/b /a~/b
41
45
  . .
42
46
  ) + special).each_slice(2) do |path, normalized_path|
43
47
  Path.normalize(path).should == normalized_path
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.8
4
+ version: 0.3.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-30 00:00:00 +04:00
13
+ date: 2011-08-03 00:00:00 +04:00
14
14
  default_executable:
15
15
  dependencies: []
16
16