tabtab 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -1
- data/Manifest.txt +1 -1
- data/README.rdoc +69 -3
- data/Rakefile +1 -1
- data/lib/install_tabtab/cli.rb +3 -3
- data/lib/tabtab.rb +1 -1
- data/lib/tabtab/cli.rb +17 -5
- data/lib/tabtab/definitions/base.rb +1 -1
- data/lib/tabtab/definitions/default.rb +2 -2
- data/lib/tabtab_definitions/rake.rb +20 -0
- data/lib/tabtab_definitions/rubyforge.rb +17 -5
- data/spec/fixtures/gems/multi_app/multi_app-0.0.1.gem +0 -0
- data/spec/fixtures/gems/multi_app/multi_app.gemspec +4 -4
- data/spec/fixtures/gems/my_app/my_app-0.0.1.gem +0 -0
- data/spec/fixtures/gems/my_app/my_app.gemspec +4 -4
- data/spec/install_tabtab_cli_spec.rb +5 -5
- data/spec/tabtab_cli_spec.rb +41 -0
- metadata +4 -4
- data/lib/dev_definitions/rake.rb +0 -23
data/History.txt
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
== 0.
|
1
|
+
== 0.91 2008-12-29
|
2
|
+
|
3
|
+
* Uses ENV['COMP_LINE'] for full current line if available
|
4
|
+
* New completions: rubyforge, rake
|
5
|
+
* Bugs fixed:
|
6
|
+
* Only install completions from latest version of each gem
|
7
|
+
|
8
|
+
== 0.9.0 2008-11-12
|
2
9
|
|
3
10
|
* 1 major enhancement:
|
4
11
|
* Initial release
|
data/Manifest.txt
CHANGED
@@ -21,7 +21,6 @@ features/steps/env.rb
|
|
21
21
|
features/steps/gems.rb
|
22
22
|
features/steps/shells.rb
|
23
23
|
lib/dev_definitions/gem.rb
|
24
|
-
lib/dev_definitions/rake.rb
|
25
24
|
lib/dev_definitions/script-generate.rb
|
26
25
|
lib/dev_definitions/script-server.rb
|
27
26
|
lib/install_tabtab/cli.rb
|
@@ -44,6 +43,7 @@ lib/tabtab_definitions/cucumber.rb
|
|
44
43
|
lib/tabtab_definitions/github.rb
|
45
44
|
lib/tabtab_definitions/newgem.rb
|
46
45
|
lib/tabtab_definitions/rails.rb
|
46
|
+
lib/tabtab_definitions/rake.rb
|
47
47
|
lib/tabtab_definitions/rubyforge.rb
|
48
48
|
script/console
|
49
49
|
script/destroy
|
data/README.rdoc
CHANGED
@@ -12,7 +12,7 @@ of a command-line application or a target file or folder. Its possible to
|
|
12
12
|
provide your own completions for applications: git comes with bash shell completions,
|
13
13
|
and the fish shell includes a library of completions for many applications.
|
14
14
|
|
15
|
-
|
15
|
+
=== Quick Start/Trial Me:
|
16
16
|
|
17
17
|
The tabtab gem comes with some pre-defined completions for some popular applications
|
18
18
|
that benefit from completions: rails, newgem, cucumber, github (and its alias gh).
|
@@ -25,12 +25,14 @@ It takes 2 minutes to trial this project and see if you like it:
|
|
25
25
|
|
26
26
|
rails -d TABTAB
|
27
27
|
|
28
|
+
sudo gem install defunkt-github -s http://gems.github.com
|
28
29
|
cd project/hosted/on/github/with/contributors/like/rails/or/rspec
|
30
|
+
|
29
31
|
github TABTAB
|
30
32
|
gh netTAB feTAB
|
31
33
|
gh netTAB web TABTAB
|
32
34
|
|
33
|
-
It just works.
|
35
|
+
It just works. Flags. Commands. Intelligent values. Aliases. Ooh yeah.
|
34
36
|
|
35
37
|
Now, add 'source ~/.tabtab.bash' to your .bash_profile so you have this awesomeness in all your
|
36
38
|
terminal shells.
|
@@ -343,6 +345,60 @@ please let me know. I have some cucumber scenarios ready and waiting for your he
|
|
343
345
|
Currently, tabtab works with the bash shell, though it is designed to be
|
344
346
|
shell agnostic.
|
345
347
|
|
348
|
+
== KNOWN ISSUES/LIMITATIONS & ARCHITECTURE OVERVIEW:
|
349
|
+
|
350
|
+
Pride and ego mean this section goes at the bottom of the readme... this section includes the known
|
351
|
+
issues and limitations of TabTab due to current architectural decisions, the aim of being
|
352
|
+
shell agnostic whilst initially only implementing TabTab for bash, and DSL challenges in
|
353
|
+
attempting to support all possible command-line app APIs with a sexy, small DSL for describing
|
354
|
+
auto-completions.
|
355
|
+
|
356
|
+
=== Cannot support rake/sake/cap colon-separated completions
|
357
|
+
|
358
|
+
This will be fixed soon. I only just discovered this deficiency.
|
359
|
+
|
360
|
+
Auto-completion for rake/sake/cap - when I get it working - will allow you to tab
|
361
|
+
through the namespacing across the colons. E.g. 'rake db:test:' and tabtab will show
|
362
|
+
all the tasks within this namespace. That's what it should do. That's what all the
|
363
|
+
current implementations of auto-completion do before tabtab. But with tabtab (currently)
|
364
|
+
it can't do it. I suck. But here's the reason and the fix.
|
365
|
+
|
366
|
+
To fix it requires rewriting the guts of the tabtab application to use $COMP_LINE
|
367
|
+
environment variable instead of the current, previous token.
|
368
|
+
|
369
|
+
Currently tabtab works by passing the current and previous token in the current command
|
370
|
+
line string around. But bash isn't coping with colon's correctly. If you tabtab after
|
371
|
+
a colon it just ignores the characters before it.
|
372
|
+
|
373
|
+
So, I'll abandon the whole mechanism of (current, previous) tokens and use the $COMP_LINE
|
374
|
+
variable and manually parse it into tokens via the Shellwords.shellwords function.
|
375
|
+
|
376
|
+
=== Nested intelligent lists
|
377
|
+
|
378
|
+
Some applications may want to have multiple auto-completed values in a row, with the 2nd value's list
|
379
|
+
being dependent upon the value of the first. For example, the 'rubyforge add_release' command takes
|
380
|
+
four more arguments: group_id, package_id, release_name, userfile. The first two - group_id and package_id -
|
381
|
+
are from known lists of values. The values available for package_id are dependent upon the group_id value.
|
382
|
+
This is a nested list, and currently TabTab probably can't do them.
|
383
|
+
|
384
|
+
Currently intelligent, dynamic lists of completable values are defined via 'default' blocks - either blocks
|
385
|
+
passed to #flag or #command calls, or via #default calls. I guess to support nested lists you'd need
|
386
|
+
nested default blocks. Not sure.
|
387
|
+
|
388
|
+
Or perhaps we need specific syntax to support commands with 2+ arguments.
|
389
|
+
|
390
|
+
TabTab::Definition.register('rubyforge') do |c|
|
391
|
+
c.command(:add_release, 1) { list_of_rubyforge_group_names }
|
392
|
+
c.command(:add_release, 2) { |group_id| list_of_rubyforge_package_names_in(group_id) }
|
393
|
+
end
|
394
|
+
|
395
|
+
In this pseudo code we redefine the :add_release command for each nested argument. The 2nd+ argument
|
396
|
+
is passed the completed values from the previous arguments of the command so they
|
397
|
+
can filter their lists as appropriate. Might work.
|
398
|
+
|
399
|
+
Of course, the second argument (1, 2, ...) would be optional and only required if you were trying
|
400
|
+
to describe a nested list of interdependent values.
|
401
|
+
|
346
402
|
== SOURCE:
|
347
403
|
|
348
404
|
The source for this project is at http://github.com/drnic/tabtab
|
@@ -354,11 +410,21 @@ Using git, you can clone the project, run its tests and install it:
|
|
354
410
|
rake
|
355
411
|
rake install_gem
|
356
412
|
|
357
|
-
== SPONSOR
|
413
|
+
== ACKNOWLEDGEMENT and SPONSOR
|
414
|
+
|
415
|
+
I wrote most of this at Railscamp #4 in Adelaide, between 13th and 17th of November 2008. Railscamps
|
416
|
+
are so awesome. They are a conference without the conference part. Coding, lightning talks, alcohol,
|
417
|
+
and guitar hero. Thanks to all the people I demo'd tabtab during its development, for their thoughts
|
418
|
+
on the final DSL, and finally for helping give TabTab a name.
|
419
|
+
|
420
|
+
After Railscamp, I kept coding tabtab instead of doing proper work. Therefore this project has
|
421
|
+
a sponsor:
|
358
422
|
|
359
423
|
* Mocra - the premier iPhone/Rails consultancy
|
360
424
|
* http://mocra.com
|
361
425
|
|
426
|
+
Like TabTab? Don't donate money, just hire us for your next Rails or iPhone party.
|
427
|
+
|
362
428
|
== LICENSE:
|
363
429
|
|
364
430
|
(The MIT License)
|
data/Rakefile
CHANGED
data/lib/install_tabtab/cli.rb
CHANGED
@@ -79,7 +79,7 @@ module InstallTabTab
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def find_gems_with_definition_files
|
82
|
-
Gem.
|
82
|
+
Gem.latest_load_paths.inject([]) do |mem, path|
|
83
83
|
root = path.gsub(/(lib|bin)$/,'')
|
84
84
|
mem << root unless mem.include?(root)
|
85
85
|
mem
|
@@ -87,14 +87,14 @@ module InstallTabTab
|
|
87
87
|
common_file = Dir[File.join(path, "**", "tabtab_definitions.rb")].reject { |tabtab_path| tabtab_path =~ /(spec|test)/ }.first
|
88
88
|
gem_name = nil
|
89
89
|
unless common_file.nil? || common_file.empty?
|
90
|
-
gem_name = common_file.match(/\/([^\/]*)-\d
|
90
|
+
gem_name = common_file.match(/\/([^\/]*)-\d+(\.\d+)+\/lib\//)[1]
|
91
91
|
TabTab::Definition.clear
|
92
92
|
load common_file
|
93
93
|
mem << { :gem_name => gem_name, :app_names => TabTab::Definition.app_names }
|
94
94
|
end
|
95
95
|
files = Dir[File.join(path, "**", "tabtab_definitions", "**", "*.rb")].reject { |tabtab_path| tabtab_path =~ /(spec|test)/ }
|
96
96
|
if files && files.size > 0
|
97
|
-
gem_path, gem_name = files.first.match(/^(.*\/([^\/]*)-\d
|
97
|
+
gem_path, gem_name = files.first.match(/^(.*\/([^\/]*)-\d+(\.\d+)+)/)[1..2]
|
98
98
|
files.each do |file|
|
99
99
|
TabTab::Definition.clear
|
100
100
|
load file
|
data/lib/tabtab.rb
CHANGED
data/lib/tabtab/cli.rb
CHANGED
@@ -16,11 +16,7 @@ module TabTab
|
|
16
16
|
|
17
17
|
def execute(stdout, arguments=[])
|
18
18
|
@stdout = stdout
|
19
|
-
|
20
|
-
# @full_line = ENV['COMP_LINE']
|
21
|
-
# @full_line_argv = Shellwords.shellwords(@full_line)
|
22
|
-
@app_name, @current_token, @previous_token = arguments[-3..-1]
|
23
|
-
parse_options(arguments[0..-4])
|
19
|
+
extract_tokens_and_parse_options(arguments)
|
24
20
|
load_global_config
|
25
21
|
if options[:external]
|
26
22
|
process_external
|
@@ -33,6 +29,22 @@ module TabTab
|
|
33
29
|
end
|
34
30
|
end
|
35
31
|
|
32
|
+
# parses the incoming tokens either via ENV['COMP_LINE'] or tokens from ARGV
|
33
|
+
def extract_tokens_and_parse_options(arguments)
|
34
|
+
if ENV['COMP_LINE']
|
35
|
+
require "shellwords"
|
36
|
+
line = ENV['COMP_LINE']
|
37
|
+
words = Shellwords.shellwords(line)
|
38
|
+
words << "" if line.split("")[-1] == " "
|
39
|
+
@app_name = words[0]
|
40
|
+
@previous_token, @current_token = words[-2..-1]
|
41
|
+
parse_options(arguments)
|
42
|
+
else
|
43
|
+
@app_name, @current_token, @previous_token = arguments[-3..-1]
|
44
|
+
parse_options(arguments[0..-4])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
36
48
|
def parse_options(arguments)
|
37
49
|
@options = {}
|
38
50
|
OptionParser.new do |opts|
|
@@ -106,7 +106,7 @@ class TabTab::Definition::Base
|
|
106
106
|
def yield_definition_block
|
107
107
|
if definition_block.nil?
|
108
108
|
return
|
109
|
-
elsif definition_block.arity == -1
|
109
|
+
elsif definition_block.arity == -1 || definition_block.arity == 0
|
110
110
|
# these blocks return a result/do lots of work - don't run them now
|
111
111
|
elsif definition_block.arity == 1
|
112
112
|
definition_block.call self
|
@@ -15,10 +15,10 @@ module TabTab::Definition
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def yield_result_block
|
18
|
-
if definition_block.arity == -1
|
18
|
+
if definition_block.arity == -1 || definition_block.arity == 0
|
19
19
|
definition_block.call
|
20
20
|
elsif definition_block.arity == 1
|
21
|
-
definition_block.call(
|
21
|
+
definition_block.call(self)
|
22
22
|
else
|
23
23
|
raise TabTab::Definition::InvalidDefinitionBlockArguments
|
24
24
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
TabTab::Definition.register('rake', :import => true) do |c|
|
2
|
+
def rake_silent_tasks
|
3
|
+
# TODO cache per directory
|
4
|
+
`rake --silent --tasks`
|
5
|
+
end
|
6
|
+
# c.cache :rake_silent_tasks, :per => :folder
|
7
|
+
|
8
|
+
c.default do |cmd|
|
9
|
+
next [] if cmd.current_token.nil? # TODO why are these blocks invoked twice? (1st on setup, 2nd for parsing)
|
10
|
+
tasks = (rake_silent_tasks.split("\n")[1..-1] || []).map { |line| line.split[1] }
|
11
|
+
if cmd.current_token =~ /^([-\w:]+:)/
|
12
|
+
upto_last_colon = Regexp.escape($1)
|
13
|
+
tasks = tasks.select { |task| /^#{Regexp.escape cmd.current_token}/ =~ task }
|
14
|
+
tasks.map! { |task| task.gsub(/#{Regexp.escape upto_last_colon}/, '') }
|
15
|
+
end
|
16
|
+
tasks
|
17
|
+
end
|
18
|
+
c.flags :silence, :s
|
19
|
+
c.flags :trace, :t
|
20
|
+
end
|
@@ -1,17 +1,29 @@
|
|
1
1
|
TabTab::Definition.register('rubyforge', :import => true) do |c|
|
2
|
+
def groups
|
3
|
+
require "yaml"
|
4
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/auto-config.yml")))
|
5
|
+
config["group_ids"].keys
|
6
|
+
end
|
7
|
+
|
2
8
|
def projects
|
3
|
-
|
9
|
+
require "yaml"
|
10
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/auto-config.yml")))
|
11
|
+
config["project_ids"].keys
|
4
12
|
end
|
13
|
+
|
5
14
|
c.command :setup
|
15
|
+
c.command :help
|
6
16
|
c.command(:config) { projects }
|
7
17
|
c.command :names
|
8
18
|
c.command :login do |login|
|
9
19
|
login.flag :username
|
10
20
|
login.flag :password
|
11
21
|
end
|
12
|
-
|
13
|
-
|
14
|
-
c.command
|
15
|
-
c.command
|
22
|
+
# TODO - need nesting of default blocks: rubyforge create_package group_id package_name
|
23
|
+
# This will probably require access to $COMP_LINE
|
24
|
+
c.command(:create_package) { groups }
|
25
|
+
c.command(:add_release) { groups }
|
26
|
+
c.command(:add_file) { groups }
|
27
|
+
c.command(:delete_package) { groups }
|
16
28
|
end
|
17
29
|
|
Binary file
|
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Dr Nic Williams"]
|
9
|
-
s.date = %q{2008-
|
9
|
+
s.date = %q{2008-12-29}
|
10
10
|
s.default_executable = %q{test_app}
|
11
11
|
s.description = %q{Multiple CLI apps + in-built autocompletions}
|
12
12
|
s.email = ["drnicwilliams@gmail.com"]
|
@@ -25,14 +25,14 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.specification_version = 2
|
26
26
|
|
27
27
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
-
s.add_development_dependency(%q<newgem>, [">= 1.
|
28
|
+
s.add_development_dependency(%q<newgem>, [">= 1.2.3"])
|
29
29
|
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
30
30
|
else
|
31
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
31
|
+
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
32
32
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
33
33
|
end
|
34
34
|
else
|
35
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
35
|
+
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
36
36
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
37
37
|
end
|
38
38
|
end
|
Binary file
|
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Dr Nic Williams"]
|
9
|
-
s.date = %q{2008-
|
9
|
+
s.date = %q{2008-12-29}
|
10
10
|
s.default_executable = %q{test_app}
|
11
11
|
s.description = %q{Simple CLI app + in-built autocompletions}
|
12
12
|
s.email = ["drnicwilliams@gmail.com"]
|
@@ -25,14 +25,14 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.specification_version = 2
|
26
26
|
|
27
27
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
-
s.add_development_dependency(%q<newgem>, [">= 1.
|
28
|
+
s.add_development_dependency(%q<newgem>, [">= 1.2.3"])
|
29
29
|
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
30
30
|
else
|
31
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
31
|
+
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
32
32
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
33
33
|
end
|
34
34
|
else
|
35
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
35
|
+
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
36
36
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
37
37
|
end
|
38
38
|
end
|
@@ -6,7 +6,7 @@ describe InstallTabTab::CLI, "with --development CLI flag" do
|
|
6
6
|
ENV['HOME'] = '/tmp/some/home'
|
7
7
|
dev_bin = File.expand_path(File.dirname(__FILE__) + "/../bin/tabtab")
|
8
8
|
@cli = InstallTabTab::CLI.new
|
9
|
-
Gem.expects(:
|
9
|
+
Gem.expects(:latest_load_paths).returns([])
|
10
10
|
@cli.expects(:config).returns({"external" => %w[test_app]}).at_least(2)
|
11
11
|
File.expects(:open).with('/tmp/some/home/.tabtab.bash', 'w').returns(mock do
|
12
12
|
expects(:<<).with("complete -o default -C '#{dev_bin} --external' test_app\n")
|
@@ -24,7 +24,7 @@ describe InstallTabTab::CLI, "with --external app flag" do
|
|
24
24
|
before(:each) do
|
25
25
|
ENV['HOME'] = '/tmp/some/home'
|
26
26
|
@cli = InstallTabTab::CLI.new
|
27
|
-
Gem.expects(:
|
27
|
+
Gem.expects(:latest_load_paths).returns([])
|
28
28
|
@stdout_io = StringIO.new
|
29
29
|
end
|
30
30
|
|
@@ -74,7 +74,7 @@ describe InstallTabTab::CLI, "with --gem GEM_NAME app flag" do
|
|
74
74
|
TabTab::Definition.clear
|
75
75
|
@cli = InstallTabTab::CLI.new
|
76
76
|
@cli.expects(:config).returns({}).at_least(1)
|
77
|
-
Gem.expects(:
|
77
|
+
Gem.expects(:latest_load_paths).returns(['/gems/gem_with_tabtabs-1.0.0/lib'])
|
78
78
|
Dir.expects(:[]).with('/gems/gem_with_tabtabs-1.0.0/**/tabtab_definitions/**/*.rb').returns([])
|
79
79
|
Dir.expects(:[]).with('/gems/gem_with_tabtabs-1.0.0/**/tabtab_definitions.rb').returns(['/gems/gem_with_tabtabs-1.0.0/lib/tabtab_definitions.rb'])
|
80
80
|
@cli.expects(:load).with('/gems/gem_with_tabtabs-1.0.0/lib/tabtab_definitions.rb').returns(true)
|
@@ -98,7 +98,7 @@ describe InstallTabTab::CLI, "with --gem GEM_NAME/PATH flag" do
|
|
98
98
|
TabTab::Definition.clear
|
99
99
|
@cli = InstallTabTab::CLI.new
|
100
100
|
@cli.expects(:config).returns({}).at_least(1)
|
101
|
-
Gem.expects(:
|
101
|
+
Gem.expects(:latest_load_paths).returns(['/gems/gem_with_tabtabs-1.0.0/lib'])
|
102
102
|
Dir.expects(:[]).with('/gems/gem_with_tabtabs-1.0.0/**/tabtab_definitions.rb').returns([])
|
103
103
|
Dir.expects(:[]).with('/gems/gem_with_tabtabs-1.0.0/**/tabtab_definitions/**/*.rb').returns(['/gems/gem_with_tabtabs-1.0.0/lib/tabtab_definitions/tabtabbed_app.rb'])
|
104
104
|
@cli.expects(:load).with('/gems/gem_with_tabtabs-1.0.0/lib/tabtab_definitions/tabtabbed_app.rb').returns(true)
|
@@ -123,7 +123,7 @@ describe InstallTabTab::CLI, "with --file FILE_NAME app flag" do
|
|
123
123
|
ENV['HOME'] = '/tmp/some/home'
|
124
124
|
@cli = InstallTabTab::CLI.new
|
125
125
|
@cli.expects(:config).returns({'file' => {'/path/to/definition.rb' => 'some_app'}}).at_least(2)
|
126
|
-
Gem.expects(:
|
126
|
+
Gem.expects(:latest_load_paths).returns([])
|
127
127
|
File.expects(:open).with('/tmp/some/home/.tabtab.bash', 'w').returns(mock do
|
128
128
|
expects(:<<).with("complete -o default -C 'tabtab --file /path/to/definition.rb' some_app\n")
|
129
129
|
expects(:close)
|
data/spec/tabtab_cli_spec.rb
CHANGED
@@ -143,3 +143,44 @@ describe TabTab::CLI, "--file flag" do
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
+
describe TabTab::CLI, "extracting tokens using ENV['COMP_LINE'] via extract_tokens_and_parse_options" do
|
147
|
+
describe "with no tokens" do
|
148
|
+
before(:each) do
|
149
|
+
ENV['COMP_LINE'] = "myapp "
|
150
|
+
@cli = TabTab::CLI.new
|
151
|
+
@cli.extract_tokens_and_parse_options([])
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should setup app_name" do
|
155
|
+
@cli.app_name.should == "myapp"
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should setup current_token" do
|
159
|
+
@cli.current_token.should == ""
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should setup previous_token" do
|
163
|
+
@cli.previous_token.should == "myapp"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "mid-way through a token" do
|
168
|
+
before(:each) do
|
169
|
+
ENV['COMP_LINE'] = "rake db:"
|
170
|
+
@cli = TabTab::CLI.new
|
171
|
+
@cli.extract_tokens_and_parse_options([])
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should setup app_name" do
|
175
|
+
@cli.app_name.should == "rake"
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should setup current_token" do
|
179
|
+
@cli.current_token.should == "db:"
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should setup previous_token" do
|
183
|
+
@cli.previous_token.should == "rake"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabtab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Nic Williams
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-29 00:00:00 +10:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.
|
23
|
+
version: 1.2.3
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: cucumber
|
@@ -83,7 +83,6 @@ files:
|
|
83
83
|
- features/steps/gems.rb
|
84
84
|
- features/steps/shells.rb
|
85
85
|
- lib/dev_definitions/gem.rb
|
86
|
-
- lib/dev_definitions/rake.rb
|
87
86
|
- lib/dev_definitions/script-generate.rb
|
88
87
|
- lib/dev_definitions/script-server.rb
|
89
88
|
- lib/install_tabtab/cli.rb
|
@@ -106,6 +105,7 @@ files:
|
|
106
105
|
- lib/tabtab_definitions/github.rb
|
107
106
|
- lib/tabtab_definitions/newgem.rb
|
108
107
|
- lib/tabtab_definitions/rails.rb
|
108
|
+
- lib/tabtab_definitions/rake.rb
|
109
109
|
- lib/tabtab_definitions/rubyforge.rb
|
110
110
|
- script/console
|
111
111
|
- script/destroy
|
data/lib/dev_definitions/rake.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
TabTab::Definition.register('rake', :import => true) do |c|
|
2
|
-
def rake_silent_tasks
|
3
|
-
if File.exists?(dotcache = File.join(File.expand_path('~'), ".raketabs-#{Dir.pwd.hash}"))
|
4
|
-
File.read(dotcache)
|
5
|
-
else
|
6
|
-
tasks = `rake --silent --tasks`
|
7
|
-
File.open(dotcache, 'w') { |f| f.puts tasks }
|
8
|
-
tasks
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
c.default do |current|
|
13
|
-
tasks = (rake_silent_tasks.split("\n")[1..-1] || []).map { |line| line.split[1] }
|
14
|
-
if current =~ /^([-\w:]+:)/
|
15
|
-
upto_last_colon = $1
|
16
|
-
p upto_last_colon
|
17
|
-
tasks = tasks.map { |t| (t =~ /^#{Regexp.escape upto_last_colon}([-\w:]+)$/) ? "#{$1}" : t }
|
18
|
-
end
|
19
|
-
tasks
|
20
|
-
end
|
21
|
-
c.flags :silence, :s
|
22
|
-
c.flags :trace, :t
|
23
|
-
end
|