diff --git a/CHANGELOG.md b/CHANGELOG.md index 736ea72..19bff4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## HEAD +- Fix: Background task name lookup is now lazy, this fixes a bug when using `:::>- pre.erb background.start(...)` (https://github.com/zombocom/rundoc/pull/95) + ## 4.1.1 - Fix: Visibility forwarding for `pre.erb` was accidentally reversed, this is now fixed. (https://github.com/zombocom/rundoc/pull/93) diff --git a/lib/rundoc/code_command/background/log/clear.rb b/lib/rundoc/code_command/background/log/clear.rb index 470d1ef..c583baf 100644 --- a/lib/rundoc/code_command/background/log/clear.rb +++ b/lib/rundoc/code_command/background/log/clear.rb @@ -1,7 +1,12 @@ class Rundoc::CodeCommand::Background::Log class Clear < Rundoc::CodeCommand def initialize(name:) - @spawn = Rundoc::CodeCommand::Background::ProcessSpawn.find(name) + @name = name + @background = nil + end + + def background + @background ||= Rundoc::CodeCommand::Background::ProcessSpawn.find(@name) end def to_md(env = {}) @@ -9,7 +14,7 @@ def to_md(env = {}) end def call(env = {}) - @spawn.log.truncate(0) + background.log.truncate(0) "" end end diff --git a/lib/rundoc/code_command/background/log/read.rb b/lib/rundoc/code_command/background/log/read.rb index d80dd29..eaddc05 100644 --- a/lib/rundoc/code_command/background/log/read.rb +++ b/lib/rundoc/code_command/background/log/read.rb @@ -1,7 +1,12 @@ class Rundoc::CodeCommand::Background::Log class Read < Rundoc::CodeCommand def initialize(name:) - @spawn = Rundoc::CodeCommand::Background::ProcessSpawn.find(name) + @name = name + @background = nil + end + + def background + @background ||= Rundoc::CodeCommand::Background::ProcessSpawn.find(@name) end def to_md(env = {}) @@ -9,7 +14,7 @@ def to_md(env = {}) end def call(env = {}) - @spawn.log.read + background.log.read end end end diff --git a/lib/rundoc/code_command/background/start.rb b/lib/rundoc/code_command/background/start.rb index 4324987..679edb6 100644 --- a/lib/rundoc/code_command/background/start.rb +++ b/lib/rundoc/code_command/background/start.rb @@ -3,20 +3,28 @@ class Rundoc::CodeCommand::Background class Start < Rundoc::CodeCommand def initialize(command, name:, wait: nil, timeout: 5, log: Tempfile.new("log"), out: "2>&1", allow_fail: false) + @timeout = timeout @command = command @name = name @wait = wait @allow_fail = allow_fail - FileUtils.touch(log) + @log = log + @redirect = out + FileUtils.touch(@log) - @spawn = ProcessSpawn.new( + @background = nil + end + + def background + @background ||= ProcessSpawn.new( @command, - timeout: timeout, - log: log, - out: out - ) - puts "Spawning commmand: `#{@spawn.command}`" - ProcessSpawn.add(@name, @spawn) + timeout: @timeout, + log: @log, + out: @redirect + ).tap do |spawn| + puts "Spawning commmand: `#{spawn.command}`" + ProcessSpawn.add(@name, spawn) + end end def to_md(env = {}) @@ -24,14 +32,14 @@ def to_md(env = {}) end def call(env = {}) - @spawn.wait(@wait) - @spawn.check_alive! unless @allow_fail + background.wait(@wait) + background.check_alive! unless @allow_fail - @spawn.log.read + background.log.read end def alive? - !!@spawn.alive? + !!background.alive? end end end diff --git a/lib/rundoc/code_command/background/stdin_write.rb b/lib/rundoc/code_command/background/stdin_write.rb index 6164471..089af3a 100644 --- a/lib/rundoc/code_command/background/stdin_write.rb +++ b/lib/rundoc/code_command/background/stdin_write.rb @@ -6,10 +6,15 @@ class StdinWrite < Rundoc::CodeCommand def initialize(contents, name:, wait:, timeout: 5, ending: $/) @contents = contents @ending = ending - @spawn = Rundoc::CodeCommand::Background::ProcessSpawn.find(name) @wait = wait + @name = name @timeout_value = Integer(timeout) @contents_written = nil + @background = nil + end + + def background + @background ||= Rundoc::CodeCommand::Background::ProcessSpawn.find(@name) end # The command is rendered (`:::>-`) by the output of the `def call` method. @@ -20,11 +25,11 @@ def to_md(env = {}) # The contents produced by the command (`:::->`) are rendered by the `def to_md` method. def call(env = {}) writecontents - @spawn.log.read + background.log.read end def writecontents - @contents_written ||= @spawn.stdin_write( + @contents_written ||= background.stdin_write( contents, wait: @wait, ending: @ending, diff --git a/lib/rundoc/code_command/background/stop.rb b/lib/rundoc/code_command/background/stop.rb index 9349df4..70c6535 100644 --- a/lib/rundoc/code_command/background/stop.rb +++ b/lib/rundoc/code_command/background/stop.rb @@ -1,7 +1,12 @@ class Rundoc::CodeCommand::Background class Stop < Rundoc::CodeCommand def initialize(name:) - @spawn = Rundoc::CodeCommand::Background::ProcessSpawn.find(name) + @name = name + @background = nil + end + + def background + @background ||= Rundoc::CodeCommand::Background::ProcessSpawn.find(@name) end def to_md(env = {}) @@ -9,8 +14,8 @@ def to_md(env = {}) end def call(env = {}) - @spawn.stop - @spawn.log.read + background.stop + background.log.read end end end diff --git a/lib/rundoc/code_command/background/wait.rb b/lib/rundoc/code_command/background/wait.rb index 3b3de81..5de3747 100644 --- a/lib/rundoc/code_command/background/wait.rb +++ b/lib/rundoc/code_command/background/wait.rb @@ -1,9 +1,14 @@ class Rundoc::CodeCommand::Background class Wait < Rundoc::CodeCommand def initialize(name:, wait:, timeout: 5) - @spawn = Rundoc::CodeCommand::Background::ProcessSpawn.find(name) + @name = name @wait = wait @timeout_value = Integer(timeout) + @background = nil + end + + def background + @background ||= Rundoc::CodeCommand::Background::ProcessSpawn.find(name) end def to_md(env = {}) @@ -11,7 +16,7 @@ def to_md(env = {}) end def call(env = {}) - @spawn.wait(@wait, @timeout_value) + background.wait(@wait, @timeout_value) "" end end diff --git a/test/rundoc/code_commands/background_test.rb b/test/rundoc/code_commands/background_test.rb index ecb62cf..e17331c 100644 --- a/test/rundoc/code_commands/background_test.rb +++ b/test/rundoc/code_commands/background_test.rb @@ -4,15 +4,19 @@ class BackgroundTest < Minitest::Test def test_stdin_with_cat_echo Dir.mktmpdir do |dir| Dir.chdir(dir) do - background_start = Rundoc::CodeCommand::Background::Start.new("cat", - name: "cat") - background_start.call - - output = Rundoc::CodeCommand::Background::StdinWrite.new( + # Intentionally out of order, should not raise an error as long as "cat" + # command exists at execution time + stdin_write = Rundoc::CodeCommand::Background::StdinWrite.new( "hello there", name: "cat", wait: "hello" - ).call + ) + + background_start = Rundoc::CodeCommand::Background::Start.new("cat", + name: "cat") + + background_start.call + output = stdin_write.call assert_equal("hello there" + $/, output) Rundoc::CodeCommand::Background::Log::Clear.new(