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 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: