1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
module Zip
class EntrySet #:nodoc:all
include Enumerable
attr_accessor :entry_set, :entry_order
def initialize(an_enumerable = [])
super()
@entry_set = {}
an_enumerable.each { |o| push(o) }
end
def include?(entry)
@entry_set.include?(to_key(entry))
end
def find_entry(entry)
@entry_set[to_key(entry)]
end
def <<(entry)
@entry_set[to_key(entry)] = entry
end
alias :push :<<
def size
@entry_set.size
end
alias :length :size
def delete(entry)
if @entry_set.delete(to_key(entry))
entry
else
nil
end
end
def each(&block)
@entry_set = @entry_set.dup.each do |_, value|
block.call(value)
end
end
def entries
if ::Zip.sort_entries == true
@entry_set.values.sort_by{|x| x.name}
else
@entry_set.values
end
end
# deep clone
def dup
EntrySet.new(@entry_set.map { |key, value| value.dup })
end
def ==(other)
return false unless other.kind_of?(EntrySet)
@entry_set.values == other.entry_set.values
end
def parent(entry)
@entry_set[to_key(entry.parent_as_string)]
end
def glob(pattern, flags = ::File::FNM_PATHNAME|::File::FNM_DOTMATCH)
entries.map do |entry|
next nil unless ::File.fnmatch(pattern, entry.name.chomp('/'), flags)
yield(entry) if block_given?
entry
end.compact
end
protected
private
def to_key(entry)
entry.to_s.chomp('/')
end
end
end
# Copyright (C) 2002, 2003 Thomas Sondergaard
# rubyzip is free software; you can redistribute it and/or
# modify it under the terms of the ruby license.
|