prick 0.8.0 → 0.13.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: 98dae1ae969be39dba2d394c5ef973837bddd75b57e95a50984369b9b63b68a9
4
- data.tar.gz: 2d346ef2b8b6ea0bde7c6a0442278f9c9a3132a8268555417790f7cd5f45a936
3
+ metadata.gz: da40d1823b2163a2ce84de52d2a41aa222ae87afc6bb7cbe22e2d5045a162fba
4
+ data.tar.gz: cee09b71589069b2dbe386afec271ef1677980e0e6d6735462a8c087338e71d9
5
5
  SHA512:
6
- metadata.gz: fe461c8c031c7279cdd53329b92808a92367939841d30c4e7a995ae2c42e089fbdf0c8e143beef9997512bb94dc0b2c838df83d8990b545a27dec1ab94e0f3ba
7
- data.tar.gz: 03cd1324f95be8e3672cc0e1a05e1818c287d62e786a4ac27eebf42d9f71151766d7002f1f19de0c1f44b86568797e80d96e6209103661ba1d4cb8132d959ca8
6
+ metadata.gz: 1b8f5f478092b60b5745983d911f37e516b24957bcdd978157e97263d97c65857e71b1335dc10a7f38fdd742f27c62f4cd28071e4ff31f53cca4f51e88f55557
7
+ data.tar.gz: 7a3efb1a894edfa8b5ca82688b4820126f2898f2448a92d84af49e611b9156bfbf20f34e62deb605ca50cb9fbb57691d6e2ceae2d604fbb6bb6dc3166e751213
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}'"
@@ -251,7 +258,7 @@ begin
251
258
  program.save(version, file)
252
259
 
253
260
  when :drop
254
- program.drop(args.expect(0..1), opts.drop!.all)
261
+ program.drop(args.expect(0..1), opts.drop!.all?)
255
262
 
256
263
  when :diff
257
264
  mark = opts.diff!.mark
data/lib/prick/builder.rb CHANGED
@@ -7,18 +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
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
19
25
  #
20
- # If a directory doesn't contain a build resource, the resources in the
21
- # directory are built in alphabetic order
26
+ # Build (but not migration) SQL scripts and executables are executed with
27
+ # search path set to containing schema
22
28
  #
23
29
  class Builder
24
30
  attr_reader :database
@@ -57,11 +63,11 @@ module Prick
57
63
  Dir.chdir(dir) { yield(file) }
58
64
  end
59
65
 
60
- def do_sql(path)
66
+ def do_sql(path, schema: nil)
61
67
  # puts "do_sql(#{path})"
