~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

  • Committer: Alexander Belchenko
  • Date: 2008-02-06 15:33:12 UTC
  • mto: This revision was merged to the branch mainline in revision 3231.
  • Revision ID: bialix@ukr.net-20080206153312-qycs7u05d7fjtwqq
Ian's review

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
18
 
19
 
"""Progress indicators.
20
 
 
21
 
The usual way to use this is via bzrlib.ui.ui_factory.nested_progress_bar which
22
 
will maintain a ProgressBarStack for you.
23
 
 
24
 
For direct use, the factory ProgressBar will return an auto-detected progress
25
 
bar that should match your terminal type. You can manually create a
26
 
ProgressBarStack too if you need multiple levels of cooperating progress bars.
27
 
Note that bzrlib's internal functions use the ui module, so if you are using
28
 
bzrlib it really is best to use bzrlib.ui.ui_factory.
 
19
"""Simple text-mode progress indicator.
 
20
 
 
21
To display an indicator, create a ProgressBar object.  Call it,
 
22
passing Progress objects indicating the current state.  When done,
 
23
call clear().
 
24
 
 
25
Progress is suppressed when output is not sent to a terminal, so as
 
26
not to clutter log files.
29
27
"""
30
28
 
 
29
# TODO: should be a global option e.g. --silent that disables progress
 
30
# indicators, preferably without needing to adjust all code that
 
31
# potentially calls them.
 
32
 
 
33
# TODO: If not on a tty perhaps just print '......' for the benefit of IDEs, etc
 
34
 
31
35
# TODO: Optionally show elapsed time instead/as well as ETA; nicer
32
36
# when the rate is unpredictable
33
37
 
294
298
        self.child_fraction = 0
295
299
        self._have_output = False
296
300
    
 
301
 
297
302
    def throttle(self, old_msg):
298
303
        """Return True if the bar was updated too recently"""
299
304
        # time.time consistently takes 40/4000 ms = 0.01 ms.
315
320
        return False
316
321
        
317
322
    def tick(self):
318
 
        self.update(self.last_msg, self.last_cnt, self.last_total,
 
323
        self.update(self.last_msg, self.last_cnt, self.last_total, 
319
324
                    self.child_fraction)
320
325
 
321
326
    def child_update(self, message, current, total):
331
336
            self.last_msg = ''
332
337
        self.tick()
333
338
 
334
 
    def update(self, msg, current_cnt=None, total_cnt=None,
 
339
    def update(self, msg, current_cnt=None, total_cnt=None, 
335
340
               child_fraction=0):
336
341
        """Update and redraw progress bar."""
337
342
        if msg is None:
433
438
        self._have_output = True
434
439
        #self.to_file.flush()
435
440
            
436
 
    def clear(self):
 
441
    def clear(self):        
437
442
        if self._have_output:
438
443
            self.to_file.write('\r%s\r' % (' ' * (self.width - 1)))
439
444
        self._have_output = False
563
568
            self.cur_phase += 1
564
569
        assert self.cur_phase < self.total
565
570
        self.pb.update(self.message, self.cur_phase, self.total)
 
571
 
 
572
 
 
573
def run_tests():
 
574
    import doctest
 
575
    result = doctest.testmod()
 
576
    if result[1] > 0:
 
577
        if result[0] == 0:
 
578
            print "All tests passed"
 
579
    else:
 
580
        print "No tests to run"
 
581
 
 
582
 
 
583
def demo():
 
584
    sleep = time.sleep
 
585
    
 
586
    print 'dumb-terminal test:'
 
587
    pb = DotsProgressBar()
 
588
    for i in range(100):
 
589
        pb.update('Leoparden', i, 99)
 
590
        sleep(0.1)
 
591
    sleep(1.5)
 
592
    pb.clear()
 
593
    sleep(1.5)
 
594
    
 
595
    print 'smart-terminal test:'
 
596
    pb = ProgressBar(show_pct=True, show_bar=True, show_spinner=False)
 
597
    for i in range(100):
 
598
        pb.update('Elephanten', i, 99)
 
599
        sleep(0.1)
 
600
    sleep(2)
 
601
    pb.clear()
 
602
    sleep(1)
 
603
 
 
604
    print 'done!'
 
605
 
 
606
if __name__ == "__main__":
 
607
    demo()