strc 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +13 -0
- data/VERSION +1 -1
- data/lib/strc.rb +94 -25
- data/strc.gemspec +3 -1
- data/test/test_hashes.rb +97 -0
- metadata +12 -10
data/README.rdoc
CHANGED
@@ -56,6 +56,8 @@ Now you could start passing it commands, if they've been implemented.
|
|
56
56
|
>> strc.llen "poo"
|
57
57
|
=> 2
|
58
58
|
|
59
|
+
=== Hashes!
|
60
|
+
|
59
61
|
== Command List
|
60
62
|
Currently, the following commands are implemented:
|
61
63
|
* get
|
@@ -98,8 +100,19 @@ Currently, the following commands are implemented:
|
|
98
100
|
* lset
|
99
101
|
* ltrim
|
100
102
|
* rpoplpush
|
103
|
+
* Hashes
|
104
|
+
* hset
|
105
|
+
* hsetnx
|
106
|
+
* hget
|
107
|
+
* hgetall
|
108
|
+
* hdel
|
109
|
+
* hexists
|
110
|
+
* hkeys
|
111
|
+
* hvals
|
112
|
+
* hlen
|
101
113
|
|
102
114
|
== History
|
115
|
+
* 0.0.4 - Some hash commands done.
|
103
116
|
* 0.0.3 - Some list commands done.
|
104
117
|
* 0.0.2 - Set commands done. Most general commands done.
|
105
118
|
* 0.0.1 - Initial release. Does some basic things.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/lib/strc.rb
CHANGED
@@ -129,7 +129,7 @@ class STRC
|
|
129
129
|
if args.length < 1
|
130
130
|
raise STRC::Exception.new "Wrong number of arguments (1 for 2)"
|
131
131
|
end
|
132
|
-
set =
|
132
|
+
set = get_s(key)
|
133
133
|
added = 0
|
134
134
|
args.each do |arg|
|
135
135
|
unless set.include?(arg)
|
@@ -155,7 +155,7 @@ class STRC
|
|
155
155
|
def sinter(*keys)
|
156
156
|
sets = []
|
157
157
|
keys.each do |key|
|
158
|
-
sets <<
|
158
|
+
sets << get_s(key)
|
159
159
|
end
|
160
160
|
inter = sets.shift
|
161
161
|
sets.each do |set|
|
@@ -175,7 +175,7 @@ class STRC
|
|
175
175
|
def sdiff(*keys)
|
176
176
|
sets = []
|
177
177
|
keys.each do |key|
|
178
|
-
sets <<
|
178
|
+
sets << get_s(key)
|
179
179
|
end
|
180
180
|
diff = sets.shift
|
181
181
|
sets.each do |set|
|
@@ -206,7 +206,7 @@ class STRC
|
|
206
206
|
def sunion(*keys)
|
207
207
|
sets = []
|
208
208
|
keys.each do |key|
|
209
|
-
sets <<
|
209
|
+
sets << get_s(key)
|
210
210
|
end
|
211
211
|
union = sets.shift
|
212
212
|
sets.each do |set|
|
@@ -223,7 +223,7 @@ class STRC
|
|
223
223
|
|
224
224
|
# Returns a random element from the set
|
225
225
|
def srandmember(key)
|
226
|
-
|
226
|
+
get_s(key).to_a.sample
|
227
227
|
end
|
228
228
|
|
229
229
|
# Randomly remove and return an item from the set
|
@@ -235,33 +235,31 @@ class STRC
|
|
235
235
|
|
236
236
|
# Determine if the given value is a member of the set at key
|
237
237
|
def sismember(key, member)
|
238
|
-
set =
|
238
|
+
set = get_s(key)
|
239
239
|
return set.include?(member)
|
240
240
|
end
|
241
241
|
|
242
242
|
# Returns an array of members of the set
|
243
243
|
def smembers(key)
|
244
|
-
|
244
|
+
get_s(key).to_a
|
245
245
|
end
|
246
246
|
|
247
247
|
# Gets the length of a set
|
248
248
|
def scard(key)
|
249
|
-
set =
|
249
|
+
set = get_s(key)
|
250
250
|
return set.length
|
251
251
|
end
|
252
252
|
|
253
253
|
# Gets a set. Private
|
254
|
-
def
|
254
|
+
def get_s(key)
|
255
|
+
set = Set.new
|
255
256
|
if exists(key)
|
256
|
-
|
257
|
-
|
258
|
-
return value
|
259
|
-
else
|
257
|
+
set = get(key)
|
258
|
+
unless set.class == Set
|
260
259
|
raise STRC::Exception.new "ERR Operation against a key holding the wrong kind of value"
|
261
260
|
end
|
262
|
-
else
|
263
|
-
return Set.new
|
264
261
|
end
|
262
|
+
return set
|
265
263
|
end
|
266
264
|
|
267
265
|
# End of set commands~
|
@@ -269,7 +267,7 @@ class STRC
|
|
269
267
|
# List commands!
|
270
268
|
|
271
269
|
# Gets a list. Private
|
272
|
-
def
|
270
|
+
def get_l(key)
|
273
271
|
list = []
|
274
272
|
if exists(key)
|
275
273
|
list = get(key)
|
@@ -282,18 +280,18 @@ class STRC
|
|
282
280
|
|
283
281
|
# Returns elements from key in the given range
|
284
282
|
def lrange(key, start, stop)
|
285
|
-
list =
|
283
|
+
list = get_l(key)[start..stop]
|
286
284
|
return list.nil? ? [] : list
|
287
285
|
end
|
288
286
|
|
289
287
|
# Returns length of list
|
290
288
|
def llen(key)
|
291
|
-
|
289
|
+
get_l(key).length
|
292
290
|
end
|
293
291
|
|
294
292
|
# Append values to a list
|
295
293
|
def rpush(key, *values)
|
296
|
-
list =
|
294
|
+
list = get_l(key)
|
297
295
|
list += values
|
298
296
|
set(key, list)
|
299
297
|
return list.length
|
@@ -308,7 +306,7 @@ class STRC
|
|
308
306
|
|
309
307
|
# Remove and get the last element in a list
|
310
308
|
def rpop(key)
|
311
|
-
list =
|
309
|
+
list = get_l(key)
|
312
310
|
element = list.pop
|
313
311
|
set(key, list)
|
314
312
|
return element
|
@@ -316,7 +314,7 @@ class STRC
|
|
316
314
|
|
317
315
|
# Prepend values to a list
|
318
316
|
def lpush(key, *values)
|
319
|
-
list =
|
317
|
+
list = get_l(key)
|
320
318
|
list = values + list
|
321
319
|
set(key, list)
|
322
320
|
return list.length
|
@@ -331,7 +329,7 @@ class STRC
|
|
331
329
|
|
332
330
|
# Remove and get the first element in a list
|
333
331
|
def lpop(key)
|
334
|
-
list =
|
332
|
+
list = get_l(key)
|
335
333
|
element = list.shift
|
336
334
|
set(key, list)
|
337
335
|
return element
|
@@ -339,12 +337,12 @@ class STRC
|
|
339
337
|
|
340
338
|
# Get an element from a list by its index
|
341
339
|
def lindex(key, index)
|
342
|
-
|
340
|
+
get_l(key)[index]
|
343
341
|
end
|
344
342
|
|
345
343
|
# Set value for an element at index in a list
|
346
344
|
def lset(key, index, value)
|
347
|
-
list =
|
345
|
+
list = get_l(key)
|
348
346
|
list[index] = value
|
349
347
|
set(key, list)
|
350
348
|
end
|
@@ -364,7 +362,78 @@ class STRC
|
|
364
362
|
|
365
363
|
# Hash commands!
|
366
364
|
|
365
|
+
# Gets the hash at key. Private.
|
366
|
+
def get_h(key)
|
367
|
+
hash = {}
|
368
|
+
if exists(key)
|
369
|
+
hash = get(key)
|
370
|
+
unless hash.class == Hash
|
371
|
+
raise STRC::Exception.new "ERR Operation against a key holding the wrong kind of value"
|
372
|
+
end
|
373
|
+
end
|
374
|
+
return hash
|
375
|
+
end
|
376
|
+
|
377
|
+
# Set file in hash stored at key to value.
|
378
|
+
def hset(key, field, value)
|
379
|
+
hash = get_h(key)
|
380
|
+
hash[field] = value
|
381
|
+
set(key, hash)
|
382
|
+
end
|
383
|
+
|
384
|
+
# Sets field in key only if it doesn't exist
|
385
|
+
def hsetnx(key, field, value)
|
386
|
+
unless hexists(key, field)
|
387
|
+
hset(key, field, value)
|
388
|
+
return true
|
389
|
+
end
|
390
|
+
return false
|
391
|
+
end
|
392
|
+
|
393
|
+
# Get value at field in hash at key
|
394
|
+
def hget(key, field)
|
395
|
+
get_h(key)[field]
|
396
|
+
end
|
397
|
+
|
398
|
+
# Deletes fields from hash
|
399
|
+
def hdel(key, *fields)
|
400
|
+
hash = get_h(key)
|
401
|
+
deleted = 0
|
402
|
+
fields.each do |field|
|
403
|
+
unless hash.delete(field).nil?
|
404
|
+
deleted += 1
|
405
|
+
end
|
406
|
+
end
|
407
|
+
set(key, hash)
|
408
|
+
return deleted
|
409
|
+
end
|
410
|
+
|
411
|
+
# Returns whether or not the field exists in key
|
412
|
+
def hexists(key, field)
|
413
|
+
get_h(key).has_key?(field)
|
414
|
+
end
|
415
|
+
|
416
|
+
# Returns an array of all fields and values in hash
|
417
|
+
def hgetall(key)
|
418
|
+
get_h(key).flatten
|
419
|
+
end
|
420
|
+
|
421
|
+
# Returns array of all keys in hash at key
|
422
|
+
def hkeys(key)
|
423
|
+
get_h(key).keys
|
424
|
+
end
|
425
|
+
|
426
|
+
# Returns array of all values in hash at key
|
427
|
+
def hvals(key)
|
428
|
+
get_h(key).values
|
429
|
+
end
|
430
|
+
|
431
|
+
# Returns number of fields in the hash
|
432
|
+
def hlen(key)
|
433
|
+
get_h(key).length
|
434
|
+
end
|
435
|
+
|
367
436
|
# End of hash commands~
|
368
437
|
|
369
|
-
private :
|
438
|
+
private :get_s, :get_l, :get_h
|
370
439
|
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.4"
|
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"]
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"strc.gemspec",
|
29
29
|
"test/helper.rb",
|
30
30
|
"test/test_basic_functions.rb",
|
31
|
+
"test/test_hashes.rb",
|
31
32
|
"test/test_keys.rb",
|
32
33
|
"test/test_lists.rb",
|
33
34
|
"test/test_sets.rb",
|
@@ -41,6 +42,7 @@ Gem::Specification.new do |s|
|
|
41
42
|
s.test_files = [
|
42
43
|
"test/helper.rb",
|
43
44
|
"test/test_basic_functions.rb",
|
45
|
+
"test/test_hashes.rb",
|
44
46
|
"test/test_keys.rb",
|
45
47
|
"test/test_lists.rb",
|
46
48
|
"test/test_sets.rb",
|
data/test/test_hashes.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestHashes < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@test = STRC.new
|
6
|
+
@test.hset("poop", "a", 1)
|
7
|
+
@test.hset("poop", "qwe", "aaa")
|
8
|
+
end
|
9
|
+
|
10
|
+
context "hset" do
|
11
|
+
should "create a new hash" do
|
12
|
+
@test.hset("test", "a", 1)
|
13
|
+
assert(@test.exists("test"))
|
14
|
+
assert_equal(1, @test.hget("test", "a"))
|
15
|
+
end
|
16
|
+
|
17
|
+
should "add fields to existing hashes" do
|
18
|
+
@test.hset("poop", "b", 2)
|
19
|
+
assert_equal(2, @test.hget("poop", "b"))
|
20
|
+
end
|
21
|
+
|
22
|
+
should "set existing fields in hashes" do
|
23
|
+
@test.hset("poop", "a", 15)
|
24
|
+
assert_equal(15, @test.hget("poop", "a"))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "hsetnx" do
|
29
|
+
should "set a field if it doesn't exist" do
|
30
|
+
@test.hsetnx("poop", "b", 10)
|
31
|
+
assert_equal(10, @test.hget("poop", "b"))
|
32
|
+
end
|
33
|
+
|
34
|
+
should "not set to a field if it exists" do
|
35
|
+
@test.hsetnx("poop", "qwe", 100)
|
36
|
+
assert_not_equal(100, @test.hget("poop", "qwe"))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "hget" do
|
41
|
+
should "return value for field" do
|
42
|
+
assert_equal(1, @test.hget("poop", "a"))
|
43
|
+
end
|
44
|
+
|
45
|
+
should "return nil for nonexistant fields" do
|
46
|
+
assert_nil(@test.hget("poop", "b"))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "hdel" do
|
51
|
+
should "delete fields" do
|
52
|
+
@test.hdel("poop", "a")
|
53
|
+
assert_nil(@test.hget("poop", "a"))
|
54
|
+
end
|
55
|
+
|
56
|
+
should "return number of deleted fields" do
|
57
|
+
result = @test.hdel("poop", "a")
|
58
|
+
assert_equal(1, result)
|
59
|
+
result = @test.hdel("poop", "asdf")
|
60
|
+
assert_equal(0, result)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "hexists" do
|
65
|
+
should "return true if field exists" do
|
66
|
+
assert(@test.hexists("poop", "a"))
|
67
|
+
end
|
68
|
+
|
69
|
+
should "return false if field doesn't exist" do
|
70
|
+
assert(!@test.hexists("poop", "asdf"))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "hgetall" do
|
75
|
+
should "return an array of keys and values" do
|
76
|
+
assert_equal(["a", 1, "qwe", "aaa"], @test.hgetall("poop"))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "hkeys" do
|
81
|
+
should "return an array of keys" do
|
82
|
+
assert_equal(["a", "qwe"], @test.hkeys("poop"))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "hvals" do
|
87
|
+
should "return an array of values" do
|
88
|
+
assert_equal([1, "aaa"], @test.hvals("poop"))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "hlen" do
|
93
|
+
should "give number of keys in hash" do
|
94
|
+
assert_equal(2, @test.hlen("poop"))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
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.4
|
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: &9559164 !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: *9559164
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &9558396 !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: *9558396
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &9556440 !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: *9556440
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &9555588 !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: *9555588
|
59
59
|
description: STRC is a terrible Ruby clone of Redis
|
60
60
|
email: ctoneal@gmail.com
|
61
61
|
executables: []
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- strc.gemspec
|
76
76
|
- test/helper.rb
|
77
77
|
- test/test_basic_functions.rb
|
78
|
+
- test/test_hashes.rb
|
78
79
|
- test/test_keys.rb
|
79
80
|
- test/test_lists.rb
|
80
81
|
- test/test_sets.rb
|
@@ -95,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
96
|
version: '0'
|
96
97
|
segments:
|
97
98
|
- 0
|
98
|
-
hash:
|
99
|
+
hash: -157389393
|
99
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
101
|
none: false
|
101
102
|
requirements:
|
@@ -111,6 +112,7 @@ summary: Super Terrible Redis Clone
|
|
111
112
|
test_files:
|
112
113
|
- test/helper.rb
|
113
114
|
- test/test_basic_functions.rb
|
115
|
+
- test/test_hashes.rb
|
114
116
|
- test/test_keys.rb
|
115
117
|
- test/test_lists.rb
|
116
118
|
- test/test_sets.rb
|