xapit 0.2.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/{CHANGELOG → CHANGELOG.rdoc} +7 -2
  2. data/Gemfile +19 -0
  3. data/LICENSE +4 -4
  4. data/README.rdoc +61 -108
  5. data/Rakefile +11 -10
  6. data/features/facets.feature +93 -82
  7. data/features/finding.feature +196 -138
  8. data/features/indexing.feature +35 -37
  9. data/features/remote_server.feature +10 -0
  10. data/features/step_definitions/xapit_steps.rb +53 -25
  11. data/features/suggestions.feature +20 -14
  12. data/features/support/env.rb +13 -6
  13. data/features/support/xapit_helpers.rb +8 -9
  14. data/lib/generators/xapit/install_generator.rb +14 -0
  15. data/lib/generators/xapit/templates/xapit.ru +6 -0
  16. data/lib/generators/xapit/templates/xapit.yml +11 -0
  17. data/lib/xapit.rb +106 -64
  18. data/lib/xapit/client/collection.rb +150 -0
  19. data/lib/xapit/client/facet.rb +11 -0
  20. data/lib/xapit/client/facet_option.rb +29 -0
  21. data/lib/xapit/client/index_builder.rb +67 -0
  22. data/lib/xapit/client/membership.rb +46 -0
  23. data/lib/xapit/client/model_adapters/abstract_model_adapter.rb +30 -0
  24. data/lib/xapit/client/model_adapters/active_record_adapter.rb +27 -0
  25. data/lib/xapit/client/model_adapters/default_model_adapter.rb +7 -0
  26. data/lib/xapit/client/railtie.rb +18 -0
  27. data/lib/xapit/client/remote_database.rb +21 -0
  28. data/lib/xapit/client/tasks.rb +18 -0
  29. data/lib/xapit/server/app.rb +27 -0
  30. data/lib/xapit/server/database.rb +47 -0
  31. data/lib/xapit/server/indexer.rb +138 -0
  32. data/lib/xapit/server/query.rb +240 -0
  33. data/spec/fixtures/blankdb/flintlock +0 -0
  34. data/spec/fixtures/blankdb/iamchert +1 -0
  35. data/spec/fixtures/blankdb/postlist.DB +0 -0
  36. data/spec/fixtures/blankdb/postlist.baseA +0 -0
  37. data/spec/fixtures/blankdb/record.DB +0 -0
  38. data/spec/fixtures/blankdb/record.baseA +0 -0
  39. data/spec/fixtures/blankdb/termlist.DB +0 -0
  40. data/spec/fixtures/blankdb/termlist.baseA +0 -0
  41. data/spec/fixtures/xapit.ru +13 -0
  42. data/spec/fixtures/xapit.yml +4 -0
  43. data/spec/spec_helper.rb +8 -9
  44. data/spec/support/spec_macros.rb +6 -0
  45. data/spec/{xapit_member.rb → support/xapit_member.rb} +14 -16
  46. data/spec/xapit/client/collection_spec.rb +63 -0
  47. data/spec/xapit/client/facet_option_spec.rb +26 -0
  48. data/spec/xapit/client/facet_spec.rb +13 -0
  49. data/spec/xapit/client/index_builder_spec.rb +66 -0
  50. data/spec/xapit/client/membership_spec.rb +43 -0
  51. data/spec/xapit/client/model_adapters/active_record_adapter_spec.rb +62 -0
  52. data/spec/xapit/client/model_adapters/default_model_adapter_spec.rb +7 -0
  53. data/spec/xapit/client/remote_database_spec.rb +19 -0
  54. data/spec/xapit/server/app_spec.rb +22 -0
  55. data/spec/xapit/server/database_spec.rb +37 -0
  56. data/spec/xapit/server/indexer_spec.rb +82 -0
  57. data/spec/xapit/server/query_spec.rb +43 -0
  58. data/spec/xapit/xapit_spec.rb +28 -0
  59. metadata +124 -93
  60. data/Manifest +0 -60
  61. data/features/sorting.feature +0 -29
  62. data/init.rb +0 -1
  63. data/install.rb +0 -8
  64. data/lib/xapit/adapters/abstract_adapter.rb +0 -47
  65. data/lib/xapit/adapters/active_record_adapter.rb +0 -20
  66. data/lib/xapit/adapters/data_mapper_adapter.rb +0 -10
  67. data/lib/xapit/collection.rb +0 -187
  68. data/lib/xapit/config.rb +0 -84
  69. data/lib/xapit/facet.rb +0 -67
  70. data/lib/xapit/facet_blueprint.rb +0 -59
  71. data/lib/xapit/facet_option.rb +0 -56
  72. data/lib/xapit/index_blueprint.rb +0 -147
  73. data/lib/xapit/indexers/abstract_indexer.rb +0 -116
  74. data/lib/xapit/indexers/classic_indexer.rb +0 -29
  75. data/lib/xapit/indexers/simple_indexer.rb +0 -38
  76. data/lib/xapit/membership.rb +0 -137
  77. data/lib/xapit/query.rb +0 -89
  78. data/lib/xapit/query_parsers/abstract_query_parser.rb +0 -174
  79. data/lib/xapit/query_parsers/classic_query_parser.rb +0 -29
  80. data/lib/xapit/query_parsers/simple_query_parser.rb +0 -75
  81. data/lib/xapit/rake_tasks.rb +0 -13
  82. data/rails_generators/xapit/USAGE +0 -13
  83. data/rails_generators/xapit/templates/setup_xapit.rb +0 -1
  84. data/rails_generators/xapit/templates/xapit.rake +0 -4
  85. data/rails_generators/xapit/xapit_generator.rb +0 -20
  86. data/spec/xapit/adapters/active_record_adapter_spec.rb +0 -31
  87. data/spec/xapit/adapters/data_mapper_adapter_spec.rb +0 -10
  88. data/spec/xapit/collection_spec.rb +0 -176
  89. data/spec/xapit/config_spec.rb +0 -62
  90. data/spec/xapit/facet_blueprint_spec.rb +0 -29
  91. data/spec/xapit/facet_option_spec.rb +0 -80
  92. data/spec/xapit/facet_spec.rb +0 -73
  93. data/spec/xapit/index_blueprint_spec.rb +0 -112
  94. data/spec/xapit/indexers/abstract_indexer_spec.rb +0 -111
  95. data/spec/xapit/indexers/classic_indexer_spec.rb +0 -35
  96. data/spec/xapit/indexers/simple_indexer_spec.rb +0 -69
  97. data/spec/xapit/membership_spec.rb +0 -55
  98. data/spec/xapit/query_parsers/abstract_query_parser_spec.rb +0 -60
  99. data/spec/xapit/query_parsers/classic_query_parser_spec.rb +0 -20
  100. data/spec/xapit/query_parsers/simple_query_parser_spec.rb +0 -86
  101. data/spec/xapit/query_spec.rb +0 -60
  102. data/tasks/spec.rb +0 -9
  103. data/tasks/xapit.rake +0 -1
  104. data/uninstall.rb +0 -5
  105. data/xapit.gemspec +0 -30
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Client::Facet do
4
+ it "sets the name to capitalized attribute" do
5
+ facet = Xapit::Client::Facet.new("building_type", [])
6
+ facet.name.should eq("Building Type")
7
+ end
8
+
9
+ it "sets the name as symbol to capitalized attribute" do
10
+ facet = Xapit::Client::Facet.new(:building_type, [])
11
+ facet.name.should eq("Building Type")
12
+ end
13
+ end
@@ -0,0 +1,66 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Client::IndexBuilder do
4
+ it "stores text attributes with option" do
5
+ builder = Xapit::Client::IndexBuilder.new
6
+ builder.text :foo, :weight => 3
7
+ builder.text :bar, :blah
8
+ builder.attributes[:foo].should eq(:text => {:weight => 3})
9
+ builder.attributes[:bar].should eq(:text => {})
10
+ builder.attributes[:blah].should eq(:text => {})
11
+ end
12
+
13
+ it "stores field attribute with option" do
14
+ builder = Xapit::Client::IndexBuilder.new
15
+ builder.field :foo, :weight => 3
16
+ builder.field :bar, :blah
17
+ builder.attributes[:foo].should eq(:field => {:weight => 3})
18
+ builder.attributes[:bar].should eq(:field => {})
19
+ builder.attributes[:blah].should eq(:field => {})
20
+ end
21
+
22
+ it "stores sortable attribute with option" do
23
+ builder = Xapit::Client::IndexBuilder.new
24
+ builder.sortable :foo, :weight => 3
25
+ builder.sortable :bar, :blah
26
+ builder.attributes[:foo].should eq(:sortable => {:weight => 3})
27
+ builder.attributes[:bar].should eq(:sortable => {})
28
+ builder.attributes[:blah].should eq(:sortable => {})
29
+ end
30
+
31
+ it "stores facet attribute with options" do
32
+ builder = Xapit::Client::IndexBuilder.new
33
+ builder.facet :foo
34
+ builder.facet :bar, "Zap"
35
+ builder.attributes[:foo].should eq(:facet => {})
36
+ builder.attributes[:bar].should eq(:facet => {:name => "Zap"})
37
+ end
38
+
39
+ it "fetches facets back" do
40
+ builder = Xapit::Client::IndexBuilder.new
41
+ builder.text :test
42
+ builder.facet :foo
43
+ builder.facet :bar
44
+ builder.facets.should eq([:foo, :bar])
45
+ end
46
+
47
+ it "merges member values with attributes for index data" do
48
+ builder = Xapit::Client::IndexBuilder.new
49
+ builder.text :greeting, :weight => 3
50
+ builder.field :name
51
+ member = XapitMember.new(:greeting => "hello world", :name => "John")
52
+ data = builder.document_data(member)
53
+ data[:id].should eq(member.id)
54
+ data[:class].should eq("XapitMember")
55
+ data[:attributes].should eq(:greeting => {:value => "hello world", :text => {:weight => 3}}, :name => {:value => "John", :field => {}})
56
+ end
57
+
58
+ it "indexes an object by adding it to the current database" do
59
+ load_xapit_database
60
+ Xapit.database.xapian_database.doccount.should eq(0)
61
+ builder = Xapit::Client::IndexBuilder.new
62
+ member = XapitMember.new(:greeting => "Hello world")
63
+ builder.add_document(member)
64
+ Xapit.database.xapian_database.doccount.should eq(1)
65
+ end
66
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Client::Membership do
4
+ before(:each) do
5
+ @member_class = Class.new
6
+ @member_class.send(:include, Xapit::Client::Membership)
7
+ end
8
+
9
+ it "does not define search class method when xapit isn't called" do
10
+ @member_class.should_not respond_to(:search)
11
+ end
12
+
13
+ it "has a xapit method which makes an index builder" do
14
+ @member_class.xapit { text :foo }
15
+ @member_class.xapit_index_builder.attributes.keys.should eq([:foo])
16
+ end
17
+
18
+ it "returns collection with query on search" do
19
+ @member_class.xapit { text :foo }
20
+ @member_class.search("hello").clauses.should eq([{:in_classes => [@member_class]}, {:search => "hello"}])
21
+ end
22
+
23
+ it "returns collection with no search query" do
24
+ @member_class.xapit { text :foo }
25
+ @member_class.search.clauses.should eq([{:in_classes => [@member_class]}])
26
+ @member_class.search("").clauses.should eq([{:in_classes => [@member_class]}])
27
+ end
28
+
29
+ it "supports xapit_search instead of just search" do
30
+ @member_class.xapit { text :foo }
31
+ @member_class.xapit_search.clauses.should eq([{:in_classes => [@member_class]}])
32
+ end
33
+
34
+ it "includes facets" do
35
+ @member_class.xapit { facet :foo }
36
+ @member_class.search.clauses.should eq([{:in_classes => [@member_class]}, {:include_facets => [:foo]}])
37
+ end
38
+
39
+ it "has a model_adapter" do
40
+ @member_class.xapit { } # load up the xapit methods
41
+ @member_class.xapit_model_adapter.should be_kind_of(Xapit::Client::DefaultModelAdapter)
42
+ end
43
+ end
@@ -0,0 +1,62 @@
1
+ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
2
+ require "spec_helper"
3
+ ActiveRecord::Base.send(:include, Xapit::Client::Membership) # normally done in Railtie
4
+
5
+ RSpec.configure do |config|
6
+ config.extend WithModel
7
+ end
8
+
9
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
10
+
11
+ describe Xapit::Client::ActiveRecordAdapter do
12
+ with_model :article do
13
+ table do |t|
14
+ t.string "name"
15
+ end
16
+ end
17
+
18
+ before(:each) do
19
+ load_xapit_database
20
+ Article.xapit { text :name }
21
+ end
22
+
23
+ it "is only for active record classes" do
24
+ Xapit::Client::ActiveRecordAdapter.should_not be_for_class(Object)
25
+ Xapit::Client::ActiveRecordAdapter.should be_for_class(Article)
26
+ Xapit::Client::AbstractModelAdapter.adapter_class(Article).should == Xapit::Client::ActiveRecordAdapter
27
+ end
28
+
29
+ it "creates document when saved" do
30
+ article = Article.create!(:name => "Foo Bar")
31
+ Article.search("Foo Bar").records.should eq([article])
32
+ end
33
+
34
+ it "deletes a document when removed" do
35
+ article = Article.create!(:name => "Foo Bar")
36
+ article.destroy
37
+ Article.search("Foo Bar").records.should eq([])
38
+ end
39
+
40
+ it "update a document when changed" do
41
+ article = Article.create!(:name => "Foo Bar")
42
+ article.update_attribute(:name, "Hello World")
43
+ Article.search("Foo Bar").records.should eq([])
44
+ Article.search("Hello World").records.should eq([article])
45
+ end
46
+
47
+ it "does not index records while disabled" do
48
+ Xapit.config[:enabled] = false
49
+ Article.create!(:name => "Foo Bar")
50
+ Xapit.config[:enabled] = true
51
+ Article.search("Foo Bar").records.should eq([])
52
+ end
53
+
54
+ it "reindexes all records for a model" do
55
+ Xapit.config[:enabled] = false
56
+ article = Article.create!(:name => "Foo Bar")
57
+ Xapit.config[:enabled] = true
58
+ Xapit.index(Article)
59
+ Article.search("Foo Bar").records.should eq([article])
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Client::DefaultModelAdapter do
4
+ it "should be default for generic classes" do
5
+ Xapit::Client::DefaultModelAdapter.adapter_class(Object).should == Xapit::Client::DefaultModelAdapter
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Client::RemoteDatabase do
4
+ before(:each) do
5
+ @database = Xapit::Client::RemoteDatabase.new("http://localhost:1234")
6
+ end
7
+
8
+ Xapit::Server::Database::COMMANDS.each do |command|
9
+ it "passes #{command} to remote server using Net::HTTP" do
10
+ http = Object.new
11
+ response = Object.new
12
+ uri = URI.parse("http://localhost:1234/xapit/#{command}")
13
+ Net::HTTP.should_receive(:start).with(uri.host, uri.port).and_yield(http)
14
+ http.should_receive(:request_post).with(uri.path, {:send => "request"}.to_json).and_return(response)
15
+ response.should_receive(:body).and_return({"receive" => "response"}.to_json)
16
+ @database.send(command, :send => "request").should eq(:receive => "response")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Server::App do
4
+ before(:each) do
5
+ @app = Xapit::Server::App.new
6
+ @request = Rack::MockRequest.new(@app)
7
+ end
8
+
9
+ Xapit::Server::Database::COMMANDS.each do |command|
10
+ it "passes #{command} to database and returns response in JSON" do
11
+ Xapit.database.stub(command.to_sym).with(:foo => "bar") { {:some => "result"} }
12
+ response = @request.post("/xapit/#{command}", :params => {"foo" => "bar"}.to_json)
13
+ response.status.should eq(200)
14
+ response.body.should eq({:some => "result"}.to_json)
15
+ end
16
+ end
17
+
18
+ it "responds with 404 when unknown url" do
19
+ response = @request.post("/xapit/foo")
20
+ response.status.should eq(404)
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Server::Database do
4
+ before(:each) do
5
+ load_xapit_database
6
+ @database = Xapit.database
7
+ end
8
+
9
+ it "has a xapian database" do
10
+ @database.xapian_database.should be_kind_of(Xapian::WritableDatabase)
11
+ end
12
+
13
+ it "adds a document to the database" do
14
+ @database.xapian_database.doccount.should eq(0)
15
+ @database.add_document(:attributes => {:greeting => {:value => "hello world", :text => {}}})
16
+ @database.xapian_database.doccount.should eq(1)
17
+ end
18
+
19
+ it "queries the database for results" do
20
+ @database.add_document(:attributes => {:greeting => {:value => "hello world", :text => {}}}, :id => 123, :class => "Greeting")
21
+ @database.query([{:search => "hello"}])[:records].should eq([{:class => "Greeting", :id => "123", :relevance => 100}])
22
+ end
23
+
24
+ it "removes a document from the database" do
25
+ @database.xapian_database.doccount.should eq(0)
26
+ @database.add_document(:id => 123, :class => "Greeting")
27
+ @database.xapian_database.doccount.should eq(1)
28
+ @database.remove_document(:id => 123, :class => "Greeting")
29
+ @database.xapian_database.doccount.should eq(0)
30
+ end
31
+
32
+ it "updates a document in the database" do
33
+ @database.add_document(:attributes => {:greeting => {:value => "hello world", :text => {}}}, :id => 123, :class => "Greeting")
34
+ @database.update_document(:attributes => {:greeting => {:value => "aloha", :text => {}}}, :id => 123, :class => "Greeting")
35
+ @database.query([{:search => "aloha"}])[:records].should eq([{:class => "Greeting", :id => "123", :relevance => 100}])
36
+ end
37
+ end
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Server::Indexer do
4
+ before(:each) do
5
+ load_xapit_database
6
+ end
7
+
8
+ it "generates a xapian document with terms and values" do
9
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => "hello world", :text => {}}, :name => {:value => "John", :field => {}}})
10
+ document = indexer.document
11
+ document.should be_kind_of(Xapian::Document)
12
+ document.terms.map(&:term).should include(*%w[hello world])
13
+ document.values.map(&:value).should eq([Xapit.serialize_value("John")])
14
+ end
15
+
16
+ it "generates a xapian document with text weight data" do
17
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => "hello", :text => {:weight => 3}}})
18
+ indexer.document.terms.map(&:wdf).should include(3)
19
+ end
20
+
21
+ it "stores sortable attributes as serialized values" do
22
+ time = Time.now
23
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => time, :sortable => {}}})
24
+ document = indexer.document
25
+ document.values.map(&:value).should eq([Xapit.serialize_value(time)])
26
+ end
27
+
28
+ it "adds the id and class to xapian document data" do
29
+ indexer = Xapit::Server::Indexer.new(:class => "Foo", :id => "123")
30
+ document = indexer.document
31
+ document.should be_kind_of(Xapian::Document)
32
+ document.data.should eq("Foo-123")
33
+ end
34
+
35
+ it "includes class/id in terms list" do
36
+ indexer = Xapit::Server::Indexer.new(:class => "Foo", :id => "123")
37
+ indexer.terms.should include(["CFoo", 1], ["QFoo-123", 1])
38
+ end
39
+
40
+ it "includes fields in terms list" do
41
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => "Hello", :field => {}}})
42
+ indexer.terms.should include(["Xgreeting-hello", 1])
43
+ end
44
+
45
+ it "adds facets to values and terms" do
46
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => ["Hello", "Hey"], :facet => {}}})
47
+ document = indexer.document
48
+ document.values.map(&:value).should eq(["Hello\3Hey"])
49
+ indexer.terms.should include(["F#{Xapit.facet_identifier(:greeting, "Hello")}", 1])
50
+ indexer.terms.should include(["F#{Xapit.facet_identifier(:greeting, "Hey")}", 1])
51
+ end
52
+
53
+ it "indexes array values separately" do
54
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => ["Hello", "world"], :field => {}}})
55
+ indexer.terms.should include(["Xgreeting-hello", 1], ["Xgreeting-world", 1])
56
+ end
57
+
58
+ it "includes text attributes in terms list" do
59
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => "hello world", :text => {}}})
60
+ indexer.terms.should include(["hello", 1], ["world", 1])
61
+ end
62
+
63
+ it "handles odd text attributes correctly" do
64
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => [6, nil, ""], :text => {}}})
65
+ indexer.terms.should include(["6", 1])
66
+ indexer.terms.should_not include(["", 1])
67
+ indexer.terms.should_not include([nil, 1])
68
+ end
69
+
70
+ it "handles odd field attributes correctly" do
71
+ # TODO add date handling
72
+ time = Time.now
73
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => [6, nil, time], :field => {}}})
74
+ indexer.terms.should include(["Xgreeting-6", 1], ["Xgreeting-", 1], ["Xgreeting-#{time.to_i}", 1])
75
+ end
76
+
77
+ it "includes field and sortable values" do
78
+ indexer = Xapit::Server::Indexer.new(:attributes => {:greeting => {:value => "Hello", :field => {}, :sortable => {}}})
79
+ indexer.values[Xapit.value_index(:field, "greeting")].should eq(Xapit.serialize_value("Hello"))
80
+ indexer.values[Xapit.value_index(:sortable, "greeting")].should eq(Xapit.serialize_value("Hello"))
81
+ end
82
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit::Server::Query do
4
+ before(:each) do
5
+ load_xapit_database
6
+ end
7
+
8
+ it "fetches results matching a simple search term" do
9
+ Xapit.database.add_document(:attributes => {:greeting => {:value => "hello world", :text => {}}}, :id => 123, :class => "Greeting")
10
+ query = Xapit::Server::Query.new([{:search => "hello"}])
11
+ query.records.should eq([{:class => "Greeting", :id => "123", :relevance => 100}])
12
+ query = Xapit::Server::Query.new([{:search => "matchnothing"}])
13
+ query.records.should eq([])
14
+ end
15
+
16
+ it "fetches results matching a simple where clause" do
17
+ Xapit.database.add_document(:attributes => {:priority => {:value => "3", :field => {}}}, :id => 123, :class => "Greeting")
18
+ query = Xapit::Server::Query.new([{:where => {:priority => 3}}])
19
+ query.records.should eq([{:class => "Greeting", :id => "123", :relevance => 100}])
20
+ query = Xapit::Server::Query.new([{:where => {:priority => 4}}])
21
+ query.records.should eq([])
22
+ end
23
+
24
+ it "fetches facets when told to include them" do
25
+ Xapit.database.add_document(:attributes => {:priority => {:value => "3", :facet => {}}}, :id => 123, :class => "Greeting")
26
+ query = Xapit::Server::Query.new([{:include_facets => [:priority]}])
27
+ query.facets.should eq(:priority => [{:value => "3", :count => 1}])
28
+ end
29
+
30
+ it "fetches results matching a given facet" do
31
+ Xapit.database.add_document(:attributes => {:priority => {:value => "3", :field => {}, :facet => {}}}, :id => 123, :class => "Greeting")
32
+ query = Xapit::Server::Query.new([{:with_facets => [Xapit.facet_identifier(:priority, "3")]}])
33
+ query.records.should eq([{:class => "Greeting", :id => "123", :relevance => 100}])
34
+ query = Xapit::Server::Query.new([{:with_facets => [Xapit.facet_identifier(:priority, "4")]}])
35
+ query.records.should eq([])
36
+ end
37
+
38
+ it "fetches results containing applied facets" do
39
+ Xapit.database.add_document(:attributes => {:priority => {:value => "3", :facet => {}}}, :id => 123, :class => "Greeting")
40
+ query = Xapit::Server::Query.new([{:with_facets => [Xapit.facet_identifier(:priority, "3")]}])
41
+ query.applied_facet_options.should eq([{:id => Xapit.facet_identifier(:priority, "3"), :name => "priority", :value => "3"}])
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Xapit do
4
+ it "has default config settings" do
5
+ Xapit.config[:enabled].should eq(true)
6
+ Xapit.config[:spelling].should eq(true)
7
+ Xapit.config[:stemming].should eq("english")
8
+ end
9
+
10
+ it "can be enabled" do
11
+ Xapit.config[:enabled] = false
12
+ Xapit.enable
13
+ Xapit.config[:enabled].should eq(true)
14
+ end
15
+
16
+ it "loads and reloads a configuration file via load_config" do
17
+ Xapit.load_config("spec/fixtures/xapit.yml", "development")
18
+ Xapit.config[:database_path].should eq("development_database")
19
+ Xapit.config[:database_path] = "foo"
20
+ Xapit.reload
21
+ Xapit.config[:database_path].should eq("development_database")
22
+ end
23
+
24
+ it "raises an exception when accessing the database while disabled" do
25
+ Xapit.config[:enabled] = false
26
+ lambda { Xapit.database }.should raise_exception(Xapit::Disabled)
27
+ end
28
+ end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xapit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ hash: 19
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Ryan Bates
@@ -9,135 +15,160 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-07-07 00:00:00 -07:00
18
+ date: 2011-08-17 00:00:00 -07:00
13
19
  default_executable:
