ruby_ex 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/ChangeLog +177 -0
  2. data/NEWS +20 -11
  3. data/SPEC.dyn.yml +4 -4
  4. data/SPEC.gemspec +4 -4
  5. data/SPEC.yml +4 -1
  6. data/lib/cache.rb +2 -2
  7. data/lib/commands.rb +19 -1
  8. data/lib/commands/command.rb +5 -5
  9. data/lib/commands/datas/composite.rb +26 -4
  10. data/lib/commands/datas/data.rb +6 -5
  11. data/lib/commands/pipe.rb +55 -14
  12. data/lib/commands/runners/fork.rb +6 -2
  13. data/lib/commands/runners/{mock.rb → mockable.rb} +21 -22
  14. data/lib/commands/runners/runner.rb +13 -1
  15. data/lib/d_logger.rb +11 -5
  16. data/lib/diff_tools.rb +141 -0
  17. data/lib/drb/insecure_protected_methods.rb +2 -2
  18. data/lib/file_type.rb +29 -21
  19. data/lib/hookable.rb +17 -2
  20. data/lib/md5sum.rb +2 -2
  21. data/lib/module/autoload_tree.rb +2 -2
  22. data/lib/ordered_hash.rb +28 -1
  23. data/lib/regex_list.rb +192 -0
  24. data/lib/ruby_ex.rb +8 -5
  25. data/lib/sendmail.rb +8 -1
  26. data/lib/sym_tbl_gsub.rb +44 -18
  27. data/lib/uri/file.rb +2 -2
  28. data/lib/uri/ftp_ex.rb +2 -2
  29. data/lib/uri/http_ex.rb +2 -2
  30. data/lib/uri/ssh.rb +1 -1
  31. data/lib/uri/svn.rb +2 -2
  32. data/lib/uri_ex.rb +4 -7
  33. data/lib/yaml/chop_header.rb +1 -1
  34. data/test/check-pkg-ruby_ex.yml +5 -7
  35. data/test/check-ruby_ex.yml +6 -10
  36. data/test/{resources → fixtures}/autoload_tree/A.rb +0 -0
  37. data/test/{resources → fixtures}/autoload_tree/B.rb +0 -0
  38. data/test/{resources → fixtures}/autoload_tree/foo/C.rb +0 -0
  39. data/test/fixtures/foo.bz2 +0 -0
  40. data/test/fixtures/foo.gz.zip +0 -0
  41. data/test/fixtures/foo.rb.gz +0 -0
  42. data/test/fixtures/foo.tar +0 -0
  43. data/test/fixtures/foo.tar.bz2 +0 -0
  44. data/test/{resources → fixtures}/foo.tar.gz +0 -0
  45. data/test/{resources → fixtures}/foo.txt +0 -0
  46. data/test/fixtures/my_diff.patch +164 -0
  47. data/test/{resources → fixtures}/tar.gz.log +0 -0
  48. data/test/sanity/multiple-requires.yml +1 -1
  49. data/test/sanity/single-requires.yml +1 -1
  50. metadata +23 -16
@@ -1,36 +1,61 @@
1
1
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
2
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
3
  # License:: GNU General Public License (GPL).
4
- # Revision:: $Id: pipe.rb 341 2005-09-07 00:01:43Z ertai $
4
+ # Revision:: $Id: pipe.rb 365 2005-09-24 17:24:01Z ertai $
5
5
 
6
6
  require 'commands'
7
7
 
8
+ class IO
9
+
10
+ def pipe?
11
+ false
12
+ end
13
+
14
+ class << self
15
+
16
+ alias_method :pipe_without_pipe?, :pipe
17
+
18
+ def pipe
19
+ ios = pipe_without_pipe?
20
+ ios.each do |io|
21
+ io.send(:define_singleton_method, :pipe?) { true }
22
+ end
23
+ ios
24
+ end
25
+
26
+ end # class << self
27
+
28
+ end # class IO
29
+
8
30
  module Commands
9
31
 
10
32
  class Pipe < Command
11
33
 
