alias_metrics 0.1 → 0.1.2

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.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  tmp
2
2
  *.gem
3
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,8 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- group :development do
4
- gem 'rspec', '~> 2.0'
5
- gem 'fuubar', "~> 1.0.0"
6
- gem "rake", "~> 0.9.2.2"
7
- end
3
+ gemspec
8
4
 
data/README CHANGED
@@ -1,14 +1,21 @@
1
1
  This tool is to visualize alias usage to parse command history. You can evaluate whether you use alias efficiently or not.
2
2
  * It can show reduced types and more redusable types
3
3
  * It can show how degree you use each alias
4
+ * It can show candidate alias_commands
4
5
 
5
6
  The visabliable shell scripts is the followings:
6
7
  * zsh (${HOME}/.zsh-history)
7
8
 
8
9
 
10
+ Install:
11
+
12
+ gem install alias_metrics
13
+
14
+
9
15
  How to use:
10
16
 
11
17
  $ alias | alias_metrics
18
+ $ alias | alias_candidates
12
19
 
13
20
 
14
21
  Case Study:
@@ -36,13 +43,27 @@ If you use alias all, you can reduce more 3.98% types (11575 / 290970)
36
43
 
37
44
  ...
38
45
  <<
39
- I regist alias g=`git`, but I often forgot to use this alias. This result show I typed "git" 1530 times. So I can reduce 1530 * 2 = 3060 types by typing "g" instead of "git".
46
+ I regist alias g=`git`, but I often forgot to use this alias. This result show I typed "git" 1530 times. So I can reduce 1530 * (3-1) = 3060 types by typing "g" instead of "git".
40
47
 
48
+ $ alias | alias_candidates
49
+ >>
50
+ types count command => shorten command
51
+ 6510 651 git status => "g status","gst"
52
+ 5979 1993 git => "g"
53
+ 4860 972 ls -G => "ls -G"
54
+ 3627 1209 vim => no alias
55
+ 2912 182 bundle exec rake => "be rake"
56
+ 2900 290 git commit => "g commit"
57
+ 2695 245 bundle exec => "be"
58
+ 2544 159 git flow feature => "g flow feature"
59
+ 2268 324 git add => "g add","ga"
60
+ ...
61
+ <<
62
+ I often use "vim" command. But "vim" command has no alias. If I regsit alias v=`vim`, I can reduce 1209 * (3-1) = 2418 types by typing "v" instead of "vim".
41
63
 
42
64
  Todo:
43
65
 
44
66
  * It can parse other shell scrpt(bash, csh, etc...)
45
- * Add the function that recommends alias that can reduce your types by setting it
46
67
  * Add the function that show Gold Standard
47
68
  * Acceleration
48
69
 
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'alias_metrics'
3
- spec.version = '0.1'
3
+ spec.version = '0.1.2'
4
4
  spec.summary = "This tool is to visualize alias usage to parse command history. You can evaluate whether you use alias efficiently or not."
5
5
  spec.author = ["Kohei Tomita"]
6
6
  spec.email = "tommy.fmale@gmail.com"
7
- spec.executables = %w(alias_metrics)
7
+ spec.executables = %w(alias_metrics alias_candidates)
8
8
  spec.files = `git ls-files`.split("\n") rescue ''
9
9
  spec.homepage = "https://github.com/tomity/alias_metrics"
10
10
  spec.add_development_dependency 'rspec', '~> 2.0'
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.dirname(__FILE__) + '/../lib/'
3
+ $:.unshift lib unless $:.include?(lib)
4
+ require "alias_metrics"
5
+ include AliasMetrics
6
+
7
+ @alias_list = AliasList.load_from_stdin
8
+ @history = CommandHistory.load_from_zsh_history(@alias_list)
9
+ fragments = @history.fragment.values.select{|a| a.count >= 5}
10
+ max_fragment_size = fragments.map{|a| a.body.size }.max
11
+ puts "types\tcount\tcommand#{" " * (max_fragment_size - "command".size)} => shorten command"
12
+ fragments.sort{|a, b| a.types <=> b.types }.reverse.each do |value|
13
+ if @alias_list.shortenable?(value.body)
14
+ puts "#{value.types}\t#{value.count}\t#{value.body + " " * (max_fragment_size - value.body.size)} => #{@alias_list.shorten_command(value.body).map{|h| "\"#{h}\""}.join(",")}"
15
+ else
16
+ puts "#{value.types}\t#{value.count}\t#{value.body + " " * (max_fragment_size - value.body.size)} => no alias"
17
+ end
18
+ end
19
+
@@ -2,6 +2,7 @@
2
2
  lib = File.dirname(__FILE__) + '/../lib/'
3
3
  $:.unshift lib unless $:.include?(lib)
4
4
  require "alias_metrics"
5
+ include AliasMetrics
5
6
 
6
7
  @alias_list = AliasList.load_from_stdin
7
8
  @history = CommandHistory.load_from_zsh_history(@alias_list)
@@ -2,3 +2,5 @@ require "alias_metrics/alias_list.rb"
2
2
  require "alias_metrics/alias_usage.rb"
3
3
  require "alias_metrics/command_history.rb"
4
4
  require "alias_metrics/shortenable.rb"
5
+ require "alias_metrics/fragment.rb"
6
+ require "alias_metrics/alias_line_parser/zsh.rb"
@@ -0,0 +1,16 @@
1
+ module AliasLineParser
2
+ class Zsh
3
+ def parse(line)
4
+ key, value = line.split(/=/)
5
+ value = remove_single_quotes(value)
6
+ [key, value]
7
+ end
8
+
9
+ def remove_single_quotes(real)
10
+ if real[0, 1] == "'" and real[-1, 1] == "'"
11
+ real = real[1..-2]
12
+ end
13
+ real
14
+ end
15
+ end
16
+ end
@@ -1,88 +1,94 @@
1
- class AliasList
2
- attr_accessor :alias_hash
1
+ module AliasMetrics
2
+ class AliasList
3
+ attr_accessor :alias_hash
3
4
 
4
- def self.load_from_lines(lines)
5
- alias_hash = Hash::new
6
- lines.each do |line|
7
- key, value = separate_key_value_from_alias_line(line)
8
- alias_hash[key] = value
9
- end
10
- AliasList.new(alias_hash)
11
- end
5
+ class << AliasList
6
+ def load(io, alias_line_parser)
7
+ alias_hash = Hash::new
8
+ io.each do |line|
9
+ line.chomp!
10
+ alias_, real = alias_line_parser.parse(line)
11
+ alias_hash[alias_] = real
12
+ end
13
+ AliasList.new(alias_hash)
14
+ end
12
15
 
13
- def self.load_from_stdin
14
- alias_hash = Hash::new
15
- STDIN.each do |line|
16
- line.chomp!
17
- key, value = separate_key_value_from_alias_line(line)
18
- alias_hash[key] = value
19
- end
20
- AliasList.new(alias_hash)
21
- end
16
+ def load_from_lines(lines, alias_line_parser=AliasLineParser::Zsh.new)
17
+ alias_hash = Hash::new
18
+ lines.each do |line|
19
+ alias_, real = alias_line_parser.parse(line)
20
+ alias_hash[alias_] = real
21
+ end
22
+ AliasList.new(alias_hash)
23
+ end
22
24
 
23
- #NOTE: Since #command >> #alias, this process do fastly
24
- def expand_command(command)
25
- @alias_hash.each_pair do |key, value|
26
- if used_subcommand?(command, key)
27
- command = command.sub(key, value)
28
- end
29
- end
30
- command
31
- end
25
+ def load_from_stdin(alias_line_parser=AliasLineParser::Zsh.new)
26
+ AliasList.load(STDIN, alias_line_parser)
27
+ end
32
28
 
33
- #NOTE: Since #command >> #alias, this process do fastly
34
- def applied_alias(command)
35
- ret = []
36
- @alias_hash.each_pair do |key, value|
37
- if used_subcommand?(command, key)
38
- command = command.sub(key, value)
39
- ret << [key, value]
40
- end
41
- end
42
- ret
43
- end
29
+ def load_from_file(file, alias_line_parser=AliasLineParser::Zsh.new)
30
+ open(file) do |fh|
31
+ AliasList.load(fh, alias_line_parser)
32
+ end
33
+ end
44
34
 
