tabry 0.1.0 → 0.1.1

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: 8531aa56c6c59a5d678e280ccb39fa8fd891aadac1d4fd194d73cacee20aaa47
4
- data.tar.gz: ab532e18804f52824ccebf21667aa8da6416324eaa428d58140b758e22160b6a
3
+ metadata.gz: a813a02fd7d1076dfe3f3ee4076fa7d0b4f9fe5c7dae2722f60f7ad0b693fb35
4
+ data.tar.gz: 0b3631d634da37690deb4e405b856e06f7b12aa8af464a3b4a011d0e68938a57
5
5
  SHA512:
6
- metadata.gz: 62d4481040a2c2e06e5f16e0c5ef559fddf4cb6330d61d9962af8295c940d56c40bce23df662dbb168c83c48ed929fe30e1f2bf7e91ddc6fda06595c9576b63c
7
- data.tar.gz: 1447eb824ec57c40b4dcc4eaeaefbd1488f514bd10535c7035f3439558f03a1368c1cf1cc7674804d2976ab9dadede3d0a818ff9e87e140cd58f67e983026ffb
6
+ metadata.gz: cf85b3d904c1b02b868e205b654328c99ee733c97950c0182a8c5ffc48dcf281443eab28fc870945cad1eb4a34f39af9f2badc1a725506db38d58fd9d417665a
7
+ data.tar.gz: fdf3ba0343a7ab8b2254a4c9d49996ea18d37854e7fce2c11ccbcf0b456667f636f84d05d6811dde97276f4805372e3669f708a67ca5e4b16201da4ef524f8eb
data/bin/tabry-bash CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ # Run by the tabry_bash_core.sh bash tab completion function to plug into Tabry
5
+ # to get completion options.
6
+
4
7
  require "shellwords"
5
8
  require "yaml"
6
9
  require_relative "../lib/tabry/util"
data/bin/tabry-help CHANGED
@@ -5,7 +5,7 @@ require_relative "../lib/tabry/runner"
5
5
 
6
6
  # Show usage information stored in a tabry configuration.
7
7
  #
8
- # For ease of use, source sh/tabry_bash_help.sh so you can just do
8
+ # For ease of use, source sh/bash/tabry_bash_help.sh so you can just do
9
9
  # "help mycmd"
10
10
 
11
11
  raise "Usage: tabry-help config_name [arg1 [arg2]]..." unless ARGV.length >= 1
@@ -21,9 +21,16 @@ module Tabry
21
21
  def load
22
22
  return load_from_file(name) if name =~ /\.json$/i || name =~ /\.ya?ml$/i
23
23
 
24
- load_paths.each do |dir|
24
+ load_paths.each do |path|
25
25
  EXTENSIONS.each do |extension|
26
- filename = "#{dir}/#{name}.#{extension}"
26
+ basename = "/#{name}.#{extension}"
27
+
28
+ # First check if the path _is_ the file "mycmd.json", "mycmd.yml" we are looking for
29
+ return load_from_file(path) if path.end_with?(basename) && File.exist?(path)
30
+
31
+ # Then look for a file "mycmd.json", "mycmd.yml" etc. in the
32
+ # directory (assuming it is a directory)
33
+ filename = "#{path}/#{basename}"
27
34
  return load_from_file(filename) if File.exist?(filename)
28
35
  end
29
36
  end
@@ -0,0 +1,28 @@
1
+ module Tabry
2
+ module Shells
3
+ module Bash
4
+ # NOTE! This code uses sh/bash/tabry_bash_core.sh and is described in
5
+ # sh/bash/README.md; see that README for more info
6
+ def self.generate(cmd_name, tabry_file_path)
7
+ capitalized_cmd_name = cmd_name.upcase.gsub(/[^a-zA-Z0-9_]/, '_')
8
+ tabry_file = Shellwords.escape(File.expand_path(tabry_file_path))
9
+ path_to_tabry = Shellwords.escape(File.expand_path("#{__dir__}/../../../"))
10
+
11
+ core = File.read("#{__dir__}/../../../sh/bash/tabry_bash_core.sh")
12
+ core.gsub! "_tabry_completions_internal()", "_tabry_#{capitalized_cmd_name}_completions_internal()"
13
+
14
+ return <<~END + core
15
+ # The following Autocomplete is for a Tabry-powered command. It was
16
+ # generated by the command itself. See the documentation located in
17
+ # #{path_to_tabry}/sh/bash/README.md
18
+ _tabry_#{capitalized_cmd_name}_completions() {
19
+ TABRY_IMPORTS_PATH=#{tabry_file} _tabry_#{capitalized_cmd_name}_completions_internal #{path_to_tabry}/bin/tabry-bash
20
+ }
21
+ complete -F _tabry_#{capitalized_cmd_name}_completions #{Shellwords.escape cmd_name}
22
+ END
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+
data/sh/bash/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Tabry Bash glue
2
+
3
+ This directory contains code needed to make Tabry autocomplete work with bash.
4
+ The code here is basically glue code needed to connect bash's autocomplete
5
+ framework with Tabry (which does all the work of generating tab completion
6
+ options). Additionally, `tabry_bash_help.sh` is provided to override bash's
7
+ help command to provide help to commands that have tabry completion.
8
+
9
+ # Quickstart for adding Tab completion
10
+ * To add Tabry to non-tabry based CLIs, follow the instructions in `tabry_bash.sh`
11
+ * For Tabry-based CLIs, run "mycmd completion bash" and add the code to your `~/.bash_profile`
12
+
13
+ # Tabry Bash autocompletion technical overview
14
+ The main bash function which calls out to tabry to provide tab completion options is in
15
+ `tabry_bash_core.sh`. This defines a function called
16
+ `_tabry_completions_internal`. **If editing the file, it is important you
17
+ do not rename this function or add lines starting with this function name
18
+ without understanding the substitution as mentioned below.**
19
+
20
+ This file and bash function contained within is used in two ways:
21
+ * For Ruby CLIs written using tabry, this is renamed to to
22
+ `_tabry_MYCOMMAND_completions_internal`, and a bit of extra bash code is
23
+ added on, to make tab completion specific for the program. This is generated
24
+ for each command when the user runs "mycommand completion bash", which calls
25
+ `Tabry::Shells::Bash.generate`. A new function for each CLI so different CLIs
26
+ can use different versions of tabrygq without interfering with each other.
27
+ The name `_tabry_completions_internal_` is replaced in
28
+ `lib/tabry/shells/bash.rb` in the `generate` method, so if modifying
29
+ `tabry_bash_core.sh`, you should if make sure the substitution still works
30
+ properly.
31
+ * You can also use Tabry to add tab completion to other non-Tabry CLIs. In this
32
+ case, the `_tabry_completions_internal_` function is used as-is; it is
33
+ sourced from `tabry_bash.sh`. See `tabry_bash.sh` for details and
34
+ instructions on how to use it.
35
+
@@ -0,0 +1,22 @@
1
+ # Use this file to use Tabry tab completion with non-Tabry CLIs. To do this,
2
+ # source this file in your bash_profile and add lines like
3
+ # `complete -F _tabry_completions somecli` for each CLI. You will also
4
+ # need the tabry JSON/YML files in ~/.tabry/ or in a path in your
5
+ # TABRY_IMPORTS_PATH. For instance, to add tab completion to vaulted and
6
+ # rapture, you can add this to your ~/.bash_profile:
7
+ #
8
+ # source /path/to/tabry/sh/bash/tabry_bash.sh
9
+ # complete -F _tabry_completions rapture
10
+ # complete -F _tabry_completions vaulted
11
+ #
12
+ # Then be sure to either copy tabry/examples/tabry/vaulted.json and rapture.json to ~/.tabry/,
13
+ # or set TABRY_IMPORTS_PATH in ~/.bash_profile like so:
14
+ #
15
+ # TABRY_IMPORTS_PATH=$TABRY_IMPORTS_PATH:/path/to/tabry/examples/tabry/
16
+ #
17
+
18
+ source "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )"/tabry_bash_core.sh
19
+ _tabry_completions() {
20
+ _tabry_completions_internal "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )"/../../bin/tabry-bash
21
+ }
22
+
@@ -1,19 +1,14 @@
1
- #/usr/bin/env bash
2
-
3
- # Bash completion
4
- # _tabry_completions function is same for any command you use with tabry, you just need
5
- # to do `complete -F _tabry_completions mycmd` for your command. This calls the tabry-bash
6
- # ruby script. For more info see LANGUAGE_REFERENCE.md
7
-
8
- _tabry_bash="$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )"/../bin/tabry-bash
9
-
10
- _tabry_completions()
1
+ # For more information, or before editing the tabry_bash_core.sh source file,
2
+ # See sh/bash/README.md and sh/bash/tabry_bash.sh in the tabry gem
3
+ _tabry_completions_internal()
11
4
  {
5
+ local tabry_bash="$1"
6
+
12
7
  [[ -n "$TABRY_DEBUG" ]] && echo && echo -n tabry start bash: && date +%s.%N >&2
13
8
  local saveifs="$IFS"
14
9
  IFS=$'\n'
15
10
 
16
- local result=`"$_tabry_bash" "$COMP_LINE" "$COMP_POINT"`
11
+ local result=`ruby "$tabry_bash" "$COMP_LINE" "$COMP_POINT"`
17
12
  local specials
18
13
 
19
14
  if [[ $result == *$'\n'$'\n'* ]]; then
@@ -54,8 +49,3 @@ _tabry_completions()
54
49
  [[ -n "$TABRY_DEBUG" ]] && echo -n tabry end bash: && date +%s.%N >&2
55
50
  }
