Add --list option to CLI class

This commit is contained in:
Rémi Prévost 2012-01-21 14:08:01 -05:00
parent 490df3bd99
commit 124bdb1961
5 changed files with 58 additions and 6 deletions

View File

@ -5,7 +5,7 @@ module Teamocil
# This class handles interaction with the `tmux` utility. # This class handles interaction with the `tmux` utility.
class CLI class CLI
attr_accessor :layout attr_accessor :layout, :layouts
# Initialize a new run of `tmux` # Initialize a new run of `tmux`
# #
@ -14,11 +14,18 @@ module Teamocil
def initialize(argv, env) # {{{ def initialize(argv, env) # {{{
bail "You must be in a tmux session to use teamocil" unless env["TMUX"] bail "You must be in a tmux session to use teamocil" unless env["TMUX"]
parse_options! parse_options! argv
layout_path = File.join("#{env["HOME"]}", ".teamocil")
if @options.include?(:list)
@layouts = get_layouts(layout_path)
return print_layouts
end
if @options.include?(:layout) if @options.include?(:layout)
file = @options[:layout] file = @options[:layout]
else else
file = ::File.join("#{env["HOME"]}/.teamocil", "#{argv[0]}.yml") file = ::File.join(layout_path, "#{argv[0]}.yml")
end end
if @options[:edit] if @options[:edit]
@ -34,7 +41,7 @@ module Teamocil
end # }}} end # }}}
# Parse the command line options # Parse the command line options
def parse_options! # {{{ def parse_options!(args) # {{{
@options = {} @options = {}
opts = ::OptionParser.new do |opts| opts = ::OptionParser.new do |opts|
opts.banner = "Usage: teamocil [options] <layout> opts.banner = "Usage: teamocil [options] <layout>
@ -49,12 +56,29 @@ module Teamocil
@options[:edit] = true @options[:edit] = true
end end
opts.on("--layout [LAYOUT]", "Use a specific layout file, instead of ~/.teamocil/<layout>.yml") do |layout| opts.on("--layout [LAYOUT]", "Use a specific layout file, instead of `~/.teamocil/<layout>.yml`") do |layout|
@options[:layout] = layout @options[:layout] = layout
end end
opts.on("--list", "List all available layouts in `~/.teamocil/`") do
@options[:list] = true
end
end end
opts.parse! opts.parse! args
end # }}}
# Return an array of available layouts
#
# @param path [String] the path used to look for layouts
def get_layouts(path) # {{{
Dir.glob(File.join(path, "*.yml")).map { |file| File.basename(file).gsub(/\..+$/, "") }.sort
end # }}}
# Print each layout on a single line
def print_layouts # {{{
STDOUT.puts @layouts.join("\n")
exit 0
end # }}} end # }}}
# Print an error message and exit the utility # Print an error message and exit the utility

View File

@ -16,6 +16,11 @@ describe Teamocil::CLI do
@cli.layout.session.windows.last.name.should == "bar" @cli.layout.session.windows.last.name.should == "bar"
end # }}} end # }}}
it "lists available layouts" do # {{{
@cli = Teamocil::CLI.new(["--list"], @fake_env)
@cli.layouts.should == ["sample", "sample-2"]
end # }}}
end end
end end

20
spec/mock/cli.rb Normal file
View File

@ -0,0 +1,20 @@
module Teamocil
module Mock
module CLI
def self.included(base) # {{{
base.class_eval do
# Do not print anything
def print_layouts
# Nothing
end
end
end # }}}
end
end
end
Teamocil::CLI.send :include, Teamocil::Mock::CLI

View File

@ -4,10 +4,12 @@ module Teamocil
def self.included(base) # {{{ def self.included(base) # {{{
base.class_eval do base.class_eval do
# Do not execute anything # Do not execute anything
def execute_commands(commands) def execute_commands(commands)
# Nothing # Nothing
end end
end end
end # }}} end # }}}

View File

@ -3,6 +3,7 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
require 'yaml' require 'yaml'
require 'teamocil' require 'teamocil'
require File.join(File.dirname(__FILE__), "./mock/layout.rb") require File.join(File.dirname(__FILE__), "./mock/layout.rb")
require File.join(File.dirname(__FILE__), "./mock/cli.rb")
module Helpers module Helpers