12
34
  def initialize ( *cmds )
13
- @cmds = cmds.map { |x| x.dup }
14
- @input, @output, @error = nil, nil, nil
35
+ @cmds = cmds.flatten.map { |x| x.dup }
15
36
  end
16
37
 
17
- def run ( *a )
18
- pids = []
38
+ def run ( runner=@runner )
39
+ datas = Datas::Composite.new
40
+ runner = runner.dup
41
+ runner.hook_trigger :display_command, self
42
+ runner.disable_hook :display_command
43
+ runner.disable_hook :waitpid
19
44
  ([nil] + @cmds).zip(@cmds + [nil]).each do |cmd1, cmd2|
20
45
  next if cmd1.nil? or cmd2.nil?
21
46
  rd, wr = IO.pipe
47
+ cmd1_runner = runner.dup
48
+ cmd1_runner.disable_hook :waitpid
49
+ cmd1_runner.subscribe_hook(:son) { rd.close }
22
50
  cmd1.output = wr
23
51
  cmd2.input = rd
24
- pids << Kernel.fork do
25
- rd.close
26
- cmd1.exec
27
- end
52
+ datas << cmd1.run(cmd1_runner)
28
53
  wr.close
29
54
  end
30
- pids << Kernel.fork do
31
- @cmds.last.exec
32
- end
33
- pids.each { |pid| Process.waitpid pid }
55
+ runner = runner.dup
56
+ datas << @cmds.last.run(runner)
57
+ datas.waitpid if runner.is_a? Runners::System
58
+ datas
34
59
  end
35
60
 
36
61
  def input= ( arg )
@@ -65,11 +90,27 @@ module Commands
65
90
  }
66
91
  end
67
92
 
93
+ def [] ( *args )
94
+ new_cmds = @cmds.dup
95
+ new_cmds[-1] = new_cmds.last[*args]
96
+ Pipe.new(*new_cmds)
97
+ end
98
+
99
+ #
100
+ # Conversion methods
101
+ #
102
+
68
103
  def to_sh
69
104
  strs = @cmds.map { |cmd| "(#{cmd.to_sh})" }
70
- "(#{strs.join(' | ')})#{sh_args}"
105
+ "#{strs.join(' | ')}"
71
106
  end
72
107
 
108
+ def to_s
109
+ to_sh
110
+ end
111
+
112
+
113
+
73
114
  end # class Pipe
74
115
 
75
116
  end # module Commands
@@ -1,7 +1,7 @@
1
1
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
2
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
3
  # License:: GNU General Public License (GPL).
4
- # Revision:: $Id: fork.rb 358 2005-09-16 09:54:04Z ertai $
4
+ # Revision:: $Id: fork.rb 374 2005-09-29 19:25:47Z ertai $
5
5
 
6
6
  require 'commands'
7
7
 
@@ -30,7 +30,7 @@ module Commands
30
30
  def run_impl ( aCommand, data )
31
31
  data.pid = Kernel.fork do
32
32
  begin
33
- TempPath.fork_init
33
+ TempPath.fork_init true
34
34
  hook_trigger :son, aCommand, data
35
35
  super
36
36
  rescue Exception => ex
@@ -74,6 +74,10 @@ module Commands
74
74
  self
75
75
  end
76
76
 
77
+ def before_exec ( command, data )
78
+ TempPath.clean
79
+ end
80
+
77
81
  end # class Fork
78
82
 
79
83
 
@@ -1,7 +1,7 @@
1
1
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
2
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
3
  # License:: GNU General Public License (GPL).
4
- # Revision:: $Id: mock.rb 302 2005-06-23 21:03:51Z ertai $
4
+ # Revision:: $Id: mockable.rb 365 2005-09-24 17:24:01Z ertai $
5
5
 
6
6
  require 'commands'
7
7
 
@@ -9,41 +9,40 @@ module Commands
9
9
 
10
10
  module Runners
11
11
 
12
- class Mock < Runner
13
- concrete
12
+ module Mockable
14
13
 
