restfully 0.5.9 → 0.5.10
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/CHANGELOG +4 -0
- data/VERSION +1 -1
- data/lib/restfully.rb +1 -1
- data/lib/restfully/collection.rb +13 -2
- data/restfully.gemspec +2 -2
- data/spec/collection_spec.rb +25 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
0.5.10
|
2
|
+
* Direct lookup to the resource if it cannot be found in the collection (for APIs that do not return all the items in a collection) (priteau)
|
3
|
+
* Automatically load next pages of a collection when iterating through it
|
4
|
+
|
1
5
|
0.5.9
|
2
6
|
* fixed bug in #http_methods that made a resource not removable unless force reloading it
|
3
7
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.10
|
data/lib/restfully.rb
CHANGED
data/lib/restfully/collection.rb
CHANGED
@@ -26,14 +26,25 @@ module Restfully
|
|
26
26
|
|
27
27
|
# Iterates over the collection of items
|
28
28
|
def each(*args, &block)
|
29
|
-
@items.
|
29
|
+
@items.each_index{ |i|
|
30
|
+
block.call(@items[i])
|
31
|
+
if i == @items.length-1 && @items.length < self["total"]
|
32
|
+
# load next page
|
33
|
+
next_page = Collection.new(uri, session).load(:query => {:offset => self["offset"]+@items.length}) rescue nil
|
34
|
+
if next_page && next_page['offset'] != self["offset"]
|
35
|
+
@items.push(*next_page.to_a)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
}
|
30
39
|
end
|
31
40
|
|
32
41
|
# if property is a Symbol, it tries to find the corresponding item whose uid.to_sym is matching the property
|
33
42
|
# else, returns the result of calling <tt>[]</tt> on its superclass.
|
34
43
|
def [](property)
|
35
44
|
if property.kind_of?(Symbol)
|
36
|
-
find{|i| i['uid'] == property.to_s} ||
|
45
|
+
item = find{|i| i['uid'] == property.to_s} ||
|
46
|
+
find{|i| i['uid'] == property.to_s.to_i} ||
|
47
|
+
Resource.new([uri, property].join("/"), session).load rescue nil
|
37
48
|
else
|
38
49
|
super(property)
|
39
50
|
end
|
data/restfully.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{restfully}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Cyril Rohr"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-04-20}
|
13
13
|
s.default_executable = %q{restfully}
|
14
14
|
s.description = %q{Experimental code for auto-generation of wrappers on top of RESTful APIs that follow HATEOAS principles and provide OPTIONS methods and/or Allow headers.}
|
15
15
|
s.email = %q{cyril.rohr@gmail.com}
|
data/spec/collection_spec.rb
CHANGED
@@ -32,6 +32,31 @@ describe Collection do
|
|
32
32
|
job.class.should == Restfully::Resource
|
33
33
|
job['uid'].should == 319482
|
34
34
|
end
|
35
|
+
it "should make a direct request to collection_uri/resource_uid when calling [] and the searched item is not in the collection" do
|
36
|
+
Restfully::Resource.should_receive(:new).with('http://api.local/x/y/z/not_in_the_collection', @collection.session).and_return(resource = mock("resource"))
|
37
|
+
resource.should_receive(:load).and_return(resource)
|
38
|
+
@collection[:not_in_the_collection].should == resource
|
39
|
+
end
|
40
|
+
it "should go through the 'next' links (if any) to search for the requested item" do
|
41
|
+
body = JSON.parse(fixture("grid5000-rennes-jobs.json"))
|
42
|
+
body["total"] = 20
|
43
|
+
body1 = JSON.parse(fixture("grid5000-rennes-jobs.json"))
|
44
|
+
body["total"] = 20
|
45
|
+
body1["offset"] = 8
|
46
|
+
body2 = JSON.parse(fixture("grid5000-rennes-jobs.json"))
|
47
|
+
body["total"] = 20
|
48
|
+
body2["offset"] = 16
|
49
|
+
body2["items"][1]["uid"] = "18th item"
|
50
|
+
collection = Collection.new(@uri, session = mock('session')).load(:body => body)
|
51
|
+
session.should_receive(:get).with(@uri, :query => {:offset => 8}).ordered.and_return(response = mock("response", :body => body1, :status => 200, :headers => {}))
|
52
|
+
session.should_receive(:get).with(@uri, :query => {:offset => 16}).ordered.and_return(response = mock("response", :body => body2, :status => 200, :headers => {}))
|
53
|
+
collection.find{|item| item["uid"] == "18th item"}.should_not be_nil
|
54
|
+
end
|
55
|
+
it "should always return nil if the searched item is not in the collection" do
|
56
|
+
Restfully::Resource.should_receive(:new).with('http://api.local/x/y/z/doesnotexist', @collection.session).and_return(resource = mock("resource"))
|
57
|
+
resource.should_receive(:load).and_raise Restfully::HTTP::ClientError.new(mock("response", :body => "Not Found", :status => 404))
|
58
|
+
@collection[:doesnotexist].should be_nil
|
59
|
+
end
|
35
60
|
end
|
36
61
|
|
37
62
|
describe "populating collection" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restfully
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Rohr
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-04-20 00:00:00 +02:00
|
13
13
|
default_executable: restfully
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|