randumb 0.5.0 → 0.5.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.
- checksums.yaml +4 -4
- data/lib/randumb/relation.rb +16 -9
- data/lib/randumb/version.rb +1 -1
- data/test/randumb_test.rb +24 -9
- data/test/test_helper.rb +6 -6
- data/test/weighted_test.rb +7 -7
- metadata +43 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dfd32d6c13a988c2fb72afea69f8e7d2824b2cf
|
4
|
+
data.tar.gz: 77ad6781fc9a3618757d916ed815e3356d1b14a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0a9f3960ff23cf85fd19283ebed1027382841b19f1c4a55292ce15fccce324c0f95b1400f3e17af952bebb7da89894ca8026f117a018e88f4836d3bc4175088
|
7
|
+
data.tar.gz: d01853119a813ed7f26933ce15db02a1b52ca2be5c74e9fef131facef27a9c4ab417819ebe4cc2b4acdbdd1a144ad98385e53ef8a5944d0936de4d5abe85c599
|
data/lib/randumb/relation.rb
CHANGED
@@ -57,14 +57,21 @@ module Randumb
|
|
57
57
|
# get the records and shuffle since the order of the ids
|
58
58
|
# passed to where() isn't retained in the result set
|
59
59
|
rng = random_number_generator(opts)
|
60
|
-
records = the_scope.where(:id => ids).shuffle!(:random => rng)
|
60
|
+
records = the_scope.where(:id => ids).to_a.shuffle!(:random => rng)
|
61
61
|
|
62
62
|
# return first record if method was called without parameters
|
63
63
|
return_first_record ? records.first : records
|
64
64
|
end
|
65
65
|
|
66
|
-
def order_by_rand(opts={})
|
67
|
-
|
66
|
+
def order_by_rand(opts = {})
|
67
|
+
if opts.is_a?(Hash)
|
68
|
+
build_order_scope(opts)
|
69
|
+
else
|
70
|
+
raise ArgumentError.new(
|
71
|
+
"order_by_rand() expects a hash of options. If you need to limit "\
|
72
|
+
"results simply add a limit to your scope ex: Artist.order_by_rand.limit(1)"
|
73
|
+
)
|
74
|
+
end
|
68
75
|
end
|
69
76
|
|
70
77
|
def order_by_rand_weighted(ranking_column, opts={})
|
@@ -89,7 +96,7 @@ module Randumb
|
|
89
96
|
order(order_clause)
|
90
97
|
else
|
91
98
|
# keep prior orders and append random
|
92
|
-
all_orders = (orders + [order_clause])
|
99
|
+
all_orders = (orders + [order_clause])
|
93
100
|
# override all previous orders
|
94
101
|
reorder(all_orders)
|
95
102
|
end
|
@@ -118,7 +125,7 @@ module Randumb
|
|
118
125
|
|
119
126
|
# Returns all matching ids from the db, shuffles them,
|
120
127
|
# then returns an array containing at most max_ids
|
121
|
-
def fetch_random_ids(relation, max_ids, opts={})
|
128
|
+
def fetch_random_ids(relation, max_ids, opts = {})
|
122
129
|
# clear these for our id only query
|
123
130
|
relation.select_values = []
|
124
131
|
relation.includes_values = []
|
@@ -131,11 +138,11 @@ module Randumb
|
|
131
138
|
rng = random_number_generator(opts)
|
132
139
|
if max_ids == 1 && id_results.count > 0
|
133
140
|
rand_index = rng.rand(id_results.count)
|
134
|
-
[
|
141
|
+
[id_results[rand_index]["id"]]
|
135
142
|
else
|
136
|
-
# ActiveRecord 4 requires .
|
137
|
-
arr = id_results.respond_to?(:
|
138
|
-
arr.shuffle!(:
|
143
|
+
# ActiveRecord 4 requires .to_a
|
144
|
+
arr = id_results.respond_to?(:to_a) ? id_results.to_a : id_results
|
145
|
+
arr.shuffle!(random: rng)[0, max_ids].collect! { |h| h["id"] }
|
139
146
|
end
|
140
147
|
end
|
141
148
|
|
data/lib/randumb/version.rb
CHANGED
data/test/randumb_test.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
$:.unshift '.'; require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
-
class RandumbTest < Test
|
3
|
+
class RandumbTest < Minitest::Test
|
4
4
|
|
5
5
|
def assert_equal_for_both_methods(expected, obj, *params)
|
6
|
-
|
7
|
-
|
6
|
+
if expected.nil?
|
7
|
+
assert_nil obj.send(:random, *params), "when calling random"
|
8
|
+
assert_nil obj.send(:random_by_id_shuffle, *params), "when calling random_by_id_shuffle"
|
9
|
+
else
|
10
|
+
assert_equal expected, obj.send(:random, *params), "when calling random"
|
11
|
+
assert_equal expected, obj.send(:random_by_id_shuffle, *params), "when calling random_by_id_shuffle"
|
12
|
+
end
|
8
13
|
end
|
9
14
|
|
10
15
|
should "should return empty when no record in table" do
|
@@ -25,6 +30,13 @@ class RandumbTest < Test::Unit::TestCase
|
|
25
30
|
assert_equal_for_both_methods nil, Artist.limit(50)
|
26
31
|
end
|
27
32
|
|
33
|
+
should "raise helpful error if non-hash passed" do
|
34
|
+
error = assert_raises ArgumentError do
|
35
|
+
Artist.order_by_rand(10)
|
36
|
+
end
|
37
|
+
assert error.message.include?("order_by_rand")
|
38
|
+
end
|
39
|
+
|
28
40
|
context "1 record in the table" do
|
29
41
|
setup do
|
30
42
|
@high_on_fire = FactoryGirl.create(:artist, :name => "High On Fire", :views => 1)
|
@@ -65,19 +77,22 @@ class RandumbTest < Test::Unit::TestCase
|
|
65
77
|
end
|
66
78
|
|
67
79
|
should "respect selecting certain columns" do
|
80
|
+
# this version doesn't throw for some reason...
|
81
|
+
skip_throw_missing = ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 0
|
82
|
+
|
68
83
|
assert_equal 3, Artist.find(@fiona_apple.id).views
|
69
84
|
|
70
85
|
artists = Artist.select(:name).random(3)
|
71
86
|
assert_equal false, artists.first.name.nil?
|
72
|
-
|
87
|
+
assert_raises (ActiveModel::MissingAttributeError) { artists.first.views } unless skip_throw_missing
|
73
88
|
|
74
89
|
artists = Artist.select(:name).order_by_rand.limit(3)
|
75
90
|
assert_equal false, artists.first.name.nil?
|
76
|
-
|
91
|
+
assert_raises (ActiveModel::MissingAttributeError) { artists.first.views } unless skip_throw_missing
|
77
92
|
|
78
93
|
artists = Artist.select(:name).random_by_id_shuffle(3)
|
79
94
|
assert_equal false, artists.first.name.nil?
|
80
|
-
|
95
|
+
assert_raises (ActiveModel::MissingAttributeError) { artists.first.views } unless skip_throw_missing
|
81
96
|
end
|
82
97
|
|
83
98
|
should "respect scopes" do
|
@@ -153,8 +168,8 @@ class RandumbTest < Test::Unit::TestCase
|
|
153
168
|
should "work with uniq" do
|
154
169
|
assert_equal 2, Artist.uniq.random(2).length
|
155
170
|
assert_equal 2, Artist.uniq.random_by_id_shuffle(2).length
|
156
|
-
|
157
|
-
|
171
|
+
assert !Artist.uniq.random.nil?
|
172
|
+
assert !Artist.uniq.random_by_id_shuffle.nil?
|
158
173
|
end
|
159
174
|
end
|
160
175
|
|
@@ -211,7 +226,7 @@ class RandumbTest < Test::Unit::TestCase
|
|
211
226
|
assert_equal seeded_order, Artist.random(2, seed: @seed)
|
212
227
|
end
|
213
228
|
|
214
|
-
10.times do
|
229
|
+
10.times do
|
215
230
|
assert_equal seeded_order, Artist.order_by_rand(seed: @seed).limit(2)
|
216
231
|
end
|
217
232
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
2
2
|
require 'rubygems'
|
3
|
-
require
|
3
|
+
require "minitest/autorun"
|
4
4
|
require 'shoulda'
|
5
5
|
require 'factory_girl'
|
6
6
|
require 'faker'
|
@@ -14,14 +14,14 @@ config = YAML::load(File.open(File.expand_path("../databases.yml", __FILE__)))
|
|
14
14
|
version = ActiveRecord::VERSION::STRING
|
15
15
|
driver = (ENV["DB"] or "sqlite3").downcase
|
16
16
|
in_memory = config[driver]["database"] == ":memory:"
|
17
|
-
|
17
|
+
|
18
18
|
# http://about.travis-ci.org/docs/user/database-setup/
|
19
19
|
commands = {
|
20
20
|
"mysql" => "mysql -e 'create database randumb_test;'",
|
21
21
|
"postgres" => "psql -c 'create database randumb_test;' -U postgres"
|
22
22
|
}
|
23
23
|
%x{#{commands[driver] || true}}
|
24
|
-
|
24
|
+
|
25
25
|
ActiveRecord::Base.establish_connection config[driver]
|
26
26
|
puts "Using #{RUBY_VERSION} AR #{version} with #{driver}"
|
27
27
|
|
@@ -33,7 +33,7 @@ ActiveRecord::Base.connection.create_table(:artists, :force => true) do |t|
|
|
33
33
|
t.datetime "created_at"
|
34
34
|
t.datetime "updated_at"
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
ActiveRecord::Base.connection.create_table(:albums, :force => true) do |t|
|
38
38
|
t.string "name"
|
39
39
|
t.integer "views"
|
@@ -41,7 +41,7 @@ ActiveRecord::Base.connection.create_table(:albums, :force => true) do |t|
|
|
41
41
|
t.datetime "created_at"
|
42
42
|
t.datetime "updated_at"
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
# setup models for lazy load
|
46
46
|
dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
|
47
47
|
dep.autoload_paths.unshift MODELS_PATH
|
@@ -50,7 +50,7 @@ dep.autoload_paths.unshift MODELS_PATH
|
|
50
50
|
require 'test/models/factories'
|
51
51
|
|
52
52
|
# clear db for every test
|
53
|
-
class Test
|
53
|
+
class Minitest::Test
|
54
54
|
|
55
55
|
def setup
|
56
56
|
Artist.delete_all
|
data/test/weighted_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
$:.unshift '.'; require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
-
class WeightedTest < Test
|
3
|
+
class WeightedTest < Minitest::Test
|
4
4
|
|
5
5
|
should "raise exception when called with a non-existent column" do
|
6
6
|
assert_raises(ArgumentError) do
|
@@ -66,7 +66,7 @@ class WeightedTest < Test::Unit::TestCase
|
|
66
66
|
assert_hits_per_views do
|
67
67
|
Artist.random_weighted("views").views
|
68
68
|
end
|
69
|
-
assert_hits_per_views do
|
69
|
+
assert_hits_per_views do
|
70
70
|
Artist.order_by_rand_weighted("views").first.views
|
71
71
|
end
|
72
72
|
end
|
@@ -84,7 +84,7 @@ class WeightedTest < Test::Unit::TestCase
|
|
84
84
|
result.first.views
|
85
85
|
end
|
86
86
|
|
87
|
-
assert_hits_per_views do
|
87
|
+
assert_hits_per_views do
|
88
88
|
result = Artist.order_by_rand_weighted("views").limit(5).all
|
89
89
|
assert(result.size == 5)
|
90
90
|
result.first.views
|
@@ -120,13 +120,13 @@ class WeightedTest < Test::Unit::TestCase
|
|
120
120
|
should "order by ranking column with method_missing using 1 max_items" do
|
121
121
|
assert_hits_per_views do
|
122
122
|
result = Artist.random_weighted_by_views(1)
|
123
|
-
|
123
|
+
assert_equal 1, result.length
|
124
124
|
result.first.views
|
125
125
|
end
|
126
126
|
|
127
127
|
assert_hits_per_views do
|
128
128
|
result = Artist.order_by_rand_weighted(:views).limit(1)
|
129
|
-
|
129
|
+
assert_equal 1, result.length
|
130
130
|
result.first.views
|
131
131
|
end
|
132
132
|
end
|
@@ -135,7 +135,7 @@ class WeightedTest < Test::Unit::TestCase
|
|
135
135
|
def assert_hits_per_views
|
136
136
|
hits_per_views = Hash.new
|
137
137
|
@view_counts.each { |views| hits_per_views[views] = 0 }
|
138
|
-
|
138
|
+
|
139
139
|
1000.times do
|
140
140
|
hits_per_views[yield] += 1
|
141
141
|
end
|
@@ -148,4 +148,4 @@ class WeightedTest < Test::Unit::TestCase
|
|
148
148
|
end
|
149
149
|
|
150
150
|
|
151
|
-
end
|
151
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: randumb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zachary Kloepping
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -30,42 +30,56 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.0.
|
33
|
+
version: 3.0.20
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 3.0.
|
40
|
+
version: 3.0.20
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activerecord
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.0.
|
47
|
+
version: 3.0.20
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.0.
|
54
|
+
version: 3.0.20
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sqlite3
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - '
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - '
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
67
74
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: shoulda
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,16 +98,16 @@ dependencies:
|
|
84
98
|
name: factory_girl
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - '>='
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
103
|
+
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - '>='
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: faker
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,20 @@ dependencies:
|
|
108
122
|
- - '>='
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
111
139
|
description:
|
112
140
|
email:
|
113
141
|
executables: []
|
@@ -144,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
172
|
version: '0'
|
145
173
|
requirements: []
|
146
174
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.1
|
175
|
+
rubygems_version: 2.0.14.1
|
148
176
|
signing_key:
|
149
177
|
specification_version: 4
|
150
178
|
summary: Adds the ability to pull random records from ActiveRecord
|