rubyzip/lib/zip/entry_set.rb

89 lines
1.8 KiB
Ruby
Raw Normal View History

module Zip
class EntrySet #:nodoc:all
include Enumerable
2013-06-03 02:33:03 +08:00
attr_accessor :entry_set, :entry_order
def initialize(an_enumerable = [])
super()
2013-06-03 02:33:03 +08:00
@entry_set = {}
an_enumerable.each { |o| push(o) }
end
def include?(entry)
2013-06-03 02:33:03 +08:00
@entry_set.include?(to_key(entry))
end
def find_entry(entry, case_sensitively = true)
return @entry_set[to_key(entry)] if case_sensitively
entry = @entry_set.find { |k, _| k.downcase == to_key(entry).downcase }
entry.last if entry
end
def <<(entry)
2013-06-03 02:33:03 +08:00
@entry_set[to_key(entry)] = entry
end
2013-06-03 02:33:03 +08:00
alias :push :<<
def size
2013-06-03 02:33:03 +08:00
@entry_set.size
end
2013-06-03 02:33:03 +08:00
alias :length :size
def delete(entry)
2013-10-21 04:09:40 +08:00
if @entry_set.delete(to_key(entry))
2013-06-03 02:33:03 +08:00
entry
else
nil
2013-06-03 02:33:03 +08:00
end
end
2013-06-03 02:33:03 +08:00
def each(&block)
@entry_set = sorted_entries.dup.each do |_, value|
2013-10-21 04:09:40 +08:00
block.call(value)
end
end
def entries
sorted_entries.values
end
# deep clone
def dup
2013-10-21 04:09:40 +08:00
EntrySet.new(@entry_set.map { |key, value| value.dup })
end
2012-02-01 03:46:42 +08:00
def ==(other)
return false unless other.kind_of?(EntrySet)
2013-10-21 04:09:40 +08:00
@entry_set.values == other.entry_set.values
end
def parent(entry)
2013-06-03 02:33:03 +08:00
@entry_set[to_key(entry.parent_as_string)]
end
2012-02-01 03:46:42 +08:00
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
2013-06-03 02:33:03 +08:00
end
protected
def sorted_entries
::Zip.sort_entries ? Hash[@entry_set.sort] : @entry_set
end
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.