def test_two_flags(self):
     self.assertDictEqual(
         {
             "flag1": True,
             "flag2": True
         },
         parse_additional_arguments(["--flag1", "--flag2"]),
     )
 def test_parse_two_prefixes_and_value(self):
     self.assertDictEqual(
         {
             "myprefix1": "value1",
             "myprefix2": "value2"
         },
         parse_additional_arguments(
             ["--myprefix1", "value1", "--myprefix2", "value2"]),
     )
 def test_specified_multiple_nargs(self):
     self.assertDictEqual(
         {"t": [[1, 2], ["a", "b"]]},
         parse_additional_arguments(["-t", "1", "2", "-t", "a", "b"]),
     )
 def test_specified_multiple(self):
     self.assertDictEqual({"t": [1, 2]},
                          parse_additional_arguments(["-t", "1", "-t",
                                                      "2"]))
 def test_parse_multiple_mixed_values(self):
     self.assertDictEqual(
         {"my_mixed_bag": [4.7, True, "valueish", 0]},
         parse_additional_arguments(
             ["--my-mixed-bag", "4.7", "true", "valueish", "0"]),
     )
 def test_parse_three_values(self):
     self.assertDictEqual(
         {"myprefix": ["val1", "val2", "val3"]},
         parse_additional_arguments(["--myprefix", "val1", "val2", "val3"]),
     )
 def test_parse_prefix_and_value(self):
     self.assertDictEqual({"myprefix": "value"},
                          parse_additional_arguments(
                              ["--myprefix", "value"]))
 def test_one_flag(self):
     self.assertDictEqual({"sampleflag": True},
                          parse_additional_arguments(["--sampleflag"]))
Exemple #9
0
def do_run(args):
    jc = JanisConfiguration.initial_configuration(args.config)

    validation_reqs, batchrun_reqs = None, None

    if args.validation_fields:
        Logger.info("Will prepare validation")
        validation_reqs = ValidationRequirements(
            truthVCF=args.validation_truth_vcf,
            reference=args.validation_reference,
            fields=args.validation_fields,
            intervals=args.validation_intervals,
        )

    if args.batchrun:
        Logger.info("Will prepare batch run")
        batchrun_reqs = BatchRunRequirements(fields=args.batchrun_fields,
                                             groupby=args.batchrun_groupby)

    hints = {
        k[5:]: v
        for k, v in vars(args).items()
        if k.startswith("hint_") and v is not None
    }

    # the args.extra_inputs parameter are inputs that we MUST match
    # we'll need to parse them manually and then pass them to fromjanis as requiring a match
    required_inputs = parse_additional_arguments(args.extra_inputs)

    inputs = args.inputs or []
    # we'll manually suck "inputs" out of the extra parms, otherwise it's actually really
    # annoying if you forget to put the inputs before the workflow positional argument.
    # TBH, we could automatically do this for all params, but it's a little trickier

    if "inputs" in required_inputs:
        ins = required_inputs.pop("inputs")
        inputs.extend(ins if isinstance(ins, list) else [ins])
    if "i" in required_inputs:
        ins = required_inputs.pop("i")
        inputs.extend(ins if isinstance(ins, list) else [ins])

    keep_intermediate_files = args.keep_intermediate_files is True

    db_config = jc.cromwell.get_database_config_helper()

    if args.mysql:
        db_config.should_manage_mysql = True

    if args.no_database:
        db_config.skip_database = True

    if args.development:
        # no change for using mysql, as a database is the default
        keep_intermediate_files = True
        JanisConfiguration.manager().cromwell.call_caching_enabled = True

    wid = fromjanis(
        args.workflow,
        name=args.name,
        validation_reqs=validation_reqs,
        batchrun_reqs=batchrun_reqs,
        engine=args.engine,
        filescheme=args.filescheme,
        hints=hints,
        output_dir=args.output_dir,
        inputs=inputs,
        required_inputs=required_inputs,
        filescheme_ssh_binding=args.filescheme_ssh_binding,
        cromwell_url=args.cromwell_url,
        watch=args.progress,
        max_cores=args.max_cores,
        max_mem=args.max_memory,
        force=args.no_cache,
        recipes=args.recipe,
        keep_intermediate_files=keep_intermediate_files,
        run_in_background=(args.background is True),
        run_in_foreground=(args.foreground is True),
        dbconfig=db_config,
        only_toolbox=args.toolbox,
        no_store=args.no_store,
        allow_empty_container=args.allow_empty_container,
        check_files=not args.skip_file_check,
        container_override=parse_container_override_format(
            args.container_override),
    )

    Logger.info("Exiting")
    raise SystemExit
