schema_plus_core 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3806c727340fbe9c4e3d221bbe8b8e4108ff778
4
- data.tar.gz: 5cb2449c108f65e9dd358503962595d345b99751
3
+ metadata.gz: 52e38bdd3b1c4e571c13dd1622d788e26a7482d2
4
+ data.tar.gz: fc308fc51c0e41a39bab240d5cd398bad57973eb
5
5
  SHA512:
6
- metadata.gz: c5468384823546f1aac60cd719418f7e788dc18f2f50f1c5d9a69b79b93b118cdad1db8208c9c512557b9751a64fb6803a960c0b935caf9cf2f8f60f9828e2a4
7
- data.tar.gz: 057827181ff824af179a4e8581e24eda5b62982e75583b56e01e18355fef78338ffd7a8ac5a0af559b8adcb8a50ab0ced69e8158cc94bb458a42a3ef106f8049
6
+ metadata.gz: 1907077811c3f92a40bf70c99fb5a2a5fbcdb336238206d06e2eb4b841cc87dd9c992909e2eee89da7f5d9cf6a450d3ffd43f638fa019b288ffba26f40b334d9
7
+ data.tar.gz: 98f844ac096c11fb8f592ad9fdf9e2e2d4438a5293907943f181fcc77acee326fa4f066288911b56f45b51133a64f2131dcb0f81f91ee0ba2ab573604ab50261
data/README.md CHANGED
@@ -369,6 +369,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
369
369
  * `table.indexes = []` - an array of SchemaDump::Table::Index objects
370
370
  * `table.statements` - a collection of statements to include in the table definition; each is a string that should start with `"t."`
371
371
  * `table.trailer` - a collection of migration statements to include immediately outside the table definition. Each is a string
372
+ * `table.alt` - In some cases, ActiveRecord is unable to dump a table in the form of a migration `create_table` statement; in this case `table.pname` will be nil, and `table.alt` will contain the alternate string to dump instead. (E.g. if the table contains custom types, ActiveRecord will be unable to handle it and will just dump an error message as a comment.)
372
373
 
373
374
  * `Class SchemaPlus::Core::SchemaDump::Table::Column`
374
375
 
@@ -450,6 +451,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
450
451
 
451
452
  ## History
452
453
 
454
+ * 0.6.0 Added `table.alt` to dumper; Bug fix: Don't crash when AR fails to dump a table. Thanks to [@stenver](https://github.com/stenver) for tracking it down
453
455
  * 0.5.1 Bug fix: Don't choke on a quoted newline in a `CREATE TABLE` statement ([#3](https://github.com/SchemaPlus/schema_plus_core/pull/3)). Thanks to [@mikeauclair](https://github.com/mikeauclair)
454
456
  * 0.5.0 Added `Migration::DropTable`
455
457
  * 0.4.0 Added `implements_reference` to `Migration::Column` stack env
@@ -60,20 +60,24 @@ module SchemaPlus
60
60
  (?<trailer>.*)
61
61
  \Z
62
62
  }xm
63
- env.table.pname = m[:name]
64
- env.table.options = m[:options].strip
65
- env.table.trailer = m[:trailer].split("\n").map(&:strip).reject{|s| s.blank?}
66
- env.table.columns = m[:columns].strip.split("\n").map { |col|
67
- m = col.strip.match %r{
68
- ^
69
- t\.(?<type>\S+) \s*
70
- [:'"](?<name>[^"\s]+)[,"]? \s*
71
- ,? \s*
72
- (?<options>.*)
73
- $
74
- }x
75
- SchemaDump::Table::Column.new(name: m[:name], type: m[:type], options: m[:options])
76
- }
63
+ if m.nil?
64
+ env.table.alt = stream.string
65
+ else
66
+ env.table.pname = m[:name]
67
+ env.table.options = m[:options].strip
68
+ env.table.trailer = m[:trailer].split("\n").map(&:strip).reject{|s| s.blank?}
69
+ env.table.columns = m[:columns].strip.split("\n").map { |col|
70
+ m = col.strip.match %r{
71
+ ^
72
+ t\.(?<type>\S+) \s*
73
+ [:'"](?<name>[^"\s]+)[,"]? \s*
74
+ ,? \s*
75
+ (?<options>.*)
76
+ $
77
+ }x
78
+ SchemaDump::Table::Column.new(name: m[:name], type: m[:type], options: m[:options])
79
+ }
80
+ end
77
81
  end
78
82
  end
79
83
 
@@ -43,7 +43,7 @@ module SchemaPlus
43
43
  @dependencies[tablename].sort.uniq.reject{|t| @dumper.ignored? t}.each(&block)
44
44
  end
45
45
 
46
- class Table < KeyStruct[:name, :pname, :options, :columns, :indexes, :statements, :trailer]
46
+ class Table < KeyStruct[:name, :pname, :options, :columns, :indexes, :statements, :trailer, :alt]
47
47
  def initialize(*args)
48
48
  super
49
49
  self.columns ||= []
@@ -53,6 +53,11 @@ module SchemaPlus
53
53
  end
54
54
 
55
55
  def assemble(stream)
56
+ if pname.nil?
57
+ stream.puts alt
58
+ stream.puts ""
59
+ return
60
+ end
56
61
  stream.write " create_table #{pname.inspect}"
57
62
  stream.write ", #{options}" unless options.blank?
58
63
  stream.puts " do |t|"
@@ -1,5 +1,5 @@
1
1
  module SchemaPlus
2
2
  module Core
3
- VERSION = "0.5.1"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
data/spec/dumper_spec.rb CHANGED
@@ -1,9 +1,65 @@
1
1
  require 'spec_helper'
2
2
 
3
+ module TestDumper
4
+ module Middleware
5
+ module Dumper
6
+ module Initial
7
+ include Enableable
8
+ def after(env)
9
+ return unless middleware = enabled_middleware(TestDumper, env)
10
+ env.initial.unshift middleware.to_s
11
+ end
12
+ end
13
+ module Tables
14
+ include Enableable
15
+ def after(env)
16
+ return unless middleware = enabled_middleware(TestDumper, env)
17
+ env.dump.tables[middleware.to_s] = env.dump.tables.values.first.dup.tap {|t| t.pname = middleware.to_s }
18
+ env.dump.depends("things", middleware.to_s)
19
+ env.dump.depends(middleware.to_s, "other")
20
+ end
21
+ end
22
+ module Table
23
+ include Enableable
24
+ def after(env)
25
+ return unless middleware = enabled_middleware(TestDumper, env)
26
+ if column = env.table.columns.first
27
+ column.add_option "option: #{middleware}"
28
+ column.add_comment "comment: #{middleware}"
29
+ end
30
+ env.table.statements << "statement: #{middleware}"
31
+ env.table.trailer << "trailer: #{middleware}"
32
+ end
33
+ end
34
+ module Indexes
35
+ include Enableable
36
+ def after(env)
37
+ return unless env.table.indexes.any?
38
+ return unless middleware = enabled_middleware(TestDumper, env)
39
+ env.table.indexes.first.add_option middleware.to_s
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ SchemaMonkey.register(TestDumper)
47
+
3
48
  describe SchemaMonkey::Middleware::Dumper do
4
49
 
5
50
  let(:migration) { ::ActiveRecord::Migration }
6
51
 
52
+ TestCustomType = SchemaDev::Rspec::Helpers.postgresql?
53
+
54
+ around(:each) do |example|
55
+ begin
56
+ migration.execute "CREATE TYPE custom_type AS ENUM ('a', 'b')";
57
+ example.run
58
+ ensure
59
+ migration.execute "DROP TYPE IF EXISTS custom_type CASCADE";
60
+ end
61
+ end if TestCustomType
62
+
7
63
  before(:each) do
8
64
  migration.create_table "things" do |t|
9
65
  t.integer :column
@@ -13,6 +69,7 @@ describe SchemaMonkey::Middleware::Dumper do
13
69
  t.references :thing
14
70
  end
15
71
  migration.add_foreign_key("other", "things")
72
+ migration.execute "CREATE TABLE custom_table ( my_column custom_type DEFAULT 'a'::custom_type NOT NULL)" if TestCustomType
16
73
  end
17
74
 
18
75
  context TestDumper::Middleware::Dumper::Initial do
@@ -26,6 +83,7 @@ describe SchemaMonkey::Middleware::Dumper do
26
83
  context TestDumper::Middleware::Dumper::Table do
27
84
  Then { expect(dump).to match(/t[.]integer.*option: #{middleware} \# comment: #{middleware}/) }
28
85
  Then { expect(dump).to match(/statement: #{middleware}\s+end\s+(add_index.*)?\s+trailer: #{middleware}/) }
86
+ Then { expect(dump).to match(/could not dump table.*custom_table.*unknown type.*custom_type/mi) } if TestCustomType
29
87
  end
30
88
 
31
89
  context TestDumper::Middleware::Dumper::Indexes do
@@ -41,7 +99,7 @@ describe SchemaMonkey::Middleware::Dumper do
41
99
 
42
100
  def dump
43
101
  begin
44
- middleware.enable
102
+ middleware.enable once:false
45
103
  stream = StringIO.new
46
104
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
47
105
  return stream.string
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_plus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ronen barzel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-14 00:00:00.000000000 Z
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -178,7 +178,6 @@ files:
178
178
  - spec/spec_helper.rb
179
179
  - spec/sql_struct_spec.rb
180
180
  - spec/support/enableable.rb
181
- - spec/support/test_dumper.rb
182
181
  - spec/support/test_reporter.rb
183
182
  homepage: https://github.com/SchemaPlus/schema_plus_core
184
183
  licenses:
@@ -211,5 +210,4 @@ test_files:
211
210
  - spec/spec_helper.rb
212
211
  - spec/sql_struct_spec.rb
213
212
  - spec/support/enableable.rb
214
- - spec/support/test_dumper.rb
215
213
  - spec/support/test_reporter.rb
@@ -1,42 +0,0 @@
1
- module TestDumper
2
- module Middleware
3
- module Dumper
4
- module Initial
5
- include Enableable
6
- def after(env)
7
- return unless middleware = enabled_middleware(TestDumper, env)
8
- env.initial.unshift middleware.to_s
9
- end
10
- end
11
- module Tables
12
- include Enableable
13
- def after(env)
14
- return unless middleware = enabled_middleware(TestDumper, env)
15
- env.dump.tables[middleware.to_s] = env.dump.tables.values.first.dup.tap {|t| t.pname = middleware.to_s }
16
- env.dump.depends("things", middleware.to_s)
17
- env.dump.depends(middleware.to_s, "other")
18
- end
19
- end
20
- module Table
21
- include Enableable
22
- def after(env)
23
- return unless middleware = enabled_middleware(TestDumper, env)
24
- env.table.columns.first.add_option "option: #{middleware}"
25
- env.table.columns.first.add_comment "comment: #{middleware}"
26
- env.table.statements << "statement: #{middleware}"
27
- env.table.trailer << "trailer: #{middleware}"
28
- end
29
- end
30
- module Indexes
31
- include Enableable
32
- def after(env)
33
- return unless env.table.indexes.any?
34
- return unless middleware = enabled_middleware(TestDumper, env)
35
- env.table.indexes.first.add_option middleware.to_s
36
- end
37
- end
38
- end
39
- end
40
- end
41
-
42
- SchemaMonkey.register(TestDumper)