picky 3.6.16 → 4.0.0pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/lib/picky/application.rb +1 -1
  2. data/lib/picky/backends/backend.rb +2 -0
  3. data/lib/picky/backends/memory.rb +14 -7
  4. data/lib/picky/backends/{memory → prepared}/text.rb +10 -4
  5. data/lib/picky/backends/redis/directly_manipulable.rb +3 -5
  6. data/lib/picky/backends/redis/list.rb +5 -1
  7. data/lib/picky/backends/sqlite/basic.rb +4 -2
  8. data/lib/picky/bundle.rb +6 -7
  9. data/lib/picky/bundle_indexed.rb +2 -2
  10. data/lib/picky/bundle_realtime.rb +8 -7
  11. data/lib/picky/categories.rb +0 -1
  12. data/lib/picky/categories_indexing.rb +14 -0
  13. data/lib/picky/category.rb +3 -5
  14. data/lib/picky/category_indexed.rb +2 -5
  15. data/lib/picky/category_indexing.rb +28 -16
  16. data/lib/picky/constants.rb +3 -1
  17. data/lib/picky/frontend_adapters/rack.rb +2 -2
  18. data/lib/picky/generators/similarity/phonetic.rb +6 -14
  19. data/lib/picky/generators/strategy.rb +1 -1
  20. data/lib/picky/generators/weights/runtime.rb +2 -2
  21. data/lib/picky/helpers/indexing.rb +20 -0
  22. data/lib/picky/index.rb +7 -10
  23. data/lib/picky/index_indexed.rb +1 -8
  24. data/lib/picky/index_indexing.rb +44 -42
  25. data/lib/picky/indexers/base.rb +5 -6
  26. data/lib/picky/indexers/parallel.rb +35 -32
  27. data/lib/picky/indexers/serial.rb +38 -15
  28. data/lib/picky/indexes_indexed.rb +0 -7
  29. data/lib/picky/indexes_indexing.rb +16 -19
  30. data/lib/picky/loader.rb +6 -4
  31. data/lib/picky/query/allocation.rb +7 -2
  32. data/lib/picky/query/combination.rb +1 -1
  33. data/lib/picky/query/indexes.rb +1 -1
  34. data/lib/picky/query/indexes_check.rb +12 -14
  35. data/lib/picky/query/token.rb +33 -15
  36. data/lib/picky/results/exact_first.rb +53 -0
  37. data/lib/picky/scheduler.rb +43 -0
  38. data/lib/picky/search.rb +0 -2
  39. data/lib/picky/sources/csv.rb +2 -3
  40. data/lib/picky/sources/db.rb +4 -3
  41. data/lib/picky/sources/mongo.rb +1 -1
  42. data/lib/picky/tokenizer.rb +0 -4
  43. data/lib/picky/wrappers/bundle/location.rb +1 -1
  44. data/lib/picky.rb +2 -2
  45. data/lib/tasks/index.rake +13 -14
  46. data/spec/functional/backends/file_spec.rb +2 -4
  47. data/spec/functional/backends/memory_spec.rb +2 -2
  48. data/spec/functional/backends/redis_spec.rb +1 -1
  49. data/spec/functional/exact_first_spec.rb +24 -4
  50. data/spec/functional/realtime_spec.rb +7 -3
  51. data/spec/lib/application_spec.rb +30 -30
  52. data/spec/lib/backends/backend_spec.rb +25 -27
  53. data/spec/lib/backends/{memory → prepared}/text_spec.rb +1 -1
  54. data/spec/lib/category_indexing_spec.rb +1 -1
  55. data/spec/lib/extensions/symbol_spec.rb +1 -1
  56. data/spec/lib/generators/similarity/phonetic_spec.rb +46 -0
  57. data/spec/lib/index_indexed_spec.rb +5 -5
  58. data/spec/lib/index_indexing_spec.rb +13 -12
  59. data/spec/lib/index_spec.rb +8 -8
  60. data/spec/lib/indexers/base_spec.rb +5 -6
  61. data/spec/lib/indexers/parallel_spec.rb +10 -10
  62. data/spec/lib/indexes_indexed_spec.rb +1 -7
  63. data/spec/lib/indexes_indexing_spec.rb +10 -5
  64. data/spec/lib/query/indexes_check_spec.rb +44 -15
  65. data/spec/lib/query/indexes_spec.rb +11 -11
  66. data/spec/lib/query/token_spec.rb +10 -0
  67. data/spec/lib/{indexed/wrappers → results}/exact_first_spec.rb +18 -21
  68. data/spec/lib/scheduler_spec.rb +92 -0
  69. metadata +45 -34
  70. data/lib/picky/cores.rb +0 -127
  71. data/lib/picky/tokenizers/location.rb +0 -53
  72. data/lib/picky/wrappers/category/exact_first.rb +0 -94
  73. data/spec/lib/cores_spec.rb +0 -185
