gem_suit 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/.suit +4 -0
- data/CHANGELOG.rdoc +5 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.textile +419 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/bin/suit +10 -0
- data/gem_suit.gemspec +26 -0
- data/lib/gem_suit/application/actions.rb +203 -0
- data/lib/gem_suit/application/test.rb +106 -0
- data/lib/gem_suit/application/utils/gemfile.rb +42 -0
- data/lib/gem_suit/application/utils.rb +135 -0
- data/lib/gem_suit/application.rb +42 -0
- data/lib/gem_suit/cli/application/io_buffer.rb +54 -0
- data/lib/gem_suit/cli/application/test_loader.rb +5 -0
- data/lib/gem_suit/cli/application.rb +159 -0
- data/lib/gem_suit/cli/base/shell.rb +41 -0
- data/lib/gem_suit/cli/base/utils.rb +83 -0
- data/lib/gem_suit/cli/base.rb +15 -0
- data/lib/gem_suit/cli/builder/boot +14 -0
- data/lib/gem_suit/cli/builder/generator.rb +154 -0
- data/lib/gem_suit/cli/builder/rails_app.rb +146 -0
- data/lib/gem_suit/cli/builder.rb +143 -0
- data/lib/gem_suit/cli/config/hash.rb +61 -0
- data/lib/gem_suit/cli/config.rb +37 -0
- data/lib/gem_suit/cli.rb +145 -0
- data/lib/gem_suit/integration_test.rb +14 -0
- data/lib/gem_suit/test_help.rb +17 -0
- data/lib/gem_suit/version.rb +9 -0
- data/lib/gem_suit.rb +6 -0
- data/templates/dynamic/CHANGELOG.rdoc +5 -0
- data/templates/dynamic/Gemfile +14 -0
- data/templates/dynamic/MIT-LICENSE +20 -0
- data/templates/dynamic/README.textile +35 -0
- data/templates/dynamic/VERSION +1 -0
- data/templates/dynamic/config/boot.rb +13 -0
- data/templates/dynamic/config/preinitializer.rb +20 -0
- data/templates/dynamic/gitignore +9 -0
- data/templates/dynamic/suit/shared/app/views/application/index.html.erb +16 -0
- data/templates/dynamic/suit/shared/public/stylesheets/app.css +99 -0
- data/templates/dynamic/suit/shared/test/test_helper.rb +37 -0
- data/templates/dynamic/suit/templates/shared/Gemfile +14 -0
- data/templates/dynamic/suit/templates/shared/config/database-mysql.yml +11 -0
- data/templates/dynamic/suit/templates/shared/config/database-sqlite.yml +10 -0
- data/templates/static/suit/shared/app/models/.gitkeep +0 -0
- data/templates/static/suit/shared/app/views/layouts/application.html.erb +11 -0
- data/templates/static/suit/shared/db/schema.rb +2 -0
- data/templates/static/suit/shared/db/seeds.rb +7 -0
- data/templates/static/suit/shared/test/fixtures/.gitkeep +0 -0
- data/templates/static/suit/shared/test/integration/suit/example.rb +40 -0
- data/templates/static/suit/shared/test/suit_application/capybara_extensions.rb +36 -0
- data/templates/static/suit/shared/test/suit_application.rb +27 -0
- data/templates/static/suit/shared/test/unit/.gitkeep +0 -0
- data/templates/static/suit/templates/shared/config/initializers/.gitkeep +0 -0
- data/templates/static/suit/templates/shared/db/schema.rb +2 -0
- metadata +188 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
require "gem_suit/cli/application/io_buffer"
|
2
|
+
|
3
|
+
module GemSuit
|
4
|
+
class CLI < Thor
|
5
|
+
module Application
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.send :include, InstanceMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
|
13
|
+
def test_suit(file_or_pattern = nil)
|
14
|
+
assert_suit_dir
|
15
|
+
|
16
|
+
data = IOBuffer.capture do |buffer|
|
17
|
+
(options.rails_versions || major_rails_versions).each do |rails_version|
|
18
|
+
path = "suit/rails-#{rails_version}/dummy/test/integration/suit/"
|
19
|
+
match = Dir[File.join(path, "**", "#{file_or_pattern || "*"}.rb")]
|
20
|
+
match = Dir[File.join(path, file_or_pattern)] if match.empty?
|
21
|
+
|
22
|
+
match.each do |f|
|
23
|
+
buffer.execute "ruby #{f} #{"-v" if options.very_verbose?}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
print_test_results "Suit", data
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_unit(file_or_pattern = nil)
|
32
|
+
assert_suit_dir
|
33
|
+
|
34
|
+
loader = File.expand_path "../application/test_loader.rb", __FILE__
|
35
|
+
|
36
|
+
proc = Proc.new do |buffer, path|
|
37
|
+
buffer.execute "suit restore"
|
38
|
+
|
39
|
+
match = Dir[File.join(path, "**", "#{file_or_pattern || "*"}.rb")]
|
40
|
+
match = Dir[File.join(path, file_or_pattern)] if match.empty?
|
41
|
+
files = match.collect{|x| x.inspect}.join " "
|
42
|
+
|
43
|
+
section = path.match(/suit\/([^\/]*)\//).captures[0].capitalize.gsub "-", " "
|
44
|
+
files_desc = match.size == 1 ?
|
45
|
+
match.first.gsub(path, "") :
|
46
|
+
"#{file_or_pattern.nil? ? "All" : "Multiple"} tests"
|
47
|
+
|
48
|
+
buffer.log "#{section} - #{files_desc}"
|
49
|
+
buffer.execute "ruby #{loader} #{"-I" if match.size > 1}#{files}"
|
50
|
+
buffer.execute "suit restore"
|
51
|
+
end
|
52
|
+
|
53
|
+
data = IOBuffer.capture do |buffer|
|
54
|
+
if options.rails_versions == ["0"]
|
55
|
+
proc.call buffer, "suit/shared/test/unit/"
|
56
|
+
else
|
57
|
+
(options.rails_versions || major_rails_versions).each do |rails_version|
|
58
|
+
proc.call buffer, "suit/rails-#{rails_version}/dummy/test/unit/"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
print_test_results "Unit", data
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def files(action)
|
69
|
+
assert_suit_dir
|
70
|
+
|
71
|
+
log "(in #{File.expand_path("")})"
|
72
|
+
|
73
|
+
require "suit/shared/test/suit_application.rb"
|
74
|
+
application = SuitApplication.new :validate_root_path => false, :verbose => options.verbose?
|
75
|
+
Dir["suit/rails-*/dummy"].each do |rails_root|
|
76
|
+
application.root_path = rails_root
|
77
|
+
application.send :"#{action}_all"
|
78
|
+
end
|
79
|
+
|
80
|
+
log "Done #{action.to_s[0..-2]}ing files".green
|
81
|
+
end
|
82
|
+
|
83
|
+
def rails(command, environment, args = nil)
|
84
|
+
assert_suit_dir
|
85
|
+
|
86
|
+
rails_version = (options.rails_version || major_rails_versions.last).to_i
|
87
|
+
root_path = File.expand_path "suit/rails-#{rails_version}/dummy"
|
88
|
+
command = {2 => "script/#{command}", 3 => "rails #{command.to_s[0, 1]}"}[rails_version]
|
89
|
+
|
90
|
+
require "suit/rails-#{rails_version}/dummy/test/suit_application.rb"
|
91
|
+
SuitApplication.new(:verbose => options.verbose?).bundle_install
|
92
|
+
|
93
|
+
system "cd #{root_path} && RAILS_ENV=#{environment} #{command} #{"-p #{options.port}" if options.port}"
|
94
|
+
end
|
95
|
+
|
96
|
+
MAJOR_RAILS_VERSIONS = [2, 3]
|
97
|
+
DESCRIPTION_MATCH = /^Setting up test environment for (.*)$/
|
98
|
+
LOAD_MATCH = /^Loaded suite suit\/rails-(\d+)\/dummy\/test\/integration\/suit\/(.*)$/
|
99
|
+
GEM_SUIT_MATCH = /^GemSuit: (.*)$/
|
100
|
+
TIME_MATCH = /^Finished in (.*)\.$/
|
101
|
+
SUMMARY_MATCH = /^(\d+) (\w+), (\d+) (\w+), (\d+) (\w+), (\d+) (\w+)$/
|
102
|
+
|
103
|
+
def print_test_results(section, data)
|
104
|
+
return if (suit_tests = extract_test_results(data)).empty?
|
105
|
+
|
106
|
+
failures = suit_tests.inject(0) do |count, test|
|
107
|
+
count += 1 if (test[:failures].to_i + test[:errors].to_i > 0) || test[:time].nil?
|
108
|
+
count
|
109
|
+
end
|
110
|
+
|
111
|
+
log "\n"
|
112
|
+
log "".ljust(100, "=")
|
113
|
+
log "#{section} tests (#{failures} failures in #{data.finish - data.start} seconds)"
|
114
|
+
suit_tests.each do |test|
|
115
|
+
log "" .ljust(100, "-")
|
116
|
+
log " Description".ljust(16 , ".") + ": #{description test}"
|
117
|
+
log " Duration" .ljust(16 , ".") + ": #{test[:time] }"
|
118
|
+
log " Summary" .ljust(16 , ".") + ": #{test[:summary] }"
|
119
|
+
end
|
120
|
+
log "".ljust(100, "=")
|
121
|
+
log "\n"
|
122
|
+
end
|
123
|
+
|
124
|
+
def extract_test_results(data)
|
125
|
+
[{}].tap do |result|
|
126
|
+
data.output.each do |line|
|
127
|
+
if line.match(DESCRIPTION_MATCH) || line.match(GEM_SUIT_MATCH)
|
128
|
+
result.last[:description] = $1
|
129
|
+
end
|
130
|
+
if line.match(LOAD_MATCH)
|
131
|
+
result.last[:load] = "Rails #{$1} - #{camelize $2}"
|
132
|
+
end
|
133
|
+
if line.match(TIME_MATCH)
|
134
|
+
result.last[:time] = $1
|
135
|
+
end
|
136
|
+
if line.match(SUMMARY_MATCH)
|
137
|
+
result.last[:summary ] = line
|
138
|
+
result.last[$2.to_sym] = $1
|
139
|
+
result.last[$4.to_sym] = $3
|
140
|
+
result.last[$6.to_sym] = $5
|
141
|
+
result.last[$8.to_sym] = $7
|
142
|
+
result << {}
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
result.reject!{|x| x.empty?}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def description(test)
|
151
|
+
failed = (test[:failures].to_i + test[:errors].to_i > 0) || test[:tests].nil?
|
152
|
+
((test[:description] unless (test[:description] || "").empty?) || test[:load]).send failed ? :red : :green
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "thor/shell/basic"
|
2
|
+
|
3
|
+
module GemSuit
|
4
|
+
class CLI < Thor
|
5
|
+
module Base
|
6
|
+
module Shell
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.send :include, InstanceMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
|
14
|
+
def shell
|
15
|
+
@shell ||= Thor::Shell::Basic.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def is?(*args)
|
19
|
+
shell.send :is?, *args
|
20
|
+
end
|
21
|
+
|
22
|
+
def agree?(question, default = nil)
|
23
|
+
opts = %w(y n).collect{|x| !default.nil? && x =~ is?(default) ? x.upcase : x}
|
24
|
+
answer = ask question, opts, default
|
25
|
+
!!(answer =~ is?(:yes))
|
26
|
+
end
|
27
|
+
|
28
|
+
def ask(question, opts = nil, default = nil)
|
29
|
+
in_brackets = [opts, default].compact.first
|
30
|
+
statement = [question, ("[#{in_brackets}]" unless in_brackets.nil?)].compact.join " "
|
31
|
+
|
32
|
+
answer = shell.ask statement if options.interactive? || default.nil?
|
33
|
+
answer.nil? || answer.empty? ? default.to_s : answer
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
STDOUT.sync = true
|
2
|
+
|
3
|
+
module GemSuit
|
4
|
+
class CLI < Thor
|
5
|
+
module Base
|
6
|
+
module Utils
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.send :include, InstanceMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
|
14
|
+
def execute(command, force = nil)
|
15
|
+
options.very_verbose? || options.verbose? || force ? system(command) : `#{command}`
|
16
|
+
end
|
17
|
+
|
18
|
+
def log(string, force = false)
|
19
|
+
puts string if options.very_verbose? || options.verbose? || force
|
20
|
+
end
|
21
|
+
|
22
|
+
def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
|
23
|
+
if first_letter_in_uppercase
|
24
|
+
lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
25
|
+
else
|
26
|
+
lower_case_and_underscored_word.to_s[0].chr.downcase + camelize(lower_case_and_underscored_word)[1..-1]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def assert_gem_dir(non_gemsuit = false)
|
33
|
+
if Dir["*.gemspec"].empty?
|
34
|
+
raise Error, "Missing *.gemspec in current directory. Is this really a gem directory?"
|
35
|
+
end
|
36
|
+
if non_gemsuit && !Dir[".suit"].empty?
|
37
|
+
raise Error, "Found .suit in current directory. Is this gem already provided with GemSuit?"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def assert_suit_dir
|
42
|
+
assert_gem_dir
|
43
|
+
if Dir[".suit"].empty?
|
44
|
+
raise Error, "Missing .suit in current directory. Is this really a GemSuit directory?"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def assert_rails_dir
|
49
|
+
unless File.expand_path("").match /suit\/rails-\d\/dummy$/
|
50
|
+
raise Error, "Current directory path does not match \"/suit/rails-{2,3}/dummy\". Is this really a GemSuit dummy app?"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def major_rails_versions
|
55
|
+
Dir["suit/rails-*"].collect{|dir| dir.match(/rails-(\d)/); $1}
|
56
|
+
end
|
57
|
+
|
58
|
+
def gem_name
|
59
|
+
File.basename File.expand_path("")
|
60
|
+
end
|
61
|
+
|
62
|
+
def suit_gem_path
|
63
|
+
File.expand_path "../../../../..", __FILE__
|
64
|
+
end
|
65
|
+
|
66
|
+
def templates_path
|
67
|
+
File.expand_path "templates", suit_gem_path
|
68
|
+
end
|
69
|
+
|
70
|
+
def static_templates_path
|
71
|
+
File.expand_path "static", templates_path
|
72
|
+
end
|
73
|
+
|
74
|
+
def dynamic_templates_path
|
75
|
+
File.expand_path "dynamic", templates_path
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "gem_suit/cli/base/utils"
|
2
|
+
require "gem_suit/cli/base/shell"
|
3
|
+
|
4
|
+
module GemSuit
|
5
|
+
class CLI < Thor
|
6
|
+
module Base
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.send :include, CLI::Base::Utils
|
10
|
+
base.send :include, CLI::Base::Shell
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "thor"
|
3
|
+
require "gem_suit/cli/base"
|
4
|
+
|
5
|
+
module GemSuit
|
6
|
+
class CLI < Thor
|
7
|
+
module Builder
|
8
|
+
|
9
|
+
class Generator < Thor
|
10
|
+
include Thor::Actions
|
11
|
+
include Base
|
12
|
+
|
13
|
+
def initialize(builder)
|
14
|
+
@builder = builder
|
15
|
+
self.class.source_root = dynamic_templates_path
|
16
|
+
self.destination_root = root
|
17
|
+
end
|
18
|
+
|
19
|
+
no_tasks do
|
20
|
+
def run
|
21
|
+
create_symlinks
|
22
|
+
generate
|
23
|
+
stage_files
|
24
|
+
end
|
25
|
+
|
26
|
+
def options
|
27
|
+
@builder.options
|
28
|
+
end
|
29
|
+
|
30
|
+
def suit_config
|
31
|
+
@builder.suit_config
|
32
|
+
end
|
33
|
+
|
34
|
+
def locals
|
35
|
+
@locals ||= {}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
def source_root
|
41
|
+
@source_root
|
42
|
+
end
|
43
|
+
|
44
|
+
def source_root=(path)
|
45
|
+
@source_root = path
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def method_missing(method, *args)
|
52
|
+
if locals.include?(method)
|
53
|
+
locals[method]
|
54
|
+
else
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def root
|
60
|
+
File.expand_path ""
|
61
|
+
end
|
62
|
+
|
63
|
+
def changelog?
|
64
|
+
!Dir["CHANGELOG*"].empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
def mit_licensed?
|
68
|
+
!Dir["MIT-LICENSE*"].empty?
|
69
|
+
end
|
70
|
+
|
71
|
+
def read_me?
|
72
|
+
!Dir["README*"].empty?
|
73
|
+
end
|
74
|
+
|
75
|
+
def create_symlinks
|
76
|
+
rails_root = Dir["suit/rails-*/dummy"].max
|
77
|
+
FileUtils.rm File.expand_path("public/index.html", rails_root)
|
78
|
+
FileUtils.cp_r File.expand_path("public", rails_root), "suit/shared"
|
79
|
+
|
80
|
+
Dir["suit/rails-*/dummy"].each do |rails_root|
|
81
|
+
%w(app/models
|
82
|
+
app/views
|
83
|
+
db/schema.rb
|
84
|
+
db/seeds.rb
|
85
|
+
public
|
86
|
+
test).each do |relative_path|
|
87
|
+
|
88
|
+
path = File.expand_path relative_path, rails_root
|
89
|
+
|
90
|
+
if File.exists? path
|
91
|
+
method = File.directory?(path) ? :rm_rf : :rm
|
92
|
+
FileUtils.send method, path
|
93
|
+
end
|
94
|
+
|
95
|
+
prefix = ([".."] * relative_path.split("/").size).join("/")
|
96
|
+
create_link path, "#{prefix}/../shared/#{relative_path}", :verbose => false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def generate
|
102
|
+
if options.extras?
|
103
|
+
template "CHANGELOG.rdoc", :verbose => false unless changelog?
|
104
|
+
|
105
|
+
unless mit_licensed? || !agree?("Do you want to use a MIT-LICENSE?", :yes)
|
106
|
+
locals[:author] ||= ask "What is your author name?"
|
107
|
+
template "MIT-LICENSE", :verbose => false
|
108
|
+
end
|
109
|
+
|
110
|
+
unless read_me?
|
111
|
+
locals[:twitter] ||= ask "What is your Twitter name?"
|
112
|
+
locals[:email] ||= ask "What is your email address?"
|
113
|
+
locals[:author] ||= ask "What is your author name?"
|
114
|
+
template "README.textile", :verbose => false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
Dir["suit/rails-*/dummy"].each do |rails_root|
|
119
|
+
file = File.expand_path("config/routes.rb", rails_root)
|
120
|
+
routes = File.readlines file
|
121
|
+
routes.each_with_index do |line, index|
|
122
|
+
next unless line.match "to delete public/index.html"
|
123
|
+
routes[index + 1] = routes[index + 1].gsub("# ", "").gsub("welcome", "application")
|
124
|
+
break
|
125
|
+
end
|
126
|
+
File.open file, "w" do |file|
|
127
|
+
file << routes
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
gemspec = File.read "#{gem_name}.gemspec"
|
132
|
+
gemspec.gsub! "TODO: Write your email address", email unless locals[:email ].to_s.empty?
|
133
|
+
gemspec.gsub! "TODO: Write your name" , author unless locals[:author].to_s.empty?
|
134
|
+
File.open "#{gem_name}.gemspec", "w" do |file|
|
135
|
+
file << gemspec
|
136
|
+
end
|
137
|
+
|
138
|
+
template "suit/shared/app/views/application/index.html.erb", :verbose => false
|
139
|
+
template "suit/shared/public/stylesheets/app.css", :force => true, :verbose => false
|
140
|
+
template "suit/shared/test/test_helper.rb", :verbose => false
|
141
|
+
template "suit/templates/shared/Gemfile", :verbose => false
|
142
|
+
template "suit/templates/shared/config/database-#{suit_config[:mysql] ? "mysql" : "sqlite"}.yml", "suit/templates/shared/config/database.yml", :verbose => false
|
143
|
+
end
|
144
|
+
|
145
|
+
def stage_files
|
146
|
+
template "gitignore", ".gitignore", :force => true, :verbose => false
|
147
|
+
execute "git add -A"
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "gem_suit/cli/base"
|
3
|
+
|
4
|
+
module GemSuit
|
5
|
+
class CLI < Thor
|
6
|
+
module Builder
|
7
|
+
|
8
|
+
class RailsApp < Thor
|
9
|
+
include Thor::Actions
|
10
|
+
include Base
|
11
|
+
|
12
|
+
def initialize(version_spec, builder, confirm = true)
|
13
|
+
@version_spec = version_spec
|
14
|
+
@builder = builder
|
15
|
+
self.class.source_root = dynamic_templates_path
|
16
|
+
confirm_version if confirm
|
17
|
+
end
|
18
|
+
|
19
|
+
no_tasks do
|
20
|
+
def install
|
21
|
+
confirm_version
|
22
|
+
generate
|
23
|
+
bundle
|
24
|
+
create_gemfile
|
25
|
+
end
|
26
|
+
|
27
|
+
def options
|
28
|
+
@builder.options
|
29
|
+
end
|
30
|
+
|
31
|
+
def rails_gem_version
|
32
|
+
version
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def source_root
|
38
|
+
@source_root
|
39
|
+
end
|
40
|
+
|
41
|
+
def source_root=(path)
|
42
|
+
@source_root = path
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def expand_version_spec
|
49
|
+
@version_spec == "latest" ? latest : @version_spec
|
50
|
+
end
|
51
|
+
|
52
|
+
def latest
|
53
|
+
[`rails -v`.match(/\d\.\d+\.\d+/).to_s, "3.0.6"].max
|
54
|
+
end
|
55
|
+
|
56
|
+
def target_dir
|
57
|
+
File.expand_path "suit/rails-#{version(:major)}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def rails_root
|
61
|
+
File.expand_path("dummy", target_dir)
|
62
|
+
end
|
63
|
+
|
64
|
+
def generate_cmd
|
65
|
+
"rails #{version(:major) < 3 ? "_#{version}_" : "new"} dummy"
|
66
|
+
end
|
67
|
+
|
68
|
+
def version(segment = nil)
|
69
|
+
return @version if segment.nil?
|
70
|
+
|
71
|
+
segments = @version.match(/(\d+)\.(\d+)\.(\d+)/).captures.collect &:to_i
|
72
|
+
case segment
|
73
|
+
when :major
|
74
|
+
segments[0]
|
75
|
+
when :minor
|
76
|
+
segments[1]
|
77
|
+
when :patch
|
78
|
+
segments[2]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def valid_version?
|
83
|
+
!!version.match(/^\d+\.\d+\.\d+$/)
|
84
|
+
end
|
85
|
+
|
86
|
+
def bundled?
|
87
|
+
!Dir[File.expand_path("Gemfile", destination_root)].empty?
|
88
|
+
end
|
89
|
+
|
90
|
+
def confirm_version
|
91
|
+
return if @confirmed_version
|
92
|
+
|
93
|
+
@version = expand_version_spec
|
94
|
+
answer = ask "Generate Rails #{version(:major)} application? You can specify another version or use 'n' to skip", version, version
|
95
|
+
if answer =~ is?(:no)
|
96
|
+
@version = nil
|
97
|
+
return
|
98
|
+
end
|
99
|
+
@version = answer unless answer.empty?
|
100
|
+
|
101
|
+
self.destination_root = rails_root
|
102
|
+
@confirmed_version = true
|
103
|
+
end
|
104
|
+
|
105
|
+
def generate
|
106
|
+
unless valid_version?
|
107
|
+
log "Cannot generate Rails application with specified version #{version.inspect}".red
|
108
|
+
return
|
109
|
+
end
|
110
|
+
|
111
|
+
if File.exists? target_dir
|
112
|
+
log "Already installed a Rails #{version(:major)} application (skipping #{version})".red, true
|
113
|
+
return
|
114
|
+
end
|
115
|
+
|
116
|
+
unless `gem list rails -i -v #{version}`.strip == "true"
|
117
|
+
log "Installing Rails #{version} (this can take a while)".yellow, true
|
118
|
+
execute "gem install rails -v=#{version}"
|
119
|
+
end
|
120
|
+
|
121
|
+
FileUtils.mkdir target_dir
|
122
|
+
log "Generating Rails #{version(:major)} application"
|
123
|
+
log generate_cmd
|
124
|
+
execute "cd #{target_dir} && #{generate_cmd}"
|
125
|
+
end
|
126
|
+
|
127
|
+
def bundle
|
128
|
+
unless valid_version?
|
129
|
+
log "Cannot bundle Rails application with specified version #{version.inspect}".red
|
130
|
+
return
|
131
|
+
end
|
132
|
+
|
133
|
+
return if bundled?
|
134
|
+
|
135
|
+
insert_into_file "config/boot.rb", File.read(File.expand_path("../boot", __FILE__)), :before => "# All that for this:\n", :verbose => false
|
136
|
+
template "config/preinitializer.rb", :verbose => false
|
137
|
+
end
|
138
|
+
|
139
|
+
def create_gemfile
|
140
|
+
template "Gemfile", :force => true, :verbose => false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|