15
- attr_reader :log
16
-
17
- def initialize ( *a, &b )
14
+ def make_mock ( &block )
18
15
  @log = []
19
- @contents = b
20
- super
21
- end
16
+ @block = block
22
17
 
23
- def run_impl ( aCommand, data )
24
- end
18
+ class << self
19
+ attr_reader :log
20
+ attr_accessor :block
25
21
 
26
- def run ( aCommand )
27
- d = super
28
- d.output.open('w', &@contents)
29
- d.status = 0
30
- d
31
- end
22
+ def exec ( aCommand, aData )
23
+ @block[aCommand, aData]
24
+ end
32
25
 
33
- def display_command ( m )
34
- @log << m
35
- end
26
+ def display_command ( m )
27
+ @log << m
28
+ end
29
+ end # class << self
36
30
 
37
- end # class Mock
31
+ self
32
+ end
38
33
 
34
+ end # module Mock
39
35
 
36
+ class Runner
37
+ include Mockable
38
+ end
40
39
 
41
40
  test_section __FILE__ do
42
41
 
43
42
  class MockTest < Test::Unit::TestCase
44
43
 
45
44
  def setup
46
- assert_nothing_raised { @runner = Mock.new }
45
+ assert_nothing_raised { @runner = System.new.make_mock }
47
46
  end
48
47
 
49
48
  def test_0_initialize
@@ -1,7 +1,7 @@
1
1
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
2
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
3
  # License:: GNU General Public License (GPL).
4
- # Revision:: $Id: runner.rb 343 2005-09-08 01:32:57Z ertai $
4
+ # Revision:: $Id: runner.rb 374 2005-09-29 19:25:47Z ertai $
5
5
 
6
6
  require 'commands'
7
7
 
@@ -46,6 +46,16 @@ module Commands
46
46
  end
47
47
 
48
48
 
49
+ def initialize_copy ( copy )
50
+ super
51
+ if defined? @hookers
52
+ @hookers = @hookers.dup
53
+ else
54
+ @hookers = []
55
+ end
56
+ end
57
+
58
+
49
59
  #
50
60
  # Methods.
51
61
  #
@@ -75,6 +85,8 @@ module Commands
75
85
  STDIN.reopen(data.input.to_io_for_commands) unless data.input.nil?
76
86
  STDOUT.reopen(data.output.to_io_for_commands) unless data.output.nil?
77
87
  STDERR.reopen(data.error.to_io_for_commands) unless data.error.nil?
88
+ STDOUT.flush
89
+ STDERR.flush
78
90
 
79
91
  hook_trigger :before_chdir, data
80
92
  Dir.chdir(aCommand.dir) unless aCommand.dir.nil?
@@ -3,7 +3,7 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: d_logger.rb 339 2005-09-06 23:27:27Z ertai $
6
+ # $Id: d_logger.rb 389 2005-10-03 00:46:17Z ertai $
7
7
 
8
8
  require 'logger'
9
9
 
@@ -29,8 +29,14 @@ class DLogger < Logger
29
29
  end
30
30
 
31
31
  Format = "%s, [%s#%d] %6s -- %s: %s\n"
32
- def format_message(severity, timestamp, msg, progname)
33
- Format % [severity[0..0], timestamp, $$, severity, progname, msg]
32
+ if Logger.const_defined? :VERSION and Logger::VERSION >= '1.2.6'
33
+ def format_message(severity, timestamp, progname, msg)
34
+ Format % [severity[0..0], timestamp, $$, severity, progname, msg]
35
+ end
36
+ else
37
+ def format_message(severity, timestamp, msg, progname)
38
+ Format % [severity[0..0], timestamp, $$, severity, progname, msg]
39
+ end
34
40
  end
35
41
  private :format_message
36
42
 
@@ -51,8 +57,8 @@ test_section __FILE__ do
51
57
  log.debug3 'You don\'t see me'
52
58
  log.debug2 'You see me'
53
59
  cout.rewind
