methadone-rehab 1.9.2

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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGES.md +66 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +201 -0
  9. data/README.rdoc +179 -0
  10. data/Rakefile +98 -0
  11. data/TODO.md +3 -0
  12. data/bin/methadone +157 -0
  13. data/features/bootstrap.feature +169 -0
  14. data/features/license.feature +43 -0
  15. data/features/multilevel_commands.feature +125 -0
  16. data/features/readme.feature +26 -0
  17. data/features/rspec_support.feature +27 -0
  18. data/features/step_definitions/bootstrap_steps.rb +47 -0
  19. data/features/step_definitions/license_steps.rb +30 -0
  20. data/features/step_definitions/readme_steps.rb +26 -0
  21. data/features/step_definitions/version_steps.rb +4 -0
  22. data/features/support/env.rb +26 -0
  23. data/features/version.feature +17 -0
  24. data/lib/methadone.rb +15 -0
  25. data/lib/methadone/argv_parser.rb +50 -0
  26. data/lib/methadone/cli.rb +124 -0
  27. data/lib/methadone/cli_logger.rb +133 -0
  28. data/lib/methadone/cli_logging.rb +138 -0
  29. data/lib/methadone/cucumber.rb +174 -0
  30. data/lib/methadone/error.rb +32 -0
  31. data/lib/methadone/execution_strategy/base.rb +34 -0
  32. data/lib/methadone/execution_strategy/jvm.rb +37 -0
  33. data/lib/methadone/execution_strategy/mri.rb +16 -0
  34. data/lib/methadone/execution_strategy/open_3.rb +16 -0
  35. data/lib/methadone/execution_strategy/open_4.rb +22 -0
  36. data/lib/methadone/execution_strategy/rbx_open_4.rb +12 -0
  37. data/lib/methadone/exit_now.rb +40 -0
  38. data/lib/methadone/main.rb +1039 -0
  39. data/lib/methadone/process_status.rb +45 -0
  40. data/lib/methadone/sh.rb +223 -0
  41. data/lib/methadone/version.rb +3 -0
  42. data/methadone-rehab.gemspec +32 -0
  43. data/templates/full/.gitignore.erb +4 -0
  44. data/templates/full/README.rdoc.erb +25 -0
  45. data/templates/full/Rakefile.erb +74 -0
  46. data/templates/full/_license_head.txt.erb +2 -0
  47. data/templates/full/apache_LICENSE.txt.erb +203 -0
  48. data/templates/full/bin/executable.erb +47 -0
  49. data/templates/full/custom_LICENSE.txt.erb +0 -0
  50. data/templates/full/features/executable.feature.erb +13 -0
  51. data/templates/full/features/step_definitions/executable_steps.rb.erb +1 -0
  52. data/templates/full/features/support/env.rb.erb +16 -0
  53. data/templates/full/gplv2_LICENSE.txt.erb +14 -0
  54. data/templates/full/gplv3_LICENSE.txt.erb +15 -0
  55. data/templates/full/mit_LICENSE.txt.erb +7 -0
  56. data/templates/multicommand/bin/executable.erb +52 -0
  57. data/templates/multicommand/lib/command.rb.erb +40 -0
  58. data/templates/multicommand/lib/commands.rb.erb +7 -0
  59. data/templates/rspec/spec/something_spec.rb.erb +5 -0
  60. data/templates/test_unit/test/tc_something.rb.erb +7 -0
  61. data/test/base_test.rb +20 -0
  62. data/test/command_for_tests.sh +7 -0
  63. data/test/execution_strategy/test_base.rb +24 -0
  64. data/test/execution_strategy/test_jvm.rb +77 -0
  65. data/test/execution_strategy/test_mri.rb +32 -0
  66. data/test/execution_strategy/test_open_3.rb +70 -0
  67. data/test/execution_strategy/test_open_4.rb +86 -0
  68. data/test/execution_strategy/test_rbx_open_4.rb +25 -0
  69. data/test/test_cli_logger.rb +219 -0
  70. data/test/test_cli_logging.rb +243 -0
  71. data/test/test_exit_now.rb +37 -0
  72. data/test/test_main.rb +1213 -0
  73. data/test/test_multi.rb +405 -0
  74. data/test/test_sh.rb +404 -0
  75. metadata +321 -0
