divergence_meter 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +21 -4
- data/.tachikoma.yml +1 -0
- data/.travis.yml +1 -0
- data/README.md +12 -4
- data/Rakefile +5 -0
- data/divergence_meter.gemspec +2 -0
- data/lib/divergence_meter.rb +9 -11
- data/lib/divergence_meter/cli.rb +5 -0
- data/lib/divergence_meter/did_you_mean.rb +44 -0
- data/lib/divergence_meter/levenshtein_distance.rb +13 -0
- data/lib/divergence_meter/version.rb +2 -1
- data/spec/divergence_meter/cli_spec.rb +37 -0
- data/spec/divergence_meter_spec.rb +3 -1
- data/spec/spec_helper.rb +3 -0
- metadata +35 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b90019f6be0496d440450b1b72f805f51ef5d53a
|
4
|
+
data.tar.gz: 5f6e89452d90476fe2d0714864901ccd9252eebb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28f6fed4c20954814e6ab9ac3ff9b3ece4dcdf335e98aee1a3d61f2d71d6ada22ea1d0bd8bd0b9de2387d93ac540b399905ea4c69fb4a0c700a8741ff5eebc49
|
7
|
+
data.tar.gz: adcfbcd44d170c29896194a9458fc37907830c400aacb73a85f9e8bc651321ce221880507481b1b553128405562a4d29d634aaa4b45193495ed5ae76b9e717aa
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
-
# on 2014-11-
|
2
|
+
# on 2014-11-15 01:32:52 +0900 using RuboCop version 0.27.0.
|
3
3
|
# The point is for the user to remove these configuration records
|
4
4
|
# one by one as the offenses are removed from the code base.
|
5
5
|
# Note that changes in the inspected code, or installation of new
|
6
6
|
# versions of RuboCop, may require this file to be generated again.
|
7
7
|
|
8
|
-
# Offense count:
|
8
|
+
# Offense count: 1
|
9
|
+
Lint/HandleExceptions:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
# Offense count: 3
|
9
13
|
Metrics/AbcSize:
|
10
14
|
Max: 33
|
11
15
|
|
@@ -14,7 +18,11 @@ Metrics/AbcSize:
|
|
14
18
|
Metrics/MethodLength:
|
15
19
|
Max: 13
|
16
20
|
|
17
|
-
# Offense count:
|
21
|
+
# Offense count: 5
|
22
|
+
Style/AsciiIdentifiers:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
# Offense count: 1
|
18
26
|
Style/Documentation:
|
19
27
|
Enabled: false
|
20
28
|
|
@@ -23,7 +31,16 @@ Style/Documentation:
|
|
23
31
|
Style/GuardClause:
|
24
32
|
Enabled: false
|
25
33
|
|
34
|
+
# Offense count: 1
|
35
|
+
# Cop supports --auto-correct.
|
36
|
+
# Configuration parameters: Width.
|
37
|
+
Style/IndentationWidth:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
# Offense count: 1
|
41
|
+
Style/MultilineBlockChain:
|
42
|
+
Enabled: false
|
43
|
+
|
26
44
|
# Offense count: 2
|
27
45
|
Style/RegexpLiteral:
|
28
46
|
MaxSlashes: 0
|
29
|
-
|
data/.tachikoma.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
strategy: bundler
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# DivergenceMeter
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/divergence_meter)
|
3
4
|
[](https://travis-ci.org/sugamasao/divergence_meter)
|
5
|
+
[](https://codeclimate.com/github/sugamasao/divergence_meter)
|
6
|
+
[](https://codeclimate.com/github/sugamasao/divergence_meter)
|
7
|
+
[](http://inch-ci.org/github/sugamasao/divergence_meter)
|
4
8
|
|
5
|
-
DivergenceMeter is Levenshtein distance tool and Library.
|
9
|
+
DivergenceMeter is Levenshtein distance(レーベンシュタイン距離) tool and Library.
|
10
|
+
|
11
|
+
algorithm : http://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2
|
6
12
|
|
7
13
|
## Installation
|
8
14
|
|
@@ -37,8 +43,10 @@ $ divergence_meter retire hoge
|
|
37
43
|
|
38
44
|
did you mean?
|
39
45
|
|
46
|
+
`retare` is typo. `tire retire hoge` is dictionary words.
|
47
|
+
|
40
48
|
```sh
|
41
|
-
$ divergence_meter
|
49
|
+
$ divergence_meter retare tire retire hoge
|
42
50
|
retare
|
43
51
|
```
|
44
52
|
|
@@ -58,8 +66,8 @@ did you mean?
|
|
58
66
|
```ruby
|
59
67
|
require 'divergence_meter'
|
60
68
|
|
61
|
-
puts DivergenceMeter.did_you_mean('
|
62
|
-
# =>
|
69
|
+
puts DivergenceMeter.did_you_mean('retare', %w(tire retire hoge))
|
70
|
+
# => retire
|
63
71
|
```
|
64
72
|
|
65
73
|
## Contributing
|
data/Rakefile
CHANGED
data/divergence_meter.gemspec
CHANGED
@@ -23,4 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
24
24
|
spec.add_development_dependency 'simplecov', '~> 0.9'
|
25
25
|
spec.add_development_dependency 'rubocop', '~> 0.27'
|
26
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4'
|
27
|
+
spec.add_development_dependency 'yard', '~> 0.8'
|
26
28
|
end
|
data/lib/divergence_meter.rb
CHANGED
@@ -1,25 +1,23 @@
|
|
1
1
|
require 'divergence_meter/version'
|
2
2
|
require_relative 'divergence_meter/levenshtein_distance'
|
3
|
+
require_relative 'divergence_meter/did_you_mean'
|
3
4
|
require_relative 'divergence_meter/cli'
|
4
5
|
|
6
|
+
# DiveergenceMeter main module
|
5
7
|
module DivergenceMeter
|
6
8
|
class << self
|
9
|
+
# @param [String] word1 target1
|
10
|
+
# @param [String] word2 target2
|
11
|
+
# @return [Fixnum] Levenshtein Distance
|
7
12
|
def distance(word1, word2)
|
8
13
|
LevenshteinDistance.run(word1, word2)
|
9
14
|
end
|
10
15
|
|
16
|
+
# @param [String] target target
|
17
|
+
# @param [Array<String>] words check words
|
18
|
+
# @return [String] did you mean word
|
11
19
|
def did_you_mean(target, words)
|
12
|
-
|
13
|
-
|
14
|
-
Array(words).map { |word|
|
15
|
-
{ word: word, distance: distance(target, word) }
|
16
|
-
}.sort { |a, b|
|
17
|
-
if a[:distance] == b[:distance]
|
18
|
-
(size - a[:word].size).abs <=> (size - b[:word].size).abs
|
19
|
-
else
|
20
|
-
a[:distance] <=> b[:distance]
|
21
|
-
end
|
22
|
-
}.first[:word]
|
20
|
+
DidYouMean.new(target, words).run
|
23
21
|
end
|
24
22
|
|
25
23
|
alias_method :もしかして, :did_you_mean
|
data/lib/divergence_meter/cli.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
module DivergenceMeter
|
2
|
+
# CLI Option Parser
|
2
3
|
class CLI
|
4
|
+
# cli initialize
|
5
|
+
# @param [Array] argv ARGV
|
3
6
|
def initialize(argv)
|
4
7
|
@argv = argv
|
5
8
|
end
|
6
9
|
|
10
|
+
# parse argv
|
11
|
+
# @return [void]
|
7
12
|
def parse
|
8
13
|
if @argv.include?('-h') || @argv.include?('--help')
|
9
14
|
puts usage
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'levenshtein_distance'
|
2
|
+
|
3
|
+
module DivergenceMeter
|
4
|
+
# did you mean?
|
5
|
+
class DidYouMean
|
6
|
+
# initialize
|
7
|
+
# @param [String] target base word
|
8
|
+
# @param [Array] words check words
|
9
|
+
def initialize(target, words)
|
10
|
+
@target = target
|
11
|
+
@words = Array(words)
|
12
|
+
end
|
13
|
+
|
14
|
+
# calculate did you mean?
|
15
|
+
# @return [String] word
|
16
|
+
def run
|
17
|
+
target_size = @target.size
|
18
|
+
|
19
|
+
@words.map do |word|
|
20
|
+
{ word: word, distance: LevenshteinDistance.run(@target, word) }
|
21
|
+
end.sort do |a, b|
|
22
|
+
sort_distance(a, b, target_size)
|
23
|
+
end.first[:word]
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# sort by distance
|
29
|
+
# @param [Hash] a sort object a
|
30
|
+
# @param [Hash] b sort object b
|
31
|
+
# @param [Fixnum] target_size target word string size
|
32
|
+
# @return [Fixnum] sort point
|
33
|
+
def sort_distance(a, b, target_size)
|
34
|
+
a_distance = a[:distance]
|
35
|
+
b_distance = b[:distance]
|
36
|
+
|
37
|
+
if a_distance == b_distance
|
38
|
+
(target_size - a[:word].size).abs <=> (target_size - b[:word].size).abs
|
39
|
+
else
|
40
|
+
a_distance <=> b_distance
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,9 +1,18 @@
|
|
1
1
|
module DivergenceMeter
|
2
|
+
# algorithm for levenshtein distance class.
|
2
3
|
class LevenshteinDistance
|
4
|
+
# calculate levenshetein distance short cut method.
|
5
|
+
# @param [String] word1 word1
|
6
|
+
# @param [String] word2 word2
|
7
|
+
# @return [Fixnum] distance
|
3
8
|
def self.run(word1, word2)
|
4
9
|
new.run(word1, word2)
|
5
10
|
end
|
6
11
|
|
12
|
+
# calculate levenshetein distance
|
13
|
+
# @param [String] word1 word1
|
14
|
+
# @param [String] word2 word2
|
15
|
+
# @return [Fixnum] distance
|
7
16
|
def run(word1, word2)
|
8
17
|
list = create_list(word1.size, word2.size)
|
9
18
|
|
@@ -36,6 +45,10 @@ module DivergenceMeter
|
|
36
45
|
list
|
37
46
|
end
|
38
47
|
|
48
|
+
# levenshtein distance's cost
|
49
|
+
# @param [String] char1
|
50
|
+
# @param [String] char2
|
51
|
+
# @return [Fixnum] cost
|
39
52
|
def cost(char1, char2)
|
40
53
|
char1 == char2 ? 0 : 1
|
41
54
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'divergence_meter/cli'
|
3
|
+
|
4
|
+
describe DivergenceMeter::CLI do
|
5
|
+
before do
|
6
|
+
$stdout = File.open(File::NULL, 'w')
|
7
|
+
$stderr = File.open(File::NULL, 'w')
|
8
|
+
end
|
9
|
+
after do
|
10
|
+
$stdout.close unless $stdout.closed?
|
11
|
+
$stdout = STDOUT
|
12
|
+
$stderr.close unless $stderr.closed?
|
13
|
+
$stderr = STDERR
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#parse' do
|
17
|
+
it 'help' do
|
18
|
+
expect { DivergenceMeter::CLI.new(%w(-h)).parse }.to raise_error(SystemExit)
|
19
|
+
expect { DivergenceMeter::CLI.new(%w(--help)).parse }.to raise_error(SystemExit)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'version' do
|
23
|
+
expect { DivergenceMeter::CLI.new(%w(-v)).parse }.to raise_error(SystemExit)
|
24
|
+
expect { DivergenceMeter::CLI.new(%w(--version)).parse }.to raise_error(SystemExit)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'unknown arguments' do
|
28
|
+
expect { DivergenceMeter::CLI.new(%w(hoge)).parse }.to raise_error(SystemExit)
|
29
|
+
expect { DivergenceMeter::CLI.new(%w(--foo)).parse }.to raise_error(SystemExit)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'normal arguments' do
|
33
|
+
expect { DivergenceMeter::CLI.new(%w(hoge fuga)).parse }.not_to raise_error
|
34
|
+
expect { DivergenceMeter::CLI.new(%w(foo bar baz)).parse }.not_to raise_error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -6,7 +6,6 @@ describe DivergenceMeter do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
describe '.distance' do
|
9
|
-
|
10
9
|
it 'hoge vs hoga' do
|
11
10
|
expect(DivergenceMeter.distance('hoge', 'hoga')).to eq(1)
|
12
11
|
end
|
@@ -24,6 +23,9 @@ describe DivergenceMeter do
|
|
24
23
|
it '__send vs [__send__, send]' do
|
25
24
|
expect(DivergenceMeter.もしかして(':__send', methods)).to eq(:__send__)
|
26
25
|
end
|
26
|
+
it '__send vs [send, __send__](reverse)' do
|
27
|
+
expect(DivergenceMeter.もしかして(':__send', methods.reverse)).to eq(:__send__)
|
28
|
+
end
|
27
29
|
it 'tire, retire' do
|
28
30
|
expect(DivergenceMeter.もしかして('tire', %w(tire retire))).to eq('tire')
|
29
31
|
expect(DivergenceMeter.もしかして('rtire', %w(tire retire))).to eq('tire')
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: divergence_meter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sugamasao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.27'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: codeclimate-test-reporter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.4'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: yard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.8'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.8'
|
83
111
|
description: Levenshtein distance tool and Library. provide Levenshtein distance and
|
84
112
|
did you mean keyword.
|
85
113
|
email:
|
@@ -93,6 +121,7 @@ files:
|
|
93
121
|
- ".rspec"
|
94
122
|
- ".rubocop.yml"
|
95
123
|
- ".rubocop_todo.yml"
|
124
|
+
- ".tachikoma.yml"
|
96
125
|
- ".travis.yml"
|
97
126
|
- Gemfile
|
98
127
|
- LICENSE.txt
|
@@ -102,8 +131,10 @@ files:
|
|
102
131
|
- divergence_meter.gemspec
|
103
132
|
- lib/divergence_meter.rb
|
104
133
|
- lib/divergence_meter/cli.rb
|
134
|
+
- lib/divergence_meter/did_you_mean.rb
|
105
135
|
- lib/divergence_meter/levenshtein_distance.rb
|
106
136
|
- lib/divergence_meter/version.rb
|
137
|
+
- spec/divergence_meter/cli_spec.rb
|
107
138
|
- spec/divergence_meter_spec.rb
|
108
139
|
- spec/spec_helper.rb
|
109
140
|
homepage: https://github.com/sugamasao/divergence_meter
|
@@ -131,5 +162,7 @@ signing_key:
|
|
131
162
|
specification_version: 4
|
132
163
|
summary: Levenshtein distance tool and Library.
|
133
164
|
test_files:
|
165
|
+
- spec/divergence_meter/cli_spec.rb
|
134
166
|
- spec/divergence_meter_spec.rb
|
135
167
|
- spec/spec_helper.rb
|
168
|
+
has_rdoc:
|