redis_backed_model 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,12 +13,9 @@ module RedisBackedModel
13
13
 
14
14
  def to_redis
15
15
  redis_commands = []
16
- redis_commands << redis_set_command
16
+ redis_commands << id_set_command
17
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
18
+ build_command_for_variable(var, redis_commands)
22
19
  end
23
20
  redis_commands
24
21
  end
@@ -40,18 +37,29 @@ module RedisBackedModel
40
37
  @scores << SortedSet.new(self.class, id, Hash[key,value])
41
38
  end
42
39
 
40
+ def build_command_for_variable(variable, collection)
41
+ value = instance_variable_get(variable)
42
+ if value.respond_to?(:each)
43
+ value.each do |redis_object|
44
+ collection << redis_object.to_redis
45
+ end
46
+ else
47
+ collection << instance_variable_to_redis(variable)
48
+ end
49
+ end
50
+
51
+ def id_set_command
52
+ "sadd|#{model_name_for_redis}_ids|#{id}"
53
+ end
54
+
43
55
  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'
56
+ "hset|#{model_name_for_redis}:#{id}|#{instance_variable.to_s.deinstance_variableize}|#{instance_variable_get(instance_variable.to_s)}"
45
57
  end
46
58
 
47
59
  def model_name_for_redis
48
60
  class_as_string = self.class.to_s.demodulize.underscore
49
61
  end
50
-
51
- def redis_set_command
52
- "sadd #{model_name_for_redis}_ids #{id}"
53
- end
54
-
62
+
55
63
  end
56
64
 
57
65
  end
@@ -11,7 +11,7 @@ module RedisBackedModel
11
11
  end
12
12
 
13
13
  def to_redis
14
- "zadd #{key} #{score} #{member}"
14
+ "zadd|#{key}|#{score}|#{member}"
15
15
  end
16
16
 
17
17
  private
@@ -1,3 +1,3 @@
1
1
  module RedisBackedModel
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -44,8 +44,8 @@ describe RedisBackedModel::SortedSet do
44
44
  @scored_set.send(:member).should eq(@scored_set.send(:model_id))
45
45
  end
46
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')
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
49
  end
50
50
 
51
51
  end
@@ -7,14 +7,14 @@ describe RedisBackedModel do
7
7
  end
8
8
 
9
9
  before(:each) do
10
- @attributes = {}
10
+ @attributes_with_id = {}
11
11
  @size = rand(9) + 1
12
12
  key_seed = 'abcdefghijklmn'
13
13
  (1..@size).each do | i |
14
- key = key_seed[i..(rand(i)+i)]
15
- @attributes[key] = i
14
+ key = key_seed[i..(rand(i)+i)]
15
+ @attributes_with_id[key] = i
16
16
  end
17
- @attributes['id'] = 1
17
+ @attributes_with_id['id'] = 1
18
18
  @size += 1
19
19
  end
20
20
 
@@ -30,9 +30,9 @@ describe RedisBackedModel do
30
30
  end
31
31
 
32
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)
33
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
34
34
  rbm.instance_variables.count.should eq(@size)
35
- @attributes.each do | key, value|
35
+ @attributes_with_id.each do | key, value|
36
36
  # rbm.instance_variables.include?("@#{key}".to_sym).should eq(true), "no instance variable for #{key}"
37
37
  rbm.instance_variables.include?(key.instance_variableize).should eq(true), "no instance variable for #{key}"
38
38
  end
@@ -43,25 +43,27 @@ describe RedisBackedModel do
43
43
  expect { RedisBackedModel::RedisBackedModel.new(['w', 1]) }.to raise_error(ArgumentError)
44
44
  end
45
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
46
+ context "initializing with the attribute hash contains a score_[|] key" do
47
+ before(:each) do
48
+ @score_key = 'score_[foo|bar]'
49
+ @attributes_with_id[@score_key] = '[1|2]'
50
+ end
51
+ it "does not create a key for any score_[|] attribute" do
52
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
53
+ rbm.instance_variables.include?(@score_key.instance_variableize).should eq(false)
54
+ end
52
55
 
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)
56
+ it "creates a scores instance variable if there are any score_[x|y] attributes" do
57
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
58
+ rbm.instance_variables.include?('scores'.instance_variableize).should eq(true)
59
+ end
58
60
  end
59
61
 
60
- it "stores score_ attributes in scores as SortedSet objects" do
62
+ it "stores score_ attributes as SortedSet objects in scores" do
61
63
  ['score_[foo|bar]', 'score_[baz|qux]', 'score_[wibble|wobble]'].each_with_index do |score,index|
62
- @attributes[score] = "[#{index}|#{index + 1}]"
64
+ @attributes_with_id[score] = "[#{index}|#{index + 1}]"
63
65
  end
64
- rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
66
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
65
67
  rbm.send(:scores).each do |score|
66
68
  score.class.should eq(RedisBackedModel::SortedSet)
67
69
  end
@@ -69,70 +71,62 @@ describe RedisBackedModel do
69
71
 
70
72
  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
73
  ['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
+ @attributes_with_id[s] = '[i|i+1]'
75
+ expect { rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id) }.to raise_error(NameError)
74
76
  end
