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