12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import json
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import sys
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_FILE_PATH = os.path.dirname(os.path.realpath(__file__))
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_SYS_PATH = sys.path[:]
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try:
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  _COMMENT_EATER_PATH = os.path.join(
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      _FILE_PATH, os.pardir, 'json_comment_eater')
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sys.path.insert(0, _COMMENT_EATER_PATH)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  import json_comment_eater
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)finally:
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sys.path = _SYS_PATH
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)try:
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  from collections import OrderedDict
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Successfully imported, so we're running Python >= 2.7, and json.loads
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # supports object_pairs_hook.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def Parse(json_str):
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return json.loads(json_comment_eater.Nom(json_str),
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      object_pairs_hook=OrderedDict)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)except ImportError:
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Failed to import, so we're running Python < 2.7, and json.loads doesn't
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # support object_pairs_hook. simplejson however does, but it's slow.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(cduvall/kalman): Refuse to start the docs server in this case, but
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # let json-schema-compiler do its thing.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #logging.warning('Using simplejson to parse, this might be slow! Upgrade to '
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #                'Python 2.7.')
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  _SYS_PATH = sys.path[:]
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  try:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    _SIMPLE_JSON_PATH = os.path.join(_FILE_PATH,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     os.pardir,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     os.pardir,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     'third_party')
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sys.path.insert(0, _SIMPLE_JSON_PATH)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # Add this path in case this is being used in the docs server.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sys.path.insert(0, os.path.join(_FILE_PATH,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    os.pardir,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    os.pardir,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    'third_party',
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    'json_schema_compiler'))
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    import simplejson
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    from simplejson import OrderedDict
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  finally:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sys.path = _SYS_PATH
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def Parse(json_str):
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return simplejson.loads(json_comment_eater.Nom(json_str),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            object_pairs_hook=OrderedDict)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def IsDict(item):
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return isinstance(item, (dict, OrderedDict))
62