diff --git a/lib/annotate/annotate_models.rb b/lib/annotate/annotate_models.rb index 4d4f0eede..2c8ff1cc1 100755 --- a/lib/annotate/annotate_models.rb +++ b/lib/annotate/annotate_models.rb @@ -1,3 +1,5 @@ +require 'bigdecimal' + module AnnotateModels # Annotate Models plugin use this header COMPAT_PREFIX = "== Schema Info" @@ -94,6 +96,10 @@ def quote(value) end end + def schema_default(klass, column) + quote(klass.column_defaults[column.name]) + end + # Use the column information in an ActiveRecord class # to create a comment block containing a line for # each column. The line contains the column name, @@ -130,7 +136,7 @@ def get_schema_info(klass, header, options = {}) cols = classified_sort(cols) if(options[:classified_sort]) cols.each do |col| attrs = [] - attrs << "default(#{quote(col.default)})" unless col.default.nil? + attrs << "default(#{schema_default(klass, col)})" unless col.default.nil? attrs << "not null" unless col.null attrs << "primary key" if klass.primary_key && (klass.primary_key.is_a?(Array) ? klass.primary_key.collect{|c|c.to_sym}.include?(col.name.to_sym) : col.name.to_sym == klass.primary_key.to_sym) diff --git a/spec/annotate/annotate_models_spec.rb b/spec/annotate/annotate_models_spec.rb index d21c1cf41..76d60f216 100755 --- a/spec/annotate/annotate_models_spec.rb +++ b/spec/annotate/annotate_models_spec.rb @@ -10,7 +10,10 @@ def mock_class(table_name, primary_key, columns) :table_name => table_name, :primary_key => primary_key, :column_names => columns.map { |col| col.name.to_s }, - :columns => columns + :columns => columns, + :column_defaults => Hash[columns.map { |col| + [col.name, col.default] + }] } double("An ActiveRecord class", options) @@ -106,6 +109,24 @@ def mock_column(name, type, options={}) EOS end + it "should get schema info for integer and boolean with default" do + klass = mock_class(:users, :id, [ + mock_column(:id, :integer), + mock_column(:size, :integer, :default => 20), + mock_column(:flag, :boolean, :default => false) + ]) + expect(AnnotateModels.get_schema_info(klass, "Schema Info")).to eql(<<-EOS) +# Schema Info +# +# Table name: users +# +# id :integer not null, primary key +# size :integer default(20), not null +# flag :boolean default(FALSE), not null +# +EOS + end + it "should get schema info as RDoc" do klass = mock_class(:users, :id, [ mock_column(:id, :integer), diff --git a/spec/integration/rails_4.1.1/app/models/sub1/sub2/sub3/event.rb b/spec/integration/rails_4.1.1/app/models/sub1/sub2/sub3/event.rb index 0c3ebffa4..40e0630e0 100644 --- a/spec/integration/rails_4.1.1/app/models/sub1/sub2/sub3/event.rb +++ b/spec/integration/rails_4.1.1/app/models/sub1/sub2/sub3/event.rb @@ -1,3 +1,13 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# content :string(255) +# created_at :datetime +# updated_at :datetime +# + module Sub1::Sub2::Sub3 class Event < ActiveRecord::Base end diff --git a/spec/integration/rails_4.1.1/app/models/sub1/user.rb b/spec/integration/rails_4.1.1/app/models/sub1/user.rb index a5fe71902..07ea1e5ea 100644 --- a/spec/integration/rails_4.1.1/app/models/sub1/user.rb +++ b/spec/integration/rails_4.1.1/app/models/sub1/user.rb @@ -1,2 +1,12 @@ +# == Schema Information +# +# Table name: users +# +# id :integer not null, primary key +# content :string(255) +# created_at :datetime +# updated_at :datetime +# + class Sub1::User < ActiveRecord::Base end diff --git a/spec/integration/rails_4.1.1/app/models/task.rb b/spec/integration/rails_4.1.1/app/models/task.rb index 8c3a936f8..2fbd60f89 100644 --- a/spec/integration/rails_4.1.1/app/models/task.rb +++ b/spec/integration/rails_4.1.1/app/models/task.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: tasks +# +# id :integer not null, primary key +# content :string(255) +# count :integer default(0) +# status :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# + class Task < ActiveRecord::Base enum status: %w(normal active completed) end diff --git a/spec/integration/rails_4.1.1/db/migrate/20140526224112_create_tasks.rb b/spec/integration/rails_4.1.1/db/migrate/20140526224112_create_tasks.rb index 899822d2b..fa5294eba 100644 --- a/spec/integration/rails_4.1.1/db/migrate/20140526224112_create_tasks.rb +++ b/spec/integration/rails_4.1.1/db/migrate/20140526224112_create_tasks.rb @@ -2,7 +2,8 @@ class CreateTasks < ActiveRecord::Migration def change create_table :tasks do |t| t.string :content - t.column :status, :default => 0 + t.integer :count, :default => 0 + t.boolean :status, :default => 0 t.timestamps end end diff --git a/spec/integration/rails_4.1.1/db/schema.rb b/spec/integration/rails_4.1.1/db/schema.rb index e36cb480b..85f355e3e 100644 --- a/spec/integration/rails_4.1.1/db/schema.rb +++ b/spec/integration/rails_4.1.1/db/schema.rb @@ -21,6 +21,8 @@ create_table "tasks", force: true do |t| t.string "content" + t.integer "count", default: 0 + t.boolean "status", default: false t.datetime "created_at" t.datetime "updated_at" end diff --git a/spec/integration/rails_4.1.1/test/models/task_test.rb b/spec/integration/rails_4.1.1/test/models/task_test.rb index b667a66cc..080f41265 100644 --- a/spec/integration/rails_4.1.1/test/models/task_test.rb +++ b/spec/integration/rails_4.1.1/test/models/task_test.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: tasks +# +# id :integer not null, primary key +# content :string(255) +# count :integer default(0) +# status :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# + require 'test_helper' class TaskTest < ActiveSupport::TestCase diff --git a/spec/integration/rails_4.2.0/app/models/sub1/sub2/sub3/event.rb b/spec/integration/rails_4.2.0/app/models/sub1/sub2/sub3/event.rb index 0c3ebffa4..8850c00fc 100644 --- a/spec/integration/rails_4.2.0/app/models/sub1/sub2/sub3/event.rb +++ b/spec/integration/rails_4.2.0/app/models/sub1/sub2/sub3/event.rb @@ -1,3 +1,13 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# content :string +# created_at :datetime +# updated_at :datetime +# + module Sub1::Sub2::Sub3 class Event < ActiveRecord::Base end diff --git a/spec/integration/rails_4.2.0/app/models/sub1/user.rb b/spec/integration/rails_4.2.0/app/models/sub1/user.rb index a5fe71902..1f191ca9e 100644 --- a/spec/integration/rails_4.2.0/app/models/sub1/user.rb +++ b/spec/integration/rails_4.2.0/app/models/sub1/user.rb @@ -1,2 +1,12 @@ +# == Schema Information +# +# Table name: users +# +# id :integer not null, primary key +# content :string +# created_at :datetime +# updated_at :datetime +# + class Sub1::User < ActiveRecord::Base end diff --git a/spec/integration/rails_4.2.0/app/models/task.rb b/spec/integration/rails_4.2.0/app/models/task.rb index 8c3a936f8..00d025948 100644 --- a/spec/integration/rails_4.2.0/app/models/task.rb +++ b/spec/integration/rails_4.2.0/app/models/task.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: tasks +# +# id :integer not null, primary key +# content :string +# count :integer default(0) +# status :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# + class Task < ActiveRecord::Base enum status: %w(normal active completed) end diff --git a/spec/integration/rails_4.2.0/db/migrate/20140526224112_create_tasks.rb b/spec/integration/rails_4.2.0/db/migrate/20140526224112_create_tasks.rb index 899822d2b..254b338c7 100644 --- a/spec/integration/rails_4.2.0/db/migrate/20140526224112_create_tasks.rb +++ b/spec/integration/rails_4.2.0/db/migrate/20140526224112_create_tasks.rb @@ -2,7 +2,8 @@ class CreateTasks < ActiveRecord::Migration def change create_table :tasks do |t| t.string :content - t.column :status, :default => 0 + t.integer :count, default: 0 + t.boolean :status, default: 0 t.timestamps end end diff --git a/spec/integration/rails_4.2.0/db/schema.rb b/spec/integration/rails_4.2.0/db/schema.rb index e36cb480b..9995e7522 100644 --- a/spec/integration/rails_4.2.0/db/schema.rb +++ b/spec/integration/rails_4.2.0/db/schema.rb @@ -13,19 +13,21 @@ ActiveRecord::Schema.define(version: 20140705000010) do - create_table "events", force: true do |t| + create_table "events", force: :cascade do |t| t.string "content" t.datetime "created_at" t.datetime "updated_at" end - create_table "tasks", force: true do |t| + create_table "tasks", force: :cascade do |t| t.string "content" + t.integer "count", default: 0 + t.boolean "status", default: false t.datetime "created_at" t.datetime "updated_at" end - create_table "users", force: true do |t| + create_table "users", force: :cascade do |t| t.string "content" t.datetime "created_at" t.datetime "updated_at" diff --git a/spec/integration/rails_4.2.0/test/models/task_test.rb b/spec/integration/rails_4.2.0/test/models/task_test.rb index b667a66cc..6fc0835ae 100644 --- a/spec/integration/rails_4.2.0/test/models/task_test.rb +++ b/spec/integration/rails_4.2.0/test/models/task_test.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: tasks +# +# id :integer not null, primary key +# content :string +# count :integer default(0) +# status :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# + require 'test_helper' class TaskTest < ActiveSupport::TestCase