@@ -0,0 +1,125 @@
1
+ Feature: Support multi-level commands
2
+ As a developer who wants to make a multi-level command line app
3
+ I should be able to create a Methadone class that delegates subcommands to other Methadone classes
4
+ and each should support their own options, args and potentially other subcommands.
5
+
6
+ Background:
7
+ Given the directory "tmp/multigem" does not exist
8
+
9
+ Scenario: Bootstrap a multi-level app from scratch
10
+ When I successfully run `methadone --commands walk,run,crawl,dance tmp/multigem`
11
+ Then the following directories should exist:
12
+ |tmp/multigem |
13
+ |tmp/multigem/bin |
14
+ |tmp/multigem/lib |
15
+ |tmp/multigem/lib/multigem |
16
+ |tmp/multigem/lib/multigem/commands |
17
+ |tmp/multigem/test |
18
+ |tmp/multigem/features |
19
+ |tmp/multigem/features/support |
20
+ |tmp/multigem/features/step_definitions |
21
+ Then the following directories should not exist:
22
+ |tmp/multigem/spec |
23
+ And the following files should exist:
24
+ |tmp/multigem/multigem.gemspec |
25
+ |tmp/multigem/Rakefile |
26
+ |tmp/multigem/.gitignore |
27
+ |tmp/multigem/Gemfile |
28
+ |tmp/multigem/bin/multigem |
29
+ |tmp/multigem/lib/multigem/version.rb |
30
+ |tmp/multigem/lib/multigem/commands/walk.rb |
31
+ |tmp/multigem/lib/multigem/commands/run.rb |
32
+ |tmp/multigem/lib/multigem/commands/crawl.rb |
33
+ |tmp/multigem/lib/multigem/commands/dance.rb |
34
+ |tmp/multigem/features/multigem.feature |
35
+ |tmp/multigem/features/support/env.rb |
36
+ |tmp/multigem/features/step_definitions/multigem_steps.rb |
37
+ |tmp/multigem/test/tc_something.rb |
38
+ And the file "tmp/multigem/.gitignore" should match /results.html/
39
+ And the file "tmp/multigem/.gitignore" should match /html/
40
+ And the file "tmp/multigem/.gitignore" should match /pkg/
41
+ And the file "tmp/multigem/.gitignore" should match /.DS_Store/
42
+ And the file "tmp/multigem/multigem.gemspec" should match /add_development_dependency\('aruba'/
43
+ And the file "tmp/multigem/multigem.gemspec" should match /add_development_dependency\('rdoc'/
44
+ And the file "tmp/multigem/multigem.gemspec" should match /add_development_dependency "rake", "~> 10.0"/
45
+ And the file "tmp/multigem/multigem.gemspec" should match /add_dependency\('methadone-rehab'/
46
+ And the file "tmp/multigem/multigem.gemspec" should use the same block variable throughout
47
+ And the file "tmp/multigem/bin/multigem" should match /command "walk" => Multigem::Commands::Walk/
48
+ And the file "tmp/multigem/bin/multigem" should match /command "run" => Multigem::Commands::Run/
49
+ And the file "tmp/multigem/bin/multigem" should match /command "crawl" => Multigem::Commands::Crawl/
50
+ And the file "tmp/multigem/bin/multigem" should match /command "dance" => Multigem::Commands::Dance/
51
+ Given I cd to "tmp/multigem"
52
+ And my app's name is "multigem"
53
+ When I successfully run `bin/multigem --help` with "lib" in the library path
54
+ Then the banner should be present
55
+ And the banner should document that this app takes options
56
+ And the banner should document that this app takes commands
57
+ And the following commands should be documented:
58
+ |walk |
59
+ |run |
60
+ |crawl |
61
+ |dance |
62
+ And the following options should be documented:
63
+ |--version|
64
+ |--help|
65
+ |--log-level|
66
+
67
+ Scenario: Special characters in subcommands and gem name
68
+ Given a directory named "tmp"
69
+ And the directory "tmp/multigem2" does not exist
70
+ When I run `methadone --add-lib --commands walk,run,crawl_to_bed,tap-dance,@go-crazy tmp/multigem2`
71
+ Then the exit status should be 0
72
+ And the following directories should exist:
73
+ |tmp/multigem2 |
74
+ |tmp/multigem2/bin |
75
+ |tmp/multigem2/lib |
76
+ |tmp/multigem2/lib/multigem2 |
77
+ |tmp/multigem2/lib/multigem2/commands |
78
+ |tmp/multigem2/test |
79
+ |tmp/multigem2/features |
80
+ |tmp/multigem2/features/support |
81
+ |tmp/multigem2/features/step_definitions |
82
+ And the following directories should not exist:
83
+ |tmp/multigem2/spec |
84
+ And the following files should exist:
85
+ |tmp/multigem2/multigem2.gemspec |
86
+ |tmp/multigem2/Rakefile |
87
+ |tmp/multigem2/.gitignore |
88
+ |tmp/multigem2/Gemfile |
89
+ |tmp/multigem2/bin/multigem2 |
90
+ |tmp/multigem2/lib/multigem2/version.rb |
91
+ |tmp/multigem2/lib/multigem2/commands/walk.rb |
92
+ |tmp/multigem2/lib/multigem2/commands/run.rb |
93
+ |tmp/multigem2/lib/multigem2/commands/crawl_to_bed.rb |
94
+ |tmp/multigem2/lib/multigem2/commands/tap_dance.rb |
95
+ |tmp/multigem2/lib/multigem2/commands/go_crazy.rb |
96
+ |tmp/multigem2/features/multigem2.feature |
97
+ |tmp/multigem2/features/support/env.rb |
98
+ |tmp/multigem2/features/step_definitions/multigem2_steps.rb |
99
+ |tmp/multigem2/test/tc_something.rb |
100
+ And the file "tmp/multigem2/bin/multigem2" should match /command "walk" => Multigem2::Commands::Walk/
101
+ And the file "tmp/multigem2/bin/multigem2" should match /command "run" => Multigem2::Commands::Run/
102
+ And the file "tmp/multigem2/bin/multigem2" should match /command "crawl_to_bed" => Multigem2::Commands::CrawlToBed/
103
+ And the file "tmp/multigem2/bin/multigem2" should match /command "tap-dance" => Multigem2::Commands::TapDance/
104
+ And the file "tmp/multigem2/bin/multigem2" should match /command "@go-crazy" => Multigem2::Commands::GoCrazy/
105
+ Given I cd to "tmp/multigem2"
106
+ And my app's name is "multigem2"
107
+ When I successfully run `bin/multigem2 --help`
108
+ Then the banner should be present
109
+ And the banner should document that this app takes options
110
+ And the banner should document that this app takes commands
111
+ And the following commands should be documented:
112
+ |walk |
113
+ |run |
114
+ |crawl_to_bed |
115
+ |tap-dance |
116
+ |@go-crazy |
117
+ And the following options should be documented:
118
+ |--version|
119
+ |--help|
120
+ |--log-level|
121
+ When I successfully run `bin/multigem2 tap-dance -h`
122
+ Then the banner should be present
123
+ And the banner should document that this app takes global options
124
+ And the banner should document that this app takes options
125
+
@@ -0,0 +1,26 @@
1
+ Feature: a README should be generated
2
+ As a user
3
+ I want a template README
4
+ So I don't need to recall the formatting or other info to get started
5
+
6
+ Background:
7
+ Given the directory "tmp/newgem" does not exist
8
+
9
+ Scenario: I don't want a README
10
+ When I successfully run `methadone --no-readme tmp/newgem`
11
+ Then a README should not be generated
12
+ And the file "tmp/newgem/Rakefile" should not match /rd.main = "README.rdoc"/
13
+
14
+ Scenario Outline: Generate README
15
+ When I successfully run `methadone <flag> tmp/newgem`
16
+ Then a README should be generated in RDoc
17
+ And the README should contain the project name
18
+ And the README should contain my name
19
+ And the README should contain links to Github and RDoc.info
20
+ And the README should contain empty sections for common elements of a README
21
+ And the file "tmp/newgem/Rakefile" should match /rd.main = "README.rdoc"/
22
+
23
+ Examples:
24
+ |flag|
25
+ | |
26
+ |--readme|
@@ -0,0 +1,27 @@
1
+ Feature: Bootstrap a new command-line app using RSpec instead of Test::Unit
2
+ As an awesome developer who wants to make a command-line app
3
+ I should be able to use methadone to bootstrap it
4
+ And get support for RSpec instead of Test::Unit
5
+
6
+ Background:
7
+ Given the directory "tmp/newgem" does not exist
8
+
9
+ Scenario: Bootstrap a new app from scratch
10
+ When I successfully run `methadone --rspec tmp/newgem`
11
+ Then the following directories should exist:
12
+ |tmp/newgem/spec |
13
+ And the following directories should not exist:
14
+ |tmp/newgem/test |
15
+ And the following files should exist:
16
+ |tmp/newgem/spec/something_spec.rb |
17
+ And the file "tmp/newgem/newgem.gemspec" should match /add_development_dependency\('rspec'/
18
+ When I cd to "tmp/newgem"
19
+ And I successfully run `rake -T -I../../lib`
20
+ Then the output should match /rake spec/
21
+ And the output should not match /rake test/
22
+ When I run `rake spec -I../../lib`
23
+ Then the exit status should be 0
24
+ And the output should contain:
25
+ """
26
+ 1 example, 0 failures
27
+ """
@@ -0,0 +1,47 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ Given /^the directory "([^"]*)" does not exist$/ do |dir|
5
+ dir = File.join(ARUBA_DIR,dir)
6
+ rm_rf dir,:verbose => false, :secure => true
7
+ end
8
+
9
+ Given /^my app's name is "([^"]*)"$/ do |app_name|
10
+ @app_name = app_name
11
+ end
12
+
13
+ Then /^the file "([^"]*)" should use the same block variable throughout$/ do |file|
14
+ prep_for_fs_check do
15
+ content = IO.read(file)
16
+ from_bundler = content.match(/(\w+)\.authors/)[1]
17
+ added_by_methadone = content.match(/(\w+).add_development_dependency\('rdoc'/)[1]
18
+ from_bundler.should == added_by_methadone
19
+ end
20
+ end
21
+
22
+ Then /^the stderr should match \/([^\/]*)\/$/ do |expected|
23
+ assert_matching_output(expected, all_stderr)
24
+ end
25
+
26
+ Given /^"(.*?)" has configured version to show only the version (.*)and not help$/ do |gemname,extras|
27
+ lines = File.read("tmp/aruba/tmp/new-gem/#{gemname}").split(/\n/)
28
+ File.open("tmp/aruba/tmp/new-gem/#{gemname}","w") do |file|
29
+ lines.each do |line|
30
+ if line =~ /^\s*version New::Gem::VERSION/
31
+ if extras =~ /with a custom format/
32
+ file.puts line + ", :compact => true, :format => '%s V%s'"
33
+ else
34
+ file.puts line + ", :compact => true"
35
+ end
36
+ else
37
+ file.puts line
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ Then /^the file "(.*?)" should include "(.*?)" if needed$/ do |file, gemname|
44
+ if RUBY_VERSION =~ /^2\./ && RUBY_VERSION !~ /^2.0/ && RUBY_VERSION !~ /^2.1/
45
+ step %{the file "#{file}" should match /add_development_dependency\\('#{gemname}/}
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ Then /^the README should not reference a license$/ do
2
+ step %(the file "tmp/newgem/README.rdoc" should not match /[Ll]icense/)
3
+ end
4
+
5
+ Then /^newgem's license should be the (\w+) license/ do |license|
6
+ @license = license
7
+ step %(a file named "tmp/newgem/LICENSE.txt" should exist)
8
+ step %(the file "tmp/newgem/newgem.gemspec" should match /#{@license}/)
9
+ end
10
+
11
+ Then /^the README should reference this license$/ do
12
+ step %(the file "tmp/newgem/README.rdoc" should match /License::/)
13
+ step %(the file "tmp/newgem/README.rdoc" should match /#{@license}/)
14
+ end
15
+
16
+
17
+ Then /^newgem's license should be an empty file$/ do
18
+ step %(a file named "tmp/newgem/LICENSE.txt" should exist)
19
+ File.read("tmp/aruba/tmp/newgem/LICENSE.txt").should == "\n"
20
+ end
21
+
22
+ Then /^the README should reference the need for a license$/ do
23
+ step %(the file "tmp/newgem/README.rdoc" should match /License:: INSERT LICENSE HERE/)
24
+ end
25
+
26
+ Then(/^LICENSE\.txt should contain user information and program name$/) do
27
+ step %(the file "tmp/newgem/LICENSE.txt" should match /#{`git config user.name`}/)
28
+ step %(the file "tmp/newgem/LICENSE.txt" should match /newgem/)
29
+ step %(the file "tmp/newgem/LICENSE.txt" should match /#{Time.now.year}/)
30
+ end
@@ -0,0 +1,26 @@
1
+ Then /^a README should not be generated$/ do
2
+ step %(the file "tmp/newgem/README.rdoc" should not exist)
3
+ end
4
+
5
+ Then /^a README should be generated in RDoc$/ do
6
+ step %(a file named "tmp/newgem/README.rdoc" should exist)
7
+ end
8
+
9
+ Then /^the README should contain the project name$/ do
10
+ step %(the file "tmp/newgem/README.rdoc" should match /newgem/)
11
+ end
12
+
13
+ Then /^the README should contain my name$/ do
14
+ step %(the file "tmp/newgem/README.rdoc" should match /Author:: YOUR NAME \\\(YOUR EMAIL\\\)/)
15
+ end
16
+
17
+ Then /^the README should contain links to Github and RDoc.info$/ do
18
+ step %(the file "tmp/newgem/README.rdoc" should match /\\\* \\\{Source on Github\\\}\\\[LINK TO GITHUB\\\]/)
19
+ step %(the file "tmp/newgem/README.rdoc" should match /RDoc\\\[LINK TO RDOC.INFO\\\]/)
20
+ end
21
+
22
+ Then /^the README should contain empty sections for common elements of a README$/ do
23
+ step %(the file "tmp/newgem/README.rdoc" should match /^== Install/)
24
+ step %(the file "tmp/newgem/README.rdoc" should match /^== Examples/)
25
+ step %(the file "tmp/newgem/README.rdoc" should match /^== Contributing/)
26
+ end
@@ -0,0 +1,4 @@
1
+ When /^I successfully run `([^`]*)` with "([^"]*)" in the library path$/ do |command,dir|
2
+ ENV["RUBYOPT"] = (ENV["RUBYOPT"] || '') + " -I" + File.join(Dir.pwd,ARUBA_DIR,'tmp',@app_name,dir)
3
+ step %(I successfully run `#{command}`)
4
+ end
@@ -0,0 +1,26 @@
1
+ require 'aruba/cucumber'
2
+ require 'methadone/cucumber'
3
+
4
+ PROJECT_ROOT = File.join(File.dirname(__FILE__),'..','..')
5
+ ENV['PATH'] = "#{File.join(PROJECT_ROOT,'bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
6
+ ARUBA_DIR = File.join(%w(tmp aruba))
7
+ Before do
8
+ @dirs = [ARUBA_DIR]
9
+ @puts = true
10
+ @aruba_timeout_seconds = 60
11
+ @original_rubylib = ENV['RUBYLIB']
12
+ @original_rubyopt = ENV['RUBYOPT']
13
+
14
+ # We want to use, hopefully, the methadone from this codebase and not
15
+ # the gem, so we put it in the RUBYLIB
16
+ ENV['RUBYLIB'] = File.join(PROJECT_ROOT,'lib') + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
17
+
18
+ # We need -rubygems here so that 1.8-style rubies work AND travis-ci doesn't barf with it in the shebang line
19
+ ENV['RUBYOPT'] = (ENV['RUBYOPT'] || '') + ' -rubygems'
20
+ end
21
+
22
+ After do
23
+ # Put back how it was
24
+ ENV['RUBYLIB'] = @original_rubylib
25
+ ENV['RUBYOPT'] = @original_rubyopt
26
+ end
@@ -0,0 +1,17 @@
1
+ Feature: The version should show up in the banner by default
2
+ As a developer
3
+ I should be able to have the current gem version in the banner
4
+ So I don't have to maintain it in two places
5
+ And so users can easily see the version from the app itself
6
+
7
+ Scenario Outline: Show the gem version
8
+ Given my app's name is "newgem"
9
+ And I successfully run `methadone tmp/newgem`
10
+ When I cd to "tmp/newgem"
11
+ And I successfully run `bin/newgem <flag>` with "lib" in the library path
12
+ Then the banner should include the version
13
+
14
+ Examples:
15
+ |flag |
16
+ |--help |
17
+ |--version |
@@ -0,0 +1,15 @@
1
+ require 'methadone/version'
2
+ require 'methadone/cli_logger'
3
+ require 'methadone/cli_logging'
4
+ require 'methadone/exit_now'
5
+ require 'methadone/argv_parser'
6
+ require 'methadone/main'
7
+ require 'methadone/error'
8
+ require 'methadone/execution_strategy/base'
9
+ require 'methadone/execution_strategy/mri'
10
+ require 'methadone/execution_strategy/open_3'
11
+ require 'methadone/execution_strategy/open_4'
12
+ require 'methadone/execution_strategy/rbx_open_4'
13
+ require 'methadone/execution_strategy/jvm'
14
+ require 'methadone/sh'
15
+ # Note: DO NOT require cli.rb OR cucumber.rb here
@@ -0,0 +1,50 @@
1
+ module Methadone #:nodoc:
2
+ # Assists with parsing strings in the same way that ARGV might.
3
+ # This is *not* used to parse the command-line, but used to
4
+ # parse config files/environment variables so they can be placed into ARGV and properly interpretted by
5
+ # OptionParser
6
+ module ARGVParser #:nodoc:
7
+
8
+ private
9
+
10
+ # Parses +string+, returning an array that can be placed into ARGV or given to OptionParser
11
+ def parse_string_for_argv(string) #:nodoc:
12
+ return [] if string.nil?
13
+
14
+ args = [] # return value we are building up
15
+ current = 0 # pointer to where we are in +string+
16
+ next_arg = '' # the next arg we are building up to ultimatley put into args
17
+ inside_quote = nil # quote character we are "inside" of
18
+ last_char = nil # the last character we saw
19
+
20
+ while current < string.length
21
+ char = string.chars.to_a[current]
22
+ case char
23
+ when /["']/
24
+ if inside_quote.nil? # eat the quote, but remember we are now "inside" one
25
+ inside_quote = char
26
+ elsif inside_quote == char # we closed the quote we were "inside"
27
+ inside_quote = nil
28
+ else # we got a different quote, so it goes in literally
29
+ next_arg << char
30
+ end
31
+ when /\s/
32
+ if last_char == "\\" # we have an escaped space, replace the escape char
33
+ next_arg[-1] = char
34
+ elsif inside_quote # we are inside a quote so keep the space
35
+ next_arg << char
36
+ else # new argument
37
+ args << next_arg
38
+ next_arg = ''
39
+ end
40
+ else
41
+ next_arg << char
42
+ end
43
+ current += 1
44
+ last_char = char
45
+ end
46
+ args << next_arg unless next_arg == ''
47
+ args
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,124 @@
1
+ require 'erb'
2
+
3
+ module Methadone
4
+ # <b>Methadone Internal - treat as private</b>
5
+ #
6
+ # Stuff to implement methadone's CLI app. These
7
+ # stuff isn't generally for your use and it's not
8
+ # included when you require 'methadone'
9
+ module CLI
10
+
11
+ # Checks that the basedir can be used, either by
12
+ # not existing, or by existing and force is true.
13
+ # In that case, we clean it out entirely
14
+ #
15
+ # +basedir+:: base directory where the user wants to create a new project
16
+ # +force+:: if true, and +basedir+ exists, delete it before proceeding
17
+ #
18
+ # This will exit the app if the dir exists and force is false
19
+ def check_and_prepare_basedir!(basedir,force)
20
+ if File.exists? basedir
21
+ if force
22
+ rm_rf basedir, :verbose => true, :secure => true
23
+ else
24
+ exit_now! 1,"error: #{basedir} exists, use --force to override"
25
+ end
26
+ end
27
+ mkdir_p basedir
28
+ end
29
+
30
+ # Add content to a file
31
+ #
32
+ # +file+:: path to the file
33
+ # +lines+:: Array of String representing the lines to add
34
+ # +options+:: Hash of options:
35
+ # <tt>:before</tt>:: A regexp that will appear right after the new content. i.e.
36
+ # this is where to insert said content.
37
+ def add_to_file(file,lines,options = {})
38
+ new_lines = []
39
+ found_line = false
40
+ File.open(file).readlines.each do |line|
41
+ line.chomp!
42
+ if options[:before] && options[:before] === line
43
+ found_line = true
44
+ new_lines += lines
45
+ end
46
+ new_lines << line
47
+ end
48
+
49
+ raise "No line matched #{options[:before]}" if options[:before] && !found_line
50
+
51
+ new_lines += lines unless options[:before]
52
+ File.open(file,'w') do |fp|
53
+ new_lines.each { |line| fp.puts line }
54
+ end
55
+ end
56
+
57
+ # Copies a file, running it through ERB
58
+ #
59
+ # +relative_path+:: path to the file, relative to the project root, minus the .erb extension
60
+ # You should use forward slashes to separate paths; this method
61
+ # will handle making the ultimate path OS independent.
62
+ # +options+:: Options to affect how the copy is done:
63
+ # <tt>:from</tt>:: The name of the profile from which to find the file, "full" by default
64
+ # <tt>:as</tt>:: The name the file should get if not the one in relative_path
65
+ # <tt>:executable</tt>:: true if this file should be set executable
66
+ # <tt>:binding</tt>:: the binding to use for the template
67
+ def copy_file(relative_path,options = {})
68
+
69
+ relative_path = File.join(relative_path.split(/\//))
70
+
71
+ template_path = File.join(template_dir(options[:from] || :full),relative_path + ".erb")
72
+ template = ERB.new(File.open(template_path).readlines.join(''), nil ,'-')
73
+
74
+ relative_path_parts = File.split(relative_path)
75
+ relative_path_parts[-1] = options[:as] if options[:as]
76
+
77
+ File.open(File.join(relative_path_parts),'w') do |file|
78
+ file.puts template.result(options[:binding] || binding)
79
+ file.chmod(0755) if options[:executable]
80
+ end
81
+ end
82
+
83
+ # Get the location of the templates for profile "from"
84
+ def template_dir(from)
85
+ File.join(File.dirname(__FILE__),'..','..','templates',from.to_s)
86
+ end
87
+
88
+ def template_dirs_in(profile)
89
+ template_dir = template_dir(profile)
90
+
91
+ Dir["#{template_dir}/**/*"].select { |x|
92
+ File.directory? x
93
+ }.map { |dir|
94
+ dir.gsub(/^#{template_dir}\//,'')
95
+ }
96
+ end
97
+
98
+ # converts string to constant form:
99
+ # methadone-module_name-class_name => Methadone::ModuleName::ClassName
100
+ def titlify(name)
101
+ name.gsub(/(^|-|_)(.)/) {"#{'::' if $1 == '-'}#{$2.upcase}"}
102
+ end
103
+
104
+ def normalize_command(cmd)
105
+ #Note: not i18n-safe
106
+ cmd.tr('A-Z','a-z').gsub(/[^a-z0-9_]/,'_').sub(/^_*/,'')
107
+ end
108
+
109
+ def render_license_partial(partial)
110
+ ERB.new(File.read(template_dir('full/'+partial))).result(binding).strip
111
+ end
112
+
113
+ def gemspec
114
+ @gemspec || @gemspec=_get_gemspec
115
+ end
116
+ private
117
+ def _get_gemspec
118
+ files=Dir.glob("*.gemspec")
119
+ raise "Multiple gemspec files" if files.size>1
120
+ raise "No gemspec file" if files.size < 1
121
+ Gem::Specification::load(files.first)
122
+ end
123
+ end
124
+ end