redis_connector 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
+ #!/usr/bin/env rake
1
2
  require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ t.rspec_opts = %w(--format Fuubar)
7
+ end
8
+
9
+ task :default => [:spec]
@@ -1,121 +1,9 @@
1
- require "redis_connector/version"
2
-
3
- class RedisConnector
4
- def self.with_session name = :default, &block
5
- p = pools[name]
6
- raise "No session configuration for #{name}" unless p
7
-
8
- p.with(&block)
9
- end
10
-
11
- def self.session_names
12
- pools.keys
13
- end
14
-
15
- def self.pools
16
- @pools || {}
17
- end
18
-
19
- def self.load_config config = nil
20
- if config_file.file?
21
- ::RedisConnector.load!(config_file)
22
- else
23
- raise "File not found: config/redis_connector.yml"
24
- end
25
-
26
- end
27
-
28
- def self.load! filename
29
- conf = YAML::load_file filename
30
- unless conf && conf[current_env]
31
- raise "RedisConnector: no configuration for :#{current_env} environment."
32
- end
33
-
34
- envconf = conf[current_env].symbolize_keys
35
-
36
- unless envconf[:sessions]
37
- raise "Missing :sessions section in redis_connector.yml for :#{current_env} environement"
38
- end
39
-
40
- @connection_configs = envconf[:sessions].each_with_object({}) do |(name, prm), memo|
41
- memo[name.to_sym] = insert_default_values(prm)
42
- end
43
-
44
- establish_connections!
45
- end
46
-
47
- def self.establish_connections!
48
- @pools = {}
49
- @connection_configs.each do |name, params|
50
- params[:znode_alias] ||= name
51
-
52
- @pools[name] = ConnectionPool.new(size: params[:pool_size], timeout: params[:timeout]) do
53
- case params[:driver]
54
- when 'redis'
55
- init_vanilla_redis(params)
56
- when 'redis_failover'
57
- init_failover_redis(params)
58
- else
59
- raise "Unrecognized redis driver: #{driver.inspect}"
60
- end
61
- end
62
- end
63
- end
64
-
65
- def self.close_connections!
66
- end
67
-
68
- def self.init_vanilla_redis params
69
- redis = Redis.new host: params[:host], port: params[:port]
70
- redis = Redis::Namespace.new(params[:namespace], redis: redis) if params[:namespace]
71
- redis
72
- end
73
-
74
- def self.init_failover_redis params
75
- if defined? RedisFailover::Client
76
- zk = params.fetch(:zkservers)
77
- znode = "/rf_#{name}"
78
-
79
- if za = params[:znode_alias]
80
- znode = "/rf_#{za}"
81
- end
1
+ require 'yaml'
2
+ require 'redis'
3
+ require 'redis-namespace'
4
+ require 'connection_pool'
82
5
 
83
- args = {zkservers: zk, znode_path: znode}
84
- args.merge!(namespace: params[:namespace]) if params[:namespace]
85
- redis = RedisFailover::Client.new args
86
- redis
87
- else
88
- raise "RedisFailover::Client is not found. Add it to Gemfile and run `bundle install`"
89
- end
90
- end
91
-
92
- def self.insert_default_values prm
93
- res = prm.symbolize_keys
94
-
95
- res[:host] ||= 'localhost'
96
- res[:port] ||= 6379
97
-
98
- res[:pool_size] ||= 1
99
- res[:timeout] ||= 5
100
- res[:driver] ||= 'redis'
6
+ require 'redis_connector/util'
7
+ require "redis_connector/version"
8
+ require 'redis_connector/connector'
101
9
 
