described_routes 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,4 +1,12 @@
1
- == 0.1.1 2009-04-24
1
+ == 0.2.0 2009-04-29
2
+
3
+ * 1 minor enhancement:
4
+ * add show method to controller
5
+ * other:
6
+ * add tests
7
+ * refactoring
8
+
9
+ == 0.1.1 2009-04-28
2
10
 
3
11
  * 1 minor enhancement:
4
12
  * include uri_template elements in XML
data/Manifest.txt CHANGED
@@ -12,6 +12,7 @@ lib/tasks/described_routes.rb
12
12
  script/console
13
13
  script/destroy
14
14
  script/generate
15
+ test/fixtures/described_routes_test.json
15
16
  test/test_described_routes.rb
16
17
  test/test_helper.rb
17
18
  test/test_resource_template.rb
data/README.rdoc CHANGED
@@ -6,7 +6,7 @@ Outputs hierarchical, framework-neutral descriptions of Rails routes in JSON, YA
6
6
 
7
7
  == SYNOPSIS:
8
8
 
9
- === Build-time output
9
+ === Build time
10
10
 
11
11
  In your Rakefile:
12
12
 
@@ -16,7 +16,6 @@ Then:
16
16
 
17
17
  $ rake --tasks described_routes
18
18
  rake described_routes:json # Describe resource structure in JSON format
19
- rake described_routes:ruby # Describe resource structure as a Ruby literal
20
19
  rake described_routes:xml # Describe resource structure in XML format
21
20
  rake described_routes:yaml # Describe resource structure in YAML format
22
21
  rake described_routes:yaml_short # Describe resource structure in YAML format (basic structure only)
@@ -62,20 +61,27 @@ Add the following route in config/routes.rb:
62
61
 
63
62
  map.resources :described_routes, :controller => "described_routes/rails"
64
63
 
65
- You (or your client application) can now browse to any of the following:
64
+ You (or your client application) can now browse to any of the following top level addresses:
66
65
 
67
66
  * .../described_routes.json
68
67
  * .../described_routes.xml
69
68
  * .../described_routes.yaml
70
69
  * .../described_routes.yaml?short=true
71
70
 
72
- If the application has a route named "root", run-time-generated data will include URI templates based on root_url.
71
+ and for the named route "users" (say):
72
+
73
+ * .../described_routes/users.json
74
+ * .../described_routes/users.xml
75
+ * .../described_routes/users.yaml
76
+ * .../described_routes/users.yaml?short=true
77
+
78
+ If the application has a route named "root", run-time-generated data will include uri_template attributes based on root_url in addition to the path_template attributes supported at build time.
73
79
 
74
80
  == DATA STRUCTURES and FORMATS
75
81
 
76
82
  === Natural structure
77
83
 
