agen 0.1.4 → 0.2.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 +4 -4
- data/CHANGELOG.md +15 -3
- data/Gemfile.lock +1 -1
- data/README.md +16 -19
- data/lib/agen/builder.rb +20 -4
- data/lib/agen/cli.rb +17 -2
- data/lib/agen/runner.rb +57 -6
- data/lib/agen/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 567b4d1df4a054da853eb05a9476bcf9579758cac435e562842c74655e773198
|
4
|
+
data.tar.gz: 86e7947aac95a1fc80822158509b1d2e762a11727eca8abda0001b7de87d2115
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbaead32095bc304c5bf657426fa66f5b7196c90715a8b8466b597fc578d2c49414f25533bc815946b6bdf20c51af877299bdc3bcba886b4d575864fca04f324
|
7
|
+
data.tar.gz: 1c2b2388b097b4f7a95036be7395569d81b3de1e33630a2ffa1b5c262898dbda59742a62a6d88e9d0eb615dcba2375cbf7430472aeb99a77efe03fefa61e60c5
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,22 @@
|
|
1
1
|
## [Released]
|
2
2
|
|
3
|
-
## [0.1
|
4
|
-
-
|
3
|
+
## [0.2.1] - 2021-05-01
|
4
|
+
- Adds ability to modify aliases before writing them in interactive mode.
|
5
5
|
|
6
|
-
## [0.
|
6
|
+
## [0.2.0] - 2021-04-30
|
7
|
+
- Adds interactive mode, allowing aliases to be accepted or rejected. On by
|
8
|
+
default.
|
9
|
+
|
10
|
+
## [0.1.7] - 2021-04-26
|
11
|
+
- Fix: Ensures the same aliases is not built for multiple commands in the same run.
|
12
|
+
|
13
|
+
## [0.1.6] - 2021-04-25
|
14
|
+
- Adds ability to specify number of aliases to generate.
|
15
|
+
|
16
|
+
## [0.1.5] - 2021-04-24
|
7
17
|
|
8
18
|
- Initial release that anyone should reasonably use.
|
9
19
|
- Support for .zshrc/.zsh_history.
|
10
20
|
- Automatically writes top 5 aliases for commands 6 characters or longer.
|
21
|
+
- Avoids most alias naming conflicts with commands that already exist (e.g. `ls`).
|
22
|
+
- Avoids duplicating aliases that have already been written.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -6,10 +6,19 @@ Generate shell aliases based on your most commonly entered commands.
|
|
6
6
|
|
7
7
|
## Installation & Usage
|
8
8
|
|
9
|
-
Install with `gem install agen` and then run `agen` to build your aliases.
|
9
|
+
Install with `gem install agen` and then run `agen` to build your aliases. Then
|
10
|
+
be sure to `source ~/.zshrc` before using the new aliases. Use `agen -h` to see
|
11
|
+
available options.
|
12
|
+
|
13
|
+
```
|
14
|
+
Usage: agen [options]
|
15
|
+
-n, --number=NUMBER Number of aliases to generate
|
16
|
+
-a, --auto Aliases will be generated and applied automatically
|
17
|
+
```
|
10
18
|
|
11
19
|
Right now, this will only work with `zsh`, but support for other shells is on
|
12
|
-
the very lengthy todo list.
|
20
|
+
the very lengthy todo list. By default, agen reads from `.zsh_history` and
|
21
|
+
writes to `.zshrc`.
|
13
22
|
|
14
23
|
## Development
|
15
24
|
|
@@ -23,24 +32,12 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/Jonath
|
|
23
32
|
|
24
33
|
## Roadmap
|
25
34
|
|
26
|
-
|
27
|
-
an alias for them in the .zshrc file.~~
|
28
|
-
- [x] It should handle a very short or shell history without many different
|
29
|
-
commands.
|
30
|
-
- [x] It should not create the same alias for two different commands in the same
|
31
|
-
session.
|
32
|
-
- [x] It should not create aliases for very short commands.
|
33
|
-
~~2. CLI should not duplicate aliases or commands that already exist on the system.~~
|
34
|
-
3. CLI will let you see proposed aliases and accept/decline them interactively. Maybe auto should be the default?
|
35
|
-
OR, in "auto mode", commands will be added automatically (as in 1).
|
36
|
-
4. CLI should have helpful output for `-h/--help`.
|
37
|
-
5. CLI will let you specify number of aliases you want to create.
|
38
|
-
6. CLI will support any (or most common) shells, and will find history and rc
|
35
|
+
* CLI will support any (or most common) shells, and will find history and rc
|
39
36
|
file dynamically.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
* CLI will let you specific which history file to read from, and which file to output aliases to.
|
38
|
+
* CLI will let you interactively modify proposed aliases.
|
39
|
+
* CLI will let you "ignore" commands you don't want to alias, forever.
|
40
|
+
* CLI will let you specify "meta" vs "full" commands.
|
44
41
|
- Full command would be `git checkout branch-name`, meta command would be
|
45
42
|
`git checkout`.
|
46
43
|
|
data/lib/agen/builder.rb
CHANGED
@@ -2,23 +2,39 @@
|
|
2
2
|
|
3
3
|
module Agen
|
4
4
|
class Builder
|
5
|
-
def initialize(commands)
|
5
|
+
def initialize(commands = [], rcfile = Runner::DEFAULT_RCFILE)
|
6
6
|
@commands = commands
|
7
|
+
@rcfile = rcfile
|
7
8
|
end
|
8
9
|
|
9
10
|
def aliases
|
11
|
+
aliases = []
|
10
12
|
@commands.map do |cmd|
|
11
13
|
aliaz = cmd.scan(/\b\w/).join
|
12
14
|
|
13
15
|
# Is is possibly we could overwrite a command here still? Sure.
|
14
16
|
# I will live with it for now.
|
15
|
-
if command_already_exists?(aliaz)
|
17
|
+
if command_already_exists?(aliaz) || aliases.include?(aliaz)
|
16
18
|
# We could improve to look more like the original command, but again, works for now.
|
17
19
|
aliaz += aliaz[-1]
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
candidate = construct_alias(aliaz, cmd)
|
23
|
+
if alias_does_not_exist?(candidate)
|
24
|
+
aliases << aliaz
|
25
|
+
{alias: aliaz, full_alias: candidate, command: cmd}
|
26
|
+
end
|
27
|
+
end.compact
|
28
|
+
end
|
29
|
+
|
30
|
+
def construct_alias(aliaz, cmd)
|
31
|
+
"alias #{aliaz}=\"#{cmd}\""
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def alias_does_not_exist?(aliaz)
|
37
|
+
File.readlines(@rcfile).none? { |line| line.include?(aliaz) }
|
22
38
|
end
|
23
39
|
|
24
40
|
# Shoutout to Stack Overflow: https://stackoverflow.com/a/5471032
|
data/lib/agen/cli.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "optparse"
|
4
|
+
|
3
5
|
module Agen
|
4
6
|
class CLI
|
5
7
|
def initialize(args = [])
|
@@ -7,8 +9,21 @@ module Agen
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def run
|
10
|
-
|
11
|
-
|
12
|
+
options = {}
|
13
|
+
|
14
|
+
OptionParser.new do |opts|
|
15
|
+
opts.banner = "Usage: agen [options]"
|
16
|
+
|
17
|
+
opts.on("-nNUMBER", "--number=NUMBER", Integer, "Number of aliases to generate") do |n|
|
18
|
+
options[:number] = n
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on("-a", "--auto", "Aliases will be generated and applied automatically") do |a|
|
22
|
+
options[:auto] = a
|
23
|
+
end
|
24
|
+
end.parse!
|
25
|
+
|
26
|
+
Runner.new(**options).run
|
12
27
|
end
|
13
28
|
end
|
14
29
|
end
|
data/lib/agen/runner.rb
CHANGED
@@ -4,25 +4,76 @@ module Agen
|
|
4
4
|
class Runner
|
5
5
|
DEFAULT_HISTFILE = "#{Dir.home}/.zsh_history"
|
6
6
|
DEFAULT_RCFILE = "#{Dir.home}/.zshrc"
|
7
|
+
DEFAULT_NUMBER = 5
|
7
8
|
|
8
9
|
attr_reader :histfile, :rcfile
|
9
10
|
|
10
|
-
def initialize(
|
11
|
+
def initialize(
|
12
|
+
histfile: DEFAULT_HISTFILE,
|
13
|
+
rcfile: DEFAULT_RCFILE,
|
14
|
+
number: DEFAULT_NUMBER,
|
15
|
+
auto: false
|
16
|
+
)
|
11
17
|
@histfile = histfile
|
12
18
|
@rcfile = rcfile
|
19
|
+
@number = number
|
20
|
+
@auto = auto
|
13
21
|
end
|
14
22
|
|
15
23
|
def run
|
16
|
-
commands = Finder.new(histfile).commands
|
17
|
-
|
24
|
+
commands = Finder.new(histfile).commands(limit: @number)
|
25
|
+
@builder = Builder.new(commands, rcfile)
|
26
|
+
aliases = builder.aliases
|
18
27
|
|
28
|
+
# TODO: This could be its own class too
|
19
29
|
File.open(rcfile, "a") do |file|
|
20
|
-
puts "Writing aliases to #{rcfile}
|
30
|
+
puts "Writing new aliases to #{rcfile}:\n\n"
|
21
31
|
aliases.each do |al|
|
22
|
-
|
23
|
-
|
32
|
+
if auto
|
33
|
+
write_auto(file, al[:full_alias])
|
34
|
+
else
|
35
|
+
write_interactive(file, al)
|
36
|
+
end
|
24
37
|
end
|
25
38
|
end
|
26
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
attr_reader :auto, :builder
|
44
|
+
|
45
|
+
def write_auto(file, full_alias)
|
46
|
+
puts full_alias
|
47
|
+
file.puts(full_alias)
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_interactive(file, aliaz)
|
51
|
+
puts "Proposed alias: #{aliaz[:full_alias]}"
|
52
|
+
print "Accept? [n to reject, m to modify alias, any other key to accept]: "
|
53
|
+
response = gets.chomp
|
54
|
+
case response
|
55
|
+
when "n"
|
56
|
+
puts "Alias skipped"
|
57
|
+
when "m"
|
58
|
+
modify_alias(file, aliaz)
|
59
|
+
else
|
60
|
+
file.puts(aliaz[:full_alias])
|
61
|
+
puts "Alias written"
|
62
|
+
end
|
63
|
+
|
64
|
+
puts
|
65
|
+
end
|
66
|
+
|
67
|
+
def modify_alias(file, aliaz)
|
68
|
+
print "Enter new alias [replacing #{aliaz[:alias]}]: "
|
69
|
+
replacement = gets.chomp
|
70
|
+
if replacement == ""
|
71
|
+
modify_alias(file, aliaz)
|
72
|
+
return
|
73
|
+
end
|
74
|
+
|
75
|
+
file.puts(builder.construct_alias(replacement, aliaz[:command]))
|
76
|
+
puts "Alias written"
|
77
|
+
end
|
27
78
|
end
|
28
79
|
end
|
data/lib/agen/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: agen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Thom
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|