schema_plus_core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +18 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +434 -0
  7. data/Rakefile +9 -0
  8. data/gemfiles/Gemfile.base +4 -0
  9. data/gemfiles/activerecord-4.2/Gemfile.base +3 -0
  10. data/gemfiles/activerecord-4.2/Gemfile.mysql2 +10 -0
  11. data/gemfiles/activerecord-4.2/Gemfile.postgresql +10 -0
  12. data/gemfiles/activerecord-4.2/Gemfile.sqlite3 +10 -0
  13. data/lib/schema_plus/core.rb +27 -0
  14. data/lib/schema_plus/core/active_record/base.rb +22 -0
  15. data/lib/schema_plus/core/active_record/connection_adapters/abstract_adapter.rb +43 -0
  16. data/lib/schema_plus/core/active_record/connection_adapters/abstract_mysql_adapter.rb +17 -0
  17. data/lib/schema_plus/core/active_record/connection_adapters/mysql2_adapter.rb +64 -0
  18. data/lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb +46 -0
  19. data/lib/schema_plus/core/active_record/connection_adapters/sqlite3_adapter.rb +43 -0
  20. data/lib/schema_plus/core/active_record/connection_adapters/table_definition.rb +36 -0
  21. data/lib/schema_plus/core/active_record/migration/command_recorder.rb +16 -0
  22. data/lib/schema_plus/core/active_record/schema_dumper.rb +102 -0
  23. data/lib/schema_plus/core/middleware.rb +71 -0
  24. data/lib/schema_plus/core/schema_dump.rb +123 -0
  25. data/lib/schema_plus/core/sql_struct.rb +30 -0
  26. data/lib/schema_plus/core/version.rb +5 -0
  27. data/schema_dev.yml +8 -0
  28. data/schema_plus_core.gemspec +31 -0
  29. data/spec/dumper_spec.rb +53 -0
  30. data/spec/middleware_spec.rb +175 -0
  31. data/spec/spec_helper.rb +35 -0
  32. data/spec/sql_struct_spec.rb +29 -0
  33. data/spec/support/enableable.rb +30 -0
  34. data/spec/support/test_dumper.rb +42 -0
  35. data/spec/support/test_reporter.rb +57 -0
  36. metadata +212 -0