78
- The YAML, JSON and Ruby representations appear as simple array and hash structures (which is what they're generated from internally). Each resource is represented by a hash of attributes (one of which may be a list of child resources); the top level structure is an array of the resources that don't have parents.
84
+ The YAML and JSON representations appear as simple array and hash structures (which is what they're generated from internally). Each resource is represented by a hash of attributes (one of which may be a list of child resources); the top level structure is an array of the resources that don't have parents.
79
85
 
80
86
  Attributes:
81
87
 
@@ -95,23 +101,21 @@ Note that only named routes are considered. Pre-Rails 2.3 "formatted routes" ar
95
101
 
96
102
  This follows the natural structure but with the following modifications:
97
103
 
98
- * A +Resource+ element for each resource
99
- * A +Resources+ element for each list of resources (top level or subresources)
104
+ * A +ResourceTemplate+ element for each resource template
105
+ * A +ResourceTemplates+ element for each list of resources (top level or subresources)
100
106
  * +Params+ and +OptionalParams+ elements for +params+ and +optional_params+, each containing +param+ elements
101
107
  * A single +options+ element contains the applicable HTTP methods as a comma-separated list
102
108
 
109
+ Calls to parse_xml will at present result in NoMethodError exceptions being raised.
110
+
103
111
  == REQUIREMENTS:
104
112
 
105
- Rails. Note however that the output format is not Rails-specific.
113
+ Rails, for the Rake tasks and Rails controller. The ResourceTemplate class and its formats are however Rails-independent.
106
114
 
107
115
  == INSTALL:
108
116
 
109
117
  sudo gem install described_routes
110
118
 
111
- Then add the following to your Rakefile:
112
-
113
- require "tasks/described_routes"
114
-
115
119
  == Author
116
120
 
117
121
  Mike Burrows (asplake), email mailto:mjb@asplake.co.uk, website positiveincline.com[http://positiveincline.com] (see articles tagged described_routes[http://positiveincline.com/?tag=described_routes])
@@ -2,91 +2,5 @@ require 'described_routes/resource_template'
2
2
 
3
3
  module DescribedRoutes
4
4
  # rubygem version
5
- VERSION = "0.1.4"
6
-
7
- # Convert an array of ResourceTemplate objects to array of hashes equivalent to their JSON or YAML representations
8
- def self.to_parsed(resource_templates)
9
- resource_templates.map{|resource_template| resource_template.to_hash}
10
- end
11
-
12
- # Convert an array of ResourceTemplate objects to JSON
13
- def self.to_json(resource_templates)
14
- self.to_parsed(resource_templates).to_json
15
- end
16
-
17
- # Convert an array of ResourceTemplate objects to YAML
18
- def self.to_yaml(resource_templates)
19
- self.to_parsed(resource_templates).to_yaml
20
- end
21
-
22
- # Create an array of ResourceTemplate objects from a JSON string
23
- def self.parse_json(json)
24
- self.from_parsed(JSON.parse(json))
25
- end
26
-
27
- # Create an array of ResourceTemplate objects from a JSON string
28
- def self.parse_yaml(yaml)
29
- self.from_parsed(YAML::load(yaml))
30
- end
31
-
32
- # Create an array of ResourceTemplate objects from an array of hashes
33
- def self.from_parsed(parsed)
34
- raise ArgumentError.new("not an array") unless parsed.kind_of?(Array)
35
-
36
- parsed.map do |hash|
37
- ResourceTemplate.from_hash(hash)
38
- end
39
- end
40
-
41
- #
42
- # Produces the XML format, given an XML builder object and an array of ResourceTemplate objects
43
- #
44
- def self.to_xml(xm, resource_templates)
45
- xm.ResourceTemplates do |xm|
46
- resource_templates.each do |resource_template|
47
- xm.ResourceTemplate do |xm|
48
- value_tag(xm, resource_template, "rel")
49
- value_tag(xm, resource_template, "name")
50
- value_tag(xm, resource_template, "path_template")
51
- value_tag(xm, resource_template, "uri_template")
52
-
53
- list_tag(xm, resource_template["params"], "Params", "param")
54
- list_tag(xm, resource_template["optional_params"], "OptionalParams", "param")
55
-
56
- # could use a list of elements here, but let's follow HTTP's lead and reduce the verbosity
57
- options = resource_template["options"] || []
58
- xm.options(options.join(", ")) unless options.empty?
59
-
60
- resource_templates = resource_template["resource_templates"] || []
61
- to_xml(xm, resource_templates) unless resource_templates.empty?
62
- end
63
- end
64
- end
65
- xm
66
- end
67
-
68
- def self.value_tag(xm, h, tag) #:nodoc:
69
- value = h[tag]
70
- xm.tag!(tag, value) unless value.blank?
71
- end
72
-
73
- def self.list_tag(xm, collection, collection_tag, member_tag) #:nodoc:
74
- unless collection.nil? or collection.empty?
75
- xm.tag!(collection_tag) do |xm|
76
- collection.each do |value|
77
- xm.tag!(member_tag, value)
78
- end
79
- end
80
- end
81
- end
82
-
83
- # Get a hash of all named ResourceTemplate objects contained in the supplied collection, keyed by name
84
- def self.all_by_name(resource_templates, h = {})
85
- resource_templates.inject(h) do |hash, resource_template|
86
- hash[resource_template.name] = resource_template if resource_template.name
87
- all_by_name(resource_template.resource_templates, hash)
88
- hash
89
- end
90
- h
91
- end
5
+ VERSION = "0.2.0"
92
6
  end
@@ -5,20 +5,39 @@ module DescribedRoutes
5
5
  class RailsController < ActionController::Base
6
6
  def index
7
7
  base_url = root_url rescue nil
8
- resources = RailsRoutes.get_resources(base_url)
8
+ resource_templates = RailsRoutes.get_resource_templates(base_url)
9
9
 
10
10
  respond_to do |format|
11
11
  format.html # index.html.erb
12
- format.json { render :json => resources.to_json }
12
+ format.json { render :json => ResourceTemplate.to_json(resource_templates) }
13
13
  format.yaml do
14
- yaml = resources.to_yaml
14
+ yaml = resource_templates.to_yaml(resource_templates)
15
15
  yaml = yaml.grep(/(name|rel|path_template|uri_template|resources):|^---/).to_s if ['true', '1'].member?(params["short"])
16
16
  render :text => yaml
17
17
  end
18
18
  format.xml do
19
- render :xml => DescribedRoutes::to_xml(
19
+ render :xml => ResourceTemplate::to_xml(
20
20
  Builder::XmlMarkup.new(:indent => 2),
21
- resources).target!
21
+ resource_templates).target!
22
+ end
23
+ end
24
+ end
25
+
26
+ def show
27
+ base_url = root_url rescue nil
28
+ resources = RailsRoutes.get_resource_templates(base_url)
29
+ resource_template = ResourceTemplate.all_by_name(resources)[params[:id]]
30
+
31
+ respond_to do |format|
32
+ format.html # show.html.erb
33
+ format.json { render :json => resource_template.to_json }
34
+ format.yaml do
35
+ yaml = resource_template.to_yaml
36
+ yaml = yaml.grep(/(name|rel|path_template|uri_template|resources):|^---/).to_s if ['true', '1'].member?(params["short"])
37
+ render :text => yaml
38
+ end
39
+ format.xml do
40
+ render :xml => resource_template.to_xml(Builder::XmlMarkup.new(:indent => 2)).target!
22
41
  end
23
42
  end
24
43
  end
@@ -1,12 +1,19 @@
1
- require 'described_routes'
1
+ require 'described_routes/resource_template'
2
2
 
3
3
  module DescribedRoutes
4
4
  module RailsRoutes
5
+ #
6
+ # Process Rails routes and return an array of DescribedRoutes::ResourceTemplate objects
7
+ #
8
+ def self.get_resource_templates(base_url = nil)
9
+ DescribedRoutes::ResourceTemplate.from_parsed(get_parsed_rails_resources(base_url))
10
+ end
11
+
5
12
  #
6
13
  # Based on the implementation of "rake routes". Returns a hash of Rails path specifications (slightly normalized)
7
14
  # mapped to hashes of the attributes we need.
8
15
  #
9
- def self.get_rails_resources
16
+ def self.get_rails_resources #:nodoc:
10
17
  ActionController::Routing::Routes.routes.inject({}) do |resources, route|
11
18
  name = ActionController::Routing::Routes.named_routes.routes.index(route).to_s
12
19
  controller = route.parameter_shell[:controller]
@@ -19,7 +26,11 @@ module DescribedRoutes
19
26
  # TODO - probably a better way to do this, just need a pattern that matches :id and not :id[a-zA-Z0-9_]+
20
27
  segs.gsub!(/:[a-zA-Z0-9_]+/) do |match|
21
28
  if match == ":id" && controller
22
- ":#{controller.singularize.sub(/.*\//, "")}_id"
29
+ if controller == "described_routes/rails"
30
+ "{route_name}"
31
+ else
32
+ ":#{controller.singularize.sub(/.*\//, "")}_id"
33
+ end
23
34
  else
24
35
  match
25
36
  end
@@ -79,9 +90,10 @@ module DescribedRoutes
79
90
  end
80
91
 
81
92
  #
82
- # Takes the routes from Rails and produces the required tree structure.
93
+ # Takes the routes from Rails and produces the required tree structure. Returns the "parsed" format - i.e. a representation
94
+ # in Ruby Array and Hash objects
83
95
  #
84
- def self.get_resources(base_url = nil)
96
+ def self.get_parsed_rails_resources(base_url = nil) #:nodoc:
85
97
  base_url = base_url.sub(/\/$/, '') if base_url
86
98
  resources = get_rails_resources
87
99
  resources.delete_if{|k, v| v["name"].blank? or v["name"] =~ /^formatted/}
@@ -99,8 +111,8 @@ module DescribedRoutes
99
111
  # compare parent and child names, and populate "rel" with either
100
112
  # 1) a prefix (probably an action name)
101
113
  # 2) a suffix (probably a nested resource)
102
- # If neither applies, let's hope the child is identified by parameter (i.e. the parent is a collection)
103
- # TODO rewrite this so that it's done when the child is created
114
+ # 3) the child's name if the parent and child's params are identical
115
+ # If none of the above applies, the child must be identifable by parameter
104
116
  name = resource["name"]
105
117
  prefix = /^(.*)_#{name}$/
106
118
  suffix = /^#{name}_(.*)$/
@@ -110,13 +122,15 @@ module DescribedRoutes
110
122
  child["rel"] = $1
111
123
  elsif child_name =~ suffix
112
124
  child["rel"] = $1
113
- end
125
+ elsif child["params"] == resource["params"]
126
+ child["rel"] = child["name"]
127
+ end
114
128
  end
115
129
 
116
130
  resource
117
131
  end
118
132
  end
119
-
133
+
120
134
  #
121
135
  # Depth-first tree traversal
122
136
  #
@@ -60,11 +60,113 @@ module DescribedRoutes
60
60
 
61
61
  hash["options"] = options if options && !options.empty?
62
62
 
63
- hashes = DescribedRoutes.to_parsed(resource_templates)
63
+ hashes = DescribedRoutes::ResourceTemplate.to_parsed(resource_templates)
64
64
  hash["resource_templates"] = hashes if hashes && !hashes.empty?
65
65
 
66
66
  hash
67
67
  end
68
+
69
+ # Convert to JSON
70
+ def to_json
71
+ to_hash.to_json
72
+ end
73
+
74
+ # Convert to YAML
75
+ def to_yaml
76
+ to_hash.to_json
77
+ end
78
+
79
+ #
80
+ # Produces the XML format, given an XML builder object and an array of ResourceTemplate objects
81
+ #
82
+ def to_xml(xm)
83
+ xm.ResourceTemplate do |xm|
84
+ value_tag(xm, "rel")
85
+ value_tag(xm, "name")
86
+ value_tag(xm, "path_template")
87
+ value_tag(xm, "uri_template")
88
+
89
+ list_tag(xm, params, "Params", "param")
90
+ list_tag(xm, optional_params, "OptionalParams", "param")
91
+
92
+ # could use a list of elements here, but let's follow HTTP's lead and reduce the verbosity
93
+ xm.options(options.join(", ")) unless options.empty?
94
+
95
+ self.class.to_xml(xm, resource_templates) unless resource_templates.empty?
96
+ end
97
+ xm
98
+ end
99
+
100
+ def value_tag(xm, tag) #:nodoc:
101
+ value = self.send(tag.to_sym)
102
+ xm.tag!(tag, value) unless value.blank?
103
+ end
104
+
105
+ def list_tag(xm, collection, collection_tag, member_tag) #:nodoc:
106
+ unless collection.nil? or collection.empty?
107
+ xm.tag!(collection_tag) do |xm|
108
+ collection.each do |value|
109
+ xm.tag!(member_tag, value)
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ # Convert an array of ResourceTemplate objects to array of hashes equivalent to their JSON or YAML representations
116
+ def self.to_parsed(resource_templates)
117
+ resource_templates.map{|resource_template| resource_template.to_hash}
118
+ end
119
+
120
+ # Convert an array of ResourceTemplate objects to JSON
121
+ def self.to_json(resource_templates)
122
+ self.to_parsed(resource_templates).to_json
123
+ end
124
+
125
+ # Convert an array of ResourceTemplate objects to YAML
126
+ def self.to_yaml(resource_templates)
127
+ self.to_parsed(resource_templates).to_yaml
128
+ end
129
+
130
+ # Create an array of ResourceTemplate objects from a JSON string
131
+ def self.parse_json(json)
132
+ self.from_parsed(JSON.parse(json))
133
+ end
134
+
135
+ # Create an array of ResourceTemplate objects from a JSON string
136
+ def self.parse_yaml(yaml)
137
+ self.from_parsed(YAML::load(yaml))
138
+ end
139
+
140
+ # Create an array of ResourceTemplate objects from an array of hashes
141
+ def self.from_parsed(parsed)
142
+ raise ArgumentError.new("not an array") unless parsed.kind_of?(Array)
143
+
144
+ parsed.map do |hash|
145
+ ResourceTemplate.from_hash(hash)
146
+ end
147
+ end
148
+
149
+ #
150
+ # Produces the XML format, given an XML builder object and an array of ResourceTemplate objects
151
+ #
152
+ def self.to_xml(xm, resource_templates)
153
+ xm.ResourceTemplates do |xm|
154
+ resource_templates.each do |resource_template|
155
+ resource_template.to_xml(xm)
156
+ end
157
+ end
158
+ xm
159
+ end
160
+
161
+ # Get a hash of all named ResourceTemplate objects contained in the supplied collection, keyed by name
162
+ def self.all_by_name(resource_templates, h = {})
163
+ resource_templates.inject(h) do |hash, resource_template|
164
+ hash[resource_template.name] = resource_template if resource_template.name
165
+ all_by_name(resource_template.resource_templates, hash)
166
+ hash
167
+ end
168
+ h
169
+ end
68
170
  end
69
171
  end
70
172
 
@@ -6,24 +6,44 @@ namespace :described_routes do
6
6
  desc "Describe resource structure in JSON format"
7
7
 
8
8
  task :json => :environment do
9
- puts DescribedRoutes::RailsRoutes.get_resources.to_json
9
+ puts DescribedRoutes::ResourceTemplate.to_json(
10
+ DescribedRoutes::RailsRoutes.get_resource_templates)
10
11
  end
11
12
 
12
13
  desc "Describe resource structure in YAML format"
13
14
  task :yaml => :environment do
14
- puts DescribedRoutes::RailsRoutes.get_resources.to_yaml
15
+ puts DescribedRoutes::ResourceTemplate.to_yaml(
16
+ DescribedRoutes::RailsRoutes.get_resource_templates)
15
17
  end
16
18
 
17
19
  desc "Describe resource structure in YAML format (basic structure only)"
18
20
  task :yaml_short => :environment do
19
- puts DescribedRoutes::RailsRoutes.get_resources.to_yaml.grep(/(name|rel|path_template|uri_template|resources):|^---/)
21
+ puts DescribedRoutes::ResourceTemplate.to_yaml(
22
+ DescribedRoutes::RailsRoutes.get_resource_templates).grep(
23
+ /(name|rel|path_template|uri_template|resources):|^---/)
20
24
  end
21
25
 
22
26
  desc "Describe resource structure in XML format"
23
27
  task :xml => :environment do
24
- puts DescribedRoutes::to_xml(
25
- Builder::XmlMarkup.new(:indent => 2),
26
- DescribedRoutes::RailsRoutes.get_resources
27
- ).target!
28
+ puts DescribedRoutes::ResourceTemplate.to_xml(
29
+ Builder::XmlMarkup.new(:indent => 2),
30
+ DescribedRoutes::RailsRoutes.get_resource_templates
31
+ ).target!
32
+ end
33
+
34
+ # unsupported, for testing
35
+ task :ruby => :environment do
36
+ puts DescribedRoutes::ResourceTemplate.to_parsed(
37
+ DescribedRoutes::RailsRoutes.get_resource_templates).inspect
38
+ end
39
+
40
+ # unsupported
41
+ task :get_rails_resources => :environment do
42
+ puts DescribedRoutes::RailsRoutes.get_rails_resources.inspect
43
+ end
44
+
45
+ # unsupported
46
+ task :get_parsed_rails_resources => :environment do
47
+ puts DescribedRoutes::RailsRoutes.get_parsed_rails_resources.inspect
28
48
  end
29
49
  end
@@ -0,0 +1 @@
1
+ [{"name":"root","path_template":"\/"},{"name":"admin_products","resource_templates":[{"name":"admin_product","resource_templates":[{"name":"edit_admin_product","options":["GET"],"path_template":"\/admin\/products\/{product_id}\/edit{-prefix|.|format}","rel":"edit"}],"options":["GET","PUT","DELETE"],"path_template":"\/admin\/products\/{product_id}{-prefix|.|format}"},{"name":"new_admin_product","options":["GET"],"path_template":"\/admin\/products\/new{-prefix|.|format}","rel":"new_admin_product"}],"options":["GET","POST"],"path_template":"\/admin\/products{-prefix|.|format}"},{"name":"described_routes","resource_templates":[{"name":"new_described_route","options":["GET"],"path_template":"\/described_routes\/new{-prefix|.|format}","rel":"new_described_route"},{"name":"described_route","resource_templates":[{"name":"edit_described_route","options":["GET"],"path_template":"\/described_routes\/{route_name}\/edit{-prefix|.|format}","rel":"edit"}],"options":["GET","PUT","DELETE"],"path_template":"\/described_routes\/{route_name}{-prefix|.|format}","rel":"described_route"}],"options":["GET","POST"],"path_template":"\/described_routes{-prefix|.|format}"},{"name":"pages","resource_templates":[{"name":"page","resource_templates":[{"name":"edit_page","options":["GET"],"path_template":"\/pages\/{page_id}\/edit{-prefix|.|format}","rel":"edit"},{"name":"summary_page","options":["GET"],"path_template":"\/pages\/{page_id}\/summary{-prefix|.|format}","rel":"summary"},{"name":"toggle_visibility_page","options":["POST"],"path_template":"\/pages\/{page_id}\/toggle_visibility{-prefix|.|format}","rel":"toggle_visibility"}],"options":["GET","PUT","DELETE"],"path_template":"\/pages\/{page_id}{-prefix|.|format}"},{"name":"new_page","options":["GET"],"path_template":"\/pages\/new{-prefix|.|format}","rel":"new_page"}],"options":["GET","POST"],"path_template":"\/pages{-prefix|.|format}"},{"name":"users","resource_templates":[{"name":"user","resource_templates":[{"name":"user_articles","resource_templates":[{"name":"user_article","resource_templates":[{"name":"edit_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/{article_id}\/edit{-prefix|.|format}","rel":"edit"}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}\/articles\/{article_id}{-prefix|.|format}"},{"name":"new_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/new{-prefix|.|format}","rel":"new_user_article"},{"name":"recent_user_articles","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/recent{-prefix|.|format}","rel":"recent"}],"options":["GET","POST"],"path_template":"\/users\/{user_id}\/articles{-prefix|.|format}","rel":"articles"},{"name":"edit_user","options":["GET"],"path_template":"\/users\/{user_id}\/edit{-prefix|.|format}","rel":"edit"},{"name":"user_profile","resource_templates":[{"name":"edit_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/edit{-prefix|.|format}","rel":"edit"},{"name":"new_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/new{-prefix|.|format}","rel":"new"}],"options":["GET","PUT","DELETE","POST"],"path_template":"\/users\/{user_id}\/profile{-prefix|.|format}","rel":"profile"}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}{-prefix|.|format}"},{"name":"new_user","options":["GET"],"path_template":"\/users\/new{-prefix|.|format}","rel":"new_user"}],"options":["GET","POST"],"path_template":"\/users{-prefix|.|format}"}]
@@ -1,2 +1,45 @@
1
1
  require 'test/unit'
2
2
  require 'described_routes/resource_template'
3
+
4
+ class TestResourceTemplate < Test::Unit::TestCase
5
+ attr_reader :json, :resource_templates, :resource_templates_by_name, :user_articles, :user_article, :edit_user_article
6
+
7
+
8
+ def setup
9
+ @json ||= File.read(File.dirname(__FILE__) + "/fixtures/described_routes_test.json")
10
+ @resource_templates = DescribedRoutes::ResourceTemplate.parse_json(json)
11
+ @resource_templates_by_name = DescribedRoutes::ResourceTemplate.all_by_name(@resource_templates)
12
+ @user_articles = @resource_templates_by_name["user_articles"]
13
+ @user_article = @resource_templates_by_name["user_article"]
14
+ @edit_user_article = @resource_templates_by_name["edit_user_article"]
15
+ end
16
+
17
+ def test_fixture
18
+ assert_kind_of(DescribedRoutes::ResourceTemplate, user_articles)
19
+ assert_kind_of(DescribedRoutes::ResourceTemplate, user_article)
20
+ assert_kind_of(DescribedRoutes::ResourceTemplate, edit_user_article)
21
+
22
+ assert_equal("user_article", user_article.name)
23
+ assert_equal([], user_article.params)
24
+ assert_equal([], user_article.optional_params)
25
+
26
+ assert_equal("articles", user_articles.rel)
27
+ assert_nil(user_article.rel)
28
+ assert_equal("edit", edit_user_article.rel)
29
+
30
+ assert(user_articles.resource_templates.member?(user_article))
31
+ assert(user_article.resource_templates.member?(edit_user_article))
32
+ end
33
+
34
+ def test_json
35
+ assert_equal(
36
+ JSON.parse(json),
37
+ JSON.parse(DescribedRoutes::ResourceTemplate.to_json(resource_templates)))
38
+ end
39
+
40
+ def test_yaml
41
+ assert_equal(
42
+ JSON.parse(json),
43
+ YAML.load(DescribedRoutes::ResourceTemplate.to_yaml(resource_templates)))
44
+ end
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: described_routes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Burrows
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-28 00:00:00 +01:00
12
+ date: 2009-04-29 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -59,6 +59,7 @@ files:
59
59
  - script/console
60
60
  - script/destroy
61
61
  - script/generate
62
+ - test/fixtures/described_routes_test.json
62
63
  - test/test_described_routes.rb
63
64
  - test/test_helper.rb
64
65
  - test/test_resource_template.rb