redisrank 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +27 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +20 -0
  7. data/README.md +297 -0
  8. data/Rakefile +69 -0
  9. data/lib/redisrank.rb +106 -0
  10. data/lib/redisrank/buffer.rb +110 -0
  11. data/lib/redisrank/collection.rb +20 -0
  12. data/lib/redisrank/connection.rb +89 -0
  13. data/lib/redisrank/core_ext.rb +5 -0
  14. data/lib/redisrank/core_ext/bignum.rb +8 -0
  15. data/lib/redisrank/core_ext/date.rb +8 -0
  16. data/lib/redisrank/core_ext/fixnum.rb +8 -0
  17. data/lib/redisrank/core_ext/hash.rb +20 -0
  18. data/lib/redisrank/core_ext/time.rb +3 -0
  19. data/lib/redisrank/date.rb +88 -0
  20. data/lib/redisrank/event.rb +98 -0
  21. data/lib/redisrank/finder.rb +245 -0
  22. data/lib/redisrank/finder/date_set.rb +99 -0
  23. data/lib/redisrank/key.rb +84 -0
  24. data/lib/redisrank/label.rb +69 -0
  25. data/lib/redisrank/mixins/database.rb +11 -0
  26. data/lib/redisrank/mixins/date_helper.rb +8 -0
  27. data/lib/redisrank/mixins/options.rb +41 -0
  28. data/lib/redisrank/mixins/synchronize.rb +52 -0
  29. data/lib/redisrank/model.rb +77 -0
  30. data/lib/redisrank/result.rb +18 -0
  31. data/lib/redisrank/scope.rb +18 -0
  32. data/lib/redisrank/summary.rb +90 -0
  33. data/lib/redisrank/version.rb +3 -0
  34. data/redisrank.gemspec +31 -0
  35. data/spec/Find Results +3349 -0
  36. data/spec/buffer_spec.rb +104 -0
  37. data/spec/collection_spec.rb +20 -0
  38. data/spec/connection_spec.rb +67 -0
  39. data/spec/core_ext/hash_spec.rb +26 -0
  40. data/spec/database_spec.rb +10 -0
  41. data/spec/date_spec.rb +95 -0
  42. data/spec/event_spec.rb +86 -0
  43. data/spec/finder/date_set_spec.rb +527 -0
  44. data/spec/finder_spec.rb +205 -0
  45. data/spec/key_spec.rb +129 -0
  46. data/spec/label_spec.rb +86 -0
  47. data/spec/model_helper.rb +31 -0
  48. data/spec/model_spec.rb +191 -0
  49. data/spec/options_spec.rb +36 -0
  50. data/spec/redis-test.conf +9 -0
  51. data/spec/result_spec.rb +23 -0
  52. data/spec/scope_spec.rb +27 -0
  53. data/spec/spec_helper.rb +18 -0
  54. data/spec/summary_spec.rb +177 -0
  55. data/spec/synchronize_spec.rb +125 -0
  56. data/spec/thread_safety_spec.rb +39 -0
  57. metadata +235 -0
