ultrasphinx 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,4 +1,6 @@
1
1
 
2
+ v1.5.2. Fix association reloading issue; support float attributes on Sphinx 0.9.8; fix date range filters; import and update sample app (Mark Lane); start a comprehensive integration suite.
3
+
2
4
  v1.5.1. Various bugfixes.
3
5
 
4
6
  v1.5. API change. Change layout of base files to allow overriding of more options, see examples/default.base. Allow sorting on text fields (use the 'sortable' key).
data/README CHANGED
@@ -12,7 +12,7 @@ The public certificate for the gem is at http://rubyforge.org/frs/download.php/2
12
12
  == Requirements
13
13
 
14
14
  * MySQL (or Postgres, experimental)
15
- * Sphinx 0.97
15
+ * Sphinx 0.97 or greater
16
16
  * Rails 1.2.3 or greater
17
17
 
18
18
  == Features
@@ -21,7 +21,7 @@ Advanced Sphinx usage:
21
21
  * searching and ranking across orthogonal models
22
22
  * excerpt highlighting
23
23
  * field weighting
24
- * faceting on text and numeric fields
24
+ * faceting on text, date, and numeric fields
25
25
 
26
26
  ActiveRecord-style SQL generation:
27
27
  * <tt>belongs_to</tt> and <tt>has_many</tt> includes
@@ -49,9 +49,8 @@ You also need the <tt>chronic</tt> gem:
49
49
  sudo gem install chronic
50
50
 
51
51
  Then, install the plugin:
52
- script/plugin install --svn svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk
52
+ script/plugin install -x svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk
53
53
 
54
-
55
54
  Next, copy the <tt>example/default.base</tt> file to <tt>RAILS_ROOT/config/ultrasphinx/default.base</tt>. This file sets up the Sphinx daemon options such as port, host, and index location.
56
55
 
57
56
  If you need per-environment configuration, you can use <tt>RAILS_ROOT/config/ultrasphinx/development.base</tt>, etc.
data/lib/ultrasphinx.rb CHANGED
@@ -1,11 +1,12 @@
1
1
 
2
2
  require 'fileutils'
3
3
  require 'chronic'
4
+ require 'singleton'
4
5
 
5
6
  require "#{File.dirname(__FILE__)}/../vendor/sphinx/lib/client"
6
7
 
7
- require 'ultrasphinx/core_extensions'
8
8
  require 'ultrasphinx/ultrasphinx'
9
+ require 'ultrasphinx/core_extensions'
9
10
  require 'ultrasphinx/configure'
10
11
  require 'ultrasphinx/autoload'
11
12
  require 'ultrasphinx/fields'
@@ -24,3 +25,9 @@ Ultrasphinx.say(
24
25
  end
25
26
  )
26
27
 
28
+ if defined? RAILS_ENV and RAILS_ENV == "development"
29
+ if ENV['USER'] == 'eweaver'
30
+ require 'ruby-debug'
31
+ Debugger.start
32
+ end
33
+ end
@@ -10,9 +10,11 @@ module Ultrasphinx
10
10
  next if filename =~ /\/(\.svn|CVS|\.bzr)\//
11
11
  open(filename) do |file|
12
12
  begin
13
- load filename if file.grep(/is_indexed/).any?
13
+ if file.grep(/is_indexed/).any?
14
+ Dependencies.load_missing_constant(Kernel, File.basename(filename)[0..-4].classify)
15
+ end
14
16
  rescue Object => e
15
- say "warning; possibly critical autoload error on #{filename}"
17
+ say "warning: possibly critical autoload error on #{filename}"
16
18
  say e.inspect
17
19
  end
18
20
  end
@@ -28,14 +30,14 @@ module Ultrasphinx
28
30
 
29
31
  load_constants
30
32
 
31
- puts "Rebuilding Ultrasphinx configurations for #{RAILS_ENV} environment"
32
- puts "Available models are #{MODEL_CONFIGURATION.keys.to_sentence}"
33
+ say "rebuilding configurations for #{RAILS_ENV} environment"
34
+ say "available models are #{MODEL_CONFIGURATION.keys.to_sentence}"
33
35
  File.open(CONF_PATH, "w") do |conf|
34
36
 
35
37
  conf.puts global_header
36
38
  sources = []
37
39
 
38
- puts "Generating SQL"
40
+ say "generating SQL"
39
41
  cached_groups = Fields.instance.groups.join("\n")
40
42
  MODEL_CONFIGURATION.each_with_index do |model_options, class_id|
41
43
  model, options = model_options
@@ -1,5 +1,6 @@
1
1
 
2
2
  class Array
3
+ # Only flatten the first level of an array
3
4
  def _flatten_once
4
5
  self.inject([]) do |set, element|
5
6
  set + Array(element)
@@ -15,29 +16,14 @@ class Object
15
16
  end
16
17
 
17
18
  def _deep_dup
18
- # Cause Ruby's dup sucks.
19
+ # Cause Ruby's clone/dup sucks.
19
20
  Marshal.load(Marshal.dump(self))
20
21
  end
21
22
  end
22
23
 
23
- class String
24
- def _to_numeric
25
- zeroless = self.squeeze(" ").strip.sub(/^0+(\d)/, '\1')
26
- zeroless.sub!(/(\...*?)0+$/, '\1')
27
- if zeroless.to_i.to_s == zeroless
28
- zeroless.to_i
29
- elsif zeroless.to_f.to_s == zeroless
30
- zeroless.to_f
31
- elsif date = Chronic.parse(self)
32
- date.to_i
33
- else
34
- self
35
- end
36
- end
37
- end
38
-
39
24
  class Hash
40
25
  def _coerce_basic_types
26
+ # XXX To remove
41
27
  Hash[*self.map do |key, value|
42
28
  [key.to_s,
43
29
  if value.respond_to?(:to_i) && value.to_i.to_s == value
@@ -50,12 +36,14 @@ class Hash
50
36
  end._flatten_once]
51
37
  end
52
38
 
39
+ # Delete by multiple keys
53
40
  def _delete(*args)
54
41
  args.map do |key|
55
42
  self.delete key
56
43
  end
57
44
  end
58
45
 
46
+ # Convert a hash to a Sphinx-style conf string
59
47
  def _to_conf_string(section = nil)
60
48
  inner = self.map do |key, value|
61
49
  " #{key} = #{value}"
@@ -64,3 +52,35 @@ class Hash
64
52
  end
65
53
 
66
54
  end
55
+
56
+ ### Filter type coercion methods
57
+
58
+ class String
59
+ def _to_numeric
60
+ zeroless = self.squeeze(" ").strip.sub(/^0+(\d)/, '\1')
61
+ zeroless.sub!(/(\...*?)0+$/, '\1')
62
+ if zeroless.to_i.to_s == zeroless
63
+ zeroless.to_i
64
+ elsif zeroless.to_f.to_s == zeroless
65
+ zeroless.to_f
66
+ elsif date = Chronic.parse(self)
67
+ date.to_i
68
+ else
69
+ self
70
+ end
71
+ end
72
+ end
73
+
74
+ module Ultrasphinx::NumericSelf
75
+ def _to_numeric; self; end
76
+ end
77
+
78
+ module Ultrasphinx::DateSelf
79
+ def _to_numeric; self.to_i; end
80
+ end
81
+
82
+ class Fixnum; include Ultrasphinx::NumericSelf; end
83
+ class Bignum; include Ultrasphinx::NumericSelf; end
84
+ class Float; include Ultrasphinx::NumericSelf; end
85
+ class Date; include Ultrasphinx::DateSelf; end
86
+ class Time; include Ultrasphinx::DateSelf; end
@@ -1,8 +1,10 @@
1
1
 
2
- require 'singleton'
3
-
4
2
  module Ultrasphinx
5
3
 
4
+ =begin rdoc
5
+ This is a special singleton configuration class that stores the index field configurations. Rather than using a magic hash and including relevant behavior in Ultrasphinx::Configure and Ultrasphinx::Search, we unify it here.
6
+ =end
7
+
6
8
  class Fields
7
9
  include Singleton
8
10
 
@@ -11,8 +13,12 @@ module Ultrasphinx
11
13
  'text' => 'text',
12
14
  'integer' => 'numeric',
13
15
  'date' => 'date',
14
- 'datetime' => 'date'
15
- }
16
+ 'datetime' => 'date',
17
+ 'timestamp' => 'date',
18
+ 'float' => 'numeric'
19
+ }
20
+
21
+ VERSIONS_REQUIRED = {'float' => '0.9.8'}
16
22
 
17
23
  attr_accessor :classes, :types
18
24
 
@@ -30,6 +36,7 @@ module Ultrasphinx
30
36
 
31
37
  def save_and_verify_type(field, new_type, string_sortable, klass)
32
38
  # Smoosh fields together based on their name in the Sphinx query schema
39
+ check_version(new_type.to_s)
33
40
  field, new_type = field.to_s, TYPE_MAP[new_type.to_s]
34
41
 
35
42
  if types[field]
@@ -63,7 +70,7 @@ module Ultrasphinx
63
70
  end + " AS #{field}"
64
71
  end
65
72
 
66
- def null(field)
73
+ def null(field)
67
74
  case types[field]
68
75
  when 'text'
69
76
  "''"
@@ -76,6 +83,16 @@ module Ultrasphinx
76
83
  end + " AS #{field}"
77
84
  end
78
85
 
86
+ def check_version(field)
87
+ # XXX Awkward location for the compatibility check
88
+ if req = VERSIONS_REQUIRED[field]
89
+ unless SPHINX_VERSION.include? req
90
+ # Will we eventually need to check version ranges?
91
+ Ultrasphinx.say "warning: '#{field}' type requires Sphinx #{req}, but you have #{SPHINX_VERSION}"
92
+ end
93
+ end
94
+ end
95
+
79
96
  def configure(configuration)
80
97
 
81
98
  configuration.each do |model, options|
@@ -93,7 +110,7 @@ module Ultrasphinx
93
110
  entry['as'] = entry['field'] unless entry['as']
94
111
 
95
112
  unless klass.columns_hash[entry['field']]
96
- Ultrasphinx.say "WARNING: field #{entry['field']} is not present in #{model}"
113
+ Ultrasphinx.say "warning: field #{entry['field']} is not present in #{model}"
97
114
  else
98
115
  save_and_verify_type(entry['as'], klass.columns_hash[entry['field']].type, entry['sortable'], klass)
99
116
  end
@@ -116,7 +133,7 @@ module Ultrasphinx
116
133
  save_and_verify_type(entry['as'], 'text', entry['sortable'], klass)
117
134
  end
118
135
  rescue ActiveRecord::StatementInvalid
119
- Ultrasphinx.say "WARNING: model #{model} does not exist in the database yet"
136
+ Ultrasphinx.say "warning: model #{model} does not exist in the database yet"
120
137
  end
121
138
  end
122
139
 
@@ -30,6 +30,8 @@ To allow sorting by a text field, also pass a hash and set the <tt>:sortable</tt
30
30
 
31
31
  To apply an SQL function to a field before it is indexed, use the key <tt>:function_sql</tt>. Pass a string such as <tt>"REPLACE(?, '_', ' ')"</tt>. The table and column name for your field will be interpolated into the first <tt>?</tt> in the string.
32
32
 
33
+ Note that <tt>float</tt> fields are supported, but require Sphinx 0.98.
34
+
33
35
  == Including a field from an association
34
36
 
35
37
  Use the <tt>:include</tt> key.
@@ -37,7 +37,11 @@ module Ultrasphinx
37
37
 
38
38
  # Extract ranged raw filters
39
39
  # Some of this mangling might not be necessary
40
- opts['filters'].each do |field, value|
40
+ opts['filters'].each do |field, value|
41
+ field = field.to_s
42
+ unless Fields.instance.types[field]
43
+ raise Sphinx::SphinxArgumentError, "field #{field.inspect} is invalid"
44
+ end
41
45
  begin
42
46
  case value
43
47
  when Fixnum, Float, BigDecimal, NilClass, Array
@@ -55,7 +59,7 @@ module Ultrasphinx
55
59
  raise NoMethodError
56
60
  end
57
61
  rescue NoMethodError => e
58
- raise Sphinx::SphinxArgumentError, "filter: #{field.inspect}:#{value.inspect} is invalid"
62
+ raise Sphinx::SphinxArgumentError, "filter value #{value.inspect} for field #{field.inspect} is invalid"
59
63
  end
60
64
  end
61
65
 
@@ -10,7 +10,7 @@ module Ultrasphinx
10
10
  class UsageError < Exception #:nodoc:
11
11
  end
12
12
 
