strc 0.0.3 → 0.0.4
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 +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
|