rdkit 0.0.1 → 0.1.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/Gemfile +10 -1
  4. data/Gemfile.ci +13 -0
  5. data/Guardfile +40 -0
  6. data/README.md +282 -6
  7. data/Vagrantfile +13 -0
  8. data/example/blocking.rb +10 -0
  9. data/example/blocking/command_runner.rb +28 -0
  10. data/example/blocking/core.rb +24 -0
  11. data/example/blocking/server.rb +10 -0
  12. data/example/blocking/version.rb +3 -0
  13. data/example/callbacks.rb +9 -0
  14. data/example/callbacks/command_runner.rb +21 -0
  15. data/example/callbacks/core.rb +18 -0
  16. data/example/callbacks/server.rb +30 -0
  17. data/example/counter.rb +0 -2
  18. data/example/counter/command_runner.rb +4 -0
  19. data/example/counter/core.rb +4 -0
  20. data/example/http.rb +9 -0
  21. data/example/http/core.rb +18 -0
  22. data/example/http/responder.rb +7 -0
  23. data/example/http/server.rb +19 -0
  24. data/lib/rdkit.rb +20 -3
  25. data/lib/rdkit/callbacks.rb +10 -0
  26. data/lib/rdkit/client.rb +157 -0
  27. data/lib/rdkit/configuration.rb +31 -0
  28. data/lib/rdkit/core.rb +2 -4
  29. data/lib/rdkit/core_ext.rb +7 -0
  30. data/lib/rdkit/db.rb +257 -0
  31. data/lib/rdkit/db_commands.rb +182 -0
  32. data/lib/rdkit/errors.rb +32 -1
  33. data/lib/rdkit/http_parser.rb +56 -0
  34. data/lib/rdkit/http_responder.rb +74 -0
  35. data/lib/rdkit/introspection.rb +133 -21
  36. data/lib/rdkit/logger.rb +9 -4
  37. data/lib/rdkit/memory_monitoring.rb +29 -0
  38. data/lib/rdkit/notification_center.rb +21 -0
  39. data/lib/rdkit/rd_object.rb +69 -0
  40. data/lib/rdkit/resp.rb +9 -1
  41. data/lib/rdkit/{command_parser.rb → resp_parser.rb} +6 -18
  42. data/lib/rdkit/resp_responder.rb +105 -0
  43. data/lib/rdkit/server.rb +242 -86
  44. data/lib/rdkit/simple_commands.rb +17 -0
  45. data/lib/rdkit/slow_log.rb +52 -0
  46. data/lib/rdkit/subcommands.rb +157 -0
  47. data/lib/rdkit/version.rb +1 -1
  48. data/rdkit.gemspec +6 -0
  49. metadata +119 -5
  50. data/lib/rdkit/inheritable.rb +0 -15
  51. data/lib/rdkit/resp_runner.rb +0 -46
@@ -0,0 +1,31 @@
1
+ module RDKit
2
+ class Configuration
3
+ attr_reader :config
4
+
5
+ def initialize
6
+ @config = {}
7
+ end
8
+
9
+ module ClassMethods
10
+ @@instance = Configuration.new
11
+
12
+ def reset
13
+ @@instance = Configuration.new
14
+ end
15
+
16
+ def get(key)
17
+ @@instance.config[key]
18
+ end
19
+
20
+ def get_i(key)
21
+ @@instance.config[key] ? @@instance.config[key].to_i : -1
22
+ end
23
+
24
+ def set(key, value)
25
+ @@instance.config[key] = value
26
+ end
27
+ end
28
+
29
+ class << self; include ClassMethods; end
30
+ end
31
+ end
data/lib/rdkit/core.rb CHANGED
@@ -1,13 +1,11 @@
1
1
  module RDKit
2
2
  class Core
3
- include Inheritable
4
-
5
3
  def tick!
6
4
  raise ShouldOverrideError
7
5
  end
8
6
 
9
- def introspection
10
- raise ShouldOverrideError
7
+ def server
8
+ Server.instance
11
9
  end
12
10
  end
13
11
  end
