memfs 0.3.0 → 0.4.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a6b1cfcdf00318e924ed6247443dffdee28f85e4
4
+ data.tar.gz: e902f9ddd053b6aa53388f5151d38e650b459874
5
+ SHA512:
6
+ metadata.gz: 4478660656ed0a1fc638a01f5010fc27f3673064f36f4cda41523029266b220907ffe28cb0337763e2b266e8afb0a29ba18289293a316c56dcfac00fed763814
7
+ data.tar.gz: 6417b9df0a65364af0c7a4e6f04389b68388b456e8d6b641634b2794687f743f6e971655959d29322efac885918a297b472aa2a5fa6a5003784dd4a2652a110c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0
4
+
5
+ * ADD: `Dir.chroot`
6
+ * ADD: `Dir.glob` and `Dir[]`
7
+ * ADD: `Dir.open`
8
+ * ADD: `Dir.tmpdir`
9
+ * ADD: `Dir#close`
10
+ * ADD: `Dir#path`
11
+ * ADD: `Dir#pos=`
12
+ * ADD: `Dir#pos`
13
+ * ADD: `Dir#read`
14
+ * ADD: `Dir#rewind`
15
+ * ADD: `Dir#seek`
16
+ * ADD: `Dir#tell`
17
+ * ADD: `Dir#to_path`
18
+ * FIX: Internal implementation methods are now private
19
+
3
20
  ## 0.3.0
4
21
 
5
22
  * FIX: The gem is now Ruby 1.9 compatible
data/lib/memfs/dir.rb CHANGED
@@ -5,11 +5,28 @@ module MemFs
5
5
  extend FilesystemAccess
6
6
  include Enumerable
7
7
 
8
+ attr_reader :pos
9
+
10
+ def self.[](*patterns)
11
+ glob(patterns)
12
+ end
13
+
8
14
  def self.chdir(path, &block)
9
15
  fs.chdir path, &block
10
16
  return 0
11
17
  end
12
18
 
19
+ def self.chroot(path)
20
+ unless Process.uid.zero?
21
+ raise Errno::EPERM, path
22
+ end
23
+
24
+ dir = fs.find_directory!(path)
25
+ dir.name = '/'
26
+ fs.root = dir
27
+ 0
28
+ end
29
+
13
30
  def self.entries(dirname, opts = {})
14
31
  fs.entries(dirname)
15
32
  end
@@ -30,6 +47,19 @@ module MemFs
30
47
  end
31
48
  class << self; alias :pwd :getwd; end
32
49
 
50
+ def self.glob(patterns, flags = 0)
51
+ patterns = [*patterns]
52
+ list = fs.paths.select do |path|
53
+ patterns.any? do |pattern|
54
+ File.fnmatch?(pattern, path, flags | GLOB_FLAGS)
55
+ end
56
+ end
57
+ # FIXME: ugly special case for /* and /
58
+ list.delete('/') if patterns.first == '/*'
59
+ return list unless block_given?
60
+ list.each { |path| yield path } and nil
61
+ end
62
+
33
63
  def self.home(*args)
34
64
  original_dir_class.home(*args)
35
65
  end
@@ -38,10 +68,26 @@ module MemFs
38
68
  fs.mkdir path
39
69
  end
40
70
 
71
+ def self.open(dirname)
72
+ dir = new(dirname)
73
+
74
+ if block_given?
75
+ yield dir
76
+ else
77
+ dir
78
+ end
79
+ ensure
80
+ dir && dir.close if block_given?
81
+ end
82
+
41
83
  def self.rmdir(path)
42
84
  fs.rmdir path
43
85
  end
44
86
 
87
+ def self.tmpdir
88
+ '/tmp'
89
+ end
90
+
45
91
  class << self
46
92
  alias :delete :rmdir
47
93
  alias :unlink :rmdir
@@ -49,6 +95,16 @@ module MemFs
49
95
 
50
96
  def initialize(path)
51
97
  self.entry = fs.find_directory!(path)
