thinking-sphinx 2.0.5 → 2.0.6
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/README.textile +7 -1
- data/features/searching_by_model.feature +24 -30
- data/features/step_definitions/common_steps.rb +5 -5
- data/features/thinking_sphinx/db/.gitignore +1 -0
- data/features/thinking_sphinx/db/fixtures/post_keywords.txt +1 -0
- data/spec/fixtures/data.sql +32 -0
- data/spec/fixtures/database.yml.default +3 -0
- data/spec/fixtures/models.rb +161 -0
- data/spec/fixtures/structure.sql +146 -0
- data/spec/spec_helper.rb +62 -0
- data/spec/sphinx_helper.rb +61 -0
- data/spec/support/rails.rb +18 -0
- data/spec/thinking_sphinx/active_record/delta_spec.rb +24 -24
- data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +27 -0
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +25 -25
- data/spec/thinking_sphinx/active_record_spec.rb +108 -107
- data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +38 -38
- data/spec/thinking_sphinx/association_spec.rb +69 -35
- data/spec/thinking_sphinx/context_spec.rb +61 -64
- data/spec/thinking_sphinx/search_spec.rb +7 -0
- data/spec/thinking_sphinx_spec.rb +47 -46
- metadata +49 -141
- data/VERSION +0 -1
- data/lib/cucumber/thinking_sphinx/external_world.rb +0 -12
- data/lib/cucumber/thinking_sphinx/internal_world.rb +0 -127
- data/lib/cucumber/thinking_sphinx/sql_logger.rb +0 -20
- data/lib/thinking-sphinx.rb +0 -1
- data/lib/thinking_sphinx.rb +0 -301
- data/lib/thinking_sphinx/action_controller.rb +0 -31
- data/lib/thinking_sphinx/active_record.rb +0 -384
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +0 -52
- data/lib/thinking_sphinx/active_record/delta.rb +0 -65
- data/lib/thinking_sphinx/active_record/has_many_association.rb +0 -36
- data/lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb +0 -21
- data/lib/thinking_sphinx/active_record/log_subscriber.rb +0 -61
- data/lib/thinking_sphinx/active_record/scopes.rb +0 -93
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +0 -87
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +0 -62
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +0 -157
- data/lib/thinking_sphinx/association.rb +0 -219
- data/lib/thinking_sphinx/attribute.rb +0 -396
- data/lib/thinking_sphinx/auto_version.rb +0 -38
- data/lib/thinking_sphinx/bundled_search.rb +0 -44
- data/lib/thinking_sphinx/class_facet.rb +0 -20
- data/lib/thinking_sphinx/configuration.rb +0 -339
- data/lib/thinking_sphinx/context.rb +0 -76
- data/lib/thinking_sphinx/core/string.rb +0 -15
- data/lib/thinking_sphinx/deltas.rb +0 -28
- data/lib/thinking_sphinx/deltas/default_delta.rb +0 -62
- data/lib/thinking_sphinx/deploy/capistrano.rb +0 -101
- data/lib/thinking_sphinx/excerpter.rb +0 -23
- data/lib/thinking_sphinx/facet.rb +0 -128
- data/lib/thinking_sphinx/facet_search.rb +0 -170
- data/lib/thinking_sphinx/field.rb +0 -98
- data/lib/thinking_sphinx/index.rb +0 -157
- data/lib/thinking_sphinx/index/builder.rb +0 -312
- data/lib/thinking_sphinx/index/faux_column.rb +0 -118
- data/lib/thinking_sphinx/join.rb +0 -37
- data/lib/thinking_sphinx/property.rb +0 -185
- data/lib/thinking_sphinx/railtie.rb +0 -46
- data/lib/thinking_sphinx/search.rb +0 -972
- data/lib/thinking_sphinx/search_methods.rb +0 -439
- data/lib/thinking_sphinx/sinatra.rb +0 -7
- data/lib/thinking_sphinx/source.rb +0 -194
- data/lib/thinking_sphinx/source/internal_properties.rb +0 -51
- data/lib/thinking_sphinx/source/sql.rb +0 -157
- data/lib/thinking_sphinx/tasks.rb +0 -130
- data/lib/thinking_sphinx/test.rb +0 -55
- data/tasks/distribution.rb +0 -33
- data/tasks/testing.rb +0 -80
| @@ -7,137 +7,137 @@ end | |
| 7 7 | 
             
            describe ThinkingSphinx::AbstractAdapter do
         | 
| 8 8 | 
             
              describe '.detect' do
         | 
| 9 9 | 
             
                let(:model) { stub('model') }
         | 
| 10 | 
            -
             | 
| 10 | 
            +
             | 
| 11 11 | 
             
                it "returns a MysqlAdapter object for :mysql" do
         | 
| 12 12 | 
             
                  ThinkingSphinx::AbstractAdapter.stub(:adapter_for_model => :mysql)
         | 
| 13 | 
            -
             | 
| 13 | 
            +
             | 
| 14 14 | 
             
                  adapter = ThinkingSphinx::AbstractAdapter.detect(model)
         | 