102
- res
103
- end
104
-
105
- private
106
- def self.current_env
107
- if defined? Rails
108
- Rails.env
109
- else
110
- ENV['RAILS_ENV'] || ENV['CURRENT_ENV'] || 'development'
111
- end
112
- end
113
-
114
- def self.config_file
115
- if defined? Rails
116
- Rails.root.join("config", "redis_connector.yml")
117
- else
118
- 'config/redis_connector.yml'
119
- end
120
- end
121
- end
@@ -0,0 +1,121 @@
1
+ class RedisConnector
2
+ extend Util
3
+
4
+ def self.with_session name = :default, &block
5
+ p = pools[name]
6
+ raise "No session configuration for #{name}" unless p
7
+
8
+ p.with(&block)
9
+ end
10
+
11
+ def self.session_names
12
+ pools.keys
13
+ end
14
+
15
+ def self.pools
16
+ @pools || {}
17
+ end
18
+
19
+ def self.configure config = nil
20
+
21
+ envconf = if config && config.is_a?(Hash)
22
+ config = stringify_keys(config)
23
+ config[current_env] || config
24
+ else
25
+ config ||= config_file
26
+
27
+ conf = YAML::load_file config
28
+
29
+ envconf = conf[current_env] || conf
30
+ end
31
+
32
+ envconf = symbolize_keys(envconf)
33
+
34
+ unless envconf[:sessions]
35
+ raise "Missing :sessions section in redis_connector.yml for :#{current_env} environement"
36
+ end
37
+
38
+ @connection_configs = envconf[:sessions].each_with_object({}) do |(name, prm), memo|
39
+ memo[name.to_sym] = insert_default_values(prm)
40
+ end
41
+
42
+ establish_connections!
43
+ end
44
+
45
+ def self.establish_connections!
46
+ @pools = {}
47
+ @connection_configs.each do |name, params|
48
+ params[:znode_alias] ||= name
49
+
50
+ @pools[name] = ConnectionPool.new(size: params[:pool_size], timeout: params[:timeout]) do
51
+ case params[:driver]
52
+ when 'redis'
53
+ init_vanilla_redis(params)
54
+ when 'redis_failover'
55
+ init_failover_redis(params)
56
+ else
57
+ raise "Unrecognized redis driver: #{driver.inspect}"
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ def self.close_connections!
64
+ # we should call #quit on all connections
65
+ end
66
+
67
+ def self.init_vanilla_redis params
68
+ redis = Redis.new host: params[:host], port: params[:port]
69
+ redis = Redis::Namespace.new(params[:namespace], redis: redis) if params[:namespace]
70
+ redis
71
+ end
72
+
73
+ def self.init_failover_redis params
74
+ if defined? RedisFailover::Client
75
+ zk = params.fetch(:zkservers)
76
+ znode = "/rf_#{name}"
77
+
78
+ if za = params[:znode_alias]
79
+ znode = "/rf_#{za}"
80
+ end
81
+
82
+ args = {zkservers: zk, znode_path: znode}
83
+ args.merge!(namespace: params[:namespace]) if params[:namespace]
84
+ redis = RedisFailover::Client.new args
85
+ redis
86
+ else
87
+ raise "RedisFailover::Client is not found. Add it to Gemfile and run `bundle install`"
88
+ end
89
+ end
90
+
91
+ def self.insert_default_values prm
92
+ res = symbolize_keys(prm)
93
+
94
+ res[:host] ||= 'localhost'
95
+ res[:port] ||= 6379
96
+
97
+ res[:pool_size] ||= 1
98
+ res[:timeout] ||= 5
99
+ res[:driver] ||= 'redis'
100
+
101
+ res
102
+ end
103
+
104
+ private
105
+ def self.current_env
106
+ env = if defined? Rails
107
+ Rails.env
108
+ else
109
+ ENV['RAILS_ENV'] || ENV['CURRENT_ENV'] || 'development'
110
+ end
111
+ env.to_s
112
+ end
113
+
114
+ def self.config_file
115
+ if defined? Rails
116
+ Rails.root.join("config", "redis_connector.yml")
117
+ else
118
+ 'config/redis_connector.yml'
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,18 @@
1
+ module Util
2
+ # Symbolizes the keys of the specified hash.
3
+ #
4
+ # @param [Hash] hash a hash for which keys should be symbolized
5
+ # @return [Hash] a new hash with symbolized keys
6
+ def symbolize_keys(hash)
7
+ Hash[hash.map { |k, v| [k.to_sym, v] }]
8
+ end
9
+
10
+ # Stringifies the keys of the specified hash.
11
+ #
12
+ # @param [Hash] hash a hash for which keys should be stringified
13
+ # @return [Hash] a new hash with stringified keys
14
+ def stringify_keys(hash)
15
+ Hash[hash.map { |k, v| [k.to_s, v] }]
16
+ end
17
+
18
+ end
@@ -1,3 +1,3 @@
1
1
  class RedisConnector
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,11 +1,49 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe RedisConnector do
4
- it 'passes this test' do
5
- true
6
- end
7
-
8
- it 'fails this test' do
9
- raise 'oops'
4
+ describe '#configure' do
5
+ it 'accepts plain hash' do
6
+ conf = {
7
+ sessions: {
8
+ cache: {
9
+ host: 'localhost'
10
+ },
11
+ resque: {
12
+ host: 'localhost'
13
+ }
14
+ }
15
+ }
16
+
17
+ RedisConnector.configure conf
18
+ RedisConnector.session_names.should =~ [:resque, :cache]
19
+ end
20
+
21
+ it 'accepts hash with environment sections' do
22
+ conf = {
23
+ test: {
24
+ sessions: {
25
+ cache: {
26
+ host: 'localhost'
27
+ },
28
+ resque: {
29
+ host: 'localhost'
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+ RedisConnector.configure conf
36
+ RedisConnector.session_names.should =~ [:resque, :cache]
37
+ end
38
+
39
+ it 'accepts a filename with simple config' do
40
+ RedisConnector.configure 'spec/support/config/example01.yml'
41
+ RedisConnector.session_names.should =~ [:resque, :cache, :default]
42
+ end
43
+
44
+ it 'accepts a filename with environment sections' do
45
+ RedisConnector.configure 'spec/support/config/example01_multiple_environments.yml'
46
+ RedisConnector.session_names.should =~ [:resque, :default, :cache]
47
+ end
10
48
  end
11
- end
49
+ end
data/spec/spec_helper.rb CHANGED
@@ -20,3 +20,8 @@ if $LOADED_FEATURES.grep(/spec\/spec_helper\.rb/).any?
20
20
  MSG
21
21
  end
22
22
  end
23
+
24
+ ENV['CURRENT_ENV'] ||= 'test'
25
+
26
+ require 'rspec'
27
+ require 'redis_connector'
@@ -0,0 +1,13 @@
1
+ sessions:
2
+ default: &defaults
3
+ host: localhost
4
+ port: 6379
5
+ namespace: my_prefix
6
+ poolsize: 1
7
+ timeout: 5
8
+ cache:
9
+ <<: *defaults
10
+ namespace: test-uniques
11
+ resque:
12
+ <<: *defaults
13
+ namespace: test-resque
@@ -0,0 +1,14 @@
1
+ test:
2
+ sessions:
3
+ default: &defaults
4
+ host: localhost
5
+ port: 6379
6
+ namespace: my_prefix
7
+ poolsize: 1
8
+ timeout: 5
9
+ cache:
10
+ <<: *defaults
11
+ namespace: test-uniques
12
+ resque:
13
+ <<: *defaults
14
+ namespace: test-resque
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_connector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -105,10 +105,14 @@ files:
105
105
  - README.md
106
106
  - Rakefile
107
107
  - lib/redis_connector.rb
108
+ - lib/redis_connector/connector.rb
109
+ - lib/redis_connector/util.rb
108
110
  - lib/redis_connector/version.rb
109
111
  - redis_connector.gemspec
110
112
  - spec/lib/redis_connector_spec.rb
111
113
  - spec/spec_helper.rb
114
+ - spec/support/config/example01.yml
115
+ - spec/support/config/example01_multiple_environments.yml
112
116
  homepage: ''
113
117
  licenses: []
114
118
  post_install_message:
@@ -136,4 +140,6 @@ summary: handles multiple redis connections
136
140
  test_files:
137
141
  - spec/lib/redis_connector_spec.rb
138
142
  - spec/spec_helper.rb
143
+ - spec/support/config/example01.yml
144
+ - spec/support/config/example01_multiple_environments.yml
139
145
  has_rdoc: