lib/hx/listing/recursiveindex.rb in hx-0.16.0 vs lib/hx/listing/recursiveindex.rb in hx-0.17.0

- old
+ new

@@ -1,8 +1,8 @@ # hx/listing/recursiveindex - Recursive index generator # -# Copyright (c) 2009-2010 MenTaLguY <mental@rydia.net> +# Copyright (c) 2009-2011 MenTaLguY <mental@rydia.net> # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, @@ -20,67 +20,56 @@ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. require 'hx' -require 'hx/listing/limit' -require 'hx/listing/paginate' +require 'hx/listing' require 'set' module Hx module Listing class RecursiveIndex include Hx::Filter def self.new(input, options) listing = super(input, options) - if options.has_key? :limit - listing = Limit.new(listing, :limit => options[:limit]) - end - if options.has_key? :page_size - listing = Paginate.new(listing, :page_size => options[:page_size]) - end - listing + Listing.apply_options(listing, options) end def initialize(input, options) @input = input + @index_name = options[:index_name] || "index" + @index_re = %r!^((?:.*/)?)#{Regexp.quote(@index_name)}$! end - def merge_updated(index, entry) - updated = [entry, index].map { |e| e['updated'] }.compact.max - index['updated'] = updated if updated - end - private :merge_updated - def each_entry_path(selector) emitted = Set.new - @input.each_entry_path(Path::ALL) do |path, entry| + @input.each_entry_path(Path::ALL) do |path| components = path.split("/") until components.empty? components.pop - index_path = (components + ["index"]).join("/") + index_path = (components + [@index_name]).join("/") break if emitted.include? index_path yield index_path if selector.accept_path? index_path emitted.add index_path end end self end def get_entry(path) - raise NoSuchEntryError, path unless path =~ %r!^((?:.*/)?)index$! - prefix = $1 - selector = Path.parse_pattern("#{prefix}**") + raise NoSuchEntryError, path unless path =~ @index_re + selector = Path.parse_pattern("#{$1}**") index = {'items' => []} @input.each_entry(selector) do |child_path, entry| if child_path == path index = entry.merge(index) else index['items'] << {'path' => child_path, 'entry' => entry} end - merge_updated(index, entry) + updated = [entry['updated'], index['updated']].compact.max + index['updated'] = updated if updated end raise NoSuchEntryError, path if index['items'].empty? index end end