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
@@ -19,9 +19,6 @@ Gem::Specification.new do |s|
19
19
  <% end -%>
20
20
 
21
21
  <%= '# ' if options.dev? || options.edge? -%>s.add_dependency "rails", "~> <%= Rails::VERSION::STRING %>"
22
- <% if engine? && !options[:skip_javascript] -%>
23
- # s.add_dependency "<%= "#{options[:javascript]}-rails" %>"
24
- <% end -%>
25
22
  <% unless options[:skip_active_record] -%>
26
23
 
27
24
  s.add_development_dependency "<%= gem_for_database %>"
@@ -2,9 +2,6 @@ source "https://rubygems.org"
2
2
 
3
3
  <% if options[:skip_gemspec] -%>
4
4
  <%= '# ' if options.dev? || options.edge? -%>gem "rails", "~> <%= Rails::VERSION::STRING %>"
5
- <% if engine? && !options[:skip_javascript] -%>
6
- # gem "<%= "#{options[:javascript]}-rails" %>"
7
- <% end -%>
8
5
  <% else -%>
9
6
  # Declare your gem's dependencies in <%= name %>.gemspec.
10
7
  # Bundler will treat runtime dependencies like base dependencies, and
@@ -12,11 +9,6 @@ source "https://rubygems.org"
12
9
  gemspec
13
10
  <% end -%>
14
11
 
15
- <% unless options[:javascript] == 'jquery' -%>
16
- # jquery-rails is used by the dummy application
17
- gem "jquery-rails"
18
-
19
- <% end -%>
20
12
  <% if options[:skip_gemspec] -%>
21
13
  group :development do
22
14
  gem "<%= gem_for_database %>"
@@ -1,9 +1,5 @@
1
- gemfile = File.expand_path('../../../../Gemfile', __FILE__)
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
2
3
 
3
- if File.exist?(gemfile)
4
- ENV['BUNDLE_GEMFILE'] = gemfile
5
- require 'bundler'
6
- Bundler.setup
7
- end
8
-
9
- $:.unshift File.expand_path('../../../../lib', __FILE__)
4
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -10,6 +10,7 @@ module Rails
10
10
  class_option :stylesheet_engine, desc: "Engine for Stylesheets"
11
11
 
12
12
  def handle_skip
13
+ @options = @options.merge(stylesheets: false) unless options[:assets]
13
14
  @options = @options.merge(stylesheet_engine: false) unless options[:stylesheets]
14
15
  end
15
16
 
@@ -56,7 +56,7 @@ class <%= controller_class_name %>Controller < ApplicationController
56
56
  @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
57
57
  end
58
58
 
59
- # Never trust parameters from the scary internet, only allow the white list through.
59
+ # Only allow a trusted parameter "white list" through.
60
60
  def <%= "#{singular_table_name}_params" %>
61
61
  <%- if attributes_names.empty? -%>
62
62
  params[<%= ":#{singular_table_name}" %>]
@@ -1,8 +1,7 @@
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
1
  require 'rails/generators'
2
+ require 'rails/generators/testing/behaviour'
3
+ require 'rails/generators/testing/setup_and_teardown'
4
+ require 'rails/generators/testing/assertions'
6
5
  require 'fileutils'
7
6
 
8
7
  module Rails
@@ -27,215 +26,11 @@ module Rails
27
26
  # setup :prepare_destination
28
27
  # end
29
28
  class TestCase < ActiveSupport::TestCase
29
+ include Rails::Generators::Testing::Behaviour
30
+ include Rails::Generators::Testing::SetupAndTeardown
31
+ include Rails::Generators::Testing::Assertions
30
32
  include FileUtils
31
33
 
32
- class_attribute :destination_root, :current_path, :generator_class, :default_arguments
33
-
34
- # Generators frequently change the current path using +FileUtils.cd+.
35
- # So we need to store the path at file load and revert back to it after each test.
36
- self.current_path = File.expand_path(Dir.pwd)
37
- self.default_arguments = []
38
-
39
- def setup # :nodoc:
40
- destination_root_is_set?
41
- ensure_current_path
42
- super
43
- end
44
-
45
- def teardown # :nodoc:
46
- ensure_current_path
47
- super
48
- end
49
-
50
- # Sets which generator should be tested:
51
- #
52
- # tests AppGenerator
53
- def self.tests(klass)
54
- self.generator_class = klass
55
- end
56
-
57
- # Sets default arguments on generator invocation. This can be overwritten when
58
- # invoking it.
59
- #
60
- # arguments %w(app_name --skip-active-record)
61
- def self.arguments(array)
62
- self.default_arguments = array
63
- end
64
-
65
- # Sets the destination of generator files:
66
- #
67
- # destination File.expand_path("../tmp", File.dirname(__FILE__))
68
- def self.destination(path)
69
- self.destination_root = path
70
- end
71
-
72
- # Asserts a given file exists. You need to supply an absolute path or a path relative
73
- # to the configured destination:
74
- #
75
- # assert_file "config/environment.rb"
76
- #
77
- # You can also give extra arguments. If the argument is a regexp, it will check if the
78
- # regular expression matches the given file content. If it's a string, it compares the
79
- # file with the given string:
80
- #
81
- # assert_file "config/environment.rb", /initialize/
82
- #
83
- # Finally, when a block is given, it yields the file content:
84
- #
85
- # assert_file "app/controllers/products_controller.rb" do |controller|
86
- # assert_instance_method :index, controller do |index|
87
- # assert_match(/Product\.all/, index)
88
- # end
89
- # end
90
- def assert_file(relative, *contents)
91
- absolute = File.expand_path(relative, destination_root)
92
- assert File.exists?(absolute), "Expected file #{relative.inspect} to exist, but does not"
93
-
94
- read = File.read(absolute) if block_given? || !contents.empty?
95
- yield read if block_given?
96
-
97
- contents.each do |content|
98
- case content
99
- when String
100
- assert_equal content, read
101
- when Regexp
102
- assert_match content, read
103
- end
104
- end
105
- end
106
- alias :assert_directory :assert_file
107
-
108
- # Asserts a given file does not exist. You need to supply an absolute path or a
109
- # path relative to the configured destination:
110
- #
111
- # assert_no_file "config/random.rb"
112
- def assert_no_file(relative)
113
- absolute = File.expand_path(relative, destination_root)
114
- assert !File.exists?(absolute), "Expected file #{relative.inspect} to not exist, but does"
115
- end
116
- alias :assert_no_directory :assert_no_file
117
-
118
- # Asserts a given migration exists. You need to supply an absolute path or a
119
- # path relative to the configured destination:
120
- #
121
- # assert_migration "db/migrate/create_products.rb"
122
- #
123
- # This method manipulates the given path and tries to find any migration which
124
- # matches the migration name. For example, the call above is converted to:
125
- #
126
- # assert_file "db/migrate/003_create_products.rb"
127
- #
128
- # Consequently, assert_migration accepts the same arguments has assert_file.
129
- def assert_migration(relative, *contents, &block)
130
- file_name = migration_file_name(relative)
131
- assert file_name, "Expected migration #{relative} to exist, but was not found"
132
- assert_file file_name, *contents, &block
133
- end
134
-
135
- # Asserts a given migration does not exist. You need to supply an absolute path or a
136
- # path relative to the configured destination:
137
- #
138
- # assert_no_migration "db/migrate/create_products.rb"
139
- def assert_no_migration(relative)
140
- file_name = migration_file_name(relative)
141
- assert_nil file_name, "Expected migration #{relative} to not exist, but found #{file_name}"
142
- end
143
-
144
- # Asserts the given class method exists in the given content. This method does not detect
145
- # class methods inside (class << self), only class methods which starts with "self.".
146
- # When a block is given, it yields the content of the method.
147
- #
148
- # assert_migration "db/migrate/create_products.rb" do |migration|
149
- # assert_class_method :up, migration do |up|
150
- # assert_match(/create_table/, up)
151
- # end
152
- # end
153
- def assert_class_method(method, content, &block)
154
- assert_instance_method "self.#{method}", content, &block
155
- end
156
-
157
- # Asserts the given method exists in the given content. When a block is given,
158
- # it yields the content of the method.
159
- #
160
- # assert_file "app/controllers/products_controller.rb" do |controller|
161
- # assert_instance_method :index, controller do |index|
162
- # assert_match(/Product\.all/, index)
163
- # end
164
- # end
165
- def assert_instance_method(method, content)
166
- assert content =~ /(\s+)def #{method}(\(.+\))?(.*?)\n\1end/m, "Expected to have method #{method}"
167
- yield $3.strip if block_given?
168
- end
169
- alias :assert_method :assert_instance_method
170
-
171
- # Asserts the given attribute type gets translated to a field type
172
- # properly:
173
- #
174
- # assert_field_type :date, :date_select
175
- def assert_field_type(attribute_type, field_type)
176
- assert_equal(field_type, create_generated_attribute(attribute_type).field_type)
177
- end
178
-
179
- # Asserts the given attribute type gets a proper default value:
180
- #
181
- # assert_field_default_value :string, "MyString"
182
- def assert_field_default_value(attribute_type, value)
183
- assert_equal(value, create_generated_attribute(attribute_type).default)
184
- end
185
-
186
- # Runs the generator configured for this class. The first argument is an array like
187
- # command line arguments:
188
- #
189
- # class AppGeneratorTest < Rails::Generators::TestCase
190
- # tests AppGenerator
191
- # destination File.expand_path("../tmp", File.dirname(__FILE__))
192
- # teardown :cleanup_destination_root
193
- #
194
- # test "database.yml is not created when skipping Active Record" do
195
- # run_generator %w(myapp --skip-active-record)
196
- # assert_no_file "config/database.yml"
197
- # end
198
- # end
199
- #
200
- # You can provide a configuration hash as second argument. This method returns the output
201
- # printed by the generator.
202
- def run_generator(args=self.default_arguments, config={})
203
- capture(:stdout) { self.generator_class.start(args, config.reverse_merge(destination_root: destination_root)) }
204
- end
205
-
206
- # Instantiate the generator.
207
- def generator(args=self.default_arguments, options={}, config={})
208
- @generator ||= self.generator_class.new(args, options, config.reverse_merge(destination_root: destination_root))
209
- end
210
-
211
- # Create a Rails::Generators::GeneratedAttribute by supplying the
212
- # attribute type and, optionally, the attribute name:
213
- #
214
- # create_generated_attribute(:string, 'name')
215
- def create_generated_attribute(attribute_type, name = 'test', index = nil)
216
- Rails::Generators::GeneratedAttribute.parse([name, attribute_type, index].compact.join(':'))
217
- end
218
-
219
- protected
220
-
221
- def destination_root_is_set? # :nodoc:
222
- raise "You need to configure your Rails::Generators::TestCase destination root." unless destination_root
223
- end
224
-
225
- def ensure_current_path # :nodoc:
226
- cd current_path
227
- end
228
-
229
- def prepare_destination # :nodoc:
230
- rm_rf(destination_root)
231
- mkdir_p(destination_root)
232
- end
233
-
234
- def migration_file_name(relative) # :nodoc:
235
- absolute = File.expand_path(relative, destination_root)
236
- dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
237
- Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
238
- end
239
34
  end
