migration_comments 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +27 -0
  4. data/README.rdoc +12 -3
  5. data/Rakefile +24 -0
  6. data/docker-compose.yml +12 -0
  7. data/gemfiles/rails4.gemfile +4 -0
  8. data/gemfiles/rails5.gemfile +4 -0
  9. data/lib/migration_comments.rb +12 -40
  10. data/lib/migration_comments/active_record/connection_adapters/abstract_adapter.rb +1 -10
  11. data/lib/migration_comments/active_record/connection_adapters/abstract_adapter/schema_creation.rb +22 -25
  12. data/lib/migration_comments/active_record/connection_adapters/alter_table.rb +5 -10
  13. data/lib/migration_comments/active_record/connection_adapters/column.rb +1 -5
  14. data/lib/migration_comments/active_record/connection_adapters/comment_definition.rb +1 -9
  15. data/lib/migration_comments/active_record/connection_adapters/mysql2_adapter.rb +97 -3
  16. data/lib/migration_comments/active_record/connection_adapters/postgresql_adapter.rb +19 -22
  17. data/lib/migration_comments/active_record/connection_adapters/sqlite3_adapter.rb +73 -46
  18. data/lib/migration_comments/active_record/connection_adapters/table.rb +3 -3
  19. data/lib/migration_comments/active_record/connection_adapters/table_definition.rb +9 -18
  20. data/lib/migration_comments/active_record/schema_dumper.rb +6 -10
  21. data/lib/migration_comments/annotate_models.rb +6 -8
  22. data/lib/migration_comments/schema_formatter.rb +8 -1
  23. data/lib/migration_comments/version.rb +1 -1
  24. data/migration_comments.gemspec +3 -10
  25. data/test/add_comments_test.rb +43 -2
  26. data/test/annotate_models_test.rb +6 -4
  27. data/test/auto_increment_test.rb +39 -9
  28. data/test/config/database.yml +2 -2
  29. data/test/primary_uuid_test.rb +27 -0
  30. data/test/schema_dumper_test.rb +35 -11
  31. data/test/test_helper.rb +8 -1
  32. metadata +34 -11
  33. data/lib/migration_comments/active_record/connection_adapters/abstract_sqlite_adapter.rb +0 -85
  34. data/lib/migration_comments/active_record/connection_adapters/mysql_adapter.rb +0 -107
  35. data/lib/migration_comments/active_record/connection_adapters/sqlite_adapter.rb +0 -71
@@ -6,7 +6,7 @@ class Sample < ActiveRecord::Base
6
6
  self.table_name = 'sample'
7
7
  end
8
8
 
9
- class AnnotateModelsTest < Minitest::Unit::TestCase
9
+ class AnnotateModelsTest < Minitest::Test
10
10
  include TestHelper
11
11
 
12
12
  TEST_PREFIX = "== Schema Information"
@@ -19,17 +19,19 @@ class AnnotateModelsTest < Minitest::Unit::TestCase
19
19
  end
20
20
 
21
21
  result = AnnotateModels.get_schema_info(Sample, TEST_PREFIX)
22
+
23
+ string_token = ENV['DB'] == 'mysql' ? ':string(255)' : ':string '
24
+
22
25
  expected = <<EOS
23
26
  # #{TEST_PREFIX}
24
27
  #
25
28
  # Table name: sample # a table comment
26
29
  #
27
30
  # id :integer not null, primary key
28
- # field1 :string(255) # a "comment" \\ that ' needs; escaping''
31
+ # field1 #{string_token} # a "comment" \\ that ' needs; escaping''
29
32
  # field2 :integer
30
- # field3 :string(255) default(""), not null # third column comment
33
+ # field3 #{string_token} default(""), not null # third column comment
31
34
  #
32
-
33
35
  EOS
34
36
  assert_equal expected, result
35
37
  end
@@ -4,14 +4,14 @@ class Sample < ActiveRecord::Base
4
4
  self.table_name = 'sample'
5
5
  end
6
6
 
7
- class AutoIncrementTest < Minitest::Unit::TestCase
7
+ class AutoIncrementTest < Minitest::Test
8
8
  include TestHelper
