degal/main.py
author Tero Marttila <terom@fixme.fi>
Sun, 14 Jun 2009 20:05:11 +0300
changeset 117 a2e4562deaab
parent 111 ecceaf23c969
child 118 60b126ff0b74
permissions -rw-r--r--
implement concurrency... :)
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Main entry point for the command-line interface
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     5
import gallery, commands, config as config_module
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from optparse import OptionParser
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
def option_parser (command_name) :
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    """
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        Build the OptionParser that we use
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    """
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    # create parser using the given command
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    parser = OptionParser(prog=command_name)
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    # define options
87
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    18
    parser.add_option('-G', "--gallery-path",   metavar='DIR',  dest='gallery_path',    default=None,
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    19
            help="Use DIR as the Gallery path [default: CWD]")
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    20
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    21
    parser.add_option('-F', "--force-update",   dest='force_update', action="store_true", default=False,
101
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    22
            help="--force-thumb + --force-html")
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    23
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    24
    parser.add_option("--force-thumb",          dest='force_thumb', action="store_true", default=False,
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    25
            help="Force-update all thumbnails")
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    26
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    27
    parser.add_option("--force-html",           dest='force_html', action="store_true", default=False,
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    28
            help="Force-update all .html files")
111
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    29
    
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    30
    parser.add_option("--with-exif",            dest='exif_enabled', action="store_true", default=None,
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    31
            help="Include Exif metadata in updated .html files")
101
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    32
117
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    33
    parser.add_option('-c', "--thread-count",   dest='thread_count', type="int", default=None,
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    34
            help="Size of thread pool")
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    35
101
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    36
    parser.add_option('-d', "--debug",          dest='debug', action="store_true", default=False,
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    37
            help="Show debug output")
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    38
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    39
    parser.add_option('-q', "--quiet",           dest='quiet', action="store_true", default=False,
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    40
            help="Reduced output")
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    return parser
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    44
def build_config (options) :
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    45
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    46
        Build a configuration object with the given options
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    47
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    48
    
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    49
    # build default config
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    50
    config = config_module.Configuration()
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    51
    
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    52
    # apply options
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    53
    if options.gallery_path :
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    54
        config.gallery_path = options.gallery_path
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    55
    
87
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    56
    if options.force_update :
101
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    57
        config.force_html = True
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    58
        config.force_thumb = True
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    59
    
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    60
    if options.force_thumb :
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    61
        config.force_thumb = True
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    62
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    63
    if options.force_html :
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    64
        config.force_html = True
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    65
111
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    66
    if options.exif_enabled is not None :
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    67
        config.exif_enabled = options.exif_enabled
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 109
diff changeset
    68
117
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    69
    if options.thread_count is not None :
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    70
        config.thread_count = options.thread_count
a2e4562deaab implement concurrency... :)
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    71
101
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    72
    if options.debug :
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    73
        config.log_level = config_module.logging.DEBUG
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    74
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    75
    if options.quiet :
698dc68a985d split --force-update into --force-thumb/--force-html options, implement for main
Tero Marttila <terom@fixme.fi>
parents: 92
diff changeset
    76
        config.log_level = config_module.logging.WARN
87
a7a18893730d implement up-to-date checking for commands.main, and add --force-update option
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    77
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    78
    # XXX: load config file(s)
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    79
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    80
    return config
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    81
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    82
def load_gallery (config) :
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    83
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    84
        Create the Gallery object that we are manipulating
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    85
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    86
    
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    87
    # read path from config
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    88
    return gallery.Gallery(config.gallery_path, config)
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    89
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    90
def load_command (config, args) :
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    91
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    92
        Figure out what command to run and with what args
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    93
    """
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    94
    
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    95
    # XXX: hardcoded
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    96
    return commands.main, args, {}
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    97
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    98
def run_command (config, gallery, command, args, kwargs) :
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    99
    """
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   100
        Run the given command
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   101
    """
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   102
    
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   103
    # setup the command execution context
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   104
    command_ctx = command.setup(config, gallery)
92
eb50b4f7812d move Command exception handling into command.py, and handle KeyboardInterrupt
Tero Marttila <terom@fixme.fi>
parents: 87
diff changeset
   105
  
eb50b4f7812d move Command exception handling into command.py, and handle KeyboardInterrupt
Tero Marttila <terom@fixme.fi>
parents: 87
diff changeset
   106
    # run with error handling
eb50b4f7812d move Command exception handling into command.py, and handle KeyboardInterrupt
Tero Marttila <terom@fixme.fi>
parents: 87
diff changeset
   107
    return command_ctx.run()
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   108
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
def main (argv) :
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    """
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        Main entry point
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    """
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   114
    ## load commands
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   115
    #commands = load_commands()
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   116
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    # build optparser
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    parser = option_parser(argv[0])
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    # parse the given argv
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   121
    options, args = parser.parse_args(argv[1:])
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   122
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   123
    # build our config
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   124
    config = build_config(options)
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   125
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   126
    # open gallery
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   127
    gallery = load_gallery(config)
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   128
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   129
    # figure out what command to run
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   130
    command, args, kwargs = load_command(config, args)
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   131
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    # run the selected command
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
   133
    ret = run_command(config, gallery, command, args, kwargs)
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   134
    
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   135
    if ret is None :
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   136
        # success
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   137
        return 0
48
20355dd2e61a new structure for bin/degal, adding degal/commands, degal/main
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
72
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   139
    else :
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   140
        # exit with error code
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   141
        assert isinstance(ret, int)
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   142
        return ret
168a2d065f17 use new command/gallery stuff in main.py
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   143