picky 0.3.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/lib/picky/application.rb +2 -2
  2. data/lib/picky/cacher/partial/default.rb +1 -1
  3. data/lib/picky/configuration/field.rb +8 -10
  4. data/lib/picky/configuration/indexes.rb +6 -6
  5. data/lib/picky/configuration/queries.rb +4 -3
  6. data/lib/picky/cores.rb +2 -2
  7. data/lib/picky/extensions/array.rb +2 -12
  8. data/lib/picky/generator.rb +27 -4
  9. data/lib/picky/index/bundle.rb +5 -41
  10. data/lib/picky/index/bundle_checker.rb +58 -0
  11. data/lib/picky/index/type.rb +4 -1
  12. data/lib/picky/index/wrappers/exact_first.rb +57 -0
  13. data/lib/picky/indexes.rb +12 -19
  14. data/lib/picky/loader.rb +7 -8
  15. data/lib/picky/query/allocation.rb +1 -1
  16. data/lib/picky/query/combinations.rb +9 -6
  17. data/lib/picky/query/combinator.rb +11 -5
  18. data/lib/picky/rack/harakiri.rb +1 -1
  19. data/lib/picky/results/base.rb +4 -12
  20. data/lib/picky/results/live.rb +0 -6
  21. data/lib/picky/routing.rb +17 -17
  22. data/lib/picky/sources/csv.rb +1 -2
  23. data/lib/picky/sources/db.rb +0 -1
  24. data/lib/picky/sources/delicious.rb +41 -0
  25. data/lib/picky/tokenizers/base.rb +52 -43
  26. data/lib/picky/tokenizers/default/index.rb +7 -0
  27. data/lib/picky/tokenizers/default/query.rb +7 -0
  28. data/lib/picky/tokenizers/index.rb +0 -9
  29. data/lib/picky/tokenizers/query.rb +0 -9
  30. data/lib/tasks/application.rake +1 -1
  31. data/lib/tasks/cache.rake +41 -48
  32. data/lib/tasks/framework.rake +1 -1
  33. data/lib/tasks/index.rake +22 -12
  34. data/lib/tasks/server.rake +3 -3
  35. data/lib/tasks/shortcuts.rake +9 -2
  36. data/lib/tasks/statistics.rake +8 -8
  37. data/lib/tasks/try.rake +4 -2
  38. data/project_prototype/Gemfile +1 -1
  39. data/project_prototype/app/application.rb +7 -3
  40. data/spec/lib/cacher/partial/default_spec.rb +1 -1
  41. data/spec/lib/cacher/partial/none_spec.rb +12 -0
  42. data/spec/lib/cacher/partial/subtoken_spec.rb +29 -1
  43. data/spec/lib/configuration/field_spec.rb +162 -3
  44. data/spec/lib/configuration/indexes_spec.rb +150 -0
  45. data/spec/lib/cores_spec.rb +43 -0
  46. data/spec/lib/extensions/module_spec.rb +27 -16
  47. data/spec/lib/generator_spec.rb +3 -3
  48. data/spec/lib/index/bundle_checker_spec.rb +67 -0
  49. data/spec/lib/index/bundle_spec.rb +0 -50
  50. data/spec/lib/index/type_spec.rb +47 -0
  51. data/spec/lib/index/wrappers/exact_first_spec.rb +95 -0
  52. data/spec/lib/indexers/base_spec.rb +18 -2
  53. data/spec/lib/loader_spec.rb +21 -1
  54. data/spec/lib/query/allocation_spec.rb +25 -0
  55. data/spec/lib/query/base_spec.rb +37 -0
  56. data/spec/lib/query/combination_spec.rb +10 -1
  57. data/spec/lib/query/combinations_spec.rb +82 -3
  58. data/spec/lib/query/combinator_spec.rb +45 -0
  59. data/spec/lib/query/token_spec.rb +24 -0
  60. data/spec/lib/rack/harakiri_spec.rb +28 -0
  61. data/spec/lib/results/base_spec.rb +24 -0
  62. data/spec/lib/results/live_spec.rb +15 -0
  63. data/spec/lib/routing_spec.rb +5 -0
  64. data/spec/lib/sources/db_spec.rb +31 -1
  65. data/spec/lib/sources/delicious_spec.rb +75 -0
  66. data/spec/lib/tokenizers/base_spec.rb +160 -49
  67. data/spec/lib/tokenizers/default/index_spec.rb +11 -0
  68. data/spec/lib/tokenizers/default/query_spec.rb +11 -0
  69. metadata +26 -5
  70. data/lib/picky/index/combined.rb +0 -45
  71. data/lib/picky/tokenizers/default.rb +0 -3
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Index::Wrappers::ExactFirst do
4
+
5
+ before(:each) do
6
+ @exact = stub :exact
7
+ @partial = stub :partial
8
+ @category = stub :category, :exact => @exact, :partial => @partial
9
+
10
+ @wrapper = Index::Wrappers::ExactFirst.new @category
11
+ end
12
+
13
+ describe "self.wrap" do
14
+ context "type" do
15
+ it "wraps each category" do
16
+ category = stub :category, :name => :some_category, :exact => :exact, :partial => :partial
17
+
18
+ type = Index::Type.new :type_name, :result_type, false, category
19
+
20
+ Index::Wrappers::ExactFirst.wrap type
21
+
22
+ type.categories.first.should be_kind_of(Index::Wrappers::ExactFirst)
23
+ end
24
+ it "returns the type" do
25
+ category = stub :category, :name => :some_category, :exact => :exact, :partial => :partial
26
+
27
+ type = Index::Type.new :type_name, :result_type, false, category
28
+
29
+ Index::Wrappers::ExactFirst.wrap(type).should == type
30
+ end
31
+ end
32
+ context "category" do
33
+ it "wraps each category" do
34
+ category = stub :category, :exact => :exact, :partial => :partial
35
+
36
+ Index::Wrappers::ExactFirst.wrap(category).should be_kind_of(Index::Wrappers::ExactFirst)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe 'ids' do
42
+ it "uses first the exact, then the partial ids" do
43
+ @exact.stub! :ids => [1,4,5,6]
44
+ @partial.stub! :ids => [2,3,7]
45
+
46
+ @wrapper.ids(:anything).should == [1,4,5,6,2,3,7]
47
+ end
48
+ end
49
+
50
+ describe 'weight' do
51
+ context "exact with weight" do
52
+ before(:each) do
53
+ @exact.stub! :weight => 1.23
54
+ end
55
+ context "partial with weight" do
56
+ before(:each) do
57
+ @partial.stub! :weight => 0.12
58
+ end
59
+ it "uses the higher weight" do
60
+ @wrapper.weight(:anything).should == 1.23
61
+ end
62
+ end
63
+ context "partial without weight" do
64
+ before(:each) do
65
+ @partial.stub! :weight => nil
66
+ end
67
+ it "uses the exact weight" do
68
+ @wrapper.weight(:anything).should == 1.23
69
+ end
70
+ end
71
+ end
72
+ context "exact without weight" do
73
+ before(:each) do
74
+ @exact.stub! :weight => nil
75
+ end
76
+ context "partial with weight" do
77
+ before(:each) do
78
+ @partial.stub! :weight => 0.12
79
+ end
80
+ it "uses the partial weight" do
81
+ @wrapper.weight(:anything).should == 0.12
82
+ end
83
+ end
84
+ context "partial without weight" do
85
+ before(:each) do
86
+ @partial.stub! :weight => nil
87
+ end
88
+ it "is zero" do
89
+ @wrapper.weight(:anything).should == 0
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ end
@@ -11,17 +11,33 @@ describe Indexers::Base do
11
11
  :search_index_file_name => :some_search_index_name,