@@ -0,0 +1,35 @@
1
+ require 'simplecov'
2
+ require 'simplecov-gem-profile'
3
+ SimpleCov.start "gem"
4
+
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+
8
+ require 'rspec'
9
+ require 'rspec/given'
10
+ require 'active_record'
11
+ require 'schema_plus/core'
12
+ require 'schema_dev/rspec'
13
+
14
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
15
+
16
+ SchemaDev::Rspec.setup
17
+
18
+ RSpec.configure do |config|
19
+ config.warnings = true
20
+ config.around(:each) do |example|
21
+ ActiveRecord::Migration.suppress_messages do
22
+ begin
23
+ example.run
24
+ ensure
25
+ ActiveRecord::Base.connection.tables.each do |table|
26
+ ActiveRecord::Migration.drop_table table, force: :cascade
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ SimpleCov.command_name "[ruby #{RUBY_VERSION} - ActiveRecord #{::ActiveRecord::VERSION::STRING} - #{ActiveRecord::Base.connection.adapter_name}]"
35
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe SchemaPlus::Core::SqlStruct do
4
+
5
+ describe SchemaPlus::Core::SqlStruct::Table do
6
+
7
+ Given(:struct) { described_class.new }
8
+
9
+ When { struct.parse! sql }
10
+
11
+ Invariant { expect(struct.assemble).to eq sql }
12
+
13
+ context "with options (mysql syntax)" do
14
+ Given(:sql) { %q<CREATE TABLE `things` (`id` int(11) auto_increment PRIMARY KEY, `column` int(11), INDEX `index_things_on_column` (`column`) ) ENGINE=InnoDB> }
15
+ Then { expect(struct.command).to eq "CREATE TABLE" }
16
+ Then { expect(struct.name).to eq "things" }
17
+ Then { expect(struct.options).to eq "ENGINE=InnoDB" }
18
+ end
19
+
20
+ context "temporary table (sqlite3 syntax)" do
21
+ Given(:sql) { %q<CREATE TEMPORARY TABLE "athings" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "column1" integer)> }
22
+ Then { expect(struct.command).to eq "CREATE TEMPORARY TABLE" }
23
+ Then { expect(struct.name).to eq "athings" }
24
+ Then { expect(struct.options).to be_blank }
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,30 @@
1
+ module Enableable
2
+
3
+ def enabled_middleware(root, env)
4
+ middleware = self.singleton_class.ancestors.find(&it.to_s.start_with?("#{root}::Middleware"))
5
+ return nil unless middleware.enabled?(env)
6
+ middleware.disable
7
+ middleware
8
+ end
9
+
10
+ def self.included(base)
11
+ base.module_eval do
12
+ def self.enable(condition = true)
13
+ @enabled = condition
14
+ end
15
+ def self.enabled?(env)
16
+ case @enabled
17
+ when Proc then @enabled.call(env)
18
+ else @enabled
19
+ end
20
+ end
21
+ def self.disable
22
+ @enabled = false
23
+ end
24
+
25
+ disable
26
+ end
27
+ end
28
+ end
29
+
30
+
@@ -0,0 +1,42 @@
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)
@@ -0,0 +1,57 @@
1
+ module TestReporter
2
+
3
+ class Called < Exception
4
+ attr_accessor :middleware, :env
5
+ def initialize(middleware:, env:)
6
+ @middleware = middleware
7
+ @env = env
8
+ end
9
+ end
10
+
11
+ module Notify
12
+ def self.included(base)
13
+ base.send :include, Enableable
14
+ end
15
+
16
+ def after(env)
17
+ return unless middleware = enabled_middleware(TestReporter, env)
18
+ raise Called, middleware: middleware, env: env
19
+ end
20
+ end
21
+
22
+ module Middleware
23
+ module Query
24
+ module Exec ; include Notify ; end
25
+ end
26
+
27
+ module Schema
28
+ module Tables ; include Notify ; end
29
+ module Indexes ; include Notify ; end
30
+ end
31
+
32
+ module Migration
33
+ module Column ; include Notify ; end
34
+ module Index ; include Notify ; end
35
+ end
36
+
37
+ module Sql
38
+ module ColumnOptions ; include Notify ; end
39
+ module IndexComponents ; include Notify ; end
40
+ module Table ; include Notify ; end
41
+ end
42
+
43
+ module Model
44
+ module Columns ; include Notify ; end
45
+ module ResetColumnInformation ; include Notify ; end
46
+ end
47
+
48
+ module Dumper
49
+ module Initial ; include Notify ; end
50
+ module Tables ; include Notify ; end
51
+ module Table ; include Notify ; end
52
+ module Indexes ; include Notify ; end
53
+ end
54
+ end
55
+ end
56
+
57
+ SchemaMonkey.register(TestReporter)
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schema_plus_core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ronen barzel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: schema_monkey
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-given
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'
97
+ - !ruby/object:Gem::Dependency
98
+ name: schema_dev
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov-gem-profile
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Provides an internal extension API to ActiveRecord, in the form of middleware-style
140
+ callback stacks
141
+ email:
142
+ - ronen@barzel.org
143
+ executables: []
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".travis.yml"
149
+ - Gemfile
150
+ - LICENSE.txt
151
+ - README.md
152
+ - Rakefile
153
+ - gemfiles/Gemfile.base
154
+ - gemfiles/activerecord-4.2/Gemfile.base
155
+ - gemfiles/activerecord-4.2/Gemfile.mysql2
156
+ - gemfiles/activerecord-4.2/Gemfile.postgresql
157
+ - gemfiles/activerecord-4.2/Gemfile.sqlite3
158
+ - lib/schema_plus/core.rb
159
+ - lib/schema_plus/core/active_record/base.rb
160
+ - lib/schema_plus/core/active_record/connection_adapters/abstract_adapter.rb
161
+ - lib/schema_plus/core/active_record/connection_adapters/abstract_mysql_adapter.rb
162
+ - lib/schema_plus/core/active_record/connection_adapters/mysql2_adapter.rb
163
+ - lib/schema_plus/core/active_record/connection_adapters/postgresql_adapter.rb
164
+ - lib/schema_plus/core/active_record/connection_adapters/sqlite3_adapter.rb
165
+ - lib/schema_plus/core/active_record/connection_adapters/table_definition.rb
166
+ - lib/schema_plus/core/active_record/migration/command_recorder.rb
167
+ - lib/schema_plus/core/active_record/schema_dumper.rb
168
+ - lib/schema_plus/core/middleware.rb
169
+ - lib/schema_plus/core/schema_dump.rb
170
+ - lib/schema_plus/core/sql_struct.rb
171
+ - lib/schema_plus/core/version.rb
172
+ - schema_dev.yml
173
+ - schema_plus_core.gemspec
174
+ - spec/dumper_spec.rb
175
+ - spec/middleware_spec.rb
176
+ - spec/spec_helper.rb
177
+ - spec/sql_struct_spec.rb
178
+ - spec/support/enableable.rb
179
+ - spec/support/test_dumper.rb
180
+ - spec/support/test_reporter.rb
181
+ homepage: https://github.com/SchemaPlus/schema_plus_core
182
+ licenses:
183
+ - MIT
184
+ metadata: {}
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.2.2
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: Provides an internal extension API to ActiveRecord
205
+ test_files:
206
+ - spec/dumper_spec.rb
207
+ - spec/middleware_spec.rb
208
+ - spec/spec_helper.rb
209
+ - spec/sql_struct_spec.rb
210
+ - spec/support/enableable.rb
211
+ - spec/support/test_dumper.rb
212
+ - spec/support/test_reporter.rb