14
- dependencies: []
15
-
16
- description: Ruby library for interacting with Xapian, a full text search engine.
17
- email: ryan (at) railscasts (dot) com
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rack
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 27
30
+ segments:
31
+ - 1
32
+ - 2
33
+ - 2
34
+ version: 1.2.2
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 27
46
+ segments:
47
+ - 2
48
+ - 5
49
+ - 0
50
+ version: 2.5.0
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: cucumber
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 51
62
+ segments:
63
+ - 0
64
+ - 10
65
+ - 2
66
+ version: 0.10.2
67
+ type: :development
68
+ version_requirements: *id003
69
+ description: Ruby library for interacting with Xapian. Includes full text search, faceted options, spelling suggestions, and more.
70
+ email: ryan@railscasts.com
18
71
  executables: []
19
72
 
20
73
  extensions: []
21
74
 
22
- extra_rdoc_files:
23
- - CHANGELOG
24
- - lib/xapit/adapters/abstract_adapter.rb
25
- - lib/xapit/adapters/active_record_adapter.rb
26
- - lib/xapit/adapters/data_mapper_adapter.rb
27
- - lib/xapit/collection.rb
28
- - lib/xapit/config.rb
29
- - lib/xapit/facet.rb
30
- - lib/xapit/facet_blueprint.rb
31
- - lib/xapit/facet_option.rb
32
- - lib/xapit/index_blueprint.rb
33
- - lib/xapit/indexers/abstract_indexer.rb
34
- - lib/xapit/indexers/classic_indexer.rb
35
- - lib/xapit/indexers/simple_indexer.rb
36
- - lib/xapit/membership.rb
37
- - lib/xapit/query.rb
38
- - lib/xapit/query_parsers/abstract_query_parser.rb
39
- - lib/xapit/query_parsers/classic_query_parser.rb
40
- - lib/xapit/query_parsers/simple_query_parser.rb
41
- - lib/xapit/rake_tasks.rb
42
- - lib/xapit.rb
43
- - LICENSE
44
- - README.rdoc
45
- - tasks/spec.rb
46
- - tasks/xapit.rake
75
+ extra_rdoc_files: []
76
+
47
77
  files:
48
- - CHANGELOG
78
+ - lib/generators/xapit/install_generator.rb
79
+ - lib/generators/xapit/templates/xapit.ru
80
+ - lib/generators/xapit/templates/xapit.yml
81
+ - lib/xapit/client/collection.rb
82
+ - lib/xapit/client/facet.rb
83
+ - lib/xapit/client/facet_option.rb
84
+ - lib/xapit/client/index_builder.rb
85
+ - lib/xapit/client/membership.rb
86
+ - lib/xapit/client/model_adapters/abstract_model_adapter.rb
87
+ - lib/xapit/client/model_adapters/active_record_adapter.rb
88
+ - lib/xapit/client/model_adapters/default_model_adapter.rb
89
+ - lib/xapit/client/railtie.rb
90
+ - lib/xapit/client/remote_database.rb
91
+ - lib/xapit/client/tasks.rb
92
+ - lib/xapit/server/app.rb
93
+ - lib/xapit/server/database.rb
94
+ - lib/xapit/server/indexer.rb
95
+ - lib/xapit/server/query.rb
96
+ - lib/xapit.rb
97
+ - spec/fixtures/blankdb/flintlock
98
+ - spec/fixtures/blankdb/iamchert
99
+ - spec/fixtures/blankdb/postlist.baseA
100
+ - spec/fixtures/blankdb/postlist.DB
101
+ - spec/fixtures/blankdb/record.baseA
102
+ - spec/fixtures/blankdb/record.DB
103
+ - spec/fixtures/blankdb/termlist.baseA
104
+ - spec/fixtures/blankdb/termlist.DB
105
+ - spec/fixtures/xapit.ru
106
+ - spec/fixtures/xapit.yml
107
+ - spec/spec_helper.rb
108
+ - spec/support/spec_macros.rb
109
+ - spec/support/xapit_member.rb
110
+ - spec/xapit/client/collection_spec.rb
111
+ - spec/xapit/client/facet_option_spec.rb
112
+ - spec/xapit/client/facet_spec.rb
113
+ - spec/xapit/client/index_builder_spec.rb
114
+ - spec/xapit/client/membership_spec.rb
115
+ - spec/xapit/client/model_adapters/active_record_adapter_spec.rb
116
+ - spec/xapit/client/model_adapters/default_model_adapter_spec.rb
117
+ - spec/xapit/client/remote_database_spec.rb
118
+ - spec/xapit/server/app_spec.rb
119
+ - spec/xapit/server/database_spec.rb
120
+ - spec/xapit/server/indexer_spec.rb
121
+ - spec/xapit/server/query_spec.rb
122
+ - spec/xapit/xapit_spec.rb
49
123
  - features/facets.feature