@@ -10,4 +10,50 @@ describe Picky::Generators::Similarity::Phonetic do
10
10
  }.to raise_error("In Picky 2.0+, the Similarity::Phonetic has been renamed to Similarity::DoubleMetaphone. Please use that one. Thanks!")
11
11
  end
12
12
 
13
+ describe 'sort!' do
14
+ let(:phonetic) { described_class.allocate }
15
+ it 'sorts correctly' do
16
+ phonetic.instance_variable_set :@amount, 2
17
+
18
+ ary = [:a, :b, :c]
19
+ phonetic.sort ary, :b
20
+ ary.should == [:b, :a]
21
+ end
22
+ it 'sorts correctly' do
23
+ phonetic.instance_variable_set :@amount, 2
24
+
25
+ ary = [:aaa, :aa, :aaaa]
26
+ phonetic.sort ary, :aaa
27
+ ary.should == [:aaa, :aa]
28
+ end
29
+ it 'sorts correctly' do
30
+ phonetic.instance_variable_set :@amount, 3
31
+
32
+ ary = [:aaa, :aa, :aaaa]
33
+ phonetic.sort ary, :aaa
34
+ ary.should == [:aaa, :aa, :aaaa]
35
+ end
36
+ it 'sorts correctly' do
37
+ phonetic.instance_variable_set :@amount, 3
38
+
39
+ ary = [:aaaaa, :aa, :aaaa]
40
+ phonetic.sort ary, :aaa
41
+ ary.should == [:aaaa, :aa, :aaaaa]
42
+ end
43
+ it 'sorts correctly' do
44
+ phonetic.instance_variable_set :@amount, 3
45
+
46
+ ary = [:aaaaa, :aa]
47
+ phonetic.sort ary, :aaa
48
+ ary.should == [:aa, :aaaaa]
49
+ end
50
+ it 'sorts correctly' do
51
+ phonetic.instance_variable_set :@amount, 3
52
+
53
+ ary = [:aaa]
54
+ phonetic.sort ary, :aaa
55
+ ary.should == [:aaa]
56
+ end
57
+ end
58
+
13
59
  end
@@ -7,14 +7,14 @@ describe Picky::Index do
7
7
  @index = described_class.new :some_index_name
8
8
  end
9
9
 
10
- describe 'define_category' do
10
+ describe 'category' do
11
11
  it 'adds a new category to the categories' do
12
- @index.define_category :some_category_name
12
+ @index.category :some_category_name
13
13
 
14
14
  @index.categories.categories.size.should == 1
15
15
  end
16
16
  it 'returns the new category' do
17
- @index.define_category(:some_category_name).should be_kind_of(Picky::Category)
17
+ @index.category(:some_category_name).should be_kind_of(Picky::Category)
18
18
  end
19
19
  end
20
20
  end
@@ -24,8 +24,8 @@ describe Picky::Index do
24
24
  @categories = stub :categories
