declare_schema 0.6.0 → 0.6.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0c13793a5b263a2f1134ee19168a42ceb57c472cf8fb656b8e86fcdd9500b79
4
- data.tar.gz: ee92620b0a091538958957205ba940d97cd9f67bc606751cb52a8ae44370e541
3
+ metadata.gz: c0108465514c80103fc934c550e911b563d4f3ebe8a1ebfb3a95c7fa10ed3ee8
4
+ data.tar.gz: 60b586c698f62017311bef429896f79312314a61e918a1d6fb60dca60e4f6d15
5
5
  SHA512:
6
- metadata.gz: 3bc0e18dd1b3a998640cc2e983c86182e19b855d8ce42b3f7233b3471a7849d0dc28fa2653d110b42d0544c513267f8066386496b1469085bb507541c068b87a
7
- data.tar.gz: 34b9e31862291b85becf7eeb908c4ef1da5b29178b1ab387b35c6678680299cd921fa65b49e0ba89604518a66515092d3e7d6c38678267301c9399b4572d372e
6
+ metadata.gz: 2167096015bc12def6ed7f5ab3c45b1de223e79c9b3828d6a322c9a849d08534ac0551033058de9c6059733e344e7f9ab97ff152a11a67227e2490bc1726f022
7
+ data.tar.gz: 173f38d4d7f7aa50904422624ddcec7a65f6f2b5e534b3eab5dd6894056d6166859a332d8ad9f021d5cc14306a6c0503c6a0308491bd5cede23c01934bd7c488
@@ -10,13 +10,29 @@ jobs:
10
10
  strategy:
11
11
  matrix:
12
12
  ruby: [ 2.4.5, 2.5.8, 2.6.5, 2.7.1 ]
13
- gemfile: [ gemfiles/rails_4.gemfile, gemfiles/rails_5.gemfile, gemfiles/rails_6.gemfile ]
13
+ gemfile:
14
+ - gemfiles/rails_4_mysql.gemfile
15
+ - gemfiles/rails_4_sqlite.gemfile
16
+ - gemfiles/rails_5_mysql.gemfile
17
+ - gemfiles/rails_5_sqlite.gemfile
18
+ - gemfiles/rails_6_mysql.gemfile
19
+ - gemfiles/rails_6_sqlite.gemfile
14
20
  exclude:
15
- - { gemfile: gemfiles/rails_4.gemfile, ruby: 2.7.1 }
16
- - { gemfile: gemfiles/rails_5.gemfile, ruby: 2.4.5 }
17
- - { gemfile: gemfiles/rails_6.gemfile, ruby: 2.4.5 }
21
+ - { gemfile: gemfiles/rails_4_mysql.gemfile, ruby: 2.7.1 }
22
+ - { gemfile: gemfiles/rails_4_sqlite.gemfile, ruby: 2.7.1 }
23
+ - { gemfile: gemfiles/rails_5_mysql.gemfile, ruby: 2.4.5 }
24
+ - { gemfile: gemfiles/rails_5_sqlite.gemfile, ruby: 2.4.5 }
25
+ - { gemfile: gemfiles/rails_6_mysql.gemfile, ruby: 2.4.5 }
26
+ - { gemfile: gemfiles/rails_6_sqlite.gemfile, ruby: 2.4.5 }
18
27
  env:
19
28
  BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
29
+ services:
30
+ mysql:
31
+ image: mysql:5.7
32
+ env:
33
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
34
+ ports:
35
+ - 3306:3306
20
36
  steps:
21
37
  - name: Checkout Branch
22
38
  id: checkout_branch
@@ -40,5 +56,5 @@ jobs:
40
56
  bundle install --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle} --gemfile=${{ matrix.gemfile }}
41
57
  git config --global user.email "dummy@example.com"
42
58
  git config --global user.name "dummy"
43
- bundle exec rake test:prepare_testapp[force]
59
+ MYSQL_PORT=3306 bundle exec rake test:prepare_testapp[force]
44
60
  bundle exec rake test:all < test_responses.txt
data/Appraisals CHANGED
@@ -1,14 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise 'rails-4' do
3
+ appraise 'rails-4-sqlite' do
4
4
  gem 'rails', '~> 4.2'