50
124
  - features/finding.feature
51
125
  - features/indexing.feature
52
- - features/sorting.feature
126
+ - features/remote_server.feature
53
127
  - features/step_definitions/common_steps.rb
54
128
  - features/step_definitions/xapit_steps.rb
55
129
  - features/suggestions.feature
56
130
  - features/support/env.rb
57
131
  - features/support/xapit_helpers.rb
58
- - init.rb
59
- - install.rb
60
- - lib/xapit/adapters/abstract_adapter.rb
61
- - lib/xapit/adapters/active_record_adapter.rb
62
- - lib/xapit/adapters/data_mapper_adapter.rb
63
- - lib/xapit/collection.rb
64
- - lib/xapit/config.rb
65
- - lib/xapit/facet.rb
66
- - lib/xapit/facet_blueprint.rb
67
- - lib/xapit/facet_option.rb
68
- - lib/xapit/index_blueprint.rb
69
- - lib/xapit/indexers/abstract_indexer.rb
70
- - lib/xapit/indexers/classic_indexer.rb
71
- - lib/xapit/indexers/simple_indexer.rb
72
- - lib/xapit/membership.rb
73
- - lib/xapit/query.rb
74
- - lib/xapit/query_parsers/abstract_query_parser.rb
75
- - lib/xapit/query_parsers/classic_query_parser.rb
76
- - lib/xapit/query_parsers/simple_query_parser.rb
77
- - lib/xapit/rake_tasks.rb
78
- - lib/xapit.rb
132
+ - CHANGELOG.rdoc
133
+ - Gemfile
79
134
  - LICENSE