25
25
 
26
26
  @index = described_class.new :some_name
27
- @index.define_category :some_category_name1
28
- @index.define_category :some_category_name2
27
+ @index.category :some_category_name1
28
+ @index.category :some_category_name2
29
29
 
30
30
  @index.stub! :categories => @categories
31
31
  end
@@ -55,16 +55,16 @@ describe Picky::Index do
55
55
  context 'in general' do
56
56
  context 'with #each source' do
57
57
  let(:index) do
58
- described_class.new :some_name do
59
- source []
60
- end
58
+ described_class.new :some_name
61
59
  end
62
60
 
63
61
  it 'does things in order' do
64
- index.should_receive(:check_source_empty).once.with.ordered
65
- index.should_receive(:index_in_parallel).once.with.ordered
62
+ scheduler = stub :scheduler, :fork? => false, :finish => nil
66
63
 
67
- index.index
64
+ index.should_receive(:prepare).once.with(scheduler).ordered
65
+ index.should_receive(:cache).once.with(scheduler).ordered
66
+
67
+ index.index scheduler
68
68
  end
69
69
  end
70
70
  context 'with non#each source' do
@@ -80,7 +80,8 @@ describe Picky::Index do
80
80
  categories = stub :categories
81
81
  index.stub! :categories => categories
82
82
 
83
- categories.should_receive(:index).once
83
+ categories.should_receive(:prepare).once
84
+ categories.should_receive(:cache).once
84
85
 
85
86
  index.index
86
87
  end
@@ -94,14 +95,14 @@ describe Picky::Index do
94
95
  @index = described_class.new :some_name do
95
96
  source the_source
96
97
  end
97
- @index.define_category :some_category_name1
98
- @index.define_category :some_category_name2
98
+ @index.category :some_category_name1
99
+ @index.category :some_category_name2
99
100
  end
100
- describe 'define_source' do
101
+ describe 'source' do
101
102
  it 'can be set with this method' do
102
103
  source = stub :source, :each => [].each
103
104
 
104
- @index.define_source source
105
+ @index.source source
105
106
 
106
107
  @index.source.should == source
107
108
  end
@@ -116,7 +117,7 @@ describe Picky::Index do
116
117
  end
117
118
  context 'with categories' do
118
119
  before(:each) do
119
- @index.define_category :some_name, :source => stub(:source)
120
+ @index.category :some_name, :source => stub(:source)
120
121
  end
121
122
  it 'returns it if found' do
122
123
  @index[:some_name].should_not == nil
@@ -49,35 +49,35 @@ describe Picky::Index do
49
49
  end
50
50
  end
51
51
 
52
- describe 'define_category' do
52
+ describe 'category' do
53
53
  context 'with block' do
54
54
  it 'returns the category' do
55
55
  expected = nil
56
- api.define_category(:some_name){ |category| expected = category }.should == expected
56
+ api.category(:some_name){ |category| expected = category }.should == expected
57
57
  end
58
58
  it 'takes a string' do
59
- lambda { api.define_category('some_name'){ |indexing, indexed| } }.should_not raise_error
59
+ lambda { api.category('some_name'){ |indexing, indexed| } }.should_not raise_error
60
60
  end
61
61
  it 'yields both the indexing category and the indexed category' do
62
- api.define_category(:some_name) do |category|
62
+ api.category(:some_name) do |category|
63
63
  category.should be_kind_of(Picky::Category)
64
64
  end
65
65
  end
66
66
  it 'yields the category which has the given name' do
67
- api.define_category(:some_name) do |category|
67
+ api.category(:some_name) do |category|
68
68
  category.name.should == :some_name
69
69
  end
70
70
  end
71
71
  end
72
72
  context 'without block' do
73
73
  it 'works' do
74
- lambda { api.define_category(:some_name) }.should_not raise_error
74
+ lambda { api.category(:some_name) }.should_not raise_error
75
75
  end
