Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
后端镜像
Pdm
提交
d4ca501f
P
Pdm
项目概览
后端镜像
/
Pdm
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Pdm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d4ca501f
编写于
12月 18, 2020
作者:
F
Frost Ming
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
reuse cached wheels
上级
ec8d0023
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
85 addition
and
30 deletion
+85
-30
news/200.feature
news/200.feature
+1
-0
pdm/cli/actions.py
pdm/cli/actions.py
+3
-5
pdm/cli/commands/show.py
pdm/cli/commands/show.py
+3
-3
pdm/cli/utils.py
pdm/cli/utils.py
+3
-5
pdm/formats/base.py
pdm/formats/base.py
+8
-3
pdm/formats/flit.py
pdm/formats/flit.py
+2
-2
pdm/formats/legacy.py
pdm/formats/legacy.py
+8
-4
pdm/formats/poetry.py
pdm/formats/poetry.py
+8
-2
pdm/models/environment.py
pdm/models/environment.py
+17
-1
pdm/models/project_info.py
pdm/models/project_info.py
+1
-1
pdm/models/requirements.py
pdm/models/requirements.py
+26
-1
pdm/project/core.py
pdm/project/core.py
+1
-1
pdm/project/metadata.py
pdm/project/metadata.py
+3
-1
tests/cli/test_actions.py
tests/cli/test_actions.py
+1
-1
未找到文件。
news/200.feature
0 → 100644
浏览文件 @
d4ca501f
Reuse
the
cached
built
wheels
to
accelerate
the
installation.
pdm/cli/actions.py
浏览文件 @
d4ca501f
...
...
@@ -18,7 +18,7 @@ from pdm.cli.utils import (
)
from
pdm.exceptions
import
NoPythonVersion
,
PdmUsageError
,
ProjectError
from
pdm.formats
import
FORMATS
from
pdm.formats.base
import
array_of_inline_tables
from
pdm.formats.base
import
array_of_inline_tables
,
make_inline_table
from
pdm.installers.installers
import
format_dist
from
pdm.iostream
import
LOCK
,
stream
from
pdm.models.builders
import
EnvBuilder
...
...
@@ -362,24 +362,22 @@ def do_init(
python_requires
:
str
=
""
,
)
->
None
:
"""Bootstrap the project and create a pyproject.toml"""
import
tomlkit
data
=
{
"project"
:
{
"name"
:
name
,
"version"
:
version
,
"description"
:
""
,
"authors"
:
array_of_inline_tables
([{
"name"
:
author
,
"email"
:
email
}]),
"license"
:
tomlkit
.
inline_table
({
"text"
:
license
}),
"license"
:
make_
inline_table
({
"text"
:
license
}),
"urls"
:
{
"homepage"
:
""
},
"dependencies"
:
[],
"dev-dependencies"
:
[],
"requires-python"
:
python_requires
,
},
"build-system"
:
{
"requires"
:
[
"pdm-pep517"
],
"build-backend"
:
"pdm.pep517.api"
},
}
if
python_requires
and
python_requires
!=
"*"
:
get_specifier
(
python_requires
)
data
[
"requires-python"
]
=
python_requires
if
not
project
.
pyproject
:
project
.
_pyproject
=
data
else
:
...
...
pdm/cli/commands/show.py
浏览文件 @
d4ca501f
...
...
@@ -5,7 +5,7 @@ from pip._vendor.pkg_resources import safe_name
from
pdm.cli.commands.base
import
BaseCommand
from
pdm.iostream
import
stream
from
pdm.models.candidates
import
Candidate
from
pdm.models.
metadata
import
Metadata
from
pdm.models.
project_info
import
ProjectInfo
from
pdm.models.requirements
import
parse_requirement
from
pdm.project
import
Project
...
...
@@ -43,9 +43,9 @@ class Command(BaseCommand):
metadata
=
latest
.
get_metadata
()
if
metadata
.
_legacy
:
result
=
Metadata
(
dict
(
metadata
.
_legacy
.
items
()),
True
)
result
=
ProjectInfo
(
dict
(
metadata
.
_legacy
.
items
()),
True
)
else
:
result
=
Metadata
(
dict
(
metadata
.
_data
),
False
)
result
=
ProjectInfo
(
dict
(
metadata
.
_data
),
False
)
if
latest_stable
:
result
.
latest_stable_version
=
str
(
latest_stable
.
version
)
if
installed
:
...
...
pdm/cli/utils.py
浏览文件 @
d4ca501f
...
...
@@ -13,6 +13,7 @@ from resolvelib.structs import DirectedGraph
from
pdm.exceptions
import
ProjectError
from
pdm.formats
import
FORMATS
from
pdm.formats.base
import
make_inline_table
from
pdm.iostream
import
stream
from
pdm.models.environment
import
WorkingSet
from
pdm.models.requirements
import
Requirement
,
strip_extras
...
...
@@ -332,9 +333,7 @@ def format_lockfile(mapping, fetched_dependencies, summary_collection):
for
r
in
fetched_dependencies
[
k
].
values
():
name
,
req
=
r
.
as_req_dict
()
if
getattr
(
req
,
"items"
,
None
)
is
not
None
:
inline
=
tomlkit
.
inline_table
()
inline
.
update
(
req
)
deps
.
add
(
name
,
inline
)
deps
.
add
(
name
,
make_inline_table
(
req
))
else
:
deps
.
add
(
name
,
req
)
if
len
(
deps
)
>
0
:
...
...
@@ -345,8 +344,7 @@ def format_lockfile(mapping, fetched_dependencies, summary_collection):
array
=
tomlkit
.
array
()
array
.
multiline
(
True
)
for
filename
,
hash_value
in
v
.
hashes
.
items
():
inline
=
tomlkit
.
inline_table
()
inline
.
update
({
"file"
:
filename
,
"hash"
:
hash_value
})
inline
=
make_inline_table
({
"file"
:
filename
,
"hash"
:
hash_value
})
array
.
append
(
inline
)
if
array
:
file_hashes
.
add
(
key
,
array
)
...
...
pdm/formats/base.py
浏览文件 @
d4ca501f
...
...
@@ -79,13 +79,18 @@ class MetaConverter(collections.abc.Mapping, metaclass=_MetaConverterMeta):
NAME_EMAIL_RE
=
re
.
compile
(
r
"(?P<name>[^,]+?)\s*<(?P<email>.+)>\s*$"
)
def
make_inline_table
(
data
):
"""Create an inline table from the given data."""
table
=
tomlkit
.
inline_table
()
table
.
update
(
data
)
return
table
def
array_of_inline_tables
(
value
,
multiline
=
True
):
container
=
tomlkit
.
array
()
container
.
multiline
(
multiline
)
for
item
in
value
:
table
=
tomlkit
.
inline_table
()
table
.
update
(
item
)
container
.
append
(
table
)
container
.
append
(
make_inline_table
(
item
))
return
container
...
...
pdm/formats/flit.py
浏览文件 @
d4ca501f
...
...
@@ -4,7 +4,7 @@ from pathlib import Path
import
tomlkit
import
tomlkit.exceptions
from
pdm.formats.base
import
MetaConverter
,
convert_from
from
pdm.formats.base
import
MetaConverter
,
convert_from
,
make_inline_table
def
check_fingerprint
(
project
,
filename
):
...
...
@@ -46,7 +46,7 @@ class FlitMetaConverter(MetaConverter):
if
"maintainer"
in
metadata
:
self
.
_data
[
"maintainers"
]
=
_get_author
(
metadata
,
"maintainer"
)
if
"license"
in
metadata
:
self
.
_data
[
"license"
]
=
{
"text"
,
metadata
.
pop
(
"license"
)}
self
.
_data
[
"license"
]
=
make_inline_table
({
"text"
,
metadata
.
pop
(
"license"
)})
if
"urls"
in
metadata
:
self
.
_data
[
"urls"
]
=
metadata
.
pop
(
"urls"
)
if
"home-page"
in
metadata
:
...
...
pdm/formats/legacy.py
浏览文件 @
d4ca501f
...
...
@@ -3,7 +3,13 @@ import functools
import
tomlkit
import
tomlkit.exceptions
from
pdm.formats.base
import
MetaConverter
,
Unset
,
convert_from
,
parse_name_email
from
pdm.formats.base
import
(
MetaConverter
,
Unset
,
convert_from
,
make_inline_table
,
parse_name_email
,
)
from
pdm.models.requirements
import
Requirement
...
...
@@ -38,9 +44,7 @@ class LegacyMetaConverter(MetaConverter):
@
convert_from
(
"license"
)
def
license
(
self
,
value
):
table
=
tomlkit
.
inline_table
()
table
[
"text"
]
=
value
return
table
return
make_inline_table
({
"text"
:
value
})
@
convert_from
(
"source"
)
def
source
(
self
,
value
):
...
...
pdm/formats/poetry.py
浏览文件 @
d4ca501f
...
...
@@ -5,7 +5,13 @@ import re
import
tomlkit
import
tomlkit.exceptions
from
pdm.formats.base
import
MetaConverter
,
Unset
,
convert_from
,
parse_name_email
from
pdm.formats.base
import
(
MetaConverter
,
Unset
,
convert_from
,
make_inline_table
,
parse_name_email
,
)
from
pdm.models.markers
import
Marker
from
pdm.models.requirements
import
Requirement
from
pdm.models.specifiers
import
PySpecSet
...
...
@@ -82,7 +88,7 @@ class PoetryMetaConverter(MetaConverter):
@
convert_from
(
"license"
)
def
license
(
self
,
value
):
return
{
"text"
:
value
}
return
make_inline_table
({
"text"
:
value
})
@
convert_from
(
name
=
"requires-python"
)
def
requires_python
(
self
,
source
):
...
...
pdm/models/environment.py
浏览文件 @
d4ca501f
...
...
@@ -313,10 +313,26 @@ class Environment:
shutil
.
copy
(
downloaded
.
path
,
download_dir
)
except
shutil
.
SameFileError
:
pass
# Now all source is prepared, build it.
if
ireq
.
link
.
is_wheel
:
# If the file is a wheel, should be already present under download dir.
return
(
self
.
project
.
cache
(
"wheels"
)
/
ireq
.
link
.
filename
).
as_posix
()
else
:
# Check the built wheel cache again after hashes are resolved.
cache_entry
=
wheel_cache
.
get_cache_entry
(
ireq
.
link
,
ireq
.
req
.
project_name
,
pip_shims
.
get_supported
(
version
=
""
.
join
(
map
(
str
,
get_python_version
(
self
.
python_executable
)[:
2
])
)
),
)
if
cache_entry
is
not
None
:
stream
.
logger
.
debug
(
"Using cached wheel link: %s"
,
cache_entry
.
link
)
return
cache_entry
.
link
.
file_path
# Otherwise, now all source is prepared, build it.
with
EnvBuilder
(
ireq
.
unpacked_source_directory
,
self
)
as
builder
:
if
ireq
.
editable
:
ret
=
builder
.
build_egg_info
(
kwargs
[
"build_dir"
])
...
...
pdm/models/
metadata
.py
→
pdm/models/
project_info
.py
浏览文件 @
d4ca501f
...
...
@@ -3,7 +3,7 @@ from typing import Dict, Iterator, List, Tuple, Union
from
pdm.iostream
import
stream
class
Metadata
:
class
ProjectInfo
:
def
__init__
(
self
,
data
:
Dict
[
str
,
Union
[
str
,
List
[
str
]]],
legacy
:
bool
)
->
None
:
self
.
_data
=
data
self
.
legacy
=
legacy
...
...
pdm/models/requirements.py
浏览文件 @
d4ca501f
...
...
@@ -3,7 +3,7 @@ import re
import
urllib.parse
as
urlparse
import
warnings
from
pathlib
import
Path
from
typing
import
Any
,
Dict
,
List
,
Optional
,
Sequence
,
Union
from
typing
import
Any
,
Dict
,
List
,
Optional
,
Sequence
,
Tuple
,
Union
from
pip._vendor.packaging.markers
import
InvalidMarker
from
pip._vendor.pkg_resources
import
Requirement
as
PackageRequirement
...
...
@@ -173,6 +173,31 @@ class Requirement:
def
as_line
(
self
)
->
str
:
raise
NotImplementedError
def
as_req_dict
(
self
)
->
Tuple
[
str
,
RequirementDict
]:
r
=
{}
if
self
.
editable
:
r
[
"editable"
]
=
True
if
self
.
extras
:
r
[
"extras"
]
=
sorted
(
self
.
extras
)
if
self
.
is_vcs
:
r
[
self
.
vcs
]
=
self
.
repo
elif
self
.
path
and
self
.
is_local_dir
:
r
[
"path"
]
=
self
.
str_path
elif
self
.
url
:
r
[
"url"
]
=
self
.
url
if
self
.
marker
:
r
[
"marker"
]
=
str
(
self
.
marker
).
replace
(
'"'
,
"'"
)
if
self
.
specifier
:
r
[
"version"
]
=
str
(
self
.
specifier
)
elif
self
.
is_named
:
r
[
"version"
]
=
"*"
if
len
(
r
)
==
1
and
next
(
iter
(
r
),
None
)
==
"version"
:
r
=
r
[
"version"
]
for
attr
in
[
"index"
,
"allow_prereleases"
,
"ref"
]:
if
getattr
(
self
,
attr
)
is
not
None
:
r
[
attr
]
=
getattr
(
self
,
attr
)
return
self
.
project_name
,
r
def
matches
(
self
,
line
:
str
)
->
bool
:
"""Return whether the passed in PEP 508 string
is the same requirement as this one.
...
...
pdm/project/core.py
浏览文件 @
d4ca501f
...
...
@@ -177,7 +177,7 @@ class Project:
def
iter_sections
(
self
)
->
Iterable
[
str
]:
if
self
.
meta
.
dependencies
:
yield
"default"
if
self
.
meta
.
dev_dependencies
:
if
self
.
meta
.
get
(
"dev-dependencies"
)
:
yield
"dev"
if
self
.
meta
.
optional_dependencies
:
yield
from
self
.
meta
.
optional_dependencies
.
keys
()
...
...
pdm/project/metadata.py
浏览文件 @
d4ca501f
...
...
@@ -11,7 +11,9 @@ class MutableMetadata(Metadata, MutableMapping):
def
__init__
(
self
,
filepath
,
data
=
None
)
->
None
:
self
.
filepath
=
filepath
self
.
_metadata
=
data
or
self
.
_read_pyproject
(
filepath
)
if
data
is
None
:
data
=
self
.
_read_pyproject
(
filepath
)
self
.
_metadata
=
data
def
__getitem__
(
self
,
k
):
return
self
.
_metadata
[
k
]
...
...
tests/cli/test_actions.py
浏览文件 @
d4ca501f
...
...
@@ -281,7 +281,7 @@ def test_remove_package_exist_in_multi_section(project, repository, working_set)
actions
.
do_add
(
project
,
packages
=
[
"requests"
])
actions
.
do_add
(
project
,
dev
=
True
,
packages
=
[
"urllib3"
])
actions
.
do_remove
(
project
,
dev
=
True
,
packages
=
[
"urllib3"
])
assert
not
any
(
"urllib3"
in
line
for
line
in
project
.
meta
.
dev_dependencies
)
assert
not
any
(
"urllib3"
in
line
for
line
in
project
.
meta
[
"dev-dependencies"
]
)
assert
"urllib3"
in
working_set
assert
"requests"
in
working_set
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录