Currently the initialization state can be implicit, calling process/run/iter without explicitly initializing the tube.
We should insist this is explicit:
as a contextmanager (preferred)
runner = SomeRunner(tube)
with runner:
runner.process()
# or
for result in runner.iter():
# ...
# or
runner.run()
or manually:
runner = SomeRunner(tube)
runner.init()
runner.process()
runner.deinit()
Currently the initialization state can be implicit, calling process/run/iter without explicitly initializing the tube.
We should insist this is explicit:
as a contextmanager (preferred)
or manually: