示例#1
0
    def setUpClass(cls) -> None:
        """Setup case study from yaml doc."""

        with NamedTemporaryFile('w') as yaml_file:
            yaml_file.write(YAML_CASE_STUDY)
            yaml_file.seek(0)
            cls.case_study = CS.load_case_study_from_file(Path(yaml_file.name))
    def test_vara_cs_gen_sample_start_end_timestamp(self):
        """Check if vara-cs gen select_sample with start and end timestamps
        selects the right revisiosn."""
        runner = CliRunner()
        Path(vara_cfg()["paper_config"]["folder"].value + "/" +
             "test_gen").mkdir()
        vara_cfg()["paper_config"]["current_config"] = "test_gen"
        result = runner.invoke(
            driver_casestudy.main, [
                'gen', '-p', 'brotli', 'select_sample', '--num-rev', '6',
                '--start', '2021-08-17', '--end', '2021-09-09',
                'UniformSamplingMethod'
            ]
        )

        self.assertEqual(0, result.exit_code, result.exception)
        case_study_path = Path(
            vara_cfg()["paper_config"]["folder"].value +
            "/test_gen/brotli_0.case_study"
        )
        self.assertTrue(case_study_path.exists())

        case_study = load_case_study_from_file(case_study_path)
        self.assertEqual(len(case_study.revisions), 5)
        self.assertTrue(
            FullCommitHash('68f1b90ad0d204907beb58304d0bd06391001a4d') in
            case_study.revisions
        )
        self.assertTrue(
            FullCommitHash('62662f87cdd96deda90ac817de94e3c4af75226a') in
            case_study.revisions
        )
    def test_vara_cs_gen_sample_only_code(self):
        """Check if vara-cs gen select_sample with --only-code-commits only
        selects revisions that contain code."""
        runner = CliRunner()
        Path(vara_cfg()["paper_config"]["folder"].value + "/" +
             "test_gen").mkdir()
        vara_cfg()["paper_config"]["current_config"] = "test_gen"
        result = runner.invoke(
            driver_casestudy.main, [
                'gen', '-p', 'brotli', 'select_sample', '--num-rev', '10',
                '--start', '68f1b90ad0d204907beb58304d0bd06391001a4d', '--end',
                'f4153a09f87cbb9c826d8fc12c74642bb2d879ea',
                '--only-code-commits', 'UniformSamplingMethod'
            ]
        )

        self.assertEqual(0, result.exit_code, result.exception)
        case_study_path = Path(
            vara_cfg()["paper_config"]["folder"].value +
            "/test_gen/brotli_0.case_study"
        )
        self.assertTrue(case_study_path.exists())

        case_study = load_case_study_from_file(case_study_path)
        self.assertEqual(len(case_study.revisions), 5)
 def test_vara_cs_gen_to_extend_new_stage(self):
     """Test the extend-functionality of vara-cs gen."""
     runner = CliRunner()
     vara_cfg()["paper_config"]["current_config"] = "test_ext"
     save_config()
     load_paper_config()
     old_commit = 'ef364d3abc5647111c5424ea0d83a567e184a23b'
     new_commit = '6c6da57ae2aa962aabde6892442227063d87e88c'
     result = runner.invoke(
         driver_casestudy.main, [
             'gen', '-p', 'xz', '--new-stage', '--merge-stage', 'test',
             'select_specific', new_commit
         ]
     )
     self.assertEqual(0, result.exit_code, result.exception)
     case_study_path = Path(
         vara_cfg()["paper_config"]["folder"].value +
         "/test_ext/xz_0.case_study"
     )
     self.assertTrue(case_study_path.exists())
     case_study = load_case_study_from_file(case_study_path)
     self.assertTrue(
         case_study.revisions.__contains__(FullCommitHash(old_commit))
     )
     self.assertTrue(
         case_study.revisions.__contains__(FullCommitHash(new_commit))
     )
     self.assertEqual(2, case_study.num_stages)
     self.assertEqual('test', case_study.stages[1].name)
 def test_vara_cs_gen_specific(self):
     """Test for vara-cs gen select_specific."""
     runner = CliRunner()
     Path(vara_cfg()["paper_config"]["folder"].value + "/" +
          "test_gen").mkdir()
     vara_cfg()["paper_config"]["current_config"] = "test_gen"
     result = runner.invoke(
         driver_casestudy.main, [
             'gen', '-p', 'gravity', 'select_specific',
             '8820d0e08d1b389fc1e4ac2a17ad9f5418b21dfc',
             'f9e95a41c18ed995f2c7cee7498c1a2313427c08'
         ]
     )
     self.assertEqual(0, result.exit_code, result.exception)
     case_study_path = Path(
         vara_cfg()["paper_config"]["folder"].value +
         "/test_gen/gravity_0.case_study"
     )
     self.assertTrue(case_study_path.exists())
     case_study = load_case_study_from_file(case_study_path)
     self.assertTrue(
         case_study.revisions.__contains__(
             FullCommitHash('8820d0e08d1b389fc1e4ac2a17ad9f5418b21dfc')
         )
     )
     self.assertTrue(
         case_study.revisions.__contains__(
             FullCommitHash('f9e95a41c18ed995f2c7cee7498c1a2313427c08')
         )
     )
     self.assertEqual(len(case_study.revisions), 2)
    def test_vara_cs_gen_sample_start_before_initial_commit(self):
        """Check if vara-cs gen select_sample with start timestamp before the
        initial commit selects the right revisiosn."""
        runner = CliRunner()
        Path(vara_cfg()["paper_config"]["folder"].value + "/" +
             "test_gen").mkdir()
        vara_cfg()["paper_config"]["current_config"] = "test_gen"
        result = runner.invoke(
            driver_casestudy.main, [
                'gen', '-p', 'brotli', '--allow-blocked', 'select_sample',
                '--num-rev', '6', '--start', '1991-01-01', '--end',
                '2013-10-20', 'UniformSamplingMethod'
            ]
        )

        self.assertEqual(0, result.exit_code, result.exception)
        case_study_path = Path(
            vara_cfg()["paper_config"]["folder"].value +
            "/test_gen/brotli_0.case_study"
        )
        self.assertTrue(case_study_path.exists())

        case_study = load_case_study_from_file(case_study_path)
        self.assertEqual(len(case_study.revisions), 1)
        self.assertTrue(
            FullCommitHash('e0346c826249368f0f4a68a2b95f4ab5cf1e235b') in
            case_study.revisions
        )
