tty 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tty.rb CHANGED
@@ -37,13 +37,13 @@ require 'tty/terminal/home'
37
37
 
38
38
  require 'tty/system/which'
39
39
 
40
- require 'tty/text/wrapping'
40
+ require 'tty/text/distance'
41
41
  require 'tty/text/truncation'
42
+ require 'tty/text/wrapping'
42
43
 
43
- require 'tty/table/field'
44
44
  require 'tty/table/header'
45
45
  require 'tty/table/row'
46
- require 'tty/table/options'
46
+ require 'tty/table/field'
47
47
 
48
48
  require 'tty/table/border'
49
49
  require 'tty/table/border_dsl'
data/lib/tty/shell.rb CHANGED
@@ -135,6 +135,19 @@ module TTY
135
135
  args.each { |message| say message, options.merge(:color => :red) }
136
136
  end
137
137
 
138
+ def suggest(message, possibilities)
139
+ distances = Hash.new { |hash, key| hash[key] = [] }
140
+
141
+ possibilities.each do |possibility|
142
+ distances[Text.distance(message, possibility)] << possibility
143
+ end
144
+
145
+ minimum_distance = distances.keys.min
146
+ if minimum_distance < 4
147
+ else
148
+ end
149
+ end
150
+
138
151
  # Print a table to shell.
139
152
  #
140
153
  # @return [undefined]
@@ -130,7 +130,7 @@ module TTY
130
130
  #
131
131
  # @api public
132
132
  def eql?(other)
133
- instance_of?(other.class) and compare?(__method__, other)
133
+ instance_of?(other.class) && compare?(__method__, other)
134
134
  end
135
135
 
136
136
  # Compare two objects for equality based on their value
@@ -143,11 +143,7 @@ module TTY
143
143
  #
144
144
  # @api public
145
145
  def ==(other)
146
- print '== '
147
- p self
148
- p other
149
- return false unless self.class <=> other.class
150
- compare?(__method__, other)
146
+ kind_of?(other.class) && compare?(__method__, other)
151
147
  end
152
148
 
153
149
  end # Methods
data/lib/tty/text.rb CHANGED
@@ -15,6 +15,22 @@ module TTY
15
15
  def split_mode
16
16
  end
17
17
 
18
+ # Calculate the distance between strings
19
+ #
20
+ # @param [String] first
21
+ # the first string for comparison
22
+ #
23
+ # @param [String] second
24
+ # the second string for comparison
25
+ #
26
+ # @example
27
+ # distance("which", "witch")
28
+ # # => 2
29
+ #
30
+ def self.distance(first, second, *args)
31
+ Distance.new(first, second, *args).distance
32
+ end
33
+
18
34
  # Wrap a text into lines no longer than provided length
19
35
  #
20
36
  # @param [String] text
@@ -0,0 +1,73 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module TTY
4
+ class Text
5
+
6
+ # A class responsible for string comparison
7
+ class Distance
8
+ include Unicode
9
+
10
+ attr_reader :first
11
+
12
+ attr_reader :second
13
+
14
+ # Initalize a Distance
15
+ #
16
+ # @param [String] first
17
+ # the first string for comparision
18
+ #
19
+ # @param [String] second
20
+ # the second string for comparison
21
+ #
22
+ # @api private
23
+ def initialize(first, second, *args)
24
+ options = Utils.extract_options!(args)
25
+ @first = first.to_s
26
+ @second = second.to_s
27
+ # TODO: add option to ignore case
28
+ end
29
+
30
+ # Calculate the optimal string alignment distance
31
+ #
32
+ # @api private
33
+ def distance
34
+ distances = []
35
+ rows = first.length
36
+ cols = second.length
37
+
38
+ 0.upto(rows) do |index|
39
+ distances << [index] + [0] * cols
40
+ end
41
+ distances[0] = 0.upto(cols).to_a
42
+
43
+ 1.upto(rows) do |first_index|
44
+ 1.upto(cols) do |second_index|
45
+ first_char = first[first_index - 1]
46
+ second_char = second[second_index - 1]
47
+ cost = first_char == second_char ? 0 : 1
48
+
49
+ distances[first_index][second_index] = [
50
+ distances[first_index - 1][second_index], # deletion
51
+ distances[first_index][second_index - 1], # insertion
52
+ distances[first_index - 1][second_index - 1] # substitution
53
+ ].min + cost
54
+
55
+ if first_index > 1 && second_index > 1
56
+ first_previous_char = first[first_index - 2]
57
+ second_previous_char = second[second_index - 2]
58
+ if first_char == second_previous_char && second_char == first_previous_char
59
+ distances[first_index][second_index] = [
60
+ distances[first_index][second_index],
61
+ distances[first_index - 2][second_index - 2] + 1 # transposition
62
+ ].min
63
+ end
64
+ end
65
+
66
+ end
67
+ end
68
+ distances[rows][cols]
69
+ end
70
+
71
+ end # Distance
72
+ end # Text
73
+ end # TTY
data/lib/tty/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module TTY
4
- VERSION = "0.0.8"
4
+ VERSION = "0.0.9"
5
5
  end
@@ -31,10 +31,10 @@ describe TTY::Table::Field, '#==' do
31
31
  context 'with an equivalent object of subclass' do
32
32
  let(:other) { Class.new(described_class).new(value) }
33
33
 
34
- it { should be_true }
34
+ it { should be_false }
35
35
 
36
36
  it 'is symmetric' do
37
- should eql(other == object)
37
+ should_not eql(other == object)
38
38
  end
39
39
  end
40
40
 
@@ -55,28 +55,6 @@ describe TTY::Table, 'with separator' do
55
55
  +--+--+--+
56
56
  EOS
57
57
  end
58
-
59
- context 'with specific separator' do
60
- let(:header) { ['h1', 'h2'] }
61
- let(:rows) { [['a1', 'a2'], ['b1', 'b2'], ['c1', 'c2']] }
62
-
63
- it 'custom separator' do
64
- pending
65
- table.border.separator= [2]
66
- table.to_s.should == <<-EOS.normalize
67
- +--+--+
68
- |h1|h2|
69
- +--+--+
70
- |a1|a2|
71
- |b1|b2|
72
- +--+--+
73
- |c1|c2|
74
- +--+--+
75
- EOS
76
- end
77
-
78
- end
79
-
80
58
  end
81
59
 
82
60
  context 'when unicode' do
@@ -0,0 +1,63 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Text::Distance, '#distance' do
6
+ let(:object) { described_class.new(*strings) }
7
+
8
+ subject { object.distance }
9
+
10
+ context 'when nil' do
11
+ let(:strings) { [nil, nil] }
12
+
13
+ it { should eql(0) }
14
+ end
15
+
16
+ context 'when empty' do
17
+ let(:strings) { ['', ''] }
18
+
19
+ it { should eql(0) }
20
+ end
21
+
22
+ context 'with one non empty' do
23
+ let(:strings) { ['abc', ''] }
24
+
25
+ it { should eql(3) }
26
+ end
27
+
28
+ context 'when similar' do
29
+ let(:strings) { ['abc', 'abc'] }
30
+
31
+ it { should eql(0) }
32
+ end
33
+
34
+ context 'when similar' do
35
+ let(:strings) { ['abc', 'acb'] }
36
+
37
+ it { should eql(1) }
38
+ end
39
+
40
+ context 'when end similar' do
41
+ let(:strings) { ['saturday', 'sunday'] }
42
+
43
+ it { should eql(3) }
44
+ end
45
+
46
+ context 'when contain similar' do
47
+ let(:strings) { ['which', 'witch'] }
48
+
49
+ it { should eql(2) }
50
+ end
51
+
52
+ context 'when similar' do
53
+ let(:strings) { ['smellyfish','jellyfish'] }
54
+
55
+ it { should eql(2) }
56
+ end
57
+
58
+ context 'when unicode' do
59
+ let(:strings) { ['マラソン五輪代表', 'ララソン五輪代表'] }
60
+
61
+ it { should eql(1) }
62
+ end
63
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Text::Distance, '#initialize' do
6
+ let(:strings) { ['abc', 'acb'] }
7
+
8
+ subject { described_class.new(*strings) }
9
+
10
+ its(:first) { should == strings.first }
11
+
12
+ its(:second) { should == strings.last }
13
+
14
+ end # initialize
@@ -0,0 +1,11 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TTY::Text, '#distance' do
6
+ let(:strings) { ['witch', 'which'] }
7
+
8
+ subject { described_class.distance(*strings) }
9
+
10
+ it { should == 2 }
11
+ end # distance
@@ -3,12 +3,12 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe TTY::Text::Truncation, '#truncate' do
6
- let(:instance) { described_class.new }
6
+ let(:object) { described_class.new(text, options) }
7
7
  let(:separator) { nil }