45
- #NOTE: Since #command >> #alias, this process do fastly
46
- def shortenable?(command)
47
- @alias_hash.values.each do |value|
48
- if used_subcommand?(command, value)
49
- return true
35
+ end
36
+
37
+ #NOTE: Since #command >> #alias, this process do fastly
38
+ def expand_command(command)
39
+ @alias_hash.each_pair do |alias_, real|
40
+ if used_subcommand?(command, alias_)
41
+ command = command.sub(alias_, real)
42
+ end
50
43
  end
44
+ command
51
45
  end
52
- false
53
- end
54
46
 
55
- def shortenable_alias(command)
56
- ret = []
57
- @alias_hash.each_pair do |key, value|
58
- if used_subcommand?(command, value)
59
- ret << [key, value]
60
- end
61
- end
62
- ret
63
- end
47
+ def appliable_alias(command)
48
+ alias_ = command.split(/\s/).first
49
+ @alias_hash.has_key?(alias_) ? alias_ : nil
50
+ end
64
51
 
65
- private
52
+ #NOTE: Since #command >> #alias, this process do fastly
53
+ def shortenable?(command)
54
+ @alias_hash.each_pair do |alias_, real|
55
+ if used_subcommand?(command, real)
56
+ return true if real.length > alias_.length
57
+ end
58
+ end
59
+ false
60
+ end
66
61
 
67
- def initialize(alias_hash)
68
- @alias_hash = alias_hash.freeze
69
- end
62
+ def shortenable_alias(command)
63
+ ret = []
64
+ @alias_hash.each_pair do |alias_, real|
65
+ if used_subcommand?(command, real)
66
+ ret << alias_ if real.length > alias_.length
67
+ end
68
+ end
69
+ ret
70
+ end
70
71
 
71
- def self.separate_key_value_from_alias_line(line)
72
- key, value = line.split(/=/)
73
- value = remove_single_quotes(value)
74
- [key, value]
75
- end
72
+ def shorten_command(command)
73
+ expanded = expand_command(command)
74
+ ret = Array.new
75
+ @alias_hash.each_pair do |alias_, real|
76
+ if used_subcommand?(expanded, real)
77
+ ret << expanded.sub(real, alias_) if real.length > alias_.length
78
+ end
79
+ end
80
+ ret
81
+ end
76
82
 
77
- def self.remove_single_quotes(value)
78
- if value[0, 1] == "'" and value[-1, 1] == "'"
79
- value = value[1..-2]
83
+ private
84
+
85
+ def initialize(alias_hash)
86
+ @alias_hash = alias_hash.freeze
80
87
  end
81
- value
82
- end
83
88
 
84
- def used_subcommand?(command, alias_)
85
- command == alias_ || command.start_with?(alias_+ " ")
89
+ def used_subcommand?(command, alias_)
90
+ command == alias_ || command.start_with?(alias_+ " ")
91
+ end
86
92
  end
87
93
  end
88
94
 
@@ -1,13 +1,13 @@
1
+ module AliasMetrics
2
+ class AliasUsage
3
+ attr_accessor :alias
4
+ attr_accessor :command
5
+ attr_accessor :count
1
6
 
2
- class AliasUsage
3
- attr_accessor :alias
4
- attr_accessor :command
5
- attr_accessor :count
6
-
7
- def initialize(alias_, command)
8
- self.alias = alias_.freeze
9
- self.command = command.freeze
10
- self.count = 0
7
+ def initialize(alias_, command)
8
+ self.alias = alias_.freeze
9
+ self.command = command.freeze
10
+ self.count = 0
11
+ end
11
12
  end
12
-
13
13
  end
@@ -1,79 +1,115 @@
1
- class CommandHistory
2
- attr_accessor :commands
3
- attr_accessor :shorten_count
4
- attr_accessor :shortenables
5
- attr_accessor :alias_usages
6
- attr_accessor :alias_list
1
+ module AliasMetrics
2
+ class CommandHistory
3
+ ZSH_HISTORY_FILE = "#{ENV["HOME"]}/.zsh_history"
7
4
 
8
- ZSH_HISTORY_FILE = "#{ENV["HOME"]}/.zsh_history"
5
+ class << CommandHistory
6
+ def load_from_zsh_history(alias_list, history_file = ZSH_HISTORY_FILE)
7
+ commands = []
8
+ open(history_file) do |fh|
9
+ fh.each do |line|
10
+ line.chomp!
11
+ next if line == ""
12
+ begin
13
+ command = parse_command_by_zsh_history_line(line)
14
+ commands << command if command
15
+ rescue ArgumentError #invalid byte sequence in UTF-8
16
+ #do nothing
17
+ end
18
+ end
19
+ end
20
+ CommandHistory.new(commands, alias_list)
21
+ end
9
22
 
10
- def initialize(commands, alias_list)
11
- self.alias_list = alias_list
12
- self.commands = []
13
- self.shorten_count = 0
14
- self.shortenables = Hash.new
15
- self.alias_usages = Hash.new
16
- alias_list.alias_hash.each_pair do |alias_, value|
17
- self.alias_usages[alias_] = AliasUsage.new(alias_, value)
18
- self.shortenables[value] = Shortenable.new(alias_, value)
23
+ private
24
+ def parse_command_by_zsh_history_line(line)
25
+ command = line.split(/;/)[1]
26
+ return command
27
+ end
19
28
  end
20
29
 
21
- commands.each do |command|
22
- update_shortenables(command)
23
- update_alias_usages(command)
24
- command_expanded = self.alias_list.expand_command(command)
25
- self.shorten_count += [0, command_expanded.length - command.length].max
26
- self.commands << command_expanded
30
+ attr_accessor :commands
31
+ attr_accessor :shorten_count
32
+ attr_accessor :shortenables
33
+ attr_accessor :alias_usages
34
+ attr_accessor :alias_list
35
+ attr_accessor :fragment
36
+
37
+ def initialize(commands, alias_list)
38
+ self.alias_list = alias_list
39
+ self.commands = []
40
+ self.shorten_count = 0
41
+ self.shortenables = Hash.new
42
+ self.alias_usages = Hash.new
43
+ alias_list.alias_hash.each_pair do |alias_, value|
44
+ self.alias_usages[alias_] = AliasUsage.new(alias_, value)
45
+ self.shortenables[alias_] = Shortenable.new(alias_, value)
46
+ end
47
+ self.fragment = Hash.new{|h, key| h[key] = Fragment.new(key)}
48
+
49
+ commands.each do |command|
50
+ update_shortenables(command)
51
+ update_alias_usages(command)
52
+ command_expanded = self.alias_list.expand_command(command)
53
+ self.shorten_count += [0, command_expanded.length - command.length].max
54
+ self.commands << command_expanded
55
+ fragments(command_expanded).each do |fragment_body|
56
+ self.fragment[fragment_body].count += 1
57
+ end
58
+ end
59
+ self.alias_list = self.alias_list.freeze
60
+ self.commands = self.commands.freeze
61
+ self.shorten_count = self.shorten_count.freeze
62
+ self.shortenables = self.shortenables.freeze
63
+ self.alias_usages = self.alias_usages.freeze
27
64
  end
28
- self.alias_list = self.alias_list.freeze
29
- self.commands = self.commands.freeze
30
- self.shorten_count = self.shorten_count.freeze
31
- self.shortenables = self.shortenables.freeze
32
- self.alias_usages = self.alias_usages.freeze
33
- end
34
65
 
35
- def self.load_from_zsh_history(alias_list, history_file = ZSH_HISTORY_FILE)
36
- commands = []
37
- open(history_file) do |fh|
38
- fh.each do |line|
39
- line.chomp!
40
- next if line == ""
41
- begin
42
- command = parse_command_by_zsh_history_line(line)
43
- commands << command if command
44
- rescue ArgumentError #invalid byte sequence in UTF-8
45
- #do nothing
66
+ private
67
+
68
+
69
+ def update_shortenables(command)
70
+ if alias_list.shortenable?(command)
71
+ shortenable_alias_list = alias_list.shortenable_alias(command)
72
+ shortenable_alias_list.each do |alias_|
73
+ extension = alias_list.alias_hash[alias_]
74
+ self.shortenables[alias_].count += 1 if shortenable?(alias_, extension)
46
75
  end
