This file is indexed.

/usr/bin/scitools is in python-scitools 0.9.0-2.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
#!/usr/bin/python
legal_programs = ['subst',
                  'replace',
                  'rename',
                  'regression',
                  'profiler',
                  'ps2mpeg',
                  'floatdiff',
                  'file2interactive',
                  'movie',
                  'pyreport',
]

__doc__ = \
"""
The scitools script takes a command and runs a corresponding utility.
The available commands are listed below.

file2interactive:
  Utility for taking a set of Python statements in a file and
  creating the corresponding interactive Python shell session.

floatdiff:
  Script for examining differences in regression tests involving
  floating-point numbers. Used in [1].

regression:
  Simple front-end script to the scitools.Regression module. Used in [1].

ps2mpeg:
  Utility for turning a set of PostScript files into an MPEG movie,
  using mpeg_encode or ppmtompeg.

profiler:
  Script for simplifying the execution of Python's profiling tools. Used in [1].

rename:
  Script for renaming a set of files by substituting one string or
  regular expression with another.

subst:
  Script for subsituting a phrase by another in a set of files.
  Accepts regular expressions. Treated in [1].

replace:
  Script for subsituting a phrase by another in a set of files.
  Does not use regular expressions, just plain text (well suited
  for substituting text with much use of backslashes, curly braces,
  and other special characters in regular expressions (e.g.,
  LaTeX text).

movie:
  Script for creating a movie file from a sequence of image
  files (frames). By default an HTML file for displaying the
  image (PNG) files are made.

pyreport:
  Processes a Python script and pretty prints the results using
  LateX. If the script uses show() commands (from scitools.easyviz)
  they are caught by pyreport and the resulting graphs are inserted in
  the output pdf. Comments lines starting with \"#!\" are interpreted
  as rst lines and pretty printed accordingly in the pdf.
       

Examples:

1. Substitute "compute_X(" calls, where X is any name, by
   "calculate_X(" in a series of files code*.py:

scitools subst 'compute_(.+?)\(' 'calculate_\g<1>(' code*.py

Options -s, -m and -x can be issued to turn on pattern matching
modifies (regular expression flags): re.S/re.DOTALL, re.m/re.MULTILINE
and re.X/re.VERBOSE, respectively.

Alternatively, using replace, but without regex groups:

scitools replace "compute_X("  "calculate_X"


2. Rename files with names like

tmp_bergen_set15060.dat
tmp_oslo_set31897.dat
tmp_stavanger_set21864.dat
tmp_trondheim_set15358.dat

to files with names like

set_15060_bergen.dat
set_15358_trondheim.dat
set_21864_stavanger.dat
set_31897_oslo.dat

scitools rename 'tmp_([a-z]+)_set(\d+)' 'set_\g<2>_\g<1>' tmp_*.dat

A simple further rename is to replace the .dat extension with .data:

scitools rename dat data set*.dat


3. Create an interactive session from a file with a list of statements:

Unix> cat tmp2.py
import os
origdir = os.getcwd()
os.chdir(os.pardir)
os.getcwd()
origdir

Unix> scitools file2interactive tmp2.py
>>> import os
>>> origdir = os.getcwd()
>>> os.chdir(os.pardir)
>>> os.getcwd()
'/Volumes/Shared/main/vc/scitools'
>>> origdir
'/Volumes/Shared/main/vc/scitools/test'


[1] H. P. Langtangen: Python Scripting for Computational Science.
    Third edition, second printing. Springer, 2009.
"""


import os, re, sys, shutil, glob

def wildcard_notation(files):
    """
    On Unix, a command-line argument like *.py is expanded
    by the shell. This is not done on Windows, where we must
    use glob.glob inside Python. This function provides a
    uniform solution.
    """
    if isinstance(files, basestring):
        files = [files]  # ensure list
    if sys.platform[:3] == 'win':
        import glob, operator
        filelist = [glob.glob(arg) for arg in files]
        files = reduce(operator.add, filelist)  # flatten
    return files

def usage_movie():
    print """Usage:
scitools movie                   output_file=mymovie.html fps=4  file*.png
scitools movie encoder=convert   output_file=mymovie.gif  fps=4  file*.jpg
scitools movie encoder=ffmpeg    output_file=mymovie.avi  fps=4  file*.jpg
scitools movie encoder=ffmpeg    output_file=mymovie.mpeg fps=4  file*.jpg
scitools movie encoder=ppmtompeg output_file=mymovie.mpeg fps=24 file*.png
"""

def main_movie():
    if len(sys.argv) < 3:
        print usage_movie()
        sys.exit(1)

    # Search for arguments to movie function
    legal_kwargs = ['output_file', 'overwrite_output',
                    'quiet', 'cleanup', 'force_conversion',
                    'input_file', 'encoder', 'vbitrate',
                    'vbuffer', 'fps', 'vcodec', 'qscale',
                    'qmin', 'qmax', 'iqscale',
                    'pqscale', 'bqscale', 'pattern', 'size',
                    'aspect', 'preferred_package', 'gop_size']
    kw_string_args = ['output_file', 'encoder', 'pattern',
                      'preferred_package', 'vcodec', 'vbuffer',]
    kwargs = []
    kws = []
    for i, arg in enumerate(sys.argv[2:]):
        if '=' in arg:
            kw = arg.split('=')[0].strip()
            if kw in legal_kwargs:
                # Special case: kw='value', else arg is kw=value
                if kw in kw_string_args:
                    arg = kw + '=' + repr(arg.split('=')[1])
                kwargs.append(arg)
                kws.append(kw)
            else:
                print '%s: unknown argument to movie'
        else:
            break

    if not 'encoder' in kws:
        kwargs.append('encoder="html"')  # default
    files = wildcard_notation(sys.argv[i+2:])
    import scitools.easyviz
    call = 'scitools.easyviz.movie(input_files=%s, %s)' % \
           (str(files), ', '.join(kwargs))
    #print call
    eval(call)

def usage_replace():
    print 'Usage: scitools replace from-text to-text file1 file2 ...'

def main_replace():
    if len(sys.argv) < 4:
        usage_replace()
        sys.exit(1)

    from_text = sys.argv[2]
    to_text = sys.argv[3]
    files = wildcard_notation(sys.argv[4:])
    for filename in files:
        f = open(filename, 'r')
        text = f.read()
        f.close()
        if from_text in text:
            backup_filename = filename + '.old~~'
            shutil.copy(filename, backup_filename)
            print 'replacing %s by %s in' % (from_text, to_text), filename
            text = text.replace(from_text, to_text)
            f = open(filename, 'w')
            f.write(text)
            f.close()

def usage_subst():
    print 'Usage: scitools subst [-s -m -x --restore] pattern '\
          'replacement file1 file2 file3 ...'
    print '--restore brings back the backup files'
    print '-s is the re.DOTALL or re.S modifier'
    print '-m is the re.MULTILINE or re.M modifier'
    print '-x is the re.VERBODE or re.X modifier'

from scitools.misc import subst

def main_subst():
    if len(sys.argv) < 4:
        usage_subst()
        sys.exit(1)

    from getopt import getopt
    optlist, args = getopt(sys.argv[2:], 'smx', ['restore'])
    restore = False
    pmm = 0  # pattern matching modifiers (re.compile flags)
    for opt, value in optlist:
        if opt in ('-s',):
            if not pmm:  pmm = re.DOTALL
            else:        pmm = pmm|re.DOTALL
        if opt in ('-m',):
            if not pmm:  pmm = re.MULTILINE
            else:        pmm = pmm|re.MULTILINE
        if opt in ('-x',):
            if not pmm:  pmm = re.VERBOSE
            else:        pmm = pmm|re.VERBOSE
        if opt in ('--restore',):
            restore = True

    if restore:
        for oldfile in args:
            newfile = re.sub(r'\.old~$', '', oldfile)
            if not os.path.isfile(oldfile):
                print '%s is not a file!' % oldfile; continue
            os.rename(oldfile, newfile)
            print 'restoring %s as %s' % (oldfile,newfile)
    else:
        pattern = args[0]; replacement = args[1]
        s = subst(pattern, replacement, wildcard_notation(args[2:]), pmm)
        print s  # print info about substitutions

