levenshteinish 0.0.1
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/.gitignore +3 -0
- data/.rspec +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +27 -0
- data/Rakefile +2 -0
- data/levenshteinish.gemspec +24 -0
- data/lib/levenshteinish.rb +27 -0
- data/lib/levenshteinish/version.rb +3 -0
- data/spec/levenshteinish_spec.rb +44 -0
- data/spec/spec_helper.rb +6 -0
- metadata +100 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
levenshteinish (0.0.1)
|
5
|
+
hintable_levenshtein
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
diff-lcs (1.1.2)
|
11
|
+
hintable_levenshtein (0.0.3)
|
12
|
+
rspec (2.4.0)
|
13
|
+
rspec-core (~> 2.4.0)
|
14
|
+
rspec-expectations (~> 2.4.0)
|
15
|
+
rspec-mocks (~> 2.4.0)
|
16
|
+
rspec-core (2.4.0)
|
17
|
+
rspec-expectations (2.4.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.4.0)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
hintable_levenshtein
|
26
|
+
levenshteinish!
|
27
|
+
rspec
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "levenshteinish/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "levenshteinish"
|
7
|
+
s.version = Levenshteinish::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Linus Oleander"]
|
10
|
+
s.email = ["linus@oleander.nu"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{An implementation of levenshteinish}
|
13
|
+
s.description = %q{An basic implementation of levenshteinish}
|
14
|
+
|
15
|
+
s.rubyforge_project = "levenshteinish"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency('hintable_levenshtein')
|
23
|
+
s.add_development_dependency('rspec')
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Some code borrowed from http://www.erikveen.dds.nl/levenshtein/doc/index.html
|
2
|
+
require 'hintable_levenshtein'
|
3
|
+
|
4
|
+
class Levenshtein
|
5
|
+
def self.distance(s1, s2, threshold = nil)
|
6
|
+
|
7
|
+
# If the arguments is nil
|
8
|
+
s1 = s1.to_s unless s1
|
9
|
+
s2 = s2.to_s unless s2
|
10
|
+
|
11
|
+
s1, s2 = s2, s1 if s1.length > s2.length # s1 is the short one; s2 is the long one.
|
12
|
+
|
13
|
+
if s2.length == 0
|
14
|
+
0.0 # Since s1.length < s2.length, s1 must be empty as well.
|
15
|
+
else
|
16
|
+
if threshold
|
17
|
+
if (d = HintableLevenshtein.new.distance(s1, s2).to_f/s2.length) <= threshold
|
18
|
+
d
|
19
|
+
else
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
else
|
23
|
+
HintableLevenshtein.new.distance(s1, s2).to_f/s2.length
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Levenshtein do
|
4
|
+
it "should return the right value when no threshold is being defined" do
|
5
|
+
Levenshtein.distance("first", "last").should eq(0.6)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should return nil value when a threshold is being passed" do
|
9
|
+
Levenshtein.distance("first", "last", 0.1).should be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should not return nil value when a threshold is being passed" do
|
13
|
+
Levenshtein.distance("first", "last", 0.8).should_not be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not change when a threshold is being passed" do
|
17
|
+
Levenshtein.distance("first", "last", 0.8).should eq(0.6)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be tested?" do
|
21
|
+
Levenshtein.distance("first", "").should eq(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return zero when to strings are equal" do
|
25
|
+
Levenshtein.distance("abc123", "abc123").should eq(0)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should never return a value larger then 1" do
|
29
|
+
Levenshtein.distance("asdasdasdasdasdasdasdasdasdasdasdasd", "a").should <= 1
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not crash if one if the arguments is nil" do
|
33
|
+
lambda do
|
34
|
+
Levenshtein.distance(nil, "")
|
35
|
+
Levenshtein.distance(nil, nil)
|
36
|
+
Levenshtein.distance("", nil)
|
37
|
+
end.should_not raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return the same value using nil as an empty string" do
|
41
|
+
Levenshtein.distance(nil, nil).should eq(Levenshtein.distance("", ""))
|
42
|
+
Levenshtein.distance(nil, "Hello").should eq(Levenshtein.distance("", "Hell0"))
|
43
|
+
end
|
44
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: levenshteinish
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Linus Oleander
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-30 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: hintable_levenshtein
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
description: An basic implementation of levenshteinish
|
47
|
+
email:
|
48
|
+
- linus@oleander.nu
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
extra_rdoc_files: []
|
54
|
+
|
55
|
+
files:
|
56
|
+
- .gitignore
|
57
|
+
- .rspec
|
58
|
+
- Gemfile
|
59
|
+
- Gemfile.lock
|
60
|
+
- Rakefile
|
61
|
+
- levenshteinish.gemspec
|
62
|
+
- lib/levenshteinish.rb
|
63
|
+
- lib/levenshteinish/version.rb
|
64
|
+
- spec/levenshteinish_spec.rb
|
65
|
+
- spec/spec_helper.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: ""
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
requirements: []
|
92
|
+
|
93
|
+
rubyforge_project: levenshteinish
|
94
|
+
rubygems_version: 1.3.7
|
95
|
+
signing_key:
|
96
|
+
specification_version: 3
|
97
|
+
summary: An implementation of levenshteinish
|
98
|
+
test_files:
|
99
|
+
- spec/levenshteinish_spec.rb
|
100
|
+
- spec/spec_helper.rb
|