12
12
  :indexed_name => :some_indexed_field_name
13
13
  @indexer = Indexers::Base.new @type, @field
14
- @indexer.stub! :indexing_message
14
+ @indexer.stub! :timed_exclaim
15
15
  end
16
16
 
17
17
  describe "tokenizer" do
18
- it "should delegate to field" do
18
+ it "delegates to the field" do
19
19
  @field.should_receive(:tokenizer).once.with
20
20
 
21
21
  @indexer.tokenizer
22
22
  end
23
23
  end
24
24
 
25
+ describe "indexing_message" do
26
+ it "informs the user about what it is going to index" do
27
+ @indexer.should_receive(:timed_exclaim).once.with 'INDEX some_type some_field_name'
28
+
29
+ @indexer.indexing_message
30
+ end
31
+ end
32
+
33
+ describe "tokenizer" do
34
+ it "should delegate to field" do
35
+ @indexer.should_receive(:tokenizer).once.with
36
+
37
+ @indexer.tokenizer
38
+ end
39
+ end
40
+
25
41
  describe 'search_index_file_name' do
26
42
  it 'should return a specific name' do
27
43
  @indexer.search_index_file_name.should == :some_search_index_name
@@ -7,7 +7,27 @@ describe Loader do
7
7
  Configuration.stub! :apply
8
8
  Indexes.stub! :setup
9
9
  end
10
-
10
+
11
+ describe 'load_application' do
12
+ before(:each) do
13
+ Loader.stub! :load
14
+ Loader.stub! :exclaim
15
+ end
16
+ it "does ok" do
17
+ lambda { Loader.load_application }.should_not raise_error
18
+ end
19
+ end
20
+
21
+ describe 'load_framework' do
22
+ before(:each) do
23
+ Loader.stub! :load
24
+ Loader.stub! :exclaim
25
+ end
26
+ it "does ok" do
27
+ lambda { Loader.load_framework }.should_not raise_error
28
+ end
29
+ end
30
+
11
31
  describe 'load_self' do
12
32
  before(:each) do
13
33
  Loader.stub! :load
@@ -7,6 +7,31 @@ describe Query::Allocation do
7
7
  @allocation = Query::Allocation.new @combinations
8
8
  end
9
9
 
10
+ describe "hash" do
11
+ it "delegates to the combinations" do
12
+ @combinations.should_receive(:hash).once.with
13
+
14
+ @allocation.hash
15
+ end
16
+ end
17
+
18
+ describe "to_s" do
19
+ before(:each) do
20
+ @combinations.stub! :to_result => 'combinations_result'
21
+ end
22
+ context "allocation.count > 0" do
23
+ before(:each) do
24
+ @allocation.stub! :count => 10
25
+ @allocation.stub! :result_type => :result_type
26
+ @allocation.stub! :score => :score
27
+ @allocation.stub! :ids => :ids
28
+ end
29
+ it "represents correctly" do
30
+ @allocation.to_s.should == "Allocation: result_type, score, 10, combinations_result, ids"
31
+ end
32
+ end
33
+ end
34
+
10
35
  describe 'remove' do
11
36
  it 'should delegate to the combinations' do
12
37
  @combinations.should_receive(:remove).once.with [:some_identifiers]
@@ -3,6 +3,43 @@ require 'spec_helper'
3
3
 
4
4
  describe 'Query::Base' do
5
5
 
