path-to 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -14
- data/Manifest.txt +2 -0
- data/README.rdoc +7 -1
- data/Rakefile +2 -9
- data/examples/delicious.rb +43 -0
- data/examples/delicious.yaml +18 -0
- data/lib/path-to/application.rb +6 -2
- data/lib/path-to/described_routes.rb +5 -0
- data/lib/path-to/path.rb +19 -4
- data/lib/path-to.rb +1 -1
- data/test/path-to/test_path.rb +13 -0
- metadata +8 -6
data/History.txt
CHANGED
@@ -1,31 +1,30 @@
|
|
1
|
+
== 0.3.0 2009-05-08
|
2
|
+
|
3
|
+
* Add http_options to Application, to be passed through to the HTTP client with requests
|
4
|
+
* Add an example of path-to/described_routes against Delicious
|
5
|
+
|
1
6
|
== 0.2.1 2009-04-18
|
2
7
|
|
3
|
-
*
|
4
|
-
|
5
|
-
|
6
|
-
* more tests!
|
8
|
+
* Use new Addressable API
|
9
|
+
* support app[params]
|
10
|
+
* more tests!
|
7
11
|
|
8
12
|
== 0.2.0 2009-04-18
|
9
13
|
|
10
|
-
*
|
11
|
-
* Support for nested described_routes, friendlier initialisation
|
14
|
+
* Support for nested described_routes, friendlier initialisation
|
12
15
|
|
13
16
|
== 0.1.0 2009-04-18
|
14
17
|
|
15
|
-
*
|
16
|
-
* Support for described_routes
|
18
|
+
* Support for described_routes
|
17
19
|
|
18
20
|
== 0.0.3 2009-04-18
|
19
21
|
|
20
|
-
*
|
21
|
-
* Update README with installation and contact info
|
22
|
+
* Update README with installation and contact info
|
22
23
|
|
23
24
|
== 0.0.2 2009-04-18
|
24
25
|
|
25
|
-
*
|
26
|
-
* lib/path-to/http_client.rb missing from manifest
|
26
|
+
* lib/path-to/http_client.rb missing from manifest
|
27
27
|
|
28
28
|
== 0.0.1 2009-04-04
|
29
29
|
|
30
|
-
*
|
31
|
-
* Initial release
|
30
|
+
* Initial release
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
= path-to README
|
2
2
|
|
3
|
+
Model web apps easily and access them via nice app-specific Ruby APIs.
|
4
|
+
|
5
|
+
Note to reader: You are invited to comment on the roadmap at http://positiveincline.com/?p=213
|
6
|
+
|
3
7
|
== Description
|
4
8
|
|
5
|
-
path-to allows web applications to be modelled via URI templates and then accessed through an application-specific Ruby API. It is designed to be extended easily to support discovery mechanisms;
|
9
|
+
path-to allows web applications to be modelled via URI templates and then accessed through an application-specific Ruby API. It is designed to be extended easily to support discovery mechanisms; included is an implementation based on the resource templates of described_routes.
|
6
10
|
|
7
11
|
== Synopsis
|
8
12
|
|
@@ -17,6 +21,8 @@ Create a client application configured from a server that supports described_rou
|
|
17
21
|
app.users["user_id" => "dojo"].articles.recent #=> http://example.com/users/dojo/articles/recent
|
18
22
|
app.users["user_id" => "dojo"].articles.recent.get #=> "<html>...</html>"
|
19
23
|
|
24
|
+
See examples/delicious.rb for an example based on a partial YAML-based description of the Delicious API held locally.
|
25
|
+
|
20
26
|
=== Local configuration
|
21
27
|
|
22
28
|
require "path-to"
|
data/Rakefile
CHANGED
@@ -2,21 +2,14 @@
|
|
2
2
|
$:.push File.dirname(__FILE__) + '/lib'
|
3
3
|
require 'path-to'
|
4
4
|
|
5
|
-
# undefined method `empty?' for nil:NilClass
|
6
|
-
# /Library/Ruby/Site/1.8/rubygems/specification.rb:886:in `validate'
|
7
|
-
class NilClass
|
8
|
-
def empty?
|
9
|
-
true
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
5
|
# Generate all the Rake tasks
|
14
6
|
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
15
7
|
$hoe = Hoe.new('path-to', PathTo::VERSION) do |p|
|
16
8
|
p.developer('Mike Burrows (asplake)', 'mjb@asplake.co.uk')
|
17
9
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
18
10
|
p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
19
|
-
p.rubyforge_name = p.name
|
11
|
+
p.rubyforge_name = p.name
|
12
|
+
p.url = 'http://positiveincline.com/?p=213'
|
20
13
|
p.extra_deps = [
|
21
14
|
['httparty','>= 0.4.2'],
|
22
15
|
['addressable','>= 2.0.2'],
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Adapted from jnunemaker/httparty/examples/delicious.rb to demonstrate path-to's metadata-driven REST client API capability
|
2
|
+
# For more information see http://positiveincline.com/?tag=path-to
|
3
|
+
|
4
|
+
require 'path-to/described_routes'
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
# read $HOME/.delicious (YAML format):
|
8
|
+
# username: <username>
|
9
|
+
# password: <password>
|
10
|
+
config = YAML::load(File.read(File.join(ENV['HOME'], '.delicious')))
|
11
|
+
|
12
|
+
# Create a basic delicious API object driven by the metadata in delicious.yaml.
|
13
|
+
# This defines these resources (of which the last two are equivalent):
|
14
|
+
#
|
15
|
+
# delicious.posts
|
16
|
+
# delicious.posts.recent
|
17
|
+
# delicious.recent_posts
|
18
|
+
#
|
19
|
+
# delicious.posts may take (as delicious.posts(params) or delicious.post[params])
|
20
|
+
#
|
21
|
+
# tag (optional). Filter by this tag.
|
22
|
+
# dt (optional). Filter by this date (CCYY-MM-DDThh:mm:ssZ).
|
23
|
+
# url (optional). Filter by this url.
|
24
|
+
#
|
25
|
+
# delicious.recent_posts may take
|
26
|
+
#
|
27
|
+
# tag (optional). Filter by this tag.
|
28
|
+
# count (optional). Number of items to retrieve (Default:15, Maximum:100)
|
29
|
+
#
|
30
|
+
# Same for delicious.posts.recent, or it can inherit the tag parameter from posts, as in
|
31
|
+
#
|
32
|
+
# pp delicious.posts['tag' => 'ruby'].recent
|
33
|
+
#
|
34
|
+
delicious = PathTo::DescribedRoutes::Application.new(
|
35
|
+
:yaml => File.read(File.join(File.dirname(__FILE__), 'delicious.yaml')),
|
36
|
+
:http_options => {
|
37
|
+
:basic_auth => {
|
38
|
+
:username => config['username'],
|
39
|
+
:password => config['password']}})
|
40
|
+
|
41
|
+
pp delicious.posts['tag' => 'ruby'].get
|
42
|
+
pp delicious.posts['tag' => 'ruby'].recent['count' => '5'].get
|
43
|
+
delicious.recent_posts.get['posts']['post'].each { |post| puts post['href'] }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
- name: posts
|
3
|
+
options:
|
4
|
+
- GET
|
5
|
+
uri_template: https://api.del.icio.us/v1/posts/get?{-join|&|tag,dt,url}
|
6
|
+
optional_parameters:
|
7
|
+
- tag
|
8
|
+
- dt
|
9
|
+
- url
|
10
|
+
resource_templates:
|
11
|
+
- name: recent_posts
|
12
|
+
options:
|
13
|
+
- GET
|
14
|
+
uri_template: https://api.del.icio.us/v1/posts/recent?{-join|&|tag,count}
|
15
|
+
rel: recent
|
16
|
+
optional_parameters:
|
17
|
+
- tag
|
18
|
+
- count
|
data/lib/path-to/application.rb
CHANGED
@@ -35,10 +35,14 @@ module PathTo
|
|
35
35
|
# An HTTParty or similar
|
36
36
|
attr_reader :http_client
|
37
37
|
|
38
|
+
# Hash of options to be included in HTTP method calls
|
39
|
+
attr_reader :http_options
|
40
|
+
|
38
41
|
#
|
39
42
|
# Initializes an Application. Parameters:
|
40
43
|
#
|
41
44
|
# [templates] Initial value for the templates attribute, defaults to {}
|
45
|
+
# [http_options] Initial value for the http_options attribute, defaults to nil
|
42
46
|
# [default_type] Initial value for the default_type attribute, defaults to Path
|
43
47
|
# [http_client] An object through which http calls are invoked. See HTTPClient and Path#http_client.
|
44
48
|
#
|
@@ -61,9 +65,9 @@ module PathTo
|
|
61
65
|
# end
|
62
66
|
# end
|
63
67
|
#
|
64
|
-
def initialize(templates = {}, default_type = Path, http_client = HTTPClient)
|
68
|
+
def initialize(templates = {}, http_options = nil, default_type = Path, http_client = HTTPClient)
|
65
69
|
super() # with default args
|
66
|
-
@templates, @default_type, @http_client = templates, default_type, http_client
|
70
|
+
@templates, @http_options, @default_type, @http_client = templates, http_options, default_type, http_client
|
67
71
|
yield self if block_given?
|
68
72
|
end
|
69
73
|
|
@@ -87,6 +87,9 @@ module PathTo
|
|
87
87
|
# Base URI of the application
|
88
88
|
attr_reader :base
|
89
89
|
|
90
|
+
# Hash of options to be included in HTTP method calls
|
91
|
+
attr_reader :http_options
|
92
|
+
|
90
93
|
def initialize(options)
|
91
94
|
super(options[:parent], options[:service], options[:params])
|
92
95
|
|
@@ -94,6 +97,7 @@ module PathTo
|
|
94
97
|
@base.sub(/\/$/, '') if base
|
95
98
|
@default_type = options[:default_type] || TemplatedPath
|
96
99
|
@http_client = options[:http_client] || HTTPClient
|
100
|
+
@http_options = options[:http_options]
|
97
101
|
|
98
102
|
@resource_templates = options[:resource_templates]
|
99
103
|
unless @resource_templates
|
@@ -111,6 +115,7 @@ module PathTo
|
|
111
115
|
@default_type ||= parent.default_type
|
112
116
|
@http_client ||= parent.http_client
|
113
117
|
@resource_templates ||= parent.resource_templates
|
118
|
+
@http_options ||= parent.http_options
|
114
119
|
end
|
115
120
|
end
|
116
121
|
|
data/lib/path-to/path.rb
CHANGED
@@ -45,30 +45,45 @@ module PathTo
|
|
45
45
|
# GET request on this object's URI
|
46
46
|
#
|
47
47
|
def get(*args)
|
48
|
-
http_client.get(uri, *args)
|
48
|
+
http_client.get(uri, *merge_http_options(args))
|
49
49
|
end
|
50
50
|
|
51
51
|
#
|
52
52
|
# PUT request on this object's URI
|
53
53
|
#
|
54
54
|
def put(*args)
|
55
|
-
http_client.put(uri, *args)
|
55
|
+
http_client.put(uri, *merge_http_options(args))
|
56
56
|
end
|
57
57
|
|
58
58
|
#
|
59
59
|
# POST request on this object's URI
|
60
60
|
#
|
61
61
|
def post(*args)
|
62
|
-
http_client.post(uri, *args)
|
62
|
+
http_client.post(uri, *merge_http_options(args))
|
63
63
|
end
|
64
64
|
|
65
65
|
#
|
66
66
|
# DELETE request on this object's URI
|
67
67
|
#
|
68
68
|
def delete(*args)
|
69
|
-
http_client.delete(uri, *args)
|
69
|
+
http_client.delete(uri, *merge_http_options(args))
|
70
70
|
end
|
71
71
|
|
72
|
+
#
|
73
|
+
# Include application.http_options (if exists) in args, either appending it or reverse-merging with the last element of args if it's a Hash
|
74
|
+
#
|
75
|
+
def merge_http_options(args)
|
76
|
+
if (http_options = application.http_options)
|
77
|
+
if args[-1].kind_of?(Hash)
|
78
|
+
args[-1] = http_options.merge(args[-1])
|
79
|
+
else
|
80
|
+
args << http_options
|
81
|
+
end
|
82
|
+
end
|
83
|
+
args
|
84
|
+
end
|
85
|
+
|
86
|
+
|
72
87
|
def inspect #:nodoc:
|
73
88
|
"#{uri} #<#{self.class.name}:#{"0x%x" % object_id} service=#{service.inspect}, params=#{params.inspect}>"
|
74
89
|
end
|
data/lib/path-to.rb
CHANGED
data/test/path-to/test_path.rb
CHANGED
@@ -50,5 +50,18 @@ module PathTo
|
|
50
50
|
users.send(method, request_options)
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
def test_http_methods_with_app_options
|
55
|
+
request_options = {:b => "b", :c => "c"}
|
56
|
+
app_options = {:a => "a", :b => "WILL BE OVERRIDDEN"}
|
57
|
+
expected_options = {:a => "a", :b => "b", :c => "c"}
|
58
|
+
|
59
|
+
app_with_options = Application.new(app.templates, app_options)
|
60
|
+
|
61
|
+
[:get, :put, :post, :delete].each do |method|
|
62
|
+
app_with_options.http_client.expects(method).with("http://example.com/users/", expected_options)
|
63
|
+
app_with_options.users.send(method, request_options)
|
64
|
+
end
|
65
|
+
end
|
53
66
|
end
|
54
67
|
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.
|
4
|
+
version: 0.3.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-
|
12
|
+
date: 2009-05-08 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
43
|
+
version: 1.4.1
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: hoe
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: 1.8.0
|
54
54
|
version:
|
55
|
-
description: path-to allows web applications to be modelled via URI templates and then accessed through an application-specific Ruby API. It is designed to be extended easily to support discovery mechanisms;
|
55
|
+
description: path-to allows web applications to be modelled via URI templates and then accessed through an application-specific Ruby API. It is designed to be extended easily to support discovery mechanisms; included is an implementation based on the resource templates of described_routes.
|
56
56
|
email:
|
57
57
|
- mjb@asplake.co.uk
|
58
58
|
executables: []
|
@@ -71,6 +71,8 @@ files:
|
|
71
71
|
- PostInstall.txt
|
72
72
|
- README.rdoc
|
73
73
|
- Rakefile
|
74
|
+
- examples/delicious.rb
|
75
|
+
- examples/delicious.yaml
|
74
76
|
- lib/path-to.rb
|
75
77
|
- lib/path-to/application.rb
|
76
78
|
- lib/path-to/described_routes.rb
|
@@ -87,7 +89,7 @@ files:
|
|
87
89
|
- test/path-to/test_with_params.rb
|
88
90
|
- test/test_helper.rb
|
89
91
|
has_rdoc: true
|
90
|
-
homepage:
|
92
|
+
homepage: http://positiveincline.com/?p=213
|
91
93
|
licenses: []
|
92
94
|
|
93
95
|
post_install_message: PostInstall.txt
|
@@ -111,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
113
|
requirements: []
|
112
114
|
|
113
115
|
rubyforge_project: path-to
|
114
|
-
rubygems_version: 1.3.
|
116
|
+
rubygems_version: 1.3.3
|
115
117
|
signing_key:
|
116
118
|
specification_version: 3
|
117
119
|
summary: path-to allows web applications to be modelled via URI templates and then accessed through an application-specific Ruby API
|