pg_migrate 0.1.0 → 0.1.1
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.
- data/Gemfile.lock +1 -1
- data/lib/pg_migrate/builder.rb +42 -3
- data/lib/pg_migrate/command_line.rb +49 -3
- data/lib/pg_migrate/migrator.rb +4 -11
- data/lib/pg_migrate/version.rb +1 -1
- data/lib/pg_migrate.rb +1 -0
- data/spec/pg_migrate/command_line_spec.rb +1 -0
- metadata +2 -2
data/Gemfile.lock
CHANGED
data/lib/pg_migrate/builder.rb
CHANGED
@@ -8,7 +8,7 @@ module PgMigrate
|
|
8
8
|
# takes a unprocessed manifest directory, and adds before/after headers to each file
|
9
9
|
class Builder
|
10
10
|
|
11
|
-
attr_accessor :manifest_reader, :sql_reader
|
11
|
+
attr_accessor :manifest_reader, :sql_reader, :loaded_manifest
|
12
12
|
|
13
13
|
def initialize(manifest_reader, sql_reader)
|
14
14
|
@log = Logging.logger[self]
|
@@ -21,7 +21,8 @@ module PgMigrate
|
|
21
21
|
# input_dir is root path, contains file 'manifest' and 'migrations'
|
22
22
|
# output_dir will have a manifest and migrations folder, but processed
|
23
23
|
# force will create the output dir if needed, and *delete an existing directory* if it's in the way
|
24
|
-
|
24
|
+
# test will run tests
|
25
|
+
def build(input_dir, output_dir, options={:force=>true, :test=>false})
|
25
26
|
input_dir = File.expand_path(input_dir)
|
26
27
|
output_dir = File.expand_path(output_dir)
|
27
28
|
|
@@ -75,13 +76,18 @@ module PgMigrate
|
|
75
76
|
end
|
76
77
|
|
77
78
|
# in order array of manifest declarations
|
78
|
-
loaded_manifest = @manifest_reader.load_input_manifest(input_dir)
|
79
|
+
@loaded_manifest = @manifest_reader.load_input_manifest(input_dir)
|
79
80
|
# hashed on migration name hash of manifest
|
80
81
|
|
81
82
|
loaded_manifest_hash = @manifest_reader.hash_loaded_manifest(loaded_manifest)
|
82
83
|
@manifest_reader.validate_migration_paths(input_dir, loaded_manifest)
|
83
84
|
|
84
85
|
build_up(input_dir, output_dir, loaded_manifest_hash, loaded_manifest)
|
86
|
+
|
87
|
+
# ok we are done. time to test!
|
88
|
+
if options[:test]
|
89
|
+
test(output_dir, options)
|
90
|
+
end
|
85
91
|
end
|
86
92
|
|
87
93
|
def build_up(input_dir, output_dir, loaded_manifest_hash, loaded_manifest)
|
@@ -118,10 +124,13 @@ module PgMigrate
|
|
118
124
|
|
119
125
|
# creates the 'pg_migrations table'
|
120
126
|
def create_bootstrap_script(migration_out_path)
|
127
|
+
@log.debug "creating bootstrap script #{migration_out_path}"
|
121
128
|
run_template("bootstrap.erb", binding, File.join(migration_out_path, BOOTSTRAP_FILENAME))
|
122
129
|
end
|
123
130
|
|
124
131
|
def create_wrapped_up_migration(migration_in_filepath, migration_out_filepath, migration_def, loaded_manifest)
|
132
|
+
@log.debug "securing migration #{migration_def.name}"
|
133
|
+
|
125
134
|
builder_version="pg_migrate_ruby-#{PgMigrate::VERSION}"
|
126
135
|
manifest_version=loaded_manifest[-1].ordinal
|
127
136
|
migration_content = nil
|
@@ -164,10 +173,40 @@ module PgMigrate
|
|
164
173
|
|
165
174
|
create_wrapped_up_migration(migration_in_path, migration_out_path, migration_def, loaded_manifest)
|
166
175
|
else
|
176
|
+
@log.debug "copying non-sql file #{migration_in_path}"
|
167
177
|
# if not a .sql file, just copy it over
|
168
178
|
FileUtils.cp(migration_in_path, migration_out_path)
|
169
179
|
end
|
170
180
|
end
|
171
181
|
end
|
182
|
+
|
183
|
+
def recreate_test_database(conn, test_db_name)
|
184
|
+
@log.debug "recreate test database #{test_db_name}"
|
185
|
+
|
186
|
+
conn.exec("drop database if exists #{test_db_name}")
|
187
|
+
conn.exec("create database #{test_db_name}")
|
188
|
+
end
|
189
|
+
|
190
|
+
def test(output_dir, test_options)
|
191
|
+
|
192
|
+
@log.info "testing..."
|
193
|
+
|
194
|
+
oobconn = Util::get_oob_conn(test_options)
|
195
|
+
target_dbname = Util::get_db_name(test_options)
|
196
|
+
|
197
|
+
run_manifests = []
|
198
|
+
|
199
|
+
|
200
|
+
recreate_test_database(oobconn, target_dbname)
|
201
|
+
|
202
|
+
conn = Util::get_conn(test_options)
|
203
|
+
|
204
|
+
migrator = Migrator.new(manifest_reader, sql_reader, :pgconn => conn)
|
205
|
+
migrator.migrate(output_dir)
|
206
|
+
conn.close
|
207
|
+
|
208
|
+
@log.info "test success"
|
209
|
+
|
210
|
+
end
|
172
211
|
end
|
173
212
|
end
|
@@ -78,6 +78,9 @@ module PgMigrate
|
|
78
78
|
method_option :out, :aliases => "-o", :banner => "output directory", :desc => "where the processed migrations will be placed"
|
79
79
|
method_option :force, :aliases => "-f", :type => :boolean, :banner => "overwrite out", :desc => "if specified, the out directory will be created before processing occurs, replacing any existing directory"
|
80
80
|
method_option :verbose, :aliases => "-v", :type => :boolean, :banner => "verbose", :desc=> "set to raise verbosity"
|
81
|
+
method_option :test, :aliases => "-t", :default => false, :type => :boolean, :banner => "run tests", :desc => "run tests by creating a test database and executing migrations"
|
82
|
+
method_option :oob_connopts, :aliases => "-b",:default=> nil, :type => :hash, :banner => "out-of-band connection options", :desc => "this is a 'landing pad' database from which pg_migrate can execute 'create/drop' against the database specified by the connopts argument. database connection options used by gem 'pg': dbname|host|hostaddr|port|user|password|connection_timeout|options|sslmode|krbsrvname|gsslib|service"
|
83
|
+
method_option :connopts, :aliases => "-c", :default => nil, :type => :hash, :banner => "connection options", :desc => "database connection options used by gem 'pg': dbname|host|hostaddr|port|user|password|connection_timeout|options|sslmode|krbsrvname|gsslib|service"
|
81
84
|
|
82
85
|
def build
|
83
86
|
source = options[:source]
|
@@ -86,7 +89,7 @@ module PgMigrate
|
|
86
89
|
source = @@packaged_source
|
87
90
|
end
|
88
91
|
|
89
|
-
method_defaults = {"force" => false, "verbose" => false}
|
92
|
+
method_defaults = {"force" => false, "verbose" => false, "test" => false}
|
90
93
|
local_options = set_defaults_from_file(method_defaults, "build", source)
|
91
94
|
local_options = local_options.merge(options)
|
92
95
|
|
@@ -97,10 +100,41 @@ module PgMigrate
|
|
97
100
|
exit 1
|
98
101
|
end
|
99
102
|
|
103
|
+
if local_options["test"].to_s == "true"
|
104
|
+
if !local_options["oob_connopts"]
|
105
|
+
puts "error: --oob_connopts not specified when test = true"
|
106
|
+
exit 1
|
107
|
+
else
|
108
|
+
# type safety; if string is found, convert to hash
|
109
|
+
local_options["oob_connopts"] = parse_to_hash(local_options["oob_connopts"])
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
if !local_options["connopts"]
|
114
|
+
puts "error: --connopts not specified when test = true"
|
115
|
+
exit 1
|
116
|
+
else
|
117
|
+
# type safety; if string is found, convert to hash
|
118
|
+
local_options["connopts"] = parse_to_hash(local_options["connopts"])
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
100
123
|
manifest_reader = ManifestReader.new
|
101
124
|
sql_reader = SqlReader.new
|
102
125
|
builder = Builder.new(manifest_reader, sql_reader)
|
103
|
-
|
126
|
+
|
127
|
+
begin
|
128
|
+
builder.build(source, local_options["out"],
|
129
|
+
:force => local_options["force"],
|
130
|
+
:test => local_options["test"],
|
131
|
+
:oob_connopts => local_options["oob_connopts"],
|
132
|
+
:connopts => local_options["connopts"])
|
133
|
+
rescue PG::Error => pge
|
134
|
+
puts "test failure"
|
135
|
+
puts pge
|
136
|
+
end
|
137
|
+
|
104
138
|
end
|
105
139
|
|
106
140
|
|
@@ -132,7 +166,7 @@ module PgMigrate
|
|
132
166
|
exit 1
|
133
167
|
end
|
134
168
|
if !local_options["version"]
|
135
|
-
puts "error: --version not specified"
|
169
|
+
puts "error: --version not specified"
|
136
170
|
exit 1
|
137
171
|
end
|
138
172
|
|
@@ -186,6 +220,18 @@ module PgMigrate
|
|
186
220
|
return map
|
187
221
|
|
188
222
|
end
|
223
|
+
|
224
|
+
def parse_to_hash(value)
|
225
|
+
hash = {}
|
226
|
+
|
227
|
+
bits = value.split()
|
228
|
+
bits.each do |bit|
|
229
|
+
key, value = bit.split(':',2)
|
230
|
+
hash[key] = value
|
231
|
+
end
|
232
|
+
|
233
|
+
return hash
|
234
|
+
end
|
189
235
|
end
|
190
236
|
|
191
237
|
|
data/lib/pg_migrate/migrator.rb
CHANGED
@@ -18,17 +18,10 @@ module PgMigrate
|
|
18
18
|
# The manifest_path argument should point to your manifest
|
19
19
|
# manifest_path = the directory containing your 'manifest' file, 'up' directory, 'down' directory, 'test' directory
|
20
20
|
# this method will throw an exception if anything goes wrong (such as bad SQL in the migrations themselves)
|
21
|
-
|
22
21
|
def migrate(manifest_path)
|
23
22
|
@manifest_path = manifest_path
|
24
23
|
|
25
|
-
|
26
|
-
@conn = @connection_hash[:pgconn]
|
27
|
-
elsif !@connection_hash[:connstring].nil?
|
28
|
-
@conn = PG::Connection.open(@connection_hash[:connstring])
|
29
|
-
else
|
30
|
-
@conn = PG::Connection.open(@connection_hash)
|
31
|
-
end
|
24
|
+
@conn = Util::get_conn(@connection_hash)
|
32
25
|
|
33
26
|
# this is used to record the version of the 'migrator' in the pg_migrate table
|
34
27
|
@conn.exec("SET application_name = 'pg_migrate_ruby-#{PgMigrate::VERSION}'")
|
@@ -37,7 +30,7 @@ module PgMigrate
|
|
37
30
|
process_manifest()
|
38
31
|
|
39
32
|
# execute the migrations
|
40
|
-
run_migrations()
|
33
|
+
run_migrations(@manifest)
|
41
34
|
end
|
42
35
|
|
43
36
|
|
@@ -48,7 +41,7 @@ module PgMigrate
|
|
48
41
|
end
|
49
42
|
|
50
43
|
# run all necessary migrations
|
51
|
-
def run_migrations
|
44
|
+
def run_migrations(manifest)
|
52
45
|
|
53
46
|
# run bootstrap before user migrations to prepare database
|
54
47
|
run_bootstrap
|
@@ -68,7 +61,7 @@ module PgMigrate
|
|
68
61
|
|
69
62
|
# execute a single migration by loading it's statements from file, and then executing each
|
70
63
|
def execute_migration(name, filepath)
|
71
|
-
@log.
|
64
|
+
@log.info "executing migration #{filepath}"
|
72
65
|
|
73
66
|
statements = @sql_reader.load_migration(filepath)
|
74
67
|
if statements.length == 0
|
data/lib/pg_migrate/version.rb
CHANGED
data/lib/pg_migrate.rb
CHANGED
@@ -27,6 +27,7 @@ describe CommandLine do
|
|
27
27
|
props = Properties.new
|
28
28
|
props['build.out'] = output_dir
|
29
29
|
props['build.force'] = "true"
|
30
|
+
props['build.test'] = "false"
|
30
31
|
#props['up.connopts'] = "dbname:pg_migrate_test host:localhost port:5432 user:postgres password:postgres"
|
31
32
|
|
32
33
|
# and put that properties file in the input dir
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_migrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: logging
|