opengotham_redis-namespace 0.4.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.
- data/LICENSE +20 -0
- data/README.md +27 -0
- data/Rakefile +32 -0
- data/lib/redis/namespace.rb +243 -0
- data/spec/redis_spec.rb +144 -0
- data/spec/spec_helper.rb +4 -0
- metadata +87 -0
    
        data/LICENSE
    ADDED
    
    | @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            Copyright (c) 2009 Chris Wanstrath
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 4 | 
            +
            a copy of this software and associated documentation files (the
         | 
| 5 | 
            +
            "Software"), to deal in the Software without restriction, including
         | 
| 6 | 
            +
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 7 | 
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 8 | 
            +
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 9 | 
            +
            the following conditions:
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            The above copyright notice and this permission notice shall be
         | 
| 12 | 
            +
            included in all copies or substantial portions of the Software.
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 15 | 
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 16 | 
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 17 | 
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 18 | 
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 19 | 
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 20 | 
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            redis-namespace
         | 
| 2 | 
            +
            ---------------
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            Requires the redis gem.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Namespaces all Redis calls.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                r = Redis::Namespace.new(:ns, :redis => @r)
         | 
| 9 | 
            +
                r['foo'] = 1000
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            This will perform the equivalent of:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                redis-cli set ns:foo 1000
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Useful when you have multiple systems using Redis differently in your app.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
            Installation
         | 
| 19 | 
            +
            ============
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                $ gem install redis-namespace
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
            Author
         | 
| 25 | 
            +
            =====
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            Chris Wanstrath :: chris@ozmm.org
         | 
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            task :default => :spec
         | 
| 2 | 
            +
            task :test    => :spec
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            desc "Build a gem"
         | 
| 5 | 
            +
            task :gem => [ :gemspec, :build ]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            desc "Run specs"
         | 
| 8 | 
            +
            task :spec do
         | 
| 9 | 
            +
              exec "spec spec/redis_spec.rb"
         | 
| 10 | 
            +
            end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            begin
         | 
| 13 | 
            +
              require 'jeweler'
         | 
| 14 | 
            +
              Jeweler::Tasks.new do |gemspec|
         | 
| 15 | 
            +
                gemspec.name = "opengotham_redis-namespace"
         | 
| 16 | 
            +
                gemspec.summary = "Namespaces Redis commands."
         | 
| 17 | 
            +
                gemspec.email = "mjording@opengotham.com"
         | 
| 18 | 
            +
                gemspec.homepage = "http://github.com/opengotham/redis-namespace"
         | 
| 19 | 
            +
                gemspec.authors = ["Matthew Jording"]
         | 
| 20 | 
            +
                gemspec.version = '0.4.4'
         | 
| 21 | 
            +
                gemspec.add_dependency 'redis', ">= 2.0.0.rc2"
         | 
| 22 | 
            +
                gemspec.description = <<description
         | 
| 23 | 
            +
            Adds a Redis::Namespace class which can be used to namespace calls
         | 
| 24 | 
            +
            to Redis. This is useful when using a single instance of Redis with
         | 
| 25 | 
            +
            multiple, different applications.
         | 
| 26 | 
            +
            description
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
              Jeweler::GemcutterTasks.new
         | 
| 29 | 
            +
            rescue LoadError
         | 
| 30 | 
            +
              warn "Jeweler not available. Install it with:"
         | 
| 31 | 
            +
              warn "gem install jeweler"
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,243 @@ | |
| 1 | 
            +
            require 'redis'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Redis
         | 
| 4 | 
            +
              class Namespace
         | 
| 5 | 
            +
                # The following table defines how input parameters and result
         | 
| 6 | 
            +
                # values should be modified for the namespace.
         | 
| 7 | 
            +
                #
         | 
| 8 | 
            +
                # COMMANDS is a hash. Each key is the name of a command and each
         | 
| 9 | 
            +
                # value is a two element array.
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                # The first element in the value array describes how to modify the
         | 
| 12 | 
            +
                # arguments passed. It can be one of:
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                #   nil
         | 
| 15 | 
            +
                #     Do nothing.
         | 
| 16 | 
            +
                #   :first
         | 
| 17 | 
            +
                #     Add the namespace to the first argument passed, e.g.
         | 
| 18 | 
            +
                #       GET key => GET namespace:key
         | 
| 19 | 
            +
                #   :all
         | 
| 20 | 
            +
                #     Add the namespace to all arguments passed, e.g.
         | 
| 21 | 
            +
                #       MGET key1 key2 => MGET namespace:key1 namespace:key2
         | 
| 22 | 
            +
                #   :exclude_first
         | 
| 23 | 
            +
                #     Add the namespace to all arguments but the first, e.g.
         | 
| 24 | 
            +
                #   :exclude_last
         | 
| 25 | 
            +
                #     Add the namespace to all arguments but the last, e.g.
         | 
| 26 | 
            +
                #       BLPOP key1 key2 timeout =>
         | 
| 27 | 
            +
                #       BLPOP namespace:key1 namespace:key2 timeout
         | 
| 28 | 
            +
                #   :alternate
         | 
| 29 | 
            +
                #     Add the namespace to every other argument, e.g.
         | 
| 30 | 
            +
                #       MSET key1 value1 key2 value2 =>
         | 
| 31 | 
            +
                #       MSET namespace:key1 value1 namespace:key2 value2
         | 
| 32 | 
            +
                #
         | 
| 33 | 
            +
                # The second element in the value array describes how to modify
         | 
| 34 | 
            +
                # the return value of the Redis call. It can be one of:
         | 
| 35 | 
            +
                #
         | 
| 36 | 
            +
                #   nil
         | 
| 37 | 
            +
                #     Do nothing.
         | 
| 38 | 
            +
                #   :all
         | 
| 39 | 
            +
                #     Add the namespace to all elements returned, e.g.
         | 
| 40 | 
            +
                #       key1 key2 => namespace:key1 namespace:key2
         | 
| 41 | 
            +
                COMMANDS = {
         | 
| 42 | 
            +
                  "auth"             => [],
         | 
| 43 | 
            +
                  "bgrewriteaof"     => [],
         | 
| 44 | 
            +
                  "bgsave"           => [],
         | 
| 45 | 
            +
                  "blpop"            => [ :exclude_last ],
         | 
| 46 | 
            +
                  "brpop"            => [ :exclude_last ],
         | 
| 47 | 
            +
                  "dbsize"           => [],
         | 
| 48 | 
            +
                  "decr"             => [ :first ],
         | 
| 49 | 
            +
                  "decrby"           => [ :first ],
         | 
| 50 | 
            +
                  "del"              => [ :all   ],
         | 
| 51 | 
            +
                  "exists"           => [ :first ],
         | 
| 52 | 
            +
                  "expire"           => [ :first ],
         | 
| 53 | 
            +
                  "flushall"         => [],
         | 
| 54 | 
            +
                  "flushdb"          => [],
         | 
| 55 | 
            +
                  "get"              => [ :first ],
         | 
| 56 | 
            +
                  "getset"           => [ :first ],
         | 
| 57 | 
            +
                  "hset"             => [ :first ],
         | 
| 58 | 
            +
                  "hget"             => [ :first ],
         | 
| 59 | 
            +
                  "hdel"             => [ :first ],
         | 
| 60 | 
            +
                  "hexists"          => [ :first ],
         | 
| 61 | 
            +
                  "hlen"             => [ :first ],
         | 
| 62 | 
            +
                  "hkeys"            => [ :first ],
         | 
| 63 | 
            +
                  "hvals"            => [ :first ],
         | 
| 64 | 
            +
                  "hgetall"          => [ :first ],
         | 
| 65 | 
            +
                  "incr"             => [ :first ],
         | 
| 66 | 
            +
                  "incrby"           => [ :first ],
         | 
| 67 | 
            +
                  "info"             => [],
         | 
| 68 | 
            +
                  "keys"             => [ :first, :all ],
         | 
| 69 | 
            +
                  "lastsave"         => [],
         | 
| 70 | 
            +
                  "lindex"           => [ :first ],
         | 
| 71 | 
            +
                  "llen"             => [ :first ],
         | 
| 72 | 
            +
                  "lpop"             => [ :first ],
         | 
| 73 | 
            +
                  "lpush"            => [ :first ],
         | 
| 74 | 
            +
                  "lrange"           => [ :first ],
         | 
| 75 | 
            +
                  "lrem"             => [ :first ],
         | 
| 76 | 
            +
                  "lset"             => [ :first ],
         | 
| 77 | 
            +
                  "ltrim"            => [ :first ],
         | 
| 78 | 
            +
                  "mapped_mget"      => [ :all, :all ],
         | 
| 79 | 
            +
                  "mget"             => [ :all ],
         | 
| 80 | 
            +
                  "monitor"          => [ :monitor ],
         | 
| 81 | 
            +
                  "move"             => [ :first ],
         | 
| 82 | 
            +
                  "mset"             => [ :alternate ],
         | 
| 83 | 
            +
                  "msetnx"           => [ :alternate ],
         | 
| 84 | 
            +
                  "quit"             => [],
         | 
| 85 | 
            +
                  "randomkey"        => [],
         | 
| 86 | 
            +
                  "rename"           => [ :all ],
         | 
| 87 | 
            +
                  "renamenx"         => [ :all ],
         | 
| 88 | 
            +
                  "rpop"             => [ :first ],
         | 
| 89 | 
            +
                  "rpoplpush"        => [ :all ],
         | 
| 90 | 
            +
                  "rpush"            => [ :first ],
         | 
| 91 | 
            +
                  "sadd"             => [ :first ],
         | 
| 92 | 
            +
                  "save"             => [],
         | 
| 93 | 
            +
                  "scard"            => [ :first ],
         | 
| 94 | 
            +
                  "sdiff"            => [ :all ],
         | 
| 95 | 
            +
                  "sdiffstore"       => [ :all ],
         | 
| 96 | 
            +
                  "select"           => [],
         | 
| 97 | 
            +
                  "set"              => [ :first ],
         | 
| 98 | 
            +
                  "setnx"            => [ :first ],
         | 
| 99 | 
            +
                  "shutdown"         => [],
         | 
| 100 | 
            +
                  "sinter"           => [ :all ],
         | 
| 101 | 
            +
                  "sinterstore"      => [ :all ],
         | 
| 102 | 
            +
                  "sismember"        => [ :first ],
         | 
| 103 | 
            +
                  "slaveof"          => [],
         | 
| 104 | 
            +
                  "smembers"         => [ :first ],
         | 
| 105 | 
            +
                  "smove"            => [ :exclude_last ],
         | 
| 106 | 
            +
                  "sort"             => [ :sort  ],
         | 
| 107 | 
            +
                  "spop"             => [ :first ],
         | 
| 108 | 
            +
                  "srandmember"      => [ :first ],
         | 
| 109 | 
            +
                  "srem"             => [ :first ],
         | 
| 110 | 
            +
                  "sunion"           => [ :all ],
         | 
| 111 | 
            +
                  "sunionstore"      => [ :all ],
         | 
| 112 | 
            +
                  "ttl"              => [ :first ],
         | 
| 113 | 
            +
                  "type"             => [ :first ],
         | 
| 114 | 
            +
                  "zadd"             => [ :first ],
         | 
| 115 | 
            +
                  "zcard"            => [ :first ],
         | 
| 116 | 
            +
                  "zincrby"          => [ :first ],
         | 
| 117 | 
            +
                  "zrange"           => [ :first ],
         | 
| 118 | 
            +
                  "zrangebyscore"    => [ :first ],
         | 
| 119 | 
            +
                  "zrem"             => [ :first ],
         | 
| 120 | 
            +
                  "zremrangebyscore" => [ :first ],
         | 
| 121 | 
            +
                  "zrevrange"        => [ :first ],
         | 
| 122 | 
            +
                  "zscore"           => [ :first ],
         | 
| 123 | 
            +
                  "[]"               => [ :first ],
         | 
| 124 | 
            +
                  "[]="              => [ :first ]
         | 
| 125 | 
            +
                }
         | 