def usage_rename():
    print 'Usage: scitools rename from_regex to_regex file1 file2 ...'

doc_rename = """
Rename a set of files using the power of regular expressions.

Example: Suppose we have a set of files with names

tmp_bergen_set15060.dat
tmp_oslo_set31897.dat
tmp_stavanger_set21864.dat
tmp_trondheim_set15358.dat

and that we want to rename these to

set_15060_bergen.dat
set_15358_trondheim.dat
set_21864_stavanger.dat
set_31897_oslo.dat

The following command, utilizing regular expressions with two
groups, performs the task:

scitools rename 'tmp_([a-z]+)_set(\d+)' 'set_\g<2>_\g<1>' tmp_*.dat

Copies of the old files are taken for backup and given an extension .old~~:

tmp_bergen_set15060.dat.old~~
tmp_oslo_set31897.dat.old~~
tmp_stavanger_set21864.dat.old~~
tmp_trondheim_set15358.dat.old~~

Supply the command-line argument --no-backup to avoid backing up files
(might increase speed when renaming large files).
"""

def rename(from_regex, to_regex, filenames, backup=True):
    from_regex_c = re.compile(from_regex)
    for filename in filenames:
        if from_regex_c.search(filename):
            newname = from_regex_c.sub(to_regex, filename)
            if backup:
                if os.path.isfile(filename):
                    shutil.copy(filename, filename + '.old~~')
                elif os.path.isdir(filename):
                    shutil.copytree(filename, filename + '.old~~')
            os.rename(filename, newname)
            print '%s renamed to %s' % (filename, newname)



def main_rename():
    if len(sys.argv) < 4:
        usage_rename()
        print doc_rename
        sys.exit(1)

    if '--no-backup' in sys.argv:
        backup = False
        sys.argv.remove('--no-backup')
    else:
        backup = True
    from_regex, to_regex = sys.argv[2], sys.argv[3]
    files = wildcard_notation(sys.argv[4:])
    rename(from_regex, to_regex, files, backup)


def usage_file2interactive():
    print 'Usage: scitools file2interactive filename [human]'

doc_file2interactive = """
Execute a Python script and present output such that it seems that
each statement is executed in the interactive interpreter.

A funny feature is to add 'human' as a second command-line argument:
it then seems that the text in the interpreter is written by a
human, char by char. This can be used to fake typing in an interactive
shell ;-)

Troubleshooting:

Each multi-line command must be ended by a pure '\n' line. If there
is more whitespace, the interpreter waits for additional lines and
the command is corrupted. For example, when defining a class,
blank lines between the methods must have some whitespace to ensure
continuation, but the line below the class definition must be empty
so the command is ended.
"""

from code import InteractiveInterpreter
# see InteractiveConsole for example on using InteractiveInterpreter
import sys, random, time

def printline(prompt, line, human_typing=0):
    """
    Print a line with Python code in the interpreter.
    If human_typing is not 0, the line will be printed as if
    a human types it. human_typing=1: characters are written
    with a random delay, human_typing=2: characters are written
    when the user hits any character on the keyboard
    (not yet implemented).
    """
    # human_typing=2 can make use of a getch()-like function from
    # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/134892
    # or
    # http://www.freenetpages.co.uk/hp/alan.gauld/tutevent.htm

    if not human_typing:
        print prompt, line
    else:
        print prompt,
        # type one and one character with a random sleep in between
        max_delay = 0.6  # seconds
        for char in line:
            delay = random.uniform(0, max_delay)
            time.sleep(delay)
            sys.stdout.write(char)
            sys.stdout.flush()
        dummy = raw_input('')


