virtfs 0.0.1

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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +8 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +154 -0
  8. data/Rakefile +5 -0
  9. data/lib/virtfs-nativefs-thick.rb +1 -0
  10. data/lib/virtfs-nativefs-thin.rb +1 -0
  11. data/lib/virtfs.rb +38 -0
  12. data/lib/virtfs/activation.rb +97 -0
  13. data/lib/virtfs/block_io.rb +140 -0
  14. data/lib/virtfs/byte_range.rb +71 -0
  15. data/lib/virtfs/context.rb +300 -0
  16. data/lib/virtfs/context_manager.rb +175 -0
  17. data/lib/virtfs/context_switch_class_methods.rb +96 -0
  18. data/lib/virtfs/delegate_module.rb +40 -0
  19. data/lib/virtfs/dir_instance_delegate.rb +3 -0
  20. data/lib/virtfs/exception.rb +13 -0
  21. data/lib/virtfs/file_instance_delegate.rb +3 -0
  22. data/lib/virtfs/file_modes_and_options.rb +293 -0
  23. data/lib/virtfs/find_class_methods.rb +106 -0
  24. data/lib/virtfs/io_buffer.rb +133 -0
  25. data/lib/virtfs/io_instance_delegate.rb +3 -0
  26. data/lib/virtfs/kernel.rb +146 -0
  27. data/lib/virtfs/nativefs/thick.rb +30 -0
  28. data/lib/virtfs/nativefs/thick/dir_class_methods.rb +38 -0
  29. data/lib/virtfs/nativefs/thick/file_class_methods.rb +178 -0
  30. data/lib/virtfs/nativefs/thin.rb +32 -0
  31. data/lib/virtfs/nativefs/thin/dir.rb +30 -0
  32. data/lib/virtfs/nativefs/thin/dir_class_methods.rb +41 -0
  33. data/lib/virtfs/nativefs/thin/file.rb +112 -0
  34. data/lib/virtfs/nativefs/thin/file_class_methods.rb +181 -0
  35. data/lib/virtfs/protofs/protofs.rb +7 -0
  36. data/lib/virtfs/protofs/protofs_base.rb +12 -0
  37. data/lib/virtfs/protofs/protofs_dir.rb +13 -0
  38. data/lib/virtfs/protofs/protofs_dir_class.rb +31 -0
  39. data/lib/virtfs/protofs/protofs_file.rb +27 -0
  40. data/lib/virtfs/protofs/protofs_file_class.rb +136 -0
  41. data/lib/virtfs/stat.rb +100 -0
  42. data/lib/virtfs/thin_dir_delegator.rb +79 -0
  43. data/lib/virtfs/thin_file_delegator.rb +77 -0
  44. data/lib/virtfs/thin_io_delegator_methods.rb +301 -0
  45. data/lib/virtfs/thin_io_delegator_methods_bufferio.rb +337 -0
  46. data/lib/virtfs/v_dir.rb +238 -0
  47. data/lib/virtfs/v_file.rb +480 -0
  48. data/lib/virtfs/v_io.rb +243 -0
  49. data/lib/virtfs/v_pathname.rb +128 -0
  50. data/lib/virtfs/version.rb +3 -0
  51. data/spec/activate_spec.rb +202 -0
  52. data/spec/chroot_spec.rb +120 -0
  53. data/spec/context_manager_class_spec.rb +246 -0
  54. data/spec/context_manager_instance_spec.rb +255 -0
  55. data/spec/context_spec.rb +335 -0
  56. data/spec/data/UTF-16LE-data.txt +0 -0
  57. data/spec/data/UTF-8-data.txt +212 -0
  58. data/spec/dir_class_spec.rb +506 -0
  59. data/spec/dir_instance_spec.rb +208 -0
  60. data/spec/file_class_spec.rb +2106 -0
  61. data/spec/file_instance_spec.rb +154 -0
  62. data/spec/file_modes_and_options_spec.rb +1556 -0
  63. data/spec/find_spec.rb +142 -0
  64. data/spec/io_bufferio_size_shared_examples.rb +371 -0
  65. data/spec/io_bufferio_size_spec.rb +861 -0
  66. data/spec/io_bufferio_spec.rb +801 -0
  67. data/spec/io_class_spec.rb +145 -0
  68. data/spec/io_instance_spec.rb +516 -0
  69. data/spec/kernel_spec.rb +285 -0
  70. data/spec/mount_spec.rb +186 -0
  71. data/spec/nativefs_local_root_spec.rb +132 -0
  72. data/spec/path_spec.rb +39 -0
  73. data/spec/spec_helper.rb +126 -0
  74. data/tasks/rspec.rake +3 -0
  75. data/tasks/yard.rake +7 -0
  76. data/test/UTF-8-demo.txt +212 -0
  77. data/test/bench.rb +18 -0
  78. data/test/bio_internal_test.rb +45 -0
  79. data/test/delegate_io.rb +31 -0
  80. data/test/delegate_module.rb +62 -0
  81. data/test/encode_test.rb +42 -0
  82. data/test/enoent_test.rb +30 -0
  83. data/test/namespace_test.rb +42 -0
  84. data/test/read_block_valid_encoding.rb +44 -0
  85. data/test/read_test.rb +78 -0
  86. data/test/stream_readers.rb +46 -0
  87. data/test/utf-16-demo.txt +0 -0
  88. data/test/utf8_to_utf16.rb +77 -0
  89. data/test/wrapper_test.rb +34 -0
  90. data/virtfs.gemspec +29 -0
  91. metadata +230 -0
