fastaccess 0.0.2
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/MIT-LICENSE +20 -0
- data/README.md +137 -0
- data/Rakefile +38 -0
- data/lib/fastaccess.rb +13 -0
- data/lib/fastaccess/acts_with_fastaccess_on.rb +54 -0
- data/lib/fastaccess/fastaccess.rb +204 -0
- data/lib/fastaccess/mixins.rb +13 -0
- data/lib/fastaccess/version.rb +4 -0
- data/lib/generators/fastaccess/initialize_generator.rb +12 -0
- data/lib/generators/fastaccess/templates/initializer.rb +3 -0
- data/lib/tasks/fastaccess_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/simple_string.rb +42 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/fastaccess.rb +3 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/redis.rb +1 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130123183844_create_simple_strings.rb +8 -0
- data/test/dummy/db/migrate/20130124180635_add_some_string_to_simple_string.rb +5 -0
- data/test/dummy/db/schema.rb +22 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +58 -0
- data/test/dummy/log/test.log +1575 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/simple_strings.yml +11 -0
- data/test/dummy/test/unit/simple_string_test.rb +7 -0
- data/test/fastaccess_test.rb +76 -0
- data/test/test_helper.rb +15 -0
- metadata +174 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2013 YOURNAME
|
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,137 @@
|
|
1
|
+
# fastaccess - redisfast access on generated content
|
2
|
+
|
3
|
+
Many web applications which provide textual content to the user
|
4
|
+
have much more reads than writes. This can mean, that on
|
5
|
+
every 10k reads there is one write (see some popular
|
6
|
+
blogs or newspages).
|
7
|
+
|
8
|
+
Often this content is generated, because the input source
|
9
|
+
is some markup format, like markdown. This means, that
|
10
|
+
there is always the need to generate this content into
|
11
|
+
html.
|
12
|
+
|
13
|
+
And this is why fastaccess exists.
|
14
|
+
It modifies any given method, which generates content,
|
15
|
+
and stores it in a [redis][1] database.
|
16
|
+
If this content solely depends on a model attribute,
|
17
|
+
for example like the *body* in a blog post, it will
|
18
|
+
be auto updated, if the underlying model attribute
|
19
|
+
changes. Otherwise you can trigger the update manually.
|
20
|
+
|
21
|
+
Now lets see how this works:
|
22
|
+
|
23
|
+
## Using fastaccess
|
24
|
+
|
25
|
+
First, of course, you'll need to include this gem in your
|
26
|
+
projects *Gemfile*.
|
27
|
+
|
28
|
+
Since this gem utilizes redis, make sure that this is installed
|
29
|
+
and generate the default initializer with
|
30
|
+
|
31
|
+
rails generate fastaccess:initialize
|
32
|
+
|
33
|
+
This will create a file in *config/initializers/fastaccess.rb* which
|
34
|
+
will create an instance of a redis database-connection. If you already
|
35
|
+
have one of those, feel free to replace the new instance with your version.
|
36
|
+
|
37
|
+
Now, in your project you will have to use the gem-provided
|
38
|
+
`acts_with_fastaccess_on` method to mark certain methods
|
39
|
+
as registered with fastaccess for caching.
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
class Post < ActiveRecord::Base
|
43
|
+
attr_accessible :title, :body
|
44
|
+
acts_with_fastaccess_on :markdown_body
|
45
|
+
|
46
|
+
def markdown_body
|
47
|
+
markdown(self.body)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
In this example a Model named *Post* is defined which has title and
|
53
|
+
body attributes. The `markdown_body` method converts the markdown-body to
|
54
|
+
html. Since this is needed often, it cached via redis.
|
55
|
+
|
56
|
+
The previous example utilizes a method, which operates on one of the models
|
57
|
+
attributes. So the redis-content will be updated if the pertaining Model
|
58
|
+
instance is updated. But what if you have a method which uses more input
|
59
|
+
than just specific attributes, which will update the models timestamp?
|
60
|
+
|
61
|
+
For this case there is an explicit update method, which allows you
|
62
|
+
to trigger an update.
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
# app/models/post.rb
|
66
|
+
class Post < ActiveRecord::Base
|
67
|
+
attr_accessible :title, :body, :tags
|
68
|
+
has_many :tags
|
69
|
+
acts_with_fastaccess_on :tag_list
|
70
|
+
include Fastaccess::Mixins
|
71
|
+
|
72
|
+
def tag_list
|
73
|
+
self.tags.map(&name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# app/controllers/posts_controller.rb
|
78
|
+
class PostsController < ApplicationController
|
79
|
+
def update
|
80
|
+
@post = Post.find_by_id(params[:id])
|
81
|
+
@post.update_on :tag_list
|
82
|
+
respond_to do |format|
|
83
|
+
if @post.update_attributes(params[:post])
|
84
|
+
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
|
85
|
+
format.json { head :no_content }
|
86
|
+
else
|
87
|
+
format.html { render action: "edit" }
|
88
|
+
format.json { render json: @post.errors, status: :unprocessable_entity }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
If you don't want to *pollute* your model with these mixin-methods you
|
95
|
+
can also call
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
Fastaccess::Fastaccess.update_content @post, :on => :tag_list, :arguments => []
|
99
|
+
```
|
100
|
+
|
101
|
+
## Features
|
102
|
+
|
103
|
+
### planned features
|
104
|
+
|
105
|
+
- ~~disable auto-update via option setting (planned for *0.0.2*)~~ *implemented*
|
106
|
+
- more update flexibility
|
107
|
+
- e.g. custom update-constraints instead of calling `update_content` manually
|
108
|
+
|
109
|
+
## License
|
110
|
+
|
111
|
+
([The MIT License][mit])
|
112
|
+
|
113
|
+
Copyright © 2013:
|
114
|
+
|
115
|
+
- [Tim Reddehase][1]
|
116
|
+
|
117
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
118
|
+
a copy of this software and associated documentation files (the
|
119
|
+
'Software'), to deal in the Software without restriction, including
|
120
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
121
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
122
|
+
permit persons to whom the Software is furnished to do so, subject to
|
123
|
+
the following conditions:
|
124
|
+
|
125
|
+
The above copyright notice and this permission notice shall be
|
126
|
+
included in all copies or substantial portions of the Software.
|
127
|
+
|
128
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
129
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
130
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
131
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
132
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
133
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
134
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
135
|
+
|
136
|
+
[mit]: http://opensource.org/licenses/MIT
|
137
|
+
[1]: http://rightsrestricted.com
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'Fastaccess'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
|
30
|
+
Rake::TestTask.new(:test) do |t|
|
31
|
+
t.libs << 'lib'
|
32
|
+
t.libs << 'test'
|
33
|
+
t.pattern = 'test/**/*_test.rb'
|
34
|
+
t.verbose = false
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
task :default => :test
|
data/lib/fastaccess.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'fastaccess/fastaccess.rb'
|
3
|
+
require 'fastaccess/mixins.rb'
|
4
|
+
require 'fastaccess/acts_with_fastaccess_on'
|
5
|
+
|
6
|
+
module Fastaccess
|
7
|
+
|
8
|
+
# convenience method to setup fastaccess
|
9
|
+
def self.setup(&block)
|
10
|
+
Fastaccess.setup &block
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Fastaccess
|
2
|
+
module ActsWithFastaccessOn
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# registers the pertaining method as one, which return value
|
10
|
+
# is provided through redis.
|
11
|
+
# This is for fast access of otherwise generated content
|
12
|
+
# with a high reading/writing ratio.
|
13
|
+
#
|
14
|
+
# @param [Symbol] method_name denoting the pertaining method
|
15
|
+
# this method shouldn't be defined beforehand.
|
16
|
+
# @param [Hash] options is basic options hash.
|
17
|
+
# currently has no effect on execution.
|
18
|
+
def acts_with_fastaccess_on(method_name, options = {})
|
19
|
+
Fastaccess.register_on self, method_name, options
|
20
|
+
# options = Fastaccess.merge_defaults(options)
|
21
|
+
define_singleton_method :method_added do |on_method|
|
22
|
+
if Fastaccess.registered? self, on_method
|
23
|
+
method = on_method
|
24
|
+
alias_name = Fastaccess.alias_for method
|
25
|
+
if !method_defined?(alias_name)
|
26
|
+
alias_method alias_name, method
|
27
|
+
define_method method do |*args|
|
28
|
+
fastaccess_id = Fastaccess.id_for(self)
|
29
|
+
redis_id = "#{method}_#{fastaccess_id}"
|
30
|
+
opts = Fastaccess.options_for(self, method)
|
31
|
+
content_current = opts[:auto_update] ? Fastaccess.update_check(self) : true
|
32
|
+
if Fastaccess.redis.exists(redis_id) && content_current
|
33
|
+
response = Fastaccess.redis.get(redis_id)
|
34
|
+
begin
|
35
|
+
return JSON.parse response
|
36
|
+
rescue JSON::ParserError
|
37
|
+
return response
|
38
|
+
end
|
39
|
+
else
|
40
|
+
response = method(alias_name).call(*args)
|
41
|
+
Fastaccess.update_info self
|
42
|
+
Fastaccess.redis.set(redis_id, (response.is_a? String) ? response : response.to_json)
|
43
|
+
return response
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
ActiveRecord::Base.send :include, Fastaccess::ActsWithFastaccessOn
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Fastaccess
|
4
|
+
# This class contains the most
|
5
|
+
# relevant helpers methods, which
|
6
|
+
# doesn't need to be located elsewhere.
|
7
|
+
# (e.g. like mixins)
|
8
|
+
class Fastaccess
|
9
|
+
|
10
|
+
# the default options for the
|
11
|
+
# acts_with_fastaccess_on method.
|
12
|
+
ACTS_OPTIONS_DEFAULTS = {
|
13
|
+
:auto_update => true
|
14
|
+
}
|
15
|
+
|
16
|
+
@@fastaccess_on = Hash.new Set.new
|
17
|
+
@@last_updated = Hash.new
|
18
|
+
@@registered_options = Hash.new ACTS_OPTIONS_DEFAULTS
|
19
|
+
|
20
|
+
# accessor for the actual registration hash.
|
21
|
+
cattr_accessor :fastaccess_on
|
22
|
+
|
23
|
+
# hash for monitoring updates on registered objects.
|
24
|
+
cattr_accessor :last_updated
|
25
|
+
|
26
|
+
# hash for options of registered methods
|
27
|
+
cattr_accessor :registered_options
|
28
|
+
|
29
|
+
# registers a method, defined on a certain class,
|
30
|
+
# as being handled by fastaccess.
|
31
|
+
# @param [Class] class_name is the actual Class.
|
32
|
+
# @param [Symbol] method_name is the symbol
|
33
|
+
# denoting the actual method
|
34
|
+
def self.register_on(class_name, method_name, options={})
|
35
|
+
self.fastaccess_on[class_name] << method_name
|
36
|
+
id = options_id_for(class_name, method_name)
|
37
|
+
self.registered_options[id] = self.registered_options[id].merge(options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# inquires if a certain method, which is
|
41
|
+
# defined on a given class, is registered
|
42
|
+
# with fastaccess.
|
43
|
+
# @param [Class] class_name is the actual Class.
|
44
|
+
# @param [Symbol] method_name is the symbol
|
45
|
+
# denoting the actual method
|
46
|
+
def self.registered?(class_name, method_name)
|
47
|
+
self.fastaccess_on[class_name].include? method_name
|
48
|
+
end
|
49
|
+
|
50
|
+
# gets the options for a class_name, method_name
|
51
|
+
# pair
|
52
|
+
# @param [Class] class_name is the actual Class.
|
53
|
+
# @param [Symbol] method_name is the symbol
|
54
|
+
# denoting the actual method
|
55
|
+
# @return [Hash] the options for the pair
|
56
|
+
def self.options_for(class_name, method_name)
|
57
|
+
id = options_id_for(class_name, method_name)
|
58
|
+
self.registered_options[id]
|
59
|
+
end
|
60
|
+
|
61
|
+
# checks if a class_instance seems to be
|
62
|
+
# up to date according to updated_at timestamp.
|
63
|
+
# This only works if the registered method
|
64
|
+
# is actually dependent (and only dependent)
|
65
|
+
# on model attributes.
|
66
|
+
# @param [Object] class_instance any Object,
|
67
|
+
# preferably a decendent of
|
68
|
+
# an actual Rails Model.
|
69
|
+
# @return [Boolean] is true if everything is up to date.
|
70
|
+
def self.update_check(class_instance)
|
71
|
+
id = self.id_for(class_instance)
|
72
|
+
return true if self.last_updated[id] == false
|
73
|
+
class_instance.updated_at == self.last_updated[id]
|
74
|
+
end
|
75
|
+
|
76
|
+
# updates the timestamp in the redis
|
77
|
+
# database with the one from class_instance.
|
78
|
+
# usually called after there was new content
|
79
|
+
# pushed into redis (or content was updated)
|
80
|
+
# @param [Object] class_instance any Object,
|
81
|
+
# preferably a decendent of
|
82
|
+
# an actual Rails Model.
|
83
|
+
def self.update_info(class_instance)
|
84
|
+
id = self.id_for(class_instance)
|
85
|
+
unless self.last_updated[id] == false
|
86
|
+
self.last_updated[id] = class_instance.updated_at
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# creates a fastaccess id for a class_instance
|
91
|
+
# @param [Object] class_instance any Object,
|
92
|
+
# preferably a decendent of
|
93
|
+
# an actual Rails Model.
|
94
|
+
# @return [String] the identifier
|
95
|
+
def self.id_for(class_instance)
|
96
|
+
"#{class_instance.class}-#{class_instance.id}"
|
97
|
+
end
|
98
|
+
|
99
|
+
# creates the id for the registered_options hash
|
100
|
+
# @param [Class] class_name a class singleton object
|
101
|
+
# @param [Symbol] method_name is the identifying symbol of a method
|
102
|
+
# @return [String] the identifier
|
103
|
+
def self.options_id_for(class_name, method_name)
|
104
|
+
"#{class_name}-#{method_name}"
|
105
|
+
end
|
106
|
+
|
107
|
+
# returns the aliased name for
|
108
|
+
# any given method.
|
109
|
+
# @param [Symbol] method a symbol denoting the method.
|
110
|
+
# @return [Symbol] aliased method symbol.
|
111
|
+
def self.alias_for(method)
|
112
|
+
:"aliased_#{method}"
|
113
|
+
end
|
114
|
+
|
115
|
+
# setting content in redis
|
116
|
+
# @param [String] redis_id the id
|
117
|
+
# @param [Object] content should be basic content
|
118
|
+
# e.g. String, Hash, Array or Numbers.
|
119
|
+
def self.set(redis_id, content)
|
120
|
+
redis.set(redis_id, (content.is_a? String) ? content : content.to_json)
|
121
|
+
end
|
122
|
+
|
123
|
+
# getting redis content
|
124
|
+
# @param [String] redis_id the id
|
125
|
+
# @return [Object] stored content
|
126
|
+
def self.get(redis_id)
|
127
|
+
response = redis.get(redis_id)
|
128
|
+
begin
|
129
|
+
return JSON.parse response
|
130
|
+
rescue JSON::ParserError
|
131
|
+
return response
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# manually update content in redis
|
136
|
+
# for a given object.
|
137
|
+
# @param [Object] obj any Object,
|
138
|
+
# preferably a decendent of
|
139
|
+
# an actual Rails Model.
|
140
|
+
# @param [Hash] options a simple hash
|
141
|
+
# @option options [Symbol] :on a certain registered
|
142
|
+
# method.
|
143
|
+
# @option options [Array] :arguments an array of
|
144
|
+
# arguments passed to
|
145
|
+
# the :on method or, if
|
146
|
+
# :on is not present, every
|
147
|
+
# method registered with fastaccess
|
148
|
+
# on the pertaining class.
|
149
|
+
def self.update_content(obj, options={})
|
150
|
+
class_name = obj.is_a?(Class) ? obj : obj.class
|
151
|
+
methods = if method = options[:on]
|
152
|
+
if registered? class_name, method
|
153
|
+
[method]
|
154
|
+
else
|
155
|
+
[]
|
156
|
+
end
|
157
|
+
else
|
158
|
+
fastaccess_on[class_name]
|
159
|
+
end
|
160
|
+
methods.each do |method|
|
161
|
+
callable = obj.method( alias_for(method) )
|
162
|
+
content = if options[:arguments]
|
163
|
+
callable.call(*options[:arguments])
|
164
|
+
else
|
165
|
+
callable.call
|
166
|
+
end
|
167
|
+
self.set("#{method}_#{id_for(obj)}", content)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# setting up the environment for fastaccess
|
172
|
+
def self.setup(&block)
|
173
|
+
instance_eval &block if block_given?
|
174
|
+
end
|
175
|
+
|
176
|
+
# setting the global redis instance for fastaccess.
|
177
|
+
# @param [Redis] redis_instance The Connection to a redis server
|
178
|
+
def self.set_redis(redis_instance)
|
179
|
+
if redis_instance
|
180
|
+
@@redis = redis_instance
|
181
|
+
else
|
182
|
+
@@redis = $redis if $redis
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# getting the redis instance
|
187
|
+
# @return [Redis] the instance
|
188
|
+
def self.redis
|
189
|
+
@@redis
|
190
|
+
end
|
191
|
+
|
192
|
+
# merges the, hopefully, reasonable
|
193
|
+
# defaults with the supplied options
|
194
|
+
# hash
|
195
|
+
# @param [Hash] options the pertaining options
|
196
|
+
# supplied by the user
|
197
|
+
# @return [Hash] the merged options hash
|
198
|
+
def self.merge_defaults(options)
|
199
|
+
ACTS_OPTIONS_DEFAULTS.merge(options)
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|