Source code for schrodinger.utils.featureflags.write
"""
Utility functions to read and write features.json files. No
dependencies on schrodinger.
"""
import argparse
import json
import logging
import os
import sys
logger = logging.getLogger()
[docs]def write_features_json(json_data, filename):
    """
    Write the json data to the user state file in UTF-8 encoding.
    :type json_data: list[dict]
    :param json_data: List of features to write to the file.
    :type filename: str
    :param filename: File to write the features to.
    :raise IOError: if json data cannot be written to the file.
    """
    formatted_json = format_json(json_data)
    d = os.path.dirname(filename)
    os.makedirs(os.path.dirname(filename), exist_ok=True)
    with open(filename, "w", encoding="utf-8", newline="\n") as json_fp:
        json_fp.write(formatted_json)
        json_fp.write("\n") 
[docs]def read_json_data(json_data_file):
    """
    Read feature flags data from json document.
    :type json_data_file: str
    :param json_data_file: File name to decode feature flags json document.
    :returntype: dict
    :return: Dictionary of feature name and its corresponding json item.
    :raise ValueError: if json document cannot be parsed.
    """
    try:
        with open(json_data_file, encoding="utf-8", newline="\n") as json_fp:
            json_data = json_fp.read()
    except OSError:
        return {}
    if not json_data:
        return {}
    featureflags = json.loads(json_data)
    fflags = {}
    ignore_items = []
    for pos, item in enumerate(featureflags):
        if not all(key in item for key in ("Feature", "Enabled")):
            ignore_items.append((pos, item))
            continue
        fflags[item['Feature']] = item
    if ignore_items:
        logger.warning("WARNING: Ignoring bad feature flags format for the "
                       "following item(s) in '%s' - " % json_data_file)
        for (pos, item) in ignore_items:
            logger.warning("%-10sIndex %d - %s" % ('', pos, item))
        logger.warning('')
    return fflags 
[docs]def main():
    desc = "Read featureflags json file and print formatted version to stdout."
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument('input',
                        type=str,
                        metavar='featureflags.json',
                        help='input featureflags json file')
    parser.add_argument('--in-place',
                        action='store_true',
                        help='overwrite input file with formated json')
    opts = parser.parse_args()
    json_data = read_json_data(opts.input).values()
    if opts.in_place:
        write_features_json(json_data, opts.input)
    else:
        print(format_json(json_data), file=sys.stdout) 
if __name__ == '__main__':
    main()