vanity 2.0.0.beta8 → 2.0.0.beta9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.travis.yml +4 -2
  2. data/Appraisals +1 -1
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +4 -1
  5. data/gemfiles/rails32.gemfile +3 -2
  6. data/gemfiles/rails32.gemfile.lock +4 -5
  7. data/gemfiles/rails4.gemfile +2 -1
  8. data/gemfiles/rails4.gemfile.lock +3 -1
  9. data/gemfiles/rails41.gemfile +2 -1
  10. data/gemfiles/rails41.gemfile.lock +3 -1
  11. data/gemfiles/rails42.gemfile +2 -1
  12. data/gemfiles/rails42.gemfile.lock +3 -1
  13. data/lib/vanity.rb +11 -5
  14. data/lib/vanity/adapters.rb +20 -0
  15. data/lib/vanity/adapters/abstract_adapter.rb +0 -18
  16. data/lib/vanity/autoconnect.rb +1 -0
  17. data/lib/vanity/configuration.rb +211 -0
  18. data/lib/vanity/connection.rb +100 -0
  19. data/lib/vanity/frameworks.rb +2 -0
  20. data/lib/vanity/frameworks/rails.rb +7 -5
  21. data/lib/vanity/helpers.rb +1 -0
  22. data/{config → lib/vanity}/locales/vanity.en.yml +0 -0
  23. data/{config → lib/vanity}/locales/vanity.pt-BR.yml +0 -0
  24. data/lib/vanity/playground.rb +138 -338
  25. data/lib/vanity/vanity.rb +166 -0
  26. data/lib/vanity/version.rb +1 -1
  27. data/test/configuration_test.rb +90 -0
  28. data/test/connection_test.rb +46 -0
  29. data/test/data/redis.yml.url +2 -0
  30. data/test/data/vanity.yml.activerecord +6 -0
  31. data/test/data/vanity.yml.mock +4 -0
  32. data/test/data/vanity.yml.redis +5 -0
  33. data/test/data/vanity.yml.redis-erb +3 -0
  34. data/test/experiment/ab_test.rb +1 -1
  35. data/test/experiment/base_test.rb +1 -1
  36. data/test/frameworks/rails/rails_test.rb +34 -30
  37. data/test/metric/remote_test.rb +8 -8
  38. data/test/playground_test.rb +1 -27
  39. data/test/templates_test.rb +3 -2
  40. data/test/test_helper.rb +24 -12
  41. data/test/vanity_test.rb +130 -0
  42. metadata +25 -5
data/.travis.yml CHANGED
@@ -1,6 +1,10 @@
1
1
  sudo: false
2
2
  cache: bundler
3
3
  language: ruby
4
+ before_script:
5
+ - 'echo ''gem: --no-ri --no-rdoc'' > ~/.gemrc' # skip installing docs for gems
6
+ before_install:
7
+ - gem install bundler -v="1.8.0" # Minimum version of bundler required
4
8
  bundler_args: --without development
5
9
  script: 'bundle exec rake test'
6
10
  services:
@@ -21,5 +25,3 @@ gemfile:
21
25
  - gemfiles/rails4.gemfile
22
26
  - gemfiles/rails41.gemfile
23
27
  - gemfiles/rails42.gemfile
24
- before_script:
25
- - 'echo ''gem: --no-ri --no-rdoc'' > ~/.gemrc' # skip installing docs for gems
data/Appraisals CHANGED
@@ -1,8 +1,8 @@
1
1
  appraise "rails32" do
2
2
  gem "mocha", "~> 1.0", :require=>false
3
3
  gem "minitest", "~>4.2.0"
4
- gem "test-unit", "~> 3.0"
5
4
  gem "rails", "3.2.22"
5
+ gem "minitest_tu_shim", "~> 1.3.3", :platforms => :mri_22
6
6
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
7
7
  gem "passenger", "~>3.0"
8
8
  end
data/Gemfile CHANGED
@@ -14,11 +14,12 @@ gem "integration", "<= 0.1.0"
14
14
  gem "rubystats"
15
15
 
16
16
  # APIs
17
- gem "garb", "< 0.9.2" # API changes at this version
17
+ gem "garb", "< 0.9.2", :require => false # API changes at this version
18
18
 
19
19
  # Testing
20
20
  gem "timecop", :require=>false
21
21
  gem "webmock", :require=>false
22
+ gem "fakefs", :require => "fakefs/safe"
22
23
 
23
24
  platform :ruby do
24
25
  gem "bson_ext"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vanity (2.0.0.beta8)
4
+ vanity (2.0.0.beta9)
5
5
  i18n
6
6
 
7
7
  GEM
@@ -34,8 +34,10 @@ GEM
34
34
  coffee-script-source (1.9.1)
35
35
  colorator (0.1)
36
36
  crack (0.3.1)
37
+ directory_watcher (1.4.1)
37
38
  execjs (2.5.2)
38
39
  fast-stemmer (1.0.2)
40
+ fakefs (0.6.7)
39
41
  ffi (1.9.8)
40
42
  garb (0.9.1)
41
43
  activesupport (>= 2.2.0)
@@ -118,6 +120,7 @@ DEPENDENCIES
118
120
  appraisal (~> 1.0.2)
119
121
  bson_ext
120
122
  bundler (>= 1.0.0)
123
+ fakefs
121
124
  garb (< 0.9.2)
122
125
  integration (<= 0.1.0)
123
126
  jdbc-sqlite3
@@ -8,13 +8,14 @@ gem "redis-namespace", ">= 1.1.0"
8
8
  gem "mongo"
9
9
  gem "integration", "<= 0.1.0"
10
10
  gem "rubystats"
11
- gem "garb", "< 0.9.2"
11
+ gem "garb", "< 0.9.2", :require=>false
12
12
  gem "timecop", :require => false
13
13
  gem "webmock", :require => false
14
14
  gem "mocha", "~> 1.0", :require => false
15
+ gem "fakefs", :require=>"fakefs/safe"
15
16
  gem "minitest", "~>4.2.0"
16
- gem "test-unit", "~> 3.0"
17
17
  gem "rails", "3.2.22"
18
+ gem "minitest_tu_shim", "~> 1.3.3", :platforms => :mri_22
18
19
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
19
20
  gem "passenger", "~>3.0"
20
21
 
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.0.beta8)
10
+ vanity (2.0.0.beta9)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -69,6 +69,7 @@ GEM
69
69
  daemon_controller (1.0.0)
70
70
  erubis (2.7.0)
71
71
  execjs (2.5.2)
72
+ fakefs (0.6.7)
72
73
  fast-stemmer (1.0.2)
73
74
  ffi (1.9.8)
74
75
  garb (0.9.1)
@@ -132,7 +133,6 @@ GEM
132
133
  rake (>= 0.8.1)
133
134
  polyglot (0.3.5)
134
135
  posix-spawn (0.3.11)
135
- power_assert (0.2.2)
136
136
  pygments.rb (0.6.3)
137
137
  posix-spawn (~> 0.3.6)
138
138
  yajl-ruby (~> 1.2.0)
@@ -177,8 +177,6 @@ GEM
177
177
  rack (~> 1.0)
178
178
  tilt (~> 1.1, != 1.3.0)
179
179
  sqlite3 (1.3.10)
180
- test-unit (3.0.9)
181
- power_assert
182
180
  thor (0.19.1)
183
181
  tilt (1.4.1)
184
182
  timecop (0.3.5)
@@ -206,12 +204,14 @@ DEPENDENCIES
206
204
  appraisal (~> 1.0.2)
207
205
  bson_ext
208
206
  bundler (>= 1.0.0)
207
+ fakefs
209
208
  fastthread!
210
209
  garb (< 0.9.2)
211
210
  integration (<= 0.1.0)
212
211
  jdbc-sqlite3
213
212
  jekyll
214
213
  minitest (~> 4.2.0)
214
+ minitest_tu_shim (~> 1.3.3)
215
215
  mocha (~> 1.0)
216
216
  mongo
217
217
  passenger (~> 3.0)