6
+ describe "empty_results" do
7
+ before(:each) do
8
+ @query = Query::Full.new
9
+
10
+ @result_type = stub :result_type
11
+ @query.stub! :result_type => @result_type
12
+ end
13
+ it "returns a new result type" do
14
+ @result_type.should_receive(:new).once.with :some_offset
15
+
16
+ @query.empty_results :some_offset
17
+ end
18
+ it "returns a new result type with default offset" do
19
+ @result_type.should_receive(:new).once.with 0
20
+
21
+ @query.empty_results
22
+ end
23
+ end
24
+
25
+ describe "search_with_text" do
26
+ before(:each) do
27
+ @query = Query::Full.new
28
+ end
29
+ it "delegates to search" do
30
+ @query.stub! :tokenized => :tokens
31
+
32
+ @query.should_receive(:search).once.with :tokens, :offset
33
+
34
+ @query.search_with_text :text, :offset
35
+ end
36
+ it "uses the tokenizer" do
37
+ @query.should_receive(:tokenized).once.with :text
38
+
39
+ @query.search_with_text :text, :anything
40
+ end
41
+ end
42
+
6
43
  describe 'reduce' do
7
44
  context 'real' do
8
45
  before(:each) do
@@ -11,7 +11,16 @@ describe 'Query::Combination' do
11
11
 
12
12
  @combination = Query::Combination.new @token, @category
13
13
  end
14
-
14
+
15
+ describe "to_s" do
16
+ it "shows the combination's info" do
17
+ @bundle.stub! :name => :bundle_name
18
+ @token.stub! :to_result => :token_result
19
+
20
+ @combination.to_s.should == 'bundle_name some_category_name:token_result'
21
+ end
22
+ end
23
+
15
24
  describe 'hash' do
16
25
  it 'should hash the token and the bundle' do
17
26
  @combination.hash.should == [@token.to_s, @bundle].hash
@@ -6,10 +6,89 @@ describe 'Query::Combinations' do
6
6
 
7
7
  before(:each) do
8
8
  @combinations_ary = stub :combinations_ary
9
-
10
- @combinations = Query::Combinations.new :some_type, @combinations_ary
9
+
10
+ type = stub :type, :result_type => :some_type
11
+
12
+ @combinations = Query::Combinations.new type, @combinations_ary
11
13
  end
12
-
14
+
15
+ describe "pack_into_allocation" do
16
+ it "return an Allocation" do
17
+ @combinations.pack_into_allocation.should be_kind_of(Query::Allocation)
18
+ end
19
+ it "returns an Allocation with specific result_type" do
20
+ @combinations.pack_into_allocation.result_type.should == :some_type
21
+ end
22
+ end
23
+
24
+ describe "to_result" do
25
+ before(:each) do
26
+ @combination1 = stub :combination1, :to_result => :result1
27
+ @combination2 = stub :combination2, :to_result => :result2
28
+
29
+ @combinations_ary = [@combination1, @combination2]
30
+
31
+ @combinations = Query::Combinations.new :some_type, @combinations_ary
32
+ end
33
+ it "resultifies the combinations" do
34
+ @combinations.to_result.should == [:result1, :result2]
35
+ end
36
+ end
37
+
38
+ describe "add_score" do
39
+ it "uses the weights' score method" do
40
+ weights = stub :weights
41
+ weights.should_receive(:score).once.with @combinations_ary
42
+
43
+ @combinations.add_score weights
44
+ end
45
+ end
46
+
47
+ describe "sum_score" do
48
+ before(:each) do
49
+ @combination1 = stub :combination1, :weight => 3.14
50
+ @combination2 = stub :combination2, :weight => 2.76
51
+
52
+ @combinations_ary = [@combination1, @combination2]
53
+
54
+ @combinations = Query::Combinations.new :some_type, @combinations_ary
55
+ end
56
+ it "sums the scores" do
57
+ @combinations.sum_score.should == 5.90
58
+ end
59
+ end
60
+
61
+ describe "calculate_score" do
62
+ before(:each) do
63
+ @combinations.stub! :sum_score => 0
64
+ @combinations.stub! :add_score => 0
65
+ end
66
+ it "first sums, then weighs" do
67
+ @combinations.should_receive(:sum_score).once.ordered.and_return 0
68
+ @combinations.should_receive(:add_score).once.ordered.and_return 0
69
+
70
+ @combinations.calculate_score :anything
71
+ end
72
+ it "calls sum_score" do
73
+ @combinations.should_receive(:sum_score).once.with.and_return 0
74
+
75
+ @combinations.calculate_score :anything
76
+ end
77
+ it "calls sum_score" do
78
+ @combinations.should_receive(:add_score).once.with(:weights).and_return 0
79
+
80
+ @combinations.calculate_score :weights
81
+ end
82
+ end
83
+
84
+ describe 'hash' do
85
+ it "delegates to the combinations array" do
86
+ @combinations_ary.should_receive(:hash).once.with
87
+
88
+ @combinations.hash
89
+ end
90
+ end
91
+
13
92
  describe 'remove' do
14
93
  before(:each) do
15
94
  @combination1 = stub :combination1, :in? => false
@@ -27,6 +27,25 @@ describe Query::Combinator do
27
27
  end
28
28
  end
29
29
 
30
+ context "with real categories" do
31
+ before(:each) do
32
+ @category1 = Index::Category.new :some_name, :some_type
33
+ @category2 = Index::Category.new :some_name, :some_type
34
+ @category3 = Index::Category.new :some_name, :some_type
35
+ @categories = [@category1, @category2, @category3]
36
+
37
+ @combinator = Query::Combinator.new @categories
38
+ end
39
+ describe "similar_possible_for" do
40
+ before(:each) do
41
+ @token = Query::Token.processed 'similar~'
42
+ end
43
+ it "returns possible categories" do
44
+ @combinator.similar_possible_for(@token).should == []
45
+ end
46
+ end
47
+ end
48
+
30
49
  context 'without options' do
31
50
  before(:each) do
32
51
  @category1 = stub :category1, :name => :category1
@@ -37,6 +56,32 @@ describe Query::Combinator do
37
56
  @combinator = Query::Combinator.new @categories
38
57
  end
39
58
 
59
+ describe "possible_combinations_for" do
60
+ before(:each) do
61
+ @token = stub :token
62
+ end
63
+ context "with similar token" do
64
+ before(:each) do
65
+ @token.stub :similar? => true
66
+ end
67
+ it "calls the right method" do
68
+ @combinator.should_receive(:similar_possible_for).once.with @token
69
+
70
+ @combinator.possible_combinations_for @token
71
+ end
72
+ end
73
+ context "with non-similar token" do
74
+ before(:each) do
75
+ @token.stub :similar? => false
76
+ end
77
+ it "calls the right method" do
78
+ @combinator.should_receive(:possible_for).once.with @token
79
+
80
+ @combinator.possible_combinations_for @token
81
+ end
82
+ end
83
+ end
84
+
40
85
  describe 'possible_for' do
41
86
  context 'without preselected categories' do
42
87
  context 'user defined exists' do
@@ -8,6 +8,30 @@ describe Query::Token do
8
8
  Query::Qualifiers.instance.prepare
9
9
  end
10
10
 
11
+ describe "generate_similarity_for" do
12
+ before(:each) do
13
+ @bundle = stub :bundle
14
+
15
+ @token = Query::Token.processed 'flarb~'
16
+ end
17
+ context "with similar" do
18
+ before(:each) do
19
+ @bundle.stub! :similar => [:array, :of, :similar]
20
+ end
21
+ it "returns an enumerator" do
22
+ @token.generate_similarity_for(@bundle).to_a.size.should == 3
23
+ end
24
+ end
25
+ context "without similar" do
26
+ before(:each) do
27
+ @bundle.stub! :similar => nil
28
+ end
29
+ it "returns an enumerator with 0 entries" do
30
+ @token.generate_similarity_for(@bundle).to_a.size.should == 0
31
+ end
32
+ end
33
+ end
34
+
11
35
  describe 'to_solr' do
12
36
  def self.it_should_solr text, expected_result
13
37
  it "should solrify into #{expected_result} from #{text}" do
@@ -12,6 +12,34 @@ describe Rack::Harakiri do
12
12
  it "should quit after an amount of requests" do
13
13
  @harakiri.quit_after_requests.should == 50
14
14
  end
15
+ describe "harakiri" do
16
+ it "should kill the process after 50 harakiri calls" do
17
+ Process.should_receive(:kill).once
18
+
19
+ 50.times { @harakiri.harakiri }
20
+ end
21
+ it "should not kill the process after 49 harakiri calls" do
22
+ Process.should_receive(:kill).never
23
+
24
+ 49.times { @harakiri.harakiri }
25
+ end
26
+ end
27
+ describe "call" do
28
+ before(:each) do
29
+ @app.stub! :call
30
+ @app.stub! :harakiri
31
+ end
32
+ it "calls harakiri" do
33
+ @harakiri.should_receive(:harakiri).once.with
34
+
35
+ @harakiri.call :env
36
+ end
37
+ it "calls the app" do
38
+ @app.should_receive(:call).once.with :env
39
+
40
+ @harakiri.call :env
41
+ end
42
+ end
15
43
  end
16
44
  context "with harakiri set" do
17
45
  before(:each) do
@@ -2,6 +2,30 @@ require 'spec_helper'
2
2
 
3
3
  describe Results do
4
4
 
5
+ describe "ids" do
6
+ before(:each) do
7
+ @allocations = stub :allocations
8
+ @results = Results::Base.new :unimportant, @allocations
9
+ end
10
+ it "delegates" do
11
+ @allocations.should_receive(:ids).once.with :anything
12
+
13
+ @results.ids :anything
14
+ end
15
+ end
16
+
17
+ describe "random_ids" do
18
+ before(:each) do
19
+ @allocations = stub :allocations
20
+ @results = Results::Base.new :unimportant, @allocations
21
+ end
22
+ it "delegates" do
23
+ @allocations.should_receive(:random_ids).once.with :anything
24
+
25
+ @results.random_ids :anything
26
+ end
27
+ end
28
+
5
29
  describe 'to_log' do
6
30
  before(:each) do
7
31
  time = stub :time, :to_s => '0-08-16 10:07:33'
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Results::Live do
4
+
5
+ it "is the right subclass" do
6
+ Results::Live.should < Results::Base
7
+ end
8
+
9
+ it "logs correctly" do
10
+ Time.stub! :now => Time.parse('2010-10-25 01:25:07')
11
+
12
+ Results::Live.new.to_log('some query').should == '.|2010-10-25 01:25:07|0.000000|some query | 0| 0| 0|'
13
+ end
14
+
15
+ end
@@ -197,6 +197,11 @@ describe Routing do
197
197
 
198
198
  @routing.root 200
199
199
  end
200
+ it 'should call answer' do
201
+ @routing.should_receive(:answer).once.with %r{^/$}, Routing::STATUSES[404]
202
+
203
+ @routing.root 404
204
+ end
200
205
  end
201
206
 
202
207
  describe 'answer' do
@@ -6,7 +6,7 @@ describe Sources::DB do
6
6
  @type = stub :type, :name => 'some_type_name'
7
7
 
8
8
  @connection = stub :connection
9
- @adapter = stub :adapter, :connection => @connection
9
+ @adapter = stub :adapter, :connection => @connection
10
10
 
11
11
  @select_statement = stub :statement
12
12
 
@@ -16,6 +16,36 @@ describe Sources::DB do
16
16
  @source.stub! :connect_backend
17
17
  end
18
18
 
