Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Remove `--builder` option from `rails` command #9401

Merged
merged 1 commit into from

5 participants

@sikachu
Collaborator

Ability to use a custom builder by passing --builder (or -b) has been removed. Consider using application template instead. See this guide for more detail: http://guides.rubyonrails.org/rails_application_templates.html

@sikachu
Collaborator

sure!

@sikachu
Collaborator

PR updated.

@sikachu
Collaborator

whoops, hold on

@rafaelfranca

Missing to remove the methods in my last comment

@sikachu sikachu Remove `--builder` option from `rails` command
Ability to use a custom builder by passing `--builder` (or `-b`) has
been removed. Consider using application template instead. See this
guide for more detail:
http://guides.rubyonrails.org/rails_application_templates.html
2da5ea1
@sikachu
Collaborator

I ended up removed the whole class, since it's now a no-op.

@rafaelfranca rafaelfranca merged commit bce6cbd into from
@sikachu sikachu deleted the branch
@jokklan

Why has this been removed?, i really liked this way to create custom templates. And is there anyway to get some of the same options, like overriding template files or specific builder methods? Fx:

def readme
  template "README.md"
end

instead of

remove_file "README.rdoc"
create_file "README.md", "TODO"

Like it says in the documentation plugin_new_generator.rb line 6-12

# The plugin builder allows you to override elements of the plugin
# generator without being forced to reverse the operations of the default
# generator.
#
# This allows you to override entire operations, like the creation of the
# Gemfile, README, or JavaScript files, without needing to know exactly
# what those operations do so you can create another template action.

The template option doesn't have this feature, as it are applied last, so you have to specifically reverse the operations.

@DamirSvrtan

what @jokklan said +1. @sikachu why is this feature removed? Thnx!

@sikachu
Collaborator

I'll let core team speak on this one (/cc @dhh). I think we didn't see enough usage on this in the real world, so it got removed during the cleanup.

@dhh
Owner

I've never used this, so I'd need some context as to what this is used for to chime in. Can anyone give some real-world examples of how and for what they're using this?

@jokklan

I have two cases where i used it myself: Dummy app for testing (which is generated when generating a new engine, but their does not exists any rake method to create it manually), and custom engines.

RefineryCMS is another good example where they have created a whole new custom generator for engines, instead of using all the methods already available in the internal Rails engine builder (see: engine_generator.rb and extension_generator.rb).

@jokklan

Another solution would be to make it simpler to make a generator with a custom builder that inherits from the existing builders, and add documentation about this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 24, 2013
  1. @sikachu

    Remove `--builder` option from `rails` command

    sikachu authored
    Ability to use a custom builder by passing `--builder` (or `-b`) has
    been removed. Consider using application template instead. See this
    guide for more detail:
    http://guides.rubyonrails.org/rails_application_templates.html
