redi2casa 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8864b86636142369894dab69c3571dfc3f6db506
4
- data.tar.gz: 5ca0cde38d25a3bf655f14fc5d006ee9ff6dfaf1
3
+ metadata.gz: 02835343d420037160bf3308faa4fb3bcd6b5b2b
4
+ data.tar.gz: b3a5cbe64a8c618a6a73c63e29ceff6556f1f946
5
5
  SHA512:
6
- metadata.gz: 98ea0ef507af4a811aa637e6a22d19a4c5bb100ffe297af047607ef3c82f9fcf012ad435370fa5eead72b38ccbe2d7d465b445432f4b2e2b8afbb1b63dd55a46
7
- data.tar.gz: ae9644a1799261a15229ec5fd9c7851c6eeb779e9f7caacb77d4a88005d7d34f849d10a966e92e24e6a0ed6e93147c9cc82892b4b9b9859384ce7f54749a7fab
6
+ metadata.gz: 07fb0ee657a3775de3c25ab8c923b9d16fe5ea80e0686e45b1c960cfeead6e0bbdbf41c69b7b685059e1f962d6bfdb9321cbfe632bea9ccaa117113692763a79
7
+ data.tar.gz: f18b64faf51f072b439bf330796054f653a1da30b6491b74ffa36b47cb4199845bf110da3c165988b1a0cd275226bab39af03dbd6e0dcef343a3def01fa24661
data/Gemfile.lock CHANGED
@@ -1,20 +1,29 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- redi2casa (0.0.4)
4
+ redi2casa (0.1.1)
5
5
  cql-rb
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- cql-rb (1.1.1)
10
+ cql-rb (1.1.2)
11
+ diff-lcs (1.2.5)
11
12
  rake (10.1.0)
13
+ rspec (2.14.1)
14
+ rspec-core (~> 2.14.0)
15
+ rspec-expectations (~> 2.14.0)
16
+ rspec-mocks (~> 2.14.0)
17
+ rspec-core (2.14.7)
18
+ rspec-expectations (2.14.4)
19
+ diff-lcs (>= 1.1.3, < 2.0)
20
+ rspec-mocks (2.14.4)
12
21
 
13
22
  PLATFORMS
14
23
  ruby
15
24
 
16
25
  DEPENDENCIES
17
26
  bundler
18
- cql-rb
19
27
  rake
20
28
  redi2casa!
29
+ rspec
data/lib/.DS_Store ADDED
Binary file
data/lib/redi2casa/del.rb CHANGED
@@ -4,15 +4,15 @@ class Redi2casa
4
4
  if type == "counter"
5
5
  raise RuntimeError.new("deleting counters is not supported")
6
6
  elsif type == 'keyvalue'
7
- @db_conn.execute("delete from keyvalue where key = '#{key}'")
7
+ execute "delete from keyvalue where key = '#{key}'"
8
8
  elsif type == 'hash'
9
- @db_conn.execute("delete from hashes where key = '#{key}'")
9
+ execute "delete from hashes where key = '#{key}'"
10
10
  elsif type == 'list'
11
- @db_conn.execute("delete from lists where key = '#{key}'")
11
+ execute "delete from lists where namespace = '#{key}'"
12
12
  elsif type == 'set'
13
- @db_conn.execute("delete from sets where key = '#{key}'")
13
+ execute "delete from sets where key = '#{key}'"
14
14
  elsif type == 'sorted_set'
15
- @db_conn.execute("delete from sorted_sets where key = '#{key}'")
15
+ execute "delete from sorted_sets where key = '#{key}'"
16
16
  end
17
17
  end
18
18
  end
data/lib/redi2casa/get.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  class Redi2casa
2
2
  def get key, type = 'keyvalue'
3
3
  if type == 'keyvalue'
4
- resp = @db_conn.execute("select * from keyvalue where key = '#{key}'")
4
+ resp = execute "select * from keyvalue where key = '#{key}'"
5
5
  parse_response(resp, "value")
6
6
  elsif type == 'counter'
7
7
  # @ is a special column in counter used by incrby
8
- resp = @db_conn.execute("select value from counters where KEY='#{key}' and column1 = '@'")
8
+ resp = execute "select value from counters where KEY='#{key}' and column1 = '@'"
9
9
  parse_response(resp, "value").to_i
10
10
  end
11
11
  end
@@ -1,9 +1,9 @@
1
1
  class Redi2casa
2
2
  def hdel key, column1, type = "counter"
3
3
  if type == "counter"
4
- @db_conn.execute("delete from counters where key = '#{key}' and column1 = '#{column1}'")
4
+ raise RuntimeError.new("deleting counters is not supported")
5
5
  elsif type == "hash"
6
- @db_conn.execute("delete from hashes where key = '#{key}' and column1 = '#{column1}'")
6
+ execute "delete from hashes where key = '#{key}' and column1 = '#{column1}'"
7
7
  end
8
8
  end
9
9
  end
@@ -1,10 +1,10 @@
1
1
  class Redi2casa
2
2
  def hget key, column1, type = "counter"
3
3
  if type.to_s == "hash"
4
- resp = @db_conn.execute("select value from hashes where key = '#{key}' and column1 = '#{column1}'")
4
+ resp = execute "select value from hashes where key = '#{key}' and column1 = '#{column1}'"
5
5
  parse_response(resp, "value")
6
6
  elsif type.to_s == "counter"
7
- resp = @db_conn.execute("select value from counters where KEY='#{key}' and column1 = '#{column1}'")
7
+ resp = execute "select value from counters where KEY='#{key}' and column1 = '#{column1}'"
8
8
  parse_response(resp, "value").to_i
9
9
  end
10
10
  end
@@ -1,10 +1,10 @@
1
1
  class Redi2casa
2
2
  def hgetall key, type = "counter"
3
3
  if type.to_s == "counter"
4
- response = @db_conn.execute("select * from counters where KEY='#{key}'")
4
+ response = execute "select * from counters where KEY='#{key}'"
5
5
  response.inject({}) {|hsh, entry| hsh[entry["column1"]] = entry["value"]; hsh}
6
6
  elsif type.to_s == "hash"
7
- response = @db_conn.execute("select * from hashes where key = '#{key}'")
7
+ response = execute "select * from hashes where key = '#{key}'"
8
8
  response.inject({}) {|hsh, entry| hsh[entry["column1"]] = entry["value"]; hsh}
9
9
  end
10
10
  end
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def hincrby key, column1, value = 1
3
- @db_conn.execute("update counters set value = value + #{value} where key='#{key}' and column1 = '#{column1}'")
3
+ execute "update counters set value = value + #{value} where key='#{key}' and column1 = '#{column1}'"
4
4
  end
5
5
  end
@@ -1,10 +1,10 @@
1
1
  class Redi2casa
2
2
  def hkeys key, type = "counter"
3
3
  if type.to_s == "counter"
4
- response = @db_conn.execute("select column1 from counters where key = '#{key}'")
4
+ response = execute "select column1 from counters where key = '#{key}'"
5
5
  response.collect {|entry| entry["column1"]}
6
6
  elsif type.to_s == "hash"
7
- response = @db_conn.execute("select column1 from hashes where key = '#{key}'")
7
+ response = execute "select column1 from hashes where key = '#{key}'"
8
8
  response.collect {|entry| entry["column1"]}
9
9
  end
10
10
  end
@@ -2,10 +2,10 @@ class Redi2casa
2
2
  # Supports only hashes now
3
3
  def hlen key, type = "hash"
4
4
  if type == "hash"
5
- response = @db_conn.execute("select count(*) from hashes where key = '#{key}'")
5
+ response = execute "select count(*) from hashes where key = '#{key}'"
6
6
  parse_response(response, "count").to_i
7
7
  elsif type == "counter"
8
- response = @db_conn.execute("select count(*) from counters where key = '#{key}'")
8
+ response = execute "select count(*) from counters where key = '#{key}'"
9
9
  parse_response(response, "count").to_i
10
10
  end
11
11
  end
@@ -8,7 +8,7 @@ class Redi2casa
8
8
  raise RuntimeError.new("invalid table")
9
9
  end
10
10
 
11
- resp = @db_conn.execute("select column1, value from #{table} where key = '#{key}' and column1 IN ('#{column1s.join("','")}')")
11
+ resp = execute "select column1, value from #{table} where key = '#{key}' and column1 IN ('#{column1s.join("','")}')"
12
12
  hash = {}
13
13
  resp.each do |r|
14
14
  hash[r["column1"]] = r["value"]
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def hset key, column1, value
3
- @db_conn.execute("UPDATE hashes SET value = '#{value}' WHERE column1 = '#{column1}' and key = '#{key}'")
3
+ execute "UPDATE hashes SET value = '#{value}' WHERE column1 = '#{column1}' and key = '#{key}'"
4
4
  end
5
5
  end
