gli 1.6.0 → 2.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +11 -0
- data/.rvmrc +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +201 -0
- data/ObjectModel.graffle +1191 -0
- data/README.rdoc +60 -10
- data/Rakefile +145 -0
- data/bin/gli +12 -30
- data/bin/report_on_rake_results +10 -0
- data/bin/test_all_rubies.sh +6 -0
- data/features/gli_executable.feature +84 -0
- data/features/gli_init.feature +219 -0
- data/features/step_definitions/gli_executable_steps.rb +12 -0
- data/features/step_definitions/gli_init_steps.rb +11 -0
- data/features/step_definitions/todo_steps.rb +69 -0
- data/features/support/env.rb +49 -0
- data/features/todo.feature +182 -0
- data/gli.cheat +95 -0
- data/gli.gemspec +34 -0
- data/lib/gli.rb +11 -571
- data/lib/gli/app.rb +184 -0
- data/lib/gli/app_support.rb +226 -0
- data/lib/gli/command.rb +107 -95
- data/lib/gli/command_line_option.rb +34 -0
- data/lib/gli/command_line_token.rb +13 -9
- data/lib/gli/command_support.rb +200 -0
- data/lib/gli/commands/compound_command.rb +42 -0
- data/lib/gli/commands/help.rb +63 -0
- data/lib/gli/commands/help_modules/command_help_format.rb +134 -0
- data/lib/gli/commands/help_modules/global_help_format.rb +61 -0
- data/lib/gli/commands/help_modules/list_formatter.rb +22 -0
- data/lib/gli/commands/help_modules/options_formatter.rb +50 -0
- data/lib/gli/commands/help_modules/text_wrapper.rb +53 -0
- data/lib/gli/commands/initconfig.rb +67 -0
- data/lib/{support → gli/commands}/scaffold.rb +150 -34
- data/lib/gli/dsl.rb +194 -0
- data/lib/gli/exceptions.rb +13 -4
- data/lib/gli/flag.rb +30 -41
- data/lib/gli/gli_option_parser.rb +98 -0
- data/lib/gli/option_parser_factory.rb +44 -0
- data/lib/gli/options.rb +2 -1
- data/lib/gli/switch.rb +19 -51
- data/lib/gli/terminal.rb +30 -20
- data/lib/gli/version.rb +5 -0
- data/test/apps/README.md +2 -0
- data/test/apps/todo/Gemfile +2 -0
- data/test/apps/todo/README.rdoc +6 -0
- data/test/apps/todo/Rakefile +23 -0
- data/test/apps/todo/bin/todo +52 -0
- data/test/apps/todo/lib/todo/commands/create.rb +22 -0
- data/test/apps/todo/lib/todo/commands/list.rb +53 -0
- data/test/apps/todo/lib/todo/commands/ls.rb +47 -0
- data/test/apps/todo/lib/todo/version.rb +3 -0
- data/test/apps/todo/test/tc_nothing.rb +14 -0
- data/test/apps/todo/todo.gemspec +23 -0
- data/test/apps/todo/todo.rdoc +5 -0
- data/test/config.yaml +10 -0
- data/test/fake_std_out.rb +30 -0
- data/test/gli.reek +122 -0
- data/test/init_simplecov.rb +8 -0
- data/test/option_test_helper.rb +13 -0
- data/test/roodi.yaml +18 -0
- data/test/tc_command.rb +260 -0
- data/test/tc_compount_command.rb +22 -0
- data/test/tc_flag.rb +56 -0
- data/test/tc_gli.rb +611 -0
- data/test/tc_help.rb +223 -0
- data/test/tc_options.rb +31 -0
- data/test/tc_subcommands.rb +162 -0
- data/test/tc_switch.rb +57 -0
- data/test/tc_terminal.rb +97 -0
- data/test/test_helper.rb +13 -0
- metadata +318 -49
- data/lib/gli_version.rb +0 -3
- data/lib/support/help.rb +0 -179
- data/lib/support/initconfig.rb +0 -34
- data/lib/support/rdoc.rb +0 -119
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module GLI
|
4
|
+
module Commands
|
5
|
+
module HelpModules
|
6
|
+
class GlobalHelpFormat
|
7
|
+
def initialize(app)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def format
|
12
|
+
program_desc = @app.program_desc
|
13
|
+
|
14
|
+
command_formatter = ListFormatter.new(@app.commands.values.sort.reject(&:nodoc).map { |command|
|
15
|
+
[[command.name,Array(command.aliases)].flatten.join(', '),command.description]
|
16
|
+
})
|
17
|
+
stringio = StringIO.new
|
18
|
+
command_formatter.output(stringio)
|
19
|
+
commands = stringio.string
|
20
|
+
|
21
|
+
global_option_descriptions = OptionsFormatter.new(global_flags_and_switches).format
|
22
|
+
|
23
|
+
GLOBAL_HELP.result(binding)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
GLOBAL_HELP = ERB.new(%q(NAME
|
29
|
+
<%= File.basename($0) %> - <%= program_desc %>
|
30
|
+
|
31
|
+
SYNOPSIS
|
32
|
+
<%= usage_string %>
|
33
|
+
|
34
|
+
<% unless @app.version_string.nil? %>
|
35
|
+
VERSION
|
36
|
+
<%= @app.version_string %>
|
37
|
+
|
38
|
+
<% end %>
|
39
|
+
<% unless global_flags_and_switches.empty? %>
|
40
|
+
GLOBAL OPTIONS
|
41
|
+
<%= global_option_descriptions %>
|
42
|
+
|
43
|
+
<% end %>
|
44
|
+
COMMANDS
|
45
|
+
<%= commands %>),nil,'<>')
|
46
|
+
|
47
|
+
def global_flags_and_switches
|
48
|
+
@app.flags.merge(@app.switches)
|
49
|
+
end
|
50
|
+
|
51
|
+
def usage_string
|
52
|
+
"#{File.basename($0)} ".tap do |string|
|
53
|
+
string << "[global options] " unless global_flags_and_switches.empty?
|
54
|
+
string << "command "
|
55
|
+
string << "[command options] [arguments...]"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GLI
|
2
|
+
module Commands
|
3
|
+
module HelpModules
|
4
|
+
# Given a list of two-element lists, formats on the terminal
|
5
|
+
class ListFormatter
|
6
|
+
def initialize(list)
|
7
|
+
@list = list
|
8
|
+
end
|
9
|
+
|
10
|
+
# Output the list to the output_device
|
11
|
+
def output(output_device)
|
12
|
+
return if @list.empty?
|
13
|
+
max_width = @list.map { |_| _[0].length }.max
|
14
|
+
wrapper = TextWrapper.new(Terminal.instance.size[0],4 + max_width + 3)
|
15
|
+
@list.each do |(name,description)|
|
16
|
+
output_device.printf(" %-#{max_width}s - %s\n",name,wrapper.wrap(String(description).strip))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module GLI
|
2
|
+
module Commands
|
3
|
+
module HelpModules
|
4
|
+
class OptionsFormatter
|
5
|
+
def initialize(flags_and_switches)
|
6
|
+
@flags_and_switches = flags_and_switches
|
7
|
+
end
|
8
|
+
|
9
|
+
def format
|
10
|
+
list_formatter = ListFormatter.new(@flags_and_switches.values.sort { |a,b|
|
11
|
+
a.name.to_s <=> b.name.to_s
|
12
|
+
}.map { |option|
|
13
|
+
if option.respond_to? :argument_name
|
14
|
+
[option_names_for_help_string(option,option.argument_name),description_with_default(option)]
|
15
|
+
else
|
16
|
+
[option_names_for_help_string(option),description_with_default(option)]
|
17
|
+
end
|
18
|
+
})
|
19
|
+
stringio = StringIO.new
|
20
|
+
list_formatter.output(stringio)
|
21
|
+
stringio.string
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def description_with_default(option)
|
27
|
+
if option.kind_of? Flag
|
28
|
+
String(option.description) + " (default: #{option.default_value || 'none'})"
|
29
|
+
else
|
30
|
+
String(option.description)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def option_names_for_help_string(option,arg_name=nil)
|
35
|
+
names = [option.name,Array(option.aliases)].flatten
|
36
|
+
names = names.map { |name| CommandLineOption.name_as_string(name,option.kind_of?(Switch) ? option.negatable? : false) }
|
37
|
+
if arg_name.nil?
|
38
|
+
names.join(', ')
|
39
|
+
else
|
40
|
+
if names[-1] =~ /^--/
|
41
|
+
names.join(', ') + "=#{arg_name}"
|
42
|
+
else
|
43
|
+
names.join(', ') + " #{arg_name}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module GLI
|
2
|
+
module Commands
|
3
|
+
module HelpModules
|
4
|
+
# Handles wrapping text
|
5
|
+
class TextWrapper
|
6
|
+
# Create a text_wrapper wrapping at the given width,
|
7
|
+
# and indent.
|
8
|
+
def initialize(width,indent)
|
9
|
+
@width = width
|
10
|
+
@indent = indent
|
11
|
+
end
|
12
|
+
|
13
|
+
# Return a wrapped version of text, assuming that the first line has already been
|
14
|
+
# indented by @indent characters. Resulting text does NOT have a newline in it.
|
15
|
+
def wrap(text)
|
16
|
+
return text if text.nil?
|
17
|
+
wrapped_text = ''
|
18
|
+
current_graf = ''
|
19
|
+
|
20
|
+
paragraphs = text.split(/\n\n+/)
|
21
|
+
paragraphs.each do |graf|
|
22
|
+
current_line = ''
|
23
|
+
current_line_length = @indent
|
24
|
+
|
25
|
+
words = graf.split(/\s+/)
|
26
|
+
current_line = words.shift || ''
|
27
|
+
current_line_length += current_line.length
|
28
|
+
|
29
|
+
words.each do |word|
|
30
|
+
if current_line_length + word.length + 1 > @width
|
31
|
+
current_graf << current_line << "\n"
|
32
|
+
current_line = ''
|
33
|
+
current_line << ' ' * @indent << word
|
34
|
+
current_line_length = @indent + word.length
|
35
|
+
else
|
36
|
+
if current_line == ''
|
37
|
+
current_line << word
|
38
|
+
else
|
39
|
+
current_line << ' ' << word
|
40
|
+
end
|
41
|
+
current_line_length += (word.length + 1)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
current_graf << current_line
|
45
|
+
wrapped_text << current_graf << "\n\n" << ' ' * @indent
|
46
|
+
current_graf = ''
|
47
|
+
end
|
48
|
+
wrapped_text.gsub(/[\n\s]*\Z/,'')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'gli'
|
2
|
+
require 'gli/command'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module GLI
|
6
|
+
# Command that initializes the configuration file for apps that use it.
|
7
|
+
class InitConfig < Command # :nodoc:
|
8
|
+
COMMANDS_KEY = 'commands'
|
9
|
+
|
10
|
+
def initialize(config_file_name,commands,flags,switches)
|
11
|
+
@filename = config_file_name
|
12
|
+
super(:names => :initconfig,
|
13
|
+
:description => "Initialize the config file using current global options",
|
14
|
+
:long_desc => 'Initializes a configuration file where you can set default options for command line flags, both globally and on a per-command basis. These defaults override the built-in defaults and allow you to omit commonly-used command line flags when invoking this program')
|
15
|
+
|
16
|
+
self.desc 'force overwrite of existing config file'
|
17
|
+
self.switch :force
|
18
|
+
|
19
|
+
@commands = commands
|
20
|
+
@flags = flags
|
21
|
+
@switches = switches
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute(global_options,options,arguments)
|
25
|
+
if options[:force] || !File.exist?(@filename)
|
26
|
+
create_config(global_options,options,arguments)
|
27
|
+
else
|
28
|
+
raise "Not overwriting existing config file #{@filename}, use --force to override"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def create_config(global_options,options,arguments)
|
35
|
+
config = Hash[global_options.map { |option_name,option_value|
|
36
|
+
if option_value.kind_of?(String) && option_value.respond_to?(:force_encoding)
|
37
|
+
[option_name,option_value.force_encoding("utf-8")]
|
38
|
+
else
|
39
|
+
[option_name,option_value]
|
40
|
+
end
|
41
|
+
}]
|
42
|
+
config[COMMANDS_KEY] = {}
|
43
|
+
@commands.each do |name,command|
|
44
|
+
if (command != self) && (name != :rdoc) && (name != :help)
|
45
|
+
if command != self
|
46
|
+
config[COMMANDS_KEY][name.to_sym] = config_for_command(@commands,name.to_sym)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
File.open(@filename,'w', 0600) do |file|
|
51
|
+
YAML.dump(config,file)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_for_command(commands,command_name)
|
56
|
+
{}.tap do |hash|
|
57
|
+
subcommands = commands[command_name].commands
|
58
|
+
subcommands.each do |name,subcommand|
|
59
|
+
next unless name.kind_of? Symbol
|
60
|
+
hash[COMMANDS_KEY] ||= {}
|
61
|
+
puts "#{command_name}:#{name}"
|
62
|
+
hash[COMMANDS_KEY][name.to_sym] = config_for_command(subcommands,name)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -2,9 +2,17 @@ require 'gli'
|
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
4
|
module GLI
|
5
|
+
module Commands
|
5
6
|
class Scaffold #:nodoc:
|
6
7
|
|
7
|
-
def self.create_scaffold(root_dir,
|
8
|
+
def self.create_scaffold(root_dir,
|
9
|
+
create_test_dir,
|
10
|
+
create_ext_dir,
|
11
|
+
project_name,
|
12
|
+
commands,
|
13
|
+
force=false,
|
14
|
+
dry_run=false,
|
15
|
+
create_rvmrc=false)
|
8
16
|
dirs = [File.join(root_dir,project_name,'lib')]
|
9
17
|
dirs << File.join(root_dir,project_name,'bin')
|
10
18
|
dirs << File.join(root_dir,project_name,'test') if create_test_dir
|
@@ -15,7 +23,14 @@ module GLI
|
|
15
23
|
mk_readme(root_dir,dry_run,project_name)
|
16
24
|
mk_gemspec(root_dir,dry_run,project_name)
|
17
25
|
mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
|
18
|
-
|
26
|
+
mk_lib_files(root_dir,dry_run,project_name)
|
27
|
+
if create_rvmrc
|
28
|
+
rvmrc = File.join(root_dir,project_name,".rvmrc")
|
29
|
+
File.open(rvmrc,'w') do |file|
|
30
|
+
file.puts "rvm use #{ENV['rvm_ruby_string']}@#{project_name} --create"
|
31
|
+
end
|
32
|
+
puts "Created #{rvmrc}"
|
33
|
+
end
|
19
34
|
end
|
20
35
|
end
|
21
36
|
|
@@ -39,7 +54,7 @@ module GLI
|
|
39
54
|
File.open("#{root_dir}/#{project_name}/#{project_name}.gemspec",'w') do |file|
|
40
55
|
file.puts <<EOS
|
41
56
|
# Ensure we require the local version and not one we might have installed already
|
42
|
-
require File.join([File.dirname(__FILE__),'lib','#{project_name}
|
57
|
+
require File.join([File.dirname(__FILE__),'lib','#{project_name}','version.rb'])
|
43
58
|
spec = Gem::Specification.new do |s|
|
44
59
|
s.name = '#{project_name}'
|
45
60
|
s.version = #{project_name_as_module_name(project_name)}::VERSION
|
@@ -51,7 +66,8 @@ spec = Gem::Specification.new do |s|
|
|
51
66
|
# Add your other files here if you make them
|
52
67
|
s.files = %w(
|
53
68
|
bin/#{project_name}
|
54
|
-
lib/#{project_name}
|
69
|
+
lib/#{project_name}/version.rb
|
70
|
+
lib/#{project_name}.rb
|
55
71
|
)
|
56
72
|
s.require_paths << 'lib'
|
57
73
|
s.has_rdoc = true
|
@@ -61,7 +77,8 @@ lib/#{project_name}_version.rb
|
|
61
77
|
s.executables << '#{project_name}'
|
62
78
|
s.add_development_dependency('rake')
|
63
79
|
s.add_development_dependency('rdoc')
|
64
|
-
s.
|
80
|
+
s.add_development_dependency('aruba')
|
81
|
+
s.add_runtime_dependency('gli','#{GLI::VERSION}')
|
65
82
|
end
|
66
83
|
EOS
|
67
84
|
end
|
@@ -72,16 +89,26 @@ EOS
|
|
72
89
|
project_name.split(/_/).map { |part| part[0..0].upcase + part[1..-1] }.join('')
|
73
90
|
end
|
74
91
|
|
75
|
-
def self.
|
92
|
+
def self.mk_lib_files(root_dir,dry_run,project_name)
|
76
93
|
return if dry_run
|
77
|
-
|
94
|
+
FileUtils.mkdir("#{root_dir}/#{project_name}/lib/#{project_name}")
|
95
|
+
File.open("#{root_dir}/#{project_name}/lib/#{project_name}/version.rb",'w') do |file|
|
78
96
|
file.puts <<EOS
|
79
97
|
module #{project_name_as_module_name(project_name)}
|
80
98
|
VERSION = '0.0.1'
|
81
99
|
end
|
82
100
|
EOS
|
83
101
|
end
|
84
|
-
puts "Created #{root_dir}/#{project_name}/lib/#{project_name}
|
102
|
+
puts "Created #{root_dir}/#{project_name}/lib/#{project_name}/version.rb"
|
103
|
+
File.open("#{root_dir}/#{project_name}/lib/#{project_name}.rb",'w') do |file|
|
104
|
+
file.puts <<EOS
|
105
|
+
require '#{project_name}/version.rb'
|
106
|
+
|
107
|
+
# Add requires for other files you add to your project here, so
|
108
|
+
# you just need to require this one file in your bin file
|
109
|
+
EOS
|
110
|
+
end
|
111
|
+
puts "Created #{root_dir}/#{project_name}/lib/#{project_name}.rb"
|
85
112
|
end
|
86
113
|
def self.mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
|
87
114
|
return if dry_run
|
@@ -91,7 +118,14 @@ require 'rake/clean'
|
|
91
118
|
require 'rubygems'
|
92
119
|
require 'rubygems/package_task'
|
93
120
|
require 'rdoc/task'
|
94
|
-
|
121
|
+
EOS
|
122
|
+
if create_test_dir
|
123
|
+
file.puts <<EOS
|
124
|
+
require 'cucumber'
|
125
|
+
require 'cucumber/rake/task'
|
126
|
+
EOS
|
127
|
+
end
|
128
|
+
file.puts <<EOS
|
95
129
|
Rake::RDocTask.new do |rd|
|
96
130
|
rd.main = "README.rdoc"
|
97
131
|
rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
|
@@ -102,23 +136,47 @@ spec = eval(File.read('#{project_name}.gemspec'))
|
|
102
136
|
|
103
137
|
Gem::PackageTask.new(spec) do |pkg|
|
104
138
|
end
|
139
|
+
EOS
|
140
|
+
if create_test_dir
|
141
|
+
file.puts <<EOS
|
142
|
+
CUKE_RESULTS = 'results.html'
|
143
|
+
CLEAN << CUKE_RESULTS
|
144
|
+
desc 'Run features'
|
145
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
146
|
+
opts = "features --format html -o \#{CUKE_RESULTS} --format progress -x"
|
147
|
+
opts += " --tags \#{ENV['TAGS']}" if ENV['TAGS']
|
148
|
+
t.cucumber_opts = opts
|
149
|
+
t.fork = false
|
150
|
+
end
|
105
151
|
|
152
|
+
desc 'Run features tagged as work-in-progress (@wip)'
|
153
|
+
Cucumber::Rake::Task.new('features:wip') do |t|
|
154
|
+
tag_opts = ' --tags ~@pending'
|
155
|
+
tag_opts = ' --tags @wip'
|
156
|
+
t.cucumber_opts = "features --format html -o \#{CUKE_RESULTS} --format pretty -x -s\#{tag_opts}"
|
157
|
+
t.fork = false
|
158
|
+
end
|
159
|
+
|
160
|
+
task :cucumber => :features
|
161
|
+
task 'cucumber:wip' => 'features:wip'
|
162
|
+
task :wip => 'features:wip'
|
106
163
|
EOS
|
164
|
+
end
|
107
165
|
if create_test_dir
|
108
166
|
file.puts <<EOS
|
109
167
|
require 'rake/testtask'
|
110
168
|
Rake::TestTask.new do |t|
|
111
169
|
t.libs << "test"
|
112
|
-
t.test_files = FileList['test
|
170
|
+
t.test_files = FileList['test/*_test.rb']
|
113
171
|
end
|
114
172
|
|
115
|
-
task :default => :test
|
173
|
+
task :default => [:test,:features]
|
116
174
|
EOS
|
117
|
-
File.open("#{root_dir}/#{project_name}/test/
|
175
|
+
File.open("#{root_dir}/#{project_name}/test/default_test.rb",'w') do |test_file|
|
118
176
|
test_file.puts <<EOS
|
119
|
-
require '
|
177
|
+
require 'test_helper'
|
120
178
|
|
121
|
-
class
|
179
|
+
class DefaultTest < Test::Unit::TestCase
|
122
180
|
|
123
181
|
def setup
|
124
182
|
end
|
@@ -132,7 +190,21 @@ class TC_testNothing < Test::Unit::TestCase
|
|
132
190
|
end
|
133
191
|
EOS
|
134
192
|
end
|
135
|
-
puts "Created #{root_dir}/#{project_name}/test/
|
193
|
+
puts "Created #{root_dir}/#{project_name}/test/default_test.rb"
|
194
|
+
File.open("#{root_dir}/#{project_name}/test/test_helper.rb",'w') do |test_file|
|
195
|
+
test_file.puts <<EOS
|
196
|
+
require 'test/unit'
|
197
|
+
|
198
|
+
# Add test libraries you want to use here, e.g. mocha
|
199
|
+
|
200
|
+
class Test::Unit::TestCase
|
201
|
+
|
202
|
+
# Add global extensions to the test case class here
|
203
|
+
|
204
|
+
end
|
205
|
+
EOS
|
206
|
+
end
|
207
|
+
puts "Created #{root_dir}/#{project_name}/test/test_helper.rb"
|
136
208
|
else
|
137
209
|
file.puts "task :default => :package\n"
|
138
210
|
end
|
@@ -143,6 +215,54 @@ EOS
|
|
143
215
|
bundler_file.puts "gemspec"
|
144
216
|
end
|
145
217
|
puts "Created #{root_dir}/#{project_name}/Gemfile"
|
218
|
+
if create_test_dir
|
219
|
+
features_dir = File.join(root_dir,project_name,'features')
|
220
|
+
FileUtils.mkdir features_dir
|
221
|
+
FileUtils.mkdir File.join(features_dir,"step_definitions")
|
222
|
+
FileUtils.mkdir File.join(features_dir,"support")
|
223
|
+
File.open(File.join(features_dir,"#{project_name}.feature"),'w') do |file|
|
224
|
+
file.puts <<EOS
|
225
|
+
Feature: My bootstrapped app kinda works
|
226
|
+
In order to get going on coding my awesome app
|
227
|
+
I want to have aruba and cucumber setup
|
228
|
+
So I don't have to do it myself
|
229
|
+
|
230
|
+
Scenario: App just runs
|
231
|
+
When I get help for "#{project_name}"
|
232
|
+
Then the exit status should be 0
|
233
|
+
EOS
|
234
|
+
end
|
235
|
+
File.open(File.join(features_dir,"step_definitions","#{project_name}_steps.rb"),'w') do |file|
|
236
|
+
file.puts <<EOS
|
237
|
+
When /^I get help for "([^"]*)"$/ do |app_name|
|
238
|
+
@app_name = app_name
|
239
|
+
step %(I run `\#{app_name} help`)
|
240
|
+
end
|
241
|
+
|
242
|
+
# Add more step definitions here
|
243
|
+
EOS
|
244
|
+
end
|
245
|
+
File.open(File.join(features_dir,"support","env.rb"),'w') do |file|
|
246
|
+
file.puts <<EOS
|
247
|
+
require 'aruba/cucumber'
|
248
|
+
|
249
|
+
ENV['PATH'] = "\#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}\#{File::PATH_SEPARATOR}\#{ENV['PATH']}"
|
250
|
+
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
|
251
|
+
|
252
|
+
Before do
|
253
|
+
# Using "announce" causes massive warnings on 1.9.2
|
254
|
+
@puts = true
|
255
|
+
@original_rubylib = ENV['RUBYLIB']
|
256
|
+
ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
|
257
|
+
end
|
258
|
+
|
259
|
+
After do
|
260
|
+
ENV['RUBYLIB'] = @original_rubylib
|
261
|
+
end
|
262
|
+
EOS
|
263
|
+
end
|
264
|
+
puts "Created #{features_dir}"
|
265
|
+
end
|
146
266
|
end
|
147
267
|
|
148
268
|
def self.mk_binfile(root_dir,create_ext_dir,force,dry_run,project_name,commands)
|
@@ -153,26 +273,18 @@ EOS
|
|
153
273
|
file.chmod(0755)
|
154
274
|
file.puts '#!/usr/bin/env ruby'
|
155
275
|
file.puts <<EOS
|
156
|
-
# 1.9 adds realpath to resolve symlinks; 1.8 doesn't
|
157
|
-
# have this method, so we add it so we get resolved symlinks
|
158
|
-
# and compatibility
|
159
|
-
unless File.respond_to? :realpath
|
160
|
-
class File #:nodoc:
|
161
|
-
def self.realpath path
|
162
|
-
return realpath(File.readlink(path)) if symlink?(path)
|
163
|
-
path
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
EOS
|
168
|
-
file.puts '$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + \'/../lib\')'
|
169
|
-
file.puts '$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + \'/../ext\')' if create_ext_dir
|
170
|
-
file.puts <<EOS
|
171
276
|
require 'rubygems'
|
172
277
|
require 'gli'
|
173
|
-
|
278
|
+
begin # XXX: Remove this begin/rescue before distributing your app
|
279
|
+
require '#{project_name}'
|
280
|
+
rescue LoadError
|
281
|
+
STDERR.puts "In development, you need to use `bundle exec bin/todo` to run your app"
|
282
|
+
STDERR.puts "At install-time, RubyGems will make sure lib, etc. are in the load path"
|
283
|
+
STDERR.puts "Feel free to remove this message from bin/todo now"
|
284
|
+
exit 64
|
285
|
+
end
|
174
286
|
|
175
|
-
include GLI
|
287
|
+
include GLI::App
|
176
288
|
|
177
289
|
program_desc 'Describe your application here'
|
178
290
|
|
@@ -208,6 +320,8 @@ command :#{command} do |c|
|
|
208
320
|
|
209
321
|
# If you have any errors, just raise them
|
210
322
|
# raise "that command made no sense"
|
323
|
+
|
324
|
+
puts "#{command} command ran"
|
211
325
|
end
|
212
326
|
end
|
213
327
|
EOS
|
@@ -215,6 +329,7 @@ EOS
|
|
215
329
|
file.puts <<EOS
|
216
330
|
command :#{command} do |c|
|
217
331
|
c.action do |global_options,options,args|
|
332
|
+
puts "#{command} command ran"
|
218
333
|
end
|
219
334
|
end
|
220
335
|
EOS
|
@@ -225,7 +340,7 @@ EOS
|
|
225
340
|
|
226
341
|
pre do |global,command,options,args|
|
227
342
|
# Pre logic here
|
228
|
-
# Return true to proceed; false to
|
343
|
+
# Return true to proceed; false to abourt and not call the
|
229
344
|
# chosen command
|
230
345
|
# Use skips_pre before a command to skip this block
|
231
346
|
# on that command only
|
@@ -244,7 +359,7 @@ on_error do |exception|
|
|
244
359
|
true
|
245
360
|
end
|
246
361
|
|
247
|
-
exit
|
362
|
+
exit run(ARGV)
|
248
363
|
EOS
|
249
364
|
puts "Created #{bin_file}"
|
250
365
|
end
|
@@ -284,3 +399,4 @@ EOS
|
|
284
399
|
|
285
400
|
end
|
286
401
|
end
|
402
|
+
end
|