The issue is that underlying iterator is not fully consumed within the body of the with file_progress() block. Instead, that block creates generator expressions like docs = (dict(zip(headers, row)) for row in reader)
These iterables are consumed later, outside the with file_progress() block, which consumes the underlying iterator, and in turn updates the progress bar.
This means that the ProgressBar.__exit__ method gets called before the last time the ProgressBar.update method gets called. The result is that the code to make the cursor invisible (inside the update() method) is called after the cleanup code to make it visible (in the __exit__ method).
The fix is to move consumption of the docs iterators within the progress bar block. (
(An additional fix, to make ProgressBar more robust against this kind of misuse, would to make it refusing to update after its __exit__ method had been called, just like files cannot be read() after they are closed. That requires a in the click library).
Note that Github diff obscures the simplicity of this diff, it's just indenting a block of code.
The issue is that underlying iterator is not fully consumed within the body of the
with file_progress()
block. Instead, that block creates generator expressions likedocs = (dict(zip(headers, row)) for row in reader)
These iterables are consumed later, outside the
with file_progress()
block, which consumes the underlying iterator, and in turn updates the progress bar.This means that the
ProgressBar.__exit__
method gets called before the last time theProgressBar.update
method gets called. The result is that the code to make the cursor invisible (inside theupdate()
method) is called after the cleanup code to make it visible (in the__exit__
method).The fix is to move consumption of the
docs
iterators within the progress bar block. ((An additional fix, to make ProgressBar more robust against this kind of misuse, would to make it refusing to update after its
__exit__
method had been called, just like files cannot beread()
after they are closed. That requires a in the click library).Note that Github diff obscures the simplicity of this diff, it's just indenting a block of code.
:books: Documentation preview :books:: https://sqlite-utils--598.org.readthedocs.build/en/598/