org.torquebox.vfs 1.0.0.Beta22 → 1.0.0.Beta23

Sign up to get free protection for your applications and to get access to all the features.
data/lib/vfs/dir.rb CHANGED
@@ -10,7 +10,7 @@ module VFS
10
10
  @path = path
11
11
  begin
12
12
  @virtual_file = org.jboss.vfs.VFS.child( path )
13
- rescue Java::JavaLang::NullPointerException
13
+ rescue Java::JavaLang::NullPointerException
14
14
  raise Errno::ENOENT.new
15
15
  end
16
16
  @pos = 0
@@ -38,7 +38,7 @@ module VFS
38
38
  @pos += 1
39
39
  child.name
40
40
  end
41
-
41
+
42
42
  def seek(i)
43
43
  @pos = i
44
44
  self
@@ -48,7 +48,11 @@ module VFS
48
48
  @pos = i
49
49
  end
50
50
 
51
+ def entries
52
+ @virtual_file.children.map(&:name)
53
+ end
54
+
51
55
  end
52
56
 
53
- end
57
+ end
54
58
 
data/lib/vfs/ext/dir.rb CHANGED
@@ -6,6 +6,7 @@ class Dir
6
6
  alias_method :open_before_vfs, :open
7
7
  alias_method :glob_before_vfs, :glob
8
8
  alias_method :mkdir_before_vfs, :mkdir
9
+ alias_method :new_before_vfs, :new
9
10
 
10
11
  def open(str,&block)
11
12
  #if ( ::File.exist_without_vfs?( str.to_str ) && ! Java::OrgJbossVirtualPluginsContextJar::JarUtils.isArchive( str.to_str ) )
@@ -19,7 +20,7 @@ class Dir
19
20
  begin
20
21
  result = block.call(dir)
21
22
  ensure
22
- dir.close
23
+ dir.close
23
24
  end
24
25
  end
25
26
  #puts "open(#{str}) return #{result}"
@@ -58,7 +59,7 @@ class Dir
58
59
  #end
59
60
 
60
61
  #puts "base= #{base}"
61
-
62
+
62
63
  vfs_url, child_path = VFS.resolve_within_archive( base )
63
64
  #puts "vfs_url=#{vfs_url}"
64
65
  #puts "child_path=#{child_path}"
@@ -88,7 +89,7 @@ class Dir
88
89
  #puts "base=#{base}"
89
90
  filter = VFS::GlobFilter.new( child_path, matcher )
90
91
  #puts "filter is #{filter}"
91
- paths = starting_point.getChildrenRecursively( filter ).collect{|e|
92
+ paths = starting_point.getChildrenRecursively( filter ).collect{|e|
92
93
  #path_name = e.path_name
93
94
  path_name = e.getPathNameRelativeTo( starting_point )
94
95
  #puts "(collect) path_name=#{path_name}"
@@ -107,7 +108,17 @@ class Dir
107
108
  def mkdir(path, mode=0777)
108
109
  real_path = path =~ /^vfs:/ ? path[4..-1] : path
109
110
  mkdir_before_vfs( real_path, mode )
111
+ rescue Errno::ENOTDIR => e
112
+ path = VFS.writable_path_or_error( path, e )
113
+ mkdir_before_vfs( path, mode )
114
+ end
115
+
116
+ def new(string)
117
+ if ( ::File.exist_without_vfs?( string.to_s ) )
118
+ return new_before_vfs( string )
119
+ end
120
+ VFS::Dir.new( string.to_s )
110
121
  end
111
122
  end
112
- end
123
+ end
113
124
 
data/lib/vfs/ext/file.rb CHANGED
@@ -6,6 +6,8 @@ class File
6
6
 
7
7
  alias_method :open_without_vfs, :open
8
8
  alias_method :mtime_without_vfs, :mtime
9
+ alias_method :size_without_vfs, :size
10
+ alias_method :size_without_vfs?, :size?
9
11
  alias_method :stat_without_vfs, :stat
10
12
  alias_method :exist_without_vfs?, :exist?
11
13
  alias_method :directory_without_vfs?, :directory?
@@ -31,15 +33,20 @@ class File
31
33
  end
32
34
 
33
35
  def expand_path(*args)
36
+ return args[0].to_s.dup if ( vfs_path?(args[0]) )
34
37
  if ( vfs_path?(args[1]) )
35
- return expand_path_without_vfs(args[0], name_without_vfs(args[1].to_s))
38
+ expanded = expand_path_without_vfs(args[0], name_without_vfs(args[1].to_s))
39
+ return VFS.resolve_path_url(expanded)
36
40
  end
37
- return args[0].to_s.dup if ( vfs_path?(args[0]) )
38
41
  expand_path_without_vfs(*args)
39
42
  end
40
43
 
41
44
  def readable?(filename)
42
- readable_without_vfs? name_without_vfs(filename)
45
+ return true if readable_without_vfs?( name_without_vfs( filename ) )
46
+
47
+ virtual_file = virtual_file( filename )
48
+ # VirtualFile has no readable? so assume we can read it if it exists
49
+ !virtual_file.nil? && virtual_file.exists?
43
50
  end
44
51
 
45
52
  def unlink(*file_names)
@@ -69,6 +76,35 @@ class File
69
76
  Time.at( virtual_file.getLastModified() / 1000 )
70
77
  end
71
78
 
79
+ def size(filename)
80
+ return size_without_vfs(filename) if ( File.exist_without_vfs?( filename ) )
81
+
82
+ vfs_url, child_path = VFS.resolve_within_archive(filename)
83
+ raise Errno::ENOENT.new unless vfs_url
84
+
85
+ virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
86
+ virtual_file = virtual_file.get_child( child_path ) if child_path
87
+
88
+ raise Errno::ENOENT.new unless virtual_file.exists
89
+
90
+ virtual_file.size
91
+ end
92
+
93
+ def size?(filename)
94
+ return size_without_vfs?(filename) if ( File.exist_without_vfs?( filename ) )
95
+
96
+ vfs_url, child_path = VFS.resolve_within_archive(filename)
97
+ return nil unless vfs_url
98
+
99
+ virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
100
+ virtual_file = virtual_file.get_child( child_path ) if child_path
101
+
102
+ return nil unless virtual_file.exists
103
+
104
+ virtual_file.size
105
+ end
106
+
107
+
72
108
  def stat(filename)
73
109
  return stat_without_vfs(filename) if ( File.exist_without_vfs?( filename ) )
74
110
 
@@ -88,17 +124,8 @@ class File
88
124
  def exist?(filename)
89
125
  return true if exist_without_vfs?( filename )
90
126
 
91
- vfs_url, child_path = VFS.resolve_within_archive(filename)
92
- return false unless vfs_url
93
-
94
- begin
95
- virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
96
- virtual_file = virtual_file.get_child( child_path ) if child_path
97
-
98
- return ( ( ! virtual_file.nil? ) && virtual_file.exists() )
99
- rescue Java::JavaIo::IOException => e
100
- return false
101
- end
127
+ virtual_file = virtual_file(filename)
128
+ !virtual_file.nil? && virtual_file.exists?
102
129
  end
103
130
 
104
131
  def writable?(filename)
@@ -110,38 +137,25 @@ class File
110
137
  def directory?(filename)
111
138
  return true if directory_without_vfs?( filename )
112
139
 
113
- vfs_url, child_path = VFS.resolve_within_archive(filename)
114
- return false unless vfs_url
115
-
116
- begin
117
- virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
118
- virtual_file = virtual_file.get_child( child_path ) if child_path
119
-
120
- return ( ( ! virtual_file.nil? ) && ( virtual_file.isDirectory() ) )
121
- rescue Java::JavaIo::IOException => e
122
- return false
123
- end
140
+ virtual_file = virtual_file(filename)
141
+ !virtual_file.nil? && virtual_file.is_directory?
124
142
  end
125
143
 
126
144
  def file?(filename)
127
145
  return true if file_without_vfs?( filename )
128
146
 
129
- vfs_url, child_path = VFS.resolve_within_archive(filename)
130
- return false unless vfs_url
131
-
132
- begin
133
- virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
134
- virtual_file = virtual_file.get_child( child_path ) if child_path
135
-
136
- return ( ( ! virtual_file.nil? ) && ( virtual_file.isLeaf() ) )
137
- rescue Java::JavaIo::IOException => e
138
- return false
139
- end
147
+ virtual_file = virtual_file(filename)
148
+ !virtual_file.nil? && virtual_file.is_leaf?
140
149
  end
141
150
 
142
151
  def chmod(mode_int, *files)
143
152
  files.each do |name|
144
- chmod_without_vfs( mode_int, name_without_vfs(name) )
153
+ begin
154
+ chmod_without_vfs( mode_int, name_without_vfs(name) )
155
+ rescue Errno::ENOENT => e
156
+ name = VFS.writable_path_or_error( name, e )
157
+ chmod_without_vfs( mode_int, name )
158
+ end
145
159
  end
146
160
  end
147
161
 
@@ -163,16 +177,21 @@ class File
163
177
 
164
178
  def dirname(filename)
165
179
  dirname = dirname_without_vfs(name_without_vfs(filename))
166
- vfs_path?(filename) ? "vfs:#{dirname}" : dirname
180
+ vfs_path?(filename) ? VFS.resolve_path_url(dirname) : dirname
167
181
  end
168
182
 
169
183
  def name_without_vfs(filename)
170
- vfs_path?(filename) ? filename[4..-1] : filename
184
+ name = filename.to_s.gsub("\\", "/")
185
+ vfs_path?(name) ? name[4..-1] : name
171
186
  end
172
187
 
173
188
  def vfs_path?(path)
174
189
  path.to_s =~ /^vfs:/
175
190
  end
191
+
192
+ def virtual_file(filename)
193
+ VFS.virtual_file(filename)
194
+ end
176
195
  end
177
196
 
178
197
  end
@@ -0,0 +1,32 @@
1
+
2
+ module FileTest
3
+
4
+ class << self
5
+
6
+ def directory?(filename)
7
+ File.directory?(filename)
8
+ end
9
+
10
+ def exist?(filename)
11
+ File.exist?(filename)
12
+ end
13
+
14
+ def exists?(filename)
15
+ File.exists?(filename)
16
+ end
17
+
18
+ def file?(filename)
19
+ File.file?(filename)
20
+ end
21
+
22
+ def readable?(filename)
23
+ File.readable?(filename)
24
+ end
25
+
26
+ def writable?(filename)
27
+ File.writable?(filename)
28
+ end
29
+
30
+ end
31
+
32
+ end
data/lib/vfs/ext/io.rb CHANGED
@@ -69,6 +69,9 @@ class IO
69
69
  end
70
70
  end
71
71
 
72
+ # VFS doesn't correctly handle relative paths when
73
+ # retrieving the physical file so expand it
74
+ fd = File.expand_path( fd )
72
75
  virtual_file = org.jboss.vfs.VFS.child( fd )
73
76
 
74
77
  if ( ! create && ! virtual_file.exists )
@@ -83,9 +86,9 @@ class IO
83
86
  java_out = java.io::FileOutputStream.new( physical_file, append )
84
87
  ruby_io = java_out.to_io
85
88
  elsif ( read && write )
86
- raise Error.new( "Random-access on VFS not supported" )
89
+ raise Error.new( "Random-access on VFS not supported" )
87
90
  end
88
-
91
+
89
92
  if ( block )
90
93
  begin
91
94
  block.call( ruby_io )
@@ -101,7 +104,7 @@ class IO
101
104
  def read(name, length=nil, offset=nil)
102
105
  return read_without_vfs(name, length, offset) if ::File.exist_without_vfs?( name )
103
106
 
104
- if ( name =~ /^\// || name =~ /^vfs:\// )
107
+ if ( name =~ /^\// || name =~ /^vfs:\// )
105
108
  full_path = name
106
109
  else
107
110
  full_path = File.join( Dir.pwd, name )
@@ -110,7 +113,7 @@ class IO
110
113
  raise ::Errno::ENOENT.new( "#{name} (#{virtual_file})" ) unless virtual_file.exists()
111
114
 
112
115
  stream = virtual_file.openStream()
113
- io = stream.to_io
116
+ io = stream.to_io
114
117
  begin
115
118
  s = io.read
116
119
  ensure
@@ -0,0 +1,23 @@
1
+ class Java::java.sql::DriverManager
2
+ class << self
3
+ alias_method :get_connection_without_vfs, :getConnection
4
+ alias_method :register_driver_without_vfs, :registerDriver
5
+
6
+ def getConnection(url, user, pass)
7
+ url = url.sub(':vfs:', ':')
8
+ get_connection_without_vfs(url, user, pass)
9
+ rescue => e
10
+ # If we didn't register a driver, throw the exception
11
+ raise e unless @driver
12
+ # If we did register a driver, try to connection using it directly
13
+ props = java.util.Properties.new
14
+ props.setProperty("user", user)
15
+ props.setProperty("password", pass)
16
+ @driver.connect(url, props)
17
+ end
18
+
19
+ def registerDriver(driver)
20
+ @driver = driver
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ require 'pathname'
2
+
3
+ class Pathname
4
+
5
+ alias_method :realpath_without_vfs, :realpath
6
+
7
+ def realpath
8
+ vfs_path? ? expand_path : realpath_without_vfs
9
+ end
10
+
11
+ def vfs_path?
12
+ @path.to_s =~ /^vfs:/
13
+ end
14
+ end
data/lib/vfs/ext/vfs.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  class Java::org.jboss.vfs::VFS
3
3
  def self.child(uri_str)
4
- uri = java.net.URI.new( uri_str.gsub('#', '%23') )
4
+ uri = java.net.URI.new( uri_str.gsub('#', '%23').gsub(' ', '%20') )
5
5
  child = self.getChild( uri )
6
6
  child
7
7
  end
data/lib/vfs/file.rb CHANGED
@@ -47,7 +47,7 @@ module VFS
47
47
  end
48
48
 
49
49
  def directory?
50
- @virtual_file.eixsts && ! @virtual_file.is_leaf
50
+ @virtual_file.exists && ! @virtual_file.is_leaf
51
51
  end
52
52
 
53
53
  def executable?
@@ -5,7 +5,6 @@ module VFS
5
5
  include Java::org.jboss.vfs.VirtualFileFilter
6
6
 
7
7
  def initialize(child_path, glob)
8
- #puts "init #{child_path} #{glob}"
9
8
  @child_path = child_path
10
9
  glob_segments = glob.split( '/' )
11
10
  regexp_segments = []
@@ -14,7 +13,14 @@ module VFS
14
13
  if ( gs == '**' )
15
14
  regexp_segments << '(.*)'
16
15
  else
17
- gs.gsub!( /\*/, '[^\/]*')
16
+ gs.gsub!( /\./, '\.')
17
+ gs.gsub!( /\*/ ) do |m|
18
+ if ( $` == '' )
19
+ '([^\/\.][^\/]*)?'
20
+ else
21
+ '[^\/]*'
22
+ end
23
+ end
18
24
  gs.gsub!( /\?/, '.')
19
25
  gs.gsub!( /\{[^\}]+\}/ ) do |m|
20
26
  options = m[1..-2].split(',', -1)
@@ -29,20 +35,21 @@ module VFS
29
35
  end
30
36
 
31
37
  regexp_str = regexp_segments.join
32
- #puts "regexp_str(1) [#{regexp_str}]"
33
38
  if ( @child_path && @child_path != '' )
34
- regexp_str = ::File.join( "^#{@child_path}", "#{regexp_str}$" )
39
+ #regexp_str = ::File.join( "^#{@child_path}", "#{regexp_str}$" )
40
+ if ( @child_path[-1,1] == '/' )
41
+ regexp_str = "^#{@child_path}#{regexp_str}$"
42
+ else
43
+ regexp_str = "^#{@child_path}/#{regexp_str}$"
44
+ end
35
45
  else
36
46
  regexp_str = "^#{regexp_str}$"
37
47
  end
38
- #puts "regexp_str(2) [#{regexp_str}]"
39
48
  @regexp = Regexp.new( regexp_str )
40
49
  end
41
50
 
42
51
  def accepts(file)
43
- #puts "accepts(#{file.path_name}) vs #{@regexp}"
44
52
  acceptable = ( !!( file.path_name =~ @regexp ) )
45
- #puts " -> #{acceptable}"
46
53
  !!( file.path_name =~ @regexp )
47
54
  end
48
55
  end
data/lib/vfs.rb CHANGED
@@ -10,18 +10,21 @@ require 'vfs/glob_filter'
10
10
  require 'vfs/ext/vfs'
11
11
  require 'vfs/ext/io'
12
12
  require 'vfs/ext/file'
13
+ require 'vfs/ext/file_test'
13
14
  require 'vfs/ext/dir'
15
+ require 'vfs/ext/pathname'
14
16
  require 'vfs/ext/kernel'
17
+ require 'vfs/ext/jdbc'
15
18
 
16
19
 
17
20
  module ::VFS
18
21
  def self.resolve_within_archive(path)
19
- return path if ( path =~ %r(^vfs:) )
20
22
  path = path.to_s
23
+ return path if ( path =~ %r(^vfs:) )
21
24
  cur = path
22
25
  while ( cur != '.' && cur != '/' )
23
26
  if ( ::File.exist_without_vfs?( cur ) )
24
-
27
+
25
28
  child_path = path[cur.length..-1]
26
29
 
27
30
  if ( cur[-1,1] == '/' )
@@ -35,7 +38,7 @@ module ::VFS
35
38
  end
36
39
 
37
40
  def self.resolve_path_url(path)
38
- prefix = case
41
+ prefix = case
39
42
  when path =~ /^\// # unix absolute
40
43
  "vfs:"
41
44
  when path =~ /^[[:alpha:]]:/ # windows absolute
@@ -46,4 +49,31 @@ module ::VFS
46
49
  "#{prefix}#{path}"
47
50
  end
48
51
 
52
+ def self.virtual_file(filename)
53
+ vfs_url, child_path = VFS.resolve_within_archive( filename )
54
+ return nil unless vfs_url
55
+
56
+ begin
57
+ virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
58
+ virtual_file = virtual_file.get_child( child_path ) if child_path
59
+ virtual_file
60
+ rescue Java::JavaIo::IOException => e
61
+ nil
62
+ end
63
+ end
64
+
65
+ def self.writable_path_or_error(path, e)
66
+ virtual_file = VFS.virtual_file( path )
67
+ raise e if virtual_file.nil?
68
+ mount = Java::org.jboss.vfs::VFS.get_mount(virtual_file)
69
+ # TODO: Replace with a better error stating the issue, which is
70
+ # the user is trying to write to a filesystem inside an archive
71
+ # that is mounted as readonly
72
+ #
73
+ # HACK: For some reason mount.file_system doesn't work inside TB
74
+ # but does in tests
75
+ # raise e if mount.file_system.read_only?
76
+ virtual_file.physical_file.path
77
+ end
78
+
49
79
  end
data/spec/dir_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
 
2
+ require 'fileutils'
2
3
  require File.dirname(__FILE__) + '/spec_helper.rb'
3
4
 
4
5
  describe "Dir extensions for VFS" do
@@ -33,16 +34,23 @@ describe "Dir extensions for VFS" do
33
34
  items.should include File.join( "vfs:#{@archive1_path}", 'web.xml' )
34
35
  items.should include File.join( "vfs:#{@archive1_path}", 'lib' )
35
36
  end
36
-
37
+
37
38
  it "should allow globbing within nested archives with explicit vfs" do
38
39
  pattern = "vfs:#{@archive2_path}/*"
39
40
  items = Dir.glob( pattern )
40
41
  items.should_not be_empty
41
42
  items.should include "vfs:#{@archive2_path}/manifest.txt"
42
43
  end
44
+
45
+ it "should create new Dirs" do
46
+ lambda {
47
+ Dir.new("vfs:#{@archive2_path}")
48
+ }.should_not raise_error
49
+ end
43
50
  end
44
-
45
- [ :absolute, :relative ].each do |style|
51
+
52
+ [ :absolute, :relative, :vfs ].each do |style|
53
+ #[ :relative ].each do |style|
46
54
  describe "with #{style} paths" do
47
55
 
48
56
  case ( style )
@@ -50,6 +58,25 @@ describe "Dir extensions for VFS" do
50
58
  prefix = "./#{TEST_DATA_BASE}"
51
59
  when :absolute
52
60
  prefix = File.expand_path( File.join( File.dirname( __FILE__ ), '..', TEST_DATA_BASE ) )
61
+ when :vfs
62
+ prefix = "vfs:" + File.expand_path( File.join( File.dirname( __FILE__ ), '..', TEST_DATA_BASE ) )
63
+ end
64
+
65
+ it "should ignore dotfiles by default" do
66
+ items = Dir.glob( "#{prefix}/dotfiles/*" )
67
+ items.should_not be_empty
68
+ items.size.should eql(3)
69
+ items.should include( "#{prefix}/dotfiles/one" )
70
+ items.should include( "#{prefix}/dotfiles/three" )
71
+ items.should include( "#{prefix}/dotfiles/foo.txt" )
72
+ end
73
+
74
+ it "should match dotfiles if explicitly asked" do
75
+ items = Dir.glob( "#{prefix}/dotfiles/.*" )
76
+ items.should_not be_empty
77
+ items.size.should eql(2)
78
+ items.should include( "#{prefix}/dotfiles/.two" )
79
+ items.should include( "#{prefix}/dotfiles/.four" )
53
80
  end
54
81
 
55
82
  it "should allow globbing without any special globbing characters on normal files" do
@@ -57,7 +84,7 @@ describe "Dir extensions for VFS" do
57
84
  items.should_not be_empty
58
85
  items.should include( "#{prefix}/home/larry" )
59
86
  end
60
-
87
+
61
88
  it "should allow globbing without any special globbing characters on a single normal file" do
62
89
  items = Dir.glob( "#{prefix}/home/larry/file1.txt" )
63
90
  items.should_not be_empty
@@ -91,7 +118,7 @@ describe "Dir extensions for VFS" do
91
118
  it "should allow appropriate globbing of normal files" do
92
119
  items = Dir.glob( "#{prefix}/home/larry/*" )
93
120
  items.should_not be_empty
94
- items.should include( "#{prefix}/home/larry/file1.txt" )
121
+ items.should include( "#{prefix}/home/larry/file1.txt" )
95
122
  items.should include( "#{prefix}/home/larry/file2.txt" )
96
123
  items.should include( "#{prefix}/home/larry/archive1.jar" )
97
124
  end
@@ -100,14 +127,14 @@ describe "Dir extensions for VFS" do
100
127
  items = Dir.glob( "#{@archive1_path}/*" )
101
128
  items.should_not be_empty
102
129
  end
103
-
130
+
104
131
  it "should determine if VFS is needed for nested archives" do
105
132
  base = "#{prefix}/home/larry/archive1.jar/lib/archive2.jar"
106
133
  items = Dir.glob( "#{base}/*" )
107
134
  items.should_not be_empty
108
135
  items.should include( "#{base}/manifest.txt" )
109
136
  end
110
-
137
+
111
138
  it "should determine if VFS is needed with relative paths" do
112
139
  base = "#{prefix}/home/larry/archive1.jar/lib/archive2.jar"
113
140
  items = Dir.glob( "#{base}/*" )
@@ -153,6 +180,31 @@ describe "Dir extensions for VFS" do
153
180
  items.should_not include( "#{prefix}/home/larry/archive1.jar/lib/archive4.txt" )
154
181
  end
155
182
 
183
+ it "should create new Dirs" do
184
+ lambda {
185
+ Dir.new(prefix)
186
+ }.should_not raise_error
187
+ end
188
+
189
+ end
190
+ end
191
+
192
+ describe "mkdir" do
193
+ it "should mkdir inside vfs archive when directory mounted on filesystem" do
194
+ FileUtils.rm_rf "target/mnt"
195
+ archive = org.jboss.vfs::VFS.child( @archive1_path )
196
+ logical = archive.getChild( "lib" )
197
+ physical = java.io::File.new( "target/mnt" )
198
+ physical.mkdirs
199
+ mount = org.jboss.vfs::VFS.mountReal( physical, logical )
200
+ begin
201
+ lambda {
202
+ Dir.mkdir("#{@archive1_path}/lib/should_mkdir_inside_vfs_archive")
203
+ File.directory?("target/mnt/should_mkdir_inside_vfs_archive").should be_true
204
+ }.should_not raise_error
205
+ ensure
206
+ mount.close
207
+ end
156
208
  end
157
209
  end
158
210
 
data/spec/file_spec.rb CHANGED
@@ -40,19 +40,33 @@ describe "File extensions for VFS" do
40
40
  File.writable?( url ).should be_true
41
41
  end
42
42
 
43
- it "should expand paths relative to VFS urls as absolute" do
44
- absolute = File.expand_path("db/development.sqlite3", "vfs:/path/to/app")
45
- absolute.should eql("/path/to/app/db/development.sqlite3")
46
- end
43
+ describe "expand_path" do
44
+ it "should handle relative non-vfs path" do
45
+ File.expand_path("../foo", "/tmp/bar").should == "/tmp/foo"
46
+ end
47
47
 
48
- it "should expand paths relative to VFS pathnames as absolute" do
49
- absolute = File.expand_path("db/development.sqlite3", Pathname.new("vfs:/path/to/app"))
50
- absolute.should eql("/path/to/app/db/development.sqlite3")
51
- end
48
+ it "should handle relative to vfs path" do
49
+ File.expand_path("../foo", "vfs:/tmp/bar").should == "vfs:/tmp/foo"
50
+ end
51
+
52
+ it "should expand paths relative to VFS urls as VFS" do
53
+ absolute = File.expand_path("db/development.sqlite3", "vfs:/path/to/app")
54
+ absolute.should eql("vfs:/path/to/app/db/development.sqlite3")
55
+ end
52
56
 
53
- it "should expand absolute Pathname objects correctly" do
54
- File.expand_path("vfs:/foo").should eql("vfs:/foo")
55
- File.expand_path(Pathname.new("vfs:/foo")).should eql("vfs:/foo")
57
+ it "should expand paths relative to VFS pathnames as VFS" do
58
+ absolute = File.expand_path("db/development.sqlite3", Pathname.new("vfs:/path/to/app"))
59
+ absolute.should eql("vfs:/path/to/app/db/development.sqlite3")
60
+ end
61
+
62
+ it "should expand absolute Pathname objects correctly" do
63
+ File.expand_path("vfs:/foo").should eql("vfs:/foo")
64
+ File.expand_path(Pathname.new("vfs:/foo")).should eql("vfs:/foo")
65
+ end
66
+
67
+ it "should return first path when given two vfs paths" do
68
+ File.expand_path("vfs:/tmp/foo", "vfs:/tmp/bar").should == "vfs:/tmp/foo"
69
+ end
56
70
  end
57
71
 
58
72
  it "should handle vfs urls as readable" do
@@ -60,6 +74,16 @@ describe "File extensions for VFS" do
60
74
  File.readable?( "vfs:#{__FILE__}" ).should be_true
61
75
  end
62
76
 
77
+ it "should report readable-ness for files inside vfs archives" do
78
+ path = "vfs:#{@archive1_path}/web.xml"
79
+ File.readable?( path ).should be_true
80
+ end
81
+
82
+ it "should report readable-ness for non-existent files inside vfs archives" do
83
+ path = "vfs:#{@archive1_path}/file_that_does_not_exist.txt"
84
+ File.readable?( path ).should be_false
85
+ end
86
+
63
87
  it "should handle #'s in filenames properly" do
64
88
  prefix = File.expand_path( File.join( File.dirname( __FILE__ ), '..', TEST_COPY_BASE ) )
65
89
  File.file?( "#{prefix}/#bad-uri#" ).should be_true
@@ -67,13 +91,26 @@ describe "File extensions for VFS" do
67
91
  File.file?( "vfs:#{prefix}/#missing#" ).should be_false
68
92
  end
69
93
 
94
+ it "should handle spaces in filenames properly" do
95
+ prefix = File.expand_path( File.join( File.dirname( __FILE__ ), '..', TEST_COPY_BASE ) )
96
+ File.file?( "#{prefix}/sound of music/flibbity jibbit" ).should be_true
97
+ File.file?( "vfs:#{prefix}/sound of music/flibbity jibbit" ).should be_true
98
+ File.file?( "vfs:#{prefix}/sound of music/flibberty gibbet" ).should be_false
99
+ end
100
+
101
+ it "should handle backslashes in filenames even though there's no good reason to use them regardless of platform" do
102
+ filename = __FILE__.gsub("/","\\")
103
+ File.readable?( filename ).should be_true
104
+ File.readable?( "vfs:#{filename}" ).should be_true
105
+ end
106
+
70
107
  it "should be able to chmod real files with vfs urls" do
71
108
  path = File.expand_path("foo")
72
109
  begin
73
110
  f = File.new(path, "w")
74
- FileUtils.chmod( 666, "vfs:#{path}")
111
+ FileUtils.chmod( 0666, "vfs:#{path}")
75
112
  m1 = f.stat.mode
76
- FileUtils.chmod( 644, "vfs:#{path}")
113
+ FileUtils.chmod( 0644, "vfs:#{path}")
77
114
  m2 = f.stat.mode
78
115
  m1.should_not eql(m2)
79
116
  ensure
@@ -81,6 +118,28 @@ describe "File extensions for VFS" do
81
118
  end
82
119
  end
83
120
 
121
+ it "should chmod inside vfs archive when directory mounted on filesystem" do
122
+ FileUtils.rm_rf "target/mnt"
123
+ archive = org.jboss.vfs::VFS.child( @archive1_path )
124
+ logical = archive.getChild( "lib" )
125
+ physical = java.io::File.new( "target/mnt" )
126
+ physical.mkdirs
127
+ mount = org.jboss.vfs::VFS.mountReal( physical, logical )
128
+ path = "#{@archive1_path}/lib/chmod_test"
129
+ begin
130
+ lambda {
131
+ f = File.new ("target/mnt/chmod_test", "w" )
132
+ FileUtils.chmod( 0666, path )
133
+ m1 = f.stat.mode
134
+ FileUtils.chmod( 0755, path )
135
+ m2 = f.stat.mode
136
+ m1.should_not eql(m2)
137
+ }.should_not raise_error
138
+ ensure
139
+ mount.close
140
+ end
141
+ end
142
+
84
143
  it "should be able to create new files with vfs urls" do
85
144
  lambda {
86
145
  File.new("vfs:#{__FILE__}", 'r')
@@ -95,13 +154,18 @@ describe "File extensions for VFS" do
95
154
 
96
155
  describe "open" do
97
156
  it "should return File when called on File with VFS url" do
98
- puts @archive1_path
99
157
  File.open("vfs:#{@archive1_path}", 'r').should be_an_instance_of(File)
100
158
  end
101
159
 
102
160
  it "should return File when called on File without VFS url" do
103
161
  File.open(@archive1_path, 'r').should be_an_instance_of(File)
104
162
  end
163
+
164
+ it "should find files by pathnames" do
165
+ lambda {
166
+ File.open(Pathname.new(@archive1_path), 'r')
167
+ }.should_not raise_error
168
+ end
105
169
  end
106
170
 
107
171
  describe "new" do
@@ -112,6 +176,11 @@ describe "File extensions for VFS" do
112
176
  it "should return File when called on File without VFS url" do
113
177
  File.new(@archive1_path, 'r').should be_an_instance_of(File)
114
178
  end
179
+
180
+ xit "should create objects that respond to lstat for files in an archive" do
181
+ file = File.new( "vfs:#{@archive1_path}/web.xml")
182
+ file.lstat.should_not be_nil
183
+ end
115
184
  end
116
185
 
117
186
  [ :absolute, :relative, :vfs ].each do |style|
@@ -125,6 +194,31 @@ describe "File extensions for VFS" do
125
194
  prefix = "vfs:#{File.expand_path( File.join( File.dirname( __FILE__ ), '..', TEST_COPY_BASE ) )}"
126
195
  end
127
196
 
197
+ it "should provide size for normal files" do
198
+ s = File.size( "#{prefix}/home/larry/file1.txt" )
199
+ s.should_not be_nil
200
+ s.should be > 0
201
+ end
202
+
203
+ it "should throw NOENT for size of non-existant files" do
204
+ lambda {
205
+ File.size( "#{prefix}/home/larry/NOT_REALLY_file1.txt" )
206
+ }.should raise_error
207
+ end
208
+
209
+ it "should provide size? for normal files" do
210
+ s = File.size?( "#{prefix}/home/larry/file1.txt" )
211
+ s.should_not be_nil
212
+ s.should be > 0
213
+ end
214
+
215
+ it "should not throw NOENT for size? of non-existant files" do
216
+ lambda {
217
+ s = File.size?( "#{prefix}/home/larry/NOT_REALLY_file1.txt" )
218
+ s.should be_nil
219
+ }.should_not raise_error
220
+ end
221
+
128
222
  it "should provide mtime for normal files" do
129
223
  mtime = File.mtime( "#{prefix}/home/larry/file1.txt" )
130
224
  mtime.should_not be_nil
@@ -152,11 +246,18 @@ describe "File extensions for VFS" do
152
246
  contents.should eql( "This is file 1\nhowdy\n" )
153
247
 
154
248
  fs_file = File.join( File.dirname(__FILE__), '..', TEST_COPY_BASE, 'home/larry/file1.txt' )
155
- puts "confirm from #{fs_file}"
156
249
  fs_contents = File.read( fs_file )
157
250
  fs_contents.should eql( "This is file 1\nhowdy\n" )
158
251
  end
159
252
 
253
+ it "should allow writing new files via File.open" do
254
+ File.open( "#{prefix}/home/larry/new_file.txt", 'w' ) do |file|
255
+ file.puts "howdy"
256
+ end
257
+ contents = File.read( "#{prefix}/home/larry/new_file.txt" )
258
+ contents.should eql( "howdy\n")
259
+ end
260
+
160
261
  it "should allow stat for normal files" do
161
262
  file = "#{prefix}/home/larry/file1.txt"
162
263
  stat = File.stat( file )
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "File extensions for VFS" do
4
+
5
+ it "should delegate to File.directory?" do
6
+ delegate_to_file(:directory?, 'file')
7
+ end
8
+
9
+ it "should delegate to File.exist?" do
10
+ delegate_to_file(:exist?, 'file')
11
+ end
12
+
13
+ it "should delegate to File.exists?" do
14
+ delegate_to_file(:exists?, 'file')
15
+ end
16
+
17
+ it "should delegate to File.file?" do
18
+ delegate_to_file(:file?, 'file')
19
+ end
20
+
21
+ it "should delegate to File.readable?" do
22
+ delegate_to_file(:readable?, 'file')
23
+ end
24
+
25
+ it "should delegate to File.writable?" do
26
+ delegate_to_file(:writable?, 'file')
27
+ end
28
+
29
+ def delegate_to_file(*args)
30
+ method = args.shift
31
+ File.should_receive(method).with(*args).and_return('value')
32
+ FileTest.send(method, *args).should == 'value'
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+
2
+ require File.dirname(__FILE__) + '/spec_helper.rb'
3
+ require 'pathname'
4
+
5
+ describe "Pathname extensions for VFS" do
6
+
7
+ describe "realpath" do
8
+ it "should expand VFS paths" do
9
+ pathname = Pathname.new("vfs:/tmp/test")
10
+ pathname.should_receive(:expand_path).and_return(Pathname.new("/expanded/path"))
11
+ pathname.realpath.to_s.should == "/expanded/path"
12
+ end
13
+
14
+ it "should find real path for non-VFS paths" do
15
+ pathname = Pathname.new("/tmp/test")
16
+ pathname.should_receive(:realpath_without_vfs).and_return(Pathname.new("/real/path"))
17
+ pathname.realpath.to_s.should == "/real/path"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+
2
+ require File.dirname(__FILE__) + '/spec_helper.rb'
3
+
4
+ describe "VFS::Dir" do
5
+
6
+ before(:each) do
7
+ @executor = java.util.concurrent::Executors.newScheduledThreadPool( 1 )
8
+ @temp_file_provider = org.jboss.vfs::TempFileProvider.create( "vfs-test", @executor )
9
+ @archive1_path = File.expand_path( "#{TEST_DATA_DIR}/home/larry/archive1.jar" )
10
+ @archive1_file = org.jboss.vfs::VFS.child( @archive1_path )
11
+ @archive1_mount_point = org.jboss.vfs::VFS.child( @archive1_path )
12
+ @archive1_handle = org.jboss.vfs::VFS.mountZip( @archive1_file, @archive1_mount_point, @temp_file_provider )
13
+ end
14
+
15
+ after(:each) do
16
+ @archive1_handle.close
17
+ end
18
+
19
+ describe "entries" do
20
+ it "should find vfs entries outside of archives" do
21
+ path = "#{@archive1_path}/.."
22
+ ::Dir.new( path ).entries.should == VFS::Dir.new( "vfs:#{path}" ).entries
23
+ end
24
+
25
+ it "should find vfs entries inside of archives" do
26
+ path = "vfs:#{@archive1_path}/other_lib/subdir"
27
+ entries = VFS::Dir.new( path ).entries
28
+ entries.size.should == 1
29
+ entries.first.should == "archive6.jar"
30
+ end
31
+ end
32
+ end
data/spec/vfs_spec.rb CHANGED
@@ -1,20 +1,31 @@
1
+ require 'pathname'
1
2
 
2
3
  describe "VFS path resolution" do
3
4
 
4
- it "should prefix relative paths with the current dir" do
5
- cwd = Dir.pwd
6
- path = VFS.resolve_path_url( "foo/bar" )
7
- path.should match /^vfs:#{cwd}\/foo\/bar$/
5
+ describe "resolve_within_archive" do
6
+ it "should return pathnames with vfs: prefix unmodified" do
7
+ pathname = Pathname.new("vfs:/tmp/foo")
8
+ path = VFS.resolve_within_archive(pathname)
9
+ path.should == pathname.to_s
10
+ end
8
11
  end
9
12
 
10
- it "should not prefix absolute paths with the current dir" do
11
- path = VFS.resolve_path_url( "/foo/bar" )
12
- path.should match /^vfs:\/foo\/bar$/
13
- end
13
+ describe "resolve_path_url" do
14
+ it "should prefix relative paths with the current dir" do
15
+ cwd = Dir.pwd
16
+ path = VFS.resolve_path_url( "foo/bar" )
17
+ path.should match /^vfs:#{cwd}\/foo\/bar$/
18
+ end
19
+
20
+ it "should not prefix absolute paths with the current dir" do
21
+ path = VFS.resolve_path_url( "/foo/bar" )
22
+ path.should match /^vfs:\/foo\/bar$/
23
+ end
14
24
 
15
- it "should treat paths with windows drive letters as absolute" do
16
- path = VFS.resolve_path_url( "C:/foo/bar" )
17
- path.should match /^vfs:\/C:\/foo\/bar$/
25
+ it "should treat paths with windows drive letters as absolute" do
26
+ path = VFS.resolve_path_url( "C:/foo/bar" )
27
+ path.should match /^vfs:\/C:\/foo\/bar$/
28
+ end
18
29
  end
19
30
 
20
31
  end
metadata CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
6
6
  - 1
7
7
  - 0
8
8
  - 0
9
- - Beta22
10
- version: 1.0.0.Beta22
9
+ - Beta23
10
+ version: 1.0.0.Beta23
11
11
  platform: ruby
12
12
  authors: []
13
13
 
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-30 00:00:00 -05:00
18
+ date: 2010-12-06 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -62,13 +62,19 @@ files:
62
62
  - lib/vfs/glob_filter.rb
63
63
  - lib/vfs/ext/dir.rb
64
64
  - lib/vfs/ext/file.rb
65
+ - lib/vfs/ext/file_test.rb
65
66
  - lib/vfs/ext/io.rb
67
+ - lib/vfs/ext/jdbc.rb
66
68
  - lib/vfs/ext/kernel.rb
69
+ - lib/vfs/ext/pathname.rb
67
70
  - lib/vfs/ext/vfs.rb
68
71
  - spec/dir_spec.rb
69
72
  - spec/file_spec.rb
73
+ - spec/file_test_spec.rb
70
74
  - spec/io_spec.rb
75
+ - spec/pathname_spec.rb
71
76
  - spec/spec_helper.rb
77
+ - spec/vfs_dir_spec.rb
72
78
  - spec/vfs_spec.rb
73
79
  has_rdoc: true
74
80
  homepage: http://www.torquebox.org/vfs/
@@ -105,5 +111,8 @@ summary: TorqueBox VFS
105
111
  test_files:
106
112
  - spec/dir_spec.rb
107
113
  - spec/file_spec.rb
114
+ - spec/file_test_spec.rb
108
115
  - spec/io_spec.rb
116
+ - spec/pathname_spec.rb
117
+ - spec/vfs_dir_spec.rb
109
118
  - spec/vfs_spec.rb