75
77
  end
76
78
 
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')
79
+ it "returns a redis command to add the model id to a set named (model_name)_ids" do
80
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
81
+ rbm.send(:id_set_command).should eq('sadd|redis_backed_model_ids|1')
80
82
  end
81
83
 
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
84
+ context "creating an hset command for an instance variable" do
85
+ before(:each) do
86
+ @rbm = RedisBackedModel::RedisBackedModel.new()
87
+ @rbm.instance_variable_set('@id', 1)
88
+ @rbm.instance_variable_set('@foo', 20)
89
+ end
90
+ it "creates a hset command for instance variables" do
91
+ @rbm.send(:instance_variable_to_redis, '@foo').should eq('hset|redis_backed_model:1|foo|20')
92
+ end
88
93
 
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
94
+ it "puts a underscored version of the model name as the first part of the hset key name in instance_variable_set" do
95
+ hset_command = @rbm.send(:instance_variable_to_redis, '@foo')
96
+ hset_command.split('|')[1].split(':')[0].should eq(RedisBackedModel.to_s.underscore)
97
+ end
96
98
 
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
99
+ it "puts the id as the second part of the hset hset key name in instance_variable_set" do
100
+ hset_command = @rbm.send(:instance_variable_to_redis, '@foo')
101
+ hset_command.split('|')[1].split(':')[1].should eq(@rbm.instance_variable_get('@id').to_s)
102
+ end
104
103
 
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
104
+ it "puts the instance_variable_name (without @) as the hset field name in instance_variable_set" do
105
+ hset_command = @rbm.send(:instance_variable_to_redis, '@foo')
106
+ hset_command.split('|')[2].should eq('foo')
107
+ end
112
108
 
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')
109
+ it "put the instance variable value as the hset value in instance_variable_set" do
110
+ hset_command = @rbm.send(:instance_variable_to_redis, '@foo')
111
+ hset_command.split('|')[3].should eq('20')
112
+ end
113
+
114
+ it "only ever has 4 arguments" do
115
+ @rbm.instance_variable_set('@bar', 'string with spaces')
116
+ hset_command = @rbm.send(:instance_variable_to_redis, '@bar')
117
+ hset_command.split('|').count.should eq(4)
118
+ end
119
119
  end
120
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
121
  it "includes as sadd command in to_redis" do
128
- @attributes['score_[foo|bar]'] = '[1|2012-03-04]'
129
- rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
122
+ @attributes_with_id['score_[foo|bar]'] = '[1|2012-03-04]'
123
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
130
124
  rbm.to_redis.select { |command| command.match(/sadd/)}.count.should eq(1)
131
125
  end
132
126
 
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)
127
+ it "includes a hset command for each instance variable except scores in to_redis" do
128
+ @attributes_with_id['score_[foo|bar]'] = '[1|2012-03-04]'
129
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
136
130
  expected = rbm.instance_variables.count - 1
137
131
  rbm.to_redis.select {|command| command.match(/hset/)}.count.should eq(expected)
138
132
  end
@@ -140,11 +134,23 @@ describe RedisBackedModel do
140
134
  it "includes a sorted_set.to_redis command for each score attribute in to_redis" do
141
135
  scores = ['score_[foo|bar]', 'score_[baz|qux]', 'score_[wibble|wobble]']
142
136
  scores.each_with_index do |score,index|
143
- @attributes[score] = "[#{index}|#{index + 1}]"
137
+ @attributes_with_id[score] = "[#{index}|#{index + 1}]"
144
138
  end
145
- rbm = RedisBackedModel::RedisBackedModel.new(@attributes)
139
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
146
140
  rbm.to_redis.select { |command| command.match(/zadd/) }.count.should eq(scores.count)
147
141
  end
142
+
143
+ it "should not error if there are no scores" do
144
+ rbm = RedisBackedModel::RedisBackedModel.new(@attributes_with_id)
145
+ rbm.to_redis.select { |command| command.include?('score')}.count.should eq(0)
146
+ end
147
+
148
+ it "should convert symbol attributes to strings" do
149
+ attributes = {:id => 1, :first_name => 'jane', :last_name => 'doe'}
150
+ rbm = RedisBackedModel::RedisBackedModel.new(attributes)
151
+ rbm.instance_variables.include?(:@id).should eq(true)
152
+ rbm.instance_variable_get(:@id).should eq(1)
153
+ end
148
154
 
149
155
  end
150
156
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_backed_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-29 00:00:00.000000000Z
13
+ date: 2012-08-31 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &2153616260 !ruby/object:Gem::Requirement
17
+ requirement: &2156372240 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2153616260
25
+ version_requirements: *2156372240
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: redis
28
- requirement: &2153615840 !ruby/object:Gem::Requirement
28
+ requirement: &2156371820 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2153615840
36
+ version_requirements: *2156371820
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: activesupport
39
- requirement: &2153615420 !ruby/object:Gem::Requirement
39
+ requirement: &2156371400 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2153615420
47
+ version_requirements: *2156371400
48
48
  description: Provides methods to models that are backed by a redis instance.
49
49
  email:
50
50
  - iwhitney@ssa-i.org