Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
cefd583c
Commit
cefd583c
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
67427930
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
272 additions
and
0 deletions
+272
-0
freeze.py
stbi/Lib/site-packages/pip/_internal/operations/freeze.py
+272
-0
No files found.
stbi/Lib/site-packages/pip/_internal/operations/freeze.py
0 → 100644
View file @
cefd583c
# The following comment should be removed at some point in the future.
# mypy: strict-optional=False
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
collections
import
logging
import
os
from
pip._vendor
import
six
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._vendor.pkg_resources
import
RequirementParseError
from
pip._internal.exceptions
import
BadCommand
,
InstallationError
from
pip._internal.req.constructors
import
(
install_req_from_editable
,
install_req_from_line
,
)
from
pip._internal.req.req_file
import
COMMENT_RE
from
pip._internal.utils.direct_url_helpers
import
(
direct_url_as_pep440_direct_reference
,
dist_get_direct_url
,
)
from
pip._internal.utils.misc
import
(
dist_is_editable
,
get_installed_distributions
,
)
from
pip._internal.utils.typing
import
MYPY_CHECK_RUNNING
if
MYPY_CHECK_RUNNING
:
from
typing
import
(
Iterator
,
Optional
,
List
,
Container
,
Set
,
Dict
,
Tuple
,
Iterable
,
Union
)
from
pip._internal.cache
import
WheelCache
from
pip._vendor.pkg_resources
import
(
Distribution
,
Requirement
)
RequirementInfo
=
Tuple
[
Optional
[
Union
[
str
,
Requirement
]],
bool
,
List
[
str
]]
logger
=
logging
.
getLogger
(
__name__
)
def
freeze
(
requirement
=
None
,
# type: Optional[List[str]]
find_links
=
None
,
# type: Optional[List[str]]
local_only
=
None
,
# type: Optional[bool]
user_only
=
None
,
# type: Optional[bool]
paths
=
None
,
# type: Optional[List[str]]
isolated
=
False
,
# type: bool
wheel_cache
=
None
,
# type: Optional[WheelCache]
exclude_editable
=
False
,
# type: bool
skip
=
()
# type: Container[str]
):
# type: (...) -> Iterator[str]
find_links
=
find_links
or
[]
for
link
in
find_links
:
yield
'-f {}'
.
format
(
link
)
installations
=
{}
# type: Dict[str, FrozenRequirement]
for
dist
in
get_installed_distributions
(
local_only
=
local_only
,
skip
=
(),
user_only
=
user_only
,
paths
=
paths
):
try
:
req
=
FrozenRequirement
.
from_dist
(
dist
)
except
RequirementParseError
as
exc
:
# We include dist rather than dist.project_name because the
# dist string includes more information, like the version and
# location. We also include the exception message to aid
# troubleshooting.
logger
.
warning
(
'Could not generate requirement for distribution
%
r:
%
s'
,
dist
,
exc
)
continue
if
exclude_editable
and
req
.
editable
:
continue
installations
[
req
.
canonical_name
]
=
req
if
requirement
:
# the options that don't get turned into an InstallRequirement
# should only be emitted once, even if the same option is in multiple
# requirements files, so we need to keep track of what has been emitted
# so that we don't emit it again if it's seen again
emitted_options
=
set
()
# type: Set[str]
# keep track of which files a requirement is in so that we can
# give an accurate warning if a requirement appears multiple times.
req_files
=
collections
.
defaultdict
(
list
)
# type: Dict[str, List[str]]
for
req_file_path
in
requirement
:
with
open
(
req_file_path
)
as
req_file
:
for
line
in
req_file
:
if
(
not
line
.
strip
()
or
line
.
strip
()
.
startswith
(
'#'
)
or
line
.
startswith
((
'-r'
,
'--requirement'
,
'-Z'
,
'--always-unzip'
,
'-f'
,
'--find-links'
,
'-i'
,
'--index-url'
,
'--pre'
,
'--trusted-host'
,
'--process-dependency-links'
,
'--extra-index-url'
))):
line
=
line
.
rstrip
()
if
line
not
in
emitted_options
:
emitted_options
.
add
(
line
)
yield
line
continue
if
line
.
startswith
(
'-e'
)
or
line
.
startswith
(
'--editable'
):
if
line
.
startswith
(
'-e'
):
line
=
line
[
2
:]
.
strip
()
else
:
line
=
line
[
len
(
'--editable'
):]
.
strip
()
.
lstrip
(
'='
)
line_req
=
install_req_from_editable
(
line
,
isolated
=
isolated
,
)
else
:
line_req
=
install_req_from_line
(
COMMENT_RE
.
sub
(
''
,
line
)
.
strip
(),
isolated
=
isolated
,
)
if
not
line_req
.
name
:
logger
.
info
(
"Skipping line in requirement file [
%
s] because "
"it's not clear what it would install:
%
s"
,
req_file_path
,
line
.
strip
(),
)
logger
.
info
(
" (add #egg=PackageName to the URL to avoid"
" this warning)"
)
else
:
line_req_canonical_name
=
canonicalize_name
(
line_req
.
name
)
if
line_req_canonical_name
not
in
installations
:
# either it's not installed, or it is installed
# but has been processed already
if
not
req_files
[
line_req
.
name
]:
logger
.
warning
(
"Requirement file [
%
s] contains
%
s, but "
"package
%
r is not installed"
,
req_file_path
,
COMMENT_RE
.
sub
(
''
,
line
)
.
strip
(),
line_req
.
name
)
else
:
req_files
[
line_req
.
name
]
.
append
(
req_file_path
)
else
:
yield
str
(
installations
[
line_req_canonical_name
])
.
rstrip
()
del
installations
[
line_req_canonical_name
]
req_files
[
line_req
.
name
]
.
append
(
req_file_path
)
# Warn about requirements that were included multiple times (in a
# single requirements file or in different requirements files).
for
name
,
files
in
six
.
iteritems
(
req_files
):
if
len
(
files
)
>
1
:
logger
.
warning
(
"Requirement
%
s included multiple times [
%
s]"
,
name
,
', '
.
join
(
sorted
(
set
(
files
))))
yield
(
'## The following requirements were added by '
'pip freeze:'
)
for
installation
in
sorted
(
installations
.
values
(),
key
=
lambda
x
:
x
.
name
.
lower
()):
if
installation
.
canonical_name
not
in
skip
:
yield
str
(
installation
)
.
rstrip
()
def
get_requirement_info
(
dist
):
# type: (Distribution) -> RequirementInfo
"""
Compute and return values (req, editable, comments) for use in
FrozenRequirement.from_dist().
"""
if
not
dist_is_editable
(
dist
):
return
(
None
,
False
,
[])
location
=
os
.
path
.
normcase
(
os
.
path
.
abspath
(
dist
.
location
))
from
pip._internal.vcs
import
vcs
,
RemoteNotFoundError
vcs_backend
=
vcs
.
get_backend_for_dir
(
location
)
if
vcs_backend
is
None
:
req
=
dist
.
as_requirement
()
logger
.
debug
(
'No VCS found for editable requirement "
%
s" in:
%
r'
,
req
,
location
,
)
comments
=
[
'# Editable install with no version control ({})'
.
format
(
req
)
]
return
(
location
,
True
,
comments
)
try
:
req
=
vcs_backend
.
get_src_requirement
(
location
,
dist
.
project_name
)
except
RemoteNotFoundError
:
req
=
dist
.
as_requirement
()
comments
=
[
'# Editable {} install with no remote ({})'
.
format
(
type
(
vcs_backend
)
.
__name__
,
req
,
)
]
return
(
location
,
True
,
comments
)
except
BadCommand
:
logger
.
warning
(
'cannot determine version of editable source in
%
s '
'(
%
s command not found in path)'
,
location
,
vcs_backend
.
name
,
)
return
(
None
,
True
,
[])
except
InstallationError
as
exc
:
logger
.
warning
(
"Error when trying to get requirement for VCS system
%
s, "
"falling back to uneditable format"
,
exc
)
else
:
if
req
is
not
None
:
return
(
req
,
True
,
[])
logger
.
warning
(
'Could not determine repository location of
%
s'
,
location
)
comments
=
[
'## !! Could not determine repository location'
]
return
(
None
,
False
,
comments
)
class
FrozenRequirement
(
object
):
def
__init__
(
self
,
name
,
req
,
editable
,
comments
=
()):
# type: (str, Union[str, Requirement], bool, Iterable[str]) -> None
self
.
name
=
name
self
.
canonical_name
=
canonicalize_name
(
name
)
self
.
req
=
req
self
.
editable
=
editable
self
.
comments
=
comments
@classmethod
def
from_dist
(
cls
,
dist
):
# type: (Distribution) -> FrozenRequirement
# TODO `get_requirement_info` is taking care of editable requirements.
# TODO This should be refactored when we will add detection of
# editable that provide .dist-info metadata.
req
,
editable
,
comments
=
get_requirement_info
(
dist
)
if
req
is
None
and
not
editable
:
# if PEP 610 metadata is present, attempt to use it
direct_url
=
dist_get_direct_url
(
dist
)
if
direct_url
:
req
=
direct_url_as_pep440_direct_reference
(
direct_url
,
dist
.
project_name
)
comments
=
[]
if
req
is
None
:
# name==version requirement
req
=
dist
.
as_requirement
()
return
cls
(
dist
.
project_name
,
req
,
editable
,
comments
=
comments
)
def
__str__
(
self
):
req
=
self
.
req
if
self
.
editable
:
req
=
'-e {}'
.
format
(
req
)
return
'
\n
'
.
join
(
list
(
self
.
comments
)
+
[
str
(
req
)])
+
'
\n
'
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment