aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2011-12-24 10:38:19 +0100
committerJosé Valim <jose.valim@gmail.com>2011-12-24 10:38:19 +0100
commitb4e97ea2d961c7ed99dcfa48044f4922378ff9cf (patch)
tree9aac1ae030dfc9ad9e7cef22e5d05e35011e5af1 /railties
parent7a47f362c8246c20437f49111e5dcc0781d6d024 (diff)
downloadrails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.tar.gz
rails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.tar.bz2
rails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.zip
Tidy up migration types.
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/rails/generators/generated_attribute.rb76
-rw-r--r--railties/lib/rails/generators/named_base.rb2
-rw-r--r--railties/lib/rails/generators/rails/migration/migration_generator.rb2
-rw-r--r--railties/lib/rails/generators/rails/model/model_generator.rb2
-rw-r--r--railties/lib/rails/generators/rails/scaffold/USAGE24
-rw-r--r--railties/lib/rails/generators/test_case.rb4
-rw-r--r--railties/test/generators/generated_attribute_test.rb7
-rw-r--r--railties/test/generators/migration_generator_test.rb2
-rw-r--r--railties/test/generators/model_generator_test.rb2
9 files changed, 71 insertions, 50 deletions
diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb
index 5ba37737a2..132145474b 100644
--- a/railties/lib/rails/generators/generated_attribute.rb
+++ b/railties/lib/rails/generators/generated_attribute.rb
@@ -1,13 +1,48 @@
require 'active_support/time'
require 'active_support/core_ext/object/inclusion'
+require 'active_support/core_ext/object/blank'
module Rails
module Generators
class GeneratedAttribute
- attr_accessor :name, :type, :has_index, :attr_options
+ attr_accessor :name, :type
+ attr_reader :attr_options
- def initialize(column_definition)
- parse column_definition
+ class << self
+ def parse(column_definition)
+ name, type, has_index = column_definition.split(':')
+
+ # if user provided "name:index" instead of "name:string:index"
+ # type should be set blank so GeneratedAttribute's constructor
+ # could set it to :string
+ has_index, type = type, nil if %w(index uniq).include?(type)
+
+ type, attr_options = *parse_type_and_options(type)
+ new(name, type, has_index, attr_options)
+ end
+
+ private
+
+ # parse possible attribute options like :limit for string/text/binary/integer or :precision/:scale for decimals
+ # when declaring options curly brackets should be used
+ def parse_type_and_options(type)
+ case type
+ when /(string|text|binary|integer){(\d+)}/
+ return $1, :limit => $2.to_i
+ when /decimal{(\d+),(\d+)}/
+ return :decimal, :precision => $1.to_i, :scale => $2.to_i
+ else
+ return type, {}
+ end
+ end
+ end
+
+ def initialize(name, type=nil, index_type=false, attr_options={})
+ @name = name
+ @type = (type.presence || :string).to_sym
+ @has_index = %w(index uniq).include?(index_type)
+ @has_uniq_index = %w(uniq).include?(index_type)
+ @attr_options = attr_options
end
def field_type
@@ -44,10 +79,14 @@ module Rails
name.to_s.humanize
end
+ def index_name
+ reference? ? "#{name}_id" : name
+ end
+
def reference?
self.type.in?([:references, :belongs_to])
end
-
+
def has_index?
@has_index
end
@@ -56,35 +95,6 @@ module Rails
@has_uniq_index
end
- def parse(column_definition)
- name, type, has_index = column_definition.split(':')
- # if user provided "name:index" instead of "name:string:index" type should be set blank
- # so GeneratedAttribute's constructor could set it to :string
- if type =~ /index|uniq|unique/i
- has_index = type
- type = nil
- end
- type = :string if type.blank?
-
- @name = name
- @type, @attr_options = *parse_type_and_options(type)
- @has_index = ['index','uniq','unique'].include?(has_index)
- @has_uniq_index = ['uniq','unique'].include?(has_index)
- end
-
- # parse possible attribute options like :limit for string/text/binary/integer or :precision/:scale for decimals
- # when declaring options curly brackets should be used
- def parse_type_and_options(type)
- attribute_options = case type
- when /(string|text|binary|integer){(\d+)}/
- {:limit => $2.to_i}
- when /decimal{(\d+),(\d+)}/
- {:precision => $1.to_i, :scale => $2.to_i}
- else; {}
- end
- [type.to_s.gsub(/{.*}/,'').to_sym, attribute_options]
- end
-
def inject_options
@attr_options.blank? ? '' : ", #{@attr_options.to_s.gsub(/[{}]/, '')}"
end
diff --git a/railties/lib/rails/generators/named_base.rb b/railties/lib/rails/generators/named_base.rb
index baf7cb7dca..9cef55e0a6 100644
--- a/railties/lib/rails/generators/named_base.rb
+++ b/railties/lib/rails/generators/named_base.rb
@@ -151,7 +151,7 @@ module Rails
# Convert attributes array into GeneratedAttribute objects.
def parse_attributes! #:nodoc:
self.attributes = (attributes || []).map do |attr|
- Rails::Generators::GeneratedAttribute.new(attr)
+ Rails::Generators::GeneratedAttribute.parse(attr)
end
end
diff --git a/railties/lib/rails/generators/rails/migration/migration_generator.rb b/railties/lib/rails/generators/rails/migration/migration_generator.rb
index ecf0a77b76..f87dce1502 100644
--- a/railties/lib/rails/generators/rails/migration/migration_generator.rb
+++ b/railties/lib/rails/generators/rails/migration/migration_generator.rb
@@ -1,7 +1,7 @@
module Rails
module Generators
class MigrationGenerator < NamedBase #metagenerator
- argument :attributes, :type => :array, :default => [], :banner => "field:type field:type field:type:index"
+ argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]"
hook_for :orm, :required => true
end
end
diff --git a/railties/lib/rails/generators/rails/model/model_generator.rb b/railties/lib/rails/generators/rails/model/model_generator.rb
index 2a882981c3..9bb29b784e 100644
--- a/railties/lib/rails/generators/rails/model/model_generator.rb
+++ b/railties/lib/rails/generators/rails/model/model_generator.rb
@@ -1,7 +1,7 @@
module Rails
module Generators
class ModelGenerator < NamedBase #metagenerator
- argument :attributes, :type => :array, :default => [], :banner => "field:type field:type field:type:index"
+ argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]"
hook_for :orm, :required => true
end
end
diff --git a/railties/lib/rails/generators/rails/scaffold/USAGE b/railties/lib/rails/generators/rails/scaffold/USAGE
index be1d113ed8..4a3eb2c7c7 100644
--- a/railties/lib/rails/generators/rails/scaffold/USAGE
+++ b/railties/lib/rails/generators/rails/scaffold/USAGE
@@ -7,23 +7,29 @@ Description:
under_scored, as the first argument, and an optional list of attribute
pairs.
- Attribute pairs are field:type arguments specifying the
- model's attributes. Timestamps are added by default, so you don't have to
- specify them by hand as 'created_at:datetime updated_at:datetime'.
+ Attributes are field arguments specifying the model's attributes. You can
+ optionally pass the type and an index to each field. For instance:
+ "title body:text tracking_id:integer:uniq" will generate a title field of
+ string type, a body with text type and a tracking_id as an integer with an
+ unique index. "index" could also be given instead of "uniq" if one desires
+ a non unique index.
+
+ Timestamps are added by default, so you don't have to specify them by hand
+ as 'created_at:datetime updated_at:datetime'.
You don't have to think up every attribute up front, but it helps to
sketch out a few so you can start working with the resource immediately.
- For example, 'scaffold post title:string body:text published:boolean'
- gives you a model with those three attributes, a controller that handles
+ For example, 'scaffold post title body:text published:boolean' gives
+ you a model with those three attributes, a controller that handles
the create/show/update/destroy, forms to create and edit your posts, and
- an index that lists them all, as well as a resources :posts
- declaration in config/routes.rb.
+ an index that lists them all, as well as a resources :posts declaration
+ in config/routes.rb.
If you want to remove all the generated files, run
'rails destroy scaffold ModelName'.
Examples:
`rails generate scaffold post`
- `rails generate scaffold post title:string body:text published:boolean`
- `rails generate scaffold purchase order_id:integer amount:decimal`
+ `rails generate scaffold post title body:text published:boolean`
+ `rails generate scaffold purchase amount:decimal tracking_id:integer:uniq`
diff --git a/railties/lib/rails/generators/test_case.rb b/railties/lib/rails/generators/test_case.rb
index ab55031d07..d81c4c3e1d 100644
--- a/railties/lib/rails/generators/test_case.rb
+++ b/railties/lib/rails/generators/test_case.rb
@@ -218,8 +218,8 @@ module Rails
#
# create_generated_attribute(:string, 'name')
#
- def create_generated_attribute(attribute_type, name = 'test')
- Rails::Generators::GeneratedAttribute.new([name, attribute_type.to_s].join(':'))
+ def create_generated_attribute(attribute_type, name = 'test', index = nil)
+ Rails::Generators::GeneratedAttribute.parse([name, attribute_type, index].compact.join(':'))
end
protected
diff --git a/railties/test/generators/generated_attribute_test.rb b/railties/test/generators/generated_attribute_test.rb
index ea6c6e4e2c..6e3fc84781 100644
--- a/railties/test/generators/generated_attribute_test.rb
+++ b/railties/test/generators/generated_attribute_test.rb
@@ -69,7 +69,7 @@ class GeneratedAttributeTest < Rails::Generators::TestCase
end
def test_default_value_for_type
- att = Rails::Generators::GeneratedAttribute.new("type:string")
+ att = Rails::Generators::GeneratedAttribute.parse("type:string")
assert_equal("", att.default)
end
@@ -122,4 +122,9 @@ class GeneratedAttributeTest < Rails::Generators::TestCase
assert_equal :string, create_generated_attribute(nil, 'title').type
assert_equal :string, create_generated_attribute("", 'title').type
end
+
+ def test_handles_index_names_for_references
+ assert_equal "post", create_generated_attribute('string', 'post').index_name
+ assert_equal "post_id", create_generated_attribute('references', 'post').index_name
+ end
end
diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb
index 6b6c9dee7c..9da1b53c96 100644
--- a/railties/test/generators/migration_generator_test.rb
+++ b/railties/test/generators/migration_generator_test.rb
@@ -60,7 +60,7 @@ class MigrationGeneratorTest < Rails::Generators::TestCase
def test_add_migration_with_attributes_and_indices
migration = "add_title_with_index_and_body_to_posts"
- run_generator [migration, "title:string:index", "body:text", "user_id:integer:unique"]
+ run_generator [migration, "title:string:index", "body:text", "user_id:integer:uniq"]
assert_migration "db/migrate/#{migration}.rb" do |content|
assert_method :change, content do |up|
diff --git a/railties/test/generators/model_generator_test.rb b/railties/test/generators/model_generator_test.rb
index 7a8cf1d8a7..c063d4d687 100644
--- a/railties/test/generators/model_generator_test.rb
+++ b/railties/test/generators/model_generator_test.rb
@@ -114,7 +114,7 @@ class ModelGeneratorTest < Rails::Generators::TestCase
end
def test_migration_with_attributes_and_with_index
- run_generator ["product", "name:string:index", "supplier_id:integer:index", "user_id:integer:uniq", "order_id:unique"]
+ run_generator ["product", "name:string:index", "supplier_id:integer:index", "user_id:integer:uniq", "order_id:uniq"]
assert_migration "db/migrate/create_products.rb" do |m|
assert_method :change, m do |up|