@@ -0,0 +1,5 @@
1
+ class Redi2casa
2
+ def keys pattern, type
3
+
4
+ end
5
+ end
@@ -1,9 +1,9 @@
1
1
  class Redi2casa
2
2
  #has a read modify write problem
3
3
  def lpop namespace
4
- resp = @db_conn.execute("select values from lists where namespace='#{namespace}'")
4
+ resp = execute "select values from lists where namespace='#{namespace}'"
5
5
  values = []
6
- resp.fetch {|entry| values = entry.to_hash["values"]}
6
+ resp.each {|entry| values = entry.to_hash["values"]}
7
7
  resp = values.shift
8
8
  lrepush(namespace, values)
9
9
  resp
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def lpush namespace, data
3
- @db_conn.execute("UPDATE lists SET values = ['#{data}'] + values WHERE namespace = '#{namespace}'")
3
+ execute "UPDATE lists SET values = ['#{data}'] + values WHERE namespace = '#{namespace}'"
4
4
  end
5
5
  end
@@ -1,6 +1,9 @@
1
1
  class Redi2casa
2
2
  def lrange namespace, first, last
3
- resp = @db_conn.execute("select values from lists where namespace='#{namespace}'")
4
- resp.fetch {|entry| return entry.to_hash["values"][first..last]}
3
+ resp = execute "select values from lists where namespace='#{namespace}'"
4
+ resp.each {|entry|
5
+ values = entry.to_hash["values"] || []
6
+ return values[first..last]
7
+ }
5
8
  end
6
9
  end
@@ -1,8 +1,8 @@
1
1
  class Redi2casa
2
2
  def ltrim namespace, first, last
3
- resp = @db_conn.execute("select values from lists where namespace='#{namespace}'")
3
+ resp = execute "select values from lists where namespace='#{namespace}'"
4
4
  values = {}
5
- resp.fetch {|entry| values = entry.to_hash["values"]}
5
+ resp.each {|entry| values = entry.to_hash["values"]}
6
6
  values_count = values.count
7
7
  #if first is greater than list length, redis returns empty list
8
8
  #if negative value of last is equal or greater than list length a similar behaviour is shown
@@ -17,10 +17,11 @@ class Redi2casa
17
17
  end
18
18
 
19
19
  def lflush namespace
20
- @db_conn.execute("UPDATE lists SET values = [] WHERE namespace = '#{namespace}'")
20
+ execute "UPDATE lists SET values = [] WHERE namespace = '#{namespace}'"
21
21
  end
22
22
 
23
+ private
23
24
  def lrepush namespace, list
24
- @db_conn.execute("UPDATE lists SET values = [?] WHERE namespace = '#{namespace}'", list)
25
+ execute "UPDATE lists SET values = ['#{list.join("','")}'] WHERE namespace = '#{namespace}'"
25
26
  end
26
27
  end
@@ -1,6 +1,6 @@
1
1
  class Redi2casa
2
2
  def rpop namespace
3
- resp = @db_conn.execute("select values from lists where namespace='#{namespace}'")
3
+ resp = execute "select values from lists where namespace='#{namespace}'"
4
4
  values = []
5
5
  resp.fetch {|entry| values = entry.to_hash["values"]}
6
6
  resp = values.pop
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def rpush namespace, data
3
- @db_conn.execute("UPDATE lists SET values = values + ['#{data}'] WHERE namespace = '#{namespace}'")
3
+ execute "UPDATE lists SET values = values + ['#{data}'] WHERE namespace = '#{namespace}'"
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def sadd key, *members
3
- @db_conn.execute("update sets set members = members + {'#{members.join("','")}'} where key = '#{key}'")
3
+ execute "update sets set members = members + {'#{members.join("','")}'} where key = '#{key}'"
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def sadd_with_expire( key, ttl, *members)
3
- @db_conn.execute("update sets using ttl #{ttl} set members = members + {'#{members.join("','")}'} where key = '#{key}'")
3
+ execute "update sets using ttl #{ttl} set members = members + {'#{members.join("','")}'} where key = '#{key}'"
4
4
  end
5
5
  end
data/lib/redi2casa/set.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def set key, value
3
- @db_conn.execute("UPDATE keyvalue set value = '#{value}' where key = '#{key}'")
3
+ execute "UPDATE keyvalue set value = '#{value}' where key = '#{key}'"
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def setex key, ttl, value
3
- @db_conn.execute("UPDATE keyvalue using TTL #{ttl} set value = '#{value}' where key = '#{key}'")
3
+ execute "UPDATE keyvalue using TTL #{ttl} set value = '#{value}' where key = '#{key}'"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  class Redi2casa
2
2
  def smembers key
