redisrank 0.1.0

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.
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: