dd50ac6352
The problem of integration tests was that they use their own requirements.txt that is unable to auto-sync with global requirements. This patch removes dedicated requirements.txt and replaces it with a stub file listing names (and possibly versions) of the packages needed. Then a special script parses this stub file, and for every package that is present in main project requirements files it pulls the versions from main project requirements, generating and installing requirements for the integration tests on the fly. This will help keeping requirements for the integration tests always in sync with main project requirements. Change-Id: Ie79338cc10cc101fbf15b51c7923e3a7b8e4fbb4 Closes-Bug: #1490866
67 lines
2.5 KiB
Python
Executable File
67 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Generate and install requirements from stub file and source files."""
|
|
|
|
import argparse
|
|
import subprocess
|
|
import sys
|
|
|
|
import pip
|
|
|
|
parser = argparse.ArgumentParser(description='Sync requirements.')
|
|
parser.add_argument('--stub', metavar='STUBFILE',
|
|
required=True,
|
|
help="File with requirements stubs.")
|
|
parser.add_argument('--source', metavar='SOURCE',
|
|
required=True, action='append',
|
|
help="Source file to sync requirements from. "
|
|
"May be supplied several times.")
|
|
parser.add_argument('-t', '--target', metavar='TARGET',
|
|
required=True,
|
|
help="Target file to write synced requirements to.")
|
|
parser.add_argument('pipopts', metavar='PIP OPTIONS',
|
|
nargs=argparse.REMAINDER,
|
|
help='Options to pass to "pip install".')
|
|
|
|
args = parser.parse_args()
|
|
|
|
sources = {}
|
|
for requirements_file in args.source:
|
|
rqs = pip.req.req_file.parse_requirements(requirements_file,
|
|
session=False)
|
|
sources.update({s.name: s for s in rqs})
|
|
stubs = list(pip.req.req_file.parse_requirements(args.stub,
|
|
session=False))
|
|
reqs = []
|
|
for r in stubs:
|
|
if r.name in sources:
|
|
# safe-guard for future additions to stub file
|
|
if r.specifier:
|
|
sys.exit("ERROR: package '%(pkg)s' in stub file %(stub)s "
|
|
"has version specified but is also present "
|
|
"in provided sources requirements. "
|
|
"Please remove version from the stub file." % {
|
|
'pkg': r.name, 'stub': args.stub})
|
|
reqs.append(sources[r.name])
|
|
else:
|
|
reqs.append(r)
|
|
|
|
with open(args.target, 'w') as target:
|
|
target.write('\n'.join([str(r.req) for r in reqs]))
|
|
|
|
pip_install = ['pip', 'install', '-r', args.target]
|
|
pip_install.extend(args.pipopts)
|
|
|
|
sys.exit(subprocess.call(pip_install))
|