migration_comments 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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