picky 3.6.16 → 4.0.0pre1

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.
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