completely 0.1.0
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 +7 -0
- data/README.md +130 -0
- data/bin/completely +16 -0
- data/lib/completely.rb +9 -0
- data/lib/completely/cli.rb +11 -0
- data/lib/completely/command.rb +72 -0
- data/lib/completely/completions.rb +45 -0
- data/lib/completely/sample.yaml +24 -0
- data/lib/completely/template.erb +20 -0
- data/lib/completely/version.rb +3 -0
- metadata +94 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cd3ae4ec92d7318bd4ef32fdd465d9bff3341931f5f965d2db8f263c1b95e38b
|
4
|
+
data.tar.gz: 01ccb2fa2e1f050b7a45944b552590fad6aab9bafc90ef4cb98b8d6284200392
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fd06256b9cb4c42364d118ea1392b180ef662e98b2ea9c6b24ca815f5fa5cf1f16d6c0a6792090c9bc5f376ab7dfb04e9b8c732cb83292140acb59676d6090a9
|
7
|
+
data.tar.gz: b1985849259627803ebe3f7c56b4adc98137456b172fb36cbf1379b4677257dca6cc671d85a12106596fb246de02aad07c5e9d51c5dd0abc7301518d9b7529b2
|
data/README.md
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# Completely - Bash Completions Generator
|
2
|
+
|
3
|
+
[](https://badge.fury.io/rb/completely)
|
4
|
+
[](https://github.com/DannyBen/completely/actions?query=workflow%3ATest)
|
5
|
+
|
6
|
+
---
|
7
|
+
|
8
|
+
Completely is a command line utility and a Ruby library that lets you generate
|
9
|
+
bash completion scripts from simple YAML configuration.
|
10
|
+
|
11
|
+
This tool is for you it:
|
12
|
+
|
13
|
+
1. You develop your own command line tools.
|
14
|
+
2. Your life feels empty without bash completions.
|
15
|
+
3. Bash completion scripts scare you.
|
16
|
+
|
17
|
+
---
|
18
|
+
|
19
|
+
|
20
|
+
## Install
|
21
|
+
|
22
|
+
```
|
23
|
+
$ gem install completely
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
The `completely` command line works with a simple YAML configuration file as
|
29
|
+
input, and generates a bash completions script as output.
|
30
|
+
|
31
|
+
The configuration file is built like this:
|
32
|
+
|
33
|
+
```yaml
|
34
|
+
pattern:
|
35
|
+
- --argument
|
36
|
+
- --param
|
37
|
+
- command
|
38
|
+
```
|
39
|
+
|
40
|
+
You can save a sample YAML file by running:
|
41
|
+
|
42
|
+
```
|
43
|
+
$ completely new
|
44
|
+
```
|
45
|
+
|
46
|
+
This will generate a file named `completely.yaml` with this content:
|
47
|
+
|
48
|
+
```yaml
|
49
|
+
mygit:
|
50
|
+
- --help
|
51
|
+
- --version
|
52
|
+
- status
|
53
|
+
- init
|
54
|
+
- commit
|
55
|
+
|
56
|
+
mygit status:
|
57
|
+
- --help
|
58
|
+
- --verbose
|
59
|
+
- --branch
|
60
|
+
|
61
|
+
mygit init:
|
62
|
+
- --bare
|
63
|
+
- <directory>
|
64
|
+
|
65
|
+
mygit commit:
|
66
|
+
- <file>
|
67
|
+
- --help
|
68
|
+
- --message
|
69
|
+
- --all
|
70
|
+
- -a
|
71
|
+
- --quiet
|
72
|
+
- -q
|
73
|
+
```
|
74
|
+
|
75
|
+
Each pattern in this configuration file will be checked against the user's
|
76
|
+
input, and if the input **starts with** a matching pattern, the list that
|
77
|
+
follows it will be suggested as completions.
|
78
|
+
|
79
|
+
To generate the bash script, simply run:
|
80
|
+
|
81
|
+
```
|
82
|
+
$ completely generate
|
83
|
+
|
84
|
+
# or, to just preview it without saving:
|
85
|
+
$ completely preview
|
86
|
+
```
|
87
|
+
|
88
|
+
For more options (like setting input/output path), run
|
89
|
+
|
90
|
+
```
|
91
|
+
$ completely --help
|
92
|
+
```
|
93
|
+
|
94
|
+
### Suggesting files and directories
|
95
|
+
|
96
|
+
You may have noticed that the sample file contains two special entries:
|
97
|
+
|
98
|
+
- `<file>`
|
99
|
+
- `<directory>`
|
100
|
+
|
101
|
+
These patterns will add the list of files and directories
|
102
|
+
(when `<file>` is used) or just directories (when `<directory` is used) to
|
103
|
+
the list of suggestions.
|
104
|
+
|
105
|
+
For those interested in the technical details, any word between `<...>` will
|
106
|
+
simply be added using the [`compgen -A action`][compgen] function, so you can
|
107
|
+
in fact use any of its supported arguments.
|
108
|
+
|
109
|
+
|
110
|
+
### Using the generated completion scripts
|
111
|
+
|
112
|
+
In order to enable the completions, simply source the generated script:
|
113
|
+
|
114
|
+
```
|
115
|
+
$ source completely.bash
|
116
|
+
```
|
117
|
+
|
118
|
+
You may wish to add this to your `~/.bashrc` file to enable this for future
|
119
|
+
sessions (just be sure to use absolute path).
|
120
|
+
|
121
|
+
|
122
|
+
## Contributing / Support
|
123
|
+
|
124
|
+
If you experience any issue, have a question or a suggestion, or if you wish
|
125
|
+
to contribute, feel free to [open an issue][issues].
|
126
|
+
|
127
|
+
---
|
128
|
+
|
129
|
+
[issues]: https://github.com/DannyBen/completely/issues
|
130
|
+
[compgen]: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
|
data/bin/completely
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'completely'
|
3
|
+
require 'completely/cli'
|
4
|
+
require 'colsole'
|
5
|
+
include Colsole
|
6
|
+
|
7
|
+
runner = Completely::CLI.runner
|
8
|
+
|
9
|
+
begin
|
10
|
+
exit runner.run ARGV
|
11
|
+
|
12
|
+
rescue => e
|
13
|
+
puts e.backtrace.reverse if ENV['DEBUG']
|
14
|
+
say! "!undred!#{e.class}!txtrst!\n#{e.message}"
|
15
|
+
exit 1
|
16
|
+
end
|
data/lib/completely.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module Completely
|
2
|
+
class Command < MisterBin::Command
|
3
|
+
help "Bash completion script generator"
|
4
|
+
version Completely::VERSION
|
5
|
+
|
6
|
+
usage "completely new [CONFIG_PATH]"
|
7
|
+
usage "completely preview [CONFIG_PATH --function NAME]"
|
8
|
+
usage "completely generate [CONFIG_PATH OUTPUT_PATH --function NAME]"
|
9
|
+
usage "completely (-h|--help|--version)"
|
10
|
+
|
11
|
+
command "new", "Create a new sample YAML configuration file"
|
12
|
+
command "preview", "Generate the bash completion script to STDOUT"
|
13
|
+
command "generate", "Generate the bash completion script to a file"
|
14
|
+
|
15
|
+
option "-f --function NAME", "Modify the name of the function in the generated script"
|
16
|
+
|
17
|
+
param "CONFIG_PATH", "Path to the YAML configuration file"
|
18
|
+
param "OUTPUT_PATH", "Path to the output bash script"
|
19
|
+
|
20
|
+
example "completely new"
|
21
|
+
example "completely new input.yaml"
|
22
|
+
example "completely preview --function my_completions"
|
23
|
+
example "completely generate"
|
24
|
+
example "completely generate input.yaml"
|
25
|
+
example "completely generate input.yaml output.sh -f my_completions"
|
26
|
+
|
27
|
+
def new_command
|
28
|
+
if File.exist? config_path
|
29
|
+
raise "File already exists: #{config_path}"
|
30
|
+
else
|
31
|
+
File.write config_path, sample
|
32
|
+
say "Saved !txtpur!#{config_path}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def preview_command
|
37
|
+
puts script
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate_command
|
41
|
+
File.write output_path, script
|
42
|
+
say "Saved !txtpur!#{output_path}"
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def config_path
|
48
|
+
@config_path ||= args['CONFIG_PATH'] || "completely.yaml"
|
49
|
+
end
|
50
|
+
|
51
|
+
def output_path
|
52
|
+
@output_path ||= args['OUTPUT_PATH'] || "completely.bash"
|
53
|
+
end
|
54
|
+
|
55
|
+
def sample
|
56
|
+
@sample ||= File.read(sample_path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def sample_path
|
60
|
+
@sample_path ||= File.expand_path("sample.yaml", __dir__)
|
61
|
+
end
|
62
|
+
|
63
|
+
def script
|
64
|
+
@script ||= completions.script
|
65
|
+
end
|
66
|
+
|
67
|
+
def completions
|
68
|
+
@completions ||= Completions.load(config_path, function_name: args['--function'])
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Completely
|
5
|
+
class Completions
|
6
|
+
attr_reader :config, :function_name
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def load(config_path, function_name: nil)
|
10
|
+
new YAML.load_file(config_path), function_name: function_name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(config, function_name: nil)
|
15
|
+
@config, @function_name = config, function_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def script
|
19
|
+
ERB.new(template, trim_mode: '%-').result(binding)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def template_path
|
25
|
+
@template_path ||= File.expand_path("template.erb", __dir__)
|
26
|
+
end
|
27
|
+
|
28
|
+
def template
|
29
|
+
@template ||= File.read(template_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def command
|
33
|
+
@command ||= config.keys.first
|
34
|
+
end
|
35
|
+
|
36
|
+
def patterns
|
37
|
+
@patterns ||= config.to_a.sort_by { |k, v| -k.size }.to_h
|
38
|
+
end
|
39
|
+
|
40
|
+
def function_name
|
41
|
+
@function_name ||= "_#{command}_completions"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
mygit:
|
2
|
+
- --help
|
3
|
+
- --version
|
4
|
+
- status
|
5
|
+
- init
|
6
|
+
- commit
|
7
|
+
|
8
|
+
mygit status:
|
9
|
+
- --help
|
10
|
+
- --verbose
|
11
|
+
- --branch
|
12
|
+
|
13
|
+
mygit init:
|
14
|
+
- --bare
|
15
|
+
- <directory>
|
16
|
+
|
17
|
+
mygit commit:
|
18
|
+
- <file>
|
19
|
+
- --help
|
20
|
+
- --message
|
21
|
+
- --all
|
22
|
+
- -a
|
23
|
+
- --quiet
|
24
|
+
- -q
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This bash completions script was generated by
|
4
|
+
# completely (https://github.com/dannyben/completely)
|
5
|
+
# Modifying it manually is not recommended
|
6
|
+
<%= function_name %>() {
|
7
|
+
local cur=${COMP_WORDS[COMP_CWORD]}
|
8
|
+
|
9
|
+
case "$COMP_LINE" in
|
10
|
+
% patterns.each do |pattern, words|
|
11
|
+
% next unless words
|
12
|
+
% clean_words = words.reject { |w| w =~ /^<.*>$/ }.join " "
|
13
|
+
% functions = words.filter_map { |w| func = w[/^<(.+)>$/, 1] ; "-A #{func}" if func }
|
14
|
+
% flags = functions.any? ? "#{functions.join ' '} -W" : "-W"
|
15
|
+
'<%= pattern %>'*) COMPREPLY=($(compgen <%= flags %> "<%= clean_words %>" -- "$cur")) ;;
|
16
|
+
% end
|
17
|
+
esac
|
18
|
+
}
|
19
|
+
|
20
|
+
complete -F <%= function_name %> <%= command %>
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: completely
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Danny Ben Shitrit
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-07-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colsole
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mister_bin
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: requires
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.1'
|
55
|
+
description: Generate bash completion scripts using simple YAML configuration
|
56
|
+
email: db@dannyben.com
|
57
|
+
executables:
|
58
|
+
- completely
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- README.md
|
63
|
+
- bin/completely
|
64
|
+
- lib/completely.rb
|
65
|
+
- lib/completely/cli.rb
|
66
|
+
- lib/completely/command.rb
|
67
|
+
- lib/completely/completions.rb
|
68
|
+
- lib/completely/sample.yaml
|
69
|
+
- lib/completely/template.erb
|
70
|
+
- lib/completely/version.rb
|
71
|
+
homepage: https://github.com/dannyben/completely
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.7.0
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubygems_version: 3.2.16
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Bash Completions Generator
|
94
|
+
test_files: []
|