em-redislite 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,7 @@
1
+ == 0.2.0 (2012-04-08)
2
+
3
+ * Rewrite to include methods for most redis commands.
4
+
5
+ == 0.1.2 (2011-06-21)
6
+
7
+ * Added Client#error?
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # Redis Lite
2
+
3
+ Eventmachine based adapter that talks redis 2.0 protocol
4
+
5
+ ## Installation
6
+
7
+ gem install em-redislite
8
+
9
+ ## Dependencies
10
+
11
+ * Ruby >= 1.9.1
12
+ * eventmachine
13
+ * em-synchrony (optional)
14
+
15
+ ## Unsupported commands
16
+
17
+ * Pub/Sub
18
+ * Scripting
19
+ * Server
20
+
21
+ ## Example
22
+
23
+ ### Using callbacks
24
+
25
+ ```ruby
26
+ require 'em-redislite'
27
+
28
+ EM.run do
29
+ # defaults to { host: '127.0.0.1', port: 6379 }
30
+ client = EM::Redis.connect
31
+ client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
32
+
33
+ r = client.set "mykey", "myvalue"
34
+ r.callback {|value| p value }
35
+ r.errback {|error| p error }
36
+
37
+ r = client.get "mykey"
38
+ r.callback {|value| p value }
39
+ r.errback {|error| p error }
40
+ end
41
+ ```
42
+ ### Using em-synchrony
43
+
44
+ ```ruby
45
+ require 'em-redislite'
46
+ require 'em/redis-synchrony'
47
+
48
+ EM.run do
49
+ EM.synchrony do
50
+ client = EM::Redis.connect
51
+ client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
52
+
53
+ p client.set "mykey", "myvalue"
54
+ p client.get "mykey"
55
+ EM.stop
56
+ end
57
+ end
58
+ ```
59
+
60
+ ## License
61
+ [Creative Commons Attribution - CC BY](http://creativecommons.org/licenses/by/3.0)
@@ -0,0 +1,21 @@
1
+ require 'em-synchrony'
2
+ require 'em-redislite'
3
+
4
+ module EM
5
+ module Redis
6
+ class Client < Connection
7
+ def command name, *args
8
+ EM::Synchrony.sync send_command(name, *args)
9
+ end
10
+
11
+ def send_command name, *args
12
+ defer = DefaultDeferrable.new
13
+ @pool << defer
14
+ send_data "*#{args.length + 1}\r\n" +
15
+ "$#{name.length}\r\n#{name}\r\n" +
16
+ args.map(&:to_s).inject('') {|a,v| a + "$#{v.bytesize}\r\n#{v}\r\n"}
17
+ defer
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/em/redis.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  require 'eventmachine'
2
+
2
3
  module EM
3
4
  module Redis
4
- class Error < StandardError; end
5
5
 
6
+ VERSION = '0.2.0'
6
7
  DEFAULTS = { host: '127.0.0.1', port: 6379 }
7
8
 
9
+ class Error < StandardError; end
10
+
8
11
  def self.connect options = {}
9
12
  options = DEFAULTS.merge(options)
10
13
  begin
@@ -56,7 +59,7 @@ module EM
56
59
  EM.reconnect @options[:host], @options[:port], self
57
60
  end
58
61
 
59
- def unbind msg = 'lost connection'
62
+ def unbind msg = 'lost db connection'
60
63
  error = Error.new(msg)
61
64
  @pool.each {|r| r.fail(error) }
62
65
  @pool = []
@@ -101,6 +104,20 @@ module EM
101
104
 
102
105
  process_bytes(nil) if @want_bytes < 0
103
106
  end
107
+
108
+ COMMANDS = %w(
109
+ APPEND AUTH BLPOP BRPOP BRPOPLPUSH DECR DECRBY DEL DISCARD DUMP ECHO EXEC EXISTS EXPIRE EXPIREAT
110
+ GET GETBIT GETRANGE GETSET HDEL HEXISTS HGET HGETALL HINCRBY HINCRBYFLOAT HKEYS HLEN HMGET HMSET
111
+ HSET HSETNX HVALS INCR INCRBY INCRBYFLOAT KEYS LINDEX LINSERT LLEN LPOP LPUSH LPUSHX LRANGE LREM
112
+ LSET LTRIM MGET MIGRATE MOVE MSET MSETNX MULTI OBJECT PERSIST PEXPIRE PEXPIREAT PING PSETEX PTTL
113
+ QUIT RANDOMKEY RENAME RENAMENX RESTORE RPOP RPOPLPUSH RPUSH RPUSHX SADD SCARD SDIFF SDIFFSTORE
114
+ SELECT SET SETBIT SETEX SETNX SETRANGE SINTER SINTERSTORE SISMEMBER SMEMBERS SMOVE SORT SPOP
115
+ SRANDMEMBER SREM STRLEN SUNION SUNIONSTORE TTL TYPE UNWATCH WATCH ZADD ZCARD ZCOUNT ZINCRBY
116
+ ZINTERSTORE ZRANGE ZRANGEBYSCORE ZRANK ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZREVRANGE
117
+ ZREVRANGEBYSCORE ZREVRANK ZSCORE ZUNIONSTORE
118
+ ).freeze
119
+
120
+ COMMANDS.each {|name| send(:define_method, name.downcase) {|*args| command(name, *args) }}
104
121
  end # Client
105
122
  end # Redis
106
123
  end # EM
data/lib/em-redislite.rb CHANGED
@@ -1,2 +1 @@
1
1
  require_relative 'em/redis'
2
- require_relative 'em/redis/sugar'
@@ -1,5 +1,5 @@
1
- require 'minitest/spec'
2
- require_relative '../lib/em-redislite'
1
+ require 'minitest/autorun'
2
+ require 'em-redislite'
3
3
 
4
4
  class MiniTest::Unit::TestCase
5
5
  def em_run &block
@@ -11,5 +11,3 @@ class MiniTest::Unit::TestCase
11
11
  end
12
12
  end
13
13
  end
14
-
15
- MiniTest::Unit.autorun
@@ -4,8 +4,8 @@ describe 'Command Expire' do
4
4
  it 'should support set with expiry' do
5
5
  @success = false
6
6
  em_run do |client|
7
- r = client.set 'mykey', 'foobar', 1
8
- r = client.get 'mykey'
7
+ r = client.setex 'mykey', 1, 'foobar'
8
+ r = client.get 'mykey'
9
9
  r.callback do |value|
10
10
  EM.stop unless value == 'foobar'
11
11
  EM.add_timer(2) do
File without changes
File without changes
metadata CHANGED
@@ -1,84 +1,86 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: em-redislite
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 2
9
- version: 0.1.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Bharanee Rathna
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-06-21 00:00:00 +10:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: eventmachine
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
31
22
  type: :runtime
32
- version_requirements: *id001
33
- description: A very simple EventMachine based adapter that talks Redis protocol
34
- email: deepfryed@gmail.com
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: EventMachine based Redis client
47
+ email:
48
+ - deepfryed@gmail.com
35
49
  executables: []
36
-
37
50
  extensions: []
38
-
39
51
  extra_rdoc_files: []
40
-
41
- files:
42
- - README.rdoc
43
- - em-redislite.gemspec
44
- - lib/em-redislite.rb
45
- - lib/em/redis/sugar.rb
52
+ files:
53
+ - test/test_connection.rb
54
+ - test/test_commands.rb
55
+ - test/helper.rb
56
+ - test/test_command_expire.rb
46
57
  - lib/em/redis.rb
47
- - tests/helper.rb
48
- - tests/test_command_expire.rb
49
- - tests/test_commands.rb
50
- - tests/test_connection.rb
51
- has_rdoc: true
58
+ - lib/em/redis-synchrony.rb
59
+ - lib/em-redislite.rb
60
+ - README.md
61
+ - CHANGELOG
52
62
  homepage: http://github.com/deepfryed/em-redislite
53
63
  licenses: []
54
-
55
64
  post_install_message:
56
65
  rdoc_options: []
57
-
58
- require_paths:
66
+ require_paths:
59
67
  - lib
60
- required_ruby_version: !ruby/object:Gem::Requirement
68
+ required_ruby_version: !ruby/object:Gem::Requirement
61
69
  none: false
62
- requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- segments:
66
- - 0
67
- version: "0"
68
- required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
75
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- segments:
74
- - 0
75
- version: "0"
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
76
80
  requirements: []
77
-
78
81
  rubyforge_project:
79
- rubygems_version: 1.3.7
82
+ rubygems_version: 1.8.21
80
83
  signing_key:
81
84
  specification_version: 3
82
- summary: A lightweight EM based Redis adapter
85
+ summary: A lite version of EM::Redis
83
86
  test_files: []
84
-
data/README.rdoc DELETED
@@ -1,42 +0,0 @@
1
- = Redis Lite
2
-
3
- Eventmachine based adapter that talks redis 2.0 protocol
4
-
5
- == Installation
6
-
7
- gem install em-redislite
8
-
9
- === Dependencies
10
-
11
- * Ruby >= 1.9.1
12
- * eventmachine
13
-
14
- == Usage
15
-
16
- require 'em/redislite'
17
-
18
- EM.run do
19
- client = EM::Redis.connect # defaults to { host: '127.0.0.1', port: 6379 }
20
- client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
21
-
22
- r = client.command :get, "mykey"
23
- r.callback {|value| p value }
24
- r.errback {|error| p error }
25
-
26
- # syntactic sugar for string and boolean commands
27
- r = client.get "mykey"
28
- r = client.set "mykey", "some value", 1800 # ttl
29
-
30
- # you should be running redis in a private network or have it firewalled but ...
31
- r = client.command :auth, "my super dooper password" # should work as well
32
- end
33
-
34
- == Testing
35
-
36
- There are no tests at the moment coz I'm a lazy slob.
37
-
38
- == License
39
-
40
- GNU GPLv3, so its free and comes with no guarantees. If it brings down your website or burns down your house, I will
41
- not be held responsible. Use it at your own risk. You can read all about GNU here: http://www.gnu.org and
42
- GNU GPLv3 here: http://www.gnu.org/licenses/gpl.txt.
data/em-redislite.gemspec DELETED
@@ -1,16 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = %q{em-redislite}
5
- s.version = '0.1.2'
6
- s.summary = 'A lightweight EM based Redis adapter'
7
- s.description = 'A very simple EventMachine based adapter that talks Redis protocol'
8
- s.authors = [ 'Bharanee Rathna' ]
9
- s.email = %q{deepfryed@gmail.com}
10
- s.homepage = %q{http://github.com/deepfryed/em-redislite}
11
- s.files = %w(README.rdoc em-redislite.gemspec) + Dir.glob("{lib,tests}/**/*")
12
- s.require_paths = %w(lib)
13
- s.platform = Gem::Platform::RUBY
14
-
15
- s.add_dependency('eventmachine')
16
- end
@@ -1,34 +0,0 @@
1
- class EM::Redis::Client
2
- COMMANDS = {
3
- string: %w(get strlen getset setnx setex setbit getbit mset msetnx mget incr incrby decr decrby
4
- append setrange getrange),
5
- boolean: %w(exists del type keys randomkey rename renamenx dbsize expire persist ttl select move
6
- flushdb flushall),
7
- }.freeze
8
-
9
- COMMANDS[:string].each {|c| send(:define_method, c) {|*args| command(c, *args) }}
10
- COMMANDS[:boolean].each {|c| send(:define_method, c) {|*args|
11
- defer = EM::DefaultDeferrable.new
12
- req = command(c, *args)
13
- req.callback {|r| defer.succeed(r == '1') }
14
- req.errback {|e| defer.fail(e) }
15
- defer
16
- }}
17
-
18
- # set here is special since it combines :set and optional :expire
19
- def set key, value, ttl = nil
20
- if ttl
21
- defer = EM::DefaultDeferrable.new
22
- req = command(:set, key, value)
23
- req.callback do
24
- req = command(:expire, key, ttl)
25
- req.callback {|r| defer.succeed(r == '1') }
26
- req.errback {|e| defer.fail(e) }
27
- end
28
- req.errback {|e| defer.fail(e) }
29
- defer
30
- else
31
- command(:set, key, value)
32
- end
33
- end
34
- end