class RunFileInInterpreter(InteractiveInterpreter):
    def __init__(self, locals=None):
        self._ip = InteractiveInterpreter(locals=locals)

    def run(self, source_code):
        buffer = []  # collect lines that belong together
        prompt = '>>>'
        for line in source_code.split('\n'):
            #line = line.rstrip()  # indicates wrong end of buffer list
            printline(prompt, line, human_typing)
            buffer.append(line)
            source = '\n'.join(buffer)
            try:
                need_more = self._ip.runsource(source)
            except (SyntaxError,OverflowError), e:
                print self._ip.showsyntaxerror()
                sys.exit(1)
            if need_more:
                #print 'need more..., source=\n', source
                prompt = '...'
                continue # proceed with new line
            else:
                #print 'successful execution of final source=\n',source
                prompt = '>>>'
                buffer = []

def file2interactive_test():
    # just provide some demo code for testing:
    _sc = """
a = 1
def f(x):
    x = x + 2
    return x

b = f(2)
dir()
print 'correct?', b == 4
    """
    return _sc

def main_file2interactive():
    try:
        filename = sys.argv[2]
    except:
        usage_file2interactive()
        print doc_file2interactive
        sys.exit(1)

    global human_typing
    human_typing = 0  # global variable
    try:
        if sys.argv[3] == 'human':
            human_typing = 1
    except:
        pass

    # define the complete source code file as _sc string:
    if filename == 'demo':
        _sc = file2interactive_test()
    else:
        _sc = open(filename, 'r').read()
    RunFileInInterpreter(locals()).run(_sc)


def usage_profiler():
    print "Usage: scitools profiler program [program options]"

def main_profiler():
    try:
        program = sys.argv[2]
    except:
        usage_profiler()
        sys.exit(1)
    resfile = '.tmp.profile'
    # add the directory of the script to sys.path in case the script
    # employs local modules from that directory:
    sys.path.insert(0, os.path.dirname(program))
    program_options = ' '.join(["%s" % arg for arg in sys.argv[3:]])
    # The cProfile or profile module will be used, depending on
    # the value of the environment variable PYPROFILE
    # (default is cProfile, the fastest of them)
    profiler_module = os.environ.get('PYPROFILE', 'cProfile')

    if profiler_module == 'profile':
        try:
            import profile
        except ImportError:
            raise ImportError('module profile was not found - must be installed')
    elif profiler_module == 'cProfile':
        try:
            import cProfile
        except ImportError:
            raise ImportError('module cProfile was not found - must be installed')
    cmd = 'python -m %(profiler_module)s -o %(resfile)s %(program)s %(program_options)s' % vars()
    print 'Running\n  ', cmd
    failure = os.system(cmd)
    if failure:
        print 'Could not run\n', cmd
        sys.exit(1)

    try:
        import pstats
    except ImportError:
        raise ImportError('module pstats was not found - must be installed')
    p = pstats.Stats(resfile)
    #p.sort_stats('cumulative')
    p.sort_stats('time')
    p.print_stats(30)
    os.remove('.tmp.profile')



def usage_ps2mpeg():
        print "Usage: scitools ps2mpeg [-nocrop] frame0000.ps frame0001.ps ..."\
              " [movie.mpeg] (series of ps files to be included in an MPEG "\
              " movie movie.mpeg)"