76
76
  it 'takes a string' do
77
- lambda { api.define_category('some_name') }.should_not raise_error
77
+ lambda { api.category('some_name') }.should_not raise_error
78
78
  end
79
79
  it 'returns itself' do
80
- api.define_category(:some_name).should be_kind_of(Picky::Category)
80
+ api.category(:some_name).should be_kind_of(Picky::Category)
81
81
  end
82
82
  end
83
83
  end
@@ -23,21 +23,21 @@ describe Picky::Indexers::Base do
23
23
  indexer.stub! :process
24
24
 
25
25
  expect {
26
- indexer.index []
26
+ indexer.prepare []
27
27
  }.to raise_error("Trying to index without a source for some_index_or_category.")
28
28
  end
29
29
  end
30
30
 
31
- describe 'index' do
31
+ describe 'prepare' do
32
32
  before(:each) do
33
33
  some_index_or_category.should_receive(:source).any_number_of_times.and_return :some_source
34
34
  end
35
35
  it 'processes' do
36
36
  categories = stub :categories, :empty => nil, :cache => nil
37
37
 
38
- indexer.should_receive(:process).once.with categories
38
+ indexer.should_receive(:process).once.with categories, anything
39
39
 
40
- indexer.index categories
40
+ indexer.prepare categories
41
41
  end
42
42
  it 'calls the right methods on the categories' do
43
43
  indexer.stub! :process
@@ -45,9 +45,8 @@ describe Picky::Indexers::Base do
45
45
  categories = stub :categories
46
46
 
47
47
  categories.should_receive(:empty).once.ordered
48
- categories.should_receive(:cache).once.ordered
49
48
 
50
- indexer.index categories
49
+ indexer.prepare categories
51
50
  end
52
51
  end
53
52
 
@@ -5,24 +5,24 @@ describe Picky::Indexers::Parallel do
5
5
  before(:each) do
6
6
  @source = stub :source
7
7
  @index = stub :index, :name => :some_index, :source => @source
8
-
8
+
9
9
  @categories = stub :categories
10
-
10
+
11
11
  @indexer = described_class.new @index
12
12
  @indexer.stub! :timed_exclaim
13
13
  end
14
-
14
+
15
15
  describe 'flush' do
16
16
  it 'flushes to joined cache to the file and clears it' do
17
17
  cache = stub :cache
18
18
  file = stub :file
19
-
20
- cache.should_receive(:join).twice.and_return :joined
21
- file.should_receive(:write).twice.with(:joined).and_return :joined
22
- cache.should_receive(:clear).twice
23
-
24
- @indexer.flush [[nil, cache, file], [nil, cache, file]]
19
+
20
+ cache.should_receive(:join).once.and_return :joined
21
+ file.should_receive(:write).once.with(:joined).and_return :joined
22
+ cache.should_receive(:clear).once
23
+
24
+ @indexer.flush file, cache
25
25
  end
26
26
  end
27
-
27
+
28
28
  end
@@ -48,14 +48,8 @@ describe Picky::Indexes do
48
48
  indexes.index_mapping.should == {}
49
49
  end
50
50
  end
51
- describe 'reload' do
51
+ describe 'load' do
52
52
  it 'calls load on each in order' do
53
- @index1.should_receive(:reload).once.with.ordered
54
- @index2.should_receive(:reload).once.with.ordered
55
-
56
- indexes.reload
57
- end
58
- it 'is aliased' do
59
53
  @index1.should_receive(:load).once.with.ordered
60
54
  @index2.should_receive(:load).once.with.ordered
61
55
 
@@ -19,12 +19,17 @@ describe Picky::Indexes do
19
19
  indexes.register @index1
20
20
  indexes.register @index2
21
21
  end
