def testPagerOverQuit(self): self.SetRawKeys(['q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' % self.Prompt(81) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerOnePagePlusTwoLinesBoundaryBangerViaFunctionKeys(self): self.SetRawKeys([ '<PAGE-DOWN>', '<PAGE-DOWN>', '<DOWN-ARROW>', '<DOWN-ARROW>', '<DOWN-ARROW>', '<UP-ARROW>', '<UP-ARROW>', '<UP-ARROW>', '<PAGE-UP>', '<PAGE-DOWN>', '<PAGE-DOWN>', None ]) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '10\n11\n%s' '%s' '%s' '%s' '%s' '2\n3\n4\n5\n6\n7\n8\n9\n10\n%s' '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '%s' '%s' '10\n11\n%s' '%s') % ( self.Prompt(81), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(90), self.Prompt(81), self.Prompt(81), self.Prompt(81), self.Prompt(100), self.Prompt(100)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerUnderQuit(self): self.SetRawKeys(['q']) contents = '1\n2\n3\n4\n5\n' expected = contents console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual(['q'], self.raw_keys)
def testPagerBadSearchPattern(self): self.SetRawKeys(['/', '*', '1', '\n', 'q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '/*1\r \r%s') % (self.Prompt(81), self.Prompt(81)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerOverNextBoundaryQuit(self): self.SetRawKeys([' ', ' ', 'q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '10\n11\n%s' '%s') % (self.Prompt(81), self.Prompt(100), self.Prompt(100)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerOverHelpQuit(self): self.SetRawKeys(['h', 'X', 'q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ( '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '%s\n' '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' % (self.Prompt(81), console_pager.Pager.HELP_TEXT, self.Prompt(81))) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerCountPosition(self): self.SetRawKeys(['1', '0', 'g', 'q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '%s' '%s' '10\n11\n' '%s') % (self.Prompt(81), self.Prompt(81), self.Prompt(81), self.Prompt(100)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerOnePagePlusTwoWithWidesLines(self): self.SetRawKeys(['f', 'f', 'k', 'k', 'k', 'k', 'q']) contents = ('A2345678901234567890abcdef\n' 'B2345678901234567890abcdef\n' 'C2345678901234567890abcdef\n' 'D2345678901234567890abcdef\n' 'E2345678901234567890abcdef\n' 'F2345678901234567890abcdef\n' 'G2345678901234567890abcdef\n' 'H2345678901234567890abcdef\n' 'I2345678901234567890abcdef\n') expected = ('A2345678901234567890\nabcdef\n' 'B2345678901234567890\nabcdef\n' 'C2345678901234567890\nabcdef\n' 'D2345678901234567890\nabcdef\n' 'E2345678901234567890\n' '%s' 'abcdef\n' 'F2345678901234567890\nabcdef\n' 'G2345678901234567890\nabcdef\n' 'H2345678901234567890\nabcdef\n' 'I2345678901234567890\nabcdef\n' '%s' '%s' 'E2345678901234567890\nabcdef\n' 'F2345678901234567890\nabcdef\n' 'G2345678901234567890\nabcdef\n' 'H2345678901234567890\nabcdef\n' 'I2345678901234567890\n' '%s' 'abcdef\n' 'E2345678901234567890\nabcdef\n' 'F2345678901234567890\nabcdef\n' 'G2345678901234567890\nabcdef\n' 'H2345678901234567890\nabcdef\n' '%s' 'D2345678901234567890\nabcdef\n' 'E2345678901234567890\nabcdef\n' 'F2345678901234567890\nabcdef\n' 'G2345678901234567890\nabcdef\n' 'H2345678901234567890\n' '%s' 'abcdef\n' 'D2345678901234567890\nabcdef\n' 'E2345678901234567890\nabcdef\n' 'F2345678901234567890\nabcdef\n' 'G2345678901234567890\nabcdef\n' '%s') % (self.Prompt(50), self.Prompt(100), self.Prompt(100), self.Prompt(94), self.Prompt(88), self.Prompt(83), self.Prompt(77)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def More(contents, out=None, prompt=None, check_pager=True): """Run a user specified pager or fall back to the internal pager. Args: contents: The entire contents of the text lines to page. out: The output stream, log.out (effectively) if None. prompt: The page break prompt. check_pager: Checks the PAGER env var and uses it if True. """ if not IsInteractive(output=True): if not out: out = log.out out.write(contents) return if not out: # Rendered help to the log file. log.file_only_logger.info(contents) # Paging shenanigans to stdout. out = sys.stdout if check_pager: pager = encoding.GetEncodedValue(os.environ, 'PAGER', None) if pager == '-': # Use the fallback Pager. pager = None elif not pager: # Search for a pager that handles ANSI escapes. for command in ('less', 'pager'): if files.FindExecutableOnPath(command): pager = command break if pager: # If the pager is less(1) then instruct it to display raw ANSI escape # sequences to enable colors and font embellishments. less_orig = encoding.GetEncodedValue(os.environ, 'LESS', None) less = '-R' + (less_orig or '') encoding.SetEncodedValue(os.environ, 'LESS', less) p = subprocess.Popen(pager, stdin=subprocess.PIPE, shell=True) enc = console_attr.GetConsoleAttr().GetEncoding() p.communicate(input=contents.encode(enc)) p.wait() if less_orig is None: encoding.SetEncodedValue(os.environ, 'LESS', None) return # Fall back to the internal pager. console_pager.Pager(contents, out, prompt).Run()
def More(contents, out=None, prompt=None, check_pager=True): """Run a user specified pager or fall back to the internal pager. Args: contents: The entire contents of the text lines to page. out: The output stream, log.out (effectively) if None. prompt: The page break prompt. check_pager: Checks the PAGER env var and uses it if True. """ if not IsInteractive(output=True): if not out: out = log.out out.write(contents) return if not out: # Rendered help to the log file. log.file_only_logger.info(contents) # Paging shenanigans to stdout. out = sys.stdout if check_pager: pager = os.environ.get('PAGER', None) if pager == '-': # Use the fallback Pager. pager = None elif not pager: # Search for a pager that handles ANSI escapes. for command in ('less', 'pager'): if files.FindExecutableOnPath(command): pager = command break if pager: less = os.environ.get('LESS', None) if less is None: os.environ['LESS'] = '-R' p = subprocess.Popen(pager, stdin=subprocess.PIPE, shell=True) encoding = console_attr.GetConsoleAttr().GetEncoding() p.communicate(input=contents.encode(encoding)) p.wait() if less is None: os.environ.pop('LESS') return # Fall back to the internal pager. console_pager.Pager(contents, out, prompt).Run()
def testPagerThreePagesBackAndForthBoundary(self): self.SetRawKeys([' ', ' ', ' ', 'b', 'b', 'b', ' ', ' ', ' ', 'q']) contents = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n' '11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n' '21\n22\n23\n24\n25\n26\n27\n') expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '10\n11\n12\n13\n14\n15\n16\n17\n18\n%s' '19\n20\n21\n22\n23\n24\n25\n26\n27\n%s' '%s' '10\n11\n12\n13\n14\n15\n16\n17\n18\n%s' '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '%s' '10\n11\n12\n13\n14\n15\n16\n17\n18\n%s' '19\n20\n21\n22\n23\n24\n25\n26\n27\n%s' '%s') % (self.Prompt(33), self.Prompt(66), self.Prompt(100), self.Prompt(100), self.Prompt(66), self.Prompt(33), self.Prompt(33), self.Prompt(66), self.Prompt(100), self.Prompt(100)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerOnePagePlusTwoLinesBoundaryBanger(self): self.SetRawKeys( ['f', 'f', 'j', 'j', 'j', 'k', 'k', 'k', 'b', 'f', 'f', 'q']) contents = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n' expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '10\n11\n%s' '%s' '%s' '%s' '%s' '2\n3\n4\n5\n6\n7\n8\n9\n10\n%s' '1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '%s' '%s' '10\n11\n%s' '%s') % ( self.Prompt(81), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(90), self.Prompt(81), self.Prompt(81), self.Prompt(81), self.Prompt(100), self.Prompt(100)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)
def testPagerThreePagesForwardSearch(self): self.SetRawKeys([ '/', '^', '.', '1', '\n', '/', '\n', 'n', 'n', 'N', 'N', 'N', 'q' ]) contents = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n' '11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n' '21\n22\n23\n24\n25\n26\n27\n') expected = ('1\n2\n3\n4\n5\n6\n7\n8\n9\n%s' '/^.1\r \r' '11\n12\n13\n14\n15\n16\n17\n18\n19\n%s' '/\r\r' '20\n21\n22\n23\n24\n25\n26\n27\n%s' '%s' '%s' '11\n12\n13\n14\n15\n16\n17\n18\n19\n%s' '%s' '%s') % (self.Prompt(33), self.Prompt(70), self.Prompt(100), self.Prompt(100), self.Prompt(100), self.Prompt(70), self.Prompt(70), self.Prompt(70)) console_pager.Pager(contents).Run() self.AssertOutputEquals(expected) self.assertEqual([], self.raw_keys)