redis_backed_model 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.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .rvmrc
7
+ .rspec
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in redis_backed_model.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ian Whitney
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,29 @@
1
+ # RedisBackedModel
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'redis_backed_model'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install redis_backed_model
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new('spec')
6
+
7
+ # If you want to make this the default task
8
+ task :default => :spec
@@ -0,0 +1,22 @@
1
+ module ActiveSupport::Inflector
2
+
3
+ def deinstance_variableize(the_string)
4
+ result = the_string.to_s.dup
5
+ result.downcase.gsub(/^@/, '')
6
+ end
7
+
8
+ def instance_variableize(the_string)
9
+ "@#{the_string}".to_sym
10
+ end
11
+
12
+ end
13
+ class String
14
+ def deinstance_variableize
15
+ ActiveSupport::Inflector.deinstance_variableize(self)
16
+ end
17
+
18
+ def instance_variableize
19
+ ActiveSupport::Inflector.instance_variableize(self)
20
+ end
21
+
22
+ end
@@ -0,0 +1,57 @@
1
+ module RedisBackedModel
2
+ class RedisBackedModel
3
+
4
+ def initialize(attributes={})
5
+ if attributes.class == Hash
6
+ attributes.each do |key, value|
7
+ add_to_instance_variables(key, value)
8
+ end
9
+ else
10
+ raise ArgumentError
11
+ end
12
+ end
13
+
14
+ def to_redis
15
+ redis_commands = []
16
+ redis_commands << redis_set_command
17
+ instance_variables.each do | var |
18
+ redis_commands << instance_variable_to_redis(var) if instance_variable_to_redis(var)
19
+ end
20
+ scores.each do |score|
21
+ redis_commands << score.to_redis
22
+ end
23
+ redis_commands
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :id, :scores
29
+
30
+ def add_to_instance_variables(key, value)
31
+ if key.match(/score_\[\w+\|\w+\]/)
32
+ add_to_scores(key, value)
33
+ else
34
+ self.instance_variable_set("@#{key}", value)
35
+ end
36
+ end
37
+
38
+ def add_to_scores(key, value)
39
+ @scores ||= []
40
+ @scores << SortedSet.new(self.class, id, Hash[key,value])
41
+ end
42
+
43
+ def instance_variable_to_redis(instance_variable)
44
+ "hset #{model_name_for_redis}:#{id} #{instance_variable.to_s.deinstance_variableize} #{instance_variable_get(instance_variable.to_s)}" unless instance_variable.to_s == '@id'
45
+ end
46
+
47
+ def model_name_for_redis
48
+ class_as_string = self.class.to_s.demodulize.underscore
49
+ end
50
+
51
+ def redis_set_command
52
+ "sadd #{model_name_for_redis}_ids #{id}"
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,64 @@
1
+ module RedisBackedModel
2
+
3
+ class SortedSet
4
+ require 'date'
5
+
6
+
7
+ def initialize(model, model_id, definition)
8
+ @model = model
9
+ @model_id = model_id
10
+ @definition = definition
11
+ end
12
+
13
+ def to_redis
14
+ "zadd #{key} #{score} #{member}"
15
+ end
16
+
17
+ private
18
+
19
+ attr_accessor :model, :model_id #, :by_attribute, :score_label, :score
20
+
21
+ def definition_keys
22
+ @definition.keys.first
23
+ end
24
+
25
+ def definition_values
26
+ @definition.values.first
27
+ end
28
+
29
+ def key_by
30
+ parse_definition(definition_keys)[1]
31
+ end
32
+
33
+ def key_for
34
+ parse_definition(definition_keys)[0]
35
+ end
36
+
37
+ def key_model_name
38
+ @model.to_s.underscore.pluralize
39
+ end
40
+
41
+ def key_for_value
42
+ parse_definition(definition_values)[0]
43
+ end
44
+
45
+ def member
46
+ @model_id
47
+ end
48
+
49
+ def key
50
+ "#{key_model_name}_for_#{key_for}_by_#{key_by}:#{key_for_value}"
51
+ end
52
+
53
+ def score
54
+ score = parse_definition(definition_values)[1]
55
+ key_by == 'date' ? Date.parse(score).to_time.to_f : score
56
+ end
57
+
58
+ def parse_definition(string)
59
+ string.match(/.*\[(\S+)\]/)[1].split('|')
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,3 @@
1
+ module RedisBackedModel
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "redis_backed_model/version"
2
+ require 'active_support/inflector'
3
+ require 'redis_backed_model/redis_backed_model'
4
+ require 'redis_backed_model/sorted_set'
5
+ require 'redis_backed_model/inflections'
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/redis_backed_model/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Ian Whitney", "Davin Lagerroos"]
6
+ gem.email = ["iwhitney@ssa-i.org","dlaerroos@ssa-i.org"]
7
+ gem.description = %q{Provides methods to models that are backed by a redis instance.}
8
+ gem.summary = %q{Provides methods for the creation of redis-backed models, specifically the handling of sorted-set attributes and returning commands that will store the object in redis.}
9
+ gem.homepage = "https://github.com/SeniorServiceAmerica/redis_backed_model"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "redis_backed_model"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = RedisBackedModel::VERSION
17
+ gem.add_development_dependency 'rspec'
18
+ gem.add_development_dependency 'redis'
19
+ gem.add_dependency('active_support')
20
+ end
@@ -0,0 +1,50 @@
1
+ class Person < RedisBackedModel::RedisBackedModel
2
+ attr_reader :id, :first_name, :last_name
3
+
4
+ def self.all
5
+ all = []
6
+ ids.each do |id|
7
+ all << self.find(id)
8
+ end
9
+ all
10
+ end
11
+
12
+ #def self.first
13
+ #id = ids.first
14
+ #self.find(id)
15
+ #end
16
+
17
+ def self.find(id)
18
+ attr = $redis.hgetall("person:#{id}")
19
+ self.new(attr.merge({:id => id}))
20
+ end
21
+
22
+ #def self.last
23
+ #id = ids.last
24
+ #self.find(id)
25
+ #end
26
+
27
+ def self.to_csv
28
+ f = File.new("person.csv", "w+")
29
+ f << "id,first_name,last_name\n"
30
+ self.all.each do |x|
31
+ f << "#{x.id},#{x.first_name},#{x.last_name}\n"
32
+ end
33
+ end
34
+
35
+ # def initialize(attr)
36
+ # @id = attr[:id]
37
+ # @first_name = attr["first_name"]
38
+ # @last_name = attr["last_name"]
39
+ # end
40
+
41
+ def name
42
+ "#{self.first_name} #{self.last_name}"
43
+ end
44
+
45
+ private
46
+
47
+ def self.ids
48
+ @ids ||= $redis.sort('person_ids')
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+
4
+ describe String do
5
+
6
+ it "instance_variablizes by pre-pending an '@' and turning itself into a symbol" do
7
+ 'my_test_string'.instance_variableize.should eq(:@my_test_string)
8
+ end
9
+
10
+ it "deinstance_variableizes by removing the leading '@" do
11
+ '@instance_variable'.deinstance_variableize.should eq('instance_variable')
12
+ end
13
+
14
+ end
@@ -0,0 +1,51 @@
1
+ require "spec_helper"
2
+
3
+ describe RedisBackedModel::SortedSet do
4
+ before(:all) do
5
+
6
+ end
7
+
8
+ before(:each) do
9
+ @scored_set = RedisBackedModel::SortedSet.new(FalseClass, 1, {'score_[foo|bar]' => '[wibble|wobble]'})
10
+ end
11
+
12
+ it "returns returns first part of [|] definition key as for_key" do
13
+ @scored_set.send(:key_for).should eq('foo')
14
+ end
15
+
16
+ it "returns first part of [|] definition value as for_value" do
17
+ @scored_set.send(:key_for_value).should eq('wibble')
18
+ end
19
+
20
+ it "returns the model, underscored and pluralized as model_name_for_key" do
21
+ @scored_set.send(:key_model_name).should eq('false_classes')
22
+ end
23
+
24
+ it "returns second part of definition key as key" do
25
+ @scored_set.send(:key_by).should eq('bar')
26
+ end
27
+
28
+ it "returns (key_model_name) + '_for_' + key_for + '_by_' + key_by + ':' + for_value as key" do
29
+ @scored_set.send(:key).should eq('false_classes_for_foo_by_bar:wibble')
30
+ end
31
+
32
+ it "returns second part of definition value as score" do
33
+ @scored_set.send(:score).should eq('wobble')
34
+ end
35
+
36
+ it "converts score dates to miliseconds" do
37
+ set = RedisBackedModel::SortedSet.new(FalseClass, 1, {'score_[foo|date]'=>'[wibble|2012-03-04]'})
38
+ date_in_milliseconds = Date.civil(2012,3,4).to_time.to_f
39
+ set.send(:score).should eq(date_in_milliseconds)
40
+ end
41
+
42
+ it "returns model_is as member" do
43
+ @scored_set.send(:member).should eq(1)
44
+ @scored_set.send(:member).should eq(@scored_set.send(:model_id))
45
+ end
46
+
47
+ it "returns 'zadd key value model_id' as to_redis" do
48
+ @scored_set.to_redis.should eq('zadd false_classes_for_foo_by_bar:wibble wobble 1')
49
+ end
50
+
51
+ end
@@ -0,0 +1,171 @@
1
+ require "spec_helper"
2
+ require 'extras/person'
3
+
4
+ describe RedisBackedModel do
5
+ before(:all) do
6
+
7
+ end
8
+
9
+ before(:each) do
10
+ @attributes = {}
11
+ @size = rand(9) + 1
12
+ key_seed = 'abcdefghijklmn'
13
+ (1..@size).each do | i |
14
+ key = key_seed[i..(rand(i)+i)]
15
+ @attributes[key] = i
16
+ end
17
+ @attributes['id'] = 1
18
+ @size += 1
19
+ end
20
+
21
+ it "has no instance variables unless specified" do
22
+ rbm = RedisBackedModel::RedisBackedModel.new
23
+ rbm.instance_variables.count.should eq(0)
24
+ end
25
+
26
+ it "creates an instance variable for a hash with one member" do
27
+ attributes = {'id' => 1}
28
+ rbm = RedisBackedModel::RedisBackedModel.new(attributes)
29
+ rbm.instance_variables.include?(:@id).should eq(true)
30
+ end
31
+
32
+ it "creates an instance variable for each member of an attribute hash that doesn't have scores" do
33
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
34
+ rbm.instance_variables.count.should eq(@size)
35
+ @attributes.each do | key, value|
36
+ # rbm.instance_variables.include?("@#{key}".to_sym).should eq(true), "no instance variable for #{key}"
37
+ rbm.instance_variables.include?(key.instance_variableize).should eq(true), "no instance variable for #{key}"
38
+ end
39
+ end
40
+
41
+ it "raises an argument error if something other than a hash is passed in" do
42
+ expect { RedisBackedModel::RedisBackedModel.new('w') }.to raise_error(ArgumentError)
43
+ expect { RedisBackedModel::RedisBackedModel.new(['w', 1]) }.to raise_error(ArgumentError)
44
+ end
45
+
46
+ it "does not create a key for any score_[|] attribute" do
47
+ score_key = 'score_[foo|bar]'
48
+ @attributes[score_key] = '[1|2]'
49
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
50
+ rbm.instance_variables.include?(score_key.instance_variableize).should eq(false)
51
+ end
52
+
53
+ it "creates a scores instance variable if there are any score_[x|y] attributes" do
54
+ score_key = 'score_[foo|bar]'
55
+ @attributes[score_key] = '[1|2]'
56
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
57
+ rbm.instance_variables.include?('scores'.instance_variableize).should eq(true)
58
+ end
59
+
60
+ it "stores score_ attributes in scores as SortedSet objects" do
61
+ ['score_[foo|bar]', 'score_[baz|qux]', 'score_[wibble|wobble]'].each_with_index do |score,index|
62
+ @attributes[score] = "[#{index}|#{index + 1}]"
63
+ end
64
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
65
+ rbm.send(:scores).each do |score|
66
+ score.class.should eq(RedisBackedModel::SortedSet)
67
+ end
68
+ end
69
+
70
+ it "does not add near matches to scores instance variable, so it tries to add it as an instance variable instead, raising a name error because of []" do
71
+ ['score_[foobar]', 'score[foo|bar]', 'score_[foobar|]'].each_with_index do |s,i|
72
+ @attributes[s] = '[i|i+1]'
73
+ expect { rbm = RedisBackedModel::RedisBackedModel.new(@attributes) }.to raise_error(NameError)
74
+ end
75
+ end
76
+
77
+ it "returns a redis command to adds the model id to a set named (model_name)_ids" do
78
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
79
+ rbm.send(:redis_set_command).should eq('sadd redis_backed_model_ids 1')
80
+ end
81
+
82
+ it "creates a hset command for instance variables that are not id" do
83
+ rbm = RedisBackedModel::RedisBackedModel.new()
84
+ rbm.instance_variable_set('@id', 1)
85
+ rbm.instance_variable_set('@foo', 20)
86
+ rbm.send(:instance_variable_to_redis, '@foo').should eq('hset redis_backed_model:1 foo 20')
87
+ end
88
+
89
+ it "puts a underscored version of the model name as the first part of the hset key name in instance_variable_set" do
90
+ rbm = RedisBackedModel::RedisBackedModel.new()
91
+ rbm.instance_variable_set('@id', 1)
92
+ rbm.instance_variable_set('@foo', 20)
93
+ hset_command = rbm.send(:instance_variable_to_redis, '@foo')
94
+ hset_command.split(' ')[1].split(':')[0].should eq(RedisBackedModel.to_s.underscore)
95
+ end
96
+
97
+ it "puts the id as the second part of the hset hset key name in instance_variable_set" do
98
+ rbm = RedisBackedModel::RedisBackedModel.new()
99
+ rbm.instance_variable_set('@id', 1)
100
+ rbm.instance_variable_set('@foo', 20)
101
+ hset_command = rbm.send(:instance_variable_to_redis, '@foo')
102
+ hset_command.split(' ')[1].split(':')[1].should eq(rbm.instance_variable_get('@id').to_s)
103
+ end
104
+
105
+ it "puts the instance_variable_name (without @) as the hset field name in instance_variable_set" do
106
+ rbm = RedisBackedModel::RedisBackedModel.new()
107
+ rbm.instance_variable_set('@id', 1)
108
+ rbm.instance_variable_set('@foo', 20)
109
+ hset_command = rbm.send(:instance_variable_to_redis, '@foo')
110
+ hset_command.split(' ')[2].should eq('foo')
111
+ end
112
+
113
+ it "put the instance variable value as the hset value in instance_variable_set" do
114
+ rbm = RedisBackedModel::RedisBackedModel.new()
115
+ rbm.instance_variable_set('@id', 1)
116
+ rbm.instance_variable_set('@foo', 20)
117
+ hset_command = rbm.send(:instance_variable_to_redis, '@foo')
118
+ hset_command.split(' ')[3].should eq('20')
119
+ end
120
+
121
+ it "does not create an hset command for the id instance variable" do
122
+ rbm = RedisBackedModel::RedisBackedModel.new()
123
+ rbm.instance_variable_set('@id', 1)
124
+ rbm.send(:instance_variable_to_redis, '@id').should eq(nil)
125
+ end
126
+
127
+ it "includes as sadd command in to_redis" do
128
+ @attributes['score_[foo|bar]'] = '[1|2012-03-04]'
129
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
130
+ rbm.to_redis.select { |command| command.match(/sadd/)}.count.should eq(1)
131
+ end
132
+
133
+ it "includes a hset command for each instance variable except id in to_redis" do
134
+ @attributes['score_[foo|bar]'] = '[1|2012-03-04]'
135
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
136
+ expected = rbm.instance_variables.count - 1
137
+ rbm.to_redis.select {|command| command.match(/hset/)}.count.should eq(expected)
138
+ end
139
+
140
+ it "includes a sorted_set.to_redis command for each score attribute in to_redis" do
141
+ scores = ['score_[foo|bar]', 'score_[baz|qux]', 'score_[wibble|wobble]']
142
+ scores.each_with_index do |score,index|
143
+ @attributes[score] = "[#{index}|#{index + 1}]"
144
+ end
145
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
146
+ rbm.to_redis.select { |command| command.match(/zadd/) }.count.should eq(scores.count)
147
+ end
148
+
149
+ end
150
+
151
+ # test inheriting from RedisBackedModel
152
+ describe Person do
153
+
154
+ before(:all) do
155
+ $redis.hset 'person:0', 'first_name', 'jane'
156
+ $redis.hset 'person:0', 'last_name', 'doe'
157
+ end
158
+
159
+ it "should set its instance_variables from redis, using RedisBackedModel initialize" do
160
+ person = Person.find(0)
161
+ person.instance_variables.include?(:@first_name).should eq(true)
162
+ person.instance_variables.include?(:@last_name).should eq(true)
163
+ person.instance_variables.include?(:@id).should eq(true)
164
+ end
165
+
166
+ it "should have same name method" do
167
+ person = Person.find(0)
168
+ person.name.should eq('jane doe')
169
+ end
170
+
171
+ end
@@ -0,0 +1,25 @@
1
+ require 'redis_backed_model'
2
+ require 'redis'
3
+
4
+ # This file was generated by the `rspec --init` command. Conventionally, all
5
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
6
+ # Require this file using `require "spec_helper"` to ensure that it is only
7
+ # loaded once.
8
+ #
9
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
10
+ RSpec.configure do |config|
11
+ config.treat_symbols_as_metadata_keys_with_true_values = true
12
+ config.run_all_when_everything_filtered = true
13
+ config.filter_run :focus
14
+
15
+ # Run specs in random order to surface order dependencies. If you find an
16
+ # order dependency and want to debug it, you can fix the order by providing
17
+ # the seed, which is printed after each run.
18
+ # --seed 1234
19
+ config.order = 'random'
20
+ end
21
+
22
+ SPEC_ROOT = File.dirname(__FILE__)
23
+ require File.join(SPEC_ROOT, '/../lib/redis_backed_model')
24
+
25
+ $redis = Redis.new()
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis_backed_model
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ian Whitney
9
+ - Davin Lagerroos
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-08-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: redis
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: active_support
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ description: Provides methods to models that are backed by a redis instance.
64
+ email:
65
+ - iwhitney@ssa-i.org
66
+ - dlaerroos@ssa-i.org
67
+ executables: []
68
+ extensions: []
69
+ extra_rdoc_files: []
70
+ files:
71
+ - .gitignore
72
+ - Gemfile
73
+ - LICENSE
74
+ - README.md
75
+ - Rakefile
76
+ - lib/redis_backed_model.rb
77
+ - lib/redis_backed_model/inflections.rb
78
+ - lib/redis_backed_model/redis_backed_model.rb
79
+ - lib/redis_backed_model/sorted_set.rb
80
+ - lib/redis_backed_model/version.rb
81
+ - redis_backed_model.gemspec
82
+ - spec/extras/person.rb
83
+ - spec/redis_backed_model/inflections_spec.rb
84
+ - spec/redis_backed_model/sorted_set_spec.rb
85
+ - spec/redis_backed_model_spec.rb
86
+ - spec/spec_helper.rb
87
+ homepage: https://github.com/SeniorServiceAmerica/redis_backed_model
88
+ licenses: []
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 1.8.21
108
+ signing_key:
109
+ specification_version: 3
110
+ summary: Provides methods for the creation of redis-backed models, specifically the
111
+ handling of sorted-set attributes and returning commands that will store the object
112
+ in redis.
113
+ test_files:
114
+ - spec/extras/person.rb
115
+ - spec/redis_backed_model/inflections_spec.rb
116
+ - spec/redis_backed_model/sorted_set_spec.rb
117
+ - spec/redis_backed_model_spec.rb
118
+ - spec/spec_helper.rb