9
9
 
10
10
  def test_basic_table_creation
11
11
  assert_auto_increments
12
12
  end
13
13
 
14
- def test_modified_primary_key
14
+ def test_modified_primary_key_with_auto_increment
15
15
  comment_text = "a comment on the sample table in the primary_key field"
16
16
  result_comment = nil
17
17
  ActiveRecord::Schema.define do
@@ -22,16 +22,38 @@ class AutoIncrementTest < Minitest::Unit::TestCase
22
22
  assert_equal comment_text, result_comment
23
23
  end
24
24
 
25
+ def test_modified_primary_key_without_auto_increment
26
+ comment_text = "a comment on the sample table in the primary_key field"
27
+ result_comment = nil
28
+ ActiveRecord::Schema.define do
29
+ change_column :sample, :id, :integer, auto_increment: false
30
+ set_column_comment :sample, :id, comment_text
31
+ result_comment = retrieve_column_comment :sample, :id
32
+ end
33
+ assert_does_not_auto_increment
34
+ assert_equal comment_text, result_comment
35
+ end
36
+
25
37
  private
38
+
39
+ def assert_does_not_auto_increment
40
+ if ENV['DB'] == 'mysql'
41
+ extra = extract_extra_attributes('id')
42
+ refute_match(/auto_increment/i, extra)
43
+ end
44
+
45
+ id = nil
46
+ ActiveRecord::Base.connection.instance_eval do
47
+ execute "INSERT INTO #{quote_table_name :sample} (#{quote_column_name :id}, #{quote_column_name :field1}, #{quote_column_name :field2}) VALUES (15, 'text3', 11)"
48
+ id = select_value("SELECT #{quote_column_name :id} FROM #{quote_table_name :sample}").to_i
49
+ end
50
+ assert_equal 15, id
51
+ end
52
+
26
53
  def assert_auto_increments
27
54
  if ENV['DB'] == 'mysql'
28
- extra = nil
29
- ActiveRecord::Base.connection.instance_eval do
30
- execute_and_free("SHOW FULL FIELDS FROM #{quote_table_name :sample}") do |result|
31
- extra = each_hash(result).detect{|field| field[:Field] == 'id'}[:Extra]
32
- end
33
- end
34
- assert_match /auto_increment/i, extra
55
+ extra = extract_extra_attributes('id')
56
+ assert_match(/auto_increment/i, extra)
35
57
  end
36
58
 
37
59
  ids = []
@@ -45,4 +67,12 @@ class AutoIncrementTest < Minitest::Unit::TestCase
45
67
 
46
68
  assert_equal Sample.count, 3
47
69
  end
70
+
71
+ def extract_extra_attributes(field_name)
72
+ ActiveRecord::Base.connection.instance_eval do
73
+ execute_and_free("SHOW FULL FIELDS FROM #{quote_table_name :sample}") do |result|
74
+ each_hash(result).detect{|field| field[:Field] == field_name}[:Extra]
75
+ end
76
+ end
77
+ end
48
78
  end
@@ -8,8 +8,8 @@ postgres:
8
8
  mysql:
9
9
  adapter: mysql2
10
10
  database: migration_comments_test
11
- user: root
12
- password: password
11
+ username: root
12
+ password:
13
13
 
14
14
  sqlite:
15
15
  adapter: sqlite3
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class PrimaryUuidTest < Minitest::Test
4
+ include TestHelper
5
+
6
+ class Sample2 < ActiveRecord::Base
7
+ self.table_name = 'sample2'
8
+ end
9
+
10
+ def test_rails_4_uuid
11
+ return unless ENV['DB'] == 'postgres'
12
+ uuid = nil
13
+ ActiveRecord::Schema.define do
14
+ begin
15
+ enable_extension 'uuid-ossp'
16
+ create_table :sample2, id: :uuid do |t|
17
+ t.integer :field1
18
+ t.string :field2
19
+ end
20
+ uuid = Sample2.create(field1: 1, field2: 'foo').id
21
+ ensure
22
+ drop_table :sample2 rescue nil
23
+ end
24
+ end
25
+ assert_match /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/i, uuid
26
+ end
27
+ end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), 'test_helper')
2
2
 
