castache 0.0.1
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 +19 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +44 -0
- data/Rakefile +7 -0
- data/castache.gemspec +29 -0
- data/lib/castache.rb +52 -0
- data/lib/castache/version.rb +3 -0
- data/spec/castache_spec.rb +79 -0
- data/spec/spec_helper.rb +8 -0
- metadata +156 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
## 0.0.1 (Nov 30, 2012)
|
2
|
+
|
3
|
+
_initial release!_
|
4
|
+
|
5
|
+
Features:
|
6
|
+
- marshals object to redis with `Catache.set`
|
7
|
+
- returns re-hydrated ruby object from redis with `Castache.get`
|
8
|
+
- returns re-hydrated ruby object with `Castache.fetch` and will set contents of
|
9
|
+
the block you pass in if the object does not exist in the cache
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 StyleSeek Engineering Team
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Castache
|
2
|
+
|
3
|
+
Simple structured cache for ruby apps. Marshals objects to and from Redis
|
4
|
+
quickly and painlessly.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'castache'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install castache
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
````ruby
|
23
|
+
require 'castache'
|
24
|
+
Castache.redis = Redis.new # you can also pass it a redis:// URI string
|
25
|
+
# or hash of options to pass to Redis.new
|
26
|
+
@object = Castache.fetch 'cache:key' do
|
27
|
+
{hello: 'world'} # some expensive operation goes here...
|
28
|
+
end
|
29
|
+
p @object
|
30
|
+
````
|
31
|
+
|
32
|
+
## Project Status
|
33
|
+
|
34
|
+
- Build: [](https://travis-ci.org/styleseek/castache)
|
35
|
+
- Code Quality: [](https://codeclimate.com/github/styleseek/castache)
|
36
|
+
- Dependencies: [](https://gemnasium.com/styleseek/castache)
|
37
|
+
|
38
|
+
## Contributing
|
39
|
+
|
40
|
+
1. Fork it
|
41
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
42
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
43
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
44
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/castache.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'castache/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "castache"
|
8
|
+
gem.version = Castache::VERSION
|
9
|
+
gem.authors = ["StyleSeek Engineering"]
|
10
|
+
gem.email = ["engineering@styleseek.com"]
|
11
|
+
gem.description = %q{Simple structured object cache for ruby apps. }
|
12
|
+
gem.summary = %q{Simple structured object cache for ruby apps. Marshals objects to and from Redis quickly and painlessly. }
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(spec)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency('redis', '~> 3.0')
|
21
|
+
|
22
|
+
gem.add_development_dependency('rake', '~> 10')
|
23
|
+
gem.add_development_dependency('minitest', '~> 4.2')
|
24
|
+
gem.add_development_dependency('ansi', '~> 1.4')
|
25
|
+
gem.add_development_dependency('turn', '~> 0.9')
|
26
|
+
gem.add_development_dependency('pry', '~> 0.9')
|
27
|
+
gem.add_development_dependency('mocha', '~> 0.13')
|
28
|
+
gem.add_development_dependency('gem-release', '~> 0.4')
|
29
|
+
end
|
data/lib/castache.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'castache/version'
|
3
|
+
|
4
|
+
class Castache
|
5
|
+
class << self
|
6
|
+
attr_accessor :redis
|
7
|
+
|
8
|
+
def fetch (key, &block)
|
9
|
+
unless object = get(key)
|
10
|
+
object = set(key, block.call) if block_given?
|
11
|
+
end
|
12
|
+
object
|
13
|
+
end
|
14
|
+
|
15
|
+
def set(key, object)
|
16
|
+
object if @redis.set(key, Marshal.dump(object))
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(key)
|
20
|
+
if value = @redis.get(key)
|
21
|
+
Marshal.load(value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Pass it a connected Redis object, a redis:// uri string, or a hash of
|
26
|
+
# options for Redis.new
|
27
|
+
def redis=(connection)
|
28
|
+
if connection.is_a? Redis
|
29
|
+
Redis.current = connection
|
30
|
+
elsif connection.is_a? String
|
31
|
+
Redis.current = connect(connection) if URI(connection).scheme == 'redis'
|
32
|
+
elsif connection.is_a? Hash
|
33
|
+
Redis.current = Redis.new connection
|
34
|
+
end
|
35
|
+
@redis = Redis.current
|
36
|
+
end
|
37
|
+
|
38
|
+
def redis
|
39
|
+
@redis ||= Redis.current
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def self.connect(redis_uri)
|
46
|
+
uri = URI(redis_uri)
|
47
|
+
Redis.new(:host => uri.host,
|
48
|
+
:port => uri.port,
|
49
|
+
:password => uri.password,
|
50
|
+
:thread_safe => true)
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Castache do
|
6
|
+
|
7
|
+
let(:obj) { OpenStruct.new :string => 'Test',
|
8
|
+
:integer => 42,
|
9
|
+
:float => 1.0,
|
10
|
+
:array => [:a,:b,:c],
|
11
|
+
:hash => {'key'=>'value'},
|
12
|
+
:date => DateTime.strptime('253555860','%s') }
|
13
|
+
before do
|
14
|
+
Castache.redis = Redis.current
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
Castache.redis.flushall
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#redis" do
|
22
|
+
it "returns the current redis connection" do
|
23
|
+
Castache.redis.must_be_kind_of Redis
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#redis=" do
|
28
|
+
describe "can connect to redis" do
|
29
|
+
it "when given a Redis object" do
|
30
|
+
(Castache.redis = Redis.new)
|
31
|
+
Castache.redis.must_be_kind_of Redis
|
32
|
+
end
|
33
|
+
|
34
|
+
it "when given a uri string" do
|
35
|
+
Castache.redis = "redis:://localhost:6379"
|
36
|
+
Castache.redis.must_be_kind_of Redis
|
37
|
+
end
|
38
|
+
|
39
|
+
it "when given a hash" do
|
40
|
+
Castache.redis = { host: 'localhost', port: 6379, thread_safe: true }
|
41
|
+
Castache.redis.must_be_kind_of Redis
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#write" do
|
47
|
+
it "can write an object to the cache" do
|
48
|
+
Castache.set('write-test',obj).must_equal obj
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#read" do
|
53
|
+
it "can read an object from the cache" do
|
54
|
+
Castache.set('read-test',obj)
|
55
|
+
Castache.get('read-test').must_equal obj
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns nil if the key fails to retrieve an object" do
|
59
|
+
Castache.get('read-nil-test').must_be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#fetch" do
|
64
|
+
before do
|
65
|
+
@hash = {:test => 'data'}
|
66
|
+
Castache.set('fetch-test', @hash)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "returns an object in the cache, if it already exits" do
|
70
|
+
result = Castache.fetch('fetch-test') { obj }
|
71
|
+
result.must_equal @hash
|
72
|
+
end
|
73
|
+
|
74
|
+
it "stores the block contents in the cache, if it does not exist" do
|
75
|
+
Castache.fetch('fetch-nil-test') { obj }.must_equal obj
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: castache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- StyleSeek Engineering
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-30 00:00:00.000000000 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: redis
|
17
|
+
requirement: &70340648244680 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70340648244680
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &70340652778580 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70340652778580
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: minitest
|
39
|
+
requirement: &70340651333460 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '4.2'
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70340651333460
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: ansi
|
50
|
+
requirement: &70340651316260 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.4'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70340651316260
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: turn
|
61
|
+
requirement: &70340651552720 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0.9'
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *70340651552720
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: pry
|
72
|
+
requirement: &70340646922760 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.9'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *70340646922760
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: mocha
|
83
|
+
requirement: &70340635446320 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0.13'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: *70340635446320
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: gem-release
|
94
|
+
requirement: &70340640688120 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0.4'
|
100
|
+
type: :development
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: *70340640688120
|
103
|
+
description: ! 'Simple structured object cache for ruby apps. '
|
104
|
+
email:
|
105
|
+
- engineering@styleseek.com
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- .gitignore
|
111
|
+
- .travis.yml
|
112
|
+
- CHANGELOG.md
|
113
|
+
- Gemfile
|
114
|
+
- LICENSE.txt
|
115
|
+
- README.md
|
116
|
+
- Rakefile
|
117
|
+
- castache.gemspec
|
118
|
+
- lib/castache.rb
|
119
|
+
- lib/castache/version.rb
|
120
|
+
- spec/castache_spec.rb
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
has_rdoc: true
|
123
|
+
homepage: ''
|
124
|
+
licenses: []
|
125
|
+
post_install_message:
|
126
|
+
rdoc_options: []
|
127
|
+
require_paths:
|
128
|
+
- lib
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
segments:
|
136
|
+
- 0
|
137
|
+
hash: -3694376980599044599
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
segments:
|
145
|
+
- 0
|
146
|
+
hash: -3694376980599044599
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 1.3.9.5
|
150
|
+
signing_key:
|
151
|
+
specification_version: 3
|
152
|
+
summary: Simple structured object cache for ruby apps. Marshals objects to and from
|
153
|
+
Redis quickly and painlessly.
|
154
|
+
test_files:
|
155
|
+
- spec/castache_spec.rb
|
156
|
+
- spec/spec_helper.rb
|