80
- - Manifest
81
- - rails_generators/xapit/templates/setup_xapit.rb
82
- - rails_generators/xapit/templates/xapit.rake
83
- - rails_generators/xapit/USAGE
84
- - rails_generators/xapit/xapit_generator.rb
85
135
  - Rakefile
86
136
  - README.rdoc
87
- - spec/spec_helper.rb
88
- - spec/xapit/adapters/active_record_adapter_spec.rb
89
- - spec/xapit/adapters/data_mapper_adapter_spec.rb
90
- - spec/xapit/collection_spec.rb
91
- - spec/xapit/config_spec.rb
92
- - spec/xapit/facet_blueprint_spec.rb
93
- - spec/xapit/facet_option_spec.rb
94
- - spec/xapit/facet_spec.rb
95
- - spec/xapit/index_blueprint_spec.rb
96
- - spec/xapit/indexers/abstract_indexer_spec.rb
97
- - spec/xapit/indexers/classic_indexer_spec.rb
98
- - spec/xapit/indexers/simple_indexer_spec.rb
99
- - spec/xapit/membership_spec.rb
100
- - spec/xapit/query_parsers/abstract_query_parser_spec.rb
101
- - spec/xapit/query_parsers/classic_query_parser_spec.rb
102
- - spec/xapit/query_parsers/simple_query_parser_spec.rb
103
- - spec/xapit/query_spec.rb
104
- - spec/xapit_member.rb
105
- - tasks/spec.rb
106
- - tasks/xapit.rake
107
- - uninstall.rb
108
- - xapit.gemspec
109
137
  has_rdoc: true
110
138
  homepage: http://github.com/ryanb/xapit
111
139
  licenses: []
112
140
 
113
141
  post_install_message:
114
- rdoc_options:
115
- - --line-numbers
116
- - --inline-source
117
- - --title
118
- - Xapit
119
- - --main
120
- - README.rdoc
142
+ rdoc_options: []
143
+
121
144
  require_paths:
122
145
  - lib
123
146
  required_ruby_version: !ruby/object:Gem::Requirement
147
+ none: false
124
148
  requirements:
125
149
  - - ">="
126
150
  - !ruby/object:Gem::Version
151
+ hash: 3
152
+ segments:
153
+ - 0
127
154
  version: "0"
128
- version:
129
155
  required_rubygems_version: !ruby/object:Gem::Requirement
156
+ none: false
130
157
  requirements:
131
158
  - - ">="
132
159
  - !ruby/object:Gem::Version
133
- version: "1.2"
134
- version:
160
+ hash: 19
161
+ segments:
162
+ - 1
163
+ - 3
164
+ - 4
165
+ version: 1.3.4
135
166
  requirements: []
136
167
 
137
168
  rubyforge_project: xapit
138
- rubygems_version: 1.3.3
169
+ rubygems_version: 1.6.2
139
170
  signing_key:
140
171
  specification_version: 3
141
- summary: Ruby library for interacting with Xapian, a full text search engine.
172
+ summary: Ruby library for interacting with the Xapian full text search engine.
142
173
  test_files: []
143
174