railties 4.1.16 → 4.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +80 -439
- data/RDOC_MAIN.rdoc +1 -1
- data/README.rdoc +6 -2
- data/lib/rails.rb +7 -1
- data/lib/rails/all.rb +1 -0
- data/lib/rails/api/task.rb +7 -0
- data/lib/rails/app_rails_loader.rb +4 -2
- data/lib/rails/application.rb +74 -47
- data/lib/rails/application/configuration.rb +23 -1
- data/lib/rails/application/finisher.rb +0 -2
- data/lib/rails/code_statistics.rb +4 -2
- data/lib/rails/commands/commands_tasks.rb +1 -6
- data/lib/rails/commands/console.rb +24 -12
- data/lib/rails/commands/dbconsole.rb +2 -2
- data/lib/rails/commands/plugin.rb +1 -1
- data/lib/rails/commands/server.rb +22 -9
- data/lib/rails/engine.rb +7 -7
- data/lib/rails/gem_version.rb +3 -3
- data/lib/rails/generators.rb +68 -15
- data/lib/rails/generators/actions.rb +27 -7
- data/lib/rails/generators/actions/create_migration.rb +2 -1
- data/lib/rails/generators/app_base.rb +55 -65
- data/lib/rails/generators/base.rb +2 -2
- data/lib/rails/generators/erb/scaffold/templates/_form.html.erb +0 -5
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb +1 -1
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb +3 -1
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb +1 -1
- data/lib/rails/generators/generated_attribute.rb +24 -4
- data/lib/rails/generators/model_helpers.rb +28 -0
- data/lib/rails/generators/rails/app/app_generator.rb +8 -2
- data/lib/rails/generators/rails/app/templates/Gemfile +21 -6
- data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +1 -1
- data/lib/rails/generators/rails/app/templates/bin/setup +28 -0
- data/lib/rails/generators/rails/app/templates/config/application.rb +5 -1
- data/lib/rails/generators/rails/app/templates/config/boot.rb +1 -2
- data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml +1 -3
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml +1 -1
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +8 -10
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -0
- data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb +1 -1
- data/lib/rails/generators/rails/app/templates/gitignore +2 -0
- data/lib/rails/generators/rails/controller/USAGE +0 -1
- data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
- data/lib/rails/generators/rails/helper/USAGE +0 -4
- data/lib/rails/generators/rails/model/USAGE +11 -1
- data/lib/rails/generators/rails/model/model_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +1 -3
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec +1 -1
- data/lib/rails/generators/rails/plugin/templates/Gemfile +10 -6
- data/lib/rails/generators/rails/plugin/templates/Rakefile +4 -0
- data/lib/rails/generators/rails/plugin/templates/app/controllers/%name%/application_controller.rb.tt +0 -1
- data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js +1 -1
- data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb +2 -10
- data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -4
- data/lib/rails/generators/rails/scaffold/USAGE +7 -1
- data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +0 -1
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb +1 -1
- data/lib/rails/generators/resource_helpers.rb +2 -11
- data/lib/rails/generators/test_unit/helper/helper_generator.rb +1 -5
- data/lib/rails/generators/testing/behaviour.rb +17 -0
- data/lib/rails/info.rb +1 -1
- data/lib/rails/info_controller.rb +1 -1
- data/lib/rails/mailers_controller.rb +14 -16
- data/lib/rails/paths.rb +1 -1
- data/lib/rails/rack.rb +1 -1
- data/lib/rails/rack/log_tailer.rb +4 -0
- data/lib/rails/rack/logger.rb +1 -1
- data/lib/rails/railtie.rb +2 -2
- data/lib/rails/ruby_version_check.rb +1 -1
- data/lib/rails/source_annotation_extractor.rb +23 -16
- data/lib/rails/tasks/framework.rake +1 -1
- data/lib/rails/tasks/statistics.rake +8 -3
- data/lib/rails/templates/rails/mailers/email.html.erb +2 -13
- data/lib/rails/templates/rails/mailers/index.html.erb +2 -2
- data/lib/rails/templates/rails/mailers/mailer.html.erb +1 -1
- data/lib/rails/test_unit/sub_test_task.rb +2 -2
- metadata +13 -13
- data/lib/rails/generators/test_unit/helper/templates/helper_test.rb +0 -6
- data/lib/rails/rubyprof_ext.rb +0 -35
@@ -5,13 +5,9 @@ Description:
|
|
5
5
|
To create a helper within a module, specify the helper name as a
|
6
6
|
path like 'parent_module/helper_name'.
|
7
7
|
|
8
|
-
This generates a helper class in app/helpers and invokes the configured
|
9
|
-
test framework.
|
10
|
-
|
11
8
|
Example:
|
12
9
|
`rails generate helper CreditCard`
|
13
10
|
|
14
11
|
Credit card helper.
|
15
12
|
Helper: app/helpers/credit_card_helper.rb
|
16
|
-
Test: test/helpers/credit_card_helper_test.rb
|
17
13
|
|
@@ -6,6 +6,11 @@ Description:
|
|
6
6
|
model's attributes. Timestamps are added by default, so you don't have to
|
7
7
|
specify them by hand as 'created_at:datetime updated_at:datetime'.
|
8
8
|
|
9
|
+
As a special case, specifying 'password:digest' will generate a
|
10
|
+
password_digest field of string type, and configure your generated model and
|
11
|
+
tests for use with ActiveModel has_secure_password (assuming the default ORM
|
12
|
+
and test framework are being used).
|
13
|
+
|
9
14
|
You don't have to think up every attribute up front, but it helps to
|
10
15
|
sketch out a few so you can start working with the model immediately.
|
11
16
|
|
@@ -27,7 +32,8 @@ Available field types:
|
|
27
32
|
`rails generate model post title:string body:text`
|
28
33
|
|
29
34
|
will generate a title column with a varchar type and a body column with a text
|
30
|
-
type.
|
35
|
+
type. If no type is specified the string type will be used by default.
|
36
|
+
You can use the following types:
|
31
37
|
|
32
38
|
integer
|
33
39
|
primary_key
|
@@ -73,6 +79,10 @@ Available field types:
|
|
73
79
|
`rails generate model user username:string{30}:uniq`
|
74
80
|
`rails generate model product supplier:references{polymorphic}:index`
|
75
81
|
|
82
|
+
If you require a `password_digest` string column for use with
|
83
|
+
has_secure_password, you should specify `password:digest`:
|
84
|
+
|
85
|
+
`rails generate model user password:digest`
|
76
86
|
|
77
87
|
Examples:
|
78
88
|
`rails generate model account`
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'rails/generators/model_helpers'
|
2
|
+
|
1
3
|
module Rails
|
2
4
|
module Generators
|
3
5
|
class ModelGenerator < NamedBase # :nodoc:
|
6
|
+
include Rails::Generators::ModelHelpers
|
7
|
+
|
4
8
|
argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
|
5
9
|
hook_for :orm, required: true
|
6
10
|
end
|
@@ -241,7 +241,7 @@ task default: :test
|
|
241
241
|
build(:leftovers)
|
242
242
|
end
|
243
243
|
|
244
|
-
public_task :apply_rails_template
|
244
|
+
public_task :apply_rails_template, :run_bundle
|
245
245
|
|
246
246
|
def name
|
247
247
|
@name ||= begin
|
@@ -315,7 +315,6 @@ task default: :test
|
|
315
315
|
else
|
316
316
|
@author = `git config user.name`.chomp rescue default
|
317
317
|
end
|
318
|
-
@author
|
319
318
|
end
|
320
319
|
|
321
320
|
def email
|
@@ -325,7 +324,6 @@ task default: :test
|
|
325
324
|
else
|
326
325
|
@email = `git config user.email`.chomp rescue default
|
327
326
|
end
|
328
|
-
@email
|
329
327
|
end
|
330
328
|
|
331
329
|
def valid_const?
|
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
<%= '# ' if options.dev? || options.edge? -%>s.add_dependency "rails", "~> <%= Rails::VERSION::STRING %>"
|
23
23
|
<% unless options[:skip_active_record] -%>
|
24
24
|
|
25
|
-
s.add_development_dependency "<%= gem_for_database
|
25
|
+
s.add_development_dependency "<%= gem_for_database %>"
|
26
26
|
<% end -%>
|
27
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
<% if options[:skip_gemspec] -%>
|
4
|
-
<%= '# ' if options.dev? || options.edge? -%>gem
|
4
|
+
<%= '# ' if options.dev? || options.edge? -%>gem 'rails', '~> <%= Rails::VERSION::STRING %>'
|
5
5
|
<% else -%>
|
6
6
|
# Declare your gem's dependencies in <%= name %>.gemspec.
|
7
7
|
# Bundler will treat runtime dependencies like base dependencies, and
|
@@ -11,7 +11,7 @@ gemspec
|
|
11
11
|
|
12
12
|
<% if options[:skip_gemspec] -%>
|
13
13
|
group :development do
|
14
|
-
gem
|
14
|
+
gem '<%= gem_for_database %>'
|
15
15
|
end
|
16
16
|
<% else -%>
|
17
17
|
# Declare any dependencies that are still in development here instead of in
|
@@ -31,13 +31,17 @@ end
|
|
31
31
|
<% end -%>
|
32
32
|
<%= gem.commented_out ? '# ' : '' %>gem '<%= gem.name %>'<%= %(, '#{gem.version}') if gem.version -%>
|
33
33
|
<% if gem.options.any? -%>
|
34
|
-
|
34
|
+
, <%= gem.options.map { |k,v|
|
35
35
|
"#{k}: #{v.inspect}" }.join(', ') %>
|
36
36
|
<% end -%>
|
37
37
|
<% end -%>
|
38
38
|
|
39
39
|
<% end -%>
|
40
40
|
<% unless defined?(JRUBY_VERSION) -%>
|
41
|
-
# To use debugger
|
42
|
-
|
41
|
+
# To use a debugger
|
42
|
+
<%- if RUBY_VERSION < '2.0.0' -%>
|
43
|
+
# gem 'debugger', group: [:development, :test]
|
44
|
+
<%- else -%>
|
45
|
+
# gem 'byebug', group: [:development, :test]
|
46
|
+
<%- end -%>
|
43
47
|
<% end -%>
|
@@ -19,6 +19,10 @@ APP_RAKEFILE = File.expand_path("../<%= dummy_path -%>/Rakefile", __FILE__)
|
|
19
19
|
load 'rails/tasks/engine.rake'
|
20
20
|
<% end %>
|
21
21
|
|
22
|
+
<% if engine? -%>
|
23
|
+
load 'rails/tasks/statistics.rake'
|
24
|
+
<% end %>
|
25
|
+
|
22
26
|
<% unless options[:skip_gemspec] -%>
|
23
27
|
|
24
28
|
Bundler::GemHelper.install_tasks
|
@@ -7,7 +7,7 @@
|
|
7
7
|
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
8
|
// compiled file.
|
9
9
|
//
|
10
|
-
// Read Sprockets README (https://github.com/
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
11
|
// about supported directives.
|
12
12
|
//
|
13
13
|
//= require_tree .
|
@@ -1,18 +1,10 @@
|
|
1
1
|
# Configure Rails Environment
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
|
4
|
-
require File.expand_path("
|
5
|
-
<% unless options[:skip_active_record] -%>
|
6
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../<%= options[:dummy_path] -%>/db/migrate", __FILE__)]
|
7
|
-
<% if options[:mountable] -%>
|
8
|
-
ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
|
9
|
-
<% end -%>
|
10
|
-
<% end -%>
|
4
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
11
5
|
require "rails/test_help"
|
12
6
|
|
13
|
-
|
14
|
-
# to be shown.
|
15
|
-
Minitest.backtrace_filter = Minitest::BacktraceFilter.new
|
7
|
+
Rails.backtrace_cleaner.remove_silencers!
|
16
8
|
|
17
9
|
# Load support files
|
18
10
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
@@ -29,10 +29,8 @@ module Rails
|
|
29
29
|
write("end", route_length - index)
|
30
30
|
end
|
31
31
|
|
32
|
-
# route prepends two spaces onto the front of the string that is passed, this corrects that
|
33
|
-
|
34
|
-
# we need to correct that too.
|
35
|
-
route route_string[2..-2]
|
32
|
+
# route prepends two spaces onto the front of the string that is passed, this corrects that
|
33
|
+
route route_string[2..-1]
|
36
34
|
end
|
37
35
|
|
38
36
|
private
|
@@ -9,11 +9,16 @@ Description:
|
|
9
9
|
|
10
10
|
Attributes are field arguments specifying the model's attributes. You can
|
11
11
|
optionally pass the type and an index to each field. For instance:
|
12
|
-
|
12
|
+
'title body:text tracking_id:integer:uniq' will generate a title field of
|
13
13
|
string type, a body with text type and a tracking_id as an integer with an
|
14
14
|
unique index. "index" could also be given instead of "uniq" if one desires
|
15
15
|
a non unique index.
|
16
16
|
|
17
|
+
As a special case, specifying 'password:digest' will generate a
|
18
|
+
password_digest field of string type, and configure your generated model,
|
19
|
+
controller, views, and test suite for use with ActiveModel
|
20
|
+
has_secure_password (assuming they are using Rails defaults).
|
21
|
+
|
17
22
|
Timestamps are added by default, so you don't have to specify them by hand
|
18
23
|
as 'created_at:datetime updated_at:datetime'.
|
19
24
|
|
@@ -33,3 +38,4 @@ Examples:
|
|
33
38
|
`rails generate scaffold post`
|
34
39
|
`rails generate scaffold post title body:text published:boolean`
|
35
40
|
`rails generate scaffold purchase amount:decimal tracking_id:integer:uniq`
|
41
|
+
`rails generate scaffold user email:uniq password:digest`
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'rails/generators/active_model'
|
2
|
+
require 'rails/generators/model_helpers'
|
2
3
|
|
3
4
|
module Rails
|
4
5
|
module Generators
|
5
6
|
# Deal with controller names on scaffold and add some helpers to deal with
|
6
7
|
# ActiveModel.
|
7
8
|
module ResourceHelpers # :nodoc:
|
8
|
-
mattr_accessor :skip_warn
|
9
9
|
|
10
10
|
def self.included(base) #:nodoc:
|
11
|
-
base.
|
11
|
+
base.send :include, Rails::Generators::ModelHelpers
|
12
12
|
base.class_option :model_name, type: :string, desc: "ModelName to be used"
|
13
13
|
end
|
14
14
|
|
@@ -21,15 +21,6 @@ module Rails
|
|
21
21
|
assign_names!(self.name)
|
22
22
|
end
|
23
23
|
|
24
|
-
if name == name.pluralize && name.singularize != name.pluralize && !options[:force_plural]
|
25
|
-
unless ResourceHelpers.skip_warn
|
26
|
-
say "Plural version of the model detected, using singularized version. Override with --force-plural."
|
27
|
-
ResourceHelpers.skip_warn = true
|
28
|
-
end
|
29
|
-
name.replace name.singularize
|
30
|
-
assign_names!(name)
|
31
|
-
end
|
32
|
-
|
33
24
|
assign_controller_names!(controller_name.pluralize)
|
34
25
|
end
|
35
26
|
|
@@ -3,11 +3,7 @@ require 'rails/generators/test_unit'
|
|
3
3
|
module TestUnit # :nodoc:
|
4
4
|
module Generators # :nodoc:
|
5
5
|
class HelperGenerator < Base # :nodoc:
|
6
|
-
|
7
|
-
|
8
|
-
def create_helper_files
|
9
|
-
template 'helper_test.rb', File.join('test/helpers', class_path, "#{file_name}_helper_test.rb")
|
10
|
-
end
|
6
|
+
# Rails does not generate anything here.
|
11
7
|
end
|
12
8
|
end
|
13
9
|
end
|
@@ -100,6 +100,23 @@ module Rails
|
|
100
100
|
dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
|
101
101
|
Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
|
102
102
|
end
|
103
|
+
|
104
|
+
def capture(stream)
|
105
|
+
stream = stream.to_s
|
106
|
+
captured_stream = Tempfile.new(stream)
|
107
|
+
stream_io = eval("$#{stream}")
|
108
|
+
origin_stream = stream_io.dup
|
109
|
+
stream_io.reopen(captured_stream)
|
110
|
+
|
111
|
+
yield
|
112
|
+
|
113
|
+
stream_io.rewind
|
114
|
+
return captured_stream.read
|
115
|
+
ensure
|
116
|
+
captured_stream.close
|
117
|
+
captured_stream.unlink
|
118
|
+
stream_io.reopen(origin_stream)
|
119
|
+
end
|
103
120
|
end
|
104
121
|
end
|
105
122
|
end
|
data/lib/rails/info.rb
CHANGED
@@ -5,7 +5,7 @@ class Rails::InfoController < Rails::ApplicationController # :nodoc:
|
|
5
5
|
prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
|
6
6
|
layout -> { request.xhr? ? false : 'application' }
|
7
7
|
|
8
|
-
|
8
|
+
before_action :require_local!
|
9
9
|
|
10
10
|
def index
|
11
11
|
redirect_to action: :routes
|
@@ -3,8 +3,8 @@ require 'rails/application_controller'
|
|
3
3
|
class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
4
4
|
prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
before_action :require_local!
|
7
|
+
before_action :find_preview, only: :preview
|
8
8
|
|
9
9
|
def index
|
10
10
|
@previews = ActionMailer::Preview.all
|
@@ -16,10 +16,10 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
16
16
|
@page_title = "Mailer Previews for #{@preview.preview_name}"
|
17
17
|
render action: 'mailer'
|
18
18
|
else
|
19
|
-
|
19
|
+
email = File.basename(params[:path])
|
20
20
|
|
21
|
-
if @preview.email_exists?(
|
22
|
-
@email = @preview.call(
|
21
|
+
if @preview.email_exists?(email)
|
22
|
+
@email = @preview.call(email)
|
23
23
|
|
24
24
|
if params[:part]
|
25
25
|
part_type = Mime::Type.lookup(params[:part])
|
@@ -28,14 +28,14 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
28
28
|
response.content_type = part_type
|
29
29
|
render text: part.respond_to?(:decoded) ? part.decoded : part
|
30
30
|
else
|
31
|
-
raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{
|
31
|
+
raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{email}"
|
32
32
|
end
|
33
33
|
else
|
34
34
|
@part = find_preferred_part(request.format, Mime::HTML, Mime::TEXT)
|
35
35
|
render action: 'email', layout: false, formats: %w[html]
|
36
36
|
end
|
37
37
|
else
|
38
|
-
raise AbstractController::ActionNotFound, "Email '#{
|
38
|
+
raise AbstractController::ActionNotFound, "Email '#{email}' not found in #{@preview.name}"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -54,22 +54,20 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def find_preferred_part(*formats)
|
57
|
-
|
58
|
-
|
59
|
-
return
|
57
|
+
if @email.multipart?
|
58
|
+
formats.each do |format|
|
59
|
+
return find_part(format) if @email.parts.any?{ |p| p.mime_type == format }
|
60
60
|
end
|
61
|
-
|
62
|
-
|
63
|
-
if formats.any?{ |f| @email.mime_type == f }
|
61
|
+
else
|
64
62
|
@email
|
65
63
|
end
|
66
64
|
end
|
67
65
|
|
68
66
|
def find_part(format)
|
69
|
-
if
|
70
|
-
|
67
|
+
if @email.multipart?
|
68
|
+
@email.parts.find{ |p| p.mime_type == format }
|
71
69
|
elsif @email.mime_type == format
|
72
70
|
@email
|
73
71
|
end
|
74
72
|
end
|
75
|
-
end
|
73
|
+
end
|
data/lib/rails/paths.rb
CHANGED
@@ -101,7 +101,7 @@ module Rails
|
|
101
101
|
def filter_by(&block)
|
102
102
|
all_paths.find_all(&block).flat_map { |path|
|
103
103
|
paths = path.existent
|
104
|
-
paths - path.children.
|
104
|
+
paths - path.children.flat_map { |p| yield(p) ? [] : p.existent }
|
105
105
|
}.uniq
|
106
106
|
end
|
107
107
|
end
|
data/lib/rails/rack.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
1
3
|
module Rails
|
2
4
|
module Rack
|
3
5
|
class LogTailer
|
4
6
|
def initialize(app, log = nil)
|
7
|
+
ActiveSupport::Deprecation.warn "LogTailer is deprecated and will be removed on Rails 5"
|
8
|
+
|
5
9
|
@app = app
|
6
10
|
|
7
11
|
path = Pathname.new(log || "#{::File.expand_path(Rails.root)}/log/#{Rails.env}.log").cleanpath
|
data/lib/rails/rack/logger.rb
CHANGED
@@ -34,7 +34,7 @@ module Rails
|
|
34
34
|
|
35
35
|
instrumenter = ActiveSupport::Notifications.instrumenter
|
36
36
|
instrumenter.start 'request.action_dispatch', request: request
|
37
|
-
logger.info started_request_message(request)
|
37
|
+
logger.info { started_request_message(request) }
|
38
38
|
resp = @app.call(env)
|
39
39
|
resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
|
40
40
|
resp
|