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 +0 -0
- data/CHANGELOG +2 -0
- data/README +3 -4
- data/lib/ultrasphinx.rb +8 -1
- data/lib/ultrasphinx/configure.rb +7 -5
- data/lib/ultrasphinx/core_extensions.rb +37 -17
- data/lib/ultrasphinx/fields.rb +24 -7
- data/lib/ultrasphinx/is_indexed.rb +2 -0
- data/lib/ultrasphinx/search/internals.rb +6 -2
- data/lib/ultrasphinx/ultrasphinx.rb +19 -8
- data/tasks/ultrasphinx.rake +29 -17
- data/test/test_all.rb +7 -0
- data/test/test_helper.rb +0 -2
- data/test/unit/parser_test.rb +1 -1
- data/ultrasphinx.gemspec +5 -5
- metadata +3 -3
- metadata.gz.sig +0 -0
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
|
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
|
-
|
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
|
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
|
-
|
32
|
-
|
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
|
-
|
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
|
data/lib/ultrasphinx/fields.rb
CHANGED
@@ -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 "
|
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 "
|
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
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
79
|
-
|
80
|
-
RAILS_DEFAULT_LOGGER.warn msg
|
86
|
+
if with_rake
|
87
|
+
puts msg[0..0].upcase + msg[1..-1]
|
81
88
|
else
|
82
|
-
|
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
|
-
#
|
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)
|
data/tasks/ultrasphinx.rake
CHANGED
@@ -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 => [:
|
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 => :
|
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 => :
|
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
|
-
|
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 => :
|
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
|
-
|
41
|
+
say "started successfully"
|
35
42
|
else
|
36
|
-
|
43
|
+
say "failed to start"
|
37
44
|
end
|
38
45
|
end
|
39
46
|
|
40
47
|
desc "Stop the search daemon"
|
41
|
-
task :stop => [:
|
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
|
-
|
51
|
+
say "stopped #{pid}."
|
45
52
|
end
|
46
53
|
|
47
54
|
desc "Restart the search daemon"
|
48
|
-
task :restart => [:
|
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 => :
|
62
|
+
task :status => [:_environment] do
|
56
63
|
if ultrasphinx_daemon_running?
|
57
|
-
|
64
|
+
say "daemon is running."
|
58
65
|
else
|
59
|
-
|
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 => :
|
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
|
-
|
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
|
-
|
88
|
+
say "writing #{words.size} words"
|
82
89
|
File.open(tmpfile, 'w').write(words.join("\n"))
|
83
|
-
|
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
data/test/test_helper.rb
CHANGED
data/test/unit/parser_test.rb
CHANGED
data/ultrasphinx.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Ultrasphinx-1.5.
|
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.
|
8
|
-
s.date = %q{2007-09-
|
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/
|
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.
|
7
|
-
date: 2007-09-
|
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/
|
85
|
+
- test/test_all.rb
|
86
86
|
rdoc_options: []
|
87
87
|
|
88
88
|
extra_rdoc_files: []
|
metadata.gz.sig
CHANGED
Binary file
|