Chrononaut-no_fuzz 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -1
- data/Manifest +9 -10
- data/README.markdown +35 -10
- data/Rakefile +1 -1
- data/generators/no_fuzz/no_fuzz_generator.rb +10 -11
- data/generators/no_fuzz/templates/migration.rb +1 -1
- data/lib/no_fuzz.rb +3 -3
- data/no_fuzz.gemspec +5 -8
- data/test/no_fuzz_test.rb +25 -5
- data/test/test_helper.rb +1 -1
- metadata +15 -25
- data/test/test.sqlite3 +0 -0
data/CHANGELOG
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
v0.0.
|
1
|
+
v0.0.2. Basic normalization, bug fixes and documentation. First patch from a contributor - thanks sabman!
|
2
|
+
v0.0.1. Test release.
|
data/Manifest
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
Rakefile
|
2
2
|
README.markdown
|
3
|
+
no_fuzz.gemspec
|
3
4
|
tasks/no_fuzz_tasks.rake
|
4
|
-
uninstall.rb
|
5
5
|
init.rb
|
6
|
-
generators/no_fuzz/no_fuzz_generator.rb
|
7
|
-
generators/no_fuzz/templates/model.rb
|
8
|
-
generators/no_fuzz/templates/migration.rb
|
9
|
-
generators/no_fuzz/USAGE
|
10
|
-
rails/init.rb
|
11
|
-
CHANGELOG
|
12
6
|
lib/no_fuzz.rb
|
7
|
+
generators/no_fuzz/USAGE
|
8
|
+
generators/no_fuzz/templates/migration.rb
|
9
|
+
generators/no_fuzz/templates/model.rb
|
10
|
+
generators/no_fuzz/no_fuzz_generator.rb
|
13
11
|
MIT-LICENSE
|
14
|
-
no_fuzz.gemspec
|
15
12
|
install.rb
|
16
13
|
test/no_fuzz_test.rb
|
17
|
-
test/test_helper.rb
|
18
14
|
test/database.yml
|
19
15
|
test/schema.rb
|
20
|
-
test/
|
16
|
+
test/test_helper.rb
|
17
|
+
rails/init.rb
|
18
|
+
CHANGELOG
|
19
|
+
uninstall.rb
|
21
20
|
Manifest
|
data/README.markdown
CHANGED
@@ -1,21 +1,34 @@
|
|
1
|
-
#
|
1
|
+
# No Fuzz
|
2
|
+
## Simple Rails-plugin that provides offline fuzzy-search for ActiveRecord
|
2
3
|
|
3
4
|
Simple as can be fuzzy search. Works with any database supported by Active
|
4
|
-
Record. No dependencies.
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
Record. No dependencies. The notion of being offline means that it creates an
|
6
|
+
index which the search algorithm leverages. Note that this index has to be
|
7
|
+
updated to reflect changes in the database content. The plugin creates a
|
8
|
+
separate database model for the index. This means that no changes will be made
|
9
|
+
to your existing schema.
|
8
10
|
|
9
11
|
Note that this family of fuzzy search techniques work best on dictionary-type
|
10
|
-
lookups,
|
12
|
+
lookups (names, words, etc).
|
13
|
+
|
14
|
+
The plugin is based on code and ideas in Steven Ruttenberg's nice blog entry
|
15
|
+
["Live fuzzy search using n-grams in Rails"](http://unirec.blogspot.com/2007/12/live-fuzzy-search-using-n-grams-in.html).
|
11
16
|
|
12
|
-
kristian's
|
17
|
+
kristian's
|
18
|
+
[acts_as_fuzzy_search](http://github.com/mkristian/kristians_rails_plugins/tree/master/act_as_fuzzy_search)
|
19
|
+
is a similar plugin, but it targets DataMapper.
|
13
20
|
|
14
|
-
|
21
|
+
## Installation and Setup
|
15
22
|
|
16
|
-
|
23
|
+
cd your_rails_project
|
24
|
+
script/plugin install git://github.com/Chrononaut/no_fuzz.git
|
25
|
+
# Now we create a trigram migration for the model we want to add fuzzy search to:
|
26
|
+
script/generate no_fuzz Model
|
27
|
+
rake db:migrate
|
17
28
|
|
18
|
-
|
29
|
+
(Note that the plugin is available as a gem as well - you don't have to use script/plugin)
|
30
|
+
|
31
|
+
## Basic Usage
|
19
32
|
|
20
33
|
Add the following code in the model you'd like to index:
|
21
34
|
|
@@ -31,4 +44,16 @@ search fuzzily with the fuzzy_find method:
|
|
31
44
|
Model.fuzzy_find("query")
|
32
45
|
Model.fuzzy_find("query", 10) # find maximum 10 rows
|
33
46
|
|
47
|
+
A concrete example from a real app can look like this:
|
48
|
+
|
49
|
+
>> Contractor.fuzzy_find('johm')
|
50
|
+
=> [#<Contractor id: 1, full_name: "John Doe", created_at: "2009-04-30 10:05:02", updated_at: "2009-04-30 10:05:02">]
|
51
|
+
|
52
|
+
## Contributors
|
53
|
+
|
54
|
+
The following people have submitted changes which have been applied to the core:
|
55
|
+
|
56
|
+
* [Bjørn Arild Mæland](http://github.com/Chrononaut)
|
57
|
+
* [Shoaib Burq](http://github.com/sabman)
|
58
|
+
|
34
59
|
Copyright (c) 2009 Bjørn Arild Mæland, released under the MIT license
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ Echoe.new('no_fuzz') do |p|
|
|
13
13
|
p.author = "Bjørn Arild Mæland"
|
14
14
|
p.email = "bjorn.maeland@gmail.com"
|
15
15
|
p.summary = "No Fuzz"
|
16
|
-
p.url = "http://
|
16
|
+
p.url = "http://github.com/Chrononaut/no_fuzz"
|
17
17
|
p.ignore_pattern = FileList[".gitignore"]
|
18
18
|
p.include_rakefile = true
|
19
19
|
end
|
@@ -13,21 +13,20 @@ class NoFuzzGenerator < Rails::Generator::NamedBase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
private
|
16
|
-
def local_custom_name
|
17
|
-
class_name.underscore.downcase
|
18
|
-
end
|
19
|
-
|
20
|
-
def gracefully_pluralize(str)
|
21
|
-
str.pluralize! if ActiveRecord::Base.pluralize_table_names
|
22
|
-
str
|
23
|
-
end
|
24
|
-
|
25
16
|
def local_assigns
|
26
17
|
returning(assigns = {}) do
|
27
|
-
assigns[:class_name] =
|
18
|
+
assigns[:class_name] = class_name.underscore.downcase.classify
|
28
19
|
assigns[:migration_class_name] = "CreateTrigramsTableFor#{assigns[:class_name]}"
|
29
|
-
assigns[:table_name] = gracefully_pluralize(
|
20
|
+
assigns[:table_name] = gracefully_pluralize(class_name.underscore.downcase + "_trigram")
|
30
21
|
assigns[:foreign_key] = (class_name.underscore.downcase + "_id")
|
31
22
|
end
|
32
23
|
end
|
33
24
|
end
|
25
|
+
|
26
|
+
module GeneratorHelpers
|
27
|
+
def gracefully_pluralize(str)
|
28
|
+
ActiveRecord::Base.pluralize_table_names ? str.pluralize : str
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
NoFuzzGenerator.send(:include, GeneratorHelpers)
|
data/lib/no_fuzz.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
# - scores
|
3
3
|
# I.e fuzzy {:first_name => 1, :last_name => 2}, last_name gives double score
|
4
4
|
# Currently everything gets scored with 1
|
5
|
-
# - normalization
|
6
5
|
# - weighting of fuzzy_find results
|
7
6
|
|
8
7
|
module NoFuzz
|
@@ -18,7 +17,7 @@ module NoFuzz
|
|
18
17
|
def fuzzy(*fields)
|
19
18
|
# put the parameters as instance variable of the model
|
20
19
|
@@model.instance_variable_set(:@fuzzy_fields, fields)
|
21
|
-
@@model.instance_variable_set(:@fuzzy_ref_id, "#{@@model}_id"
|
20
|
+
@@model.instance_variable_set(:@fuzzy_ref_id, "#{@@model.to_s.demodulize.underscore}_id")
|
22
21
|
@@model.instance_variable_set(:@fuzzy_trigram_model, "#{@@model}Trigram".constantize)
|
23
22
|
end
|
24
23
|
|
@@ -33,7 +32,8 @@ module NoFuzz
|
|
33
32
|
self.all.each do |i|
|
34
33
|
word = ' ' + i.send(f)
|
35
34
|
(0..word.length-3).each do |idx|
|
36
|
-
tg = word[idx,3]
|
35
|
+
tg = word[idx,3].downcase # Force normalization by downcasing for
|
36
|
+
# now - should be overridable by the user
|
37
37
|
trigram_model.create(:tg => tg, fuzzy_ref_id => i.id)
|
38
38
|
end
|
39
39
|
end
|
data/no_fuzz.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{no_fuzz}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Bj\303\270rn Arild M\303\246land"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-04-30}
|
10
10
|
s.description = %q{No Fuzz}
|
11
11
|
s.email = %q{bjorn.maeland@gmail.com}
|
12
|
-
s.extra_rdoc_files = ["README.markdown", "tasks/no_fuzz_tasks.rake", "
|
13
|
-
s.files = ["Rakefile", "README.markdown", "
|
12
|
+
s.extra_rdoc_files = ["README.markdown", "tasks/no_fuzz_tasks.rake", "lib/no_fuzz.rb", "CHANGELOG"]
|
13
|
+
s.files = ["Rakefile", "README.markdown", "no_fuzz.gemspec", "tasks/no_fuzz_tasks.rake", "init.rb", "lib/no_fuzz.rb", "generators/no_fuzz/USAGE", "generators/no_fuzz/templates/migration.rb", "generators/no_fuzz/templates/model.rb", "generators/no_fuzz/no_fuzz_generator.rb", "MIT-LICENSE", "install.rb", "test/no_fuzz_test.rb", "test/database.yml", "test/schema.rb", "test/test_helper.rb", "rails/init.rb", "CHANGELOG", "uninstall.rb", "Manifest"]
|
14
14
|
s.has_rdoc = true
|
15
|
-
s.homepage = %q{http://
|
15
|
+
s.homepage = %q{http://github.com/Chrononaut/no_fuzz}
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "No_fuzz", "--main", "README.markdown"]
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
s.rubyforge_project = %q{no_fuzz}
|
@@ -25,11 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.specification_version = 2
|
26
26
|
|
27
27
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
-
s.add_development_dependency(%q<echoe>, [">= 0"])
|
29
28
|
else
|
30
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
31
29
|
end
|
32
30
|
else
|
33
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
34
31
|
end
|
35
32
|
end
|
data/test/no_fuzz_test.rb
CHANGED
@@ -1,18 +1,38 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
require 'rails_generator'
|
3
|
+
require 'rails_generator/scripts/generate'
|
4
|
+
require 'generators/no_fuzz/no_fuzz_generator'
|
2
5
|
|
3
6
|
class NoFuzzTest < ActiveSupport::TestCase
|
4
7
|
|
5
8
|
load_schema
|
6
9
|
|
7
|
-
class
|
10
|
+
class PackageTrigram < ActiveRecord::Base
|
8
11
|
end
|
9
12
|
|
10
|
-
class
|
13
|
+
class Package < ActiveRecord::Base
|
14
|
+
include NoFuzz
|
15
|
+
|
16
|
+
fuzzy :name
|
11
17
|
end
|
12
18
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
19
|
+
def test_populating_and_deleting_trigram_index
|
20
|
+
Package.create!(:name => "abcdef")
|
21
|
+
Package.populate_trigram_index
|
22
|
+
assert_equal 5, PackageTrigram.count
|
23
|
+
Package.clear_trigram_index
|
24
|
+
assert_equal 0, PackageTrigram.count
|
16
25
|
end
|
17
26
|
|
18
27
|
end
|
28
|
+
|
29
|
+
class GeneratorHelpersTest < Test::Unit::TestCase
|
30
|
+
include GeneratorHelpers
|
31
|
+
|
32
|
+
def test_graceful_pluralization
|
33
|
+
ActiveRecord::Base.pluralize_table_names = false
|
34
|
+
assert_equal "chicken", gracefully_pluralize("chicken")
|
35
|
+
ActiveRecord::Base.pluralize_table_names = true
|
36
|
+
assert_equal "chickens", gracefully_pluralize("chicken")
|
37
|
+
end
|
38
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Chrononaut-no_fuzz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Bj\xC3\xB8rn Arild M\xC3\xA6land"
|
@@ -9,19 +9,10 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-30 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: echoe
|
17
|
-
type: :development
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
25
16
|
description: No Fuzz
|
26
17
|
email: bjorn.maeland@gmail.com
|
27
18
|
executables: []
|
@@ -31,32 +22,31 @@ extensions: []
|
|
31
22
|
extra_rdoc_files:
|
32
23
|
- README.markdown
|
33
24
|
- tasks/no_fuzz_tasks.rake
|
34
|
-
- CHANGELOG
|
35
25
|
- lib/no_fuzz.rb
|
26
|
+
- CHANGELOG
|
36
27
|
files:
|
37
28
|
- Rakefile
|
38
29
|
- README.markdown
|
30
|
+
- no_fuzz.gemspec
|
39
31
|
- tasks/no_fuzz_tasks.rake
|
40
|
-
- uninstall.rb
|
41
32
|
- init.rb
|
42
|
-
- generators/no_fuzz/no_fuzz_generator.rb
|
43
|
-
- generators/no_fuzz/templates/model.rb
|
44
|
-
- generators/no_fuzz/templates/migration.rb
|
45
|
-
- generators/no_fuzz/USAGE
|
46
|
-
- rails/init.rb
|
47
|
-
- CHANGELOG
|
48
33
|
- lib/no_fuzz.rb
|
34
|
+
- generators/no_fuzz/USAGE
|
35
|
+
- generators/no_fuzz/templates/migration.rb
|
36
|
+
- generators/no_fuzz/templates/model.rb
|
37
|
+
- generators/no_fuzz/no_fuzz_generator.rb
|
49
38
|
- MIT-LICENSE
|
50
39
|
- install.rb
|
51
40
|
- test/no_fuzz_test.rb
|
52
|
-
- test/test_helper.rb
|
53
41
|
- test/database.yml
|
54
42
|
- test/schema.rb
|
55
|
-
- test/
|
43
|
+
- test/test_helper.rb
|
44
|
+
- rails/init.rb
|
45
|
+
- CHANGELOG
|
46
|
+
- uninstall.rb
|
56
47
|
- Manifest
|
57
|
-
- no_fuzz.gemspec
|
58
48
|
has_rdoc: true
|
59
|
-
homepage: http://
|
49
|
+
homepage: http://github.com/Chrononaut/no_fuzz
|
60
50
|
post_install_message:
|
61
51
|
rdoc_options:
|
62
52
|
- --line-numbers
|
data/test/test.sqlite3
DELETED
Binary file
|