mongoid-random 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,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