62
68
  do_dir(path) { |file|
63
69
  if @execute
64
- Rdbms.exec_file(database.name, file, user: database.user)
70
+ Rdbms.exec_file(database.name, file, user: database.user, schema: schema)
65
71
  else
66
72
  @lines += IO.readlines(file).map(&:chomp)
67
73
  end
@@ -69,12 +75,12 @@ module Prick
69
75
  true
70
76
  end
71
77
 
72
- def do_exe(path)
78
+ def do_exe(path, schema: nil)
73
79
  # puts "do_exe(#{path})"
74
80
  do_dir(path) { |file|
75
- lines = Command.command "#{file} #{database.name} #{database.user}" # FIXME Security
81
+ lines = Command.command "./#{file} #{database.name} #{database.user}" # FIXME Security
76
82
  if @execute
77
- Rdbms.exec_sql(database.name, lines.join("\n"), database.user)
83
+ Rdbms.exec_sql(database.name, lines.join("\n"), user: database.user, schema: schema)
78
84
  else
79
85
  @lines += lines
80
86
  end
@@ -159,6 +165,17 @@ module Prick
159
165
  end
160
166
 
161
167
  def self.yml_file(directory) File.join(directory, "build") + ".yml" end
168
+
169
+ protected
170
+ def do_sql(path)
171
+ schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
172
+ super(path, schema: schema)
173
+ end
174
+
175
+ def do_exe(path)
176
+ schema = Dir.getwd.sub(/^.*schema\/([^\/]+)(?:\/.*)?$/, '\1')
177
+ super(path, schema: schema)
178
+ end
162
179
  end
163
180
  end
164
181
 
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)
@@ -162,7 +164,7 @@ module Prick
162
164
  end
163
165
 
164
166
  def prepare_schema(name)
165
- raise NotYet
167
+ project.prepare_schema(name)
166
168
  end
167
169
 
168
170
  def prepare_diff(version = nil)
@@ -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/project.rb CHANGED
@@ -162,6 +162,16 @@ module Prick
162
162
  self
163
163
  end
164
164
 
165
+ def prepare_schema(name, commit: true)
166
+ path = File.join(SCHEMA_DIR, name)
167
+ FileUtils.mkdir_p(path)
168
+ Git.add Share.cp("schema/schema.sql", path, clobber: false, templates: { 'SCHEMA' => name })
169
+ Git.add Share.cp("schema/build.yml", path, clobber: false)
170
+ File.open(Schema.yml_file, "a") { |f| f.write("- #{name}\n") }
171
+ Git.add(Schema.yml_file)
172
+ submit "Added schema #{name}", commit
173
+ end
174
+
165
175
  def prepare_diff(from_version = version)
166
176
  begin
167
177
  from_name = "#{name}-base"
data/lib/prick/rdbms.rb CHANGED
@@ -4,16 +4,15 @@ require 'csv'
4
4
 
5
5
  module Prick
6
6
  module Rdbms
7
- # extend Ensure
8
-
9
7
  ### EXECUTE SQL
10
8
 
11
9
  # Execute the SQL statement and return stdout as an array of tuples
12
- def self.exec_sql(db, sql, user: ENV['USER'])
10
+ def self.exec_sql(db, sql, user: ENV['USER'], schema: nil)
11
+ schema ||= "public"
13
12
  stdout = Command.command %(
14
13
  {
15
14
  echo "set role #{user};"
16
- echo "set search_path to public;"
15
+ echo "set search_path to #{schema};"
17
16
  cat <<'EOF'
18
17
  #{sql}
19
18
  EOF
@@ -23,8 +22,8 @@ EOF
23
22
  end
24
23
 
25
24
  # Execute the given file and return stdout as an array of tuples
26
- def self.exec_file(db, file, user: ENV['USER'])
27
- self.exec_sql(db, File.read(file), user: user)
25
+ def self.exec_file(db, file, user: ENV['USER'], schema: nil)
26
+ self.exec_sql(db, File.read(file), user: user, schema: schema)
28
27
  end
29
28
 
30
29
  # Execute the SQL statement and return the result as an array of record tuples
data/lib/prick/schema.rb CHANGED
@@ -9,7 +9,8 @@ module Prick
9
9
 
10
10
  # Note this models the SCHEMA_DIR directory, not a database schema
11
11
  class Schema
12
- def yml_file() SchemaBuilder.yml_file(SCHEMA_DIR) end
12
+ def yml_file() self.class.yml_file end
13
+ def self.yml_file() SchemaBuilder.yml_file(SCHEMA_DIR) end
13
14
 
14
15
  def version() SchemaVersion.load end
15
16
  def version=(version) SchemaVersion.new(version).write 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.8.0"
7
+ VERSION = "0.13.0"
8
8
  end
9
9
 
10
10
  # Project related code starts here
@@ -1,5 +1,3 @@
1
1
 
2
2
  drop schema if exists [<SCHEMA>] cascade;
3
3
  create schema [<SCHEMA>];
4
-
5
- set search_path to [<SCHEMA>];
@@ -1,5 +1,3 @@
1
1
 
2
2
  drop schema if exists prick cascade;
3
3
  create schema prick;
4
-
5
- set search_path to prick;
@@ -1,7 +1,6 @@
1
1
  # Default schema files
2
2
  #
3
3
  ---
4
- - schema
5
4
  - roles
6
5
  - types
7
6
  - tables
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.8.0
4
+ version: 0.13.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-10 00:00:00.000000000 Z
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shellopts
@@ -133,7 +133,6 @@ files:
133
133
  - share/schema/schema/prick/tables.sql
134
134
  - share/schema/schema/public/.keep
135
135
  - share/schema/schema/public/build.yml
136
- - share/schema/schema/public/schema.sql
137
136
  - test_assorted
138
137
  - test_feature
139
138
  - test_refactor
@@ -156,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
155
  - !ruby/object:Gem::Version
157
156
  version: '0'
158
157
  requirements: []
159
- rubygems_version: 3.1.4
158
+ rubygems_version: 3.1.2
160
159
  signing_key:
161
160
  specification_version: 4
162
161
  summary: A release control and management system for postgresql
@@ -1,3 +0,0 @@
1
- set search_path to public;
2
-
3
-