elephas 0.1.0 → 1.0.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.
@@ -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