8
8
  let(:trailing) { '…' }
9
9
  let(:options) { { :length => length, :separator => separator, :trailing => trailing } }
10
10
 
11
- subject { described_class.new(text, options).truncate }
11
+ subject { object.truncate }
12
12
 
13
13
  context 'unicode support' do
14
14
  let(:text) { 'ラドクリフ、マラソン五輪代表に1万m出場にも含み' }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-05 00:00:00.000000000 Z
12
+ date: 2013-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2152273080 !ruby/object:Gem::Requirement
16
+ requirement: &2156006680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2152273080
24
+ version_requirements: *2156006680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &2152272300 !ruby/object:Gem::Requirement
27
+ requirement: &2156005760 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152272300
35
+ version_requirements: *2156005760
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &2152271820 !ruby/object:Gem::Requirement
38
+ requirement: &2156004720 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152271820
46
+ version_requirements: *2156004720
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: benchmark_suite
49
- requirement: &2152269160 !ruby/object:Gem::Requirement
49
+ requirement: &2156003760 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152269160
57
+ version_requirements: *2156003760
58
58
  description: Toolbox for developing CLI clients
59
59
  email:
60
60
  - ''
@@ -127,6 +127,7 @@ files:
127
127
  - lib/tty/terminal/echo.rb
128
128
  - lib/tty/terminal/home.rb
129
129
  - lib/tty/text.rb
130
+ - lib/tty/text/distance.rb
130
131
  - lib/tty/text/truncation.rb
131
132
  - lib/tty/text/wrapping.rb
132
133
  - lib/tty/vector.rb
@@ -238,6 +239,9 @@ files:
238
239
  - spec/tty/terminal/echo_spec.rb
239
240
  - spec/tty/terminal/home_spec.rb
240
241
  - spec/tty/terminal/size_spec.rb
242
+ - spec/tty/text/distance/distance_spec.rb
243
+ - spec/tty/text/distance/initialize_spec.rb
244
+ - spec/tty/text/distance_spec.rb
241
245
  - spec/tty/text/truncate_spec.rb
242
246
  - spec/tty/text/truncation/initialize_spec.rb
243
247
  - spec/tty/text/truncation/truncate_spec.rb
@@ -381,6 +385,9 @@ test_files:
381
385
  - spec/tty/terminal/echo_spec.rb
382
386
  - spec/tty/terminal/home_spec.rb
383
387
  - spec/tty/terminal/size_spec.rb
388
+ - spec/tty/text/distance/distance_spec.rb
389
+ - spec/tty/text/distance/initialize_spec.rb
390
+ - spec/tty/text/distance_spec.rb
384
391
  - spec/tty/text/truncate_spec.rb
385
392
  - spec/tty/text/truncation/initialize_spec.rb
386
393
  - spec/tty/text/truncation/truncate_spec.rb