13
- # internal file paths
13
+ # Internal file paths
14
14
 
15
15
  SUBDIR = "config/ultrasphinx"
16
16
 
@@ -26,7 +26,7 @@ module Ultrasphinx
26
26
 
27
27
  raise ConfigurationError, "Please create a '#{SUBDIR}/#{RAILS_ENV}.base' or '#{SUBDIR}/default.base' file in order to use Ultrasphinx in your #{RAILS_ENV} environment." unless File.exist? BASE_PATH # XXX lame
28
28
 
29
- # some miscellaneous constants
29
+ # Some miscellaneous constants
30
30
 
31
31
  MAX_INT = 2**32-1
32
32
 
@@ -36,6 +36,12 @@ module Ultrasphinx
36
36
 
37
37
  UNIFIED_INDEX_NAME = "complete"
38
38
 
39
+ SPHINX_VERSION = if `which indexer` =~ /\/indexer\n/m
40
+ `indexer`.split("\n").first[7..-1]
41
+ else
42
+ "unknown"
43
+ end
44
+
39
45
  CONFIG_MAP = {
40
46
  # These must be symbols for key mapping against Rails itself
41
47
  :username => 'sql_user',
@@ -73,13 +79,19 @@ type = pgsql
73
79
 
74
80
  ADAPTER = ActiveRecord::Base.connection.instance_variable_get("@config")[:adapter]
75
81
 
82
+ mattr_accessor :with_rake
83
+
76
84
  # Logger.
77
85
  def self.say msg
78
- msg = "** ultrasphinx: #{msg}"
79
- if defined? RAILS_DEFAULT_LOGGER
80
- RAILS_DEFAULT_LOGGER.warn msg
86
+ if with_rake
87
+ puts msg[0..0].upcase + msg[1..-1]
81
88
  else
82
- STDERR.puts msg
89
+ msg = "** ultrasphinx: #{msg}"
90
+ if defined? RAILS_DEFAULT_LOGGER
91
+ RAILS_DEFAULT_LOGGER.warn msg
92
+ else
93
+ STDERR.puts msg
94
+ end
83
95
  end
84
96
  end
85
97
 
@@ -100,8 +112,7 @@ type = pgsql
100
112
 
101
113
  end
102
114
 
103
- # introspect on the existing generated conf files
104
-
115
+ # Introspect on the existing generated conf files
105
116
  INDEXER_SETTINGS = options_for('indexer', BASE_PATH)
106
117
  CLIENT_SETTINGS = options_for('client', BASE_PATH)
107
118
  DAEMON_SETTINGS = options_for('searchd', BASE_PATH)
@@ -2,61 +2,68 @@
2
2
  ENV['RAILS_ENV'] ||= "development"
3
3
 
4
4
  namespace :ultrasphinx do
5
+
6
+ task :_environment => [:environment] do
7
+ # We can't just chain :environment because we want to make
8
+ # sure it's set only for known Sphinx tasks
9
+ Ultrasphinx.with_rake = true
10
+ end
5
11
 
6
12
  desc "Bootstrap a full Sphinx environment"
7
- task :bootstrap => [:environment, :configure, :index, :"daemon:restart"] do
13
+ task :bootstrap => [:_environment, :configure, :index, :"daemon:restart"] do
8
14
  end
9
15
 
10
16
  desc "Rebuild the configuration file for this particular environment."
11
- task :configure => :environment do
17
+ task :configure => [:_environment] do
12
18
  Ultrasphinx::Configure.run
13
19
  end
14
20
 
15
21
  desc "Reindex the database and send an update signal to the search daemon."
16
- task :index => :environment do
22
+ task :index => [:_environment] do
23
+ mkdir_p Ultrasphinx::INDEX_SETTINGS['path']
17
24
  cmd = "indexer --config #{Ultrasphinx::CONF_PATH}"
18
25
  cmd << " #{ENV['OPTS']} " if ENV['OPTS']
19
26
  cmd << " --rotate" if ultrasphinx_daemon_running?
20
27
  cmd << " #{Ultrasphinx::UNIFIED_INDEX_NAME}"
21
- puts cmd
28
+ say cmd
22
29
  system cmd
23
30
  end
24
31
 
25
32
 
26
33
  namespace :daemon do
27
34
  desc "Start the search daemon"
28
- task :start => :environment do
35
+ task :start => [:_environment] do
29
36
  FileUtils.mkdir_p File.dirname(Ultrasphinx::DAEMON_SETTINGS["log"]) rescue nil
30
37
  raise Ultrasphinx::DaemonError, "Already running" if ultrasphinx_daemon_running?
31
38
  system "searchd --config #{Ultrasphinx::CONF_PATH}"
32
39
  sleep(2) # give daemon a chance to write the pid file
33
40
  if ultrasphinx_daemon_running?
34
- puts "Started successfully"
41
+ say "started successfully"
35
42
  else
36
- puts "Failed to start"
43
+ say "failed to start"
37
44
  end
38
45
  end
39
46
 
40
47
  desc "Stop the search daemon"
41
- task :stop => [:environment] do
48
+ task :stop => [:_environment] do
42
49
  raise Ultrasphinx::DaemonError, "Doesn't seem to be running" unless ultrasphinx_daemon_running?
43
50
  system "kill #{pid = ultrasphinx_daemon_pid}"
44
- puts "Stopped #{pid}."
51
+ say "stopped #{pid}."
45
52
  end
46
53
 
47
54
  desc "Restart the search daemon"
48
- task :restart => [:environment] do
55
+ task :restart => [:_environment] do
49
56
  Rake::Task["ultrasphinx:daemon:stop"].invoke if ultrasphinx_daemon_running?
50
57
  sleep(3)
51
58
  Rake::Task["ultrasphinx:daemon:start"].invoke
52
59
  end
53
60
 
54
61
  desc "Check if the search daemon is running"
55
- task :status => :environment do
62
+ task :status => [:_environment] do
56
63
  if ultrasphinx_daemon_running?
57
- puts "Daemon is running."
64
+ say "daemon is running."
58
65
  else
59
- puts "Daemon is stopped."
66
+ say "daemon is stopped."
60
67
  end
61
68
  end
62
69
  end
@@ -64,12 +71,12 @@ namespace :ultrasphinx do
64
71
 
65
72
  namespace :spelling do
66
73
  desc "Rebuild the custom spelling dictionary. You may need to use 'sudo' if your Aspell folder is not writable by the app user."
67
- task :build => :environment do
74
+ task :build => [:_environment] do
68
75
  ENV['OPTS'] = "--buildstops #{Ultrasphinx::STOPWORDS_PATH} #{Ultrasphinx::MAX_WORDS} --buildfreqs"
69
76
  Rake::Task["ultrasphinx:index"].invoke
70
77
  tmpfile = "/tmp/custom_words.txt"
71
78
  words = []
72
- puts "Filtering"
79
+ say "filtering"
73
80
  File.open(Ultrasphinx::STOPWORDS_PATH).each do |line|
74
81
  if line =~ /^([^\s\d_]{4,}) (\d+)/
75
82
  # XXX should be configurable
@@ -78,9 +85,9 @@ namespace :ultrasphinx do
78
85
  # by aspell-en, in order to not add typos to the dictionary
79
86
  end
80
87
  end
81
- puts "Writing #{words.size} words"
88
+ say "writing #{words.size} words"
82
89
  File.open(tmpfile, 'w').write(words.join("\n"))
83
- puts "Loading into aspell"
90
+ say "loading into aspell"
84
91
  system("aspell --lang=en create master custom.rws < #{tmpfile}")
85
92
  end
86
93
  end
@@ -116,3 +123,8 @@ def ultrasphinx_daemon_running?
116
123
  false
117
124
  end
118
125
  end
126
+
127
+ def say msg
128
+ Ultrasphinx.say msg
129
+ end
130
+
data/test/test_all.rb ADDED
@@ -0,0 +1,7 @@
1
+
2
+ Dir.chdir(File.dirname(__FILE__)) do
3
+ Dir["unit/*.rb", "integration/*.rb"].each do |file|
4
+ puts "\n*** #{file} ***"
5
+ system("ruby #{file}")
6
+ end
7
+ end
data/test/test_helper.rb CHANGED
@@ -25,8 +25,6 @@ ActiveRecord::Base.establish_connection(
25
25
  })
26
26
  ActiveRecord::Base.connection.instance_variable_set('@config', config)
27
27
 
28
- silently { require 'schema' }
29
- require 'models'
30
28
  require 'ultrasphinx'
31
29
 
32
30
  Debugger.start
@@ -1,5 +1,5 @@
1
1
 
2
- require "#{File.dirname(__FILE__)}/../test_helper.rb"
2
+ require "#{File.dirname(__FILE__)}/../test_helper"
3
3
 
4
4
  describe "parser" do
5
5
 
data/ultrasphinx.gemspec CHANGED
@@ -1,11 +1,11 @@
1
1
 
2
- # Gem::Specification for Ultrasphinx-1.5.1
2
+ # Gem::Specification for Ultrasphinx-1.5.2
3
3
  # Originally generated by Echoe
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = %q{ultrasphinx}
7
- s.version = "1.5.1"
8
- s.date = %q{2007-09-25}
7
+ s.version = "1.5.2"
8
+ s.date = %q{2007-09-27}
9
9
  s.summary = %q{Ruby on Rails configurator and client to the Sphinx fulltext search engine.}
10
10
  s.email = %q{}
11
11
  s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/}
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{Ruby on Rails configurator and client to the Sphinx fulltext search engine.}
14
14
  s.has_rdoc = true
15
15
  s.authors = [""]
16
- s.files = ["vendor/will_paginate/LICENSE", "vendor/sphinx/README", "vendor/sphinx/Rakefile", "vendor/sphinx/LICENSE", "vendor/sphinx/lib/client.rb", "vendor/sphinx/init.rb", "TODO", "test/unit/parser_test.rb", "test/test_helper.rb", "test/config/ultrasphinx/test.base", "tasks/ultrasphinx.rake", "README", "Manifest", "LICENSE", "lib/ultrasphinx.rb", "lib/ultrasphinx/ultrasphinx.rb", "lib/ultrasphinx/spell.rb", "lib/ultrasphinx/search.rb", "lib/ultrasphinx/search/parser.rb", "lib/ultrasphinx/search/internals.rb", "lib/ultrasphinx/is_indexed.rb", "lib/ultrasphinx/fields.rb", "lib/ultrasphinx/core_extensions.rb", "lib/ultrasphinx/configure.rb", "lib/ultrasphinx/autoload.rb", "init.rb", "examples/default.base", "examples/app.multi", "CHANGELOG", "ultrasphinx.gemspec"]
17
- s.test_files = ["test/test_helper.rb"]
16
+ s.files = ["vendor/will_paginate/LICENSE", "vendor/sphinx/README", "vendor/sphinx/Rakefile", "vendor/sphinx/LICENSE", "vendor/sphinx/lib/client.rb", "vendor/sphinx/init.rb", "TODO", "test/unit/parser_test.rb", "test/test_helper.rb", "test/config/ultrasphinx/test.base", "tasks/ultrasphinx.rake", "README", "Manifest", "LICENSE", "lib/ultrasphinx.rb", "lib/ultrasphinx/ultrasphinx.rb", "lib/ultrasphinx/spell.rb", "lib/ultrasphinx/search.rb", "lib/ultrasphinx/search/parser.rb", "lib/ultrasphinx/search/internals.rb", "lib/ultrasphinx/is_indexed.rb", "lib/ultrasphinx/fields.rb", "lib/ultrasphinx/core_extensions.rb", "lib/ultrasphinx/configure.rb", "lib/ultrasphinx/autoload.rb", "init.rb", "examples/default.base", "examples/app.multi", "CHANGELOG", "ultrasphinx.gemspec", "test/test_all.rb"]
17
+ s.test_files = ["test/test_all.rb"]
18
18
  s.add_dependency(%q<chronic>, ["> 0.0.0"])
19
19
  end
20
20
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ultrasphinx
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.5.1
7
- date: 2007-09-25 00:00:00 -04:00
6
+ version: 1.5.2
7
+ date: 2007-09-27 00:00:00 -04:00
8
8
  summary: Ruby on Rails configurator and client to the Sphinx fulltext search engine.
9
9
  require_paths:
10
10
  - lib
@@ -82,7 +82,7 @@ files:
82
82
  - CHANGELOG
83
83
  - ultrasphinx.gemspec
84
84
  test_files:
85
- - test/test_helper.rb
85
+ - test/test_all.rb
86
86
  rdoc_options: []
87
87
 
88
88
  extra_rdoc_files: []
metadata.gz.sig CHANGED
Binary file