Refactor buildreq into a class

The buildreq module had a large number of globals being touched across
many modules that would import it. This made changes to the buildreq
fragile.

It also made testing fragile due to certain globals needing to be
reset in order to properly test a change.

This change moves the global state (and functions that needed to act
on that global state) into a Requirements class. The goal of this work
is to better track what content can be updated by a particular
function and load data in a sensible order and have it owned by a
sensible component.
This commit is contained in:
William Douglas
2020-03-26 10:34:12 -07:00
committed by Patrick McCarty
parent 84464a329b
commit 2a181a2ddb
12 changed files with 977 additions and 973 deletions
+14 -9
View File
@@ -90,7 +90,6 @@ def load_specfile(conf, specfile):
tarball.load_specfile(specfile)
specdescription.load_specfile(specfile, conf.custom_desc, conf.custom_summ)
license.load_specfile(specfile)
buildreq.load_specfile(specfile)
buildpattern.load_specfile(specfile)
check.load_specfile(specfile)
@@ -267,7 +266,9 @@ def package(args, url, name, archives, workingdir, infile_dict):
conf.setup_patterns()
conf.config_file = args.config
conf.parse_config_files(build.download_path, args.bump, filemanager, tarball.version)
requirements = buildreq.Requirements(tarball.url)
requirements.set_build_req()
conf.parse_config_files(build.download_path, args.bump, filemanager, tarball.version, requirements)
conf.setup_patterns(conf.failed_pattern_dir)
conf.parse_existing_spec(build.download_path, tarball.name)
@@ -275,21 +276,25 @@ def package(args, url, name, archives, workingdir, infile_dict):
write_prep(conf, workingdir)
exit(0)
buildreq.set_build_req()
buildreq.scan_for_configure(_dir, tarball.name, build.download_path, conf)
requirements.scan_for_configure(_dir, tarball.name, build.download_path, conf)
specdescription.scan_for_description(tarball.name, _dir, conf.license_translations, conf.license_blacklist)
# Start one directory higher so we scan *all* versions for licenses
license.scan_for_licenses(os.path.dirname(_dir), conf)
commitmessage.scan_for_changes(build.download_path, _dir, conf.transforms)
add_sources(build.download_path, archives)
check.scan_for_tests(_dir, conf)
check.scan_for_tests(_dir, conf, requirements)
#
# Now, we have enough to write out a specfile, and try to build it.
# We will then analyze the build result and learn information until the
# package builds
#
specfile = specfiles.Specfile(tarball.url, tarball.version, tarball.name, tarball.release, conf)
specfile = specfiles.Specfile(tarball.url,
tarball.version,
tarball.name,
tarball.release,
conf,
requirements)
filemanager.load_specfile(specfile)
load_specfile(conf, specfile)
@@ -308,7 +313,7 @@ def package(args, url, name, archives, workingdir, infile_dict):
specfile.write_spec(build.download_path)
while 1:
build.package(filemanager, args.mock_config, args.mock_opts, conf, args.cleanup)
build.package(filemanager, args.mock_config, args.mock_opts, conf, requirements, args.cleanup)
filemanager.load_specfile(specfile)
specfile.write_spec(build.download_path)
filemanager.newfiles_printed = 0
@@ -329,7 +334,7 @@ def package(args, url, name, archives, workingdir, infile_dict):
check.check_regression(build.download_path, conf.config_opts['skip_tests'])
if build.success == 0:
conf.create_buildreq_cache(build.download_path, tarball.version)
conf.create_buildreq_cache(build.download_path, tarball.version, requirements.buildreqs_cache)
print_fatal("Build failed, aborting")
sys.exit(1)
elif os.path.isfile("README.clear"):
@@ -353,7 +358,7 @@ def package(args, url, name, archives, workingdir, infile_dict):
logcheck(build.download_path)
commitmessage.guess_commit_message(pkg_integrity.IMPORTED, conf)
conf.create_buildreq_cache(build.download_path, tarball.version)
conf.create_buildreq_cache(build.download_path, tarball.version, requirements.buildreqs_cache)
if args.git:
git.commit_to_git(build.download_path, conf)
+27 -28
View File
@@ -23,7 +23,6 @@ import os
import re
import shutil
import buildreq
import tarball
import util
@@ -44,22 +43,22 @@ def setup_workingdir(workingdir):
download_path = os.path.join(base_path, tarball.name)
def simple_pattern_pkgconfig(line, pattern, pkgconfig, conf32):
def simple_pattern_pkgconfig(line, pattern, pkgconfig, conf32, requirements):
"""Check for pkgconfig patterns and restart build as needed."""
global must_restart
pat = re.compile(pattern)
match = pat.search(line)
if match:
must_restart += buildreq.add_pkgconfig_buildreq(pkgconfig, conf32, cache=True)
must_restart += requirements.add_pkgconfig_buildreq(pkgconfig, conf32, cache=True)
def simple_pattern(line, pattern, req):
def simple_pattern(line, pattern, req, requirements):
"""Check for simple patterns and restart the build as needed."""
global must_restart
pat = re.compile(pattern)
match = pat.search(line)
if match:
must_restart += buildreq.add_buildreq(req, cache=True)
must_restart += requirements.add_buildreq(req, cache=True)
def cleanup_req(s: str) -> str:
@@ -96,7 +95,7 @@ def cleanup_req(s: str) -> str:
return s
def failed_pattern(line, config, pattern, verbose, buildtool=None):
def failed_pattern(line, config, requirements, pattern, verbose, buildtool=None):
"""Check against failed patterns to restart build as needed."""
global must_restart
global warned_about
@@ -116,29 +115,29 @@ def failed_pattern(line, config, pattern, verbose, buildtool=None):
if not buildtool:
req = config.failed_commands[s]
if req:
must_restart += buildreq.add_buildreq(req, cache=True)
must_restart += requirements.add_buildreq(req, cache=True)
elif buildtool == 'pkgconfig':
must_restart += buildreq.add_pkgconfig_buildreq(s, config.config_opts.get('32bit'), cache=True)
must_restart += requirements.add_pkgconfig_buildreq(s, config.config_opts.get('32bit'), cache=True)
elif buildtool == 'R':
if buildreq.add_buildreq("R-" + s, cache=True) > 0:
if requirements.add_buildreq("R-" + s, cache=True) > 0:
must_restart += 1
buildreq.add_requires("R-" + s, config.os_packages)
requirements.add_requires("R-" + s, config.os_packages)
elif buildtool == 'perl':
s = s.replace('inc::', '')
must_restart += buildreq.add_buildreq('perl(%s)' % s, cache=True)
must_restart += requirements.add_buildreq('perl(%s)' % s, cache=True)
elif buildtool == 'pypi':
s = util.translate(s)
if not s:
return
must_restart += buildreq.add_buildreq(util.translate('%s-python' % s), cache=True)
must_restart += requirements.add_buildreq(util.translate('%s-python' % s), cache=True)
elif buildtool == 'ruby':
if s in config.gems:
must_restart += buildreq.add_buildreq(config.gems[s], cache=True)
must_restart += requirements.add_buildreq(config.gems[s], cache=True)
else:
must_restart += buildreq.add_buildreq('rubygem-%s' % s, cache=True)
must_restart += requirements.add_buildreq('rubygem-%s' % s, cache=True)
elif buildtool == 'ruby table':
if s in config.gems:
must_restart += buildreq.add_buildreq(config.gems[s], cache=True)
must_restart += requirements.add_buildreq(config.gems[s], cache=True)
else:
print("Unknown ruby gem match", s)
elif buildtool == 'maven' or buildtool == 'gradle':
@@ -149,10 +148,10 @@ def failed_pattern(line, config, pattern, verbose, buildtool=None):
# Hyphens are disallowed for version strings, so use dots instead
ver = match.group(2).replace('-', '.')
mvn_provide = f'mvn({name}) = {ver}'
must_restart += buildreq.add_buildreq(mvn_provide, cache=True)
must_restart += requirements.add_buildreq(mvn_provide, cache=True)
elif s in config.maven_jars:
# Overrides for dependencies with custom grouping
must_restart += buildreq.add_buildreq(config.maven_jars[s], cache=True)
must_restart += requirements.add_buildreq(config.maven_jars[s], cache=True)
elif group_count == 3:
org = match.group(1)
name = match.group(2)
@@ -161,13 +160,13 @@ def failed_pattern(line, config, pattern, verbose, buildtool=None):
mvn_provide = f'mvn({org}:{name}:pom) = {ver}'
else:
mvn_provide = f'mvn({org}:{name}:jar) = {ver}'
must_restart += buildreq.add_buildreq(mvn_provide, cache=True)
must_restart += requirements.add_buildreq(mvn_provide, cache=True)
else:
# Fallback to mvn-ARTIFACTID package name
must_restart += buildreq.add_buildreq('mvn-%s' % s, cache=True)
must_restart += requirements.add_buildreq('mvn-%s' % s, cache=True)
elif buildtool == 'catkin':
must_restart += buildreq.add_pkgconfig_buildreq(s, config.config_opts.get('32bit'), cache=True)
must_restart += buildreq.add_buildreq(s, cache=True)
must_restart += requirements.add_pkgconfig_buildreq(s, config.config_opts.get('32bit'), cache=True)
must_restart += requirements.add_buildreq(s, cache=True)
except Exception:
if s not in warned_about and s[:2] != '--':
@@ -206,11 +205,11 @@ def check_for_warning_pattern(line):
util.print_warning("Build log contains: {}".format(pat))
def parse_build_results(filename, returncode, filemanager, config):
def parse_build_results(filename, returncode, filemanager, config, requirements):
"""Handle build log contents."""
global must_restart
global success
buildreq.verbose = 1
requirements.verbose = 1
must_restart = 0
infiles = 0
@@ -221,13 +220,13 @@ def parse_build_results(filename, returncode, filemanager, config):
for line in loglines:
for pat in config.pkgconfig_pats:
simple_pattern_pkgconfig(line, *pat, config.config_opts.get('32bit'))
simple_pattern_pkgconfig(line, *pat, config.config_opts.get('32bit'), requirements)
for pat in config.simple_pats:
simple_pattern(line, *pat)
simple_pattern(line, *pat, requirements)
for pat in config.failed_pats:
failed_pattern(line, config, *pat)
failed_pattern(line, config, requirements, *pat)
check_for_warning_pattern(line)
@@ -277,7 +276,7 @@ def get_mock_cmd():
return 'sudo /usr/bin/mock'
def package(filemanager, mockconfig, mockopts, config, cleanup=False):
def package(filemanager, mockconfig, mockopts, config, requirements, cleanup=False):
"""Run main package build routine."""
global round
global uniqueext
@@ -343,7 +342,7 @@ def package(filemanager, mockconfig, mockopts, config, cleanup=False):
is_clean = parse_buildroot_log(download_path + "/results/root.log", ret)
if is_clean:
parse_build_results(download_path + "/results/build.log", ret, filemanager, config)
parse_build_results(download_path + "/results/build.log", ret, filemanager, config, requirements)
if filemanager.has_banned:
util.print_fatal("Content in banned paths found, aborting build")
exit(1)
+679 -708
View File
File diff suppressed because it is too large Load Diff
+6 -7
View File
@@ -23,7 +23,6 @@ import os
import re
import buildpattern
import buildreq
import count
import tarball
import util
@@ -55,7 +54,7 @@ def check_regression(pkg_dir, skip_tests):
util.write_out(os.path.join(pkg_dir, "testresults"), res_str)
def scan_for_tests(src_dir, config):
def scan_for_tests(src_dir, config, requirements):
"""Scan source directory for test files and set tests_config accordingly."""
global tests_config
@@ -166,11 +165,11 @@ def scan_for_tests(src_dir, config):
break
if "tox.ini" in files:
buildreq.add_buildreq("tox")
buildreq.add_buildreq("pytest")
buildreq.add_buildreq("virtualenv")
buildreq.add_buildreq("pluggy")
buildreq.add_buildreq("py-python")
requirements.add_buildreq("tox")
requirements.add_buildreq("pytest")
requirements.add_buildreq("virtualenv")
requirements.add_buildreq("pluggy")
requirements.add_buildreq("py-python")
def load_specfile(specfile):
+26 -27
View File
@@ -28,7 +28,6 @@ import textwrap
from collections import OrderedDict
import buildpattern
import buildreq
import check
import license
import tarball
@@ -394,11 +393,11 @@ class Config(object):
os.remove("skip_test_suite")
write_config(config_f, path)
def create_buildreq_cache(self, path, version):
def create_buildreq_cache(self, path, version, buildreqs_cache):
"""Make the buildreq_cache file."""
content = self.read_conf_file(os.path.join(path, "buildreq_cache"))
# don't create an empty cache file
if len(buildreq.buildreqs_cache) < 1:
if len(buildreqs_cache) < 1:
try:
# file was possibly added to git so we should clean it up
os.unlink(content)
@@ -406,9 +405,9 @@ class Config(object):
pass
return
if not content:
pkgs = sorted(buildreq.buildreqs_cache)
pkgs = sorted(buildreqs_cache)
else:
pkgs = sorted(set(content[1:]).union(buildreq.buildreqs_cache))
pkgs = sorted(set(content[1:]).union(buildreqs_cache))
with open(os.path.join(path, 'buildreq_cache'), "w") as cachefile:
cachefile.write("\n".join([version] + pkgs))
self.config_files.add('buildreq_cache')
@@ -604,7 +603,7 @@ class Config(object):
write_out(filename, wrapper.fill(description) + "\n")
def parse_config_files(self, path, bump, filemanager, version):
def parse_config_files(self, path, bump, filemanager, version, requirements):
"""Parse the various configuration files that may exist in the package directory."""
packages_file = None
@@ -701,35 +700,35 @@ class Config(object):
content = self.read_conf_file(os.path.join(path, "buildreq_ban"))
for banned in content:
print("Banning build requirement: %s." % banned)
buildreq.banned_buildreqs.add(banned)
buildreq.buildreqs.discard(banned)
buildreq.buildreqs_cache.discard(banned)
requirements.banned_buildreqs.add(banned)
requirements.buildreqs.discard(banned)
requirements.buildreqs_cache.discard(banned)
content = self.read_conf_file(os.path.join(path, "pkgconfig_ban"))
for banned in content:
banned = "pkgconfig(%s)" % banned
print("Banning build requirement: %s." % banned)
buildreq.banned_buildreqs.add(banned)
buildreq.buildreqs.discard(banned)
buildreq.buildreqs_cache.discard(banned)
requirements.banned_buildreqs.add(banned)
requirements.buildreqs.discard(banned)
requirements.buildreqs_cache.discard(banned)
content = self.read_conf_file(os.path.join(path, "requires_ban"))
for banned in content:
print("Banning runtime requirement: %s." % banned)
buildreq.banned_requires.add(banned)
buildreq.requires.discard(banned)
requirements.banned_requires.add(banned)
requirements.requires.discard(banned)
content = self.read_conf_file(os.path.join(path, "buildreq_add"))
for extra in content:
print("Adding additional build requirement: %s." % extra)
buildreq.add_buildreq(extra)
requirements.add_buildreq(extra)
cache_file = os.path.join(path, "buildreq_cache")
content = self.read_conf_file(cache_file)
if content and content[0] == version:
for extra in content[1:]:
print("Adding additional build (cache) requirement: %s." % extra)
buildreq.add_buildreq(extra)
requirements.add_buildreq(extra)
else:
try:
os.unlink(cache_file)
@@ -742,12 +741,12 @@ class Config(object):
for extra in content:
extra = "pkgconfig(%s)" % extra
print("Adding additional build requirement: %s." % extra)
buildreq.add_buildreq(extra)
requirements.add_buildreq(extra)
content = self.read_conf_file(os.path.join(path, "requires_add"))
for extra in content:
print("Adding additional runtime requirement: %s." % extra)
buildreq.add_requires(extra, self.os_packages, override=True)
requirements.add_requires(extra, self.os_packages, override=True)
content = self.read_conf_file(os.path.join(path, "excludes"))
for exclude in content:
@@ -898,20 +897,20 @@ class Config(object):
if self.config_opts['use_clang']:
self.config_opts['funroll-loops'] = False
buildreq.add_buildreq("llvm")
requirements.add_buildreq("llvm")
if self.config_opts['32bit']:
buildreq.add_buildreq("glibc-libc32")
buildreq.add_buildreq("glibc-dev32")
buildreq.add_buildreq("gcc-dev32")
buildreq.add_buildreq("gcc-libgcc32")
buildreq.add_buildreq("gcc-libstdc++32")
requirements.add_buildreq("glibc-libc32")
requirements.add_buildreq("glibc-dev32")
requirements.add_buildreq("gcc-dev32")
requirements.add_buildreq("gcc-libgcc32")
requirements.add_buildreq("gcc-libstdc++32")
if self.config_opts['openmpi']:
buildreq.add_buildreq("openmpi-dev")
buildreq.add_buildreq("modules")
requirements.add_buildreq("openmpi-dev")
requirements.add_buildreq("modules")
# MPI testsuites generally require "openssh"
buildreq.add_buildreq("openssh")
requirements.add_buildreq("openssh")
self.prep_prepend = self.read_script_file(os.path.join(path, "prep_prepend"))
if os.path.isfile(os.path.join(path, "prep_append")):
+17 -20
View File
@@ -25,7 +25,6 @@ import time
import types
from collections import OrderedDict
import buildreq
import tarball
from util import _file_write
from util import open_auto
@@ -34,13 +33,14 @@ from util import open_auto
class Specfile(object):
"""Holds data and methods needed to write the spec file."""
def __init__(self, url, version, name, release, config):
def __init__(self, url, version, name, release, config, requirements):
"""Add default information for specfile template."""
self.url = url
self.version = version
self.name = name
self.release = release
self.config = config
self.requirements = requirements
self.specfile = None
self.sources = {"unit": [], "gcov": [], "tmpfile": [], "archive": [], "destination": [], "godep": []}
self.source_index = {}
@@ -49,10 +49,6 @@ class Specfile(object):
self.licenses = []
self.license_files = []
self.packages = OrderedDict()
self.requires = set()
self.buildreqs = []
self.pypi_provides = None
self.pypi_requires = []
self.default_desc = ""
self.locales = []
self.default_pattern = ""
@@ -70,7 +66,8 @@ class Specfile(object):
self.custom_extras = {}
self.keyid = ""
self.email = ""
self.cargo_bin = False
self.extra_cmake = config.extra_cmake + " " + " ".join(requirements.extra_cmake)
self.extra_cmake_openmpi = config.extra_cmake_openmpi + " " + " ".join(requirements.extra_cmake_openmpi)
def write_spec(self, path):
"""Write spec file."""
@@ -186,16 +183,16 @@ class Specfile(object):
"staticdev32"]:
continue
# honor requires_ban for manual overrides
if "{}-{}".format(self.name, pkg) in buildreq.banned_requires:
if "{}-{}".format(self.name, pkg) in self.requirements.banned_requires:
continue
self._write("Requires: {}-{} = %{{version}}-%{{release}}\n".format(self.name, pkg))
for pkg in sorted(self.requires):
for pkg in sorted(self.requirements.requires):
self._write("Requires: {}\n".format(pkg))
def write_buildreq(self):
"""Write build requirements."""
for req in sorted(self.buildreqs):
for req in sorted(self.requirements.buildreqs):
self._write("BuildRequires : {}\n".format(req))
def write_strip_command(self):
@@ -297,9 +294,9 @@ class Specfile(object):
if pkg == "python3":
self._write("Requires: python3-core\n")
if self.pypi_provides:
self._write(f"Provides: pypi({self.pypi_provides})\n")
for req in self.pypi_requires:
if self.requirements.pypi_provides:
self._write(f"Provides: pypi({self.requirements.pypi_provides})\n")
for req in self.requirements.pypi_requires:
self._write(f"Requires: pypi({req})\n")
if pkg == "perl":
@@ -411,7 +408,7 @@ class Specfile(object):
'-DCMAKE_INSTALL_LIBDIR=$MPI_LIB -DCMAKE_INSTALL_INCLUDEDIR=$MPI_INCLUDE -DLIB_INSTALL_DIR=$MPI_LIB \\\n' \
'-DBUILD_SHARED_LIBS:BOOL=ON -DLIB_SUFFIX=64 \\\n' \
'-DCMAKE_AR=/usr/bin/gcc-ar -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \\\n'
self._write_strip("{} {} {}".format(cmake_string, self.config.cmake_srcdir, self.config.extra_cmake_openmpi))
self._write_strip("{} {} {}".format(cmake_string, self.config.cmake_srcdir, self.extra_cmake_openmpi))
def write_prep(self, ruby_pattern=False):
"""Write prep section to spec file."""
@@ -1491,7 +1488,7 @@ class Specfile(object):
def write_cmake_pattern(self):
"""Write cmake pattern to spec file."""
if self.config.extra_make == "" or self.config.extra_cmake == " ":
if self.config.extra_make == "" or self.extra_cmake == " ":
self.config.extra_make = "VERBOSE=1"
self.write_prep()
self.write_lang_c(export_epoch=True)
@@ -1502,7 +1499,7 @@ class Specfile(object):
self._write_strip("mkdir -p clr-build")
self._write_strip("pushd clr-build")
self.write_variables()
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.config.extra_cmake))
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.extra_cmake))
self.write_profile_payload("cmake")
@@ -1519,7 +1516,7 @@ class Specfile(object):
self.need_avx2_flags = saved_avx2flags
self._write_strip('export CFLAGS="$CFLAGS -march=haswell -m64"')
self._write_strip('export CXXFLAGS="$CXXFLAGS -march=haswell -m64"')
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.config.extra_cmake))
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.extra_cmake))
self.write_make_line()
self._write_strip("popd")
@@ -1533,7 +1530,7 @@ class Specfile(object):
self.need_avx512_flags = saved_avx512flags
self._write_strip('export CFLAGS="$CFLAGS -march=skylake-avx512 -m64 "')
self._write_strip('export CXXFLAGS="$CXXFLAGS -march=skylake-avx512 -m64 "')
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.config.extra_cmake))
self._write_strip("%cmake {} {}".format(self.config.cmake_srcdir, self.extra_cmake))
self.write_make_line()
self._write_strip("popd")
@@ -1546,7 +1543,7 @@ class Specfile(object):
self._write_strip("%cmake -DLIB_INSTALL_DIR:PATH=/usr/lib32 "
"-DCMAKE_INSTALL_LIBDIR=/usr/lib32 "
"-DLIB_SUFFIX=32 "
"{} {} ".format(self.config.cmake_srcdir, self.config.extra_cmake))
"{} {} ".format(self.config.cmake_srcdir, self.extra_cmake))
self.write_make_line()
self._write_strip("unset PKG_CONFIG_PATH")
self._write_strip("popd")
@@ -1636,7 +1633,7 @@ class Specfile(object):
self._write_strip("\n")
self._write_strip("%install")
self.write_install_prepend()
if self.cargo_bin:
if self.requirements.cargo_bin:
self._write_strip("cargo install --frozen --root /")
self._write_strip("cargo clean")
self._write_strip("install -d -p %{buildroot}" + src_dir)
-7
View File
@@ -26,7 +26,6 @@ from collections import OrderedDict
import build
import buildpattern
import buildreq
import download
from util import call, do_regex, get_sha1sum, print_fatal, write_out
@@ -359,12 +358,6 @@ def name_and_version(name_arg, version_arg, filemanager, config):
if not giturl:
giturl = "https://github.com/" + match.group(1).strip() + "/" + repo + ".git"
if "gnome.org" in url:
buildreq.add_buildreq("buildreq-gnome")
if "kde.org" in url or "https://github.com/KDE" in url:
buildreq.add_buildreq("buildreq-kde")
# SQLite tarballs use 7 digit versions, e.g 3290000 = 3.29.0, 3081002 = 3.8.10.2
if "sqlite.org" in url:
major = version[0]
+77 -39
View File
@@ -3,6 +3,7 @@ import tempfile
import os
from unittest.mock import patch, mock_open, MagicMock
import build
import buildreq
import config
import files
@@ -18,7 +19,6 @@ class TestBuildpattern(unittest.TestCase):
build.must_restart = 0
build.base_path = None
build.download_path = None
build.buildreq.buildreqs = set()
def test_setup_workingdir(self):
"""
@@ -33,34 +33,40 @@ class TestBuildpattern(unittest.TestCase):
"""
Test simple_pattern_pkgconfig with match
"""
reqs = buildreq.Requirements("")
build.simple_pattern_pkgconfig('line to test for testpkg.xyz',
r'testpkg.xyz',
'testpkg',
False)
self.assertIn('pkgconfig(testpkg)', build.buildreq.buildreqs)
False,
reqs)
self.assertIn('pkgconfig(testpkg)', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_pkgconfig_32bit(self):
"""
Test simple_pattern_pkgconfig with match and 32bit option set
"""
reqs = buildreq.Requirements("")
build.simple_pattern_pkgconfig('line to test for testpkg.zyx',
r'testpkg.zyx',
'testpkgz',
True)
self.assertIn('pkgconfig(32testpkgz)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(testpkgz)', build.buildreq.buildreqs)
True,
reqs)
self.assertIn('pkgconfig(32testpkgz)', reqs.buildreqs)
self.assertIn('pkgconfig(testpkgz)', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_pkgconfig_no_match(self):
"""
Test simple_pattern_pkgconfig with no match, nothing should be modified
"""
reqs = buildreq.Requirements("")
build.simple_pattern_pkgconfig('line to test for somepkg.xyz',
r'testpkg.xyz',
'testpkg',
False)
self.assertEqual(build.buildreq.buildreqs, set())
False,
reqs)
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_simple_pattern(self):
@@ -69,20 +75,24 @@ class TestBuildpattern(unittest.TestCase):
simple_pattern and simple_pattern_pkgconfig is the string that is added
to buildreq.buildreqs.
"""
reqs = buildreq.Requirements("")
build.simple_pattern('line to test for testpkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertIn('testpkg', build.buildreq.buildreqs)
'testpkg',
reqs)
self.assertIn('testpkg', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_no_match(self):
"""
Test simple_pattern with no match, nothing should be modified
"""
reqs = buildreq.Requirements("")
build.simple_pattern('line to test for somepkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertEqual(build.buildreq.buildreqs, set())
'testpkg',
reqs)
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_match(self):
@@ -90,8 +100,9 @@ class TestBuildpattern(unittest.TestCase):
Test failed_pattern with no match
"""
conf = config.Config()
build.failed_pattern('line to test for failure: somepkg', conf, r'(test)', 0)
self.assertEqual(build.buildreq.buildreqs, set())
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: somepkg', conf, reqs, r'(test)', 0)
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_buildtool(self):
@@ -100,8 +111,9 @@ class TestBuildpattern(unittest.TestCase):
match in failed_commands.
"""
conf = config.Config()
build.failed_pattern('line to test for failure: testpkg', conf, r'(test)', 0)
self.assertEqual(build.buildreq.buildreqs, set())
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg', conf, reqs, r'(test)', 0)
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_buildtool_match(self):
@@ -109,9 +121,10 @@ class TestBuildpattern(unittest.TestCase):
Test failed_pattern with buildtool unset and match in failed_commands
"""
conf = config.Config()
reqs = buildreq.Requirements("")
conf.setup_patterns()
build.failed_pattern('line to test for failure: lex', conf, r'(lex)', 0)
self.assertIn('flex', build.buildreq.buildreqs)
build.failed_pattern('line to test for failure: lex', conf, reqs, r'(lex)', 0)
self.assertIn('flex', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_pkgconfig(self):
@@ -119,12 +132,14 @@ class TestBuildpattern(unittest.TestCase):
Test failed_pattern with buildtool set to pkgconfig
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg.xyz',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='pkgconfig')
self.assertIn('pkgconfig(testpkg)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(testpkg)', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_R(self):
@@ -133,13 +148,15 @@ class TestBuildpattern(unittest.TestCase):
"""
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg.r',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='R')
self.assertIn('R-testpkg', build.buildreq.buildreqs)
self.assertIn('R-testpkg', build.buildreq.requires)
self.assertIn('R-testpkg', reqs.buildreqs)
self.assertIn('R-testpkg', reqs.requires)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_perl(self):
@@ -147,12 +164,14 @@ class TestBuildpattern(unittest.TestCase):
Test failed_pattern with buildtool set to perl
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg.pl',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='perl')
self.assertIn('perl(testpkg)', build.buildreq.buildreqs)
self.assertIn('perl(testpkg)', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_pypi(self):
@@ -160,12 +179,14 @@ class TestBuildpattern(unittest.TestCase):
Test failed_pattern with buildtool set to pypi
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg.py',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='pypi')
self.assertIn('testpkg-python', build.buildreq.buildreqs)
self.assertIn('testpkg-python', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby(self):
@@ -174,12 +195,14 @@ class TestBuildpattern(unittest.TestCase):
config.gems, it should just prepend 'rubygem-' to the package name.
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg.rb',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-testpkg', build.buildreq.buildreqs)
self.assertIn('rubygem-testpkg', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_gem_match(self):
@@ -190,12 +213,14 @@ class TestBuildpattern(unittest.TestCase):
"""
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: test/unit',
conf,
reqs,
r'(test/unit)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-test-unit', build.buildreq.buildreqs)
self.assertIn('rubygem-test-unit', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_table(self):
@@ -205,12 +230,14 @@ class TestBuildpattern(unittest.TestCase):
"""
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: test/unit',
conf,
reqs,
r'(test/unit)',
0, # verbose=0
buildtool='ruby table')
self.assertIn('rubygem-test-unit', build.buildreq.buildreqs)
self.assertIn('rubygem-test-unit', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_table_no_match(self):
@@ -219,12 +246,14 @@ class TestBuildpattern(unittest.TestCase):
config.gems. This should not modify anything.
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='ruby table')
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_maven(self):
@@ -233,12 +262,14 @@ class TestBuildpattern(unittest.TestCase):
config.maven_jars, it should just prepend 'mvn-' to the package name.
"""
conf = config.Config()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: testpkg',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='maven')
self.assertIn('mvn-testpkg', build.buildreq.buildreqs)
self.assertIn('mvn-testpkg', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_maven_match(self):
@@ -249,12 +280,14 @@ class TestBuildpattern(unittest.TestCase):
"""
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
build.failed_pattern('line to test for failure: aether',
conf,
reqs,
r'(aether)',
0, # verbose=0
buildtool='maven')
self.assertIn('mvn-aether-core', build.buildreq.buildreqs)
self.assertIn('mvn-aether-core', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_buildroot_log_fail(self):
@@ -337,6 +370,7 @@ class TestBuildpattern(unittest.TestCase):
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
conf.config_opts['32bit'] = True
call_backup = build.util.call
build.util.call = mock_util_call
@@ -347,12 +381,12 @@ class TestBuildpattern(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm, conf)
build.parse_build_results('testname', 0, fm, conf, reqs)
build.util.call = call_backup
self.assertIn('pkgconfig(Qt)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(32Qt)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(Qt)', reqs.buildreqs)
self.assertIn('pkgconfig(32Qt)', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_build_results_simple_pats(self):
@@ -365,6 +399,7 @@ class TestBuildpattern(unittest.TestCase):
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager(conf)
@@ -374,11 +409,11 @@ class TestBuildpattern(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm, conf)
build.parse_build_results('testname', 0, fm, conf, reqs)
build.util.call = call_backup
self.assertIn('httpd-dev', build.buildreq.buildreqs)
self.assertIn('httpd-dev', reqs.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_build_results_failed_pats(self):
@@ -388,6 +423,7 @@ class TestBuildpattern(unittest.TestCase):
"""
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
call_backup = build.util.call
open_auto_backup = build.util.open_auto
build.util.call = MagicMock(return_value=None)
@@ -398,11 +434,11 @@ class TestBuildpattern(unittest.TestCase):
for error in builderrors:
if not error.startswith('#'):
input, output = error.strip('\n').split('|')
build.buildreq.buildreqs = set()
reqs.buildreqs = set()
build.util.open_auto = mock_open(read_data=input)
build.parse_build_results('testname', 0, fm, conf)
build.parse_build_results('testname', 0, fm, conf, reqs)
self.assertIn(output, build.buildreq.buildreqs)
self.assertIn(output, reqs.buildreqs)
self.assertGreater(build.must_restart, 0)
# Restoring functions
@@ -418,6 +454,7 @@ class TestBuildpattern(unittest.TestCase):
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager(conf)
@@ -433,7 +470,7 @@ class TestBuildpattern(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm, conf)
build.parse_build_results('testname', 0, fm, conf, reqs)
build.util.call = call_backup
@@ -453,6 +490,7 @@ class TestBuildpattern(unittest.TestCase):
conf = config.Config()
conf.setup_patterns()
reqs = buildreq.Requirements("")
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager(conf)
@@ -470,7 +508,7 @@ class TestBuildpattern(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm, conf)
build.parse_build_results('testname', 0, fm, conf, reqs)
build.util.call = call_backup
+103 -110
View File
@@ -10,116 +10,105 @@ import config
class TestBuildreq(unittest.TestCase):
@classmethod
def setUpClass(self):
"""
Class setup method to configure necessary modules
"""
buildreq.banned_buildreqs.add('bannedreq')
def setUp(self):
"""
Test setup method to reset the buildreq module
"""
buildreq.banned_requires = set()
buildreq.buildreqs = set()
buildreq.requires = set()
buildreq.verbose = False
buildreq.cargo_bin = False
buildreq.buildpattern.pattern_strength = 0
self.reqs = buildreq.Requirements("")
self.reqs.banned_buildreqs.add('bannedreq')
def test_add_buildreq(self):
"""
Test add_buildreq with unbanned new req. Follow up by asserting that
trying to add the same req a second time results in a False return.
"""
self.assertTrue(buildreq.add_buildreq('testreq'))
self.assertIn('testreq', buildreq.buildreqs)
self.assertFalse(buildreq.add_buildreq('testreq'))
self.assertTrue(self.reqs.add_buildreq('testreq'))
self.assertIn('testreq', self.reqs.buildreqs)
self.assertFalse(self.reqs.add_buildreq('testreq'))
def test_add_buildreq_banned(self):
"""
Test add_buildreq with banned new req
"""
self.assertFalse(buildreq.add_buildreq('bannedreq'))
self.assertNotIn('bannedreq', buildreq.buildreqs)
self.assertFalse(self.reqs.add_buildreq('bannedreq'))
self.assertNotIn('bannedreq', self.reqs.buildreqs)
def test_add_requires(self):
"""
Test add_requires with unbanned new req already present in
buildreqs but not yet present in requires
"""
buildreq.add_buildreq('testreq')
self.assertTrue(buildreq.add_requires('testreq', ['testreq']))
self.assertIn('testreq', buildreq.requires)
self.reqs.add_buildreq('testreq')
self.assertTrue(self.reqs.add_requires('testreq', ['testreq']))
self.assertIn('testreq', self.reqs.requires)
def test_add_requires_not_in_buildreqs(self):
"""
Test add_requires with unbanned new req not present in buildreqs.
"""
self.assertFalse(buildreq.add_requires('testreq', []))
self.assertNotIn('testreq', buildreq.requires)
self.assertFalse(self.reqs.add_requires('testreq', []))
self.assertNotIn('testreq', self.reqs.requires)
def test_add_pkgconfig_buildreq(self):
"""
Test add_pkgconfig_buildreq with config_opts['32bit'] set to False
"""
self.assertTrue(buildreq.add_pkgconfig_buildreq('testreq', False))
self.assertIn('pkgconfig(testreq)', buildreq.buildreqs)
self.assertTrue(self.reqs.add_pkgconfig_buildreq('testreq', False))
self.assertIn('pkgconfig(testreq)', self.reqs.buildreqs)
def test_add_pkgconfig_buildreq_32bit(self):
"""
Test add_pkgconfig_buildreq with config_opts['32bit'] set to True
"""
self.assertTrue(buildreq.add_pkgconfig_buildreq('testreq', True))
self.assertIn('pkgconfig(testreq)', buildreq.buildreqs)
self.assertIn('pkgconfig(32testreq)', buildreq.buildreqs)
self.assertTrue(self.reqs.add_pkgconfig_buildreq('testreq', True))
self.assertIn('pkgconfig(testreq)', self.reqs.buildreqs)
self.assertIn('pkgconfig(32testreq)', self.reqs.buildreqs)
def test_configure_ac_line(self):
"""
Test configure_ac_line with standard pattern
"""
buildreq.configure_ac_line('AC_CHECK_FUNC\([tgetent])', False)
self.assertIn('ncurses-devel', buildreq.buildreqs)
self.reqs.configure_ac_line('AC_CHECK_FUNC\([tgetent])', False)
self.assertIn('ncurses-devel', self.reqs.buildreqs)
def test_configure_ac_line_comment(self):
"""
Test configure_ac_line with commented line
"""
buildreq.configure_ac_line('# AC_CHECK_FUNC\([tgetent])', False)
self.assertEqual(buildreq.buildreqs, set())
self.reqs.configure_ac_line('# AC_CHECK_FUNC\([tgetent])', False)
self.assertEqual(self.reqs.buildreqs, set())
def test_configure_ac_line_pkg_check_modules(self):
"""
Test the somewhat complicated logic of configure_ac_line check for the
PKG_CHECK_MODULES\((.*?)\) line.
"""
buildreq.configure_ac_line(
self.reqs.configure_ac_line(
'PKG_CHECK_MODULES(prefix, '
'[module > 2 module2 < 2], '
'action-if-found, action-if-not-found)', False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(module)', 'pkgconfig(module2)']))
def test_configure_ac_line_xdt_check_package(self):
"""
Test configure_ac_line for the XFCE version of PKG_CHECK_MODULES
"""
buildreq.configure_ac_line(
self.reqs.configure_ac_line(
'XDT_CHECK_PACKAGE(prefix, '
'[module = 2 module2 > 9], '
'action-if-found, action-if-not-found)', False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(module)', 'pkgconfig(module2)']))
def test_configure_ac_line_pkg_check_exists(self):
"""
Test configure_ac_line for the PKG_CHECK_EXISTS macro
"""
buildreq.configure_ac_line('PKG_CHECK_EXISTS([module1 > 1 module2], '
self.reqs.configure_ac_line('PKG_CHECK_EXISTS([module1 > 1 module2], '
'action-if-found, '
'action-if-not-found)', False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(module1)', 'pkgconfig(module2)']))
def test_parse_configure_ac(self):
@@ -127,6 +116,7 @@ class TestBuildreq(unittest.TestCase):
Test parse_configure_ac with changing () depths and package
requirements
"""
buildreq.buildpattern.pattern_strength = 0
open_name = 'buildreq.util.open_auto'
content = 'AC_CHECK_FUNC([tgetent])\n' \
'XDT_CHECK_PACKAGE(prefix, ' \
@@ -139,10 +129,10 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_configure_ac(os.path.join(tmpd, 'fname'), False)
self.reqs.parse_configure_ac(os.path.join(tmpd, 'fname'), False)
self.assertEqual(buildreq.buildpattern.default_pattern, 'configure_ac')
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['gettext',
'perl(XML::Parser)',
'pkgconfig(module2)',
@@ -200,15 +190,16 @@ class TestBuildreq(unittest.TestCase):
open_name = 'buildreq.util.open_auto'
content = 'does not matter, let us mock'
m_open = mock_open(read_data=content)
buildreq.buildpattern.pattern_strength = 0
with patch(open_name, m_open, create=True):
buildreq.parse_cargo_toml('filename', ['dep1', 'dep2', 'dep3'])
self.reqs.parse_cargo_toml('filename', ['dep1', 'dep2', 'dep3'])
buildreq.os.path.exists = exists_backup
buildreq.toml.loads = loads_backup
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['rustc', 'dep1', 'dep2', 'dep3']))
self.assertTrue(buildreq.cargo_bin)
self.assertTrue(self.reqs.cargo_bin)
self.assertEqual(buildreq.buildpattern.default_pattern, 'cargo')
def test_set_build_req_maven(self):
@@ -218,8 +209,8 @@ class TestBuildreq(unittest.TestCase):
case the overall package list changes in the future.
"""
buildreq.buildpattern.default_pattern = 'maven'
buildreq.set_build_req()
self.assertIn('apache-maven', buildreq.buildreqs)
self.reqs.set_build_req()
self.assertIn('apache-maven', self.reqs.buildreqs)
def test_set_build_req_ruby(self):
"""
@@ -228,8 +219,8 @@ class TestBuildreq(unittest.TestCase):
case the overall package list changes in the future.
"""
buildreq.buildpattern.default_pattern = 'ruby'
buildreq.set_build_req()
self.assertIn('ruby', buildreq.buildreqs)
self.reqs.set_build_req()
self.assertIn('ruby', self.reqs.buildreqs)
def test_set_build_req_cargo(self):
"""
@@ -238,8 +229,8 @@ class TestBuildreq(unittest.TestCase):
case the overall package list changes in the future.
"""
buildreq.buildpattern.default_pattern = 'cargo'
buildreq.set_build_req()
self.assertIn('rustc', buildreq.buildreqs)
self.reqs.set_build_req()
self.assertIn('rustc', self.reqs.buildreqs)
def test_rakefile(self):
"""
@@ -251,9 +242,9 @@ class TestBuildreq(unittest.TestCase):
content = "line1\nrequire 'bundler/gem_tasks'\nline3\nrequire 'nope'"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.rakefile('filename', conf.gems)
self.reqs.rakefile('filename', conf.gems)
self.assertEqual(buildreq.buildreqs, set(['rubygem-rubygems-tasks']))
self.assertEqual(self.reqs.buildreqs, set(['rubygem-rubygems-tasks']))
def test_clean_python_req(self):
"""
@@ -282,32 +273,32 @@ class TestBuildreq(unittest.TestCase):
Test grab_python_requirements with a reasonable requirements file
"""
# buildreqs must include the requires also
buildreq.buildreqs = set(['req1', 'req2', 'req7'])
self.reqs.buildreqs = set(['req1', 'req2', 'req7'])
open_name = 'buildreq.util.open_auto'
content = 'req1 <= 1.2.3\n' \
'req2 >= 1.55\n' \
'req7 == 3.3.3\n'
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.grab_python_requirements('filename', ['req1', 'req2', 'req3'])
self.reqs.grab_python_requirements('filename', ['req1', 'req2', 'req3'])
self.assertEqual(buildreq.requires, set(['req1', 'req2', 'req7']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2', 'req7']))
def test_grab_python_requirements_strange_file(self):
"""
Test grab_python_requirements with a poorly written file
"""
# buildreqs must include the requires also
buildreq.buildreqs = set(['req1', 'req2', 'req7'])
self.reqs.buildreqs = set(['req1', 'req2', 'req7'])
open_name = 'buildreq.util.open_auto'
content = ' req1 <= 1.2.3\n ' \
'req2 >= 1.55 \n' \
' req7 == 3.3.3\n '
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.grab_python_requirements('filename', ['req1', 'req2', 'req3'])
self.reqs.grab_python_requirements('filename', ['req1', 'req2', 'req3'])
self.assertEqual(buildreq.requires, set(['req1', 'req2', 'req7']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2', 'req7']))
def test_add_setup_py_requires(self):
"""
@@ -319,10 +310,10 @@ class TestBuildreq(unittest.TestCase):
"setup_requires=['req2']"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', ['req1', 'req2'])
self.reqs.add_setup_py_requires('filename', ['req1', 'req2'])
self.assertEqual(buildreq.buildreqs, set(['req1', 'req2']))
self.assertEqual(buildreq.requires, set(['req1']))
self.assertEqual(self.reqs.buildreqs, set(['req1', 'req2']))
self.assertEqual(self.reqs.requires, set(['req1']))
def test_add_setup_py_requires_multiline(self):
"""
@@ -334,10 +325,10 @@ class TestBuildreq(unittest.TestCase):
"'req3']\n"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', ['req1', 'req2', 'req3'])
self.reqs.add_setup_py_requires('filename', ['req1', 'req2', 'req3'])
self.assertEqual(buildreq.buildreqs, set(['req1', 'req2', 'req3']))
self.assertEqual(buildreq.requires, set(['req1', 'req2', 'req3']))
self.assertEqual(self.reqs.buildreqs, set(['req1', 'req2', 'req3']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2', 'req3']))
def test_add_setup_py_requires_multiline_formatted(self):
"""
@@ -352,10 +343,10 @@ class TestBuildreq(unittest.TestCase):
"]\n"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', ['req1', 'req2', 'req3'])
self.reqs.add_setup_py_requires('filename', ['req1', 'req2', 'req3'])
self.assertEqual(buildreq.buildreqs, set(['req1', 'req2', 'req3']))
self.assertEqual(buildreq.requires, set(['req1', 'req2', 'req3']))
self.assertEqual(self.reqs.buildreqs, set(['req1', 'req2', 'req3']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2', 'req3']))
def test_add_setup_py_requires_multiline_variable(self):
"""
@@ -370,10 +361,10 @@ class TestBuildreq(unittest.TestCase):
"]\n"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', ['req1', 'req2'])
self.reqs.add_setup_py_requires('filename', ['req1', 'req2'])
self.assertEqual(buildreq.buildreqs, set(['req1', 'req2']))
self.assertEqual(buildreq.requires, set(['req1', 'req2']))
self.assertEqual(self.reqs.buildreqs, set(['req1', 'req2']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2']))
def test_add_setup_py_requires_variable(self):
"""
@@ -383,10 +374,10 @@ class TestBuildreq(unittest.TestCase):
content = "install_requires=[reqname, 'req1', 'req2']\n"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', ['req1', 'req2'])
self.reqs.add_setup_py_requires('filename', ['req1', 'req2'])
self.assertEqual(buildreq.buildreqs, set(['req1', 'req2']))
self.assertEqual(buildreq.requires, set(['req1', 'req2']))
self.assertEqual(self.reqs.buildreqs, set(['req1', 'req2']))
self.assertEqual(self.reqs.requires, set(['req1', 'req2']))
def test_add_setup_py_requires_single_variable(self):
"""
@@ -396,10 +387,10 @@ class TestBuildreq(unittest.TestCase):
content = "install_requires=reqname"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
buildreq.add_setup_py_requires('filename', [])
self.reqs.add_setup_py_requires('filename', [])
self.assertEqual(buildreq.buildreqs, set())
self.assertEqual(buildreq.requires, set())
self.assertEqual(self.reqs.buildreqs, set())
self.assertEqual(self.reqs.requires, set())
def test_setup_py3_version_classifier(self):
"""
@@ -432,9 +423,9 @@ class TestBuildreq(unittest.TestCase):
open(os.path.join(tmpd, 'SConstruct'), 'w').close()
open(os.path.join(tmpd, 'meson.build'), 'w').close()
buildreq.scan_for_configure(tmpd, "", "", conf)
self.reqs.scan_for_configure(tmpd, "", "", conf)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['buildreq-golang', 'buildreq-cmake', 'buildreq-scons', 'buildreq-distutils3', 'buildreq-meson']))
def test_scan_for_configure_pypi(self):
@@ -443,6 +434,7 @@ class TestBuildreq(unittest.TestCase):
pattern to test pypi metadata handling.
"""
conf = config.Config()
buildreq.buildpattern.pattern_strength = 0
orig_summary = buildreq.specdescription.default_summary
orig_sscore = buildreq.specdescription.default_summary_score
orig_pypi_name = buildreq.pypidata.get_pypi_name
@@ -459,7 +451,7 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'subdir', 'setup.py'), 'w').close()
buildreq.scan_for_configure(os.path.join(tmpd, 'subdir'), "", tmpd, conf)
self.reqs.scan_for_configure(os.path.join(tmpd, 'subdir'), "", tmpd, conf)
ssummary = buildreq.specdescription.default_summary
buildreq.specdescription.default_summary = orig_summary
@@ -467,8 +459,8 @@ class TestBuildreq(unittest.TestCase):
buildreq.pypidata.get_pypi_name = orig_pypi_name
buildreq.pypidata.get_pypi_metadata = orig_pypi_meta
self.assertEqual(buildreq.pypi_provides, name)
self.assertEqual(buildreq.pypi_requires, set(requires))
self.assertEqual(self.reqs.pypi_provides, name)
self.assertEqual(self.reqs.pypi_requires, set(requires))
self.assertEqual(ssummary, summary)
def test_scan_for_configure_pypi_override(self):
@@ -477,6 +469,7 @@ class TestBuildreq(unittest.TestCase):
pattern to test pypi metadata file override handling.
"""
conf = config.Config()
buildreq.buildpattern.pattern_strength = 0
open_name = 'buildreq.open'
orig_summary = buildreq.specdescription.default_summary
orig_sscore = buildreq.specdescription.default_summary_score
@@ -492,14 +485,14 @@ class TestBuildreq(unittest.TestCase):
open(os.path.join(tmpd, 'subdir', 'setup.py'), 'w').close()
open(os.path.join(tmpd, 'pypi.json'), 'w').close()
with patch(open_name, m_open, create=True):
buildreq.scan_for_configure(os.path.join(tmpd, 'subdir'), "", tmpd, conf)
self.reqs.scan_for_configure(os.path.join(tmpd, 'subdir'), "", tmpd, conf)
ssummary = buildreq.specdescription.default_summary
buildreq.specdescription.default_summary = orig_summary
buildreq.specdescription.default_summary_score = orig_sscore
self.assertEqual(buildreq.pypi_provides, name)
self.assertEqual(buildreq.pypi_requires, set(requires))
self.assertEqual(self.reqs.pypi_provides, name)
self.assertEqual(self.reqs.pypi_requires, set(requires))
self.assertEqual(ssummary, summary)
def test_parse_cmake_pkg_check_modules(self):
@@ -513,9 +506,9 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(gio-unix-2.0)', 'pkgconfig(glib-2.0)']))
def test_parse_cmake_pkg_check_modules_whitespace(self):
@@ -529,9 +522,9 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(gio-unix-2.0)', 'pkgconfig(glib-2.0)']))
def test_parse_cmake_pkg_check_modules_in_a_comment(self):
@@ -548,9 +541,9 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set([]))
def test_parse_cmake_pkg_check_modules_variables(self):
@@ -564,9 +557,9 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), conf.cmake_modules, False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['pkgconfig(libavcodec)', 'pkgconfig(libavutil)']))
def test_parse_cmake_find_package(self):
@@ -587,9 +580,9 @@ find_package(different_name)
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
f.write(content)
buildreq.parse_cmake(os.path.join(tmpd, 'fname'), cmake_modules, False)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), cmake_modules, False)
self.assertEqual(buildreq.buildreqs,
self.assertEqual(self.reqs.buildreqs,
set(['valid', 'another_name']))
def test_r_desc_field_begin(self):
@@ -695,8 +688,8 @@ find_package(different_name)
content = 'Depends: pkg1'
m_open = mock_open(read_data=content)
with patch(open_name, m_open):
buildreq.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg1' in buildreq.buildreqs)
self.reqs.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg1' in self.reqs.buildreqs)
def test_parse_r_desc_imports(self):
"""Test parsing of an R description Imports field."""
@@ -705,8 +698,8 @@ find_package(different_name)
content = 'Imports: pkg2'
m_open = mock_open(read_data=content)
with patch(open_name, m_open):
buildreq.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg2' in buildreq.buildreqs)
self.reqs.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg2' in self.reqs.buildreqs)
def test_parse_r_desc_linkingto(self):
"""Test parsing of an R description LinkingTo field."""
@@ -715,8 +708,8 @@ find_package(different_name)
content = 'LinkingTo: pkg3'
m_open = mock_open(read_data=content)
with patch(open_name, m_open):
buildreq.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg3' in buildreq.buildreqs)
self.reqs.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg3' in self.reqs.buildreqs)
def test_parse_r_desc_multiple(self):
"""Test parsing of an R description file that captures multiple fields."""
@@ -736,13 +729,13 @@ find_package(different_name)
]
m_open = mock_open(read_data='\n'.join(content))
with patch(open_name, m_open):
buildreq.parse_r_description('filename', pkgs)
self.assertFalse('R-foo' in buildreq.buildreqs)
self.assertFalse('R-bar' in buildreq.buildreqs)
self.assertTrue('R-pkg1' in buildreq.buildreqs)
self.assertTrue('R-pkg2' in buildreq.buildreqs)
self.assertTrue('R-pkg3' in buildreq.buildreqs)
self.assertTrue('R-pkg4' in buildreq.buildreqs)
self.reqs.parse_r_description('filename', pkgs)
self.assertFalse('R-foo' in self.reqs.buildreqs)
self.assertFalse('R-bar' in self.reqs.buildreqs)
self.assertTrue('R-pkg1' in self.reqs.buildreqs)
self.assertTrue('R-pkg2' in self.reqs.buildreqs)
self.assertTrue('R-pkg3' in self.reqs.buildreqs)
self.assertTrue('R-pkg4' in self.reqs.buildreqs)
def test_parse_r_desc_not_in_os(self):
"""Test parsing of an R description file with some non-OS packages."""
@@ -756,10 +749,10 @@ find_package(different_name)
]
m_open = mock_open(read_data='\n'.join(content))
with patch(open_name, m_open):
buildreq.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg1' in buildreq.buildreqs)
self.assertFalse('R-pkg2' in buildreq.buildreqs)
self.assertFalse('R-pkg3' in buildreq.buildreqs)
self.reqs.parse_r_description('filename', pkgs)
self.assertTrue('R-pkg1' in self.reqs.buildreqs)
self.assertFalse('R-pkg2' in self.reqs.buildreqs)
self.assertFalse('R-pkg3' in self.reqs.buildreqs)
if __name__ == '__main__':
+16 -9
View File
@@ -3,6 +3,7 @@ import tempfile
import unittest
from unittest.mock import mock_open, patch
import buildreq
import check
import config
@@ -28,7 +29,6 @@ class TestTest(unittest.TestCase):
def setUp(self):
check.tests_config = ''
check.tarball.name = ''
check.buildreq.buildreqs = set()
check.buildpattern.default_pattern = "make"
def test_check_regression(self):
@@ -88,6 +88,7 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with makecheck suite
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['Makefile.in'])
@@ -95,7 +96,7 @@ class TestTest(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(self.open_name, m_open, create=True):
check.buildpattern.default_pattern = "configure"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
@@ -106,13 +107,14 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with makecheck suite via Makefile.am
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['Makefile.am'])
m_open = mock_open()
with patch(self.open_name, m_open, create=True):
check.buildpattern.default_pattern = "configure_ac"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
@@ -123,11 +125,12 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with perlcheck suite
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['Makefile.PL'])
check.buildpattern.default_pattern = "cpan"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
self.assertEqual(check.tests_config, 'make TEST_VERBOSE=1 test')
@@ -136,6 +139,7 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with perlcheck suite via Makefile.in
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['Makefile.in'])
@@ -143,7 +147,7 @@ class TestTest(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(self.open_name, m_open, create=True):
check.buildpattern.default_pattern = "cpan"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
@@ -153,6 +157,7 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with setup.py suite
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['setup.py'])
@@ -160,7 +165,7 @@ class TestTest(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(self.open_name, m_open, create=True):
check.buildpattern.default_pattern = "distutils3"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
@@ -172,6 +177,7 @@ class TestTest(unittest.TestCase):
"""
Test scan_for_tests with cmake suite
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['CMakeLists.txt'])
@@ -179,7 +185,7 @@ class TestTest(unittest.TestCase):
m_open = mock_open(read_data=content)
with patch(self.open_name, m_open, create=True):
check.buildpattern.default_pattern = "cmake"
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
check.buildpattern.default_pattern = "make"
@@ -191,12 +197,13 @@ class TestTest(unittest.TestCase):
Test scan_for_tests with tox.ini in the files list, should add several
build requirements
"""
reqs = buildreq.Requirements("")
conf = config.Config()
listdir_backup = os.listdir
check.os.listdir = mock_generator(['tox.ini'])
check.scan_for_tests('pkgdir', conf)
check.scan_for_tests('pkgdir', conf, reqs)
check.os.listdir = listdir_backup
self.assertEqual(check.buildreq.buildreqs,
self.assertEqual(reqs.buildreqs,
set(['tox',
'pytest',
'virtualenv',
+2 -1
View File
@@ -1,5 +1,6 @@
import unittest
import buildreq
import config
import infile_update_spec
import specfiles
@@ -9,7 +10,7 @@ class TestUpdateSpecfile(unittest.TestCase):
def setUp(self):
# url, version, name, release
url = "http://www.testpkg.com/testpkg/pkg-1.0.tar.gz"
self.specfile = specfiles.Specfile(url, '1.1.1', 'test_pkg', '1', config.Config())
self.specfile = specfiles.Specfile(url, '1.1.1', 'test_pkg', '1', config.Config(), buildreq.Requirements(url))
self.bb_dict = {
"DEPENDS": "ncurses gettext-native",
+10 -8
View File
@@ -1,5 +1,6 @@
import unittest
import unittest.mock
import buildreq
import config
import specfiles
@@ -15,7 +16,8 @@ class TestSpecfileWrite(unittest.TestCase):
conf = config.Config()
conf.config_opts['dev_requires_extras'] = False
url = "http://www.testpkg.com/testpkg/pkg-1.0.tar.gz"
self.specfile = specfiles.Specfile(url, '1.0', 'pkg', '2', conf)
reqs = buildreq.Requirements(url)
self.specfile = specfiles.Specfile(url, '1.0', 'pkg', '2', conf, reqs)
def mock_write(string):
self.WRITES.append(string)
@@ -100,8 +102,8 @@ class TestSpecfileWrite(unittest.TestCase):
self.specfile.packages["autostart"] = ["autostart"]
self.specfile.packages["bin"] = []
self.specfile.packages["lib"] = ["package.so"]
self.specfile.requires.add("pkg1")
self.specfile.requires.add("pkg2")
self.specfile.requirements.requires.add("pkg1")
self.specfile.requirements.requires.add("pkg2")
self.specfile.config.config_opts['no_autostart'] = True
self.specfile.write_main_subpackage_requires()
expect = ["Requires: pkg-bin = %{version}-%{release}\n",
@@ -122,8 +124,8 @@ class TestSpecfileWrite(unittest.TestCase):
self.specfile.packages["ignore"] = []
self.specfile.packages["dev"] = []
self.specfile.packages["active-units"] = []
self.specfile.requires.add("pkg1")
self.specfile.requires.add("pkg2")
self.specfile.requirements.requires.add("pkg1")
self.specfile.requirements.requires.add("pkg2")
self.specfile.write_main_subpackage_requires()
expect = ["Requires: pkg-autostart = %{version}-%{release}\n",
"Requires: pkg-bin = %{version}-%{release}\n",
@@ -143,7 +145,7 @@ class TestSpecfileWrite(unittest.TestCase):
"""
test write_buildreq with unsorted list of build requirements.
"""
self.specfile.buildreqs = ["python", "ruby", "go"]
self.specfile.requirements.buildreqs = ["python", "ruby", "go"]
self.specfile.write_buildreq()
expect = ["BuildRequires : go\n",
"BuildRequires : python\n",
@@ -195,8 +197,8 @@ class TestSpecfileWrite(unittest.TestCase):
self.specfile.packages["python"] = ["pyfile1", "pyfile2"]
self.specfile.packages["dev"] = ["dev1", "dev2"]
self.specfile.packages["pack"] = ["packf1"]
self.specfile.requires = ["pep8", "pylint", "pycurl"]
self.specfile.buildreqs = ["pep8", "pycurl"]
self.specfile.requirements.requires = ["pep8", "pylint", "pycurl"]
self.specfile.requirements.buildreqs = ["pep8", "pycurl"]
self.specfile.write_files_header()
expect = ["\n%package data\n",
"Summary: data components for the pkg package.\n",