| 15 15 | 
             
                  adapter.should be_a(ThinkingSphinx::MysqlAdapter)
         | 
| 16 16 | 
             
                end
         | 
| 17 | 
            -
             | 
| 17 | 
            +
             | 
| 18 18 | 
             
                it "returns a PostgreSQLAdapter object for :postgresql" do
         | 
| 19 19 | 
             
                  ThinkingSphinx::AbstractAdapter.stub(:adapter_for_model => :postgresql)
         | 
| 20 | 
            -
             | 
| 20 | 
            +
             | 
| 21 21 | 
             
                  adapter = ThinkingSphinx::AbstractAdapter.detect(model)
         | 
| 22 22 | 
             
                  adapter.should be_a(ThinkingSphinx::PostgreSQLAdapter)
         | 
| 23 23 | 
             
                end
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 | 
             
                it "instantiates the provided class if one is provided" do
         | 
| 26 26 | 
             
                  ThinkingSphinx::AbstractAdapter.stub(:adapter_for_model => CustomAdapter)
         | 
| 27 27 | 
             
                  CustomAdapter.should_receive(:new).and_return(stub('adapter'))
         | 
| 28 | 
            -
             | 
| 28 | 
            +
             | 
| 29 29 | 
             
                  ThinkingSphinx::AbstractAdapter.detect(model)
         | 
| 30 30 | 
             
                end
         | 
| 31 | 
            -
             | 
| 31 | 
            +
             | 
| 32 32 | 
             
                it "raises an exception for other responses" do
         | 
| 33 33 | 
             
                  ThinkingSphinx::AbstractAdapter.stub(:adapter_for_model => :sqlite)
         | 
| 34 | 
            -
             | 
| 34 | 
            +
             | 
| 35 35 | 
             
                  lambda {
         | 
| 36 36 | 
             
                    ThinkingSphinx::AbstractAdapter.detect(model)
         | 
| 37 37 | 
             
                  }.should raise_error
         | 
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
              end
         | 
| 40 | 
            -
             | 
| 40 | 
            +
             | 
| 41 41 | 
             
              describe '.adapter_for_model' do
         | 
| 42 42 | 
             
                let(:model) { stub('model') }
         | 
| 43 | 
            -
             | 
| 43 | 
            +
             | 
| 44 44 | 
             
                after :each do
         | 
| 45 45 | 
             
                  ThinkingSphinx.database_adapter = nil
         | 
| 46 46 | 
             
                end
         | 
| 47 | 
            -
             | 
| 47 | 
            +
             | 
| 48 48 | 
             
                it "translates strings to symbols" do
         | 
| 49 49 | 
             
                  ThinkingSphinx.database_adapter = 'foo'
         | 
| 50 | 
            -
             | 
| 50 | 
            +
             | 
| 51 51 | 
             
                  ThinkingSphinx::AbstractAdapter.adapter_for_model(model).should == :foo
         | 
| 52 52 | 
             
                end
         | 
| 53 | 
            -
             | 
| 53 | 
            +
             | 
| 54 54 | 
             
                it "passes through symbols unchanged" do
         | 
| 55 55 | 
             
                  ThinkingSphinx.database_adapter = :bar
         | 
| 56 | 
            -
             | 
| 56 | 
            +
             | 
| 57 57 | 
             
                  ThinkingSphinx::AbstractAdapter.adapter_for_model(model).should == :bar
         | 
| 58 58 | 
             
                end
         | 
| 59 | 
            -
             | 
| 59 | 
            +
             | 
| 60 60 | 
             
                it "returns standard_adapter_for_model if database_adapter is not set" do
         | 
| 61 61 | 
             
                  ThinkingSphinx.database_adapter = nil
         | 
| 62 62 | 
             
                  ThinkingSphinx::AbstractAdapter.stub!(:standard_adapter_for_model => :baz)
         | 
| 63 | 
            -
             | 
| 63 | 
            +
             | 
| 64 64 | 
             
                  ThinkingSphinx::AbstractAdapter.adapter_for_model(model).should == :baz
         | 
| 65 65 | 
             
                end
         | 
| 66 | 
            -
             | 
| 66 | 
            +
             | 
| 67 67 | 
             
                it "calls the lambda and returns it if one is provided" do
         | 
| 68 68 | 
             
                  ThinkingSphinx.database_adapter = lambda { |model| :foo }
         | 
| 69 | 
            -
             | 
| 69 | 
            +
             | 
| 70 70 | 
             
                  ThinkingSphinx::AbstractAdapter.adapter_for_model(model).should == :foo
         | 
| 71 71 | 
             
                end
         | 
| 72 72 | 
             
              end
         | 
| 73 | 
            -
             | 
| 73 | 
            +
             | 
| 74 74 | 
             
              describe '.standard_adapter_for_model' do
         | 
| 75 75 | 
             
                let(:klass)      { stub('connection class') }
         | 
| 76 76 | 
             
                let(:connection) { stub('connection', :class => klass) }
         | 
| 77 77 | 
             
                let(:model)      { stub('model', :connection => connection) }
         | 
| 78 | 
            -
             | 
| 78 | 
            +
             | 
| 79 79 | 
             
                it "translates a normal MySQL adapter" do
         | 
| 80 80 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::MysqlAdapter')
         | 
| 81 | 
            -
             | 
| 81 | 
            +
             | 
| 82 82 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 83 83 | 
             
                    should == :mysql
         | 
| 84 84 | 
             
                end
         | 
| 85 | 
            -
             | 
| 85 | 
            +
             | 
| 86 86 | 
             
                it "translates a MySQL plus adapter" do
         | 
| 87 87 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::MysqlplusAdapter')
         | 
| 88 | 
            -
             | 
| 88 | 
            +
             | 
| 89 89 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 90 90 | 
             
                    should == :mysql
         | 
| 91 91 | 
             
                end
         | 
| 92 | 
            -
             | 
| 92 | 
            +
             | 
| 93 93 | 
             
                it "translates a MySQL2 adapter" do
         | 
| 94 94 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::Mysql2Adapter')
         | 
| 95 | 
            -
             | 
| 95 | 
            +
             | 
| 96 96 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 97 97 | 
             
                    should == :mysql
         | 
| 98 98 | 
             
                end
         | 
| 99 | 
            -
             | 
| 99 | 
            +
             | 
| 100 100 | 
             
                it "translates a NullDB adapter to MySQL" do
         | 
| 101 101 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::NullDBAdapter')
         | 
| 102 | 
            -
             | 
| 102 | 
            +
             | 
| 103 103 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 104 104 | 
             
                    should == :mysql
         | 
| 105 105 | 
             
                end
         | 
| 106 | 
            -
             | 
| 106 | 
            +
             | 
| 107 107 | 
             
                it "translates a normal PostgreSQL adapter" do
         | 
| 108 108 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter')
         | 
| 109 | 
            -
             | 
| 109 | 
            +
             | 
| 110 110 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 111 111 | 
             
                    should == :postgresql
         | 
| 112 112 | 
             
                end
         | 
| 113 | 
            -
             | 
| 113 | 
            +
             | 
| 114 114 | 
             
                it "translates a JDBC MySQL adapter to MySQL" do
         | 
| 115 115 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
         | 
| 116 116 | 
             
                  connection.stub(:config => {:adapter => 'jdbcmysql'})
         | 
| 117 | 
            -
             | 
| 117 | 
            +
             | 
| 118 118 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 119 119 | 
             
                    should == :mysql
         | 
| 120 120 | 
             
                end
         | 
| 121 | 
            -
             | 
| 121 | 
            +
             | 
| 122 122 | 
             
                it "translates a JDBC PostgreSQL adapter to PostgreSQL" do
         | 
| 123 123 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
         | 
| 124 124 | 
             
                  connection.stub(:config => {:adapter => 'jdbcpostgresql'})
         | 
| 125 | 
            -
             | 
| 125 | 
            +
             | 
| 126 126 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 127 127 | 
             
                    should == :postgresql
         | 
| 128 128 | 
             
                end
         | 
| 129 | 
            -
             | 
| 129 | 
            +
             | 
| 130 130 | 
             
                it "returns other JDBC adapters without translation" do
         | 
| 131 131 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::JdbcAdapter')
         | 
| 132 132 | 
             
                  connection.stub(:config => {:adapter => 'jdbcmssql'})
         | 
| 133 | 
            -
             | 
| 133 | 
            +
             | 
| 134 134 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 135 | 
            -
                    should ==  | 
| 135 | 
            +
                    should == :jdbcmssql
         | 
| 136 136 | 
             
                end
         | 
| 137 | 
            -
             | 
| 137 | 
            +
             | 
| 138 138 | 
             
                it "returns other unknown adapters without translation" do
         | 
| 139 139 | 
             
                  klass.stub(:name => 'ActiveRecord::ConnectionAdapters::FooAdapter')
         | 
| 140 | 
            -
             | 
| 140 | 
            +
             | 
| 141 141 | 
             
                  ThinkingSphinx::AbstractAdapter.standard_adapter_for_model(model).
         | 
| 142 142 | 
             
                    should == 'ActiveRecord::ConnectionAdapters::FooAdapter'
         | 
| 143 143 | 
             
                end
         | 
| @@ -14,7 +14,7 @@ describe ThinkingSphinx::Association do | |
| 14 14 | 
             
                    :active_record  => 'AR'
         | 
| 15 15 | 
             
                  )
         | 
| 16 16 | 
             
                  @non_poly_reflection = stub('reflection', :name => 'non_polly')
         | 
| 17 | 
            -
             | 
| 17 | 
            +
             | 
| 18 18 | 
             
                  Person.stub!(:reflect_on_association => @normal_reflection)
         | 
| 19 19 | 
             
                  ThinkingSphinx::Association.stub!(
         | 
| 20 20 | 
             
                    :new                  => @normal_association,
         | 
| @@ -25,58 +25,85 @@ describe ThinkingSphinx::Association do | |
| 25 25 | 
             
                    :new => @non_poly_reflection
         | 
| 26 26 | 
             
                  )
         | 
| 27 27 | 
             
                end
         | 
