path-to 0.0.5 → 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 +10 -0
- data/README.rdoc +12 -1
- data/lib/path-to/described_routes.rb +61 -8
- data/lib/path-to/path.rb +8 -10
- data/lib/path-to/with_params.rb +4 -4
- data/lib/path-to.rb +1 -1
- data/test/path-to/fixtures/described_routes_test.json +1 -1
- data/test/path-to/test_described_routes.rb +57 -15
- data/test/path-to/test_path.rb +6 -0
- data/test/path-to/test_with_params.rb +1 -11
- metadata +2 -2
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -6,7 +6,18 @@ path-to allows web applications to be modelled via URI templates and then access
|
|
6
6
|
|
7
7
|
== Synopsis
|
8
8
|
|
9
|
-
|
9
|
+
=== Automatic configuration with described_routes
|
10
|
+
|
11
|
+
Create a client application configured from a server that supports described_routes:
|
12
|
+
|
13
|
+
require 'path-to/described_routes'
|
14
|
+
|
15
|
+
app = PathTo::DescribedRoutes::Application.new(:json => Net::HTTP.get(URI.parse("http://example.com/described_routes.json")))
|
16
|
+
|
17
|
+
app.users["user_id" => "dojo"].articles.recent #=> http://example.com/users/dojo/articles/recent
|
18
|
+
app.users["user_id" => "dojo"].articles.recent.get #=> "<html>...</html>"
|
19
|
+
|
20
|
+
=== Local configuration
|
10
21
|
|
11
22
|
require "path-to"
|
12
23
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require "path-to"
|
2
|
-
require "described_routes"
|
2
|
+
require "described_routes/resource_template"
|
3
3
|
|
4
4
|
module PathTo
|
5
5
|
module DescribedRoutes
|
6
|
-
class TemplatedPath <
|
6
|
+
class TemplatedPath < PathTo::Path
|
7
7
|
attr_reader :resource_template
|
8
8
|
|
9
9
|
def initialize(parent, service, params, resource_template)
|
10
|
-
super(parent,
|
10
|
+
super(parent, resource_template.name, params)
|
11
11
|
@resource_template = resource_template
|
12
12
|
|
13
13
|
missing_params = resource_template.params - params.keys
|
@@ -21,7 +21,7 @@ module PathTo
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def uri_template
|
24
|
-
@uri_template ||= application.base + resource_template.path_template
|
24
|
+
@uri_template ||= resource_template.uri_template || (application.base + resource_template.path_template)
|
25
25
|
end
|
26
26
|
|
27
27
|
def uri
|
@@ -37,11 +37,47 @@ module PathTo
|
|
37
37
|
def application
|
38
38
|
@application ||= parent.application if parent
|
39
39
|
end
|
40
|
+
|
41
|
+
# Delegated to the application
|
42
|
+
def child_class_for(instance, method, params, template)
|
43
|
+
application.child_class_for(instance, method, params, template)
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Creates a child instance with new params, potentially finding a nested resource template that takes the additional params
|
48
|
+
#
|
49
|
+
def [](params = {})
|
50
|
+
keys = self.params.merge(params).keys
|
51
|
+
child_resource_template = resource_template.resource_templates.detect{ |t|
|
52
|
+
t.rel.nil? && (t.params - keys).empty?
|
53
|
+
} || resource_template
|
54
|
+
child_class = child_class_for(self, nil, params, child_resource_template)
|
55
|
+
child(child_class, nil, params, child_resource_template)
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Tries to respond to a missing method. We can do so if
|
60
|
+
#
|
61
|
+
# 1. we can find a resource template with rel matching the method name (direct children only)
|
62
|
+
# 2. #child_class_for returns a class or other factory object capable of creating a new child instance
|
63
|
+
#
|
64
|
+
# Otherwise we invoke super in the hope of avoiding any hard-to-debug behaviour!
|
65
|
+
#
|
66
|
+
def method_missing(method, *args)
|
67
|
+
child_resource_template = resource_template.resource_templates.detect{|t| t.rel == method.to_s}
|
68
|
+
if resource_template && (child_class = child_class_for(self, method, params, child_resource_template))
|
69
|
+
params = args.inject(Hash.new){|h, arg| h.merge(arg)}
|
70
|
+
child(child_class, method, params, child_resource_template)
|
71
|
+
else
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
40
76
|
end
|
41
77
|
|
42
78
|
class Application < WithParams
|
43
79
|
# An Array of DescribedRoutes::Resource objects
|
44
|
-
attr_reader :
|
80
|
+
attr_reader :resource_templates
|
45
81
|
|
46
82
|
# A Class (or at least something with a #new method) from which child objects will be created
|
47
83
|
attr_reader :default_type
|
@@ -49,10 +85,27 @@ module PathTo
|
|
49
85
|
# An HTTParty or similar
|
50
86
|
attr_reader :http_client
|
51
87
|
|
88
|
+
# Base URI of the application
|
52
89
|
attr_reader :base
|
53
90
|
|
54
|
-
def initialize(
|
55
|
-
@base
|
91
|
+
def initialize(options)
|
92
|
+
@base = options[:base]
|
93
|
+
@base.sub(/\/$/, '') if base
|
94
|
+
@params = options[:params] || {}
|
95
|
+
@default_type = options[:default_type] || TemplatedPath
|
96
|
+
@http_client = options[:http_client] || HTTPClient
|
97
|
+
|
98
|
+
@resource_templates = options[:resource_templates]
|
99
|
+
unless @resource_templates
|
100
|
+
if (json = options[:json])
|
101
|
+
@resource_templates = ::DescribedRoutes::ResourceTemplate.parse_json(json)
|
102
|
+
elsif (yaml = options[:yaml])
|
103
|
+
@resource_templates = ::DescribedRoutes::ResourceTemplate.parse_yaml(yaml)
|
104
|
+
elsif (xml = options[:xml])
|
105
|
+
@resource_templates = ::DescribedRoutes::ResourceTemplate.parse_xml(xml)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
56
109
|
super(nil, nil, params)
|
57
110
|
end
|
58
111
|
|
@@ -93,7 +146,7 @@ module PathTo
|
|
93
146
|
# Returns a hash of all ResourceTemplates (the tree flattened) keyed by name
|
94
147
|
#
|
95
148
|
def resource_templates_by_name
|
96
|
-
@resource_templates_by_name ||= ::DescribedRoutes.all_by_name(
|
149
|
+
@resource_templates_by_name ||= ::DescribedRoutes::ResourceTemplate.all_by_name(resource_templates)
|
97
150
|
end
|
98
151
|
|
99
152
|
#
|
data/lib/path-to/path.rb
CHANGED
@@ -7,9 +7,8 @@ module PathTo
|
|
7
7
|
# discovery process).
|
8
8
|
#
|
9
9
|
class Path < WithParams
|
10
|
-
|
11
10
|
#
|
12
|
-
# Finds (
|
11
|
+
# Finds (and remembers) the application in the parent hierarchy.
|
13
12
|
#
|
14
13
|
def application
|
15
14
|
@application ||= parent.application if parent
|
@@ -22,6 +21,13 @@ module PathTo
|
|
22
21
|
application.child_class_for(instance, service, args)
|
23
22
|
end
|
24
23
|
|
24
|
+
#
|
25
|
+
# Returns the http_client of the application; override if necessary. See also HTTPClient.
|
26
|
+
#
|
27
|
+
def http_client
|
28
|
+
@http_client ||= application.http_client
|
29
|
+
end
|
30
|
+
|
25
31
|
#
|
26
32
|
# Generate a URI for this object, using application.uri_for (see Application#uri_for for details).
|
27
33
|
#
|
@@ -35,14 +41,6 @@ module PathTo
|
|
35
41
|
def uri_template
|
36
42
|
application.uri_template_for(self, service, params)
|
37
43
|
end
|
38
|
-
|
39
|
-
#
|
40
|
-
# Returns the http_client of the application; override if necessary. See also HTTPClient.
|
41
|
-
#
|
42
|
-
def http_client
|
43
|
-
@http_client ||= application.http_client
|
44
|
-
end
|
45
|
-
|
46
44
|
#
|
47
45
|
# GET request on this object's URI
|
48
46
|
#
|
data/lib/path-to/with_params.rb
CHANGED
@@ -9,13 +9,13 @@ module PathTo
|
|
9
9
|
class WithParams
|
10
10
|
# Parent object, presumably of type WithParams or descendant
|
11
11
|
attr_reader :parent
|
12
|
-
|
13
|
-
# Service identifier, typically a method symbol intercepted in #method_missing
|
14
|
-
attr_reader :service
|
15
|
-
|
12
|
+
|
16
13
|
# Parameter hash
|
17
14
|
attr_reader :params
|
18
15
|
|
16
|
+
# Service identifier, typically a method symbol intercepted in #method_missing by parent
|
17
|
+
attr_reader :service
|
18
|
+
|
19
19
|
#
|
20
20
|
# Initialize a new WithParams object. Parameters:
|
21
21
|
#
|
data/lib/path-to.rb
CHANGED
@@ -1 +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","optional_params":["format"],"params":["product_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/admin\/products\/{product_id}{-prefix|.|format}","optional_params":["format"],"params":["product_id"]},{"name":"new_admin_product","options":["GET"],"path_template":"\/admin\/products\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/admin\/products{-prefix|.|format}","optional_params":["format"]},{"name":"pages","resource_templates":[{"name":"page","resource_templates":[{"name":"edit_page","options":["GET"],"path_template":"\/pages\/{page_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["page_id"]},{"name":"summary_page","options":["GET"],"path_template":"\/pages\/{page_id}\/summary{-prefix|.|format}","rel":"summary","optional_params":["format"],"params":["page_id"]},{"name":"toggle_visibility_page","options":["POST"],"path_template":"\/pages\/{page_id}\/toggle_visibility{-prefix|.|format}","rel":"toggle_visibility","optional_params":["format"],"params":["page_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/pages\/{page_id}{-prefix|.|format}","optional_params":["format"],"params":["page_id"]},{"name":"new_page","options":["GET"],"path_template":"\/pages\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/pages{-prefix|.|format}","optional_params":["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","optional_params":["format"],"params":["user_id","article_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}\/articles\/{article_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id","article_id"]},{"name":"new_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/new{-prefix|.|format}","optional_params":["format"],"params":["user_id"]},{"name":"recent_user_articles","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/recent{-prefix|.|format}","rel":"recent","optional_params":["format"],"params":["user_id"]}],"options":["GET","POST"],"path_template":"\/users\/{user_id}\/articles{-prefix|.|format}","rel":"articles","optional_params":["format"],"params":["user_id"]},{"name":"edit_user","options":["GET"],"path_template":"\/users\/{user_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"user_profile","resource_templates":[{"name":"edit_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"new_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/new{-prefix|.|format}","rel":"new","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE","POST"],"path_template":"\/users\/{user_id}\/profile{-prefix|.|format}","rel":"profile","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id"]},{"name":"new_user","options":["GET"],"path_template":"\/users\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/users{-prefix|.|format}","optional_params":["format"]}]
|
1
|
+
[{"name":"root","path_template":"\/","uri_template":"http:\/\/localhost:3000\/"},{"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}","uri_template":"http:\/\/localhost:3000\/admin\/products\/{product_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["product_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/admin\/products\/{product_id}{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/admin\/products\/{product_id}{-prefix|.|format}","optional_params":["format"],"params":["product_id"]},{"name":"new_admin_product","options":["GET"],"path_template":"\/admin\/products\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/admin\/products\/new{-prefix|.|format}","rel":"new_admin_product","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/admin\/products{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/admin\/products{-prefix|.|format}","optional_params":["format"]},{"name":"described_routes","resource_templates":[{"name":"new_described_route","options":["GET"],"path_template":"\/described_routes\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/described_routes\/new{-prefix|.|format}","rel":"new_described_route","optional_params":["format"]},{"name":"described_route","resource_templates":[{"name":"edit_described_route","options":["GET"],"path_template":"\/described_routes\/{route_name}\/edit{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/described_routes\/{route_name}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"]}],"options":["GET","PUT","DELETE"],"path_template":"\/described_routes\/{route_name}{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/described_routes\/{route_name}{-prefix|.|format}","rel":"described_route","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/described_routes{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/described_routes{-prefix|.|format}","optional_params":["format"]},{"name":"pages","resource_templates":[{"name":"page","resource_templates":[{"name":"edit_page","options":["GET"],"path_template":"\/pages\/{page_id}\/edit{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages\/{page_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["page_id"]},{"name":"summary_page","options":["GET"],"path_template":"\/pages\/{page_id}\/summary{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages\/{page_id}\/summary{-prefix|.|format}","rel":"summary","optional_params":["format"],"params":["page_id"]},{"name":"toggle_visibility_page","options":["POST"],"path_template":"\/pages\/{page_id}\/toggle_visibility{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages\/{page_id}\/toggle_visibility{-prefix|.|format}","rel":"toggle_visibility","optional_params":["format"],"params":["page_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/pages\/{page_id}{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages\/{page_id}{-prefix|.|format}","optional_params":["format"],"params":["page_id"]},{"name":"new_page","options":["GET"],"path_template":"\/pages\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages\/new{-prefix|.|format}","rel":"new_page","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/pages{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/pages{-prefix|.|format}","optional_params":["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}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/articles\/{article_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id","article_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}\/articles\/{article_id}{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/articles\/{article_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id","article_id"]},{"name":"new_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/articles\/new{-prefix|.|format}","rel":"new_user_article","optional_params":["format"],"params":["user_id"]},{"name":"recent_user_articles","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/recent{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/articles\/recent{-prefix|.|format}","rel":"recent","optional_params":["format"],"params":["user_id"]}],"options":["GET","POST"],"path_template":"\/users\/{user_id}\/articles{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/articles{-prefix|.|format}","rel":"articles","optional_params":["format"],"params":["user_id"]},{"name":"edit_user","options":["GET"],"path_template":"\/users\/{user_id}\/edit{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"user_profile","resource_templates":[{"name":"edit_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/edit{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/profile\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"new_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/profile\/new{-prefix|.|format}","rel":"new","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE","POST"],"path_template":"\/users\/{user_id}\/profile{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}\/profile{-prefix|.|format}","rel":"profile","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/{user_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id"]},{"name":"new_user","options":["GET"],"path_template":"\/users\/new{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users\/new{-prefix|.|format}","rel":"new_user","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/users{-prefix|.|format}","uri_template":"http:\/\/localhost:3000\/users{-prefix|.|format}","optional_params":["format"]}]
|
@@ -8,15 +8,37 @@ class TestDescribedRoutes < Test::Unit::TestCase
|
|
8
8
|
BASE = "http://localhost"
|
9
9
|
|
10
10
|
RESOURCE_TEMPLATE_NAMES = [
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
"admin_product",
|
12
|
+
"admin_products",
|
13
|
+
"described_route",
|
14
|
+
"described_routes",
|
15
|
+
"edit_admin_product",
|
16
|
+
"edit_described_route",
|
17
|
+
"edit_page",
|
18
|
+
"edit_user",
|
19
|
+
"edit_user_article",
|
20
|
+
"edit_user_profile",
|
21
|
+
"new_admin_product",
|
22
|
+
"new_described_route",
|
23
|
+
"new_page",
|
24
|
+
"new_user",
|
25
|
+
"new_user_article",
|
26
|
+
"new_user_profile",
|
27
|
+
"page",
|
28
|
+
"pages",
|
29
|
+
"recent_user_articles",
|
30
|
+
"root",
|
31
|
+
"summary_page",
|
32
|
+
"toggle_visibility_page",
|
33
|
+
"user",
|
34
|
+
"user_article",
|
35
|
+
"user_articles",
|
36
|
+
"user_profile",
|
37
|
+
"users"]
|
15
38
|
|
16
39
|
def setup
|
17
|
-
|
18
|
-
|
19
|
-
@app = PathTo::DescribedRoutes::Application.new(resource_templates, BASE)
|
40
|
+
json ||= File.read(File.dirname(__FILE__) + "/fixtures/described_routes_test.json")
|
41
|
+
@app = PathTo::DescribedRoutes::Application.new(:base => BASE, :json => json)
|
20
42
|
end
|
21
43
|
|
22
44
|
def test_resource_templates_by_name
|
@@ -24,29 +46,49 @@ class TestDescribedRoutes < Test::Unit::TestCase
|
|
24
46
|
assert_kind_of(DescribedRoutes::ResourceTemplate, app.resource_templates_by_name["user"])
|
25
47
|
end
|
26
48
|
|
27
|
-
def
|
49
|
+
def test_app_child_class_for
|
28
50
|
assert_equal(PathTo::DescribedRoutes::TemplatedPath, app.child_class_for(nil, nil, nil, nil))
|
29
51
|
assert_equal(PathTo::DescribedRoutes::TemplatedPath, app.child_class_for(nil, :user, nil, nil))
|
30
52
|
end
|
31
53
|
|
32
|
-
def
|
54
|
+
def test_app_child_with_missing_params
|
33
55
|
assert_raises(ArgumentError) do
|
34
56
|
app.edit_user
|
35
57
|
end
|
36
58
|
end
|
37
59
|
|
38
|
-
def
|
60
|
+
def test_app_child_with_insufficient_params
|
39
61
|
assert_raises(ArgumentError) do
|
40
62
|
app.user_article("user_id" => "dojo")
|
41
63
|
end
|
42
64
|
end
|
43
65
|
|
44
|
-
def
|
45
|
-
|
66
|
+
def test_app_child_with_no_params
|
67
|
+
assert_equal('users', app.users.resource_template.name)
|
46
68
|
end
|
47
69
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
70
|
+
def test_app_children_with_params
|
71
|
+
assert_equal('user', app.user("user_id" => "dojo").resource_template.name)
|
72
|
+
assert_equal('user_article', app.user_article("user_id" => "dojo", "article_id" => "first-post").resource_template.name)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_app_bad_child_name
|
76
|
+
assert_raises(NoMethodError) do
|
77
|
+
app.flooby
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_path_collection_member
|
82
|
+
assert_equal('user', app.users["user_id" => "dojo"].resource_template.name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_nested_resource
|
86
|
+
assert_equal('user_articles', app.users["user_id" => "dojo"].articles.resource_template.name)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_bad_nested_resource
|
90
|
+
assert_raises(NoMethodError) do
|
91
|
+
app.users.users
|
92
|
+
end
|
51
93
|
end
|
52
94
|
end
|
data/test/path-to/test_path.rb
CHANGED
@@ -17,6 +17,12 @@ module PathTo
|
|
17
17
|
@users = @app.users
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_service
|
21
|
+
assert_equal(:users, app.users.service)
|
22
|
+
assert_equal(:articles, app.articles.service)
|
23
|
+
assert_equal(:articles, app.users.articles.service)
|
24
|
+
end
|
25
|
+
|
20
26
|
def test_application
|
21
27
|
assert_equal(app, users.application)
|
22
28
|
assert_equal(app, users.articles.application)
|
@@ -20,14 +20,6 @@ module PathTo
|
|
20
20
|
@s1 = WithParamsSubclass1.new
|
21
21
|
end
|
22
22
|
|
23
|
-
def test_service
|
24
|
-
assert_nil(WithParams.new.service)
|
25
|
-
assert_equal(:root, root.service)
|
26
|
-
assert_equal(:root, root.child.service)
|
27
|
-
assert_equal(:child, root.child(nil, :child).service)
|
28
|
-
assert_equal(:child, root.child(nil, :child).child.service)
|
29
|
-
end
|
30
|
-
|
31
23
|
def test_params
|
32
24
|
assert_equal({}, WithParams.new.params)
|
33
25
|
assert_equal({:x => 1}, root.params)
|
@@ -43,8 +35,7 @@ module PathTo
|
|
43
35
|
assert_kind_of(WithParamsSubclass2, s1.child.child)
|
44
36
|
end
|
45
37
|
|
46
|
-
def
|
47
|
-
assert_equal(:root, root[].service)
|
38
|
+
def test_indexed_params
|
48
39
|
assert_equal({:x => 1}, root[].params)
|
49
40
|
assert_equal({:x => 2}, root[:x => 2].params)
|
50
41
|
assert_equal({:x => 1, :y => 2}, root[:y => 2].params)
|
@@ -52,7 +43,6 @@ module PathTo
|
|
52
43
|
|
53
44
|
def test_method_missing
|
54
45
|
assert_kind_of(WithParams, root.flooby)
|
55
|
-
assert_equal(:flooby, root.flooby.service)
|
56
46
|
assert_equal({:x => 1}, root.flooby.params)
|
57
47
|
assert_equal({:x => 1, :y => 2}, root.flooby[:y => 2].params)
|
58
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: path-to
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Burrows (asplake)
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-29 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|