scheman-rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +27 -0
- data/Rakefile +2 -0
- data/lib/scheman/rails.rb +9 -0
- data/lib/scheman/rails/commands/applier.rb +93 -0
- data/lib/scheman/rails/commands/base.rb +66 -0
- data/lib/scheman/rails/commands/dumper.rb +102 -0
- data/lib/scheman/rails/errors.rb +11 -0
- data/lib/scheman/rails/railtie.rb +9 -0
- data/lib/scheman/rails/tasks.rake +13 -0
- data/lib/scheman/rails/version.rb +5 -0
- data/scheman-rails.gemspec +27 -0
- data/spec/dummy/.gitignore +16 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +8 -0
- data/spec/dummy/bin/rake +8 -0
- data/spec/dummy/bin/spring +18 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +4 -0
- data/spec/dummy/config/database.yml +54 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +82 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.sql +1 -0
- data/spec/dummy/db/seeds.rb +7 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/lib/tasks/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/dummy/vendor/assets/javascripts/.keep +0 -0
- data/spec/dummy/vendor/assets/stylesheets/.keep +0 -0
- data/spec/spec_helper.rb +11 -0
- metadata +269 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b4ba8edf518b26826e1be2563823b2798d92bbdb
|
4
|
+
data.tar.gz: 93b9787e3189b2b519c380d15137f17ff4b1ec22
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 22bf05e8f53408ab2a6098cde714f7e7e09f75587c552115a61a36d0a1047d286d6c54dda76b88a3b2e2b0a923f28313d089c532891d0a17b46a4f3921c9a1ee
|
7
|
+
data.tar.gz: d6327c180d80638778c125e9e015c63316c2e674054ca7389477d120840a04ddf51debaad80297c16296e8a3010b5bc6f80a5f3e750dbf4d24ac3bb0f8ad312f
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Ryo Nakamura
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# Scheman::Rails
|
2
|
+
Rails plugin for Scheman.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
```ruby
|
6
|
+
# Gemfile
|
7
|
+
gem "scheman-rails"
|
8
|
+
```
|
9
|
+
|
10
|
+
```sh
|
11
|
+
# Write your database schema into db/schema.sql
|
12
|
+
$ echo '
|
13
|
+
CREATE TABLE `users` (
|
14
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
15
|
+
`name` varchar(255) NOT NULL,
|
16
|
+
`created_at` datetime DEFAULT NULL,
|
17
|
+
`updated_at` datetime DEFAULT NULL,
|
18
|
+
PRIMARY KEY (`id`)
|
19
|
+
);
|
20
|
+
' > db/schema.sql
|
21
|
+
|
22
|
+
# Show diff between the current database schema and db/schema.sql
|
23
|
+
$ rake db:schema:diff
|
24
|
+
|
25
|
+
# Apply diff
|
26
|
+
$ rake db:schema:apply
|
27
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
module Scheman
|
2
|
+
module Rails
|
3
|
+
class Applier < Base
|
4
|
+
DEFAULT_SCHEMA_MESSAGE = "# Write your database schema here"
|
5
|
+
|
6
|
+
def self.call
|
7
|
+
new.call
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
execute_sql
|
12
|
+
create_schema_file
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def execute_sql
|
18
|
+
if has_error?
|
19
|
+
abort(error_message)
|
20
|
+
elsif executed_sql.present?
|
21
|
+
puts executed_sql
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_schema_file
|
26
|
+
unless after_schema_pathname.exist?
|
27
|
+
after_schema_pathname.open("w") do |io|
|
28
|
+
io.puts DEFAULT_SCHEMA_MESSAGE
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def executed_sql
|
34
|
+
@executed_sql ||= begin
|
35
|
+
result = []
|
36
|
+
unless has_database?
|
37
|
+
result << create_database_statement
|
38
|
+
result << use_database_steatement
|
39
|
+
end
|
40
|
+
result << diff
|
41
|
+
result.join("\n\n")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def result
|
46
|
+
@result ||= Open3.capture3(command, stdin_data: executed_sql)
|
47
|
+
end
|
48
|
+
|
49
|
+
def result_message
|
50
|
+
result[0]
|
51
|
+
end
|
52
|
+
|
53
|
+
def has_error?
|
54
|
+
result[2] != 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def error_message
|
58
|
+
result[1]
|
59
|
+
end
|
60
|
+
|
61
|
+
def diff
|
62
|
+
dumper.result
|
63
|
+
end
|
64
|
+
|
65
|
+
def dumper
|
66
|
+
@dumper ||= Scheman::Rails::Dumper.new
|
67
|
+
end
|
68
|
+
|
69
|
+
def command
|
70
|
+
"mysql " + command_options.join(" ")
|
71
|
+
end
|
72
|
+
|
73
|
+
def has_database?
|
74
|
+
!dumper.has_unknown_database_error?
|
75
|
+
end
|
76
|
+
|
77
|
+
def command_options
|
78
|
+
result = []
|
79
|
+
result.concat([database]) if has_database?
|
80
|
+
result.concat(["--host", host]) if host
|
81
|
+
result.concat(["--password", password]) if password
|
82
|
+
result.concat(["--port", port]) if port
|
83
|
+
result.concat(["--socket", socket]) if socket
|
84
|
+
result.concat(["--user", username]) if username
|
85
|
+
result
|
86
|
+
end
|
87
|
+
|
88
|
+
def use_database_steatement
|
89
|
+
"USE `#{database}`;"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Scheman
|
2
|
+
module Rails
|
3
|
+
class Base
|
4
|
+
SCHEMA_PATH = "db/schema.sql"
|
5
|
+
|
6
|
+
def self.call
|
7
|
+
new.call
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def database
|
13
|
+
configuration["database"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def encoding
|
17
|
+
configuration["encoding"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def socket
|
21
|
+
configuration["socket"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def host
|
25
|
+
configuration["host"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def password
|
29
|
+
configuration["password"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def port
|
33
|
+
configuration["port"]
|
34
|
+
end
|
35
|
+
|
36
|
+
def socket
|
37
|
+
configuration["socket"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def username
|
41
|
+
configuration["username"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def schema_type
|
45
|
+
case configuration["adapter"]
|
46
|
+
when "mysql2"
|
47
|
+
"mysql"
|
48
|
+
else
|
49
|
+
raise
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def configuration
|
54
|
+
@configuration ||= ActiveRecord::Tasks::DatabaseTasks.current_config
|
55
|
+
end
|
56
|
+
|
57
|
+
def after_schema_pathname
|
58
|
+
@after_schema_path ||= ::Rails.root.join(SCHEMA_PATH)
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_database_statement
|
62
|
+
"CREATE DATABASE `#{database}`;"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Scheman
|
2
|
+
module Rails
|
3
|
+
class Dumper < Base
|
4
|
+
def call
|
5
|
+
case
|
6
|
+
when has_unexpected_dump_error?
|
7
|
+
abort(dump_error_message)
|
8
|
+
when str = result.presence
|
9
|
+
puts str
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def has_unknown_database_error?
|
14
|
+
has_dump_error? && /Unknown database/ === dump_error_message
|
15
|
+
end
|
16
|
+
|
17
|
+
def diff
|
18
|
+
@diff ||= Scheman::Diff.new(
|
19
|
+
before: before_schema,
|
20
|
+
after: after_schema,
|
21
|
+
type: schema_type,
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def result
|
26
|
+
@result ||= statements.join("\n\n").rstrip
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def statements
|
32
|
+
result = []
|
33
|
+
result << create_database_statement if has_unknown_database_error?
|
34
|
+
result << diff
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
38
|
+
def dump
|
39
|
+
@dump ||= Open3.capture3(command)
|
40
|
+
end
|
41
|
+
|
42
|
+
def dump_result
|
43
|
+
dump[0]
|
44
|
+
end
|
45
|
+
|
46
|
+
def has_dump_error?
|
47
|
+
dump[2] != 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def dump_error_message
|
51
|
+
dump[1]
|
52
|
+
end
|
53
|
+
|
54
|
+
def has_unexpected_dump_error?
|
55
|
+
has_dump_error? && !has_unknown_database_error?
|
56
|
+
end
|
57
|
+
|
58
|
+
def before_schema
|
59
|
+
if has_unknown_database_error?
|
60
|
+
""
|
61
|
+
else
|
62
|
+
dump_result
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def after_schema
|
67
|
+
if after_schema_pathname.exist?
|
68
|
+
after_schema_pathname.read
|
69
|
+
else
|
70
|
+
""
|
71
|
+
end
|
72
|
+
end
|
73
|
+
1
|
74
|
+
def command
|
75
|
+
"mysqldump " + command_options.join(" ")
|
76
|
+
end
|
77
|
+
|
78
|
+
def command_options
|
79
|
+
default_command_options + additional_command_options
|
80
|
+
end
|
81
|
+
|
82
|
+
def default_command_options
|
83
|
+
[
|
84
|
+
database,
|
85
|
+
"--compact",
|
86
|
+
"--no-data",
|
87
|
+
]
|
88
|
+
end
|
89
|
+
|
90
|
+
def additional_command_options
|
91
|
+
result = []
|
92
|
+
result.concat(["--default-character-set", encoding]) if encoding
|
93
|
+
result.concat(["--host", host]) if host
|
94
|
+
result.concat(["--password", password]) if password
|
95
|
+
result.concat(["--port", port]) if port
|
96
|
+
result.concat(["--socket", socket]) if socket
|
97
|
+
result.concat(["--user", username]) if username
|
98
|
+
result
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :db do
|
2
|
+
namespace :schema do
|
3
|
+
desc "Show diff between the current DB schema and db/schema.sql"
|
4
|
+
task diff: [:environment, :load_config] do
|
5
|
+
Scheman::Rails::Dumper.call
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Apply diff between the current DB schema and db/schema.sql"
|
9
|
+
task apply: [:environment, :load_config] do
|
10
|
+
Scheman::Rails::Applier.call
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "scheman/rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "scheman-rails"
|
7
|
+
spec.version = Scheman::Rails::VERSION
|
8
|
+
spec.authors = ["Ryo Nakamura"]
|
9
|
+
spec.email = ["r7kamura@gmail.com"]
|
10
|
+
spec.summary = "Rails plugin for Scheman."
|
11
|
+
spec.homepage = "https://github.com/r7kamura/scheman-rails"
|
12
|
+
spec.license = "MIT"
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_dependency "rails", ">= 3.0.0"
|
20
|
+
spec.add_dependency "scheman", ">= 0.0.4"
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "mysql2"
|
23
|
+
spec.add_development_dependency "pry"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec", "2.14.1"
|
26
|
+
spec.add_development_dependency "rspec-rails", "2.14.1"
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile '~/.gitignore_global'
|
6
|
+
|
7
|
+
# Ignore bundler config.
|
8
|
+
/.bundle
|
9
|
+
|
10
|
+
# Ignore the default SQLite database.
|
11
|
+
/db/*.sqlite3
|
12
|
+
/db/*.sqlite3-journal
|
13
|
+
|
14
|
+
# Ignore all logfiles and tempfiles.
|
15
|
+
/log/*.log
|
16
|
+
/tmp
|