示例#7
0
 def __init__(self, folder_path: Path) -> None:
     self.__path = Path(folder_path)
     self.__case_studies: tp.Dict[str, tp.List[CaseStudy]] = {}
     for case_study_path in \
             [x for x in self.__path.iterdir()
              if x.suffix == ".case_study"]:
         case_study = load_case_study_from_file(case_study_path)
         if case_study.project_name in self.__case_studies.keys():
             self.__case_studies[case_study.project_name].append(case_study)
         else:
             self.__case_studies[case_study.project_name] = [case_study]
     self.__artefacts: tp.Optional[Artefacts] = None
 def test_vara_cs_gen_latest(self):
     """Test for vara-cs gen select_latest."""
     runner = CliRunner()
     Path(vara_cfg()["paper_config"]["folder"].value + "/" +
          "test_gen").mkdir()
     vara_cfg()["paper_config"]["current_config"] = "test_gen"
     result = runner.invoke(
         driver_casestudy.main, ['gen', '-p', 'gravity', 'select_latest']
     )
     self.assertEqual(0, result.exit_code, result.exception)
     case_study_path = Path(
         vara_cfg()["paper_config"]["folder"].value +
         "/test_gen/gravity_0.case_study"
     )
     self.assertTrue(case_study_path.exists())
     case_study = load_case_study_from_file(case_study_path)
     self.assertEqual(len(case_study.revisions), 1)
    def setUp(cls) -> None:
        """Initialize projects and set up report paths, a case study, and a
        commit map."""

        initialize_projects()

        cls.br_paths_list = [
            TEST_INPUTS_DIR / Path(
                "results/xz/BRE-BR-xz-xz-2f0bc9cd40"
                "_9e238675-ee7c-4325-8e9f-8ccf6fd3f05c_success.yaml"
            ), TEST_INPUTS_DIR / Path(
                "results/xz/BRE-BR-xz-xz-c5c7ceb08a"
                "_77a6c5bc-e5c7-4532-8814-70dbcc6b5dda_success.yaml"
            ), TEST_INPUTS_DIR / Path(
                "results/xz/BRE-BR-xz-xz-ef364d3abc"
                "_feeeecb2-1826-49e5-a188-d4d883f06d00_success.yaml"
            ), TEST_INPUTS_DIR / Path(
                "results/TwoLibsOneProjectInteractionDiscreteLibsSingleProject/"
                "BRE-BR-TwoLibsOneProjectInteractionDiscreteLibsSingleProject-"
                "elementalist-5e8fe1616d_11ca651c-2d41-42bd-aa4e-8c37ba67b75f"
                "_success.yaml"
            ), TEST_INPUTS_DIR / Path(
                "results/TwoLibsOneProjectInteractionDiscreteLibsSingleProject/"
                "BRE-BR-TwoLibsOneProjectInteractionDiscreteLibsSingleProject-"
                "elementalist-e64923e69e_0b22c10c-4adb-4885-b3d2-416749b53aa8"
                "_success.yaml"
            )
        ]

        cls.case_study = load_case_study_from_file(
            TEST_INPUTS_DIR / Path(
                "paper_configs/test_blame_diff_metrics_database/"
                "TwoLibsOneProjectInteractionDiscreteLibsSingleProject_0."
                "case_study"
            )
        )

        cls.commit_map = get_commit_map(
            "TwoLibsOneProjectInteractionDiscreteLibsSingleProject"
        )
