wycats-moneta 0.5.0 → 0.6.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/README CHANGED
@@ -10,6 +10,12 @@ Out of the box, it supports:
10
10
  * In-memory store
11
11
  * The xattrs in a file system
12
12
  * DataMapper
13
+ * S3
14
+ * Berkeley DB
15
+ * Redis
16
+ * SDBM
17
+ * Tokyo
18
+ * CouchDB
13
19
 
14
20
  All stores support key expiration, but only memcache supports it natively. All other stores
15
21
  emulate expiration.
data/lib/moneta.rb CHANGED
@@ -6,40 +6,37 @@ module Moneta
6
6
  self.delete(key)
7
7
  end
8
8
  end
9
-
10
- def has_key?(key)
9
+
10
+ def key?(key)
11
11
  check_expired(key)
12
12
  super
13
13
  end
14
-
15
- def key?(key)
16
- has_key?(key)
17
- end
18
-
14
+
19
15
  def [](key)
20
16
  check_expired(key)
21
17
  super
22
18
  end
23
-
24
- def fetch(key, default)
19
+
20
+ def fetch(key, default = nil, &blk)
25
21
  check_expired(key)
26
22
  super
27
23
  end
28
-
24
+
29
25
  def delete(key)
30
26
  check_expired(key)
31
27
  super
32
28
  end
33
-
29
+
34
30
  def update_key(key, options)
35
- update_options(key, options)
31
+ update_options(key, options)
36
32
  end
37
-
33
+
38
34
  def store(key, value, options = {})
39
- super(key, value)
35
+ ret = super(key, value)
40
36
  update_options(key, options)
37
+ ret
41
38
  end
42
-
39
+
43
40
  private
44
41
  def update_options(key, options)
45
42
  if options[:expires_in]
@@ -47,4 +44,33 @@ module Moneta
47
44
  end
48
45
  end
49
46
  end
50
- end
47
+
48
+ module StringExpires
49
+ include Expires
50
+
51
+ def check_expired(key)
52
+ if @expiration[key] && Time.now > Time.at(@expiration[key].to_i)
53
+ @expiration.delete(key)
54
+ delete(key)
55
+ end
56
+ end
57
+
58
+ private
59
+ def update_options(key, options)
60
+ if options[:expires_in]
61
+ @expiration[key] = (Time.now + options[:expires_in]).to_i.to_s
62
+ end
63
+ end
64
+ end
65
+
66
+ module Defaults
67
+ def fetch(key, value = nil)
68
+ value ||= block_given? ? yield(key) : default
69
+ self[key] || value
70
+ end
71
+
72
+ def store(key, value, options = {})
73
+ self[key] = value
74
+ end
75
+ end
76
+ end
@@ -8,15 +8,11 @@ end
8
8
 
9
9
  class MonetaHash
10
10
  include DataMapper::Resource
11
-
12
- def self.default_repository_name
13
- :moneta
14
- end
15
-
11
+
16
12
  property :the_key, String, :key => true
17
13
  property :value, Object, :lazy => false
18
14
  property :expires, Time
19
-
15
+
20
16
  def self.value(key)
21
17
  obj = self.get(key)
22
18
  obj && obj.value
@@ -26,79 +22,93 @@ end
26
22
  module Moneta
27
23
  class DataMapper
28
24
  class Expiration
29
- def initialize(klass)
25
+ def initialize(klass, repository)
30
26
  @klass = klass
27
+ @repository = repository
31
28
  end
32
-
29
+
33
30
  def [](key)
34
31
  if obj = get(key)
35
32
  obj.expires
36
33
  end
37
34
  end
38
-
35
+
39
36
  def []=(key, value)
40
37
  obj = get(key)
41
38
  obj.expires = value
42
- obj.save
39
+ obj.save(@repository)
43
40
  end
44
-
41
+
45
42
  def delete(key)
46
43
  obj = get(key)
47
44
  obj.expires = nil
48
- obj.save
45
+ obj.save(@repository)
49
46
  end
50
-
47
+
51
48
  private
52
49
  def get(key)
53
- @klass.get(key)
50
+ repository(@repository) { @klass.get(key) }
54
51
  end
55
52
  end
56
-
53
+
57
54
  def initialize(options = {})
58
- ::DataMapper.setup(:moneta, options[:setup])
59
- MonetaHash.auto_upgrade!
55
+ @repository = options.delete(:repository) || :moneta
56
+ ::DataMapper.setup(@repository, options[:setup])
57
+ repository_context { MonetaHash.auto_upgrade! }
60
58
  @hash = MonetaHash
61
- @expiration = Expiration.new(MonetaHash)
59
+ @expiration = Expiration.new(MonetaHash, @repository)
62
60
  end
63
-
61
+
64
62
  module Implementation
65
63
  def key?(key)
66
- !!@hash.get(key)
64
+ repository_context { !!@hash.get(key) }
67
65
  end
68
-
66
+
69
67
  def has_key?(key)
70
- !!@hash.get(key)
68
+ repository_context { !!@hash.get(key) }
71
69
  end
72
-
70
+
73
71
  def [](key)
74
- @hash.value(key)
72
+ repository_context { @hash.value(key) }
75
73
  end
76
74
 
77
75
  def []=(key, value)
78
- obj = @hash.get(key)
79
- if obj
80
- obj.update(key, value)
81
- else
82
- @hash.create(:the_key => key, :value => value)
83
- end
76
+ repository_context {
77
+ obj = @hash.get(key)
78
+ if obj
79
+ obj.update(key, value)
80
+ else
81
+ @hash.create(:the_key => key, :value => value)
82
+ end
83
+ }
84
84
  end
85
-
86
- def fetch(key, default)
87
- self[key] || default
85
+
86
+ def fetch(key, value = nil)
87
+ repository_context {
88
+ value ||= block_given? ? yield(key) : default
89
+ self[key] || value
90
+ }
88
91
  end
89
-
92
+
90
93
  def delete(key)
91
- value = self[key]
92
- @hash.all(:the_key => key).destroy!
93
- value
94
+ repository_context {
95
+ value = self[key]
96
+ @hash.all(:the_key => key).destroy!
97
+ value
98
+ }
94
99
  end
95
-
100
+
96
101
  def store(key, value, options = {})
97
- self[key] = value
102
+ repository_context { self[key] = value }
98
103
  end
99
-
104
+
100
105
  def clear
101
- @hash.all.destroy!
106
+ repository_context { @hash.all.destroy! }
107
+ end
108
+
109
+ private
110
+ def repository_context
111
+ repository(@repository) { yield }
102
112
  end
103
113
  end
104
114
  include Implementation
data/lib/moneta/file.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  begin
2
- require "fileutils"
3
2
  require "xattr"
4
3
  rescue LoadError
5
4
  puts "You need the xattr gem to use the File moneta store"
6
5
  exit
7
6
  end
7
+ require "fileutils"
8
8
 
9
9
  module Moneta
10
10
  class File
@@ -40,7 +40,7 @@ module Moneta
40
40
  if ::File.file?(@directory)
41
41
  raise StandardError, "The path you supplied #{@directory} is a file"
42
42
  elsif !::File.exists?(@directory)
43
- FileUtils.mkdir(@directory)
43
+ FileUtils.mkdir_p(@directory)
44
44
  end
45
45
 
46
46
  @expiration = Expiration.new(@directory)
@@ -51,9 +51,7 @@ module Moneta
51
51
  ::File.exist?(path(key))
52
52
  end
53
53
 
54
- def has_key?(key)
55
- ::File.exist?(path(key))
56
- end
54
+ alias has_key? key?
57
55
 
58
56
  def [](key)
59
57
  if ::File.exist?(path(key))
@@ -67,22 +65,14 @@ module Moneta
67
65
  file.puts(contents)
68
66
  end
69
67
  end
70
-
71
- def fetch(key, default)
72
- self[key] || default
73
- end
74
-
68
+
75
69
  def delete(key)
76
70
  value = self[key]
77
71
  FileUtils.rm(path(key))
78
72
  value
79
73
  rescue Errno::ENOENT
80
74
  end
81
-
82
- def store(key, value, options = {})
83
- self[key] = value
84
- end
85
-
75
+
86
76
  def clear
87
77
  FileUtils.rm_rf(@directory)
88
78
  FileUtils.mkdir(@directory)
@@ -94,6 +84,7 @@ module Moneta
94
84
  end
95
85
  end
96
86
  include Implementation
87
+ include Defaults
97
88
  include Expires
98
89
 
99
90
  end
@@ -1,52 +1,52 @@
1
1
  begin
2
+ require "memcached"
3
+ rescue LoadError
2
4
  require "memcache"
3
5
  rescue LoadError
4
6
  puts "You need the memcache gem to use the Memcache moneta store"
5
- exit
7
+ exit
6
8
  end
7
9
 
8
- module Moneta
10
+ module Moneta
9
11
  class Memcache
12
+ include Defaults
13
+
10
14
  def initialize(options = {})
11
15
  @cache = MemCache.new(options.delete(:server), options)
12
16
  end
13
-
17
+
14
18
  def key?(key)
15
- !self["key"].nil?
19
+ !self[key].nil?
16
20
  end
17
-
21
+
18
22
  alias has_key? key?
19
-
23
+
20
24
  def [](key)
21
25
  @cache.get(key)
22
26
  end
23
-
27
+
24
28
  def []=(key, value)
25
29
  store(key, value)
26
30
  end
27
-
28
- def fetch(key, default)
29
- self[key] || default
30
- end
31
-
31
+
32
32
  def delete(key)
33
33
  value = self[key]
34
34
  @cache.delete(key) if value
35
35
  value
36
36
  end
37
-
37
+
38
38
  def store(key, value, options = {})
39
39
  args = [key, value, options[:expires_in]].compact
40
40
  @cache.set(*args)
41
41
  end
42
-
42
+
43
43
  def update_key(key, options = {})
44
44
  val = self[key]
45
45
  self.store(key, val, options)
46
46
  end
47
-
47
+
48
48
  def clear
49
49
  @cache.flush_all
50
50
  end
51
51
  end
52
- end
52
+ end
data/lib/moneta/xattr.rb CHANGED
@@ -8,6 +8,7 @@ require "fileutils"
8
8
 
9
9
  module Moneta
10
10
  class Xattr
11
+ include Defaults
11
12
 
12
13
  def initialize(options = {})
13
14
  file = options[:file]
@@ -26,9 +27,7 @@ module Moneta
26
27
  @hash.list.include?(key)
27
28
  end
28
29
 
29
- def has_key?(key)
30
- @hash.list.include?(key)
31
- end
30
+ alias has_key? key?
32
31
 
33
32
  def [](key)
34
33
  return nil unless key?(key)
@@ -39,10 +38,6 @@ module Moneta
39
38
  @hash.set(key, Marshal.dump(value))
40
39
  end
41
40
 
42
- def fetch(key, value)
43
- self[key] || value
44
- end
45
-
46
41
  def delete(key)
47
42
  return nil unless key?(key)
48
43
  value = self[key]
@@ -50,10 +45,6 @@ module Moneta
50
45
  value
51
46
  end
52
47
 
53
- def store(key, value, options = {})
54
- self[key] = value
55
- end
56
-
57
48
  def clear
58
49
  @hash.list.each do |item|
59
50
  @hash.remove(item)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wycats-moneta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yehuda Katz