agen 0.1.5 → 0.3
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/.github/workflows/main.yml +3 -1
- data/CHANGELOG.md +17 -0
- data/Gemfile.lock +1 -1
- data/README.md +18 -14
- data/lib/agen.rb +4 -0
- data/lib/agen/base_options.rb +36 -0
- data/lib/agen/bash_options.rb +8 -0
- data/lib/agen/builder.rb +12 -4
- data/lib/agen/cli.rb +28 -2
- data/lib/agen/finder.rb +2 -1
- data/lib/agen/runner.rb +59 -8
- data/lib/agen/shell.rb +45 -0
- data/lib/agen/version.rb +1 -1
- data/lib/agen/zsh_options.rb +8 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edd821d0314f78d537a2228181e4f1dfd0ecaceddc8d8a67bb783499911e7ccb
|
4
|
+
data.tar.gz: 721e0d0871630027ac23c0e08d7dd54e3e20ef26fda674fe755ebb02e0e4be48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2c802aa56ab03338dbe58638a5ab5cf525c13ffef6b0a6b11e5aff39b430d4645f3116d6d49e37425df1704029148ca8df3d8d5dc4af84d0b3dff8ff8263d1c
|
7
|
+
data.tar.gz: d02a95bbee062a61ebe93160c03f773706e45264b09cd4cae9a2aab2c1a45c97078192b399466854e22e87d80266c6aa29e61167ce3f8b726b4a07180311a450
|
data/.github/workflows/main.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
## [Released]
|
2
2
|
|
3
|
+
## [0.3] - 2021-06-17
|
4
|
+
- Adds support for bash shell.
|
5
|
+
- Adds ability to pass custom rcfile and histfile options.
|
6
|
+
|
7
|
+
## [0.2.1] - 2021-05-01
|
8
|
+
- Adds ability to modify aliases before writing them in interactive mode.
|
9
|
+
|
10
|
+
## [0.2.0] - 2021-04-30
|
11
|
+
- Adds interactive mode, allowing aliases to be accepted or rejected. On by
|
12
|
+
default.
|
13
|
+
|
14
|
+
## [0.1.7] - 2021-04-26
|
15
|
+
- Fix: Ensures the same aliases is not built for multiple commands in the same run.
|
16
|
+
|
17
|
+
## [0.1.6] - 2021-04-25
|
18
|
+
- Adds ability to specify number of aliases to generate.
|
19
|
+
|
3
20
|
## [0.1.5] - 2021-04-24
|
4
21
|
|
5
22
|
- Initial release that anyone should reasonably use.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,12 +4,25 @@
|
|
4
4
|
|
5
5
|
Generate shell aliases based on your most commonly entered commands.
|
6
6
|
|
7
|
+
https://user-images.githubusercontent.com/22665228/116796045-5e5a8280-aa8e-11eb-8b4c-4408a252c143.mov
|
8
|
+
|
9
|
+
|
7
10
|
## Installation & Usage
|
8
11
|
|
9
|
-
Install with `gem install agen` and then run `agen` to build your aliases.
|
12
|
+
Install with `gem install agen` and then run `agen` to build your aliases. Then
|
13
|
+
be sure to `source ~/.zshrc` before using the new aliases. Use `agen -h` to see
|
14
|
+
available options.
|
15
|
+
|
16
|
+
```
|
17
|
+
Usage: agen [options]
|
18
|
+
-n, --number=NUMBER Number of aliases to generate
|
19
|
+
-a, --auto Aliases will be generated and applied automatically
|
20
|
+
-r, --rcfile=RCFILE Path to shell rc file
|
21
|
+
-h, --histfile=HISTFILE Path to shell history file
|
22
|
+
```
|
10
23
|
|
11
|
-
Right now, this will only work with `zsh`, but
|
12
|
-
|
24
|
+
Right now, this will only work with `zsh` or `bash`, but you can specify unique shell config files using the `-r` and `-h` options (though there is no guarantee that your history file will be read properly). By default, agen reads from `.zsh_history` and
|
25
|
+
writes to `.zshrc`.
|
13
26
|
|
14
27
|
## Development
|
15
28
|
|
@@ -23,19 +36,10 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/Jonath
|
|
23
36
|
|
24
37
|
## Roadmap
|
25
38
|
|
26
|
-
* CLI will let you specify number of aliases you want to create.
|
27
|
-
* CLI will let you see proposed aliases and accept/decline them interactively.
|
28
|
-
OR, in "auto mode", commands will be added automatically (as in 1). Auto
|
29
|
-
should be default?
|
30
|
-
* CLI should have helpful output for `-h/--help`.
|
31
|
-
* CLI will support any (or most common) shells, and will find history and rc
|
32
|
-
file dynamically.
|
33
|
-
* CLI will let you specific which history file to read form, and which file to output aliases to.
|
34
|
-
* CLI will let you interactively modify proposed aliases.
|
35
39
|
* CLI will let you "ignore" commands you don't want to alias, forever.
|
40
|
+
* CLI will raise user friendly errors if you specify shell configuration files that don't exist.
|
36
41
|
* CLI will let you specify "meta" vs "full" commands.
|
37
|
-
- Full command would be `git checkout branch-name`, meta command would be
|
38
|
-
`git checkout`.
|
42
|
+
- Full command would be `git checkout branch-name`, meta command would be `git checkout`.
|
39
43
|
|
40
44
|
## License
|
41
45
|
|
data/lib/agen.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "agen/version"
|
4
|
+
require_relative "agen/base_options"
|
5
|
+
require_relative "agen/bash_options"
|
6
|
+
require_relative "agen/zsh_options"
|
7
|
+
require_relative "agen/shell"
|
4
8
|
require_relative "agen/cli"
|
5
9
|
require_relative "agen/builder"
|
6
10
|
require_relative "agen/finder"
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Agen
|
4
|
+
class BaseOptions
|
5
|
+
def initialize(options)
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def set_histfile
|
10
|
+
# handle not set here
|
11
|
+
if !defined?(self.class::HISTFILE)
|
12
|
+
puts "Please specify shell history file with -h option. See agen --help."
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
options.tap do |opts|
|
17
|
+
opts[:histfile] = self.class::HISTFILE
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_rcfile
|
22
|
+
if !defined?(self.class::RCFILE)
|
23
|
+
puts "Please specify shell rc file with -r option. See agen --help."
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
|
27
|
+
options.tap do |opts|
|
28
|
+
opts[:rcfile] = self.class::RCFILE
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :options
|
35
|
+
end
|
36
|
+
end
|
data/lib/agen/builder.rb
CHANGED
@@ -2,27 +2,35 @@
|
|
2
2
|
|
3
3
|
module Agen
|
4
4
|
class Builder
|
5
|
-
def initialize(commands, rcfile = Runner::DEFAULT_RCFILE)
|
5
|
+
def initialize(commands = [], rcfile = Runner::DEFAULT_RCFILE)
|
6
6
|
@commands = commands
|
7
7
|
@rcfile = rcfile
|
8
8
|
end
|
9
9
|
|
10
10
|
def aliases
|
11
|
+
aliases = []
|
11
12
|
@commands.map do |cmd|
|
12
13
|
aliaz = cmd.scan(/\b\w/).join
|
13
14
|
|
14
15
|
# Is is possibly we could overwrite a command here still? Sure.
|
15
16
|
# I will live with it for now.
|
16
|
-
if command_already_exists?(aliaz)
|
17
|
+
if command_already_exists?(aliaz) || aliases.include?(aliaz)
|
17
18
|
# We could improve to look more like the original command, but again, works for now.
|
18
19
|
aliaz += aliaz[-1]
|
19
20
|
end
|
20
21
|
|
21
|
-
candidate =
|
22
|
-
|
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
|
23
27
|
end.compact
|
24
28
|
end
|
25
29
|
|
30
|
+
def construct_alias(aliaz, cmd)
|
31
|
+
"alias #{aliaz}=\"#{cmd}\""
|
32
|
+
end
|
33
|
+
|
26
34
|
private
|
27
35
|
|
28
36
|
def alias_does_not_exist?(aliaz)
|
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,32 @@ 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
|
+
|
25
|
+
opts.on("-rRCFILE", "--rcfile=RCFILE", String, "Path to shell rc file") do |r|
|
26
|
+
options[:rcfile] = r
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on("-hHISTFILE", "--histfile=HISTFILE", String, "Path to shell history file") do |h|
|
30
|
+
options[:histfile] = h
|
31
|
+
end
|
32
|
+
end.parse!
|
33
|
+
|
34
|
+
options = Shell.new(options).add_options
|
35
|
+
return unless options
|
36
|
+
|
37
|
+
Runner.new(**options).run
|
12
38
|
end
|
13
39
|
end
|
14
40
|
end
|
data/lib/agen/finder.rb
CHANGED
data/lib/agen/runner.rb
CHANGED
@@ -2,27 +2,78 @@
|
|
2
2
|
|
3
3
|
module Agen
|
4
4
|
class Runner
|
5
|
-
DEFAULT_HISTFILE =
|
6
|
-
DEFAULT_RCFILE =
|
5
|
+
DEFAULT_HISTFILE = ZshOptions::HISTFILE
|
6
|
+
DEFAULT_RCFILE = ZshOptions::RCFILE
|
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 new 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/shell.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Agen
|
4
|
+
class Shell
|
5
|
+
def initialize(options)
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_options
|
10
|
+
if !@options[:histfile]
|
11
|
+
@options = opts_klass.set_histfile
|
12
|
+
end
|
13
|
+
|
14
|
+
if @options && !@options[:rcfile]
|
15
|
+
@options = opts_klass.set_rcfile
|
16
|
+
end
|
17
|
+
|
18
|
+
@options
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def bash?
|
24
|
+
@_bash ||= shell.match?(/bash/)
|
25
|
+
end
|
26
|
+
|
27
|
+
def opts_klass
|
28
|
+
@_opts_klass ||= if bash?
|
29
|
+
BashOptions
|
30
|
+
elsif zsh?
|
31
|
+
ZshOptions
|
32
|
+
else
|
33
|
+
BaseOptions
|
34
|
+
end.new(@options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def shell
|
38
|
+
@_shell ||= ENV["SHELL"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def zsh?
|
42
|
+
@_zsh ||= shell.match?(/zsh/)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
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.
|
4
|
+
version: '0.3'
|
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-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -75,11 +75,15 @@ files:
|
|
75
75
|
- bin/setup
|
76
76
|
- exe/agen
|
77
77
|
- lib/agen.rb
|
78
|
+
- lib/agen/base_options.rb
|
79
|
+
- lib/agen/bash_options.rb
|
78
80
|
- lib/agen/builder.rb
|
79
81
|
- lib/agen/cli.rb
|
80
82
|
- lib/agen/finder.rb
|
81
83
|
- lib/agen/runner.rb
|
84
|
+
- lib/agen/shell.rb
|
82
85
|
- lib/agen/version.rb
|
86
|
+
- lib/agen/zsh_options.rb
|
83
87
|
homepage: https://github.com/JonathanWThom/agen
|
84
88
|
licenses:
|
85
89
|
- MIT
|