aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-01-08 15:06:53 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2014-01-08 15:07:15 -0800
commit2875b4a66e38e4333da887a4afbed33358999298 (patch)
tree30cebea95c700033b10e469ba898e8721b3cf9f8 /railties
parente4e750ba1a82c88aed492329c3e024efa07c43d0 (diff)
downloadrails-2875b4a66e38e4333da887a4afbed33358999298.tar.gz
rails-2875b4a66e38e4333da887a4afbed33358999298.tar.bz2
rails-2875b4a66e38e4333da887a4afbed33358999298.zip
add a more restricted codepath for templates fixes #13390
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/rails/generators/app_base.rb34
-rw-r--r--railties/test/generators/app_generator_test.rb29
2 files changed, 51 insertions, 12 deletions
diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb
index 3305a57b62..4988602aea 100644
--- a/railties/lib/rails/generators/app_base.rb
+++ b/railties/lib/rails/generators/app_base.rb
@@ -14,6 +14,7 @@ module Rails
DATABASES.concat(JDBC_DATABASES)
attr_accessor :rails_template
+ attr_accessor :app_template
add_shebang_option!
argument :app_path, type: :string
@@ -26,6 +27,9 @@ module Rails
class_option :template, type: :string, aliases: '-m',
desc: "Path to some #{name} template (can be a filesystem path or URL)"
+ class_option :app_template, type: :string, aliases: '-n',
+ desc: "Path to some #{name} template (can be a filesystem path or URL)"
+
class_option :skip_gemfile, type: :boolean, default: false,
desc: "Don't create a Gemfile"
@@ -122,6 +126,10 @@ module Rails
}.curry[@gem_filter]
end
+ def remove_gem(name)
+ add_gem_entry_filter { |gem| gem.name != name }
+ end
+
def builder
@builder ||= begin
builder_class = get_builder_class
@@ -162,6 +170,10 @@ module Rails
@target.send :add_gem_entry_filter, *args, &block
end
+ def remove_gem(*args, &block)
+ @target.send :remove_gem, *args, &block
+ end
+
def method_missing(name, *args, &block)
@commands << [name, args, block]
end
@@ -180,7 +192,8 @@ module Rails
def apply_rails_template
@recorder = TemplateRecorder.new self
- apply(rails_template, target: @recorder) if rails_template
+ apply(rails_template, target: self) if rails_template
+ apply(app_template, target: @recorder) if app_template
rescue Thor::Error, LoadError, Errno::ENOENT => e
raise Error, "The template [#{rails_template}] could not be loaded. Error: #{e}"
end
@@ -210,13 +223,18 @@ module Rails
def set_default_accessors!
self.destination_root = File.expand_path(app_path, destination_root)
- self.rails_template = case options[:template]
- when /^https?:\/\//
- options[:template]
- when String
- File.expand_path(options[:template], Dir.pwd)
- else
- options[:template]
+ self.rails_template = expand_template options[:template]
+ self.app_template = expand_template options[:app_template]
+ end
+
+ def expand_template(name)
+ case name
+ when /^https?:\/\//
+ name
+ when String
+ File.expand_path(name, Dir.pwd)
+ else
+ name
end
end
diff --git a/railties/test/generators/app_generator_test.rb b/railties/test/generators/app_generator_test.rb
index 195f13bdc3..be109cc598 100644
--- a/railties/test/generators/app_generator_test.rb
+++ b/railties/test/generators/app_generator_test.rb
@@ -163,12 +163,21 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
end
+ def test_arbitrary_code
+ output = Tempfile.open('my_template') do |template|
+ template.puts 'puts "You are using Rails version #{Rails::VERSION::STRING}."'
+ template.close
+ run_generator([destination_root, "-m", template.path])
+ end
+ assert_match 'You are using', output
+ end
+
def test_add_gemfile_entry
Tempfile.open('my_template') do |template|
template.puts 'gemfile_entry "tenderlove"'
template.flush
template.close
- run_generator([destination_root, "-m", template.path])
+ run_generator([destination_root, "-n", template.path])
assert_file "Gemfile", /tenderlove/
end
end
@@ -176,9 +185,21 @@ class AppGeneratorTest < Rails::Generators::TestCase
def test_add_skip_entry
Tempfile.open 'my_template' do |template|
template.puts 'add_gem_entry_filter { |gem| gem.name != "jbuilder" }'
- template.flush
+ template.close
- run_generator([destination_root, "-m", template.path])
+ run_generator([destination_root, "-n", template.path])
+ assert_file "Gemfile" do |contents|
+ assert_no_match 'jbuilder', contents
+ end
+ end
+ end
+
+ def test_remove_gem
+ Tempfile.open 'my_template' do |template|
+ template.puts 'remove_gem "jbuilder"'
+ template.close
+
+ run_generator([destination_root, "-n", template.path])
assert_file "Gemfile" do |contents|
assert_no_match 'jbuilder', contents
end
@@ -190,7 +211,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
template.puts 'add_gem_entry_filter { |gem| gem.name != "turbolinks" }'
template.flush
- run_generator([destination_root, "-m", template.path])
+ run_generator([destination_root, "-n", template.path])
assert_file "Gemfile" do |contents|
assert_no_match 'turbolinks', contents
end