Skip to content

Instantly share code, notes, and snippets.

@mrcoles
Created November 14, 2012 21:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrcoles/4074837 to your computer and use it in GitHub Desktop.
Save mrcoles/4074837 to your computer and use it in GitHub Desktop.
A tool for pretty printing bson string (e.g., output of mongoexport)
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from bson import json_util, ObjectId
from bson.py3compat import string_types
from bson.dbref import DBRef
DEFAULT_INDENT = 4
def format(bson, indent=DEFAULT_INDENT):
d = _dbref_fix(json_util.loads(l))
return json_util.dumps(d, indent=indent)
def parse(infile, outfile, indent=DEFAULT_INDENT):
for l in infile:
print(format(l, indent=indent), file=outfile)
def _dbref_fix(obj):
"""
Recursive helper method that converts BSON ObjectId types so they can be
converted by bson.json_util.dumps into json.
Created to deal with a situation like this:
"collection" : { "$ref" : "collection", "$id" : { "$oid" : "505cdd127e89297d6f000421" } }
"""
if hasattr(obj, 'iteritems') or hasattr(obj, 'items'): # PY3 support
return {k: _dbref_fix(v) for k, v in obj.iteritems()}
elif hasattr(obj, '__iter__') and not isinstance(obj, string_types):
return [_dbref_fix(v) for v in obj]
elif isinstance(obj, DBRef):
id = obj.id
coll = obj.collection
db = obj.database
d = {}
if id: d['$id'] = {'$oid': str(id)}
if coll: d['$ref'] = coll
if db: d['$db'] = db
return d
else:
return obj
if __name__ == '__main__':
import sys
import argparse
parser = argparse.ArgumentParser(description='Pretty print bson dumps.')
parser.add_argument('-i', '--indent', type=int, default=DEFAULT_INDENT, help='Number of spaces to indent')
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
default=sys.stdin)
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
default=sys.stdout)
args = parser.parse_args()
parse(args.infile, args.outfile, args.indent)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment