railties 4.0.0.beta1 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -27
  3. data/RDOC_MAIN.rdoc +73 -0
  4. data/bin/rails +3 -1
  5. data/lib/rails/api/task.rb +158 -0
  6. data/lib/rails/app_rails_loader.rb +44 -20
  7. data/lib/rails/application.rb +55 -32
  8. data/lib/rails/application/configuration.rb +9 -7
  9. data/lib/rails/commands.rb +2 -0
  10. data/lib/rails/commands/console.rb +3 -1
  11. data/lib/rails/commands/server.rb +6 -2
  12. data/lib/rails/engine.rb +4 -3
  13. data/lib/rails/generators/actions.rb +1 -1
  14. data/lib/rails/generators/app_base.rb +52 -30
  15. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb +10 -1
  16. data/lib/rails/generators/erb/scaffold/templates/index.html.erb +9 -9
  17. data/lib/rails/generators/erb/scaffold/templates/show.html.erb +1 -2
  18. data/lib/rails/generators/generated_attribute.rb +4 -0
  19. data/lib/rails/generators/named_base.rb +2 -1
  20. data/lib/rails/generators/rails/app/templates/Gemfile +9 -4
  21. data/lib/rails/generators/rails/app/templates/config.ru +1 -1
  22. data/lib/rails/generators/rails/app/templates/config/application.rb +3 -2
  23. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +2 -0
  24. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +2 -2
  25. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +1 -1
  26. data/lib/rails/generators/rails/app/templates/config/initializers/secret_token.rb.tt +1 -1
  27. data/lib/rails/generators/rails/app/templates/config/initializers/session_store.rb.tt +1 -1
  28. data/lib/rails/generators/rails/app/templates/config/routes.rb +1 -1
  29. data/lib/rails/generators/rails/app/templates/public/404.html +41 -10
  30. data/lib/rails/generators/rails/app/templates/public/422.html +42 -10
  31. data/lib/rails/generators/rails/app/templates/public/500.html +41 -10
  32. data/lib/rails/generators/rails/app/templates/test/test_helper.rb +1 -1
  33. data/lib/rails/generators/rails/model/USAGE +16 -10
  34. data/lib/rails/generators/rails/plugin_new/plugin_new_generator.rb +9 -5
  35. data/lib/rails/generators/rails/plugin_new/templates/%name%.gemspec +0 -3
  36. data/lib/rails/generators/rails/plugin_new/templates/Gemfile +0 -8
  37. data/lib/rails/generators/rails/plugin_new/templates/rails/boot.rb +4 -8
  38. data/lib/rails/generators/rails/plugin_new/templates/rails/javascripts.js +13 -0
  39. data/lib/rails/generators/rails/plugin_new/templates/rails/stylesheets.css +13 -0
  40. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +1 -0
  41. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb +1 -1
  42. data/lib/rails/generators/test_case.rb +6 -211
  43. data/lib/rails/generators/test_unit/model/templates/fixtures.yml +7 -9
  44. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +5 -1
  45. data/lib/rails/generators/testing/assertions.rb +121 -0
  46. data/lib/rails/generators/testing/behaviour.rb +106 -0
  47. data/lib/rails/generators/testing/setup_and_teardown.rb +18 -0
  48. data/lib/rails/info.rb +2 -2
  49. data/lib/rails/tasks/documentation.rake +2 -46
  50. data/lib/rails/templates/rails/welcome/index.html.erb +1 -1
  51. data/lib/rails/test_unit/railtie.rb +4 -0
  52. data/lib/rails/test_unit/sub_test_task.rb +78 -1
  53. data/lib/rails/test_unit/testing.rake +32 -42
  54. data/lib/rails/version.rb +3 -3
  55. metadata +15 -23
  56. data/lib/rails/generators/rails/app/templates/app/assets/images/rails.png +0 -0
@@ -0,0 +1,106 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'active_support/core_ext/hash/reverse_merge'
4
+ require 'active_support/core_ext/kernel/reporting'
5
+ require 'active_support/concern'
6
+ require 'rails/generators'
7
+
8
+ module Rails
9
+ module Generators
10
+ module Testing
11
+ module Behaviour
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ class_attribute :destination_root, :current_path, :generator_class, :default_arguments
16
+
17
+ # Generators frequently change the current path using +FileUtils.cd+.
18
+ # So we need to store the path at file load and revert back to it after each test.
19
+ self.current_path = File.expand_path(Dir.pwd)
20
+ self.default_arguments = []
21
+ end
22
+
23
+ module ClassMethods
24
+ # Sets which generator should be tested:
25
+ #
26
+ # tests AppGenerator
27
+ def tests(klass)
28
+ self.generator_class = klass
29
+ end
30
+
31
+ # Sets default arguments on generator invocation. This can be overwritten when
32
+ # invoking it.
33
+ #
34
+ # arguments %w(app_name --skip-active-record)
35
+ def arguments(array)
36
+ self.default_arguments = array
37
+ end
38
+
39
+ # Sets the destination of generator files:
40
+ #
41
+ # destination File.expand_path("../tmp", File.dirname(__FILE__))
42
+ def destination(path)
43
+ self.destination_root = path
44
+ end
45
+ end
46
+
47
+ # Runs the generator configured for this class. The first argument is an array like
48
+ # command line arguments:
49
+ #
50
+ # class AppGeneratorTest < Rails::Generators::TestCase
51
+ # tests AppGenerator
52
+ # destination File.expand_path("../tmp", File.dirname(__FILE__))
53
+ # teardown :cleanup_destination_root
54
+ #
55
+ # test "database.yml is not created when skipping Active Record" do
56
+ # run_generator %w(myapp --skip-active-record)
57
+ # assert_no_file "config/database.yml"
58
+ # end
59
+ # end
60
+ #
61
+ # You can provide a configuration hash as second argument. This method returns the output
62
+ # printed by the generator.
63
+ def run_generator(args=self.default_arguments, config={})
64
+ capture(:stdout) do
65
+ args += ['--skip-bundle'] unless args.include? '--dev'
66
+ self.generator_class.start(args, config.reverse_merge(destination_root: destination_root))
67
+ end
68
+ end
69
+
70
+ # Instantiate the generator.
71
+ def generator(args=self.default_arguments, options={}, config={})
72
+ @generator ||= self.generator_class.new(args, options, config.reverse_merge(destination_root: destination_root))
73
+ end
74
+
75
+ # Create a Rails::Generators::GeneratedAttribute by supplying the
76
+ # attribute type and, optionally, the attribute name:
77
+ #
78
+ # create_generated_attribute(:string, 'name')
79
+ def create_generated_attribute(attribute_type, name = 'test', index = nil)
80
+ Rails::Generators::GeneratedAttribute.parse([name, attribute_type, index].compact.join(':'))
81
+ end
82
+
83
+ protected
84
+
85
+ def destination_root_is_set? # :nodoc:
86
+ raise "You need to configure your Rails::Generators::TestCase destination root." unless destination_root
87
+ end
88
+
89
+ def ensure_current_path # :nodoc:
90
+ cd current_path
91
+ end
92
+
93
+ def prepare_destination # :nodoc:
94
+ rm_rf(destination_root)
95
+ mkdir_p(destination_root)
96
+ end
97
+
98
+ def migration_file_name(relative) # :nodoc:
99
+ absolute = File.expand_path(relative, destination_root)
100
+ dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
101
+ Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,18 @@
1
+ module Rails
2
+ module Generators
3
+ module Testing
4
+ module SetupAndTeardown
5
+ def setup # :nodoc:
6
+ destination_root_is_set?
7
+ ensure_current_path
8
+ super
9
+ end
10
+
11
+ def teardown # :nodoc:
12
+ ensure_current_path
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -29,7 +29,7 @@ module Rails
29
29
  def framework_version(framework)
30
30
  if Object.const_defined?(framework.classify)
31
31
  require "#{framework}/version"
32
- "#{framework.classify}::VERSION::STRING".constantize
32
+ framework.classify.constantize.version.to_s
33
33
  end
34
34
  end
35
35
 
@@ -75,7 +75,7 @@ module Rails
75
75
 
76
76
  # The Rails version.
77
77
  property 'Rails version' do
78
- Rails::VERSION::STRING
78
+ Rails.version.to_s
79
79
  end
80
80
 
81
81
  property 'JavaScript Runtime' do
@@ -1,4 +1,5 @@
1
1
  require 'rdoc/task'
2
+ require 'rails/api/task'
2
3
 
3
4
  # Monkey-patch to remove redoc'ing and clobber descriptions to cut down on rake -T noise
4
5
  class RDocTaskWithoutDescriptions < RDoc::Task
@@ -52,52 +53,7 @@ namespace :doc do
52
53
  Rake::Task['doc:app'].comment = "Generate docs for the app -- also available doc:rails, doc:guides (options: TEMPLATE=/rdoc-template.rb, TITLE=\"Custom Title\")"
53
54
 
54
55
  # desc 'Generate documentation for the Rails framework.'
55
- RDocTaskWithoutDescriptions.new("rails") { |rdoc|
56
- rdoc.rdoc_dir = 'doc/api'
57
- rdoc.template = "#{ENV['template']}.rb" if ENV['template']
58
- rdoc.title = "Rails Framework Documentation"
59
- rdoc.options << '--line-numbers'
60
-
61
- gem_path('rails') do |rails|
62
- rdoc.options << '-m' << "#{rails}/README.rdoc"
63
- end
64
-
65
- gem_path('actionmailer') do |actionmailer|
66
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/action_mailer/base.rb).each do |file|
67
- rdoc.rdoc_files.include("#{actionmailer}/#{file}")
68
- end
69
- end
70
-
71
- gem_path('actionpack') do |actionpack|
72
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/action_controller/**/*.rb lib/action_view/**/*.rb).each do |file|
73
- rdoc.rdoc_files.include("#{actionpack}/#{file}")
74
- end
75
- end
76
-
77
- gem_path('activemodel') do |activemodel|
78
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/active_model/**/*.rb).each do |file|
79
- rdoc.rdoc_files.include("#{activemodel}/#{file}")
80
- end
81
- end
82
-
83
- gem_path('activerecord') do |activerecord|
84
- %w(README.rdoc CHANGELOG.md lib/active_record/**/*.rb).each do |file|
85
- rdoc.rdoc_files.include("#{activerecord}/#{file}")
86
- end
87
- end
88
-
89
- gem_path('activesupport') do |activesupport|
90
- %w(README.rdoc CHANGELOG.md lib/active_support/**/*.rb).each do |file|
91
- rdoc.rdoc_files.include("#{activesupport}/#{file}")
92
- end
93
- end
94
-
95
- gem_path('railties') do |railties|
96
- %w(README.rdoc CHANGELOG.md lib/{*.rb,commands/*.rb,generators/*.rb}).each do |file|
97
- rdoc.rdoc_files.include("#{railties}/#{file}")
98
- end
99
- end
100
- }
56
+ Rails::API::AppTask.new('rails')
101
57
 
102
58
  # desc "Generate Rails Guides"
103
59
  task :guides do
@@ -59,7 +59,7 @@
59
59
 
60
60
 
61
61
  #header {
62
- background-image: url("/assets/rails.png");
62
+ background-image: url(data:image/png;base64,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);
63
63
  background-repeat: no-repeat;
64
64
  background-position: top left;
65
65
  height: 64px;
@@ -1,3 +1,7 @@
1
+ if defined?(Rake) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any?
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ end
4
+
1
5
  module Rails
2
6
  class TestUnitRailtie < Rails::Railtie
3
7
  config.app_generators do |c|
@@ -1,6 +1,83 @@
1
+ require 'rake/testtask'
2
+
1
3
  module Rails
4
+ class TestTask < Rake::TestTask # :nodoc: all
5
+ class TestInfo
6
+ def initialize(tasks)
7
+ @tasks = tasks
8
+ end
9
+
10
+ def files
11
+ @tasks.map { |task|
12
+ [task, translate(task)].find { |file| test_file?(file) }
13
+ }.compact
14
+ end
15
+
16
+ def translate(file)
17
+ if file =~ /^app\/(.*)$/
18
+ "test/#{$1.sub(/\.rb$/, '')}_test.rb"
19
+ else
20
+ "test/#{file}_test.rb"
21
+ end
22
+ end
23
+
24
+ def tasks
25
+ @tasks - test_file_tasks - opt_names
26
+ end
27
+
28
+ def opts
29
+ opts = opt_names
30
+ if opts.any?
31
+ "-n #{opts.join ' '}"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def test_file_tasks
38
+ @tasks.find_all { |task|
39
+ [task, translate(task)].any? { |file| test_file?(file) }
40
+ }
41
+ end
42
+
43
+ def test_file?(file)
44
+ file =~ /^test/ && File.file?(file) && !File.directory?(file)
45
+ end
46
+
47
+ def opt_names
48
+ (@tasks - test_file_tasks).reject { |t| task_defined? t }
49
+ end
50
+
51
+ def task_defined?(task)
52
+ Rake::Task.task_defined? task
53
+ end
54
+ end
55
+
56
+ def self.test_info(tasks)
57
+ TestInfo.new tasks
58
+ end
59
+
60
+ def initialize(name = :test)
61
+ super
62
+ @libs << "test" # lib *and* test seem like a better default
63
+ end
64
+
65
+ def define
66
+ task @name do
67
+ if ENV['TESTOPTS']
68
+ ARGV.replace Shellwords.split ENV['TESTOPTS']
69
+ end
70
+ libs = @libs - $LOAD_PATH
71
+ $LOAD_PATH.unshift(*libs)
72
+ file_list.each { |fl|
73
+ FileList[fl].to_a.each { |f| require File.expand_path f }
74
+ }
75
+ end
76
+ end
77
+ end
78
+
2
79
  # Silence the default description to cut down on `rake -T` noise.
3
- class SubTestTask < Rake::TestTask
80
+ class SubTestTask < Rake::TestTask # :nodoc:
4
81
  def desc(string)
5
82
  # Ignore the description.
6
83
  end
@@ -1,6 +1,7 @@
1
1
  require 'rbconfig'
2
2
  require 'rake/testtask'
3
3
  require 'rails/test_unit/sub_test_task'
4
+ require 'active_support/deprecation'
4
5
 
5
6
  TEST_CHANGES_SINCE = Time.now - 600
6
7
 
@@ -47,7 +48,18 @@ task default: :test
47
48
 
48
49
  desc 'Runs test:units, test:functionals, test:integration together'
49
50
  task :test do
50
- Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
51
+ info = Rails::TestTask.test_info Rake.application.top_level_tasks
52
+ if info.files.any?
53
+ Rails::TestTask.new('test:single') { |t|
54
+ t.test_files = info.files
55
+ }
56
+ ENV['TESTOPTS'] ||= info.opts
57
+ Rake.application.top_level_tasks.replace info.tasks
58
+
59
+ Rake::Task['test:single'].invoke
60
+ else
61
+ Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
62
+ end
51
63
  end
52
64
 
53
65
  namespace :test do
@@ -55,26 +67,11 @@ namespace :test do
55
67
  # Placeholder task for other Railtie and plugins to enhance. See Active Record for an example.
56
68
  end
57
69
 
58
- task :run do
59
- errors = %w(test:units test:functionals test:integration).collect do |task|
60
- begin
61
- Rake::Task[task].invoke
62
- nil
63
- rescue => e
64
- { task: task, exception: e }
65
- end
66
- end.compact
67
-
68
- if errors.any?
69
- puts errors.map { |e| "Errors running #{e[:task]}! #{e[:exception].inspect}" }.join("\n")
70
- abort
71
- end
72
- end
70
+ task :run => ['test:units', 'test:functionals', 'test:integration']
73
71
 
74
72
  # Inspired by: http://ngauthier.com/2012/02/quick-tests-with-bash.html
75
73
  desc "Run tests quickly by merging all types and not resetting db"
76
- Rake::TestTask.new(:all) do |t|
77
- t.libs << "test"
74
+ Rails::TestTask.new(:all) do |t|
78
75
  t.pattern = "test/**/*_test.rb"
79
76
  end
80
77
 
@@ -83,7 +80,12 @@ namespace :test do
83
80
  task :db => %w[db:test:prepare test:all]
84
81
  end
85
82
 
86
- Rake::TestTask.new(recent: "test:prepare") do |t|
83
+ # Display deprecation message
84
+ task :deprecated do
85
+ ActiveSupport::Deprecation.warn "`rake #{ARGV.first}` is deprecated with no replacement."
86
+ end
87
+
88
+ Rake::TestTask.new(recent: ["test:deprecated", "test:prepare"]) do |t|
87
89
  since = TEST_CHANGES_SINCE
88
90
  touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
89
91
  recent_tests('app/models/**/*.rb', 'test/models', since) +
@@ -91,12 +93,11 @@ namespace :test do
91
93
  recent_tests('app/controllers/**/*.rb', 'test/controllers', since) +
92
94
  recent_tests('app/controllers/**/*.rb', 'test/functional', since)
93
95
 
94
- t.libs << 'test'
95
96
  t.test_files = touched.uniq
96
97
  end
97
- Rake::Task['test:recent'].comment = "Test recent changes"
98
+ Rake::Task['test:recent'].comment = "Deprecated; Test recent changes"
98
99
 
99
- Rake::TestTask.new(uncommitted: "test:prepare") do |t|
100
+ Rake::TestTask.new(uncommitted: ["test:deprecated", "test:prepare"]) do |t|
100
101
  def t.file_list
101
102
  if File.directory?(".svn")
102
103
  changed_since_checkin = silence_stderr { `svn status` }.split.map { |path| path.chomp[7 .. -1] }
@@ -115,47 +116,36 @@ namespace :test do
115
116
  controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
116
117
  (unit_tests + functional_tests).uniq.select { |file| File.exist?(file) }
117
118
  end
118
-
119
- t.libs << 'test'
120
119
  end
121
- Rake::Task['test:uncommitted'].comment = "Test changes since last checkin (only Subversion and Git)"
120
+ Rake::Task['test:uncommitted'].comment = "Deprecated; Test changes since last checkin (only Subversion and Git)"
122
121
 
123
- Rake::TestTask.new(single: "test:prepare") do |t|
124
- t.libs << "test"
125
- end
122
+ Rails::TestTask.new(single: "test:prepare")
126
123
 
127
- Rails::SubTestTask.new(models: "test:prepare") do |t|
128
- t.libs << "test"
124
+ Rails::TestTask.new(models: "test:prepare") do |t|
129
125
  t.pattern = 'test/models/**/*_test.rb'
130
126
  end
131
127
 
132
- Rails::SubTestTask.new(helpers: "test:prepare") do |t|
133
- t.libs << "test"
128
+ Rails::TestTask.new(helpers: "test:prepare") do |t|
134
129
  t.pattern = 'test/helpers/**/*_test.rb'
135
130
  end
136
131
 
137
- Rails::SubTestTask.new(units: "test:prepare") do |t|
138
- t.libs << "test"
132
+ Rails::TestTask.new(units: "test:prepare") do |t|
139
133
  t.pattern = 'test/{models,helpers,unit}/**/*_test.rb'
140
134
  end
141
135
 
142
- Rails::SubTestTask.new(controllers: "test:prepare") do |t|
143
- t.libs << "test"
136
+ Rails::TestTask.new(controllers: "test:prepare") do |t|
144
137
  t.pattern = 'test/controllers/**/*_test.rb'
145
138
  end
146
139
 
147
- Rails::SubTestTask.new(mailers: "test:prepare") do |t|
148
- t.libs << "test"
140
+ Rails::TestTask.new(mailers: "test:prepare") do |t|
149
141
  t.pattern = 'test/mailers/**/*_test.rb'
150
142
  end
151
143
 
152
- Rails::SubTestTask.new(functionals: "test:prepare") do |t|
153
- t.libs << "test"
144
+ Rails::TestTask.new(functionals: "test:prepare") do |t|
154
145
  t.pattern = 'test/{controllers,mailers,functional}/**/*_test.rb'
155
146
  end
156
147
 
157
- Rails::SubTestTask.new(integration: "test:prepare") do |t|
158
- t.libs << "test"
148
+ Rails::TestTask.new(integration: "test:prepare") do |t|
159
149
  t.pattern = 'test/integration/**/*_test.rb'
160
150
  end
161
151
  end