rfusefs 1.0.2.RC2 → 1.1.1.rc20201114.37
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +2 -0
- data/CHANGES.md +43 -0
- data/LICENSE +24 -0
- data/README.md +83 -0
- data/TODO.md +7 -0
- data/lib/fuse/fusedir.rb +17 -2
- data/lib/fuse/rfusefs-fuse.rb +446 -414
- data/lib/fusefs/metadir.rb +5 -5
- data/lib/fusefs/pathmapper.rb +22 -16
- data/lib/fusefs/sqlitemapper.rb +7 -2
- data/lib/rfusefs.rb +20 -48
- data/lib/rfusefs/version.rb +1 -1
- metadata +37 -76
- data/.gitignore +0 -9
- data/.travis.yml +0 -8
- data/Gemfile +0 -4
- data/History.rdoc +0 -28
- data/README.rdoc +0 -107
- data/Rakefile +0 -22
- data/TODO.txt +0 -6
- data/rfusefs.gemspec +0 -31
- data/samples/demo.rb +0 -57
- data/samples/dictfs.rb +0 -74
- data/samples/hello.rb +0 -20
- data/samples/openurifs.rb +0 -53
- data/samples/railsfs.rb +0 -77
- data/samples/sqlfs.rb +0 -134
- data/samples/yamlfs.rb +0 -168
- data/spec-fusefs/fusefs_spec.rb +0 -12
- data/spec/metadir_spec.rb +0 -364
- data/spec/mount_unmount_spec.rb +0 -21
- data/spec/pathmapper_spec.rb +0 -417
- data/spec/rfusefs_spec.rb +0 -497
- data/spec/sample_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -42
- data/spec/sqlitemapper_spec.rb +0 -135
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/History.rdoc
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
=== 1.0.1 / 2013-12-19
|
2
|
-
|
3
|
-
* Add FuseFS.main to create pretty usage messages
|
4
|
-
|
5
|
-
* Support extended attributes in filesystems
|
6
|
-
|
7
|
-
* Updates and cleanup of PathMapperFS
|
8
|
-
|
9
|
-
* Provide SqliteMapperFS
|
10
|
-
|
11
|
-
=== 1.0.0 / 2012-08-07
|
12
|
-
|
13
|
-
* Depend on new rfuse 1.0.0, Ruby 1.9
|
14
|
-
|
15
|
-
* API breaking changes
|
16
|
-
|
17
|
-
* order of arguments to {FuseFS.mount}, {FuseFS.start} changed
|
18
|
-
to account for better option handling in RFuse
|
19
|
-
|
20
|
-
=== 0.8.0 / 2011-02-19
|
21
|
-
|
22
|
-
* Initial port from fusefs
|
23
|
-
|
24
|
-
* Improved raw methods
|
25
|
-
* new "times" api for including atime,mtime,ctime in stat results
|
26
|
-
* metadir allow mv directories
|
27
|
-
* includes PathMapperFS
|
28
|
-
|
data/README.rdoc
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
= rfusefs
|
2
|
-
|
3
|
-
* https://rubygems.org/gems/rfusefs
|
4
|
-
* https://github.com/lwoggardner/rfusefs
|
5
|
-
|
6
|
-
{<img src="https://badge.fury.io/rb/rfusefs.png" alt="Gem Version" />}[http://badge.fury.io/rb/rfusefs]
|
7
|
-
== DESCRIPTION
|
8
|
-
|
9
|
-
RFuseFS is a port of the FuseFS[http://rubygems.org/gems/fusefs/]
|
10
|
-
library aimed at allowing Ruby programmers to quickly and easily create
|
11
|
-
virtual filesystems with little more than a few lines of code.
|
12
|
-
|
13
|
-
RFuseFS is api compatible with FuseFS (0.7.0)
|
14
|
-
|
15
|
-
== SYNOPSIS
|
16
|
-
|
17
|
-
FuseFS provides a layer of abstraction to a programmer who wants to create a
|
18
|
-
virtual filesystem via FUSE.
|
19
|
-
|
20
|
-
First define a virtual directory by subclassing {FuseFS::FuseDir}
|
21
|
-
|
22
|
-
See samples under /samples and also the following starter classes
|
23
|
-
|
24
|
-
* {FuseFS::FuseDir}
|
25
|
-
* {FuseFS::MetaDir}
|
26
|
-
* {FuseFS::DirLink}
|
27
|
-
* {FuseFS::PathMapperFS}
|
28
|
-
* {FuseFS::SqliteMapperFS}
|
29
|
-
|
30
|
-
Then start your filesystem with
|
31
|
-
|
32
|
-
* {FuseFS.start}
|
33
|
-
* {FuseFS.main}
|
34
|
-
|
35
|
-
Finally to use the filesystem open up your favourite file browser/terminal and
|
36
|
-
explore the contents under <mountpoint>
|
37
|
-
|
38
|
-
Happy Filesystem Hacking!
|
39
|
-
|
40
|
-
=== the hello world filesystem in 14 LOC
|
41
|
-
|
42
|
-
require 'rfusefs'
|
43
|
-
|
44
|
-
class HelloDir
|
45
|
-
|
46
|
-
def contents(path)
|
47
|
-
['hello.txt']
|
48
|
-
end
|
49
|
-
|
50
|
-
def file?(path)
|
51
|
-
path == '/hello.txt'
|
52
|
-
end
|
53
|
-
|
54
|
-
def read_file(path)
|
55
|
-
"Hello, World!\n"
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
# Usage: #{$0} mountpoint [mount_options]
|
61
|
-
FuseFS.main() { |options| HelloDir.new }
|
62
|
-
|
63
|
-
== REQUIREMENTS:
|
64
|
-
|
65
|
-
* FUSE (http://fuse.sourceforge.org)
|
66
|
-
* Ruby (>=1.9)
|
67
|
-
* rfuse (~> 1.0)
|
68
|
-
|
69
|
-
== INSTALL:
|
70
|
-
|
71
|
-
* gem install rfusefs
|
72
|
-
|
73
|
-
== DEVELOPERS:
|
74
|
-
|
75
|
-
After checking out the source, run:
|
76
|
-
|
77
|
-
$ bundle install # install dependencies
|
78
|
-
$ rake spec # run tests
|
79
|
-
$ rake yard # generate docs
|
80
|
-
|
81
|
-
|
82
|
-
== LICENSE:
|
83
|
-
|
84
|
-
(The MIT License)
|
85
|
-
|
86
|
-
* Copyright (c) 2005 Greg Millam. (FuseFS)
|
87
|
-
* Copyright (c) 2009 Kyle Maxwell. (FuseFS)
|
88
|
-
* Copyright (c) 2012 Grant Gardner. (RFuseFS)
|
89
|
-
|
90
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
91
|
-
a copy of this software and associated documentation files (the
|
92
|
-
'Software'), to deal in the Software without restriction, including
|
93
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
94
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
95
|
-
permit persons to whom the Software is furnished to do so, subject to
|
96
|
-
the following conditions:
|
97
|
-
|
98
|
-
The above copyright notice and this permission notice shall be
|
99
|
-
included in all copies or substantial portions of the Software.
|
100
|
-
|
101
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
102
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
103
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
104
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
105
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
106
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
107
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
require "bundler/gem_tasks"
|
3
|
-
require 'yard'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
require 'rake/clean'
|
6
|
-
|
7
|
-
CLOBBER.include [ "pkg/","doc/" ]
|
8
|
-
|
9
|
-
YARD::Rake::YardocTask.new do |t|
|
10
|
-
# Need this because YardocTask does not read the gemspec
|
11
|
-
t.files = ['lib/**/*.rb', '-','History.rdoc'] # optional
|
12
|
-
end
|
13
|
-
|
14
|
-
RSpec::Core::RakeTask.new(:spec)
|
15
|
-
|
16
|
-
desc "FuseFS compatibility specs"
|
17
|
-
RSpec::Core::RakeTask.new("spec:fusefs") do |t|
|
18
|
-
t.pattern = 'spec-fusefs/**/*_spec.rb'
|
19
|
-
end
|
20
|
-
|
21
|
-
task :default => ["spec","spec:fusefs"]
|
22
|
-
# vim: syntax=ruby
|
data/rfusefs.gemspec
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "rfusefs/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |s|
|
6
|
-
s.name = "rfusefs"
|
7
|
-
s.version = RFuseFS::VERSION
|
8
|
-
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Grant Gardner"]
|
10
|
-
s.email = ["grant@lastweekend.com.au"]
|
11
|
-
s.homepage = "http://rubygems.org/gems/rfusefs"
|
12
|
-
s.summary = %q{Filesystem in Ruby Userspace}
|
13
|
-
s.description = %q{A more Ruby like way to write FUSE filesystems - inspired by (compatible with) FuseFS, implemented over RFuse}
|
14
|
-
|
15
|
-
s.files = `git ls-files`.split("\n")
|
16
|
-
s.test_files = `git ls-files -- {test,spec,spec-fusefs}/*`.split("\n")
|
17
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
-
s.require_paths = ["lib"]
|
19
|
-
|
20
|
-
s.has_rdoc = 'yard'
|
21
|
-
s_extra_rdoc_files = 'History.rdoc'
|
22
|
-
|
23
|
-
s.add_dependency("rfuse", ">= 1.0.5RC0")
|
24
|
-
s.add_development_dependency("rake")
|
25
|
-
s.add_development_dependency("rspec")
|
26
|
-
s.add_development_dependency("yard")
|
27
|
-
s.add_development_dependency("redcarpet")
|
28
|
-
s.add_development_dependency("sqlite3")
|
29
|
-
s.add_development_dependency("sys-filesystem")
|
30
|
-
s.add_development_dependency("ffi-xattr", ">= 0.1.1")
|
31
|
-
end
|
data/samples/demo.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require 'rfusefs'
|
3
|
-
require 'fusefs/metadir'
|
4
|
-
require 'fusefs/dirlink'
|
5
|
-
|
6
|
-
include FuseFS
|
7
|
-
|
8
|
-
root = MetaDir.new
|
9
|
-
root.stats.total_space = 1024*1024
|
10
|
-
root.stats.total_nodes = 1024
|
11
|
-
root.stats.strict = true
|
12
|
-
|
13
|
-
class Counter
|
14
|
-
def initialize
|
15
|
-
@counter = 0
|
16
|
-
end
|
17
|
-
def to_s
|
18
|
-
@counter += 1
|
19
|
-
@counter.to_s + "\n"
|
20
|
-
end
|
21
|
-
def size
|
22
|
-
@counter.to_s.size
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class Randwords
|
27
|
-
def initialize(*ary)
|
28
|
-
@ary = ary.flatten
|
29
|
-
end
|
30
|
-
def to_s
|
31
|
-
@ary[rand(@ary.size)].to_s + "\n"
|
32
|
-
end
|
33
|
-
def size
|
34
|
-
@size ||= @ary.map{|v| v.size}.max
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
root.write_to('/hello',"Hello, World!\n")
|
39
|
-
|
40
|
-
progress = '.'
|
41
|
-
|
42
|
-
root.write_to('/progress',progress)
|
43
|
-
|
44
|
-
Thread.new do
|
45
|
-
20.times do
|
46
|
-
sleep 5
|
47
|
-
progress << '.'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
root.write_to('/counter',Counter.new)
|
52
|
-
root.write_to('/color',Randwords.new('red','blue','green','purple','yellow','bistre','burnt sienna','jade'))
|
53
|
-
root.write_to('/animal',Randwords.new('duck','dog','cat','duck billed platypus','silly fella'))
|
54
|
-
|
55
|
-
root.mkdir("/#{ENV['USER']}",FuseFS::DirLink.new(ENV['HOME']))
|
56
|
-
|
57
|
-
FuseFS.main(ARGV) { | options | root }
|
data/samples/dictfs.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# dictfs.rb
|
2
|
-
|
3
|
-
require "rubygems"
|
4
|
-
require 'fusefs'
|
5
|
-
include FuseFS
|
6
|
-
|
7
|
-
#TODO: GG Don't know which "dict" this was referring to
|
8
|
-
require 'dict'
|
9
|
-
|
10
|
-
class DictFS < FuseFS::FuseDir
|
11
|
-
def initialize
|
12
|
-
@servers = ['dict.org','alt0.dict.org']
|
13
|
-
@database = DICT::ALL_DATABASES
|
14
|
-
@strategy = 'exact'
|
15
|
-
@match_strategy = DICT::DEFAULT_MATCH_STRATEGY
|
16
|
-
@port = DICT::DEFAULT_PORT
|
17
|
-
|
18
|
-
@dict = DICT.new(@servers, @port, false, false)
|
19
|
-
@dict.client("%s v%s" % ["Dictionary","1.0"])
|
20
|
-
end
|
21
|
-
def contents(path)
|
22
|
-
# The 'readme' file
|
23
|
-
['readme']
|
24
|
-
end
|
25
|
-
def file?(path)
|
26
|
-
base, rest = split_path(path)
|
27
|
-
rest.nil? # DictFS doesn't have subdirs.
|
28
|
-
end
|
29
|
-
def read_file(path)
|
30
|
-
word, rest = split_path(path)
|
31
|
-
word.downcase!
|
32
|
-
if word == "readme"
|
33
|
-
return %Q[
|
34
|
-
DictFS: You may not see the files, but if you cat any file here, it will look
|
35
|
-
that file up on dict.org!
|
36
|
-
].lstrip
|
37
|
-
end
|
38
|
-
puts "Looking up #{word}"
|
39
|
-
m = @dict.match(@database, @strategy, word)
|
40
|
-
if m
|
41
|
-
contents = []
|
42
|
-
m.each do |db,words|
|
43
|
-
words.each do |w|
|
44
|
-
defs = @dict.define(db,w)
|
45
|
-
str = []
|
46
|
-
defs.each do |d|
|
47
|
-
str << "Definition of '#{w}' (by #{d.description})"
|
48
|
-
d.definition.each do |line|
|
49
|
-
str << " #{line.strip}"
|
50
|
-
end
|
51
|
-
contents << str.join("\n")
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
contents << ''
|
56
|
-
contents.join("\n")
|
57
|
-
else
|
58
|
-
"No dictionary definitions found\n"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
if (File.basename($0) == File.basename(__FILE__))
|
64
|
-
unless (ARGV.length > 0 && File.directory?(ARGV[0]))
|
65
|
-
puts "Usage: #{$0} <mountpoint> <mount_options>"
|
66
|
-
exit
|
67
|
-
end
|
68
|
-
|
69
|
-
root = DictFS.new
|
70
|
-
|
71
|
-
# Set the root FuseFS
|
72
|
-
FuseFS.start(root,*ARGV)
|
73
|
-
|
74
|
-
end
|
data/samples/hello.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
class HelloDir
|
2
|
-
def contents(path)
|
3
|
-
['hello.txt']
|
4
|
-
end
|
5
|
-
|
6
|
-
def file?(path)
|
7
|
-
path == '/hello.txt'
|
8
|
-
end
|
9
|
-
|
10
|
-
def read_file(path)
|
11
|
-
"Hello, World!\n"
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
if __FILE__ == $0
|
17
|
-
require 'rfusefs'
|
18
|
-
hellodir = HelloDir.new
|
19
|
-
FuseFS.start(hellodir,*ARGV)
|
20
|
-
end
|
data/samples/openurifs.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# openurifs.rb
|
2
|
-
#
|
3
|
-
|
4
|
-
require "rubygems"
|
5
|
-
require 'fusefs'
|
6
|
-
include FuseFS
|
7
|
-
|
8
|
-
require 'open-uri'
|
9
|
-
|
10
|
-
class OpenUriFS < FuseFS::FuseDir
|
11
|
-
def contents(path)
|
12
|
-
# The 'readme' file
|
13
|
-
[]
|
14
|
-
end
|
15
|
-
def directory?(path)
|
16
|
-
uri = scan_path(path)
|
17
|
-
fn = uri.pop
|
18
|
-
return true if fn =~ /\.(com|org|net|us|de|jp|ru|uk|biz|info)$/
|
19
|
-
return true if fn =~ /^\d+\.\d+\.\d+\.\d+$/
|
20
|
-
! (fn =~ /\./) # Does the last item doesn't contain a '.' ?
|
21
|
-
end
|
22
|
-
def file?(path)
|
23
|
-
!directory?(path)
|
24
|
-
end
|
25
|
-
def read_file(path)
|
26
|
-
proto, rest = split_path(path)
|
27
|
-
uri = "#{proto}://#{rest}"
|
28
|
-
open(uri).read
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
if (File.basename($0) == File.basename(__FILE__))
|
33
|
-
if (ARGV.size != 1)
|
34
|
-
puts "Usage: #{$0} <directory>"
|
35
|
-
exit
|
36
|
-
end
|
37
|
-
|
38
|
-
dirname = ARGV.shift
|
39
|
-
|
40
|
-
unless File.directory?(dirname)
|
41
|
-
puts "Usage: #{dirname} is not a directory."
|
42
|
-
exit
|
43
|
-
end
|
44
|
-
|
45
|
-
root = OpenUriFS.new
|
46
|
-
|
47
|
-
# Set the root FuseFS
|
48
|
-
FuseFS.set_root(root)
|
49
|
-
|
50
|
-
FuseFS.mount_under(dirname)
|
51
|
-
|
52
|
-
FuseFS.run # This doesn't return until we're unmounted.
|
53
|
-
end
|
data/samples/railsfs.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# RailsFS, as written by _why_the_lucky_stiff
|
4
|
-
#
|
5
|
-
# Full instructions:
|
6
|
-
# http://redhanded.hobix.com/inspect/railsfsAfterACoupleMinutesOfToolingWithFuseWhoa.html
|
7
|
-
#
|
8
|
-
=begin
|
9
|
-
Instructions cut and paste from _why's blog:
|
10
|
-
|
11
|
-
Save the railfs.rb script as script/filesys in your Rails app. (If you'd
|
12
|
-
rather not cut-and-paste the above, it's here.)
|
13
|
-
|
14
|
-
Now, run mkdir ~/railsmnt. Then, script/filesys ~/railsmnt. The rules are as
|
15
|
-
follows:
|
16
|
-
|
17
|
-
* ls ~/railsmnt will give you a list of tables.
|
18
|
-
* ls ~/railsmnt/table will list IDs from the table.
|
19
|
-
* cat ~/railsmnt/table/id will display a record in YAML.
|
20
|
-
* vim ~/railsmnt/table/id to edit the record in YAML!
|
21
|
-
|
22
|
-
=end
|
23
|
-
|
24
|
-
require "rubygems"
|
25
|
-
require 'fusefs'
|
26
|
-
require File.dirname(__FILE__) + '/../config/environment'
|
27
|
-
|
28
|
-
class RailsFS < FuseFS::FuseDir
|
29
|
-
def initialize
|
30
|
-
@classes = {}
|
31
|
-
require 'find'
|
32
|
-
Find.find( File.join(RAILS_ROOT, 'app/models') ) do |model|
|
33
|
-
if /(\w+)\.rb$/ =~ model
|
34
|
-
model = $1
|
35
|
-
( @classes[model] = Kernel::const_get( Inflector.classify( model ) ) ).
|
36
|
-
find :first rescue @classes.delete( model )
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
def directory? path
|
41
|
-
tname, key = scan_path path
|
42
|
-
table = @classes[tname]
|
43
|
-
if table.nil?; false # /table
|
44
|
-
elsif key; false # /table/id
|
45
|
-
else; true end
|
46
|
-
end
|
47
|
-
def file? path
|
48
|
-
tname, key = scan_path path
|
49
|
-
table = @classes[tname]
|
50
|
-
key and table and table.find( key )
|
51
|
-
end
|
52
|
-
def can_delete?; true end
|
53
|
-
def can_write? path; file? path end
|
54
|
-
def contents path
|
55
|
-
tname, key = scan_path path
|
56
|
-
table = @classes[tname]
|
57
|
-
if tname.nil?; @classes.keys.sort # /
|
58
|
-
else; table.find( :all ).map { |o| o.id.to_s } end # /table
|
59
|
-
end
|
60
|
-
def write_to path, body
|
61
|
-
obj = YAML::load( body )
|
62
|
-
obj.save
|
63
|
-
end
|
64
|
-
def read_file path
|
65
|
-
tname, key = scan_path path
|
66
|
-
table = @classes[tname]
|
67
|
-
YAML::dump( table.find( key ) )
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
if (File.basename($0) == File.basename(__FILE__))
|
72
|
-
root = RailsFS.new
|
73
|
-
FuseFS.set_root(root)
|
74
|
-
FuseFS.mount_under(ARGV[0])
|
75
|
-
FuseFS.run # This doesn't return until we're unmounted.
|
76
|
-
end
|
77
|
-
|