Chrononaut-no_fuzz 0.0.1 → 0.0.2
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/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
|