| 28 | 
            -
             | 
| 28 | 
            +
             | 
| 29 29 | 
             
                it "should return an empty array if no association exists" do
         | 
| 30 30 | 
             
                  Person.stub!(:reflect_on_association => nil)
         | 
| 31 | 
            -
             | 
| 31 | 
            +
             | 
| 32 32 | 
             
                  ThinkingSphinx::Association.children(Person, :assoc).should == []
         | 
| 33 33 | 
             
                end
         | 
| 34 | 
            -
             | 
| 34 | 
            +
             | 
| 35 35 | 
             
                it "should return a single association instance in an array if assocation isn't polymorphic" do
         | 
| 36 36 | 
             
                  ThinkingSphinx::Association.children(Person, :assoc).should == [@normal_association]
         | 
| 37 37 | 
             
                end
         | 
| 38 | 
            -
             | 
| 38 | 
            +
             | 
| 39 39 | 
             
                it "should return multiple association instances for polymorphic associations" do
         | 
| 40 40 | 
             
                  Person.stub!(:reflect_on_association => @poly_reflection)
         | 
| 41 | 
            -
             | 
| 41 | 
            +
             | 
| 42 42 | 
             
                  ThinkingSphinx::Association.children(Person, :assoc).should ==
         | 
| 43 43 | 
             
                    [@normal_association, @normal_association]
         | 
| 44 44 | 
             
                end
         | 
| 45 | 
            -
             | 
| 45 | 
            +
             | 
| 46 46 | 
             
                it "should generate non-polymorphic 'casted' associations for each polymorphic possibility" do
         | 
| 47 | 
            -
                   | 
| 47 | 
            +
                  reflections = double('reflections', :[]= => nil)
         | 
| 48 | 
            +
                  Person.stub!(:reflections => reflections)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  Person.should_receive(:reflect_on_association).once.
         | 
| 51 | 
            +
                    and_return(@poly_reflection)
         | 
| 52 | 
            +
                  reflections.should_receive(:[]).with(:polly_Person).twice.and_return(nil)
         | 
| 48 53 | 
             
                  ThinkingSphinx::Association.should_receive(:casted_options).with(
         | 
| 49 54 | 
             
                    Person, @poly_reflection
         | 
| 50 55 | 
             
                  ).twice
         | 
| 51 56 | 
             
                  ::ActiveRecord::Reflection::AssociationReflection.should_receive(:new).
         | 
| 52 | 
            -
                    with(:has_many, :polly_Person, {:casted => :options}, "AR").twice
         | 
| 57 | 
            +
                    with(:has_many, :polly_Person, {:casted => :options}, "AR").twice.
         | 
| 58 | 
            +
                    and_return(@non_poly_reflection)
         | 
| 53 59 | 
             
                  ThinkingSphinx::Association.should_receive(:new).with(
         | 
| 54 60 | 
             
                    nil, @non_poly_reflection
         | 
| 55 61 | 
             
                  ).twice
         | 
| 56 | 
            -
             | 
| 62 | 
            +
             | 
| 63 | 
            +
                  ThinkingSphinx::Association.children(Person, :assoc)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                it "should use existing non-polymorphic 'casted' associations" do
         | 
| 67 | 
            +
                  reflections = double('reflections', :[]= => nil)
         | 
| 68 | 
            +
                  Person.stub!(:reflections => reflections)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  Person.stub!(:reflect_on_association).once.
         | 
| 71 | 
            +
                    and_return(@poly_reflection)
         | 
| 72 | 
            +
                  reflections.should_receive(:[]).with(:polly_Person).twice.
         | 
| 73 | 
            +
                    and_return(nil, @non_poly_reflection)
         | 
| 74 | 
            +
                  ThinkingSphinx::Association.should_receive(:casted_options).with(
         | 
| 75 | 
            +
                    Person, @poly_reflection
         | 
| 76 | 
            +
                  ).once
         | 
| 77 | 
            +
                  ::ActiveRecord::Reflection::AssociationReflection.should_receive(:new).
         | 
| 78 | 
            +
                    with(:has_many, :polly_Person, {:casted => :options}, "AR").once.
         | 
| 79 | 
            +
                    and_return(@non_poly_reflection)
         | 
| 80 | 
            +
                  ThinkingSphinx::Association.should_receive(:new).with(
         | 
| 81 | 
            +
                    nil, @non_poly_reflection
         | 
| 82 | 
            +
                  ).twice
         | 
| 83 | 
            +
             | 
| 57 84 | 
             
                  ThinkingSphinx::Association.children(Person, :assoc)
         | 
| 58 85 | 
             
                end
         | 
| 59 86 | 
             
              end
         | 
| 60 | 
            -
             | 
| 87 | 
            +
             | 
| 61 88 | 
             
              describe '#children' do
         | 
| 62 89 | 
             
                before :each do
         | 
| 63 90 | 
             
                  @reflection   = stub('reflection', :klass => :klass)
         | 
| 64 91 | 
             
                  @association  = ThinkingSphinx::Association.new(nil, @reflection)
         | 
| 65 92 | 
             
                  ThinkingSphinx::Association.stub!(:children => :result)
         | 
| 66 93 | 
             
                end
         | 
| 67 | 
            -
             | 
| 94 | 
            +
             | 
| 68 95 | 
             
                it "should return the children associations for the given association" do
         | 
| 69 96 | 
             
                  @association.children(:assoc).should == :result
         | 
| 70 97 | 
             
                end
         | 
| 71 | 
            -
             | 
| 98 | 
            +
             | 
| 72 99 | 
             
                it "should request children for the reflection klass" do
         | 
| 73 100 | 
             
                  ThinkingSphinx::Association.should_receive(:children).
         | 
| 74 101 | 
             
                    with(:klass, :assoc, @association)
         | 
| 75 | 
            -
             | 
| 102 | 
            +
             | 
| 76 103 | 
             
                  @association.children(:assoc)
         | 
| 77 104 | 
             
                end
         | 
| 78 105 | 
             
              end
         | 
| 79 | 
            -
             | 
| 106 | 
            +
             | 
| 80 107 | 
             
              describe '#join_to' do
         | 
| 81 108 | 
             
                before :each do
         | 
| 82 109 | 
             
                  @parent_join = stub('join assoc').as_null_object
         | 
| @@ -84,59 +111,64 @@ describe ThinkingSphinx::Association do | |
| 84 111 | 
             
                  @parent = ThinkingSphinx::Association.new(nil, nil)
         | 
| 85 112 | 
             
                  @parent.stub!(:join_to => true, :join => nil)
         | 
| 86 113 | 
             
                  @base_join = stub('base join', :joins => [:a, :b, :c])
         | 
| 87 | 
            -
             | 
| 114 | 
            +
             | 
| 115 | 
            +
                  if ThinkingSphinx.rails_3_1?
         | 
| 116 | 
            +
                    ::ActiveRecord::Associations::JoinDependency::JoinAssociation.stub!(:new => @join)
         | 
| 117 | 
            +
                  else
         | 
| 118 | 
            +
                    ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation.stub!(:new => @join)
         | 
| 119 | 
            +
                  end
         | 
| 88 120 | 
             
                end
         | 
| 89 | 
            -
             | 
| 121 | 
            +
             | 
| 90 122 | 
             
                it "should call the parent's join_to if parent has no join" do
         | 
| 91 123 | 
             
                  @assoc = ThinkingSphinx::Association.new(@parent, :ref)
         | 
| 92 124 | 
             
                  @parent.should_receive(:join_to).with(@base_join)
         | 
| 93 | 
            -
             | 
| 125 | 
            +
             | 
| 94 126 | 
             
                  @assoc.join_to(@base_join)
         | 
| 95 127 | 
             
                end
         | 
| 96 | 
            -
             | 
| 128 | 
            +
             | 
| 97 129 | 
             
                it "should not call the parent's join_to if it already has a join" do
         | 
| 98 130 | 
             
                  @assoc = ThinkingSphinx::Association.new(@parent, :ref)
         | 
| 99 131 | 
             
                  @parent.stub!(:join => @parent_join)
         | 
| 100 132 | 
             
                  @parent.should_not_receive(:join_to)
         | 
| 101 | 
            -
             | 
| 133 | 
            +
             | 
| 102 134 | 
             
                  @assoc.join_to(@base_join)
         | 
| 103 135 | 
             
                end
         | 
| 104 | 
            -
             | 
| 136 | 
            +
             | 
| 105 137 | 
             
                it "should define the join association with a JoinAssociation instance" do
         | 
| 106 138 | 
             
                  @assoc = ThinkingSphinx::Association.new(@parent, :ref)
         | 
| 107 | 
            -
             | 
| 139 | 
            +
             | 
| 108 140 | 
             
                  @assoc.join_to(@base_join).should == @join
         | 
| 109 141 | 
             
                  @assoc.join.should == @join
         | 
| 110 142 | 
             
                end
         | 
| 111 143 | 
             
              end
         | 
| 112 | 
            -
             | 
| 144 | 
            +
             | 
| 113 145 | 
             
              describe '#is_many?' do
         | 
| 114 146 | 
             
                before :each do
         | 
| 115 147 | 
             
                  @parent = stub('assoc', :is_many? => :parent_is_many)
         | 
| 116 148 | 
             
                  @reflection = stub('reflection', :macro => :has_many)
         | 
| 117 149 | 
             
                end
         | 
| 118 | 
            -
             | 
| 150 | 
            +
             | 
| 119 151 | 
             
                it "should return true if association is either a has_many or a habtm" do
         | 
| 120 152 | 
             
                  association = ThinkingSphinx::Association.new(@parent, @reflection)
         | 
| 121 153 | 
             
                  association.is_many?.should be_true
         | 
| 122 | 
            -
             | 
| 154 | 
            +
             | 
| 123 155 | 
             
                  @reflection.stub!(:macro => :has_and_belongs_to_many)
         | 
| 124 156 | 
             
                  association.is_many?.should be_true
         | 
| 125 157 | 
             
                end
         | 
| 126 | 
            -
             | 
| 158 | 
            +
             | 
