MCPcopy Create free account
hub / github.com/aws/aws-cli / OutputStreamFactory

Class OutputStreamFactory

awscli/utils.py:414–469  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

412
413
414class OutputStreamFactory:
415 def __init__(
416 self, session, popen=None, environ=None, default_less_flags='FRX'
417 ):
418 self._session = session
419 self._popen = popen
420 if popen is None:
421 self._popen = Popen
422 self._environ = environ
423 if environ is None:
424 # When calling out to the system's pager, we want to avoid using
425 # shared libraries bundled with the AWS CLI so that the pager uses
426 # the system's shared libraries.
427 with original_ld_library_path():
428 self._environ = os.environ.copy()
429 self._default_less_flags = default_less_flags
430
431 def get_output_stream(self):
432 pager = self._get_configured_pager()
433 if is_a_tty() and pager:
434 return self.get_pager_stream(pager)
435 return self.get_stdout_stream()
436
437 @contextlib.contextmanager
438 def get_pager_stream(self, preferred_pager=None):
439 if not preferred_pager:
440 preferred_pager = self._get_configured_pager()
441 popen_kwargs = self._get_process_pager_kwargs(preferred_pager)
442 process = LazyPager(self._popen, **popen_kwargs)
443 try:
444 yield process.stdin
445 except OSError:
446 # Ignore IOError since this can commonly be raised when a pager
447 # is closed abruptly and causes a broken pipe.
448 pass
449 finally:
450 process.communicate()
451
452 @contextlib.contextmanager
453 def get_stdout_stream(self):
454 yield get_stdout_text_writer()
455
456 def _get_configured_pager(self):
457 return self._session.get_component('config_store').get_config_variable(
458 'pager'
459 )
460
461 def _get_process_pager_kwargs(self, pager_cmd):
462 kwargs = get_popen_kwargs_for_pager_cmd(pager_cmd)
463 kwargs['stdin'] = PIPE
464 env = self._environ.copy()
465 if 'LESS' not in env:
466 env['LESS'] = self._default_less_flags
467 kwargs['env'] = env
468 kwargs['universal_newlines'] = True
469 return kwargs
470
471

Calls

no outgoing calls