lib/ro/node/list.rb in ro-1.1.1 vs lib/ro/node/list.rb in ro-1.2.0

- old
+ new

@@ -16,10 +16,14 @@ @index = {} block.call(self) if block end + def nodes + self + end + def load(path) add( node = Node.new(path) ) end def add(node) @@ -44,19 +48,26 @@ end related end - def [](key) - if @type.nil? - type = key.to_s - list = select{|node| type == node.type} - list.type = type - list - else - name = key.to_s - detect{|node| name == node.name} + def [](*args, &block) + key = args.first + + case key + when String, Symbol + if @type.nil? + type = key.to_s + list = select{|node| type == node.type} + list.type = type + list + else + name = Slug.for(key.to_s) + detect{|node| name == node.name} + end + else + super(*args, &block) end end def select(*args, &block) List.new(root){|list| list.replace(super)} @@ -101,20 +112,85 @@ def identifier [root, type].compact.join('/') end + def paginate(*args) + options = Map.options_for!(args) + + ensure_pagination_state! + + page = Integer(args.shift || options[:page] || @page) + per = Integer(args.shift || options[:per] || options[:size] || @per) + + @page = [page.abs, 1].max + @per = [per.abs, 1].max + + offset = (@page - 1) * @per + length = @per + + replace(self.slice(offset, length)) + + self + end + + def page(*args) + ensure_pagination_state! + + if args.empty? + return @page + else + options = Map.options_for!(args) + page = args.shift || options[:page] + options[:page] = page + paginate(options) + end + end + + alias_method(:current_page, :page) + + def per(*args) + ensure_pagination_state! + + if args.empty? + return @per + else + options = Map.options_for!(args) + per = args.shift || options[:per] + options[:per] = per + paginate(options) + end + end + + def num_pages + (size.to_f / per).ceil + end + + def total_pages + num_pages + end + + def ensure_pagination_state! + unless defined?(@page) + @page = 1 + end + unless defined?(@per) + @per = size + end + [@page, @per] + end + + def method_missing(method, *args, &block) Ro.log "Ro::List(#{ identifier })#method_missing(#{ method.inspect }, #{ args.inspect })" if @type.nil? type = method.to_s list = self[type] super unless list list.empty? ? super : list else - name = Ro.slug_for(method) - node = self[name] + node = self[Slug.for(method, :join => '-')] || self[Slug.for(method, :join => '_')] node.nil? ? super : node end end def binding