Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
_requirestxt.py130 linesDownload Raw Back to command
1"""Helper code used to generate ``requires.txt`` files in the egg-info directory.2 3The ``requires.txt`` file has an specific format:4    - Environment markers need to be part of the section headers and5      should not be part of the requirement spec itself.6 7See https://setuptools.pypa.io/en/latest/deprecated/python_eggs.html#requires-txt8"""9 10import io11from collections import defaultdict12from itertools import filterfalse13from typing import Dict, List, Tuple, Mapping, TypeVar14 15from .. import _reqs16from ..extern.jaraco.text import yield_lines17from ..extern.packaging.requirements import Requirement18 19 20# dict can work as an ordered set21_T = TypeVar("_T")22_Ordered = Dict[_T, None]23_ordered = dict24_StrOrIter = _reqs._StrOrIter25 26 27def _prepare(28    install_requires: _StrOrIter, extras_require: Mapping[str, _StrOrIter]29) -> Tuple[List[str], Dict[str, List[str]]]:30    """Given values for ``install_requires`` and ``extras_require``31    create modified versions in a way that can be written in ``requires.txt``32    """33    extras = _convert_extras_requirements(extras_require)34    return _move_install_requirements_markers(install_requires, extras)35 36 37def _convert_extras_requirements(38    extras_require: Mapping[str, _StrOrIter],39) -> Mapping[str, _Ordered[Requirement]]:40    """41    Convert requirements in `extras_require` of the form42    `"extra": ["barbazquux; {marker}"]` to43    `"extra:{marker}": ["barbazquux"]`.44    """45    output: Mapping[str, _Ordered[Requirement]] = defaultdict(dict)46    for section, v in extras_require.items():47        # Do not strip empty sections.48        output[section]49        for r in _reqs.parse(v):50            output[section + _suffix_for(r)].setdefault(r)51 52    return output53 54 55def _move_install_requirements_markers(56    install_requires: _StrOrIter, extras_require: Mapping[str, _Ordered[Requirement]]57) -> Tuple[List[str], Dict[str, List[str]]]:58    """59    The ``requires.txt`` file has an specific format:60        - Environment markers need to be part of the section headers and61          should not be part of the requirement spec itself.62 63    Move requirements in ``install_requires`` that are using environment64    markers ``extras_require``.65    """66 67    # divide the install_requires into two sets, simple ones still68    # handled by install_requires and more complex ones handled by extras_require.69 70    inst_reqs = list(_reqs.parse(install_requires))71    simple_reqs = filter(_no_marker, inst_reqs)72    complex_reqs = filterfalse(_no_marker, inst_reqs)73    simple_install_requires = list(map(str, simple_reqs))74 75    for r in complex_reqs:76        extras_require[':' + str(r.marker)].setdefault(r)77 78    expanded_extras = dict(79        # list(dict.fromkeys(...))  ensures a list of unique strings80        (k, list(dict.fromkeys(str(r) for r in map(_clean_req, v))))81        for k, v in extras_require.items()82    )83 84    return simple_install_requires, expanded_extras85 86 87def _suffix_for(req):88    """Return the 'extras_require' suffix for a given requirement."""89    return ':' + str(req.marker) if req.marker else ''90 91 92def _clean_req(req):93    """Given a Requirement, remove environment markers and return it"""94    r = Requirement(str(req))  # create a copy before modifying95    r.marker = None96    return r97 98 99def _no_marker(req):100    return not req.marker101 102 103def _write_requirements(stream, reqs):104    lines = yield_lines(reqs or ())105 106    def append_cr(line):107        return line + '\n'108 109    lines = map(append_cr, lines)110    stream.writelines(lines)111 112 113def write_requirements(cmd, basename, filename):114    dist = cmd.distribution115    data = io.StringIO()116    install_requires, extras_require = _prepare(117        dist.install_requires or (), dist.extras_require or {}118    )119    _write_requirements(data, install_requires)120    for extra in sorted(extras_require):121        data.write('\n[{extra}]\n'.format(**vars()))122        _write_requirements(data, extras_require[extra])123    cmd.write_or_delete_file("requirements", filename, data.getvalue())124 125 126def write_setup_requirements(cmd, basename, filename):127    data = io.StringIO()128    _write_requirements(data, cmd.distribution.setup_requires)129    cmd.write_or_delete_file("setup-requirements", filename, data.getvalue())130 
codekingpro/portable-devtools · Team Ai