| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # Copyright 2020 The HuggingFace Team. All rights reserved.
- #
- # 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.
- """
- Utilities for working with package versions
- """
- import importlib.metadata
- import operator
- import re
- import sys
- from typing import Optional
- from packaging import version
- ops = {
- "<": operator.lt,
- "<=": operator.le,
- "==": operator.eq,
- "!=": operator.ne,
- ">=": operator.ge,
- ">": operator.gt,
- }
- def _compare_versions(op, got_ver, want_ver, requirement, pkg, hint):
- if got_ver is None or want_ver is None:
- raise ValueError(
- f"Unable to compare versions for {requirement}: need={want_ver} found={got_ver}. This is unusual. Consider"
- f" reinstalling {pkg}."
- )
- if not ops[op](version.parse(got_ver), version.parse(want_ver)):
- raise ImportError(
- f"{requirement} is required for a normal functioning of this module, but found {pkg}=={got_ver}.{hint}"
- )
- def require_version(requirement: str, hint: Optional[str] = None) -> None:
- """
- Perform a runtime check of the dependency versions, using the exact same syntax used by pip.
- The installed module version comes from the *site-packages* dir via *importlib.metadata*.
- Args:
- requirement (`str`): pip style definition, e.g., "tokenizers==0.9.4", "tqdm>=4.27", "numpy"
- hint (`str`, *optional*): what suggestion to print in case of requirements not being met
- Example:
- ```python
- require_version("pandas>1.1.2")
- require_version("numpy>1.18.5", "this is important to have for whatever reason")
- ```"""
- hint = f"\n{hint}" if hint is not None else ""
- # non-versioned check
- if re.match(r"^[\w_\-\d]+$", requirement):
- pkg, op, want_ver = requirement, None, None
- else:
- match = re.findall(r"^([^!=<>\s]+)([\s!=<>]{1,2}.+)", requirement)
- if not match:
- raise ValueError(
- "requirement needs to be in the pip package format, .e.g., package_a==1.23, or package_b>=1.23, but"
- f" got {requirement}"
- )
- pkg, want_full = match[0]
- want_range = want_full.split(",") # there could be multiple requirements
- wanted = {}
- for w in want_range:
- match = re.findall(r"^([\s!=<>]{1,2})(.+)", w)
- if not match:
- raise ValueError(
- "requirement needs to be in the pip package format, .e.g., package_a==1.23, or package_b>=1.23,"
- f" but got {requirement}"
- )
- op, want_ver = match[0]
- wanted[op] = want_ver
- if op not in ops:
- raise ValueError(f"{requirement}: need one of {list(ops.keys())}, but got {op}")
- # special case
- if pkg == "python":
- got_ver = ".".join([str(x) for x in sys.version_info[:3]])
- for op, want_ver in wanted.items():
- _compare_versions(op, got_ver, want_ver, requirement, pkg, hint)
- return
- # check if any version is installed
- try:
- got_ver = importlib.metadata.version(pkg)
- except importlib.metadata.PackageNotFoundError:
- raise importlib.metadata.PackageNotFoundError(
- f"The '{requirement}' distribution was not found and is required by this application. {hint}"
- )
- # check that the right version is installed if version number or a range was provided
- if want_ver is not None:
- for op, want_ver in wanted.items():
- _compare_versions(op, got_ver, want_ver, requirement, pkg, hint)
- def require_version_core(requirement):
- """require_version wrapper which emits a core-specific hint on failure"""
- hint = "Try: `pip install transformers -U` or `pip install -e '.[dev]'` if you're working with git main"
- return require_version(requirement, hint)
|