memfs 0.0.2 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 853e1bf2c2929b2e5eed3f9ccefad2d569bb1ff1
4
- data.tar.gz: c9b8c7328cd320096f0c9c969af4b8402594cccb
3
+ metadata.gz: 015cda23b6a9dbae4b0bd9665312b4da277d95bd
4
+ data.tar.gz: c4328852dd8ae3ce91c1b0d777d90d3d8438194f
5
5
  SHA512:
6
- metadata.gz: f4cf41af40e02afb95e3f8df1d9480b90af1f8724f463298ee199c664bf9fa5f921c3da2170e5ecdabb37e9cee1c9dfc70ea523dceca3ed6d757bd2128d6aa65
7
- data.tar.gz: 6bb031117b8e25e60e60812229ec42e6fa77a4ee6fb162d02e6d052278e1ec9d1beb30e664541a91e1ab626dd2f2b6979dc25ea01aa4231e9f691d29bca6e031
6
+ metadata.gz: ed264906f48c92c3622a674dfecdc7c279739f210e2c6607aaca2f31e9990620634ed0607fd4b80e61123bed3d22208989de546706e71a03855921627589453a
7
+ data.tar.gz: a83c9c316d30710cecdf298ff77c4c495693b562351f7c204c15030f5566ea3291bd14130bea081aad5c22983ca48852cf3b1dae15e22075a9c8678998eca92a
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ lib/fileutils.rb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0
4
+
5
+ * Adding `File` missing methods - #3
6
+
3
7
  ## 0.0.2
4
8
 
5
9
  * Adding the MIT license to the gemspec file - #2