98
+ self.state = :open
99
+ @pos = 0
100
+ self.max_seek = 0
101
+ end
102
+
103
+ def close
104
+ if state == :closed
105
+ fail IOError, 'closed directory'
106
+ end
107
+ self.state = :closed
52
108
  end
53
109
 
54
110
  def each(&block)
@@ -56,12 +112,48 @@ module MemFs
56
112
  entry.entry_names.each(&block)
57
113
  end
58
114
 
115
+ def path
116
+ entry.path
117
+ end
118
+ alias :to_path :path
119
+
120
+ def pos=(position)
121
+ seek(position)
122
+ position
123
+ end
124
+
125
+ def read
126
+ name = entries[pos]
127
+ @pos += 1
128
+ self.max_seek = pos
129
+ name
130
+ end
131
+
132
+ def rewind
133
+ @pos = 0
134
+ self
135
+ end
136
+
137
+ def seek(position)
138
+ if (0..max_seek).cover?(position)
139
+ @pos = position
140
+ end
141
+ self
142
+ end
143
+
144
+ def tell
145
+ @pos
146
+ end
147
+
59
148
  private
60
149
 
61
- attr_accessor :entry
150
+ GLOB_FLAGS = File::FNM_EXTGLOB | File::FNM_PATHNAME
151
+
152
+ attr_accessor :entry, :max_seek, :state
62
153
 
63
154
  def self.original_dir_class
64
155
  MemFs::OriginalDir
65
156
  end
157
+ private_class_method :original_dir_class
66
158
  end
67
159
  end
@@ -43,6 +43,10 @@ module MemFs
43
43
  name == '/' ? '/' : super
44
44
  end
45
45
 
46
+ def paths
47
+ [path] + entries.reject { |p| %w[. ..].include?(p) }.values.map(&:paths).flatten
48
+ end
49
+
46
50
  def remove_entry(entry)
47
51
  entries.delete(entry.name)
48
52
  end
@@ -78,6 +78,10 @@ module MemFs
78
78
  MemFs::File.join(parts)
79
79
  end
80
80
 
81
+ def paths
82
+ [path]
83
+ end
84
+
81
85
  def touch
82
86
  self.atime = self.mtime = Time.now
83
87
  end
data/lib/memfs/file.rb CHANGED
@@ -226,9 +226,6 @@ module MemFs
226
226
  file_names.size
227
227
  end
228
228
 
229
- attr_accessor :closed,
230
- :entry,
231
- :opening_mode
232
229
  attr_reader :path
233
230
 
234
231
  def initialize(filename, mode = RDONLY, perm = nil, opt = nil)
@@ -265,10 +262,6 @@ module MemFs
265
262
  closed
266
263
  end
267
264
 
268
- def content
269
- entry.content
270
- end
271
-
272
265
  def lstat
273
266
  File.lstat(path)
274
267
  end
@@ -318,6 +311,10 @@ module MemFs
318
311
 
319
312
  private
320
313
 
314
+ attr_accessor :closed,
315
+ :entry,
316
+ :opening_mode
317
+
321
318
  def self.dereference_name(path)
322
319
  if entry = fs.find(path)
323
320
  entry.dereferenced_name
@@ -325,30 +322,41 @@ module MemFs
325
322
  basename(path)
326
323
  end
327
324
  end
325
+ private_class_method :dereference_name
328
326
 
329
327
  def self.dereference_dir_path(path)
330
328
  dereference_path(dirname(path))
331
329
  end
330
+ private_class_method :dereference_dir_path
332
331
 
333
332
  def self.dereference_path(path)
334
333
  fs.find!(path).dereferenced_path
335
334
  end
335
+ private_class_method :dereference_path
336
336
 
337
337
  def self.loose_dereference_path(path)
338
338
  join(dereference_dir_path(path), dereference_name(path))
339
339
  end
340
+ private_class_method :loose_dereference_path
340
341
 
341
342
  def self.original_file_class
