Skip to content

Commit

Permalink
Add all_preorder and all_postorder to ResourceTemplate and ResourceTe…
Browse files Browse the repository at this point in the history
…mplates
  • Loading branch information
Michael Burrows authored and Michael Burrows committed Jun 28, 2009
1 parent 5030958 commit 0a74ffe
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 2 deletions.
4 changes: 4 additions & 0 deletions History.txt
@@ -1,3 +1,7 @@
== 0.6.1 2009-06-28

* Add all_preorder and all_postorder to ResourceTemplate and ResourceTemplates

== 0.6.0 2009-06-28

* Add automatic link header/element generation
Expand Down
2 changes: 1 addition & 1 deletion lib/described_routes.rb
Expand Up @@ -2,5 +2,5 @@

module DescribedRoutes
# rubygem version
VERSION = "0.6.0"
VERSION = "0.6.1"
end
24 changes: 24 additions & 0 deletions lib/resource_template.rb
Expand Up @@ -203,6 +203,16 @@ def find_by_rel(matching_rel)
resource_templates.select{|resource_template| matching_rel === resource_template.rel}
end

# self and descendants
def all_preorder
[self] + resource_templates.all_preorder
end

# defendants and self
def all_postorder
resource_templates.all_postorder + [self]
end

class ResourceTemplates < Array
# Initialize Resources (i.e. a new collection of ResourceTemplate objects) from given collection of ResourceTemplates or hashes
def initialize(collection=[], parent=nil)
Expand Down Expand Up @@ -262,6 +272,20 @@ def all_by_name(h = {})
end
h
end

# All members and their descendants, descendants last
def all_preorder
inject([]) do |a, resource_template|
a += resource_template.all_preorder
end
end

# All members and their descendants, descendants first
def all_postorder
inject([]) do |a, resource_template|
a += resource_template.all_postorder
end
end

# for #to_text
def to_table(parent_template = nil, t = [], indent = '')
Expand Down
37 changes: 36 additions & 1 deletion test/test_resource_template.rb
Expand Up @@ -2,12 +2,13 @@
require 'resource_template'

class TestResourceTemplate < Test::Unit::TestCase
attr_reader :json, :resource_templates, :resource_templates_by_name, :user_articles, :user_article, :edit_user_article
attr_reader :json, :resource_templates, :resource_templates_by_name, :user, :user_articles, :user_article, :edit_user_article

def setup
@json ||= File.read(File.dirname(__FILE__) + '/fixtures/described_routes_test.json')
@resource_templates = ResourceTemplate::ResourceTemplates.new(JSON.parse(@json))
@resource_templates_by_name = @resource_templates.all_by_name
@user = @resource_templates_by_name['user']
@user_articles = @resource_templates_by_name['user_articles']
@user_article = @resource_templates_by_name['user_article']
@edit_user_article = @resource_templates_by_name['edit_user_article']
Expand Down Expand Up @@ -128,4 +129,38 @@ def test_expand_links
],
user_articles.resource_templates.expand_links({'user_id' => 'dojo'}).to_parsed)
end

def test_all_preorder
assert_equal(
[
"user",
"user_articles",
"user_article",
"edit_user_article",
"new_user_article",
"recent_user_articles",
"edit_user",
"user_profile",
"edit_user_profile",
"new_user_profile"
],
user.all_preorder.map{|rt| rt.name})
end

def test_all_postorder
assert_equal(
[
"edit_user_article",
"user_article",
"new_user_article",
"recent_user_articles",
"user_articles",
"edit_user",
"edit_user_profile",
"new_user_profile",
"user_profile",
"user"
],
user.all_postorder.map{|rt| rt.name})
end
end

0 comments on commit 0a74ffe

Please sign in to comment.