@@ -0,0 +1,125 @@
1
+ require "spec_helper"
2
+
3
+ module Redisrank
4
+ describe Synchronize do
5
+
6
+ let(:klass) { Synchronize }
7
+
8
+ describe '.included' do
9
+ it 'includes InstanceMethods in passed object' do
10
+ base = mock('Base')
11
+ base.should_receive(:include).with(klass::InstanceMethods)
12
+ klass.included(base)
13
+ end
14
+ end # included
15
+
16
+ describe '.monitor' do
17
+ it 'returns a Monitor instance' do
18
+ klass.monitor.should be_a(Monitor)
19
+ end
20
+
21
+ it 'caches Monitor instance' do
22
+ klass.monitor.object_id.should == klass.monitor.object_id
23
+ end
24
+ end # monitor
25
+
26
+ describe '.thread_safe' do
27
+ after { klass.instance_variable_set('@thread_safe', nil) }
28
+
29
+ it 'returns value of @thread_safe' do
30
+ klass.instance_variable_set('@thread_safe', true)
31
+ klass.thread_safe.should be_true
32
+ end
33
+
34
+ it 'defaults to false' do
35
+ klass.thread_safe.should be_false
36
+ end
37
+
38
+ it 'uses #synchronize' do
39
+ klass.monitor.should_receive(:synchronize).once
40
+ klass.thread_safe.should be_nil
41
+ end
42
+ end # thread_safe
43
+
44
+ describe '.thread_safe=' do
45
+ after { klass.instance_variable_set('@thread_safe', nil) }
46
+
47
+ it 'sets @thread_safe' do
48
+ klass.instance_variable_get('@thread_safe').should be_nil
49
+ klass.thread_safe = true
50
+ klass.instance_variable_get('@thread_safe').should be_true
51
+ end
52
+
53
+ it 'uses #synchronize' do
54
+ klass.monitor.should_receive(:synchronize).once
55
+ klass.thread_safe = true
56
+ klass.instance_variable_get('@thread_safe').should be_nil
57
+ end
58
+ end # thread_safe=
59
+
60
+ describe "InstanceMethods" do
61
+ subject { SynchronizeSpecHelper.new }
62
+
63
+ describe '.monitor' do
64
+ it 'defers to Redisrank::Synchronize' do
65
+ klass.should_receive(:monitor).once
66
+ subject.monitor
67
+ end
68
+ end # monitor
69
+
70
+ describe '.thread_safe' do
71
+ it ' defers to Redisrank::Synchronize' do
72
+ klass.should_receive(:thread_safe).once
73
+ subject.thread_safe
74
+ end
75
+ end # thread_safe
76
+
77
+ describe '.thread_safe=' do
78
+ it 'defers to Redisrank::Synchronize' do
79
+ klass.should_receive(:thread_safe=).once.with(true)
80
+ subject.thread_safe = true
81
+ end
82
+ end # thread_safe=
83
+
84
+ describe 'when #thread_safe is true' do
85
+ before { subject.stub(:thread_safe).and_return(true) }
86
+
87
+ describe '.synchronize' do
88
+ it 'defers to #monitor' do
89
+ subject.monitor.should_receive(:synchronize).once
90
+ subject.synchronize { 'foo' }
91
+ end
92
+
93
+ it 'passes block along to #monitor.synchronize' do
94
+ yielded = false
95
+ subject.synchronize { yielded = true }
96
+ yielded.should be_true
97
+ end
98
+ end # synchronize
99
+ end # when #thread_safe is true
100
+
101
+ describe 'when #thread_safe is false' do
102
+ before { subject.stub(:thread_safe).and_return(false) }
103
+
104
+ describe '.synchronize' do
105
+ it 'does not defer to #monitor' do
106
+ subject.monitor.should_not_receive(:synchronize)
107
+ subject.synchronize { 'foo' }
108
+ end
109
+
110
+ it 'yields block' do
111
+ yielded = false
112
+ subject.synchronize { yielded = true }
113
+ yielded.should be_true
114
+ end
115
+ end # synchronize
116
+ end # when #thread_safe is false
117
+
118
+ end
119
+
120
+ end # Synchronize
121
+ end # Redisrank
122
+
123
+ class SynchronizeSpecHelper
124
+ include Redisrank::Synchronize
125
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe "Thread-Safety" do
4
+ include Redisrank::Database
5
+
6
+ before(:each) do
7
+ db.flushdb
8
+ end
9
+
10
+ #TODO should have more comprehensive thread-safe tests
11
+
12
+ it "should incr in multiple threads" do
13
+ threads = []
14
+ 50.times do
15
+ threads << Thread.new {
16
+ db.incr("spec:incr")
17
+ }
18
+ end
19
+ threads.each { |t| t.join }
20
+ db.get("spec:incr").should == "50"
21
+ end
22
+
23
+ it "should store event in multiple threads" do
24
+ class ThreadSafetySpec
25
+ include Redisrank::Model
26
+ end
27
+ threads = []
28
+ 50.times do
29
+ threads << Thread.new {
30
+ ThreadSafetySpec.store("spec:threadsafe", {:count => 1, :rand => rand(5)})
31
+ }
32
+ end
33
+ threads.each { |t| t.join }
34
+ result = ThreadSafetySpec.fetch("spec:threadsafe", 5.hours.ago, 5.hours.from_now)
35
+ result.total[:count].should == 50
36
+ result.total[:rand].should <= 250
37
+ end
38
+
39
+ end
metadata ADDED
@@ -0,0 +1,235 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redisrank
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Felipe Lopes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.3.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: redis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: time_ext
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.9
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.9
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.7
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 2.1.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 2.1.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.6.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.6.3
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.6.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 0.6.1
125
+ description: A Redis-backed ranking storage and querying library written in Ruby.
126
+ email:
127
+ - felipelopes10@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".document"
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - Gemfile
136
+ - LICENSE
137
+ - README.md
138
+ - Rakefile
139
+ - lib/redisrank.rb
140
+ - lib/redisrank/buffer.rb
141
+ - lib/redisrank/collection.rb
142
+ - lib/redisrank/connection.rb
143
+ - lib/redisrank/core_ext.rb
144
+ - lib/redisrank/core_ext/bignum.rb
145
+ - lib/redisrank/core_ext/date.rb
146
+ - lib/redisrank/core_ext/fixnum.rb
147
+ - lib/redisrank/core_ext/hash.rb
148
+ - lib/redisrank/core_ext/time.rb
149
+ - lib/redisrank/date.rb
150
+ - lib/redisrank/event.rb
151
+ - lib/redisrank/finder.rb
152
+ - lib/redisrank/finder/date_set.rb
153
+ - lib/redisrank/key.rb
154
+ - lib/redisrank/label.rb
155
+ - lib/redisrank/mixins/database.rb
156
+ - lib/redisrank/mixins/date_helper.rb
157
+ - lib/redisrank/mixins/options.rb
158
+ - lib/redisrank/mixins/synchronize.rb
159
+ - lib/redisrank/model.rb
160
+ - lib/redisrank/result.rb
161
+ - lib/redisrank/scope.rb
162
+ - lib/redisrank/summary.rb
163
+ - lib/redisrank/version.rb
164
+ - redisrank.gemspec
165
+ - spec/Find Results
166
+ - spec/buffer_spec.rb
167
+ - spec/collection_spec.rb
168
+ - spec/connection_spec.rb
169
+ - spec/core_ext/hash_spec.rb
170
+ - spec/database_spec.rb
171
+ - spec/date_spec.rb
172
+ - spec/db/.emptydir
173
+ - spec/event_spec.rb
174
+ - spec/finder/date_set_spec.rb
175
+ - spec/finder_spec.rb
176
+ - spec/key_spec.rb
177
+ - spec/label_spec.rb
178
+ - spec/model_helper.rb
179
+ - spec/model_spec.rb
180
+ - spec/options_spec.rb
181
+ - spec/redis-test.conf
182
+ - spec/result_spec.rb
183
+ - spec/scope_spec.rb
184
+ - spec/spec_helper.rb
185
+ - spec/summary_spec.rb
186
+ - spec/synchronize_spec.rb
187
+ - spec/thread_safety_spec.rb
188
+ homepage: http://github.com/felipeclopes/redisrank
189
+ licenses: []
190
+ metadata: {}
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubyforge_project: redisrank
207
+ rubygems_version: 2.2.2
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: A Redis-backed ranking storage and querying library written in Ruby.
211
+ test_files:
212
+ - spec/Find Results
213
+ - spec/buffer_spec.rb
214
+ - spec/collection_spec.rb
215
+ - spec/connection_spec.rb
216
+ - spec/core_ext/hash_spec.rb
217
+ - spec/database_spec.rb
218
+ - spec/date_spec.rb
219
+ - spec/db/.emptydir
220
+ - spec/event_spec.rb
221
+ - spec/finder/date_set_spec.rb
222
+ - spec/finder_spec.rb
223
+ - spec/key_spec.rb
224
+ - spec/label_spec.rb
225
+ - spec/model_helper.rb
226
+ - spec/model_spec.rb
227
+ - spec/options_spec.rb
228
+ - spec/redis-test.conf
229
+ - spec/result_spec.rb
230
+ - spec/scope_spec.rb
231
+ - spec/spec_helper.rb
232
+ - spec/summary_spec.rb
233
+ - spec/synchronize_spec.rb
234
+ - spec/thread_safety_spec.rb
235
+ has_rdoc: