91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
# encoding: utf-8
|
|
|
|
# This file is part of requirements-parser library.
|
|
#
|
|
# 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.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import os
|
|
import warnings
|
|
from typing import Iterator, TextIO, Union
|
|
|
|
from .requirement import Requirement
|
|
|
|
_UNSUPPORTED_OPTIONS = {
|
|
'-c': 'Unused option -c (constraint). Skipping.',
|
|
'--constraint': 'Unused option -c (constraint). Skipping.',
|
|
'-r': 'Unused option -r (requirement). Skipping.',
|
|
'--requirement': 'Unused option -r (requirement). Skipping.',
|
|
'--no-binary': 'Unused option --no-binary. Skipping',
|
|
'--only-binary': 'Unused option --only-binary. Skipping',
|
|
'--prefer-binary': 'Unused option --prefer-binary. Skipping',
|
|
'--require-hashes': 'Unused option --require-hashes. Skipping',
|
|
'--pre': 'Unused option --pre. Skipping',
|
|
'--trusted-host': 'Unused option --trusted-host. Skipping',
|
|
'--use-feature': 'Unused option --use-feature. Skipping',
|
|
'-Z': 'Unused option -Z (always-unzip). Skipping.',
|
|
'--always-unzip': 'Unused option --always-unzip. Skipping.'
|
|
}
|
|
|
|
|
|
def parse(reqstr: Union[str, TextIO]) -> Iterator[Requirement]:
|
|
"""
|
|
Parse a requirements file into a list of Requirements
|
|
|
|
See: pip/req.py:parse_requirements()
|
|
|
|
:param reqstr: a string or file like object containing requirements
|
|
:returns: a *generator* of Requirement objects
|
|
"""
|
|
filename = getattr(reqstr, 'name', None)
|
|
|
|
# Python 3.x only
|
|
if not isinstance(reqstr, str):
|
|
reqstr = reqstr.read()
|
|
|
|
for line in reqstr.splitlines():
|
|
line = line.strip()
|
|
|
|
if line == '':
|
|
continue
|
|
elif not line or line.startswith('#'):
|
|
# comments are lines that start with # only
|
|
continue
|
|
elif not line or line.startswith('--hash='):
|
|
# hashes are lines that start with --hash=
|
|
continue
|
|
elif line.startswith(('-r', '--requirement')):
|
|
_, new_filename = line.split()
|
|
new_file_path = os.path.join(os.path.dirname(filename or '.'),
|
|
new_filename)
|
|
with open(new_file_path) as f:
|
|
for requirement in parse(f):
|
|
yield requirement
|
|
elif line.startswith('-f') or line.startswith('--find-links') or \
|
|
line.startswith('-i') or line.startswith('--index-url') or \
|
|
line.startswith('--extra-index-url') or \
|
|
line.startswith('--no-index'):
|
|
warnings.warn('Private repos not supported. Skipping.', stacklevel=2)
|
|
continue
|
|
else:
|
|
unsupported: bool = False
|
|
for param in _UNSUPPORTED_OPTIONS.keys():
|
|
if line.startswith(param):
|
|
warnings.warn(str(_UNSUPPORTED_OPTIONS.get(param)), stacklevel=2)
|
|
unsupported = True
|
|
|
|
# Otherwise, parse it
|
|
if not unsupported:
|
|
yield Requirement.parse(line)
|