rfusefs 1.0.0 → 1.0.1.RC0
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/.gitignore +1 -1
- data/.travis.yml +8 -0
- data/README.rdoc +13 -21
- data/Rakefile +1 -0
- data/lib/fuse/fusedir.rb +15 -0
- data/lib/fuse/rfusefs-fuse.rb +26 -8
- data/lib/fusefs/metadir.rb +2 -1
- data/lib/fusefs/pathmapper.rb +185 -56
- data/lib/fusefs/sqlitemapper.rb +125 -0
- data/lib/rfusefs/version.rb +1 -1
- data/lib/rfusefs.rb +55 -1
- data/rfusefs.gemspec +30 -0
- data/spec/metadir_spec.rb +24 -24
- data/spec/mount_unmount_spec.rb +21 -0
- data/spec/pathmapper_spec.rb +143 -53
- data/spec/rfusefs_spec.rb +23 -1
- data/spec/sample_spec.rb +9 -9
- data/spec/spec_helper.rb +0 -5
- data/spec/sqlitemapper_spec.rb +135 -0
- metadata +49 -9
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'sqlite3'
|
4
|
+
require 'pathname'
|
5
|
+
require "fusefs/sqlitemapper"
|
6
|
+
|
7
|
+
class SQLFixture
|
8
|
+
|
9
|
+
SQL = "select * from files"
|
10
|
+
|
11
|
+
attr_reader :tmpdir
|
12
|
+
attr_reader :db
|
13
|
+
def initialize()
|
14
|
+
@tmpdir = Pathname.new(Dir.mktmpdir("rfusefs_sqlitemapper"))
|
15
|
+
@db_path = @tmpdir + "test.db"
|
16
|
+
@db = SQLite3::Database.new(@db_path.to_s)
|
17
|
+
@db.execute <<-SQL
|
18
|
+
create table files (
|
19
|
+
real_path varchar(120),
|
20
|
+
mapped_path varchar(120)
|
21
|
+
);
|
22
|
+
SQL
|
23
|
+
|
24
|
+
pathmap("hello.txt","/textfiles/hello")
|
25
|
+
pathmap("mysong.mp3","/artist/album/mysong.mp3")
|
26
|
+
pathmap("apicture.jpeg","/pictures/201103/apicture.jpg")
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def pathmap(real_file,mapped_path)
|
31
|
+
real_path = (@tmpdir + real_file).to_s
|
32
|
+
File.open(real_path,"w") do |f|
|
33
|
+
f << mapped_path
|
34
|
+
end
|
35
|
+
@db.execute "insert into files values ( ?, ? )", real_path,mapped_path
|
36
|
+
end
|
37
|
+
|
38
|
+
def unpathmap(mapped_path)
|
39
|
+
@db.execute("delete from files where mapped_path = ?", mapped_path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def db_force_write
|
43
|
+
@db.close unless @db.closed?
|
44
|
+
@db = SQLite3::Database.new(@db_path.to_s)
|
45
|
+
end
|
46
|
+
|
47
|
+
def fs
|
48
|
+
@fs ||= FuseFS::SqliteMapperFS.new(@db_path,SQL) do |row|
|
49
|
+
[ row['real_path'], row['mapped_path'] ]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def mount()
|
54
|
+
return @mountpoint if @mountpoint
|
55
|
+
@mountpoint = Pathname.new(Dir.mktmpdir("rfusefs_sqlitmapper_mnt"))
|
56
|
+
FuseFS.mount(fs,@mountpoint)
|
57
|
+
sleep 0.5
|
58
|
+
@mountpoint
|
59
|
+
end
|
60
|
+
|
61
|
+
def cleanup
|
62
|
+
@db.close
|
63
|
+
if @mountpoint
|
64
|
+
FuseFS.unmount(@mountpoint)
|
65
|
+
FileUtils.rmdir @mountpoint
|
66
|
+
end
|
67
|
+
FileUtils.rm_r(@tmpdir)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
describe "SqliteMapper" do
|
71
|
+
|
72
|
+
let(:fixture) { SQLFixture.new }
|
73
|
+
let(:fs) { fixture.fs }
|
74
|
+
|
75
|
+
after(:each) do
|
76
|
+
fixture.cleanup
|
77
|
+
end
|
78
|
+
|
79
|
+
context "filesystem outside FUSE" do
|
80
|
+
before(:each) do
|
81
|
+
fs.mounted()
|
82
|
+
sleep(0.5)
|
83
|
+
end
|
84
|
+
|
85
|
+
after(:each) do
|
86
|
+
fs.unmounted()
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should map files from a sqlite database" do
|
90
|
+
fs.directory?("/").should be_true
|
91
|
+
fs.directory?("/textfiles").should be_true
|
92
|
+
fs.directory?("/pictures/201103").should be_true
|
93
|
+
fs.file?("/textfiles/hello").should be_true
|
94
|
+
fs.directory?("/textfiles/hello").should be_false
|
95
|
+
fs.file?("/artist/album/mysong.mp3").should be_true
|
96
|
+
fs.directory?("/artist/album/mysong.mp3").should be_false
|
97
|
+
fs.file?("/some/unknown/path").should be_false
|
98
|
+
end
|
99
|
+
|
100
|
+
context "an updated database" do
|
101
|
+
|
102
|
+
it "should add new files" do
|
103
|
+
fixture.pathmap("added.txt","/textfiles/added.txt")
|
104
|
+
fixture.db_force_write()
|
105
|
+
sleep(0.3)
|
106
|
+
fs.file?("/textfiles/added.txt").should be_true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should remove files and directories no longer mapped" do
|
110
|
+
fixture.unpathmap("/textfiles/hello")
|
111
|
+
fixture.db_force_write()
|
112
|
+
sleep(0.3)
|
113
|
+
fs.file?("/textfiles/hello").should be_false
|
114
|
+
fs.directory?("/textfiles").should be_false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context "a real Fuse filesystem" do
|
119
|
+
before(:each) do
|
120
|
+
fs.use_raw_file_access = true
|
121
|
+
fs.allow_write = true
|
122
|
+
@mountpoint = fixture.mount
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should read files" do
|
126
|
+
|
127
|
+
hello_path = (@mountpoint + "textfiles/hello")
|
128
|
+
hello_path.open do |f|
|
129
|
+
f.read.should == "/textfiles/hello"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
metadata
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfusefs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.1.RC0
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Grant Gardner
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-12-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rfuse
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.0.4RC0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 1.0.4RC0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rake
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,6 +91,38 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: sqlite3
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rb-inotify
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
94
126
|
description: A more Ruby like way to write FUSE filesystems - inspired by (compatible
|
95
127
|
with) FuseFS, implemented over RFuse
|
96
128
|
email:
|
@@ -100,6 +132,7 @@ extensions: []
|
|
100
132
|
extra_rdoc_files: []
|
101
133
|
files:
|
102
134
|
- .gitignore
|
135
|
+
- .travis.yml
|
103
136
|
- Gemfile
|
104
137
|
- History.rdoc
|
105
138
|
- README.rdoc
|
@@ -111,8 +144,10 @@ files:
|
|
111
144
|
- lib/fusefs/dirlink.rb
|
112
145
|
- lib/fusefs/metadir.rb
|
113
146
|
- lib/fusefs/pathmapper.rb
|
147
|
+
- lib/fusefs/sqlitemapper.rb
|
114
148
|
- lib/rfusefs.rb
|
115
149
|
- lib/rfusefs/version.rb
|
150
|
+
- rfusefs.gemspec
|
116
151
|
- samples/demo.rb
|
117
152
|
- samples/dictfs.rb
|
118
153
|
- samples/hello.rb
|
@@ -122,10 +157,12 @@ files:
|
|
122
157
|
- samples/yamlfs.rb
|
123
158
|
- spec-fusefs/fusefs_spec.rb
|
124
159
|
- spec/metadir_spec.rb
|
160
|
+
- spec/mount_unmount_spec.rb
|
125
161
|
- spec/pathmapper_spec.rb
|
126
162
|
- spec/rfusefs_spec.rb
|
127
163
|
- spec/sample_spec.rb
|
128
164
|
- spec/spec_helper.rb
|
165
|
+
- spec/sqlitemapper_spec.rb
|
129
166
|
homepage: http://rubygems.org/gems/rfusefs
|
130
167
|
licenses: []
|
131
168
|
post_install_message:
|
@@ -138,12 +175,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
175
|
- - ! '>='
|
139
176
|
- !ruby/object:Gem::Version
|
140
177
|
version: '0'
|
178
|
+
segments:
|
179
|
+
- 0
|
180
|
+
hash: -2524811135440594792
|
141
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
182
|
none: false
|
143
183
|
requirements:
|
144
|
-
- - ! '
|
184
|
+
- - ! '>'
|
145
185
|
- !ruby/object:Gem::Version
|
146
|
-
version:
|
186
|
+
version: 1.3.1
|
147
187
|
requirements: []
|
148
188
|
rubyforge_project:
|
149
189
|
rubygems_version: 1.8.24
|