47
76
  end
48
77
  end
49
- CommandHistory.new(commands, alias_list)
50
- end
51
78
 
52
- private
79
+ def update_alias_usages(command)
80
+ alias_ = self.alias_list.appliable_alias(command)
81
+ self.alias_usages[alias_].count += 1 if alias_
82
+ end
53
83
 
54
- def self.parse_command_by_zsh_history_line(line)
55
- command = line.split(/;/)[1]
56
- return command
57
- end
84
+ def shortenable?(alias_, command)
85
+ command.size > alias_.size
86
+ end
58
87
 
59
- def update_shortenables(command)
60
- if alias_list.shortenable?(command)
61
- shortenable_alias_list = alias_list.shortenable_alias(command)
62
- shortenable_alias_list.each do |alias_, extension|
63
- self.shortenables[extension].count += 1 if shortenable?(alias_, extension)
88
+ def fragments(command)
89
+ ret = Array.new
90
+ units = command.split(/\s/)
91
+ substr = units.shift
92
+ if command_fragment?(substr)
93
+ ret << substr
94
+ units.each do |unit|
95
+ break if not command_fragment?(unit)
96
+ substr = substr + " " + unit
97
+ ret << substr if fragment?(substr, unit)
98
+ end
64
99
  end
100
+ ret
65
101
  end
66
- end
67
102
 
68
- def update_alias_usages(command)
69
- applied_alias = self.alias_list.applied_alias(command)
70
- applied_alias.each do |alias_, value|
71
- self.alias_usages[alias_].count += 1
103
+ def command_fragment?(unit)
104
+ unit =~ /^[a-zA-Z\-|]+$/
72
105
  end
73
- end
74
106
 
75
- def shortenable?(alias_, command)
76
- command.size > alias_.size
77
- end
107
+ def fragment?(substr, last_unit)
108
+ !pipe?(last_unit)
109
+ end
78
110
 
111
+ def pipe?(unit)
112
+ unit == "|"
113
+ end
114
+ end
79
115
  end
@@ -0,0 +1,19 @@
1
+ module AliasMetrics
2
+ class Fragment
3
+ attr_accessor :body
4
+ attr_accessor :count
5
+
6
+ def initialize(body)
7
+ self.body = body
8
+ self.count = 0
9
+ end
10
+
11
+ def types
12
+ body.size * count
13
+ end
14
+
15
+ def shorten_types(alias_)
16
+ (body.size - alias_.size) * count
17
+ end
18
+ end
19
+ end
@@ -1,11 +1,13 @@
1
- class Shortenable
2
- attr_accessor :command
3
- attr_accessor :alias
4
- attr_accessor :count
1
+ module AliasMetrics
2
+ class Shortenable
3
+ attr_accessor :command
4
+ attr_accessor :alias
5
+ attr_accessor :count
5
6
 
6
- def initialize(alias_, command)
7
- self.alias = alias_.freeze
8
- self.command = command.freeze
9
- self.count = 0
7
+ def initialize(alias_, command)
8
+ self.alias = alias_.freeze
9
+ self.command = command.freeze
10
+ self.count = 0
11
+ end
10
12
  end
11
13
  end
@@ -1,46 +1,92 @@
1
1
  require "alias_metrics"
2
+ include AliasMetrics
2
3
 
3
4
  describe AliasList do
4
- before do
5
- @alias_list = AliasList.load_from_lines(["l='ls -la'", "sl=ls", "grhh='git reset --hard HEAD\^'"])
6
- end
5
+ let(:alias_list){ AliasList.load_from_lines(["l='ls -la'", "sl=ls", "grhh='git reset --hard HEAD\^'"]) }
7
6
  describe "expand_command" do
8
- it "should output `ls -la` for the command `l` " do
9
- @alias_list.expand_command("l").should == "ls -la"
7
+ it "should expand the command `l` to the command `ls -la`" do
8
+ alias_list.expand_command("l").should == "ls -la"
10
9
  end
11
10
 
12
- it "should output `ls -la -h` for the command `l -h` " do
13
- @alias_list.expand_command("l -h").should == "ls -la -h"
11
+ it "should expand the command `l -h` to the command `ls -la -h`" do
12
+ alias_list.expand_command("l -h").should == "ls -la -h"
14
13
  end
15
14
 
16
- it "should output `ls` for the command `sl` " do
17
- @alias_list.expand_command("sl").should == "ls"
15
+ it "should expand the command `sl` to the command `ls`" do
16
+ alias_list.expand_command("sl").should == "ls"
18
17
  end
19
18
 
20
- it "should output `ls -l` for the command `sl -l` " do
21
- @alias_list.expand_command("sl -l").should == "ls -l"
19
+ it "should expand the command `sl -l` to the command `ls -l`" do
20
+ alias_list.expand_command("sl -l").should == "ls -l"
22
21
  end
23
22
 
24
- it "should output `slope` for the command `slope` because this command is slope, but is not sl" do
25
- @alias_list.expand_command("slope").should == "slope"
23
+ it "should not expand the command `slope` to the command `lsope` because this command is not `sl`" do
24
+ alias_list.expand_command("slope").should == "slope"
25
+ end
26
+ end
27
+
28
+ describe "applied_alias" do
29
+ it "should get the fact that command `l` can use alias `l`" do
30
+ alias_list.appliable_alias("l").should == "l"
31
+ end
32
+
33
+ it "should get the fact that command `l -h` can use alias `l`" do
34
+ alias_list.appliable_alias("l -h").should == "l"
26
35
  end
27
36
  end
28
37
 
29
38
  describe "shortenable" do
30
- it "should output `ls -la` is shortenable" do
31
- @alias_list.shortenable?("ls -la").should == true
39
+ it "should get the fact that `ls -la` can be shortenable" do
40
+ alias_list.shortenable?("ls -la").should == true
41
+ end
42
+
43
+ it "should get the fact that `ls -la -h` can be shortenable" do
44
+ alias_list.shortenable?("ls -la -h").should == true
45
+ end
46
+
47
+ it "should get the fact that `git reset --hard` can not be shortenable" do
48
+ alias_list.shortenable?("git reset --hard").should == false
49
+ end
50
+
51
+ it "should get the fact that `git reset HEAD\^ --hard` can not be shortenable" do
52
+ alias_list.shortenable?("git reset HEAD\^ --hard").should == false
53
+ end
54
+
55
+ it "should get the fact that `git reset --hard HEAD\^` can be shortenable" do
56
+ alias_list.shortenable?("git reset --hard HEAD\^").should == true
32
57
  end
58
+ end
59
+
60
+ describe "shortenable_alias" do
61
+ it "should get the fact the command `ls -la` can be shortenable by the alias `l`" do
62
+ aliass = alias_list.shortenable_alias("ls -la")
63
+ aliass.size.should == 1
64
+ aliass.should include "l"
65
+ end
66
+ end
33
67
 
34
- it "should output `ls -la -h` for the command `l -h` " do
35
- @alias_list.shortenable?("ls -la -h").should == true
68
+ describe "shorten_command" do
69
+ it "should shorten the command `git reset --hard HEAD\^` to `grhh` or `g reset --hard HEAD\^`" do
70
+ alias_list = AliasList.load_from_lines(["g=git", "grhh='git reset --hard HEAD\^'"])
71
+ shorten_commands = alias_list.shorten_command("git reset --hard HEAD\^")
72
+ shorten_commands.size.should == 2
73
+ shorten_commands.should include "grhh"
74
+ shorten_commands.should include "g reset --hard HEAD\^"
36
75
  end
37
76
 
38
- it "should output `git reset --hard` is not shortenable" do
39
- @alias_list.shortenable?("git reset --hard").should == false
77
+ it "should shorten the command `g reset --hard HEAD\^` to `grhh` or `g reset --hard HEAD\^`" do
78
+ alias_list = AliasList.load_from_lines(["g=git", "grhh='git reset --hard HEAD\^'"])
79
+ shorten_commands = alias_list.shorten_command("g reset --hard HEAD\^")
80
+ shorten_commands.size.should == 2
81
+ shorten_commands.should include "grhh"
82
+ shorten_commands.should include "g reset --hard HEAD\^"
40
83
  end
41
84
 
42
- it "should output `git HEAD\^ --hard` is not shortenable" do #Is this specification correct?
43
- @alias_list.shortenable?("git reset HEAD\^ --hard").should == false
85
+ it "should shorten the command `git reset --hard HEAD\^` to `grhh` or `g reset --hard HEAD\^`" do
86
+ alias_list = AliasList.load_from_lines(["l='ls -la'", "sl=ls"])
87
+ shorten_commands = alias_list.shorten_command("ls -la")
88
+ shorten_commands.size.should == 1
89
+ shorten_commands.should include "l"
44
90
  end
45
91
  end
46
92
 
@@ -1,35 +1,43 @@
1
1
  require "alias_metrics"
2
+ include AliasMetrics
2
3
 
3
4
  describe CommandHistory do
4
5
  before do
5
- @alias_list = AliasList.load_from_lines(["l='ls -la'", "ga=git add", "run-help=man"])
6
- @history = CommandHistory.new(["l", "l -h", "ls -la", "ls -la -h", "man"], @alias_list)
6
+ @alias_list = AliasList.load_from_lines(["l='ls -la'", "g=git", "ga=git add", "run-help=man"])
7
+ @history = CommandHistory.new(["l", "l -h", "ls -la", "ls -la -h", "ga", "git add", "man"], @alias_list)
7
8
  end
8
9
 
9
10
  it "can get the number of commands" do
10
- @history.commands.size.should == 5
11
+ @history.commands.size.should == 7
11
12
  end
12
13
 
13
14
  it "can count the number of chars shorten" do
14
- @history.shorten_count.should == 10 #becaulse (`ls -la` => `l`) * 2
15
+ @history.shorten_count.should == 15 #because (`ls -la` => `l`) * 2 + (`git add` => `ga`)
15
16
  end
16
17
 
17
18
  it "should be count is 2 when ls -la" do
18
- shortenable = @history.shortenables["ls -la"]
19
+ shortenable = @history.shortenables["l"]
19
20
  shortenable.alias.should == "l"
20
21
  shortenable.command.should == "ls -la"
21
22
  shortenable.count.should == 2
22
23
  end
23
24
 
24
- it "should be count is 0 when git add" do
25
- shortenable = @history.shortenables["git add"]
25
+ it "should be count is 1 when git" do
26
+ shortenable = @history.shortenables["g"]
27
+ shortenable.alias.should == "g"
28
+ shortenable.command.should == "git"
29
+ shortenable.count.should == 1
30
+ end
31
+
32
+ it "should be count is 1 when git add" do
33
+ shortenable = @history.shortenables["ga"]
26
34
  shortenable.alias.should == "ga"
27
35
  shortenable.command.should == "git add"
28
- shortenable.count.should == 0
36
+ shortenable.count.should == 1
29
37
  end
30
38
 
31
39
  it "should be count is 0 when ls -la because run-help is longer than man" do
32
- shortenable = @history.shortenables["man"]
40
+ shortenable = @history.shortenables["run-help"]
33
41
  shortenable.alias.should == "run-help"
34
42
  shortenable.command.should == "man"
35
43
  shortenable.count.should == 0
@@ -42,11 +50,18 @@ describe CommandHistory do
42
50
  alias_usage.count.should == 2
43
51
  end
44
52
 
53
+ it "should be alias usage is 0 when g" do
54
+ alias_usage = @history.alias_usages["g"]
55
+ alias_usage.alias.should == "g"
56
+ alias_usage.command.should == "git"
57
+ alias_usage.count.should == 0
58
+ end
59
+
45
60
  it "should be alias usage is 0 when ga" do
46
61
  alias_usage = @history.alias_usages["ga"]
47
62
  alias_usage.alias.should == "ga"
48
63
  alias_usage.command.should == "git add"
49
- alias_usage.count.should == 0
64
+ alias_usage.count.should == 1
50
65
  end
51
66
 
52
67
  it "should be alias usage is 0 when run-help" do
@@ -65,6 +80,26 @@ describe CommandHistory do
65
80
  @history.commands[1].should == "ls -la -h"
66
81
  @history.commands[2].should == "ls -la"
67
82
  @history.commands[3].should == "ls -la -h"
68
- @history.commands[4].should == "man"
83
+ @history.commands[4].should == "git add"
84
+ @history.commands[5].should == "git add"
85
+ @history.commands[6].should == "man"
86
+ end
87
+
88
+ it "should get count for fragment" do
89
+ @history.fragment["ls"].count.should == 4
90
+ @history.fragment["ls -la"].count.should == 4
91
+ @history.fragment["ls -la -h"].count.should == 2
92
+ @history.fragment["l"].count.should == 0
93
+ @history.fragment["ga"].count.should == 0
94
+ @history.fragment["git"].count.should == 2
95
+ @history.fragment["git add"].count.should == 2
96
+ @history.fragment["man"].count.should == 1
97
+ end
98
+
99
+ it "should get count for fragment" do
100
+ @history.fragment["ls -la -h"].types.should == 9 * 2
101
+ @history.fragment["ls -la -h"].shorten_types("ll").should == (9 - 2) * 2
102
+ @history.fragment["ls -la"].types.should == 6 * 4
103
+ @history.fragment["ls -la"].shorten_types("l").should == (6 - 1) * 4
69
104
  end
70
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alias_metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.1.2
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: 2012-03-06 00:00:00.000000000 Z
12
+ date: 2012-07-14 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2152591180 !ruby/object:Gem::Requirement
16
+ requirement: &70176108328560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2152591180
24
+ version_requirements: *70176108328560
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fuubar
27
- requirement: &2152590180 !ruby/object:Gem::Requirement
27
+ requirement: &70176108327740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152590180
35
+ version_requirements: *70176108327740
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &2152608520 !ruby/object:Gem::Requirement
38
+ requirement: &70176108327180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,27 +43,31 @@ dependencies:
43
43
  version: 0.9.2.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152608520
46
+ version_requirements: *70176108327180
47
47
  description:
48
48
  email: tommy.fmale@gmail.com
49
49
  executables:
50
50
  - alias_metrics
51
+ - alias_candidates
51
52
  extensions: []
52
53
  extra_rdoc_files: []
53
54
  files:
54
55
  - .gitignore
55
56
  - .rspec
56
57
  - Gemfile
57
- - Gemfile.lock
58
58
  - README
59
59
  - Rakefile
60
60
  - alias_metrics.gemspec
61
+ - bin/alias_candidates
61
62
  - bin/alias_metrics
63
+ - gems/alias_metrics-0.1.1.gem
62
64
  - gems/alias_metrics-0.1.gem
63
65
  - lib/alias_metrics.rb
66
+ - lib/alias_metrics/alias_line_parser/zsh.rb
64
67
  - lib/alias_metrics/alias_list.rb
65
68
  - lib/alias_metrics/alias_usage.rb
66
69
  - lib/alias_metrics/command_history.rb
70
+ - lib/alias_metrics/fragment.rb
67
71
  - lib/alias_metrics/shortenable.rb
68
72
  - spec/alias_list_spec.rb
69
73
  - spec/command_history_spec.rb
@@ -87,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
91
  version: '0'
88
92
  requirements: []
89
93
  rubyforge_project:
90
- rubygems_version: 1.8.10
94
+ rubygems_version: 1.8.17
91
95
  signing_key:
92
96
  specification_version: 3
93
97
  summary: This tool is to visualize alias usage to parse command history. You can evaluate
@@ -1,27 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- diff-lcs (1.1.3)
5
- fuubar (1.0.0)
6
- rspec (~> 2.0)
7
- rspec-instafail (~> 0.2.0)
8
- ruby-progressbar (~> 0.0.10)
9
- rake (0.9.2.2)
10
- rspec (2.8.0)
11
- rspec-core (~> 2.8.0)
12
- rspec-expectations (~> 2.8.0)
13
- rspec-mocks (~> 2.8.0)
14
- rspec-core (2.8.0)
15
- rspec-expectations (2.8.0)
16
- diff-lcs (~> 1.1.2)
17
- rspec-instafail (0.2.2)
18
- rspec-mocks (2.8.0)
19
- ruby-progressbar (0.0.10)
20
-
21
- PLATFORMS
22
- ruby
23
-
24
- DEPENDENCIES
25
- fuubar (~> 1.0.0)
26
- rake (~> 0.9.2.2)
27
- rspec (~> 2.0)