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
|
#!/usr/bin/env python
# encoding: utf-8
"""
prov-compare -- Compare two PROV-JSON, PROV-XML, or RDF (PROV-O) files for equivalence
@author: Trung Dong Huynh
@copyright: 2016 University of Southampton, United Kingdom. All rights reserved.
@license: MIT Licence
@contact: trungdong@donggiang.com
@deffield updated: 2016-10-19
"""
from argparse import ArgumentParser, RawDescriptionHelpFormatter, FileType
import os
import sys
import logging
import traceback
from prov.model import ProvDocument
logger = logging.getLogger(__name__)
__all__ = []
__version__ = 0.1
__date__ = '2015-06-16'
__updated__ = '2016-10-19'
DEBUG = 0
TESTRUN = 0
PROFILE = 0
class CLIError(Exception):
"""Generic exception to raise and log different fatal errors."""
def __init__(self, msg):
super(CLIError).__init__(type(self))
self.msg = "E: %s" % msg
def __str__(self):
return self.msg
def main(argv=None): # IGNORE:C0111
"""Command line options."""
if argv is None:
argv = sys.argv
else:
sys.argv.extend(argv)
program_name = os.path.basename(sys.argv[0])
program_version = "v%s" % __version__
program_build_date = str(__updated__)
program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date)
program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
program_license = '''%s
Created by Trung Dong Huynh on %s.
Copyright 2016 University of Southampton. All rights reserved.
Licensed under the MIT License
https://github.com/trungdong/prov/blob/master/LICENSE
Distributed on an "AS IS" basis without warranties
or conditions of any kind, either express or implied.
USAGE
''' % (program_shortdesc, str(__date__))
try:
# Setup argument parser
parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter)
parser.add_argument('file1', nargs='?', type=FileType('r'))
parser.add_argument('file2', nargs='?', type=FileType('r'))
parser.add_argument('-f', '--format1', dest='format1', action='store', default='json',
help='File 1\'s format: json or xml')
parser.add_argument('-F', '--format2', dest='format2', action='store', default='json',
help='File 2\'s format: json or xml')
parser.add_argument('-V', '--version', action='version', version=program_version_message)
args = None
try:
# Process arguments
args = parser.parse_args()
doc1 = ProvDocument.deserialize(args.file1, format=args.format1.lower())
doc2 = ProvDocument.deserialize(args.file2, format=args.format2.lower())
return doc1 != doc2
finally:
if args:
if args.file1:
args.file1.close()
if args.file2:
args.file2.close()
except Exception as e:
if DEBUG or TESTRUN:
traceback.print_exc()
raise e
indent = len(program_name) * " "
sys.stderr.write(program_name + ": " + str(e) + "\n")
sys.stderr.write(indent + " for help use --help")
return 2
if __name__ == "__main__":
logging.basicConfig(level=(logging.DEBUG if DEBUG else logging.INFO))
if TESTRUN:
import doctest
doctest.testmod()
if PROFILE:
import cProfile
import pstats
profile_filename = 'prov_compare_profile.txt'
cProfile.run('main()', profile_filename)
statsfile = open("profile_stats.txt", "wb")
p = pstats.Stats(profile_filename, stream=statsfile)
stats = p.strip_dirs().sort_stats('cumulative')
stats.print_stats()
statsfile.close()
sys.exit(0)
sys.exit(main())
|