22
- describe 'index_for_tests' do
23
- it 'takes a snapshot, then indexes and caches each' do
24
- @index1.should_receive(:index).once.with.ordered
25
- @index2.should_receive(:index).once.with.ordered
22
+ describe 'index' do
23
+ it 'prepares and caches each' do
24
+ scheduler = stub :scheduler, :fork? => false, :finish => nil
26
25
 
27
- indexes.index_for_tests
26
+ @index1.should_receive(:prepare).once.with(scheduler).ordered
27
+ @index2.should_receive(:prepare).once.with(scheduler).ordered
28
+
29
+ @index1.should_receive(:cache).once.with(scheduler).ordered
30
+ @index2.should_receive(:cache).once.with(scheduler).ordered
31
+
32
+ indexes.index scheduler
28
33
  end
29
34
  end
30
35
  describe 'register' do
@@ -3,23 +3,52 @@ require 'spec_helper'
3
3
  describe Picky::Query::IndexesCheck do
4
4
 
5
5
  describe 'check_backend_types' do
6
- before(:each) do
7
- @redis = stub :redis, :backend => Picky::Backends::Redis.new
8
- @memory = stub :memory, :backend => Picky::Backends::Memory.new
6
+ backends = [
7
+ Picky::Backends::Memory.new,
8
+ Picky::Backends::File.new,
9
+ Picky::Backends::SQLite.new,
10
+ Picky::Backends::Redis.new
11
+ ]
12
+ backends.each do |backend|
13
+ it 'does not raise on the same type' do
14
+ index = stub :index, backend: backend
15
+ described_class.check_backends [index, index]
16
+ end
9
17
  end
10
- it 'does not raise on the same type' do
11
- described_class.check_backend_types [@redis, @redis]
12
- end
13
- it 'raises on multiple types' do
14
- expect do
15
- described_class.check_backend_types [@redis, @memory]
16
- end.to raise_error(Picky::Query::DifferentTypesError)
18
+
19
+ # Test all combinations
20
+ #
21
+ combinations = backends.combination 2
22
+ combinations.each do |backend1, backend2|
23
+ let(:index1) { stub :index1, backend: backend1 }
24
+ let(:index2) { stub :index2, backend: backend2 }
25
+ it 'raises on multiple types' do
26
+ expect do
27
+ described_class.check_backends [index1, index2]
28
+ end.to raise_error(Picky::Query::DifferentBackendsError)
29
+ end
30
+ it 'raises with the right message on multiple types' do
31
+ expect do
32
+ described_class.check_backends [index1, index2]
33
+ end.to raise_error("Currently it isn't possible to mix Indexes with backends #{index1.backend.class} and #{index2.backend.class} in the same Search instance.")
34
+ end
17
35
  end
18
- it 'raises with the right message on multiple types' do
19
- expect do
20
- described_class.check_backend_types [@redis, @memory]
21
- end.to raise_error("Currently it isn't possible to mix Indexes with backends Picky::Backends::Redis and Picky::Backends::Memory in the same Search instance.")
36
+ combinations = backends.combination 3
37
+ combinations.each do |backend1, backend2, backend3|
38
+ let(:index1) { stub :index1, backend: backend1 }
39
+ let(:index2) { stub :index2, backend: backend2 }
40
+ let(:index3) { stub :index2, backend: backend3 }
41
+ it 'raises on multiple types' do
42
+ expect do
43
+ described_class.check_backends [index1, index2, index3]
44
+ end.to raise_error(Picky::Query::DifferentBackendsError)
45
+ end
46
+ it 'raises with the right message on multiple types' do
47
+ expect do
48
+ described_class.check_backends [index1, index2, index3]
49
+ end.to raise_error("Currently it isn't possible to mix Indexes with backends #{index1.backend.class} and #{index2.backend.class} and #{index3.backend.class} in the same Search instance.")
50
+ end
22
51
  end
23
52
  end
24
-
53
+
25
54
  end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Picky::Query::Indexes do
4
-
4
+
5
5
  before(:each) do
6
- Picky::Query::IndexesCheck.stub! :check_backend_types
6
+ Picky::Query::IndexesCheck.stub! :check_backends
7
7
  end
8
-
8
+
9
9
  3.times do |i|
10
10
  n = i + 1
11
11
  name = :"index#{n}"
@@ -19,7 +19,7 @@ describe Picky::Query::Indexes do
19
19
  indexes.send :initialize, index1, index2, index3
20
20
  indexes
21
21
  end
22
-
22
+
23
23
  describe 'expand_combinations_from' do
24
24
  it 'generates all possible combinations from the given ones' do
25
25
  combinations = [[1,2,3], [:a, :b, :c], [:k, :l]]
@@ -47,22 +47,22 @@ describe Picky::Query::Indexes do
47
47
  end
48
48
  it 'can handle small combinations' do
49
49
  combinations = [[1], [2], [3]]
50
-
50
+
51
51
  indexes.expand_combinations_from(combinations).should == [[1, 2, 3]]
52
52
  end
53
53
  it 'can handle empty combinations' do
54
54
  combinations = [[1,2,3], [:a, :b, :c], []]
55
-
55
+
56
56
  indexes.expand_combinations_from(combinations).should == []
57
57
  end
58
58
  it 'can handle empty combinations' do
59
59
  combinations = [[], [:a, :b, :c], []]
60
-
60
+
61
61
  indexes.expand_combinations_from(combinations).should == []
62
62
  end
63
63
  it 'can handle totally empty combinations' do
64
64
  combinations = [[], [], []]
65
-
65
+
66
66
  indexes.expand_combinations_from(combinations).should == []
67
67
  end
68
68
  it 'is fast in a complicated case' do
@@ -86,7 +86,7 @@ describe Picky::Query::Indexes do
86
86
  performance_of { indexes.expand_combinations_from(combinations) }.should < 0.00045
87
87
  end
88
88
  end
89
-
89
+
90
90
  describe 'prepared_allocations_for' do
91
91
  before(:each) do
92
92
  @allocations = stub :allocations
@@ -96,14 +96,14 @@ describe Picky::Query::Indexes do
96
96
  @allocations.should_receive(:uniq).once.ordered.with()
97
97
  @allocations.should_receive(:calculate_score).once.ordered.with(:some_weights)
98
98
  @allocations.should_receive(:sort!).once.ordered.with()
99
-
99
+
100
100
  indexes.prepared_allocations_for :some_tokens, :some_weights
101
101
  end
102
102
  it 'calls the right method in order' do
103
103
  @allocations.should_receive(:uniq).once.ordered.with()
104
104
  @allocations.should_receive(:calculate_score).once.ordered.with({})
105
105
  @allocations.should_receive(:sort!).once.ordered.with()
106
-
106
+
107
107
  indexes.prepared_allocations_for :some_tokens
108
108
  end
109
109
  end
@@ -407,6 +407,16 @@ describe Picky::Query::Token do
407
407
 
408
408
  token.instance_variable_get(:@partial).should be_nil
409
409
  end
410
+ it 'lets the last one win' do
411
+ token = described_class.processed 'text"*'
412
+
413
+ token.partial?.should == true
414
+ end
415
+ it 'lets the last one win' do
416
+ token = described_class.processed 'text*"'
417
+
418
+ token.partial?.should == false
419
+ end
410
420
  end
411
421
 
412
422
  describe "processed" do
@@ -1,22 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Picky::Wrappers::Category::ExactFirst do
3
+ describe Picky::Results::ExactFirst do
4
4
 
5
5
  before(:each) do
6
6
  @exact = stub :exact
7
7
  @partial = stub :partial
8
8
  @category = stub :category, :exact => @exact, :partial => @partial
9
-
10
- @wrapper = described_class.new @category
9
+ @category.extend described_class
11
10
  end
12
11
 
13
12
  describe "self.wrap" do