@@ -0,0 +1,7 @@
1
+ class Object
2
+ unless self.respond_to?(:try)
3
+ def try(method, *args)
4
+ __send__(method, *args) rescue nil
5
+ end
6
+ end
7
+ end
data/lib/rdkit/db.rb ADDED
@@ -0,0 +1,257 @@
1
+ module RDKit
2
+ class DB
3
+ attr_reader :index
4
+
5
+ def initialize(index=0)
6
+ @index = index
7
+
8
+ flush!
9
+ end
10
+
11
+ def flush!
12
+ @objects = {}
13
+ end
14
+
15
+ module StringMethods
16
+ def get(key)
17
+ if object = get_typed_object(key, :string)
18
+ object.value
19
+ end
20
+ end
21
+
22
+ def set(key, value)
23
+ objects[key] = RDObject.string(value)
24
+ end
25
+
26
+ def getset(key, new_value)
27
+ objects[key].try(:value).tap { set(key, new_value) }
28
+ end
29
+
30
+ def setnx(key, value)
31
+ if objects[key]
32
+ false
33
+ else
34
+ set(key, value)
35
+ true
36
+ end
37
+ end
38
+ end
39
+ include StringMethods
40
+
41
+ module KeyMethods
42
+ def del(keys)
43
+ keys.select { |key| objects.delete(key) }.count
44
+ end
45
+
46
+ def filter_keys(pattern)
47
+ objects.keys
48
+ end
49
+
50
+ def exists?(key)
51
+ objects.include?(key)
52
+ end
53
+
54
+ def type(key)
55
+ objects[key].type.to_s rescue 'none'
56
+ end
57
+ end
58
+ include KeyMethods
59
+
60
+ module ListMethods
61
+ def lpush(key, elements)
62
+ if list = get_typed_object(key, :list)
63
+ list.unshift(*elements)
64
+
65
+ list.length
66
+ else
67
+ # key not exist
68
+ objects[key] = RDObject.list(elements)
69
+
70
+ objects[key].length
71
+ end
72
+ end
73
+
74
+ def llen(key)
75
+ if list = get_typed_object(key, :list)
76
+
77
+ list.length
78
+ else
79
+ 0
80
+ end
81
+ end
82
+
83
+ def lrange(key, start, stop)
84
+ if list = get_typed_object(key, :list)
85
+
86
+ list[start..stop]
87
+ else
88
+ []
89
+ end
90
+ end
91
+
92
+ def lpop(key)
93
+ if list = get_typed_object(key, :list)
94
+
95
+ result = list.shift
96
+
97
+ del([key]) if list.empty?
98
+
99
+ result
100
+ else
101
+ nil
102
+ end
103
+ end
104
+
105
+ def rpop(key)
106
+ if list = get_typed_object(key, :list)
107
+
108
+ result = list.pop
109
+
110
+ del([key]) if list.empty?
111
+
112
+ result
113
+ else
114
+ nil
115
+ end
116
+ end
117
+ end
118
+ include ListMethods
119
+
120
+ module SetMethods
121
+ def sadd(key, elements)
122
+ if set = get_typed_object(key, :set)
123
+ size0 = set.size
124
+
125
+ elements.each { |e| set.add(e) }
126
+
127
+ set.size - size0
128
+ else
129
+ objects[key] = RDObject.set(elements)
130
+
131
+ objects[key].size
132
+ end
133
+ end
134
+
135
+ def scard(key)
136
+ if set = get_typed_object(key, :set)
137
+
138
+ set.size
139
+ else
140
+ 0
141
+ end
142
+ end
143
+
144
+ def smembers(key)
145
+ if set = get_typed_object(key, :set)
146
+
147
+ set.to_a
148
+ else
149
+ []
150
+ end
151
+ end
152
+
153
+ def sismember(key, value)
154
+ if set = get_typed_object(key, :set)
155
+
156
+ set.include?(value) ? 1 : 0
157
+ else
158
+ 0
159
+ end
160
+ end
161
+
162
+ def srem(key, elements)
163
+ if set = get_typed_object(key, :set)
164
+ size0 = set.size
165
+
166
+ elements.each { |e| set.delete(e) }
167
+
168
+ size0 - set.size
169
+ else
170
+ 0
171
+ end
172
+ end
173
+ end
174
+ include SetMethods
175
+
176
+ module HashMethods
177
+ def hset(key, field, value)
178
+ if hash = get_typed_object(key, :hash)
179
+ existed = hash.has_key?(field) ? 0 : 1
180
+
181
+ hash[field] = value
182
+
183
+ existed
184
+ else
185
+ objects[key] = RDObject.create_hash(field, value)
186
+
187
+ 1
188
+ end
189
+ end
190
+
191
+ def hget(key, field)
192
+ if hash = get_typed_object(key, :hash)
193
+ hash[field]
194
+ end
195
+ end
196
+
197
+ def hexists?(key, field)
198
+ if hash = get_typed_object(key, :hash)
199
+ hash.has_key?(field)
200
+ else
201
+ false
202
+ end
203
+ end
204
+
205
+ def hlen(key)
206
+ if hash = get_typed_object(key, :hash)
207
+ hash.size
208
+ else
209
+ 0
210
+ end
211
+ end
212
+
213
+ def hdel(key, fields)
214
+ if hash = get_typed_object(key, :hash)
215
+ size0 = hash.size
216
+
217
+ fields.each { |f| hash.delete(f) }
218
+
219
+ size0 - hash.size
220
+ else
221
+ 0
222
+ end
223
+ end
224
+
225
+ def hkeys(key)
226
+ if hash = get_typed_object(key, :hash)
227
+ hash.keys
228
+ else
229
+ []
230
+ end
231
+ end
232
+
233
+ def hvals(key)
234
+ if hash = get_typed_object(key, :hash)
235
+ hash.values
236
+ else
237
+ []
238
+ end
239
+ end
240
+ end
241
+ include HashMethods
242
+
243
+ private
244
+
245
+ def objects
246
+ @objects
247
+ end
248
+
249
+ def get_typed_object(key, type)
250
+ if object = objects[key]
251
+ raise WrongTypeError unless object.type == type
252
+
253
+ object
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,182 @@
1
+ module RDKit
2
+ module DBCommands
3
+ def select(index)
4
+ raise InvalidDBIndexError unless (0..15).map(&:to_s).include?(index)
5
+
6
+ index = index.to_i
7
+
8
+ server.select_db!(index)
9
+
10
+ 'OK'
11
+ end
12
+
13
+ module StringCommands
14
+ def get(key)
15
+ db.get(key)
16
+ end
17
+
18
+ def set(key, value)
19
+ db.set(key, value)
20
+
21
+ 'OK'
22
+ end
23
+
24
+ def setnx(key, value)
25
+ db.setnx(key, value)
26
+ end
27
+
28
+ def getset(key, new_value)
29
+ db.getset(key, new_value)
30
+ end
31
+
32
+ def mget(key, *more_keys)
33
+ ([key] + more_keys).map { |k| db.get(k) rescue nil }
34
+ end
35
+
36
+ def mset(key, value, *more_pairs)
37
+ unless more_pairs.size % 2 == 0
38
+ raise WrongNumberOfArgumentError, "wrong number of arguments for 'mset' command"
39
+ end
40
+
41
+ db.set(key, value)
42
+ more_pairs.each_slice(2) { |key, value| db.set(key, value) }
43
+
44
+ 'OK'
45
+ end
46
+
47
+ def strlen(key)
48
+ if str = db.get(key)
49
+ str.bytesize
50
+ else
51
+ 0
52
+ end
53
+ end
54
+ end
55
+ include StringCommands
56
+
57
+ module ListCommands
58
+ def lpush(key, value, *more_values)
59
+ db.lpush(key, [value] + more_values)
60
+ end
61
+
62
+ def llen(key)
63
+ db.llen(key)
64
+ end
65
+
66
+ def lrange(key, start, stop)
67
+ db.lrange(key, start, stop)
68
+ end
69
+
70
+ def lpop(key)
71
+ db.lpop(key)
72
+ end
73
+
74
+ def rpop(key)
75
+ db.rpop(key)
76
+ end
77
+ end
78
+ include ListCommands
79
+
80
+ module SetCommands
81
+ def sadd(key, value, *more_values)
82
+ db.sadd(key, [value] + more_values)
83
+ end
84
+
85
+ def scard(key)
86
+ db.scard(key)
87
+ end
88
+
89
+ def smembers(key)
90
+ db.smembers(key)
91
+ end
92
+
93
+ def sismember(key, value)
94
+ db.sismember(key, value)
95
+ end
96
+
97
+ def srem(key, value, *more_values)
98
+ db.srem(key, [value] + more_values).tap { db.del([key]) if db.scard(key) == 0 }
99
+ end
100
+ end
101
+ include SetCommands
102
+
103
+ module HashCommands
104
+ def hset(key, field, value)
105
+ db.hset(key, field, value)
106
+ end
107
+
108
+ def hget(key, field)
109
+ db.hget(key, field)
110
+ end
111
+
112
+ def hexists(key, field)
113
+ db.hexists?(key, field)
114
+ end
115
+
116
+ def hlen(key)
117
+ db.hlen(key)
118
+ end
119
+
120
+ def hstrlen(key, field)
121
+ if str = db.hget(key, field)
122
+ str.bytesize
123
+ else
124
+ 0
125
+ end
126
+ end
127
+
128
+ def hdel(key, field, *more_fields)
129
+ db.hdel(key, [field] + more_fields).tap { db.del([key]) if db.hlen(key) == 0 }
130
+ end
131
+
132
+ def hkeys(key)
133
+ db.hkeys(key)
134
+ end
135
+
136
+ def hvals(key)
137
+ db.hvals(key)
138
+ end
139
+ end
140
+ include HashCommands
141
+
142
+ module KeyCommands
143
+ def del(key, *more_keys)
144
+ db.del(more_keys.unshift(key))
145
+ end
146
+
147
+ def keys(pattern)
148
+ db.filter_keys(pattern)
149
+ end
150
+
151
+ def exists(key)
152
+ db.exists?(key)
153
+ end
154
+
155
+ def type(key)
156
+ db.type(key)
157
+ end
158
+ end
159
+ include KeyCommands
160
+
161
+ module ServerCommands
162
+ def flushdb
163
+ server.flushdb!
164
+
165
+ 'OK'
166
+ end
167
+
168
+ def flushall
169
+ server.flushall!
170
+
171
+ 'OK'
172
+ end
173
+ end
174
+ include ServerCommands
175
+
176
+ private
177
+
178
+ def db
179
+ server.current_db
180
+ end
181
+ end
182
+ end