3
- resp = @db_conn.execute("select * from sets where key = '#{key}'")
3
+ resp = execute "select * from sets where key = '#{key}'"
4
4
  if resp.first
5
5
  resp.first["members"].to_a
6
6
  else
@@ -1,5 +1,5 @@
1
1
  class Redi2casa
2
2
  def srem key, member
3
- @db_conn.execute("update sets set members = members - {'#{member}'} where key = '#{key}'")
3
+ execute "update sets set members = members - {'#{member}'} where key = '#{key}'"
4
4
  end
5
5
  end
@@ -1,3 +1,3 @@
1
1
  class Redi2casa
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  class Redi2casa
2
2
  # Random text is an extra column added to make sure we have multiple entries with same key, score and value
3
3
  def zadd key, score, value
4
- @db_conn.execute("insert into sorted_sets (key, score,value, random_text) values ('#{key}',#{score}, '#{value}', '#{Time.now.to_i}')")
4
+ execute "insert into sorted_sets (key, score,value, random_text) values ('#{key}',#{score}, '#{value}', '#{Time.now.to_i}')"
5
5
  end
6
6
  end
@@ -1,9 +1,10 @@
1
1
  class Redi2casa
2
+ # Ranges are exclusive
2
3
  def zrangebyscore key, lower_limit, higher_limit = -1
3
4
  if higher_limit == -1
4
- resp = @db_conn.execute("select value from sorted_sets where key = '#{key}' and score > #{lower_limit}")
5
+ resp = execute "select value from sorted_sets where key = '#{key}' and score > #{lower_limit}"
5
6
  else
6
- resp = @db_conn.execute("select value from sorted_sets where key = '#{key}' and score > #{lower_limit} and score < #{higher_limit}")
7
+ resp = execute "select value from sorted_sets where key = '#{key}' and score > #{lower_limit} and score < #{higher_limit}"
7
8
  end
8
9
  resp.collect do |entry|
9
10
  entry['value']
@@ -1,8 +1,8 @@
1
1
  class Redi2casa
2
2
  def zrem key, member
3
- resp = @db_conn.execute("select * from sorted_sets where key = '#{key}'")
3
+ resp = execute "select * from sorted_sets where key = '#{key}'"
4
4
  resp.each do |entry|
5
- @db_conn.execute("delete from sorted_sets where key = '#{key}' and score = #{entry['score']} and value = '#{entry['value']}'") if entry['value'] == member.to_s
5
+ execute "delete from sorted_sets where key = '#{key}' and score = #{entry['score']} and value = '#{entry['value']}'" if entry['value'] == member.to_s
6
6
  end
7
7
  end
8
8
  end
@@ -1,6 +1,6 @@
1
1
  class Redi2casa
2
2
  def zscore key, value
3
- resp = @db_conn.execute("select * from sorted_sets where key = '#{key}'")
3
+ resp = execute "select * from sorted_sets where key = '#{key}'"
4
4
  resp.each do |entry|
5
5
  return entry['score'] if entry['value'] == value.to_s
6
6
  end
data/lib/redi2casa.rb CHANGED
@@ -5,11 +5,31 @@ Gem.find_files("redi2casa/*.rb").each { |path| require path }
5
5
 
6
6
  class Redi2casa
7
7
  def initialize(hosts, keyspace)
8
- @db_conn = Cql::Client.connect(:hosts => hosts)
9
- @db_conn.use(keyspace)
8
+ @hosts = hosts
9
+ @keyspace = keyspace
10
+ connect
10
11
  end
11
12
 
13
+ def connect
14
+ @db_conn = Cql::Client.connect(:hosts => @hosts)
15
+ @db_conn.use(@keyspace)
16
+ end
17
+
18
+ alias :reconnect :connect
19
+
12
20
  def parse_response(resp, key)
13
21
  resp.map {|entry| entry[key].to_s }.first
14
22
  end
23
+
24
+ def execute query
25
+ @failed ||= 0
26
+ @db_conn.execute query
27
+ rescue Cql::NotConnectedError
28
+ reconnect
29
+ @failed += 1
30
+ retry if @failed < 3
31
+ raise
32
+ ensure
33
+ @failed = 0
34
+ end
15
35
  end
data/redi2casa.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_runtime_dependency "cql-rb"
22
22
 
23
- spec.add_development_dependency "cql-rb"
24
23
  spec.add_development_dependency "bundler"
25
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
26
  end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "bitwise" do
5
+ KEY = "test_bitwise"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del(KEY, "sorted_set")
9
+ end
10
+
11
+ def r
12
+ $r
13
+ end
14
+ it "set two bits to 1 and getbits" do
15
+ r.set_bit KEY, 5, 1
16
+ r.set_bit KEY, 10, 1
17
+ r.get_bit(KEY, 5).should == 1
18
+ r.get_bit(KEY, 10).should == 1
19
+ r.get_bit(KEY, 8).should == 0
20
+ end
21
+
22
+ it "set two bits to 1 and set it back to 0 and then getbits" do
23
+ r.set_bit KEY, 5, 1
24
+ r.set_bit KEY, 5, 0
25
+ r.get_bit(KEY, 5).should == 0
26
+ end
27
+
28
+ it "clear bits should clear all the set bits" do
29
+ r.set_bit KEY, 5, 1
30
+ r.set_bit KEY, 10, 1
31
+ r.clear_bits KEY
32
+ r.get_bit(KEY, 5).should == 0
33
+ r.get_bit(KEY, 10).should == 0
34
+ end
35
+
36
+ it "unset bits are by default 0" do
37
+ r.get_bit(KEY, 25).should == 0
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "counters" do
5
+ KEY = "test_counters"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ end
9
+
10
+ def r
11
+ $r
12
+ end
13
+
14
+ it "hincryby" do
15
+ a = r.hget(KEY, "c1", "counter")
16
+ r.hincrby(KEY, "c1", 1)
17
+ r.hget(KEY, "c1", "counter").should == a + 1
18
+ r.hincrby(KEY, "c1", 5)
19
+ r.hget(KEY, "c1", "counter").should == a + 6
20
+ end
21
+
22
+ it "hkeys" do
23
+ r.hincrby(KEY, "c1")
24
+ r.hincrby(KEY, "c2")
25
+ r.hkeys(KEY, "counter").include?("c1").should == true
26
+ r.hkeys(KEY, "counter").include?("c2").should == true
27
+ end
28
+
29
+ it "hlen" do
30
+ r.hincrby(KEY, "c1")
31
+ r.hincrby(KEY, "c2")
32
+ r.hlen(KEY, "counter").should >= 2
33
+ end
34
+
35
+ it "hget" do
36
+ a = r.hget(KEY, "c1", "counter")
37
+ r.hincrby(KEY, "c1", 5)
38
+ r.hget(KEY, "c1", "counter").should == a + 5
39
+ end
40
+
41
+ it "hmget" do
42
+ a = r.hget(KEY, "c1", "counter")
43
+ b = r.hget(KEY, "c2", "counter")
44
+ r.hmget(KEY, "counter", "c1", "c2").should == [ a, b]
45
+ end
46
+
47
+ it "hgetall" do
48
+ a = r.hget(KEY, "c1")
49
+ b = r.hget(KEY, "c2")
50
+ resp = r.hgetall(KEY, "counter")
51
+ resp["c1"].should == a
52
+ resp["c2"].should == b
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "hashes" do
5
+ KEY = "test_hash"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del KEY, "hash"
9
+ end
10
+ def r
11
+ $r
12
+ end
13
+
14
+ context "hdel & hget" do
15
+ it "should delete a entry already present" do
16
+ r.hset KEY, "a", "5"
17
+ r.hget(KEY, "a", "hash").should == "5"
18
+ r.hdel(KEY, "a", "hash")
19
+ r.hget(KEY, "a", "hash").should == nil
20
+ end
21
+
22
+ it "should ignore if the entry is not already present" do
23
+ r.hset(KEY, "b", "25")
24
+ r.hdel(KEY, "a", "hash")
25
+ r.hget(KEY, "b", "hash").should == "25"
26
+ r.hget(KEY, "a", "hash").should == nil
27
+ end
28
+ end
29
+
30
+ context "hget" do
31
+ it "should get item which is already set" do
32
+ r.hset KEY, "a", "5"
33
+ r.hget(KEY, "a", "hash").should == "5"
34
+ end
35
+
36
+ it "should return nil if the element dows not exist" do
37
+ r.hget(KEY, "a", "hash").should == nil
38
+ end
39
+ end
40
+
41
+ context "hgetall" do
42
+ it "get all elements as a hash" do
43
+ r.hset KEY, "a", "5"
44
+ r.hset KEY, "b", "10"
45
+ r.hset KEY, "c", "15"
46
+ r.hgetall(KEY, "hash").should == {"a" => "5", "b" => "10", "c" => "15"}
47
+ end
48
+
49
+ it "should return empty hash if it does not exist" do
50
+ r.hgetall(KEY, "hash").should == {}
51
+ end
52
+ end
53
+
54
+ context "hlen" do
55
+ it "returns number of elements in the hash" do
56
+ r.hset KEY, "a", "5"
57
+ r.hset KEY, "b", "10"
58
+ r.hset KEY, "c", "15"
59
+ r.hset KEY, "d", "15"
60
+ r.hlen(KEY).should == 4
61
+ end
62
+
63
+ it "returns 0 if hash does not exists" do
64
+ r.hlen(KEY).should == 0
65
+ end
66
+ end
67
+
68
+ context "hmget" do
69
+ it "returns multiple elements in a hash" do
70
+ r.hset KEY, "a", "5"
71
+ r.hset KEY, "b", "10"
72
+ r.hset KEY, "c", "15"
73
+ r.hset KEY, "d", "15"
74
+ r.hmget(KEY, "hash", "a", "b", "f").should == ["5", "10", nil]
75
+ end
76
+ end
77
+
78
+ context "hset" do
79
+ it "sets a value to hash" do
80
+ r.hset KEY, "z", "2000"
81
+ r.hget(KEY, "z", "hash").should == "2000"
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "keyvalue" do
5
+ KEY = "test_keyvalye"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del(KEY, "keyvalue")
9
+ end
10
+
11
+ def r
12
+ $r
13
+ end
14
+
15
+ it "get and set -- before setting element should be nil then the set value after set" do
16
+ r.get(KEY).should == nil
17
+ r.set(KEY, "z")
18
+ r.get(KEY).should == "z"
19
+ end
20
+
21
+ it "get and setex the set key should remain for ttl only" do
22
+ r.setex(KEY, 5, "z")
23
+ r.get(KEY).should == "z"
24
+ sleep 7
25
+ r.get(KEY).should == nil
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "lists" do
5
+ KEY = "test_list"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del(KEY, "list")
9
+ end
10
+
11
+ def r
12
+ $r
13
+ end
14
+
15
+ context "lpop" do
16
+ it "pop the first element out" do
17
+ r.lpush KEY, "a"
18
+ r.lpush KEY, "b"
19
+ r.lpush KEY, "f"
20
+ r.lpush KEY, "g"
21
+ r.lpop(KEY).should == "g"
22
+ end
23
+
24
+ it "return nil if the list is empty" do
25
+ r.lpop(KEY).should == nil
26
+ end
27
+ end
28
+
29
+ context "lpush & lrange" do
30
+ it "pushes to the start of the list" do
31
+ r.lpush KEY, "a"
32
+ r.lpush KEY, "b"
33
+ r.lpush KEY, "f"
34
+ r.lpush KEY, "g"
35
+ r.lrange(KEY, 0, -1).should == ["g", "f", "b", "a"]
36
+ r.lrange(KEY, 2, 3).should == ["b", "a"]
37
+ end
38
+ end
39
+
40
+ context "lrange" do
41
+ it "return empty list in case the list is empty" do
42
+ r.lrange(KEY, 0, -1).should == []
43
+ end
44
+ end
45
+
46
+ context "ltrim" do
47
+ it "trims the list to specified ranges" do
48
+ r.lpush KEY, "a"
49
+ r.lpush KEY, "b"
50
+ r.lpush KEY, "f"
51
+ r.lpush KEY, "g"
52
+ r.ltrim(KEY, 0, 2)
53
+ r.lrange(KEY, 0, -1) == ["g", "f", "b"]
54
+ r.ltrim(KEY, 1, 2)
55
+ r.lrange(KEY, 0, -1) == ["f", "b"]
56
+ end
57
+ end
58
+
59
+ context "lflush" do
60
+ it "empties the list" do
61
+ r.lpush KEY, "a"
62
+ r.lpush KEY, "b"
63
+ r.lpush KEY, "f"
64
+ r.lpush KEY, "g"
65
+ r.lflush KEY
66
+ r.lrange(KEY, 0, -1) == []
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,9 @@
1
+ require 'redi2casa'
2
+
3
+ require './spec/sets_spec.rb'
4
+ require './spec/hashs_spec.rb'
5
+ require './spec/lists_spec.rb'
6
+ require './spec/sorted-sets_spec.rb'
7
+ require './spec/keyvalue_spec.rb'
8
+ require './spec/bitwise_spec.rb'
9
+ require './spec/counters_spec.rb'
data/spec/sets_spec.rb ADDED
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "sets" do
5
+ KEY = "test_set"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del(KEY, "set")
9
+ end
10
+
11
+ def r
12
+ $r
13
+ end
14
+
15
+ context "sadd" do
16
+ it "should add first element" do
17
+ r.sadd KEY, "a"
18
+ r.smembers(KEY).include?("a").should == true
19
+ end
20
+
21
+ it "should add second element" do
22
+ r.sadd KEY, "a"
23
+ r.sadd KEY, "b"
24
+ r.smembers(KEY).include?("a").should == true
25
+ r.smembers(KEY).include?("b").should == true
26
+ end
27
+
28
+ it "already added element should not be added again" do
29
+ r.sadd KEY, "a"
30
+ r.sadd KEY, "a"
31
+ r.smembers(KEY).size.should == 1
32
+ end
33
+ end
34
+
35
+ context "sadd_with_expire" do
36
+ it "add a new element it should disapper after ttl" do
37
+ r.sadd_with_expire KEY, 5, "a"
38
+ r.smembers(KEY).size.should == 1
39
+ sleep 7
40
+ r.smembers(KEY).size.should == 0
41
+ end
42
+ end
43
+
44
+ context "scard" do
45
+ it "default size should be 0" do
46
+ r.scard(KEY).should == 0
47
+ end
48
+
49
+ it "add 5 unique elements and size should be five" do
50
+ r.sadd KEY, "a", "b", "c", "d", "e"
51
+ r.scard(KEY).should == 5
52
+ end
53
+ end
54
+
55
+ context "sismember" do
56
+ it "add a element and it should be there in the set" do
57
+ r.sadd KEY, "a", "b", "c", "d", "e"
58
+ r.sismember(KEY, "a").should == true
59
+ r.sismember(KEY, "d").should == true
60
+ end
61
+
62
+ it "random element should not be present in the set" do
63
+ r.sadd KEY, "a"
64
+ r.sismember(KEY, "b").should == false
65
+ end
66
+ end
67
+
68
+ context "smembers" do
69
+ it "add 5 members and this should be listed in smembers" do
70
+ r.sadd KEY, "a", "b", "c", "d", "e"
71
+ r.smembers(KEY).should == ["a", "b", "c", "d", "e"]
72
+ end
73
+
74
+ it "default should be empty set" do
75
+ r.smembers(KEY).should == []
76
+ end
77
+ end
78
+
79
+ context "spop" do
80
+ it "removes random element from set" do
81
+ r.sadd KEY, "a", "b", "c", "d", "e"
82
+ k = r.spop(KEY)
83
+ r.smembers(KEY).should == ["a", "b", "c", "d", "e"] - [ k ]
84
+ end
85
+
86
+ it "return nil incase set is empty" do
87
+ r.spop(KEY).should == nil
88
+ end
89
+ end
90
+
91
+ context "srem" do
92
+ it "deletes the element if present" do
93
+ r.sadd KEY, "a", "b", "c", "d", "e"
94
+ r.srem KEY, "b"
95
+ r.smembers(KEY).should == ["a", "c", "d", "e"]
96
+ end
97
+
98
+ it "ignores if element is not present" do
99
+ r.sadd KEY, "a", "b", "c", "d", "e"
100
+ r.srem KEY, "f"
101
+ r.smembers(KEY).should == ["a", "b", "c", "d", "e"]
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redi2casa do
4
+ context "sorted-sets" do
5
+ KEY = "test_sorted-set"
6
+ before(:each) do
7
+ $r ||= Redi2casa.new(["localhost"], "redi2casa")
8
+ $r.del(KEY, "sorted_set")
9
+ end
10
+
11
+ def r
12
+ $r
13
+ end
14
+
15
+ context "zadd" do
16
+ it "add one element with a score" do
17
+ r.zadd KEY, 5, "a"
18
+ r.zrangebyscore(KEY, 0).should == ["a"]
19
+ end
20
+
21
+ it "add already existing element with the same score" do
22
+ r.zadd KEY, 5, "a"
23
+ r.zadd KEY, 5, "a"
24
+ r.zrangebyscore(KEY, 0).should == ["a"]
25
+ end
26
+
27
+ it "add two elements with same score" do
28
+ r.zadd KEY, 5, "a"
29
+ r.zadd KEY, 5, "b"
30
+ r.zrangebyscore(KEY, 0).should == ["a", "b"]
31
+ end
32
+
33
+ it "add two elements with different score" do
34
+ r.zadd KEY, 5, "a"
35
+ r.zadd KEY, 6, "b"
36
+ r.zrangebyscore(KEY, 0).should == ["a", "b"]
37
+ end
38
+ end
39
+
40
+ context "zrangebyscore" do
41
+ it "list elements from 0 to -1 should give all elements with positive score" do
42
+ r.zadd KEY, 5, "a"
43
+ r.zadd KEY, 6, "b"
44
+ r.zadd KEY, 7, "c"
45
+ r.zadd KEY, 8, "d"
46
+ r.zrangebyscore(KEY, 0).should == ["a", "b", "c", "d"]
47
+ end
48
+
49
+ it "list elements with subset with specified range of scores" do
50
+ # Ranges are exclusive
51
+ r.zadd KEY, 5, "a"
52
+ r.zadd KEY, 6, "b"
53
+ r.zadd KEY, 7, "c"
54
+ r.zadd KEY, 8, "d"
55
+ r.zrangebyscore(KEY, 5, 8).should == ["b", "c"]
56
+ end
57
+ end
58
+
59
+ context "zrem" do
60
+ it "removed certain element from the zset and removing non existant member should be ignored" do
61
+ r.zadd KEY, 5, "a"
62
+ r.zadd KEY, 6, "b"
63
+ r.zadd KEY, 7, "c"
64
+ r.zadd KEY, 8, "d"
65
+ r.zrem KEY, "c"
66
+ r.zrem KEY, "z"
67
+ r.zrangebyscore(KEY, 0).should == ["a", "b", "d"]
68
+ end
69
+ end
70
+
71
+ context "zscore" do
72
+ it "returns score of certain element in the zset and for non existant member score should be nil" do
73
+ r.zadd KEY, 5, "a"
74
+ r.zadd KEY, 6, "b"
75
+ r.zadd KEY, 7, "c"
76
+ r.zadd KEY, 8, "d"
77
+ r.zscore(KEY, "c").should == 7
78
+ r.zscore(KEY, "z").should == nil
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1 @@
1
+ require './lib/redi2casa.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redi2casa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - vireshas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-17 00:00:00.000000000 Z
12
+ date: 2013-12-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cql-rb
@@ -26,7 +26,7 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: cql-rb
29
+ name: bundler
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - '>='
@@ -40,7 +40,7 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: bundler
43
+ name: rake
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
- name: rake
57
+ name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - '>='
@@ -84,6 +84,7 @@ files:
84
84
  - Rakefile
85
85
  - cassandra_cli_cmds
86
86
  - cqlsh_cmds
87
+ - lib/.DS_Store
87
88
  - lib/redi2casa.rb
88
89
  - lib/redi2casa/clear_bits.rb
89
90
  - lib/redi2casa/del.rb
@@ -98,6 +99,7 @@ files:
98
99
  - lib/redi2casa/hmget.rb
99
100
  - lib/redi2casa/hset.rb
100
101
  - lib/redi2casa/incrby.rb
102
+ - lib/redi2casa/keys.rb
101
103
  - lib/redi2casa/lpop.rb
102
104
  - lib/redi2casa/lpush.rb
103
105
  - lib/redi2casa/lrange.rb
@@ -120,6 +122,15 @@ files:
120
122
  - lib/redi2casa/zrem.rb
121
123
  - lib/redi2casa/zscore.rb
122
124
  - redi2casa.gemspec
125
+ - spec/bitwise_spec.rb
126
+ - spec/counters_spec.rb
127
+ - spec/hashs_spec.rb
128
+ - spec/keyvalue_spec.rb
129
+ - spec/lists_spec.rb
130
+ - spec/redis2casa_spec.rb
131
+ - spec/sets_spec.rb
132
+ - spec/sorted-sets_spec.rb
133
+ - spec/spec_helper.rb
123
134
  homepage: https://github.com/vireshas/redi2casa
124
135
  licenses:
125
136
  - MIT
@@ -145,4 +156,13 @@ signing_key:
145
156
  specification_version: 4
146
157
  summary: Moving redis calls to equivalent cassandra calls can be a pain unless you
147
158
  use this gem
148
- test_files: []
159
+ test_files:
160
+ - spec/bitwise_spec.rb
161
+ - spec/counters_spec.rb
162
+ - spec/hashs_spec.rb
163
+ - spec/keyvalue_spec.rb
164
+ - spec/lists_spec.rb
165
+ - spec/redis2casa_spec.rb
166
+ - spec/sets_spec.rb
167
+ - spec/sorted-sets_spec.rb
168
+ - spec/spec_helper.rb