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.
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