redis-classy 1.2.0 → 2.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 43bc9e17910f065ef35c2be995966f0714ce4ea1
4
+ data.tar.gz: b7499771aa9b2354c43ea346d8f3878297d66ab6
5
+ SHA512:
6
+ metadata.gz: 4b7491c74284bdddc17a8f47641813d608beb0dfdd4f02890e7cd79dcb04f51ba8a207cff3784ce09d4dfc3230039db945bf95b849e4b8e605051f503395e9de
7
+ data.tar.gz: 1614dd0aaee898bb35b74b2ccfc13d6ff866d01e8479edcdbe7c583ea68b955a2ffadbef83f3f2a953b9fbd75712a3c857f1bb4c47923d790aec3674cf1d5cc8
data/.travis.yml CHANGED
@@ -1,12 +1,9 @@
1
1
  language: ruby
2
+ services:
3
+ - redis-server
2
4
  rvm:
3
- - 1.8.7
4
- - 1.9.2
5
- - 1.9.3
6
- - jruby-18mode
7
- - jruby-19mode
8
- - rbx-18mode
9
- - rbx-19mode
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - rbx-2
10
8
  - ruby-head
11
9
  - jruby-head
12
- - ree
data/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ ## 2.0.0 2014-11-23
2
+
3
+ * New feature: `singletons` to support predefined keys
4
+ * New feature: `singleton` to deal with singleton data
5
+ * New feature: `on` as a syntactic sugar for `new`
6
+ * New feature: `multi`, `pipelined`, `exec` and `eval` are available as instance methods
7
+ * No redis commands are delegated at the class level. Always use instance methods or explicitly declare singleton.
8
+ * The base class `Redis::Classy` is now `RedisClassy`
9
+ * `Redis::Classy.db = Redis.new` is now `RedisClassy.redis = Redis.new`.
10
+
11
+ ## 1.1.1
12
+
13
+ * Raise exception when Redis::Classy.db is not assigned
14
+
15
+ ## 1.1.0
16
+
17
+ * Explicitly require all files
18
+
19
+ ## 1.0.1
20
+
21
+ * Relaxed version dependency on redis-namespace
22
+
23
+ ## 1.0.0
24
+
25
+ * Play nice with Mongoid
data/README.md CHANGED
@@ -1,43 +1,61 @@
1
- Redis Classy
2
- ============
1
+ # Redis Classy
3
2
 
4
3
  [![Build Status](https://secure.travis-ci.org/kenn/redis-classy.png)](http://travis-ci.org/kenn/redis-classy)
5
4
 
6
- Class-style namespace prefixing for Redis.
5
+ A very simple, class-based namespace prefixing and encapsulation for Redis. Key features include:
7
6
 
8
- With Redis Classy, class names become the prefix part of the Redis keys.
7
+ - Establishes a maintainable convention by prefixing keys with the class name (e.g. `YourClass:123`)
8
+ - Delegates all method calls to the [redis-rb](https://github.com/redis/redis-rb) within the namespace
9
+ - Adds a better abstraction layer around Redis objects and commands
10
+
11
+ Here's an example:
9
12
 
10
13
  ```ruby
11
- class Something < Redis::Classy
14
+ class Timer < RedisClassy
15
+ def start
16
+ pipelined do
17
+ set Time.now.to_i
18
+ expire 120.seconds
19
+ end
20
+ end
21
+
22
+ def stop
23
+ del
24
+ end
25
+
26
+ def running?
27
+ !!get
28
+ end
12
29
  end
13
30
 
14
- Something.set 'foo', 'bar' # equivalent of => redis.set 'Something:foo', 'bar'
15
- Something.get 'foo' # equivalent of => redis.get 'Something:foo'
16
- => "bar"
31
+ timer = Timer.new(123)
32
+ timer.start
33
+ timer.running?
34
+ => true
35
+
36
+ Timer.keys
37
+ => ["123"]
38
+ RedisClassy.keys
39
+ => ["Timer:123"]
17
40
  ```
18
41
 
19
- All methods are delegated to the `redis-namespace` gems.
42
+ The Timer class above is self-contained and more readable.
20
43
 
21
- This library contains only 30+ lines of code, yet powerful when you need better abstraction on Redis objects to keep things organized.
44
+ This library is made intentionally small, yet powerful when you need better abstraction on Redis objects to keep things organized.
22
45
 
23
- ### What's new:
46
+ ### UPGRADING FROM v1
24
47
 
25
- * v1.2.0: Raise NoMethodError when commands are not found in redis-rb.
26
- * v1.1.1: Raise exception when Redis::Classy.db is not assigned
27
- * v1.1.0: Explicitly require all files
28
- * v1.0.1: Relaxed version dependency on redis-namespace
29
- * v1.0.0: Play nice with Mongoid
48
+ [**An important message about upgrading from 1.x**](UPGRADING.md)
30
49
 
31
- Synopsis
32
- --------
50
+
51
+ ## redis-rb vs redis-namespace vs redis-classy
33
52
 
34
53
  With the vanilla `redis` gem, you've been doing this:
35
54
 
36
55
  ```ruby
37
56
  redis = Redis.new
38
57
  redis.set 'foo', 'bar'
39
- redis.get 'foo'
40
- => "bar"
58
+ redis.get 'foo' # => "bar"
41
59
  ```
42
60
 
43
61
  With the `redis-namespace` gem, you can add a prefix in the following manner:
@@ -45,31 +63,23 @@ With the `redis-namespace` gem, you can add a prefix in the following manner:
45
63
  ```ruby
46
64
  redis_ns = Redis::Namespace.new('ns', :redis => redis)
47
65
  redis_ns['foo'] = 'bar' # equivalent of => redis.set 'ns:foo', 'bar'
48
- redis_ns['foo'] # equivalent of => redis.get 'ns:foo'
49
- => "bar"
66
+ redis_ns['foo'] # => "bar"
50
67
  ```
51
68
 
52
- Now, with the `redis-classy` gem, you finally achieve a class-based encapsulation:
69
+ Now, with the `redis-classy` gem, you finally achieve a class-based naming convention:
53
70
 
54
71
  ```ruby
55
- class Something < Redis::Classy
72
+ class Something < RedisClassy
56
73
  end
57
74
 
58
- Something.set 'foo', 'bar' # equivalent of => redis.set 'Something:foo', 'bar'
59
- Something.get 'foo' # equivalent of => redis.get 'Something:foo'
60
- => "bar"
75
+ Something.on('foo').set('bar') # equivalent of => redis.set 'Something:foo', 'bar'
76
+ Something.on('foo').get # => "bar"
61
77
 
62
78
  something = Something.new('foo')
63
- something.set 'bar'
64
- something.get
65
- => "bar"
79
+ something.set 'bar' # equivalent of => redis.set 'Something:foo', 'bar'
80
+ something.get # => "bar"
66
81
  ```
67
82
 
68
- Install
69
- -------
70
-
71
- gem install redis-classy
72
-
73
83
  Usage
74
84
  -----
75
85
 
@@ -82,77 +92,84 @@ gem 'redis-classy'
82
92
  Register the Redis server: (e.g. in `config/initializers/redis_classy.rb` for Rails)
83
93
 
84
94
  ```ruby
85
- Redis::Classy.db = Redis.new(:host => 'localhost')
95
+ RedisClassy.redis = Redis.current
86
96
  ```
87
97
 
88
- Now you can write models that inherit `Redis::Classy`, automatically prefixing keys with its class name.
89
- You can use any Redis commands on the class, as they are eventually passed to the `redis` gem.
98
+ Create a class that inherits RedisClassy. (e.g. in `app/redis/cache.rb` for Rails, for auto- and eager-loading)
90
99
 
91
100
  ```ruby
92
- class UniqueUser < Redis::Classy
93
- def self.nuke
94
- self.keys.each{|key| self.del(key) }
101
+ class Cache < RedisClassy
102
+ def put(content)
103
+ pipelined do
104
+ set content
105
+ expire 5.seconds
106
+ end
95
107
  end
96
108
  end
97
109
 
98
- UniqueUser.sadd '2011-02-28', '123'
99
- UniqueUser.sadd '2011-02-28', '456'
100
- UniqueUser.sadd '2011-03-01', '789'
110
+ cache = Cache.new(123)
111
+ cache.put "This tape will self-destruct in five seconds. Good luck."
112
+ ```
113
+
114
+ Since the `on` method is added as a syntactic sugar for `new`, you can also run a command in one shot as well:
115
+
116
+ ```ruby
117
+ Cache.on(123).persist
118
+ ```
119
+
120
+ For convenience, singleton and predefined static keys are also supported.
121
+
122
+ ```ruby
123
+ class Counter < RedisClassy
124
+ singleton
125
+ end
126
+
127
+ Counter.incr # 'Counter:singleton' => '1'
128
+ Counter.incr # 'Counter:singleton' => '2'
129
+ Counter.get # => '2'
130
+ ```
101
131
 
102
- UniqueUser.smembers '2011-02-28'
103
- => ["123", "456"]
132
+ ``` ruby
133
+ class Stats < RedisClassy
134
+ singletons :median, :average
135
+ end
104
136
 
105
- UniqueUser.keys
106
- => ["2011-02-28", "2011-03-01"]
137
+ ages = [21,22,24,28,30]
107
138
 
108
- UniqueUser.nuke
109
- UniqueUser.keys
110
- => []
139
+ Stats.median.set ages[ages.size/2] # 'Stats:median' => '24'
140
+ Stats.average.set ages.inject(:+)/ages.size # 'Stats:average' => '25'
141
+ Stats.median.get # => '24'
142
+ Stats.average.get # => '25'
111
143
  ```
112
144
 
113
- In most cases you may be just fine with class methods, but by creating an instance with a key, even further binding is possible.
145
+ Finally, you can also pass an arbitrary object that responds to `id` as a key. This is useful when used in combination with ActiveRecord, etc.
114
146
 
115
147
  ```ruby
116
- class Counter < Redis::Classy
117
- def initialize(object)
118
- super("#{object.class.name}:#{object.id}")
119
- end
148
+ class Lock < RedisClassy
120
149
  end
121
150
 
122
151
  class Room < ActiveRecord::Base
123
152
  end
124
153
 
125
- @room = Room.create
154
+ room = Room.create
126
155
 
127
- counter = Counter.new(@room)
128
- counter.key
129
- => "Room:123"
130
-
131
- counter.incr
132
- counter.incr
133
- counter.get
134
- => "2"
156
+ lock = Lock.new(room)
135
157
  ```
136
158
 
137
- You also have access to the non-namespaced, raw Redis instance via `Redis::Classy`.
159
+ When you need an access to the non-namespaced, raw Redis keys, it's available as `RedisClass.keys`. Keep in mind that this method is very slow at O(N) computational complexity and potentially hazardous when you have many keys. [Read the details](http://redis.io/commands/keys).
138
160
 
139
161
  ```ruby
140
- Redis::Classy.keys
141
- => ["UniqueUser:2011-02-28", "UniqueUser:2011-03-01", "Counter:Room:123"]
142
-
143
- Redis::Classy.keys 'UniqueUser:*'
144
- => ["UniqueUser:2011-02-28", "UniqueUser:2011-03-01"]
162
+ RedisClassy.keys
163
+ => ["Stats:median", "Stats:average", "Counter"]
145
164
 
146
- Redis::Classy.multi do
147
- UniqueUser.sadd '2011-02-28', '123'
148
- UniqueUser.sadd '2011-02-28', '456'
149
- end
165
+ RedisClassy.keys 'Stats:*'
166
+ => ["Stats:median", "Stats:average"]
150
167
  ```
151
168
 
152
- Since the `db` attribute is a class instance variable, you can dynamically assign different databases for each class.
169
+ Since the `redis` attribute is a class instance variable, you can dynamically assign different databases for each class, without affecting other classes.
153
170
 
154
171
  ```ruby
155
- UniqueUser.db = Redis::Namespace.new('UniqueUser', :redis => Redis.new(:host => 'another.host'))
172
+ Cache.redis = Redis::Namespace.new('Cache', redis: Redis.new(host: 'another.host'))
156
173
  ```
157
174
 
158
175
  Unicorn support
@@ -162,11 +179,11 @@ If you run fork-based app servers such as **Unicorn** or **Passenger**, you need
162
179
 
163
180
  ```ruby
164
181
  after_fork do
165
- Redis::Classy.db.client.reconnect
182
+ RedisClassy.redis.client.reconnect
166
183
  end
167
184
  ```
168
185
 
169
- Note that since Redis Classy assigns a namespaced Redis instance upon the inheritance event of each subclass (`class Something < Redis::Classy`), reconnecting the master (non-namespaced) connection that is referenced from all subclasses should probably be the safest and the most efficient way to survive a forking event.
186
+ Note that since Redis Classy assigns a namespaced Redis instance upon the inheritance event of each subclass (`class Something < RedisClassy`), reconnecting the master (non-namespaced) connection that is referenced from all subclasses should probably be the safest and the most efficient way to survive a forking event.
170
187
 
171
188
  Reference
172
189
  ---------
data/UPGRADING.md ADDED
@@ -0,0 +1,10 @@
1
+ # Upgrading from 1.x
2
+
3
+ `redis-classy` 2.0 has brought quite a few changes. Please read these points carefully.
4
+
5
+ Please post any implications we may have missed as a GitHub Issue or Pull Request.
6
+
7
+ * No redis commands are delegated at the class level. Always use instance methods or explicitly declare singleton.
8
+ * `Something.set 'key', 'value'` is now `Something.on('key').set('value')`
9
+ * The base class `Redis::Classy` is now `RedisClassy`.
10
+ * `Redis::Classy.db = Redis.new` is now `RedisClassy.redis = Redis.new`.
data/lib/redis-classy.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  require 'redis-namespace'
2
- require 'redis/classy'
3
- require 'redis/classy/version'
2
+ require 'redis_classy'
3
+ require 'redis_classy/version'
@@ -0,0 +1,3 @@
1
+ class RedisClassy
2
+ VERSION = '2.0.0'
3
+ end
@@ -0,0 +1,75 @@
1
+ class RedisClassy
2
+ class << self
3
+ attr_accessor :redis
4
+
5
+ def inherited(subclass)
6
+ raise Error.new('RedisClassy.redis is not assigned') unless RedisClassy.redis
7
+ subclass.redis = Redis::Namespace.new(subclass.name, redis: RedisClassy.redis)
8
+ end
9
+
10
+ def singletons(*args)
11
+ args.each do |key|
12
+ define_singleton_method(key) do
13
+ new key
14
+ end
15
+ end
16
+ end
17
+
18
+ def singleton
19
+ @singleton = true
20
+ end
21
+
22
+ def keys(pattern = nil)
23
+ @redis.keys(pattern || '*')
24
+ end
25
+
26
+ def on(key)
27
+ new(key)
28
+ end
29
+
30
+ def method_missing(command, *args, &block)
31
+ if @singleton
32
+ new('singleton').send(command, *args, &block)
33
+ else
34
+ super
35
+ end
36
+ end
37
+ end
38
+
39
+ # Instance methods
40
+
41
+ attr_accessor :key, :redis, :object
42
+
43
+ def initialize(object)
44
+ @redis = self.class.redis
45
+ @object = object
46
+
47
+ case object
48
+ when String, Symbol, Integer
49
+ @key = object.to_s
50
+ else
51
+ if object.respond_to?(:id)
52
+ @key = object.id.to_s
53
+ else
54
+ raise ArgumentError, 'object must be a string, symbol, integer or respond to :id method'
55
+ end
56
+ end
57
+ end
58
+
59
+ KEYLESS_COMMANDS = [:multi, :pipelined, :exec, :eval]
60
+
61
+ def method_missing(command, *args, &block)
62
+ if @redis.respond_to?(command)
63
+ case command
64
+ when *KEYLESS_COMMANDS
65
+ @redis.send(command, *args, &block)
66
+ else
67
+ @redis.send(command, @key, *args, &block)
68
+ end
69
+ else
70
+ super
71
+ end
72
+ end
73
+
74
+ Error = Class.new(StandardError)
75
+ end
data/redis-classy.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/redis/classy/version', __FILE__)
2
+ require File.expand_path('../lib/redis_classy/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Kenn Ejima"]
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "redis-classy"
15
15
  gem.require_paths = ["lib"]
16
- gem.version = Redis::Classy::VERSION
16
+ gem.version = RedisClassy::VERSION
17
17
 
18
18
  gem.add_runtime_dependency "redis-namespace", "~> 1.0"
19
19
  gem.add_development_dependency "rspec"
@@ -1,65 +1,75 @@
1
1
  require 'spec_helper'
2
2
 
3
- class Something < Redis::Classy
3
+ class Something < RedisClassy
4
4
  end
5
5
 
6
- class Another < Something
7
- end
6
+ describe RedisClassy do
7
+ before do
8
+ RedisClassy.redis.flushdb
9
+ end
8
10
 
9
- module Deep
10
- class Klass < Another
11
+ after(:all) do
12
+ RedisClassy.redis.flushdb
13
+ RedisClassy.redis.quit
11
14
  end
12
- end
13
15
 
14
- describe Redis::Classy do
15
- before do
16
- Redis::Classy.flushdb
16
+ it 'stores redis or redis-namespace' do
17
+ expect(RedisClassy.redis.is_a?(Redis)).to be_truthy
18
+ expect(RedisClassy.redis.is_a?(Redis::Namespace)).to be_falsy
19
+ expect(Something.redis.is_a?(Redis)).to be_falsy
20
+ expect(Something.redis.is_a?(Redis::Namespace)).to be_truthy
17
21
  end
18
22
 
19
- after(:all) do
20
- Redis::Classy.flushdb
21
- Redis::Classy.quit
23
+ it 'gets keys' do
24
+ Something.on(:foo).set('bar')
25
+ expect(Something.keys).to eq(['foo'])
26
+ expect(RedisClassy.keys).to eq(['Something:foo'])
22
27
  end
23
28
 
24
29
  it 'prepends class name to the key' do
25
- Something.set('foo', 'bar')
26
- Something.keys.should == ['foo']
27
- Redis::Classy.keys.should include 'Something:foo'
30
+ class Another < Something
31
+ end
28
32
 
29
- Another.set('foo', 'bar')
30
- Another.keys.should == ['foo']
31
- Redis::Classy.keys.should include 'Another:foo'
33
+ module Deep
34
+ class Klass < Another
35
+ end
36
+ end
32
37
 
33
- Deep::Klass.set('foo', 'bar')
34
- Deep::Klass.keys.should == ['foo']
35
- Redis::Classy.keys.should include 'Deep::Klass:foo'
36
- end
38
+ Something.on(:foo).set('bar')
39
+ expect(Something.on(:foo).keys).to eq(['foo'])
40
+ expect(RedisClassy.keys.size).to eq(1)
41
+ expect(RedisClassy.keys).to include 'Something:foo'
42
+
43
+ Another.on(:foo).set('bar')
44
+ expect(Another.on(:foo).keys).to eq(['foo'])
45
+ expect(RedisClassy.keys.size).to eq(2)
46
+ expect(RedisClassy.keys).to include 'Another:foo'
37
47
 
38
- it 'delegates to class methods' do
39
- Something.get('foo').should == nil
40
- Something.set('foo', 'bar')
41
- Something.get('foo').should == 'bar'
48
+ Deep::Klass.on(:foo).set('bar')
49
+ expect(Deep::Klass.on(:foo).keys).to eq(['foo'])
50
+ expect(RedisClassy.keys.size).to eq(3)
51
+ expect(RedisClassy.keys).to include 'Deep::Klass:foo'
42
52
  end
43
53
 
44
54
  it 'delegates instance methods with the key binding' do
45
55
  something = Something.new('foo')
46
56
 
47
- something.get.should == nil
57
+ expect(something.get).to eq(nil)
48
58
  something.set('bar')
49
- something.get.should == 'bar'
50
- Something.get('foo').should == 'bar'
59
+ expect(something.get).to eq('bar')
60
+ expect(Something.on(:foo).get).to eq('bar')
51
61
  end
52
62
 
53
63
  it 'handles multi block' do
54
64
  something = Something.new('foo')
55
65
 
56
- Redis::Classy.multi do
66
+ something.multi do
57
67
  something.sadd 1
58
68
  something.sadd 2
59
69
  something.sadd 3
60
70
  end
61
71
 
62
- something.smembers.should == ['1','2','3']
72
+ expect(something.smembers).to eq(['1','2','3'])
63
73
  end
64
74
 
65
75
  it 'handles method_missing' do
@@ -71,20 +81,26 @@ describe Redis::Classy do
71
81
  expect { something.bogus }.to raise_error(NoMethodError)
72
82
  end
73
83
 
74
- it 'should battle against mongoid' do
75
- # Emulate notorious Mongoid::Extensions::Object::Conversions
76
- class Object
77
- def self.get(value)
78
- value
79
- end
84
+ it 'handles singleton key' do
85
+ class Counter < RedisClassy
86
+ singleton
80
87
  end
81
88
 
82
- # This would have returned "foo" instead of nil, unless we explicitly defined
83
- # class methods from Redis::Namespace::COMMANDS
84
- Something.get('foo').should == nil
89
+ Counter.incr
90
+ expect(Counter.get).to eq('1')
91
+ Counter.incr
92
+ expect(Counter.get).to eq('2')
93
+ end
85
94
 
86
- class << Object
87
- remove_method :get
95
+ it 'handles predefined keys' do
96
+ class Stats < RedisClassy
97
+ singletons :median, :average
88
98
  end
99
+
100
+ ages = [21,22,24,28,30]
101
+ Stats.median.set ages[ages.size/2]
102
+ Stats.average.set ages.inject(:+)/ages.size
103
+ expect(Stats.median.get).to eq('24')
104
+ expect(Stats.average.get).to eq('25')
89
105
  end
90
106
  end
data/spec/spec_helper.rb CHANGED
@@ -6,8 +6,8 @@ require 'redis-classy'
6
6
 
7
7
  RSpec.configure do |config|
8
8
  # Use database 15 for testing so we don't accidentally step on you real data.
9
- Redis::Classy.db = Redis.new(:db => 15)
10
- unless Redis::Classy.keys.empty?
9
+ RedisClassy.redis = Redis.new(db: 15)
10
+ unless RedisClassy.keys.empty?
11
11
  puts '[ERROR]: Redis database 15 not empty! If you are sure, run "rake flushdb" beforehand.'
12
12
  exit!
13
13
  end
metadata CHANGED
@@ -1,78 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-classy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kenn Ejima
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-09 00:00:00.000000000 Z
11
+ date: 2014-11-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: redis-namespace
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: bundler
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  description: Class-style namespace prefixing for Redis
@@ -82,44 +73,44 @@ executables: []
82
73
  extensions: []
83
74
  extra_rdoc_files: []
84
75
  files:
85
- - .gitignore
86
- - .rspec
87
- - .travis.yml
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - CHANGELOG.md
88
80
  - Gemfile
89
81
  - LICENSE
90
82
  - README.md
91
83
  - Rakefile
84
+ - UPGRADING.md
92
85
  - lib/redis-classy.rb
93
- - lib/redis/classy.rb
94
- - lib/redis/classy/version.rb
86
+ - lib/redis_classy.rb
87
+ - lib/redis_classy/version.rb
95
88
  - redis-classy.gemspec
96
89
  - spec/redis_classy_spec.rb
97
90
  - spec/spec_helper.rb
98
91
  homepage: http://github.com/kenn/redis-classy
99
92
  licenses: []
93
+ metadata: {}
100
94
  post_install_message:
101
95
  rdoc_options: []
102
96
  require_paths:
103
97
  - lib
104
98
  required_ruby_version: !ruby/object:Gem::Requirement
105
- none: false
106
99
  requirements:
107
- - - ! '>='
100
+ - - ">="
108
101
  - !ruby/object:Gem::Version
109
102
  version: '0'
110
103
  required_rubygems_version: !ruby/object:Gem::Requirement
111
- none: false
112
104
  requirements:
113
- - - ! '>='
105
+ - - ">="
114
106
  - !ruby/object:Gem::Version
115
107
  version: '0'
116
108
  requirements: []
117
109
  rubyforge_project:
118
- rubygems_version: 1.8.19
110
+ rubygems_version: 2.2.2
119
111
  signing_key:
120
- specification_version: 3
112
+ specification_version: 4
121
113
  summary: Class-style namespace prefixing for Redis
122
114
  test_files:
123
115
  - spec/redis_classy_spec.rb
124
116
  - spec/spec_helper.rb
125
- has_rdoc:
@@ -1,5 +0,0 @@
1
- class Redis
2
- class Classy
3
- VERSION = '1.2.0'
4
- end
5
- end
data/lib/redis/classy.rb DELETED
@@ -1,37 +0,0 @@
1
- class Redis
2
- class Classy
3
- class << self
4
- attr_accessor :db
5
-
6
- def inherited(subclass)
7
- raise 'Redis::Classy.db is not assigned' unless Redis::Classy.db
8
- subclass.db = Redis::Namespace.new(subclass.name, :redis => Redis::Classy.db)
9
- end
10
-
11
- def delegatables
12
- @delegatables ||= Redis::Classy.db.class.instance_methods(false).map(&:to_sym) # ruby1.8 returns strings
13
- end
14
-
15
- def method_missing(command, *args, &block)
16
- return super unless delegatables.include?(command)
17
- db.send(command, *args, &block)
18
- end
19
-
20
- Redis::Namespace::COMMANDS.keys.each do |command|
21
- define_method(command) do |*args, &block|
22
- db.send(command, *args, &block)
23
- end
24
- end
25
- end
26
-
27
- attr_accessor :key
28
-
29
- def initialize(key)
30
- @key = key
31
- end
32
-
33
- def method_missing(command, *args, &block)
34
- self.class.send(command, @key, *args, &block)
35
- end
36
- end
37
- end