data/README.md CHANGED
@@ -1,4 +1,9 @@
1
- # MemFs [![Build Status](https://secure.travis-ci.org/simonc/memfs.png?branch=master)](http://travis-ci.org/simonc/memfs) [![Code Climate](https://codeclimate.com/github/simonc/memfs.png)](https://codeclimate.com/github/simonc/memfs) [![Coverage Status](https://coveralls.io/repos/simonc/memfs/badge.png?branch=master)](https://coveralls.io/r/simonc/memfs?branch=master)
1
+ # MemFs
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/memfs.png)](http://badge.fury.io/rb/memfs)
4
+ [![Build Status](https://secure.travis-ci.org/simonc/memfs.png?branch=master)](http://travis-ci.org/simonc/memfs)
5
+ [![Code Climate](https://codeclimate.com/github/simonc/memfs.png)](https://codeclimate.com/github/simonc/memfs)
6
+ [![Coverage Status](https://coveralls.io/repos/simonc/memfs/badge.png?branch=master)](https://coveralls.io/r/simonc/memfs?branch=master)
2
7
 
3
8
  MemFs is an in-memory filesystem that can be used for your tests.
4
9
 
@@ -114,6 +119,7 @@ end
114
119
  ## Known issues
115
120
 
116
121
  * MemFs doesn't implement IO so FileUtils.copy_stream is still the original one
122
+ * Pipes and Sockets are not handled for now
117
123
 
118
124
  ## TODO
119
125
 
data/lib/memfs/dir.rb CHANGED
@@ -14,7 +14,7 @@ module MemFs
14
14
  end
15
15
 
16
16
  def self.exists?(path)
17
- fs.directory?(path)
17
+ File.directory?(path)
18
18
  end
19
19
 
20
20
  def self.getwd
@@ -46,6 +46,10 @@ module MemFs
46
46
  def remove_entry(entry)
47
47
  entries.delete(entry.name)
48
48
  end
49
+
50
+ def type
51
+ 'directory'
52
+ end
49
53
  end
50
54
  end
51
55
  end
@@ -12,8 +12,13 @@ module MemFs
12
12
  OEXEC = 00004
13
13
  RSTICK = 01000
14
14
  USTICK = 05000
15
+ SETUID = 04000
16
+ SETGID = 02000
15
17
 
16
18
  attr_accessor :atime,
19
+ :block_device,
20
+ :character_device,
21
+ :ctime,
17
22
  :gid,
18
23
  :mtime,
19
24
  :name,
@@ -33,6 +38,14 @@ module MemFs
33
38
  self
34
39
  end
35
40
 
41
+ def dereferenced_name
42
+ name
43
+ end
44
+
45
+ def dereferenced_path
46
+ path
47
+ end
48
+
36
49
  def dev
37
50
  @dev ||= rand(1000)
38
51
  end
@@ -42,14 +55,14 @@ module MemFs
42
55
  end
43
56
 
44
57
  def initialize(path = nil)
45
- current_user = Etc.getpwuid
46
58
  time = Time.now
47
59
  self.atime = time
48
- self.gid = current_user.gid
60
+ self.ctime = time
61
+ self.gid = Process.egid
49
62
  self.mode = 0666 - MemFs::File.umask
50
63
  self.mtime = time
51
64
  self.name = MemFs::File.basename(path || '')
52
- self.uid = current_user.uid
65
+ self.uid = Process.euid
53
66
  end
54
67
 
55
68
  def ino
@@ -68,6 +81,10 @@ module MemFs
68
81
  def touch
69
82
  self.atime = self.mtime = Time.now
70
83
  end
84
+
85
+ def type
86
+ 'unknown'
87
+ end
71
88
  end
72
89
  end
73
90
  end
@@ -31,6 +31,14 @@ module MemFs
31
31
  def size
32
32
  content.size
33
33
  end
34
+
35
+ def type
36
+ case
37
+ when block_device then 'blockSpecial'
38
+ when character_device then 'characterSpecial'
39
+ else 'file'
40
+ end
41
+ end
34
42
  end
35
43
  end
36
44
  end
@@ -31,6 +31,10 @@ module MemFs
31
31
  buffer.empty? ? nil : buffer
32
32
  end
33
33
 
34
+ def truncate(length)
35
+ @string.replace @string[0, length]
36
+ end
37
+
34
38
  def to_s
35
39
  @string
36
40
  end
@@ -11,6 +11,20 @@ module MemFs
11
11
  @dereferenced ||= fs.find!(target).dereferenced
12
12
  end
13
13
 
14
+ def dereferenced_name
15
+ real_target.dereferenced_name
16
+ end
17
+
18
+ def dereferenced_path
19
+ dereferenced.dereferenced_path
20
+ end
21
+
22
+ def find(path)
23
+ dereferenced.find(path)
24
+ rescue Errno::ENOENT
25
+ nil
26
+ end
27
+
14
28
  def initialize(path, target)
15
29
  super(path)
16
30
  @target = target
@@ -27,6 +41,16 @@ module MemFs
27
41
  def respond_to_missing?(meth, include_private)
28
42
  dereferenced.respond_to?(meth, include_private) || super
29
43
  end
44
+
45
+ def type
46
+ 'link'
47
+ end
48
+
49
+ private
50
+
51
+ def real_target
52
+ fs.find(target) || Entry.new(target)
53
+ end
30
54
  end
31
55
  end
32
56
  end
data/lib/memfs/file.rb CHANGED
@@ -25,8 +25,42 @@ module MemFs
25
25
  def_delegators :original_file_class,
26
26
  :basename,
27
27
  :dirname,
28
+ :extname,
29
+ :fnmatch,
28
30
  :join,
29
- :path
31
+ :path,
32
+ :split
33
+
34
+ %i[
35
+ blockdev?
36
+ chardev?
37
+ directory?
38
+ executable?
39
+ executable_real?
40
+ file?
41
+ grpowned?
42
+ owned?
43
+ pipe?
44
+ readable?
45
+ readable_real?
46
+ setgid?
47
+ setuid?
48
+ socket?
49
+ sticky?
50
+ world_readable?
51
+ world_writable?
52
+ writable?
53
+ writable_real?
54
+ zero?
55
+ ].each do |query_method|
56
+ define_singleton_method(query_method) do |path| # def directory?(path)
57
+ stat_query(path, query_method) # stat_query(path, :directory?)
58
+ end # end
59
+ end
60
+
61
+ def self.absolute_path(path, dir_string = fs.pwd)
62
+ original_file_class.absolute_path(path, dir_string)
63
+ end
30
64
 
31
65
  def self.atime(path)
32
66
  stat(path).atime
@@ -45,12 +79,12 @@ module MemFs
45
79
  paths.size
46
80
  end
47
81
 
48
- def self.directory?(path)
49
- fs.directory? path
82
+ def self.ctime(path)
83
+ stat(path).ctime
50
84
  end
51
85
 
52
86
  def self.exists?(path)
53
- not fs.find(path).nil?
87
+ !!fs.find(path)
54
88
  end
55
89
  class << self; alias :exist? :exists?; end
56
90
 
@@ -58,10 +92,12 @@ module MemFs
58
92
  original_file_class.expand_path(file_name, dir_string)
59
93
  end
60
94
 
61
- def self.file?(path)
62
- fs.find(path).is_a?(Fake::File)
95
+ def self.ftype(path)
96
+ fs.find!(path) && lstat(path).ftype
63
97
  end
64
98
 
99
+ class << self; alias :fnmatch? :fnmatch; end
100
+
65
101
  def self.identical?(path1, path2)
66
102
  fs.find!(path1).dereferenced === fs.find!(path2).dereferenced
67
103
  rescue Errno::ENOENT
@@ -117,6 +153,14 @@ module MemFs
117
153
  fs.find!(path).target
118
154
  end
119
155
 
156
+ def self.realdirpath(path, dir_string = fs.pwd)
157
+ loose_dereference_path(absolute_path(path, dir_string))
158
+ end
159
+
160
+ def self.realpath(path, dir_string = fs.pwd)
161
+ dereference_path(absolute_path(path, dir_string))
162
+ end
163
+
120
164
  def self.rename(old_name, new_name)
121
165
  fs.rename(old_name, new_name)
122
166
  SUCCESS
@@ -130,6 +174,11 @@ module MemFs
130
174
  fs.find!(path).size
131
175
  end
132
176
 
177
+ def self.size?(path)
178
+ file = fs.find(path)
179
+ file && file.size > 0 && file.size
180
+ end
181
+
133
182
  def self.stat(path)
134
183
  Stat.new(path, true)
135
184
  end
@@ -140,7 +189,12 @@ module MemFs
140
189
  end
141
190
 
142
191
  def self.symlink?(path)
143
- fs.symlink? path
192
+ lstat_query(path, :symlink?)
193
+ end
194
+
195
+ def self.truncate(path, length)
196
+ fs.find!(path).content.truncate(length)
197
+ SUCCESS
144
198
  end
145
199
 
146
200
  def self.umask(integer = nil)
@@ -257,10 +311,38 @@ module MemFs
257
311
 
258
312
  private
259
313
 
314
+ def self.dereference_name(path)
315
+ if entry = fs.find(path)
316
+ entry.dereferenced_name
317
+ else
318
+ basename(path)
319
+ end
320
+ end
321
+
322
+ def self.dereference_dir_path(path)
323
+ dereference_path(dirname(path))
324
+ end
325
+
326
+ def self.dereference_path(path)
327
+ fs.find!(path).dereferenced_path
328
+ end
329
+
330
+ def self.loose_dereference_path(path)
331
+ join(dereference_dir_path(path), dereference_name(path))
332
+ end
333
+
260
334
  def self.original_file_class
261
335
  MemFs::OriginalFile
262
336
  end
263
337
 
338
+ def self.stat_query(path, query)
339
+ fs.find(path) && stat(path).public_send(query)
340
+ end
341
+
342
+ def self.lstat_query(path, query)
343
+ fs.find(path) && lstat(path).public_send(query)
344
+ end
345
+
264
346
  def str_to_mode_int(mode)
265
347
  return mode unless mode.is_a?(String)
266
348
 
@@ -12,6 +12,7 @@ module MemFs
12
12
  def_delegators :entry,
13
13
  :atime,
14
14
  :blksize,
15
+ :ctime,
15
16
  :dev,
16
17
  :gid,
17
18
  :ino,
@@ -19,12 +20,36 @@ module MemFs
19
20
  :mtime,
20
21
  :uid
21
22
 
23
+ def blockdev?
24
+ !!entry.block_device
25
+ end
26
+
27
+ def chardev?
28
+ !!entry.character_device
29
+ end
30
+
22
31
  def directory?
23
- File.directory? entry.path
32
+ entry.is_a?(Fake::Directory)
33
+ end
34
+
35
+ def executable?
36
+ user_executable? || group_executable? || !!world_executable?
37
+ end
38
+
39
+ def executable_real?
40
+ user_executable_real? || group_executable_real? || !!world_executable?
24
41
  end
25
42
 
26
43
  def file?
27
- File.file? entry.path
44
+ entry.is_a?(Fake::File)
45
+ end
46
+
47
+ def ftype
48
+ entry.type
49
+ end
50
+
51
+ def grpowned?
52
+ gid == Process.egid
28
53
  end
29
54
 
30
55
  def initialize(path, dereference = false)
@@ -32,16 +57,114 @@ module MemFs
32
57
  @entry = dereference ? entry.dereferenced : entry
33
58
  end
34
59
 
60
+ def owned?
61
+ uid == Process.euid
62
+ end
63
+
64
+ def pipe?
65
+ false
66
+ end
67
+
68
+ def readable?
69
+ user_readable? || group_readable? || !!world_readable?
70
+ end
71
+
72
+ def readable_real?
73
+ user_readable_real? || group_readable_real? || !!world_readable?
74
+ end
75
+
76
+ def setgid?
77
+ !!(entry.mode & Fake::Entry::SETGID).nonzero?
78
+ end
79
+
80
+ def setuid?
81
+ !!(entry.mode & Fake::Entry::SETUID).nonzero?
82
+ end
83
+
84
+ def socket?
85
+ false
86
+ end
87
+
35
88
  def sticky?
36
89
  !!(entry.mode & Fake::Entry::USTICK).nonzero?
37
90
  end
38
91
 
39
92
  def symlink?
40
- File.symlink? entry.path
93
+ entry.is_a?(Fake::Symlink)
94
+ end
95
+
96
+ def world_readable?
97
+ entry.mode - 0100000 if (entry.mode & Fake::Entry::OREAD).nonzero?
41
98
  end
42
99
 
43
100
  def world_writable?
44
- entry.mode if (entry.mode & Fake::Entry::OWRITE).nonzero?
101
+ entry.mode - 0100000 if (entry.mode & Fake::Entry::OWRITE).nonzero?
102
+ end
103
+
104
+ def writable?
105
+ user_writable? || group_writable? || !!world_writable?
106
+ end
107
+
108
+ def writable_real?
109
+ user_writable_real? || group_writable_real? || !!world_writable?
110
+ end
111
+
112
+ def zero?
113
+ entry.content && entry.content.empty?
114
+ end
115
+
116
+ private
117
+
118
+ def group_executable?
119
+ grpowned? && !!(mode & Fake::Entry::GEXEC).nonzero?
120
+ end
121
+
122
+ def group_executable_real?
123
+ Process.gid == gid && !!(mode & Fake::Entry::GEXEC).nonzero?
124
+ end
125
+
126
+ def group_readable?
127
+ grpowned? && !!(mode & Fake::Entry::GREAD).nonzero?
128
+ end
129
+
130
+ def group_readable_real?
131
+ Process.gid == gid && !!(mode & Fake::Entry::GREAD).nonzero?
132
+ end
133
+
134
+ def group_writable?
135
+ grpowned? && !!(mode & Fake::Entry::GWRITE).nonzero?
136
+ end
137
+
138
+ def group_writable_real?
139
+ Process.gid == gid && !!(mode & Fake::Entry::GWRITE).nonzero?
140
+ end
141
+
142
+ def user_executable?
143
+ owned? && !!(mode & Fake::Entry::UEXEC).nonzero?
144
+ end
145
+
146
+ def user_executable_real?
147
+ Process.uid == uid && !!(mode & Fake::Entry::UEXEC).nonzero?
148
+ end
149
+
150
+ def user_readable?
151
+ owned? && !!(mode & Fake::Entry::UREAD).nonzero?
152
+ end
153
+
154
+ def user_readable_real?
155
+ Process.uid == uid && !!(mode & Fake::Entry::UREAD).nonzero?
156
+ end
157
+
158
+ def user_writable?
159
+ owned? && !!(mode & Fake::Entry::UWRITE).nonzero?
160
+ end
161
+
162
+ def user_writable_real?
163
+ Process.uid == uid && !!(mode & Fake::Entry::UWRITE).nonzero?
164
+ end
165
+
166
+ def world_executable?
167
+ entry.mode - 0100000 if (entry.mode & Fake::Entry::OEXEC).nonzero?
45
168
  end
46
169
  end
47
170
  end