| 127 159 | 
             
                it "should return the parent value if not a has many or habtm and there is a parent" do
         | 
| 128 160 | 
             
                  association = ThinkingSphinx::Association.new(@parent, @reflection)
         | 
| 129 161 | 
             
                  @reflection.stub!(:macro => :belongs_to)
         | 
| 130 162 | 
             
                  association.is_many?.should == :parent_is_many
         | 
| 131 163 | 
             
                end
         | 
| 132 | 
            -
             | 
| 164 | 
            +
             | 
| 133 165 | 
             
                it "should return false if no parent and not a has many or habtm" do
         | 
| 134 166 | 
             
                  association = ThinkingSphinx::Association.new(nil, @reflection)
         | 
| 135 167 | 
             
                  @reflection.stub!(:macro => :belongs_to)
         | 
| 136 168 | 
             
                  association.is_many?.should be_false
         | 
| 137 169 | 
             
                end
         | 
| 138 170 | 
             
              end
         | 
| 139 | 
            -
             | 
| 171 | 
            +
             | 
| 140 172 | 
             
              describe '#ancestors' do
         | 
| 141 173 | 
             
                it "should return an array of associations - including all parents" do
         | 
| 142 174 | 
             
                  parent = stub('assoc', :ancestors => [:all, :ancestors])
         | 
| @@ -144,7 +176,7 @@ describe ThinkingSphinx::Association do | |
| 144 176 | 
             
                  association.ancestors.should == [:all, :ancestors, association]
         | 
| 145 177 | 
             
                end
         | 
| 146 178 | 
             
              end
         | 
| 147 | 
            -
             | 
| 179 | 
            +
             | 
| 148 180 | 
             
              describe '.polymorphic_classes' do
         | 
| 149 181 | 
             
                it "should return all the polymorphic result types as classes" do
         | 
| 150 182 | 
             
                  Person.connection.stub!(:select_all => [
         | 
| @@ -155,11 +187,12 @@ describe ThinkingSphinx::Association do | |
| 155 187 | 
             
                    :active_record  => Person,
         | 
| 156 188 | 
             
                    :options        => {:foreign_type => "person_type"}
         | 
| 157 189 | 
             
                  )
         | 
| 158 | 
            -
                  
         | 
| 190 | 
            +
                  ref.stub!(:foreign_type => "person_type") if ThinkingSphinx.rails_3_1?
         | 
| 191 | 
            +
             | 
| 159 192 | 
             
                  ThinkingSphinx::Association.send(:polymorphic_classes, ref).should == [Person, Friendship]
         | 
| 160 193 | 
             
                end
         | 
| 161 194 | 
             
              end
         | 
| 162 | 
            -
             | 
| 195 | 
            +
             | 
| 163 196 | 
             
              describe '.casted_options' do
         | 
| 164 197 | 
             
                before :each do
         | 
| 165 198 | 
             
                  @options = {
         | 
| @@ -168,8 +201,9 @@ describe ThinkingSphinx::Association do | |
| 168 201 | 
             
                    :polymorphic  => true
         | 
| 169 202 | 
             
                  }
         | 
| 170 203 | 
             
                  @reflection = stub('assoc reflection', :options => @options)
         | 
| 204 | 
            +
                  @reflection.stub!(:foreign_type => "thing_type") if ThinkingSphinx.rails_3_1?
         | 
| 171 205 | 
             
                end
         | 
| 172 | 
            -
             | 
| 206 | 
            +
             | 
| 173 207 | 
             
                it "should return a new options set for a specific class" do
         | 
| 174 208 | 
             
                  ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
         | 
| 175 209 | 
             
                    :polymorphic  => nil,
         | 
| @@ -179,7 +213,7 @@ describe ThinkingSphinx::Association do | |
| 179 213 | 
             
                    :conditions   => "::ts_join_alias::.`thing_type` = 'Person'"
         | 
| 180 214 | 
             
                  }
         | 
| 181 215 | 
             
                end
         | 
| 182 | 
            -
             | 
| 216 | 
            +
             | 
| 183 217 | 
             
                it "should append to existing Array of conditions" do
         | 
| 184 218 | 
             
                  @options[:conditions] = ["first condition"]
         | 
| 185 219 | 
             
                  ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
         | 
| @@ -190,7 +224,7 @@ describe ThinkingSphinx::Association do | |
| 190 224 | 
             
                    :conditions   => ["first condition", "::ts_join_alias::.`thing_type` = 'Person'"]
         | 
| 191 225 | 
             
                  }
         | 
| 192 226 | 
             
                end
         | 
| 193 | 
            -
             | 
| 227 | 
            +
             | 
| 194 228 | 
             
                it "should merge to an existing Hash of conditions" do
         | 
| 195 229 | 
             
                  @options[:conditions] = {"field" => "value"}
         | 
| 196 230 | 
             
                  ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
         | 
| @@ -201,7 +235,7 @@ describe ThinkingSphinx::Association do | |
| 201 235 | 
             
                    :conditions   => {"field" => "value", "thing_type" => "Person"}
         | 
| 202 236 | 
             
                  }
         | 
| 203 237 | 
             
                end
         | 
| 204 | 
            -
             | 
| 238 | 
            +
             | 
| 205 239 | 
             
                it "should append to an existing String of conditions" do
         | 
| 206 240 | 
             
                  @options[:conditions] = "first condition"
         | 
| 207 241 | 
             
                  ThinkingSphinx::Association.send(:casted_options, Person, @reflection).should == {
         | 
| @@ -1,128 +1,125 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe ThinkingSphinx::Context do
         | 
| 4 | 
            -
               | 
| 5 | 
            -
             | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
              
         | 
| 4 | 
            +
              let(:ts_context) { ThinkingSphinx::Context.new }
         | 
| 5 | 
            +
             | 
| 8 6 | 
             
              describe '#prepare' do
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 7 | 
            +
                let(:config)           { ThinkingSphinx::Configuration.instance }
         | 
| 8 | 
            +
                let(:file_name)        { 'a.rb' }
         | 
| 9 | 
            +
                let(:model_name_lower) { 'a' }
         | 
| 10 | 
            +
                let(:class_name)       { 'A' }
         | 
| 12 11 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
                   | 
| 15 | 
            -
                  @class_name       = 'A'
         | 
| 12 | 
            +
                before :each do
         | 
| 13 | 
            +
                  config.model_directories = ['']
         | 
| 16 14 |  | 
| 17 | 
            -
                   | 
| 18 | 
            -
                   | 
| 19 | 
            -
                  Dir.stub(:[]).and_return([ | 
| 15 | 
            +
                  file_name.stub!(:gsub).and_return(model_name_lower)
         | 
| 16 | 
            +
                  model_name_lower.stub!(:camelize).and_return(class_name)
         | 
| 17 | 
            +
                  Dir.stub(:[]).and_return([file_name])
         | 
| 20 18 | 
             
                end
         | 
| 21 19 |  | 
| 22 20 | 
             
                it "should load the files by guessing the file name" do
         | 
| 23 | 
            -
                   | 
| 21 | 
            +
                  class_name.should_receive(:constantize).and_return(true)
         | 
| 24 22 |  | 
| 25 | 
            -
                   | 
| 23 | 
            +
                  ts_context.prepare
         | 
| 26 24 | 
             
                end
         | 
| 27 25 |  | 
| 28 26 | 
             
                it "should not raise errors if the model name is nil" do
         | 
| 29 | 
            -
                   | 
| 27 | 
            +
                  file_name.stub!(:gsub).and_return(nil)
         | 
| 30 28 |  | 
| 31 29 | 
             
                  lambda {
         | 
| 32 | 
            -
                     | 
| 30 | 
            +
                    ts_context.prepare
         | 
| 33 31 | 
             
                  }.should_not raise_error
         | 
| 34 32 | 
             
                end
         | 
| 35 33 |  | 
| 36 34 | 
             
                it "should not raise errors if the file name does not represent a class name" do
         | 
| 37 | 
            -
                   | 
| 35 | 
            +
                  class_name.should_receive(:constantize).and_raise(NameError)
         | 
| 38 36 |  | 
| 39 37 | 
             
                  lambda {
         | 
| 40 | 
            -
                     | 
| 38 | 
            +
                    ts_context.prepare
         | 
| 41 39 | 
             
                  }.should_not raise_error
         | 
| 42 40 | 
             
                end
         | 
| 43 41 |  | 
| 44 42 | 
             
                # Fails in Ruby 1.9 (or maybe it's an RSpec update). Not sure why.
         | 
| 45 43 | 
             
                it "should retry if the first pass fails and contains a directory" do
         | 
| 46 | 
            -
                   | 
| 47 | 
            -
                   | 
| 48 | 
            -
                  @model_name_lower.should_receive(:camelize).twice
         | 
| 44 | 
            +
                  class_name.stub(:constantize).and_raise(LoadError)
         | 
| 45 | 
            +
                  model_name_lower.should_receive(:gsub!).twice.and_return(true, nil)
         | 
| 49 46 |  | 
| 50 47 | 
             
                  lambda {
         | 
| 51 | 
            -
                     | 
| 48 | 
            +
                    ts_context.prepare
         | 
| 52 49 | 
             
                  }.should_not raise_error
         | 
| 53 50 | 
             
                end
         | 
| 54 51 |  | 
| 55 52 | 
             
                it "should catch database errors with a warning" do
         | 
| 56 | 
            -
                   | 
| 53 | 
            +
                  class_name.should_receive(:constantize).and_raise(Mysql2::Error)
         | 
| 57 54 | 
             
                  STDERR.stub!(:puts => '')
         | 
| 58 55 | 
             
                  STDERR.should_receive(:puts).with('Warning: Error loading a.rb:')
         | 
| 59 | 
            -
             | 
| 56 | 
            +
             | 
| 60 57 | 
             
                  lambda {
         | 
| 61 | 
            -
                     | 
| 58 | 
            +
                    ts_context.prepare
         | 
| 62 59 | 
             
                  }.should_not raise_error
         | 
| 63 | 
            -
                end
         | 
| 64 | 
            -
             | 
| 60 | 
            +
                end unless RUBY_PLATFORM == 'java'
         | 
| 61 | 
            +
             | 
| 65 62 | 
             
                it "should not load models if they're explicitly set in the configuration" do
         | 
| 66 | 
            -
                   | 
| 67 | 
            -
                   | 
| 68 | 
            -
             | 
| 69 | 
            -
                   | 
| 63 | 
            +
                  config.indexed_models = ['Alpha', 'Beta']
         | 
| 64 | 
            +
                  ts_context.prepare
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  ts_context.indexed_models.should == ['Alpha', 'Beta']
         | 
| 70 67 | 
             
                end
         | 
| 71 68 | 
             
              end
         | 
| 72 | 
            -
             | 
| 69 | 
            +
             | 
| 73 70 | 
             
              describe '#define_indexes' do
         | 
| 74 71 | 
             
                it "should call define_indexes on all known indexed models" do
         | 
| 75 | 
            -
                   | 
| 72 | 
            +
                  ts_context.stub!(:indexed_models => ['Alpha', 'Beta'])
         | 
| 76 73 | 
             
                  Alpha.should_receive(:define_indexes)
         | 
| 77 74 | 
             
                  Beta.should_receive(:define_indexes)
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                   | 
| 75 | 
            +
             | 
| 76 | 
            +
                  ts_context.define_indexes
         | 
| 80 77 | 
             
                end
         | 
| 81 78 | 
             
              end
         | 
| 82 | 
            -
             | 
| 79 | 
            +
             | 
| 83 80 | 
             
              describe '#add_indexed_model' do
         | 
| 84 81 | 
             
                before :each do
         | 
| 85 | 
            -
                   | 
| 82 | 
            +
                  ts_context.indexed_models.clear
         | 
| 86 83 | 
             
                end
         | 
| 87 | 
            -
             | 
| 84 | 
            +
             | 
| 88 85 | 
             
                it "should add the model to the collection" do
         | 
| 89 | 
            -
                   | 
| 90 | 
            -
             | 
| 91 | 
            -
                   | 
| 86 | 
            +
                  ts_context.add_indexed_model 'Alpha'
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  ts_context.indexed_models.should == ['Alpha']
         | 
| 92 89 | 
             
                end
         | 
| 93 | 
            -
             | 
| 90 | 
            +
             | 
| 94 91 | 
             
                it "should not duplicate models in the collection" do
         | 
| 95 | 
            -
                   | 
| 96 | 
            -
                   | 
| 97 | 
            -
             | 
| 98 | 
            -
                   | 
| 92 | 
            +
                  ts_context.add_indexed_model 'Alpha'
         | 
| 93 | 
            +
                  ts_context.add_indexed_model 'Alpha'
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  ts_context.indexed_models.should == ['Alpha']
         | 
| 99 96 | 
             
                end
         | 
| 100 | 
            -
             | 
| 97 | 
            +
             | 
| 101 98 | 
             
                it "should keep the collection in alphabetical order" do
         | 
| 102 | 
            -
                   | 
| 103 | 
            -
                   | 
| 104 | 
            -
             | 
| 105 | 
            -
                   | 
| 99 | 
            +
                  ts_context.add_indexed_model 'Beta'
         | 
| 100 | 
            +
                  ts_context.add_indexed_model 'Alpha'
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  ts_context.indexed_models.should == ['Alpha', 'Beta']
         | 
| 106 103 | 
             
                end
         | 
| 107 | 
            -
             | 
| 104 | 
            +
             | 
| 108 105 | 
             
                it "should translate classes to their names" do
         | 
| 109 | 
            -
                   | 
| 110 | 
            -
             | 
| 111 | 
            -
                   | 
| 106 | 
            +
                  ts_context.add_indexed_model Alpha
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  ts_context.indexed_models.should == ['Alpha']
         | 
| 112 109 | 
             
                end
         | 
| 113 110 | 
             
              end
         | 
| 114 | 
            -
             | 
| 111 | 
            +
             | 
| 115 112 | 
             
              describe '#superclass_indexed_models' do
         | 
| 116 113 | 
             
                it "should return indexed model names" do
         | 
| 117 | 
            -
                   | 
| 118 | 
            -
             | 
| 119 | 
            -
                   | 
| 114 | 
            +
                  ts_context.stub!(:indexed_models => ['Alpha', 'Beta'])
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  ts_context.superclass_indexed_models.should == ['Alpha', 'Beta']
         | 
| 120 117 | 
             
                end
         | 
| 121 | 
            -
             | 
| 118 | 
            +
             | 
| 122 119 | 
             
                it "should not include classes which have indexed superclasses" do
         | 
| 123 | 
            -
                   | 
| 124 | 
            -
             | 
| 125 | 
            -
                   | 
| 120 | 
            +
                  ts_context.stub!(:indexed_models => ['Parent', 'Person'])
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  ts_context.superclass_indexed_models.should == ['Person']
         | 
| 126 123 | 
             
                end
         | 
| 127 124 | 
             
              end
         | 
| 128 125 | 
             
            end
         |