prick 0.10.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fa13b0150bd8e2a403643947215116be13d78d33f053e15c766a258574cf79e
4
- data.tar.gz: 8b817641aff64c1ad488ce7562ac03a26c8d2144b3bf79999ef0af0ae910d298
3
+ metadata.gz: 65c56eb6650acf4a9a15acc00589075fe551548f06df7f714db56b89fc8f0f7d
4
+ data.tar.gz: 585b320426243c5a3a82df87a924e89e03807c47b618a44350a8c7e646112f34
5
5
  SHA512:
6
- metadata.gz: 5b0896b4d9d38984cee6f3a3d6481ed4b9607c54101a120aaa4344b701ed649fe7ef5ca25bcb1214aa1802700e80e0bee41aa47157039f4f2774825d0af04f44
7
- data.tar.gz: e19f8f4b6529bc1463f01fdcb5077ddfd55fe970ac062ef8fbbfd79dd31d1c8f74dcef759222cfdbaf4890158ef6b7993ddeb369d8c0499ead2265f20073769a
6
+ metadata.gz: 72f83cb2412de38665afac3c6b3e7bd293d17ad35c64910bec6ef6db5080922d5d6771b044b76dcc52539da60327843861f681f979f3e04739a3cb04f804f8e1
7
+ data.tar.gz: c5460d78662709f1c5cb8bc5badd3243230cd41ff800b3d8fb9eee3d3e49cd314f51548dab060f0435d5c1aa58c3dbdfb22c490acc96b8e4dc101659675af027
data/exe/prick CHANGED
@@ -195,6 +195,13 @@ begin
195
195
  exit 0
196
196
  end
197
197
 
198
+ # Change to parent directory containing the Prick version file if not found
199
+ # in the current directory
200
+ program.current_directory = Dir.getwd
201
+ while !Dir.getwd != "/" && !File.exist?(PRICK_VERSION_FILE)
202
+ Dir.chdir("..")
203
+ end
204
+
198
205
  # Check prick version
199
206
  file = PrickVersion.new
200
207
  file.exist? or raise Prick::Error, "Can't find prick version file '#{file.path}'"
data/lib/prick/builder.rb CHANGED
@@ -7,20 +7,24 @@ module Prick
7
7
  # and is used to match a build file. Build files are looked up in the
8
8
  # following order:
9
9
  #
10
- # #{name}, #{name}.* executable
10
+ # #{name} executable
11
+ # #{name}.* executable
11
12
  # #{name}.yml
12
13
  # #{name}.sql
13
14
  # #{name}/
14
15
  #
16
+ # The output from executable objects is expected to be SQL statements that
17
+ # are fed into postgres
18
+ #
15
19
  # When a resource match a directory, the directory can contain a special
16
20
  # default resource ('build' or 'migrate') that takes over the rest of the
17
21
  # build process for that directory. Typically, you'll use the 'build.yml' or
18
- # 'migrate.yml' to control the build order of the other resources
19
- #
20
- # If a directory doesn't contain a build resource, the resources in the
21
- # directory are built in alphabetic order
22
+ # 'migrate.yml' to control the build order of the other resources. If a
23
+ # directory doesn't contain a build resource, the resources in the directory
24
+ # are built in alphabetic order
22
25
  #
23
- # Build SQL scripts are executed with search path set to containing schema
26
+ # Build (but not migration) SQL scripts and executables are executed with
27
+ # search path set to containing schema
24
28
  #
25
29
  class Builder
26
30
  attr_reader :database
@@ -34,6 +38,7 @@ module Prick
34
38
  @default = default
35
39
  @execute = true
36
40
  @lines = []
41
+ @cwd = Dir.getwd # used in error messages
37
42
  end
38
43
 
39
44
  def build(subject = default, execute: true)
@@ -63,7 +68,13 @@ module Prick
63
68
  # puts "do_sql(#{path})"
64
69
  do_dir(path) { |file|
65
70
  if @execute
66
- Rdbms.exec_file(database.name, file, user: database.user, schema: schema)
71
+ begin
72
+ Rdbms.exec_file(database.name, file, user: database.user, schema: schema)
73
+ rescue Command::Error => ex
74
+ $stderr.puts ex.stderr
75
+ $stderr.puts "in #{reldir}/#{file}"
76
+ exit 1
77
+ end
67
78
  else
68
79
  @lines += IO.readlines(file).map(&:chomp)
69
80
  end
@@ -71,12 +82,18 @@ module Prick
71
82
  true
72
83
  end
73
84
 
74
- def do_exe(path)
85
+ def do_exe(path, schema: nil)
75
86
  # puts "do_exe(#{path})"
76
87
  do_dir(path) { |file|
77
- lines = Command.command "#{file} #{database.name} #{database.user}" # FIXME Security
88
+ lines = Command.command "./#{file} #{database.name} #{database.user}" # FIXME Security
78
89
  if @execute
79
- Rdbms.exec_sql(database.name, lines.join("\n"), database.user)
90
+ begin
91
+ Rdbms.exec_sql(database.name, lines.join("\n"), user: database.user, schema: schema)
92
+ rescue Command::Error => ex
93
+ $stderr.puts ex.stderr
94
+ $stderr.puts "from #{reldir}/#{file}"
95
+ exit 1
96
+ end
80
97
  else
81
98
  @lines += lines
82
99
  end
@@ -126,6 +143,14 @@ module Prick
126
143
  end
127
144
  }
128
145
  end
146
+
147
+ private
148
+ # Return the relative path to the current directory from the directory of
149
+ # the time of the instantiation of the Builder object. Used in error
150
+ # messages
151
+ def reldir
152
+ Dir.getwd.sub(/^#{@cwd}\//, "")
153
+ end
129
154
  end
130
155
 
131
156
  class MigrationBuilder < Builder
@@ -167,6 +192,11 @@ module Prick
167
192
  schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
168
193
  super(path, schema: schema)
169
194
  end
195
+
196
+ def do_exe(path)
197
+ schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
198
+ super(path, schema: schema)
199
+ end
170
200
  end
171
201
  end
172
202
 
@@ -59,7 +59,23 @@ module Prick
59
59
  @version = nil
60
60
  end
61
61
 
62
- def clean() recreate end # TODO: Find solution that doesn't involve dropping the database
62
+ # Hollow-out a database without dropping it. This is useful compared to a
63
+ # simple drop database since it wont block on other sessions wont block
64
+ def clean()
65
+ if exist?
66
+ schemas = Rdbms.select_values(
67
+ "postgres",
68
+ "select nspname from pg_namespace where nspowner != 10")
69
+ for schema in schemas
70
+ Rdbms.exec_sql(name, "drop schema \"#{schema}\" cascade")
71
+ end
72
+ Rdbms.exec_sql(name, "drop schema if exists public cascade")
73
+ Rdbms.exec_sql(name, "create schema public authorization postgres")
74
+ Rdbms.exec_sql(name, "grant usage, create on schema public to public")
75
+ else
76
+ create
77
+ end
78
+ end
63
79
 
64
80
  def to_s() name end
65
81
  end
data/lib/prick/program.rb CHANGED
@@ -10,8 +10,10 @@ module Prick
10
10
 
11
11
  attr_accessor :quiet
12
12
  attr_accessor :verbose
13
+ attr_accessor :current_directory # Path to the directory where prick was called from
13
14
 
14
- def initialize(quiet: false, verbose: false)
15
+ def initialize(current_directory = Dir.getwd, quiet: false, verbose: false)
16
+ @current_directory = current_directory
15
17
  @quiet = quiet
16
18
  @verbose = verbose
17
19
  end
@@ -95,8 +97,9 @@ module Prick
95
97
  database = database ? Database.new(database, project.user) : project.database(version)
96
98
  project.load(database, version: version)
97
99
  mesg "Loaded v#{version}", into_mesg, "from cache"
98
- else file = file_or_version
99
- project.load(database, file: file)
100
+ else
101
+ file = file_or_version
102
+ project.load(database, file: norm_path(file))
100
103
  mesg "Loaded #{File.basename(file)}", into_mesg
101
104
  end
102
105
  end
@@ -104,9 +107,8 @@ module Prick
104
107
  def save(version, file)
105
108
  database = project.database(version)
106
109
  database.exist? or raise "Can't find database '#{database}'"
107
- subj_mesg = file ? file : "cache"
108
- project.save(database, file: file)
109
- mesg "Saved #{database} to #{subj_mesg}"
110
+ project.save(database, file: norm_path(file))
111
+ mesg "Saved #{database} to #{file || 'cache'}"
110
112
  end
111
113
 
112
114
  def drop(database, all)
@@ -230,15 +232,16 @@ module Prick
230
232
 
231
233
  # TODO: Create a Backup class and a Project#backup_store object
232
234
  def backup(file = nil)
233
- file = file || File.join(SPOOL_DIR, "#{project.name}-#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}.sql.gz")
234
- project.save(file: file)
235
+ path = norm_path(file) ||
236
+ File.join(SPOOL_DIR, "#{project.name}-#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}.sql.gz")
237
+ project.save(file: path)
235
238
  mesg "Backed-up database to #{file}"
236
239
  end
237
240
 
238
- def restore(file_arg = nil)
239
- file = file_arg || Dir.glob(File.join(SPOOL_DIR, "#{name}-*.sql.gz")).sort.last
240
- File.exist?(file) or raise Error, "Can't find #{file_arg || "any backup file"}"
241
- project.load(file: file)
241
+ def restore(file = nil)
242
+ path = norm_path(file) || Dir.glob(File.join(SPOOL_DIR, "#{name}-*.sql.gz")).sort.last
243
+ File.exist?(path) or raise Error, "Can't find #{file || "any backup file"}"
244
+ project.load(file: path)
242
245
  mesg "Restored database from #{file}"
243
246
  end
244
247
 
@@ -249,6 +252,16 @@ module Prick
249
252
  project_name == project.name or raise Error, "Database not owned by this prick project: #{database}"
250
253
  end
251
254
 
255
+ # Expand relative path with respect to the directory where prick was called
256
+ # from. Return nil if file is nil
257
+ def norm_path(file)
258
+ if file && !file.start_with?("/")
259
+ File.join(current_directory, file)
260
+ else
261
+ file
262
+ end
263
+ end
264
+
252
265
  def mesg(*args) puts args.compact.grep(/\S/).join(' ') if !quiet end
253
266
  def verb(*args) puts args.compact.grep(/\S/).join(' ') if verbose end
254
267
  end
data/lib/prick/version.rb CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # Required by gem
6
6
  module Prick
7
- VERSION = "0.10.0"
7
+ VERSION = "0.15.0"
8
8
  end
9
9
 
10
10
  # Project related code starts here
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prick
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-11 00:00:00.000000000 Z
11
+ date: 2021-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shellopts