diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bf018ccdfedb48b6bfe927483242fa44cb888251..ecdfbb702bb0a460f5d11e694c9c08d8f5ca3526 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,3 +6,12 @@ mdcheck: image: it4innovations/docker-mdcheck:latest script: - mdl *.md + +pylint: + stage: test + image: it4innovations/docker-pycheck:latest + script: + - export PYTHONIOENCODING=UTF-8 + - export LC_CTYPE=en_US.UTF-8 + - if [ -f pip-upgradedependencies.egg-info/requires.txt ]; then pip install $(paste -d " " -s pip-upgradedependencies.egg-info/requires.txt); fi + - pylint $(find . -type f -name "*.py") diff --git a/pip-upgradedependencies.py b/pip-upgradedependencies.py new file mode 100644 index 0000000000000000000000000000000000000000..37af0e0257ea12bd1dc308596aeeaf86e974a032 --- /dev/null +++ b/pip-upgradedependencies.py @@ -0,0 +1,74 @@ +import argparse +import json +import os +import re +import subprocess +import sys + +def find_dependencies(json_input, package): + if isinstance(json_input, dict): + keys = json_input.keys() + if 'package_name' in keys and 'required_version' in keys: + if re.search(r'^%s$' % package, json_input['package_name'], re.IGNORECASE): + yield json_input['required_version'] + for child_val in find_dependencies(json_input['dependencies'], package): + yield child_val + elif isinstance(json_input, list): + for item in json_input: + for item_val in find_dependencies(item, package): + yield item_val +def arg_parse(): + parser = argparse.ArgumentParser(description="Pip-upgradedependencies upgrades all outdated packages with respect to existing dependencies.") + parser_args = parser.parse_args() + +def main(): + os.environ["PYTHONWARNINGS"] = "ignore:DEPRECATION" + + try: + subprocess.check_call(["pip", "install", "--upgrade", "pip"], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError: + sys.exit(1) + + finished_upgrades = [] + while True: + try: + outdated_packages = subprocess.check_output(["pip", "list", "--outdated"], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError: + sys.exit(1) + outdated_packages = [line.split()[0] for line in outdated_packages.strip().split("\n")[2:]] + + try: + pipdeptree = subprocess.check_output(["pipdeptree", "--json-tree"], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError: + sys.exit(1) + pipdeptree = pipdeptree.strip() + jsonpipdeptree = json.loads(pipdeptree) + + possible_upgrades = [] + for package in outdated_packages: + if package in finished_upgrades: + continue + package_dependencies = [ _ for _ in find_dependencies(jsonpipdeptree, package)] + package_dependencies = list(set(package_dependencies)) + if len(filter(lambda dependency: re.search(r'(^==.*|^\d.*)', dependency), package_dependencies)) == 0: + possible_upgrades.append({'package': package, 'dependencies': [ dependency for dependency in package_dependencies if 'Any' not in dependency]}) + + try: + package = possible_upgrades[-1] + except IndexError: + break + finished_upgrades.append(package['package']) + + try: + subprocess.check_call(["pip", "install", "--upgrade", "%s%s" % (package['package'], "".join(package['dependencies']))], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError: + sys.exit(1) + + if len(possible_upgrades) == len(finished_upgrades): + break + + print "Done." + +if __name__ == "__main__": + arg_parse() + main()