prick 0.39.12 → 0.40.0
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.
- checksums.yaml +4 -4
- data/TODO +11 -1
- data/exe/prick +48 -28
- data/lib/prick/builder/batch.rb +8 -4
- data/lib/prick/builder/builder.rb +1 -1
- data/lib/prick/builder/node.rb +97 -13
- data/lib/prick/builder/parser.rb +12 -2
- data/lib/prick/local/command.rb +138 -94
- data/lib/prick/state.rb +10 -2
- data/lib/prick/subcommand/prick-fox.rb +10 -2
- data/lib/prick/subcommand/prick-init.rb +1 -1
- data/lib/prick/subcommand/prick-snapshot.rb +8 -1
- data/lib/prick/version.rb +1 -1
- data/lib/prick-command.rb +123 -0
- data/lib/prick.rb +6 -95
- data/prick.gemspec +1 -1
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6f8ea8c479a4482f6b26e33c9e83a0f61ab6078d715a014124c34d11b0ff66a
|
4
|
+
data.tar.gz: a4fbc9c66bee4866dc51c99068f835ded7c53dbceb4eedc6d5c4df61d3709c2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d3a33f458512e93fc42bf28abf4fff87fbb82c648b657207546a24962f0c9f27356cafd988a7411ab4a969c228155ed6992de781827ee16e7d70e9b711b4574
|
7
|
+
data.tar.gz: a38e125d8ca682a03a712fd911e89bf9190e5709dfdd5d449607b572e3e1e15e8f1bac3f903d6b8deeae715176203a6265201cd840aaac124c0e1043a991766d
|
data/TODO
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
o Make references to file stable when using -C
|
1
2
|
o prefix sql scripts with 'set ON_ERROR_STOP on'
|
2
3
|
o make it possible to build only one scheme
|
3
4
|
o cleanup connection
|
@@ -11,9 +12,18 @@ o Have the following entries
|
|
11
12
|
sql: SQL_STATEMENT
|
12
13
|
exec: BASH_COMMAND
|
13
14
|
eval: BASH_COMMAND
|
14
|
-
call:
|
15
|
+
call:
|
15
16
|
...
|
16
17
|
|
18
|
+
o Use multiple processes. Build order
|
19
|
+
|
20
|
+
tables
|
21
|
+
(pg_graph dump in parallel)
|
22
|
+
plpgsql functions
|
23
|
+
views
|
24
|
+
sql functions
|
25
|
+
indexes
|
26
|
+
load seeds (requires pg_graph dump)
|
17
27
|
|
18
28
|
o Use mikras_root(1) to be able to run from any subdirectory
|
19
29
|
o Add 'prick build .' and 'prick make .'
|
data/exe/prick
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'bootsnap'
|
4
|
-
begin
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
3
|
+
#require 'bootsnap'
|
4
|
+
#begin
|
5
|
+
# cache_dir = "/run/user/" + `id -u`.chomp
|
6
|
+
# Bootsnap.setup(
|
7
|
+
# cache_dir: cache_dir, # Path to your cache
|
8
|
+
# development_mode: true, # Current working environment, e.g. RACK_ENV, RAILS_ENV, etc
|
9
|
+
# load_path_cache: true, # Optimize the LOAD_PATH with a cache
|
10
|
+
# compile_cache_iseq: true, # Compile Ruby code into ISeq cache, breaks coverage reporting.
|
11
|
+
# compile_cache_yaml: true # Compile YAML into a cache
|
12
|
+
# )
|
13
|
+
# # Bootsnap.instrumentation = ->(event, path) { puts "#{event} #{path}" }
|
14
|
+
#end
|
15
15
|
|
16
16
|
require 'shellopts'
|
17
17
|
|
@@ -37,9 +37,15 @@ SPEC = %(
|
|
37
37
|
-e,environment-file=ENVIRONMENT-FILE
|
38
38
|
Override the environment file. Default is 'prick.environment.yml'
|
39
39
|
|
40
|
+
-r,reflections-file=REFLECTIONS-FILE
|
41
|
+
Override the reflections file. Default is 'schema/reflections.yml'
|
42
|
+
|
40
43
|
-s,state-file=STATE-FILE
|
41
44
|
Override state file. Default is '.prick-state.yml'
|
42
45
|
|
46
|
+
-f,fox-state-file=FOX-STATE-FILE
|
47
|
+
Override fox state file. Default is '.fox-state.yml
|
48
|
+
|
43
49
|
init! -n,name=NAME -t,title=TITLE DIRECTORY #@ Initialize new Prick project directory
|
44
50
|
Initializes a prick project and checks it into git. If a directory is
|
45
51
|
given the directory will be created and the project initialized in it.
|
@@ -117,7 +123,9 @@ SPEC = %(
|
|
117
123
|
drop.data!
|
118
124
|
@ Drop data
|
119
125
|
|
120
|
-
|
126
|
+
Drop data added to the database after the last snapshot was taken. It is
|
127
|
+
useful to run 'prick snapshot' immediately after you complete building
|
128
|
+
the database
|
121
129
|
|
122
130
|
build! --step -f,force -t,time --dump=KIND? -- [SCHEMA]
|
123
131
|
Build the project. If SCHEMA is defined, later schemas are excluded. KIND
|
@@ -134,12 +142,15 @@ SPEC = %(
|
|
134
142
|
run! --step -t,time --dump=KIND? --schema=SCHEMA -- PATH
|
135
143
|
@ Execute path in Prick environment
|
136
144
|
|
137
|
-
Execute a single directory or file within the Prick environment. If
|
138
|
-
a directory argument, the directory is searched for a build.yml
|
139
|
-
given a file argument, the file should be a .sql, .fox, or build
|
145
|
+
Execute a single build directory or file within the Prick environment. If
|
146
|
+
given a directory argument, the directory is searched for a build.yml
|
147
|
+
file. If given a file argument, the file should be a .sql, .fox, or build
|
148
|
+
file
|
140
149
|
|
141
150
|
The --schema option sets the current schema before executing the PATH
|
142
151
|
|
152
|
+
TODO: Allow executables
|
153
|
+
|
143
154
|
touch! -- [SUCCESS]
|
144
155
|
Record a build. SUCCESS can be 'true' (default) or 'false'. 'touch' is
|
145
156
|
used by external build processes that doesn't involve prick
|
@@ -148,18 +159,19 @@ SPEC = %(
|
|
148
159
|
Emit a bash script to build the database. The script is constructed from
|
149
160
|
the build attributes in the environment file
|
150
161
|
|
151
|
-
fox! -- FILE...
|
152
|
-
Load fox file data.
|
153
|
-
|
154
|
-
different data sets
|
162
|
+
fox! -r,reset +e,exclude=SCHEMA... -- FILE...
|
163
|
+
Load fox file data. Can be used together with 'prick snapshot' and 'prick
|
164
|
+
drop data' to to experiment with different data sets
|
155
165
|
|
156
|
-
|
157
|
-
|
166
|
+
The --reset option resets data to the last snapshot before loading the
|
167
|
+
file. The --exclude option lists schemas that should not be included in
|
168
|
+
fox, typically schemas that doens't comply with prick's naming
|
169
|
+
conventions
|
158
170
|
|
159
171
|
snapshot!
|
160
|
-
Records maximum ID for all tables and stores them in prick.snapshot
|
161
|
-
used by 'drop data' to reset data to the point in time of
|
162
|
-
Only one snapshot can be created at a time
|
172
|
+
Records maximum ID for all tables and stores them in the prick.snapshot
|
173
|
+
table. It is used by 'drop data' to reset data to the point in time of
|
174
|
+
the snapshot. Only one snapshot can be created at a time
|
163
175
|
|
164
176
|
reset!
|
165
177
|
Restore database to the last snapshot. TODO
|
@@ -240,6 +252,10 @@ def clean_pg_meta_cache
|
|
240
252
|
FileUtils.rm_f(PG_META_STATE_PATH)
|
241
253
|
end
|
242
254
|
|
255
|
+
def clean_fox_state
|
256
|
+
FileUtils.rm_f(Prick.state.fox_state_file)
|
257
|
+
end
|
258
|
+
|
243
259
|
def parse_database_args(state, args)
|
244
260
|
arg, environment = args.expect(0..2)
|
245
261
|
if arg
|
@@ -273,7 +289,7 @@ end
|
|
273
289
|
|
274
290
|
# Require prick only after -C directory option because some constants depends
|
275
291
|
# on the current directory
|
276
|
-
require_relative '../lib/prick.rb'
|
292
|
+
require_relative '../lib/prick-command.rb'
|
277
293
|
include Prick
|
278
294
|
|
279
295
|
begin
|
@@ -287,7 +303,9 @@ begin
|
|
287
303
|
# Handle -p, -e, and -c. TODO: Take -C into account for relative paths. Low-hanging fruit
|
288
304
|
project_file = opts.project_file || PRICK_PROJECT_PATH
|
289
305
|
environment_file = opts.environment_file || PRICK_ENVIRONMENT_PATH
|
306
|
+
reflections_file = opts.reflections_file || REFLECTIONS_PATH
|
290
307
|
state_file = opts.state_file || PRICK_STATE_PATH
|
308
|
+
fox_state_file = opts.fox_state_file || FOX_STATE_PATH
|
291
309
|
|
292
310
|
# Process init command and exit
|
293
311
|
if opts.subcommand == :init!
|
@@ -307,7 +325,7 @@ begin
|
|
307
325
|
end
|
308
326
|
|
309
327
|
# Load state
|
310
|
-
state = Prick.state = State.new(project_file, environment_file, state_file)
|
328
|
+
state = Prick.state = State.new(project_file, environment_file, reflections_file, state_file, fox_state_file)
|
311
329
|
|
312
330
|
# Lazyness
|
313
331
|
database = state.database
|
@@ -381,6 +399,7 @@ begin
|
|
381
399
|
when :build!
|
382
400
|
require_db
|
383
401
|
clean_pg_meta_cache
|
402
|
+
clean_fox_state
|
384
403
|
dump = cmd.dump? ? cmd.dump("batches")&.to_sym || :batches : nil
|
385
404
|
# exclude = cmd.exclude? ? cmd.exclude.split(",") : []
|
386
405
|
Prick::SubCommand.build(
|
@@ -390,6 +409,7 @@ begin
|
|
390
409
|
when :make!
|
391
410
|
require_db
|
392
411
|
clean_pg_meta_cache
|
412
|
+
clean_fox_state
|
393
413
|
dump = cmd.dump? ? cmd.dump("batches")&.to_sym || :batches : nil
|
394
414
|
Prick::SubCommand.make(
|
395
415
|
database, username, args.expect(0..1),
|
@@ -415,7 +435,7 @@ begin
|
|
415
435
|
|
416
436
|
when :fox!
|
417
437
|
require_db
|
418
|
-
Prick::SubCommand.fox(database, username, args)
|
438
|
+
Prick::SubCommand.fox(database, username, args, reset: cmd.reset?, exclude: cmd.exclude)
|
419
439
|
|
420
440
|
when :snapshot!
|
421
441
|
require_db
|
data/lib/prick/builder/batch.rb
CHANGED
@@ -40,7 +40,7 @@ module Prick
|
|
40
40
|
|
41
41
|
begin
|
42
42
|
# A SQL batch allows the first node to be an evaluated or executed node
|
43
|
-
if nodes.first.is_a?(
|
43
|
+
if nodes.first.is_a?(ExecutableNode)
|
44
44
|
node = nodes.shift
|
45
45
|
conn.execute [node.source], silent: true
|
46
46
|
end
|
@@ -122,8 +122,12 @@ module Prick
|
|
122
122
|
t_type.stop
|
123
123
|
t_fox = Timer.new " Parse files"
|
124
124
|
|
125
|
+
# Fetch state
|
126
|
+
ids, anchors = FixtureFox::Fox.read_state(type, Prick.state.fox_state_file)
|
127
|
+
|
125
128
|
# Create fox object
|
126
|
-
|
129
|
+
#
|
130
|
+
fox = FixtureFox::Fox.new(type, ids: ids, anchors: anchors)
|
127
131
|
|
128
132
|
# Parse files
|
129
133
|
for file in files
|
@@ -135,8 +139,8 @@ module Prick
|
|
135
139
|
fox.assign_types
|
136
140
|
fox.generate
|
137
141
|
|
138
|
-
# Dump state file
|
139
|
-
fox.write_state(
|
142
|
+
# Dump new state file
|
143
|
+
fox.write_state(Prick.state.fox_state_file)
|
140
144
|
|
141
145
|
# Timer
|
142
146
|
t_fox.stop
|
data/lib/prick/builder/node.rb
CHANGED
@@ -43,7 +43,7 @@ module Prick
|
|
43
43
|
@source_lines = nil
|
44
44
|
end
|
45
45
|
|
46
|
-
def to_s() @to_s ||= [path, args].
|
46
|
+
def to_s() @to_s ||= [path, *args].join(" ") end
|
47
47
|
def inspect() to_s end
|
48
48
|
def dump() puts "#{inspect} (#{@schema || 'nil'})" end
|
49
49
|
|
@@ -123,47 +123,132 @@ module Prick
|
|
123
123
|
def self.objects() @@objects end
|
124
124
|
end
|
125
125
|
|
126
|
-
# Virtual base class for
|
127
|
-
class
|
126
|
+
# Virtual base class for executable nodes
|
127
|
+
class ExecutableNode < Node
|
128
|
+
# The full command including arguments
|
128
129
|
alias_method :command, :to_s
|
129
130
|
|
131
|
+
# The command. Equal to #command without arguments
|
132
|
+
alias_method :cmd, :path
|
133
|
+
|
134
|
+
# Path to executable
|
135
|
+
def exepath()
|
136
|
+
@exepath ||= begin
|
137
|
+
v = `which #{path} 2>/dev/null`.chomp
|
138
|
+
v == "" ? nil : v
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
130
142
|
def filename = File.basename(path)
|
131
143
|
|
132
144
|
def initialize(parent, phase, path, args = nil)
|
133
145
|
constrain args, [String]
|
134
146
|
super(parent, phase, :exe, path, args)
|
147
|
+
check_path
|
135
148
|
end
|
136
149
|
|
137
150
|
def inspect() "#{path} #{(args || []).join(" ")}" end
|
138
151
|
|
139
152
|
protected
|
140
|
-
def
|
153
|
+
def check_path
|
154
|
+
!exepath.nil? or Prick.error "'#{path}' is not an executable"
|
155
|
+
end
|
156
|
+
|
157
|
+
def read_cmd
|
158
|
+
sql = execute
|
159
|
+
@source_lines = 1 + 1 + sql.count("\n")
|
160
|
+
["set search_path to #{schema}, pg_temp", sql.join("\n")]
|
161
|
+
end
|
162
|
+
|
163
|
+
def exec_cmd
|
164
|
+
execute
|
165
|
+
[]
|
166
|
+
end
|
167
|
+
|
168
|
+
def execute() = raise
|
169
|
+
|
170
|
+
def execute_system
|
141
171
|
begin
|
142
|
-
|
172
|
+
yield
|
143
173
|
rescue Command::Error => ex
|
144
174
|
message = "Error executing '#{command}'\n" + ex.stderr.map { |l| " #{l}" }.join("\n")
|
145
175
|
Prick.error message
|
146
176
|
end
|
147
177
|
end
|
178
|
+
|
179
|
+
def execute_script
|
180
|
+
begin
|
181
|
+
r = Command.script(Prick.state.bash_environment, cmd, argv: args)
|
182
|
+
rescue Command::Error => ex
|
183
|
+
message = "Error executing '#{command}'\n" + ex.stderr.map { |l| " #{l}" }.join("\n")
|
184
|
+
Prick.error message
|
185
|
+
ensure
|
186
|
+
# Reset connection because the script may have manipulated the
|
187
|
+
# current connection
|
188
|
+
Prick.owner_conn&.reset
|
189
|
+
end
|
190
|
+
r
|
191
|
+
end
|
148
192
|
end
|
149
193
|
|
150
|
-
|
151
|
-
|
194
|
+
class ScriptNode < ExecutableNode
|
195
|
+
protected
|
196
|
+
alias_method :execute, :execute_script
|
197
|
+
|
198
|
+
def check_path
|
199
|
+
super
|
200
|
+
return if path.end_with?(".rb")
|
201
|
+
first_line = File.open(exepath, &:gets).chomp
|
202
|
+
first_line =~ /^#!\/usr\/bin\/env\>.*ruby/ or Prick.error "'#{path}' is not a ruby script"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class EvalNode < ScriptNode
|
207
|
+
alias_method :read_source, :read_cmd
|
208
|
+
end
|
209
|
+
|
210
|
+
class ExecNode < ScriptNode
|
211
|
+
alias_method :read_source, :exec_cmd
|
212
|
+
end
|
213
|
+
|
214
|
+
class SystemCommandNode < ExecutableNode
|
215
|
+
protected
|
216
|
+
alias_method :execute, :execute_system
|
217
|
+
end
|
218
|
+
|
219
|
+
class RequireNode < ExecutableNode
|
152
220
|
def read_source
|
153
221
|
sql = execute_command
|
154
222
|
@source_lines = 1 + 1 + sql.count("\n")
|
155
223
|
["set search_path to #{schema}, pg_temp", sql.join("\n")]
|
156
224
|
end
|
225
|
+
|
226
|
+
def execute_command
|
227
|
+
execute {
|
228
|
+
Command.inline(Prick.state.bash_environment, path, argv: args)
|
229
|
+
}
|
230
|
+
end
|
157
231
|
end
|
158
232
|
|
159
|
-
|
160
|
-
|
161
|
-
def
|
162
|
-
|
163
|
-
|
233
|
+
class CommandNode < ExecutableNode
|
234
|
+
protected
|
235
|
+
def execute_command
|
236
|
+
execute {
|
237
|
+
Command.command(Prick.state.bash_environment, command)
|
238
|
+
}
|
164
239
|
end
|
165
240
|
end
|
166
241
|
|
242
|
+
# EvalNode executes the command and feeds the output into the database
|
243
|
+
class SysEvalNode < SystemCommandNode
|
244
|
+
alias_method :read_source, :read_cmd
|
245
|
+
end
|
246
|
+
|
247
|
+
# ExecNode executes the command and ignores its output
|
248
|
+
class SysExecNode < SystemCommandNode
|
249
|
+
alias_method :read_source, :exec_cmd
|
250
|
+
end
|
251
|
+
|
167
252
|
# A build.yml file node
|
168
253
|
class BuildNode < Node
|
169
254
|
# True if the build file contains a 'schema' attribute
|
@@ -220,4 +305,3 @@ module Prick
|
|
220
305
|
end
|
221
306
|
end
|
222
307
|
end
|
223
|
-
|
data/lib/prick/builder/parser.rb
CHANGED
@@ -57,7 +57,8 @@ module Prick
|
|
57
57
|
unit = make_build_unit(parent, path)
|
58
58
|
entries = YAML.load(File.read(path)) || []
|
59
59
|
entries.each { |entry|
|
60
|
-
if entry.is_a?(Hash)
|
60
|
+
if entry.is_a?(Hash) \
|
61
|
+
&& (entry.size != 1 || !%w(call sql exec eval sysexec syseval).include?(entry.first.first))
|
61
62
|
entry.each { |key, value|
|
62
63
|
if key == "schema"
|
63
64
|
unit.schema = value
|
@@ -129,12 +130,21 @@ module Prick
|
|
129
130
|
command = args.shift
|
130
131
|
klass && command or raise "Illegal number of arguments: #{value}"
|
131
132
|
ModuleNode.new(unit, phase, path, klass, command, args)
|
133
|
+
when "require"
|
134
|
+
(path, args = parse_file_entry(unit, dir, value)) or return nil
|
135
|
+
RequireNode.new(unit, phase, path, args)
|
132
136
|
when "eval"
|
133
137
|
(path, args = parse_file_entry(unit, dir, value)) or return nil
|
134
138
|
EvalNode.new(unit, phase, path, args)
|
135
139
|
when "exec"
|
136
140
|
(path, args = parse_file_entry(unit, dir, value)) or return nil
|
137
141
|
ExecNode.new(unit, phase, path, args)
|
142
|
+
when "syseval"
|
143
|
+
(path, args = parse_file_entry(unit, dir, value)) or return nil
|
144
|
+
SysEvalNode.new(unit, phase, path, args)
|
145
|
+
when "sysexec"
|
146
|
+
(path, args = parse_file_entry(unit, dir, value)) or return nil
|
147
|
+
SysExecNode.new(unit, phase, path, args)
|
138
148
|
else
|
139
149
|
raise Error, "Illegal key: #{key}"
|
140
150
|
end
|
@@ -143,7 +153,7 @@ module Prick
|
|
143
153
|
if File.directory? path
|
144
154
|
parse_directory(unit, path)
|
145
155
|
elsif File.executable?(path)
|
146
|
-
|
156
|
+
SysExecNode.new(unit, phase, path, args)
|
147
157
|
elsif File.file? path
|
148
158
|
case path
|
149
159
|
when /\.sql$/
|
data/lib/prick/local/command.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'fcntl'
|
2
|
-
|
3
2
|
module Command
|
4
3
|
class Error < RuntimeError
|
5
4
|
attr_reader :cmd
|
@@ -18,92 +17,85 @@ module Command
|
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
20
|
+
# Execute the shell command 'cmd' and return standard-output as an array of
|
21
|
+
# strings. If :stdin is a string or an array of lines if will be fed to the
|
22
|
+
# command on standard-input, if it is a IO object that IO object is piped to
|
23
|
+
# the command
|
24
|
+
#
|
25
|
+
# By default #command pass through error message to stderr but if :stderr is
|
26
|
+
# true, #command will instead return a tuple of stdout/stderr lines. If
|
27
|
+
# :stderr is false, stderr is ignored and is the same as adding "2>/dev/null"
|
28
|
+
# to the command
|
29
|
+
#
|
30
|
+
# #command raises a Command::Error exception if the command returns with an
|
31
|
+
# exit code != 0 unless :fail is false. In that case the the exit code can be
|
32
|
+
# fetched from Command::status
|
33
|
+
#
|
34
|
+
def command(env = {}, cmd, argv: nil, stdin: nil, stderr: nil, fail: true)
|
35
|
+
command_wrapper(cmd, stdin: stdin, stderr: stderr, fail: fail) {
|
36
|
+
# Add standard shell options
|
37
|
+
bashcmd = "set -o errexit\nset -o pipefail\n#{cmd}"
|
35
38
|
|
36
|
-
|
37
|
-
|
38
|
-
@stderr = stderr
|
39
|
-
@fail = fail
|
39
|
+
# Add arguments if present
|
40
|
+
bashcmd = [bashcmd, *argv].join(' ') if argv
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
# Clean bundler environment so that prick can be run in development mode.
|
43
|
+
# The problem is that the bundler environment is inherited by
|
44
|
+
# subprocesses and interferes with loading ruby commands. FIXME This is
|
45
|
+
# only relevant when running prick in development mode
|
46
|
+
ENV.delete_if { |k,v| %w(RUBYOPT RUBYLIB _).include?(k) || k =~ /^BUNDLER?_/ }
|
44
47
|
|
45
|
-
|
48
|
+
# Setup environment
|
49
|
+
env = env.map { |k,v| [k.to_s, v.to_s] }.to_h # Convert array values to strings
|
50
|
+
env.each { |k,v| ENV[k] = v }
|
46
51
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
@pe[0].close
|
52
|
+
Kernel.exec(env, bashcmd)
|
53
|
+
}
|
54
|
+
end
|
51
55
|
|
52
|
-
|
53
|
-
|
56
|
+
# Like command but returns true if the command exited with the expected
|
57
|
+
# status. Note that it suppresses standard-error by default
|
58
|
+
#
|
59
|
+
def command?(env = {}, cmd, expect: 0, argv: nil, stdin: nil, stderr: false)
|
60
|
+
command(env, cmd, argv: argv, stdin: stdin, stderr: stderr, fail: false)
|
61
|
+
@status == expect
|
62
|
+
end
|
54
63
|
|
55
|
-
|
56
|
-
|
64
|
+
# Exit status of the last command
|
65
|
+
def status() @status end
|
57
66
|
|
58
|
-
|
59
|
-
|
67
|
+
# Exception of the last command if it failed, otherwise nil TODO What is this used for?
|
68
|
+
def exception() @exception end
|
60
69
|
|
61
|
-
|
62
|
-
|
70
|
+
# Like #command but "execute" the ruby file by requiring it. This is only
|
71
|
+
# possible using ruby scripts
|
72
|
+
def script(env = {}, script, argv: nil, stdin: nil, stderr: nil, fail: true)
|
63
73
|
|
64
|
-
|
65
|
-
|
66
|
-
|
74
|
+
# Turn script into absolute path or a path relative to the current
|
75
|
+
# directory
|
76
|
+
if !script.start_with?("/") && !script.start_with?(".")
|
77
|
+
script = "./#{script}"
|
67
78
|
end
|
68
79
|
|
69
|
-
|
70
|
-
|
71
|
-
@status = Process.waitpid2(@pid)[1].exitstatus
|
72
|
-
|
73
|
-
out = @pr[0].readlines.map(&:chomp)
|
74
|
-
err = @pe[0].readlines.map(&:chomp)
|
80
|
+
command_wrapper(script, stdin: stdin, stderr: stderr, fail: fail) {
|
81
|
+
ENV.delete_if { |k,v| %w(RUBYOPT RUBYLIB _).include?(k) || k =~ /^BUNDLER?_/ }
|
75
82
|
|
76
|
-
|
77
|
-
|
83
|
+
# Setup environment
|
84
|
+
env = env.map { |k,v| [k.to_s, v.to_s] }.to_h # Convert array values to strings
|
85
|
+
env.each { |k,v| ENV[k] = v }
|
78
86
|
|
79
|
-
|
87
|
+
# Setup ARGV. Only relevant when running ruby scripts using the 'require'
|
88
|
+
# mechanish instead of calling them through the shell
|
89
|
+
ARGV.replace (argv || [])
|
80
90
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
when nil
|
85
|
-
$stderr.puts err
|
86
|
-
out
|
87
|
-
end
|
88
|
-
end
|
91
|
+
# 'Execute' script by requiring it
|
92
|
+
require script
|
93
|
+
}
|
89
94
|
end
|
90
95
|
|
91
|
-
|
92
|
-
#
|
93
|
-
|
94
|
-
# the command
|
95
|
-
#
|
96
|
-
# By default #command pass through stderr but if :stderr is true, #command
|
97
|
-
# will instead return a tuple of stdout/stderr lines. If :stderr is false,
|
98
|
-
# stderr is ignored and is the same as adding "2>/dev/null" to the command
|
99
|
-
#
|
100
|
-
# #command raises a Command::Error exception if the command returns with an
|
101
|
-
# exit code != 0 unless :fail is false. In that case the the exit code can be
|
102
|
-
# fetched from Command::status
|
103
|
-
#
|
104
|
-
def command(env = {}, cmd, stdin: nil, stderr: nil, fail: true)
|
105
|
-
cmd = "set -o errexit\nset -o pipefail\n#{cmd}"
|
106
|
-
|
96
|
+
private
|
97
|
+
# cmd is the of the command/script and is only used in error messages
|
98
|
+
def command_wrapper(cmd, stdin: nil, stderr: nil, fail: true, &block)
|
107
99
|
pw = IO::pipe # pipe[0] for read, pipe[1] for write
|
108
100
|
pr = IO::pipe
|
109
101
|
pe = IO::pipe
|
@@ -124,14 +116,7 @@ module Command
|
|
124
116
|
STDERR.reopen(pe[1])
|
125
117
|
pe[1].close
|
126
118
|
|
127
|
-
|
128
|
-
# The problem is that the bundler environment is inherited by
|
129
|
-
# subprocesses and interferes with loading ruby commands. FIXME This is
|
130
|
-
# only relevant when running prick in development mode
|
131
|
-
ENV.delete_if { |k,v| %w(RUBYOPT RUBYLIB _).include?(k) || k =~ /^BUNDLER?_/ }
|
132
|
-
env = env.map { |k,v| [k.to_s, v.to_s] }.to_h # Convert array values to strings
|
133
|
-
env.each { |k,v| ENV[k] = v }
|
134
|
-
Kernel.exec(env, cmd)
|
119
|
+
yield
|
135
120
|
}
|
136
121
|
|
137
122
|
pw[0].close
|
@@ -172,23 +157,82 @@ module Command
|
|
172
157
|
end
|
173
158
|
end
|
174
159
|
|
175
|
-
# Like command but returns true if the command exited with the expected
|
176
|
-
# status. Note that it suppresses standard-error by default
|
177
|
-
#
|
178
|
-
def command?(cmd, expect: 0, stdin: nil, stderr: false)
|
179
|
-
command(cmd, stdin: stdin, stderr: stderr, fail: false)
|
180
|
-
@status == expect
|
181
|
-
end
|
182
|
-
|
183
|
-
# Exit status of the last command
|
184
|
-
def status() @status end
|
185
|
-
|
186
|
-
# Exception of the last command if it failed, otherwise nil TODO What is this used for?
|
187
|
-
def exception() @exception end
|
188
|
-
|
189
160
|
module_function :command
|
161
|
+
module_function :command?
|
162
|
+
module_function :script
|
190
163
|
module_function :status
|
191
164
|
module_function :exception
|
192
|
-
module_function :
|
165
|
+
module_function :command_wrapper
|
193
166
|
end
|
194
167
|
|
168
|
+
__END__
|
169
|
+
class Pipe
|
170
|
+
attr_reader :cmd
|
171
|
+
attr_reader :status
|
172
|
+
|
173
|
+
def writer() @pw[1] end
|
174
|
+
def reader() @pr[0] end
|
175
|
+
def error() @pe[0] end
|
176
|
+
|
177
|
+
forward_to :reader, :read, :gets
|
178
|
+
forward_to :writer, :write, :puts
|
179
|
+
|
180
|
+
# Remaining output not consumed by #get/#read or through #reader or #error
|
181
|
+
attr_reader :stdout
|
182
|
+
attr_reader :stdin
|
183
|
+
|
184
|
+
def initialize(cmd, stderr: nil, fail: true)
|
185
|
+
@cmd = "set -o errexit\nset -o pipefail\n#{cmd}"
|
186
|
+
@stderr = stderr
|
187
|
+
@fail = fail
|
188
|
+
|
189
|
+
@pw = IO::pipe # pipe[0] for read, pipe[1] for write
|
190
|
+
@pr = IO::pipe
|
191
|
+
@pe = IO::pipe
|
192
|
+
|
193
|
+
STDOUT.flush
|
194
|
+
|
195
|
+
@pid = fork {
|
196
|
+
@pw[1].close
|
197
|
+
@pr[0].close
|
198
|
+
@pe[0].close
|
199
|
+
|
200
|
+
STDIN.reopen(@pw[0])
|
201
|
+
@pw[0].close
|
202
|
+
|
203
|
+
STDOUT.reopen(@pr[1])
|
204
|
+
@pr[1].close
|
205
|
+
|
206
|
+
STDERR.reopen(@pe[1])
|
207
|
+
@pe[1].close
|
208
|
+
|
209
|
+
exec(cmd)
|
210
|
+
}
|
211
|
+
|
212
|
+
@pw[0].close
|
213
|
+
@pr[1].close
|
214
|
+
@pe[1].close
|
215
|
+
end
|
216
|
+
|
217
|
+
def wait
|
218
|
+
@pw[1].close
|
219
|
+
@status = Process.waitpid2(@pid)[1].exitstatus
|
220
|
+
|
221
|
+
out = @pr[0].readlines.map(&:chomp)
|
222
|
+
err = @pe[0].readlines.map(&:chomp)
|
223
|
+
|
224
|
+
@pr[0].close
|
225
|
+
@pe[0].close
|
226
|
+
|
227
|
+
raise Command::Error.new(@cmd, @status, nil, out, err) if @status != 0 && @fail == true
|
228
|
+
|
229
|
+
case @stderr
|
230
|
+
when true; [out, err]
|
231
|
+
when false; out
|
232
|
+
when nil
|
233
|
+
$stderr.puts err
|
234
|
+
out
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
data/lib/prick/state.rb
CHANGED
@@ -24,9 +24,16 @@ module Prick
|
|
24
24
|
# absent if the project doesn't use environments
|
25
25
|
attr_reader :environment_file
|
26
26
|
|
27
|
+
# Reflections file. Default 'schema/reflections.yml'. May be nil if the
|
28
|
+
# file is absent
|
29
|
+
attr_reader :reflections_file
|
30
|
+
|
27
31
|
# State file. Default '.prick-state.yml'
|
28
32
|
attr_reader :state_file
|
29
33
|
|
34
|
+
# Fox state file. Default '.fox-state.yml'
|
35
|
+
attr_reader :fox_state_file
|
36
|
+
|
30
37
|
# Schema data file. FIXME What is this?
|
31
38
|
def schema_file() SCHEMA_VERSION_PATH end
|
32
39
|
|
@@ -95,8 +102,9 @@ module Prick
|
|
95
102
|
@clean = Git.clean?
|
96
103
|
end
|
97
104
|
|
98
|
-
def initialize(project_file, environment_file, state_file)
|
99
|
-
@project_file, @environment_file, @
|
105
|
+
def initialize(project_file, environment_file, reflections_file, state_file, fox_state_file)
|
106
|
+
@project_file, @environment_file, @reflections_file, @state_file, @fox_state_file =
|
107
|
+
project_file, environment_file, reflections_file, state_file, fox_state_file
|
100
108
|
@project_loaded = @state_loaded = @environment_loaded = false
|
101
109
|
|
102
110
|
if @project_file && File.exist?(@project_file)
|
@@ -3,8 +3,16 @@
|
|
3
3
|
require_relative '../builder/builder.rb'
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
|
-
def self.fox(database, username, files)
|
7
|
-
|
6
|
+
def self.fox(database, username, files, reset: false, exclude: nil)
|
7
|
+
self.drop_data(database) # In prick-drop
|
8
|
+
opts = {
|
9
|
+
state: FOX_STATE_PATH,
|
10
|
+
delete: "none",
|
11
|
+
exec: true,
|
12
|
+
exclude: (exclude ? exclude.join(',') : nil),
|
13
|
+
reflections: Prick.state.reflections_file
|
14
|
+
}.reject { |k,v| v.nil? }.map { |k,v| "--#{k}#{v == true ? "" : "=#{v}"}" }.join(" ")
|
15
|
+
Command.command "fox #{opts} #{database} #{files.join(" ")}"
|
8
16
|
end
|
9
17
|
end
|
10
18
|
|
@@ -31,7 +31,7 @@ module Prick::SubCommand
|
|
31
31
|
Command.status == 0 or Prick.failure "Failed creating initial import"
|
32
32
|
|
33
33
|
# Write (valid) configuration file
|
34
|
-
state = State.new(project_file, nil, nil)
|
34
|
+
state = State.new(project_file, nil, nil, nil, nil)
|
35
35
|
state.name = name
|
36
36
|
state.title = title
|
37
37
|
state.prick_version = PrickVersion.new VERSION
|
@@ -4,7 +4,7 @@ require_relative '../builder/builder.rb'
|
|
4
4
|
|
5
5
|
module Prick::SubCommand
|
6
6
|
def self.snapshot(
|
7
|
-
database, username,
|
7
|
+
database, username,
|
8
8
|
builddir: Prick.state.schema_dir)
|
9
9
|
|
10
10
|
conn = Prick.state.connection
|
@@ -24,6 +24,13 @@ module Prick::SubCommand
|
|
24
24
|
}
|
25
25
|
end
|
26
26
|
conn.insert("prick", "snapshots", records)
|
27
|
+
|
28
|
+
# Patch fox state file
|
29
|
+
state = YAML.load(IO.read(Prick.state.fox_state_file))
|
30
|
+
for record in records
|
31
|
+
state[:ids][record[:schema_name] + '.' + record[:table_name]] = record[:max_id] if record[:max_id]
|
32
|
+
end
|
33
|
+
IO.write(Prick.state.fox_state_file, YAML.dump(state))
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
data/lib/prick/version.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'prick/version.rb'
|
2
|
+
|
3
|
+
require 'pg_conn'
|
4
|
+
|
5
|
+
require 'indented_io'
|
6
|
+
require 'constrain'
|
7
|
+
require 'forward_to'
|
8
|
+
require 'string-text'
|
9
|
+
|
10
|
+
include Constrain
|
11
|
+
include ForwardTo
|
12
|
+
include String::Text
|
13
|
+
|
14
|
+
require 'fixture_fox'
|
15
|
+
|
16
|
+
module Prick
|
17
|
+
class Error < RuntimeError; end
|
18
|
+
class Failure < RuntimeError; end
|
19
|
+
end
|
20
|
+
|
21
|
+
require_relative 'prick/constants.rb'
|
22
|
+
require_relative 'prick/ext/expand_variables.rb'
|
23
|
+
|
24
|
+
require_relative 'prick/local/command.rb'
|
25
|
+
require_relative 'prick/local/git.rb'
|
26
|
+
require_relative 'prick/local/timer.rb'
|
27
|
+
require_relative 'prick/local/ansi.rb'
|
28
|
+
require_relative 'prick/local/fmt.rb'
|
29
|
+
|
30
|
+
require_relative 'prick/environment.rb'
|
31
|
+
require_relative 'prick/state.rb'
|
32
|
+
require_relative 'prick/prick_version.rb'
|
33
|
+
require_relative 'prick/diff.rb'
|
34
|
+
|
35
|
+
module Prick
|
36
|
+
def mesg(*msgs) = Prick.mesg(*msgs)
|
37
|
+
def verb(*msgs) = Prick.verb(*msgs)
|
38
|
+
def self.mesg(*msgs) puts msgs.join(" ") if !$quiet end
|
39
|
+
def self.verb(*msgs) puts msgs.join(" ") if $verbose && !$quiet end
|
40
|
+
end
|
41
|
+
|
42
|
+
require_relative 'prick/subcommand/subcommand.rb'
|
43
|
+
require_relative 'prick/subcommand/prick-bash.rb'
|
44
|
+
require_relative 'prick/subcommand/prick-build.rb'
|
45
|
+
require_relative 'prick/subcommand/prick-clean.rb'
|
46
|
+
require_relative 'prick/subcommand/prick-create.rb'
|
47
|
+
require_relative 'prick/subcommand/prick-drop.rb'
|
48
|
+
require_relative 'prick/subcommand/prick-fox.rb'
|
49
|
+
require_relative 'prick/subcommand/prick-init.rb'
|
50
|
+
require_relative 'prick/subcommand/prick-list.rb'
|
51
|
+
require_relative 'prick/subcommand/prick-make.rb'
|
52
|
+
require_relative 'prick/subcommand/prick-migrate.rb'
|
53
|
+
require_relative 'prick/subcommand/prick-release.rb'
|
54
|
+
require_relative 'prick/subcommand/prick-run.rb'
|
55
|
+
require_relative 'prick/subcommand/prick-set.rb'
|
56
|
+
require_relative 'prick/subcommand/prick-setup.rb'
|
57
|
+
require_relative 'prick/subcommand/prick-snapshot.rb'
|
58
|
+
require_relative 'prick/subcommand/prick-teardown.rb'
|
59
|
+
require_relative 'prick/subcommand/prick-touch.rb'
|
60
|
+
|
61
|
+
module Prick
|
62
|
+
@state = nil
|
63
|
+
def self.state?() !@state.nil? end
|
64
|
+
def self.state() @state or raise ArgumentError end
|
65
|
+
def self.state=(state) @state = state end
|
66
|
+
|
67
|
+
def self.error(*args) raise Prick::Error.new *args end
|
68
|
+
def self.failure(*args) raise Prick::Failure.new *args end
|
69
|
+
|
70
|
+
def self.owner_conn = state.connection
|
71
|
+
def self.super_conn = State.connection
|
72
|
+
# def self.conn = owner_conn
|
73
|
+
|
74
|
+
# Return list of prick databases. If a block is given it is called with a
|
75
|
+
# connection to each of the databases
|
76
|
+
def self.databases(&block)
|
77
|
+
databases = super_conn.values %(
|
78
|
+
select datname from pg_database where datistemplate = false order by datname
|
79
|
+
)
|
80
|
+
databases.select! { |database|
|
81
|
+
PgConn.new(database) { |conn|
|
82
|
+
is_prick_database = conn.exist?(%(
|
83
|
+
select 1
|
84
|
+
from information_schema.tables
|
85
|
+
where table_schema = 'prick'
|
86
|
+
and table_name = 'builds'
|
87
|
+
limit 1
|
88
|
+
))
|
89
|
+
yield(database, conn) if is_prick_database && block_given?
|
90
|
+
is_prick_database
|
91
|
+
}
|
92
|
+
}
|
93
|
+
databases
|
94
|
+
end
|
95
|
+
|
96
|
+
# Call a ruby script using fork. This is much faster than calling the script
|
97
|
+
# using #system and it shares the database connection with the current
|
98
|
+
# process
|
99
|
+
#
|
100
|
+
# The script is supposed to require 'prick.rb' to get access to the
|
101
|
+
# Prick.conn function that returns the current database when run in a Prick
|
102
|
+
# environment
|
103
|
+
#
|
104
|
+
# require 'prick.rb'
|
105
|
+
# conn = Prick.conn database, username
|
106
|
+
#
|
107
|
+
def self.call(ruby_script)
|
108
|
+
File.exist?(ruby_script) or raise ArgumentError, "Can't find script '#{ruby_script}' in Prick.call"
|
109
|
+
|
110
|
+
pid = fork do
|
111
|
+
require(File.join(Dir.getwd, ruby_script))
|
112
|
+
end
|
113
|
+
Process.wait(pid)
|
114
|
+
$?.exitstatus == 0 or raise ArgumentError, "Ruby script '#{ruby_script}' failed"
|
115
|
+
owner_conn.reset
|
116
|
+
end
|
117
|
+
|
118
|
+
module SubCommand
|
119
|
+
def self.owner_conn = Prick.owner_conn
|
120
|
+
def self.super_conn = Prick.super_conn
|
121
|
+
# def self.conn = Prick.conn
|
122
|
+
end
|
123
|
+
end
|
data/lib/prick.rb
CHANGED
@@ -1,101 +1,12 @@
|
|
1
|
-
require 'prick/version.rb'
|
2
1
|
|
3
2
|
require 'pg_conn'
|
4
3
|
|
5
|
-
require 'indented_io'
|
6
|
-
require 'constrain'
|
7
|
-
require 'forward_to'
|
8
|
-
require 'string-text'
|
9
|
-
|
10
|
-
include Constrain
|
11
|
-
include ForwardTo
|
12
|
-
include String::Text
|
13
|
-
|
14
|
-
require 'fixture_fox'
|
15
|
-
|
16
|
-
module Prick
|
17
|
-
class Error < RuntimeError; end
|
18
|
-
class Failure < RuntimeError; end
|
19
|
-
end
|
20
|
-
|
21
|
-
require_relative 'prick/constants.rb'
|
22
|
-
require_relative 'prick/ext/expand_variables.rb'
|
23
|
-
|
24
|
-
require_relative 'prick/local/command.rb'
|
25
|
-
require_relative 'prick/local/git.rb'
|
26
|
-
require_relative 'prick/local/timer.rb'
|
27
|
-
require_relative 'prick/local/ansi.rb'
|
28
|
-
require_relative 'prick/local/fmt.rb'
|
29
|
-
|
30
|
-
require_relative 'prick/environment.rb'
|
31
|
-
require_relative 'prick/state.rb'
|
32
|
-
require_relative 'prick/prick_version.rb'
|
33
|
-
require_relative 'prick/diff.rb'
|
34
|
-
|
35
4
|
module Prick
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
require_relative 'prick/subcommand/subcommand.rb'
|
43
|
-
require_relative 'prick/subcommand/prick-bash.rb'
|
44
|
-
require_relative 'prick/subcommand/prick-build.rb'
|
45
|
-
require_relative 'prick/subcommand/prick-clean.rb'
|
46
|
-
require_relative 'prick/subcommand/prick-create.rb'
|
47
|
-
require_relative 'prick/subcommand/prick-drop.rb'
|
48
|
-
require_relative 'prick/subcommand/prick-fox.rb'
|
49
|
-
require_relative 'prick/subcommand/prick-init.rb'
|
50
|
-
require_relative 'prick/subcommand/prick-list.rb'
|
51
|
-
require_relative 'prick/subcommand/prick-make.rb'
|
52
|
-
require_relative 'prick/subcommand/prick-migrate.rb'
|
53
|
-
require_relative 'prick/subcommand/prick-release.rb'
|
54
|
-
require_relative 'prick/subcommand/prick-run.rb'
|
55
|
-
require_relative 'prick/subcommand/prick-set.rb'
|
56
|
-
require_relative 'prick/subcommand/prick-setup.rb'
|
57
|
-
require_relative 'prick/subcommand/prick-snapshot.rb'
|
58
|
-
require_relative 'prick/subcommand/prick-teardown.rb'
|
59
|
-
require_relative 'prick/subcommand/prick-touch.rb'
|
60
|
-
|
61
|
-
module Prick
|
62
|
-
@state = nil
|
63
|
-
def self.state?() !@state.nil? end
|
64
|
-
def self.state() @state or raise ArgumentError end
|
65
|
-
def self.state=(state) @state = state end
|
66
|
-
|
67
|
-
def self.error(*args) raise Prick::Error.new *args end
|
68
|
-
def self.failure(*args) raise Prick::Failure.new *args end
|
69
|
-
|
70
|
-
def self.owner_conn = state.connection
|
71
|
-
def self.super_conn = State.connection
|
72
|
-
# def self.conn = owner_conn
|
73
|
-
|
74
|
-
# Return list of prick databases. If a block is given it is called with a
|
75
|
-
# connection to each of the databases
|
76
|
-
def self.databases(&block)
|
77
|
-
databases = super_conn.values %(
|
78
|
-
select datname from pg_database where datistemplate = false order by datname
|
79
|
-
)
|
80
|
-
databases.select! { |database|
|
81
|
-
PgConn.new(database) { |conn|
|
82
|
-
is_prick_database = conn.exist?(%(
|
83
|
-
select 1
|
84
|
-
from information_schema.tables
|
85
|
-
where table_schema = 'prick'
|
86
|
-
and table_name = 'builds'
|
87
|
-
limit 1
|
88
|
-
))
|
89
|
-
yield(database, conn) if is_prick_database && block_given?
|
90
|
-
is_prick_database
|
91
|
-
}
|
92
|
-
}
|
93
|
-
databases
|
94
|
-
end
|
95
|
-
|
96
|
-
module SubCommand
|
97
|
-
def self.owner_conn = Prick.owner_conn
|
98
|
-
def self.super_conn = Prick.super_conn
|
99
|
-
# def self.conn = Prick.conn
|
5
|
+
def self.conn(database, username)
|
6
|
+
if self.respond_to?(:owner_conn)
|
7
|
+
self.owner_conn
|
8
|
+
else
|
9
|
+
PgConn.new(database, username)
|
10
|
+
end
|
100
11
|
end
|
101
12
|
end
|
data/prick.gemspec
CHANGED
@@ -33,13 +33,13 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_dependency "indented_io"
|
34
34
|
spec.add_dependency "constrain"
|
35
35
|
spec.add_dependency "forward_to"
|
36
|
-
spec.add_dependency "bootsnap"
|
37
36
|
spec.add_dependency "fixture_fox"
|
38
37
|
spec.add_dependency "postspec"
|
39
38
|
spec.add_dependency "pg_graph"
|
40
39
|
spec.add_dependency "shellopts"
|
41
40
|
spec.add_dependency "dsort"
|
42
41
|
spec.add_dependency "string-text"
|
42
|
+
spec.add_dependency "prick-inflector" # Because we use it from inline-eval'ed scripts
|
43
43
|
|
44
44
|
spec.add_development_dependency "ruby-prof"
|
45
45
|
|
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.
|
4
|
+
version: 0.40.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: 2024-
|
11
|
+
date: 2024-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: semantic
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: fixture_fox
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: postspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: pg_graph
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: shellopts
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: dsort
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
@@ -137,7 +137,7 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: string-text
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - ">="
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
154
|
+
name: prick-inflector
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - ">="
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- doc/build-yml.txt
|
198
198
|
- exe/prick
|
199
199
|
- idea.txt
|
200
|
+
- lib/prick-command.rb
|
200
201
|
- lib/prick.rb
|
201
202
|
- lib/prick/builder/batch.rb
|
202
203
|
- lib/prick/builder/builder.rb
|