moneta 0.7.14 → 0.7.15

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.0.0
3
4
  - 1.9.3
4
5
  - 1.8.7
5
6
  - jruby-19mode
data/.yardopts CHANGED
@@ -1 +1 @@
1
- - README.md SPEC.md CHANGES LICENSE
1
+ - README.md SPEC.md CHANGES LICENSE CONTRIBUTORS
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ 0.7.15
2
+
3
+ * CONTRIBUTORS file added
4
+ * Adapters::File#increment fixed
5
+
1
6
  0.7.14
2
7
 
3
8
  * Adapters::ActiveRecord, Adapters::Sequel: store values as blobs
data/CONTRIBUTORS ADDED
@@ -0,0 +1,21 @@
1
+ Adrian Madrid <aemadrid@gmail.com>
2
+ Alejandro Crosa <acrosa@sharing.local>
3
+ Anthony Eden <anthonyeden@gmail.com>
4
+ Benjamin Yu <benjaminlyu@gmail.com>
5
+ Ben Schwarz <ben.schwarz@gmail.com>
6
+ Daniel Mendler <mail@daniel-mendler.de>
7
+ Derek Kastner <dkastner@gmail.com>
8
+ Dylan Egan <me@dylanegan.com>
9
+ Hampton Catlin <hcatlin@gmail.com>
10
+ Hannes Georg <hannes.georg@xing.com>
11
+ Scott Wadden <scott.wadden@gmail.com>
12
+ Jari Bakken <jari.bakken@gmail.com>
13
+ Jeremy Voorhis <jvoorhis@gmail.com>
14
+ Jon Crosby <jon@joncrosby.me>
15
+ lakshan <lakshan@web2media.net>
16
+ Potapov Sergey <blake131313@gmail.com>
17
+ Quin Hoxie <quin@aboutus.org>
18
+ Tom Meier <ozmeier@yahoo.co.uk>
19
+ Xavier Shay <xavier@rhnh.net>
20
+ Yehuda Katz <wycats@gmail.com>
21
+
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  # Testing
@@ -18,7 +18,9 @@ gem 'msgpack-jruby', :platforms => :jruby
18
18
  gem 'bert', :platforms => :ruby
19
19
 
20
20
  # Compressors used by Transformer
21
- gem 'bzip2-ruby', :platforms => :mri # Only on mri currently
21
+ if RUBY_VERSION < '2.0'
22
+ gem 'bzip2-ruby', :platforms => :mri # Only on mri currently
23
+ end
22
24
  gem 'ruby-lzma', :platforms => :ruby
23
25
  gem 'lzoruby', :platforms => :ruby
24
26
  gem 'snappy', :platforms => :ruby
@@ -45,8 +47,10 @@ gem 'tokyotyrant'
45
47
  #gem 'localmemcache'
46
48
  gem 'tdb', :platforms => :ruby
47
49
  gem 'leveldb-ruby', :platforms => :ruby
48
- gem 'tokyocabinet', :platforms => :ruby
49
- unless defined?(JRUBY_VERSION)
50
+ if RUBY_VERSION < '2.0'
51
+ gem 'tokyocabinet', :platforms => :ruby
52
+ end
53
+ if RUBY_VERSION < '2.0' && !defined?(JRUBY_VERSION)
50
54
  # FIXME: We have to check manually for jruby
51
55
  # otherwise bundle install --deployment doesn't work
52
56
  gem 'kyotocabinet-ruby', :github => 'minad/kyotocabinet-ruby'
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Moneta: A unified interface for key/value stores
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/moneta.png)](http://rubygems.org/gems/moneta) [![Build Status](https://secure.travis-ci.org/minad/moneta.png?branch=master)](http://travis-ci.org/minad/moneta) [![Dependency Status](https://gemnasium.com/minad/moneta.png?travis)](https://gemnasium.com/minad/moneta) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/minad/moneta)
3
+ [![Gem Version](https://badge.fury.io/rb/moneta.png)](http://rubygems.org/gems/moneta) [![Build Status](https://secure.travis-ci.org/minad/moneta.png?branch=master)](http://travis-ci.org/minad/moneta) [![Dependency Status](https://gemnasium.com/minad/moneta.png?travis)](https://gemnasium.com/minad/moneta) [![Code Climate](https://codeclimate.com/github/minad/moneta.png)](https://codeclimate.com/github/minad/moneta)
4
4
 
5
5
  Moneta provides a standard interface for interacting with various kinds of key/value stores. A short overview of the features:
6
6
 
@@ -96,7 +96,7 @@ Out of the box, it supports the following backends. Use the backend name symbol
96
96
  * Filesystem directory store (`:File`)
97
97
  * Filesystem directory store which spreads files in subdirectories using md5 hash (`:HashFile`)
98
98
  * Key/value databases:
99
- * [Berkeley DB](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html) (`:DBM`)
99
+ * [Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html) (`:DBM`)
100
100
  * [Cassandra](http://cassandra.apache.org/) (`:Cassandra`)
101
101
  * [Daybreak](http://propublica.github.com/daybreak/) (`:Daybreak`)
102
102
  * [GDBM](http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html) (`:GDBM`)
@@ -154,7 +154,7 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
154
154
 
155
155
  <tr><td>Daybreak</td><td>daybreak</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">(✓)<sup>[7]</sup></td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td>Incredibly fast pure-ruby key/value store <a href="http://propublica.github.com/daybreak/">Daybreak</a></td></tr>
156
156
 
157
- <tr><td>DBM</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html">Berkeley DB</a></td></tr>
157
+ <tr><td>DBM</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html">Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)</a></td></tr>
158
158
 
159
159
  <tr><td>GDBM</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html">GDBM</a> database</td></tr>
160
160
 
@@ -758,6 +758,33 @@ to compare the speed of the different key value stores for different key/value s
758
758
  Feel free to add your own configurations! The impact of Moneta should be minimal since it is only a thin layer
759
759
  on top of the different stores.
760
760
 
761
+
762
+ ------
763
+
764
+ ## How to contribute?
765
+
766
+ Always feel free to open an issue on
767
+ https://github.com/minad/moneta/issues if something doesn't work
768
+ as you expect it to work. Feedback is also very welcome!
769
+
770
+ My only request about patches is that you please try
771
+ to test them before submitting.
772
+
773
+ ### Contribute an adapter
774
+
775
+ If you want support for another adapter you can at first at it to the list of
776
+ missing adapters at https://github.com/minad/moneta/issues/16
777
+
778
+ If you choose to implement an adapter please also add tests. Usually you
779
+ only have to add a few lines to `script/generate-specs` to generate appropriate
780
+ tests for your adapter. Please check also if travis.yml needs changes, for example
781
+ if you need to start additional services.
782
+
783
+ Check if the default settings in Moneta#new are appropriate for your adapter. If
784
+ not specify a better one.
785
+
786
+ Don't forget to edit the README.md and the CHANGES.
787
+
761
788
  ------
762
789
 
763
790
  ## Alternatives
data/Rakefile CHANGED
@@ -33,11 +33,9 @@ task :test do
33
33
  # QuickLZ is also not maintained on Github, but on Bitbucket
34
34
  # and I don't know where the issue tracker is.
35
35
  #
36
- # * Cassandra and Riak fail spuriously (An expert has to check the adapters!)
37
- #
38
36
  # * PStore and File increment/locking doesn't work correctly on JRuby
39
37
  #
40
- unstable = %w(quicklz cassandra riak)
38
+ unstable = %w(quicklz)
41
39
  unstable += %w(file pstore) if defined?(JRUBY_VERSION)
42
40
 
43
41
  unstable_re = /#{unstable.join('|')}/
@@ -1,12 +1,10 @@
1
- # Copyright: 2011 TMX Credit
2
- # Author: Potapov Sergey (aka Blake)
3
-
4
1
  require 'cassandra'
5
2
 
6
3
  module Moneta
7
4
  module Adapters
8
5
  # Cassandra backend
9
6
  # @api public
7
+ # @author Potapov Sergey (aka Blake)
10
8
  class Cassandra
11
9
  include Defaults
12
10
  include ExpiresSupport
@@ -94,6 +92,12 @@ module Moneta
94
92
  end
95
93
  self
96
94
  end
95
+
96
+ # (see Proxy#close)
97
+ def close
98
+ @backend.disconnect!
99
+ nil
100
+ end
97
101
  end
98
102
  end
99
103
  end
@@ -29,12 +29,15 @@ module Moneta
29
29
 
30
30
  # (see Proxy#store)
31
31
  def store(key, value, options = {})
32
- path = store_path(key)
33
32
  temp_file = ::File.join(@dir, "value-#{$$}-#{Thread.current.object_id}")
33
+ path = store_path(key)
34
34
  FileUtils.mkpath(::File.dirname(path))
35
35
  ::File.open(temp_file, 'wb') {|f| f.write(value) }
36
36
  ::File.rename(temp_file, path)
37
37
  value
38
+ rescue Exception
39
+ File.unlink(temp_file) rescue nil
40
+ raise
38
41
  end
39
42
 
40
43
  # (see Proxy#delete)
@@ -50,25 +53,22 @@ module Moneta
50
53
  temp_dir = "#{@dir}-#{$$}-#{Thread.current.object_id}"
51
54
  ::File.rename(@dir, temp_dir)
52
55
  FileUtils.mkpath(@dir)
53
- FileUtils.rm_rf(temp_dir)
54
56
  self
55
57
  rescue Errno::ENOENT
56
58
  self
59
+ ensure
60
+ FileUtils.rm_rf(temp_dir)
57
61
  end
58
62
 
59
63
  # (see Proxy#increment)
60
64
  def increment(key, amount = 1, options = {})
61
65
  path = store_path(key)
62
66
  FileUtils.mkpath(::File.dirname(path))
63
- existed = ::File.exists?(path)
64
- ::File.open(path, 'ab+') do |f|
67
+ ::File.open(path, ::File::RDWR | ::File::CREAT) do |f|
65
68
  Thread.pass until f.flock(::File::LOCK_EX)
66
- # FIXME: JRuby needs synchronous mode, otherwise f.read might return wrong value
67
- f.sync = true if defined?(JRUBY_VERSION)
68
- content = f.read
69
- amount += Utils.to_int(content) if existed || !content.empty?
70
- f.truncate(0)
71
- f.write(amount.to_s)
69
+ content = ::File.read(path)
70
+ amount += Utils.to_int(content) unless content.empty?
71
+ ::File.open(path, 'wb') {|o| o.write(amount.to_s) }
72
72
  amount
73
73
  end
74
74
  end
@@ -1,12 +1,10 @@
1
- # Copyright: 2011 TMX Credit
2
- # Author: Potapov Sergey (aka Blake)
3
-
4
1
  require 'riak'
5
2
 
6
3
  module Moneta
7
4
  module Adapters
8
5
  # Riak backend
9
6
  # @api public
7
+ # @author Potapov Sergey (aka Blake)
10
8
  class Riak
11
9
  include Defaults
12
10
 
data/lib/moneta/mixins.rb CHANGED
@@ -222,7 +222,6 @@ module Moneta
222
222
  # @api private
223
223
  module IncrementSupport
224
224
  # (see Defaults#increment)
225
- # @api public
226
225
  def increment(key, amount = 1, options = {})
227
226
  value = Utils.to_int(load(key, options)) + amount
228
227
  store(key, value.to_s, options)
@@ -239,8 +238,7 @@ module Moneta
239
238
  # This is sufficient for non-shared stores or if atomicity is not required.
240
239
  # @api private
241
240
  module CreateSupport
242
- # (see Default#create)
243
- # @api public
241
+ # (see Defaults#create)
244
242
  def create(key, value, options = {})
245
243
  if key? key
246
244
  false
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '0.7.14'
4
+ VERSION = '0.7.15'
5
5
  end
@@ -2012,10 +2012,12 @@ end}
2012
2012
  SPECS['concurrent_increment'] = %{def increment_thread(name)
2013
2013
  Thread.new do
2014
2014
  s = new_store
2015
- 1000.times do |i|
2016
- s.increment('counter', 1, :expires => false)
2015
+ 100.times do |i|
2016
+ 100.times do |j|
2017
+ s.increment("counter\#{j}", 1, :expires => false)
2018
+ Thread.pass if rand(1000) >= 995
2019
+ end
2017
2020
  s.store("\#{name}\#{i}", i.to_s, :expires => false)
2018
- sleep 0.01 if i % 100 == 0
2019
2021
  end
2020
2022
  s.close
2021
2023
  end
@@ -2028,12 +2030,14 @@ it 'have atomic increment across multiple processes' do
2028
2030
  a.join
2029
2031
  b.join
2030
2032
  c.join
2031
- 1000.times do |i|
2033
+ 100.times do |i|
2032
2034
  store["a\#{i}"].should == i.to_s
2033
2035
  store["b\#{i}"].should == i.to_s
2034
2036
  store["c\#{i}"].should == i.to_s
2035
2037
  end
2036
- store.raw['counter'].should == 3000.to_s
2038
+ 100.times do |j|
2039
+ store.raw["counter\#{j}"].should == 300.to_s
2040
+ end
2037
2041
  end}
2038
2042
 
2039
2043
  SPECS['concurrent_create'] = %{def create_thread(name)
@@ -2041,7 +2045,7 @@ SPECS['concurrent_create'] = %{def create_thread(name)
2041
2045
  s = new_store
2042
2046
  1000.times do |i|
2043
2047
  s[i.to_s].should == name if s.create(i.to_s, name, :expires => false)
2044
- sleep 0.01 if i % 100 == 0
2048
+ Thread.pass if rand(100) >= 99
2045
2049
  end
2046
2050
  s.close
2047
2051
  end
data/spec/monetaspecs.rb CHANGED
@@ -17164,10 +17164,12 @@ shared_examples_for 'concurrent_increment' do
17164
17164
  def increment_thread(name)
17165
17165
  Thread.new do
17166
17166
  s = new_store
17167
- 1000.times do |i|
17168
- s.increment('counter', 1, :expires => false)
17167
+ 100.times do |i|
17168
+ 100.times do |j|
17169
+ s.increment("counter#{j}", 1, :expires => false)
17170
+ Thread.pass if rand(1000) >= 995
17171
+ end
17169
17172
  s.store("#{name}#{i}", i.to_s, :expires => false)
17170
- sleep 0.01 if i % 100 == 0
17171
17173
  end
17172
17174
  s.close
17173
17175
  end
@@ -17180,12 +17182,14 @@ shared_examples_for 'concurrent_increment' do
17180
17182
  a.join
17181
17183
  b.join
17182
17184
  c.join
17183
- 1000.times do |i|
17185
+ 100.times do |i|
17184
17186
  store["a#{i}"].should == i.to_s
17185
17187
  store["b#{i}"].should == i.to_s
17186
17188
  store["c#{i}"].should == i.to_s
17187
17189
  end
17188
- store.raw['counter'].should == 3000.to_s
17190
+ 100.times do |j|
17191
+ store.raw["counter#{j}"].should == 300.to_s
17192
+ end
17189
17193
  end
17190
17194
  end
17191
17195
 
@@ -17197,7 +17201,7 @@ shared_examples_for 'concurrent_create' do
17197
17201
  s = new_store
17198
17202
  1000.times do |i|
17199
17203
  s[i.to_s].should == name if s.create(i.to_s, name, :expires => false)
17200
- sleep 0.01 if i % 100 == 0
17204
+ Thread.pass if rand(100) >= 99
17201
17205
  end
17202
17206
  s.close
17203
17207
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moneta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.14
4
+ version: 0.7.15
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-08 00:00:00.000000000 Z
14
+ date: 2013-04-04 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description: A unified interface to key/value stores
17
17
  email:
@@ -29,6 +29,7 @@ files:
29
29
  - .travis.yml
30
30
  - .yardopts
31
31
  - CHANGES
32
+ - CONTRIBUTORS
32
33
  - Gemfile
33
34
  - LICENSE
34
35
  - README.md