lz 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/lazy_cli +8 -0
- data/lib/analyze.rb +19 -0
- data/lib/constants.rb +8 -0
- data/lib/exceptions.rb +10 -0
- data/lib/lazy.rb +29 -0
- data/lib/parser/bash_history_parser.rb +10 -0
- data/lib/parser/history_parser_factory.rb +20 -0
- data/lib/parser/history_parser_interface.rb +16 -0
- data/lib/parser/zsh_history_parser.rb +30 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ef9c2aa962aecd38b4951d2b49d6bcbc94bffe3f57e7e1b04d120cdf252fbcee
|
4
|
+
data.tar.gz: ef23b828bd67148c94309172fda35838e63708ee7d96068844b143c45f917dee
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a9ff04ff68ef8b3cae0cb3a79649bf4db6a29b9a07a5d5cc04354c2eb9473b4a9915ff878446cf4001d60dd330bdc2597eb7c2d89dc6696ce646bdc3c137c83e
|
7
|
+
data.tar.gz: b315031cc9901bdc3d25ed3ba9d0825a496a9ca9dd35af8b31a010b17ffe8f15dc3ccb6be631a6b304e302e16124525ac9acb185c96dd44b46074567dac32f5c
|
data/bin/lazy_cli
ADDED
data/lib/analyze.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './parser/history_parser_factory'
|
4
|
+
|
5
|
+
# create a mapping of command => count from the list of
|
6
|
+
# all commands in our history file.
|
7
|
+
def create_mapping
|
8
|
+
parser = HistoryParserFactory.create
|
9
|
+
commands = parser.commands
|
10
|
+
Hash.new(0).tap { |h| commands.each { |command| h[command] += 1 } }
|
11
|
+
end
|
12
|
+
|
13
|
+
# analyze our map to find the most frequent shell commands
|
14
|
+
def analyze_map(command_map, commands_to_print: NUM_COMMANDS_TO_PRINT)
|
15
|
+
sorted_map = command_map.sort_by { |_, count| count }
|
16
|
+
# print the top N commands
|
17
|
+
reversed_sorted_map = sorted_map.reverse[0...commands_to_print]
|
18
|
+
reversed_sorted_map.each { |command, count| puts "#{command}: #{count}" }
|
19
|
+
end
|
data/lib/constants.rb
ADDED
data/lib/exceptions.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Error for when trying to determine the calling systems shell but no
|
4
|
+
# known value is found
|
5
|
+
class UnknownShell < StandardError
|
6
|
+
def initialize(msg = 'An unknown shell has been encountered', exception_type = 'custom')
|
7
|
+
@exception_type = exception_type
|
8
|
+
super(msg)
|
9
|
+
end
|
10
|
+
end
|
data/lib/lazy.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
require_relative './constants'
|
6
|
+
require_relative './analyze'
|
7
|
+
|
8
|
+
def parse_arguments
|
9
|
+
options = {}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = 'Usage: main.rb [options]'
|
12
|
+
|
13
|
+
opts.on('-n', '--num num', Integer, 'Number of commands to print') do |num|
|
14
|
+
options[:num] = num
|
15
|
+
end
|
16
|
+
end.parse!(ARGV)
|
17
|
+
options
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
options = parse_arguments
|
22
|
+
command_map = create_mapping
|
23
|
+
|
24
|
+
if options[:num]
|
25
|
+
analyze_map(command_map, commands_to_print: options[:num])
|
26
|
+
else
|
27
|
+
analyze_map(command_map)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './bash_history_parser'
|
4
|
+
require_relative './zsh_history_parser'
|
5
|
+
require_relative '../exceptions'
|
6
|
+
|
7
|
+
# Simple parser to handling line items from the systems history
|
8
|
+
# file.
|
9
|
+
class HistoryParserFactory
|
10
|
+
def self.create(input_shell: ENV['SHELL'])
|
11
|
+
case input_shell
|
12
|
+
when ZSH_SHELL_PATH
|
13
|
+
ZshHistoryParser.new
|
14
|
+
when BASH_SHELL_PATH
|
15
|
+
BashHistoryParser.new
|
16
|
+
else
|
17
|
+
raise UnknownShell
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Interface for the history parsers.
|
4
|
+
class HistoryParserInterface
|
5
|
+
def parse_command
|
6
|
+
raise 'Not implemented'
|
7
|
+
end
|
8
|
+
|
9
|
+
def commands
|
10
|
+
raise 'Not implemented'
|
11
|
+
end
|
12
|
+
|
13
|
+
def history_file
|
14
|
+
raise 'Not implemented'
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './history_parser_interface'
|
4
|
+
|
5
|
+
# Parse the ZSH history file
|
6
|
+
class ZshHistoryParser < HistoryParserInterface
|
7
|
+
def parse_command(history_line_entry)
|
8
|
+
# get everything on the left hand side of the ';'
|
9
|
+
# and join the content. We want to join the content
|
10
|
+
# in the case that the command itself has a ';' e.g.
|
11
|
+
# : 1650408552:0;git status; git clear
|
12
|
+
split_history = history_line_entry.split(';')
|
13
|
+
command_part = split_history.drop(1)
|
14
|
+
command_part.join(';').strip
|
15
|
+
end
|
16
|
+
|
17
|
+
def commands
|
18
|
+
commands = []
|
19
|
+
File.open(history_file, 'r') do |f|
|
20
|
+
f.each_line do |line|
|
21
|
+
commands.push(parse_command(line))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
commands
|
25
|
+
end
|
26
|
+
|
27
|
+
def history_file
|
28
|
+
File.expand_path(ZSH_HISTORY_FILE_PATH)
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lz
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- AndrewRPorter
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-09-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- pavelow53.andrew@gmail.com
|
16
|
+
executables:
|
17
|
+
- lazy_cli
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/lazy_cli
|
22
|
+
- lib/analyze.rb
|
23
|
+
- lib/constants.rb
|
24
|
+
- lib/exceptions.rb
|
25
|
+
- lib/lazy.rb
|
26
|
+
- lib/parser/bash_history_parser.rb
|
27
|
+
- lib/parser/history_parser_factory.rb
|
28
|
+
- lib/parser/history_parser_interface.rb
|
29
|
+
- lib/parser/zsh_history_parser.rb
|
30
|
+
homepage: http://github.com/AndrewRPorter/lazy
|
31
|
+
licenses:
|
32
|
+
- MIT
|
33
|
+
metadata: {}
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirements: []
|
49
|
+
rubygems_version: 3.0.3.1
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: Analyze command history and suggest aliases so you can type less.
|
53
|
+
test_files: []
|