Пример #1
0
    def test_get_release(self):
        component = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[
                {
                    "version": "1.0.0",
                    "sha": "0000000000000000000000000000000000000000",
                    "series": "first",
                },
                {
                    "version": "1.1.0",
                    "sha": "0000000000000000000000000000000000000001",
                    "series": "first",
                },
            ],
        )
        release = component.get_release("1.1.0")
        self.assertIsInstance(release, c.Release)
        self.assertEqual("1.1.0", release.version)

        release_pred = component.get_release("1.1.0", predecessor=True)
        self.assertIsInstance(release_pred, c.Release)
        self.assertEqual("1.0.0", release_pred.version)
Пример #2
0
def component(releases_dir, components_dir, subparser, **kwargs):
    os.makedirs(components_dir, exist_ok=True)
    component_name = kwargs.pop("component_name")

    if subparser == "get":
        component = c_lib.Component.from_file(
            component_name, components_dir
        )
    elif subparser == "add":
        try:
            component = c_lib.Component.from_file(
                component_name, components_dir
            )
        except c_lib.ComponentError:
            component = c_lib.Component(
                name=component_name, directory=components_dir, **kwargs
            )
        else:
            raise c_lib.ComponentError(
                "Component '{name}' already exists.".format(
                    name=component_name,
                )
            )

        try:
            with TemporaryDirectory() as tmp_dir:
                git.Repo.clone_from(
                    c_lib.git_http_to_ssh(component.repo_url), tmp_dir
                )
        except FileNotFoundError as e:
            raise c_lib.ComponentError(
                "The repo_url provided is inaccessible, please check."
            )
    elif subparser == "update":
        component = c_lib.Component.from_file(
            component_name, components_dir
        )
        if kwargs["new_name"]:
            component.name = kwargs["new_name"]
        if kwargs["repo_url"]:
            component.repo_url = kwargs["repo_url"]
        if "is_product" in kwargs:
            component.is_product = kwargs["is_product"]
    else:
        raise c_lib.ComponentError(
            "The component subparser '{sp}' is not recognised.".format(
                sp=subparser,
            )
        )

    if component._is_changed:
        component.to_file()
        msg = "{change} component {name}".format(
            change=subparser.capitalize(),
            name=component.name,
        )

        c_lib.commit_changes(releases_dir, components_dir, msg)

    return component
Пример #3
0
    def test_dict(self):
        component = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[{
                "version": "1.0.0",
                "sha": "0000000000000000000000000000000000000000",
                "series": "first",
            }],
        )

        expected = {
            "is_product":
            False,
            "name":
            "test1",
            "releases": [
                {
                    "series":
                    "first",
                    "versions": [
                        {
                            "sha": "0000000000000000000000000000000000000000",
                            "version": "1.0.0",
                        },
                    ],
                },
            ],
            "repo_url":
            "https://github.com/rcbops/test1",
        }

        self.assertEqual(expected, component.to_dict())
Пример #4
0
 def test_create_without_releases(self):
     component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
     )
     self.assertEqual([], component.releases)
Пример #5
0
    def test_yaml(self):
        component = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[{
                "version": "1.0.0",
                "sha": "0000000000000000000000000000000000000000",
                "series": "first",
            }],
        )

        component_yaml = yaml.dump(component, default_flow_style=False)

        expected = ("artifact_stores: []\n"
                    "is_product: false\n"
                    "name: test1\n"
                    "releases:\n"
                    "- series: first\n"
                    "  versions:\n"
                    "  - sha: '0000000000000000000000000000000000000000'\n"
                    "    version: 1.0.0\n"
                    "repo_url: https://github.com/rcbops/test1\n")

        self.assertEqual(expected, component_yaml)
Пример #6
0
    def test_difference(self):
        component_pred = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[{
                "version": "1.0.0",
                "sha": "0000000000000000000000000000000000000000",
                "series": "first",
            }],
        )

        component_succ = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[{
                "version": "1.0.0",
                "sha": "0000000000000000000000000000000000000000",
                "series": "first",
            }, {
                "version": "1.1.0",
                "sha": "0000000000000000000000000000000000000001",
                "series": "first",
            }],
        )

        expected_diff_from_pred = {
            "releases": [{
                "versions": [
                    {
                        "version": "1.1.0",
                        "sha": "0000000000000000000000000000000000000001",
                    },
                ],
            }],
        }
        self.assertEqual(expected_diff_from_pred,
                         component_succ.difference(component_pred))

        expected_diff_from_succ = {}
        self.assertEqual(expected_diff_from_succ,
                         component_pred.difference(component_succ))
Пример #7
0
 def test_create_with_release(self):
     component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
         releases=[{
             "version": "1.0.0",
             "sha": "0000000000000000000000000000000000000000",
             "series": "first",
         }],
     )
     self.assertEqual(1, len(component.releases))
Пример #8
0
 def test_create_release(self):
     component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
     )
     version = "1.0.0"
     sha = "0000000000000000000000000000000000000000"
     series = "first"
     release = component.create_release(version=version,
                                        sha=sha,
                                        series=series)
     self.assertIsInstance(release, c.Release)
     self.assertEqual(release, component.get_release(release.version))
Пример #9
0
 def test_to_file(self, save_data, is_changed):
     component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
         releases=[{
             "version": "1.0.0",
             "sha": "0000000000000000000000000000000000000000",
             "series": "first",
         }],
         directory=".",
     )
     is_changed.return_value = False
     component.to_file()
     save_data.assert_not_called()
     is_changed.return_value = True
     component.to_file()
     self.assertEqual(1, save_data.call_count)
Пример #10
0
    def test_is_changed_when_new(self):
        component = c.Component(
            name="test1",
            repo_url="https://github.com/rcbops/test1",
            is_product=False,
            releases=[{
                "version": "1.0.0",
                "sha": "0000000000000000000000000000000000000000",
                "series": "first",
            }],
        )

        self.assertTrue(component._is_changed)
        component.create_release(
            version="1.1.0",
            sha="0000000000000000000000000000000000000001",
            series="first",
        )
        self.assertTrue(component._is_changed)
Пример #11
0
 def setUp(self):
     self.component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
     )
Пример #12
0
 def test_requirement_from_version_constraints(self):
     component = c.Component(
         name="test1",
         repo_url="https://github.com/rcbops/test1",
         is_product=False,
         releases=[
             {
                 "version": "0.0.1",
                 "sha": "0000000000000000000000000000000000000000",
                 "series": "first",
             },
             {
                 "version": "1.0.0",
                 "sha": "0000000000000000000000000000000000000001",
                 "series": "first",
             },
             {
                 "version": "1.0.1",
                 "sha": "0000000000000000000000000000000000000002",
                 "series": "first",
             },
             {
                 "version": "1.1.0",
                 "sha": "0000000000000000000000000000000000000003",
                 "series": "first",
             },
             {
                 "version": "1.1.1",
                 "sha": "0000000000000000000000000000000000000004",
                 "series": "first",
             },
             {
                 "version": "2.0.0-alpha.1",
                 "sha": "0000000000000000000000000000000000000005",
                 "series": "first",
             },
             {
                 "version": "2.0.0-beta.1",
                 "sha": "0000000000000000000000000000000000000006",
                 "series": "first",
             },
             {
                 "version": "2.0.0-beta.2",
                 "sha": "0000000000000000000000000000000000000007",
                 "series": "first",
             },
             {
                 "version": "2.0.0",
                 "sha": "0000000000000000000000000000000000000008",
                 "series": "first",
             },
             {
                 "version": "10.0.0",
                 "sha": "0000000000000000000000000000000000000009",
                 "series": "first",
             },
         ],
     )
     self.assertTrue(schemata.component_schema.validate(
         component.to_dict()))
     constraints_test_cases = (
         {
             "constraints": [],
             "expected_version": "10.0.0"
         },
         {
             "constraints": ["version<10.0.0"],
             "expected_version": "2.0.0"
         },
         {
             "constraints": ["version<2"],
             "expected_version": "1.1.1"
         },
         {
             "constraints": ["version<1.1"],
             "expected_version": "1.0.1"
         },
         {
             "constraints": ["version<=1.1"],
             "expected_version": "1.1.1"
         },
         {
             "constraints": ["version<2.0.0-beta.1"],
             "expected_version": "2.0.0-alpha.1"
         },
     )
     for test_case in constraints_test_cases:
         calculated_requirement = c.requirement_from_version_constraints(
             component, test_case["constraints"])
         self.assertEqual(test_case["expected_version"],
                          calculated_requirement["version"])
Пример #13
0
def component(releases_dir, components_dir, subparser, **kwargs):
    os.makedirs(components_dir, exist_ok=True)
    component_name = kwargs.pop("component_name")

    if subparser == "get":
        component = c_lib.Component.from_file(
            component_name, components_dir
        )
    elif subparser == "add":
        import_releases = kwargs.pop("import_releases", [])
        try:
            component = c_lib.Component.from_file(
                component_name, components_dir
            )
        except c_lib.ComponentError:
            pass
        else:
            raise c_lib.ComponentError(
                "Component '{name}' already exists.".format(
                    name=component_name,
                )
            )

        ssh_url = c_lib.git_http_to_ssh(kwargs["repo_url"])
        with TemporaryDirectory() as tmp_dir:
            try:
                repo = git.Repo.clone_from(ssh_url, tmp_dir)
            except FileNotFoundError as e:
                raise c_lib.ComponentError(
                    "The repo_url provided is inaccessible, please check."
                )
            else:
                repo.remotes.origin.fetch()
                releases = []
                for each in import_releases:
                    series, tag_regex = each.split(":", 1)
                    for tag in repo.tags:
                        if re.search(tag_regex, tag.name):
                            releases.append(
                                {
                                    "version": tag.name,
                                    "sha": str(tag.commit),
                                    "series": series,
                                }
                            )
        component = c_lib.Component(
            name=component_name, directory=components_dir,
            releases=releases, **kwargs
        )
    elif subparser == "update":
        component = c_lib.Component.from_file(
            component_name, components_dir
        )
        if kwargs["new_name"]:
            component.name = kwargs["new_name"]
        if kwargs["repo_url"]:
            component.repo_url = kwargs["repo_url"]
        if "is_product" in kwargs:
            component.is_product = kwargs["is_product"]
    else:
        raise c_lib.ComponentError(
            "The component subparser '{sp}' is not recognised.".format(
                sp=subparser,
            )
        )

    if component._is_changed:
        component.to_file()
        msg = "{change} component {name}".format(
            change=subparser.capitalize(),
            name=component.name,
        )

        c_lib.commit_changes(releases_dir, components_dir, msg)

    return component