3
- class SchemaDumperTest < Minitest::Unit::TestCase
3
+ class SchemaDumperTest < Minitest::Test
4
4
  include TestHelper
5
5
  include MigrationComments::SchemaFormatter
6
6
 
@@ -14,14 +14,32 @@ class SchemaDumperTest < Minitest::Unit::TestCase
14
14
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, dest)
15
15
  dest.rewind
16
16
  result = dest.read
17
- expected = <<EOS
18
- create_table "sample", #{render_kv_pair(:force, true)}, #{render_kv_pair(:comment, "a table comment")} do |t|
19
- t.string "field1", __SPACES__#{render_kv_pair(:comment, %{a \"comment\" \\ that ' needs; escaping''})}
17
+ expected = if ENV['DB'] == 'mysql' && ::ActiveRecord::VERSION::MAJOR >= 5
18
+ <<-EOS
19
+ create_table "sample", force: :cascade, options: __OPTIONS__, comment: "a table comment" do |t|
20
+ t.string "field1", #{render_kv_pair(:comment, %{a \"comment\" \\ that ' needs; escaping''})}
20
21
  t.integer "field2"
21
22
  t.string "field3", #{render_kv_pair(:default, "")}, #{render_kv_pair(:null, false)}, #{render_kv_pair(:comment, "third column comment")}
22
23
  end
23
- EOS
24
- assert_match /#{Regexp.escape(expected).gsub(/__SPACES__/, " +")}/, result
24
+ EOS
25
+ elsif ENV['DB'] == 'mysql'
26
+ <<-EOS
27
+ create_table "sample", force: :cascade, comment: "a table comment" do |t|
28
+ t.string "field1", #{render_kv_pair(:limit, 255)}, #{render_kv_pair(:comment, %{a \"comment\" \\ that ' needs; escaping''})}
29
+ t.integer "field2", #{render_kv_pair(:limit, 4)}
30
+ t.string "field3", #{render_kv_pair(:limit, 255)}, #{render_kv_pair(:default, "")}, #{render_kv_pair(:null, false)}, #{render_kv_pair(:comment, "third column comment")}
31
+ end
32
+ EOS
33
+ else
34
+ <<-EOS
35
+ create_table "sample", force: :cascade, comment: "a table comment" do |t|
36
+ t.string "field1", #{render_kv_pair(:comment, %{a \"comment\" \\ that ' needs; escaping''})}
37
+ t.integer "field2"
38
+ t.string "field3", #{render_kv_pair(:default, "")}, #{render_kv_pair(:null, false)}, #{render_kv_pair(:comment, "third column comment")}
39
+ end
40
+ EOS
41
+ end
42
+ assert_match(/#{Regexp.escape(expected).gsub(/__OPTIONS__/, %Q("ENGINE=InnoDB[^"]*"))}/, result)
25
43
  end
26
44
 
27
45
  def test_dump_with_no_columns
@@ -34,12 +52,18 @@ EOS
34
52
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, dest)
35
53
  dest.rewind
36
54
  result = dest.read
37
- expected = <<EOS
38
- create_table "sample", #{render_kv_pair(:force, true)}, #{render_kv_pair(:comment, "a table comment")} do |t|
55
+ expected = if ENV['DB'] == 'mysql' && ::ActiveRecord::VERSION::MAJOR >= 5
56
+ <<-EOS
57
+ create_table "sample", force: :cascade, options: __OPTIONS__, comment: "a table comment" do |t|
58
+ EOS
59
+ else
60
+ <<-EOS
61
+ create_table "sample", force: :cascade, comment: "a table comment" do |t|
39
62
  end
40
- EOS
63
+ EOS
64
+ end
41
65
 
