strc 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/README.rdoc +13 -0
  2. data/VERSION +1 -1
  3. data/lib/strc.rb +94 -25
  4. data/strc.gemspec +3 -1
  5. data/test/test_hashes.rb +97 -0
  6. metadata +12 -10
@@ -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.3
1
+ 0.0.4
@@ -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 = sget(key)
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 << sget(key)
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 << sget(key)
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 << sget(key)
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
- sget(key).to_a.sample
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 = sget(key)
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
- sget(key).to_a
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 = sget(key)
249
+ set = get_s(key)
250
250
  return set.length
251
251
  end
252
252
 
253
253
  # Gets a set. Private
254
- def sget(key)
254
+ def get_s(key)
255
+ set = Set.new
255
256
  if exists(key)
256
- value = get(key)
257
- if value.class == Set
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 lget(key)
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 = lget(key)[start..stop]
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
- lget(key).length
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 = lget(key)
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 = lget(key)
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 = lget(key)
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 = lget(key)
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
- lget(key)[index]
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 = lget(key)
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 :sget, :lget
438
+ private :get_s, :get_l, :get_h
370
439
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{strc}
8
- s.version = "0.0.3"
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",
@@ -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.3
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: &9732852 !ruby/object:Gem::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: *9732852
25
+ version_requirements: *9559164
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &9732216 !ruby/object:Gem::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: *9732216
36
+ version_requirements: *9558396
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: jeweler
39
- requirement: &9726516 !ruby/object:Gem::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: *9726516
47
+ version_requirements: *9556440
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rcov
50
- requirement: &9726036 !ruby/object:Gem::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: *9726036
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: 230414097
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