|
2 | 2 |
|
3 | 3 | from typing import Any |
4 | 4 |
|
| 5 | +from packaging.requirements import Requirement |
| 6 | + |
| 7 | +from cppython.core.exception import ConfigException |
5 | 8 | from cppython.core.schema import CorePluginData |
6 | 9 | from cppython.plugins.vcpkg.schema import ( |
7 | 10 | Manifest, |
@@ -54,11 +57,44 @@ def resolve_vcpkg_data(data: dict[str, Any], core_data: CorePluginData) -> Vcpkg |
54 | 57 | modified_install_directory.mkdir(parents=True, exist_ok=True) |
55 | 58 |
|
56 | 59 | vcpkg_dependencies: list[VcpkgDependency] = [] |
57 | | - for dependency in parsed_data.dependencies: |
58 | | - vcpkg_dependency = VcpkgDependency(name=dependency.name) |
59 | | - vcpkg_dependencies.append(vcpkg_dependency) |
| 60 | + for requirement in core_data.cppython_data.dependencies: |
| 61 | + resolved_dependency = resolve_vcpkg_dependency(requirement) |
| 62 | + vcpkg_dependencies.append(resolved_dependency) |
60 | 63 |
|
61 | 64 | return VcpkgData( |
62 | 65 | install_directory=modified_install_directory, |
63 | 66 | dependencies=vcpkg_dependencies, |
64 | 67 | ) |
| 68 | + |
| 69 | + |
| 70 | +def resolve_vcpkg_dependency(requirement: Requirement) -> VcpkgDependency: |
| 71 | + """Resolve a VcpkgDependency from a packaging requirement. |
| 72 | +
|
| 73 | + Args: |
| 74 | + requirement: A packaging requirement object. |
| 75 | +
|
| 76 | + Returns: |
| 77 | + A resolved VcpkgDependency object. |
| 78 | + """ |
| 79 | + specifiers = requirement.specifier |
| 80 | + |
| 81 | + # If the length of specifiers is greater than one, raise a configuration error |
| 82 | + if len(specifiers) > 1: |
| 83 | + raise ConfigException('Multiple specifiers are not supported. Please provide a single specifier.', []) |
| 84 | + |
| 85 | + # Extract the version from the single specifier |
| 86 | + version = None |
| 87 | + if len(specifiers) == 1: |
| 88 | + specifier = next(iter(specifiers)) |
| 89 | + if specifier.operator != '>=': |
| 90 | + raise ConfigException(f"Unsupported specifier '{specifier.operator}'. Only '>=' is supported.", []) |
| 91 | + version = specifier.version |
| 92 | + |
| 93 | + return VcpkgDependency( |
| 94 | + name=requirement.name, |
| 95 | + default_features=True, |
| 96 | + features=[], |
| 97 | + version=version, |
| 98 | + platform=None, |
| 99 | + host=False, |
| 100 | + ) |
0 commit comments