This page is out of date. Refresh to see the latest.
View
7 railties/CHANGELOG.md
@@ -1,4 +1,11 @@
## Rails 4.0.0 (unreleased) ##
+
+* Ability to use a custom builder by passing `--builder` (or `-b`) has been removed. Consider
+ using application template instead. See this guide for more detail:
+ http://guides.rubyonrails.org/rails_application_templates.html
+
+ *Prem Sichanugrist*
+
* fix rake db:* tasks to work with DATABASE_URL and without config/database.yml
*Terence Lee*
View
14 railties/lib/rails/generators/app_base.rb
@@ -19,9 +19,6 @@ class AppBase < Base # :nodoc:
argument :app_path, type: :string
def self.add_shared_options_for(name)
- class_option :builder, type: :string, aliases: '-b',
- desc: "Path to some #{name} builder (can be a filesystem path or URL)"
-
class_option :template, type: :string, aliases: '-m',
desc: "Path to some #{name} template (can be a filesystem path or URL)"
@@ -81,17 +78,6 @@ def initialize(*args)
def builder
@builder ||= begin
- if path = options[:builder]
- if URI(path).is_a?(URI::HTTP)
- contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
- else
- contents = open(File.expand_path(path, @original_wd)) {|io| io.read }
- end
-
- prok = eval("proc { #{contents} }", TOPLEVEL_BINDING, path, 1)
- instance_eval(&prok)
- end
-
builder_class = get_builder_class
builder_class.send(:include, ActionMethods)
builder_class.new(self)
View
2  railties/test/fixtures/lib/app_builders/empty_builder.rb
@@ -1,2 +0,0 @@
-class AppBuilder
-end
View
7 railties/test/fixtures/lib/app_builders/simple_builder.rb
@@ -1,7 +0,0 @@
-class AppBuilder
- def gitignore
- create_file ".gitignore", <<-R.strip
-foobar
- R
- end
-end
View
7 railties/test/fixtures/lib/app_builders/tweak_builder.rb
@@ -1,7 +0,0 @@
-class AppBuilder < Rails::AppBuilder
- def gitignore
- create_file ".gitignore", <<-R.strip
-foobar
- R
- end
-end
View
2  railties/test/fixtures/lib/plugin_builders/empty_builder.rb
@@ -1,2 +0,0 @@
-class PluginBuilder
-end
View
7 railties/test/fixtures/lib/plugin_builders/simple_builder.rb
@@ -1,7 +0,0 @@
-class PluginBuilder
- def gitignore
- create_file ".gitignore", <<-R.strip
-foobar
- R
- end
-end
View
19 railties/test/fixtures/lib/plugin_builders/spec_builder.rb
@@ -1,19 +0,0 @@
-class PluginBuilder < Rails::PluginBuilder
- def test
- create_file "spec/spec_helper.rb"
- append_file "Rakefile", <<-EOF
-# spec tasks in rakefile
-
-task default: :spec
- EOF
- end
-
- def generate_test_dummy
- dummy_path("spec/dummy")
- super
- end
-
- def skip_test_unit?
- true
- end
-end
View
7 railties/test/fixtures/lib/plugin_builders/tweak_builder.rb
@@ -1,7 +0,0 @@
-class PluginBuilder < Rails::PluginBuilder
- def gitignore
- create_file ".gitignore", <<-R.strip
-foobar
- R
- end
-end
View
25 railties/test/generators/app_generator_test.rb
@@ -366,28 +366,3 @@ def assert_gem(gem)
assert_file "Gemfile", /^gem\s+["']#{gem}["']$/
end
end
-
-class CustomAppGeneratorTest < Rails::Generators::TestCase
- include GeneratorsTestHelper
- tests Rails::Generators::AppGenerator
-
- arguments [destination_root]
- include SharedCustomGeneratorTests
-
-protected
- def default_files
- ::DEFAULT_APP_FILES
- end
-
- def builders_dir
- "app_builders"
- end
-
- def builder_class
- :AppBuilder
- end
-
- def action(*args, &block)
- silence(:stdout) { generator.send(*args, &block) }
- end
-end
View
35 railties/test/generators/plugin_new_generator_test.rb
@@ -371,38 +371,3 @@ def default_files
::DEFAULT_PLUGIN_FILES
end
end
-
-class CustomPluginGeneratorTest < Rails::Generators::TestCase
- include GeneratorsTestHelper
- tests Rails::Generators::PluginNewGenerator
-
- destination File.join(Rails.root, "tmp/bukkits")
- arguments [destination_root]
- include SharedCustomGeneratorTests
-
- def test_overriding_test_framework
- FileUtils.cd(destination_root)
- run_generator([destination_root, "-b", "#{Rails.root}/lib/plugin_builders/spec_builder.rb"])
- assert_file 'spec/spec_helper.rb'
- assert_file 'spec/dummy'
- assert_file 'Rakefile', /task default: :spec/
- assert_file 'Rakefile', /# spec tasks in rakefile/
- end
-
-protected
- def default_files
- ::DEFAULT_PLUGIN_FILES
- end
-
- def builder_class
- :PluginBuilder
- end
-
- def builders_dir
- "plugin_builders"
- end
-
- def action(*args, &block)
- silence(:stdout){ generator.send(*args, &block) }
- end
-end
View
58 railties/test/generators/shared_generator_tests.rb
@@ -140,61 +140,3 @@ def test_skip_keeps
assert_no_file('app/mailers/.keep')
end
end
-
-module SharedCustomGeneratorTests
- def setup
- Rails.application = TestApp::Application
- super
- Rails::Generators::AppGenerator.instance_variable_set('@desc', nil)
- end
-
- def teardown
- super
- Rails::Generators::AppGenerator.instance_variable_set('@desc', nil)
- Object.class_eval do
- remove_const :AppBuilder if const_defined?(:AppBuilder)
- remove_const :PluginBuilder if const_defined?(:PluginBuilder)
- end
- Rails.application = TestApp::Application.instance
- end
-
- def test_builder_option_with_empty_app_builder
- FileUtils.cd(destination_root)
- run_generator([destination_root, "-b", "#{Rails.root}/lib/#{builders_dir}/empty_builder.rb"])
- default_files.each{ |path| assert_no_file path }
- end
-
- def test_builder_option_with_simple_plugin_builder
- FileUtils.cd(destination_root)
- run_generator([destination_root, "-b", "#{Rails.root}/lib/#{builders_dir}/simple_builder.rb"])
- (default_files - ['.gitignore']).each{ |path| assert_no_file path }
- assert_file ".gitignore", "foobar"
- end
-
- def test_builder_option_with_relative_path
- here = File.expand_path(File.dirname(__FILE__))
- FileUtils.cd(here)
- run_generator([destination_root, "-b", "../fixtures/lib/#{builders_dir}/simple_builder.rb"])
- FileUtils.cd(destination_root)
- (default_files - ['.gitignore']).each{ |path| assert_no_file path }
- assert_file ".gitignore", "foobar"
- end
-
- def test_builder_option_with_tweak_plugin_builder
- FileUtils.cd(destination_root)
- run_generator([destination_root, "-b", "#{Rails.root}/lib/#{builders_dir}/tweak_builder.rb"])
- default_files.each{ |path| assert_file path }
- assert_file ".gitignore", "foobar"
- end
-
- def test_builder_option_with_http
- url = "https://gist.github.com/josevalim/103208/raw/"
- template = "class #{builder_class}; end"
- template.instance_eval "def read; self; end" # Make the string respond to read
-
- generator([destination_root], builder: url).expects(:open).with(url, 'Accept' => 'application/x-thor-template').returns(template)
- quietly { generator.invoke_all }
-
- default_files.each{ |path| assert_no_file(path) }
- end
-end
Something went wrong with that request. Please try again.