Spaces:
Runtime error
Runtime error
| """ Parse requirements.txt and pyproject.toml and move versions to pyproject.toml """ | |
| from pathlib import Path | |
| import re | |
| import sys | |
| import toml | |
| def get_requirement_versions(path='requirements.txt'): | |
| """ Read requirements.txt file and return dict of package versions """ | |
| path = Path(path or '') | |
| if path.is_dir(): | |
| path = next(iter(path.glob('**/requirements.txt'))) | |
| reqdict = {} | |
| text = Path(path).open().read() | |
| for line in text.splitlines(): | |
| if line.strip(): | |
| match = re.match(r'([-_a-zA-Z0-9]+)\s*([ >=<~^,.rabc0-9]+)\s*', line) | |
| if match: | |
| name, ver = match.groups() | |
| reqdict[name] = ver | |
| return reqdict | |
| def normalize_name(name): | |
| return str(name).strip().replace('_', '-').replace(' ', '-').lower() | |
| def pin_versions(pyproject='pyproject.toml', reqdict=None, overwrite=False): | |
| if not reqdict or isinstance(reqdict, (str, Path)): | |
| reqdict = get_requirement_versions(path=reqdict) | |
| reqdict = { | |
| normalize_name(k): v for (k, v) in | |
| reqdict.items() | |
| } | |
| pyproj = toml.load(pyproject) | |
| depdict = pyproj.get('tool', {}).get('poetry', {}).get('dependencies', {}) | |
| depdict = { | |
| normalize_name(k): v for (k, v) in | |
| depdict.items() | |
| } | |
| for name, spec in reqdict.items(): | |
| if name in depdict: | |
| ver = depdict[name] | |
| if isinstance(ver, str) and (overwrite or ver == '*'): | |
| depdict[name] = spec | |
| pyproj['tool']['poetry']['dependencies'] = depdict | |
| overwrite = overwrite or (input(f'Overwrite {pyproject}?')[0].lower() == 'y') | |
| if overwrite: | |
| with open(pyproject, 'w') as stream: | |
| toml.dump(pyproj, stream) | |
| return pyproj | |
| if __name__ == '__main__': | |
| path = 'requirements.txt' | |
| if sys.argv[1:]: | |
| path = sys.argv[1] | |
| pyproj = pin_versions(reqdict=path) | |
| print(toml.dumps(pyproj)) | |