remember 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/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # Remember
2
+
3
+ ![Remember](/jpignata/remember/raw/master/etc/remember.jpg)
4
+
5
+ A simple object persistence wrapper for Moneta. Initialize Remember with any Moneta adapter and serialize any object that implements Ruby's marshal API.
6
+
7
+ ## Adapters
8
+
9
+ Moneta currently supports:
10
+
11
+ * File store for xattr
12
+ * Basic File Store
13
+ * Memcache store
14
+ * In-memory store
15
+ * The xattrs in a file system
16
+ * DataMapper
17
+ * S3
18
+ * Berkeley DB
19
+ * Redis
20
+ * SDBM
21
+ * Tokyo
22
+ * CouchDB
23
+
24
+ ## Usage
25
+
26
+ jp@populuxe:~/Projects/remember$ irb -r 'lib/remember' -r 'moneta/redis'
27
+ >> r = Remember.new(Moneta::Redis)
28
+ >> r["important_data"] = rand(100000000000000000000000)
29
+ => 99924367975800373618177
30
+ >> r["important_data"]
31
+ => 99924367975800373618177
32
+ >> r["config"] = { :setting => 'value', :other_setting => 'other value' }
33
+
34
+ jp@populuxe:~/Projects/remember$ irb -r 'lib/remember' -r 'moneta/redis'
35
+ >> r = Remember.new(Moneta::Redis)
36
+ >> r["important_data"]
37
+ => 99924367975800373618177
38
+ >> r["config"]
39
+ => {:setting=>"value", :other_setting=>"other value"}
40
+
41
+ jp@populuxe:~/Projects/remember$ irb -r 'lib/remember' -r 'moneta/redis'
42
+ >> r = Remember.new(Moneta::Redis)
43
+ >> class Duck; def make_noise; "Quack!"; end; end
44
+ >> d = Duck.new
45
+ >> d.make_noise
46
+ => "Quack!"
47
+ >> r["duck"] = d
48
+
49
+ jp@populuxe:~/Projects/remember$ irb -r 'lib/remember' -r 'moneta/redis'
50
+ >> r = Remember.new(Moneta::Redis)
51
+ >> class Duck; def make_noise; "Quack!"; end; end
52
+ >> r["duck"].make_noise
53
+ => "Quack!"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/etc/remember.jpg ADDED
Binary file
data/lib/remember.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'moneta'
2
+
3
+ class Remember
4
+ def initialize(moneta, options = {})
5
+ @moneta = moneta.new(options)
6
+ end
7
+
8
+ def []=(key, object)
9
+ store(key, object)
10
+ end
11
+
12
+ def store(key, object, options = {})
13
+ @moneta.store(key, Marshal.dump(object), options)
14
+ object
15
+ end
16
+
17
+ def update_key(key, options = {})
18
+ if @moneta.key?(key)
19
+ @moneta.update_key(key, options)
20
+ end
21
+ end
22
+
23
+ def fetch(key, options, &block)
24
+ if value = self[key]
25
+ value
26
+ else
27
+ store(key, yield, options)
28
+ end
29
+ end
30
+
31
+ def [](key)
32
+ deserialize(@moneta[key])
33
+ end
34
+
35
+ def delete(key)
36
+ deserialize(@moneta.delete(key))
37
+ end
38
+
39
+ def key?(key)
40
+ @moneta.key?(key)
41
+ end
42
+
43
+ def clear
44
+ @moneta.clear
45
+ end
46
+
47
+ alias has_key? key?
48
+
49
+ private
50
+
51
+ def deserialize(value)
52
+ if value && value.size > 0
53
+ Marshal.load(value)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,131 @@
1
+ require File.join(File.dirname(__FILE__), '../lib/remember')
2
+ require 'moneta/memory'
3
+
4
+ describe Remember do
5
+ before do
6
+ @r = Remember.new(Moneta::Memory)
7
+ end
8
+
9
+ describe "#[]=" do
10
+ it "returns the Object originally passed into it" do
11
+ @r["enum_sizes"] = ['xs', 's', 'm', 'l'].should == ['xs', 's', 'm', 'l']
12
+ end
13
+
14
+ it "persists object values and behaviors" do
15
+ class Bridge < Struct.new(:name, :year)
16
+ def to_s; "#{name} opened in #{year}"; end
17
+ def opened?; year < Time.now.year; end
18
+ end
19
+
20
+ @r["brooklyn"] = Bridge.new("Brooklyn Bridge", 1883)
21
+ @r["verrazano"] = Bridge.new("Verrazano-Narrows Bridge", 1964)
22
+
23
+ @r["brooklyn"].to_s.should == "Brooklyn Bridge opened in 1883"
24
+ @r["verrazano"].year.should == 1964
25
+ @r["brooklyn"].opened?.should be_true
26
+ end
27
+ end
28
+
29
+ describe "#[]" do
30
+ context "a given key exists" do
31
+ it "returns a deserialized object" do
32
+ @r["thirteen"] = 13
33
+ @r["thirteen"].should == 13
34
+ end
35
+ end
36
+
37
+ context "a given key does not exist" do
38
+ it "returns nil" do
39
+ @r["pretend"].should be_nil
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#delete" do
45
+ context "a given key exists" do
46
+ it "returns the object that the key contained after deletion" do
47
+ @r["thirteen"] = 13
48
+ @r.delete("thirteen").should == 13
49
+ @r["thirteen"].should be_nil
50
+ end
51
+ end
52
+
53
+ context "a given key does not exist" do
54
+ it "returns nil" do
55
+ @r.delete("pretend").should be_nil
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "#key?" do
61
+ context "a key that exists" do
62
+ it "returns true" do
63
+ @r["real"] = true
64
+ @r.key?("real").should be_true
65
+ end
66
+ end
67
+
68
+ context "a key that does not exist" do
69
+ it "returns false" do
70
+ @r.key?("pretend").should be_false
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#has_key?" do
76
+ it "is an alias for key?" do
77
+ @r.has_key?("pretend").should == @r.key?("pretend")
78
+ end
79
+ end
80
+
81
+ describe "#clear" do
82
+ it "clears all persisted objects" do
83
+ @r["do"] = 1
84
+ @r["ray"] = 2
85
+ @r["egon"] = 3
86
+ @r.clear
87
+ @r.key?("ray").should be_false
88
+ end
89
+ end
90
+
91
+ describe "#store" do
92
+ it "saves an object to key and sets an expiration in seconds" do
93
+ @r.store("zuul", :zuul, :expires_in => 60).should == :zuul
94
+ end
95
+ end
96
+
97
+ describe "#update_key" do
98
+ context "a key that exists" do
99
+ it "updates object identified by key and sets an expiration in seconds and returns the new expiration time" do
100
+ @r["gozer"] = :gozer
101
+ @r.update_key("gozer", :expires_in => 60).to_i.should == Time.now.to_i + 60
102
+ end
103
+ end
104
+
105
+ context "a key that does not exist" do
106
+ it "returns nil" do
107
+ @r.update_key("slimer", :expires_in => 60).should be_nil
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#fetch" do
113
+ context "a key that exists" do
114
+ it "fetches the object" do
115
+ @r["some_data"] = 123
116
+ @r.fetch("some_data", :expires_in => 120) { 456 }.should == 123
117
+ end
118
+ end
119
+
120
+ context "a key that does not exist" do
121
+ it "executes a block and then stores the resulting object" do
122
+ @r["resource_intensive_data"].should be_nil
123
+ data = @r.fetch("resource_intensive_data", :expires_in => 120) do
124
+ ['calculation']
125
+ end
126
+ data.should == ['calculation']
127
+ @r["resource_intensive_data"].should == ['calculation']
128
+ end
129
+ end
130
+ end
131
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remember
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - John Pignata
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-16 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A Moneta wrapper for Ruby object persistence
17
+ email: john.pignata@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.md
24
+ files:
25
+ - README.md
26
+ - VERSION
27
+ - etc/remember.jpg
28
+ - lib/remember.rb
29
+ - spec/remember_spec.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/jpignata/remember
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options:
36
+ - --charset=UTF-8
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: A Moneta wrapper for Ruby object persistence
58
+ test_files:
59
+ - spec/remember_spec.rb