def main(args=None):
    """
    :param List[str] args: the arguments to use - when not running from the command line, for testing.
    :return:
    """
    if args is None:
        args = sys.argv[1:]  # drop the script name from the arguments

    config = cea.config.Configuration()

    # handle arguments
    if not len(args) or args[0].lower() == '--help':
        print_help()
        sys.exit(1)
    script_name = args.pop(0)
    if script_name == "write":
        for fqname, value in cea.config.parse_command_line_args(args).items():
            parameter = config.get_parameter(fqname)
            parameter.set(parameter.decode(
                parameter.replace_references(value)))
    elif script_name == "read":
        for fqname in args:
            parameter = config.get_parameter(fqname)
            print("- {fqname} = {parameter_value}".format(
                fqname=fqname, parameter_value=parameter.get()))
            print("  (default: {default})".format(default=parameter.default))
    else:
        cea_script = cea.scripts.by_name(script_name, plugins=config.plugins)
        config.restrict_to(cea_script.parameters)
        config.apply_command_line_args(args, cea_script.parameters)
        cea_script.print_script_configuration(config, verb='Configuring')

    # save the updates to the configuration file (re-running the same tool will result in the
    # same parameters being set)
    config.save(cea.config.CEA_CONFIG)
예제 #2
0
def main(args=None):
    """
    :param List[str] args: the arguments to use - when not running from the command line, for testing.
    :return:
    """
    if args is None:
        args = sys.argv[1:]  # drop the script name from the arguments

    config = cea.config.Configuration()

    # handle arguments
    if not len(args) or args[0].lower() == '--help':
        print_help()
        sys.exit(1)
    script_name = args.pop(0)
    if script_name == "write":
        for fqname, value in cea.config.parse_command_line_args(args).items():
            parameter = config.get_parameter(fqname)
            parameter.set(parameter.decode(
                parameter.replace_references(value)))
    elif script_name == "read":
        for fqname in args:
            parameter = config.get_parameter(fqname)
            print("- {fqname} = {parameter_value}".format(
                fqname=fqname, parameter_value=parameter.get()))
            print("  (default: {default})".format(default=parameter.default))
    elif script_name == "add-plugins":
        plugins_fqname = "general:plugins"
        parameter = config.get_parameter(plugins_fqname)
        plugins = cea.config.parse_string_to_list(
            parameter.encode(parameter.get()))

        new_plugins = [p for p in args
                       if p not in plugins]  # filter existing plugins
        valid_plugins = [
            p for p in new_plugins if instantiate_plugin(p) is not None
        ]

        if valid_plugins:
            print(f"Adding valid plugins {','.join(valid_plugins)}")
            plugins.extend(valid_plugins)
            parameter.set(plugins)
        else:
            print('No plugins to add')

    else:
        cea_script = cea.scripts.by_name(script_name, plugins=config.plugins)
        config.restrict_to(cea_script.parameters)
        config.apply_command_line_args(args, cea_script.parameters)
        cea_script.print_script_configuration(config, verb='Configuring')

    # save the updates to the configuration file (re-running the same tool will result in the
    # same parameters being set)
    config.save(cea.config.CEA_CONFIG)
예제 #3
0
 def get(self):
     config = cea.config.Configuration()
     name = os.path.basename(config.project)
     return {
         'name': name,
         'path': config.project,
         'scenario': config.scenario_name,
         'scenarios': config.get_parameter('general:scenario-name')._choices
     }
예제 #4
0
def get_parameters_from_plot_class(plot_class, scenario_name=None):
    config = cea.config.Configuration()
    parameters = []
    # Make sure to set scenario name to config first
    if 'scenario-name' in plot_class.expected_parameters and scenario_name is not None:
        config.scenario_name = scenario_name

    for pname, fqname in sorted(plot_class.expected_parameters.items(), key=lambda x: x[1]):
        parameter = config.get_parameter(fqname)
        parameters.append(deconstruct_parameters(parameter))
    return parameters
예제 #5
0
    def get(self, dashboard_index, plot_index):
        config = cea.config.Configuration()
        plot_cache = cea.plots.cache.PlotCache(config)
        dashboards = cea.plots.read_dashboards(config, plot_cache)

        dashboard = dashboards[dashboard_index]
        plot = dashboard.plots[plot_index]
        parameters = []
        for pname, fqname in plot.expected_parameters.items():
            parameter = config.get_parameter(fqname)
            if pname in plot.parameters:
                parameter.set(plot.parameters[pname])
            parameters.append(deconstruct_parameters(parameter))
        return parameters
예제 #6
0
def do_config_step(config, step):
    """update the :py:class:cea.config.Configuration object, returning the new value for the config"""
    base_config = step["config"]
    if base_config == "default":
        config = cea.config.Configuration(cea.config.DEFAULT_CONFIG)
    elif base_config == "user":
        config = cea.config.Configuration()
    elif base_config == ".":
        # keep the current config, we're just going to update some parameters
        config = config
    else:
        # load the config from a file
        config = cea.config.Configuration(base_config)

    for fqn in step.keys():
        if fqn == "config":
            continue
        parameter = config.get_parameter(fqname=fqn)
        value = step[fqn]
        set_parameter(config, parameter, value)
    return config
예제 #7
0
def get_parameters_from_plot(plot, scenario_name=None):
    config = cea.config.Configuration()
    parameters = []
    # Make sure to set scenario name to config first
    if 'scenario-name' in plot.expected_parameters:
        if scenario_name is not None:
            config.scenario_name = scenario_name
        elif 'scenario-name' in plot.parameters:
            config.scenario_name = plot.parameters['scenario-name']

    for pname, fqname in sorted(plot.expected_parameters.items(), key=lambda x: x[1]):
        parameter = config.get_parameter(fqname)
        if pname in plot.parameters and pname != 'scenario-name':
            try:
                parameter.set(plot.parameters[pname])
            # FIXME: Use a custom exception instead
            except AssertionError as e:
                if isinstance(parameter, cea.config.MultiChoiceParameter):
                    parameter.set([])
                print(e)
        parameters.append(deconstruct_parameters(parameter))
    return parameters
예제 #8
0
    def post(self, dashboard_index, plot_index):
        form = api.payload
        config = cea.config.Configuration()
        plot_cache = cea.plots.cache.PlotCache(config)
        dashboards = cea.plots.read_dashboards(config, plot_cache)

        dashboard = dashboards[dashboard_index]
        plot = dashboard.plots[plot_index]
        print('route_post_plot_parameters: expected_parameters: {}'.format(
            plot.expected_parameters.items()))
        for pname, fqname in plot.expected_parameters.items():
            parameter = config.get_parameter(fqname)
            print('route_post_plot_parameters: fqname={fqname}, pname={pname}'.
                  format(fqname=fqname, pname=pname))
            if isinstance(parameter, cea.config.MultiChoiceParameter):
                plot.parameters[pname] = parameter.decode(','.join(
                    form[pname]))
            else:
                plot.parameters[pname] = parameter.decode(form[pname])
        cea.plots.write_dashboards(config, dashboards)

        return plot.parameters
예제 #9
0
    def post(self):
        config = cea.config.Configuration()
        payload = api.payload

        if 'path' in payload:
            path = payload['path']
            if os.path.exists(path):
                config.project = path
                if 'scenario' not in payload:
                    config.scenario_name = ''
                    config.save()
                    return {'message': 'Project path changed'}
            else:
                abort(400, 'Path given does not exist')

        if 'scenario' in payload:
            scenario = payload['scenario']
            choices = config.get_parameter('general:scenario-name')._choices
            if scenario in choices:
                config.scenario_name = scenario
                config.save()
                return {'message': 'Scenario changed'}
            else:
                abort(400, 'Scenario does not exist', choices=choices)
예제 #10
0
def list_scenario_names_for_project(config):
    return config.get_parameter('general:scenario-name')._choices