Extract `DirectoryIterator` from the main filesystem file.

This commit is contained in:
Robert Haines 2021-06-02 17:04:45 +01:00
parent 204d084fdf
commit 239baef845
3 changed files with 52 additions and 46 deletions

View File

@ -2,6 +2,7 @@
require 'zip'
require_relative 'filesystem/zip_file_name_mapper'
require_relative 'filesystem/directory_iterator'
module Zip
# The ZipFileSystem API provides an API for accessing entries in
@ -442,7 +443,7 @@ module Zip
attr_writer :file
def new(directory_name)
ZipFsDirIterator.new(entries(directory_name))
DirectoryIterator.new(entries(directory_name))
end
def open(directory_name)
@ -514,49 +515,6 @@ module Zip
raise NotImplementedError, 'The chroot() function is not implemented'
end
end
class ZipFsDirIterator # :nodoc:all
include Enumerable
def initialize(filenames)
@filenames = filenames
@index = 0
end
def close
@filenames = nil
end
def each(&a_proc)
raise IOError, 'closed directory' if @filenames.nil?
@filenames.each(&a_proc)
end
def read
raise IOError, 'closed directory' if @filenames.nil?
@filenames[(@index += 1) - 1]
end
def rewind
raise IOError, 'closed directory' if @filenames.nil?
@index = 0
end
def seek(position)
raise IOError, 'closed directory' if @filenames.nil?
@index = position
end
def tell
raise IOError, 'closed directory' if @filenames.nil?
@index
end
end
end
class File

View File

@ -0,0 +1,48 @@
# frozen_string_literal: true
module Zip
module FileSystem
class DirectoryIterator # :nodoc:all
include Enumerable
def initialize(filenames)
@filenames = filenames
@index = 0
end
def close
@filenames = nil
end
def each(&a_proc)
raise IOError, 'closed directory' if @filenames.nil?
@filenames.each(&a_proc)
end
def read
raise IOError, 'closed directory' if @filenames.nil?
@filenames[(@index += 1) - 1]
end
def rewind
raise IOError, 'closed directory' if @filenames.nil?
@index = 0
end
def seek(position)
raise IOError, 'closed directory' if @filenames.nil?
@index = position
end
def tell
raise IOError, 'closed directory' if @filenames.nil?
@index
end
end
end
end

View File

@ -3,11 +3,11 @@
require 'test_helper'
require 'zip/filesystem'
class ZipFsDirIteratorTest < MiniTest::Test
class DirectoryIteratorTest < MiniTest::Test
FILENAME_ARRAY = %w[f1 f2 f3 f4 f5 f6].freeze
def setup
@dir_iter = ::Zip::FileSystem::ZipFsDirIterator.new(FILENAME_ARRAY)
@dir_iter = ::Zip::FileSystem::DirectoryIterator.new(FILENAME_ARRAY)
end
def test_close