342
343
  MemFs::OriginalFile
343
344
  end
345
+ private_class_method :original_file_class
344
346
 
345
347
  def self.stat_query(path, query)
346
348
  fs.find(path) && stat(path).public_send(query)
347
349
  end
350
+ private_class_method :stat_query
348
351
 
349
352
  def self.lstat_query(path, query)
350
353
  fs.find(path) && lstat(path).public_send(query)
351
354
  end
355
+ private_class_method :lstat_query
356
+
357
+ def content
358
+ entry.content
359
+ end
352
360
 
353
361
  def str_to_mode_int(mode)
354
362
  return mode unless mode.is_a?(String)
@@ -30,6 +30,7 @@ module MemFs
30
30
 
31
31
  def clear!
32
32
  self.root = Fake::Directory.new('/')
33
+ self.mkdir('/tmp')
33
34
  self.chdir('/')
34
35
  end
35
36
 
@@ -102,6 +103,10 @@ module MemFs
102
103
  find_parent!(path).add_entry Fake::Directory.new(path)
103
104
  end
104
105
 
106
+ def paths
107
+ root.paths
108
+ end
109
+
105
110
  def rename(old_name, new_name)
106
111
  file = find!(old_name)
107
112
  file.delete
@@ -1,5 +1,7 @@
1
1
  module MemFs
2
2
  module FilesystemAccess
3
+ private
4
+
3
5
  def fs
4
6
  FileSystem.instance
5
7
  end
data/lib/memfs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MemFs
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -6,14 +6,26 @@ module MemFs
6
6
 
7
7
  let(:instance) { MemFs::Dir.new('/test') }
8
8
 
9
- before :each do
10
- subject.mkdir '/test'
11
- end
9
+ before { subject.mkdir '/test' }
12
10
 
13
11
  it 'is Enumerable' do
14
12
  expect(instance).to be_an(Enumerable)
15
13
  end
16
14
 
15
+ describe '[]' do
16
+ context 'when a string is given' do
17
+ it 'acts like calling glob' do
18
+ expect(subject['/*']).to eq %w[/tmp /test]
19
+ end
20
+ end
21
+
22
+ context 'when a list of strings is given' do
23
+ it 'acts like calling glob' do
24
+ expect(subject['/tm*', '/te*']).to eq %w[/tmp /test]
25
+ end
26
+ end
27
+ end
28
+
17
29
  describe '.chdir' do
18
30
  it "changes the current working directory" do
19
31
  subject.chdir '/test'
@@ -34,7 +46,7 @@ module MemFs
34
46
  expect(subject.pwd).to eq('/test')
35
47
  end
36
48
  end
37
-
49
+
38
50
  it "gets back to previous directory once the block is finished" do
39
51
  subject.chdir '/'
