Skip to content

Ensure capture_output does not output to captured file descriptors #3537

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Mar 27, 2025
Merged
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
6a15e9d
NFC: clarify comments
jsiirola Mar 13, 2025
78c5d60
capture_output: improve error reporting, ensure deadlock detection do…
jsiirola Mar 13, 2025
c6cd456
Ensure empty stream writes don't generate log records
jsiirola Mar 13, 2025
e2f25ed
Fix test incompletely cleaning up after itself
jsiirola Mar 13, 2025
47d94e8
Simplify test
jsiirola Mar 13, 2025
7278f79
Update test to reflect deadlock detection not deadlocking
jsiirola Mar 13, 2025
d12f2a0
Support passing a logger to LoggingIntercept
jsiirola Mar 14, 2025
7558b73
If level is None, defer to the logger's current effective level
jsiirola Mar 14, 2025
d7e9eef
Add LoggingIntercept tests
jsiirola Mar 14, 2025
a92f8cd
Switch to ExitStack-inspired context management
jsiirola Mar 14, 2025
2ca2cee
NFC: fix typo
jsiirola Mar 14, 2025
6a2e96a
Remove redirection of stdout/err when synchronize is False
jsiirola Mar 19, 2025
0959c86
fd_redirect does not need to be stored on class
jsiirola Mar 19, 2025
1316606
NFC: update comments
jsiirola Mar 19, 2025
8779059
Flush stdout/stderr before entering capture_output
jsiirola Mar 19, 2025
7be7cc7
capture_output should return the actual target output streams
jsiirola Mar 19, 2025
c205eef
Checkpointing breaking output loops with capture_fd=True
jsiirola Mar 21, 2025
fa787e1
Break output loops due to LogStreams
jsiirola Mar 22, 2025
8e7f726
Simplify redirect logic
jsiirola Mar 22, 2025
0446815
Update documentation
jsiirola Mar 22, 2025
e05c484
Update test to reflect change in the behavior of redirect_fd
jsiirola Mar 22, 2025
5dce220
Ensure context_stack is cleared upon __exit__
jsiirola Mar 25, 2025
9442dfa
Remove unnecessary code
jsiirola Mar 25, 2025
7c5f9ec
Support passing sequences of streams to capture_output
jsiirola Mar 25, 2025
15ccaef
Rework output stream management to work with the lastResort handler
jsiirola Mar 25, 2025
c066518
Improve test coverage
jsiirola Mar 25, 2025
a3d5f55
Test portability fixes
jsiirola Mar 25, 2025
510ef4f
Relax the exception test (stop fighting escaping backslashes)
jsiirola Mar 25, 2025
3572adf
NFC: fixing comment typos
jsiirola Mar 27, 2025
eca3f3a
Remove inactive debugging code
jsiirola Mar 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add LoggingIntercept tests
jsiirola committed Mar 14, 2025
commit d7e9eef8263229ca4510f1f396e01d621f013c21
43 changes: 43 additions & 0 deletions pyomo/common/tests/test_log.py
Original file line number Diff line number Diff line change
@@ -558,3 +558,46 @@ def test_preformatted_api(self):
self.assertIs(msg.msg, ref)
self.assertEqual(str(msg), '2')
self.assertEqual(repr(msg), "Preformatted(2)")


class TestLoggingIntercept(unittest.TestCase):
def test_init(self):
li = LoggingIntercept()
self.assertEqual(li.module, 'root')

li = LoggingIntercept(module='pyomo.core')
self.assertEqual(li.module, 'pyomo.core')

li = LoggingIntercept(logger=logger)
self.assertEqual(li.module, 'pyomo.common.log.testing')

with self.assertRaisesRegex(
ValueError, "LoggingIntercept: only one of 'module' and 'logger' is allowed"
):
li = LoggingIntercept(module='pyomo', logger=logger)

def test_propagate(self):
self.assertEqual(logger.propagate, True)
with LoggingIntercept(logger=logger):
self.assertEqual(logger.propagate, False)
self.assertEqual(logger.propagate, True)

def test_propagate(self):
self.assertEqual(logger.level, 30)
try:
with LoggingIntercept(logger=logger, level=None):
self.assertEqual(logger.level, 30)
self.assertEqual(logger.level, 30)
with LoggingIntercept(logger=logger, level=40):
self.assertEqual(logger.level, 40)
self.assertEqual(logger.level, 30)

logger.setLevel(40)
with LoggingIntercept(logger=logger, level=None):
self.assertEqual(logger.level, 40)
self.assertEqual(logger.level, 40)
with LoggingIntercept(logger=logger, level=30):
self.assertEqual(logger.level, 30)
self.assertEqual(logger.level, 40)
finally:
logger.setLevel(30)