def main_ps2mpeg():
    if len(sys.argv) < 3:
        usage_ps2mpeg()
        sys.exit(1)

    # check that we have mpeg_encode or ppmtompeg:
    from scitools.misc import findprograms
    if not findprograms('mpeg_encode') and not findprograms('ppmtompeg'):
        print """
    ps2mpeg.py requires the mpeg_encode MPEG encoder program.
    Please install mpeg_encode, see URL:
    http://bmrc.berkeley.edu/frame/research/mpeg/mpeg_encode.html

    You may also use the ppmtompeg program included in the netpbm package
    which is available in most distros.
    """
        sys.exit(1)
    encoder = 'mpeg_encode'
    if not findprograms(encoder):
        encoder = 'ppmtompeg'

    # cropping takes time so we can omit that step:
    crop = 1
    if sys.argv[2] == "-nocrop":
        crop = 0
        del sys.argv[2]

    # did the user supply a filename for the MPEG file?
    if sys.argv[-1][-3:] != '.ps' and sys.argv[-1][-4:] != '.eps':
        mpeg_file = sys.argv[-1]
        del sys.argv[-1]
    else:
        mpeg_file = "movie.mpeg"

    found = findprograms(('gs', 'convert', encoder), write_message=True)
    if not found:
        sys.exit(1)

    basename = "tmp_";
    i = 0  # counter
    for psfile in sys.argv[2:]:
        ppmfile = "%s%04d.ppm" % (basename, i)
        gscmd = "gs -q -dBATCH -dNOPAUSE -sDEVICE=ppm "\
                " -sOutputFile=%(ppmfile)s %(psfile)s" % vars()
        print gscmd
        failure = os.system(gscmd)
        if failure:
            print '....gs failed, jumping to next file...'
            continue
        if crop:
            # crop the image:
            tmp_ppmfile = ppmfile + "~"
            os.rename(ppmfile, tmp_ppmfile)
            os.system("convert -crop 0x0 ppm:%s ppm:%s" % \
                      (tmp_ppmfile,ppmfile))
            # using pnmcrop:
            # direct std. error to /dev/null and std. output to file:
            #os.system("pnmcrop %s 2> /dev/null 1> %s" % \
            #          (tmp_ppmfile,ppmfile))
            os.remove(tmp_ppmfile)
        print "%s transformed via gs to %s (%d Kb)" % \
              (psfile,ppmfile,int(os.path.getsize(ppmfile)/1000))
        i = i + 1
    print 'ps2mpeg made the following ppm files:'
    for f in glob.glob('%s*.ppm' % basename):
        print f

    first_no = "%04d" % 0                  # first number in ppmfiles
    last_no  = "%04d" % (len(sys.argv)-3)  # last  number in ppmfiles
    mpeg_encode_file = "%s.mpeg_encode-input" % basename
    f = open(mpeg_encode_file, "w")
    f.write("""
#
# lines can generally be in any order
# only exception is the option 'INPUT' which must be followed by input
# files in the order in which they must appear, followed by 'END_INPUT'

PATTERN		        I
# more compact files result from the following pattern, but xanim does not
# work well (only a few of the frames are shown):
#PATTERN                 IBBPBBPBBPBBPBB
OUTPUT		        %(mpeg_file)s

# mpeg_encode really only accepts 3 different file formats, but using a
# conversion statement it can effectively handle ANY file format
#
# you must specify whether you will convert to PNM or PPM or YUV format

BASE_FILE_FORMAT	PPM

# the conversion statement
#
# Each occurrence of '*' will be replaced by the input file
#
# e.g., if you have a bunch of GIF files, then this might be:
#	INPUT_CONVERT	giftoppm *
#
# if you have a bunch of files like a.Y a.U a.V, etc., then:
#	INPUT_CONVERT	cat *.Y *.U *.V
#
# if you are grabbing from laser disc you might have something like
#	INPUT_CONVERT	goto frame *; grabppm
# 'INPUT_CONVERT *' means the files are already in the base file format
#
INPUT_CONVERT	*

# number of frames in a GOP.
#
# since each GOP must have at least one I-frame, the encoder will find the
# the first I-frame after GOP_SIZE frames to start the next GOP
#
# later, will add more flexible GOP signalling
#
GOP_SIZE	30
#GOP_SIZE	6

# number of slices in a frame
#
# 1 is a good number.  another possibility is the number of macroblock rows
# (which is the height divided by 16)
#
SLICES_PER_FRAME	1

# directory to get all input files from (makes this file easier to read)
INPUT_DIR	.

INPUT
# '*' is replaced by the numbers 01, 02, 03, 04
# if I instead do [01-11], it would be 01, 02, ..., 09, 10, 11
# if I instead do [1-11], it would be 1, 2, 3, ..., 9, 10, 11
# if I instead do [1-11+3], it would be 1, 4, 7, 10
# the program assumes none of your input files has a name ending in ']'
# if you do, too bad!!!
#
#

%(basename)s*.ppm    [%(first_no)s-%(last_no)s]

# can have more files here if you want...there is no limit on the number
# of files
END_INPUT

# all of the remaining options have to do with the motion search and qscale
# FULL or HALF -- must be upper case
PIXEL		HALF
# means +/- this many pixels
RANGE		10
# this must be one of {EXHAUSTIVE, SUBSAMPLE, LOGARITHMIC}
PSEARCH_ALG	LOGARITHMIC
# this must be one of {SIMPLE, CROSS2, EXHAUSTIVE}
#
# note that EXHAUSTIVE is really, really, really slow
#
BSEARCH_ALG	CROSS2
#
# these specify the q-scale for I, P, and B frames
# (values must be between 1 and 31)
#
IQSCALE		8
PQSCALE		10
BQSCALE		25

# this must be ORIGINAL or DECODED
REFERENCE_FRAME	ORIGINAL
""" % vars())
    f.close()
    failure = os.system(encoder + " " + mpeg_encode_file)
    if failure:
        print '\n\nps2mpeg.py: could not make MPEG movie'
    else:
        print "mpeg movie in output file", mpeg_file
        # remove the generated ppm files:
        for file in glob.glob("%s*.ppm" % basename):
            os.remove(file)



def usage_regression():
    print 'Usage: scitools regression verify|update|template rootdir|filename'

def main_regression():
    import scitools.Regression

    try:
      task = sys.argv[2]
    except IndexError:
      usage_regression()
      sys.exit(1)

    try:
      name = sys.argv[3]
    except IndexError:
      usage_regression()
      sys.exit(1)

    if task == 'verify' or task == 'update':
        v = scitools.Regression.Verify(root=name, task=task)
    elif task == 'template':
        scitools.Regression.verify_file_template(name)
    else:
        print "1st command-line argument must be verify, update, or template"


def usage_floatdiff():
    print "Usage: floatdiff.py file.vd file.rd"

def main_floatdiff():
    import Tkinter
    import scitools.Regression

    root = Tkinter.Tk()
    #Pmw.initialise(root, fontScheme='pmw1')
    root.title('intelligent float diff')

    if len(sys.argv) == 4:
        if not os.path.isfile(sys.argv[2]):
            print 'file "%s" does not exist' % sys.argv[2]
            return
        if not os.path.isfile(sys.argv[3]):
            print 'file "%s" does not exist' % sys.argv[3]
            return

        fd = scitools.Regression.FloatDiff(root, sys.argv[2], sys.argv[3])
        if fd.GUI:
            root.mainloop()
    else:
        usage_floatdiff()


def usage_pyreport():
    print """Usage: scitools pyreport [options] pythonfile"""

doc_pyreport = """
pyreport is a program that runs a Python script and captures its
output, compiling it to a pretty report in a pdf or an html file. It
can display the output embedded in the code that produced it and can
process special comments (literate comments) according to markup
languages (rst or LaTeX) to compile a very readable document.

Note: This is a modified version of Gael Varoquaux's pyreport that
enables the use of scitools.easyviz to do the plotting. The original
pyreport can be downloaded from http://gael-varoquaux.info/computers/pyreport/.
"""

def main_pyreport():
    if len(sys.argv) < 3:
        usage_pyreport()
        print doc_pyreport
        sys.exit(1)

    sys.argv = sys.argv[1:]
    from scitools.pyreport import pyreport
    pyreport.commandline_call()


if __name__ == '__main__':
    try:
        program = sys.argv[1]
    except IndexError:
        print '%s: missing first argument, must be help, --help, -h or one of\n%s\n\n' % \
              (sys.argv[0], str(legal_programs)[1:-1])
        sys.exit(1)

    if program == 'subst':
        main_subst()
    elif program == 'replace':
        main_replace()
    elif program == 'rename':
        main_rename()
    elif program == 'file2interactive':
        main_file2interactive()
    elif program == 'profiler':
        main_profiler()
    elif program == 'ps2mpeg':
        main_ps2mpeg()
    elif program == 'regression':
        main_regression()
    elif program == 'floatdiff':
        main_floatdiff()
    elif program == 'movie':
        main_movie()
    elif program == 'pyreport':
        main_pyreport()
    elif program == 'help' or program == '--help' or program == '-h':
        for p in legal_programs:
            exec('usage_%s()' % p)
        print '\n', __doc__
    else:
        print 'Cannot recognize command', program