strc 0.0.1 → 0.0.2
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.rdoc +46 -22
- data/VERSION +1 -1
- data/lib/strc.rb +123 -29
- data/strc.gemspec +5 -1
- data/test/test_basic_functions.rb +119 -0
- data/test/test_sets.rb +173 -0
- data/test/test_strc.rb +0 -117
- metadata +14 -10
data/README.rdoc
CHANGED
@@ -8,38 +8,62 @@ One thing STRC does kind of have going for it is that it's much more lazy in reg
|
|
8
8
|
|
9
9
|
STRC is distributed as a gem. To install:
|
10
10
|
|
11
|
-
|
11
|
+
% gem install strc
|
12
12
|
|
13
13
|
Now you've got it all up in your computer. To use:
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
require 'rubygems'
|
16
|
+
require 'strc'
|
17
17
|
|
18
|
-
|
18
|
+
strc = STRC.new
|
19
19
|
|
20
20
|
Now you could start passing it commands, if they've been implemented.
|
21
21
|
|
22
22
|
=== Getting and Setting!
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
>> strc.set "foo", "bar"
|
24
|
+
=> "OK"
|
25
|
+
>> strc.get "foo"
|
26
|
+
=> "bar"
|
27
27
|
|
28
28
|
=== Sets!
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
29
|
+
>> strc.sadd "stuff", "abc"
|
30
|
+
=> 1
|
31
|
+
>> strc.sadd "stuff", "123", "blah"
|
32
|
+
=> 2
|
33
|
+
>> strc.scard "stuff"
|
34
|
+
=> 3
|
35
|
+
>> strc.sismember "stuff", "abc"
|
36
|
+
=> true
|
37
|
+
>> strc.sismember "stuff", "xyz"
|
38
|
+
=> false
|
39
|
+
>> strc.srem "stuff", "blah"
|
40
|
+
=> true
|
41
|
+
>> strc.smembers "stuff"
|
42
|
+
=> ["abc", "123"]
|
43
|
+
|
44
|
+
== Command List
|
45
|
+
Currently, the following commands are implemented:
|
46
|
+
* get
|
47
|
+
* set
|
48
|
+
* del
|
49
|
+
* exists
|
50
|
+
* rename
|
51
|
+
* renamenx
|
52
|
+
* sadd
|
53
|
+
* srem
|
54
|
+
* sismember
|
55
|
+
* smembers
|
56
|
+
* scard
|
57
|
+
* sinter
|
58
|
+
* sinterstore
|
59
|
+
* sdiff
|
60
|
+
* sdiffstore
|
61
|
+
* sunion
|
62
|
+
* sunionstore
|
63
|
+
* smove
|
64
|
+
* srandmember
|
65
|
+
* spop
|
43
66
|
|
44
67
|
== History
|
68
|
+
* 0.0.2 - Set commands done. Most general commands done.
|
45
69
|
* 0.0.1 - Initial release. Does some basic things.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/strc.rb
CHANGED
@@ -16,20 +16,53 @@ class STRC
|
|
16
16
|
@dict[key]
|
17
17
|
end
|
18
18
|
|
19
|
+
# Delete a key
|
20
|
+
def del(*keys)
|
21
|
+
keys.each do |key|
|
22
|
+
@dict.delete(key)
|
23
|
+
end
|
24
|
+
return keys.length
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns if key exists
|
28
|
+
def exists(key)
|
29
|
+
@dict.has_key?(key)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns a random key
|
33
|
+
def randomkey
|
34
|
+
@dict.keys.sample
|
35
|
+
end
|
36
|
+
|
37
|
+
# Renames a key. Overwrites destination.
|
38
|
+
def rename(key, newkey)
|
39
|
+
if key == newkey
|
40
|
+
raise STRC::Exception.new "ERR Source and destination objects are the same"
|
41
|
+
end
|
42
|
+
@dict[newkey] = @dict[key]
|
43
|
+
del(key)
|
44
|
+
return "OK"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Renames a key. Does not overwrite destination.
|
48
|
+
def renamenx(key, newkey)
|
49
|
+
if exists(newkey)
|
50
|
+
return false
|
51
|
+
else
|
52
|
+
rename(key, newkey)
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Set functions!
|
58
|
+
|
19
59
|
# Add a member to a set
|
20
60
|
def sadd(key, *args)
|
21
61
|
if args.length < 1
|
22
62
|
raise STRC::Exception.new "Wrong number of arguments (1 for 2)"
|
23
63
|
end
|
24
|
-
|
25
|
-
|
26
|
-
@dict[key] << args
|
27
|
-
else
|
28
|
-
raise STRC::Exception.new "ERR Operation against a key holding the wrong kind of value"
|
29
|
-
end
|
30
|
-
else
|
31
|
-
@dict[key] = args
|
32
|
-
end
|
64
|
+
set = smembers(key)
|
65
|
+
@dict[key] = set + args
|
33
66
|
return args.length
|
34
67
|
end
|
35
68
|
|
@@ -43,23 +76,91 @@ class STRC
|
|
43
76
|
end
|
44
77
|
end
|
45
78
|
|
79
|
+
# Returns a list of m
|
80
|
+
def sinter(*keys)
|
81
|
+
sets = []
|
82
|
+
keys.each do |key|
|
83
|
+
sets << smembers(key)
|
84
|
+
end
|
85
|
+
inter = sets.shift
|
86
|
+
sets.each do |set|
|
87
|
+
inter &= set
|
88
|
+
end
|
89
|
+
return inter
|
90
|
+
end
|
91
|
+
|
92
|
+
# Similar to SINTER, but stores in destination instead of returning
|
93
|
+
def sinterstore(destination, *keys)
|
94
|
+
elements = sinter(*keys)
|
95
|
+
sadd(destination, *elements)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Returns a list of the difference between the first set
|
99
|
+
# and subsequent sets
|
100
|
+
def sdiff(*keys)
|
101
|
+
sets = []
|
102
|
+
keys.each do |key|
|
103
|
+
sets << smembers(key)
|
104
|
+
end
|
105
|
+
diff = sets.shift
|
106
|
+
sets.each do |set|
|
107
|
+
diff -= set
|
108
|
+
end
|
109
|
+
return diff
|
110
|
+
end
|
111
|
+
|
112
|
+
# Similar to SDIFF, but stores in destination instead of returning
|
113
|
+
def sdiffstore(destination, *keys)
|
114
|
+
elements = sdiff(*keys)
|
115
|
+
sadd(destination, *elements)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Move an item from one set to another
|
119
|
+
def smove(source, destination, member)
|
120
|
+
if !sismember(source, member)
|
121
|
+
return false
|
122
|
+
end
|
123
|
+
srem(source, member)
|
124
|
+
unless sismember(destination, member)
|
125
|
+
sadd(destination, member)
|
126
|
+
end
|
127
|
+
return true
|
128
|
+
end
|
129
|
+
|
130
|
+
# Returs a list of all unique items in the given sets
|
131
|
+
def sunion(*keys)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Similar to SUNION, but stores in destination instead of returning
|
135
|
+
def sunionstore(destination, *keys)
|
136
|
+
elements = sunion(*keys)
|
137
|
+
sadd(destination, *elements)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Returns a random element from the set
|
141
|
+
def srandmember(key)
|
142
|
+
smembers(key).sample
|
143
|
+
end
|
144
|
+
|
145
|
+
# Randomly remove and return an item from the set
|
146
|
+
def spop(key)
|
147
|
+
element = srandmember(key)
|
148
|
+
srem(key, element)
|
149
|
+
return element
|
150
|
+
end
|
151
|
+
|
46
152
|
# Determine if the given value is a member of the set at key
|
47
153
|
def sismember(key, member)
|
48
|
-
|
49
|
-
|
50
|
-
return true unless @dict[key].index(member).nil?
|
51
|
-
else
|
52
|
-
raise STRC::Exception .new "ERR Operation against a key holding the wrong kind of value"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
return false
|
154
|
+
set = smembers(key)
|
155
|
+
return !set.index(member).nil?
|
56
156
|
end
|
57
157
|
|
58
158
|
# Returns an array of members of the set
|
59
159
|
def smembers(key)
|
60
|
-
if
|
61
|
-
|
62
|
-
|
160
|
+
if exists(key)
|
161
|
+
value = get(key)
|
162
|
+
if value.class == Array
|
163
|
+
return value
|
63
164
|
else
|
64
165
|
raise STRC::Exception .new "ERR Operation against a key holding the wrong kind of value"
|
65
166
|
end
|
@@ -70,14 +171,7 @@ class STRC
|
|
70
171
|
|
71
172
|
# Gets the length of a set
|
72
173
|
def scard(key)
|
73
|
-
|
74
|
-
|
75
|
-
@dict[key].length
|
76
|
-
else
|
77
|
-
raise STRC::Exception.new "ERR Operation against a key holding the wrong kind of value"
|
78
|
-
end
|
79
|
-
else
|
80
|
-
return 0
|
81
|
-
end
|
174
|
+
set = smembers(key)
|
175
|
+
return set.length
|
82
176
|
end
|
83
177
|
end
|
data/strc.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{strc}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Chris O'Neal"]
|
@@ -27,6 +27,8 @@ Gem::Specification.new do |s|
|
|
27
27
|
"lib/strc.rb",
|
28
28
|
"strc.gemspec",
|
29
29
|
"test/helper.rb",
|
30
|
+
"test/test_basic_functions.rb",
|
31
|
+
"test/test_sets.rb",
|
30
32
|
"test/test_strc.rb"
|
31
33
|
]
|
32
34
|
s.homepage = %q{http://github.com/ctoneal/strc}
|
@@ -36,6 +38,8 @@ Gem::Specification.new do |s|
|
|
36
38
|
s.summary = %q{Super Terrible Redis Clone}
|
37
39
|
s.test_files = [
|
38
40
|
"test/helper.rb",
|
41
|
+
"test/test_basic_functions.rb",
|
42
|
+
"test/test_sets.rb",
|
39
43
|
"test/test_strc.rb"
|
40
44
|
]
|
41
45
|
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestBasicFunctions < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@test = STRC.new
|
6
|
+
end
|
7
|
+
|
8
|
+
context "set" do
|
9
|
+
should "be able to set the value of a new key" do
|
10
|
+
result = @test.set("test_key", 20)
|
11
|
+
assert_equal("OK", result)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be able to set the value of an existing key" do
|
15
|
+
@test.set("test_key", 20)
|
16
|
+
result = @test.set("test_key", 30)
|
17
|
+
assert_equal("OK", result)
|
18
|
+
end
|
19
|
+
|
20
|
+
should "be able to set different types as values" do
|
21
|
+
result = @test.set("test_key", "poop")
|
22
|
+
assert_equal("OK", result)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "be able to set different types as keys" do
|
26
|
+
result = @test.set(15, "abcde")
|
27
|
+
assert_equal("OK", result)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "get" do
|
32
|
+
should "be able to get the value of a key" do
|
33
|
+
@test.set("test_key", 15)
|
34
|
+
result = @test.get("test_key")
|
35
|
+
assert_equal(15, result)
|
36
|
+
end
|
37
|
+
|
38
|
+
should "return nil for nonexistant keys" do
|
39
|
+
result = @test.get("blah")
|
40
|
+
assert_nil(result)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "exists" do
|
45
|
+
should "return true if the key exists" do
|
46
|
+
@test.set("test", 1)
|
47
|
+
assert(@test.exists("test"))
|
48
|
+
end
|
49
|
+
|
50
|
+
should "return false if the key doesn't exist" do
|
51
|
+
assert(!@test.exists("test"))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "del" do
|
56
|
+
should "delete a key" do
|
57
|
+
@test.set("test", 1)
|
58
|
+
deleted = @test.del("test")
|
59
|
+
assert_equal(1, deleted)
|
60
|
+
assert(!@test.exists("test"))
|
61
|
+
end
|
62
|
+
|
63
|
+
should "delete multiple keys" do
|
64
|
+
@test.set("test", 1)
|
65
|
+
@test.set("poop", 2)
|
66
|
+
@test.set("blah", 4)
|
67
|
+
deleted = @test.del("test", "poop")
|
68
|
+
assert_equal(2, deleted)
|
69
|
+
assert(!@test.exists("test"))
|
70
|
+
assert(!@test.exists("poop"))
|
71
|
+
assert(@test.exists("blah"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "randomkey" do
|
76
|
+
should "return a random key from the database" do
|
77
|
+
keys = ["test", "poop", "blah"]
|
78
|
+
keys.each do |key|
|
79
|
+
@test.set(key, 1)
|
80
|
+
end
|
81
|
+
random = @test.randomkey
|
82
|
+
assert_not_nil(keys.index(random))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "rename" do
|
87
|
+
should "rename a key" do
|
88
|
+
@test.set("poop", 1)
|
89
|
+
@test.rename("poop", "abc")
|
90
|
+
value = @test.get("abc")
|
91
|
+
assert_equal(1, value)
|
92
|
+
end
|
93
|
+
|
94
|
+
should "overwrite existing keys" do
|
95
|
+
@test.set("poop", 1)
|
96
|
+
@test.set("abc", 2)
|
97
|
+
@test.rename("poop", "abc")
|
98
|
+
value = @test.get("abc")
|
99
|
+
assert_equal(1, value)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "renamenx" do
|
104
|
+
should "rename a key" do
|
105
|
+
@test.set("poop", 1)
|
106
|
+
@test.renamenx("poop", "abc")
|
107
|
+
value = @test.get("abc")
|
108
|
+
assert_equal(1, value)
|
109
|
+
end
|
110
|
+
|
111
|
+
should "not overwrite existing keys" do
|
112
|
+
@test.set("poop", 1)
|
113
|
+
@test.set("abc", 2)
|
114
|
+
@test.renamenx("poop", "abc")
|
115
|
+
value = @test.get("abc")
|
116
|
+
assert_equal(2, value)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/test/test_sets.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSets < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@test = STRC.new
|
6
|
+
end
|
7
|
+
context "sadd" do
|
8
|
+
should "create a new set" do
|
9
|
+
result = @test.sadd("test_key", "poop")
|
10
|
+
assert_equal(1, result)
|
11
|
+
end
|
12
|
+
|
13
|
+
should "be able to add multiple items" do
|
14
|
+
result = @test.sadd("test_key", "poop", "abc")
|
15
|
+
assert_equal(2, result)
|
16
|
+
end
|
17
|
+
|
18
|
+
should "be able to add to an existing set" do
|
19
|
+
@test.sadd("test_key", "poop")
|
20
|
+
result = @test.sadd("test_key", "blah")
|
21
|
+
assert_equal(1, result)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "not be able to add to something not a set" do
|
25
|
+
@test.set("test_key", "blah")
|
26
|
+
assert_raise(STRC::Exception) { @test.sadd("test_key", "poop") }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "sismember" do
|
31
|
+
should "return true if the set contains the object" do
|
32
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
33
|
+
result = @test.sismember("test_key", "poop")
|
34
|
+
assert(result)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "return false if the set does not contain the object" do
|
38
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
39
|
+
result = @test.sismember("test_key", "xyz")
|
40
|
+
assert(!result)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "scard" do
|
45
|
+
should "return the number of items in the set" do
|
46
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
47
|
+
result = @test.scard("test_key")
|
48
|
+
assert_equal(3, result)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "return 0 for nonexistant keys" do
|
52
|
+
result = @test.scard("blahblahblah")
|
53
|
+
assert_equal(0, result)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "srem" do
|
58
|
+
should "remove an item from the set" do
|
59
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
60
|
+
result = @test.srem("test_key", "poop")
|
61
|
+
assert(result)
|
62
|
+
assert_equal(2, @test.scard("test_key"))
|
63
|
+
end
|
64
|
+
|
65
|
+
should "not remove if the member isn't in the set" do
|
66
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
67
|
+
result = @test.srem("test_key", "xyz")
|
68
|
+
assert(!result)
|
69
|
+
assert_equal(3, @test.scard("test_key"))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "smembers" do
|
74
|
+
should "return an array of items" do
|
75
|
+
@test.sadd("test_key", "poop", "blah", "abc")
|
76
|
+
result = @test.smembers("test_key")
|
77
|
+
assert_equal(["poop", "blah", "abc"], result)
|
78
|
+
end
|
79
|
+
|
80
|
+
should "return an empty array for nonexistant keys" do
|
81
|
+
result = @test.smembers("aaaaaa")
|
82
|
+
assert_equal([], result)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "sinter" do
|
87
|
+
should "return the intersection of two sets" do
|
88
|
+
@test.sadd("set1", "poop", "abc", "xyz")
|
89
|
+
@test.sadd("set2", "123", "456", "poop", "xyz")
|
90
|
+
result = @test.sinter("set1", "set2")
|
91
|
+
assert_equal(["poop", "xyz"], result)
|
92
|
+
end
|
93
|
+
|
94
|
+
should "be the same as smembers if passed one set" do
|
95
|
+
@test.sadd("set1", "poop", "abc", "xyz")
|
96
|
+
result = @test.sinter("set1")
|
97
|
+
assert_equal(["poop", "abc", "xyz"], result)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "sinterstore" do
|
102
|
+
should "work like sinter, but store in destination" do
|
103
|
+
@test.sadd("set1", "poop", "abc", "xyz")
|
104
|
+
@test.sadd("set2", "123", "456", "poop", "xyz")
|
105
|
+
@test.sinterstore("new", "set1", "set2")
|
106
|
+
result = @test.smembers("new")
|
107
|
+
assert_equal(["poop", "xyz"], result)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "sdiff" do
|
112
|
+
should "return items that are only in the first set" do
|
113
|
+
@test.sadd("set1", "a", "b", "c", "d")
|
114
|
+
@test.sadd("set2", "c")
|
115
|
+
@test.sadd("set3", "a", "c", "e")
|
116
|
+
result = @test.sdiff("set1", "set2", "set3")
|
117
|
+
assert_equal(["b", "d"], result)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "sdiffstore" do
|
122
|
+
should "work like sdiff, but store in destination" do
|
123
|
+
@test.sadd("set1", "a", "b", "c", "d")
|
124
|
+
@test.sadd("set2", "c")
|
125
|
+
@test.sadd("set3", "a", "c", "e")
|
126
|
+
@test.sdiffstore("new", "set1", "set2", "set3")
|
127
|
+
result = @test.smembers("new")
|
128
|
+
assert_equal(["b", "d"], result)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "smove" do
|
133
|
+
should "move an item from one set to another" do
|
134
|
+
@test.sadd("set1", "one" ,"two")
|
135
|
+
@test.sadd("set2", "three")
|
136
|
+
result = @test.smove("set1", "set2", "two")
|
137
|
+
assert(result)
|
138
|
+
members = @test.smembers("set1")
|
139
|
+
assert_equal(["one"], members)
|
140
|
+
members = @test.smembers("set2")
|
141
|
+
assert_equal(["three", "two"], members)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "srandmember" do
|
146
|
+
should "return a random member of a set" do
|
147
|
+
@test.sadd("set1", "a", "b", "c", "d")
|
148
|
+
result = @test.sismember("set1", @test.srandmember("set1"))
|
149
|
+
assert(result)
|
150
|
+
end
|
151
|
+
|
152
|
+
should "return nil when key doesn't exist" do
|
153
|
+
result = @test.srandmember("poop")
|
154
|
+
assert_nil(result)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "spop" do
|
159
|
+
should "return a random element from a set" do
|
160
|
+
items = ["a", "b", "c", "d"]
|
161
|
+
@test.sadd("set1", *items)
|
162
|
+
result = @test.spop("set1")
|
163
|
+
assert_not_nil(items.index(result))
|
164
|
+
end
|
165
|
+
|
166
|
+
should "remove the returned element from the set" do
|
167
|
+
items = ["a", "b", "c", "d"]
|
168
|
+
@test.sadd("set1", *items)
|
169
|
+
result = @test.spop("set1")
|
170
|
+
assert_equal(items.sort, (@test.smembers("set1") << result).sort)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
data/test/test_strc.rb
CHANGED
@@ -9,121 +9,4 @@ class TestStrc < Test::Unit::TestCase
|
|
9
9
|
assert_instance_of(STRC, @test)
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
13
|
-
context "setting" do
|
14
|
-
should "be able to set the value of a new key" do
|
15
|
-
result = @test.set("test_key", 20)
|
16
|
-
assert_equal("OK", result)
|
17
|
-
end
|
18
|
-
|
19
|
-
should "be able to set the value of an existing key" do
|
20
|
-
@test.set("test_key", 20)
|
21
|
-
result = @test.set("test_key", 30)
|
22
|
-
assert_equal("OK", result)
|
23
|
-
end
|
24
|
-
|
25
|
-
should "be able to set different types as values" do
|
26
|
-
result = @test.set("test_key", "poop")
|
27
|
-
assert_equal("OK", result)
|
28
|
-
end
|
29
|
-
|
30
|
-
should "be able to set different types as keys" do
|
31
|
-
result = @test.set(15, "abcde")
|
32
|
-
assert_equal("OK", result)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "getting" do
|
37
|
-
should "be able to get the value of a key" do
|
38
|
-
@test.set("test_key", 15)
|
39
|
-
result = @test.get("test_key")
|
40
|
-
assert_equal(15, result)
|
41
|
-
end
|
42
|
-
|
43
|
-
should "return nil for nonexistant keys" do
|
44
|
-
result = @test.get("blah")
|
45
|
-
assert_nil(result)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "sets" do
|
50
|
-
context "sadd" do
|
51
|
-
should "create a new set" do
|
52
|
-
result = @test.sadd("test_key", "poop")
|
53
|
-
assert_equal(1, result)
|
54
|
-
end
|
55
|
-
|
56
|
-
should "be able to add multiple items" do
|
57
|
-
result = @test.sadd("test_key", "poop", "abc")
|
58
|
-
assert_equal(2, result)
|
59
|
-
end
|
60
|
-
|
61
|
-
should "be able to add to an existing set" do
|
62
|
-
@test.sadd("test_key", "poop")
|
63
|
-
result = @test.sadd("test_key", "blah")
|
64
|
-
assert_equal(1, result)
|
65
|
-
end
|
66
|
-
|
67
|
-
should "not be able to add to something not a set" do
|
68
|
-
@test.set("test_key", "blah")
|
69
|
-
assert_raise(STRC::Exception) { @test.sadd("test_key", "poop") }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context "sismember" do
|
74
|
-
should "return true if the set contains the object" do
|
75
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
76
|
-
result = @test.sismember("test_key", "poop")
|
77
|
-
assert(result)
|
78
|
-
end
|
79
|
-
|
80
|
-
should "return false if the set does not contain the object" do
|
81
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
82
|
-
result = @test.sismember("test_key", "xyz")
|
83
|
-
assert(!result)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context "scard" do
|
88
|
-
should "return the number of items in the set" do
|
89
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
90
|
-
result = @test.scard("test_key")
|
91
|
-
assert_equal(3, result)
|
92
|
-
end
|
93
|
-
|
94
|
-
should "return 0 for nonexistant keys" do
|
95
|
-
result = @test.scard("blahblahblah")
|
96
|
-
assert_equal(0, result)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "srem" do
|
101
|
-
should "remove an item from the set" do
|
102
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
103
|
-
result = @test.srem("test_key", "poop")
|
104
|
-
assert(result)
|
105
|
-
assert_equal(2, @test.scard("test_key"))
|
106
|
-
end
|
107
|
-
|
108
|
-
should "not remove if the member isn't in the set" do
|
109
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
110
|
-
result = @test.srem("test_key", "xyz")
|
111
|
-
assert(!result)
|
112
|
-
assert_equal(3, @test.scard("test_key"))
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "smembers" do
|
117
|
-
should "return an array of items" do
|
118
|
-
@test.sadd("test_key", "poop", "blah", "abc")
|
119
|
-
result = @test.smembers("test_key")
|
120
|
-
assert_equal(["poop", "blah", "abc"], result)
|
121
|
-
end
|
122
|
-
|
123
|
-
should "return an empty array for nonexistant keys" do
|
124
|
-
result = @test.smembers("aaaaaa")
|
125
|
-
assert_equal([], result)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
12
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ default_executable:
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: shoulda
|
17
|
-
requirement: &
|
17
|
+
requirement: &9687480 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *9687480
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &9686856 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.0.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *9686856
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &9685920 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.5.2
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *9685920
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &9644496 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *9644496
|
59
59
|
description: STRC is a terrible Ruby clone of Redis
|
60
60
|
email: ctoneal@gmail.com
|
61
61
|
executables: []
|
@@ -74,6 +74,8 @@ files:
|
|
74
74
|
- lib/strc.rb
|
75
75
|
- strc.gemspec
|
76
76
|
- test/helper.rb
|
77
|
+
- test/test_basic_functions.rb
|
78
|
+
- test/test_sets.rb
|
77
79
|
- test/test_strc.rb
|
78
80
|
has_rdoc: true
|
79
81
|
homepage: http://github.com/ctoneal/strc
|
@@ -91,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
93
|
version: '0'
|
92
94
|
segments:
|
93
95
|
- 0
|
94
|
-
hash:
|
96
|
+
hash: 876690863
|
95
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
98
|
none: false
|
97
99
|
requirements:
|
@@ -106,4 +108,6 @@ specification_version: 3
|
|
106
108
|
summary: Super Terrible Redis Clone
|
107
109
|
test_files:
|
108
110
|
- test/helper.rb
|
111
|
+
- test/test_basic_functions.rb
|
112
|
+
- test/test_sets.rb
|
109
113
|
- test/test_strc.rb
|