redis_field 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +8 -0
- data/Appraisals +7 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +74 -0
- data/Rakefile +12 -0
- data/lib/redis_field.rb +19 -0
- data/lib/redis_field/active_record.rb +29 -0
- data/lib/redis_field/active_record/.keep +0 -0
- data/lib/redis_field/active_record/class_methods.rb +46 -0
- data/lib/redis_field/base.rb +64 -0
- data/lib/redis_field/dirty_field_set.rb +28 -0
- data/lib/redis_field/testing.rb +15 -0
- data/lib/redis_field/version.rb +3 -0
- data/redis_field.gemspec +27 -0
- data/spec/redis_field_spec.rb +87 -0
- data/spec/spec_helper.rb +19 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 92ca1df1cd3b11678cf1b4b5c69192f61c51cddb
|
4
|
+
data.tar.gz: 23ebf3789852b1db989db9b038fdfbb08094a444
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7bbbe4accc45ab56acd0cae5ee5f0a3e1426d53e200b08c93e3e489a833b3e52dbeebf8c34a932245dfc4483035efd0fa63f444048789d95956e5c61e51946ea
|
7
|
+
data.tar.gz: 8926f8e07a10ce0aa970d49a0abbfda1a19a63a76a6e3ca6294d4b265eb2123b5ba93552a93e4f45ac53016c891d790d97b1d4c95d499d95c765339bdb3935e8
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Appraisals
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Theodore Konukhov
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# RedisField [](https://travis-ci.org/konukhov/redis_field) [](https://codeclimate.com/github/konukhov/redis_field)
|
2
|
+
|
3
|
+
RedisField is a simple Ruby gem that stores model-specific data to Redis just like normal ActiveRecord attributes.
|
4
|
+
|
5
|
+
Great for caches, API responses etc.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
You will need ActiveRecord 3.2+ (oops, gotta test it).
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'redis_field', github: 'konukhov/redis_field'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
### 1. Specify field names in your model
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
class User < ActiveRecord::Base
|
28
|
+
redis_field :some_data
|
29
|
+
|
30
|
+
# redis_fields is just an alias to redis_field
|
31
|
+
redis_fields :facebook_friend_ids, :last_logged_in
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
### 2. Use these fields just like normal AR attributes
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
user = User.last
|
39
|
+
```
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
user.some_data = "Testing redis_field"
|
43
|
+
user.save
|
44
|
+
user.reload.some_data # -> "Testing redis_field"
|
45
|
+
```
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
user.update_attributes(last_logged_in: Time.now)
|
49
|
+
user.reload.last_logged_in # -> 2014-04-05 01:00:00 +0000
|
50
|
+
```
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
**NB** This library is not an ORM for Redis, so it simply marshalls data before storing to Redis. There's no types coercion or anything like that.
|
55
|
+
|
56
|
+
More docs and features soon. :heart:
|
57
|
+
|
58
|
+
## Testing
|
59
|
+
|
60
|
+
Just run
|
61
|
+
|
62
|
+
```
|
63
|
+
$ rake spec
|
64
|
+
```
|
65
|
+
|
66
|
+
See [Appraisal](https://github.com/thoughtbot/appraisal) for testing against different ActiveRecord versions.
|
67
|
+
|
68
|
+
## Contributing
|
69
|
+
|
70
|
+
1. Fork it
|
71
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
72
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
73
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
74
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/lib/redis_field.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'redis'
|
3
|
+
require 'redis/namespace'
|
4
|
+
|
5
|
+
require 'redis_field/base'
|
6
|
+
require 'redis_field/active_record'
|
7
|
+
require 'redis_field/version'
|
8
|
+
|
9
|
+
module RedisField
|
10
|
+
# more detailed explanation
|
11
|
+
class NotCompatibleError < StandardError; end
|
12
|
+
end
|
13
|
+
|
14
|
+
if defined?(ActiveRecord::Base)
|
15
|
+
# railtie?
|
16
|
+
ActiveRecord::Base.send :include, RedisField::ActiveRecord
|
17
|
+
else
|
18
|
+
raise RedisField::NotCompatibleError
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'redis_field/active_record/class_methods'
|
2
|
+
|
3
|
+
module RedisField
|
4
|
+
module ActiveRecord
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
extend ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
def redis_fields
|
12
|
+
self.class.redis_fields
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_redis_fields
|
16
|
+
redis_fields.each do |field_name|
|
17
|
+
send "#{field_name}=", Base.new(self, field_name).get
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def sync_redis_fields!
|
22
|
+
redis_fields.each do |field_name|
|
23
|
+
if send(field_name).present?
|
24
|
+
Base.new(self, field_name).set send(field_name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
File without changes
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'redis_field/dirty_field_set'
|
2
|
+
|
3
|
+
module RedisField
|
4
|
+
module ActiveRecord
|
5
|
+
module ClassMethods
|
6
|
+
|
7
|
+
def redis_fields
|
8
|
+
@redis_fields ||= DirtyFieldSet.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def has_redis_fields(*field_names)
|
12
|
+
redis_fields.add(*field_names)
|
13
|
+
|
14
|
+
init_redis_field_callbacks
|
15
|
+
init_redis_field_accessors
|
16
|
+
end
|
17
|
+
alias_method :has_redis_field, :has_redis_fields
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def init_redis_field_callbacks
|
22
|
+
unless @_redis_fields_callbacks_initted
|
23
|
+
class_eval do
|
24
|
+
after_save :sync_redis_fields!
|
25
|
+
after_initialize :get_redis_fields
|
26
|
+
end
|
27
|
+
@_redis_fields_callbacks_initted = true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def init_redis_field_accessors
|
32
|
+
redis_fields.changes.each do |field_name|
|
33
|
+
method_name = :"#{field_name}_redis_value"
|
34
|
+
|
35
|
+
class_eval do
|
36
|
+
attr_accessor method_name
|
37
|
+
end
|
38
|
+
|
39
|
+
alias_method :"#{field_name}", method_name
|
40
|
+
alias_method :"#{field_name}=", :"#{method_name}="
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module RedisField
|
2
|
+
class Base
|
3
|
+
class_attribute :redis, :path_prefix, :env
|
4
|
+
attr_writer :model_id
|
5
|
+
|
6
|
+
# TODO: move to config class
|
7
|
+
class << self
|
8
|
+
def path_prefix
|
9
|
+
@@path_prefix ||= 'ar_redis_field'
|
10
|
+
end
|
11
|
+
|
12
|
+
def redis
|
13
|
+
@@redis ||= Redis.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def env
|
17
|
+
@@env ||= ENV['RAILS_ENV'] || "development"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(object, field_name)
|
22
|
+
@object, @field_name = object, field_name
|
23
|
+
end
|
24
|
+
|
25
|
+
def set(value)
|
26
|
+
redis.set @field_name, Marshal.dump(value)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get
|
30
|
+
Marshal.load field_path if field_path
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def object_model_name
|
36
|
+
@object_model_name ||= @object.class.model_name.param_key
|
37
|
+
end
|
38
|
+
|
39
|
+
def model_id
|
40
|
+
@model_id ||= @object.id
|
41
|
+
end
|
42
|
+
|
43
|
+
def redis
|
44
|
+
@redis ||= Redis::Namespace.new(redis_path, redis: self.class.redis)
|
45
|
+
end
|
46
|
+
|
47
|
+
def redis_path
|
48
|
+
[
|
49
|
+
self.class.path_prefix,
|
50
|
+
env,
|
51
|
+
object_model_name,
|
52
|
+
model_id
|
53
|
+
].join ':'
|
54
|
+
end
|
55
|
+
|
56
|
+
def field_path
|
57
|
+
redis[@field_name]
|
58
|
+
end
|
59
|
+
|
60
|
+
def env
|
61
|
+
self.class.env
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module RedisField
|
4
|
+
class DirtyFieldSet
|
5
|
+
def initialize
|
6
|
+
@changes = Set.new
|
7
|
+
@field_names = Set.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def field_names
|
11
|
+
@field_names.to_a
|
12
|
+
end
|
13
|
+
|
14
|
+
def changes
|
15
|
+
@changes.to_a
|
16
|
+
end
|
17
|
+
|
18
|
+
def each(&block)
|
19
|
+
field_names.each(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(*new_field_names)
|
23
|
+
new_field_names = Set.new(new_field_names)
|
24
|
+
@changes = new_field_names - @field_names
|
25
|
+
@field_names = @field_names + new_field_names
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RedisField
|
2
|
+
module Testing
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def reset_keys!
|
6
|
+
unless Base.env == 'test'
|
7
|
+
raise 'Keys could be resetted only in test environment'
|
8
|
+
end
|
9
|
+
|
10
|
+
path = [Base.path_prefix, Base.env].join ':'
|
11
|
+
keys = Base.redis.keys.grep(/^#{path}.+/)
|
12
|
+
Base.redis.del *keys if keys.any?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/redis_field.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'redis_field/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "redis_field"
|
8
|
+
spec.version = RedisField::VERSION
|
9
|
+
spec.authors = ["Theodore Konukhov"]
|
10
|
+
spec.email = ["komolov.f@gmail.com"]
|
11
|
+
spec.summary = %q{Redis attributes in ActiveRecord models}
|
12
|
+
spec.description = %q{This gem allows you to easily use Redis to store data as regular ActiveRecord attributes}
|
13
|
+
spec.homepage = "http://theodore.io"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency 'activerecord', '>= 3.2'
|
21
|
+
spec.add_dependency 'redis'
|
22
|
+
spec.add_dependency 'redis-namespace'
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative './spec_helper.rb'
|
2
|
+
|
3
|
+
describe RedisField do
|
4
|
+
describe RedisField::ActiveRecord do
|
5
|
+
TestUser.has_redis_fields :test_field1, :test_field2
|
6
|
+
TestUser.has_redis_field :test_field3
|
7
|
+
|
8
|
+
def get_from_redis(id, key)
|
9
|
+
data = Redis::Namespace.new("ar_redis_field:test:test_user:#{id}", redis: RedisField::Base.redis)[key]
|
10
|
+
Marshal.load data if data
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:klass) { TestUser }
|
14
|
+
subject { klass.new }
|
15
|
+
|
16
|
+
after(:all) do
|
17
|
+
RedisField::Testing.reset_keys!
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'klass has redis fields' do
|
21
|
+
expect(
|
22
|
+
klass.instance_variable_get('@redis_fields').field_names
|
23
|
+
).to eq([:test_field1, :test_field2, :test_field3])
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'klass\' redis fields are an instance of DirtyFieldSet' do
|
27
|
+
expect(
|
28
|
+
klass.instance_variable_get('@redis_fields')
|
29
|
+
).to be_instance_of(RedisField::DirtyFieldSet)
|
30
|
+
end
|
31
|
+
|
32
|
+
it { should respond_to :test_field1 }
|
33
|
+
it { should respond_to :test_field2 }
|
34
|
+
it { should respond_to :test_field3 }
|
35
|
+
it { should respond_to :test_field1= }
|
36
|
+
it { should respond_to :test_field2= }
|
37
|
+
it { should respond_to :test_field3= }
|
38
|
+
it { should respond_to :test_field1_redis_value }
|
39
|
+
it { should respond_to :test_field2_redis_value }
|
40
|
+
it { should respond_to :test_field3_redis_value }
|
41
|
+
it { should respond_to :test_field1_redis_value= }
|
42
|
+
it { should respond_to :test_field2_redis_value= }
|
43
|
+
it { should respond_to :test_field3_redis_value= }
|
44
|
+
it { should respond_to :sync_redis_fields! }
|
45
|
+
it { should respond_to :get_redis_fields }
|
46
|
+
|
47
|
+
it 'runs save callbacks' do
|
48
|
+
subject.run_callbacks(:save) do
|
49
|
+
subject.should_receive :sync_redis_fields!
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'runs initialize callbacks' do
|
54
|
+
subject.run_callbacks(:initialize) do
|
55
|
+
subject.should_receive :get_redis_fields
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'saving' do
|
60
|
+
before(:each) do
|
61
|
+
subject.save
|
62
|
+
@user = subject
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should not save in redis until the record is saved' do
|
66
|
+
@user.test_field1 = 'test'
|
67
|
+
get_from_redis(@user, 'test_field1').should be_nil
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should save to redis when the record is saved' do
|
71
|
+
@user.test_field1 = 'test1'
|
72
|
+
@user.test_field2 = 'test2'
|
73
|
+
@user.test_field3 = 'test3'
|
74
|
+
|
75
|
+
@user.save
|
76
|
+
|
77
|
+
get_from_redis(@user.id, 'test_field1').should eq('test1')
|
78
|
+
get_from_redis(@user.id, 'test_field2').should eq('test2')
|
79
|
+
get_from_redis(@user.id, 'test_field3').should eq('test3')
|
80
|
+
|
81
|
+
@user.reload.test_field1.should eq('test1')
|
82
|
+
@user.reload.test_field2.should eq('test2')
|
83
|
+
@user.reload.test_field3.should eq('test3')
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler.setup
|
3
|
+
|
4
|
+
require 'redis_field'
|
5
|
+
require 'redis_field/testing'
|
6
|
+
|
7
|
+
RedisField::Base.redis = Redis.new db: 15
|
8
|
+
ENV['RAILS_ENV'] = 'test'
|
9
|
+
|
10
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define do
|
13
|
+
create_table :test_users do |t|
|
14
|
+
t.string :name
|
15
|
+
t.timestamps
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestUser < ActiveRecord::Base; end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis_field
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Theodore Konukhov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: redis-namespace
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: This gem allows you to easily use Redis to store data as regular ActiveRecord
|
98
|
+
attributes
|
99
|
+
email:
|
100
|
+
- komolov.f@gmail.com
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- .gitignore
|
106
|
+
- .travis.yml
|
107
|
+
- Appraisals
|
108
|
+
- Gemfile
|
109
|
+
- LICENSE.txt
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- lib/redis_field.rb
|
113
|
+
- lib/redis_field/active_record.rb
|
114
|
+
- lib/redis_field/active_record/.keep
|
115
|
+
- lib/redis_field/active_record/class_methods.rb
|
116
|
+
- lib/redis_field/base.rb
|
117
|
+
- lib/redis_field/dirty_field_set.rb
|
118
|
+
- lib/redis_field/testing.rb
|
119
|
+
- lib/redis_field/version.rb
|
120
|
+
- redis_field.gemspec
|
121
|
+
- spec/redis_field_spec.rb
|
122
|
+
- spec/spec_helper.rb
|
123
|
+
homepage: http://theodore.io
|
124
|
+
licenses:
|
125
|
+
- MIT
|
126
|
+
metadata: {}
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - '>='
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
requirements: []
|
142
|
+
rubyforge_project:
|
143
|
+
rubygems_version: 2.2.2
|
144
|
+
signing_key:
|
145
|
+
specification_version: 4
|
146
|
+
summary: Redis attributes in ActiveRecord models
|
147
|
+
test_files:
|
148
|
+
- spec/redis_field_spec.rb
|
149
|
+
- spec/spec_helper.rb
|