@@ -222,7 +222,6 @@ DEPENDENCIES
222
222
  redis-namespace (>= 1.1.0)
223
223
  rubystats
224
224
  sqlite3 (~> 1.3.10)
225
- test-unit (~> 3.0)
226
225
  timecop
227
226
  vanity!
228
227
  webmock
@@ -8,10 +8,11 @@ gem "redis-namespace", ">= 1.1.0"
8
8
  gem "mongo"
9
9
  gem "integration", "<= 0.1.0"
10
10
  gem "rubystats"
11
- gem "garb", "< 0.9.2"
11
+ gem "garb", "< 0.9.2", :require=>false
12
12
  gem "timecop", :require => false
13
13
  gem "webmock", :require => false
14
14
  gem "mocha", "~> 1.0", :require => false
15
+ gem "fakefs", :require=>"fakefs/safe"
15
16
  gem "rails", "4.0.13"
16
17
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
17
18
  gem "passenger", "~>3.0"
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.0.beta8)
10
+ vanity (2.0.0.beta9)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -62,6 +62,7 @@ GEM
62
62
  directory_watcher (1.4.1)
63
63
  erubis (2.7.0)
64
64
  fast-stemmer (1.0.2)
65
+ fakefs (0.6.7)
65
66
  garb (0.9.1)
66
67
  activesupport (>= 2.2.0)
67
68
  crack (>= 0.1.6)
@@ -151,6 +152,7 @@ DEPENDENCIES
151
152
  appraisal (~> 1.0.2)
152
153
  bson_ext
153
154
  bundler (>= 1.0.0)
155
+ fakefs
154
156
  fastthread!
155
157
  garb (< 0.9.2)
156
158
  integration (<= 0.1.0)
@@ -8,10 +8,11 @@ gem "redis-namespace", ">= 1.1.0"
8
8
  gem "mongo"
9
9
  gem "integration", "<= 0.1.0"
10
10
  gem "rubystats"
11
- gem "garb", "< 0.9.2"
11
+ gem "garb", "< 0.9.2", :require=>false
12
12
  gem "timecop", :require => false
13
13
  gem "webmock", :require => false
14
14
  gem "mocha", "~> 1.0", :require => false
15
+ gem "fakefs", :require=>"fakefs/safe"
15
16
  gem "rails", "4.1.9"
16
17
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
17
18
  gem "passenger", "~>3.0"
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .././
9
9
  specs:
10
- vanity (2.0.0.beta8)
10
+ vanity (2.0.0.beta9)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -69,6 +69,7 @@ GEM
69
69
  daemon_controller (1.2.0)
70
70
  erubis (2.7.0)
71
71
  execjs (2.5.2)
72
+ fakefs (0.6.7)
72
73
  fast-stemmer (1.0.2)
73
74
  ffi (1.9.8)
74
75
  garb (0.9.1)
@@ -200,6 +201,7 @@ DEPENDENCIES
200
201
  appraisal (~> 1.0.2)
201
202
  bson_ext
202
203
  bundler (>= 1.0.0)
204
+ fakefs
203
205
  fastthread!
204
206
  garb (< 0.9.2)
205
207
  integration (<= 0.1.0)
@@ -8,10 +8,11 @@ gem "redis-namespace", ">= 1.1.0"
8
8
  gem "mongo"
9
9
  gem "integration", "<= 0.1.0"
10
10
  gem "rubystats"
11
- gem "garb", "< 0.9.2"
11
+ gem "garb", "< 0.9.2", :require=>false
12
12
  gem "timecop", :require => false
13
13
  gem "webmock", :require => false
14
14
  gem "mocha", "~> 1.0", :require => false
15
+ gem "fakefs", :require=>"fakefs/safe"
15
16
  gem "rails", "4.2.0"
16
17
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
17
18
  gem "passenger", "~>3.0"
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.0.beta8)
10
+ vanity (2.0.0.beta9)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -78,6 +78,7 @@ GEM
78
78
  daemon_controller (1.2.0)
79
79
  erubis (2.7.0)