19
+ describe "get_data" do
20
+ it "delegates" do
21
+ type = stub :type, :name => :some_type
22
+ field = stub :field, :name => :some_field
23
+
24
+ @connection.should_receive(:execute).once.with 'SELECT indexed_id, some_field FROM some_type_type_index st WHERE st.id > some_offset LIMIT 25000'
25
+
26
+ @source.get_data type, field, :some_offset
27
+ end
28
+ end
29
+
30
+ describe "configure" do
31
+ it "works" do
32
+ lambda { @source.configure({}) }.should_not raise_error
33
+ end
34
+ context "with file" do
35
+ it "opens the config file relative to root" do
36
+ File.should_receive(:open).once.with 'some/search/root/app/bla.yml'
37
+
38
+ @source.configure :file => 'app/bla.yml'
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "connect_backend" do
44
+ it "works" do
45
+ lambda { @source.connect_backend }.should_not raise_error
46
+ end
47
+ end
48
+
19
49
  describe "chunksize" do
20
50
  it "should be a specific size" do
21
51
  @source.chunksize.should == 25_000
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sources::Delicious do
4
+
5
+ context "with file" do
6
+
7
+ describe "harvest" do
8
+ before(:each) do
9
+ @source = Sources::Delicious.new(:username, :password)
10
+
11
+ post1 = WWW::Delicious::Post.new
12
+ post1.uid = "5045d67b3f251e4ae966dffe71501763"
13
+ post1.tags = ["barefoot", "running", "shoe"]
14
+ post1.title = "VIBRAM - FiveFingers"
15
+ post1.url = URI.parse('http://www.vibramfivefingers.it/')
16
+
17
+ # post2 = WWW::Delicious::Post.new
18
+ # post2.uid = "d0b16f4b7e998a3386052bc95ad0d695"
19
+ # post2.tags = ["floating", "title", "scrolling", "css", "javascript", "ui"]
20
+ # post2.title = "Floating Title when Scrolling"
21
+ # post2.url = URI.parse('http://mesh.scribblelive.com/Event/Value_Judgements_in_Interface_Design5')
22
+
23
+ delicious = stub :delicious, :posts_recent => [post1]
24
+
25
+ WWW::Delicious.should_receive(:new).and_return delicious
26
+ end
27
+ it "should yield the right data" do
28
+ field = stub :b, :name => :tags
29
+ @source.harvest :anything, field do |id, token|
30
+ [id, token].should == [1, "barefoot running shoe"]
31
+ end
32
+ end
33
+ it "should yield the right data" do
34
+ field = stub :b, :name => :title
35
+ @source.harvest :anything, field do |id, token|
36
+ [id, token].should == [1, "VIBRAM - FiveFingers"]
37
+ end
38
+ end
39
+ it "should yield the right data" do
40
+ field = stub :b, :name => :url
41
+ @source.harvest :anything, field do |id, token|
42
+ [id, token].should == [1, "http://www.vibramfivefingers.it/"]
43
+ end
44
+ end
45
+ end
46
+ describe "get_data" do
47
+ before(:each) do
48
+ @source = Sources::Delicious.new(:username, :password)
49
+
50
+ post1 = WWW::Delicious::Post.new
51
+ post1.uid = "5045d67b3f251e4ae966dffe71501763"
52
+ post1.tags = ["barefoot", "running", "shoe"]
53
+ post1.title = "VIBRAM - FiveFingers"
54
+ post1.url = URI.parse('http://www.vibramfivefingers.it/')
55
+
56
+ # post2 = WWW::Delicious::Post.new
57
+ # post2.uid = "d0b16f4b7e998a3386052bc95ad0d695"
58
+ # post2.tags = ["floating", "title", "scrolling", "css", "javascript", "ui"]
59
+ # post2.title = "Floating Title when Scrolling"
60
+ # post2.url = URI.parse('http://mesh.scribblelive.com/Event/Value_Judgements_in_Interface_Design5')
61
+
62
+ delicious = stub :delicious, :posts_recent => [post1]
63
+
64
+ WWW::Delicious.should_receive(:new).and_return delicious
65
+ end
66
+ it "should yield each line" do
67
+ @source.get_data do |uid, data|
68
+ uid.should == 1
69
+ data.should == { :title => "VIBRAM - FiveFingers", :tags => "barefoot running shoe", :url => "http://www.vibramfivefingers.it/" }
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ end