Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
后端镜像
Pdm
提交
85cda2c0
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
85cda2c0
编写于
4月 14, 2020
作者:
F
Frost Ming
提交者:
GitHub
4月 14, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #108 from frostming/extra-marker
fix marker evaluation
上级
ec3f6cbb
34ba36f0
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
34 addition
and
20 deletion
+34
-20
news/107.bugfix
news/107.bugfix
+1
-0
pdm/models/markers.py
pdm/models/markers.py
+17
-13
pdm/models/requirements.py
pdm/models/requirements.py
+4
-6
tests/conftest.py
tests/conftest.py
+2
-1
tests/resolver/test_resolve.py
tests/resolver/test_resolve.py
+10
-0
未找到文件。
news/107.bugfix
0 → 100644
浏览文件 @
85cda2c0
Fix a bug that environment markers cannot be evaluated correctly if extra's are connected with "or".
pdm/models/markers.py
浏览文件 @
85cda2c0
import
copy
import
operator
from
functools
import
reduce
from
typing
import
Any
,
Iterable
,
Optional
,
Tuple
,
Union
from
typing
import
Any
,
Optional
,
Sequence
,
Tuple
,
Union
from
pip._vendor.packaging.markers
import
Marker
as
PackageMarker
...
...
@@ -85,29 +85,33 @@ def get_marker(marker: Union[PackageMarker, Marker, None]) -> Optional[Marker]:
return
Marker
(
str
(
marker
))
if
marker
else
None
def
split_marker_e
lement
(
text
:
str
,
element
:
str
)
->
Tuple
[
Iterable
[
Tuple
[
str
,
str
]
],
Optional
[
Marker
]]:
def
split_marker_e
xtras
(
marker
:
PackageMarker
,
)
->
Tuple
[
Sequence
[
str
],
Optional
[
Marker
]]:
"""An element can be stripped from the marker only if all parts are connected
with `and` operater. The rest part are returned as a string or `None` if all are
stripped.
:param text: the input marker string
:param element: the element to be stripped
:param marker: the input marker string
:returns: an iterable of (op, value) pairs together with the stripped part.
"""
if
text
is
None
:
return
[],
text
marker
=
Marker
(
text
)
if
"or"
in
marker
.
_markers
:
return
[],
marker
if
"and"
in
marker
.
_markers
or
any
(
not
isinstance
(
p
,
tuple
)
or
p
[
0
].
value
!=
"extra"
for
p
in
marker
.
_markers
if
p
!=
"or"
):
return
[],
marker
result
=
[]
bare_markers
=
[
m
for
m
in
marker
.
_markers
if
m
!=
"and"
]
bare_markers
=
[
m
for
m
in
marker
.
_markers
if
m
not
in
(
"and"
,
"or"
)
]
for
m
in
bare_markers
[:]:
if
not
isinstance
(
m
,
tuple
):
continue
if
m
[
0
].
value
==
element
:
result
.
append
(
tuple
(
e
.
value
for
e
in
m
[
1
:]))
if
m
[
0
].
value
==
"extra"
:
if
m
[
1
].
value
==
"=="
:
result
.
append
(
m
[
2
].
value
)
elif
m
[
1
].
value
==
"in"
:
result
.
extend
(
v
.
strip
()
for
v
in
m
[
2
].
value
.
split
(
","
))
bare_markers
.
remove
(
m
)
new_markers
=
join_list_with
(
bare_markers
,
"and"
)
if
not
new_markers
:
...
...
pdm/models/requirements.py
浏览文件 @
85cda2c0
...
...
@@ -13,7 +13,7 @@ from pip_shims import path_to_url, url_to_path
from
pdm._types
import
RequirementDict
from
pdm.exceptions
import
ExtrasError
,
RequirementError
from
pdm.models.markers
import
Marker
,
get_marker
,
split_marker_e
lement
from
pdm.models.markers
import
Marker
,
get_marker
,
split_marker_e
xtras
from
pdm.models.readers
import
SetupReader
from
pdm.models.specifiers
import
PySpecSet
,
get_specifier
from
pdm.utils
import
(
...
...
@@ -380,12 +380,10 @@ def filter_requirements_with_extras(
if
not
_r
.
marker
:
result
.
append
(
req
)
else
:
elements
,
rest
=
split_marker_e
lement
(
str
(
_r
.
marker
),
"extra"
)
extras_in_meta
.
extend
(
e
[
1
]
for
e
in
elements
)
elements
,
rest
=
split_marker_e
xtras
(
_r
.
marker
)
extras_in_meta
.
extend
(
e
for
e
in
elements
)
_r
.
marker
=
rest
if
not
elements
or
any
(
extra
==
e
[
1
]
for
extra
in
extras
for
e
in
elements
):
if
not
elements
or
set
(
extras
)
&
set
(
elements
):
result
.
append
(
_r
.
as_line
())
extras_not_found
=
[
e
for
e
in
extras
if
e
not
in
extras_in_meta
]
...
...
tests/conftest.py
浏览文件 @
85cda2c0
...
...
@@ -24,7 +24,7 @@ from pdm.iostream import stream
from
pdm.models.candidates
import
Candidate
from
pdm.models.environment
import
Environment
from
pdm.models.repositories
import
BaseRepository
from
pdm.models.requirements
import
Requirement
from
pdm.models.requirements
import
Requirement
,
filter_requirements_with_extras
from
pdm.models.specifiers
import
PySpecSet
from
pdm.project
import
Project
from
pdm.project.config
import
Config
...
...
@@ -103,6 +103,7 @@ class TestRepository(BaseRepository):
deps
=
pypi_data
.
get
(
"dependencies"
,
[])
for
extra
in
candidate
.
req
.
extras
or
():
deps
.
extend
(
pypi_data
.
get
(
"extras_require"
,
{}).
get
(
extra
,
[]))
deps
=
filter_requirements_with_extras
(
deps
,
candidate
.
req
.
extras
or
())
return
deps
,
pypi_data
.
get
(
"requires_python"
,
""
),
""
def
dependency_generators
(
self
)
->
Iterable
[
Callable
[[
Candidate
],
CandidateInfo
]]:
...
...
tests/resolver/test_resolve.py
浏览文件 @
85cda2c0
...
...
@@ -210,3 +210,13 @@ def test_resolve_package_with_dummy_upbound(project, repository):
repository
.
add_candidate
(
"foo"
,
"0.1.0"
,
">=3.6,<4.0"
)
result
=
resolve_requirements
(
repository
,
[
"foo"
],
">=3.5"
)
assert
"foo"
in
result
def
test_resolve_dependency_with_extra_marker
(
project
,
repository
):
repository
.
add_candidate
(
"foo"
,
"0.1.0"
)
repository
.
add_dependencies
(
"foo"
,
"0.1.0"
,
[
"pytz; extra=='tz' or extra=='all'"
])
result
=
resolve_requirements
(
repository
,
[
"foo"
])
assert
"pytz"
not
in
result
result
=
resolve_requirements
(
repository
,
[
"foo[tz]"
])
assert
"pytz"
in
result
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录