def write_to_req_files(file_reqs, session, env_filename, uniq_reqs, installations): # first step process the requirements and split them into separate for each of the file for filename in file_reqs: # type: str _, content = get_file_content(filename, session=session) orig_lines = enumerate(content.splitlines(), start=1) joined_lines = req_file.join_lines(orig_lines) lines = OrderedDict(joined_lines) # 1. save new requirements if filename == env_filename: installed = set(installations.keys()).difference( set(uniq_reqs.keys())) for new_req in installed: line_num = len(lines) + 1 lines[line_num] = str(installations[new_req]).strip() for req in file_reqs[filename]: frozenrequirement = installations.get(req.name) if frozenrequirement: # 2. updates lines[req.line_num] = str(frozenrequirement).strip() else: # 3. removals lines.pop(req.line_num) # 4. finally write to file with open(filename, "wb") as f: for line in lines: cnt = lines[line].strip() if cnt: f.write((cnt + "\n").encode("utf-8"))
def parse_requirements(filename, finder=None, comes_from=None, options=None, session=None, constraint=False, wheel_cache=None): """Parse a requirements file and yield InstallRequirement instances. :param filename: Path or url of requirements file. :param finder: Instance of pip.index.PackageFinder. :param comes_from: Origin description of requirements. :param options: cli options. :param session: Instance of pip.download.PipSession. :param constraint: If true, parsing a constraint file rather than requirements file. :param wheel_cache: Instance of pip.wheel.WheelCache """ if session is None: raise TypeError( "parse_requirements() missing 1 required keyword argument: " "'session'" ) _, content = get_file_content( filename, comes_from=comes_from, session=session ) lines_enum = preprocess(content, options) for line_number, line in lines_enum: req_iter = process_line(line, filename, line_number, finder, comes_from, options, session, wheel_cache, constraint=constraint) for req in req_iter: yield req
def parse_requirements(filename, finder=None, comes_from=None, options=None, session=None, constraint=False, wheel_cache=None): """Parse a requirements file and yield InstallRequirement instances. :param filename: Path or url of requirements file. :param finder: Instance of pip.index.PackageFinder. :param comes_from: Origin description of requirements. :param options: cli options. :param session: Instance of pip.download.PipSession. :param constraint: If true, parsing a constraint file rather than requirements file. :param wheel_cache: Instance of pip.wheel.WheelCache """ if session is None: raise TypeError( "parse_requirements() missing 1 required keyword argument: " "'session'" ) _, content = get_file_content( filename, comes_from=comes_from, session=session ) lines_enum = preprocess(content, options) for line_number, line in lines_enum: req_iter = process_line(line, filename, line_number, finder, comes_from, options, session, wheel_cache, constraint=constraint) for req in req_iter: yield req
def get_requirements_and_latest(filename, force=False): """Parse a requirements file and get latest version for each requirement. Yields a tuple of (original line, InstallRequirement instance, spec_versions, latest_version). :param filename: Path to a requirements.txt file. :param force: Force getting latest version even for packages without a version specified. """ session = PipSession() finder = PackageFinder(session=session, find_links=[], index_urls=[PyPI.simple_url]) _, content = get_file_content(filename, session=session) for line_number, line, orig_line in yield_lines(content): line = req_file.COMMENT_RE.sub('', line) line = line.strip() req = parse_requirement_line(line, filename, line_number, session, finder) if req is None or req.name is None or req_file.SCHEME_RE.match( req.name): yield (orig_line, None, None, None) continue spec_ver = current_version(req) if spec_ver or force: latest_ver = latest_version(req, session, finder) yield (orig_line, req, spec_ver, latest_ver)
def _get_requirements_and_latest(filename, force=False, minor=[], patch=[], pre=[]): """Parse a requirements file and get latest version for each requirement. Yields a tuple of (original line, InstallRequirement instance, spec_versions, latest_version). :param filename: Path to a requirements.txt file. :param force: Force getting latest version even for packages without a version specified. :param minor: List of packages to only update minor and patch versions, never major. :param patch: List of packages to only update patch versions, never minor or major. :param pre: List of packages to allow updating to pre-release versions. """ session = PipSession() finder = PackageFinder( session=session, find_links=[], index_urls=[PyPI.simple_url]) _, content = get_file_content(filename, session=session) for line_number, line, orig_line in yield_lines(content): line = req_file.COMMENT_RE.sub('', line) line = line.strip() req = parse_requirement_line(line, filename, line_number, session, finder) if req is None or req.name is None or req_file.SCHEME_RE.match(req.name): yield (orig_line, None, None, None) continue spec_ver = current_version(req) if spec_ver or force: latest_ver = latest_version(req, spec_ver, session, finder, minor=minor, patch=patch, pre=pre) yield (orig_line, req, spec_ver, latest_ver)
def _get_requirements_and_latest( filename, force=False, minor=[], patch=[], pre=[], index_urls=[], verify=None): """Parse a requirements file and get latest version for each requirement. Yields a tuple of (original line, InstallRequirement instance, spec_versions, latest_version). :param filename: Path to a requirements.txt file. :param force: Force getting latest version even for packages without a version specified. :param minor: List of packages to only update minor and patch versions, never major. :param patch: List of packages to only update patch versions, never minor or major. :param pre: List of packages to allow updating to pre-release versions. :param index_urls: List of base URLs of the Python Package Index. :param verify: Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to None. """ session = PipSession() if verify: session.verify = verify finder = PackageFinder( session=session, find_links=[], index_urls=index_urls or [PyPI.simple_url], ) _, content = get_file_content(filename, session=session) for line_number, line, orig_line in yield_lines(content): line = req_file.COMMENT_RE.sub('', line) line = line.strip() req = parse_requirement_line(line, filename, line_number, session, finder) if req is None or req.name is None or req_file.SCHEME_RE.match(req.name): yield (orig_line, None, None, None) continue spec_ver = current_version(req) if spec_ver or force: latest_ver = latest_version(req, spec_ver, session, finder, minor=minor, patch=patch, pre=pre) yield (orig_line, req, spec_ver, latest_ver)
def parse_requirements( filename, # type: str finder=None, # type: Optional[PackageFinder] comes_from=None, # type: Optional[str] options=None, # type: Optional[optparse.Values] session=None, # type: Optional[PipSession] constraint=False, # type: bool wheel_cache=None, # type: Optional[WheelCache] use_pep517=None, # type: Optional[bool] ): # type: (...) -> Iterator[InstallRequirement] """Parse a requirements file and yield InstallRequirement instances. :param filename: Path or url of requirements file. :param finder: Instance of pip.index.PackageFinder. :param comes_from: Origin description of requirements. :param options: cli options. :param session: Instance of pip.download.PipSession. :param constraint: If true, parsing a constraint file rather than requirements file. :param wheel_cache: Instance of pip.wheel.WheelCache :param use_pep517: Value of the --use-pep517 option. """ if session is None: raise TypeError( "parse_requirements() missing 1 required keyword argument: " "'session'") _, content = get_file_content(filename, comes_from=comes_from, session=session) lines_enum = preprocess(content, options) for line_number, line in lines_enum: req_iter = process_line( line, filename, line_number, finder, comes_from, options, session, wheel_cache, use_pep517=use_pep517, constraint=constraint, ) for req in req_iter: yield req
def parse_requirements( filename, # type: str finder=None, # type: Optional[PackageFinder] comes_from=None, # type: Optional[str] options=None, # type: Optional[optparse.Values] session=None, # type: Optional[PipSession] constraint=False, # type: bool wheel_cache=None, # type: Optional[WheelCache] use_pep517=None # type: Optional[bool] ): # type: (...) -> Iterator[InstallRequirement] """Parse a requirements file and yield InstallRequirement instances. :param filename: Path or url of requirements file. :param finder: Instance of pip.index.PackageFinder. :param comes_from: Origin description of requirements. :param options: cli options. :param session: Instance of pip.download.PipSession. :param constraint: If true, parsing a constraint file rather than requirements file. :param wheel_cache: Instance of pip.wheel.WheelCache :param use_pep517: Value of the --use-pep517 option. """ if session is None: raise TypeError( "parse_requirements() missing 1 required keyword argument: " "'session'" ) _, content = get_file_content( filename, comes_from=comes_from, session=session ) lines_enum = preprocess(content, options) for line_number, line in lines_enum: req_iter = process_line(line, filename, line_number, finder, comes_from, options, session, wheel_cache, use_pep517=use_pep517, constraint=constraint) for req in req_iter: yield req