mongoid_fulltext 0.5.7 → 0.5.8
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|