5
5
  gem 'sqlite3', '~> 1.3.0'
6
6
  end
7
7
 
8
- appraise 'rails-5' do
8
+ appraise 'rails-4-mysql' do
9
+ gem 'rails', '~> 4.2'
10
+ gem 'mysql2'
11
+ end
12
+
13
+ appraise 'rails-5-sqlite' do
14
+ gem 'rails', '~> 5.2'
15
+ gem 'sqlite3'
16
+ end
17
+
18
+ appraise 'rails-5-mysql' do
9
19
  gem 'rails', '~> 5.2'
20
+ gem 'mysql2'
21
+ end
22
+
23
+ appraise 'rails-6-sqlite' do
24
+ gem 'rails', '~> 6.1'
25
+ gem 'sqlite3'
10
26
  end
11
27
 
12
- appraise 'rails-6' do
13
- gem 'rails', '~> 6.0'
28
+ appraise 'rails-6-mysql' do
29
+ gem 'rails', '~> 6.1'
30
+ gem 'mysql2'
14
31
  end
@@ -4,6 +4,14 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
5
  Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.6.1] - 2021-01-06
8
+ ### Added
9
+ - Added Appraisals for MySQL as well as SQLite.
10
+
11
+ ### Fixed
12
+ - Fixed case where primary key index will be gone by the time we get to dropping that primary key
13
+ because all of the existing primary key columns are being removed.
14
+
7
15
  ## [0.6.0] - 2020-12-23
8
16
  ### Added
9
17
  - Fields may now be declared with `:bigint` type which is identical to `:integer, limit 8`
@@ -84,6 +92,7 @@ using the appropriate Rails configuration attributes.
84
92
  ### Added
85
93
  - Initial version from https://github.com/Invoca/hobo_fields v4.1.0.
86
94
 
95
+ [0.6.1]: https://github.com/Invoca/declare_schema/compare/v0.6.0...v0.6.1
87
96
  [0.6.0]: https://github.com/Invoca/declare_schema/compare/v0.5.0...v0.6.0
88
97
  [0.5.0]: https://github.com/Invoca/declare_schema/compare/v0.4.2...v0.5.0
89
98
  [0.4.2]: https://github.com/Invoca/declare_schema/compare/v0.4.1...v0.4.2
data/Gemfile CHANGED
@@ -14,10 +14,8 @@ gem 'bundler', '< 2'
14
14
  gem "climate_control", '~> 0.2'
15
15
  gem 'pry'
16
16
  gem 'pry-byebug'
17
- gem 'mysql2'
18
17
  gem 'rails', '~> 5.2', '>= 5.2.4.3'
19
18
  gem 'responders'
20
19
  gem 'rspec'
21
20
  gem 'rubocop'
22
- gem 'sqlite3'
23
21
  gem 'yard'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- declare_schema (0.6.0)
4
+ declare_schema (0.6.1)
5
5
  rails (>= 4.2)
6
6
 
7
7
  GEM
@@ -85,7 +85,6 @@ GEM
85
85
  mini_portile2 (2.4.0)
86
86
  minitest (5.14.2)
87
87
  msgpack (1.3.3)
88
- mysql2 (0.5.3)
89
88
  nio4r (2.5.4)
90
89
  nokogiri (1.10.10)
91
90
  mini_portile2 (~> 2.4.0)
@@ -167,7 +166,6 @@ GEM
167
166
  actionpack (>= 4.0)
168
167
  activesupport (>= 4.0)
169
168
  sprockets (>= 3.0.0)
170
- sqlite3 (1.4.2)
171
169
  thor (1.0.1)
172
170
  thread_safe (0.3.6)
173
171
  tzinfo (1.2.7)
@@ -188,14 +186,12 @@ DEPENDENCIES
188
186
  climate_control (~> 0.2)
189
187
  declare_schema!
190
188
  listen
191
- mysql2
192
189
  pry
193
190
  pry-byebug
194
191
  rails (~> 5.2, >= 5.2.4.3)
195
192
  responders
196
193
  rspec
197
194
  rubocop
198
- sqlite3
199
195
  yard
200
196
 
201
197
  BUNDLED WITH
data/README.md CHANGED
@@ -94,7 +94,7 @@ turn all tables into `utf8mb4` supporting tables:
94
94
  # frozen_string_literal: true
