Use ETags as version in directory listings
This commit is contained in:
parent
39dac0a5ed
commit
256b3c426e
@ -241,8 +241,9 @@ module RemoteStorage
|
|||||||
sub_directories(user, directory).each do |entry|
|
sub_directories(user, directory).each do |entry|
|
||||||
directory_name = entry["name"].split("/").last
|
directory_name = entry["name"].split("/").last
|
||||||
timestamp = entry["timestamp"].to_i
|
timestamp = entry["timestamp"].to_i
|
||||||
|
etag = entry["etag"]
|
||||||
|
|
||||||
listing.merge!({ "#{directory_name}/" => timestamp })
|
listing.merge!({ "#{directory_name}/" => etag })
|
||||||
end
|
end
|
||||||
|
|
||||||
directory_entries(user, directory).each do |entry|
|
directory_entries(user, directory).each do |entry|
|
||||||
@ -252,8 +253,9 @@ module RemoteStorage
|
|||||||
else
|
else
|
||||||
DateTime.rfc2822(entry["last_modified"]).to_time.to_i
|
DateTime.rfc2822(entry["last_modified"]).to_time.to_i
|
||||||
end
|
end
|
||||||
|
etag = entry["etag"]
|
||||||
|
|
||||||
listing.merge!({ entry_name => timestamp })
|
listing.merge!({ entry_name => etag })
|
||||||
end
|
end
|
||||||
|
|
||||||
listing
|
listing
|
||||||
@ -270,10 +272,12 @@ module RemoteStorage
|
|||||||
key_name = keys.join(':');
|
key_name = keys.join(':');
|
||||||
last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified'];
|
last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified'];
|
||||||
timestamp = v.values[0]['metadata']['X-Riak-Meta']['X-Riak-Meta-Timestamp'];
|
timestamp = v.values[0]['metadata']['X-Riak-Meta']['X-Riak-Meta-Timestamp'];
|
||||||
|
etag = v.values[0]['metadata']['X-Riak-VTag'];
|
||||||
return [{
|
return [{
|
||||||
name: key_name,
|
name: key_name,
|
||||||
last_modified: last_modified_date,
|
last_modified: last_modified_date,
|
||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
|
etag: etag
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
EOH
|
EOH
|
||||||
@ -289,10 +293,12 @@ module RemoteStorage
|
|||||||
function(v){
|
function(v){
|
||||||
keys = v.key.split(':');
|
keys = v.key.split(':');
|
||||||
key_name = keys[keys.length-1];
|
key_name = keys[keys.length-1];
|
||||||
timestamp = v.values[0]['data']
|
timestamp = v.values[0]['data'];
|
||||||
|
etag = v.values[0]['metadata']['X-Riak-VTag'];
|
||||||
return [{
|
return [{
|
||||||
name: key_name,
|
name: key_name,
|
||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
|
etag: etag
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
EOH
|
EOH
|
||||||
|
|||||||
@ -19,17 +19,18 @@ describe "Directories" do
|
|||||||
put "/jimmy/tasks/http%3A%2F%2F5apps.com", "prettify design"
|
put "/jimmy/tasks/http%3A%2F%2F5apps.com", "prettify design"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "lists the objects with a timestamp of the last modification" do
|
it "lists the objects with their version" do
|
||||||
get "/jimmy/tasks/"
|
get "/jimmy/tasks/"
|
||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
last_response.content_type.must_equal "application/json"
|
last_response.content_type.must_equal "application/json"
|
||||||
|
|
||||||
|
foo = data_bucket.get("jimmy:tasks:foo")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "http://5apps.com"
|
content.must_include "http://5apps.com"
|
||||||
content.must_include "foo"
|
content.must_include "foo"
|
||||||
content["foo"].must_be_kind_of Integer
|
content["foo"].must_equal foo.etag.gsub(/"/, "")
|
||||||
content["foo"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "has a Last-Modifier header set" do
|
it "has a Last-Modifier header set" do
|
||||||
@ -103,12 +104,13 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
home = directory_bucket.get("jimmy:tasks/home")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "foo"
|
content.must_include "foo"
|
||||||
content.must_include "http://5apps.com"
|
content.must_include "http://5apps.com"
|
||||||
content.must_include "home/"
|
content.must_include "home/"
|
||||||
content["home/"].must_be_kind_of Integer
|
content["home/"].must_equal home.etag.gsub(/"/, "")
|
||||||
content["home/"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "updates the ETag of the parent directory" do
|
it "updates the ETag of the parent directory" do
|
||||||
@ -149,10 +151,11 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
projects = directory_bucket.get("jimmy:tasks/private/projects")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "projects/"
|
content.must_include "projects/"
|
||||||
content["projects/"].must_be_kind_of Integer
|
content["projects/"].must_equal projects.etag.gsub(/"/, "")
|
||||||
content["projects/"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "updates the timestamps of the existing directory objects" do
|
it "updates the timestamps of the existing directory objects" do
|
||||||
@ -184,10 +187,11 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
jaypeg = data_bucket.get("jimmy:tasks:jaypeg.jpg")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "jaypeg.jpg"
|
content.must_include "jaypeg.jpg"
|
||||||
content["jaypeg.jpg"].must_be_kind_of Integer
|
content["jaypeg.jpg"].must_equal jaypeg.etag.gsub(/"/, "")
|
||||||
content["jaypeg.jpg"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -204,10 +208,11 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
jaypeg = data_bucket.get("jimmy:tasks:jaypeg.jpg")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "jaypeg.jpg"
|
content.must_include "jaypeg.jpg"
|
||||||
content["jaypeg.jpg"].must_be_kind_of Integer
|
content["jaypeg.jpg"].must_equal jaypeg.etag.gsub(/"/, "")
|
||||||
content["jaypeg.jpg"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -223,10 +228,11 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
laundry = data_bucket.get("jimmy:tasks/home:laundry")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "laundry"
|
content.must_include "laundry"
|
||||||
content["laundry"].must_be_kind_of Integer
|
content["laundry"].must_equal laundry.etag.gsub(/"/, "")
|
||||||
content["laundry"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -300,12 +306,13 @@ describe "Directories" do
|
|||||||
|
|
||||||
last_response.status.must_equal 200
|
last_response.status.must_equal 200
|
||||||
|
|
||||||
|
tasks = directory_bucket.get("jimmy:tasks")
|
||||||
|
|
||||||
content = JSON.parse(last_response.body)
|
content = JSON.parse(last_response.body)
|
||||||
content.must_include "root-1"
|
content.must_include "root-1"
|
||||||
content.must_include "root-2"
|
content.must_include "root-2"
|
||||||
content.must_include "tasks/"
|
content.must_include "tasks/"
|
||||||
content["tasks/"].must_be_kind_of Integer
|
content["tasks/"].must_equal tasks.etag.gsub(/"/, "")
|
||||||
content["tasks/"].to_s.length.must_equal 13
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "has an ETag header set" do
|
it "has an ETag header set" do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user