keyboard_distance 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +58 -0
- data/Rakefile +10 -0
- data/keyboard_distance.gemspec +21 -0
- data/lib/keyboard_distance.rb +119 -0
- data/lib/keyboard_distance/keyboard_layout.rb +112 -0
- data/lib/keyboard_distance/version.rb +3 -0
- data/spec/keyboard_distance_spec.rb +118 -0
- data/spec/keyboard_layout_spec.rb +31 -0
- data/spec/spec_helper.rb +3 -0
- metadata +83 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 snukky
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# KeyboardDistance
|
2
|
+
|
3
|
+
Simple algorithm for measuring of distance-on-keyboard between two strings
|
4
|
+
for various keyboard layouts.
|
5
|
+
|
6
|
+
A diagonal distance between two keys equals the longer distance in a straight
|
7
|
+
line to the appropriate row/column, e.g.:
|
8
|
+
|
9
|
+
require 'keyboard_distance'
|
10
|
+
keyboard = KeyboardDistance.new
|
11
|
+
|
12
|
+
keyboard.character_distance('q', 'w') # => 1.0
|
13
|
+
keyboard.character_distance('q', 's') # => 1.0
|
14
|
+
keyboard.character_distance('q', 'd') # => 2.0
|
15
|
+
|
16
|
+
The similarity of the two strings is:
|
17
|
+
|
18
|
+
1.0 - (D / (L * M))
|
19
|
+
|
20
|
+
Where `D` is the distance between the two strings, L is the length of the
|
21
|
+
longer string, and M is the maximum key distance for given layout.
|
22
|
+
|
23
|
+
## Installation
|
24
|
+
|
25
|
+
Add this line to your application's Gemfile:
|
26
|
+
|
27
|
+
gem 'keyboard_distance'
|
28
|
+
|
29
|
+
And then execute:
|
30
|
+
|
31
|
+
$ bundle
|
32
|
+
|
33
|
+
Or install it yourself as:
|
34
|
+
|
35
|
+
$ gem install keyboard_distance
|
36
|
+
|
37
|
+
## Usage
|
38
|
+
|
39
|
+
Require the gem:
|
40
|
+
|
41
|
+
require 'keyboard_distance'
|
42
|
+
|
43
|
+
Basic usage:
|
44
|
+
|
45
|
+
keyboard = KeyboardDistance.new
|
46
|
+
keyboard.distance("foo", "boo") # => 1.0
|
47
|
+
keyboard.similarity("foo", "boo") # => 0.9770114942528736
|
48
|
+
|
49
|
+
keyboard.distance("foo", "Boo") # => 2.0
|
50
|
+
keyboard.similarity("foo", "Boo") # => 0.9540229885057472
|
51
|
+
|
52
|
+
Extra parameters:
|
53
|
+
|
54
|
+
keyboard = KeyboardDistance.new(:layout => :qwerty,
|
55
|
+
:national_keys => :polish,
|
56
|
+
:alt_distance => 0.5)
|
57
|
+
|
58
|
+
keyboard.distance("między", "miedzy") # => 0.5
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/keyboard_distance/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["snukky"]
|
6
|
+
gem.email = ["snk987@gmail.com"]
|
7
|
+
gem.description = %q{Simple algorithm for measuring of distance-on-keyboard
|
8
|
+
between two strings.}
|
9
|
+
gem.summary = %q{Distance-on-keyboard algorithm.}
|
10
|
+
gem.homepage = "https://github.com/snukky/keyboard_distance"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split($\)
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
+
gem.name = "keyboard_distance"
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.version = KeyboardDistance::VERSION
|
18
|
+
|
19
|
+
gem.add_development_dependency 'rake'
|
20
|
+
gem.add_development_dependency 'rspec', '>= 2.0.0'
|
21
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "keyboard_distance/version"
|
4
|
+
require "keyboard_distance/keyboard_layout"
|
5
|
+
|
6
|
+
class KeyboardDistance
|
7
|
+
|
8
|
+
attr_reader :max_distance
|
9
|
+
|
10
|
+
SHIFT_DISTANCE = 1.0
|
11
|
+
ALT_DISTANCE = 0.5
|
12
|
+
SPACE_DISTANCE = 2.0
|
13
|
+
UNKNOWN_CHAR_DISTANCE = 3.0
|
14
|
+
|
15
|
+
def initialize(options={})
|
16
|
+
@layout = options[:layout] || :qwerty
|
17
|
+
raise "Unknown layout :#{@layout}" unless KeyboardLayout.layout_defined?(@layout)
|
18
|
+
|
19
|
+
@national_keys = options[:national_keys] || :polish
|
20
|
+
raise "Unknown national keys #{@national_keys}" unless !@national_keys ||
|
21
|
+
KeyboardLayout.national_defined?(@national_keys)
|
22
|
+
|
23
|
+
@shift_distance = options[:shift_distance] || SHIFT_DISTANCE
|
24
|
+
@alt_distance = options[:alt_distance] || ALT_DISTANCE
|
25
|
+
@space_distance = options[:space_distance] || SPACE_DISTANCE
|
26
|
+
@unknown_char_distance = options[:unknown_char_distance] || UNKNOWN_CHAR_DISTANCE
|
27
|
+
|
28
|
+
@distances = calculate_distances
|
29
|
+
@max_distance = calculate_max_distance
|
30
|
+
|
31
|
+
@shift_map = KeyboardLayout.build_shifted_keys_map(@layout)
|
32
|
+
@alt_map = KeyboardLayout.build_alted_keys_map(@national_keys) if @national_keys
|
33
|
+
end
|
34
|
+
|
35
|
+
def similarity(word_1, word_2)
|
36
|
+
return nil unless word_1.size == word_2.size
|
37
|
+
|
38
|
+
max_word_length = [word_1.size, word_2.size].max
|
39
|
+
1.0 - distance(word_1, word_2) / (max_word_length * @max_distance)
|
40
|
+
end
|
41
|
+
|
42
|
+
def distance(word_1, word_2)
|
43
|
+
return nil unless word_1.size == word_2.size
|
44
|
+
return 0.0 if word_1 == word_2
|
45
|
+
|
46
|
+
dist = 0.0
|
47
|
+
word_1.each_char.with_index do |char_1, idx|
|
48
|
+
dist += character_distance(char_1, word_2[idx])
|
49
|
+
end
|
50
|
+
|
51
|
+
dist
|
52
|
+
end
|
53
|
+
|
54
|
+
def character_distance(char_1, char_2)
|
55
|
+
return 0.0 if char_1 == char_2
|
56
|
+
return @space_distance if char_1 == ' ' || char_2 == ' '
|
57
|
+
dist = 0.0
|
58
|
+
|
59
|
+
if @national_keys
|
60
|
+
key_1, key_2, difference = unalt_keys(char_1, char_2)
|
61
|
+
dist += @alt_distance if difference
|
62
|
+
end
|
63
|
+
|
64
|
+
key_1, key_2, difference = unshift_keys(key_1 || char_1, key_2 || char_2)
|
65
|
+
dist += @shift_distance if difference
|
66
|
+
|
67
|
+
return dist if key_1 == key_2
|
68
|
+
|
69
|
+
dist + (@distances[keys_signature(key_1, key_2)] || @unknown_char_distance)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def calculate_distances
|
75
|
+
distances = {}
|
76
|
+
|
77
|
+
KeyboardLayout.foreach_unique_key_pair(@layout) do |key_1, key_2, indexes|
|
78
|
+
keys = keys_signature(key_1, key_2)
|
79
|
+
next if distances.include?(keys)
|
80
|
+
|
81
|
+
distances[keys] = key_distance(*indexes)
|
82
|
+
end
|
83
|
+
|
84
|
+
distances
|
85
|
+
end
|
86
|
+
|
87
|
+
def key_distance(idx_11, idx_12, idx_21, idx_22)
|
88
|
+
[(idx_11 - idx_21).abs, (idx_12 - idx_22).abs].max
|
89
|
+
end
|
90
|
+
|
91
|
+
def keys_signature(key_1, key_2)
|
92
|
+
[key_1, key_2].sort.join
|
93
|
+
end
|
94
|
+
|
95
|
+
def unshift_keys(key_1, key_2)
|
96
|
+
unshifted_key_1 = @shift_map[key_1] || key_1
|
97
|
+
unshifted_key_2 = @shift_map[key_2] || key_2
|
98
|
+
|
99
|
+
difference = (unshifted_key_1 != key_1 && unshifted_key_2 == key_2) ||
|
100
|
+
(unshifted_key_1 == key_1 && unshifted_key_2 != key_2)
|
101
|
+
|
102
|
+
return [unshifted_key_1, unshifted_key_2, difference]
|
103
|
+
end
|
104
|
+
|
105
|
+
def unalt_keys(key_1, key_2)
|
106
|
+
unalted_key_1 = @alt_map[key_1] || key_1
|
107
|
+
unalted_key_2 = @alt_map[key_2] || key_2
|
108
|
+
|
109
|
+
difference = (unalted_key_1 != key_1 && unalted_key_2 == key_2) ||
|
110
|
+
(unalted_key_1 == key_1 && unalted_key_2 != key_2)
|
111
|
+
|
112
|
+
return [unalted_key_1, unalted_key_2, difference]
|
113
|
+
end
|
114
|
+
|
115
|
+
def calculate_max_distance
|
116
|
+
@distances.values.max + @alt_distance + @shift_distance
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class KeyboardLayout
|
4
|
+
|
5
|
+
LAYOUTS = {
|
6
|
+
:qwerty => {
|
7
|
+
:normal => ['`1234567890-=', ' qwertyuiop[]\\', " asdfghjkl;'", ' zxcvbnm,./'],
|
8
|
+
:shift => ['~!@#$%^&*()_+', ' QWERTYUIOP{}|', ' ASDFGHJKL:"', ' ZXCVBNM<>?']
|
9
|
+
},
|
10
|
+
:qwertz => {
|
11
|
+
:normal => ['`1234567890-=', ' qwertzuiop[]\\', " asdfghjkl;'", ' yxcvbnm,./'],
|
12
|
+
:shift => ['~!@#$%^&*()_+', ' QWERTZUIOP{}|', ' ASDFGHJKL:"', ' YXCVBNM<>?']
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
NATIONAL_KEYS = {
|
17
|
+
:polish => ["ąćęłńóśżźĄĆĘŁŃÓŚŻŹ", "acelnoszzACELNOSZZ"]
|
18
|
+
}
|
19
|
+
|
20
|
+
EMPTY_KEY = ' '
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def layout_defined?(layout)
|
24
|
+
LAYOUTS.keys.include?(layout)
|
25
|
+
end
|
26
|
+
|
27
|
+
def national_defined?(national)
|
28
|
+
NATIONAL_KEYS.keys.include?(national)
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_shifted_keys_map(layout)
|
32
|
+
keys = layout_as_array(layout, :normal).flatten
|
33
|
+
shifted_keys = layout_as_array(layout, :shift).flatten
|
34
|
+
|
35
|
+
raise "Different number of shifted and unshifted keys for layout" \
|
36
|
+
" :#{layout}" unless keys.size == shifted_keys.size
|
37
|
+
|
38
|
+
shift_map = {}
|
39
|
+
shifted_keys.each_with_index do |shifted_key, idx|
|
40
|
+
shift_map[shifted_key] = keys[idx]
|
41
|
+
end
|
42
|
+
|
43
|
+
shift_map
|
44
|
+
end
|
45
|
+
|
46
|
+
def build_alted_keys_map(national)
|
47
|
+
national_keys = NATIONAL_KEYS[national]
|
48
|
+
raise "Undefined national keys #{}" if national_keys.nil?
|
49
|
+
|
50
|
+
raise "Different number of national and ASCII keys for " \
|
51
|
+
" :#{national}" unless national_keys[0].size == national_keys[1].size
|
52
|
+
|
53
|
+
alt_map = {}
|
54
|
+
national_keys[0].split('').each_with_index do |char, idx|
|
55
|
+
alt_map[char] = national_keys[1][idx]
|
56
|
+
end
|
57
|
+
|
58
|
+
alt_map
|
59
|
+
end
|
60
|
+
|
61
|
+
def foreach_unique_key_pair(layout, &block)
|
62
|
+
keyboard = layout_as_array(layout, :normal)
|
63
|
+
|
64
|
+
keyboard.each_with_index do |row_1, idx_11|
|
65
|
+
row_1.each_with_index do |key_1, idx_12|
|
66
|
+
keyboard.each_with_index do |row_2, idx_21|
|
67
|
+
row_2.each_with_index do |key_2, idx_22|
|
68
|
+
next if key_1 == key_2 || key_1 == EMPTY_KEY || key_2 == EMPTY_KEY
|
69
|
+
yield key_1, key_2, [idx_11, idx_12, idx_21, idx_22]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def print_layout(layout, type=:normal)
|
77
|
+
keyboard = layout_as_array(layout, type)
|
78
|
+
max_row_size = keyboard.map(&:size).max
|
79
|
+
|
80
|
+
puts format_header(max_row_size), format_separator(max_row_size)
|
81
|
+
keyboard.each_with_index { |keys, idx| puts format_row(idx, keys) }
|
82
|
+
puts format_separator(max_row_size)
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def layout_as_array(layout, type=:normal)
|
88
|
+
raise "Undefined layout :#{layout}" unless layout_defined?(layout)
|
89
|
+
|
90
|
+
LAYOUTS[layout][type].map{ |line| line.split('') }
|
91
|
+
end
|
92
|
+
|
93
|
+
def format_header(length)
|
94
|
+
header = " |"
|
95
|
+
length.times{ |i| header << sprintf(" %-3d", i) }
|
96
|
+
header
|
97
|
+
end
|
98
|
+
|
99
|
+
def format_separator(length)
|
100
|
+
separator = " --+"
|
101
|
+
length.times{ |i| separator << "---+"}
|
102
|
+
separator
|
103
|
+
end
|
104
|
+
|
105
|
+
def format_row(idx, keys)
|
106
|
+
row = " #{idx} |"
|
107
|
+
keys.each{ |k| row << " #{k} |" }
|
108
|
+
row
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe KeyboardDistance do
|
6
|
+
before :all do
|
7
|
+
@keyboard = KeyboardDistance.new(:layout => :qwerty,
|
8
|
+
:national_keys => :polish,
|
9
|
+
:shift_distance => 1,
|
10
|
+
:alt_distance => 0.5,
|
11
|
+
:space_distance => 2,
|
12
|
+
:unknown_char_distance => 1)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "character_distance" do
|
16
|
+
it "should return zero for equal characters" do
|
17
|
+
@keyboard.character_distance('a', 'a').should eql 0.0
|
18
|
+
@keyboard.character_distance('A', 'A').should eql 0.0
|
19
|
+
@keyboard.character_distance('ą', 'ą').should eql 0.0
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should measure distances in a straight line" do
|
23
|
+
@keyboard.character_distance('a', 's').should eql 1.0
|
24
|
+
@keyboard.character_distance('a', 'l').should eql 8.0
|
25
|
+
@keyboard.character_distance('a', 'z').should eql 1.0
|
26
|
+
@keyboard.character_distance('a', '1').should eql 2.0
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should measure diagonally distances" do
|
30
|
+
@keyboard.character_distance('s', 'q').should eql 1.0
|
31
|
+
@keyboard.character_distance('s', 'e').should eql 1.0
|
32
|
+
@keyboard.character_distance('s', 'c').should eql 1.0
|
33
|
+
@keyboard.character_distance('s', 'z').should eql 1.0
|
34
|
+
|
35
|
+
@keyboard.character_distance('q', 'd').should eql 2.0
|
36
|
+
@keyboard.character_distance('q', '3').should eql 2.0
|
37
|
+
|
38
|
+
@keyboard.character_distance('q', 'p').should eql 9.0
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should increase distance when shift is pressed" do
|
42
|
+
@keyboard.character_distance('a', 'z').should be <
|
43
|
+
@keyboard.character_distance('A', 'z')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return the same distance when shift is pressed twice" do
|
47
|
+
@keyboard.character_distance('a', 'y').should eql \
|
48
|
+
@keyboard.character_distance('A', 'Y')
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should increase distance when alt is pressed" do
|
52
|
+
@keyboard.character_distance('a', 'z').should be <
|
53
|
+
@keyboard.character_distance('ą', 'z')
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return the same distance when alt is pressed twice" do
|
57
|
+
@keyboard.character_distance('a', 'z').should eql \
|
58
|
+
@keyboard.character_distance('ą', 'ż')
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should work with a space character" do
|
62
|
+
expect{ @keyboard.character_distance('a', ' ') }.not_to raise_error
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should work with unknown character" do
|
66
|
+
expect{ @keyboard.character_distance('a', '¶') }.not_to raise_error
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "distance" do
|
71
|
+
it "should return zero for equals words" do
|
72
|
+
@keyboard.distance("foo", "foo").should eql 0.0
|
73
|
+
@keyboard.distance("FOO", "FOO").should eql 0.0
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should measure distance as the sum of character distances" do
|
77
|
+
word_1 = "foo"
|
78
|
+
word_2 = "bar"
|
79
|
+
|
80
|
+
sum_of_char_distances = 0.0
|
81
|
+
word_1.each_char.with_index do |char, idx|
|
82
|
+
sum_of_char_distances += @keyboard.character_distance(char, word_2[idx])
|
83
|
+
end
|
84
|
+
|
85
|
+
@keyboard.distance(word_1, word_2).should eql sum_of_char_distances
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should measure simple distances" do
|
89
|
+
@keyboard.distance("asd", "sdf").should eql 3.0
|
90
|
+
@keyboard.distance("1qaz", "2wsx").should eql 4.0
|
91
|
+
@keyboard.distance("qsc", "wdv").should eql 3.0
|
92
|
+
|
93
|
+
@keyboard.distance("foo", "Foo").should eql 1.0
|
94
|
+
@keyboard.distance("laka", "łąka").should eql 1.0
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should work with different length strings" do
|
98
|
+
expect{ @keyboard.distance("foo", "bar baz") }.not_to raise_error
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "similarity" do
|
103
|
+
it "should give 1 for the same strings" do
|
104
|
+
@keyboard.similarity("foo", "foo").should eql 1.0
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should work for simple strings" do
|
108
|
+
expected_value = (1 - 1 / (3 * @keyboard.max_distance))
|
109
|
+
@keyboard.similarity("foo", "boo").should eql expected_value
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should decrease similarity for longer string" do
|
113
|
+
@keyboard.similarity("foo", "boo").should be <
|
114
|
+
@keyboard.similarity("foooooo", "boooooo")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe KeyboardLayout do
|
6
|
+
before :all do
|
7
|
+
@layout = KeyboardLayout::LAYOUTS.keys.first
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "build_shifted_keys_map" do
|
11
|
+
it "should return a Hash object" do
|
12
|
+
KeyboardLayout.build_shifted_keys_map(@layout).should be_kind_of Hash
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have capital characters as keys" do
|
16
|
+
KeyboardLayout.build_shifted_keys_map(@layout).keys
|
17
|
+
.all?{ |big| big.upcase == big }.should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should have small characters as keys" do
|
21
|
+
KeyboardLayout.build_shifted_keys_map(@layout).values
|
22
|
+
.all?{ |small| small.downcase == small }.should be_true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "layout_defined?" do
|
27
|
+
it "should raise error when access to undefined layout" do
|
28
|
+
expect{ KeyboardLayout.print_layout(:unexisted_layout) }.to raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: keyboard_distance
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- snukky
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &69387850 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *69387850
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &69387230 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *69387230
|
36
|
+
description: ! "Simple algorithm for measuring of distance-on-keyboard \n between
|
37
|
+
two strings."
|
38
|
+
email:
|
39
|
+
- snk987@gmail.com
|
40
|
+
executables: []
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- Gemfile
|
46
|
+
- LICENSE
|
47
|
+
- README.md
|
48
|
+
- Rakefile
|
49
|
+
- keyboard_distance.gemspec
|
50
|
+
- lib/keyboard_distance.rb
|
51
|
+
- lib/keyboard_distance/keyboard_layout.rb
|
52
|
+
- lib/keyboard_distance/version.rb
|
53
|
+
- spec/keyboard_distance_spec.rb
|
54
|
+
- spec/keyboard_layout_spec.rb
|
55
|
+
- spec/spec_helper.rb
|
56
|
+
homepage: https://github.com/snukky/keyboard_distance
|
57
|
+
licenses: []
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.8.10
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Distance-on-keyboard algorithm.
|
80
|
+
test_files:
|
81
|
+
- spec/keyboard_distance_spec.rb
|
82
|
+
- spec/keyboard_layout_spec.rb
|
83
|
+
- spec/spec_helper.rb
|