| 126 | 
            +
                ALIASES = {
         | 
| 127 | 
            +
                      "flush_db" => "flushdb",
         | 
| 128 | 
            +
                      "flush_all" => "flushall",
         | 
| 129 | 
            +
                      "last_save" => "lastsave",
         | 
| 130 | 
            +
                      "key?" => "exists",
         | 
| 131 | 
            +
                      "delete" => "del",
         | 
| 132 | 
            +
                      "randkey" => "randomkey",
         | 
| 133 | 
            +
                      "list_length" => "llen",
         | 
| 134 | 
            +
                      "push_tail" => "rpush",
         | 
| 135 | 
            +
                      "push_head" => "lpush",
         | 
| 136 | 
            +
                      "pop_tail" => "rpop",
         | 
| 137 | 
            +
                      "pop_head" => "lpop",
         | 
| 138 | 
            +
                      "list_set" => "lset",
         | 
| 139 | 
            +
                      "list_range" => "lrange",
         | 
| 140 | 
            +
                      "list_trim" => "ltrim",
         | 
| 141 | 
            +
                      "list_index" => "lindex",
         | 
| 142 | 
            +
                      "list_rm" => "lrem",
         | 
| 143 | 
            +
                      "set_add" => "sadd",
         | 
| 144 | 
            +
                      "set_delete" => "srem",
         | 
| 145 | 
            +
                      "set_count" => "scard",
         | 
| 146 | 
            +
                      "set_member?" => "sismember",
         | 
| 147 | 
            +
                      "set_members" => "smembers",
         | 
| 148 | 
            +
                      "set_intersect" => "sinter",
         | 
| 149 | 
            +
                      "set_intersect_store" => "sinterstore",
         | 
| 150 | 
            +
                      "set_inter_store" => "sinterstore",
         | 
| 151 | 
            +
                      "set_union" => "sunion",
         | 
| 152 | 
            +
                      "set_union_store" => "sunionstore",
         | 
| 153 | 
            +
                      "set_diff" => "sdiff",
         | 
| 154 | 
            +
                      "set_diff_store" => "sdiffstore",
         | 
| 155 | 
            +
                      "set_move" => "smove",
         | 
| 156 | 
            +
                      "set_unless_exists" => "setnx",
         | 
| 157 | 
            +
                      "rename_unless_exists" => "renamenx",
         | 
| 158 | 
            +
                      "type?" => "type",
         | 
| 159 | 
            +
                      "zset_add" => "zadd",
         | 
| 160 | 
            +
                      "zset_count" => "zcard",
         | 
| 161 | 
            +
                      "zset_range_by_score" => "zrangebyscore",
         | 
| 162 | 
            +
                      "zset_reverse_range" => "zrevrange",
         | 
| 163 | 
            +
                      "zset_range" => "zrange",
         | 
| 164 | 
            +
                      "zset_delete" => "zrem",
         | 
| 165 | 
            +
                      "zset_score" => "zscore",
         | 
| 166 | 
            +
                      "zset_incr_by" => "zincrby",
         | 
| 167 | 
            +
                      "zset_increment_by" => "zincrby"
         | 
| 168 | 
            +
                    }
         | 
| 169 | 
            +
                # support previous versions of redis gem
         | 
| 170 | 
            +
                #ALIASES = (defined? Redis::Client) ? Redis::Client::ALIASES : Redis::ALIASES
         | 
| 171 | 
            +
                #ALIASES = (defined? Redis::Client) ? Redis.instance_methods : Redis::ALIASES
         | 
| 172 | 
            +
                attr_accessor :namespace
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                def initialize(namespace, options = {})
         | 
| 175 | 
            +
                  @namespace = namespace
         | 
| 176 | 
            +
                  @redis = options[:redis]
         | 
| 177 | 
            +
                end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                # Ruby defines a now deprecated type method so we need to override it here
         | 
| 180 | 
            +
                # since it will never hit method_missing
         | 
| 181 | 
            +
                def type(key)
         | 
| 182 | 
            +
                  method_missing(:type, key)
         | 
| 183 | 
            +
                end
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                def method_missing(command, *args, &block)
         | 
| 186 | 
            +
                  (before, after) = COMMANDS[command.to_s] ||
         | 
| 187 | 
            +
                    COMMANDS[ALIASES[command.to_s]]
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                  # Add the namespace to any parameters that are keys.
         | 
| 190 | 
            +
                  case before
         | 
| 191 | 
            +
                  when :first
         | 
| 192 | 
            +
                    args[0] = add_namespace(args[0]) if args[0]
         | 
| 193 | 
            +
                  when :all
         | 
| 194 | 
            +
                    args = add_namespace(args)
         | 
| 195 | 
            +
                  when :exclude_first
         | 
| 196 | 
            +
                    first = args.shift
         | 
| 197 | 
            +
                    args = add_namespace(args)
         | 
| 198 | 
            +
                    args.unshift(first) if first
         | 
| 199 | 
            +
                  when :exclude_last
         | 
| 200 | 
            +
                    last = args.pop
         | 
| 201 | 
            +
                    args = add_namespace(args)
         | 
| 202 | 
            +
                    args.push(last) if last
         | 
| 203 | 
            +
                  when :alternate
         | 
| 204 | 
            +
                    args = [ add_namespace(Hash[*args]) ]
         | 
| 205 | 
            +
                  end
         | 
| 206 | 
            +
             | 
| 207 | 
            +
                  # Dispatch the command to Redis and store the result.
         | 
| 208 | 
            +
                  result = @redis.send(command, *args, &block)
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                  # Remove the namespace from results that are keys.
         | 
| 211 | 
            +
                  result = rem_namespace(result) if after == :all
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                  result
         | 
| 214 | 
            +
                end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
              private
         | 
| 217 | 
            +
                def add_namespace(key)
         | 
| 218 | 
            +
                  return key unless key && @namespace
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                  case key
         | 
| 221 | 
            +
                  when Array
         | 
| 222 | 
            +
                    key.map {|k| add_namespace k}
         | 
| 223 | 
            +
                  when Hash
         | 
| 224 | 
            +
                    Hash[*key.map {|k, v| [ add_namespace(k), v ]}.flatten]
         | 
| 225 | 
            +
                  else
         | 
| 226 | 
            +
                    "#{@namespace}:#{key}"
         | 
| 227 | 
            +
                  end
         | 
| 228 | 
            +
                end
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                def rem_namespace(key)
         | 
| 231 | 
            +
                  return key unless key && @namespace
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                  case key
         | 
| 234 | 
            +
                  when Array
         | 
| 235 | 
            +
                    key.map {|k| rem_namespace k}
         | 
| 236 | 
            +
                  when Hash
         | 
| 237 | 
            +
                    Hash[*key.map {|k, v| [ rem_namespace(k), v ]}.flatten]
         | 
| 238 | 
            +
                  else
         | 
| 239 | 
            +
                    key.to_s.gsub /^#{@namespace}:/, ""
         | 
| 240 | 
            +
                  end
         | 
| 241 | 
            +
                end
         | 
| 242 | 
            +
              end
         | 
| 243 | 
            +
            end
         | 
    
        data/spec/redis_spec.rb
    ADDED
    
    | @@ -0,0 +1,144 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/spec_helper'
         | 
| 2 | 
            +
            require 'redis/namespace'
         | 
| 3 | 
            +
            require 'logger'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe "redis" do
         | 
| 6 | 
            +
              before(:all) do
         | 
| 7 | 
            +
                # use database 15 for testing so we dont accidentally step on you real data
         | 
| 8 | 
            +
                @redis = Redis.new :db => 15
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              before(:each) do
         | 
| 12 | 
            +
                @namespaced = Redis::Namespace.new(:ns, :redis => @redis)
         | 
| 13 | 
            +
                @namespaced.flushdb
         | 
| 14 | 
            +
                @redis['foo'] = 'bar'
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              after(:each) do
         | 
| 18 | 
            +
                @redis.flushdb
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              after(:all) do
         | 
| 22 | 
            +
                @redis.quit
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              it "should be able to use a namespace" do
         | 
| 26 | 
            +
                @namespaced['foo'].should == nil
         | 
| 27 | 
            +
                @namespaced['foo'] = 'chris'
         | 
| 28 | 
            +
                @namespaced['foo'].should == 'chris'
         | 
| 29 | 
            +
                @redis['foo'] = 'bob'
         | 
| 30 | 
            +
                @redis['foo'].should == 'bob'
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                @namespaced.incrby('counter', 2)
         | 
| 33 | 
            +
                @namespaced['counter'].to_i.should == 2
         | 
| 34 | 
            +
                @redis['counter'].should == nil
         | 
| 35 | 
            +
                @namespaced.type('counter').should == 'string'
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              it "should be able to use a namespace with del" do
         | 
| 39 | 
            +
                @namespaced['foo'] = 1000
         | 
| 40 | 
            +
                @namespaced['bar'] = 2000
         | 
| 41 | 
            +
                @namespaced['baz'] = 3000
         | 
| 42 | 
            +
                @namespaced.del 'foo'
         | 
| 43 | 
            +
                @namespaced['foo'].should == nil
         | 
| 44 | 
            +
                @namespaced.del 'bar', 'baz'
         | 
| 45 | 
            +
                @namespaced['bar'].should == nil
         | 
| 46 | 
            +
                @namespaced['baz'].should == nil
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              it "should be able to use a namespace with mget" do
         | 
| 50 | 
            +
                @namespaced['foo'] = 1000
         | 
| 51 | 
            +
                @namespaced['bar'] = 2000
         | 
| 52 | 
            +
                @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
         | 
| 53 | 
            +
                @namespaced.mapped_mget('foo', 'baz', 'bar').should == {'foo'=>'1000', 'bar'=>'2000'}
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              it "should be able to use a namespace with mset" do
         | 
| 57 | 
            +
                @namespaced.mset('foo' => '1000', 'bar' => '2000')
         | 
| 58 | 
            +
                @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
         | 
| 59 | 
            +
                @namespaced.mapped_mget('foo', 'baz', 'bar').should == { 'foo' => '1000', 'bar' => '2000'}
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              it "should be able to use a namespace with msetnx" do
         | 
| 63 | 
            +
                @namespaced.msetnx('foo' => '1000', 'bar' => '2000')
         | 
| 64 | 
            +
                @namespaced.mapped_mget('foo', 'bar').should == { 'foo' => '1000', 'bar' => '2000' }
         | 
| 65 | 
            +
                @namespaced.mapped_mget('foo', 'baz', 'bar').should == { 'foo' => '1000', 'bar' => '2000'}
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              it "should be able to use a namespace with hashes" do
         | 
| 69 | 
            +
                @namespaced.hset('foo', 'key', 'value')
         | 
| 70 | 
            +
                @namespaced.hset('foo', 'key1', 'value1')
         | 
| 71 | 
            +
                @namespaced.hget('foo', 'key').should == 'value'
         | 
| 72 | 
            +
                @namespaced.hgetall('foo').should == {'key' => 'value', 'key1' => 'value1'}
         | 
| 73 | 
            +
                @namespaced.hlen('foo').should == 2
         | 
| 74 | 
            +
                @namespaced.hkeys('foo').should == ['key', 'key1']
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              it "should properly intersect three sets" do
         | 
| 78 | 
            +
                @namespaced.sadd('foo', 1)
         | 
| 79 | 
            +
                @namespaced.sadd('foo', 2)
         | 
| 80 | 
            +
                @namespaced.sadd('foo', 3)
         | 
| 81 | 
            +
                @namespaced.sadd('bar', 2)
         | 
| 82 | 
            +
                @namespaced.sadd('bar', 3)
         | 
| 83 | 
            +
                @namespaced.sadd('bar', 4)
         | 
| 84 | 
            +
                @namespaced.sadd('baz', 3)
         | 
| 85 | 
            +
                @namespaced.sinter('foo', 'bar', 'baz').should == %w( 3 )
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              it "should properly union two sets" do
         | 
| 89 | 
            +
                @namespaced.sadd('foo', 1)
         | 
| 90 | 
            +
                @namespaced.sadd('foo', 2)
         | 
| 91 | 
            +
                @namespaced.sadd('bar', 2)
         | 
| 92 | 
            +
                @namespaced.sadd('bar', 3)
         | 
| 93 | 
            +
                @namespaced.sadd('bar', 4)
         | 
| 94 | 
            +
                @namespaced.sunion('foo', 'bar').sort.should == %w( 1 2 3 4 )
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              it "should yield the correct list of keys" do
         | 
| 98 | 
            +
                @namespaced["foo"] = 1
         | 
| 99 | 
            +
                @namespaced["bar"] = 2
         | 
| 100 | 
            +
                @namespaced["baz"] = 3
         | 
| 101 | 
            +
                @namespaced.keys("*").sort.should == %w( bar baz foo )
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              it "can change its namespace" do
         | 
| 105 | 
            +
                @namespaced['foo'].should == nil
         | 
| 106 | 
            +
                @namespaced['foo'] = 'chris'
         | 
| 107 | 
            +
                @namespaced['foo'].should == 'chris'
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                @namespaced.namespace.should == :ns
         | 
| 110 | 
            +
                @namespaced.namespace = :spec
         | 
| 111 | 
            +
                @namespaced.namespace.should == :spec
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                @namespaced['foo'].should == nil
         | 
| 114 | 
            +
                @namespaced['foo'] = 'chris'
         | 
| 115 | 
            +
                @namespaced['foo'].should == 'chris'
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
              it "should support command aliases (delete)" do 
         | 
| 119 | 
            +
                @namespaced.del('foo')
         | 
| 120 | 
            +
                @redis.should_not have_key('ns:foo')
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              it "should support command aliases (set_add)" do 
         | 
| 124 | 
            +
                @namespaced.sadd('bar', 'quux')
         | 
| 125 | 
            +
                @namespaced.smembers('bar').should include('quux')
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
              it "should support command aliases (push_head)" do 
         | 
| 129 | 
            +
                @namespaced.lpush('bar', 'quux')
         | 
| 130 | 
            +
                @redis.llen('ns:bar').should == 1
         | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              it "should support command aliases (zset_add)" do 
         | 
| 134 | 
            +
                @namespaced.zadd('bar', 1, 'quux')
         | 
| 135 | 
            +
                @redis.zcard('ns:bar').should == 1
         | 
| 136 | 
            +
              end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
             | 
| 139 | 
            +
              Spec::Matchers.define :have_key do |expected|
         | 
| 140 | 
            +
                match do |redis|
         | 
| 141 | 
            +
                  redis.exists(expected)
         | 
| 142 | 
            +
                end
         | 
| 143 | 
            +
              end
         | 
| 144 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
    
        metadata
    ADDED
    
    | @@ -0,0 +1,87 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            +
            name: opengotham_redis-namespace
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            +
              prerelease: false
         | 
| 5 | 
            +
              segments: 
         | 
| 6 | 
            +
              - 0
         | 
| 7 | 
            +
              - 4
         | 
| 8 | 
            +
              - 4
         | 
| 9 | 
            +
              version: 0.4.4
         | 
| 10 | 
            +
            platform: ruby
         | 
| 11 | 
            +
            authors: 
         | 
| 12 | 
            +
            - Matthew Jording
         | 
| 13 | 
            +
            autorequire: 
         | 
| 14 | 
            +
            bindir: bin
         | 
| 15 | 
            +
            cert_chain: []
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            date: 2010-05-06 00:00:00 -04:00
         | 
| 18 | 
            +
            default_executable: 
         | 
| 19 | 
            +
            dependencies: 
         | 
| 20 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 21 | 
            +
              name: redis
         | 
| 22 | 
            +
              prerelease: false
         | 
| 23 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 24 | 
            +
                requirements: 
         | 
| 25 | 
            +
                - - ">="
         | 
| 26 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 27 | 
            +
                    segments: 
         | 
| 28 | 
            +
                    - 2
         | 
| 29 | 
            +
                    - 0
         | 
| 30 | 
            +
                    - 0
         | 
| 31 | 
            +
                    - rc2
         | 
| 32 | 
            +
                    version: 2.0.0.rc2
         | 
| 33 | 
            +
              type: :runtime
         | 
| 34 | 
            +
              version_requirements: *id001
         | 
| 35 | 
            +
            description: |
         | 
| 36 | 
            +
              Adds a Redis::Namespace class which can be used to namespace calls
         | 
| 37 | 
            +
              to Redis. This is useful when using a single instance of Redis with
         | 
| 38 | 
            +
              multiple, different applications.
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            email: mjording@opengotham.com
         | 
| 41 | 
            +
            executables: []
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            extensions: []
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            extra_rdoc_files: 
         | 
| 46 | 
            +
            - LICENSE
         | 
| 47 | 
            +
            - README.md
         | 
| 48 | 
            +
            files: 
         | 
| 49 | 
            +
            - LICENSE
         | 
| 50 | 
            +
            - README.md
         | 
| 51 | 
            +
            - Rakefile
         | 
| 52 | 
            +
            - lib/redis/namespace.rb
         | 
| 53 | 
            +
            - spec/redis_spec.rb
         | 
| 54 | 
            +
            - spec/spec_helper.rb
         | 
| 55 | 
            +
            has_rdoc: true
         | 
| 56 | 
            +
            homepage: http://github.com/opengotham/redis-namespace
         | 
| 57 | 
            +
            licenses: []
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            post_install_message: 
         | 
| 60 | 
            +
            rdoc_options: 
         | 
| 61 | 
            +
            - --charset=UTF-8
         | 
| 62 | 
            +
            require_paths: 
         | 
| 63 | 
            +
            - lib
         | 
| 64 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 65 | 
            +
              requirements: 
         | 
| 66 | 
            +
              - - ">="
         | 
| 67 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 68 | 
            +
                  segments: 
         | 
| 69 | 
            +
                  - 0
         | 
| 70 | 
            +
                  version: "0"
         | 
| 71 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 72 | 
            +
              requirements: 
         | 
| 73 | 
            +
              - - ">="
         | 
| 74 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 75 | 
            +
                  segments: 
         | 
| 76 | 
            +
                  - 0
         | 
| 77 | 
            +
                  version: "0"
         | 
| 78 | 
            +
            requirements: []
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            rubyforge_project: 
         | 
| 81 | 
            +
            rubygems_version: 1.3.6
         | 
| 82 | 
            +
            signing_key: 
         | 
| 83 | 
            +
            specification_version: 3
         | 
| 84 | 
            +
            summary: Namespaces Redis commands.
         | 
| 85 | 
            +
            test_files: 
         | 
| 86 | 
            +
            - spec/redis_spec.rb
         | 
| 87 | 
            +
            - spec/spec_helper.rb
         |