oratools: validator, move print output to script side, add quiet flag
[openraster:openraster-misc.git] / oratools / oratools / scripts.py
1 #!/usr/bin/env python
2
3 # This file is a part of Oratools
4 # Copyright 2010 Jon Nordby <jononor@gmail.com>
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Lesser General Public License as published by
8 # the Free Software Foundation, either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU Lesser General Public License for more details.
15 #
16 # You should have received a copy of the GNU Lesser General Public License
17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19 import optparse, os, os.path
20
21 import oratools
22 from oratools.document import OpenRasterDocument
23 from oratools.validator import OpenRasterValidator
24 from oratools.inspector import OpenRasterInspector
25 from oratools.standard import OpenRasterStandard
26
27 # TODO:
28 # Missing scripts
29 # - ora-diff: Show the difference between two OpenRaster files.
30
31 def ora_verify():
32     """Verify an OpenRaster file. Main function, meant to be called
33     from a wrapper script."""
34     parser = optparse.OptionParser(usage="usage: %prog [options] FILE")
35     parser.add_option("-s", "--stack", dest="layerstack_schema", metavar="SCHEMA.rng")
36     parser.add_option("-q", "--quiet", action="store_true")
37     options, args = parser.parse_args()
38
39     standard = None # Use default
40
41     if options.layerstack_schema:
42         schema_str = open(options.layerstack_schema).read()
43         standard = OpenRasterStandard()
44         standard.stack_schema_rng = schema_str
45
46     document = OpenRasterDocument(args[0])
47     validator = OpenRasterValidator(document, standard)
48     passed, results = validator.run()
49     retval = 0 if passed else -1
50
51     if not options.quiet:
52         for description, passed, error in results:
53             pass_string = "Pass" if passed else "Fail"
54             print "%s: %s %s" % (description, pass_string, error)
55
56     return retval
57
58 def ora_inspect():
59     """Show the contents of an OpenRaster file. Main function, meant to be called
60     from a wrapper script."""
61     parser = optparse.OptionParser(usage="usage: %prog [options] FILE")
62     parser.add_option("-m", "--mime", action="store_true", dest="inspect_mimetype")
63     parser.add_option("-f", "--files", action="store_true", dest="inspect_files")
64     parser.add_option("-s", "--stack", action="store_true", dest="inspect_stack")
65     parser.add_option("-p", "--print-headers", action="store_true", dest="print_headers")
66     options, args = parser.parse_args()
67
68     document = OpenRasterDocument(args[0])
69     ora_inspect = OpenRasterInspector(document, options.print_headers)
70
71     if not (options.inspect_mimetype or
72             options.inspect_files or
73             options.inspect_stack):
74         ora_inspect.print_all()
75         return
76
77     if options.inspect_mimetype:
78         ora_inspect.print_mimetype()
79     if options.inspect_files:
80         ora_inspect.print_files()
81     if options.inspect_stack:
82         ora_inspect.print_stack()
83
84
85 def ora_unpack():
86     """Unpack an OpenRaster archive."""
87     parser = optparse.OptionParser(usage="usage: %prog [options] FILE [DIR]")
88     options, args = parser.parse_args()
89
90     if len(args) == 1:
91         inpath = args[0]
92         outpath = os.path.splitext(os.path.basename(inpath))[0]
93         if os.path.exists(outpath):
94             print """Error: Implicit output directory %s already exists. 
95                     Specify the output explicitly.""" % outpath
96             return
97     elif len(args) == 2:
98         inpath, outpath = args
99     else:
100         parser.print_help()
101         return
102
103     ora = OpenRasterDocument(inpath)
104     ora.extract_to(outpath)
105
106 def ora_pack():
107     """Create an OpenRaster archive from files on-disk."""
108     parser = optparse.OptionParser(usage="usage: %prog [options] DIR [FILE]")
109     options, args = parser.parse_args()
110
111     if len(args) == 1:
112         inpath = args[0]
113         outpath = os.path.basename(inpath.rstrip(os.sep))  + ".ora"
114         if os.path.exists(outpath):
115             print """Error: Implicit output file %s already exists.
116                     Specify the output explicitly.""" % outpath
117             return
118     elif len(args) == 2:
119         inpath, outpath = args
120         filename, ext = os.path.splitext(outpath)
121         if not ext == ".ora":
122             print "Warning: Missing .ora extension, added automatically"
123             outpath += ".ora"
124     else:
125         parser.print_help()
126         return
127
128     if not os.path.isdir(inpath):
129         print "Error: Specified input %s is not a directory" % inpath
130         return
131     #TODO: option to take files as input instead of directory
132
133     document = oratools.document.create_from_directory(inpath, outpath)