prick 0.39.5 → 0.39.7

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: 01771a2a76d7f9c9350c6e05424cf29de726d8bc6702f21c3577cbb3b9a93b6c
4
- data.tar.gz: b7a4e6895f8d80943ac7ccc364aeebbb24b73f61df072c2ff41f72a44c5e6e99
3
+ metadata.gz: 7d27db668e8163dce24bb6c7548f5332a5f5e8c72ee4a5e266b10a032a06b782
4
+ data.tar.gz: c3e293fec4e73625c45e28198f112a52cef7d83816274ca3a63231cfc6746c28
5
5
  SHA512:
6
- metadata.gz: a027ffc3f0a0e19fea6bb1bca1f2afe4eb0adb3b9d171602b5512d358ca8ca4d6490f384e90ac88d0d68da935fd413c63531588377ea4c0c0953075e86f42f96
7
- data.tar.gz: dca9bf4af5c6fc4cda593cb25f963a3d92f3360fa51b535fc43c3ffeddef313bdaa8e41719de9297f088deec5c1cc0876d91d8dc1593bac4c56b8f60736726f0
6
+ metadata.gz: 02fcb89d65a6c99e95b9263266c84353eac7a572a6338bcabde51d699377a4c32161dd785ef1b9ccdd16f58ba85e92174ba09e086eda7fd11426449d30c2fa2e
7
+ data.tar.gz: 7079b45ddf107b13c1ea22e131ea580c16c9e3378fc0f0ff3e1eb22b8b0e8b3c22a61e3732efb1f58180a29fc97d5453a0ff2a96cec2c4d3ac1a5083948a8e97
data/exe/prick CHANGED
@@ -191,7 +191,7 @@ SPEC = %(
191
191
  List variables for the current environment
192
192
 
193
193
  dump.migration! --force -- VERSION
194
-
194
+
195
195
  dump.type!
196
196
  Dumps a PgGraph object
197
197
 
@@ -203,8 +203,8 @@ SPEC = %(
203
203
 
204
204
  dump.value! -- VARIABLE...
205
205
  Dumps values of the given variables. Multiple variables can be read into bash
206
- variables using read:
207
-
206
+ variables using read:
207
+
208
208
  read name title <<< $(prick dump value PRICK_NAME PRICK_TITLE)
209
209
 
210
210
  dump.node!
@@ -217,7 +217,7 @@ SPEC = %(
217
217
  TODO
218
218
  )
219
219
 
220
- def require_db(database = Prick.state&.database, exist: true)
220
+ def require_db(database = Prick.state&.database, exist: true)
221
221
  database or raise ArgumentError
222
222
  dba = State.connection
223
223
  if exist
@@ -290,7 +290,7 @@ begin
290
290
  state_file = opts.state_file || PRICK_STATE_PATH
291
291
 
292
292
  # Process init command and exit
293
- if opts.subcommand == :init!
293
+ if opts.subcommand == :init!
294
294
  dir, name = Prick::SubCommand.init(project_file, args.expect(0..1), cmd.name, cmd.title)
295
295
  Prick.mesg "Initialized Prick project '#{name}' in #{File.absolute_path(dir)}/"
296
296
  exit
@@ -369,8 +369,8 @@ begin
369
369
  arg = args.expect(1)
370
370
  version = PrickVersion.try(arg) or Prick.error "Illegal version: #{arg}"
371
371
  Prick::SubCommand.create_migration(
372
- username, version,
373
- force: create_command.subcommand!.force?,
372
+ username, version,
373
+ force: create_command.subcommand!.force?,
374
374
  file: create_command.subcommand!.file)
375
375
  when :users, :schema, :data, :all
376
376
  raise NotImplementedError
@@ -384,7 +384,7 @@ begin
384
384
  dump = cmd.dump? ? cmd.dump("batches")&.to_sym || :batches : nil
385
385
  # exclude = cmd.exclude? ? cmd.exclude.split(",") : []
386
386
  Prick::SubCommand.build(
387
- database, username, args.expect(0..1),
387
+ database, username, args.expect(0..1),
388
388
  force: cmd.force?, step: cmd.step?, timer: cmd.time?, dump: dump)
389
389
 
390
390
  when :make!
@@ -392,7 +392,7 @@ begin
392
392
  clean_pg_meta_cache
393
393
  dump = cmd.dump? ? cmd.dump("batches")&.to_sym || :batches : nil
394
394
  Prick::SubCommand.make(
395
- database, username, args.expect(0..1),
395
+ database, username, args.expect(0..1),
396
396
  step: cmd.step?, timer: cmd.time?, dump: dump)
397
397
 
398
398
  when :run!
@@ -400,7 +400,7 @@ begin
400
400
  clean_pg_meta_cache
401
401
  dump = cmd.dump? ? cmd.dump("batches")&.to_sym || :batches : nil
402
402
  Prick::SubCommand.run(
403
- database, username, args.expect(1),
403
+ database, username, args.expect(1),
404
404
  step: cmd.step?, timer: cmd.time?, dump: dump, schema: cmd.schema)
405
405
 
406
406
  when :touch!
@@ -457,7 +457,7 @@ begin
457
457
 
458
458
  when :release!
459
459
  kind = args.expect(1).to_sym
460
- constrain? kind, :major, :minor, :patch or
460
+ constrain? kind, :major, :minor, :patch or
461
461
  Prick.failure "Expected 'major', 'minor', or 'patch' argument, got '#{kind}'"
462
462
  Prick::SubCommand.release(kind)
463
463
 
@@ -472,7 +472,7 @@ begin
472
472
  case cmd.subcommand
473
473
  when :environments!; Prick::SubCommand.list_environments(format: format)
474
474
  when :databases!; Prick::SubCommand.list_databases(format: format)
475
- when :variables!;
475
+ when :variables!;
476
476
  all = cmd.subcommand!.all?
477
477
  Prick::SubCommand.list_variables(format: format, all: all)
478
478
  when :users!; Prick::SubCommand.list_users
@@ -506,7 +506,7 @@ begin
506
506
  raise NotImplementedError
507
507
  when :variable!
508
508
  scope =
509
- case [subject.export?, subject.local?]
509
+ case [subject.export?, subject.local?]
510
510
  in [true, false]; :global
511
511
  in [false, true]; :local
512
512
  in [false, false]; nil
@@ -544,7 +544,7 @@ rescue ShellOpts::Error, Prick::Error => ex
544
544
  ShellOpts.error(ex.message)
545
545
 
546
546
  # FIXME
547
- #rescue RuntimeError, IOError, ShellOpts::Failure, Prick::Failure, Prick::Build::PostgresError => ex
547
+ #rescue RuntimeError, IOError, ShellOpts::Failure, Prick::Failure, Prick::Build::PostgresError => ex
548
548
  # ShellOpts.failure(ex.message)
549
549
  end
550
550
 
@@ -11,7 +11,7 @@ module Prick
11
11
 
12
12
  def initialize(builder)
13
13
  @builder = builder
14
- @nodes = []
14
+ @nodes = []
15
15
  end
16
16
 
17
17
  def execute(**opts, &block)
@@ -87,10 +87,10 @@ module Prick
87
87
 
88
88
  class ModuleBatch < BuildBatch
89
89
  def execute
90
- super {
91
- nodes.each { |node|
90
+ super {
91
+ nodes.each { |node|
92
92
  sql = node&.call
93
- conn.execute sql if sql
93
+ conn.execute sql if sql
94
94
  }
95
95
  }
96
96
  end
@@ -140,7 +140,7 @@ module Prick
140
140
  delete = builder.clean ? :none : :touched
141
141
  begin
142
142
  conn.execute fox.to_sql(format: :exec, delete: delete)
143
- rescue PG::SyntaxError, PG::Error => ex
143
+ rescue PG::SyntaxError, PG::Error => ex
144
144
  raise PostgresError.new(ex.message)
145
145
  end
146
146
  }
@@ -55,7 +55,7 @@ module Prick
55
55
  :nodes, :decl_nodes, :init_nodes, :term_nodes,
56
56
  :seed_nodes, :fox_seed_nodes, :sql_seed_nodes,
57
57
  :build_nodes,
58
- :pg_graph_ignore_schemas,
58
+ :pg_graph_ignore_schemas,
59
59
  :refresh_schemas, :keep_schemas
60
60
 
61
61
  def batches() @batches || create_batches end
@@ -160,7 +160,7 @@ module Prick
160
160
  private
161
161
  def load_pool_impl(build_node)
162
162
  pool.add(build_node.init_nodes)
163
- build_node.decl_nodes.each { |node|
163
+ build_node.decl_nodes.each { |node|
164
164
  pool.add node
165
165
  load_pool_impl(node) if node.kind == :yml
166
166
  }
@@ -29,7 +29,7 @@ module Prick
29
29
 
30
30
  def lines() prefix_lines + source_lines end
31
31
 
32
- def initialize(parent, phase, kind, path, args = nil)
32
+ def initialize(parent, phase, kind, path, args = nil)
33
33
  constrain parent, BuildNode, NilClass
34
34
  constrain phase, :init, :decl, :seed, :term, nil
35
35
  constrain kind, :sql, :exe, :fox, :yml, :inline, :module
@@ -60,7 +60,7 @@ module Prick
60
60
 
61
61
  protected
62
62
  def read_source
63
- file = File.read(path)
63
+ file = File.read(path).gsub(/^\\[^\n]*/m, "")
64
64
  @source_lines = 1 + 1 + file.count("\n")
65
65
  ["set search_path to #{schema}, pg_temp;\n", file]
66
66
  end
@@ -110,7 +110,7 @@ module Prick
110
110
  end
111
111
  end
112
112
 
113
- def call()
113
+ def call()
114
114
  object.send(@command, *args)
115
115
  end
116
116
 
@@ -200,7 +200,7 @@ module Prick
200
200
  kind_nodes = self.send("#{kind}_nodes".to_sym)
201
201
  if !kind_nodes.empty?
202
202
  puts "#{kind}:"
203
- indent { kind_nodes.each(&:dump) }
203
+ indent { kind_nodes.each(&:dump) }
204
204
  end
205
205
  end
206
206
  }
@@ -35,7 +35,7 @@ module Prick
35
35
 
36
36
  # List of schemas that should be rebuilt. #refresh_schemas is not cached
37
37
  # and can be manipulated by removing build nodes from the pool
38
- def refresh_schemas()
38
+ def refresh_schemas()
39
39
  build_nodes.select(&:refresh_schema).map(&:schema).uniq
40
40
  end
41
41
 
@@ -43,7 +43,7 @@ module Prick
43
43
  build_nodes.reject(&:refresh_schema).map(&:schema).uniq
44
44
  end
45
45
 
46
- def initialize()
46
+ def initialize()
47
47
  self.clear
48
48
  end
49
49
 
@@ -52,7 +52,7 @@ module Prick
52
52
  term_nodes = [] # Ugly hack to do recursive init/term but preserve order within a term block
53
53
  @nodes.concat(nodes)
54
54
  @all_nodes.concat(nodes)
55
- nodes.each { |node|
55
+ nodes.each { |node|
56
56
  @schemas[node.schema] += 1
57
57
  if node.phase == :term
58
58
  term_nodes << node
@@ -60,7 +60,7 @@ module Prick
60
60
  @kind_nodes[node.phase]&.append(node)
61
61
  end
62
62
  }
63
- term_nodes.reverse.each { |node| @kind_nodes[:term]&.append node }
63
+ term_nodes.reverse.each { |node| @kind_nodes[:term]&.append node }
64
64
  self
65
65
  end
66
66
 
@@ -81,7 +81,7 @@ module Prick
81
81
 
82
82
  def delete_schema(*schemas, exclude: [])
83
83
  schemas = Array(schemas).flatten
84
- delete_if { |node|
84
+ delete_if { |node|
85
85
  schemas.include?(node.schema) && !exclude.include?(node.phase) && !exclude.include?(node.kind)
86
86
  }
87
87
  end
@@ -105,7 +105,7 @@ module Prick
105
105
  rest = $3
106
106
  args = expand_string(rest || '').split
107
107
  path = expand_filename(dir, command)
108
- path || optional or
108
+ path || optional or
109
109
  raise Error, "Can't find file #{command} #{path} in #{dir}/ from #{unit}"
110
110
  !path.nil? or return nil
111
111
  else
@@ -165,7 +165,7 @@ module Prick
165
165
 
166
166
  # Search for an executable in path. Return nil if not found
167
167
  #
168
- # Note that "." is ignored in the search path
168
+ # Note that "." is ignored in the search path
169
169
  def find_executable(filename) # ChatGPT
170
170
  # puts "#find_executable(#{filename.inspect})"
171
171
  if !Prick.state.environments.key?(filename) # Environment names are reserved
@@ -144,7 +144,7 @@ module Prick
144
144
 
145
145
  # Matches a major.minor.patch ('MMP') version
146
146
  #
147
- # The *_SEMVER REs are derived from the canonical RE
147
+ # The *_SEMVER REs are derived from the canonical RE
148
148
  #
149
149
  # /
150
150
  # (0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)
data/lib/prick/diff.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Prick
2
- # Database diff
2
+ # Database diff
3
3
  class Diff
4
4
  # Diff as a list of lines
5
5
  attr_reader :diff
@@ -16,7 +16,7 @@ module Prick
16
16
  # List of names of inherited environments
17
17
  def inherit = assignments[:inherit]
18
18
 
19
- # List of directly inherited environment objects. Assigned by the
19
+ # List of directly inherited environment objects. Assigned by the
20
20
  # analyzer
21
21
  attr_accessor :parents
22
22
 
@@ -88,7 +88,7 @@ module Prick
88
88
  def dump
89
89
  puts "#{name}:"
90
90
  indent {
91
- self.each { |ident,val|
91
+ self.each { |ident,val|
92
92
  # if ident == :build
93
93
  # puts "super: #{super_environment&.name || 'false'}"
94
94
  # end
@@ -163,11 +163,11 @@ module Prick
163
163
  local method=$1
164
164
  super_stack+=($method)
165
165
  }
166
-
166
+
167
167
  function pop_super_stack() {
168
168
  super_stack=("${super_stack[@]::${#super_stack[@]}-1}")
169
169
  }
170
-
170
+
171
171
  function super() {
172
172
  eval ${super_stack[-1]}
173
173
  }
@@ -258,7 +258,7 @@ module Prick
258
258
  def analyze
259
259
  # Assign Environment#parent
260
260
  values.each { |env|
261
- env.parents = env.inherit.map { |name|
261
+ env.parents = env.inherit.map { |name|
262
262
  self[name] or raise ArgumentError, "Can't find '#{name}' environment referred from '#{name}'"
263
263
  }
264
264
  }
@@ -279,10 +279,10 @@ module Prick
279
279
  case type
280
280
  when "BOOLEAN"; env[ident] = value if !env.key?(ident)
281
281
  when "STRING"; env[ident] ||= value
282
- when "LIST";
282
+ when "LIST";
283
283
  next if ident == :inherit # Does not accumulate
284
284
  # FIXME !inherited.key? should prevent env[ident].nil?
285
- env[ident] = (value + (env[ident] || [])).uniq
285
+ env[ident] = (value + (env[ident] || [])).uniq
286
286
  when "TEXT"; env[ident] = env[ident] || value
287
287
  else
288
288
  raise ArgumentError
@@ -294,7 +294,7 @@ module Prick
294
294
  # Assign #ancestors
295
295
  sorted_indexes = sorted_environments.map.with_index { |env, idx| [env.name, idx] }.to_h
296
296
  for env in sorted_environments
297
- env.ancestors =
297
+ env.ancestors =
298
298
  (env.parents + env.parents.map(&:ancestors))
299
299
  .flatten
300
300
  .uniq
@@ -1,13 +1,13 @@
1
1
 
2
2
  module Fmt
3
3
  # Print table
4
- def self.puts_table(headers, table)
4
+ def self.puts_table(headers, table, bold: nil)
5
5
  widths = headers.map(&:size)
6
6
  signs = []
7
7
  types = []
8
8
  indexes = [] # absolute position of column. Zero based
9
9
  for i in (0...headers.size)
10
- value_width =
10
+ value_width =
11
11
  table.map { |row|
12
12
  case value = row[i]
13
13
  when TrueClass, FalseClass
@@ -58,8 +58,10 @@ module Fmt
58
58
  }
59
59
  puts
60
60
 
61
- for row in table
61
+ table.each.with_index { |row, rownum|
62
62
  # for index, sign, width, type, value in signs.zip(indexes, signs, widths, types, row) # FIXME doesn't work?
63
+ print "\033[1m" if rownum == bold
64
+
63
65
  for i in (0...headers.size)
64
66
  index, sign, width, type, value = indexes[i], signs[i], widths[i], types[i], row[i]
65
67
 
@@ -75,7 +77,7 @@ module Fmt
75
77
  lines = []
76
78
  while !values.empty?
77
79
  rest = width
78
- line = []
80
+ line = []
79
81
  while !values.empty? && values.first.size <= rest
80
82
  rest -= values.first.size
81
83
  line << values.shift
@@ -92,8 +94,8 @@ module Fmt
92
94
  printf "%#{sign}#{width}#{type} ", "#{value}"
93
95
  end
94
96
  end
95
- puts
96
- end
97
+ puts (rownum == bold ? "\033[0m" : "")
98
+ }
97
99
  end
98
100
  end
99
101
 
@@ -2,7 +2,7 @@
2
2
  module Prick
3
3
  module Git
4
4
  # Return the origin of the repository
5
- def self.origin()
5
+ def self.origin()
6
6
  Command.command("git remote get-url origin").first
7
7
  end
8
8
 
@@ -52,7 +52,7 @@ module Prick
52
52
  end
53
53
 
54
54
  # Push change to repository
55
- def self.push
55
+ def self.push
56
56
  Command.command "git push --quiet --atomic"
57
57
  end
58
58
 
@@ -67,34 +67,34 @@ module Prick
67
67
 
68
68
  module Tag
69
69
  # The associated commit ID of a tag
70
- def self.id(tag)
71
- tag && Command.command("git rev-list -n 1 #{tag}").first
70
+ def self.id(tag)
71
+ tag && Command.command("git rev-list -n 1 #{tag}").first
72
72
  end
73
73
 
74
74
  # True if tag exists
75
- def self.exist?(tag)
76
- tag && Command.command?("git describe --tags #{tag}")
75
+ def self.exist?(tag)
76
+ tag && Command.command?("git describe --tags #{tag}")
77
77
  end
78
78
 
79
79
  # Create tag
80
- def self.create(tag, id: nil)
81
- Command.command "git tag '#{tag}' #{id}"
80
+ def self.create(tag, id: nil)
81
+ Command.command "git tag '#{tag}' #{id}"
82
82
  end
83
83
 
84
84
  # Drop a tag
85
- def self.drop(tag)
86
- Command.command "git tag -d '#{tag}'"
85
+ def self.drop(tag)
86
+ Command.command "git tag -d '#{tag}'"
87
87
  end
88
88
 
89
89
  # Return list of all tags. Not in any particular order
90
- def self.list()
91
- Command.command("git tag")
90
+ def self.list()
91
+ Command.command("git tag")
92
92
  end
93
93
 
94
94
  # Return the most recent tag before the given commit (defaults to the
95
95
  # last commit)
96
- def self.current(id = nil)
97
- describe_tag(id)&.first
96
+ def self.current(id = nil)
97
+ describe_tag(id)&.first
98
98
  end
99
99
 
100
100
  private
@@ -115,11 +115,11 @@ module Prick
115
115
  end
116
116
 
117
117
  module Branch
118
- def self.exist?(branch)
118
+ def self.exist?(branch)
119
119
  Command.command? "git show-ref --verify --quiet refs/heads/#{branch}"
120
120
  end
121
121
 
122
- def self.create(branch, id = nil, set_upstream: true)
122
+ def self.create(branch, id = nil, set_upstream: true)
123
123
  if set_upstream
124
124
  current = Git.branch.current
125
125
  Command.command %(
@@ -132,7 +132,7 @@ module Prick
132
132
  end
133
133
  end
134
134
 
135
- def self.drop(branch)
135
+ def self.drop(branch)
136
136
  Command.command "git branch -D #{branch}"
137
137
  end
138
138
 
@@ -140,11 +140,11 @@ module Prick
140
140
  Command.command "git for-each-ref --format='%(refname:short)' refs/heads/*"
141
141
  end
142
142
 
143
- def self.current()
143
+ def self.current()
144
144
  Command.command("git branch --show-current").first
145
145
  end
146
146
 
147
- def self.checkout(branch)
147
+ def self.checkout(branch)
148
148
  Command.command "git checkout --quiet #{branch}"
149
149
  end
150
150
  end
@@ -158,7 +158,7 @@ __END__
158
158
  end
159
159
 
160
160
 
161
-
161
+
162
162
  # Return true if `version` has an associated tag
163
163
  def self.tag?(version)
164
164
  !list_tags.grep(version.to_s).empty?
@@ -62,15 +62,15 @@ module Timer
62
62
 
63
63
  def to_s(title = self.title) "#{title}: #{Timer.format(time)}" end
64
64
 
65
- def emit(title = self.title)
65
+ def emit(title = self.title)
66
66
  stop
67
67
  ::Timer.file.puts to_s(title) if ::Timer.on?
68
68
  end
69
69
 
70
70
  def self.factor() { s: 1, ms: 1000 }[::Timer.unit] end
71
71
 
72
- def self.format(time)
73
- time ? sprintf("%.#{::Timer.scale}f#{::Timer.unit}", Timer.factor * time) : time.inspect
72
+ def self.format(time)
73
+ time ? sprintf("%.#{::Timer.scale}f#{::Timer.unit}", Timer.factor * time) : time.inspect
74
74
  end
75
75
  end
76
76
 
@@ -15,9 +15,9 @@ module Prick
15
15
  def zero?() self == PrickVersion.zero end
16
16
 
17
17
  # Return true if `string` is a version
18
- def self.version?(string)
18
+ def self.version?(string)
19
19
  string.is_a?(String) or raise Internal, "String expected"
20
- !(string =~ VERSION_RE).nil?
20
+ !(string =~ VERSION_RE).nil?
21
21
  end
22
22
 
23
23
  attr_accessor :fork
@@ -95,9 +95,9 @@ module Prick
95
95
  [version, tag]
96
96
  end
97
97
 
98
- # `part` can be one of :major, :minor, :patch, or :pre. If pre is undefined, it
98
+ # `part` can be one of :major, :minor, :patch, or :pre. If pre is undefined, it
99
99
  # is set to `pre_initial_value`
100
- def increment(part, pre_initial_value = 1)
100
+ def increment(part, pre_initial_value = 1)
101
101
  self.dup.increment!(part, pre_initial_value)
102
102
  end
103
103
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  # Initial project configuration file
3
- name:
4
- title:
5
- version:
6
- prick:
3
+ name:
4
+ title:
5
+ version:
6
+ prick:
@@ -3,7 +3,7 @@
3
3
  # Note the SQL scripts are also called directly from 'prick setup' when the
4
4
  # database is created because we don't want to parse the whole build
5
5
  # environment just to create the prick schema. After the initial setup, the
6
- # scripts are only run by 'prick build' with the --force option
6
+ # scripts are only run by 'prick build' with the --force option
7
7
  #
8
8
  # This is hardcoded an should be fixed somehow
9
9
  #
@@ -22,7 +22,7 @@ create table builds (
22
22
 
23
23
  -- Environment
24
24
  environment varchar not null default 'default',
25
-
25
+
26
26
  -- Build timestamp. This is the time of the start of the build
27
27
  built_at timestamp without time zone default (now() at time zone 'UTC'),
28
28
 
data/lib/prick/state.rb CHANGED
@@ -45,7 +45,7 @@ module Prick
45
45
  attr_accessor :version
46
46
 
47
47
  # Version of prick in prick.yml. Note that this can be different than the current
48
- # version of prick
48
+ # version of prick
49
49
  attr_accessor :prick_version
50
50
 
51
51
  # Database name. nil if state file is absent
@@ -82,7 +82,7 @@ module Prick
82
82
  def branch() @branch ||= Git.branch.current end
83
83
 
84
84
  # Git revision (commit ID). Lazy-evaluated
85
- def rev(kind: :long)
85
+ def rev(kind: :long)
86
86
  case kind
87
87
  when :short; @rev_short ||= rev()[0...8]
88
88
  when :long; @rev_long ||= Git.id
@@ -90,7 +90,7 @@ module Prick
90
90
  end
91
91
 
92
92
  # True if the git repository is clean (not modified). Lazy-evaluated
93
- def clean?()
93
+ def clean?()
94
94
  return @clean if defined?(@clean)
95
95
  @clean = Git.clean?
96
96
  end
@@ -109,7 +109,7 @@ module Prick
109
109
  load_environment_file if @environment_file && File.exist?(@environment_file)
110
110
  end
111
111
 
112
- # Project user (owner) connection. Memoized to connect only once.
112
+ # Project user (owner) connection. Memoized to connect only once.
113
113
  # TODO Rename. Also rename self.connection
114
114
  def connection(database: nil, username: nil, environment: nil, &block)
115
115
  if @connection.nil?
@@ -125,9 +125,9 @@ module Prick
125
125
  load_database_environment
126
126
 
127
127
  # Set environment if undefined and not overridden by :environment
128
- self.environment =
129
- environment ||
130
- Prick.state.environment ||
128
+ self.environment =
129
+ environment ||
130
+ Prick.state.environment ||
131
131
  environments.key?(database_environment) && database_environment ||
132
132
  DEFAULT_ENVIRONMENT
133
133
  end
@@ -160,8 +160,8 @@ module Prick
160
160
  end
161
161
 
162
162
  # Create a bash(1) environment (Hash). It is used for in-prick expansion of
163
- # variables and is also injected into the enviroment of subprocesses
164
- #
163
+ # variables and is also injected into the enviroment of subprocesses
164
+ #
165
165
  # FIXME: Problems with BUNDLE_* variables FIXME Still a problem?
166
166
  #
167
167
  # TODO: Explain handling of PRICK_<STANDARD-DIRECTORY>
@@ -231,12 +231,12 @@ module Prick
231
231
  val = val.join(" ")
232
232
  end
233
233
  end
234
- assignments << "#{prefix}#{var}='#{val}'\n"
234
+ assignments << "#{prefix}#{var}='#{val}'\n"
235
235
  }
236
236
  assignments.join
237
237
  end
238
238
 
239
- # It is an error if the project file exists.
239
+ # It is an error if the project file exists.
240
240
  def save_project(overwrite: false)
241
241
  overwrite || !File.exists?(project_file) or Prick.error "Won't overwrite '#{project_file}'"
242
242
  hash = { name: name, title: title, version: version.to_s, prick: Prick::VERSION }
@@ -268,7 +268,7 @@ module Prick
268
268
  branch: branch, rev: rev(kind: :short), clean: clean?,
269
269
  environment: environment)
270
270
  end
271
- # version: version.to_s, prick: prick_version,
271
+ # version: version.to_s, prick: prick_version,
272
272
  end
273
273
 
274
274
  def save_build_end(success, duration)
@@ -279,7 +279,7 @@ module Prick
279
279
  insert_record(
280
280
  "prick.builds",
281
281
  name: name,
282
- version: version.to_s, prick: Prick::VERSION,
282
+ version: version.to_s, prick: Prick::VERSION,
283
283
  branch: branch, rev: rev(kind: :short), clean: clean?,
284
284
  environment: environment,
285
285
  success: success, duration: duration, prick_duration: dt)
@@ -300,7 +300,7 @@ module Prick
300
300
  puts "State"
301
301
  indent {
302
302
  for method in [
303
- :name, :title, :prick_version, :project_version,
303
+ :name, :title, :prick_version, :project_version,
304
304
  :database_version, :database_environment, :database, :username]
305
305
  puts "#{method}: #{self.send method}"
306
306
  end
@@ -327,7 +327,7 @@ module Prick
327
327
  for key in mandatory_keys
328
328
  !hash[key].to_s.empty? or Prick.error "Can't find '#{key}' in #{file}"
329
329
  end
330
- (unknown = (hash.keys - mandatory_keys - optional_keys).first) and
330
+ (unknown = (hash.keys - mandatory_keys - optional_keys).first) and
331
331
  Prick.error "Illegal key '#{unknown}' in #{file}"
332
332
  hash
333
333
  end
@@ -4,8 +4,8 @@ require_relative '../builder/builder.rb'
4
4
 
5
5
  module Prick::SubCommand
6
6
  def self.build(
7
- database, username, schema,
8
- builddir: Prick.state.schema_dir,
7
+ database, username, schema,
8
+ builddir: Prick.state.schema_dir,
9
9
  force: false, # Build all schemas
10
10
  step: false, timer: nil, dump: nil)
11
11
 
@@ -43,7 +43,7 @@ module Prick::SubCommand
43
43
  refresh_schemas = conn.schema.list
44
44
 
45
45
  # Find existing keep-schemas (but exclude target schema)
46
- keep_schemas = builder.keep_schemas.select { |s|
46
+ keep_schemas = builder.keep_schemas.select { |s|
47
47
  conn.schema.exist?(s) && (schema.nil? || schema != s)
48
48
  }
49
49
 
@@ -63,7 +63,7 @@ module Prick::SubCommand
63
63
  # 'prick build' was given a schema
64
64
  builder.pool.delete_schema(builder.pool.after_schema(schema)) if schema
65
65
  end
66
-
66
+
67
67
  case dump
68
68
  when :nodes; builder.nodes.reject { |node| node.is_a?(Build::BuildNode) }.map &:dump
69
69
  when :allnodes; builder.nodes.map &:dump
@@ -35,7 +35,7 @@ module Prick
35
35
  built_at: nil,
36
36
  success: nil
37
37
  end
38
-
38
+
39
39
  def self.create_migration(username, from_version, force: false, file: nil)
40
40
  constrain from_version, PrickVersion
41
41
  Git.clean? or raise "Won't migrate: Repository is dirty"
@@ -97,7 +97,7 @@ module Prick
97
97
  end
98
98
 
99
99
  if file
100
- File.open(file, "a") { |f|
100
+ File.open(file, "a") { |f|
101
101
  f.puts "-- UPDATE VERSION"
102
102
  f.puts File.readlines(SCHEMA_VERSION_PATH).grep_v(/^--/)
103
103
  }
@@ -106,7 +106,7 @@ module Prick
106
106
  FileUtils.mkdir_p migration_dir
107
107
  Command.command "cp -a #{SHARE_PATH}/migrate/migration/. #{migration_dir}"
108
108
  Dir.chdir(migration_dir) { diff.write(*DIFF_FILES, mark: true) }
109
- end
109
+ end
110
110
  end
111
111
  end
112
112
  end
@@ -4,7 +4,7 @@ require_relative '../builder/builder.rb'
4
4
 
5
5
  module Prick::SubCommand
6
6
  # Drop database owner
7
- def self.drop_owner(username)
7
+ def self.drop_owner(username)
8
8
  # No database at this point so no session is running and no cascade. A nop
9
9
  # if the user is the current user or owns objects in other databases
10
10
  if username != ENV['USER']
@@ -21,7 +21,7 @@ module Prick::SubCommand
21
21
  if conn.rdbms.exist? database
22
22
  users = conn.role.list(database: database).reject { _1 == conn.rdbms.owner(database) }
23
23
  conn.session.terminate(database, users)
24
- if conn.rdbms.exist?(database)
24
+ if conn.rdbms.exist?(database)
25
25
  # Connect to database to make cascade work. Run in a block to close connection afterwards
26
26
  PgConn.new(database) { |conn| conn.role.drop(users, cascade: true) }
27
27
  else
@@ -53,7 +53,7 @@ module Prick::SubCommand
53
53
  schema_list = conn.quote_literal_list(schemas)
54
54
  schema_expr = schemas ? "true = true" : "schema_name in #{schema_list}"
55
55
  tables = conn.tuples %(
56
- select schema_name, table_name, max_id
56
+ select schema_name, table_name, max_id
57
57
  from prick.snapshots
58
58
  where #{schema_expr}
59
59
  )
@@ -30,7 +30,7 @@ __END__
30
30
  builder = Prick::Build::Builder.new(conn, builddir)
31
31
  builder.pool.delete_schema(builder.pool.after_schema(schema)) if schema
32
32
  end
33
-
33
+
34
34
  case dump
35
35
  when :nodes; builder.nodes.reject { |node| node.is_a?(Build::BuildNode) }.map &:dump
36
36
  when :allnodes; builder.nodes.map &:dump
@@ -26,7 +26,7 @@ module Prick::SubCommand
26
26
  done
27
27
  git add .
28
28
  git commit -am "Initial import"
29
- rm -f #{project_file}
29
+ rm -f #{project_file}
30
30
  ), fail: false
31
31
  Command.status == 0 or Prick.failure "Failed creating initial import"
32
32
 
@@ -17,7 +17,7 @@ module Prick::SubCommand
17
17
  headers = %w(variable value)
18
18
  vars = Prick.state.bash_environment(all: all).reject { |k,v| k == "PATH" }
19
19
  rows = vars.map
20
- # rows = vars.map { |k,v|
20
+ # rows = vars.map { |k,v|
21
21
  # if v.is_a?(Array)
22
22
  # if v.first&.is_a?(Array)
23
23
  # v = v.first
@@ -28,7 +28,7 @@ module Prick::SubCommand
28
28
  # v = v.to_s
29
29
  # end
30
30
  #
31
- # [k, v]
31
+ # [k, v]
32
32
  # }
33
33
  Fmt.puts_table(headers, rows)
34
34
  end
@@ -50,26 +50,33 @@ module Prick::SubCommand
50
50
  git_rev = Git.id[0...8]
51
51
 
52
52
  rows = []
53
+ current_database_row = nil
53
54
  Prick.databases { |database, conn|
54
55
  row = conn.record(%(
55
- select
56
- '#{database}' as "database", name, version, branch, rev, clean, environment,
56
+ select
57
+ '#{database}' as "database", name, version, branch, rev, clean, environment,
57
58
  built_at, success
58
59
  from prick.versions
59
60
  ))
60
61
 
62
+ # Detect is this is the current database
63
+ if Prick.state.database == database
64
+ is_current_database = true
65
+ current_database_row = rows.size
66
+ end
67
+
61
68
  if row[:success]
62
69
  clean = row[:clean]
63
70
  same_revision = row[:branch] == git_branch && row[:rev] == git_rev
64
71
  up2date = fs_time <= row[:built_at]
65
72
 
66
73
  # Set state
67
- row[:state] =
74
+ row[:state] =
68
75
  case [clean, same_revision, up2date]
69
76
  in [true, true, true]; "clean" # Built from clean repo
70
77
  in [true, true, false]; "ok" # Clean repo but doesn't include latest uncommitted changes
71
78
  in [true, false, _]; "clean" # Clean repo but different revision
72
-
79
+
73
80
  in [false, true, true]; "edge" # Dirty repo, work-in-progress
74
81
  in [false, true, false]; "dirty" # Dirty repo and doesn't include latest changes
75
82
  in [false, false, _]; "stale" # Dirty repo, no way back
@@ -84,12 +91,13 @@ module Prick::SubCommand
84
91
  row[:built_at] = row[:built_at]&.strftime("%Y-%m-%d %H:%M")
85
92
 
86
93
  # Add current database marker
87
- last_column = (Prick.state.database == database ? "*" : "")
94
+ last_column = (is_current_database ? "*" : "")
95
+
88
96
  rows << row.values + [last_column]
89
97
  }
90
98
 
91
99
  headers = %w(database project version branch rev clean environment built success state) + [" "]
92
- Fmt.puts_table(headers, rows)
100
+ Fmt.puts_table(headers, rows, bold: current_database_row)
93
101
  end
94
102
  end
95
103
 
@@ -100,7 +108,7 @@ module Prick::SubCommand
100
108
  def self.list_owners(format: :long)
101
109
  owners = {}
102
110
  Prick.databases.each { |database|
103
- # owner = super_conn.rdbms.exist?(d) ? super_conn.rdbms.owner(d) : d
111
+ # owner = super_conn.rdbms.exist?(d) ? super_conn.rdbms.owner(d) : d
104
112
  owner = super_conn.rdbms.owner(database)
105
113
  (owners[owner] ||= []) << database
106
114
  }
@@ -108,9 +116,9 @@ module Prick::SubCommand
108
116
  puts owners.keys
109
117
  else
110
118
  headers = %w(username databases) + [" "]
111
- rows = owners.map { |owner, databases|
119
+ rows = owners.map { |owner, databases|
112
120
  current_user_mark = (Prick.state.username == owner ? '*' : "")
113
- [owner, databases.join(","), current_user_mark]
121
+ [owner, databases.join(","), current_user_mark]
114
122
  }
115
123
  Fmt.puts_table(headers, rows)
116
124
  end
@@ -28,12 +28,12 @@ module Prick::SubCommand
28
28
 
29
29
  builder = Prick::Build::Builder.new(conn, "schema", clean, step: step)
30
30
 
31
- if schema
31
+ if schema
32
32
  after_schemas = builder.pool.after_schema(schema)
33
33
  refresh_schemas = builder.pool.refresh_schemas
34
34
  conn.schema.drop(schema, cascade: true) # Marks it dirty
35
35
 
36
- # Nuke later schemas
36
+ # Nuke later schemas
37
37
  # FIXME Not a good idea when sitting on a leaf schema.
38
38
  # Forced-delete could be requested using 'prick make schema'
39
39
  #
@@ -49,7 +49,7 @@ module Prick::SubCommand
49
49
  touched_schema = touched_nodes.first&.schema
50
50
  missing_schema = builder.schemas.find { |schema| !conn.schema.exist?(schema) }
51
51
  build_schema = builder.schemas.find { |schema| [touched_schema, missing_schema].include? schema }
52
-
52
+
53
53
  if build_schema.nil?
54
54
  puts "#{database} is up to date"
55
55
  exit
@@ -39,7 +39,7 @@ module Prick::SubCommand
39
39
  else
40
40
  is_build_file = false
41
41
  end
42
-
42
+
43
43
  # Read schema from build file if possible and decide if schema should
44
44
  # be dropped beforehand
45
45
  if is_build_file
@@ -70,7 +70,7 @@ module Prick::SubCommand
70
70
 
71
71
  # Drop schema if needed
72
72
  if is_schema_rebuild
73
- conn.schema.drop schema, cascade: true
73
+ conn.schema.drop schema, cascade: true
74
74
  end
75
75
 
76
76
  # Create schema if absent
data/lib/prick/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prick
4
- VERSION = "0.39.5"
4
+ VERSION = "0.39.7"
5
5
  end
data/lib/prick.rb CHANGED
@@ -77,13 +77,13 @@ module Prick
77
77
  databases = super_conn.values %(
78
78
  select datname from pg_database where datistemplate = false order by datname
79
79
  )
80
- databases.select! { |database|
80
+ databases.select! { |database|
81
81
  PgConn.new(database) { |conn|
82
82
  is_prick_database = conn.exist?(%(
83
- select 1
84
- from information_schema.tables
83
+ select 1
84
+ from information_schema.tables
85
85
  where table_schema = 'prick'
86
- and table_name = 'builds'
86
+ and table_name = 'builds'
87
87
  limit 1
88
88
  ))
89
89
  yield(database, conn) if is_prick_database && block_given?
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.39.5
4
+ version: 0.39.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-13 00:00:00.000000000 Z
11
+ date: 2024-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: semantic