mongoid-random 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in mongoid-random.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ guard 'spork' do
2
+ watch('Gemfile')
3
+ watch('Gemfile.lock')
4
+ watch('test/test_helper.rb')
5
+ end
6
+
7
+ guard 'minitest' do
8
+ watch(%r|^test/test_(.*)\.rb|)
9
+ watch(%r|^test/(.*)_test\.rb|)
10
+ watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
11
+ watch(%r|^test/test_helper\.rb|) { "test" }
12
+ end
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,5 @@
1
+ module Mongoid
2
+ module Random
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ module Mongoid
2
+ module Random
3
+
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ field :_randomization_key, type: Float
8
+ before_create :generate_mongoid_random_key
9
+
10
+ index [ include?(Mongoid::Paranoia) ? [ :deleted_at, 1 ] : nil, [ :_randomization_key, 1 ] ].compact # TODO: MONGOID: Apply a patch
11
+ end
12
+
13
+
14
+ module ClassMethods
15
+
16
+ def random(count=1, random_key=rand)
17
+ if where(:_randomization_key => { '$gte' => random_key }).count >= count
18
+ where(:_randomization_key => { '$gte' => random_key })
19
+ elsif where(:_randomization_key => { '$lte' => random_key }).count >= count
20
+ where(:_randomization_key => { '$lte' => random_key })
21
+ else
22
+ where(:_randomization_key.ne => nil)
23
+ end.order_by([ [ [ :_id, :_randomization_key ].sample, [ :asc, :desc ].sample ] ]).limit(count)
24
+ end
25
+
26
+ end
27
+
28
+ protected
29
+
30
+ def generate_mongoid_random_key
31
+ self._randomization_key = rand
32
+ end
33
+
34
+
35
+ end
36
+ end
@@ -0,0 +1,2 @@
1
+ require 'mongoid/random'
2
+ require 'mongoid/random/version'
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mongoid/random/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mongoid-random"
7
+ s.version = Mongoid::Random::VERSION
8
+ s.authors = ["Dave Krupinski"]
9
+ s.email = ["dave@davekrupinski.com"]
10
+ s.homepage = "https://github.com/davekrupinski/mongoid-random"
11
+ s.summary = "Randomization extensions for Mongoid documents"
12
+ s.description = "Add a random key to all documents in a collection for random retrieval"
13
+
14
+ s.rubyforge_project = "mongoid-random"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency('mongoid', [ '>= 2.0.0' ])
22
+
23
+ s.add_development_dependency('bson_ext')
24
+ s.add_development_dependency('minitest', [ '>= 2.7.0' ])
25
+ s.add_development_dependency('mini_shoulda', [ '>= 0.4.0' ])
26
+ s.add_development_dependency('spork', [ '>= 0.9.0.rc' ])
27
+ s.add_development_dependency('spork-testunit', [ '>= 0.0.6' ])
28
+ s.add_development_dependency('guard-minitest', [ '>= 0.4.0' ])
29
+ s.add_development_dependency('guard-spork', [ '>= 0.3.1' ])
30
+ s.add_development_dependency('turn', [ '>= 0.8.3' ])
31
+
32
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ describe Mongoid::Random do
4
+
5
+ context "Generating the key" do
6
+ setup { @test = Randomized.new }
7
+
8
+ should "initially start with a nil key" do
9
+ assert_nil @test._randomization_key
10
+ end
11
+
12
+ should "generate a key between 0 and 1 on create" do
13
+ assert @test.save
14
+ assert (0..1).include?(@test._randomization_key)
15
+ end
16
+ end
17
+
18
+ context "Querying" do
19
+ setup { @test = Randomized.create }
20
+
21
+ should "always pull @test in random query" do
22
+ 4.times do
23
+ assert_equal @test, Randomized.random.one
24
+ end
25
+ end
26
+
27
+ context "when there are 2 possible records" do
28
+ setup { @test2 = Randomized.create }
29
+
30
+ should "have 2 records to choose from" do
31
+ assert_equal 2, Randomized.count
32
+ end
33
+
34
+ should "only pull 1 record for :random" do
35
+ 3.times do
36
+ assert_equal 1, Randomized.random.to_a.size
37
+ end
38
+ end
39
+
40
+ should "pull both for :random of 2" do
41
+ assert_equal 2, Randomized.random(2).to_a.size
42
+ end
43
+
44
+ should "have both outcomes from random 2 queries" do
45
+ outcomes = 100.times.inject(Array.new) { |a, i| a << Randomized.random(2).to_a; a }
46
+ assert_equal [ [ @test, @test2 ], [ @test2, @test ] ].sort, outcomes.uniq.sort
47
+ end
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,6 @@
1
+ class Randomized
2
+
3
+ include Mongoid::Document
4
+ include Mongoid::Random
5
+
6
+ end
@@ -0,0 +1,27 @@
1
+ gem 'minitest'
2
+
3
+ require 'mini_shoulda'
4
+ require 'minitest/autorun'
5
+ require 'turn'
6
+ require 'spork'
7
+ require 'mongoid'
8
+ require 'mongoid-random'
9
+
10
+ Mongoid.configure do |config|
11
+ database = Mongo::Connection.new.db("mongoid-random_test")
12
+ database.add_user("mongoid", "test")
13
+ config.master = database
14
+ config.logger = nil
15
+ end
16
+
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
18
+
19
+ Spork.prefork do
20
+ end
21
+
22
+ Spork.each_run do
23
+ end
24
+
25
+ MiniTest::Spec.add_teardown_hook do
26
+ Mongoid.purge!
27
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongoid-random
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dave Krupinski
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-02 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mongoid
16
+ requirement: &2156037340 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2156037340
25
+ - !ruby/object:Gem::Dependency
26
+ name: bson_ext
27
+ requirement: &2156035740 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2156035740
36
+ - !ruby/object:Gem::Dependency
37
+ name: minitest
38
+ requirement: &2156033000 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 2.7.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2156033000
47
+ - !ruby/object:Gem::Dependency
48
+ name: mini_shoulda
49
+ requirement: &2156025320 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2156025320
58
+ - !ruby/object:Gem::Dependency
59
+ name: spork
60
+ requirement: &2156022340 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 0.9.0.rc
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2156022340
69
+ - !ruby/object:Gem::Dependency
70
+ name: spork-testunit
71
+ requirement: &2156020140 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 0.0.6
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2156020140
80
+ - !ruby/object:Gem::Dependency
81
+ name: guard-minitest
82
+ requirement: &2156017420 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: 0.4.0
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2156017420
91
+ - !ruby/object:Gem::Dependency
92
+ name: guard-spork
93
+ requirement: &2156014840 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: 0.3.1
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2156014840
102
+ - !ruby/object:Gem::Dependency
103
+ name: turn
104
+ requirement: &2156014000 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.8.3
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *2156014000
113
+ description: Add a random key to all documents in a collection for random retrieval
114
+ email:
115
+ - dave@davekrupinski.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - Gemfile
122
+ - Guardfile
123
+ - Rakefile
124
+ - lib/mongoid-random.rb
125
+ - lib/mongoid/random.rb
126
+ - lib/mongoid/random/version.rb
127
+ - mongoid-random.gemspec
128
+ - test/mongoid/random_test.rb
129
+ - test/support/randomized.rb
130
+ - test/test_helper.rb
131
+ homepage: https://github.com/davekrupinski/mongoid-random
132
+ licenses: []
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project: mongoid-random
151
+ rubygems_version: 1.8.10
152
+ signing_key:
153
+ specification_version: 3
154
+ summary: Randomization extensions for Mongoid documents
155
+ test_files:
156
+ - test/mongoid/random_test.rb
157
+ - test/support/randomized.rb
158
+ - test/test_helper.rb