42
- assert_match /#{Regexp.escape expected}/, result
66
+ assert_match(/#{Regexp.escape(expected).gsub(/__OPTIONS__/, %Q("ENGINE=InnoDB[^"]*"))}/, result)
43
67
  end
44
68
 
45
69
  def test_schema_dump_with_custom_type_error_for_pg
@@ -62,6 +86,6 @@ EOS
62
86
  # Unknown type 'my_custom_type' for column 'field2'
63
87
  EOS
64
88
 
65
- assert_match /#{Regexp.escape expected}/, result
89
+ assert_match(/#{Regexp.escape expected}/, result)
66
90
  end
67
91
  end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'minitest/autorun'
2
2
 
3
3
  require 'rubygems'
4
- gem 'activerecord', '>= 2.3.2'
4
+ gem 'activerecord', '>= 4.2.0'
5
5
  require 'active_record'
6
6
  require 'yaml'
7
7
 
@@ -9,6 +9,13 @@ CONFIGURATIONS = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'config/da
9
9
 
10
10
  ENV['DB'] ||= 'postgres' # override as needed
11
11
 
12
+ if ENV['DEBUG']
13
+ require 'minitest/byebug'
14
+ else
15
+ ActiveRecord::Migration.verbose = false
16
+ $VERBOSE=false
17
+ end
18
+
12
19
  ActiveRecord::Base.establish_connection(CONFIGURATIONS[ENV['DB']])
13
20
 
14
21
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: migration_comments
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pinny
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-08 00:00:00.000000000 Z
11
+ date: 2016-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.3.2
19
+ version: 4.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.3.2
26
+ version: 4.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: annotate
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.5.0
33
+ version: 2.7.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.5.0
40
+ version: 2.7.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pg
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Add schema comments in your migrations, see them in model annotations
84
98
  and db/schema.rb dump
85
99
  email:
@@ -89,23 +103,24 @@ extensions: []
89
103
  extra_rdoc_files: []
90
104
  files:
91
105
  - ".gitignore"
106
+ - ".travis.yml"
92
107
  - Gemfile
93
108
  - MIT-LICENSE
94
109
  - README.rdoc
95
110
  - Rakefile
111
+ - docker-compose.yml
112
+ - gemfiles/rails4.gemfile
113
+ - gemfiles/rails5.gemfile
96
114
  - lib/migration_comments.rb
97
115
  - lib/migration_comments/active_record/connection_adapters/abstract_adapter.rb
98
116
  - lib/migration_comments/active_record/connection_adapters/abstract_adapter/schema_creation.rb
99
- - lib/migration_comments/active_record/connection_adapters/abstract_sqlite_adapter.rb
100
117
  - lib/migration_comments/active_record/connection_adapters/alter_table.rb
101
118
  - lib/migration_comments/active_record/connection_adapters/column.rb
102
119
  - lib/migration_comments/active_record/connection_adapters/column_definition.rb
103
120
  - lib/migration_comments/active_record/connection_adapters/comment_definition.rb
104
121
  - lib/migration_comments/active_record/connection_adapters/mysql2_adapter.rb
105
- - lib/migration_comments/active_record/connection_adapters/mysql_adapter.rb
106
122
  - lib/migration_comments/active_record/connection_adapters/postgresql_adapter.rb
107
123
  - lib/migration_comments/active_record/connection_adapters/sqlite3_adapter.rb
108
- - lib/migration_comments/active_record/connection_adapters/sqlite_adapter.rb
109
124
  - lib/migration_comments/active_record/connection_adapters/table.rb
110
125
  - lib/migration_comments/active_record/connection_adapters/table_definition.rb
111
126
  - lib/migration_comments/active_record/schema_dumper.rb
@@ -117,6 +132,7 @@ files:
117
132
  - test/annotate_models_test.rb
118
133
  - test/auto_increment_test.rb
119
134
  - test/config/database.yml
135
+ - test/primary_uuid_test.rb
120
136
  - test/schema_dumper_test.rb
121
137
  - test/test_helper.rb
122
138
  homepage: https://github.com/pinnymz/migration_comments
@@ -138,8 +154,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
154
  version: '0'
139
155
  requirements: []
140
156
  rubyforge_project: migration_comments
141
- rubygems_version: 2.2.2
157
+ rubygems_version: 2.4.5.1
142
158
  signing_key:
143
159
  specification_version: 4
144
160
  summary: Comments for your migrations
145
- test_files: []
161
+ test_files:
162
+ - test/add_comments_test.rb
163
+ - test/annotate_models_test.rb
164
+ - test/auto_increment_test.rb
165
+ - test/config/database.yml
166
+ - test/primary_uuid_test.rb
167
+ - test/schema_dumper_test.rb
168
+ - test/test_helper.rb
@@ -1,85 +0,0 @@
1
- module MigrationComments::ActiveRecord::ConnectionAdapters
2
- module AbstractSQLiteAdapter
3
- def comments_supported?
4
- true
5
- end
6
-
7
- def inline_comments?
8
- true
9
- end
10
-
11
- def set_table_comment(table_name, comment_text)
12
- alter_table(table_name, :comment => comment_text)
13
- end
14
-
15
- def set_column_comment(table_name, column_name, comment_text)
16
- sql_type = primary_key(table_name) == column_name.to_s ?
17
- :primary_key :
18
- column_for(table_name, column_name).sql_type
19
- change_column table_name, column_name, sql_type, :comment => comment_text
20
- end
21
-
22
- def retrieve_table_comment(table_name)
23
- result = select_rows(lookup_comment_sql(table_name))
24
- if result[0][0] =~ /CREATE (?:TEMPORARY )?TABLE #{quote_table_name table_name} [^\(]*\/\*(.*)\*\/ \(/
25
- $1
26
- end
27
- end
28
-
29
- def retrieve_column_comments(table_name, *column_names)
30
- if column_names.empty?
31
- return columns(table_name).inject({}) { |m, v| m[v.name.to_sym] = v.comment if v.comment.present?; m }
32
- end
33
- result = select_rows(lookup_comment_sql(table_name))
34
- result[0][0] =~ /^CREATE (?:TEMPORARY )?TABLE "\w*" [^\(]*(?:\/\*.*\*\/ )?\((.*)\)[^\)]*$/
35
- col_defs = $1
36
- comment_matches = col_defs.scan(/"([^",]+)"[^,]*\/\*(.+?)\*\//)
37
- comment_matches.inject({}){|m, row| m[row.first.to_sym] = row.last; m}
38
- end
39
-
40
- def change_column_with_migration_comments(table_name, column_name, type, options = {}) #:nodoc:
41
- adapter = self
42
- alter_table(table_name) do |definition|
43
- include_default = options_include_default?(options)
44
- definition[column_name].instance_eval do
45
- self.type = type
46
- self.limit = options[:limit] if options.include?(:limit)
47
- self.default = options[:default] if include_default
48
- self.null = options[:null] if options.include?(:null)
49
- self.precision = options[:precision] if options.include?(:precision)
50
- self.scale = options[:scale] if options.include?(:scale)
51
- self.comment = CommentDefinition.new(adapter, table_name, column_name, options[:comment]) if options.include?(:comment)
52
- end
53
- end
54
- end
55
-
56
- def column_for(table_name, column_name)
57
- columns(table_name).detect{|col| col.name == column_name.to_s}
58
- end
59
-
60
- def comment_sql(comment_definition)
61
- if comment_definition.nil? || comment_definition.comment_text.blank?
62
- ""
63
- else
64
- " /*#{escaped_comment(comment_definition.comment_text)}*/"
65
- end
66
-
67
- end
68
-
69
- def add_column_options!(sql, options)
70
- super(sql, options)
71
- if options.keys.include?(:comment)
72
- sql << CommentDefinition.new(self, nil, nil, options[:comment]).to_sql
73
- end
74
- end
75
-
76
- private
77
- def escaped_comment(comment)
78
- comment.gsub(/\*\//, "*-/")
79
- end
80
-
81
- def lookup_comment_sql(table_name)
82
- "select sql from (select * from sqlite_master where type='table' union select * from sqlite_temp_master where type='table') where tbl_name = '#{table_name}'"
83
- end
84
- end
85
- end