diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py index d603d4a45a..a589477b8e 100644 --- a/Lib/distutils/core.py +++ b/Lib/distutils/core.py @@ -120,6 +120,59 @@ def setup (**attrs): # the setup script, but be overridden by the command line. dist.parse_config_files() + def dump(): + def jsonify(obj): + if isinstance(obj, str): + return obj + if sys.version_info < (3, 0) and isinstance(obj, unicode): + return str(obj) + if isinstance(obj, bytes): + return obj.decode() + if isinstance(obj, dict): + return {jsonify(key): jsonify(val) for key, val in obj.items()} + try: + # convert to list if possible + return [jsonify(elem) for elem in obj] + except: + pass + # fallback to string repr. of obj + return str(obj) + + keys = ( + 'install_requires', + 'setup_requires', + 'extras_require', + 'tests_require', + 'python_requires' + ) + meta_keys = ( + 'name', + 'version' + ) + data = {} + for key in keys: + val = getattr(dist, key, None) + if not val: + continue + data[key] = jsonify(val) + for key in meta_keys: + val = getattr(dist.metadata, key, None) + if not val: + continue + data[key] = jsonify(val) + return data + if os.environ.get("dump_setup_attrs", None): + import json + try: + data = dump() + except: + import traceback + data = dict(traceback=traceback.format_exc()) + out = os.environ.get("out_file") + with open(out, 'w') as f: + json.dump(data, f, indent=2) + exit() + if DEBUG: print("options (after parsing config files):") dist.dump_option_dicts()