Skip to content
Snippets Groups Projects
Commit 598f2a1c authored by Walter Lampl's avatar Walter Lampl
Browse files

Merge branch 'conf-tool-diffs' into 'master'

added diff functionality, removed conversion to pickle

See merge request atlas/athena!16750
parents c17b4b62 d3f7be6c
No related tags found
No related merge requests found
......@@ -11,48 +11,89 @@ import argparse
parser = argparse.ArgumentParser(description='Utility to transform/display athena configurations')
parser.add_argument('--print', dest="pr", action='store_true', help='Prints')
parser.add_argument('--diff', dest="diff", action='store_true', help='Diffs two files')
parser.add_argument('--toJSON', help='Convert to JSON file')
parser.add_argument('--toPKL', help='Convert to python pickle format file')
parser.add_argument('file', nargs=1, help='File to work with')
parser.add_argument('file', nargs='+', help='Files to work with')
args = parser.parse_args()
conf = None
if args.file[0].endswith( ".pkl" ):
input_file = file( args.file[0] )
def __loadSingleFile( fname ):
conf = []
while True:
try:
conf.append( pickle.load( input_file ) )
except EOFError:
break
print "Red", len(conf), "items"
if args.file[0].endswith( ".json" ):
def __keepPlainStrings(element):
if isinstance(element, unicode):
return str(element)
if isinstance(element, list):
return [ __keepPlainStrings(x) for x in element ]
if isinstance(element, dict):
return dict( [ (__keepPlainStrings(key), __keepPlainStrings(value)) for key,value in element.iteritems() ] )
return element
conf = json.load( file( args.file[0] ), object_hook=__keepPlainStrings )
if args.pr:
if fname.endswith( ".pkl" ):
input_file = file( fname )
conf = []
while True:
try:
conf.append( pickle.load( input_file ) )
except EOFError:
break
print "... Read", len(conf), "items from python pickle file: ", fname
if fname.endswith( ".json" ):
def __keepPlainStrings(element):
if isinstance(element, unicode):
return str(element)
if isinstance(element, list):
return [ __keepPlainStrings(x) for x in element ]
if isinstance(element, dict):
return dict( [ (__keepPlainStrings(key), __keepPlainStrings(value)) for key,value in element.iteritems() ] )
return element
conf = json.load( file( args.file[0] ), object_hook=__keepPlainStrings )
print "... Read", len(conf), "items from JSON file: ", fname
return conf
def __print( fname ):
conf = __loadSingleFile( fname )
print "... ", fname, "content"
for n,c in enumerate(conf):
print "Item", n, "*"*80
pprint.pprint(dict(c))
print "... EOF", fname
def __diff():
def __merge( c ):
confdict = {}
[ confdict.update( el ) for el in c ]
return confdict
confs = [ __merge( __loadSingleFile( f )) for f in args.file ]
allkeys = set( confs[0].keys() + confs[0].keys())
for comp in allkeys:
if comp not in confs[0]:
print "... component %-54s" % comp, "absent in 1st file"
elif comp not in confs[1]:
print "... component %-54s" % comp, "absent in 2nd file"
elif confs[0][comp] != confs[1][comp]:
print "... component %-54s" % comp, "present in both files but with different settings"
print "... in file: ", args.file[0]
pprint.pprint( confs[0][comp])
print "... in file: ", args.file[1]
pprint.pprint( confs[1][comp])
else:
print "... component %-54s" % comp, "identical"
if args.pr:
for fileName in args.file:
__print( fileName )
if args.toJSON:
if len( args.file ) != 1:
print "ERROR, can convert single file at a time, got: ", args.file
sys.exit( -1 )
conf = __loadSingleFile( args.file[0] )
oFile = open( args.toJSON, "w" )
json.dump( conf, oFile, indent=2, ensure_ascii=True )
oFile.close()
if args.toPKL:
oFile = open( args.toPKL, "w" )
pickle.dump( conf, oFile )
oFile.close()
if args.diff:
if len( args.file ) != 2:
print "ERROR, can only diff two files at a time, got: ", args.file
sys.exit( -1 )
__diff()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment