divergence_meter 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11401d367f7f29f91db7ec7b2a96629558f66b3e
4
- data.tar.gz: 7e9c6d0a2dd47883133ad9656ce475026e85ff76
3
+ metadata.gz: b90019f6be0496d440450b1b72f805f51ef5d53a
4
+ data.tar.gz: 5f6e89452d90476fe2d0714864901ccd9252eebb
5
5
  SHA512:
6
- metadata.gz: e8e3400eb78ef692b6b69d12d38f1260507103a4ba2e7f0afe094eeac2cd061028dd87e869ce66cf37795b54240497ab6a773406eea0d6e08c56177ded3e04d3
7
- data.tar.gz: f2051a1fae07242df719f07dff08445001c4f7841b93b42ef20f9b97a13432c97ddcbf058428836b05383d83af8e59544e89fe94461c56cfbe9a3a4fd9ff7529
6
+ metadata.gz: 28f6fed4c20954814e6ab9ac3ff9b3ece4dcdf335e98aee1a3d61f2d71d6ada22ea1d0bd8bd0b9de2387d93ac540b399905ea4c69fb4a0c700a8741ff5eebc49
7
+ data.tar.gz: adcfbcd44d170c29896194a9458fc37907830c400aacb73a85f9e8bc651321ce221880507481b1b553128405562a4d29d634aaa4b45193495ed5ae76b9e717aa
data/.rubocop.yml CHANGED
@@ -1 +1,4 @@
1
1
  inherit_from: .rubocop_todo.yml
2
+
3
+ Metrics/LineLength:
4
+ Max: 120
data/.rubocop_todo.yml CHANGED
@@ -1,11 +1,15 @@
1
1
  # This configuration was generated by `rubocop --auto-gen-config`
2
- # on 2014-11-09 22:14:15 +0900 using RuboCop version 0.27.0.
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: 2
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: 4
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
@@ -3,3 +3,4 @@ rvm:
3
3
  - 2.0
4
4
  - 2.1
5
5
  - 2.2
6
+ script: CODECLIMATE_REPO_TOKEN=2fa45e86ab64ac5f1e439f0af829c54e5776886e883b3ddbec5996ab3870fee3 bundle exec rake
data/README.md CHANGED
@@ -1,8 +1,14 @@
1
1
  # DivergenceMeter
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/divergence_meter.svg)](http://badge.fury.io/rb/divergence_meter)
3
4
  [![Build Status](https://travis-ci.org/sugamasao/divergence_meter.svg)](https://travis-ci.org/sugamasao/divergence_meter)
5
+ [![Code Climate](https://codeclimate.com/github/sugamasao/divergence_meter/badges/gpa.svg)](https://codeclimate.com/github/sugamasao/divergence_meter)
6
+ [![Test Coverage](https://codeclimate.com/github/sugamasao/divergence_meter/badges/coverage.svg)](https://codeclimate.com/github/sugamasao/divergence_meter)
7
+ [![Inline docs](http://inch-ci.org/github/sugamasao/divergence_meter.svg?branch=master)](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 retire tire retare hoge
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('retire', %w(tire retare hoge))
62
- # => hog1
69
+ puts DivergenceMeter.did_you_mean('retare', %w(tire retire hoge))
70
+ # => retire
63
71
  ```
64
72
 
65
73
  ## Contributing
data/Rakefile CHANGED
@@ -4,3 +4,8 @@ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task default: :spec
7
+ begin
8
+ require 'yard'
9
+ YARD::Rake::YardocTask.new
10
+ rescue LoadError
11
+ end
@@ -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
@@ -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
- size = target.size
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
@@ -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
@@ -1,3 +1,4 @@
1
1
  module DivergenceMeter
2
- VERSION = '1.0.0'
2
+ # version
3
+ VERSION = '1.0.1'
3
4
  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
@@ -1,4 +1,7 @@
1
1
  require 'simplecov'
2
+ require 'codeclimate-test-reporter'
2
3
  SimpleCov.start
4
+ CodeClimate::TestReporter.start
5
+
3
6
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
7
  require 'divergence_meter'
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.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 00:00:00.000000000 Z
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: