picky 0.3.0 → 0.9.0

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