elephas 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,15 +21,15 @@ module Elephas
21
21
  # Writes a value to the cache.
22
22
  #
23
23
  # @param key [String] The key to associate the value with.
24
- # @param value [Object] The value to write. **Setting a value to `nil` doesn't mean *deleting* the value.
25
- # @param options [Hash] A list of options for writing. @see Elephas::Cache.write
24
+ # @param value [Object] The value to write. **Setting a value to `nil` **doesn't** mean *deleting* the value.
25
+ # @param options [Hash] A list of options for writing.
26
+ # @see Elephas::Cache.setup_options
26
27
  # @return [Object] The value itself.
27
28
  def write(key, value, options = {})
28
- ttl = [options[:ttl].to_integer, 0].max
29
29
  fvalue = ::Elephas::Entry.ensure(value, key, options)
30
30
  fvalue.refresh
31
31
 
32
- Rails.cache.write(key, value, :expires_in => ttl)
32
+ Rails.cache.write(key, value, :expires_in => fvalue.ttl)
33
33
  value
34
34
  end
35
35
 
@@ -11,10 +11,10 @@ module Elephas
11
11
  # @see http://semver.org
12
12
  module Version
13
13
  # The major version.
14
- MAJOR = 0
14
+ MAJOR = 1
15
15
 
16
16
  # The minor version.
17
- MINOR = 1
17
+ MINOR = 0
18
18
 
19
19
  # The patch version.
20
20
  PATCH = 0
@@ -6,36 +6,103 @@
6
6
 
7
7
  require "spec_helper"
8
8
 
9
- describe Elephas::Cache do
10
- pending ".use" do
9
+ describe ::Elephas::Cache do
10
+ let(:entry) { ::Elephas::Entry.ensure("VALUE", ::Elephas::Cache.default_prefix + "[KEY]", {:ttl => 3600}) }
11
11
 
12
+ describe ".use" do
13
+ before(:each) do
14
+ ::Elephas::Cache.provider = Elephas::Providers::Hash.new
15
+ end
16
+
17
+ it "should use the provider for reading the value" do
18
+ ::Elephas::Cache.provider.should_receive(:read)
19
+ ::Elephas::Cache.use("KEY") do "VALUE" end
20
+ end
21
+
22
+ it "should skip the provider if requested to" do
23
+ ::Elephas::Cache.use("KEY", {:ttl => 0}) do "VALUE" end
24
+ ::Elephas::Cache.provider.should_not_receive(:read)
25
+ ::Elephas::Cache.use("KEY", {:force => true}) do "VALUE" end
26
+ ::Elephas::Cache.provider.should_not_receive(:read)
27
+ end
28
+
29
+ it "should use the block for value computation" do
30
+ expect{ ::Elephas::Cache.use("KEY") do raise ArgumentError end }.to raise_error(ArgumentError)
31
+ end
32
+
33
+ it "should not use the block if the value is valid" do
34
+ ::Elephas::Cache.use("KEY") do entry end
35
+ expect{ ::Elephas::Cache.use("KEY") do raise ArgumentError end }.not_to raise_error(ArgumentError)
36
+ end
37
+
38
+ it "should store the value in the cache" do
39
+ ::Elephas::Cache.use("KEY") do entry end
40
+ expect(::Elephas::Cache.provider.read(entry.hash)).to eq(entry)
41
+ end
42
+
43
+ it "should return the entire entry or only the value" do
44
+ ::Elephas::Cache.use("KEY") do "VALUE" end
45
+
46
+ expect(::Elephas::Cache.use("KEY")).to eq("VALUE")
47
+ value = ::Elephas::Cache.use("KEY", {:as_entry => true})
48
+ expect(value).to be_a(::Elephas::Entry)
49
+ expect(value.value).to eq("VALUE")
50
+ end
12
51
  end
13
52
 
14
53
  describe ".read" do
15
54
  it "should be forwarded to the provider" do
16
- Elephas::Cache.provider.should_receive(:read)
17
- Elephas::Cache.read("KEY")
55
+ ::Elephas::Cache.provider.should_receive(:read)
56
+ ::Elephas::Cache.read("KEY")
18
57
  end
19
58
  end
20
59
 
21
60
  describe ".write" do
22
61
  it "should be forwarded to the provider" do
23
- Elephas::Cache.provider.should_receive(:write)
24
- Elephas::Cache.write("KEY", "VALUE")
62
+ ::Elephas::Cache.provider.should_receive(:write)
63
+ ::Elephas::Cache.write("KEY", "VALUE")
25
64
  end
26
65
  end
27
66
 
28
67
  describe ".delete" do
29
68
  it "should be forwarded to the provider" do
30
- Elephas::Cache.provider.should_receive(:delete)
31
- Elephas::Cache.delete("KEY")
69
+ ::Elephas::Cache.provider.should_receive(:delete)
70
+ ::Elephas::Cache.delete("KEY")
32
71
  end
33
72
  end
34
73
 
35
74
  describe ".exists?" do
36
75
  it "should be forwarded to the provider" do
37
- Elephas::Cache.provider.should_receive(:exists?)
38
- Elephas::Cache.exists?("KEY")
76
+ ::Elephas::Cache.provider.should_receive(:exists?)
77
+ ::Elephas::Cache.exists?("KEY")
78
+ end
79
+ end
80
+
81
+ describe "setup_options" do
82
+ it "should set good defaults for options" do
83
+ options_hashes = [
84
+ nil,
85
+ "A",
86
+ {:ttl => 2.hour},
87
+ {:force => true},
88
+ {:as_entry => true},
89
+ {:prefix => "prefix", :hash => "1f3caa3bd0b7ba49dc25f9445abdd4fed6fe65236681b392f0da251673885ea9"},
90
+ {:hash => "hash"}
91
+ ]
92
+
93
+ reference_hashes = [
94
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => false, :as_entry => false, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "8a7675d5f1d9b163bb7bb4329c1a59ff18870fad4ed35a3a2e8d195a6f3c0332"},
95
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => false, :as_entry => false, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "8a7675d5f1d9b163bb7bb4329c1a59ff18870fad4ed35a3a2e8d195a6f3c0332"},
96
+ {:key => "KEY", :ttl => 2.hour, :force => false, :as_entry => false, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "8a7675d5f1d9b163bb7bb4329c1a59ff18870fad4ed35a3a2e8d195a6f3c0332"},
97
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => true, :as_entry => false, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "8a7675d5f1d9b163bb7bb4329c1a59ff18870fad4ed35a3a2e8d195a6f3c0332"},
98
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => false, :as_entry => true, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "8a7675d5f1d9b163bb7bb4329c1a59ff18870fad4ed35a3a2e8d195a6f3c0332"},
99
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => false, :as_entry => false, :prefix => "prefix", :complete_key => "prefix[KEY]", :hash => "1f3caa3bd0b7ba49dc25f9445abdd4fed6fe65236681b392f0da251673885ea9"},
100
+ {:key => "KEY", :ttl => 1.hour * 1000, :force => false, :as_entry => false, :prefix => ::Elephas::Cache.default_prefix, :complete_key => "#{::Elephas::Cache.default_prefix}[KEY]", :hash => "hash"}
101
+ ]
102
+
103
+ options_hashes.each_with_index do |options, i|
104
+ expect(::Elephas::Cache.setup_options(options, "KEY")).to eq(reference_hashes[i])
105
+ end
39
106
  end
40
107
  end
41
108
  end
@@ -7,5 +7,95 @@
7
7
  require "spec_helper"
8
8
 
9
9
  describe Elephas::Entry do
10
+ subject { ::Elephas::Entry.new("KEY", "VALUE") }
10
11
 
12
+ describe "#initialize" do
13
+ it "should initialize with good defaults" do
14
+ ::Time.stub(:now).and_return(123.456)
15
+ expect(subject.key).to eq("KEY")
16
+ expect(subject.value).to eq("VALUE")
17
+ expect(subject.hash).to eq("5ca24005b740717ba4f3f6bc48a230700e68c2a4b11ecedb96f169f4efaf1f21")
18
+ expect(subject.ttl).to eq(360000)
19
+ expect(subject.updated_at).to eq(123.456)
20
+
21
+ ::Time.stub(:now).and_return(123.789)
22
+ other = ::Elephas::Entry.new("KEY 1", "VALUE 1", "HASH", 7200)
23
+ expect(other.key).to eq("KEY 1")
24
+ expect(other.value).to eq("VALUE 1")
25
+ expect(other.hash).to eq("HASH")
26
+ expect(other.ttl).to eq(7200)
27
+ expect(other.updated_at).to eq(123.789)
28
+ end
29
+ end
30
+
31
+ describe "#refresh" do
32
+ before(:each) do
33
+ ::Time.stub(:now).and_return(123.123)
34
+ end
35
+
36
+ it "should update the updated_at field" do
37
+ expect(subject.updated_at).to eq(123.123)
38
+ ::Time.stub(:now).and_return(456.456)
39
+ subject.refresh
40
+ expect(subject.updated_at).to eq(456.456)
41
+ end
42
+
43
+ it "should save to the cache" do
44
+ expect(::Elephas::Cache.provider.read(subject.hash)).not_to eq(subject)
45
+ subject.refresh(true)
46
+ expect(::Elephas::Cache.provider.read(subject.hash)).to eq(subject)
47
+ end
48
+ end
49
+
50
+ describe "#valid?" do
51
+ before(:each) do
52
+ ::Time.stub(:now).and_return(100)
53
+ end
54
+
55
+ it "should return true if the ttl is still valid" do
56
+ ::Time.stub(:now).and_return(1000)
57
+ expect(subject.valid?).to be_true
58
+ end
59
+
60
+ it "should return true if the ttl has expired" do
61
+ ::Time.stub(:now).and_return(10000)
62
+ subject.updated_at = 1000
63
+ expect(subject.valid?).to be_false
64
+ end
65
+ end
66
+
67
+ describe "==" do
68
+ it "should correctly compare with other entries" do
69
+ expect(subject == subject).to be_true
70
+ expect(subject == ::Elephas::Entry.new("KEY", "VALUE")).to be_true
71
+ expect(subject == ::Elephas::Entry.new("KEY", "VALUE 1")).to be_false
72
+ expect(subject == ::Elephas::Entry.new("KEY 1", "VALUE")).to be_false
73
+ expect(subject == ::Elephas::Entry.new("KEY", "VALUE", "HASH")).to be_false
74
+ end
75
+
76
+ it "should return false for other type" do
77
+ expect(subject == nil).to be_false
78
+ expect(subject == "A").to be_false
79
+ end
80
+ end
81
+
82
+ describe ".hashify_key" do
83
+ it "should compute a good hash" do
84
+ expect(::Elephas::Entry.hashify_key("HASH 1")).to eq("88e1f3572122e2605c1fab09efa8d4e99f5a064ae0230ca0aeced839796aba35")
85
+ expect(::Elephas::Entry.hashify_key("HASH 2")).to eq("38589cee32e00f700cf958dfe98f17d6da231700c41586e3c32b00314bb3cb58")
86
+ expect(::Elephas::Entry.hashify_key(nil)).to eq("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
87
+ end
88
+ end
89
+
90
+ describe ".ensure" do
91
+ it "should wrap the value" do
92
+ expect(::Elephas::Entry.ensure(nil, "KEY 1")).to eq(::Elephas::Entry.new("KEY 1", nil))
93
+ expect(::Elephas::Entry.ensure("A", "KEY 2")).to eq(::Elephas::Entry.new("KEY 2", "A"))
94
+ expect(::Elephas::Entry.ensure([], "KEY 3")).to eq(::Elephas::Entry.new("KEY 3", []))
95
+ end
96
+
97
+ it "should not alter Entry objects" do
98
+ expect(::Elephas::Entry.ensure(subject, "ANOTHER KEY")).to eq(subject)
99
+ end
100
+ end
11
101
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elephas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-28 00:00:00.000000000 Z
12
+ date: 2012-07-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cowtech-extensions
@@ -204,7 +204,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
204
204
  version: '0'
205
205
  segments:
206
206
  - 0
207
- hash: 2608788952293416880
207
+ hash: 3704477900054561540
208
208
  required_rubygems_version: !ruby/object:Gem::Requirement
209
209
  none: false
210
210
  requirements:
@@ -213,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
213
  version: '0'
214
214
  segments:
215
215
  - 0
216
- hash: 2608788952293416880
216
+ hash: 3704477900054561540
217
217
  requirements: []
218
218
  rubyforge_project: elephas
219
219
  rubygems_version: 1.8.24