mongoid_fulltext 0.5.7 → 0.5.8
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/Gemfile +1 -1
- data/README.md +26 -10
- data/VERSION +1 -1
- data/lib/mongoid_fulltext.rb +23 -5
- data/mongoid_fulltext.gemspec +5 -5
- data/spec/models/filtered_artwork.rb +4 -2
- data/spec/mongoid/fulltext_spec.rb +122 -28
- metadata +14 -14
data/Gemfile
CHANGED
@@ -6,7 +6,7 @@ gem "unicode_utils", "~> 1.0.0"
|
|
6
6
|
# Include everything needed to run rake, tests, features, etc.
|
7
7
|
group :development do
|
8
8
|
gem "mongoid", "~> 2.0.0"
|
9
|
-
gem "bson_ext", "~> 1.
|
9
|
+
gem "bson_ext", "~> 1.5.2"
|
10
10
|
gem "rspec", "~> 2.5.0"
|
11
11
|
gem "jeweler", "~> 1.5.2"
|
12
12
|
end
|
data/README.md
CHANGED
@@ -10,6 +10,11 @@ lets you do a fuzzy string search across relatively short strings, which makes i
|
|
10
10
|
autocomplete boxes based on the display names of your Rails models but not appropriate for, say,
|
11
11
|
indexing hundreds of thousands of HTML documents.
|
12
12
|
|
13
|
+
Install
|
14
|
+
--------------
|
15
|
+
|
16
|
+
gem 'mongoid_fulltext'
|
17
|
+
|
13
18
|
Some examples:
|
14
19
|
--------------
|
15
20
|
|
@@ -217,26 +222,23 @@ Indexing Options
|
|
217
222
|
|
218
223
|
Additional indexing/query options can be used as parameters to `fulltext_search_in`.
|
219
224
|
|
220
|
-
* `alphabet`: letters to index, default is `abcdefghijklmnopqrstuvwxyz0123456789
|
225
|
+
* `alphabet`: letters to index, default is `abcdefghijklmnopqrstuvwxyz0123456789 `.
|
221
226
|
* `word_separators`: word separators, default is the space character.
|
222
|
-
* `ngram_width`: ngram width, default is `3
|
227
|
+
* `ngram_width`: ngram width, default is `3`.
|
223
228
|
* `index_full_words`: index full words, which improves exact matches, default is `true`.
|
224
229
|
* `index_short_prefixes`: index a prefix of each full word of length `(ngram_width-1)`. Useful if
|
225
230
|
you use a larger ngram_width than the default of 3. Default for this option is `false`.
|
226
231
|
* `stop_words`: a hash of words to avoid indexing as full words. Used only if `index_full_words`
|
227
232
|
is set to `true`. Defaults to a hash containing a list of common English stop words.
|
228
|
-
* `apply_prefix_scoring_to_all_words`: score n-grams at beginning of words higher, default is `true
|
229
|
-
* `max_ngrams_to_search`: maximum number of ngrams to query at any given time, default is `6
|
233
|
+
* `apply_prefix_scoring_to_all_words`: score n-grams at beginning of words higher, default is `true`.
|
234
|
+
* `max_ngrams_to_search`: maximum number of ngrams to query at any given time, default is `6`.
|
230
235
|
* `max_candidate_set_size`: maximum number of candidate ngrams to examine for a given query.
|
231
236
|
Defaults to 1000. If you're seeing poor results, you can try increasing this value to consider
|
232
237
|
more ngrams per query (changing this parameter does not require a re-index.) The amount of time
|
233
238
|
a search takes is directly proportional to this parameter's value.
|
234
|
-
* `remove_accents`: remove accents on accented characters
|
235
|
-
|
236
|
-
|
237
|
-
URL, for instance we might have "%C3%A9" which is how an "e-accute" ("é") gets passed
|
238
|
-
through a web-browser. These are then changed to their UTF-8 equivalents (via the `CGI` gem)
|
239
|
-
and then finally stripped, as before.
|
239
|
+
* `remove_accents`: remove accents on accented characters, default is `true`.
|
240
|
+
We strip the accents using [NFKD normalization](http://unicode-utils.rubyforge.org/UnicodeUtils.html#method-c-compatibility_decomposition)
|
241
|
+
using an external library, `unicode_utils`.
|
240
242
|
* `update_if`: controls whether or not the index will be updated. This can be set to a symbol,
|
241
243
|
string, or proc. If the result of evaluating the value is true, the index will be updated.
|
242
244
|
* When set to a symbol, the symbol is sent to the document.
|
@@ -275,6 +277,20 @@ at both the Art Basel and the New York Armory exhibition.
|
|
275
277
|
# Artists at both the Art Basel and the New York Armory exhibition
|
276
278
|
Artist.fulltext_search('foobar', :exhibitions => [ "Art Basel", "New York Armory" ])
|
277
279
|
|
280
|
+
# Note that the following explicit syntax may be used to achieve the
|
281
|
+
# same result as above
|
282
|
+
Artist.fulltext_search('foobar', :exhibitions => {:all => [ "Art Basel", "New York Armory" ]})
|
283
|
+
|
284
|
+
If you want to find all artists that are at either the Art Basel or the
|
285
|
+
New York Armory exhibition, then you may specify the `:any` operator in
|
286
|
+
the filter.
|
287
|
+
|
288
|
+
# Artists at either the Art Basel or the New York Armory exhibition
|
289
|
+
Artist.fulltext_search('foobar', :exhibitions => {:any => [ "Art Basel", "New York Armory" ]})
|
290
|
+
|
291
|
+
Note that `:all` and `:any` are currently the only supported operators
|
292
|
+
for the array filters.
|
293
|
+
|
278
294
|
Building the index
|
279
295
|
------------------
|
280
296
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.8
|
data/lib/mongoid_fulltext.rb
CHANGED
@@ -10,6 +10,7 @@ module Mongoid::FullTextSearch
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class UnspecifiedIndexError < StandardError; end
|
13
|
+
class UnknownFilterQueryOperator < StandardError; end
|
13
14
|
|
14
15
|
module ClassMethods
|
15
16
|
|
@@ -86,7 +87,7 @@ module Mongoid::FullTextSearch
|
|
86
87
|
next if !keys.member?('ngram')
|
87
88
|
all_filter_keys |= keys.find_all{ |key| key.starts_with?('filter_values.') }
|
88
89
|
if keys & correct_keys != correct_keys
|
89
|
-
Mongoid.logger.info "
|
90
|
+
Mongoid.logger.info "Dropping #{name} [#{keys & correct_keys} <=> #{correct_keys}]" if Mongoid.logger
|
90
91
|
coll.drop_index(name)
|
91
92
|
end
|
92
93
|
end
|
@@ -96,9 +97,9 @@ module Mongoid::FullTextSearch
|
|
96
97
|
index_definition = [['ngram', Mongo::ASCENDING], ['score', Mongo::DESCENDING]].concat(filter_indexes)
|
97
98
|
end
|
98
99
|
|
99
|
-
Mongoid.logger.info "Ensuring fts_index on #{coll.name}: #{index_definition}"
|
100
|
+
Mongoid.logger.info "Ensuring fts_index on #{coll.name}: #{index_definition}" if Mongoid.logger
|
100
101
|
coll.ensure_index(index_definition, { :name => 'fts_index' })
|
101
|
-
Mongoid.logger.info "Ensuring document_id index on #{coll.name}"
|
102
|
+
Mongoid.logger.info "Ensuring document_id index on #{coll.name}" if Mongoid.logger
|
102
103
|
coll.ensure_index([['document_id', Mongo::ASCENDING]]) # to make removes fast
|
103
104
|
end
|
104
105
|
|
@@ -123,7 +124,7 @@ module Mongoid::FullTextSearch
|
|
123
124
|
coll = collection.db.collection(index_name)
|
124
125
|
cursors = ngrams.map do |ngram|
|
125
126
|
query = {'ngram' => ngram[0]}
|
126
|
-
query.update(
|
127
|
+
query.update(map_query_filters options)
|
127
128
|
count = coll.find(query).count
|
128
129
|
{:ngram => ngram, :count => count, :query => query}
|
129
130
|
end.sort!{ |record1, record2| record1[:count] <=> record2[:count] }
|
@@ -187,7 +188,7 @@ module Mongoid::FullTextSearch
|
|
187
188
|
return {} if str.nil?
|
188
189
|
|
189
190
|
if config[:remove_accents]
|
190
|
-
str = UnicodeUtils.nfkd(
|
191
|
+
str = UnicodeUtils.nfkd(str).gsub(/[^\x00-\x7F]/,'')
|
191
192
|
end
|
192
193
|
|
193
194
|
# Remove any characters that aren't in the alphabet and aren't word separators
|
@@ -268,6 +269,23 @@ module Mongoid::FullTextSearch
|
|
268
269
|
end
|
269
270
|
end
|
270
271
|
|
272
|
+
private
|
273
|
+
# Take a list of filters to be mapped so they can update the query
|
274
|
+
# used upon the fulltext search of the ngrams
|
275
|
+
def map_query_filters filters
|
276
|
+
Hash[filters.map {|key,value|
|
277
|
+
case value
|
278
|
+
when Hash then
|
279
|
+
if value.has_key? :any then format_query_filter('$in',key,value[:any])
|
280
|
+
elsif value.has_key? :all then format_query_filter('$all',key,value[:all])
|
281
|
+
else raise UnknownFilterQueryOperator, value.keys.join(","), caller end
|
282
|
+
else format_query_filter('$all',key,value)
|
283
|
+
end
|
284
|
+
}]
|
285
|
+
end
|
286
|
+
def format_query_filter operator, key, value
|
287
|
+
['filter_values.%s' % key, {operator => [value].flatten}]
|
288
|
+
end
|
271
289
|
end
|
272
290
|
|
273
291
|
def update_ngram_index
|
data/mongoid_fulltext.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "mongoid_fulltext"
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aaron Windsor"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-03-08"
|
13
13
|
s.description = "Full-text search for the Mongoid ORM, using n-grams extracted from text"
|
14
14
|
s.email = "aaron.windsor@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -82,20 +82,20 @@ Gem::Specification.new do |s|
|
|
82
82
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
83
83
|
s.add_runtime_dependency(%q<unicode_utils>, ["~> 1.0.0"])
|
84
84
|
s.add_development_dependency(%q<mongoid>, ["~> 2.0.0"])
|
85
|
-
s.add_development_dependency(%q<bson_ext>, ["~> 1.
|
85
|
+
s.add_development_dependency(%q<bson_ext>, ["~> 1.5.2"])
|
86
86
|
s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
|
87
87
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
88
88
|
else
|
89
89
|
s.add_dependency(%q<unicode_utils>, ["~> 1.0.0"])
|
90
90
|
s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
|
91
|
-
s.add_dependency(%q<bson_ext>, ["~> 1.
|
91
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.5.2"])
|
92
92
|
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
93
93
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
94
94
|
end
|
95
95
|
else
|
96
96
|
s.add_dependency(%q<unicode_utils>, ["~> 1.0.0"])
|
97
97
|
s.add_dependency(%q<mongoid>, ["~> 2.0.0"])
|
98
|
-
s.add_dependency(%q<bson_ext>, ["~> 1.
|
98
|
+
s.add_dependency(%q<bson_ext>, ["~> 1.5.2"])
|
99
99
|
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
100
100
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
101
101
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
class FilteredArtwork
|
2
2
|
include Mongoid::Document
|
3
3
|
include Mongoid::FullTextSearch
|
4
|
-
field :title
|
4
|
+
field :title, type: String
|
5
|
+
field :colors, type: Array, default: []
|
5
6
|
fulltext_search_in :title, :index_name => 'mongoid_fulltext.artworks_and_artists',
|
6
7
|
:filters => { :is_foobar => lambda { |x| x.title == 'foobar' },
|
7
8
|
:is_artwork => lambda { |x| true },
|
8
|
-
:is_artist => lambda { |x| false }
|
9
|
+
:is_artist => lambda { |x| false },
|
10
|
+
:colors? => lambda { |x| x.colors }
|
9
11
|
}
|
10
12
|
end
|
@@ -29,16 +29,28 @@ module Mongoid
|
|
29
29
|
let!(:lowered) { BasicArtwork.create(:title => 'Lowered') }
|
30
30
|
let!(:cookies) { BasicArtwork.create(:title => 'Cookies') }
|
31
31
|
let!(:empty) { BasicArtwork.create(:title => '') }
|
32
|
-
let!(:cesar)
|
33
|
-
let!(:julio)
|
34
|
-
let!(:csar)
|
35
|
-
|
32
|
+
let!(:cesar) { BasicArtwork.create(:title => "C\u00e9sar Galicia") }
|
33
|
+
let!(:julio) { BasicArtwork.create(:title => "Julio Cesar Morales") }
|
34
|
+
let!(:csar) { BasicArtwork.create(:title => "Csar") }
|
35
|
+
let!(:percent) { BasicArtwork.create(:title => "Untitled (cal%desert)") }
|
36
|
+
|
37
|
+
it "returns empty for empties" do
|
38
|
+
BasicArtwork.fulltext_search(nil, :max_results => 1).should == []
|
39
|
+
BasicArtwork.fulltext_search("", :max_results => 1).should == []
|
40
|
+
end
|
41
|
+
|
42
|
+
it "finds percents" do
|
43
|
+
BasicArtwork.fulltext_search("cal%desert".force_encoding("ASCII-8BIT"), :max_results => 1).first.should == percent
|
44
|
+
BasicArtwork.fulltext_search("cal%desert".force_encoding("UTF-8"), :max_results => 1).first.should == percent
|
45
|
+
end
|
46
|
+
|
36
47
|
it "forgets accents" do
|
37
48
|
BasicArtwork.fulltext_search('cesar', :max_results => 1).first.should == cesar
|
38
49
|
BasicArtwork.fulltext_search('cesar g', :max_results => 1).first.should == cesar
|
39
50
|
BasicArtwork.fulltext_search("C\u00e9sar", :max_results => 1).first.should == cesar
|
40
|
-
BasicArtwork.fulltext_search("C\303\251sar", :max_results => 1).first.should == cesar
|
41
|
-
BasicArtwork.fulltext_search("c%C3%A9sar"
|
51
|
+
BasicArtwork.fulltext_search("C\303\251sar".force_encoding("UTF-8"), :max_results => 1).first.should == cesar
|
52
|
+
BasicArtwork.fulltext_search(CGI.unescape("c%C3%A9sar"), :max_results => 1).first.should == cesar
|
53
|
+
BasicArtwork.fulltext_search(CGI.unescape("c%C3%A9sar".encode("ASCII-8BIT")), :max_results => 1).first.should == cesar
|
42
54
|
end
|
43
55
|
|
44
56
|
it "returns exact matches" do
|
@@ -370,9 +382,10 @@ module Mongoid
|
|
370
382
|
ngram_indexes.length.should == 1
|
371
383
|
keys = ngram_indexes.first[1]['key'].keys
|
372
384
|
expected_keys = ['ngram','score', 'filter_values.is_fuzzy', 'filter_values.is_awesome',
|
373
|
-
'filter_values.is_foobar', 'filter_values.is_artwork', 'filter_values.is_artist'].sort
|
385
|
+
'filter_values.is_foobar', 'filter_values.is_artwork', 'filter_values.is_artist', 'filter_values.colors?'].sort
|
374
386
|
keys.sort.should == expected_keys
|
375
387
|
end
|
388
|
+
|
376
389
|
end
|
377
390
|
|
378
391
|
context "with partitions applied to a model" do
|
@@ -639,32 +652,18 @@ module Mongoid
|
|
639
652
|
# but mongo will automatically attempt to index _id in the background
|
640
653
|
Mongoid.master["mongoid_fulltext.index_basicartwork_0"].index_information.size.should <= 1
|
641
654
|
BasicArtwork.create_indexes
|
642
|
-
|
643
|
-
|
644
|
-
"_id_" => {
|
645
|
-
"name" => "_id_",
|
646
|
-
"ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
|
647
|
-
"key" => { "_id" => 1 },
|
648
|
-
"v" => 0
|
649
|
-
},
|
650
|
-
"fts_index" => {
|
651
|
-
"name" => "fts_index",
|
652
|
-
"ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
|
653
|
-
"key" => { "ngram" => 1, "score" => -1 },
|
654
|
-
"v" => 0
|
655
|
-
},
|
656
|
-
"document_id_1" => {
|
657
|
-
"name" => "document_id_1",
|
658
|
-
"ns" => "mongoid_fulltext_test.mongoid_fulltext.index_basicartwork_0",
|
659
|
-
"key" => { "document_id" => 1 },
|
660
|
-
"v"=>0
|
661
|
-
}
|
662
|
-
}
|
655
|
+
expected_indexes = ['_id_', 'fts_index', 'document_id_1'].sort
|
656
|
+
Mongoid.master["mongoid_fulltext.index_basicartwork_0"].index_information.keys.sort.should == expected_indexes
|
663
657
|
end
|
664
658
|
|
665
659
|
it "doesn't fail on models that don't have a fulltext index" do
|
666
660
|
lambda { HiddenDragon.create_indexes }.should_not raise_error
|
667
661
|
end
|
662
|
+
|
663
|
+
it "doesn't blow up when the Mongoid.logger is set to false" do
|
664
|
+
Mongoid.logger = false
|
665
|
+
BasicArtwork.create_indexes
|
666
|
+
end
|
668
667
|
|
669
668
|
end
|
670
669
|
|
@@ -680,5 +679,100 @@ module Mongoid
|
|
680
679
|
end
|
681
680
|
end
|
682
681
|
|
682
|
+
# For =~ operator documentation
|
683
|
+
# https://github.com/dchelimsky/rspec/blob/master/lib/spec/matchers/match_array.rb#L53
|
684
|
+
|
685
|
+
context "with artwork that returns an array of colors as a filter" do
|
686
|
+
let!(:title) {"title"}
|
687
|
+
let!(:nomatch) {"nomatch"}
|
688
|
+
let!(:red) {"red"}
|
689
|
+
let!(:green) {"green"}
|
690
|
+
let!(:blue) {"blue"}
|
691
|
+
let!(:yellow) {"yellow"}
|
692
|
+
let!(:brown) {"brown"}
|
693
|
+
|
694
|
+
let!(:rgb_artwork) {FilteredArtwork.create(:title => "#{title} rgb", :colors => [red,green,blue])}
|
695
|
+
let!(:holiday_artwork) {FilteredArtwork.create(:title => "#{title} holiday", :colors => [red,green])}
|
696
|
+
let!(:aqua_artwork) {FilteredArtwork.create(:title => "#{title} aqua", :colors => [green,blue])}
|
697
|
+
|
698
|
+
context "with a fulltext search passing red, green, and blue to the colors filter" do
|
699
|
+
it "should return the rgb artwork" do
|
700
|
+
FilteredArtwork.fulltext_search(title, :colors? => [red,green,blue]).should == [rgb_artwork]
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
context "with a fulltext search passing blue and red to the colors filter" do
|
705
|
+
it "should return the rgb artwork" do
|
706
|
+
FilteredArtwork.fulltext_search(title, :colors? => [blue,red]).should == [rgb_artwork]
|
707
|
+
end
|
708
|
+
end
|
709
|
+
|
710
|
+
context "with a fulltext search passing green to the colors filter" do
|
711
|
+
it "should return all artwork" do
|
712
|
+
FilteredArtwork.fulltext_search(title, :colors? => [green]).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
716
|
+
context "with a fulltext search passing no colors to the filter" do
|
717
|
+
it "should return all artwork" do
|
718
|
+
FilteredArtwork.fulltext_search(title).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
|
719
|
+
end
|
720
|
+
end
|
721
|
+
|
722
|
+
context "with a fulltext search passing green and yellow to the colors filter" do
|
723
|
+
it "should return no artwork" do
|
724
|
+
FilteredArtwork.fulltext_search(title, :colors? => [green,yellow]).should == []
|
725
|
+
end
|
726
|
+
end
|
727
|
+
|
728
|
+
context "with the query operator overridden to use $in instead of the default $all" do
|
729
|
+
context "with a fulltext search passing green and yellow to the colors filter" do
|
730
|
+
it "should return all of the artwork" do
|
731
|
+
FilteredArtwork.fulltext_search(title, :colors? => {:any => [green,yellow]}).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
735
|
+
context "with a fulltext search passing brown and yellow to the colors filter" do
|
736
|
+
it "should return none of the artwork" do
|
737
|
+
FilteredArtwork.fulltext_search(title, :colors? => {:any => [brown,yellow]}).should == []
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
context "with a fulltext search passing blue to the colors filter" do
|
742
|
+
it "should return the rgb and aqua artwork" do
|
743
|
+
FilteredArtwork.fulltext_search(title, :colors? => {:any => [blue]}).should == [rgb_artwork,aqua_artwork]
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
context "with a fulltext search term that won't match" do
|
748
|
+
it "should return none of the artwork" do
|
749
|
+
FilteredArtwork.fulltext_search(nomatch, :colors? => {:any => [green,yellow]}).should == []
|
750
|
+
end
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
context "with the query operator overridden to use $all" do
|
755
|
+
context "with a fulltext search passing red, green, and blue to the colors filter" do
|
756
|
+
it "should return the rgb artwork" do
|
757
|
+
FilteredArtwork.fulltext_search(title, :colors? => {:all => [red,green,blue]}).should == [rgb_artwork]
|
758
|
+
end
|
759
|
+
end
|
760
|
+
|
761
|
+
context "with a fulltext search passing green to the colors filter" do
|
762
|
+
it "should return all artwork" do
|
763
|
+
FilteredArtwork.fulltext_search(title, :colors? => {:all => [green]}).should =~ [rgb_artwork,holiday_artwork,aqua_artwork]
|
764
|
+
end
|
765
|
+
end
|
766
|
+
end
|
767
|
+
|
768
|
+
context "with an unknown query operator used to override the default $all" do
|
769
|
+
context "with a fulltext search passing red, green, and blue to the colors filter" do
|
770
|
+
it "should raise an error" do
|
771
|
+
-> {FilteredArtwork.fulltext_search(title, :colors? => {:unknown => [red,green,blue]})}.should raise_error(Mongoid::FullTextSearch::UnknownFilterQueryOperator)
|
772
|
+
end
|
773
|
+
end
|
774
|
+
end
|
775
|
+
end
|
776
|
+
|
683
777
|
end
|
684
778
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_fulltext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-08 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: unicode_utils
|
16
|
-
requirement: &
|
16
|
+
requirement: &2165513880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2165513880
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mongoid
|
27
|
-
requirement: &
|
27
|
+
requirement: &2165513400 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,21 +32,21 @@ dependencies:
|
|
32
32
|
version: 2.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2165513400
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bson_ext
|
38
|
-
requirement: &
|
38
|
+
requirement: &2165512920 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
43
|
+
version: 1.5.2
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2165512920
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &2165512440 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.5.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2165512440
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
requirement: &
|
60
|
+
requirement: &2165511960 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 1.5.2
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2165511960
|
69
69
|
description: Full-text search for the Mongoid ORM, using n-grams extracted from text
|
70
70
|
email: aaron.windsor@gmail.com
|
71
71
|
executables: []
|
@@ -119,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
segments:
|
121
121
|
- 0
|
122
|
-
hash:
|
122
|
+
hash: -3796604883696425002
|
123
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
124
|
none: false
|
125
125
|
requirements:
|