valkey-objects 0.1.9 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd818b1fec7663dd86f7fe4242f3087a12cec34a66636e7778a1962d89a5b36b
4
- data.tar.gz: c5f94e9df1a9c8a7cf18b630084e723961a07132e4b2220a73c46b07347af95b
3
+ metadata.gz: 8a6bb452e823041de80c00be7bbea235bb937feef6937cac1ec122dd216a47f9
4
+ data.tar.gz: 15edeaffe86bf2eb97360e78930befcba9a7ab41c4a9f9a56e99cd7fedba1e3e
5
5
  SHA512:
6
- metadata.gz: 925b6628e084463efcd12e62910a18c51e54a023ebd71fec4971ad446a0cd8f61e029ae518512dec20d6ba1b0cef1425f85165d9a91234151458e93b7c19ffbb
7
- data.tar.gz: 05aa6bd931bb40bae5749cdfd3d18dee3df39669db0efcbb77f51da761e522f2b690be7a37503e7cf100366d0f6610af49bcfa468d4ad84436139f77ecce8541
6
+ metadata.gz: 1380445b88e8949132e7967b16ece714f74a3118bab76373e7d412a95709a062b63b1bfe56844d0f315d0b672e66b0f4ba67761472ec4c816aadbfc1de7ddb57
7
+ data.tar.gz: 6871da9972c3489afbedf59fb356edf2ba340deb9e4fe4ff47e172e144bb99624e0707497ed89fe4042206ad650b3e83938eb6eca2ce82245625509619779a38
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Valkey
4
4
  module Objects
5
- VERSION = "0.1.9"
5
+ VERSION = "0.2.1"
6
6
  end
7
7
  end
@@ -5,8 +5,14 @@ require_relative "objects/version"
5
5
  require 'redis-client'
6
6
  require 'json'
7
7
  require 'ruby-duration'
8
-
8
+ require 'amatch'
9
+ require 'ap'
9
10
  module VK
11
+
12
+ @@XX = {}
13
+
14
+
15
+
10
16
  def self.included(x)
11
17
  x.extend VK
12
18
  end
@@ -16,6 +22,8 @@ module VK
16
22
  # Example:
17
23
  # class ExmpleObject
18
24
  # include VK
25
+ #
26
+ ## Add Object Containers by Value Type:
19
27
  # value :myValue
20
28
  # counter :myCounter
21
29
  # hashkey :myHashKey
@@ -25,49 +33,83 @@ module VK
25
33
  # place :myPlace
26
34
  # pipe :myPipe
27
35
  # toggle :myToggle
36
+ # ticker :myTicker
37
+ # entry :myEntry
38
+ #
39
+ ## Add an Object Container With an Implicit Expiration:
40
+ # value :myExpiringValue, ttl: (seconds to live without interaction)
41
+ #
28
42
  # def initialize k
29
43
  # @id = k
30
44
  # end
31
45
  # end
32
- #
33
- # Instantiation: @obj = ExampleObject.new('object id...')
46
+ ##
47
+ # Create the Object:
48
+ # @obj = ExampleObject.new('object id...')
49
+ ##
50
+ # For all object methods:
51
+ # @obj.myObjectContainer.expire(seconds)
52
+ # @obj.myObjectContainer.delete!
53
+ #
34
54
  xx = x.name.gsub("::", "-")
35
55
  ##
56
+ # Object Method Types:
57
+ ##
58
+ # A String Value
59
+ ##
36
60
  # value :myValue
37
- # @obj.myValue => A string
61
+ # @obj.myValue
62
+ # @obj.myValue.exist?
38
63
  # @obj.myValue.value = "my value"
39
64
  # @obj.myValue.value => "my value"
40
- define_method(:value) { |k| define_method(k.to_sym) { V.new(%[#{xx}:value:#{k}:#{@id}]) } };
65
+ define_method(:value) { |k, h={}| define_method(k.to_sym) { VALUE.new(%[#{xx}:value:#{k}:#{@id}], h) } };
66
+ ##
67
+ # A Number Value
41
68
  ##
42
- # counter :myCounter => A number
69
+ # counter :myCounter
43
70
  # @obj.myCounter
71
+ # @obj.myCounter.exist?
44
72
  # @obj.myCounter.value = number
45
- # @obj.myCounter.value => ...
73
+ # @obj.myCounter.value => number
46
74
  # @obj.myCounter.incr number
47
75
  # @obj.myCounter.decr number
48
76
  #
49
- define_method(:counter) { |k| define_method(k.to_sym) { C.new(%[#{xx}:counter:#{k}:#{@id}]); } };
77
+ define_method(:counter) { |k, h={}| define_method(k.to_sym) { COUNTER.new(%[#{xx}:counter:#{k}:#{@id}], h); } };
50
78
  ##
51
- #
52
- define_method(:timestamp) { |k| define_method(k.to_sym) { N.new(%[#{xx}:counter:#{k}:#{@id}]) } }
53
- ##
54
- # hashkey :myHashKey => The ubiquitous Ruby Hash in valkey/redis
79
+ # An Epoch Value
80
+ ##
81
+ # timestamp :myTimestamp
82
+ # @obj.myTimestamp
83
+ # @obj.myTimestamp.exist?
84
+ # @obj.myTimestamp.value!
85
+ # @obj.myTimestamp.value => epoch
86
+ # @obj.myTimestamp.ago => Seconds since epoch
87
+ # @obj.myTimestamp.to_time => Time object
88
+ define_method(:timestamp) { |k, h={}| define_method(k.to_sym) { TIMESTAMP.new(%[#{xx}:timestamp:#{k}:#{@id}], h) } }
89
+ ##
90
+ # A Hash Value
91
+ ##
92
+ # hashkey :myHashKey
55
93
  # @obj.myHashKey
56
94
  # @obj.myHashKey[:key] = value
57
- # @obj.myHashKey[:key] => ...
95
+ # @obj.myHashKey[:key] => "value"
58
96
  #
59
- define_method(:hashkey) { |k| define_method(k.to_sym) { H.new(%[#{xx}:hash:#{k}:#{@id}]); } };
60
- ##
61
- # sortedset :mySortedSet => A ranked collection of members
97
+ define_method(:hashkey) { |k, h={}| define_method(k.to_sym) { HASH.new(%[#{xx}:hashkey:#{k}:#{@id}], h); } };
98
+ ##
99
+ # A Sorted Set Value
100
+ ##
101
+ # sortedset :mySortedSet
62
102
  # @obj.mySortedSet
63
103
  # @obj.mySortedSet[:key] = value
64
104
  # @obj.mySortedSet[:key] => ...
65
105
  # @obj.mySortedSet.value { |key, i| ... }
66
106
  # @obj.mySortedSet.poke key, number
67
107
  #
68
- define_method(:sortedset) { |k| define_method(k.to_sym) { S.new(%[#{xx}:sortedset:#{k}:#{@id}]); } };
69
- ##
70
- # set :mySet => A collect of unique members
108
+ define_method(:sortedset) { |k, h={}| define_method(k.to_sym) { SORTEDSET.new(%[#{xx}:sortedset:#{k}:#{@id}], h); } };
109
+ ##
110
+ # A Collection of Values
111
+ ##
112
+ # set :mySet
71
113
  # @obj.mySet
72
114
  # @obj.mySet << "x"
73
115
  # @obj.myset.rm "x"
@@ -76,17 +118,21 @@ module VK
76
118
  # @obj.myset["pattern"]
77
119
  # @obj.mySet.value { |key, i| ... }
78
120
  #
79
- define_method(:set) { |k| define_method(k.to_sym) { G.new(%[#{xx}:set:#{k}:#{@id}]); } };
80
- ##
81
- # queue :myQueue => An array with push and pop utility
121
+ define_method(:set) { |k, h={}| define_method(k.to_sym) { SET.new(%[#{xx}:set:#{k}:#{@id}], h); } };
122
+ ##
123
+ # A List of Values
124
+ ##
125
+ # queue :myQueue
82
126
  # @obj.myQueue
83
127
  # @obj.myQueue << "x"
84
128
  # @obj.myQueue.front => "x" and pop
85
129
  # @obj.myQueue.value { |key, i| ... }
86
130
  #
87
- define_method(:queue) { |k| define_method(k.to_sym) { Q.new(%[#{xx}:queue:#{k}:#{@id}]); } };
88
- ##
89
- # place :myPlace => GPS Coordinates
131
+ define_method(:queue) { |k, h={}| define_method(k.to_sym) { QUEUE.new(%[#{xx}:queue:#{k}:#{@id}], h); } };
132
+ ##
133
+ # A Collection of Places
134
+ ##
135
+ # place :myPlace
90
136
  # @obj.myPlace
91
137
  # @obj.myPlace.add "key", longitude, latitude
92
138
  # @obj.myPlace["key"] => { longitude: xx, latitude: yy }
@@ -94,24 +140,45 @@ module VK
94
140
  # @obj.myPlace.radius longitude, latitude, distance
95
141
  # @obj.myPlace.value { |key, i| ... }
96
142
  #
97
- define_method(:place) { |k| define_method(k.to_sym) { P.new(%[#{xx}:place:#{k}:#{@id}]); } };
98
- ##
99
- # pipe :myPipe => Subscibe and handle, and publish.
100
- # @obj.myPipe
101
- # @obj.myPipe.on { |msg| ... }
102
- # @obj.myPipe << "input" => publish { input: "input" }
103
- # @obj.myPipe << ["input","input"] => publish { inputs: ["input", "input"] }
104
- # @obj.myPipe << {} => publish {}
105
- #
106
- define_method(:pipe) { |k| define_method(k.to_sym) { B.new(%[#{xx}:pipe:#{k}:#{@id}]); } };
107
- ##
108
- # toggle :myToggle => Boolean toggle.
143
+ define_method(:place) { |k, h={}| define_method(k.to_sym) { PLACE.new(%[#{xx}:place:#{k}:#{@id}], h); } };
144
+ ##
145
+ # A Boolean Value
146
+ ##
147
+ # toggle :myToggle
109
148
  # @obj.myToggle
110
- # @obj.value = bool
111
- # @obj.value => ...
112
- # @obj.value! => value = !value
149
+ # @obj.myToggle.exist?
150
+ # @obj.myToggle.value = bool
151
+ # @obj.myToggle.value => ...
152
+ # @obj.myToggle.value! => value = !value
113
153
  #
114
- define_method(:toggle) { |k| define_method(k.to_sym) { T.new(%[#{xx}:toggle:#{k}:#{@id}]); } };
154
+ define_method(:toggle) { |k, h={}| define_method(k.to_sym) { TOGGLE.new(%[#{xx}:toggle:#{k}:#{@id}], h); } };
155
+ ##
156
+ # A Sorted Hash of Values
157
+ ##
158
+ # ticker :myTicker
159
+ # @obj.myTicker
160
+ # @obj.myTicker[:key] = value
161
+ # @obj.myTicker[:key] => "value"
162
+ # @obj.myticker.value { |i,e| ... }
163
+ define_method(:ticker) { |k, h={}| define_method(k.to_sym) { SORTEDHASH.new(%[#{xx}:ticker:#{k}:#{@id}], h); } };
164
+ ##
165
+ # A List of Hashes
166
+ ##
167
+ # entry :myEntry
168
+ # @obj.myEntry
169
+ # @obj.myEntry << { key: 'value', ... }
170
+ # @obj.myEntry.value { |i,e| ... }
171
+ define_method(:entry) { |k, h={}| define_method(k.to_sym) { HASHLIST.new(%[#{xx}:entry:#{k}:#{@id}], h); } };
172
+ ##
173
+ # A list of Strings
174
+ ##
175
+ # vector :myVector
176
+ # @obj.myVector
177
+ # @obj.myVector << "An Entry of Text."
178
+ # @obj.myVector.value { |i,e| ... }
179
+ # @obj.myvector[0] = "An Entry of Text."
180
+ define_method(:vector) { |k, h={}| define_method(k.to_sym) { VECTOR.new(%[#{xx}:vector:#{k}:#{@id}], h); } };
181
+
115
182
  end
116
183
 
117
184
  def id
@@ -161,11 +228,15 @@ module VK
161
228
  def self.redis
162
229
  RedisClient.config(host: "127.0.0.1", port: 6379, db: 0).new_client
163
230
  end
164
-
231
+
165
232
  class O
166
233
  attr_reader :key
167
- def initialize k
234
+ def initialize k, h={}
168
235
  @key = k
236
+ @opts = h
237
+ if @opts.has_key?(:ttl)
238
+ expire @opts[:ttl]
239
+ end
169
240
  end
170
241
  def delete!
171
242
  VK.redis.call("DEL", key);
@@ -175,13 +246,19 @@ module VK
175
246
  end
176
247
  end
177
248
 
178
- class N < O
249
+ class TIMESTAMP < O
179
250
  def value
180
251
  VK.redis.call("GET", key).to_i;
252
+ if @opts.has_key?(:flush) == true
253
+ delete!
254
+ end
181
255
  end
182
256
  def value!
183
257
  VK.redis.call("SET", key, "#{VK.clock.to_i}");
184
258
  end
259
+ def exist?
260
+ VK.redis.call("GET", key) ? true : false
261
+ end
185
262
  def ago
186
263
  VK.clock.to_i - value;
187
264
  end
@@ -190,10 +267,16 @@ module VK
190
267
  end
191
268
  end
192
269
 
193
- class T < O
270
+ class TOGGLE < O
194
271
  def value
195
- VK.redis.call("GET", key) == 'true' ? true : false
272
+ VK.redis.call("GET", key) == 'true' ? true : false
273
+ if @opts.has_key?(:flush) == true
274
+ delete!
275
+ end
196
276
  end
277
+ def exist?
278
+ VK.redis.call("GET", key) ? true : false
279
+ end
197
280
  def value= x
198
281
  VK.redis.call("SET", key, "#{x.to_s}")
199
282
  end
@@ -206,42 +289,19 @@ module VK
206
289
  end
207
290
  end
208
291
 
209
- class B < O
210
- def on &b
211
- pubsub = VK.redis.pubsub
212
- pubsub.call("SUBSCRIBE", key)
213
- Process.detach( fork do
214
- loop do
215
- if m = pubsub.next_event(0)
216
- cn, ty, na, id = key.split(":")
217
- if m[0] == "message"
218
- b.call({ stub: na, object: cn.gsub("-", "::"), type: ty, id: id, event: m[0], data: JSON.parse(m[2]) })
219
- else
220
- ap({ stub: na, object: cn.gsub("-", "::"), type: ty, id: id, event: m[0], data: m[2] })
221
- end
222
- end
223
- end
224
- end
225
- );
226
- end
227
- def << x
228
- if x.class == String
229
- VK.redis.call("PUBLISH", key, JSON.generate({ input: x }))
230
- elsif x.class == Array
231
- VK.redis.call("PUBLISH", key, JSON.generate({ inputs: x }))
232
- elsif x.class == Hash
233
- VK.redis.call("PUBLISH", key, JSON.generate(x))
234
- end
235
- end
236
- end
237
-
238
- class V < O
292
+ class VALUE < O
239
293
  def value
240
294
  VK.redis.call("GET", key)
295
+ if @opts.has_key?(:flush) == true
296
+ delete!
297
+ end
241
298
  end
242
299
  def value= x
243
300
  VK.redis.call("SET", key, x)
244
301
  end
302
+ def exist?
303
+ VK.redis.call("GET", key) ? true : false
304
+ end
245
305
  def match r, &b
246
306
  m = Regexp.new(r).match(value)
247
307
  if block_given?
@@ -251,8 +311,48 @@ module VK
251
311
  end
252
312
  end
253
313
  end
314
+
315
+ class VECTOR < O
316
+ include Amatch
317
+ def value &b
318
+ VK.redis.call("LRANGE", key, 0, -1).each_with_index { |e, i|
319
+ b.call(i, VK.redis.call("GET", e))
320
+ if @opts.has_key?(:flush) == true
321
+ VK.redis.call("DEL", e);
322
+ end
323
+ }
324
+ if @opts.has_key?(:flush) == true
325
+ delete!
326
+ end
327
+ end
328
+ def [] k
329
+ VK.redis.call("GET", "#{@key}-#{k}");
330
+ end
331
+ def << i
332
+ kk = %[#{@key}-#{VK.redis.call("LLEN",@key)}]
333
+ VK.redis.call("SET", kk, i);
334
+ VK.redis.call("RPUSH", key, kk)
335
+ end
336
+ def nearest p
337
+ h = {}
338
+ value { |i,v|
339
+ h[i] = {
340
+ value: v,
341
+ levenshtein: p.levenshtein_similar(v),
342
+ damerau: p.damerau_levenshtein_similar(v),
343
+ hamming: p.hamming_similar(v),
344
+ distance: p.pair_distance_similar(v),
345
+ subsequence: p.longest_subsequence_similar(v),
346
+ substring: p.longest_substring_similar(v),
347
+ jaro: p.jaro_similar(v),
348
+ winkler: p.jarowinkler_similar(v)
349
+ }
350
+ }
351
+ return h
352
+ end
353
+ end
254
354
 
255
- class C < O
355
+ class COUNTER < O
256
356
  def incr n
257
357
  VK.redis.call("SET", key, value + n.to_f)
258
358
  end
@@ -261,27 +361,36 @@ module VK
261
361
  end
262
362
  def value
263
363
  VK.redis.call("GET", key).to_f
364
+ if @opts.has_key?(:flush) == true
365
+ delete!
366
+ end
264
367
  end
265
368
  def value= n
266
369
  VK.redis.call("SET", key, n.to_f)
267
370
  end
371
+ def exist?
372
+ VK.redis.call("GET", key) ? true : false
373
+ end
268
374
  end
269
375
 
270
- class H < O
376
+ class HASH < O
271
377
  def [] k
272
378
  VK.redis.call("HGET", key, k);
273
379
  end
274
380
  def []= k,v
275
- VK.redis.call("HMSET", key, k, v);
381
+ VK.redis.call("HSET", key, k, v);
276
382
  end
277
383
  def to_h
278
384
  VK.redis.call("HGETALL", key);
279
385
  end
280
386
  end
281
387
 
282
- class Q < O
388
+ class QUEUE < O
283
389
  def value &b
284
390
  VK.redis.call("LRANGE", key, 0, -1).each_with_index { |e, i| b.call(i, e) }
391
+ if @opts.has_key?(:flush) == true
392
+ delete!
393
+ end
285
394
  end
286
395
  def length
287
396
  VK.redis.call("LLEN", key)
@@ -294,9 +403,12 @@ module VK
294
403
  end
295
404
  end
296
405
 
297
- class S < O
406
+ class SORTEDSET < O
298
407
  def value &b
299
408
  VK.redis.call("ZREVRANGE", key, 0, -1, 'WITHSCORES').each_with_index { |e, i| b.call(i, e) }
409
+ if @opts.has_key?(:flush) == true
410
+ delete!
411
+ end
300
412
  end
301
413
  def [] k
302
414
  VK.redis.call("ZSCORE", key, k).to_f;
@@ -309,9 +421,20 @@ module VK
309
421
  end
310
422
  end
311
423
 
312
- class G < O
424
+ class SET < O
313
425
  def value &b
314
- VK.redis.call("SMEMBERS", key).each_with_index { |e, i| b.call(i, e) }
426
+ a = Set.new
427
+ VK.redis.call("SMEMBERS", key).each_with_index { |e, i|
428
+ if block_given?
429
+ a << b.call(i, e)
430
+ else
431
+ a << e
432
+ end
433
+ }
434
+ if @opts.has_key?(:flush) == true
435
+ delete!
436
+ end
437
+ return aa
315
438
  end
316
439
  def include? k
317
440
  if VK.redis.call("SMISMEMBER", key, k)[0] == 0
@@ -342,9 +465,20 @@ module VK
342
465
  end
343
466
  end
344
467
 
345
- class P < O
468
+ class PLACE < O
346
469
  def value &b
347
- VK.redis.call("ZRANGE", key, 0, -1).each_with_index { |e, i| b.call(i, e) };
470
+ a = []
471
+ VK.redis.call("ZRANGE", key, 0, -1).each_with_index { |e, i|
472
+ if block_given?
473
+ a << b.call(i, e)
474
+ else
475
+ a << e
476
+ end
477
+ };
478
+ if @opts.has_key?(:flush) == true
479
+ delete!
480
+ end
481
+ return a
348
482
  end
349
483
  def add i, lon, lat
350
484
  VK.redis.call("GEOADD", key, lon, lat, i)
@@ -362,11 +496,74 @@ module VK
362
496
  return h
363
497
  end
364
498
  end
499
+
500
+ class SORTEDHASH < O
501
+ def value &b
502
+ VK.redis.call("ZREVRANGE", key, 0, -1, 'WITHSCORES').each_with_index { |e, i|
503
+ kx = %[#{@key}-#{e[0]}]
504
+ a = []
505
+ if block_given?
506
+ b.call(i, { key: e[0], value: VK.redis.call("GET", kx), score: e[1] } )
507
+ else
508
+ a << { key: e[0], value: VK.redis.call("GET", kx), score: e[1] }
509
+ end
510
+ if @opts.has_key?(:flush) == true
511
+ VK.redis.call("DEL", kx)
512
+ end
513
+ }
514
+ if @opts.has_key?(:flush) == true
515
+ delete!
516
+ end
517
+ return a
518
+ end
519
+ def [] k
520
+ kx = %[#{@key}-#{k}]
521
+ VK.redis.call("GET", kx)
522
+ end
523
+ def []= k, v
524
+ kx = %[#{@key}-#{k}]
525
+ VK.redis.call("SET", kx, v)
526
+ VK.redis.call("ZINCRBY", key, 1, k)
527
+ end
528
+ end
529
+
530
+ class HASHLIST < O
531
+ def value &b
532
+ a = []
533
+ VK.redis.call("LRANGE", key, 0, -1).each_with_index { |e, i|
534
+ if block_given?
535
+ a << b.call(i, JSON.parse(VK.redis.call("GET", e)))
536
+ else
537
+ a << JSON.parse(VK.redis.call("GET", e))
538
+ end
539
+ if @opts.has_key?(:flush) == true
540
+ VK.redis.call("DEL", e)
541
+ end
542
+ }
543
+ if @opts.has_key?(:flush) == true
544
+ delete!
545
+ end
546
+ return a
547
+ end
548
+ def length
549
+ VK.redis.call("LLEN", key)
550
+ end
551
+ def [] k
552
+ hx = %[#{key}-#{k}]
553
+ JSON.parse(VK.redis.call("GET", hx));
554
+ end
555
+ def push h={}
556
+ hx = %[#{key}-#{length}]
557
+ VK.redis.call("SET", hx, JSON.generate(h));
558
+ VK.redis.call("RPUSH", key, hx)
559
+ end
560
+ end
561
+
365
562
  def self.flushdb!
366
563
  VK.redis.call("FLUSHDB")
367
564
  end
565
+
368
566
  def self.[] k
369
567
  VK.redis.call("KEYS", k)
370
568
  end
371
569
  end
372
-
@@ -34,6 +34,9 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "redis-client"
35
35
  spec.add_dependency "json"
36
36
  spec.add_dependency "ruby-duration"
37
+ spec.add_dependency "pry"
38
+ spec.add_dependency "amatch"
39
+ spec.add_dependency "awesome_print"
37
40
  # For more information and examples about making a new gem, check out our
38
41
  # guide at: https://bundler.io/guides/creating_gem.html
39
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valkey-objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Olson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-25 00:00:00.000000000 Z
11
+ date: 2025-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: amatch
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: awesome_print
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  description: A ruby valkey client inspired by the redis-objects gem.
56
98
  email:
57
99
  - xorgnak@gmail.com
@@ -59,20 +101,14 @@ executables: []
59
101
  extensions: []
60
102
  extra_rdoc_files: []
61
103
  files:
62
- - "#class.rb#"
63
104
  - CHANGELOG.md
64
105
  - CODE_OF_CONDUCT.md
65
106
  - LICENSE.txt
66
107
  - README.md
67
108
  - Rakefile
68
- - class.rb~
69
- - example.rb~
70
109
  - lib/valkey/objects.rb
71
110
  - lib/valkey/objects/version.rb
72
- - module.rb~
73
111
  - sig/valkey/objects.rbs
74
- - valkey-objects-0.1.0.gem
75
- - valkey-objects-0.1.1.gem
76
112
  - valkey-objects.gemspec
77
113
  homepage: https://github.com/xorgnak/valkey-client
78
114
  licenses:
data/#class.rb# DELETED
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'valkey/objects'
4
-
5
- require 'pry'
6
-
7
- class Game
8
- include VK
9
- sortedset :points
10
- queue :log
11
- def initialize k
12
- @id = k
13
- end
14
- def score p, h={ points: 1 }
15
- self.points.poke p, h[:points]
16
- end
17
- end
18
-
19
- @game = Hash.new { |h,k| h[k] = Game.new(k) }
20
-
21
- Pry.start
data/class.rb~ DELETED
@@ -1,97 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'valkey/objects'
4
-
5
- # Using ValKey Objects
6
- ## Create your class object
7
- class ValKey
8
- # 1. include valkey-objects layer
9
- include VK
10
- # 2. stitch your object together.
11
- value :myvalue
12
- counter :mycounter
13
- hashkey :myhash
14
- sortedset :mysortedset
15
- set :myset
16
- queue :myqueue
17
- place :myplace
18
- pipe :mypipe
19
- toggle :mytoggle
20
- # 3. define @id in initialize.
21
- def initialize k
22
- @id = k
23
- end
24
- # other stuff...
25
- end
26
-
27
- ## then user it.
28
- puts %[=== Valkey Object Test ===]
29
- @x = ValKey.new("My Special Valkey object.")
30
- #### pub/sub pipe
31
- ##### on message
32
- @x.mypipe.on { |msg| puts %[MSG]; ap msg }
33
- ##### publish message
34
- @x.mypipe << "Pipe Connected!"
35
- ### get/set string value...
36
- @x.myvalue.value = "Hello, World"
37
- ### get/set/incr/decr float value...
38
- @x.mycounter.value = 1.2345
39
- ### get/set key/value pairs...
40
- @x.myhash[:key] = "Value"
41
- ### sort keys by score...
42
- #### set
43
- @x.mysortedset["my other key"] = 9.8
44
- #### poke/get
45
- @x.mysortedset.poke "my key", @x.mysortedset["my other key"]
46
- #### by high score
47
- @x.mysortedset.value { |i, e| ap %[Sorted Sets: i: #{i} e: #{e}] }
48
- ### collect keys...
49
- @x.myset << "my member"
50
- @x.myset << "my new member"
51
- #### filter by regexp...
52
- h = @x.myset[/ new /]
53
- puts %[Filtered set members:]
54
- ap h
55
- #### each collection key....
56
- @x.myset.value { |i, e| puts %[Sets: i: #{i} e: #{e}] }
57
- ### points by coordinates...
58
- @x.myplace.add "Palermo", 13.361389, 38.115556
59
- @x.myplace.add "Catania", 15.087269, 37.502669
60
- #### distance between points.
61
- distance = @x.myplace.distance "Palermo", "Catania"
62
- ap %[The meters between the points: #{distance}]
63
- #### places within radius by coordinates
64
- places = @x.myplace.radius 15.087269, 37.502669, 5000
65
- ap %[The places within 5000 meters of the coordinates: #{places}]
66
- puts %[Place Values...]
67
- #### collection of places...
68
- @x.myplace.value { |i, e| puts %[Places: i: #{i} e: #{e}] }
69
- ap VK['*']
70
-
71
-
72
-
73
- ## Or as a collection of "X"s...
74
- module X
75
- @@X = Hash.new { |h,k| h[k] = Ex.new(k) }
76
- class Ex
77
- include VK
78
- set :stuff
79
- pipe :ear
80
- def initialize k
81
- @id = k
82
- end
83
- end
84
- def self.keys
85
- @@X.keys
86
- end
87
- def self.[] k
88
- if !@@X.has_key?(k)
89
- @@X[k].ear.on { |msg| puts "MSG[#{k}]:"; ap msg }
90
- end
91
- @@X[k]
92
- end
93
- end
94
-
95
- @x[:a] = X['Aaa']
96
- @x[:b] = X['Bbb']
97
- @x[:c] = X['Ccc']
data/example.rb~ DELETED
@@ -1,101 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'valkey/objects'
4
-
5
- # Using ValKey Objects
6
- ## Create your class object
7
- class ValKey
8
- # 1. include valkey-objects layer
9
- include VK
10
- # 2. stitch your object together.
11
- value :myvalue
12
- counter :mycounter
13
- hashkey :myhash
14
- sortedset :mysortedset
15
- set :myset
16
- queue :myqueue
17
- place :myplace
18
- pipe :mypipe
19
- toggle :mytoggle
20
- # 3. define @id in initialize.
21
- def initialize k
22
- @id = k
23
- end
24
- # other stuff...
25
- end
26
-
27
-
28
-
29
- require 'awesome_print'
30
-
31
- @x = {}
32
-
33
- ## then user it.
34
- puts %[=== Valkey Object Test ===]
35
- @x[:x] = ValKey.new("My Special Valkey object.")
36
- #### pub/sub pipe
37
- ##### on message
38
- @x[:x].mypipe.on { |msg| puts %[MSG]; ap msg }
39
- ##### publish message
40
- @x[:x].mypipe << "Pipe Connected!"
41
- ### get/set string value...
42
- @x[:x].myvalue.value = "Hello, World"
43
- ### get/set/incr/decr float value...
44
- @x[:x].mycounter.value = 1.2345
45
- ### get/set key/value pairs...
46
- @x[:x].myhash[:key] = "Value"
47
- ### sort keys by score...
48
- #### set
49
- @x[:x].mysortedset["my other key"] = 9.8
50
- #### poke/get
51
- @x[:x].mysortedset.poke "my key", @x[:x].mysortedset["my other key"]
52
- #### by high score
53
- @x[:x].mysortedset.value { |i, e| ap %[Sorted Sets: i: #{i} e: #{e}] }
54
- ### collect keys...
55
- @x[:x].myset << "my member"
56
- @x[:x].myset << "my new member"
57
- #### filter by regexp...
58
- h = @x[:x].myset[/ new /]
59
- puts %[Filtered set members:]
60
- ap h
61
- #### each collection key....
62
- @x[:x].myset.value { |i, e| puts %[Sets: i: #{i} e: #{e}] }
63
- ### points by coordinates...
64
- @x[:x].myplace.add "Palermo", 13.361389, 38.115556
65
- @x[:x].myplace.add "Catania", 15.087269, 37.502669
66
- #### distance between points.
67
- distance = @x[:x].myplace.distance "Palermo", "Catania"
68
- ap %[The meters between the points: #{distance}]
69
- #### places within radius by coordinates
70
- places = @x[:x].myplace.radius 15.087269, 37.502669, 5000
71
- ap %[The places within 5000 meters of the coordinates: #{places}]
72
- puts %[Place Values...]
73
- #### collection of places...
74
- @x[:x].myplace.value { |i, e| puts %[Places: i: #{i} e: #{e}] }
75
- ap VK['*']
76
-
77
- ## Or as a collection of "X"s...
78
- module X
79
- @@X = Hash.new { |h,k| h[k] = Ex.new(k) }
80
- class Ex
81
- include VK
82
- set :stuff
83
- pipe :ear
84
- def initialize k
85
- @id = k
86
- end
87
- end
88
- def self.keys
89
- @@X.keys
90
- end
91
- def self.[] k
92
- if !@@X.has_key?(k)
93
- @@X[k].ear.on { |msg| puts "MSG[#{k}]:"; ap msg }
94
- end
95
- @@X[k]
96
- end
97
- end
98
-
99
- @x[:a] = X['Aaa']
100
- @x[:b] = X['Bbb']
101
- @x[:c] = X['Ccc']
data/module.rb~ DELETED
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'valkey/objects'
4
-
5
- # Using ValKey Objects
6
- ## Create your class object
7
- class ValKey
8
- # 1. include valkey-objects layer
9
- include VK
10
- # 2. stitch your object together.
11
- value :myvalue
12
- counter :mycounter
13
- hashkey :myhash
14
- sortedset :mysortedset
15
- set :myset
16
- queue :myqueue
17
- place :myplace
18
- pipe :mypipe
19
- toggle :mytoggle
20
- # 3. define @id in initialize.
21
- def initialize k
22
- @id = k
23
- end
24
- # other stuff...
25
- end
26
-
27
-
28
-
29
- require 'awesome_print'
30
-
31
- @x = {}
32
-
33
- ## Or as a collection of "X"s...
34
- module X
35
- @@X = Hash.new { |h,k| h[k] = Ex.new(k) }
36
- class Ex
37
- include VK
38
- set :stuff
39
- pipe :ear
40
- def initialize k
41
- @id = k
42
- end
43
- end
44
- def self.keys
45
- @@X.keys
46
- end
47
- def self.[] k
48
- if !@@X.has_key?(k)
49
- @@X[k].ear.on { |msg| puts "MSG[#{k}]:"; ap msg }
50
- end
51
- @@X[k]
52
- end
53
- end
54
-
55
- X['Aaa'].ear << %[A]
56
- X['Bbb'].ear << %[B]
57
- X['Ccc'].ear << %[C]
Binary file
Binary file