14
13
  context "index" do
15
14
  it "wraps each category" do
16
15
  index = Picky::Index.new :some_index
17
- index.define_category :some_category
16
+ index.category :some_category
18
17
 
19
- described_class.wrap index
18
+ index.extend described_class
20
19
 
21
20
  index.categories.categories.each do |category|
22
21
  category.should be_kind_of(described_class)
@@ -24,16 +23,14 @@ describe Picky::Wrappers::Category::ExactFirst do
24
23
  end
25
24
  it "returns the index" do
26
25
  index = Picky::Index.new :some_index
27
- index.define_category :some_category
26
+ index.category :some_category
28
27
 
29
- described_class.wrap(index).should == index
28
+ index.extend(described_class).should == index
30
29
  end
31
30
  end
32
31
  context "category" do
33
- it "wraps each category" do
34
- category = stub :category, :exact => :exact, :partial => :partial
35
-
36
- described_class.wrap(category).should be_kind_of(described_class)
32
+ it "wraps the category" do
33
+ @category.should be_kind_of(described_class)
37
34
  end
38
35
  end
39
36
  end
@@ -43,13 +40,13 @@ describe Picky::Wrappers::Category::ExactFirst do
43
40
  @exact.stub! :ids => [1,4,5,6]
44
41
  @partial.stub! :ids => [2,3,7]
45
42
 
46
- @wrapper.ids(stub(:token, :text => :anything, :partial? => true)).should == [1,4,5,6,2,3,7]
43
+ @category.ids(stub(:token, :text => :anything, :partial? => true)).should == [1,4,5,6,2,3,7]
47
44
  end
48
45
  it "uses only the exact ids" do
49
46
  @exact.stub! :ids => [1,4,5,6]
50
47
  @partial.stub! :ids => [2,3,7]
51
48
 
52
- @wrapper.ids(stub(:token, :text => :anything, :partial? => false)).should == [1,4,5,6]
49
+ @category.ids(stub(:token, :text => :anything, :partial? => false)).should == [1,4,5,6]
53
50
  end
54
51
  end
55
52
 
@@ -63,10 +60,10 @@ describe Picky::Wrappers::Category::ExactFirst do
63
60
  @partial.stub! :weight => 1.23
64
61
  end
65
62
  it "uses the higher weight" do
66
- @wrapper.weight(stub(:token, :text => :anything, :partial? => true)).should == 1.23
63
+ @category.weight(stub(:token, :text => :anything, :partial? => true)).should == 1.23
67
64
  end
68
65
  it "uses the exact weight" do
69
- @wrapper.weight(stub(:token, :text => :anything, :partial? => false)).should == 0.12
66
+ @category.weight(stub(:token, :text => :anything, :partial? => false)).should == 0.12
70
67
  end
71
68
  end
72
69
  context "partial without weight" do
@@ -74,10 +71,10 @@ describe Picky::Wrappers::Category::ExactFirst do
74
71
  @partial.stub! :weight => nil
75
72
  end
76
73
  it "uses the exact weight" do
77
- @wrapper.weight(stub(:token, :text => :anything, :partial? => true)).should == 0.12
74
+ @category.weight(stub(:token, :text => :anything, :partial? => true)).should == 0.12
78
75
  end
79
76
  it "uses the exact weight" do
80
- @wrapper.weight(stub(:token, :text => :anything, :partial? => false)).should == 0.12
77
+ @category.weight(stub(:token, :text => :anything, :partial? => false)).should == 0.12
81
78
  end
82
79
  end
83
80
  end
@@ -90,10 +87,10 @@ describe Picky::Wrappers::Category::ExactFirst do
90
87
  @partial.stub! :weight => 0.12
91
88
  end
92
89
  it "uses the partial weight" do
93
- @wrapper.weight(stub(:token, :text => :anything, :partial? => true)).should == 0.12
90
+ @category.weight(stub(:token, :text => :anything, :partial? => true)).should == 0.12
94
91
  end
