picky 4.0.0pre1 → 4.0.0pre2
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/aux/picky/cli.rb +6 -2
- data/lib/picky.rb +10 -8
- data/lib/picky/backends/backend.rb +37 -0
- data/lib/picky/backends/file.rb +0 -20
- data/lib/picky/backends/memory.rb +0 -29
- data/lib/picky/backends/redis.rb +74 -15
- data/lib/picky/backends/redis/list.rb +1 -1
- data/lib/picky/backends/sqlite.rb +0 -27
- data/lib/picky/bundle.rb +2 -2
- data/lib/picky/bundle_indexed.rb +1 -1
- data/lib/picky/bundle_indexing.rb +1 -1
- data/lib/picky/categories_indexed.rb +1 -11
- data/lib/picky/category.rb +4 -4
- data/lib/picky/category/location.rb +25 -0
- data/lib/picky/category_realtime.rb +4 -3
- data/lib/picky/console.rb +1 -1
- data/lib/picky/constants.rb +1 -1
- data/lib/picky/ext/maybe_compile.rb +2 -2
- data/lib/picky/extensions/object.rb +3 -2
- data/lib/picky/generators/aliases.rb +7 -2
- data/lib/picky/generators/partial/default.rb +1 -0
- data/lib/picky/generators/similarity/default.rb +1 -0
- data/lib/picky/generators/similarity/phonetic.rb +13 -2
- data/lib/picky/generators/strategy.rb +0 -2
- data/lib/picky/generators/weights/constant.rb +1 -2
- data/lib/picky/generators/weights/default.rb +1 -0
- data/lib/picky/generators/weights/dynamic.rb +1 -1
- data/lib/picky/generators/weights/logarithmic.rb +1 -1
- data/lib/picky/generators/weights/{runtime.rb → stub.rb} +1 -3
- data/lib/picky/index.rb +3 -3
- data/lib/picky/index_indexing.rb +0 -2
- data/lib/picky/index_realtime.rb +1 -1
- data/lib/picky/indexers/base.rb +7 -0
- data/lib/picky/indexers/parallel.rb +2 -4
- data/lib/picky/indexers/serial.rb +2 -0
- data/lib/picky/indexes_indexing.rb +1 -1
- data/lib/picky/interfaces/live_parameters/master_child.rb +175 -0
- data/lib/picky/interfaces/live_parameters/unicorn.rb +37 -0
- data/lib/picky/loader.rb +238 -259
- data/lib/picky/query/allocation.rb +19 -10
- data/lib/picky/query/combination.rb +7 -1
- data/lib/picky/query/combinations.rb +1 -6
- data/lib/picky/query/token.rb +26 -36
- data/lib/picky/results.rb +18 -17
- data/lib/picky/scheduler.rb +2 -1
- data/lib/picky/search.rb +1 -1
- data/lib/picky/sinatra.rb +6 -6
- data/lib/picky/statistics.rb +2 -0
- data/lib/picky/tokenizer.rb +8 -8
- data/lib/picky/wrappers/bundle/calculation.rb +4 -4
- data/lib/picky/wrappers/bundle/location.rb +1 -2
- data/lib/tasks/framework.rake +1 -1
- data/lib/tasks/statistics.rake +1 -1
- data/lib/tasks/try.rake +1 -1
- data/lib/tasks/try.rb +1 -1
- data/spec/aux/picky/cli_spec.rb +12 -12
- data/spec/ext/performant_spec.rb +16 -16
- data/spec/functional/backends/file_spec.rb +78 -7
- data/spec/functional/backends/memory_spec.rb +78 -7
- data/spec/functional/backends/redis_spec.rb +73 -13
- data/spec/functional/dynamic_weights_spec.rb +3 -4
- data/spec/functional/realtime_spec.rb +2 -2
- data/spec/functional/speed_spec.rb +2 -2
- data/spec/functional/terminate_early_spec.rb +3 -3
- data/spec/lib/analytics_spec.rb +1 -1
- data/spec/lib/analyzer_spec.rb +5 -3
- data/spec/lib/categories_indexed_spec.rb +38 -20
- data/spec/lib/category/location_spec.rb +30 -0
- data/spec/lib/character_substituters/west_european_spec.rb +1 -0
- data/spec/lib/extensions/hash_spec.rb +6 -5
- data/spec/lib/extensions/module_spec.rb +6 -6
- data/spec/lib/extensions/object_spec.rb +9 -8
- data/spec/lib/extensions/string_spec.rb +1 -1
- data/spec/lib/generators/similarity/phonetic_spec.rb +11 -0
- data/spec/lib/index_realtime_spec.rb +5 -5
- data/spec/lib/interfaces/{live_parameters_spec.rb → live_parameters/master_child_spec.rb} +26 -26
- data/spec/lib/interfaces/live_parameters/unicorn_spec.rb +160 -0
- data/spec/lib/loader_spec.rb +65 -25
- data/spec/lib/query/allocation_spec.rb +25 -22
- data/spec/lib/query/combinations_spec.rb +13 -36
- data/spec/lib/query/token_spec.rb +144 -131
- data/spec/lib/query/tokens_spec.rb +14 -0
- data/spec/lib/results_spec.rb +14 -8
- data/spec/lib/search_spec.rb +1 -1
- data/spec/lib/sinatra_spec.rb +8 -8
- metadata +28 -91
- data/lib/picky/adapters/rack.rb +0 -34
- data/lib/picky/adapters/rack/base.rb +0 -27
- data/lib/picky/adapters/rack/live_parameters.rb +0 -37
- data/lib/picky/adapters/rack/search.rb +0 -67
- data/lib/picky/application.rb +0 -268
- data/lib/picky/frontend_adapters/rack.rb +0 -161
- data/lib/picky/interfaces/live_parameters.rb +0 -187
- data/lib/picky/sources/base.rb +0 -92
- data/lib/picky/sources/couch.rb +0 -76
- data/lib/picky/sources/csv.rb +0 -83
- data/lib/picky/sources/db.rb +0 -189
- data/lib/picky/sources/delicious.rb +0 -63
- data/lib/picky/sources/mongo.rb +0 -80
- data/lib/picky/wrappers/category/location.rb +0 -38
- data/lib/tasks/routes.rake +0 -8
- data/spec/lib/adapters/rack/base_spec.rb +0 -24
- data/spec/lib/adapters/rack/live_parameters_spec.rb +0 -26
- data/spec/lib/adapters/rack/query_spec.rb +0 -39
- data/spec/lib/application_spec.rb +0 -155
- data/spec/lib/frontend_adapters/rack_spec.rb +0 -294
- data/spec/lib/sources/base_spec.rb +0 -53
- data/spec/lib/sources/couch_spec.rb +0 -114
- data/spec/lib/sources/csv_spec.rb +0 -89
- data/spec/lib/sources/db_spec.rb +0 -125
- data/spec/lib/sources/delicious_spec.rb +0 -94
- data/spec/lib/sources/mongo_spec.rb +0 -50
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Picky::Sources::Base do
|
|
4
|
-
context 'with the base class' do
|
|
5
|
-
let(:source) { described_class.new }
|
|
6
|
-
|
|
7
|
-
describe 'connect_backend' do
|
|
8
|
-
it 'exists' do
|
|
9
|
-
source.connect_backend
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe 'take_snapshot' do
|
|
14
|
-
it 'exists and takes a single parameter' do
|
|
15
|
-
source.take_snapshot :some_index
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
context 'with subclass' do
|
|
21
|
-
let(:take_snapshot_called) { 0 }
|
|
22
|
-
let(:subclass) do
|
|
23
|
-
Class.new(described_class) do
|
|
24
|
-
def take_snapshot index
|
|
25
|
-
index.call index
|
|
26
|
-
end
|
|
27
|
-
end.new
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
describe 'with snapshot' do
|
|
31
|
-
it 'is called only once when called in nested blocks' do
|
|
32
|
-
index = stub :index, :identifier => :some_index
|
|
33
|
-
subclass.stub! :timed_exclaim
|
|
34
|
-
|
|
35
|
-
index.should_receive(:call).once.with index
|
|
36
|
-
|
|
37
|
-
subclass.with_snapshot(index) do
|
|
38
|
-
subclass.with_snapshot(index) do
|
|
39
|
-
subclass.with_snapshot(index) do
|
|
40
|
-
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
subclass.with_snapshot(index) do
|
|
44
|
-
subclass.with_snapshot(index) do
|
|
45
|
-
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
end
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Picky::Sources::Couch do
|
|
4
|
-
|
|
5
|
-
describe 'key_format' do
|
|
6
|
-
context 'default' do
|
|
7
|
-
let(:source) { described_class.new(:a, :b, url: 'bla') }
|
|
8
|
-
it 'is correct' do
|
|
9
|
-
source.key_format.should == :to_s
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
context 'non-default' do
|
|
13
|
-
let(:source) { described_class.new(:a, :b, url: 'bla', key_format: 'some_key_method') }
|
|
14
|
-
it 'is correct' do
|
|
15
|
-
source.key_format.should == :some_key_method
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
describe 'to_s' do
|
|
21
|
-
let(:source) { described_class.new(:a, :b, :url => 'bla') }
|
|
22
|
-
it 'is correct' do
|
|
23
|
-
source.to_s.should == 'Picky::Sources::Couch'
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
describe 'special keys' do
|
|
28
|
-
context 'uuid keys' do
|
|
29
|
-
context "with database" do
|
|
30
|
-
before(:each) do
|
|
31
|
-
@source = described_class.new :a, :b, :c, url: 'http://localhost:5984/picky'
|
|
32
|
-
RestClient::Request.should_receive(:execute).any_number_of_times.and_return %{{"rows":[{"doc":{"_id":"550e8400-e29b-41d4-a716-446655440000","a":"a data","b":"b data","c":"c data"}}]}}
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
describe "harvest" do
|
|
36
|
-
it "yields the right data" do
|
|
37
|
-
category = stub :b, :from => :b
|
|
38
|
-
@source.harvest category do |id, token|
|
|
39
|
-
id.should eql('550e8400-e29b-41d4-a716-446655440000')
|
|
40
|
-
token.should eql('b data')
|
|
41
|
-
end.should have(1).item
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
describe "get_data" do
|
|
46
|
-
it "yields each line" do
|
|
47
|
-
@source.get_data do |data|
|
|
48
|
-
data.should == { "_id" => "550e8400-e29b-41d4-a716-446655440000", "a" => "a data", "b" => "b data", "c" => "c data" }
|
|
49
|
-
end.should have(1).item
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
context 'integer keys' do
|
|
55
|
-
context "with database" do
|
|
56
|
-
before(:each) do
|
|
57
|
-
@source = described_class.new :a, :b, :c, url: 'http://localhost:5984/picky'
|
|
58
|
-
RestClient::Request.should_receive(:execute).any_number_of_times.and_return %{{"rows":[{"doc":{"_id":"123","a":"a data","b":"b data","c":"c data"}}]}}
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
describe "harvest" do
|
|
62
|
-
it "yields the right data" do
|
|
63
|
-
category = stub :b, :from => :b
|
|
64
|
-
@source.harvest category do |id, token|
|
|
65
|
-
id.should eql('123')
|
|
66
|
-
token.should eql('b data')
|
|
67
|
-
end.should have(1).item
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
describe "get_data" do
|
|
72
|
-
it "yields each line" do
|
|
73
|
-
@source.get_data do |data|
|
|
74
|
-
data.should == { "_id" => "123", "a" => "a data", "b" => "b data", "c" => "c data" }
|
|
75
|
-
end.should have(1).item
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
context 'default keys' do
|
|
83
|
-
context "without database" do
|
|
84
|
-
it "should fail correctly" do
|
|
85
|
-
lambda { described_class.new(:a, :b, :c) }.should raise_error(described_class::NoDBGiven)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
context "with database" do
|
|
90
|
-
before(:each) do
|
|
91
|
-
@source = described_class.new :a, :b, :c, url: 'http://localhost:5984/picky'
|
|
92
|
-
RestClient::Request.should_receive(:execute).any_number_of_times.and_return %{{"rows":[{"doc":{"_id":"7f","a":"a data","b":"b data","c":"c data"}}]}}
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
describe "harvest" do
|
|
96
|
-
it "yields the right data" do
|
|
97
|
-
category = stub :b, :from => :b
|
|
98
|
-
@source.harvest category do |id, token|
|
|
99
|
-
id.should eql('7f')
|
|
100
|
-
token.should eql('b data')
|
|
101
|
-
end.should have(1).item
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
describe "get_data" do
|
|
106
|
-
it "yields each line" do
|
|
107
|
-
@source.get_data do |data|
|
|
108
|
-
data.should == { "_id" => "7f", "a" => "a data", "b" => "b data", "c" => "c data" }
|
|
109
|
-
end.should have(1).item
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'csv'
|
|
3
|
-
|
|
4
|
-
describe Picky::Sources::CSV do
|
|
5
|
-
|
|
6
|
-
describe 'to_s' do
|
|
7
|
-
let(:source) { described_class.new :a, :b, :c, file:'some/file.csv' }
|
|
8
|
-
it 'outputs the correct string' do
|
|
9
|
-
source.to_s.should == 'Picky::Sources::CSV(a, b, c, {:file=>"some/file.csv"})'
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe 'without separator' do
|
|
14
|
-
before(:each) do
|
|
15
|
-
@source = described_class.new :a, :b, :c, :file => :some_file
|
|
16
|
-
end
|
|
17
|
-
it 'calls foreach correctly' do
|
|
18
|
-
block = lambda { |*args| }
|
|
19
|
-
|
|
20
|
-
::CSV.should_receive(:foreach).once.with :some_file, {}, &block
|
|
21
|
-
|
|
22
|
-
@source.get_data &block
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
describe 'with separator' do
|
|
26
|
-
before(:each) do
|
|
27
|
-
@source = described_class.new :a, :b, :c, :file => :some_file, :col_sep => 'some_separator'
|
|
28
|
-
end
|
|
29
|
-
it 'calls foreach correctly' do
|
|
30
|
-
block = lambda { |*args| }
|
|
31
|
-
|
|
32
|
-
::CSV.should_receive(:foreach).once.with :some_file, :col_sep => 'some_separator', &block
|
|
33
|
-
|
|
34
|
-
@source.get_data &block
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
context "without file" do
|
|
39
|
-
it "should fail correctly" do
|
|
40
|
-
lambda { @source = described_class.new(:a, :b, :c) }.should raise_error(described_class::NoFileGiven)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
context "with file" do
|
|
44
|
-
before(:each) do
|
|
45
|
-
::CSV.should_receive(:foreach).any_number_of_times.and_yield [' 7', 'a data', 'b data', 'c data']
|
|
46
|
-
end
|
|
47
|
-
context 'without separator' do
|
|
48
|
-
before(:each) do
|
|
49
|
-
@source = described_class.new :a, :b, :c, :file => :some_file
|
|
50
|
-
end
|
|
51
|
-
describe "harvest" do
|
|
52
|
-
it "should yield the right data" do
|
|
53
|
-
category = stub :b, :from => :b
|
|
54
|
-
@source.harvest category do |id, token|
|
|
55
|
-
[id, token].should == [' 7', 'b data']
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
describe "get_data" do
|
|
60
|
-
it "should yield each line" do
|
|
61
|
-
@source.get_data do |data|
|
|
62
|
-
data.should == [' 7', 'a data', 'b data', 'c data']
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
context 'with key_format method' do
|
|
68
|
-
before(:each) do
|
|
69
|
-
@source = described_class.new :a, :b, :c, :file => :some_file, :key_format => :strip
|
|
70
|
-
end
|
|
71
|
-
describe "harvest" do
|
|
72
|
-
it "should yield the right data" do
|
|
73
|
-
category = stub :b, :from => :b
|
|
74
|
-
@source.harvest category do |id, token|
|
|
75
|
-
[id, token].should == [' 7', 'b data']
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
describe "get_data" do
|
|
80
|
-
it "should yield each line" do
|
|
81
|
-
@source.get_data do |data|
|
|
82
|
-
data.should == [' 7', 'a data', 'b data', 'c data']
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
end
|
data/spec/lib/sources/db_spec.rb
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Picky::Sources::DB do
|
|
4
|
-
|
|
5
|
-
before(:each) do
|
|
6
|
-
@connection = stub :connection
|
|
7
|
-
@adapter = stub :adapter, :connection => @connection
|
|
8
|
-
|
|
9
|
-
@select_statement = stub :statement, :inspect => '"some statement"'
|
|
10
|
-
|
|
11
|
-
@source = described_class.new @select_statement, :option => :some_options
|
|
12
|
-
|
|
13
|
-
@source.stub! :database => @adapter
|
|
14
|
-
@source.stub! :connect_backend
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe 'to_s' do
|
|
18
|
-
it 'does something' do
|
|
19
|
-
@source.to_s.should == 'Picky::Sources::DB("some statement", {:option=>:some_options})'
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe "get_data" do
|
|
24
|
-
before(:each) do
|
|
25
|
-
@category = stub :category, :from => :some_category, :index_name => :some_index_name
|
|
26
|
-
end
|
|
27
|
-
context 'mysql' do
|
|
28
|
-
before(:each) do
|
|
29
|
-
@connection.stub! :adapter_name => 'mysql'
|
|
30
|
-
end
|
|
31
|
-
context 'no data' do
|
|
32
|
-
it "delegates to the connection" do
|
|
33
|
-
|
|
34
|
-
@connection.should_receive(:execute).
|
|
35
|
-
once.
|
|
36
|
-
with('SELECT id, some_category FROM picky_some_index_name_index st WHERE st.__picky_id > some_offset LIMIT 25000').
|
|
37
|
-
and_return []
|
|
38
|
-
|
|
39
|
-
@source.get_data @category, :some_offset
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
context 'with data' do
|
|
43
|
-
it 'yields to the caller' do
|
|
44
|
-
@connection.should_receive(:execute).
|
|
45
|
-
any_number_of_times.
|
|
46
|
-
with('SELECT id, some_category FROM picky_some_index_name_index st WHERE st.__picky_id > some_offset LIMIT 25000').
|
|
47
|
-
and_return [[1, 'text']]
|
|
48
|
-
|
|
49
|
-
@source.get_data @category, :some_offset do |id, text|
|
|
50
|
-
id.should == 1
|
|
51
|
-
text.should == 'text'
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
describe "configure" do
|
|
59
|
-
it "works" do
|
|
60
|
-
lambda { @source.configure({}) }.should_not raise_error
|
|
61
|
-
end
|
|
62
|
-
context "with file" do
|
|
63
|
-
it "opens the config file relative to root" do
|
|
64
|
-
File.should_receive(:open).once.with 'spec/test_directory/app/bla.yml'
|
|
65
|
-
|
|
66
|
-
@source.configure :file => 'app/bla.yml'
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
describe "connect_backend" do
|
|
72
|
-
it "works" do
|
|
73
|
-
lambda { @source.connect_backend }.should_not raise_error
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
describe "chunksize" do
|
|
78
|
-
it "should be a specific size" do
|
|
79
|
-
@source.chunksize.should == 25_000
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
describe "count" do
|
|
84
|
-
it "should get the count through the public DB connection" do
|
|
85
|
-
result = stub(:result, :to_i => 12_345)
|
|
86
|
-
@connection.should_receive(:select_value).once.and_return(result)
|
|
87
|
-
|
|
88
|
-
@source.count :anything
|
|
89
|
-
end
|
|
90
|
-
it "should get the id count" do
|
|
91
|
-
result = stub(:result, :to_i => 12_345)
|
|
92
|
-
@connection.should_receive(:select_value).once.with("SELECT COUNT(__picky_id) FROM picky_some_type_name_index")
|
|
93
|
-
|
|
94
|
-
@source.count :some_type_name
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
describe 'harvest' do
|
|
99
|
-
before(:each) do
|
|
100
|
-
@category = stub :category, :name => :some_category, :index_name => :some_index
|
|
101
|
-
|
|
102
|
-
@source.should_receive(:get_data).any_number_of_times.and_return [[:some_id, 'some_text']].cycle
|
|
103
|
-
@source.stub! :count => 17
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
describe "harvest_statement_with_offset" do
|
|
108
|
-
before(:each) do
|
|
109
|
-
@category = stub :category, :from => :some_category
|
|
110
|
-
end
|
|
111
|
-
it "should get a harvest statement and the chunksize to put the statement together" do
|
|
112
|
-
@source.should_receive(:harvest_statement).once.with(@category).and_return 'some_example_statement'
|
|
113
|
-
@source.harvest_statement_with_offset(@category, :some_offset)
|
|
114
|
-
end
|
|
115
|
-
it "should add an AND if it already contains a WHERE statement" do
|
|
116
|
-
@source.should_receive(:harvest_statement).and_return 'WHERE'
|
|
117
|
-
@source.harvest_statement_with_offset(@category, :some_offset).should == "WHERE AND st.__picky_id > some_offset LIMIT 25000"
|
|
118
|
-
end
|
|
119
|
-
it "should add a WHERE if it doesn't already contain one" do
|
|
120
|
-
@source.should_receive(:harvest_statement).and_return 'some_statement'
|
|
121
|
-
@source.harvest_statement_with_offset(@category, :some_offset).should == "some_statement WHERE st.__picky_id > some_offset LIMIT 25000"
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
end
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Picky::Sources::Delicious do
|
|
4
|
-
|
|
5
|
-
context "with file" do
|
|
6
|
-
|
|
7
|
-
describe 'to_s' do
|
|
8
|
-
it 'outputs correctly' do
|
|
9
|
-
described_class.new(:username, :password).to_s.should == 'Picky::Sources::Delicious(username)'
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe "check_gem" do
|
|
14
|
-
before(:each) do
|
|
15
|
-
@source = described_class.allocate
|
|
16
|
-
end
|
|
17
|
-
context "doesn't find www/delicious" do
|
|
18
|
-
before(:each) do
|
|
19
|
-
@source.should_receive(:require).any_number_of_times.and_raise LoadError
|
|
20
|
-
end
|
|
21
|
-
it "warns & exits" do
|
|
22
|
-
@source.should_receive(:warn).once.with "www-delicious gem missing!\nTo use the delicious source, you need to:\n 1. Add the following line to Gemfile:\n gem 'www-delicious'\n or\n require 'www-delicious'\n for example on top of your app.rb/application.rb\n 2. Then, run:\n bundle update\n"
|
|
23
|
-
@source.should_receive(:exit).once.with 1
|
|
24
|
-
|
|
25
|
-
@source.check_gem
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
context "finds www/delicious" do
|
|
29
|
-
before(:each) do
|
|
30
|
-
@source.should_receive(:require).any_number_of_times.and_return
|
|
31
|
-
end
|
|
32
|
-
it "checks if the gem is there" do
|
|
33
|
-
lambda { @source.check_gem }.should_not raise_error
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
describe "harvest" do
|
|
39
|
-
before(:each) do
|
|
40
|
-
@source = described_class.new(:username, :password)
|
|
41
|
-
|
|
42
|
-
post1 = WWW::Delicious::Post.new
|
|
43
|
-
post1.uid = "5045d67b3f251e4ae966dffe71501763"
|
|
44
|
-
post1.tags = ["barefoot", "running", "shoe"]
|
|
45
|
-
post1.title = "VIBRAM - FiveFingers"
|
|
46
|
-
post1.url = URI.parse('http://www.vibramfivefingers.it/')
|
|
47
|
-
|
|
48
|
-
delicious = stub :delicious, :posts_recent => [post1]
|
|
49
|
-
|
|
50
|
-
WWW::Delicious.should_receive(:new).and_return delicious
|
|
51
|
-
end
|
|
52
|
-
it "should yield the right data" do
|
|
53
|
-
category = stub :b, :from => :tags
|
|
54
|
-
@source.harvest category do |id, token|
|
|
55
|
-
[id, token].should == [1, "barefoot running shoe"]
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
it "should yield the right data" do
|
|
59
|
-
category = stub :b, :from => :title
|
|
60
|
-
@source.harvest category do |id, token|
|
|
61
|
-
[id, token].should == [1, "VIBRAM - FiveFingers"]
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
it "should yield the right data" do
|
|
65
|
-
category = stub :b, :from => :url
|
|
66
|
-
@source.harvest category do |id, token|
|
|
67
|
-
[id, token].should == [1, "http://www.vibramfivefingers.it/"]
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
describe "get_data" do
|
|
72
|
-
before(:each) do
|
|
73
|
-
@source = described_class.new(:username, :password)
|
|
74
|
-
|
|
75
|
-
post1 = WWW::Delicious::Post.new
|
|
76
|
-
post1.uid = "5045d67b3f251e4ae966dffe71501763"
|
|
77
|
-
post1.tags = ["barefoot", "running", "shoe"]
|
|
78
|
-
post1.title = "VIBRAM - FiveFingers"
|
|
79
|
-
post1.url = URI.parse('http://www.vibramfivefingers.it/')
|
|
80
|
-
|
|
81
|
-
delicious = stub :delicious, :posts_recent => [post1]
|
|
82
|
-
|
|
83
|
-
WWW::Delicious.should_receive(:new).and_return delicious
|
|
84
|
-
end
|
|
85
|
-
it "should yield each line" do
|
|
86
|
-
@source.get_data do |uid, data|
|
|
87
|
-
uid.should == 1
|
|
88
|
-
data.should == { :title => "VIBRAM - FiveFingers", :tags => "barefoot running shoe", :url => "http://www.vibramfivefingers.it/" }
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
end
|