@@ -0,0 +1,7 @@
1
+ require_relative 'protofs_base'
2
+ require_relative 'protofs_io_class'
3
+ require_relative 'protofs_file_class'
4
+ require_relative 'protofs_dir_class'
5
+ require_relative 'protofs_io'
6
+ require_relative 'protofs_file'
7
+ require_relative 'protofs_dir'
@@ -0,0 +1,12 @@
1
+ class ProtoFS
2
+ attr_accessor :mount_point, :name
3
+
4
+ def initialize
5
+ @mount_point = nil
6
+ @name = self.class.name
7
+ end
8
+
9
+ def umount
10
+ @mount_point = nil
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ class ProtoFS
2
+ class Dir
3
+ def initialize(fs, instance_handle, hash_args)
4
+ end
5
+
6
+ def close
7
+ end
8
+
9
+ # returns file_name and new position.
10
+ def read(pos)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # Dir class methods - are instance methods of filesystem instance.
3
+ #
4
+ class ProtoFS
5
+ def dir_delete(p)
6
+ end
7
+
8
+ def dir_entries(p)
9
+ end
10
+
11
+ def dir_exist?(p)
12
+ end
13
+
14
+ def dir_foreach(p, &block)
15
+ end
16
+
17
+ def dir_mkdir(p, permissions)
18
+ end
19
+
20
+ def dir_new(dir, hash_args={})
21
+ Dir.new(self, lookup_dir(dir), hash_args)
22
+ end
23
+
24
+ private
25
+
26
+ def lookup_dir(dir)
27
+ #
28
+ # Get filesystem-specific handel for directory instance.
29
+ #
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ class ProtoFS
2
+ class File
3
+ def initialize(fs, instance_handle, parsed_args)
4
+ end
5
+
6
+ def atime
7
+ end
8
+
9
+ def chmod(permission)
10
+ end
11
+
12
+ def chown(owner, group)
13
+ end
14
+
15
+ def ctime
16
+ end
17
+
18
+ def flock(locking_constant)
19
+ end
20
+
21
+ def lstat
22
+ end
23
+
24
+ def truncate(len)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,136 @@
1
+ #
2
+ # File class methods - are instance methods of filesystem instance.
3
+ #
4
+ class ProtoFS
5
+ def file_atime(p)
6
+ end
7
+
8
+ def file_blockdev?(p)
9
+ end
10
+
11
+ def file_chardev?(p)
12
+ end
13
+
14
+ def file_chmod(permission, p)
15
+ end
16
+
17
+ def file_chown(owner, group, p)
18
+ end
19
+
20
+ def file_fileCtime(p)
21
+ end
22
+
23
+ def file_delete(p)
24
+ end
25
+
26
+ def file_directory?(p)
27
+ end
28
+
29
+ def file_executable?(p)
30
+ end
31
+
32
+ def file_executable_real?(p)
33
+ end
34
+
35
+ def file_exist?(p)
36
+ end
37
+
38
+ def file_file?(p)
39
+ end
40
+
41
+ def file_ftype(p)
42
+ end
43
+
44
+ def file_grpowned?(p)
45
+ end
46
+
47
+ def file_identical?(p1, p2)
48
+ end
49
+
50
+ def file_lchmod(permission, p)
51
+ end
52
+
53
+ def file_lchown(owner, group, p)
54
+ end
55
+
56
+ def file_link(p1, p2)
57
+ end
58
+
59
+ def file_lstat(p)
60
+ end
61
+
62
+ def file_mtime(p)
63
+ end
64
+
65
+ def file_owned?(p)
66
+ end
67
+
68
+ def file_pipe?(p)
69
+ end
70
+
71
+ def file_readable?(p)
72
+ end
73
+
74
+ def file_readable_real?(p)
75
+ end
76
+
77
+ def file_readlink(p)
78
+ end
79
+
80
+ def file_rename(p1, p2)
81
+ end
82
+
83
+ def file_setgid?(p)
84
+ end
85
+
86
+ def file_setuid?(p)
87
+ end
88
+
89
+ def file_size(p)
90
+ end
91
+
92
+ def file_socket?(p)
93
+ end
94
+
95
+ def file_stat(p)
96
+ end
97
+
98
+ def file_sticky?(p)
99
+ end
100
+
101
+ def file_symlink(oname, p)
102
+ end
103
+
104
+ def file_symlink?(p)
105
+ end
106
+
107
+ def file_truncate(p, len)
108
+ end
109
+
110
+ def file_utime(atime, mtime, p)
111
+ end
112
+
113
+ def file_world_readable?(p, len)
114
+ end
115
+
116
+ def file_world_writable?(p, len)
117
+ end
118
+
119
+ def file_writable?(p, len)
120
+ end
121
+
122
+ def file_writable_real?(p, len)
123
+ end
124
+
125
+ def file_new(f, parsed_args)
126
+ File.new(self, lookup_file(f), parsed_args)
127
+ end
128
+
129
+ private
130
+
131
+ def lookup_file(f)
132
+ #
133
+ # Get filesystem-specific handel for file instance.
134
+ #
135
+ end
136
+ end
@@ -0,0 +1,100 @@
1
+ module VirtFS
2
+ # File Stat, contains attributes common to files on all files systems
3
+ class Stat
4
+ include Comparable
5
+
6
+ # Specified File Attributes supported by VirtFS (auto converted to symbols)
7
+ ATTR_ACCESSORS = %i(
8
+ atime
9
+ blksize
10
+ blockdev?
11
+ blocks
12
+ chardev?
13
+ ctime
14
+ dev
15
+ dev_major
16
+ dev_minor
17
+ directory?
18
+ executable?
19
+ executable_real?
20
+ file?
21
+ ftype
22
+ gid
23
+ grpowned?
24
+ ino
25
+ inspect
26
+ mode
27
+ mtime
28
+ nlink
29
+ owned?
30
+ pipe?
31
+ rdev
32
+ rdev_major
33
+ rdev_minor
34
+ readable?
35
+ readable_real?
36
+ setgid?
37
+ setuid?
38
+ size
39
+ size?
40
+ socket?
41
+ sticky?
42
+ symlink?
43
+ uid
44
+ world_readable?
45
+ world_writable?
46
+ writable?
47
+ writable_real?
48
+ zero?
49
+ )
50
+
51
+ # Helper to convert attribute name to instance variable name
52
+ #
53
+ # @param name [String] string name
54
+ # @return [String] string instance variable name
55
+ def self.iv_name(name)
56
+ name = name.to_s.chomp('?') if name.to_s.end_with?('?')
57
+ "@#{name}"
58
+ end
59
+
60
+ ATTR_ACCESSORS.each { |aa| class_eval("def #{aa}; #{iv_name(aa)}; end") }
61
+
62
+ # Attribute intializer, accepts Stat or Hash containing attributes
63
+ #
64
+ # @param obj [Stat,Hash] instance of object containing stat info to initialize
65
+ def initialize(obj)
66
+ if obj.is_a?(VfsRealFile::Stat)
67
+ stat_init(obj)
68
+ else
69
+ hash_init(obj)
70
+ end
71
+ end
72
+
73
+ # Sort file stats by modify time
74
+ def <=>(other)
75
+ return -1 if mtime < other.mtime
76
+ return 1 if mtime > other.mtime
77
+ 0
78
+ end
79
+
80
+ private
81
+
82
+ def stat_init(obj)
83
+ ATTR_ACCESSORS.each do |aa|
84
+ next unless obj.respond_to?(aa)
85
+ instance_variable_set(iv_name(aa), obj.send(aa))
86
+ end
87
+ end
88
+
89
+ def hash_init(obj)
90
+ ATTR_ACCESSORS.each do |aa|
91
+ next unless obj.key?(aa)
92
+ instance_variable_set(iv_name(aa), obj[aa])
93
+ end
94
+ end
95
+
96
+ def iv_name(name)
97
+ self.class.iv_name(name)
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,79 @@
1
+ module VirtFS
2
+ # Dispatches Dir calls to/from VirtFS and the 'Thin' subsystem
3
+ #
4
+ class ThinDirDelegator
5
+ # Instance methods
6
+ def initialize(fs_dir_obj, creation_path, fs_path, _hash_args)
7
+ @fs_dir_obj = fs_dir_obj
8
+ @creation_path = creation_path
9
+ @full_path = VfsRealFile.join(fs_dir_obj.fs.mount_point, fs_path)
10
+ @fs_path = fs_path
11
+ @dir_closed = false
12
+ @raw_pos = 0 # FS-specific position
13
+ @cur_tell = -1
14
+ @next_tell = 0
15
+ @tells = []
16
+ @raw_pos_to_tell = {}
17
+ end
18
+
19
+ def close
20
+ raise IOError, "closed directory" if @dir_closed
21
+ @fs_dir_obj.close
22
+ @dir_closed = true
23
+ nil
24
+ end
25
+
26
+ def each
27
+ return to_enum(__method__) unless block_given?
28
+ raise IOError, "closed directory" if @dir_closed
29
+ while (file_name = read)
30
+ yield(file_name)
31
+ end
32
+ self
33
+ end
34
+
35
+ def path
36
+ @creation_path
37
+ end
38
+ alias_method :to_path, :path
39
+
40
+ def pos=(tell_val)
41
+ raise IOError, "closed directory" if @dir_closed
42
+ seek(tell_val)
43
+ tell_val
44
+ end
45
+
46
+ def read
47
+ raise IOError, "closed directory" if @dir_closed
48
+ file_name, @raw_pos = @fs_dir_obj.read(@raw_pos)
49
+ file_name
50
+ end
51
+
52
+ def rewind
53
+ raise IOError, "closed directory" if @dir_closed
54
+ @raw_pos = 0
55
+ self
56
+ end
57
+
58
+ def seek(tell_val)
59
+ raise IOError, "closed directory" if @dir_closed
60
+ return self unless (new_pos = @tells[tell_val])
61
+ @cur_tell = tell_val
62
+ @raw_pos = new_pos
63
+ self
64
+ end
65
+
66
+ def tell
67
+ raise IOError, "closed directory" if @dir_closed
68
+ if (tell_val = @raw_pos_to_tell[@raw_pos])
69
+ return @cur_tell = tell_val
70
+ end
71
+ @cur_tell = @next_tell
72
+ @tells[@cur_tell] = @raw_pos
73
+ @raw_pos_to_tell[@raw_pos] = @cur_tell
74
+ @next_tell += 1
75
+ @cur_tell
76
+ end
77
+ alias_method :pos, :tell
78
+ end
79
+ end
@@ -0,0 +1,77 @@
1
+ require_relative 'thin_io_delegator_methods.rb'
2
+
3
+ module VirtFS
4
+ # Dispatches File calls to/from VirtFS and the 'Thin' subsystem
5
+ #
6
+ class ThinFileDelegator
7
+ attr_reader :fs_file_obj
8
+
9
+ include ThinIODelegatorMethods
10
+
11
+ # Instance methods
12
+ def initialize(fs_file_obj, creation_path, fs_path, parsed_args)
13
+ super(fs_file_obj, parsed_args) # Initialize IO instance.
14
+ # @size = @fs_io_obj.size
15
+ @creation_path = creation_path
16
+ @full_path = VfsRealFile.join(@fs_io_obj.fs.mount_point, fs_path)
17
+ @fs_path = fs_path
18
+ end
19
+
20
+ def re_initialize(io_obj)
21
+ super(io_obj) # re-initialize IO
22
+ @creation_path = io_obj.instance_variable_get(:@creation_path)
23
+ @full_path = io_obj.instance_variable_get(:@full_path)
24
+ @fs_path = io_obj.instance_variable_get(:@fs_path)
25
+ end
26
+
27
+ def atime
28
+ file_open
29
+ @fs_io_obj.atime
30
+ end
31
+
32
+ def chmod(permission)
33
+ file_open
34
+ @fs_io_obj.chmod(permission)
35
+ end
36
+
37
+ def chown(owner, group)
38
+ file_open
39
+ @fs_io_obj.chown(owner, group)
40
+ end
41
+
42
+ def ctime
43
+ file_open
44
+ @fs_io_obj.ctime
45
+ end
46
+
47
+ def flock(locking_constant)
48
+ file_open
49
+ @fs_io_obj.flock(locking_constant)
50
+ end
51
+
52
+ def lstat
53
+ file_open
54
+ @fs_io_obj.lstat
55
+ end
56
+
57
+ def mtime
58
+ file_open
59
+ @fs_io_obj.mtime
60
+ end
61
+
62
+ def path
63
+ @creation_path
64
+ end
65
+ alias_method :to_path, :path
66
+
67
+ def size
68
+ file_open
69
+ @size
70
+ end
71
+
72
+ def truncate(len)
73
+ file_open
74
+ @fs_io_obj.truncate(len)
75
+ end
76
+ end
77
+ end