95
92
  it "uses the exact weight" do
96
- @wrapper.weight(stub(:token, :text => :anything, :partial? => false)).should == nil
93
+ @category.weight(stub(:token, :text => :anything, :partial? => false)).should == nil
97
94
  end
98
95
  end
99
96
  context "partial without weight" do
@@ -101,10 +98,10 @@ describe Picky::Wrappers::Category::ExactFirst do
101
98
  @partial.stub! :weight => nil
102
99
  end
103
100
  it "is nil" do
104
- @wrapper.weight(stub(:token, :text => :anything, :partial? => true)).should == nil
101
+ @category.weight(stub(:token, :text => :anything, :partial? => true)).should == nil
105
102
  end
106
103
  it "is nil" do
107
- @wrapper.weight(stub(:token, :text => :anything, :partial? => false)).should == nil
104
+ @category.weight(stub(:token, :text => :anything, :partial? => false)).should == nil
108
105
  end
109
106
  end
110
107
  end
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Picky::Scheduler do
5
+
6
+ context 'default params' do
7
+ let(:scheduler) { described_class.new }
8
+
9
+ context 'without forking' do
10
+ before(:each) do
11
+ scheduler.stub! :fork? => false
12
+ end
13
+ context 'non-stubbed forking' do
14
+ it 'works correctly' do
15
+ scheduler.schedule { sleep 0.01 }
16
+ scheduler.schedule { sleep 0.01 }
17
+ scheduler.schedule { sleep 0.01 }
18
+ scheduler.schedule { sleep 0.01 }
19
+ end
20
+ it 'works correctly' do
21
+ called = 0
22
+
23
+ scheduler.schedule { called += 1 }
24
+ scheduler.schedule { called += 1 }
25
+ scheduler.schedule { called += 1 }
26
+ scheduler.schedule { called += 1 }
27
+
28
+ called.should == 4
29
+ end
30
+ end
31
+ end
32
+
33
+ describe 'fork?' do
34
+ context 'OS can fork' do
35
+ it 'returns false' do
36
+ scheduler.fork?.should be_false
37
+ end
38
+ end
39
+ context 'OS cannot fork' do
40
+ before(:each) do
41
+ Process.stub! :fork => nil
42
+ end
43
+ it 'returns false' do
44
+ scheduler.fork?.should be_false
45
+ end
46
+ end
47
+ end
48
+ end
49
+ context 'default params' do
50
+ let(:scheduler) { described_class.new parallel: true }
51
+
52
+ context 'stubbed forking' do
53
+ it 'works correctly' do
54
+ scheduler.scheduler.should_receive(:schedule).exactly(4).times.and_yield
55
+
56
+ scheduler.schedule { sleep 0.01 }
57
+ scheduler.schedule { sleep 0.01 }
58
+ scheduler.schedule { sleep 0.01 }
59
+ scheduler.schedule { sleep 0.01 }
60
+ end
61
+ it 'works correctly' do
62
+ scheduler.scheduler.should_receive(:schedule).any_number_of_times.and_yield
63
+
64
+ called = 0
65
+
66
+ scheduler.schedule { called += 1 }
67
+ scheduler.schedule { called += 1 }
68
+ scheduler.schedule { called += 1 }
69
+ scheduler.schedule { called += 1 }
70
+
71
+ called.should == 4
72
+ end
73
+ end
74
+
75
+ describe 'fork?' do
76
+ context 'OS can fork' do
77
+ it 'returns true' do
78
+ scheduler.fork?.should == true
79
+ end
80
+ end
81
+ # context 'OS cannot fork' do
82
+ # before(:each) do
83
+ # Process.send :undef, :fork
84
+ # end
85
+ # it 'returns false' do
86
+ # scheduler.fork?.should == false
87
+ # end
88
+ # end
89
+ end
90
+ end
91
+
92
+ end