def prepare_from_args(
        args, run_prepare_processing: bool) -> Tuple[PreparedJob, Tool]:
    jc = JanisConfiguration.initial_configuration(path=args.config)

    # the args.extra_inputs parameter are inputs that we MUST match
    # we'll need to parse them manually and then pass them to fromjanis as requiring a match
    required_inputs = parse_additional_arguments(args.extra_inputs)

    inputs = args.inputs or []
    # we'll manually suck "inputs" out of the extra parms, otherwise it's actually really
    # annoying if you forget to put the inputs before the workflow positional argument.
    # TBH, we could automatically do this for all params, but it's a little trickier

    if "inputs" in required_inputs:
        ins = required_inputs.pop("inputs")
        inputs.extend(ins if isinstance(ins, list) else [ins])
    if "i" in required_inputs:
        ins = required_inputs.pop("i")
        inputs.extend(ins if isinstance(ins, list) else [ins])

    validation, batchrun = None, None
    if args.validation_fields:
        Logger.info("Will prepare validation")
        validation = ValidationRequirements(
            truthVCF=args.validation_truth_vcf,
            reference=args.validation_reference,
            fields=args.validation_fields,
            intervals=args.validation_intervals,
        )

    if args.batchrun:
        Logger.info("Will prepare batch run")
        batchrun = BatchRunRequirements(fields=args.batchrun_fields,
                                        groupby=args.batchrun_groupby)

    db_type: Optional[DatabaseTypeToUse] = None
    if args.no_database:
        db_type = DatabaseTypeToUse.none
    elif args.mysql:
        db_type = DatabaseTypeToUse.managed

    try:
        source_hints = args.source_hint
    except:
        source_hints = []

    wf, wf_reference = resolve_tool(
        tool=args.workflow,
        name=args.name,
        from_toolshed=True,
        only_toolbox=args.toolbox,
        force=args.no_cache,
    )

    job = prepare_job(
        run_prepare_processing=run_prepare_processing,
        tool=wf,
        workflow_reference=wf_reference,
        jc=jc,
        engine=args.engine,
        output_dir=args.output_dir,
        execution_dir=args.execution_dir,
        max_cores=args.max_cores,
        max_memory=args.max_memory,
        max_duration=args.max_duration,
        run_in_foreground=args.foreground is True,
        run_in_background=args.background is True,
        check_files=not args.skip_file_check,
        container_override=parse_container_override_format(
            args.container_override),
        skip_digest_lookup=args.skip_digest_lookup,
        skip_digest_cache=args.skip_digest_cache,
        hints={
            k[5:]: v
            for k, v in vars(args).items()
            if k.startswith("hint_") and v is not None
        },
        validation_reqs=validation,
        batchrun_reqs=batchrun,
        # inputs
        inputs=inputs,
        required_inputs=required_inputs,
        watch=args.progress,
        recipes=args.recipe,
        keep_intermediate_files=args.keep_intermediate_files is True,
        no_store=args.no_store,
        allow_empty_container=args.allow_empty_container,
        strict_inputs=args.strict_inputs,
        db_type=db_type,
        source_hints=source_hints,
        post_run_script=args.post_run_script,
        localise_all_files=args.localise_all_files,
    )

    return job, wf