95
95
 
96
96
  Generators::DeclareSchema::Migration::Migrator.default_charset = "utf8mb4"
97
- Generators::DeclareSchema::Migration::Migrator.default_collation = "utf8mb4_general"
97
+ Generators::DeclareSchema::Migration::Migrator.default_collation = "utf8mb4_bin"
98
98
  ```
99
99
 
100
100
  ### Table Configuration
@@ -109,7 +109,7 @@ like the following:
109
109
  # frozen_string_literal: true
110
110
 
111
111
  class Comment < ActiveRecord::Base
112
- fields charset: "utf8mb4", collation: "utf8mb4_general" do
112
+ fields charset: "utf8mb4", collation: "utf8mb4_bin" do
113
113
  subject :string, limit: 255
114
114
  content :text, limit: 0xffff_ffff
115
115
  end
@@ -131,7 +131,7 @@ look like the following:
131
131
  class Comment < ActiveRecord::Base
132
132
  fields do
133
133
  subject :string, limit: 255
134
- context :text, limit: 0xffff_ffff, charset: "utf8mb4", collation: "utf8mb4_general"
134
+ context :text, limit: 0xffff_ffff, charset: "utf8mb4", collation: "utf8mb4_bin"
135
135
  end
136
136
  end
137
137
  ```
data/Rakefile CHANGED
@@ -30,15 +30,28 @@ namespace "test" do
30
30
  if args.force || !File.directory?(TESTAPP_PATH)
31
31
  FileUtils.remove_entry_secure(TESTAPP_PATH, true)
32
32
  sh %(#{BIN} new #{TESTAPP_PATH} --skip-wizard --skip-bundle)
33
- FileUtils.chdir TESTAPP_PATH
33
+ FileUtils.chdir(TESTAPP_PATH)
34
+ begin
35
+ require 'mysql2'
36
+ if ENV['MYSQL_PORT']
37
+ sh "(echo 'H';
38
+ echo '1,$s/localhost/127.0.0.1/';
39
+ echo '/host:/';
40
+ echo 'a';
41
+ echo ' port: #{ENV['MYSQL_PORT']}';
42
+ echo '.';
43
+ echo w;
44
+ echo q) | ed #{TESTAPP_PATH}/config/database.yml || echo ed failed!"
45
+ end
46
+ rescue LoadError
47
+ end
34
48
  sh "bundle install"
35
49
  sh "(echo '';
36
- echo \"gem 'irt', :group => :development\";
37
- echo \"gem 'therubyracer'\";
38
- echo \"gem 'kramdown'\") > Gemfile"
50
+ echo \"gem 'irb', :group => :development\") >> Gemfile"
39
51
  sh "echo '' > app/models/.gitignore" # because git reset --hard would rm the dir
40
52
  rm ".gitignore" # we need to reset everything in a testapp
41
53
  sh "git init && git add . && git commit -m \"initial commit\""
54
+ sh "rake db:create"
42
55
  puts "The testapp has been created in '#{TESTAPP_PATH}'"
43
56
  else
44
57
  FileUtils.chdir(TESTAPP_PATH)
@@ -8,4 +8,4 @@ require_relative '../lib/declare_schema/version'
8
8
 
9
9
  ARGV.freeze
10
10
 
11
- DeclareSchema::Command.run(:DeclareSchema, ARGV.dup, DeclareSchema::VERSION)
11
+ DeclareSchema::Command.run('declare_schema', ARGV.dup, DeclareSchema::VERSION, path: File.expand_path('..', __dir__))
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.authors = ['Invoca Development adapted from hobo_fields by Tom Locke']
7
7
  s.email = 'development@invoca.com'
8
8
  s.homepage = 'https://github.com/Invoca/declare_schema'
9
- s.summary = 'Database migration generator for Rails'
9
+ s.summary = 'Database schema declaration and migration generator for Rails'
10
10
  s.description = 'Declare your Rails/active_record model schemas and have database migrations generated for you!'
11
11
  s.name = "declare_schema"
12
12
  s.version = DeclareSchema::VERSION
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "bundler", "< 2"
7
+ gem "climate_control", "~> 0.2"
8
+ gem "pry"
9
+ gem "pry-byebug"
10
+ gem "rails", "~> 4.2"
11
+ gem "responders"
12
+ gem "rspec"
13
+ gem "rubocop"
14
+ gem "yard"
15
+ gem "mysql2"
16
+
17
+ group :testapp do
18
+ gem "bootsnap", ">= 1.1.0", require: false
19
+ gem "listen"
20
+ end
21
+
22
+ gemspec path: "../"
@@ -7,13 +7,12 @@ gem "bundler", "< 2"
7
7
  gem "climate_control", "~> 0.2"
8
8
  gem "pry"
9
9
  gem "pry-byebug"
10
- gem "mysql2"
11
10
  gem "rails", "~> 4.2"
12
11
  gem "responders"
13
12
  gem "rspec"
14
13
  gem "rubocop"
15
- gem "sqlite3", "~> 1.3.0"
16
14
  gem "yard"
15
+ gem "sqlite3", "~> 1.3.0"
17
16
 
18
17
  group :testapp do
19
18
  gem "bootsnap", ">= 1.1.0", require: false
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "bundler", "< 2"
7
+ gem "climate_control", "~> 0.2"
8
+ gem "pry"
9
+ gem "pry-byebug"
10
+ gem "rails", "~> 5.2"
11
+ gem "responders"
12
+ gem "rspec"
13
+ gem "rubocop"
14
+ gem "yard"
15
+ gem "mysql2"
16
+
17
+ group :testapp do
18
+ gem "bootsnap", ">= 1.1.0", require: false
19
+ gem "listen"
20
+ end
21
+
22
+ gemspec path: "../"
@@ -7,13 +7,12 @@ gem "bundler", "< 2"
7
7
  gem "climate_control", "~> 0.2"
8
8
  gem "pry"
9
9
  gem "pry-byebug"
10
- gem "mysql2"
11
10
  gem "rails", "~> 5.2"
12
11
  gem "responders"
13
12
  gem "rspec"
14
13
  gem "rubocop"
15
- gem "sqlite3"
16
14
  gem "yard"
15
+ gem "sqlite3"
17
16
 
18
17
  group :testapp do
19
18
  gem "bootsnap", ">= 1.1.0", require: false
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "bundler", "< 2"
7
+ gem "climate_control", "~> 0.2"
8
+ gem "pry"
9
+ gem "pry-byebug"
10
+ gem "rails", "~> 6.1"
11
+ gem "responders"
12
+ gem "rspec"
13
+ gem "rubocop"
14
+ gem "yard"
15
+ gem "mysql2"
16
+
17
+ group :testapp do
18
+ gem "bootsnap", ">= 1.1.0", require: false
19
+ gem "listen"
20
+ end
21
+
22
+ gemspec path: "../"
@@ -7,13 +7,12 @@ gem "bundler", "< 2"
7
7
  gem "climate_control", "~> 0.2"
8
8
  gem "pry"
9
9
  gem "pry-byebug"
10
- gem "mysql2"
11
- gem "rails", "~> 6.0"
10
+ gem "rails", "~> 6.1"
12
11
  gem "responders"
13
12
  gem "rspec"
14
13
  gem "rubocop"
15
- gem "sqlite3"
16
14
  gem "yard"
15
+ gem "sqlite3"
17
16
 
18
17
  group :testapp do
19
18
  gem "bootsnap", ">= 1.1.0", require: false
@@ -16,7 +16,7 @@ module DeclareSchema
16
16
  EOS
17
17
 
18
18
  class << self
19
- def run(gem, args, version)
19
+ def run(gem, args, version, gemfile_options = {})
20
20
  command = args.shift
21
21
 
22
22
  case command
@@ -38,10 +38,17 @@ module DeclareSchema
38
38
  end
39
39
  template_path = File.join(Dir.tmpdir, "declare_schema_app_template")
40
40
  File.open(template_path, 'w') do |file|
41
- file.puts "gem '#{gem}', '>= #{version}'"
41
+ file.puts ["gem '#{gem}', '>= #{version}'", (gemfile_options.inspect unless gemfile_options.empty?)].compact.join(', ')
42
42
  end
43
43
  puts "Generating Rails infrastructure..."
44
- system("rails new #{app_name} #{args * ' '} -m #{template_path}")
44
+ database_option =
45
+ begin
46
+ require 'mysql2'
47
+ ' -d mysql'
48
+ rescue LoadError
49
+ end
50
+ puts("rails new #{app_name} #{args * ' '} -m #{template_path}#{database_option}")
51
+ system("rails new #{app_name} #{args * ' '} -m #{template_path}#{database_option}")
45
52
  File.delete(template_path)
46
53
 
47
54
  when /^(g|generate|destroy)$/
@@ -13,7 +13,6 @@ module DeclareSchema
13
13
  MYSQL_TEXT_LIMITS_ASCENDING = [MYSQL_TINYTEXT_LIMIT, MYSQL_TEXT_LIMIT, MYSQL_MEDIUMTEXT_LIMIT, MYSQL_LONGTEXT_LIMIT].freeze
14
14
 
15
15
  class << self
16
- # method for easy stubbing in tests
17
16
  def mysql_text_limits?
18
17
  if defined?(@mysql_text_limits)
19
18
  @mysql_text_limits
@@ -59,9 +58,14 @@ module DeclareSchema
59
58
  @options = options.merge(limit: 8)
60
59
  end
61
60
 
62
- unless type.in?([:text, :string])
63
- @options[:collation] and raise "collation may only given for :string and :text fields"
61
+ if type.in?([:text, :string])
62
+ if ActiveRecord::Base.connection.class.name.match?(/mysql/i)
63
+ @options[:charset] ||= model.table_options[:charset] || Generators::DeclareSchema::Migration::Migrator.default_charset
64
+ @options[:collation] ||= model.table_options[:collation] || Generators::DeclareSchema::Migration::Migrator.default_collation
65
+ end
66
+ else
64
67
  @options[:charset] and raise "charset may only given for :string and :text fields"
68
+ @options[:collation] and raise "collation may only given for :string and :text fields"
65
69
  end
66
70
  end
67
71
 
@@ -109,16 +113,12 @@ module DeclareSchema
109
113
  @options[:default]
110
114
  end
111
115
 
112
- def collation
113
- if ActiveRecord::Base.connection.class.name.match?(/mysql/i)
114
- (@options[:collation] || model.table_options[:collation] || Generators::DeclareSchema::Migration::Migrator.default_collation).to_s
115
- end
116
+ def charset
117
+ @options[:charset]
116
118
  end
117
119
 
118
- def charset
119
- if ActiveRecord::Base.connection.class.name.match?(/mysql/i)
120
- (@options[:charset] || model.table_options[:charset] || Generators::DeclareSchema::Migration::Migrator.default_charset).to_s
121
- end
120
+ def collation
121
+ @options[:collation]
122
122
  end
123
123
 
124
124
  def same_type?(col_spec)
@@ -26,12 +26,14 @@ module DeclareSchema
26
26
 
27
27
  def mysql_table_options(connection, table_name)
28
28
  database = connection.current_database
29
- defaults = connection.select_one(<<~EOS)
29
+ defaults = connection.select_one(<<~EOS) or raise "no defaults found for table #{table_name}"
30
30
  SELECT CCSA.character_set_name, CCSA.collation_name
31
- FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
32
- WHERE CCSA.collation_name = T.table_collation AND
33
- T.table_schema = '#{connection.quote_string(database)}' AND
34
- T.table_name = '#{connection.quote_string(table_name)}';
31
+ FROM information_schema.TABLES as T
32
+ JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY as CCSA
33
+ ON CCSA.collation_name = T.table_collation
34
+ WHERE
35
+ T.table_schema = '#{connection.quote_string(database)}' AND
36
+ T.table_name = '#{connection.quote_string(table_name)}'
35
37
  EOS
36
38
 
37
39
  defaults["character_set_name"] or raise "character_set_name missing from #{defaults.inspect}"
@@ -75,7 +77,7 @@ module DeclareSchema
75
77
  alias to_s settings
76
78
 
77
79
  def alter_table_statement
78
- statement = "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name)} #{to_s};"
80
+ statement = "ALTER TABLE #{ActiveRecord::Base.connection.quote_table_name(table_name)} #{to_s}"
79
81
  "execute #{statement.inspect}"
80
82
  end
81
83
  end