From 9ae88294b10d71f3654fa6d3498b167c2b826d77 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Dec 08 2017 16:13:28 +0000 Subject: [cli][frontend][python][rpmbuild] unify mock config generator From now on, `copr-cli mock-config` and `copr-rpmbuild` use the same mock configuration file (both use the same methods for generating the mock configuration). This is done with believe that mock configuration should be "cache"-able thing -- so that it can be generated on client side once per copr project, and then re-used to build sets of packages without re-generating/changing the config file all over again. There's one hack with 'enable_net' which breaks this concept, though. --- diff --git a/cli/copr_cli/build_config.py b/cli/copr_cli/build_config.py deleted file mode 100644 index aebc151..0000000 --- a/cli/copr_cli/build_config.py +++ /dev/null @@ -1,48 +0,0 @@ -# coding: utf-8 - -from jinja2 import Environment - -template_string = """\ -# This is development/testing only mock profile, not exactly the same as -# is used on copr builders; but it is basically similar. If you need an -# exact mock configuration (because you e.g. try to reproduce failed -# build), such configuration is put alongside the built RPMs. - -include('/etc/mock/{{chroot}}.cfg') - -config_opts['root'] = '{{project_id}}_{{chroot}}' -config_opts['chroot_additional_packages'] = ' -{%- for pkg in additional_packages -%} -{%- if loop.last -%} -{{ pkg }} -{%- else -%} -{{ pkg }} {% endif -%} -{%- endfor -%}' - -{% if repos %} -config_opts['yum.conf'] += \"\"\" -{% for repo in repos %} -[{{ repo.id }}] -name="{{ repo.name }}" -baseurl={{ repo.url }} -gpgcheck=0 -enabled=1 -skip_if_unavailable=1 -metadata_expire=0 -cost=1 -best=1 -{% endfor %} -\"\"\" -{% endif %} -""" - -class MockProfile(object): - def __init__(self, data): - self.data = data - - def __str__(self): - template = Environment().from_string(template_string) - return template.render(self.data) - - - diff --git a/cli/copr_cli/main.py b/cli/copr_cli/main.py index e02fb10..9b5bf39 100644 --- a/cli/copr_cli/main.py +++ b/cli/copr_cli/main.py @@ -31,9 +31,9 @@ log.addHandler(NullHandler()) from copr import CoprClient from copr.client.responses import CoprResponse import copr.exceptions as copr_exceptions +from copr.util import BuildConfig from .util import ProgressBar -from .build_config import MockProfile import pkg_resources @@ -380,7 +380,7 @@ class Commands(object): sys.stderr.write(result.error + "\n") sys.stderr.write("Un-expected data returned, please report this issue\n") - print(MockProfile(result.build_config)) + print(BuildConfig(result.build_config).to_mock_config()) @check_username_presence diff --git a/frontend/coprs_frontend/coprs/helpers.py b/frontend/coprs_frontend/coprs/helpers.py index 163be68..3eaf2b4 100644 --- a/frontend/coprs_frontend/coprs/helpers.py +++ b/frontend/coprs_frontend/coprs/helpers.py @@ -611,5 +611,6 @@ def generate_build_config(copr, chroot_id): 'additional_packages': packages.split(), 'repos': repos, 'chroot': chroot_id, - 'use_bootstrap_container': copr.use_bootstrap_container + 'use_bootstrap_container': copr.use_bootstrap_container, + 'enable_net': copr.build_enable_net, } diff --git a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py index 9267045..c2c8c75 100644 --- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py +++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py @@ -138,23 +138,15 @@ def get_build_record(task): "project_owner": task.build.copr.owner_name, "project_name": task.build.copr.name, "submitter": task.build.user.name if task.build.user else None, # there is no user for webhook builds - "chroot": task.mock_chroot.name, - "repos": task.build.repos, "memory_reqs": task.build.memory_reqs, "timeout": task.build.timeout, "enable_net": task.build.enable_net, - "git_repo": task.build.package.dist_git_repo, - "git_hash": task.git_hash, "source_type": helpers.BuildSourceEnum("scm"), "source_json": json.dumps( {'clone_url': task.build.package.dist_git_clone_url, 'committish': task.git_hash}), - "package_name": task.build.package.name, - "package_version": task.build.pkg_version, - "repos": build_config.get("repos"), - "buildroot_pkgs": build_config.get("additional_packages"), - "use_bootstrap_container": build_config.get("use_bootstrap_container") + "build_config": build_config, } except Exception as err: diff --git a/python/copr/util.py b/python/copr/util.py index f627f73..e80109f 100644 --- a/python/copr/util.py +++ b/python/copr/util.py @@ -1,5 +1,7 @@ # coding: utf-8 import sys +import copy +import jinja2 # pylint: disable=R0903 @@ -14,3 +16,109 @@ class UnicodeMixin(object): else: # Python 2 def __str__(self): return self.__unicode__().encode('utf8') + + +mock_config_template = """\ +include('/etc/mock/{{ chroot }}.cfg') + +config_opts['root'] = '{{ root_id }}' +{% if buildroot_pkgs %} +config_opts['chroot_additional_packages'] = '{{ buildroot_pkgs| join(" ") }}' +{% endif -%} +{% if enable_net %} +config_opts['rpmbuild_networking'] = True +config_opts['use_host_resolv'] = True +{% else %} +config_opts['rpmbuild_networking'] = False +config_opts['use_host_resolv'] = False +{% endif %} +config_opts['use_bootstrap_container'] = {{ 'True' if use_bootstrap_container else 'False' }} +{% if use_bootstrap_container %} +config_opts['bootstrap_chroot_additional_packages'] = [] +config_opts['bootstrap_module_enable'] = [] +config_opts['bootstrap_module_install'] = [] +{%- endif %} +{%- if repos -%} +config_opts['{{ pkg_manager_conf }}.conf'] += \"\"\" +{% for repo in repos %} +[{{ repo["id"] }}] +name={{ repo["name"] }} +baseurl={{ repo["url"] }} +gpgcheck=0 +enabled=1 +skip_if_unavailable=1 +metadata_expire=0 +cost=1 +best=1 +{% endfor %} +\"\"\" +{%- endif -%} +""" + +class BuildConfig(object): + """ + build config abstraction + + TODO: we should have some "private" library namespace (copr-common.rpm), + which would be targeted for "internal" use-cases (backend, frontend, + dist-git, builder, ...), not for end-user scripts. + """ + + data = {} + + + def __init__(self, data=None): + self.set_item("enable_net", False) + self.set_item("buildroot_pkgs", []) + self.set_item("chroot", 'fedora-rawhide-x86_64') + self.set_item("repos", []) + + self.set_item("use_bootstrap_container", False) + + if data: + self.from_dict(data) + + + def set_item(self, key, value): + self.data[key] = copy.deepcopy(value) + + + def from_dict(self, data): + if 'additional_packages' in data: + # historically 'build-config' api url defined 'additional_packages' + # field, and 'copr-rpmbuild' renamed that to 'buildroot_pkgs'. + # Let's support both for some time. + data['buildroot_pkgs'] = data['additional_packages'] + + for key in data: + self.set_item(key, data[key]) + + + def to_dict(self): + output = copy.deepcopy(self.data) + output['root_id'] = self.root_id() + output['pkg_manager_conf'] = "dnf" if "custom-1" in output["chroot"] else "yum" + return output + + + def root_id(self): + if 'task_id' in self.data: + # set by /backend/get-build-task// + return str(self.data['task_id']) + + if 'project_id' in self.data: + # set by /api/coprs//build-config// + return "{0}_{1}".format(self.data['project_id'], self.data['chroot']) + + if 'project_name' in self.data and 'project_owner' in self.data: + return "{0}_{1}".format( + self.data['project_name'], + self.data['project_owner'] + ) + + return "unset" + + + def to_mock_config(self): + template = jinja2.Environment().from_string(mock_config_template) + return template.render(self.to_dict()) diff --git a/rpmbuild/__init__.py b/rpmbuild/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/rpmbuild/__init__.py +++ /dev/null diff --git a/rpmbuild/copr-rpmbuild b/rpmbuild/copr-rpmbuild new file mode 100755 index 0000000..232a6a4 --- /dev/null +++ b/rpmbuild/copr-rpmbuild @@ -0,0 +1,22 @@ +#! /bin/sh + +# Run copr-rpmbuild script directly from git. +# Copyright (C) 2017 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +absdir="$(dirname "$(readlink -f "$0")")" +export PYTHONPATH="$absdir:$absdir/../python${PYTHONPATH+:$PYTHONPATH}" +exec python3 -m main "$@" diff --git a/rpmbuild/copr-rpmbuild.spec b/rpmbuild/copr-rpmbuild.spec index 38829d5..b582ed4 100644 --- a/rpmbuild/copr-rpmbuild.spec +++ b/rpmbuild/copr-rpmbuild.spec @@ -23,6 +23,7 @@ Requires: python3-jinja2 Requires: python3-munch Requires: python3-configparser Requires: python3-simplejson +Requires: python3-copr Requires: mock Requires: git @@ -53,7 +54,6 @@ install -d %{buildroot}%{_sharedstatedir}/copr-rpmbuild/results install -d %{buildroot}%{_bindir} install -m 755 main.py %{buildroot}%{_bindir}/copr-rpmbuild install -m 644 main.ini %{buildroot}%{_sysconfdir}/copr-rpmbuild/main.ini -install -m 644 mock.cfg.j2 %{buildroot}%{_sysconfdir}/copr-rpmbuild/mock.cfg.j2 install -m 644 rpkg.conf.j2 %{buildroot}%{_sysconfdir}/copr-rpmbuild/rpkg.conf.j2 install -m 644 make_srpm_mock.cfg %{buildroot}%{_sysconfdir}/copr-rpmbuild/make_srpm_mock.cfg @@ -75,7 +75,6 @@ install -p -m 644 man/copr-rpmbuild.1 %{buildroot}/%{_mandir}/man1/ %dir %{_sysconfdir}/copr-rpmbuild %config(noreplace) %{_sysconfdir}/copr-rpmbuild/main.ini -%config(noreplace) %{_sysconfdir}/copr-rpmbuild/mock.cfg.j2 %config(noreplace) %{_sysconfdir}/copr-rpmbuild/rpkg.conf.j2 %config(noreplace) %{_sysconfdir}/copr-rpmbuild/make_srpm_mock.cfg diff --git a/rpmbuild/copr_rpmbuild/builders/mock.py b/rpmbuild/copr_rpmbuild/builders/mock.py index 702419d..ce25030 100644 --- a/rpmbuild/copr_rpmbuild/builders/mock.py +++ b/rpmbuild/copr_rpmbuild/builders/mock.py @@ -6,6 +6,7 @@ import subprocess from jinja2 import Environment, FileSystemLoader from ..helpers import run_cmd, locate_spec, locate_srpm, CONF_DIRS, get_mock_uniqueext +from copr.util import BuildConfig log = logging.getLogger("__main__") @@ -13,12 +14,16 @@ log = logging.getLogger("__main__") class MockBuilder(object): def __init__(self, task, sourcedir, resultdir, config): self.task_id = task["task_id"] - self.chroot = task["chroot"] - self.buildroot_pkgs = task["buildroot_pkgs"] - self.enable_net = task["enable_net"] - self.repos = task["repos"] - self.use_bootstrap_container = task["use_bootstrap_container"] - self.pkg_manager_conf = "dnf" if "custom-1" in task["chroot"] else "yum" + self.build_config = task["build_config"] + + if 'enable_net' in task: + # Hack! We should use dedicated options only: + # https://bugzilla.redhat.com/show_bug.cgi?id=1513953 + # ... naturally we shouldn't touch/edit project's + # mock-configuration per-build; that's configuration on + # per-project level; can be generated by `copr mock-config`. + self.build_config['enable_net'] = task['enable_net'] + self.timeout = task["timeout"] self.sourcedir = sourcedir self.resultdir = resultdir @@ -29,8 +34,12 @@ class MockBuilder(object): def run(self): configdir = os.path.join(self.resultdir, "configs") os.makedirs(configdir) + + # Unused actually ATM. It is copied to result dir only for user's + # convenience to have complete mock configuration during debugging. shutil.copy2("/etc/mock/site-defaults.cfg", configdir) shutil.copy2("/etc/mock/{0}.cfg".format(self.chroot), configdir) + cfg = self.render_config_template() with open(os.path.join(configdir, "child.cfg"), "w") as child: child.write(cfg) @@ -45,11 +54,10 @@ class MockBuilder(object): self.produce_rpm(srpm, configdir, self.resultdir) def render_config_template(self): - jinja_env = Environment(loader=FileSystemLoader(CONF_DIRS)) - template = jinja_env.get_template("mock.cfg.j2") - return template.render(chroot=self.chroot, task_id=self.task_id, buildroot_pkgs=self.buildroot_pkgs, - enable_net=self.enable_net, use_bootstrap_container=self.use_bootstrap_container, - repos=self.repos, pkg_manager_conf=self.pkg_manager_conf) + bc = BuildConfig(self.build_config) + # praiskup: is this needed? + bc.set_item('task_id', self.task_id) + return bc.to_mock_config() def preexec_fn_build_stream(self): if not self.logfile: diff --git a/rpmbuild/main.py b/rpmbuild/main.py old mode 100755 new mode 100644 diff --git a/rpmbuild/mock.cfg.j2 b/rpmbuild/mock.cfg.j2 deleted file mode 100644 index 8c7f8c5..0000000 --- a/rpmbuild/mock.cfg.j2 +++ /dev/null @@ -1,39 +0,0 @@ -include('/etc/mock/{{ chroot }}.cfg') - -config_opts['root'] = '{{ task_id }}' - -{% if buildroot_pkgs %} -config_opts['chroot_additional_packages'] = '{{ buildroot_pkgs| join(" ") }}' -{% endif %} - -{% if enable_net %} -config_opts['rpmbuild_networking'] = True -config_opts['use_host_resolv'] = True -{% else %} -config_opts['rpmbuild_networking'] = False -config_opts['use_host_resolv'] = False -{% endif %} - -config_opts['use_bootstrap_container'] = {{ 'True' if use_bootstrap_container else 'False' }} - -{% if use_bootstrap_container %} -config_opts['bootstrap_chroot_additional_packages'] = [] -config_opts['bootstrap_module_enable'] = [] -config_opts['bootstrap_module_install'] = [] -{% endif %} - -{% if repos %} -config_opts['{{ pkg_manager_conf }}.conf'] += """ -{% for repo in repos %} -[{{ repo["id"] }}] -name='{{ repo["name"] }}' -baseurl={{ repo["url"] }} -gpgcheck=0 -enabled=1 -skip_if_unavailable=1 -metadata_expire=0 -cost=1 -best=1 -{% endfor %} -""" -{% endif %} diff --git a/rpmbuild/run_tests.sh b/rpmbuild/run_tests.sh index e36c713..d9ef6d9 100755 --- a/rpmbuild/run_tests.sh +++ b/rpmbuild/run_tests.sh @@ -1,2 +1,5 @@ -#!/bin/sh -python3 -m pytest tests -s $@ +#!/bin/sh -x + +absdir="$(dirname "$(readlink -f "$0")")" +export PYTHONPATH="$absdir:$absdir/../python${PYTHONPATH+:$PYTHONPATH}" +exec python3 -m pytest tests -s "$@" diff --git a/rpmbuild/tests/test_mock.py b/rpmbuild/tests/test_mock.py index 005e46a..82a67f2 100644 --- a/rpmbuild/tests/test_mock.py +++ b/rpmbuild/tests/test_mock.py @@ -3,12 +3,20 @@ import unittest import mock import configparser from os.path import realpath, dirname -from ..copr_rpmbuild.builders.mock import MockBuilder +from copr_rpmbuild.builders.mock import MockBuilder import subprocess import datetime +import copy +from io import StringIO from unittest.mock import MagicMock +the_repo = { + 'id': 'copr_base', + 'name': 'Copr repository', + 'url': 'http://example.com/' +} + class TestMockBuilder(unittest.TestCase): def setUp(self): self.task = { @@ -16,8 +24,6 @@ class TestMockBuilder(unittest.TestCase): "_expected_outcome": "success", "build_id": 10, - "buildroot_pkgs": ["pkg1", "pkg2", "pkg3"], - "chroot": "fedora-24-x86_64", "enable_net": True, "source_json": { "clone_url": "https://src.fedoraproject.org/git/rpms/389-admin-console.git", @@ -30,11 +36,20 @@ class TestMockBuilder(unittest.TestCase): "pkgs": "", "project_name": "copr-dev", "project_owner": "@copr", - "repos": [], "submitter": "clime", "task_id": "10-fedora-24-x86_64", "timeout": 21600, - "use_bootstrap_container": False, + + "build_config": { + "additional_packages": ['pkg1', 'pkg2', 'pkg3'], + "chroot": "fedora-24-x86_64", + "enable_net": False, + "project_id": "praiskup-ping", + "repos": [the_repo], + "use_bootstrap_container": False, + } + + } self.sourcedir = "/path/to/sourcedir" self.resultdir = "/path/to/resultdir" @@ -45,34 +60,51 @@ class TestMockBuilder(unittest.TestCase): def test_init(self): builder = MockBuilder(self.task, self.sourcedir, self.resultdir, self.config) self.assertEqual(builder.task_id, "10-fedora-24-x86_64") - self.assertEqual(builder.chroot, "fedora-24-x86_64") - self.assertEqual(builder.buildroot_pkgs, ["pkg1", "pkg2", "pkg3"]) - self.assertEqual(builder.enable_net, True) - self.assertEqual(builder.repos, []) - self.assertEqual(builder.use_bootstrap_container, False) + self.assertEqual(builder.build_config['chroot'], "fedora-24-x86_64") + self.assertEqual(builder.build_config['additional_packages'], ["pkg1", "pkg2", "pkg3"]) + self.assertEqual(builder.build_config['enable_net'], True) + self.assertEqual(builder.build_config['repos'], [the_repo]) + self.assertEqual(builder.build_config['use_bootstrap_container'], False) - def test_render_config_template(self): - confdirs = [dirname(dirname(realpath(__file__)))] - builder = MockBuilder(self.task, self.sourcedir, self.resultdir, self.config) - cfg = builder.render_config_template() + def parse_mock_conf(self, cfg): # Parse the rendered config # This is how mock itself does it def include(*args, **kwargs): pass - config_opts = {"yum.conf": []} + + config_opts = { + 'yum.conf': '', + 'dnf.conf': '', + } cfg = re.sub(r'include\((.*)\)', r'include(\g<1>, config_opts, True)', cfg) code = compile(cfg, "/tmp/foobar", 'exec') exec(code) + return config_opts + + + def assert_repo_content(self, config): + buf = StringIO(config) + config = configparser.ConfigParser() + config.readfp(buf) + self.assertEqual(config.get(the_repo['id'], 'baseurl'), the_repo['url']) + self.assertEqual(config.get(the_repo['id'], 'name'), the_repo['name']) + + def test_render_config_template(self): + confdirs = [dirname(dirname(realpath(__file__)))] + builder = MockBuilder(self.task, self.sourcedir, self.resultdir, self.config) + cfg = builder.render_config_template() + config_opts = self.parse_mock_conf(cfg) self.assertEqual(config_opts["root"], "10-fedora-24-x86_64") self.assertEqual(config_opts["chroot_additional_packages"], "pkg1 pkg2 pkg3") self.assertEqual(config_opts["rpmbuild_networking"], True) self.assertEqual(config_opts["use_bootstrap_container"], False) - self.assertEqual(config_opts["yum.conf"], []) + self.assert_repo_content(config_opts['yum.conf']) + - @mock.patch("rpmbuild.copr_rpmbuild.builders.mock.get_mock_uniqueext") - @mock.patch("rpmbuild.copr_rpmbuild.builders.mock.subprocess.Popen") + @mock.patch("copr_rpmbuild.builders.mock.get_mock_uniqueext") + @mock.patch("copr_rpmbuild.builders.mock.subprocess.Popen") def test_produce_rpm(self, popen_mock, get_mock_uniqueext_mock): builder = MockBuilder(self.task, self.sourcedir, self.resultdir, self.config) get_mock_uniqueext_mock.return_value = '2' @@ -95,6 +127,12 @@ class TestMockBuilder(unittest.TestCase): def test_custom1_chroot_settings(self): b1 = MockBuilder(self.task, self.sourcedir, self.resultdir, self.config) - b2 = MockBuilder(dict(self.task, **{"chroot": "custom-1-x86_64"}), self.sourcedir, self.resultdir, self.config) - self.assertEqual(b1.pkg_manager_conf, "yum") - self.assertEqual(b2.pkg_manager_conf, "dnf") + task2 = copy.deepcopy(dict(self.task)) + task2['build_config']['chroot'] = 'custom-1-x86_64' + b2 = MockBuilder(task2, self.sourcedir, self.resultdir, self.config) + cfg1 = b1.render_config_template() + cfg2 = b2.render_config_template() + cfg1 = self.parse_mock_conf(cfg1) + cfg2 = self.parse_mock_conf(cfg2) + self.assert_repo_content(cfg1['yum.conf']) + self.assert_repo_content(cfg2['dnf.conf']) diff --git a/rpmbuild/tests/test_providers.py b/rpmbuild/tests/test_providers.py index fa2128f..24e8789 100644 --- a/rpmbuild/tests/test_providers.py +++ b/rpmbuild/tests/test_providers.py @@ -1,8 +1,8 @@ import unittest -from ..copr_rpmbuild.providers import (factory, RubyGemsProvider, PyPIProvider, +from copr_rpmbuild.providers import (factory, RubyGemsProvider, PyPIProvider, SpecUrlProvider) -from ..copr_rpmbuild.helpers import SourceType +from copr_rpmbuild.helpers import SourceType class TestProvidersFactory(unittest.TestCase): diff --git a/rpmbuild/tests/test_pypi.py b/rpmbuild/tests/test_pypi.py index 65e30d5..2222a9d 100644 --- a/rpmbuild/tests/test_pypi.py +++ b/rpmbuild/tests/test_pypi.py @@ -1,6 +1,6 @@ import mock import unittest -from ..copr_rpmbuild.providers.pypi import PyPIProvider +from copr_rpmbuild.providers.pypi import PyPIProvider class TestPyPIProvider(unittest.TestCase): @@ -16,7 +16,7 @@ class TestPyPIProvider(unittest.TestCase): self.assertEqual(provider.pypi_package_name, "motionpaint") self.assertEqual(provider.python_versions, [2, 3]) - @mock.patch("rpmbuild.copr_rpmbuild.providers.pypi.run_cmd") + @mock.patch("copr_rpmbuild.providers.pypi.run_cmd") @mock.patch("builtins.open") def test_produce_srpm(self, mock_open, run_cmd): provider = PyPIProvider(self.source_json, outdir="/some/tmp/directory") diff --git a/rpmbuild/tests/test_rubygems.py b/rpmbuild/tests/test_rubygems.py index 7307ec2..0775a4c 100644 --- a/rpmbuild/tests/test_rubygems.py +++ b/rpmbuild/tests/test_rubygems.py @@ -1,7 +1,7 @@ import mock import unittest from munch import Munch -from ..copr_rpmbuild.providers.rubygems import RubyGemsProvider +from copr_rpmbuild.providers.rubygems import RubyGemsProvider class TestRubyGemsProvider(unittest.TestCase): @@ -13,7 +13,7 @@ class TestRubyGemsProvider(unittest.TestCase): provider = RubyGemsProvider(self.source_json, self.resultdir) self.assertEqual(provider.gem_name, "A_123") - @mock.patch("rpmbuild.copr_rpmbuild.providers.rubygems.run_cmd") + @mock.patch("copr_rpmbuild.providers.rubygems.run_cmd") @mock.patch("builtins.open") def test_produce_srpm(self, mock_open, run_cmd): provider = RubyGemsProvider(self.source_json, self.resultdir) @@ -21,7 +21,7 @@ class TestRubyGemsProvider(unittest.TestCase): assert_cmd = ["gem2rpm", "A_123", "--srpm", "-C", "/path/to/resultdir", "--fetch"] run_cmd.assert_called_with(assert_cmd) - @mock.patch("rpmbuild.copr_rpmbuild.providers.rubygems.run_cmd") + @mock.patch("copr_rpmbuild.providers.rubygems.run_cmd") @mock.patch("builtins.open") def test_empty_license(self, mock_open, run_cmd): stderr = ("error: line 8: Empty tag: License:" diff --git a/rpmbuild/tests/test_scm.py b/rpmbuild/tests/test_scm.py index 09ca030..7ebde56 100644 --- a/rpmbuild/tests/test_scm.py +++ b/rpmbuild/tests/test_scm.py @@ -3,8 +3,8 @@ import unittest import tempfile import os import configparser -from ..copr_rpmbuild.providers.scm import ScmProvider -from ..copr_rpmbuild.helpers import read_config +from copr_rpmbuild.providers.scm import ScmProvider +from copr_rpmbuild.helpers import read_config from mock import patch, MagicMock @@ -85,7 +85,7 @@ class TestScmProvider(unittest.TestCase): source_json = self.source_json.copy() source_json["clone_url"] = "http://copr-dist-git.fedorainfracloud.org/git/clime/project/pkg.git" - with patch("rpmbuild.copr_rpmbuild.providers.scm.CONF_DIRS", new=[rpkg_tmpdir]): + with patch("copr_rpmbuild.providers.scm.CONF_DIRS", new=[rpkg_tmpdir]): provider = ScmProvider(source_json, self.resultdir, self.config) rpkg_config_path = provider.generate_rpkg_config() @@ -97,7 +97,7 @@ class TestScmProvider(unittest.TestCase): source_json["clone_url"] = "http://unknownurl/git/clime/project/pkg.git" - with patch("rpmbuild.copr_rpmbuild.providers.scm.CONF_DIRS", new=[rpkg_tmpdir]): + with patch("copr_rpmbuild.providers.scm.CONF_DIRS", new=[rpkg_tmpdir]): provider = ScmProvider(source_json, self.resultdir, self.config) rpkg_config_path = provider.generate_rpkg_config() self.assertEqual(rpkg_config_path, "/etc/rpkg.conf") @@ -119,7 +119,7 @@ class TestScmProvider(unittest.TestCase): assert_cmd = ["tito", "build", "--test", "--srpm", "--output", self.resultdir] self.assertEqual(provider.get_tito_test_command(), assert_cmd) - @mock.patch("rpmbuild.copr_rpmbuild.providers.scm.get_mock_uniqueext") + @mock.patch("copr_rpmbuild.providers.scm.get_mock_uniqueext") def test_get_make_srpm_command(self, get_mock_uniqueext_mock): get_mock_uniqueext_mock.return_value = '2' provider = ScmProvider(self.source_json, self.resultdir, self.config) diff --git a/rpmbuild/tests/test_spec.py b/rpmbuild/tests/test_spec.py index 0c03c53..a52e31e 100644 --- a/rpmbuild/tests/test_spec.py +++ b/rpmbuild/tests/test_spec.py @@ -1,7 +1,7 @@ import mock import unittest import configparser -from ..copr_rpmbuild.providers.spec import SpecUrlProvider +from copr_rpmbuild.providers.spec import SpecUrlProvider class TestSpecUrlProvider(unittest.TestCase): @@ -14,7 +14,7 @@ class TestSpecUrlProvider(unittest.TestCase): self.assertEqual(provider.url, "http://foo.ex/somepackage.spec") @mock.patch('requests.get') - @mock.patch("rpmbuild.copr_rpmbuild.providers.spec.run_cmd") + @mock.patch("copr_rpmbuild.providers.spec.run_cmd") @mock.patch('builtins.open', new_callable=mock.mock_open()) def test_produce_srpm(self, mock_open, run_cmd, mock_get): provider = SpecUrlProvider(self.source_json, self.resultdir)