54
- ref = /D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG -- : You see me
55
- D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG2 -- : You see me/
60
+ ref = /D, \[[\d\w: .-]+#\d+\] DEBUG -- : You see me
61
+ D, \[[\d\w: .-]+#\d+\] DEBUG2 -- : You see me/
56
62
  assert_match(ref, cout.readlines.join)
57
63
  end
58
64
 
@@ -0,0 +1,141 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: diff_tools.rb 380 2005-09-29 22:08:05Z ertai $
5
+
6
+ RegexList.import!
7
+
8
+ module DiffTools
9
+
10
+ class Diff
11
+
12
+ def initialize ( anObject=nil )
13
+ @chunks = {}
14
+ @path_list = PathList.new
15
+ case anObject
16
+ when String
17
+ anObject.split(/^Index: /m).each do |chunk|
18
+ self << 'Index: ' + chunk unless chunk.empty?
19
+ end
20
+ when Diff
21
+ merge! anObject
22
+ when Array
23
+ anObject.flatten.each { |chunk| self << chunk }
24
+ when NilClass
25
+ else
26
+ raise TypeError, "Unexpected type #{anObject.class}"
27
+ end
28
+ end
29
+
30
+ def << ( chunk )
31
+ chunk = Chunk.new(chunk) unless chunk.is_a? Chunk
32
+ if @path_list.include? chunk.path
33
+ raise ArgumentError, "Already have the path `#{chunk.path}'"
34
+ end
35
+ @chunks[chunk.path] = chunk
36
+ @path_list << chunk.path
37
+ end
38
+
39
+ def [] ( *args )
40
+ grep(*args)
41
+ end
42
+
43
+ def create ( path_list )
44
+ result = Diff.new
45
+ path_list.each do |path|
46
+ result << @chunks[path]
47
+ end
48
+ result
49
+ end
50
+ protected :create
51
+
52
+ def grep ( *args )
53
+ create @path_list.grep_with_regex_list(RegexList.new(args))
54
+ end
55
+
56
+ def negative ( *args )
57
+ create @path_list.grep_with_negative_regex_list(RegexList.new(args))
58
+ end
59
+
60
+ def exclude ( *args )
61
+ create @path_list.exclude_with_regex_list(RegexList.new(args))
62
+ end
63
+
64
+ def to_s
65
+ @chunks.values.join
66
+ end
67
+
68
+ end # class Diff
69
+
70
+
71
+
72
+ class Chunk
73
+
74
+ attr_reader :path, :contents
75
+
76
+ def initialize ( anObject )
77
+ case anObject
78
+ when String
79
+ @path = anObject[/\AIndex: (.+)$/, 1]
80
+ raise ArgumentError, "The path cannot be empty (#{anObject})" if @path.nil? or @path.empty?
81
+ @contents = anObject
82
+ else
83
+ raise TypeError, "Unexpected type #{anObject.class}"
84
+ end
85
+ end
86
+
87
+ def to_s
88
+ @contents
89
+ end
90
+
91
+ def inspect
92
+ "#<#{self.class}: Index: #@path>"
93
+ end
94
+
95
+ end # class Chunk
96
+
97
+
98
+
99
+ class App
100
+ def initialize ( stdin, stdout, stderr, argv )
101
+ gre, neg, exc = [], [], []
102
+ argv.each do |arg|
103
+ case arg
104
+ when /^(.*)!$/ then exc << $1
105
+ when /^(.*)-$/ then neg << $1
106
+ else gre << arg
107
+ end
108
+ end
109
+ stdout.puts Diff.new(stdin.read).exclude(exc).negative(neg).grep(gre)
110
+ end
111
+ end # class App
112
+
113
+ end # module DiffTools
114
+
115
+
116
+ DiffTools::App.new(STDIN, STDOUT, STDERR, ARGV) if $0 == __FILE__
117
+
118
+
119
+ test_section __FILE__ do
120
+
121
+ class TestDiffTools < ::Test::Unit::TestCase
122
+
123
+ def setup
124
+ @fixtures = 'test'.to_path/'fixtures'
125
+ @my_diff = @fixtures/'my_diff.patch'
126
+ @output_diff = TempPath.new('output_diff.patch')
127
+ # @output_diff = '/tmp/output_diff.patch'.to_path
128
+ end
129
+
130
+ def teardown
131
+ end
132
+
133
+ def test_example
134
+ diff = DiffTools::Diff.new(@my_diff.read)
135
+ sorted = diff[/NEWS/, /^[^.]*$/, /core_ex/, /ruby_ex/, //]
136
+ @output_diff.open('w') { |f| f.puts sorted.to_s }
137
+ end
138
+
139
+ end # class TestDiffTools
140
+
141
+ end
@@ -3,7 +3,7 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: insecure_protected_methods.rb 339 2005-09-06 23:27:27Z ertai $
6
+ # $Id: insecure_protected_methods.rb 385 2005-10-02 17:05:35Z ertai $
7
7
 
8
8
 
9
9
  require 'drb/drb'
@@ -79,7 +79,7 @@ module DRb
79
79
  # Test
80
80
  #
81
81
  def test_simple
82
- assert_raises(NameError) { @drb_obj.send(:protected_resquest) }
82
+ assert_raises(NameError, NoMethodError) { @drb_obj.send(:protected_resquest) }
83
83
  assert_nothing_raised { @drb_obj.public_request }
84
84
  end
85
85
 
@@ -1,7 +1,9 @@
1
- require 'abstract'
2
- require 'commands'
3
- require 'active_support/class_attribute_accessors'
4
- require 'active_support/class_inheritable_attributes'
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: file_type.rb 376 2005-09-29 21:46:32Z ertai $
5
+
6
+ Commands.import!
5
7
 
6
8
  module FileType
7
9
 
@@ -133,8 +135,10 @@ module FileType
133
135
  @tmp = TempPath.new(base.path.basename, ext)
134
136
  cmd = mk_cmd(@tmp)
135
137
  data = cmd.run(self.class.runner)
138
+ data.waitpid if data.status.nil?
136
139
  if data.status != 0
137
140
  @tmp.rmtree if @tmp.exist?
141
+ STDERR.puts data.error.read if data.error and data.error.exist?
138
142
  raise ExtractError, "Cannot extract a file:
139
143
  | path: #{to_s}
140
144
  | type: #{self.class}
@@ -243,10 +247,7 @@ module FileType
243
247
 
244
248
  class TarBz2 < Generic
245
249
  filetype_extension(/\.(tar\.bz2|tbz2|tbz)$/)
246
- # FIXME Use this pipe beacause -j is not portable
247
- # extractable_dir (BZIP2 + %w[-c -d]) | (TAR + %w[xvf - -C])
248
- # problem: a pipe command doesn't properly implement `[]'
249
- extractable_dir TAR + %w[xvjf %i -C]
250
+ extractable_dir((BZIP2 + %w[-c -d %i]) | (TAR + %w[xvf - -C]))
250
251
  end # class TarBz2
251
252
 
252
253
 
@@ -340,16 +341,19 @@ end # module FileType
340
341
 
341
342
  test_section __FILE__ do
342
343
 
344
+ Commands::Runners::Mockable.import!
345
+
343
346
  class FileTypeTest < Test::Unit::TestCase
344
347
 
345
348
  def setup
346
349
  @tmp = TempPath.new
347
350
  (@tmp + 'foo').mkpath
348
- @mr = Commands::Runners::Mock.new do |out|
349
- out.write("#@tmp/foo/bar/baz\n#@tmp/foo\n#@tmp/foo/f/f/foo/baz\n")
351
+ @mr = Commands::Runners::System.new
352
+ @mr.make_mock do
353
+ puts "#@tmp/foo/bar/baz\n#@tmp/foo\n#@tmp/foo/f/f/foo/baz"
350
354
  end
351
355
  FileType::Generic.runner = @mr
352
- @res_dir = __FILE__.to_path.dirname.parent + 'test/resources'
356
+ @fixtures = __FILE__.to_path.dirname.parent + 'test/fixtures'
353
357
  end
354
358
 
355
359
  def assert_guess ( type, *files )
@@ -366,7 +370,8 @@ test_section __FILE__ do
366
370
  assert(@inp.extractable?, "#@inp not extractable")
367
371
  assert_nothing_raised { @res = @inp.extract }
368
372
  assert_kind_of(FileType.const_get(type), @res)
369
- assert_match(command, @mr.log.last.to_sh)
373
+ assert_match(command, @mr.log.first.to_sh)
374
+ assert_equal(1, @mr.log.size, "Mock log size != 1")
370
375
  end
371
376
 
372
377
  def assert_real_extract ( type, file )
@@ -424,27 +429,30 @@ test_section __FILE__ do
424
429
  end
425
430
 
426
431
  def test_extract_gz
427
- assert_extract :Ruby, /^"gzip" "-d" "-c" "[^%]*" > "[^%]*"$/, 'foo.rb.gz'
432
+ assert_extract :Ruby, /^"gzip" "-d" "-c" "[^%]*" > "[^%]*"$/, @fixtures/'foo.rb.gz'
428
433
  end
429
434
  def test_extract_bz2
430
- assert_extract :Unknown, /^"bzip2" "-d" "-c" "[^%]*" > "[^%]*"$/, 'foo.bz2'
435
+ assert_extract :Unknown, /^"bzip2" "-d" "-c" "[^%]*" > "[^%]*"$/, @fixtures/'foo.bz2'
431
436
  end
432
437
  def test_extract_zip
433
- assert_extract :Gz, /^"unzip" "-p" "[^%]*" > "[^%]*"$/, 'foo.gz.zip'
438
+ assert_extract :Gz, /^"unzip" "-p" "[^%]*" > "[^%]*"$/, @fixtures/'foo.gz.zip'
434
439
  end
435
440
  def test_extract_tar_bz2
436
441
  assert_extract :Directory,
437
- # /^"bzip2" -d -c "foo.tar.bz2" | "tar" "xvf" "-" "-C" "[^%]*" > "[^%]*"$/,
438
- /^"tar" "xvjf" "foo.tar.bz2" "-C" "[^%]*" > "[^%]*"$/, 'foo.tar.bz2'
442
+ /^\("bzip2" "-c" "-d" "[^%]*foo.tar.bz2"\) \| \("tar" "xvf" "-" "-C" "[^%]*" > "[^%]*"\)$/,
443
+ @fixtures/'foo.tar.bz2'
444
+ end
445
+ def test_real_extract_tar_bz2
446
+ assert_real_extract :Directory, @fixtures/'foo.tar.bz2'
439
447
  end
440
448
  def test_extract_tar_gz
441
449
  assert_extract :Directory,
442
- /^"tar" "xvzf" "foo.tar.gz" "-C" ".*foo.*" > ".*log.*"$/, 'foo.tar.gz'
443
- assert_real_extract :Directory, @res_dir + 'foo.tar.gz'
450
+ /^"tar" "xvzf" "[^%]*foo.tar.gz" "-C" ".*foo.*" > ".*log.*"$/, @fixtures/'foo.tar.gz'
451
+ assert_real_extract :Directory, @fixtures/'foo.tar.gz'
444
452
  end
445
453
  def test_extract_tar
446
454
  assert_extract :Directory,
447
- /^"tar" "xvf" "foo.tar" "-C" "[^%]*" > "[^%]*"$/, 'foo.tar'
455
+ /^"tar" "xvf" "[^%]*foo.tar" "-C" "[^%]*" > "[^%]*"$/, @fixtures/'foo.tar'
448
456
  end
449
457
 
450
458
  def test_install_gem
@@ -455,7 +463,7 @@ test_section __FILE__ do
455
463
 
456
464
  def test_longest_common_path
457
465
  assert_nothing_raised do
458
- res = @res_dir + 'tar.gz.log'
466
+ res = @fixtures/'tar.gz.log'
459
467
  @longest = FileType::ExtractableDir.longest_common_path(res)
460
468
  end
461
469
  assert_equal(['core_ex-0.1.4'], @longest)