示例#10
0
def __casestudy_gen(ctx: click.Context, project: str, override: bool,
                    version: int, ignore_blocked: bool,
                    merge_stage: tp.Optional[str], new_stage: bool,
                    update: bool) -> None:
    """Generate or extend a CaseStudy Sub commands can be chained to for example
    sample revisions but also add the latest."""
    ctx.ensure_object(dict)
    ctx.obj['project'] = project
    ctx.obj['ignore_blocked'] = ignore_blocked
    ctx.obj['version'] = version
    paper_config = vara_cfg()["paper_config"]["current_config"].value
    if not paper_config:
        click.echo("You need to create a paper config first"
                   " using vara-pc create")
        raise click.Abort()
    ctx.obj['path'] = Path(vara_cfg()["paper_config"]["folder"].value) / (
        paper_config + f"/{project}_{version}.case_study")
    ctx.obj['git_path'] = get_local_project_git_path(project)
    if update:
        pull_current_branch(ctx.obj['git_path'])

    if override or not ctx.obj['path'].exists():
        case_study = CaseStudy(ctx.obj['project'], version)
        if merge_stage:
            case_study.insert_empty_stage(0)
            case_study.name_stage(0, merge_stage)
        ctx.obj["merge_stage"] = 0
    else:
        case_study = load_case_study_from_file(ctx.obj['path'])
        ctx.obj['custom_stage'] = bool(merge_stage)
        if merge_stage:
            if new_stage:
                stage_index = case_study.num_stages
                case_study.insert_empty_stage(stage_index)
                case_study.name_stage(stage_index, merge_stage)
            else:
                stage_index_opt = case_study \
                    .get_stage_index_by_name(merge_stage)
                if not stage_index_opt:
                    selected_stage = CSStage(merge_stage)

                    def set_merge_stage(stage: CSStage) -> None:
                        nonlocal selected_stage
                        selected_stage = stage

                    stage_choices = [selected_stage]
                    stage_choices.extend(
                        [stage for stage in case_study.stages if stage.name])
                    cli_list_choice(
                        f"The given stage({merge_stage}) does not exist,"
                        f" do you want to create it or select an existing one",
                        stage_choices, lambda x: x.name
                        if x.name else "", set_merge_stage)
                    if selected_stage.name == merge_stage:
                        stage_index = case_study.num_stages
                        case_study.insert_empty_stage(stage_index)
                        case_study.name_stage(stage_index, selected_stage.name)
                    else:
                        stage_index = case_study.stages.index(selected_stage)
                else:
                    stage_index = stage_index_opt
            ctx.obj['merge_stage'] = stage_index

        else:
            if new_stage:
                ctx.obj['merge_stage'] = max(case_study.num_stages, 0)
            else:
                ctx.obj['merge_stage'] = max(case_study.num_stages - 1, 0)
    ctx.obj['case_study'] = case_study