ardb 0.27.3 → 0.29.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.
- checksums.yaml +7 -7
- data/Gemfile +4 -5
- data/README.md +252 -3
- data/ardb.gemspec +8 -8
- data/bin/ardb +1 -1
- data/lib/ardb.rb +155 -72
- data/lib/ardb/adapter/base.rb +67 -47
- data/lib/ardb/adapter/mysql.rb +3 -19
- data/lib/ardb/adapter/postgresql.rb +33 -37
- data/lib/ardb/adapter/sqlite.rb +7 -16
- data/lib/ardb/adapter_spy.rb +58 -92
- data/lib/ardb/cli.rb +18 -226
- data/lib/ardb/{clirb.rb → cli/clirb.rb} +16 -18
- data/lib/ardb/cli/commands.rb +365 -0
- data/lib/ardb/db_tests.rb +2 -4
- data/lib/ardb/default_order_by.rb +3 -13
- data/lib/ardb/migration.rb +18 -20
- data/lib/ardb/record_spy.rb +7 -26
- data/lib/ardb/relation_spy.rb +0 -6
- data/lib/ardb/require_autoloaded_active_record_files.rb +103 -58
- data/lib/ardb/test_helpers.rb +2 -5
- data/lib/ardb/use_db_default.rb +4 -15
- data/lib/ardb/version.rb +1 -1
- data/script/determine_autoloaded_active_record_files.rb +11 -8
- data/test/helper.rb +9 -6
- data/test/support/factory.rb +17 -2
- data/test/support/fake_schema.rb +5 -0
- data/test/support/postgresql/migrations/.keep +0 -0
- data/test/support/postgresql/schema.rb +2 -0
- data/test/support/postgresql/setup_test_db.rb +51 -0
- data/test/support/relative_require_test_db_file.rb +2 -0
- data/test/support/require_test_db_file.rb +1 -0
- data/test/system/.keep +0 -0
- data/test/unit/adapter/base_tests.rb +163 -75
- data/test/unit/adapter/mysql_tests.rb +4 -20
- data/test/unit/adapter/postgresql_tests.rb +20 -28
- data/test/unit/adapter/sqlite_tests.rb +9 -12
- data/test/unit/adapter_spy_tests.rb +48 -71
- data/test/unit/ardb_tests.rb +338 -38
- data/test/unit/cli_tests.rb +334 -225
- data/test/unit/db_tests_tests.rb +3 -6
- data/test/unit/default_order_by_tests.rb +4 -8
- data/test/unit/migration_tests.rb +20 -17
- data/test/unit/record_spy_tests.rb +18 -23
- data/test/unit/relation_spy_tests.rb +17 -46
- data/test/unit/test_helpers_tests.rb +5 -20
- data/test/unit/use_db_default_tests.rb +9 -13
- metadata +111 -100
- data/lib/ardb/has_slug.rb +0 -107
- data/lib/ardb/migration_helpers.rb +0 -77
- data/lib/ardb/root_path.rb +0 -15
- data/test/unit/config_tests.rb +0 -58
- data/test/unit/has_slug_tests.rb +0 -341
- data/test/unit/migration_helpers_tests.rb +0 -59
data/lib/ardb/adapter/base.rb
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
-
|
2
|
-
class Ardb::Adapter
|
1
|
+
require "ardb"
|
3
2
|
|
3
|
+
module Ardb; end
|
4
|
+
module Ardb::Adapter
|
4
5
|
class Base
|
6
|
+
attr_reader :config
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
validate!
|
11
|
+
end
|
12
|
+
|
13
|
+
def connect_hash; self.config.activerecord_connect_hash; end
|
14
|
+
def database; self.config.database; end
|
15
|
+
def migrations_path; self.config.migrations_path; end
|
16
|
+
def schema_format; self.config.schema_format; end
|
5
17
|
|
6
|
-
|
7
|
-
|
18
|
+
def ruby_schema_path
|
19
|
+
@ruby_schema_path ||= "#{self.config.schema_path}.rb"
|
20
|
+
end
|
8
21
|
|
9
|
-
def
|
10
|
-
@
|
11
|
-
@database = Ardb.config.db.database
|
12
|
-
@schema_format = Ardb.config.schema_format
|
13
|
-
schema_path = Ardb.config.schema_path
|
14
|
-
@ruby_schema_path = "#{schema_path}.rb"
|
15
|
-
@sql_schema_path = "#{schema_path}.sql"
|
22
|
+
def sql_schema_path
|
23
|
+
@sql_schema_path ||= "#{self.config.schema_path}.sql"
|
16
24
|
end
|
17
25
|
|
18
26
|
def escape_like_pattern(pattern, escape_char = nil)
|
@@ -21,50 +29,51 @@ class Ardb::Adapter
|
|
21
29
|
pattern.gsub!(escape_char){ escape_char * 2 }
|
22
30
|
# don't allow custom wildcards
|
23
31
|
pattern.gsub!(/%|_/){ |wildcard_char| "#{escape_char}#{wildcard_char}" }
|
32
|
+
pattern
|
24
33
|
end
|
25
34
|
|
26
|
-
def foreign_key_add_sql(*args); raise NotImplementedError; end
|
27
|
-
def foreign_key_drop_sql(*args); raise NotImplementedError; end
|
28
|
-
|
29
35
|
def create_db(*args); raise NotImplementedError; end
|
30
36
|
def drop_db(*args); raise NotImplementedError; end
|
31
37
|
|
38
|
+
def drop_tables(*args); raise NotImplementedError; end
|
39
|
+
|
32
40
|
def connect_db
|
33
|
-
ActiveRecord::Base.
|
41
|
+
ActiveRecord::Base.establish_connection(self.connect_hash)
|
42
|
+
# checkout a connection to ensure we can connect to the DB, we don"t do
|
43
|
+
# anything with the connection and immediately check it back in
|
44
|
+
ActiveRecord::Base.connection_pool.with_connection{ }
|
34
45
|
end
|
35
46
|
|
36
47
|
def migrate_db
|
37
|
-
|
38
|
-
|
39
|
-
migrations_path = Ardb.config.migrations_path
|
40
|
-
|
41
|
-
if defined?(ActiveRecord::Migration::CommandRecorder)
|
42
|
-
require 'ardb/migration_helpers'
|
43
|
-
ActiveRecord::Migration::CommandRecorder.class_eval do
|
44
|
-
include Ardb::MigrationHelpers::RecorderMixin
|
45
|
-
end
|
46
|
-
end
|
48
|
+
migrate_db_up
|
49
|
+
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
ActiveRecord::Migrator.migrate(migrations_path, version) do |migration|
|
51
|
-
ENV["MIGRATE_SCOPE"].blank? || (ENV["MIGRATE_SCOPE"] == migration.scope)
|
52
|
-
end
|
51
|
+
def migrate_db_up(target_version = nil)
|
52
|
+
migration_context.up(target_version)
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
55
|
+
def migrate_db_down(target_version = nil)
|
56
|
+
migration_context.down(target_version)
|
57
|
+
end
|
58
|
+
|
59
|
+
def migrate_db_forward(steps = 1)
|
60
|
+
migration_context.forward(steps)
|
61
|
+
end
|
62
|
+
|
63
|
+
def migrate_db_backward(steps = 1)
|
64
|
+
migration_context.rollback(steps)
|
65
|
+
end
|
56
66
|
|
57
67
|
def load_schema
|
58
|
-
# silence STDOUT
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
load_sql_schema if @schema_format == :sql
|
68
|
+
current_stdout = $stdout.dup # silence STDOUT
|
69
|
+
$stdout = File.new("/dev/null", "w")
|
70
|
+
load_ruby_schema if self.schema_format == Ardb::Config::RUBY_SCHEMA_FORMAT
|
71
|
+
load_sql_schema if self.schema_format == Ardb::Config::SQL_SCHEMA_FORMAT
|
63
72
|
$stdout = current_stdout
|
64
73
|
end
|
65
74
|
|
66
75
|
def load_ruby_schema
|
67
|
-
load
|
76
|
+
load self.ruby_schema_path
|
68
77
|
end
|
69
78
|
|
70
79
|
def load_sql_schema
|
@@ -72,18 +81,17 @@ class Ardb::Adapter
|
|
72
81
|
end
|
73
82
|
|
74
83
|
def dump_schema
|
75
|
-
# silence STDOUT
|
76
|
-
|
77
|
-
$stdout = File.new('/dev/null', 'w')
|
84
|
+
current_stdout = $stdout.dup # silence STDOUT
|
85
|
+
$stdout = File.new("/dev/null", "w")
|
78
86
|
dump_ruby_schema
|
79
|
-
dump_sql_schema if
|
87
|
+
dump_sql_schema if self.schema_format == Ardb::Config::SQL_SCHEMA_FORMAT
|
80
88
|
$stdout = current_stdout
|
81
89
|
end
|
82
90
|
|
83
91
|
def dump_ruby_schema
|
84
|
-
require
|
85
|
-
FileUtils.mkdir_p File.dirname(
|
86
|
-
File.open(
|
92
|
+
require "active_record/schema_dumper"
|
93
|
+
FileUtils.mkdir_p File.dirname(self.ruby_schema_path)
|
94
|
+
File.open(self.ruby_schema_path, "w:utf-8") do |file|
|
87
95
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
88
96
|
end
|
89
97
|
end
|
@@ -92,10 +100,22 @@ class Ardb::Adapter
|
|
92
100
|
raise NotImplementedError
|
93
101
|
end
|
94
102
|
|
95
|
-
def ==(
|
96
|
-
self.class
|
103
|
+
def ==(other)
|
104
|
+
if other.kind_of?(self.class)
|
105
|
+
self.config == other.config
|
106
|
+
else
|
107
|
+
super
|
108
|
+
end
|
97
109
|
end
|
98
110
|
|
99
|
-
|
111
|
+
private
|
112
|
+
|
113
|
+
def validate!
|
114
|
+
# override as needed
|
115
|
+
end
|
100
116
|
|
117
|
+
def migration_context
|
118
|
+
ActiveRecord::MigrationContext.new(migrations_path)
|
119
|
+
end
|
120
|
+
end
|
101
121
|
end
|
data/lib/ardb/adapter/mysql.rb
CHANGED
@@ -1,22 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require 'ardb/adapter/base'
|
3
|
-
|
4
|
-
class Ardb::Adapter
|
5
|
-
|
6
|
-
class Mysql < Base
|
7
|
-
|
8
|
-
def foreign_key_add_sql
|
9
|
-
"ALTER TABLE :from_table"\
|
10
|
-
" ADD CONSTRAINT :name"\
|
11
|
-
" FOREIGN KEY (:from_column)"\
|
12
|
-
" REFERENCES :to_table (:to_column)"
|
13
|
-
end
|
14
|
-
|
15
|
-
def foreign_key_drop_sql
|
16
|
-
"ALTER TABLE :from_table"\
|
17
|
-
" DROP FOREIGN KEY :name"
|
18
|
-
end
|
1
|
+
require "ardb/adapter/base"
|
19
2
|
|
3
|
+
module Ardb::Adapter
|
4
|
+
class Mysql < Ardb::Adapter::Base
|
20
5
|
end
|
21
|
-
|
22
6
|
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
require
|
2
|
-
require 'ardb/adapter/base'
|
1
|
+
require "ardb/adapter/base"
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
module Ardb::Adapter
|
4
|
+
class Postgresql < Ardb::Adapter::Base
|
5
|
+
# the "postgres" db is a "public" (doesn"t typically require auth/grants to
|
6
|
+
# connect to) db that typically exists for all postgres installations; the
|
7
|
+
# adapter uses it to create/drop other databases
|
8
|
+
def public_connect_hash
|
9
|
+
@public_connect_hash ||= self.connect_hash.merge({
|
10
|
+
"database" => "postgres",
|
11
|
+
"schema_search_path" => "public"
|
12
12
|
})
|
13
13
|
end
|
14
14
|
|
15
15
|
def create_db
|
16
|
-
ActiveRecord::Base.establish_connection(self.
|
17
|
-
ActiveRecord::Base.connection.create_database(self.database, self.
|
18
|
-
ActiveRecord::Base.establish_connection(self.
|
16
|
+
ActiveRecord::Base.establish_connection(self.public_connect_hash)
|
17
|
+
ActiveRecord::Base.connection.create_database(self.database, self.connect_hash)
|
18
|
+
ActiveRecord::Base.establish_connection(self.connect_hash)
|
19
19
|
end
|
20
20
|
|
21
21
|
def drop_db
|
22
22
|
begin
|
23
|
-
ActiveRecord::Base.establish_connection(self.
|
23
|
+
ActiveRecord::Base.establish_connection(self.public_connect_hash)
|
24
24
|
ActiveRecord::Base.connection.tap do |conn|
|
25
25
|
conn.execute "UPDATE pg_catalog.pg_database"\
|
26
26
|
" SET datallowconn=false WHERE datname='#{self.database}'"
|
@@ -40,47 +40,43 @@ class Ardb::Adapter
|
|
40
40
|
tables = conn.execute "SELECT table_name"\
|
41
41
|
" FROM information_schema.tables"\
|
42
42
|
" WHERE table_schema = 'public';"
|
43
|
-
tables.each{ |row| conn.execute "DROP TABLE #{row[
|
43
|
+
tables.each{ |row| conn.execute "DROP TABLE #{row["table_name"]} CASCADE" }
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def foreign_key_add_sql
|
48
|
-
"ALTER TABLE :from_table"\
|
49
|
-
" ADD CONSTRAINT :name"\
|
50
|
-
" FOREIGN KEY (:from_column)"\
|
51
|
-
" REFERENCES :to_table (:to_column)"
|
52
|
-
end
|
53
|
-
|
54
|
-
def foreign_key_drop_sql
|
55
|
-
"ALTER TABLE :from_table"\
|
56
|
-
" DROP CONSTRAINT :name"
|
57
|
-
end
|
58
|
-
|
59
47
|
def load_sql_schema
|
60
|
-
require
|
48
|
+
require "scmd"
|
61
49
|
cmd_str = "psql -f \"#{self.sql_schema_path}\" #{self.database}"
|
62
50
|
cmd = Scmd.new(cmd_str, :env => env_var_hash).tap(&:run)
|
63
|
-
raise
|
51
|
+
raise "Error loading database" unless cmd.success?
|
64
52
|
end
|
65
53
|
|
66
54
|
def dump_sql_schema
|
67
|
-
require
|
55
|
+
require "scmd"
|
68
56
|
cmd_str = "pg_dump -i -s -x -O -f \"#{self.sql_schema_path}\" #{self.database}"
|
69
57
|
cmd = Scmd.new(cmd_str, :env => env_var_hash).tap(&:run)
|
70
|
-
raise
|
58
|
+
raise "Error dumping database" unless cmd.success?
|
71
59
|
end
|
72
60
|
|
73
61
|
private
|
74
62
|
|
63
|
+
def validate!
|
64
|
+
if self.database =~ /\W/
|
65
|
+
raise(
|
66
|
+
Ardb::ConfigurationError,
|
67
|
+
"database value must not contain non-word characters. "\
|
68
|
+
"Given: #{self.database.inspect}."
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
75
73
|
def env_var_hash
|
76
74
|
@env_var_hash ||= {
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
75
|
+
"PGHOST" => self.connect_hash["host"],
|
76
|
+
"PGPORT" => self.connect_hash["port"],
|
77
|
+
"PGUSER" => self.connect_hash["username"],
|
78
|
+
"PGPASSWORD" => self.connect_hash["password"]
|
81
79
|
}
|
82
80
|
end
|
83
|
-
|
84
81
|
end
|
85
|
-
|
86
82
|
end
|
data/lib/ardb/adapter/sqlite.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require 'ardb/adapter/base'
|
5
|
-
|
6
|
-
class Ardb::Adapter
|
7
|
-
|
8
|
-
class Sqlite < Base
|
1
|
+
require "fileutils"
|
2
|
+
require "ardb"
|
3
|
+
require "ardb/adapter/base"
|
9
4
|
|
5
|
+
module Ardb::Adapter
|
6
|
+
class Sqlite < Ardb::Adapter::Base
|
10
7
|
def db_file_path
|
11
|
-
|
12
|
-
path.to_s
|
13
|
-
else
|
14
|
-
Ardb.config.root_path.join(path).to_s
|
15
|
-
end
|
8
|
+
File.expand_path(self.database, self.config.root_path)
|
16
9
|
end
|
17
10
|
|
18
11
|
def validate!
|
@@ -24,13 +17,11 @@ class Ardb::Adapter
|
|
24
17
|
def create_db
|
25
18
|
validate!
|
26
19
|
FileUtils.mkdir_p File.dirname(self.db_file_path)
|
27
|
-
ActiveRecord::Base.establish_connection(self.
|
20
|
+
ActiveRecord::Base.establish_connection(self.connect_hash)
|
28
21
|
end
|
29
22
|
|
30
23
|
def drop_db
|
31
24
|
FileUtils.rm(self.db_file_path) if File.exist?(self.db_file_path)
|
32
25
|
end
|
33
|
-
|
34
26
|
end
|
35
|
-
|
36
27
|
end
|
data/lib/ardb/adapter_spy.rb
CHANGED
@@ -1,114 +1,80 @@
|
|
1
|
-
require
|
1
|
+
require "ardb"
|
2
|
+
require "ardb/adapter/base"
|
2
3
|
|
3
4
|
module Ardb
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
class AdapterSpy < Ardb::Adapter::Base
|
6
|
+
attr_accessor :drop_tables_called_count
|
7
|
+
attr_accessor :dump_schema_called_count, :load_schema_called_count
|
8
|
+
attr_accessor :drop_db_called_count, :create_db_called_count
|
9
|
+
attr_accessor :connect_db_called_count, :migrate_db_called_count
|
10
|
+
|
11
|
+
def initialize(config = nil)
|
12
|
+
super(config || Ardb::Config.new)
|
13
|
+
@drop_tables_called_count = 0
|
14
|
+
@dump_schema_called_count = 0
|
15
|
+
@load_schema_called_count = 0
|
16
|
+
@drop_db_called_count = 0
|
17
|
+
@create_db_called_count = 0
|
18
|
+
@connect_db_called_count = 0
|
19
|
+
@migrate_db_called_count = 0
|
13
20
|
end
|
14
21
|
|
15
|
-
|
16
|
-
|
22
|
+
def create_db_called?
|
23
|
+
self.create_db_called_count > 0
|
17
24
|
end
|
18
25
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
attr_accessor :dump_schema_called_count, :load_schema_called_count
|
23
|
-
attr_accessor :drop_db_called_count, :create_db_called_count
|
24
|
-
attr_accessor :connect_db_called_count, :migrate_db_called_count
|
25
|
-
|
26
|
-
def drop_tables_called_count
|
27
|
-
@drop_tables_called_count ||= 0
|
28
|
-
end
|
29
|
-
|
30
|
-
def drop_tables_called?
|
31
|
-
self.drop_tables_called_count > 0
|
32
|
-
end
|
33
|
-
|
34
|
-
def drop_tables(*args, &block)
|
35
|
-
self.drop_tables_called_count += 1
|
36
|
-
end
|
37
|
-
|
38
|
-
def dump_schema_called_count
|
39
|
-
@dump_schema_called_count ||= 0
|
40
|
-
end
|
41
|
-
|
42
|
-
def dump_schema_called?
|
43
|
-
self.dump_schema_called_count > 0
|
44
|
-
end
|
45
|
-
|
46
|
-
def dump_schema(*args, &block)
|
47
|
-
self.dump_schema_called_count += 1
|
48
|
-
end
|
49
|
-
|
50
|
-
def load_schema_called_count
|
51
|
-
@load_schema_called_count ||= 0
|
52
|
-
end
|
53
|
-
|
54
|
-
def load_schema_called?
|
55
|
-
self.load_schema_called_count > 0
|
56
|
-
end
|
57
|
-
|
58
|
-
def load_schema(*args, &block)
|
59
|
-
self.load_schema_called_count += 1
|
60
|
-
end
|
61
|
-
|
62
|
-
def drop_db_called_count
|
63
|
-
@drop_db_called_count ||= 0
|
64
|
-
end
|
26
|
+
def drop_db_called?
|
27
|
+
self.drop_db_called_count > 0
|
28
|
+
end
|
65
29
|
|
66
|
-
|
67
|
-
|
68
|
-
|
30
|
+
def drop_tables_called?
|
31
|
+
self.drop_tables_called_count > 0
|
32
|
+
end
|
69
33
|
|
70
|
-
|
71
|
-
|
72
|
-
|
34
|
+
def connect_db_called?
|
35
|
+
self.connect_db_called_count > 0
|
36
|
+
end
|
73
37
|
|
74
|
-
|
75
|
-
|
76
|
-
|
38
|
+
def migrate_db_called?
|
39
|
+
self.migrate_db_called_count > 0
|
40
|
+
end
|
77
41
|
|
78
|
-
|
79
|
-
|
80
|
-
|
42
|
+
def load_schema_called?
|
43
|
+
self.load_schema_called_count > 0
|
44
|
+
end
|
81
45
|
|
82
|
-
|
83
|
-
|
84
|
-
|
46
|
+
def dump_schema_called?
|
47
|
+
self.dump_schema_called_count > 0
|
48
|
+
end
|
85
49
|
|
86
|
-
|
87
|
-
@connect_db_called_count ||= 0
|
88
|
-
end
|
50
|
+
# Overwritten `Adapter::Base` methods
|
89
51
|
|
90
|
-
|
91
|
-
|
92
|
-
|
52
|
+
def create_db(*args, &block)
|
53
|
+
self.create_db_called_count += 1
|
54
|
+
end
|
93
55
|
|
94
|
-
|
95
|
-
|
96
|
-
|
56
|
+
def drop_db(*args, &block)
|
57
|
+
self.drop_db_called_count += 1
|
58
|
+
end
|
97
59
|
|
98
|
-
|
99
|
-
|
100
|
-
|
60
|
+
def drop_tables(*args, &block)
|
61
|
+
self.drop_tables_called_count += 1
|
62
|
+
end
|
101
63
|
|
102
|
-
|
103
|
-
|
104
|
-
|
64
|
+
def connect_db(*args, &block)
|
65
|
+
self.connect_db_called_count += 1
|
66
|
+
end
|
105
67
|
|
106
|
-
|
107
|
-
|
108
|
-
|
68
|
+
def migrate_db(*args, &block)
|
69
|
+
self.migrate_db_called_count += 1
|
70
|
+
end
|
109
71
|
|
72
|
+
def load_schema(*args, &block)
|
73
|
+
self.load_schema_called_count += 1
|
110
74
|
end
|
111
75
|
|
76
|
+
def dump_schema(*args, &block)
|
77
|
+
self.dump_schema_called_count += 1
|
78
|
+
end
|
112
79
|
end
|
113
|
-
|
114
80
|
end
|