40
52
  expect {
@@ -44,6 +56,44 @@ module MemFs
44
56
  end
45
57
  end
46
58
 
59
+ describe '.chroot' do
60
+ before { Process.stub(uid: 0) }
61
+
62
+ it "changes the process's idea of the file system root" do
63
+
64
+ subject.mkdir('/test/subdir')
65
+ subject.chroot('/test')
66
+
67
+ expect(File.exist?('/subdir')).to be true
68
+ end
69
+
70
+ it 'returns zero' do
71
+ expect(subject.chroot('/test')).to eq 0
72
+ end
73
+
74
+ context "when the given path is a file" do
75
+ before { fs.touch('/test/test-file') }
76
+
77
+ it 'raises an exception' do
78
+ expect{ subject.chroot('/test/test-file') }.to raise_error(Errno::ENOTDIR)
79
+ end
80
+ end
81
+
82
+ context "when the given path doesn't exist" do
83
+ it 'raises an exception' do
84
+ expect{ subject.chroot('/no-dir') }.to raise_error(Errno::ENOENT)
85
+ end
86
+ end
87
+
88
+ context 'when the user is not root' do
89
+ before { Process.stub(uid: 42) }
90
+
91
+ it 'raises an exception' do
92
+ expect{ subject.chroot('/no-dir') }.to raise_error(Errno::EPERM)
93
+ end
94
+ end
95
+ end
96
+
47
97
  describe ".delete" do
48
98
  it_behaves_like 'aliased method', :delete, :rmdir
49
99
  end
@@ -137,6 +187,61 @@ module MemFs
137
187
  end
138
188
  end
139
189
 
190
+ describe '.glob' do
191
+ before do
192
+ fs.clear!
193
+ 3.times do |dirnum|
194
+ fs.mkdir "/test#{dirnum}"
195
+ fs.mkdir "/test#{dirnum}/subdir"
196
+ 3.times do |filenum|
197
+ fs.touch "/test#{dirnum}/subdir/file#{filenum}"
198
+ end
199
+ end
200
+ end
201
+
202
+ shared_examples 'returning matching filenames' do |pattern, filenames|
203
+ it "with #{pattern}" do
204
+ expect(subject.glob(pattern)).to eq filenames
205
+ end
206
+ end
207
+
208
+ it_behaves_like 'returning matching filenames', '/', %w[/]
209
+ it_behaves_like 'returning matching filenames', '/test0', %w[/test0]
210
+ it_behaves_like 'returning matching filenames', '/*', %w[/tmp /test0 /test1 /test2]
211
+ it_behaves_like 'returning matching filenames', '/test*', %w[/test0 /test1 /test2]
212
+ it_behaves_like 'returning matching filenames', '/*0', %w[/test0]
213
+ it_behaves_like 'returning matching filenames', '/*es*', %w[/test0 /test1 /test2]
214
+ it_behaves_like 'returning matching filenames', '/**/file0', %w[/test0/subdir/file0 /test1/subdir/file0 /test2/subdir/file0]
215
+ it_behaves_like 'returning matching filenames', '/test?', %w[/test0 /test1 /test2]
216
+ it_behaves_like 'returning matching filenames', '/test[01]', %w[/test0 /test1]
217
+ it_behaves_like 'returning matching filenames', '/test[^2]', %w[/test0 /test1]
218
+ it_behaves_like 'returning matching filenames', '/test{1,2}', %w[/test1 /test2]
219
+
220
+ context 'when a flag is given' do
221
+ it 'uses it to compare filenames' do
222
+ expect(subject.glob('/TEST*', File::FNM_CASEFOLD)).to eq \
223
+ %w[/test0 /test1 /test2]
224
+ end
225
+ end
226
+
227
+ context 'when a block is given' do
228
+ it 'calls the block with every matching filenames' do
229
+ expect{ |blk| subject.glob('/test*', &blk) }.to \
230
+ yield_successive_args('/test0', '/test1', '/test2')
231
+ end
232
+
233
+ it 'returns nil' do
234
+ expect(subject.glob('/*') {}).to be nil
235
+ end
236
+ end
237
+
238
+ context 'when pattern is an array of patterns' do
239
+ it 'returns the list of files matching any pattern' do
240
+ expect(subject.glob(['/*0', '/*1'])).to eq %w[/test0 /test1]
241
+ end
242
+ end
243
+ end
244
+
140
245
  describe '.home' do
141
246
  it 'returns the home directory of the current user' do
142
247
  expect(subject.home).to eq ENV['HOME']
@@ -163,6 +268,44 @@ module MemFs
163
268
  end
164
269
  end
165
270
 
271
+ describe '.open' do
272
+ context 'when no block is given' do
273
+ it 'returns the opened directory' do
274
+ expect(subject.open('/test')).to be_a(Dir)
275
+ end
276
+ end
277
+
278
+ context 'when a block is given' do
279
+ it 'calls the block with the opened directory as argument' do
280
+ expect{ |blk| subject.open('/test', &blk) }.to yield_with_args(Dir)
281
+ end
282
+
283
+ it 'returns nil' do
284
+ expect(subject.open('/test') {}).to be_nil
285
+ end
286
+
287
+ it 'ensures the directory is closed' do
288
+ dir = nil
289
+ subject.open('/test') { |d| dir = d }
290
+ expect{ dir.close }.to raise_error(IOError)
291
+ end
292
+ end
293
+
294
+ context "when the given directory doesn't exist" do
295
+ it 'raises an exception' do
296
+ expect{ subject.open('/no-dir') }.to raise_error
297
+ end
298
+ end
299
+
300
+ context 'when the given path is not a directory' do
301
+ before { fs.touch('/test/test-file') }
302
+
303
+ it 'raises an exception' do
304
+ expect{ subject.open('/test/test-file') }.to raise_error
305
+ end
306
+ end
307
+ end
308
+
166
309
  describe '.new' do
167
310
  context "when the given directory doesn't exist" do
168
311
  it 'raises an exception' do
@@ -199,10 +342,24 @@ module MemFs
199
342
  end
200
343
  end
201
344
 
345
+ describe '.tmpdir' do
346
+ it 'returns /tmp' do
347
+ expect(subject.tmpdir).to eq '/tmp'
348
+ end
349
+ end
350
+
202
351
  describe ".unlink" do
203
352
  it_behaves_like 'aliased method', :unlink, :rmdir
204
353
  end
205
354
 
355
+ describe '#close' do
356
+ it 'closes the directory' do
357
+ dir = subject.open('/test')
358
+ dir.close
359
+ expect{ dir.close }.to raise_error(IOError)
360
+ end
361
+ end
362
+
206
363
  describe '#each' do
207
364
  before { fs.touch('/test/test-file', '/test/test-file2') }
208
365
 
@@ -222,5 +379,122 @@ module MemFs
222
379
  end
223
380
  end
224
381
  end
382
+
383
+ describe '#path' do
384
+ it "returns the path parameter passed to dir’s constructor" do
385
+ expect(instance.path).to eq '/test'
386
+ end
387
+ end
388
+
389
+ describe '#pos' do
390
+ it "returns the current position in dir" do
391
+ 3.times { instance.read }
392
+ expect(instance.pos).to eq 3
393
+ end
394
+ end
395
+
396
+ describe '#pos=' do
397
+ before { 3.times { instance.read } }
398
+
399
+ it 'seeks to a particular location in dir' do
400
+ instance.pos = 1
401
+ expect(instance.pos).to eq 1
402
+ end
403
+
404
+ it 'returns the given position' do
405
+ expect(instance.pos = 2).to eq 2
406
+ end
407
+
408
+ context 'when the location has not been seeked yet' do
409
+ it "doesn't change the location" do
410
+ instance.pos = 42
411
+ expect(instance.pos).to eq 3
412
+ end
413
+ end
414
+
415
+ context 'when the location is negative' do
416
+ it "doesn't change the location" do
417
+ instance.pos = -1
418
+ expect(instance.pos).to eq 3
419
+ end
420
+ end
421
+ end
422
+
423
+ describe '#read' do
424
+ before do
425
+ fs.touch('/test/a')
426
+ fs.touch('/test/b')
427
+ end
428
+
429
+ it 'reads the next entry from dir and returns it' do
430
+ expect(instance.read).to eq '.'
431
+ end
432
+
433
+ context "when calling several times" do
434
+ it 'returns the next entry each time' do
435
+ 2.times { instance.read }
436
+ expect(instance.read).to eq 'a'
437
+ end
438
+ end
439
+
440
+ context 'when there are no entries left' do
441
+ it 'returns nil' do
442
+ 4.times { instance.read }
443
+ expect(instance.read).to be_nil
444
+ end
445
+ end
446
+ end
447
+
448
+ describe '#rewind' do
449
+ it 'repositions dir to the first entry' do
450
+ 3.times { instance.read }
451
+ instance.rewind
452
+ expect(instance.read).to eq '.'
453
+ end
454
+
455
+ it 'returns the dir itself' do
456
+ expect(instance.rewind).to be instance
457
+ end
458
+ end
459
+
460
+ describe '#seek' do
461
+ before { 3.times { instance.read } }
462
+
463
+ it 'seeks to a particular location in dir' do
464
+ instance.seek(1)
465
+ expect(instance.pos).to eq 1
466
+ end
467
+
468
+ it 'returns the dir itself' do
469
+ expect(instance.seek(2)).to be instance
470
+ end
471
+
472
+ context 'when the location has not been seeked yet' do
473
+ it "doesn't change the location" do
474
+ instance.seek(42)
475
+ expect(instance.pos).to eq 3
476
+ end
477
+ end
478
+
479
+ context 'when the location is negative' do
480
+ it "doesn't change the location" do
481
+ instance.seek(-1)
482
+ expect(instance.pos).to eq 3
483
+ end
484
+ end
485
+ end
486
+
487
+ describe '#tell' do
488
+ it 'returns the current position in dir' do
489
+ 3.times { instance.read }
490
+ expect(instance.tell).to eq 3
491
+ end
492
+ end
493
+
494
+ describe '#to_path' do
495
+ it "returns the path parameter passed to dir’s constructor" do
496
+ expect(instance.to_path).to eq '/test'
497
+ end
498
+ end
225
499
  end
226
500
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module MemFs
4
4
  module Fake
5
5
  describe Directory do
6
- let(:directory) { Directory.new('/test') }
6
+ let(:directory) { Directory.new('test') }
7
7
 
8
8
  describe '.new' do
9
9
  it "sets . in the entries list" do
@@ -101,6 +101,20 @@ module MemFs
101
101
  end
102
102
  end
103
103
 
104
+ describe '#paths' do
105
+ before do
106
+ subdir = Directory.new('subdir')
107
+ directory.add_entry(subdir)
108
+ subdir.add_entry File.new('file1')
109
+ subdir.add_entry File.new('file2')
110
+ end
111
+
112
+ it 'returns the path of the directory and its entries recursively' do
113
+ expect(directory.paths).to eq \
114
+ %w[test test/subdir test/subdir/file1 test/subdir/file2]
115
+ end
116
+ end
117
+
104
118
  describe "#remove_entry" do
105
119
  let(:file) { File.new('file') }
106
120
 
@@ -141,6 +141,12 @@ module MemFs
141
141
  end
142
142
  end
143
143
 
144
+ describe 'paths' do
145
+ it 'returns an array containing the entry path' do
146
+ expect(entry.paths).to eq ['/parent/test']
147
+ end
148
+ end
149
+
144
150
  describe "#touch" do
145
151
  let(:time) { Time.now - 5000 }
146
152
 
@@ -699,14 +699,14 @@ module MemFs
699
699
  context "and it is an integer" do
700
700
  it "sets the mode to the integer value" do
701
701
  file = subject.new('/test-file', File::RDWR)
702
- expect(file.opening_mode).to eq(File::RDWR)
702
+ expect(file.send(:opening_mode)).to eq(File::RDWR)
703
703
  end
704
704
  end
705
705
 
706
706
  context "and it is a string" do
707
707
  it "sets the mode to the integer value" do
708
708
  file = subject.new('/test-file', 'r+')
709
- expect(file.opening_mode).to eq(File::RDWR)
709
+ expect(file.send(:opening_mode)).to eq(File::RDWR)
710
710
  end
711
711
  end
712
712
 
@@ -1771,7 +1771,7 @@ module MemFs
1771
1771
  file = subject.new('/test-file', 'w')
1772
1772
  file.puts "test"
1773
1773
  file.close
1774
- expect(file.content.to_s).to eq("test\n")
1774
+ expect(file.send(:content).to_s).to eq("test\n")
1775
1775
  end
1776
1776
 
1777
1777
  it "does not override the file's content" do
@@ -1779,7 +1779,7 @@ module MemFs
1779
1779
  file.puts "test"
1780
1780
  file.puts "test"
1781
1781
  file.close
1782
- expect(file.content.to_s).to eq("test\ntest\n")
1782
+ expect(file.send(:content).to_s).to eq("test\ntest\n")
1783
1783
  end
1784
1784
 
1785
1785
  it "raises an exception if the file is not writable" do
@@ -135,7 +135,7 @@ module MemFs
135
135
  describe '#clear!' do
136
136
  it "clear the registred entries" do
137
137
  subject.clear!
138
- expect(subject.root.entry_names).to eq(%w[. ..])
138
+ expect(subject.root.entry_names).to eq(%w[. .. tmp])
139
139
  end
140
140
 
141
141
  it "sets the current directory to /" do
@@ -310,6 +310,18 @@ module MemFs
310
310
  end
311
311
  end
312
312
 
313
+ describe '#paths' do
314
+ before do
315
+ subject.mkdir('/test-dir/subdir')
316
+ subject.touch('/test-dir/subdir/file1', '/test-dir/subdir/file2')
317
+ end
318
+
319
+ it 'returns the list of all the existing paths' do
320
+ expect(subject.paths).to eq \
321
+ %w[/ /tmp /test-dir /test-dir/subdir /test-dir/subdir/file1 /test-dir/subdir/file2]
322
+ end
323
+ end
324
+
313
325
  describe "#pwd" do
314
326
  it_behaves_like 'aliased method', :pwd, :getwd
315
327
  end
metadata CHANGED
@@ -1,142 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Simon COURTOIS
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-03-08 00:00:00.000000000 Z
11
+ date: 2014-07-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: coveralls
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0.6'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0.6'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '10.0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '10.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: '2.14'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: '2.14'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: guard
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: '1.5'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: '1.5'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: guard-rspec
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
75
  version: '2.1'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
82
  version: '2.1'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rb-inotify
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ~>
87
+ - - "~>"
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0.8'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ~>
94
+ - - "~>"
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0.8'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rb-fsevent
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ~>
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0.9'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ~>
108
+ - - "~>"
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0.9'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rb-fchange
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ~>
115
+ - - "~>"
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0.0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ~>
122
+ - - "~>"
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0.0'
142
125
  description: MemFs provides a fake file system that can be used for tests. Strongly
@@ -147,9 +130,9 @@ executables: []
147
130
  extensions: []
148
131
  extra_rdoc_files: []
149
132
  files:
150
- - .gitignore
151
- - .rspec
152
- - .travis.yml
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".travis.yml"
153
136
  - CHANGELOG.md
154
137
  - Gemfile
155
138
  - Guardfile
@@ -184,34 +167,27 @@ files:
184
167
  homepage: http://github.com/simonc/memfs
185
168
  licenses:
186
169
  - MIT
170
+ metadata: {}
187
171
  post_install_message:
188
172
  rdoc_options: []
189
173
  require_paths:
190
174
  - lib
191
175
  required_ruby_version: !ruby/object:Gem::Requirement
192
- none: false
193
176
  requirements:
194
- - - ! '>='
177
+ - - ">="
195
178
  - !ruby/object:Gem::Version
196
179
  version: '0'
197
- segments:
198
- - 0
199
- hash: 711481126562546659
200
180
  required_rubygems_version: !ruby/object:Gem::Requirement
201
- none: false
202
181
  requirements:
203
- - - ! '>='
182
+ - - ">="
204
183
  - !ruby/object:Gem::Version
205
184
  version: '0'
206
- segments:
207
- - 0
208
- hash: 711481126562546659
209
185
  requirements: []
210
186
  rubyforge_project:
211
- rubygems_version: 1.8.23
187
+ rubygems_version: 2.2.2
212
188
  signing_key:
213
- specification_version: 3
214
- summary: memfs-0.3.0
189
+ specification_version: 4
190
+ summary: memfs-0.4.0
215
191
  test_files:
216
192
  - spec/fileutils_spec.rb
217
193
  - spec/memfs/dir_spec.rb