blobsterix 0.0.13 → 0.0.14
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.
- checksums.yaml +4 -4
- data/CHANGELOG.txt +4 -0
- data/lib/blobsterix/helper/blob_access.rb +1 -1
- data/lib/blobsterix/helper/data_response.rb +1 -1
- data/lib/blobsterix/s3/s3_api.rb +1 -1
- data/lib/blobsterix/s3/s3_url_helper.rb +1 -2
- data/lib/blobsterix/service.rb +10 -1
- data/lib/blobsterix/storage/blob_meta_data.rb +6 -0
- data/lib/blobsterix/storage/cache.rb +21 -6
- data/lib/blobsterix/storage/file_system.rb +30 -24
- data/lib/blobsterix/storage/file_system_meta_data.rb +12 -2
- data/lib/blobsterix/transformation/transformation_chain.rb +1 -1
- data/lib/blobsterix/version.rb +1 -1
- data/lib/blobsterix.rb +14 -0
- data/spec/lib/blob/blob_api_spec.rb +12 -15
- data/spec/lib/helper/blob_access_spec.rb +4 -0
- data/spec/lib/s3/s3_api_spec.rb +7 -9
- data/spec/lib/storage/cache_spec.rb +33 -11
- data/spec/lib/storage/file_system_spec.rb +5 -3
- data/spec/spec_helper.rb +5 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f481ca0770aed1210888cb8be44b046d78d42e8d
|
4
|
+
data.tar.gz: 2f68e7ca5f0a995c31bc3770a769a843144de8b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 712bc1e5ca1c13f41703d630cc9bfbe9f0d9641bc9bb13a8d83bf41e3e6fd1d33103f0f35641d092e4bfdf81ffe85ca0bb1160b4c90861fdc144e84e72b8c556
|
7
|
+
data.tar.gz: 402a885f0c1f8676eea6d5c5dcb754e0e202e754b462cf63057259b99765c83fb49bc2073ed6b592c51a023043ffb4ed4238049bbbcfb8d9b2ab5b70bc1858c9
|
data/CHANGELOG.txt
CHANGED
@@ -43,7 +43,7 @@ module Blobsterix
|
|
43
43
|
if raw_trafo? || raw_accept_type?(metaData.accept_type)
|
44
44
|
# puts "Load from storage"
|
45
45
|
return metaData unless Blobsterix.cache_original?
|
46
|
-
Blobsterix.cache.
|
46
|
+
Blobsterix.cache.put_raw(BlobAccess.new(:bucket => bucket, :id => id), metaData.data) if metaData.valid?
|
47
47
|
return Blobsterix.cache.get(BlobAccess.new(:bucket => bucket, :id => id)) if metaData.valid?
|
48
48
|
else
|
49
49
|
# puts "accept type doesn't work"
|
@@ -19,7 +19,7 @@ module Blobsterix
|
|
19
19
|
if env != nil && meta.size > 30000 && Blobsterix.allow_chunked_stream
|
20
20
|
chunkresponse
|
21
21
|
else
|
22
|
-
[200, meta.header, (with_data ? meta.
|
22
|
+
[200, meta.header, (with_data ? File.open(meta.path, "rb") : "")]
|
23
23
|
end
|
24
24
|
else
|
25
25
|
[304, meta.header, ""]
|
data/lib/blobsterix/s3/s3_api.rb
CHANGED
@@ -67,7 +67,7 @@ module Blobsterix
|
|
67
67
|
blob_access=BlobAccess.new(:source => source, :bucket => bucket_current, :id => file_current, :accept_type => accept, :trafo => trafo_current)
|
68
68
|
data = transformation.run(blob_access)
|
69
69
|
cached_upload_clear
|
70
|
-
storage.put(bucket_current, file_current, data).response(false)
|
70
|
+
storage.put(bucket_current, file_current, data.open, :close_after_write => true).response(false)
|
71
71
|
end
|
72
72
|
|
73
73
|
def delete_bucket
|
@@ -14,7 +14,7 @@ module Blobsterix
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def cache_upload
|
17
|
-
cache.
|
17
|
+
cache.put_stream(cache_upload_key, env['rack.input'])
|
18
18
|
end
|
19
19
|
|
20
20
|
def cached_upload
|
@@ -27,7 +27,6 @@ module Blobsterix
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def cache_upload_key
|
30
|
-
#@cache_upload_key ||= "upload/"+bucket.gsub("/", "_")+"_"+file.gsub("/", "_")
|
31
30
|
@cache_upload_key ||= Blobsterix::BlobAccess.new(:bucket => bucket, :id => "upload_#{file.gsub("/", "_")}")
|
32
31
|
end
|
33
32
|
|
data/lib/blobsterix/service.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Blobsterix
|
2
2
|
class Service < Goliath::API
|
3
3
|
use Goliath::Rack::Params
|
4
|
+
include Logable
|
4
5
|
=begin
|
5
6
|
def on_headers(env, headers)
|
6
7
|
env.logger.info 'received headers: ' + headers.inspect
|
@@ -16,8 +17,16 @@ module Blobsterix
|
|
16
17
|
env.logger.info 'closing connection'
|
17
18
|
end
|
18
19
|
=end
|
20
|
+
def get_request_id
|
21
|
+
@request_id||=0
|
22
|
+
@request_id+=1
|
23
|
+
end
|
19
24
|
def response(env)
|
20
|
-
|
25
|
+
env["BLOBSTERIX_REQUEST_ID"] = get_request_id
|
26
|
+
logger.info "RAM USAGE Before[#{Process.pid}]: " + `pmap #{Process.pid} | tail -1`[10,40].strip
|
27
|
+
a = call_stack(env, BlobApi, StatusApi, S3Api)
|
28
|
+
logger.info "RAM USAGE After[#{Process.pid}]: " + `pmap #{Process.pid} | tail -1`[10,40].strip
|
29
|
+
a
|
21
30
|
end
|
22
31
|
|
23
32
|
def call_stack(env, *apis)
|
@@ -4,12 +4,14 @@ module Blobsterix
|
|
4
4
|
include Blobsterix::Logable
|
5
5
|
|
6
6
|
def invalidation
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
Blobsterix.wait_for(Proc.new {
|
8
|
+
each_meta_file do |meta_file|
|
9
|
+
blob_access=meta_to_blob_access(meta_file)
|
10
|
+
if Blobsterix.cache_checker.call(blob_access,meta_file.last_accessed,meta_file.last_modified)
|
11
|
+
invalidate(blob_access, true)
|
12
|
+
end
|
11
13
|
end
|
12
|
-
|
14
|
+
})
|
13
15
|
end
|
14
16
|
def initialize(path)
|
15
17
|
@path = Pathname.new(path)
|
@@ -20,12 +22,25 @@ module Blobsterix
|
|
20
22
|
FileSystemMetaData.new(cache_file_path(blob_access))
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
25
|
+
def put_raw(blob_access, data)
|
24
26
|
FileSystemMetaData.new(cache_file_path(blob_access),:bucket => blob_access.bucket, :id => blob_access.id, :trafo => blob_access.trafo, :accept_type => "#{blob_access.accept_type}").write() {|f|
|
25
27
|
f.write(data)
|
26
28
|
}
|
27
29
|
end
|
28
30
|
|
31
|
+
def put_stream(blob_access, stream)
|
32
|
+
FileSystemMetaData.new(cache_file_path(blob_access),:bucket => blob_access.bucket, :id => blob_access.id, :trafo => blob_access.trafo, :accept_type => "#{blob_access.accept_type}").write do |f|
|
33
|
+
FileUtils.copy_stream(stream, f)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def put(blob_access, path)
|
38
|
+
target_path = cache_file_path(blob_access)
|
39
|
+
FileUtils.mkdir_p(File.dirname(target_path))
|
40
|
+
FileUtils.cp(path, target_path, :preserve => false)
|
41
|
+
FileSystemMetaData.new(target_path,:bucket => blob_access.bucket, :id => blob_access.id, :trafo => blob_access.trafo, :accept_type => "#{blob_access.accept_type}")
|
42
|
+
end
|
43
|
+
|
29
44
|
def delete(blob_access)
|
30
45
|
FileSystemMetaData.new(cache_file_path(blob_access)).delete if exists?(blob_access)
|
31
46
|
end
|
@@ -26,16 +26,19 @@ module Blobsterix
|
|
26
26
|
else
|
27
27
|
if bucket_exist(bucket)
|
28
28
|
b = Bucket.new(bucket, time_string_of(bucket))
|
29
|
-
bucket_files(bucket)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
files = bucket_files(bucket)
|
30
|
+
Blobsterix.wait_for(Proc.new {
|
31
|
+
files.each do |file|
|
32
|
+
b.contents << BucketEntry.new(file) do |entry|
|
33
|
+
meta = metaData(bucket, file)
|
34
|
+
entry.last_modified = meta.last_modified.strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
35
|
+
entry.etag = meta.etag
|
36
|
+
entry.size = meta.size
|
37
|
+
entry.mimetype = meta.mimetype
|
38
|
+
entry.fullpath = contents(bucket, file).gsub("#{contents}/", "")
|
39
|
+
end
|
37
40
|
end
|
38
|
-
|
41
|
+
})
|
39
42
|
b
|
40
43
|
else
|
41
44
|
Nokogiri::XML::Builder.new do |xml|
|
@@ -46,7 +49,7 @@ module Blobsterix
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def get(bucket, key)
|
49
|
-
if (not File.directory?(contents(bucket, key))) and bucket_files(bucket).include?(key)
|
52
|
+
if (not File.directory?(contents(bucket, key))) # and bucket_files(bucket).include?(key)
|
50
53
|
Blobsterix.storage_read(BlobAccess.new(:bucket => bucket, :id => key))
|
51
54
|
metaData(bucket, key)
|
52
55
|
else
|
@@ -55,12 +58,15 @@ module Blobsterix
|
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
58
|
-
def put(bucket, key, value)
|
61
|
+
def put(bucket, key, value, opts={})
|
59
62
|
Blobsterix.storage_write(BlobAccess.new(:bucket => bucket, :id => key))
|
60
63
|
|
61
|
-
meta = metaData(bucket, key).write() {|f|
|
64
|
+
meta = Blobsterix.wait_for(Proc.new {metaData(bucket, key).write() {|f| FileUtils.copy_stream(value, f) }})
|
65
|
+
|
66
|
+
value.close if opts[:close_after_write]
|
67
|
+
|
68
|
+
Blobsterix.wait_for(Proc.new {Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))})
|
62
69
|
|
63
|
-
Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))
|
64
70
|
meta
|
65
71
|
end
|
66
72
|
|
@@ -74,17 +80,15 @@ module Blobsterix
|
|
74
80
|
|
75
81
|
def delete(bucket)
|
76
82
|
logger.info "Storage: delete bucket #{contents(bucket)}"
|
77
|
-
|
78
83
|
FileUtils.rm_rf(contents(bucket)) if bucket_exist(bucket) && bucket_files(bucket).empty?
|
79
|
-
|
80
84
|
#Dir.rmdir(contents(bucket)) if bucket_exist(bucket) && bucket_files(bucket).empty?
|
81
85
|
end
|
82
86
|
|
83
87
|
def delete_key(bucket, key)
|
84
88
|
Blobsterix.storage_delete(BlobAccess.new(:bucket => bucket, :id => key))
|
85
|
-
Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))
|
89
|
+
Blobsterix.wait_for(Proc.new {Blobsterix.cache.invalidate(Blobsterix::BlobAccess.new(:bucket => bucket, :id => key))})
|
86
90
|
|
87
|
-
metaData(bucket, key).delete if bucket_files(bucket).include? key
|
91
|
+
metaData(bucket, key).delete # if bucket_files(bucket).include? key
|
88
92
|
end
|
89
93
|
|
90
94
|
private
|
@@ -111,13 +115,15 @@ module Blobsterix
|
|
111
115
|
end
|
112
116
|
|
113
117
|
def bucket_files(bucket)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
118
|
+
Blobsterix.wait_for(Proc.new {
|
119
|
+
if (bucket_exist(bucket))
|
120
|
+
Dir.glob("#{contents}/#{bucket}/**/*").select{|e| !File.directory?(e) and not e.end_with?(".meta")}.map{ |e|
|
121
|
+
e.gsub("#{contents}/#{bucket}/","").gsub(/\w+\/\w+\/\w+\/\w+\/\w+\/\w+\//, "").gsub("\\", "/")
|
122
|
+
}
|
123
|
+
else
|
124
|
+
[]
|
125
|
+
end
|
126
|
+
})
|
121
127
|
end
|
122
128
|
|
123
129
|
def metaData(bucket, key)
|
@@ -20,10 +20,10 @@ module Blobsterix
|
|
20
20
|
|
21
21
|
def etag
|
22
22
|
if @last_modified === last_modified
|
23
|
-
@etag ||= Digest::MD5.
|
23
|
+
@etag ||= Digest::MD5.file(path).hexdigest
|
24
24
|
else
|
25
25
|
@last_modified = last_modified
|
26
|
-
@etag = Digest::MD5.
|
26
|
+
@etag = Digest::MD5.file(path).hexdigest
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -90,6 +90,16 @@ module Blobsterix
|
|
90
90
|
self
|
91
91
|
end
|
92
92
|
|
93
|
+
def open
|
94
|
+
if block_given?
|
95
|
+
f = File.open(path, "rb")
|
96
|
+
yield f
|
97
|
+
f.close
|
98
|
+
else
|
99
|
+
File.open(path, "rb")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
93
103
|
def delete
|
94
104
|
File.delete(meta_path) if File.exists?(meta_path)
|
95
105
|
File.delete(path) if valid
|
@@ -44,7 +44,7 @@ module Blobsterix::Transformations
|
|
44
44
|
break
|
45
45
|
end
|
46
46
|
|
47
|
-
cache.put(@target_blob_access,
|
47
|
+
cache.put(@target_blob_access, last_key)
|
48
48
|
@target_blob_access.reset!
|
49
49
|
end unless @target_blob_access.get.valid
|
50
50
|
|
data/lib/blobsterix/version.rb
CHANGED
data/lib/blobsterix.rb
CHANGED
@@ -227,4 +227,18 @@ module Blobsterix
|
|
227
227
|
def self.storage_delete(blob_access)
|
228
228
|
event("storage.delete",:blob_access => blob_access)
|
229
229
|
end
|
230
|
+
|
231
|
+
def self.wait_for(op = nil)
|
232
|
+
fiber = Fiber.current
|
233
|
+
EM.defer(op, Proc.new {|result|
|
234
|
+
fiber.resume result
|
235
|
+
})
|
236
|
+
Fiber.yield
|
237
|
+
end
|
238
|
+
|
239
|
+
def self.wait_for_next(op = nil)
|
240
|
+
EM.next_tick do
|
241
|
+
wait_for(op)
|
242
|
+
end
|
243
|
+
end
|
230
244
|
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Blobsterix::BlobApi do
|
4
|
+
include Blobsterix::SpecHelper
|
4
5
|
include Rack::Test::Methods
|
5
6
|
def app
|
6
7
|
Blobsterix::BlobApi
|
7
8
|
end
|
9
|
+
|
10
|
+
around(:each) do |example|
|
11
|
+
run_em(&example)
|
12
|
+
end
|
13
|
+
|
8
14
|
describe 'GET /blob/v1/' do
|
9
15
|
it 'get several categories of repositories by name' do
|
10
16
|
get "/blob/v1/"
|
@@ -13,7 +19,6 @@ describe Blobsterix::BlobApi do
|
|
13
19
|
end
|
14
20
|
|
15
21
|
describe 'Transformed get' do
|
16
|
-
include Blobsterix::SpecHelper
|
17
22
|
|
18
23
|
context "with data" do
|
19
24
|
let(:data) {"Hi my name is Test"}
|
@@ -39,18 +44,14 @@ describe Blobsterix::BlobApi do
|
|
39
44
|
|
40
45
|
it "should return the file" do
|
41
46
|
expect(Blobsterix.transformation).to receive(:cue_transformation).once.and_call_original
|
42
|
-
|
43
|
-
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
44
|
-
end
|
47
|
+
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
45
48
|
expect(last_response.status).to eql(200)
|
46
49
|
expect(last_response.body).to eql(data_transformed)
|
47
50
|
end
|
48
51
|
|
49
52
|
it "should return the file head" do
|
50
53
|
expect(Blobsterix.transformation).to receive(:cue_transformation).once.and_call_original
|
51
|
-
|
52
|
-
head "/blob/v1/dummy.test/test.txt"
|
53
|
-
end
|
54
|
+
head "/blob/v1/dummy.test/test.txt"
|
54
55
|
expect(last_response.status).to eql(200)
|
55
56
|
expect(last_response.body).to eql("")
|
56
57
|
end
|
@@ -58,10 +59,8 @@ describe Blobsterix::BlobApi do
|
|
58
59
|
it "should return the file and wait for previous trafos to finish" do
|
59
60
|
expect(Blobsterix.transformation).to receive(:cue_transformation).once.and_call_original
|
60
61
|
expect(Blobsterix.transformation).to receive(:wait_for_transformation).once.and_call_original
|
61
|
-
|
62
|
-
|
63
|
-
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
64
|
-
end
|
62
|
+
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
63
|
+
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
65
64
|
expect(last_response.status).to eql(200)
|
66
65
|
expect(last_response.body).to eql(data_transformed)
|
67
66
|
end
|
@@ -69,10 +68,8 @@ describe Blobsterix::BlobApi do
|
|
69
68
|
it "should return the file and not wait for different trafos to finish" do
|
70
69
|
expect(Blobsterix.transformation).to receive(:cue_transformation).twice.and_call_original
|
71
70
|
expect(Blobsterix.transformation).to receive(:wait_for_transformation).never.and_call_original
|
72
|
-
|
73
|
-
|
74
|
-
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
75
|
-
end
|
71
|
+
get "/blob/v1/dummy_#{data_transformed},dummy_#{data_transformed}.test/test.txt"
|
72
|
+
get "/blob/v1/dummy_#{data_transformed}.test/test.txt"
|
76
73
|
expect(last_response.status).to eql(200)
|
77
74
|
expect(last_response.body).to eql(data_transformed)
|
78
75
|
end
|
@@ -23,6 +23,10 @@ describe Blobsterix::BlobAccess do
|
|
23
23
|
Blobsterix::BlobAccess.new(:bucket => bucket, :id => key, :trafo => [["raw", ""]], :accept_type => Blobsterix::AcceptType.new("text/plain"))
|
24
24
|
end
|
25
25
|
|
26
|
+
around(:each) do |example|
|
27
|
+
run_em(&example)
|
28
|
+
end
|
29
|
+
|
26
30
|
describe "blob_access" do
|
27
31
|
after :each do
|
28
32
|
clear_data
|
data/spec/lib/s3/s3_api_spec.rb
CHANGED
@@ -11,6 +11,10 @@ describe Blobsterix::S3Api do
|
|
11
11
|
let(:key) {"test.txt"}
|
12
12
|
let(:bucket) {"test"}
|
13
13
|
|
14
|
+
around(:each) do |example|
|
15
|
+
run_em(&example)
|
16
|
+
end
|
17
|
+
|
14
18
|
after :each do
|
15
19
|
clear_data
|
16
20
|
end
|
@@ -18,9 +22,7 @@ describe Blobsterix::S3Api do
|
|
18
22
|
describe "create a bucket" do
|
19
23
|
it "should have bucket after creation" do
|
20
24
|
|
21
|
-
|
22
|
-
put "/", "", "HTTP_HOST" => "#{bucket}.s3.blah.de"
|
23
|
-
end
|
25
|
+
put "/", "", "HTTP_HOST" => "#{bucket}.s3.blah.de"
|
24
26
|
|
25
27
|
get "/#{bucket}"
|
26
28
|
expect(last_response.status).to eql(200)
|
@@ -46,9 +48,7 @@ describe Blobsterix::S3Api do
|
|
46
48
|
it "should have file in bucket after upload" do
|
47
49
|
#expect(Blobsterix.transformation).to receive(:cue_transformation).never.and_call_original
|
48
50
|
|
49
|
-
|
50
|
-
put "/#{key}", data, {"HTTP_HOST" => "#{bucket}.s3.blah.de"}
|
51
|
-
end
|
51
|
+
put "/#{key}", data, {"HTTP_HOST" => "#{bucket}.s3.blah.de"}
|
52
52
|
|
53
53
|
expect(last_response.status).to eql(200)
|
54
54
|
expect(Blobsterix.storage.get(bucket, key).read).to eql(data)
|
@@ -57,9 +57,7 @@ describe Blobsterix::S3Api do
|
|
57
57
|
it "should have file in bucket after upload with trafo" do
|
58
58
|
#expect(Blobsterix.transformation).to receive(:cue_transformation).once.and_call_original
|
59
59
|
|
60
|
-
|
61
|
-
put "/#{key}", data, {"HTTP_HOST" => "#{bucket}.s3.blah.de", "HTTP_X_AMZ_META_TRAFO" => "dummy_Yeah"}
|
62
|
-
end
|
60
|
+
put "/#{key}", data, {"HTTP_HOST" => "#{bucket}.s3.blah.de", "HTTP_X_AMZ_META_TRAFO" => "dummy_Yeah"}
|
63
61
|
|
64
62
|
expect(last_response.status).to eql(200)
|
65
63
|
expect(Blobsterix.storage.get(bucket, key).read).to eql("Yeah")
|
@@ -12,12 +12,16 @@ describe Blobsterix::Storage::Cache do
|
|
12
12
|
let(:blob_access_2) {Blobsterix::BlobAccess.new(:bucket => bucket, :id => key, :trafo => [["dummy", ""]])}
|
13
13
|
let(:blob_access_3) {Blobsterix::BlobAccess.new(:bucket => bucket, :id => key, :trafo => [["test", ""],["dummy", ""]])}
|
14
14
|
|
15
|
+
around(:each) do |example|
|
16
|
+
run_em(&example)
|
17
|
+
end
|
18
|
+
|
15
19
|
describe "invalidation" do
|
16
20
|
before :each do
|
17
|
-
Blobsterix.cache.
|
18
|
-
Blobsterix.cache.
|
19
|
-
Blobsterix.cache.
|
20
|
-
Blobsterix.cache.
|
21
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
22
|
+
Blobsterix.cache.put_raw(blob_access_1, data)
|
23
|
+
Blobsterix.cache.put_raw(blob_access_2, data)
|
24
|
+
Blobsterix.cache.put_raw(blob_access_3, data)
|
21
25
|
end
|
22
26
|
|
23
27
|
after :each do
|
@@ -68,14 +72,32 @@ describe Blobsterix::Storage::Cache do
|
|
68
72
|
end
|
69
73
|
|
70
74
|
it "should return valid blob when key exists" do
|
71
|
-
Blobsterix.cache.
|
75
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
76
|
+
metaData = Blobsterix.cache.get(blob_access)
|
77
|
+
expect(metaData.valid).to be(true)
|
78
|
+
expect(metaData.read).to eql(data)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should return valid blob when key exists and was copied via Stream" do
|
82
|
+
Blobsterix.cache.put_stream(blob_access, StringIO.new(data, "r"))
|
83
|
+
metaData = Blobsterix.cache.get(blob_access)
|
84
|
+
expect(metaData.valid).to be(true)
|
85
|
+
expect(metaData.read).to eql(data)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return valid blob when key exists and was copied via path" do
|
89
|
+
tmp = Tempfile.new("sldhgs")
|
90
|
+
tmp.write(data)
|
91
|
+
tmp.close
|
92
|
+
Blobsterix.cache.put(blob_access, tmp.path)
|
72
93
|
metaData = Blobsterix.cache.get(blob_access)
|
73
94
|
expect(metaData.valid).to be(true)
|
74
95
|
expect(metaData.read).to eql(data)
|
96
|
+
tmp.unlink
|
75
97
|
end
|
76
98
|
|
77
99
|
it "should return invalid blob when key is invalidated" do
|
78
|
-
Blobsterix.cache.
|
100
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
79
101
|
metaData = Blobsterix.cache.get(blob_access)
|
80
102
|
expect(metaData.valid).to be(true)
|
81
103
|
expect(metaData.read).to eql(data)
|
@@ -86,8 +108,8 @@ describe Blobsterix::Storage::Cache do
|
|
86
108
|
end
|
87
109
|
|
88
110
|
it "should return invalid blob when key is invalidated for all trafos" do
|
89
|
-
Blobsterix.cache.
|
90
|
-
Blobsterix.cache.
|
111
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
112
|
+
Blobsterix.cache.put_raw(blob_access_1, data)
|
91
113
|
|
92
114
|
metaData = Blobsterix.cache.get(blob_access)
|
93
115
|
expect(metaData.valid).to be(true)
|
@@ -104,8 +126,8 @@ describe Blobsterix::Storage::Cache do
|
|
104
126
|
end
|
105
127
|
|
106
128
|
it "should return invalid blob when key is invalidated for one trafos" do
|
107
|
-
Blobsterix.cache.
|
108
|
-
Blobsterix.cache.
|
129
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
130
|
+
Blobsterix.cache.put_raw(blob_access_1, data)
|
109
131
|
|
110
132
|
metaData = Blobsterix.cache.get(blob_access)
|
111
133
|
expect(metaData.valid).to be(true)
|
@@ -122,7 +144,7 @@ describe Blobsterix::Storage::Cache do
|
|
122
144
|
end
|
123
145
|
|
124
146
|
it "should return invalid blob when key is deleted" do
|
125
|
-
Blobsterix.cache.
|
147
|
+
Blobsterix.cache.put_raw(blob_access, data)
|
126
148
|
metaData = Blobsterix.cache.get(blob_access)
|
127
149
|
expect(metaData.valid).to be(true)
|
128
150
|
expect(metaData.read).to eql(data)
|
@@ -6,9 +6,11 @@ describe Blobsterix::Storage::FileSystem do
|
|
6
6
|
let(:data) {"Hi my name is Test"}
|
7
7
|
let(:key) {"test.txt"}
|
8
8
|
let(:bucket) {"test"}
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
around(:each) do |example|
|
11
|
+
run_em(&example)
|
12
|
+
end
|
13
|
+
|
12
14
|
describe "bucket" do
|
13
15
|
after :each do
|
14
16
|
clear_storage
|
data/spec/spec_helper.rb
CHANGED
@@ -30,9 +30,12 @@ module Blobsterix
|
|
30
30
|
end
|
31
31
|
def run_em(&block)
|
32
32
|
EM.run {
|
33
|
-
f = Fiber.new
|
33
|
+
f = Fiber.new{
|
34
|
+
yield block
|
35
|
+
while not EM.defers_finished?; end
|
36
|
+
EM.stop
|
37
|
+
}
|
34
38
|
f.resume
|
35
|
-
EM.stop
|
36
39
|
}
|
37
40
|
end
|
38
41
|
class DummyTrafo < Blobsterix::Transformations::Transformation
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blobsterix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Sudmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|