dbcp 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -7
- data/lib/dbcp/database.rb +4 -0
- data/lib/dbcp/databases/mysql_database.rb +7 -3
- data/lib/dbcp/databases/postgres_database.rb +29 -2
- data/lib/dbcp/environment.rb +2 -1
- data/lib/dbcp/environment_providers/database_yaml_environment_provider.rb +19 -2
- data/lib/dbcp/environment_providers/uri_environment_provider.rb +29 -0
- data/lib/dbcp/execution_hosts/ssh_execution_host.rb +2 -1
- data/lib/dbcp/version.rb +1 -1
- data/lib/dbcp.rb +2 -2
- data/spec/fixtures/config/database.yml +5 -0
- data/spec/fixtures/config/remote_database.yml +7 -0
- data/spec/lib/dbcp/cli_spec.rb +2 -1
- data/spec/lib/dbcp/database_spec.rb +7 -3
- data/spec/lib/dbcp/environment_providers/database_yaml_environment_provider_spec.rb +21 -1
- data/spec/lib/dbcp/environment_providers/uri_environment_provider_spec.rb +24 -0
- data/spec/support/execute_in_directory.rb +10 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e37c2566e5ac25d166c8fd27df6209e2f83863f1
|
4
|
+
data.tar.gz: 0960077bc0488bd979f3b97b751a940b3e6f11c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d8b2f092e45700399fbfda1e91cdb0c80205ecf9670b07c5b5996d153ddf9570df48c57278a8427e7ec32350d11148356864f3a0c427d74dc462a45b0747ff0
|
7
|
+
data.tar.gz: fdde59cd6bd19e060aefd6a1c5999087ebeab62aa2c08c5f4135fadb320979bffb0e8b514256258fc65767646a990b16ec498bbd686aee5741af50b491d70bec
|
data/README.md
CHANGED
@@ -5,7 +5,9 @@
|
|
5
5
|
|
6
6
|
Copy Postgres or MySQL databases between application environments.
|
7
7
|
|
8
|
-
Setting an employee up to work on a web application for the first time is time consuming. Tools like [Vagrant](http://www.vagrantup.com) have made it easy to get your environment setup, but you still need to get your relational database setup. In rails you can load your `db/schema.rb` and hope that `db/seeds.rb` is well curated, but seldom has enough to let a developer hit the ground running. Working with your production database while developing is extremely convenient. The [parity](http://12factor.net/dev-prod-parity) helps preview database performance. It also makes investigating data-specific bugs much easier.
|
8
|
+
Setting an employee up to work on a web application for the first time is time consuming. Tools like [Vagrant](http://www.vagrantup.com) have made it easy to get your environment setup, but you still need to get your relational database setup. In rails you can load your `db/schema.rb` and hope that `db/seeds.rb` is well curated, but seldom has enough to let a developer hit the ground running. Working with your production database while developing is extremely convenient. The [parity](http://12factor.net/dev-prod-parity) helps preview database performance. It also makes investigating data-specific bugs much easier.
|
9
|
+
|
10
|
+
The goal of `dbcp` is to make copying databases between development, staging, and production environments as easy as copying a file on your local disk. It's an adapter for platform-specific utilities like `pg_dump` and `mysqldump`, simplifies lookup of credentials using storage mechanisms you're already using, and handles transfer of dump files between hosts.
|
9
11
|
|
10
12
|
## A word of caution
|
11
13
|
|
@@ -37,30 +39,59 @@ Environment credentials can be defined in the following providers:
|
|
37
39
|
|
38
40
|
Rails defines credentials for its database environments in a file at [`config/database.yml`](https://github.com/rails/rails/blob/master/guides/code/getting_started/config/database.yml). By default this file is generated with only development and test environments, but any additional environments added will be leveraged by `dbcp`. Although this is a rails convention, `dbcp` parses this file outside of any framework, so it will work even if you're using this convention in another framework.
|
39
41
|
|
40
|
-
The database export or import can be executed on a remote host over ssh and then copied between environment hosts if you specify the remote host via an `ssh_uri` entry in the database.yml. This is helpful if the database host only allows connections from specific servers.
|
42
|
+
The database export or import can be executed on a remote host over ssh and then copied between environment hosts if you specify the remote host via an `ssh_uri` entry in the database.yml. This is helpful if the database host only allows connections from specific servers. If your `ssh_uri` optionally includes a path to your application root on the remote server, dbcp will load the database credentials from the remote server's config/database.yml.
|
41
43
|
|
42
44
|
Example config/database.yml:
|
43
45
|
|
44
46
|
```yaml
|
47
|
+
# Local database
|
48
|
+
development:
|
49
|
+
adapter: postgresql
|
50
|
+
encoding: unicode
|
51
|
+
pool: 5
|
52
|
+
database: development_database
|
53
|
+
username: development_username
|
54
|
+
password: development_password
|
55
|
+
|
56
|
+
# Remote database, credentials provided locally, executed from remote host over ssh
|
45
57
|
staging:
|
46
58
|
adapter: postgresql
|
47
59
|
database: staging_database
|
48
60
|
username: staging_username
|
49
61
|
password: staging_password
|
50
|
-
ssh_uri: ssh://deploy@staging.example.com
|
62
|
+
ssh_uri: ssh://deploy@staging.example.com
|
63
|
+
|
64
|
+
# Remote database, credentials fetched over ssh, executed from remote host over ssh
|
65
|
+
production:
|
66
|
+
ssh_uri: ssh://deploy@production.example.com/www/production.example.com/current
|
51
67
|
```
|
52
68
|
|
69
|
+
$ dbcp staging development
|
70
|
+
|
71
|
+
### URI
|
72
|
+
|
73
|
+
You can use a database URI in place of an environment name as follows:
|
74
|
+
|
75
|
+
$ dbcp postgres://my_username:my_pass@db.example.com/my_database development
|
76
|
+
|
53
77
|
## Roadmap
|
54
78
|
|
55
79
|
The following features are pending:
|
56
80
|
|
57
81
|
Providers:
|
58
82
|
|
59
|
-
-
|
60
|
-
-
|
61
|
-
- heroku, inferred from git remotes
|
83
|
+
- Capistrano task
|
84
|
+
- Heroku, environment name inferred from git remotes
|
62
85
|
|
63
86
|
Features:
|
64
87
|
|
65
|
-
- Reading configuration from a remote config/database.yml
|
66
88
|
- Definable per-tool specific options, e.g. to allow pg_dump to provide a table exclusion list
|
89
|
+
- URI Provider: specify an remote ssh execution host, perhaps using '@@' as a URI separator?
|
90
|
+
|
91
|
+
Refactors:
|
92
|
+
|
93
|
+
- Handle pg_restore warnings
|
94
|
+
- Better logging
|
95
|
+
- Better help
|
96
|
+
|
97
|
+
[Open an issue](https://github.com/gabetax/dbcp/issues) if there's something else you'd like to see supported.
|
data/lib/dbcp/database.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Dbcp
|
2
2
|
class Database
|
3
|
+
class BlankDatabaseDefinition < StandardError; end
|
3
4
|
class UnsupportedDatabaseAdapter < StandardError; end
|
4
5
|
|
5
6
|
class << self
|
@@ -13,6 +14,8 @@ module Dbcp
|
|
13
14
|
MysqlDatabase
|
14
15
|
when /postgres/
|
15
16
|
PostgresDatabase
|
17
|
+
when nil, ''
|
18
|
+
raise BlankDatabaseDefinition.new("No database adapter was provided.")
|
16
19
|
else
|
17
20
|
raise UnsupportedDatabaseAdapter.new("Unsupported database adapter: #{adapter}")
|
18
21
|
end
|
@@ -24,6 +27,7 @@ module Dbcp
|
|
24
27
|
attribute :adapter
|
25
28
|
attribute :database
|
26
29
|
attribute :host, String, default: 'localhost'
|
30
|
+
attribute :port, Fixnum
|
27
31
|
attribute :socket
|
28
32
|
attribute :username
|
29
33
|
attribute :password
|
@@ -1,21 +1,25 @@
|
|
1
1
|
module Dbcp
|
2
2
|
class MysqlDatabase < Database
|
3
3
|
def export_command(snapshot_file)
|
4
|
-
%W[mysqldump #{
|
4
|
+
%W[mysqldump #{build_socket_or_host} #{build_port} --user=#{username} --password=#{password} --add-drop-table --extended-insert --result-file=#{snapshot_file.path} #{database}].reject(&:empty?).shelljoin
|
5
5
|
end
|
6
6
|
|
7
7
|
def import_command(snapshot_file)
|
8
|
-
%W[mysql #{
|
8
|
+
%W[mysql #{build_socket_or_host} #{build_port} --user=#{username} --password=#{password} #{database}].reject(&:empty?).shelljoin + ' < ' + snapshot_file.path.shellescape
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def
|
13
|
+
def build_socket_or_host
|
14
14
|
if socket
|
15
15
|
"--socket=#{socket}"
|
16
16
|
else
|
17
17
|
"--host=#{host}"
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
def build_port
|
22
|
+
"--port=#{port}" if host && port
|
23
|
+
end
|
20
24
|
end
|
21
25
|
end
|
@@ -1,11 +1,38 @@
|
|
1
1
|
module Dbcp
|
2
2
|
class PostgresDatabase < Database
|
3
3
|
def export_command(snapshot_file)
|
4
|
-
|
4
|
+
build_password + [
|
5
|
+
'pg_dump',
|
6
|
+
'--host', host,
|
7
|
+
build_port,
|
8
|
+
'--username', username,
|
9
|
+
'--file', snapshot_file.path,
|
10
|
+
'--format', 'c',
|
11
|
+
database
|
12
|
+
].flatten.compact.shelljoin
|
5
13
|
end
|
6
14
|
|
7
15
|
def import_command(snapshot_file)
|
8
|
-
|
16
|
+
build_password + [
|
17
|
+
'pg_restore',
|
18
|
+
'--host', host,
|
19
|
+
build_port,
|
20
|
+
'--username', username,
|
21
|
+
'--dbname', database,
|
22
|
+
'--clean',
|
23
|
+
snapshot_file.path
|
24
|
+
].flatten.compact.shelljoin
|
9
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def build_password
|
30
|
+
%W[export PGPASSWORD=#{password}].shelljoin + '; '
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_port
|
34
|
+
['--port', port] if host && port
|
35
|
+
end
|
36
|
+
|
10
37
|
end
|
11
38
|
end
|
data/lib/dbcp/environment.rb
CHANGED
@@ -27,11 +27,28 @@ module Dbcp
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def build_environment(environment_name, environment_hash)
|
30
|
+
execution_host = ExecutionHost.build(environment_hash)
|
31
|
+
|
32
|
+
begin
|
33
|
+
database = Database.build(environment_hash)
|
34
|
+
rescue Database::BlankDatabaseDefinition => e
|
35
|
+
if execution_host.remote?
|
36
|
+
database = Database.build fetch_remote_environment_hash(execution_host)[environment_name]
|
37
|
+
else
|
38
|
+
raise e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
Environment.new({
|
31
43
|
environment_name: environment_name,
|
32
|
-
database:
|
33
|
-
execution_host:
|
44
|
+
database: database,
|
45
|
+
execution_host: execution_host
|
34
46
|
})
|
35
47
|
end
|
48
|
+
|
49
|
+
def fetch_remote_environment_hash(execution_host)
|
50
|
+
YAML.load execution_host.download "#{execution_host.path}/#{@database_yaml_path}"
|
51
|
+
end
|
52
|
+
|
36
53
|
end
|
37
54
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Dbcp
|
4
|
+
class UriEnvironmentProvider
|
5
|
+
def find(environment_name)
|
6
|
+
uri = URI.parse(environment_name)
|
7
|
+
return nil unless uri.scheme
|
8
|
+
|
9
|
+
build_environment environment_name, uri
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def build_environment(environment_name, uri)
|
15
|
+
Environment.new({
|
16
|
+
environment_name: environment_name,
|
17
|
+
database: Database.build({
|
18
|
+
'adapter' => uri.scheme,
|
19
|
+
'username' => uri.user,
|
20
|
+
'password' => uri.password,
|
21
|
+
'host' => uri.host,
|
22
|
+
'port' => uri.port,
|
23
|
+
'database' => uri.path[1..-1] # Trim leading '/'
|
24
|
+
}),
|
25
|
+
execution_host: LocalExecutionHost.new
|
26
|
+
})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -65,7 +65,8 @@ module Dbcp
|
|
65
65
|
raise ExecutionError.new "Execution failed with exit code #{$?.exitstatus}. Command was: #{command}" if exitstatus > 0
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
# Omitting destination_path will return file contents as a string
|
69
|
+
def download(source_path, destination_path = nil)
|
69
70
|
Net::SFTP.start host, username do |ssh|
|
70
71
|
return ssh.download! source_path, destination_path
|
71
72
|
end
|
data/lib/dbcp/version.rb
CHANGED
data/lib/dbcp.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'pry'
|
2
|
-
|
3
1
|
require 'logger'
|
2
|
+
require 'shellwords'
|
4
3
|
require 'virtus'
|
5
4
|
require 'dbcp/cli'
|
6
5
|
require 'dbcp/database'
|
7
6
|
require 'dbcp/databases/mysql_database'
|
8
7
|
require 'dbcp/databases/postgres_database'
|
8
|
+
require 'dbcp/environment_providers/uri_environment_provider'
|
9
9
|
require 'dbcp/environment_providers/database_yaml_environment_provider'
|
10
10
|
require 'dbcp/execution_host'
|
11
11
|
require 'dbcp/execution_hosts/local_execution_host'
|
@@ -3,6 +3,8 @@ development:
|
|
3
3
|
encoding: unicode
|
4
4
|
database: dev_database
|
5
5
|
pool: 5
|
6
|
+
host: db.example.com
|
7
|
+
port: 6543
|
6
8
|
username: dev_username
|
7
9
|
password: dev_password
|
8
10
|
|
@@ -13,4 +15,7 @@ staging:
|
|
13
15
|
pool: 5
|
14
16
|
username: staging_username
|
15
17
|
password: staging_password
|
18
|
+
ssh_uri: ssh://deploy@staging.example.com
|
19
|
+
|
20
|
+
staging_ssh_only:
|
16
21
|
ssh_uri: ssh://deploy@staging.example.com/www/staging.example.com/current
|
data/spec/lib/dbcp/cli_spec.rb
CHANGED
@@ -4,7 +4,8 @@ describe Dbcp::Cli do
|
|
4
4
|
subject { Dbcp::Cli.new silent_stdout }
|
5
5
|
let(:silent_stdout) { '/dev/null' }
|
6
6
|
|
7
|
-
|
7
|
+
extend ExecuteInDirectory
|
8
|
+
execute_in_directory(File.expand_path('../../../fixtures', __FILE__))
|
8
9
|
|
9
10
|
describe "#start" do
|
10
11
|
context "success" do
|
@@ -2,12 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Dbcp::Database do
|
4
4
|
describe ".build" do
|
5
|
-
context "
|
5
|
+
context "supported type" do
|
6
6
|
specify { expect(Dbcp::Database.build 'adapter' => 'postgresql').to be_a(Dbcp::PostgresDatabase) }
|
7
7
|
end
|
8
8
|
|
9
|
-
context "
|
10
|
-
specify { expect { Dbcp::Database.build 'adapter' =>
|
9
|
+
context "no type" do
|
10
|
+
specify { expect { Dbcp::Database.build 'adapter' => nil}.to raise_error(Dbcp::Database::BlankDatabaseDefinition) }
|
11
|
+
end
|
12
|
+
|
13
|
+
context "unsupported type" do
|
14
|
+
specify { expect { Dbcp::Database.build 'adapter' => 'unsupported'}.to raise_error(Dbcp::Database::UnsupportedDatabaseAdapter) }
|
11
15
|
end
|
12
16
|
|
13
17
|
end
|
@@ -2,7 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Dbcp::DatabaseYamlEnvironmentProvider do
|
4
4
|
subject { Dbcp::DatabaseYamlEnvironmentProvider.new path }
|
5
|
-
let(:path) {
|
5
|
+
let(:path) { 'config/database.yml' }
|
6
|
+
|
7
|
+
extend ExecuteInDirectory
|
8
|
+
execute_in_directory(File.expand_path('../../../../fixtures', __FILE__))
|
6
9
|
|
7
10
|
describe "#find" do
|
8
11
|
context "when environment exists" do
|
@@ -12,6 +15,8 @@ describe Dbcp::DatabaseYamlEnvironmentProvider do
|
|
12
15
|
expect(environment.database).to be_a Dbcp::Database
|
13
16
|
expect(environment.environment_name).to eq 'development'
|
14
17
|
expect(environment.database.adapter).to eq 'postgresql'
|
18
|
+
expect(environment.database.host).to eq 'db.example.com'
|
19
|
+
expect(environment.database.port).to eq 6543
|
15
20
|
expect(environment.database.database).to eq 'dev_database'
|
16
21
|
expect(environment.database.username).to eq 'dev_username'
|
17
22
|
expect(environment.database.password).to eq 'dev_password'
|
@@ -30,10 +35,25 @@ describe Dbcp::DatabaseYamlEnvironmentProvider do
|
|
30
35
|
expect(environment.execution_host).to be_a Dbcp::SshExecutionHost
|
31
36
|
end
|
32
37
|
end
|
38
|
+
|
39
|
+
context "without database definition, but with ssh_uri" do
|
40
|
+
let(:remote_yaml) { File.read remote_yaml_path }
|
41
|
+
let(:remote_yaml_path) { File.expand_path('../../../../fixtures/config/remote_database.yml', __FILE__) }
|
42
|
+
it "fetches database definition from database.yml on remote host" do
|
43
|
+
allow_any_instance_of(Dbcp::SshExecutionHost).to receive(:download).with('/www/staging.example.com/current/config/database.yml') { remote_yaml }
|
44
|
+
environment = subject.find 'staging_ssh_only'
|
45
|
+
expect(environment.database).to be_a Dbcp::PostgresDatabase
|
46
|
+
expect(environment.database.database).to eq 'remote_staging_database'
|
47
|
+
expect(environment.database.username).to eq 'remote_staging_username'
|
48
|
+
expect(environment.database.password).to eq 'remote_staging_password'
|
49
|
+
end
|
50
|
+
end
|
33
51
|
end
|
52
|
+
|
34
53
|
context "when environment doesn't exist" do
|
35
54
|
specify { expect(subject.find 'does-not-exist').to be_nil }
|
36
55
|
end
|
56
|
+
|
37
57
|
context "when file doesn't exist" do
|
38
58
|
let(:path) { File.expand_path('../../../../fixtures/config/database-does-not-exist.yml', __FILE__) }
|
39
59
|
specify { expect(subject.find 'development').to be_nil }
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Dbcp::UriEnvironmentProvider do
|
4
|
+
describe "#find" do
|
5
|
+
context "when a URI" do
|
6
|
+
let(:uri) { 'postgres://my_username:my_password@db.example.com:5432/my_database' }
|
7
|
+
it "returns an environment" do
|
8
|
+
environment = subject.find(uri)
|
9
|
+
expect(environment).to be_a Dbcp::Environment
|
10
|
+
expect(environment.environment_name).to eq uri
|
11
|
+
expect(environment.database).to be_a Dbcp::PostgresDatabase
|
12
|
+
expect(environment.database.username).to eq 'my_username'
|
13
|
+
expect(environment.database.password).to eq 'my_password'
|
14
|
+
expect(environment.database.host).to eq 'db.example.com'
|
15
|
+
expect(environment.database.database).to eq 'my_database'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when not a valid URI" do
|
20
|
+
let(:uri) { 'development'}
|
21
|
+
specify { expect(subject.find(uri)).to be_nil }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbcp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabe Martin-Dempesy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -146,23 +146,27 @@ files:
|
|
146
146
|
- lib/dbcp/databases/postgres_database.rb
|
147
147
|
- lib/dbcp/environment.rb
|
148
148
|
- lib/dbcp/environment_providers/database_yaml_environment_provider.rb
|
149
|
+
- lib/dbcp/environment_providers/uri_environment_provider.rb
|
149
150
|
- lib/dbcp/execution_host.rb
|
150
151
|
- lib/dbcp/execution_hosts/local_execution_host.rb
|
151
152
|
- lib/dbcp/execution_hosts/ssh_execution_host.rb
|
152
153
|
- lib/dbcp/version.rb
|
153
154
|
- spec/fixtures/config/database.yml
|
155
|
+
- spec/fixtures/config/remote_database.yml
|
154
156
|
- spec/lib/dbcp/cli_spec.rb
|
155
157
|
- spec/lib/dbcp/database_snapshot_file_spec.rb
|
156
158
|
- spec/lib/dbcp/database_spec.rb
|
157
159
|
- spec/lib/dbcp/databases/mysql_database_spec.rb
|
158
160
|
- spec/lib/dbcp/databases/postgres_database_spec.rb
|
159
161
|
- spec/lib/dbcp/environment_providers/database_yaml_environment_provider_spec.rb
|
162
|
+
- spec/lib/dbcp/environment_providers/uri_environment_provider_spec.rb
|
160
163
|
- spec/lib/dbcp/environment_spec.rb
|
161
164
|
- spec/lib/dbcp/execution_host_spec.rb
|
162
165
|
- spec/lib/dbcp/execution_hosts/local_execution_host_spec.rb
|
163
166
|
- spec/lib/dbcp/execution_hosts/ssh_execution_host_spec.rb
|
164
167
|
- spec/spec_helper.rb
|
165
168
|
- spec/support/.keep
|
169
|
+
- spec/support/execute_in_directory.rb
|
166
170
|
homepage: https://github.com/gabetax/dbcp
|
167
171
|
licenses:
|
168
172
|
- MIT
|
@@ -189,15 +193,18 @@ specification_version: 4
|
|
189
193
|
summary: ''
|
190
194
|
test_files:
|
191
195
|
- spec/fixtures/config/database.yml
|
196
|
+
- spec/fixtures/config/remote_database.yml
|
192
197
|
- spec/lib/dbcp/cli_spec.rb
|
193
198
|
- spec/lib/dbcp/database_snapshot_file_spec.rb
|
194
199
|
- spec/lib/dbcp/database_spec.rb
|
195
200
|
- spec/lib/dbcp/databases/mysql_database_spec.rb
|
196
201
|
- spec/lib/dbcp/databases/postgres_database_spec.rb
|
197
202
|
- spec/lib/dbcp/environment_providers/database_yaml_environment_provider_spec.rb
|
203
|
+
- spec/lib/dbcp/environment_providers/uri_environment_provider_spec.rb
|
198
204
|
- spec/lib/dbcp/environment_spec.rb
|
199
205
|
- spec/lib/dbcp/execution_host_spec.rb
|
200
206
|
- spec/lib/dbcp/execution_hosts/local_execution_host_spec.rb
|
201
207
|
- spec/lib/dbcp/execution_hosts/ssh_execution_host_spec.rb
|
202
208
|
- spec/spec_helper.rb
|
203
209
|
- spec/support/.keep
|
210
|
+
- spec/support/execute_in_directory.rb
|