80
80
  execjs (2.5.2)
81
+ fakefs (0.6.7)
81
82
  fast-stemmer (1.0.2)
82
83
  ffi (1.9.8)
83
84
  garb (0.9.1)
@@ -226,6 +227,7 @@ DEPENDENCIES
226
227
  appraisal (~> 1.0.2)
227
228
  bson_ext
228
229
  bundler (>= 1.0.0)
230
+ fakefs
229
231
  fastthread!
230
232
  garb (< 0.9.2)
231
233
  integration (<= 0.1.0)
data/lib/vanity.rb CHANGED
@@ -11,25 +11,31 @@ require "yaml"
11
11
  # @see Vanity::Playground
12
12
  # @see Vanity::Metric
13
13
  # @see Vanity::Experiment
14
+ # @see Vanity::Configuration
15
+ # @see Vanity::Connection
14
16
  module Vanity
15
17
  end
16
18
 
17
19
  require "vanity/version"
18
- # Metrics.
20
+ # Metrics
19
21
  require "vanity/metric/base"
20
22
  require "vanity/metric/active_record"
21
23
  require "vanity/metric/google_analytics"
22
24
  require "vanity/metric/remote"
23
- # Experiments.
25
+ # Experiments
24
26
  require "vanity/experiment/base"
25
27
  require "vanity/experiment/ab_test"
26
28
  # Database adapters
29
+ require "vanity/adapters"
27
30
  require "vanity/adapters/abstract_adapter"
28
31
  require "vanity/adapters/mock_adapter"
29
- # Playground.
32
+ # Playground
30
33
  require "vanity/playground"
31
- require "vanity/templates"
34
+ require "vanity/configuration"
35
+ require "vanity/connection"
32
36
  require "vanity/autoconnect"
37
+ require "vanity/templates"
33
38
  require "vanity/helpers"
34
- # Integration with various frameworks.
39
+ require "vanity/vanity"
40
+ # Integration with various frameworks
35
41
  require "vanity/frameworks"
@@ -0,0 +1,20 @@
1
+ module Vanity
2
+ module Adapters
3
+ class << self
4
+ # Creates new connection to underlying datastore and returns suitable
5
+ # adapter (adapter object extends AbstractAdapter and wraps the
6
+ # connection). Vanity.playground.establish_connection uses this.
7
+ #
8
+ # @since 1.4.0
9
+ def establish_connection(spec)
10
+ begin
11
+ require "vanity/adapters/#{spec[:adapter]}_adapter"
12
+ rescue LoadError
13
+ raise "Could not find #{spec[:adapter]} in your load path"
14
+ end
15
+ adapter_method = "#{spec[:adapter]}_connection"
16
+ send adapter_method, spec
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,23 +1,5 @@
1
1
  module Vanity
2
2
  module Adapters
3
-
4
- class << self
5
- # Creates new connection to underlying datastore and returns suitable
6
- # adapter (adapter object extends AbstractAdapter and wraps the
7
- # connection). Vanity.playground.establish_connection uses this.
8
- #
9
- # @since 1.4.0
10
- def establish_connection(spec)
11
- begin
12
- require "vanity/adapters/#{spec[:adapter]}_adapter"
13
- rescue LoadError
14
- raise "Could not find #{spec[:adapter]} in your load path"
15
- end
16
- adapter_method = "#{spec[:adapter]}_connection"
17
- send adapter_method, spec
18
- end
19
- end
20
-
21
3
  # Base class for all adapters. Adapters wrap underlying connection to a
22
4
  # datastore and implement an API that Vanity can use to store/access
23
5
  # metrics, experiments, etc.
@@ -24,6 +24,7 @@ module Vanity
24
24
  'db:seed',
25
25
  'db:setup',
26
26
  'db:structure:dump',
27
+ 'db:test:load',
27
28
  'db:version',
28
29
  'doc:app',
29
30
  'log:clear',
