keymap 0.3.0 → 0.3.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.
- data/Rakefile +3 -46
- data/keymap.gemspec +1 -1
- data/lib/keymap/connection_adapters/abstract/data_management.rb +7 -3
- data/lib/keymap/connection_adapters/redis_adapter.rb +118 -116
- data/lib/keymap/version.rb +1 -1
- data/tasks/rdoc.rb +19 -0
- data/tasks/stats.rb +24 -0
- metadata +8 -4
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake'
|
|
5
5
|
require 'rake/clean'
|
6
6
|
require 'rake/testtask'
|
7
7
|
require 'rake/packagetask'
|
8
|
-
|
8
|
+
|
9
9
|
require 'bundler'
|
10
10
|
require 'bundler/gem_tasks'
|
11
11
|
|
@@ -16,8 +16,6 @@ Bundler::GemHelper.install_tasks
|
|
16
16
|
|
17
17
|
load 'keymap.gemspec'
|
18
18
|
|
19
|
-
Dir['tasks/**/*.rb'].each { |file| load file }
|
20
|
-
|
21
19
|
GEM_NAME = "keymap"
|
22
20
|
GEM_VERSION = Keymap::VERSION
|
23
21
|
|
@@ -25,6 +23,8 @@ CLEAN.include('doc/ri')
|
|
25
23
|
CLEAN.include('doc/site')
|
26
24
|
CLEAN.include('pkg')
|
27
25
|
|
26
|
+
Dir['tasks/**/*.rb'].each { |file| load file }
|
27
|
+
|
28
28
|
task :default => :spec
|
29
29
|
|
30
30
|
desc "Push gem packages"
|
@@ -85,46 +85,3 @@ namespace :redis do
|
|
85
85
|
|
86
86
|
task :restart_server => [:stop_server, :start_server]
|
87
87
|
end
|
88
|
-
|
89
|
-
desc "Prints lines of code metrics"
|
90
|
-
task :lines do
|
91
|
-
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
|
92
|
-
|
93
|
-
FileList["lib/keymap/**/*.rb"].each { |file_name|
|
94
|
-
next if file_name =~ /vendor/
|
95
|
-
f = File.open(file_name)
|
96
|
-
|
97
|
-
while (line = f.gets)
|
98
|
-
lines += 1
|
99
|
-
next if line =~ /^\s*$/
|
100
|
-
next if line =~ /^\s*#/
|
101
|
-
codelines += 1
|
102
|
-
end
|
103
|
-
puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
|
104
|
-
|
105
|
-
total_lines += lines
|
106
|
-
total_codelines += codelines
|
107
|
-
|
108
|
-
lines, codelines = 0, 0
|
109
|
-
}
|
110
|
-
|
111
|
-
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
|
112
|
-
end
|
113
|
-
|
114
|
-
RDOC_FILES = FileList['README.rdoc', 'lib/**/*.rb']
|
115
|
-
|
116
|
-
require 'rdoc/task'
|
117
|
-
Rake::RDocTask.new do |rdoc|
|
118
|
-
rdoc.title = "#{GEM_NAME} #{GEM_VERSION}"
|
119
|
-
rdoc.main = 'README.rdoc'
|
120
|
-
rdoc.rdoc_dir = 'doc/site/api'
|
121
|
-
rdoc.options << "-a" << "-U" << "-D" << "-v"
|
122
|
-
rdoc.rdoc_files.include(RDOC_FILES)
|
123
|
-
end
|
124
|
-
|
125
|
-
Rake::RDocTask.new(:ri) do |rdoc|
|
126
|
-
rdoc.main = "README.rdoc"
|
127
|
-
rdoc.rdoc_dir = "doc/ri"
|
128
|
-
rdoc.options << "--ri-system"
|
129
|
-
rdoc.rdoc_files.include(RDOC_FILES)
|
130
|
-
end
|
data/keymap.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = 'buck.robert.j@gmail.com'
|
11
11
|
spec.description = 'Helping Ruby developers and their companies, unlock their key-value store data, through associative and sequential based access, providing unprecedented support for map reduce behaviors, native to the Ruby language'
|
12
12
|
spec.summary = 'Abstracts choosing a key-value store implementation, and provides a natural enumerable-based Ruby API for hashed and sequential collections.'
|
13
|
-
spec.homepage = '
|
13
|
+
spec.homepage = 'http://rbuck.github.com/keymap/'
|
14
14
|
|
15
15
|
spec.files = `git ls-files`.split($/)
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -82,166 +82,168 @@ module Keymap
|
|
82
82
|
# todo idea: add an optional argument where we specify the data type for elements in the collection
|
83
83
|
RedisList.new(raw_connection, id)
|
84
84
|
end
|
85
|
-
end
|
86
85
|
|
87
|
-
|
86
|
+
private
|
88
87
|
|
89
|
-
|
88
|
+
class RedisHash
|
90
89
|
|
91
|
-
|
90
|
+
include Enumerable
|
92
91
|
|
93
|
-
|
92
|
+
attr_reader :connection, :id, :sentinel
|
94
93
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
94
|
+
# n.b. nil gets represented as an empty string by redis, so the two are
|
95
|
+
# in effect identical keys.
|
96
|
+
def initialize(connection, id, sentinel=nil)
|
97
|
+
@connection = connection
|
98
|
+
@id = id
|
99
|
+
@sentinel = sentinel
|
100
|
+
self[sentinel] = sentinel
|
101
|
+
end
|
103
102
|
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
def empty?
|
104
|
+
connection.hlen id == 1
|
105
|
+
end
|
107
106
|
|
108
|
-
|
109
|
-
|
110
|
-
|
107
|
+
def [](key)
|
108
|
+
connection.hget id, key
|
109
|
+
end
|
111
110
|
|
112
|
-
|
113
|
-
|
114
|
-
|
111
|
+
def []=(key, value)
|
112
|
+
connection.hset id, key, value
|
113
|
+
end
|
115
114
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
115
|
+
def each
|
116
|
+
if block_given?
|
117
|
+
hash_keys.each { |key| yield [key, self[key]] unless key == sentinel }
|
118
|
+
else
|
119
|
+
::Enumerable::Enumerator.new(self, :each)
|
120
|
+
end
|
121
121
|
end
|
122
|
-
end
|
123
122
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
123
|
+
def each_pair
|
124
|
+
if block_given?
|
125
|
+
hash_keys.each { |key| yield key, self[key] unless key == sentinel }
|
126
|
+
else
|
127
|
+
::Enumerable::Enumerator.new(self, :each_pair)
|
128
|
+
end
|
129
129
|
end
|
130
|
-
end
|
131
130
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
131
|
+
def each_value
|
132
|
+
if block_given?
|
133
|
+
hash_keys.each { |key| yield self[key] unless key == sentinel }
|
134
|
+
else
|
135
|
+
::Enumerable::Enumerator.new(self, :each_value)
|
136
|
+
end
|
137
137
|
end
|
138
|
-
end
|
139
138
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
139
|
+
def delete(key)
|
140
|
+
value = self[key]
|
141
|
+
connection.hdel id, key
|
142
|
+
value
|
143
|
+
end
|
145
144
|
|
146
|
-
|
147
|
-
|
148
|
-
|
145
|
+
def merge!(hash)
|
146
|
+
hash.each do |key, value|
|
147
|
+
self[key] = value
|
148
|
+
end
|
149
|
+
self
|
149
150
|
end
|
150
|
-
self
|
151
|
-
end
|
152
151
|
|
153
|
-
|
152
|
+
alias merge merge!
|
154
153
|
|
155
|
-
|
154
|
+
private
|
156
155
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
156
|
+
def hash_keys
|
157
|
+
keys = connection.hkeys id
|
158
|
+
keys.delete sentinel
|
159
|
+
keys.delete ''
|
160
|
+
keys
|
161
|
+
end
|
162
162
|
end
|
163
|
-
end
|
164
163
|
|
165
|
-
|
164
|
+
class RedisList
|
166
165
|
|
167
|
-
|
166
|
+
include Enumerable
|
168
167
|
|
169
|
-
|
168
|
+
attr_reader :connection, :id
|
170
169
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
170
|
+
def initialize(connection, id, sentinel=nil)
|
171
|
+
@connection = connection
|
172
|
+
@id = id
|
173
|
+
self << sentinel # sentinel to force creation of an "empty list"
|
174
|
+
end
|
176
175
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
176
|
+
def each
|
177
|
+
if block_given?
|
178
|
+
step_size = 100
|
179
|
+
(0..length % step_size).step(step_size) do |step|
|
180
|
+
first = step_size * step
|
181
|
+
last = first + step_size
|
182
|
+
list = connection.lrange id, first + 1, last
|
183
|
+
list.each do |item|
|
184
|
+
yield item
|
185
|
+
end
|
186
186
|
end
|
187
|
+
else
|
188
|
+
::Enumerable::Enumerator.new(self, :each)
|
187
189
|
end
|
188
|
-
else
|
189
|
-
::Enumerable::Enumerator.new(self, :each)
|
190
190
|
end
|
191
|
-
end
|
192
191
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
192
|
+
def <<(value)
|
193
|
+
connection.rpush id, value
|
194
|
+
self
|
195
|
+
end
|
197
196
|
|
198
|
-
|
197
|
+
alias :push :<<
|
199
198
|
|
200
|
-
|
201
|
-
|
202
|
-
|
199
|
+
def [](index)
|
200
|
+
connection.lindex id, index + 1
|
201
|
+
end
|
203
202
|
|
204
|
-
|
205
|
-
|
206
|
-
|
203
|
+
def []=(index, value)
|
204
|
+
connection.lset id, index + 1, value
|
205
|
+
end
|
207
206
|
|
208
|
-
|
209
|
-
|
210
|
-
|
207
|
+
def concat(array)
|
208
|
+
array.each do |entry|
|
209
|
+
self << entry
|
210
|
+
end
|
211
|
+
self
|
211
212
|
end
|
212
|
-
self
|
213
|
-
end
|
214
213
|
|
215
|
-
|
216
|
-
|
217
|
-
|
214
|
+
def length
|
215
|
+
connection.llen(id) -1
|
216
|
+
end
|
218
217
|
|
219
|
-
|
218
|
+
alias size length
|
220
219
|
|
221
|
-
|
222
|
-
|
223
|
-
|
220
|
+
def empty?()
|
221
|
+
length != 1
|
222
|
+
end
|
224
223
|
|
225
|
-
|
226
|
-
|
227
|
-
|
224
|
+
def pop()
|
225
|
+
connection.rpop id unless length == 0
|
226
|
+
end
|
228
227
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
228
|
+
def delete(value)
|
229
|
+
value = connection.lrem(id, 0, value) == 0 ? nil : value
|
230
|
+
yield value if block_given?
|
231
|
+
value
|
232
|
+
end
|
234
233
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
234
|
+
def delete_if
|
235
|
+
if block_given?
|
236
|
+
each do |value|
|
237
|
+
delete(value) if yield(value)
|
238
|
+
end
|
239
|
+
self
|
240
|
+
else
|
241
|
+
nil
|
239
242
|
end
|
240
|
-
self
|
241
|
-
else
|
242
|
-
nil
|
243
243
|
end
|
244
|
+
|
244
245
|
end
|
246
|
+
|
245
247
|
end
|
246
248
|
|
247
249
|
end
|
data/lib/keymap/version.rb
CHANGED
data/tasks/rdoc.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rdoc/task'
|
2
|
+
|
3
|
+
RDOC_FILES = FileList['README.rdoc', 'lib/**/*.rb']
|
4
|
+
|
5
|
+
require 'rdoc/task'
|
6
|
+
Rake::RDocTask.new do |rdoc|
|
7
|
+
rdoc.title = "#{GEM_NAME} #{GEM_VERSION}"
|
8
|
+
rdoc.main = 'README.rdoc'
|
9
|
+
rdoc.rdoc_dir = 'doc/site/api'
|
10
|
+
rdoc.options << "-a" << "-U" << "-D" << "-v"
|
11
|
+
rdoc.rdoc_files.include(RDOC_FILES)
|
12
|
+
end
|
13
|
+
|
14
|
+
Rake::RDocTask.new(:ri) do |rdoc|
|
15
|
+
rdoc.main = "README.rdoc"
|
16
|
+
rdoc.rdoc_dir = "doc/ri"
|
17
|
+
rdoc.options << "--ri-system"
|
18
|
+
rdoc.rdoc_files.include(RDOC_FILES)
|
19
|
+
end
|
data/tasks/stats.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
desc "Prints lines of code metrics"
|
2
|
+
task :stats do
|
3
|
+
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
|
4
|
+
|
5
|
+
FileList["lib/keymap/**/*.rb"].each { |file_name|
|
6
|
+
next if file_name =~ /vendor/
|
7
|
+
f = File.open(file_name)
|
8
|
+
|
9
|
+
while (line = f.gets)
|
10
|
+
lines += 1
|
11
|
+
next if line =~ /^\s*$/
|
12
|
+
next if line =~ /^\s*#/
|
13
|
+
codelines += 1
|
14
|
+
end
|
15
|
+
puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
|
16
|
+
|
17
|
+
total_lines += lines
|
18
|
+
total_codelines += codelines
|
19
|
+
|
20
|
+
lines, codelines = 0, 0
|
21
|
+
}
|
22
|
+
|
23
|
+
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keymap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: erubis
|
@@ -243,8 +243,10 @@ files:
|
|
243
243
|
- spec/support/config.yml
|
244
244
|
- spec/support/connection.rb
|
245
245
|
- spec/unit/.gitignore
|
246
|
+
- tasks/rdoc.rb
|
246
247
|
- tasks/rspec.rb
|
247
|
-
|
248
|
+
- tasks/stats.rb
|
249
|
+
homepage: http://rbuck.github.com/keymap/
|
248
250
|
licenses: []
|
249
251
|
post_install_message:
|
250
252
|
rdoc_options: []
|
@@ -264,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
264
266
|
version: '0'
|
265
267
|
requirements: []
|
266
268
|
rubyforge_project:
|
267
|
-
rubygems_version: 1.8.
|
269
|
+
rubygems_version: 1.8.23
|
268
270
|
signing_key:
|
269
271
|
specification_version: 3
|
270
272
|
summary: Abstracts choosing a key-value store implementation, and provides a natural
|
@@ -283,4 +285,6 @@ test_files:
|
|
283
285
|
- spec/support/config.yml
|
284
286
|
- spec/support/connection.rb
|
285
287
|
- spec/unit/.gitignore
|
288
|
+
- tasks/rdoc.rb
|
286
289
|
- tasks/rspec.rb
|
290
|
+
- tasks/stats.rb
|