active_record_samplooper 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/active_record_samplooper.rb +58 -8
- data/lib/active_record_samplooper/version.rb +1 -1
- data/spec/models/sample_model_spec.rb +50 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93d485e74aa6069680edeb330cc7ce8c4c8a376c
|
4
|
+
data.tar.gz: ab4b473a2b67acc840bbbf937af758f49e0b82b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 360c1d888bbf00a5704752c3e7c75a641e9f33286612c847bf59cee523d39e90ef4d5706d3571760d29c51c3c557bd088e9f228be2c46d33b84c8d7b5af557db
|
7
|
+
data.tar.gz: a5621a045cf40a4cc1d1fbe504e0d68cb4a8a771cbc7e2c28d7ea548670e44126141be7f37a9db7cc7fd93588d5521dc1d76802526e015565cf89ce2dd7afd7c
|
data/Gemfile.lock
CHANGED
@@ -10,6 +10,32 @@ module ActiveRecordSamplooper
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
class ArrayLooper
|
14
|
+
attr_accessor :array
|
15
|
+
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def call(*args)
|
19
|
+
new(*args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def initialize(array)
|
25
|
+
self.array = array.dup
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def find(id)
|
30
|
+
raise ActiveRecord::RecordNotFound unless id
|
31
|
+
array[id - 1] || raise(Gone, id)
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def pluck(*)
|
36
|
+
(1..array.size).to_a
|
37
|
+
end
|
38
|
+
end
|
13
39
|
|
14
40
|
class Samplooper
|
15
41
|
attr_accessor :klass, :id_store, :rest
|
@@ -28,20 +54,18 @@ module ActiveRecordSamplooper
|
|
28
54
|
end
|
29
55
|
|
30
56
|
|
31
|
-
def sample
|
32
|
-
|
57
|
+
def sample(count = 1)
|
58
|
+
count > 1 ? count.times.map { do_sample } : do_sample
|
33
59
|
end
|
34
60
|
|
35
61
|
|
36
|
-
def pick
|
37
|
-
|
38
|
-
find(rest.shift)
|
62
|
+
def pick(count = 1)
|
63
|
+
count > 1 ? count.times.map { do_pick } : do_pick
|
39
64
|
end
|
40
65
|
|
41
66
|
|
42
|
-
def loop
|
43
|
-
|
44
|
-
sample
|
67
|
+
def loop(count = 1)
|
68
|
+
count > 1 ? count.times.map { do_loop } : do_loop
|
45
69
|
end
|
46
70
|
|
47
71
|
|
@@ -54,6 +78,25 @@ module ActiveRecordSamplooper
|
|
54
78
|
def reset!
|
55
79
|
self.rest = id_store.dup
|
56
80
|
end
|
81
|
+
|
82
|
+
|
83
|
+
private
|
84
|
+
def do_sample
|
85
|
+
find(id_store.sample)
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def do_pick
|
90
|
+
return if rest.blank?
|
91
|
+
find(rest.shift)
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def do_loop
|
96
|
+
reset! if rest.blank?
|
97
|
+
pick
|
98
|
+
end
|
99
|
+
|
57
100
|
end
|
58
101
|
|
59
102
|
class Gone < StandardError
|
@@ -66,6 +109,13 @@ module ActiveRecordSamplooper
|
|
66
109
|
end
|
67
110
|
end
|
68
111
|
|
112
|
+
class ::Array
|
113
|
+
def sampler
|
114
|
+
ActiveRecordSamplooper.(ActiveRecordSamplooper::ArrayLooper.(self))
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
69
119
|
class ::ActiveRecord::Base
|
70
120
|
class << self
|
71
121
|
def sample
|
@@ -59,7 +59,7 @@ RSpec.describe SampleModel, type: :model do
|
|
59
59
|
it 'loop get destroyed raise exception' do
|
60
60
|
sampler
|
61
61
|
SampleModel.first.destroy
|
62
|
-
SampleModel.
|
62
|
+
SampleModel.last.destroy
|
63
63
|
expect {
|
64
64
|
10.times { sampler.loop }
|
65
65
|
}.to raise_exception(ActiveRecordSamplooper::Gone)
|
@@ -89,4 +89,53 @@ RSpec.describe SampleModel, type: :model do
|
|
89
89
|
expect(sampler.pick).to be_nil
|
90
90
|
end
|
91
91
|
end
|
92
|
+
|
93
|
+
describe 'array samplooper' do
|
94
|
+
let(:array) { (:a..:f).to_a }
|
95
|
+
|
96
|
+
describe 'from sampler' do
|
97
|
+
let(:sampler) { array.sampler }
|
98
|
+
|
99
|
+
describe 'sampler pick' do
|
100
|
+
it 'any times, get SampleModel instance' do
|
101
|
+
36.times { expect(sampler.sample).to be_a(Symbol) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'sample get once each' do
|
106
|
+
6.times { expect(sampler.pick).to be_a(Symbol) }
|
107
|
+
expect(sampler.pick).to be_nil
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'loop get any times each' do
|
111
|
+
100.times do
|
112
|
+
all = (:a..:f).to_a if all.blank?
|
113
|
+
|
114
|
+
expect(all.delete(sampler.loop)).not_to be_nil
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'sample get destroyed raise exception' do
|
119
|
+
array[4] = nil
|
120
|
+
sampler
|
121
|
+
expect {
|
122
|
+
7.times { sampler.pick }
|
123
|
+
}.to raise_exception(ActiveRecordSamplooper::Gone)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'loop get destroyed raise exception' do
|
127
|
+
array[4] = nil
|
128
|
+
sampler
|
129
|
+
expect {
|
130
|
+
7.times { sampler.loop }
|
131
|
+
}.to raise_exception(ActiveRecordSamplooper::Gone)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'sampler not include new instance' do
|
135
|
+
sampler
|
136
|
+
array.push(:aa)
|
137
|
+
1000.times { expect(sampler.sample).not_to eq(:aa) }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
92
141
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_samplooper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mmmpa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|