bashly 0.8.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3d0126229189987753e653a635054113961b1e9e0244d4cdb956beb1d5aff94
4
- data.tar.gz: 886987a65edc65d16d2134589cbb4ee9f3fcb9e0b1819c8a87211bcd2d164d0c
3
+ metadata.gz: 4be359964fc41fae59f83eae85c594a4e0edec41e0cc5752fec25850b7b7ca43
4
+ data.tar.gz: 62023932e59ae5b9856a9617f9148a7e28bfab5bca5cebca98d3fefbf401ae21
5
5
  SHA512:
6
- metadata.gz: 880579e8bb650c8835cc7992054f3f4dd3e765ddc1b7072f83ed6fc9049d4b56b38c4a64220c3dd154f8fdbf199462cca1ef955d36d465a0d57ecc00715bd85e
7
- data.tar.gz: efa2f73f9eed6d5ba1ebb432e37ef639e618bc1556ba83059ccad4804b6568b407d86f91fe11faa3335b69103e368fdb9bf1339f90af1fd15cb742b91163b911
6
+ metadata.gz: a0e222c6ead53cfef4597653d9ce51b6e9fffd1a3556acd72eff5447b9a203371a0097cd42f4058405cd473e7f0c55f4f9a448d45d3b1af73898b74a79706df4
7
+ data.tar.gz: 8362eff89fccaad8c9a1f370270e33426d0089bbe131eec4fc55f586413afaa556caa81e62389daefb400941122db96fa1f8b4e04d3780a4d45ea88060dfdc1e
@@ -1,6 +1,21 @@
1
1
  module Bashly
2
2
  # This is a `Command` concern responsible for providing additional scopes.
3
3
  module CommandScopes
4
+ # Returns an array of all full names (including aliases and aliases of
5
+ # parents)
6
+ def all_full_names
7
+ if parent_command
8
+ parent_command.all_full_names.product(aliases).map { |a| a.join ' ' }
9
+ else
10
+ aliases
11
+ end
12
+ end
13
+
14
+ # Returns a full list of the Command names and aliases combined
15
+ def command_aliases
16
+ commands.map(&:aliases).flatten
17
+ end
18
+
4
19
  # Returns only the names of the Commands
5
20
  def command_names
6
21
  commands.map &:name
@@ -1,51 +1,76 @@
1
1
  require 'completely'
2
2
 
3
3
  module Bashly
4
- # This is a `Command` concern responsible for providing bash completion data
4
+ # This is a `Command` and `Flag` concern responsible for providing bash
5
+ # completion data
5
6
  module Completions
6
- def completion_data(with_version: true)
7
- result = { full_name => completion_words(with_version: with_version) }
8
-
9
- commands.each do |command|
10
- result.merge! command.completion_data(with_version: false)
11
- end
7
+ module Flag
8
+ def completion_data(command_full_name)
9
+ result = {}
10
+ comps = allowed || completions
12
11
 
13
- result
14
- end
12
+ if comps
13
+ aliases.each do |name|
14
+ result["#{command_full_name}*#{name}"] = comps
15
+ end
16
+ end
15
17
 
16
- def completion_script
17
- completion_generator.script
18
+ result
19
+ end
18
20
  end
19
21
 
20
- def completion_function(name = nil)
21
- completion_generator.wrapper_function(name)
22
- end
22
+ module Command
23
+ def completion_data(with_version: true)
24
+ result = {}
23
25
 
24
- private
26
+ all_full_names.each do |name|
27
+ result[name] = completion_words(with_version: with_version)
28
+ flags.each do |flag|
29
+ result.merge! flag.completion_data(name)
30
+ end
31
+ end
32
+
33
+ commands.each do |command|
34
+ result.merge! command.completion_data(with_version: false)
35
+ end
25
36
 
26
- def completion_generator
27
- Completely::Completions.new(completion_data)
28
- end
37
+ result
38
+ end
29
39
 
30
- def completion_flag_names
31
- flags.map(&:name) + flags.map(&:short)
32
- end
40
+ def completion_script
41
+ completion_generator.script
42
+ end
33
43
 
34
- def completion_allowed_args
35
- flags.map(&:allowed).flatten + args.map(&:allowed).flatten
36
- end
44
+ def completion_function(name = nil)
45
+ completion_generator.wrapper_function(name)
46
+ end
37
47
 
38
- def completion_words(with_version: false)
39
- trivial_flags = %w[--help -h]
40
- trivial_flags += %w[--version -v] if with_version
41
- all = (
42
- command_names + trivial_flags +
43
- completion_flag_names + completion_allowed_args
44
- )
48
+ private
45
49
 
46
- all += completions if completions
47
- all.compact.uniq.sort
48
- end
50
+ def completion_generator
51
+ Completely::Completions.new(completion_data)
52
+ end
53
+
54
+ def completion_flag_names
55
+ flags.map(&:name) + flags.map(&:short)
56
+ end
57
+
58
+ def completion_allowed_args
59
+ args.map(&:allowed).flatten
60
+ end
61
+
62
+ def completion_words(with_version: false)
63
+ trivial_flags = %w[--help -h]
64
+ trivial_flags += %w[--version -v] if with_version
65
+ all = (
66
+ command_aliases + trivial_flags +
67
+ completion_flag_names + completion_allowed_args
68
+ )
49
69
 
70
+ all += completions if completions
71
+ all.compact.uniq.sort
72
+ end
73
+
74
+ end
50
75
  end
51
- end
76
+ end
@@ -52,10 +52,16 @@ module Bashly
52
52
  end
53
53
  end
54
54
 
55
- def assert_uniq(key, value, array_key)
55
+ def assert_uniq(key, value, array_keys)
56
56
  return unless value
57
- list = value.map { |c| c[array_key] }.compact.flatten
58
- assert list.uniq?, "#{key} cannot have elements with similar #{array_key} values"
57
+ array_keys = [array_keys] unless array_keys.is_a? Array
58
+ list = []
59
+ array_keys.each do |array_key|
60
+ list += value.map { |c| c[array_key] }.compact.flatten
61
+ end
62
+
63
+ nonuniqs = list.nonuniq
64
+ assert nonuniqs.empty?, "#{key} contains non-unique elements (#{nonuniqs.join ', '}) in #{array_keys.join ' or '}"
59
65
  end
60
66
 
61
67
  def assert_string_or_array(key, value)
@@ -61,6 +61,8 @@ module Bashly
61
61
  assert_hash key, value, Script::Flag.option_keys
62
62
  assert value['short'] || value['long'], "#{key} must have at least one of long or short name"
63
63
 
64
+ refute value['allowed'] && value['completions'], "#{key} cannot have both allowed and completions"
65
+
64
66
  assert_optional_string "#{key}.long", value['long']
65
67
  assert_optional_string "#{key}.short", value['short']
66
68
  assert_optional_string "#{key}.help", value['help']
@@ -72,6 +74,7 @@ module Bashly
72
74
  assert_boolean "#{key}.required", value['required']
73
75
  assert_array "#{key}.allowed", value['allowed'], of: :string
74
76
  assert_array "#{key}.conflicts", value['conflicts'], of: :string
77
+ assert_array "#{key}.completions", value['completions'], of: :string
75
78
 
76
79
  assert value['long'].match(/^--[a-zA-Z0-9_\-]+$/), "#{key}.long must be in the form of '--name'" if value['long']
77
80
  assert value['short'].match(/^-[a-zA-Z0-9]$/), "#{key}.short must be in the form of '-n'" if value['short']
@@ -86,6 +89,10 @@ module Bashly
86
89
  if value['allowed']
87
90
  assert value['arg'], "#{key}.allowed does not make sense without arg"
88
91
  end
92
+
93
+ if value['completions']
94
+ assert value['arg'], "#{key}.completions does not make sense without arg"
95
+ end
89
96
  end
90
97
 
91
98
  def assert_env_var(key, value)
@@ -124,8 +131,7 @@ module Bashly
124
131
  assert_array "#{key}.environment_variables", value['environment_variables'], of: :env_var
125
132
  assert_array "#{key}.examples", value['examples'], of: :string
126
133
 
127
- assert_uniq "#{key}.commands", value['commands'], 'name'
128
- assert_uniq "#{key}.commands", value['commands'], 'alias'
134
+ assert_uniq "#{key}.commands", value['commands'], ['name', 'alias']
129
135
  assert_uniq "#{key}.flags", value['flags'], 'long'
130
136
  assert_uniq "#{key}.flags", value['flags'], 'short'
131
137
  assert_uniq "#{key}.args", value['args'], 'name'
@@ -5,8 +5,8 @@ class Array
5
5
  map { |line| "#{indentation}#{line}" }
6
6
  end
7
7
 
8
- def uniq?
9
- self == uniq
8
+ def nonuniq
9
+ tally.select { |key, count| count > 1 }.keys
10
10
  end
11
11
 
12
12
  end
@@ -1,7 +1,7 @@
1
1
  module Bashly
2
2
  module Script
3
3
  class Command < Base
4
- include Completions
4
+ include Completions::Command
5
5
  include CommandScopes
6
6
 
7
7
  class << self
@@ -62,6 +62,7 @@ module Bashly
62
62
  return [] unless options["commands"]
63
63
  options["commands"].map do |options|
64
64
  options['parents'] = parents + [name]
65
+ options['parent_command'] = self
65
66
  Command.new options
66
67
  end
67
68
  end
@@ -116,6 +117,11 @@ module Bashly
116
117
  Settings.production? ? content : "#{view_marker path}\n#{content}"
117
118
  end
118
119
 
120
+ # Returns the Command instance of the direct parent
121
+ def parent_command
122
+ options['parent_command']
123
+ end
124
+
119
125
  # Returns an array of all parents. For example, the command
120
126
  # "docker container run" will have [docker, container] as its parents
121
127
  def parents
@@ -1,11 +1,13 @@
1
1
  module Bashly
2
2
  module Script
3
3
  class Flag < Base
4
+ include Completions::Flag
5
+
4
6
  class << self
5
7
  def option_keys
6
8
  @option_keys ||= %i[
7
- allowed arg conflicts default help long repeatable required
8
- short validate
9
+ allowed arg completions conflicts default help long repeatable
10
+ required short validate
9
11
  ]
10
12
  end
11
13
  end
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.8.0"
2
+ VERSION = "0.8.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bashly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
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: 2022-05-12 00:00:00.000000000 Z
11
+ date: 2022-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.6'
19
+ version: '0.7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.6'
26
+ version: '0.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: completely
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.3'
33
+ version: 0.4.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.3'
40
+ version: 0.4.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mister_bin
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.1'
61
+ version: '0.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.1'
68
+ version: '0.2'
69
69
  description: Generate bash command line tools using YAML configuration
70
70
  email: db@dannyben.com
71
71
  executables: