Skip to content

Added Support for App Names with Dots in Them #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

HandyAndyShortStack
Copy link

I encountered a bug when using this gem to upgrade some legacy rails 2 applications. When the name of the root directory for these apps included dots, the application name generated by the routes upgrader and configuration generator were inconsistent with the way rails 3 handles such root directory names. Specifically, the part of the directory name following the last dot was used. Here is an example using rails 2:

$ rails app.name.with.dots.in.it
      create  
...

$ cd app.name.with.dots.in.it/


$ script/plugin install git://github.com/rails/rails_upgrade.git
Initialized empty Git repository in
...

$ rake rails:upgrade:routes
It::Application.routes.draw do
match '/:controller(/:action(/:id))'
end

$ rake rails:upgrade:configuration

Put this in config/application.rb

require File.expand_path('../boot', FILE)

require 'rails/all'

Bundler.require(:default, Rails.env) if defined?(Bundler)

module It
class Application < Rails::Application
config.autoload_paths += [config.root.join('lib')]
config.encoding = 'utf-8'
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.

# Add additional load paths for your own custom dirs
# config.autoload_paths += %W( #{RAILS_ROOT}/extras )

# Specify gems that this application depends on and have them installed with rake gems:install
# config.gem "bj"
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
# config.gem "sqlite3-ruby", :lib => "sqlite3"
# config.gem "aws-s3", :lib => "aws/s3"

# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]

# Skip frameworks you're not going to use. To use Rails without a database,
# you must remove the Active Record framework.
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

# Activate observers that should always be running
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names.
config.time_zone = 'UTC'

# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
# config.i18n.default_locale = :de

end
end

Notice that the new routes file contains the line

It::Application.routes.draw do

and the code for config/application.rb includes the line

module It

Had the application been generated in rails 3 using rails new app.name.with.dots.in.it, those lines would read

AppNameWithDotsInIt::Application.routes.draw do

and

module AppNameWithDotsInIt

respectively.

Rails 3 seems to use the method Rails::Generators::AppGenerator.app_const_base to 'classify' the app name. Here is the code, retrieved from http://api.rubyonrails.org/classes/Rails/Generators/AppGenerator.html#method-i-app_const_base

# File railties/lib/rails/generators/rails/app/app_generator.rb, line 261
def app_const_base
  @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, '_').squeeze('_').camelize
end

by replacing the .classify and .underscore.classify in the places where rails_upgrade generates this app_const_base string with .gsub(/\W/, '_').squeeze('_').camelize, we can better emulate a new rails 3 app. Here are the results using my fork:

$ cd ..

$ rm -r app.name.with.dots.in.it


$ rails app.name.with.dots.in.it
create
...

$ cd app.name.with.dots.in.it/

$ script/plugin install https://github.com/HandyAndyShortStack/rails_upgrade.git
Initialized empty Git repository in
...

$ rake rails:upgrade:routes
AppNameWithDotsInIt::Application.routes.draw do
match '/:controller(/:action(/:id))'
end

$ rake rails:upgrade:configuration

Put this in config/application.rb

require File.expand_path('../boot', FILE)

require 'rails/all'

Bundler.require(:default, Rails.env) if defined?(Bundler)

module AppNameWithDotsInIt
class Application < Rails::Application
config.autoload_paths += [config.root.join('lib')]
config.encoding = 'utf-8'
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.

# Add additional load paths for your own custom dirs
# config.autoload_paths += %W( #{RAILS_ROOT}/extras )

# Specify gems that this application depends on and have them installed with rake gems:install
# config.gem "bj"
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
# config.gem "sqlite3-ruby", :lib => "sqlite3"
# config.gem "aws-s3", :lib => "aws/s3"

# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]

# Skip frameworks you're not going to use. To use Rails without a database,
# you must remove the Active Record framework.
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]

# Activate observers that should always be running
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names.
config.time_zone = 'UTC'

# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
# config.i18n.default_locale = :de

end
end

Thank you so much for making this plugin! It has helped me out immensely. I hope this pull request will help prevent headaches for future developers if you accept it.
-Andy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant