path-to 0.2.0 → 0.2.1
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 +7 -0
- data/lib/path-to/application.rb +2 -2
- data/lib/path-to/described_routes.rb +17 -5
- data/lib/path-to/with_params.rb +2 -2
- data/lib/path-to.rb +1 -1
- data/test/path-to/test_described_routes.rb +28 -0
- metadata +2 -2
data/History.txt
CHANGED
data/lib/path-to/application.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "path-to/path"
|
2
2
|
require "path-to/http_client"
|
3
|
-
require "addressable/
|
3
|
+
require "addressable/template"
|
4
4
|
|
5
5
|
module PathTo
|
6
6
|
#
|
@@ -114,7 +114,7 @@ module PathTo
|
|
114
114
|
# TODO it's a 1-line fix to Addressable to permit symbols (etc) as keys
|
115
115
|
if (t = uri_template_for(method, params))
|
116
116
|
string_keyed_params = params.keys.inject({}){|hash, key| hash[key.to_s] = params[key]; hash}
|
117
|
-
Addressable::
|
117
|
+
Addressable::Template.new(t).expand(string_keyed_params).to_s
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
@@ -26,8 +26,7 @@ module PathTo
|
|
26
26
|
|
27
27
|
def uri
|
28
28
|
@uri ||= begin
|
29
|
-
|
30
|
-
Addressable::URI.expand_template(uri_template, string_keyed_params).to_s
|
29
|
+
Addressable::Template.new(uri_template).expand(params).to_s
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -65,7 +64,7 @@ module PathTo
|
|
65
64
|
#
|
66
65
|
def method_missing(method, *args)
|
67
66
|
child_resource_template = resource_template.resource_templates.detect{|t| t.rel == method.to_s}
|
68
|
-
if
|
67
|
+
if child_resource_template && (child_class = child_class_for(self, method, params, child_resource_template))
|
69
68
|
params = args.inject(Hash.new){|h, arg| h.merge(arg)}
|
70
69
|
child(child_class, method, params, child_resource_template)
|
71
70
|
else
|
@@ -89,9 +88,10 @@ module PathTo
|
|
89
88
|
attr_reader :base
|
90
89
|
|
91
90
|
def initialize(options)
|
91
|
+
super(options[:parent], options[:service], options[:params])
|
92
|
+
|
92
93
|
@base = options[:base]
|
93
94
|
@base.sub(/\/$/, '') if base
|
94
|
-
@params = options[:params] || {}
|
95
95
|
@default_type = options[:default_type] || TemplatedPath
|
96
96
|
@http_client = options[:http_client] || HTTPClient
|
97
97
|
|
@@ -106,9 +106,21 @@ module PathTo
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
|
109
|
+
if parent
|
110
|
+
@base ||= parent.base
|
111
|
+
@default_type ||= parent.default_type
|
112
|
+
@http_client ||= parent.http_client
|
113
|
+
@resource_templates ||= parent.resource_templates
|
114
|
+
end
|
110
115
|
end
|
111
116
|
|
117
|
+
#
|
118
|
+
# Creates a copy of self with additional params
|
119
|
+
#
|
120
|
+
def [](params = {})
|
121
|
+
self.class.new(:parent => self, :params => params)
|
122
|
+
end
|
123
|
+
|
112
124
|
#
|
113
125
|
# Tries to respond to a missing method. We can do so if
|
114
126
|
#
|
data/lib/path-to/with_params.rb
CHANGED
@@ -24,7 +24,7 @@ module PathTo
|
|
24
24
|
# [params] Value for the params attribute
|
25
25
|
#
|
26
26
|
def initialize(parent = nil, service = nil, params = {})
|
27
|
-
@parent, @service, @params = parent, service, params
|
27
|
+
@parent, @service, @params = parent, service, params || {}
|
28
28
|
end
|
29
29
|
|
30
30
|
#
|
@@ -37,7 +37,7 @@ module PathTo
|
|
37
37
|
def child(child_class = nil, service = nil, params = {}, *other_args)
|
38
38
|
child_class ||= child_class_for(instance, service, params)
|
39
39
|
service ||= self.service
|
40
|
-
params = self.params.merge(params)
|
40
|
+
params = self.params.merge(params || {})
|
41
41
|
child_class.new(self, service, params, *other_args)
|
42
42
|
end
|
43
43
|
|
data/lib/path-to.rb
CHANGED
@@ -91,4 +91,32 @@ class TestDescribedRoutes < Test::Unit::TestCase
|
|
91
91
|
app.users.users
|
92
92
|
end
|
93
93
|
end
|
94
|
+
|
95
|
+
def test_uri_template_expansion
|
96
|
+
assert_equal(
|
97
|
+
"http://localhost:3000/users/dojo/articles/recent",
|
98
|
+
app.users["user_id" => "dojo"].articles.recent.uri)
|
99
|
+
assert_equal(
|
100
|
+
"http://localhost:3000/users/dojo/articles/recent.json",
|
101
|
+
app.users["user_id" => "dojo", "format" => "json"].articles.recent.uri)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_path_optional_params
|
105
|
+
users_json = app.users["format" => "json"]
|
106
|
+
user_json = app.users["user_id" => "dojo"]["format" => "json"]
|
107
|
+
|
108
|
+
assert_equal("users", users_json.service)
|
109
|
+
assert_equal("user", user_json.service)
|
110
|
+
assert_equal("http://localhost:3000/users.json", users_json.uri)
|
111
|
+
assert_equal("http://localhost:3000/users/dojo.json", user_json.uri)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_app_params
|
115
|
+
app_json = app["format" => "json"]
|
116
|
+
users_json = app_json.users
|
117
|
+
|
118
|
+
assert_kind_of(PathTo::DescribedRoutes::Application, app_json)
|
119
|
+
assert_equal(app, app_json.parent)
|
120
|
+
assert_equal("http://localhost:3000/users.json", users_json.uri)
|
121
|
+
end
|
94
122
|
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.2.
|
4
|
+
version: 0.2.1
|
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-30 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|