240
35
  end
241
36
  end
@@ -1,22 +1,20 @@
1
1
  # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
2
-
3
2
  <% unless attributes.empty? -%>
4
- one:
3
+ <% %w(one two).each do |name| %>
4
+ <%= name %>:
5
5
  <% attributes.each do |attribute| -%>
6
+ <%- if attribute.password_digest? -%>
7
+ password_digest: <%%= BCrypt::Password.create('secret') %>
8
+ <%- else -%>
6
9
  <%= yaml_key_value(attribute.column_name, attribute.default) %>
7
- <%- if attribute.polymorphic? -%>
8
- <%= yaml_key_value("#{attribute.name}_type", attribute.human_name) %>
9
10
  <%- end -%>
10
- <% end -%>
11
-
12
- two:
13
- <% attributes.each do |attribute| -%>
14
- <%= yaml_key_value(attribute.column_name, attribute.default) %>
15
11
  <%- if attribute.polymorphic? -%>
16
12
  <%= yaml_key_value("#{attribute.name}_type", attribute.human_name) %>
17
13
  <%- end -%>
18
14
  <% end -%>
15
+ <% end -%>
19
16
  <% else -%>
17
+
20
18
  # This model initially had no columns defined. If you add columns to the
21
19
  # model remove the '{}' from the fixture names and add the columns immediately
22
20
  # below each fixture, per the syntax in the comments below
@@ -21,7 +21,11 @@ module TestUnit # :nodoc:
21
21
  return if attributes_names.empty?
22
22
 
23
23
  attributes_names.map do |name|
24
- "#{name}: @#{singular_table_name}.#{name}"
24
+ if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
25
+ "#{name}: 'secret'"
26
+ else
27
+ "#{name}: @#{singular_table_name}.#{name}"
28
+ end
25
29
  end.sort.join(', ')
26
30
  end
27
31
  end
@@ -0,0 +1,121 @@
1
+ module Rails
2
+ module Generators
3
+ module Testing
4
+ module Assertions
5
+ # Asserts a given file exists. You need to supply an absolute path or a path relative
6
+ # to the configured destination:
7
+ #
8
+ # assert_file "config/environment.rb"
9
+ #
10
+ # You can also give extra arguments. If the argument is a regexp, it will check if the
11
+ # regular expression matches the given file content. If it's a string, it compares the
12
+ # file with the given string:
13
+ #
14
+ # assert_file "config/environment.rb", /initialize/
15
+ #
16
+ # Finally, when a block is given, it yields the file content:
17
+ #
18
+ # assert_file "app/controllers/products_controller.rb" do |controller|
19
+ # assert_instance_method :index, controller do |index|
20
+ # assert_match(/Product\.all/, index)
21
+ # end
22
+ # end
23
+ def assert_file(relative, *contents)
24
+ absolute = File.expand_path(relative, destination_root)
25
+ assert File.exists?(absolute), "Expected file #{relative.inspect} to exist, but does not"
26
+
27
+ read = File.read(absolute) if block_given? || !contents.empty?
28
+ yield read if block_given?
29
+
30
+ contents.each do |content|
31
+ case content
32
+ when String
33
+ assert_equal content, read
34
+ when Regexp
35
+ assert_match content, read
36
+ end
37
+ end
38
+ end
39
+ alias :assert_directory :assert_file
40
+
41
+ # Asserts a given file does not exist. You need to supply an absolute path or a
42
+ # path relative to the configured destination:
43
+ #
44
+ # assert_no_file "config/random.rb"
45
+ def assert_no_file(relative)
46
+ absolute = File.expand_path(relative, destination_root)
47
+ assert !File.exists?(absolute), "Expected file #{relative.inspect} to not exist, but does"
48
+ end
49
+ alias :assert_no_directory :assert_no_file
50
+
51
+ # Asserts a given migration exists. You need to supply an absolute path or a
52
+ # path relative to the configured destination:
53
+ #
54
+ # assert_migration "db/migrate/create_products.rb"
55
+ #
56
+ # This method manipulates the given path and tries to find any migration which
57
+ # matches the migration name. For example, the call above is converted to:
58
+ #
59
+ # assert_file "db/migrate/003_create_products.rb"
60
+ #
61
+ # Consequently, assert_migration accepts the same arguments has assert_file.
62
+ def assert_migration(relative, *contents, &block)
63
+ file_name = migration_file_name(relative)
64
+ assert file_name, "Expected migration #{relative} to exist, but was not found"
65
+ assert_file file_name, *contents, &block
66
+ end
67
+
68
+ # Asserts a given migration does not exist. You need to supply an absolute path or a
69
+ # path relative to the configured destination:
70
+ #
71
+ # assert_no_migration "db/migrate/create_products.rb"
72
+ def assert_no_migration(relative)
73
+ file_name = migration_file_name(relative)
74
+ assert_nil file_name, "Expected migration #{relative} to not exist, but found #{file_name}"
75
+ end
76
+
77
+ # Asserts the given class method exists in the given content. This method does not detect
78
+ # class methods inside (class << self), only class methods which starts with "self.".
79
+ # When a block is given, it yields the content of the method.
80
+ #
81
+ # assert_migration "db/migrate/create_products.rb" do |migration|
82
+ # assert_class_method :up, migration do |up|
83
+ # assert_match(/create_table/, up)
84
+ # end
85
+ # end
86
+ def assert_class_method(method, content, &block)
87
+ assert_instance_method "self.#{method}", content, &block
88
+ end
89
+
90
+ # Asserts the given method exists in the given content. When a block is given,
91
+ # it yields the content of the method.
92
+ #
93
+ # assert_file "app/controllers/products_controller.rb" do |controller|
94
+ # assert_instance_method :index, controller do |index|
95
+ # assert_match(/Product\.all/, index)
96
+ # end
97
+ # end
98
+ def assert_instance_method(method, content)
99
+ assert content =~ /(\s+)def #{method}(\(.+\))?(.*?)\n\1end/m, "Expected to have method #{method}"
100
+ yield $3.strip if block_given?
101
+ end
102
+ alias :assert_method :assert_instance_method
103
+
104
+ # Asserts the given attribute type gets translated to a field type
105
+ # properly:
106
+ #
107
+ # assert_field_type :date, :date_select
108
+ def assert_field_type(attribute_type, field_type)
109
+ assert_equal(field_type, create_generated_attribute(attribute_type).field_type)
110
+ end
111
+
112
+ # Asserts the given attribute type gets a proper default value:
113
+ #
114
+ # assert_field_default_value :string, "MyString"
115
+ def assert_field_default_value(attribute_type, value)
116
+ assert_equal(value, create_generated_attribute(attribute_type).default)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end