File size: 2,664 Bytes
e69a9f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os
import sys
import pkg_resources
import argparse

# Parse command line arguments
parser = argparse.ArgumentParser(description="Validate that requirements are satisfied.")
parser.add_argument('-r', '--requirements', type=str, default='requirements.txt', help="Path to the requirements file.")
args = parser.parse_args()

print("Validating that requirements are satisfied.")

# Load the requirements from the specified requirements file
with open(args.requirements) as f:
    requirements = f.readlines()

# Check each requirement against the installed packages
missing_requirements = []
wrong_version_requirements = []
for requirement in requirements:
    requirement = requirement.strip()
    if requirement == ".":
        # Skip the current requirement if it is a dot (.)
        continue
    try:
        pkg_resources.require(requirement)
    except pkg_resources.DistributionNotFound:
        # Check if the requirement contains a VCS URL
        if "@" in requirement:
            # If it does, split the requirement into two parts: the package name and the VCS URL
            package_name, vcs_url = requirement.split("@", 1)
            # Use pip to install the package from the VCS URL
            os.system(f"pip install -e {vcs_url}")
            # Try to require the package again
            try:
                pkg_resources.require(package_name)
            except pkg_resources.DistributionNotFound:
                missing_requirements.append(requirement)
        else:
            missing_requirements.append(requirement)
    except pkg_resources.VersionConflict as e:
        wrong_version_requirements.append((requirement, str(e.req), e.dist.version))

# If there are any missing or wrong version requirements, print an error message and exit with a non-zero exit code
if missing_requirements or wrong_version_requirements:
    if missing_requirements:
        print("Error: The following packages are missing:")
        for requirement in missing_requirements:
            print(f" - {requirement}")
    if wrong_version_requirements:
        print("Error: The following packages have the wrong version:")
        for requirement, expected_version, actual_version in wrong_version_requirements:
            print(f" - {requirement} (expected version {expected_version}, found version {actual_version})")
    upgrade_script = "upgrade.ps1" if os.name == "nt" else "upgrade.sh"
    print(f"\nRun \033[33m{upgrade_script}\033[0m or \033[33mpip install -U -r {args.requirements}\033[0m to resolve the missing requirements listed above...")

    sys.exit(1)

# All requirements satisfied
print("All requirements satisfied.")
sys.exit(0)