rbbt-util 5.33.19 → 5.34.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/hpc/batch.rb +3 -3
- data/lib/rbbt/hpc/orchestrate.rb +6 -2
- data/lib/rbbt/util/misc/inspect.rb +2 -1
- data/lib/rbbt/util/misc/pipes.rb +9 -1
- data/lib/rbbt/util/open.rb +1 -0
- data/lib/rbbt/workflow/util/provenance.rb +6 -4
- data/lib/rbbt/workflow.rb +1 -1
- data/share/rbbt_commands/hpc/list +7 -3
- data/share/rbbt_commands/hpc/orchestrate +18 -8
- data/share/rbbt_commands/hpc/task +11 -10
- data/share/rbbt_commands/lsf/list +7 -3
- data/share/rbbt_commands/lsf/orchestrate +18 -8
- data/share/rbbt_commands/lsf/task +11 -10
- data/share/rbbt_commands/slurm/list +7 -3
- data/share/rbbt_commands/slurm/orchestrate +18 -8
- data/share/rbbt_commands/slurm/task +11 -10
- data/share/rbbt_commands/workflow/task +1 -1
- data/test/rbbt/util/misc/test_pipes.rb +37 -0
- data/test/rbbt/util/test_open.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d612eb753e090f1221cd4d3b2c17e13e0e87f4cea7bc76c920717ba8055cbe8b
|
4
|
+
data.tar.gz: 9bea5062d3d73982ef5a35526c39ca3208fae9b817233344045144cbd0619920
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d1e5c3fe701bb42049ab34bbe74fddb3e9a0a29d292cc8c8fbfc93049b0004be5b449aa83939de8924f2cdf19a720c044ea7491aacc96037e1acd549bd1201f
|
7
|
+
data.tar.gz: 54abc57de1a43b04337d8f9ad27668af2d07db21dbac7ee925728d6058dee280624385ef5b40280c0ec2439b6d80ed350bc136c9bef15116ba56292532d5e210
|
data/lib/rbbt/hpc/batch.rb
CHANGED
@@ -555,7 +555,7 @@ env > #{batch_options[:fenv]}
|
|
555
555
|
|
556
556
|
batch_job = run_template(batch_dir, dry_run)
|
557
557
|
|
558
|
-
return batch_job unless tail
|
558
|
+
return [batch_job, batch_dir] unless tail
|
559
559
|
|
560
560
|
t_monitor = Thread.new do
|
561
561
|
self.follow_job(batch_dir, :STDERR)
|
@@ -570,8 +570,8 @@ env > #{batch_options[:fenv]}
|
|
570
570
|
Open.ln path + '.info', job.path + '.info' if Open.exists?(path + '.info')
|
571
571
|
Open.ln path + '.files', job.path + '.files' if Open.exists?(path + '.files')
|
572
572
|
end
|
573
|
-
|
574
|
-
|
573
|
+
|
574
|
+
[batch_job, batch_dir]
|
575
575
|
end
|
576
576
|
end
|
577
577
|
|
data/lib/rbbt/hpc/orchestrate.rb
CHANGED
@@ -49,6 +49,8 @@ module HPC
|
|
49
49
|
Log.high "Compute #{batches.length} batches"
|
50
50
|
|
51
51
|
batch_ids = {}
|
52
|
+
last_id = nil
|
53
|
+
last_dir = nil
|
52
54
|
while batches.any?
|
53
55
|
top = batches.select{|b| b[:deps].nil? || (b[:deps] - batch_ids.keys).empty? }.first
|
54
56
|
raise "No batch without unmet dependencies" if top.nil?
|
@@ -87,10 +89,12 @@ module HPC
|
|
87
89
|
puts Log.color(:yellow, "Options: ") + job_options.inspect
|
88
90
|
batch_ids[top] = top[:top_level].task_signature
|
89
91
|
else
|
90
|
-
id = run_job(top[:top_level], job_options)
|
91
|
-
batch_ids[top] = id
|
92
|
+
id, dir = run_job(top[:top_level], job_options)
|
93
|
+
last_id = batch_ids[top] = id
|
94
|
+
last_dir = dir
|
92
95
|
end
|
93
96
|
end
|
97
|
+
[last_id, last_dir]
|
94
98
|
end
|
95
99
|
|
96
100
|
end
|
@@ -56,7 +56,8 @@ module Misc
|
|
56
56
|
":" << obj.to_s
|
57
57
|
when String
|
58
58
|
if obj.length > 100
|
59
|
-
|
59
|
+
digest = Misc.digest(obj)
|
60
|
+
"'" << obj.slice(0,30) << "<...#{obj.length} - #{digest[0..4]}...>" << obj.slice(-10,30)<< "'"
|
60
61
|
else
|
61
62
|
"'" << obj << "'"
|
62
63
|
end
|
data/lib/rbbt/util/misc/pipes.rb
CHANGED
@@ -92,7 +92,6 @@ module Misc
|
|
92
92
|
ConcurrentStream.setup sout, :pids => [pid]
|
93
93
|
else
|
94
94
|
|
95
|
-
|
96
95
|
ConcurrentStream.setup sin, :pair => sout
|
97
96
|
ConcurrentStream.setup sout, :pair => sin
|
98
97
|
|
@@ -782,4 +781,13 @@ module Misc
|
|
782
781
|
ConcurrentStream.setup out, :threads => monitor_thread
|
783
782
|
end
|
784
783
|
|
784
|
+
def self.open_gz_pipe
|
785
|
+
sout = Misc.open_pipe do |sin|
|
786
|
+
yield sin
|
787
|
+
sin.close
|
788
|
+
end
|
789
|
+
|
790
|
+
Open.gzip(sout)
|
791
|
+
end
|
792
|
+
|
785
793
|
end
|
data/lib/rbbt/util/open.rb
CHANGED
@@ -100,11 +100,13 @@ class Step
|
|
100
100
|
step.dependencies.each do |dep|
|
101
101
|
if dep.input_dependencies.any?
|
102
102
|
dep.input_dependencies.each do |id|
|
103
|
-
input_name = dep.recursive_inputs.fields.zip(dep.recursive_inputs).select{|f,d|
|
103
|
+
input_name, _dep = dep.recursive_inputs.fields.zip(dep.recursive_inputs).select{|f,d|
|
104
104
|
d == id || (String === d && d.start_with?(id.files_dir)) || (Array === d && d.include?(id))
|
105
|
-
}.last
|
106
|
-
|
107
|
-
|
105
|
+
}.last
|
106
|
+
if input_name
|
107
|
+
input_dependencies[id] ||= []
|
108
|
+
input_dependencies[id] << [dep, input_name]
|
109
|
+
end
|
108
110
|
end
|
109
111
|
end
|
110
112
|
end
|
data/lib/rbbt/workflow.rb
CHANGED
@@ -414,7 +414,7 @@ module Workflow
|
|
414
414
|
end if task.required_inputs
|
415
415
|
|
416
416
|
if missing_inputs.length == 1
|
417
|
-
raise ParameterException, "Input #{missing_inputs.first} is required but was not provided or is nil"
|
417
|
+
raise ParameterException, "Input '#{missing_inputs.first}' is required but was not provided or is nil"
|
418
418
|
end
|
419
419
|
|
420
420
|
if missing_inputs.length > 1
|
@@ -193,7 +193,11 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
193
193
|
if different_system
|
194
194
|
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
195
195
|
else
|
196
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
196
|
+
#status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
197
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" :
|
198
|
+
(running_jobs.include?(id) || $norunningjobs ?
|
199
|
+
(is_running ? Log.color(:green, id) : Log.color(:yellow, id) ) :
|
200
|
+
Log.color(:red, id) )
|
197
201
|
end
|
198
202
|
prog_rep = []
|
199
203
|
if options[:progress]
|
@@ -204,7 +208,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
204
208
|
step = Step.new step_path
|
205
209
|
step.load_dependencies_from_info
|
206
210
|
has_bar = false
|
207
|
-
|
211
|
+
[step].reverse.each do |j|
|
208
212
|
next if j.done?
|
209
213
|
if j.file(:progress).exists?
|
210
214
|
bar = Log::ProgressBar.new
|
@@ -352,5 +356,5 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
352
356
|
end
|
353
357
|
|
354
358
|
puts
|
355
|
-
puts "Found #{count} jobs"
|
359
|
+
puts Log.color :clear, "Found #{count} jobs"
|
356
360
|
|
@@ -49,17 +49,27 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
49
49
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
50
50
|
|
51
51
|
class Step
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def join
|
53
|
+
HPC::BATCH_MODULE.wait_for_job(@batch_job_dir)
|
54
|
+
end
|
55
|
+
|
56
|
+
def run(no_load = true)
|
57
|
+
if done?
|
58
|
+
self.load
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
62
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
63
|
+
if no_load
|
64
|
+
self
|
55
65
|
else
|
56
|
-
|
57
|
-
|
58
|
-
HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
59
|
-
rescue HPC::SBATCH
|
60
|
-
end
|
66
|
+
join
|
67
|
+
self.load
|
61
68
|
end
|
69
|
+
rescue HPC::SBATCH
|
70
|
+
end
|
62
71
|
end
|
72
|
+
end
|
63
73
|
end
|
64
74
|
|
65
75
|
ARGV.concat ['--detach']
|
@@ -47,17 +47,18 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
47
47
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
48
48
|
|
49
49
|
class Step
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
|
51
|
+
def run(*args)
|
52
|
+
if done?
|
53
|
+
self.load
|
54
|
+
else
|
55
|
+
begin
|
56
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
57
|
+
HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
58
|
+
rescue HPC::SBATCH
|
59
|
+
end
|
60
60
|
end
|
61
|
+
end
|
61
62
|
end
|
62
63
|
|
63
64
|
ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
|
@@ -193,7 +193,11 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
193
193
|
if different_system
|
194
194
|
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
195
195
|
else
|
196
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
196
|
+
#status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
197
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" :
|
198
|
+
(running_jobs.include?(id) || $norunningjobs ?
|
199
|
+
(is_running ? Log.color(:green, id) : Log.color(:yellow, id) ) :
|
200
|
+
Log.color(:red, id) )
|
197
201
|
end
|
198
202
|
prog_rep = []
|
199
203
|
if options[:progress]
|
@@ -204,7 +208,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
204
208
|
step = Step.new step_path
|
205
209
|
step.load_dependencies_from_info
|
206
210
|
has_bar = false
|
207
|
-
|
211
|
+
[step].reverse.each do |j|
|
208
212
|
next if j.done?
|
209
213
|
if j.file(:progress).exists?
|
210
214
|
bar = Log::ProgressBar.new
|
@@ -352,5 +356,5 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
352
356
|
end
|
353
357
|
|
354
358
|
puts
|
355
|
-
puts "Found #{count} jobs"
|
359
|
+
puts Log.color :clear, "Found #{count} jobs"
|
356
360
|
|
@@ -49,17 +49,27 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
49
49
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
50
50
|
|
51
51
|
class Step
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def join
|
53
|
+
HPC::BATCH_MODULE.wait_for_job(@batch_job_dir)
|
54
|
+
end
|
55
|
+
|
56
|
+
def run(no_load = true)
|
57
|
+
if done?
|
58
|
+
self.load
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
62
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
63
|
+
if no_load
|
64
|
+
self
|
55
65
|
else
|
56
|
-
|
57
|
-
|
58
|
-
HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
59
|
-
rescue HPC::SBATCH
|
60
|
-
end
|
66
|
+
join
|
67
|
+
self.load
|
61
68
|
end
|
69
|
+
rescue HPC::SBATCH
|
70
|
+
end
|
62
71
|
end
|
72
|
+
end
|
63
73
|
end
|
64
74
|
|
65
75
|
ARGV.concat ['--detach']
|
@@ -47,17 +47,18 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
47
47
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
48
48
|
|
49
49
|
class Step
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
|
51
|
+
def run(*args)
|
52
|
+
if done?
|
53
|
+
self.load
|
54
|
+
else
|
55
|
+
begin
|
56
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
57
|
+
HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
58
|
+
rescue HPC::SBATCH
|
59
|
+
end
|
60
60
|
end
|
61
|
+
end
|
61
62
|
end
|
62
63
|
|
63
64
|
ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
|
@@ -193,7 +193,11 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
193
193
|
if different_system
|
194
194
|
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
|
195
195
|
else
|
196
|
-
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
196
|
+
#status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
|
197
|
+
status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" :
|
198
|
+
(running_jobs.include?(id) || $norunningjobs ?
|
199
|
+
(is_running ? Log.color(:green, id) : Log.color(:yellow, id) ) :
|
200
|
+
Log.color(:red, id) )
|
197
201
|
end
|
198
202
|
prog_rep = []
|
199
203
|
if options[:progress]
|
@@ -204,7 +208,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
204
208
|
step = Step.new step_path
|
205
209
|
step.load_dependencies_from_info
|
206
210
|
has_bar = false
|
207
|
-
|
211
|
+
[step].reverse.each do |j|
|
208
212
|
next if j.done?
|
209
213
|
if j.file(:progress).exists?
|
210
214
|
bar = Log::ProgressBar.new
|
@@ -352,5 +356,5 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
|
|
352
356
|
end
|
353
357
|
|
354
358
|
puts
|
355
|
-
puts "Found #{count} jobs"
|
359
|
+
puts Log.color :clear, "Found #{count} jobs"
|
356
360
|
|
@@ -49,17 +49,27 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
49
49
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
50
50
|
|
51
51
|
class Step
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def join
|
53
|
+
HPC::BATCH_MODULE.wait_for_job(@batch_job_dir)
|
54
|
+
end
|
55
|
+
|
56
|
+
def run(no_load = true)
|
57
|
+
if done?
|
58
|
+
self.load
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
62
|
+
@batch_job_id, @batch_job_dir = HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
63
|
+
if no_load
|
64
|
+
self
|
55
65
|
else
|
56
|
-
|
57
|
-
|
58
|
-
HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
59
|
-
rescue HPC::SBATCH
|
60
|
-
end
|
66
|
+
join
|
67
|
+
self.load
|
61
68
|
end
|
69
|
+
rescue HPC::SBATCH
|
70
|
+
end
|
62
71
|
end
|
72
|
+
end
|
63
73
|
end
|
64
74
|
|
65
75
|
ARGV.concat ['--detach']
|
@@ -47,17 +47,18 @@ HPC::BATCH_MODULE = HPC.batch_system batch_system
|
|
47
47
|
raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?
|
48
48
|
|
49
49
|
class Step
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
|
51
|
+
def run(*args)
|
52
|
+
if done?
|
53
|
+
self.load
|
54
|
+
else
|
55
|
+
begin
|
56
|
+
Log.debug "Issuing SLURM job for #{self.path}"
|
57
|
+
HPC::BATCH_MODULE.run_job(self, SOPT::GOT_OPTIONS.merge($slurm_options))
|
58
|
+
rescue HPC::SBATCH
|
59
|
+
end
|
60
60
|
end
|
61
|
+
end
|
61
62
|
end
|
62
63
|
|
63
64
|
ARGV.concat ["-W", $slurm_options[:workflows]] if $slurm_options[:workflows]
|
@@ -284,4 +284,41 @@ line4
|
|
284
284
|
end
|
285
285
|
end
|
286
286
|
end
|
287
|
+
|
288
|
+
def test_gz_pipe
|
289
|
+
text =<<-EOF
|
290
|
+
line1
|
291
|
+
line2
|
292
|
+
line3
|
293
|
+
line4
|
294
|
+
EOF
|
295
|
+
|
296
|
+
TmpFile.with_file nil, :extension => 'txt.gz' do |file|
|
297
|
+
sout = Misc.open_gz_pipe do |sin|
|
298
|
+
text.split("\n").each do |line|
|
299
|
+
sin.puts line
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
Open.mkdir File.basename(file)
|
304
|
+
thr1 = Misc.consume_stream(sout, true, file)
|
305
|
+
thr1.join
|
306
|
+
assert Open.gzip?(file)
|
307
|
+
assert_equal text, Open.read(file)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_open_pipe_error
|
312
|
+
sout = Misc.open_pipe do |sin|
|
313
|
+
10.times do |i|
|
314
|
+
sin.puts "line #{i}"
|
315
|
+
end
|
316
|
+
raise
|
317
|
+
end
|
318
|
+
|
319
|
+
TmpFile.with_file do |tmp|
|
320
|
+
#Misc.consume_stream(sout, false, tmp)
|
321
|
+
Open.write(tmp, sout)
|
322
|
+
end
|
323
|
+
end
|
287
324
|
end
|
data/test/rbbt/util/test_open.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.34.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|