cache-aws-s3 0.1.0
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/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README.md +34 -0
- data/Rakefile +1 -0
- data/cache-aws-s3.gemspec +25 -0
- data/lib/cache-aws-s3.rb +2 -0
- data/lib/cache/aws/s3/object.rb +78 -0
- data/lib/cache/aws/s3/version.rb +7 -0
- data/spec/cache-aws-s3_spec.rb +36 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +8 -0
- metadata +81 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#cache-aws-s3
|
2
|
+
|
3
|
+
This gem adds local file caching for the AWS::S3 library. The best use case is if you use S3 to store the readonly/library copy of some object that you need occasionally transform (resize, retouch, etc).
|
4
|
+
|
5
|
+
Usage is simple, just add the gem to your bundle
|
6
|
+
|
7
|
+
require 'cache-aws-s3'
|
8
|
+
|
9
|
+
From there on, all (supported) calls to AWS::S3::S3Object will be first checked against the cache
|
10
|
+
|
11
|
+
S3FileCache.enable true
|
12
|
+
S3FileCache.cache_dir /var/s3filecache
|
13
|
+
|
14
|
+
AWS::S3::S3Object.value 'key', 'bucket'
|
15
|
+
|
16
|
+
AWS::S3::S3Object.cached_local? 'key', 'bucket'
|
17
|
+
AWS::S3::S3Object.perge_local! 'key', 'bucket'
|
18
|
+
|
19
|
+
|
20
|
+
##Note on Patches/Pull Requests
|
21
|
+
|
22
|
+
* Fork the project.
|
23
|
+
* Make your feature addition or bug fix.
|
24
|
+
* Add spec for it. This is important so I don't break it in a
|
25
|
+
future version unintentionally.
|
26
|
+
* Commit, do not mess with rakefile, version, or history.
|
27
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
28
|
+
* Send me a pull request. Bonus points for topic branches.
|
29
|
+
|
30
|
+
##Copyright
|
31
|
+
|
32
|
+
Copyright (c) 2011 Kyle Fritz
|
33
|
+
|
34
|
+
This gem was heavily inspired by [mock-aws-s3](https://github.com/jkrall/mock-aws-s3)
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cache/aws/s3/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cache-aws-s3"
|
7
|
+
s.version = Cache::AWS::S3::VERSION
|
8
|
+
s.authors = ["Kyle Fritz"]
|
9
|
+
s.email = ["kyle.p.fritz@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/kylefritz/cache-aws-s3"
|
11
|
+
s.summary = %q{local cache for s3 data}
|
12
|
+
s.description = %q{speed up repeated access to s3 data with a local cache}
|
13
|
+
|
14
|
+
s.rubyforge_project = "cache-aws-s3"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency "aws-s3"
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
#s.add_development_dependency "cucumber"
|
25
|
+
end
|
data/lib/cache-aws-s3.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class S3FileCache
|
5
|
+
class << self
|
6
|
+
attr_accessor :enabled, :cache_dir
|
7
|
+
def enabled?
|
8
|
+
self.enabled
|
9
|
+
end
|
10
|
+
end
|
11
|
+
@enabled=true
|
12
|
+
@cache_dir = "./tmp"
|
13
|
+
end
|
14
|
+
|
15
|
+
module AWS
|
16
|
+
module S3
|
17
|
+
|
18
|
+
class S3Object
|
19
|
+
class << self
|
20
|
+
|
21
|
+
#save old value method
|
22
|
+
alias s3_value value
|
23
|
+
|
24
|
+
#TODO: ignoring the &block for the moment
|
25
|
+
def value(key, bucket = nil, options = {}, &block)
|
26
|
+
|
27
|
+
return s3_value(key,bucket,options,&block) if not S3FileCache.enabled?
|
28
|
+
|
29
|
+
if cached_local? key, bucket
|
30
|
+
#return cached object
|
31
|
+
read_cache(key,bucket,options)
|
32
|
+
else
|
33
|
+
#1. open normal S3 file
|
34
|
+
value = s3_value(key,bucket,options) #omitting the block for now
|
35
|
+
|
36
|
+
#2. save local to file_path! (make parent directories)
|
37
|
+
cache_local(value,key,bucket,options)
|
38
|
+
|
39
|
+
#3. return the value object
|
40
|
+
value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def read_cache(key,bucket,options={})
|
45
|
+
data = File.open(file_path!(key,bucket, options)) {|f| f.read}
|
46
|
+
Value.new OpenStruct.new(:body=>data)
|
47
|
+
end
|
48
|
+
|
49
|
+
def cache_local(value,key,bucket,options={})
|
50
|
+
fp=file_path!(key,bucket,options)
|
51
|
+
FileUtils.mkdir_p File.dirname fp
|
52
|
+
File.open(fp,'w') {|io| io.write value.response}
|
53
|
+
end
|
54
|
+
|
55
|
+
def file_path!(key,bucket, options = {}) #:nodoc:
|
56
|
+
# We're using the second argument for options
|
57
|
+
if bucket.is_a?(Hash)
|
58
|
+
options.replace(bucket)
|
59
|
+
bucket = nil
|
60
|
+
end
|
61
|
+
File.join(S3FileCache.cache_dir, bucket_name(bucket), key)
|
62
|
+
end
|
63
|
+
|
64
|
+
def perge_local!(key,bucket)
|
65
|
+
#return delete file at file_path!(bucket,name)
|
66
|
+
file_path= file_path!(key,bucket)
|
67
|
+
File.unlink file_path if File.exists? file_path
|
68
|
+
end
|
69
|
+
|
70
|
+
def cached_local?(key,bucket)
|
71
|
+
#return file exists? at file_path!(bucket,name)
|
72
|
+
File.exists? file_path!(key,bucket)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Cache::AWS::S3" do
|
4
|
+
|
5
|
+
describe 'when using S3Object' do
|
6
|
+
before (:each){
|
7
|
+
S3FileCache.enabled=true
|
8
|
+
@bucket="mittens"
|
9
|
+
@key="these/are/our/vista.txt"
|
10
|
+
@fp=AWS::S3::S3Object.file_path! @key,@bucket
|
11
|
+
FileUtils.mkdir_p File.dirname @fp
|
12
|
+
File.open(@fp, 'w') {|f| f.write 'test data'}
|
13
|
+
}
|
14
|
+
after (:each){
|
15
|
+
File.unlink @fp
|
16
|
+
}
|
17
|
+
|
18
|
+
it 'resolves files locally' do
|
19
|
+
@fp.should == "#{S3FileCache.cache_dir}/#{@bucket}/#{@key}"
|
20
|
+
end
|
21
|
+
it 'should hit local cache first' do
|
22
|
+
AWS::S3::S3Object.should_not_receive(:get)
|
23
|
+
AWS::S3::S3Object.should_receive(:read_cache)
|
24
|
+
AWS::S3::S3Object.value @key, @bucket
|
25
|
+
end
|
26
|
+
it 'passes through to regular aws when disabled' do
|
27
|
+
S3FileCache.enabled=false
|
28
|
+
lambda { AWS::S3::S3Object.value( @key, @bucket)}.should raise_error(AWS::S3::NoConnectionEstablished)
|
29
|
+
end
|
30
|
+
it 'reads data out of local cache' do
|
31
|
+
val=AWS::S3::S3Object.read_cache @key, @bucket
|
32
|
+
val.should == 'test data'
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cache-aws-s3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kyle Fritz
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-23 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: aws-s3
|
16
|
+
requirement: &2211214360 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2211214360
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &2211209740 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2211209740
|
36
|
+
description: speed up repeated access to s3 data with a local cache
|
37
|
+
email:
|
38
|
+
- kyle.p.fritz@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- cache-aws-s3.gemspec
|
48
|
+
- lib/cache-aws-s3.rb
|
49
|
+
- lib/cache/aws/s3/object.rb
|
50
|
+
- lib/cache/aws/s3/version.rb
|
51
|
+
- spec/cache-aws-s3_spec.rb
|
52
|
+
- spec/spec.opts
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
homepage: https://github.com/kylefritz/cache-aws-s3
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project: cache-aws-s3
|
74
|
+
rubygems_version: 1.8.11
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: local cache for s3 data
|
78
|
+
test_files:
|
79
|
+
- spec/cache-aws-s3_spec.rb
|
80
|
+
- spec/spec.opts
|
81
|
+
- spec/spec_helper.rb
|