56
51
 
57
- # To use: put a .json/.yml tabry config file in ~/.tabry (e.g. ~/.aws.json)
58
- # Then, run this script in your shell startup scripts, plus (e.g.)
59
- #
60
- # complete -F _tabry_completions aws
61
-
@@ -1,7 +1,7 @@
1
1
  # 'help mycommand' -> show tabry help for a tabry-CLI or command you have a
2
2
  # tabry tab completion config for
3
3
 
4
- _tabry_help="$( dirname "${BASH_SOURCE[0]}" )"/../bin/tabry-help
4
+ _tabry_help="$( dirname "${BASH_SOURCE[0]}" )"/../../bin/tabry-help
5
5
  help() {
6
6
  tabry-help "$@" 2>/dev/null || command help "$@"
7
7
  }
@@ -24,22 +24,28 @@ describe Tabry::ConfigLoader do
24
24
  describe "use of $TABRY_IMPORTS_PATH" do
25
25
  before { ENV["TABRY_IMPORTS_PATH"] = "#{__dir__}/../fixtures/" }
26
26
 
27
- it "looks for yaml files in TABRY_IMPORTS_PATH" do
27
+ it "looks for yaml files in directories in TABRY_IMPORTS_PATH" do
28
28
  config = described_class.load(name: "vehicles")
29
29
  expect(config.main.subs.map(&:name)).to eq(
30
30
  %w[build list-vehicles move sub-with-sub-or-arg sub-with-mandatory-flag]
31
31
  )
32
32
  end
33
33
 
34
- it "looks for json files in TABRY_IMPORTS_PATH" do
34
+ it "looks for json files in directories in TABRY_IMPORTS_PATH" do
35
35
  config = described_class.load(name: "basiccli")
36
36
  expect(config.main.subs.map(&:name)).to eq(%w[foo])
37
37
  end
38
38
 
39
- it "looks for yml files in TABRY_IMPORTS_PATH" do
39
+ it "looks for yml files in directories in TABRY_IMPORTS_PATH" do
40
40
  config = described_class.load(name: "basiccli2")
41
41
  expect(config.main.subs.map(&:name)).to eq(%w[waz])
42
42
  end
43
+
44
+ it "looks for json files in TABRY_IMPORTS_PATH" do
45
+ ENV["TABRY_IMPORTS_PATH"] = "#{__dir__}/../fixtures/basiccli.json"
46
+ config = described_class.load(name: "basiccli")
47
+ expect(config.main.subs.map(&:name)).to eq(%w[foo])
48
+ end
43
49
  end
44
50
 
45
51
  describe "use of $HOME" do
data/tabry.gemspec CHANGED
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "tabry"
9
- s.version = "0.1.0"
9
+ s.version = "0.1.1"
10
10
  s.summary = "Tab completion and CLIs extraordinaire"
11
11
  s.authors = ["Evan Battaglia"]
12
12
  s.email = "battaglia.evan@gmail.com"
@@ -18,6 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
+ # Currently, to get tab completions, we run tabry without bundler. This makes
22
+ # it much faster, but requires it have no dependencies.
23
+
21
24
  s.add_development_dependency "pry-byebug", "~> 3.10"
22
25
  s.add_development_dependency "rspec", "~> 3.10"
23
26
  s.add_development_dependency "rubocop", "~> 1.22"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tabry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Battaglia
@@ -133,11 +133,14 @@ files:
133
133
  - lib/tabry/options_finder.rb
134
134
  - lib/tabry/result.rb
135
135
  - lib/tabry/runner.rb
136
+ - lib/tabry/shells/bash.rb
136
137
  - lib/tabry/state.rb
137
138
  - lib/tabry/usage_generator.rb
138
139
  - lib/tabry/util.rb
139
- - sh/tabry_bash.sh
140
- - sh/tabry_bash_help.sh
140
+ - sh/bash/README.md
141
+ - sh/bash/tabry_bash.sh
142
+ - sh/bash/tabry_bash_core.sh
143
+ - sh/bash/tabry_bash_help.sh
141
144
  - spec/fixtures/basiccli.json
142
145
  - spec/fixtures/basiccli.tabry
143
146
  - spec/fixtures/basiccli2.tabry