coglius 0.0.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.
- data/Cogfile +15 -0
- data/LICENSE +201 -0
- data/lib/coglius.rb +29 -0
- data/lib/coglius/app.rb +250 -0
- data/lib/coglius/app_support.rb +284 -0
- data/lib/coglius/command.rb +149 -0
- data/lib/coglius/command_line_option.rb +34 -0
- data/lib/coglius/command_line_token.rb +62 -0
- data/lib/coglius/command_support.rb +214 -0
- data/lib/coglius/commands/compound_command.rb +42 -0
- data/lib/coglius/commands/doc.rb +215 -0
- data/lib/coglius/commands/help.rb +73 -0
- data/lib/coglius/commands/help_modules/arg_name_formatter.rb +20 -0
- data/lib/coglius/commands/help_modules/command_finder.rb +60 -0
- data/lib/coglius/commands/help_modules/command_help_format.rb +138 -0
- data/lib/coglius/commands/help_modules/global_help_format.rb +70 -0
- data/lib/coglius/commands/help_modules/help_completion_format.rb +31 -0
- data/lib/coglius/commands/help_modules/list_formatter.rb +23 -0
- data/lib/coglius/commands/help_modules/one_line_wrapper.rb +18 -0
- data/lib/coglius/commands/help_modules/options_formatter.rb +49 -0
- data/lib/coglius/commands/help_modules/text_wrapper.rb +53 -0
- data/lib/coglius/commands/help_modules/tty_only_wrapper.rb +23 -0
- data/lib/coglius/commands/help_modules/verbatim_wrapper.rb +16 -0
- data/lib/coglius/commands/initconfig.rb +69 -0
- data/lib/coglius/commands/rdoc_document_listener.rb +116 -0
- data/lib/coglius/commands/scaffold.rb +401 -0
- data/lib/coglius/copy_options_to_aliases.rb +33 -0
- data/lib/coglius/dsl.rb +221 -0
- data/lib/coglius/exceptions.rb +54 -0
- data/lib/coglius/flag.rb +68 -0
- data/lib/coglius/gli_option_parser.rb +124 -0
- data/lib/coglius/option_parser_factory.rb +45 -0
- data/lib/coglius/options.rb +23 -0
- data/lib/coglius/switch.rb +35 -0
- data/lib/coglius/terminal.rb +94 -0
- data/lib/coglius/version.rb +5 -0
- data/templates/coglius/generator.rb.erb +26 -0
- metadata +208 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
module Coglius
|
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,23 @@
|
|
1
|
+
module Coglius
|
2
|
+
module Commands
|
3
|
+
module HelpModules
|
4
|
+
# Formats text in one line, stripping newlines and NOT wrapping
|
5
|
+
class TTYOnlyWrapper
|
6
|
+
# Args are ignored entirely; this keeps it consistent with the TextWrapper interface
|
7
|
+
def initialize(width,indent)
|
8
|
+
@proxy = if STDOUT.tty?
|
9
|
+
TextWrapper.new(width,indent)
|
10
|
+
else
|
11
|
+
OneLineWrapper.new(width,indent)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return a wrapped version of text, assuming that the first line has already been
|
16
|
+
# indented by @indent characters. Resulting text does NOT have a newline in it.
|
17
|
+
def wrap(text)
|
18
|
+
@proxy.wrap(text)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Coglius
|
2
|
+
module Commands
|
3
|
+
module HelpModules
|
4
|
+
# Leaves text formatting exactly as it was received. Doesn't strip anything.
|
5
|
+
class VerbatimWrapper
|
6
|
+
# Args are ignored entirely; this keeps it consistent with the TextWrapper interface
|
7
|
+
def initialize(width,indent)
|
8
|
+
end
|
9
|
+
|
10
|
+
def wrap(text)
|
11
|
+
return String(text)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'coglius'
|
2
|
+
require 'coglius/command'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Coglius
|
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
|
+
:skips_pre => true,:skips_post => true, :skips_around => true)
|
16
|
+
|
17
|
+
@app_commands = commands
|
18
|
+
@app_flags = flags
|
19
|
+
@app_switches = switches
|
20
|
+
|
21
|
+
self.desc 'force overwrite of existing config file'
|
22
|
+
self.switch :force
|
23
|
+
|
24
|
+
action do |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
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def create_config(global_options,options,arguments)
|
37
|
+
config = Hash[global_options.map { |option_name,option_value|
|
38
|
+
if option_value.kind_of?(String) && option_value.respond_to?(:force_encoding)
|
39
|
+
[option_name,option_value.force_encoding("utf-8")]
|
40
|
+
else
|
41
|
+
[option_name,option_value]
|
42
|
+
end
|
43
|
+
}]
|
44
|
+
config[COMMANDS_KEY] = {}
|
45
|
+
@app_commands.each do |name,command|
|
46
|
+
if (command != self) && (name != :rdoc) && (name != :help)
|
47
|
+
if command != self
|
48
|
+
config[COMMANDS_KEY][name.to_sym] = config_for_command(@app_commands,name.to_sym)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
File.open(@filename,'w', 0600) do |file|
|
53
|
+
YAML.dump(config,file)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def config_for_command(commands,command_name)
|
58
|
+
{}.tap do |hash|
|
59
|
+
subcommands = commands[command_name].commands
|
60
|
+
subcommands.each do |name,subcommand|
|
61
|
+
next unless name.kind_of? Symbol
|
62
|
+
hash[COMMANDS_KEY] ||= {}
|
63
|
+
puts "#{command_name}:#{name}"
|
64
|
+
hash[COMMANDS_KEY][name.to_sym] = config_for_command(subcommands,name)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'coglius/commands/help_modules/arg_name_formatter'
|
3
|
+
module Coglius
|
4
|
+
module Commands
|
5
|
+
class RdocDocumentListener
|
6
|
+
|
7
|
+
def initialize(global_options,options,arguments)
|
8
|
+
@io = File.new(File.basename($0) + ".rdoc",'w')
|
9
|
+
@nest = ''
|
10
|
+
@arg_name_formatter = Coglius::Commands::HelpModules::ArgNameFormatter.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def beginning
|
14
|
+
end
|
15
|
+
|
16
|
+
# Called when processing has completed
|
17
|
+
def ending
|
18
|
+
@io.close
|
19
|
+
end
|
20
|
+
|
21
|
+
# Gives you the program description
|
22
|
+
def program_desc(desc)
|
23
|
+
@io.puts "== #{File.basename($0)} - #{desc}"
|
24
|
+
@io.puts
|
25
|
+
end
|
26
|
+
|
27
|
+
def program_long_desc(desc)
|
28
|
+
@io.puts desc
|
29
|
+
@io.puts
|
30
|
+
end
|
31
|
+
|
32
|
+
# Gives you the program version
|
33
|
+
def version(version)
|
34
|
+
@io.puts "v#{version}"
|
35
|
+
@io.puts
|
36
|
+
end
|
37
|
+
|
38
|
+
def options
|
39
|
+
if @nest.size == 0
|
40
|
+
@io.puts "=== Global Options"
|
41
|
+
else
|
42
|
+
@io.puts "#{@nest}=== Options"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Gives you a flag in the current context
|
47
|
+
def flag(name,aliases,desc,long_desc,default_value,arg_name,must_match,type)
|
48
|
+
invocations = ([name] + Array(aliases)).map { |_| add_dashes(_) }.join('|')
|
49
|
+
usage = "#{invocations} #{arg_name || 'arg'}"
|
50
|
+
@io.puts "#{@nest}=== #{usage}"
|
51
|
+
@io.puts
|
52
|
+
@io.puts String(desc).strip
|
53
|
+
@io.puts
|
54
|
+
@io.puts "[Default Value] #{default_value || 'None'}"
|
55
|
+
@io.puts "[Must Match] #{must_match.to_s}" unless must_match.nil?
|
56
|
+
@io.puts String(long_desc).strip
|
57
|
+
@io.puts
|
58
|
+
end
|
59
|
+
|
60
|
+
# Gives you a switch in the current context
|
61
|
+
def switch(name,aliases,desc,long_desc,negetable)
|
62
|
+
if negetable
|
63
|
+
name = "[no-]#{name}" if name.to_s.length > 1
|
64
|
+
aliases = aliases.map { |_| _.to_s.length > 1 ? "[no-]#{_}" : _ }
|
65
|
+
end
|
66
|
+
invocations = ([name] + aliases).map { |_| add_dashes(_) }.join('|')
|
67
|
+
@io.puts "#{@nest}=== #{invocations}"
|
68
|
+
@io.puts String(desc).strip
|
69
|
+
@io.puts
|
70
|
+
@io.puts String(long_desc).strip
|
71
|
+
@io.puts
|
72
|
+
end
|
73
|
+
|
74
|
+
def end_options
|
75
|
+
end
|
76
|
+
|
77
|
+
def commands
|
78
|
+
@io.puts "#{@nest}=== Commands"
|
79
|
+
@nest = "#{@nest}="
|
80
|
+
end
|
81
|
+
|
82
|
+
# Gives you a command in the current context and creates a new context of this command
|
83
|
+
def command(name,aliases,desc,long_desc,arg_name,arg_options)
|
84
|
+
@io.puts "#{@nest}=== Command: <tt>#{([name] + aliases).join('|')} #{@arg_name_formatter.format(arg_name,arg_options)}</tt>"
|
85
|
+
@io.puts String(desc).strip
|
86
|
+
@io.puts
|
87
|
+
@io.puts String(long_desc).strip
|
88
|
+
@nest = "#{@nest}="
|
89
|
+
end
|
90
|
+
|
91
|
+
# Ends a command, and "pops" you back up one context
|
92
|
+
def end_command(name)
|
93
|
+
@nest.gsub!(/=$/,'')
|
94
|
+
end
|
95
|
+
|
96
|
+
# Gives you the name of the current command in the current context
|
97
|
+
def default_command(name)
|
98
|
+
@io.puts "[Default Command] #{name}" unless name.nil?
|
99
|
+
end
|
100
|
+
|
101
|
+
def end_commands
|
102
|
+
@nest.gsub!(/=$/,'')
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def add_dashes(name)
|
108
|
+
name = "-#{name}"
|
109
|
+
name = "-#{name}" if name.length > 2
|
110
|
+
name
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,401 @@
|
|
1
|
+
require 'coglius'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Coglius
|
5
|
+
module Commands
|
6
|
+
class Scaffold #:nodoc:
|
7
|
+
|
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)
|
16
|
+
dirs = [File.join(root_dir,project_name,'lib')]
|
17
|
+
dirs << File.join(root_dir,project_name,'bin')
|
18
|
+
dirs << File.join(root_dir,project_name,'test') if create_test_dir
|
19
|
+
dirs << File.join(root_dir,project_name,'ext') if create_ext_dir
|
20
|
+
|
21
|
+
if mkdirs(dirs,force,dry_run)
|
22
|
+
mk_binfile(root_dir,create_ext_dir,force,dry_run,project_name,commands)
|
23
|
+
mk_readme(root_dir,dry_run,project_name)
|
24
|
+
mk_gemspec(root_dir,dry_run,project_name)
|
25
|
+
mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
|
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
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.mk_readme(root_dir,dry_run,project_name)
|
38
|
+
return if dry_run
|
39
|
+
File.open("#{root_dir}/#{project_name}/README.rdoc",'w') do |file|
|
40
|
+
file << "= #{project_name}\n\n"
|
41
|
+
file << "Describe your project here\n\n"
|
42
|
+
file << ":include:#{project_name}.rdoc\n\n"
|
43
|
+
end
|
44
|
+
puts "Created #{root_dir}/#{project_name}/README.rdoc"
|
45
|
+
File.open("#{root_dir}/#{project_name}/#{project_name}.rdoc",'w') do |file|
|
46
|
+
file << "= #{project_name}\n\n"
|
47
|
+
file << "Generate this with\n #{project_name} rdoc\nAfter you have described your command line interface"
|
48
|
+
end
|
49
|
+
puts "Created #{root_dir}/#{project_name}/#{project_name}.rdoc"
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.mk_gemspec(root_dir,dry_run,project_name)
|
53
|
+
return if dry_run
|
54
|
+
File.open("#{root_dir}/#{project_name}/#{project_name}.gemspec",'w') do |file|
|
55
|
+
file.puts <<EOS
|
56
|
+
# Ensure we require the local version and not one we might have installed already
|
57
|
+
require File.join([File.dirname(__FILE__),'lib','#{project_name}','version.rb'])
|
58
|
+
spec = Gem::Specification.new do |s|
|
59
|
+
s.name = '#{project_name}'
|
60
|
+
s.version = #{project_name_as_module_name(project_name)}::VERSION
|
61
|
+
s.author = 'Your Name Here'
|
62
|
+
s.email = 'your@email.address.com'
|
63
|
+
s.homepage = 'http://your.website.com'
|
64
|
+
s.platform = Gem::Platform::RUBY
|
65
|
+
s.summary = 'A description of your project'
|
66
|
+
# Add your other files here if you make them
|
67
|
+
s.files = %w(
|
68
|
+
bin/#{project_name}
|
69
|
+
lib/#{project_name}/version.rb
|
70
|
+
lib/#{project_name}.rb
|
71
|
+
)
|
72
|
+
s.require_paths << 'lib'
|
73
|
+
s.has_rdoc = true
|
74
|
+
s.extra_rdoc_files = ['README.rdoc','#{project_name}.rdoc']
|
75
|
+
s.rdoc_options << '--title' << '#{project_name}' << '--main' << 'README.rdoc' << '-ri'
|
76
|
+
s.bindir = 'bin'
|
77
|
+
s.executables << '#{project_name}'
|
78
|
+
s.add_development_dependency('rake')
|
79
|
+
s.add_development_dependency('rdoc')
|
80
|
+
s.add_development_dependency('aruba')
|
81
|
+
s.add_runtime_dependency('coglius','#{Coglius::VERSION}')
|
82
|
+
end
|
83
|
+
EOS
|
84
|
+
end
|
85
|
+
puts "Created #{root_dir}/#{project_name}/#{project_name}.gemspec"
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.project_name_as_module_name(project_name)
|
89
|
+
project_name.split(/[_-]/).map { |part| part[0..0].upcase + part[1..-1] }.join('')
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.mk_lib_files(root_dir,dry_run,project_name)
|
93
|
+
return if dry_run
|
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|
|
96
|
+
file.puts <<EOS
|
97
|
+
module #{project_name_as_module_name(project_name)}
|
98
|
+
VERSION = '0.0.1'
|
99
|
+
end
|
100
|
+
EOS
|
101
|
+
end
|
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"
|
112
|
+
end
|
113
|
+
def self.mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
|
114
|
+
return if dry_run
|
115
|
+
File.open("#{root_dir}/#{project_name}/Rakefile",'w') do |file|
|
116
|
+
file.puts <<EOS
|
117
|
+
require 'rake/clean'
|
118
|
+
require 'rubygems'
|
119
|
+
require 'rubygems/package_task'
|
120
|
+
require 'rdoc/task'
|
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
|
129
|
+
Rake::RDocTask.new do |rd|
|
130
|
+
rd.main = "README.rdoc"
|
131
|
+
rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
|
132
|
+
rd.title = 'Your application title'
|
133
|
+
end
|
134
|
+
|
135
|
+
spec = eval(File.read('#{project_name}.gemspec'))
|
136
|
+
|
137
|
+
Gem::PackageTask.new(spec) do |pkg|
|
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
|
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'
|
163
|
+
EOS
|
164
|
+
end
|
165
|
+
if create_test_dir
|
166
|
+
file.puts <<EOS
|
167
|
+
require 'rake/testtask'
|
168
|
+
Rake::TestTask.new do |t|
|
169
|
+
t.libs << "test"
|
170
|
+
t.test_files = FileList['test/*_test.rb']
|
171
|
+
end
|
172
|
+
|
173
|
+
task :default => [:test,:features]
|
174
|
+
EOS
|
175
|
+
File.open("#{root_dir}/#{project_name}/test/default_test.rb",'w') do |test_file|
|
176
|
+
test_file.puts <<EOS
|
177
|
+
require 'test_helper'
|
178
|
+
|
179
|
+
class DefaultTest < Test::Unit::TestCase
|
180
|
+
|
181
|
+
def setup
|
182
|
+
end
|
183
|
+
|
184
|
+
def teardown
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_the_truth
|
188
|
+
assert true
|
189
|
+
end
|
190
|
+
end
|
191
|
+
EOS
|
192
|
+
end
|
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"
|
208
|
+
else
|
209
|
+
file.puts "task :default => :package\n"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
puts "Created #{root_dir}/#{project_name}/Rakefile"
|
213
|
+
File.open("#{root_dir}/#{project_name}/Gemfile",'w') do |bundler_file|
|
214
|
+
bundler_file.puts "source :rubygems"
|
215
|
+
bundler_file.puts "gemspec"
|
216
|
+
end
|
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
|
266
|
+
end
|
267
|
+
|
268
|
+
def self.mk_binfile(root_dir,create_ext_dir,force,dry_run,project_name,commands)
|
269
|
+
bin_file = File.join(root_dir,project_name,'bin',project_name)
|
270
|
+
if !File.exist?(bin_file) || force
|
271
|
+
if !dry_run
|
272
|
+
File.open(bin_file,'w') do |file|
|
273
|
+
file.chmod(0755)
|
274
|
+
file.puts '#!/usr/bin/env ruby'
|
275
|
+
file.puts <<EOS
|
276
|
+
require 'coglius'
|
277
|
+
begin # XXX: Remove this begin/rescue before distributing your app
|
278
|
+
require '#{project_name}'
|
279
|
+
rescue LoadError
|
280
|
+
STDERR.puts "In development, you need to use `bundle exec bin/#{project_name}` to run your app"
|
281
|
+
STDERR.puts "At install-time, RubyGems will make sure lib, etc. are in the load path"
|
282
|
+
STDERR.puts "Feel free to remove this message from bin/#{project_name} now"
|
283
|
+
exit 64
|
284
|
+
end
|
285
|
+
|
286
|
+
include Coglius::App
|
287
|
+
|
288
|
+
program_desc 'Describe your application here'
|
289
|
+
|
290
|
+
version #{project_name_as_module_name(project_name)}::VERSION
|
291
|
+
|
292
|
+
desc 'Describe some switch here'
|
293
|
+
switch [:s,:switch]
|
294
|
+
|
295
|
+
desc 'Describe some flag here'
|
296
|
+
default_value 'the default'
|
297
|
+
arg_name 'The name of the argument'
|
298
|
+
flag [:f,:flagname]
|
299
|
+
EOS
|
300
|
+
first = true
|
301
|
+
commands.each do |command|
|
302
|
+
file.puts <<EOS
|
303
|
+
|
304
|
+
desc 'Describe #{command} here'
|
305
|
+
arg_name 'Describe arguments to #{command} here'
|
306
|
+
EOS
|
307
|
+
if first
|
308
|
+
file.puts <<EOS
|
309
|
+
command :#{command} do |c|
|
310
|
+
c.desc 'Describe a switch to #{command}'
|
311
|
+
c.switch :s
|
312
|
+
|
313
|
+
c.desc 'Describe a flag to #{command}'
|
314
|
+
c.default_value 'default'
|
315
|
+
c.flag :f
|
316
|
+
c.action do |global_options,options,args|
|
317
|
+
|
318
|
+
# Your command logic here
|
319
|
+
|
320
|
+
# If you have any errors, just raise them
|
321
|
+
# raise "that command made no sense"
|
322
|
+
|
323
|
+
puts "#{command} command ran"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
EOS
|
327
|
+
else
|
328
|
+
file.puts <<EOS
|
329
|
+
command :#{command} do |c|
|
330
|
+
c.action do |global_options,options,args|
|
331
|
+
puts "#{command} command ran"
|
332
|
+
end
|
333
|
+
end
|
334
|
+
EOS
|
335
|
+
end
|
336
|
+
first = false
|
337
|
+
end
|
338
|
+
file.puts <<EOS
|
339
|
+
|
340
|
+
pre do |global,command,options,args|
|
341
|
+
# Pre logic here
|
342
|
+
# Return true to proceed; false to abort and not call the
|
343
|
+
# chosen command
|
344
|
+
# Use skips_pre before a command to skip this block
|
345
|
+
# on that command only
|
346
|
+
true
|
347
|
+
end
|
348
|
+
|
349
|
+
post do |global,command,options,args|
|
350
|
+
# Post logic here
|
351
|
+
# Use skips_post before a command to skip this
|
352
|
+
# block on that command only
|
353
|
+
end
|
354
|
+
|
355
|
+
on_error do |exception|
|
356
|
+
# Error logic here
|
357
|
+
# return false to skip default error handling
|
358
|
+
true
|
359
|
+
end
|
360
|
+
|
361
|
+
exit run(ARGV)
|
362
|
+
EOS
|
363
|
+
puts "Created #{bin_file}"
|
364
|
+
end
|
365
|
+
end
|
366
|
+
else
|
367
|
+
puts bin_file + " exists; use --force to override"
|
368
|
+
return false
|
369
|
+
end
|
370
|
+
true
|
371
|
+
end
|
372
|
+
|
373
|
+
def self.mkdirs(dirs,force,dry_run)
|
374
|
+
exists = false
|
375
|
+
if !force
|
376
|
+
dirs.each do |dir|
|
377
|
+
if File.exist? dir
|
378
|
+
raise "#{dir} exists; use --force to override"
|
379
|
+
exists = true
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
if !exists
|
384
|
+
dirs.each do |dir|
|
385
|
+
puts "Creating dir #{dir}..."
|
386
|
+
if dry_run
|
387
|
+
puts "dry-run; #{dir} not created"
|
388
|
+
else
|
389
|
+
FileUtils.mkdir_p dir
|
390
|
+
end
|
391
|
+
end
|
392
|
+
else
|
393
|
+
puts "Exiting..."
|
394
|
+
return false
|
395
|
+
end
|
396
|
+
true
|
397
|
+
end
|
398
|
+
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|