completely 0.6.3 → 0.7.0.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a1725a40745985999197a9e3aa59c2b4d2ff7a5669657e1f4425a5537ae3c888
4
- data.tar.gz: 67547ef69659b1751cf17f1c71ede5ad7176e7d3816367ed0bdacccb474b75df
3
+ metadata.gz: 318310b5fad62e6f6efcd7cee10e4d092d2199fe0b9060e2df993ad76e2ed434
4
+ data.tar.gz: daa2e3020ef7d8819d35b755cbcc08c0c2431ef5e51baa2ac0fe72d39bf587b9
5
5
  SHA512:
6
- metadata.gz: 3aa99c40ee76e3488702a8c6b59f8ba3789ec12995dbf9655f0600d7d81787d2cd2bc820c465247966cc695e84be3aa43cb6ccf08854b85d4422f2f0fe8b4bba
7
- data.tar.gz: eb44a7eee738f7810491913b4a9873a528804991669a506d63fa54dc610bef025daf2603fd9c3db6c5c21b3d119580e12e224d54e75880f87cd4b4aa71ec08df
6
+ metadata.gz: c80494faf42fa420060a931d5a81aa73df3f6b3f9bc7a9eb5180ed7cb5692409d846873a0fbdab4387d022a85dcbc393bfee6505d8b350733266b10d02298692
7
+ data.tar.gz: 363e67db5368099067beafb5bb6a9b2d234f7c69dc199a80388540d05ed8192c23acde624dece60fc64eaedb0650c7c878e3303645abd3feb7545df51742ea06
data/README.md CHANGED
@@ -40,10 +40,10 @@ or with Docker:
40
40
  $ alias completely='docker run --rm -it --user $(id -u):$(id -g) --volume "$PWD:/app" dannyben/completely'
41
41
  ```
42
42
 
43
- ## Using the `completely` command line
43
+ ## Configuration syntax
44
44
 
45
- The `completely` command line works with a simple YAML configuration file as
46
- input, and generates a bash completions script as output.
45
+ Completely works with a simple YAML configuration file as input, and generates
46
+ a bash completions script as output.
47
47
 
48
48
  The configuration file is built of blocks that look like this:
49
49
 
@@ -59,7 +59,7 @@ for the auto complete process.
59
59
 
60
60
  You can save a sample YAML file by running:
61
61
 
62
- ```
62
+ ```bash
63
63
  $ completely init
64
64
  ```
65
65
 
@@ -67,37 +67,34 @@ This will generate a file named `completely.yaml` with this content:
67
67
 
68
68
  ```yaml
69
69
  mygit:
70
+ - -h
71
+ - -v
70
72
  - --help
71
73
  - --version
72
- - status
73
74
  - init
74
- - commit
75
+ - status
76
+
77
+ mygit init:
78
+ - --bare
79
+ - <directory>
75
80
 
76
81
  mygit status:
77
82
  - --help
78
83
  - --verbose
79
84
  - --branch
80
- - $(git branch 2>/dev/null)
85
+ - -b
81
86
 
82
- mygit init:
83
- - --bare
84
- - <directory>
87
+ mygit status*--branch: &branches
88
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
85
89
 
86
- mygit commit:
87
- - <file>
88
- - --help
89
- - --message
90
- - --all
91
- - -a
92
- - --quiet
93
- - -q
90
+ mygit status*-b: *branches
94
91
  ```
95
92
 
96
93
  Each pattern in this configuration file will be checked against the user's
97
- input, and if the input **starts with** a matching pattern, the list that
98
- follows it will be suggested as completions.
94
+ input, and if the input matches the pattern, the list that follows it will be
95
+ suggested as completions.
99
96
 
100
- Note that the suggested completions will not show flags (string that start with
97
+ Note that the suggested completions will not show flags (strings that start with
101
98
  a hyphen `-`) unless the input ends with a hyphen.
102
99
 
103
100
  To generate the bash script, simply run:
@@ -169,7 +166,7 @@ branches to your suggestions, use the following:
169
166
 
170
167
  ```yaml
171
168
  mygit:
172
- - $(git branch 2>/dev/null)
169
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
173
170
  ```
174
171
 
175
172
  The `2> /dev/null` is used so that if the command is executed in a directory
@@ -186,10 +183,10 @@ mygit checkout:
186
183
  - -b
187
184
 
188
185
  mygit checkout*--branch:
189
- - $(git branch 2>/dev/null)
186
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
190
187
 
191
188
  mygit checkout*-b:
192
- - $(git branch 2>/dev/null)
189
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
193
190
  ```
194
191
 
195
192
  The above will suggest git branches for commands that end with `-b` or `--branch`.
@@ -202,11 +199,53 @@ mygit checkout:
202
199
  - -b
203
200
 
204
201
  mygit checkout*--branch: &branches
205
- - $(git branch 2>/dev/null)
202
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
206
203
 
207
204
  mygit checkout*-b: *branches
208
205
  ```
209
206
 
207
+ ### Alternative nested syntax
208
+
209
+ Completely also supports an alternative nested syntax. You can generate this
210
+ example by running:
211
+
212
+ ```bash
213
+ $ completely init --nested
214
+ ```
215
+
216
+ The example configuration below will generate the exact same script as the one
217
+ shown at the beginning of this document.
218
+
219
+ ```yaml
220
+ mygit:
221
+ - -h
222
+ - -v
223
+ - --help
224
+ - --version
225
+ - init:
226
+ - --bare
227
+ - <directory>
228
+ - status:
229
+ - --help
230
+ - --verbose
231
+ - +--branch: &branches
232
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
233
+ - +-b: *branches
234
+ ```
235
+
236
+ The rules here are as follows:
237
+
238
+ - Each pattern (e.g., `mygit`) can have a mixed array of strings and hashes.
239
+ - Strings and hash keys (e.e., `--help` and `init` respectively) will be used
240
+ as completion strings for that pattern.
241
+ - Hashes may contain a nested mixed array of the same structure.
242
+ - When a hash is provided, the hash key will be appended to the parent prefix.
243
+ In the example above, the `init` hash will create the pattern `mygit init`.
244
+ - In order to provide a wildcard (like `mygit status*--branch` in the standard
245
+ configuration syntax), you can provide either a `*` or a `+` prefix to the
246
+ hash key (e.g., `+--branch` or `"*--branch"`). Note that when using a `*`,
247
+ the hash key must be quoted since asterisks have special meaning in YAML.
248
+
210
249
  ## Using the generated completion scripts
211
250
 
212
251
  In order to enable the completions, simply source the generated script:
@@ -5,9 +5,11 @@ module Completely
5
5
  class Init < Base
6
6
  help 'Create a new sample YAML configuration file'
7
7
 
8
- usage 'completely init [CONFIG_PATH]'
8
+ usage 'completely init [--nested] [CONFIG_PATH]'
9
9
  usage 'completely init (-h|--help)'
10
10
 
11
+ option '-n --nested', 'Generate a nested configuration'
12
+
11
13
  param_config_path
12
14
  environment_config_path
13
15
 
@@ -24,8 +26,15 @@ module Completely
24
26
  @sample ||= File.read sample_path
25
27
  end
26
28
 
29
+ def nested?
30
+ args['--nested']
31
+ end
32
+
27
33
  def sample_path
28
- @sample_path ||= File.expand_path '../templates/sample.yaml', __dir__
34
+ @sample_path ||= begin
35
+ sample_name = nested? ? 'sample-nested' : 'sample'
36
+ File.expand_path "../templates/#{sample_name}.yaml", __dir__
37
+ end
29
38
  end
30
39
  end
31
40
  end
@@ -7,23 +7,20 @@ module Completely
7
7
 
8
8
  class << self
9
9
  def load(config_path, function_name: nil)
10
- begin
11
- data = YAML.load_file config_path, aliases: true
12
- rescue ArgumentError
13
- # :nocov:
14
- data = YAML.load_file config_path
15
- # :nocov:
16
- end
17
-
18
- new data, function_name: function_name
10
+ config = Config.load config_path
11
+ new config, function_name: function_name
19
12
  end
20
13
  end
21
14
 
22
15
  def initialize(config, function_name: nil)
23
- @config = config
16
+ @config = config.is_a?(Config) ? config : Config.new(config)
24
17
  @function_name = function_name
25
18
  end
26
19
 
20
+ def flat_config
21
+ @flat_config ||= config.flat_config
22
+ end
23
+
27
24
  def patterns
28
25
  @patterns ||= patterns!
29
26
  end
@@ -54,7 +51,7 @@ module Completely
54
51
  private
55
52
 
56
53
  def patterns!
57
- result = config.map do |text, completions|
54
+ result = flat_config.map do |text, completions|
58
55
  Pattern.new text, completions, pattern_function_name
59
56
  end
60
57
 
@@ -70,7 +67,7 @@ module Completely
70
67
  end
71
68
 
72
69
  def command
73
- @command ||= config.keys.first.split.first
70
+ @command ||= flat_config.keys.first.split.first
74
71
  end
75
72
 
76
73
  def function_name
@@ -0,0 +1,69 @@
1
+ module Completely
2
+ class Config
3
+ attr_reader :config
4
+
5
+ class << self
6
+ def load(config_path)
7
+ begin
8
+ config = YAML.load_file config_path, aliases: true
9
+ rescue ArgumentError
10
+ # :nocov:
11
+ config = YAML.load_file config_path
12
+ # :nocov:
13
+ end
14
+
15
+ new config
16
+ end
17
+ end
18
+
19
+ def initialize(config)
20
+ @config = config
21
+ end
22
+
23
+ def flat_config
24
+ result = {}
25
+
26
+ config.each do |root_key, root_list|
27
+ result.merge! process_key(root_key, root_list)
28
+ end
29
+
30
+ result
31
+ end
32
+
33
+ private
34
+
35
+ def process_key(prefix, list)
36
+ result = {}
37
+ result[prefix] = collect_immediate_children list
38
+ result.merge! process_nested_items(prefix, list)
39
+ result
40
+ end
41
+
42
+ def collect_immediate_children(list)
43
+ list.map do |item|
44
+ x = item.is_a?(Hash) ? item.keys.first : item
45
+ x.gsub(/^[*+]/, '')
46
+ end
47
+ end
48
+
49
+ def process_nested_items(prefix, list)
50
+ result = {}
51
+
52
+ list.each do |item|
53
+ next unless item.is_a? Hash
54
+
55
+ nested_prefix = generate_nested_prefix(prefix, item)
56
+ nested_list = item.values.first
57
+ result.merge!(process_key(nested_prefix, nested_list))
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ def generate_nested_prefix(prefix, item)
64
+ appended_prefix = item.keys.first.gsub(/^\+/, '*')
65
+ appended_prefix = " #{appended_prefix}" unless appended_prefix.start_with? '*'
66
+ "#{prefix}#{appended_prefix}"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,14 @@
1
+ mygit:
2
+ - -h
3
+ - -v
4
+ - --help
5
+ - --version
6
+ - init:
7
+ - --bare
8
+ - <directory>
9
+ - status:
10
+ - --help
11
+ - --verbose
12
+ - +--branch: &branches
13
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
14
+ - +-b: *branches
@@ -1,25 +1,22 @@
1
1
  mygit:
2
+ - -h
3
+ - -v
2
4
  - --help
3
5
  - --version
4
- - status
5
6
  - init
6
- - commit
7
+ - status
8
+
9
+ mygit init:
10
+ - --bare
11
+ - <directory>
7
12
 
8
13
  mygit status:
9
14
  - --help
10
15
  - --verbose
11
16
  - --branch
12
- - $(git branch 2>/dev/null)
17
+ - -b
13
18
 
14
- mygit init:
15
- - --bare
16
- - <directory>
19
+ mygit status*--branch: &branches
20
+ - $(git branch --format='%(refname:short)' 2>/dev/null)
17
21
 
18
- mygit commit:
19
- - <file>
20
- - --help
21
- - --message
22
- - --all
23
- - -a
24
- - --quiet
25
- - -q
22
+ mygit status*-b: *branches
@@ -1,3 +1,3 @@
1
1
  module Completely
2
- VERSION = '0.6.3'
2
+ VERSION = '0.7.0-rc1'
3
3
  end
data/lib/completely.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'completely/exceptions'
2
+ require 'completely/config'
2
3
  require 'completely/pattern'
3
4
  require 'completely/completions'
4
5
  require 'completely/tester'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: completely
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0.pre.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-05 00:00:00.000000000 Z
11
+ date: 2024-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -63,9 +63,11 @@ files:
63
63
  - lib/completely/commands/test.rb
64
64
  - lib/completely/commands/uninstall.rb
65
65
  - lib/completely/completions.rb
66
+ - lib/completely/config.rb
66
67
  - lib/completely/exceptions.rb
67
68
  - lib/completely/installer.rb
68
69
  - lib/completely/pattern.rb
70
+ - lib/completely/templates/sample-nested.yaml
69
71
  - lib/completely/templates/sample.yaml
70
72
  - lib/completely/templates/template.erb
71
73
  - lib/completely/templates/tester-template.erb
@@ -94,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
96
  - !ruby/object:Gem::Version
95
97
  version: '0'
96
98
  requirements: []
97
- rubygems_version: 3.5.14
99
+ rubygems_version: 3.5.23
98
100
  signing_key:
99
101
  specification_version: 4
100
102
  summary: Bash Completions Generator