@@ -0,0 +1,211 @@
1
+ module Vanity
2
+ # This class holds the "how" Vanity operates. For the "what", please see
3
+ # Vanity::Playground.
4
+ class Configuration
5
+ class MissingEnvironment < StandardError; end
6
+
7
+ LEGACY_REDIS_CONFIG_FILE = "redis.yml"
8
+
9
+ class<<self
10
+ private
11
+
12
+ def default_logger # :nodoc:
13
+ logger = Logger.new(STDOUT)
14
+ logger.level = Logger::WARN
15
+ logger
16
+ end
17
+
18
+ def default_on_datastore_error(error, klass, method, arguments) # :nodoc:
19
+ log = "[#{Time.now.iso8601}]"
20
+ log << " [vanity #{klass} #{method}]"
21
+ log << " [#{error.message}]"
22
+ log << " [#{arguments.join(' ')}]"
23
+ Vanity.logger.error(log)
24
+ nil
25
+ end
26
+
27
+ def default_request_filter(request) # :nodoc:
28
+ request &&
29
+ request.env &&
30
+ request.env["HTTP_USER_AGENT"] &&
31
+ request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
32
+ end
33
+ end
34
+
35
+ DEFAULTS = {
36
+ collecting: true,
37
+ experiments_path: File.join(Pathname.new("."), "experiments"),
38
+ add_participant_route: "/vanity/add_participant",
39
+ logger: default_logger,
40
+ failover_on_datastore_error: false,
41
+ on_datastore_error: ->(error, klass, method, arguments) {
42
+ default_on_datastore_error(error, klass, method, arguments)
43
+ },
44
+ request_filter: ->(request) { default_request_filter(request) },
45
+ templates_path: File.expand_path(File.join(File.dirname(__FILE__), 'templates')),
46
+ locales_path: File.expand_path(File.join(File.dirname(__FILE__), 'locales')),
47
+ use_js: false,
48
+ config_path: File.join(Pathname.new("."), "config"),
49
+ config_file: "vanity.yml",
50
+ environment: ENV["RACK_ENV"] || ENV["RAILS_ENV"] || "development"
51
+ }.freeze
52
+
53
+ # True if saving results to the datastore (participants and conversions).
54
+ attr_writer :collecting
55
+
56
+ # Path to load experiment files from.
57
+ attr_writer :experiments_path
58
+
59
+ # URL to the add_participant action.
60
+ attr_writer :add_participant_route
61
+
62
+ # Logger. The default logs to STDOUT.
63
+ attr_writer :logger
64
+
65
+ # -- Datastore graceful failover --
66
+
67
+ # Turns on passing of errors to the Proc returned by #on_datastore_error.
68
+ # Set `config.failover_on_datastore_error` to `true` to turn this on.
69
+ #
70
+ # @since 2.0.0
71
+ attr_writer :failover_on_datastore_error
72
+
73
+ # Must return a Proc that accepts as parameters: the thrown error, the
74
+ # calling Class, the calling method, and an array of arguments passed to
75
+ # the calling method. The return value is ignored.
76
+ #
77
+ # @example
78
+ # Proc.new do |error, klass, method, arguments|
79
+ # ...
80
+ # end
81
+ #
82
+ # The default implementation logs this information to Playground#logger.
83
+ #
84
+ # Set a custom action by calling config.on_datastore_error =
85
+ # Proc.new { ... }.
86
+ #
87
+ # @since 2.0.0
88
+ attr_writer :on_datastore_error
89
+
90
+ # -- Blocking or ignoring visitors --
91
+
92
+ # Must return a Proc that accepts as a parameter the request object, if
93
+ # made available by the implement framework. The return value should be a
94
+ # boolean whether to ignore the request. This is called only for the JS
95
+ # callback action.
96
+ #
97
+ # @example
98
+ # Proc.new do |request|
99
+ # ...
100
+ # end
101
+ #
102
+ # The default implementation does a simple test of whether the request's
103
+ # HTTP_USER_AGENT header contains a URI, since well behaved bots typically
104
+ # include a reference URI in their user agent strings. (Original idea:
105
+ # http://stackoverflow.com/a/9285889.)
106
+ #
107
+ # Alternatively, one could filter an explicit list of IPs, add additional
108
+ # user agent strings to filter, or any custom test. Set a custom filter
109
+ # by calling config.request_filter = Proc.new { ... }.
110
+ #
111
+ # @since 2.0.0
112
+ attr_writer :request_filter
113
+
114
+ # Path to Vanity templates. Set this to override those in the gem.
115
+ attr_writer :templates_path
116
+
117
+ # Path to Vanity locales. Set this to override those in the gem.
118
+ attr_writer :locales_path
119
+
120
+ # -- Robot Detection --
121
+
122
+ # Call to indicate that participants should be added via js. This helps
123
+ # keep robots from participating in the A/B test and skewing results.
124
+ #
125
+ # If you want to use this:
126
+ # - Add <%= vanity_js %> to any page that needs uses an ab_test. vanity_js
127
+ # needs to be included after your call to ab_test so that it knows which
128
+ # version of the experiment the participant is a member of. The helper
129
+ # will render nothing if the there are no ab_tests running on the current
130
+ # page, so adding vanity_js to the bottom of your layouts is a good
131
+ # option. Keep in mind that if you set config.use_js = true and don't include
132
+ # vanity_js in your view no participants will be recorded.
133
+ #
134
+ # Note that a custom JS callback path can be set using:
135
+ # - Set config.add_participant_route = '/path/to/vanity/action',
136
+ # this should point to the add_participant path that is added with
137
+ # Vanity::Rails::Dashboard, make sure that this action is available
138
+ # to all users.
139
+ attr_writer :use_js
140
+ # Uses ./config by default.
141
+ attr_writer :config_path
142
+ # By default the vanity.yml file in the config_path variable. Variables
143
+ # scoped under the key for the current environment are extracted for the
144
+ # connection parameters. If there is no config/vanity.yml file, tries the
145
+ # configuration from config/redis.yml.
146
+ attr_writer :config_file
147
+ # In order of precedence, RACK_ENV, RAILS_ENV or `development`.
148
+ attr_writer :environment
149
+
150
+
151
+ # We independently list each attr_accessor to includes docs, otherwise
152
+ # something like DEFAULTS.each { |key, value| attr_accessor key } would be
153
+ # shorter.
154
+ DEFAULTS.each do |default, value|
155
+ define_method default do
156
+ self[default]
157
+ end
158
+ end
159
+
160
+ def [](arg)
161
+ if instance_variable_defined?("@#{arg}")
162
+ instance_variable_get("@#{arg}")
163
+ else
164
+ DEFAULTS[arg]
165
+ end
166
+ end
167
+
168
+ def setup_locales
169
+ locales = Dir[File.join(locales_path, '*.{rb,yml}')]
170
+ I18n.load_path += locales
171
+ end
172
+
173
+ # @return nil or a hash of symbolized keys for connection settings
174
+ def connection_params(file_name=nil)
175
+ file_name ||= config_file
176
+ file_path = File.join(config_path, file_name)
177
+
178
+ if File.exists?(file_path)
179
+ config = YAML.load(ERB.new(File.read(file_path)).result)
180
+ config ||= {}
181
+ params_for_environment = config[environment.to_s]
182
+
183
+ unless params_for_environment
184
+ raise MissingEnvironment.new("No configuration for #{environment}")
185
+ end
186
+
187
+ # Symbolize keys if it's a hash.
188
+ if params_for_environment.respond_to?(:inject)
189
+ params_for_environment.inject({}) { |h,kv| h[kv.first.to_sym] = kv.last ; h }
190
+ else
191
+ params_for_environment
192
+ end
193
+ end
194
+ end
195
+
196
+ # @deprecated
197
+ def redis_url_from_file
198
+ connection_url = connection_params(LEGACY_REDIS_CONFIG_FILE)
199
+
200
+ if connection_url
201
+ logger.warn(%q{Deprecated: Please specify the vanity config file, the default fallback to "config/redis.yml" may be removed in a future version.})
202
+
203
+ if connection_url =~ /^\w+:/
204
+ connection_url
205
+ else
206
+ "redis://" + connection_url
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end