Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
python-poetry
Overview
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
python-poetry
Commits
e61fec7a
Unverified
Commit
e61fec7a
authored
Jul 30, 2018
by
Sébastien Eustace
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix wrong wheel being selected
parent
0a39d833
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
389 additions
and
13 deletions
+389
-13
.gitignore
+1
-0
CHANGELOG.md
+7
-0
poetry/repositories/pypi_repository.py
+18
-7
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4-py2-none-any.whl
+0
-0
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4-py3-none-any.whl
+0
-0
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4.tar.gz
+0
-0
tests/repositories/fixtures/pypi.org/dists/jupyter-1.0.0-py2.py3-none-any.whl
+0
-0
tests/repositories/fixtures/pypi.org/dists/jupyter-1.0.0.tar.gz
+0
-0
tests/repositories/fixtures/pypi.org/json/isort.json
+160
-0
tests/repositories/fixtures/pypi.org/json/jupyter.json
+156
-0
tests/repositories/test_pypi_repository.py
+47
-6
No files found.
.gitignore
View file @
e61fec7a
...
@@ -31,6 +31,7 @@ MANIFEST.in
...
@@ -31,6 +31,7 @@ MANIFEST.in
/docs/site/*
/docs/site/*
pyproject.lock
pyproject.lock
/tests/fixtures/simple_project/setup.py
/tests/fixtures/simple_project/setup.py
/tests/fixtures/project_with_extras/setup.py
.mypy_cache
.mypy_cache
.venv
.venv
CHANGELOG.md
View file @
e61fec7a
# Change Log
# Change Log
## [Unreleased]
### Fixed
-
Fixed wrong wheel being selected when resolving dependencies.
## [0.11.3] - 2018-07-26
## [0.11.3] - 2018-07-26
### Changed
### Changed
...
...
poetry/repositories/pypi_repository.py
View file @
e61fec7a
import
logging
import
logging
import
os
import
os
import
re
import
tarfile
import
tarfile
import
zipfile
import
zipfile
...
@@ -288,17 +289,27 @@ class PyPiRepository(Repository):
...
@@ -288,17 +289,27 @@ class PyPiRepository(Repository):
continue
continue
# If bdist_wheel, check if it's universal
# If bdist_wheel, check if it's universal
python_version
=
url
[
"python_version
"
]
filename
=
url
[
"filename
"
]
if
python_version
not
in
[
"py2.py3"
,
"py3"
,
"py2"
]
:
if
not
re
.
search
(
"-py2
\
.py3-none-any.whl"
,
filename
)
:
continue
continue
parts
=
urlparse
.
urlparse
(
url
[
"url"
])
urls
[
dist_type
]
=
url
[
"url"
]
filename
=
os
.
path
.
basename
(
parts
.
path
)
if
"-none-any"
not
in
filename
:
if
"sdist"
in
url
and
"bdist_wheel"
not
in
urls
:
continue
# If can't found a universal wheel
# but we found an sdist, inspect the sdist first
info
=
self
.
_get_info_from_urls
(
urls
)
if
info
[
"requires_dist"
]:
data
[
"requires_dist"
]
=
info
[
"requires_dist"
]
if
not
data
[
"requires_python"
]:
data
[
"requires_python"
]
=
info
[
"requires_python"
]
return
data
else
:
del
urls
[
"sdist"
]
if
not
urls
or
"bdist_wheel"
not
in
urls
:
if
not
urls
:
# If we don't have urls, we try to take the first one
# If we don't have urls, we try to take the first one
# we find and go from there
# we find and go from there
if
not
json_data
[
"urls"
]:
if
not
json_data
[
"urls"
]:
...
...
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4-py2-none-any.whl
0 → 100644
View file @
e61fec7a
File added
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4-py3-none-any.whl
0 → 100644
View file @
e61fec7a
File added
tests/repositories/fixtures/pypi.org/dists/isort-4.3.4.tar.gz
0 → 100644
View file @
e61fec7a
File added
tests/repositories/fixtures/pypi.org/dists/jupyter-1.0.0-py2.py3-none-any.whl
0 → 100644
View file @
e61fec7a
File added
tests/repositories/fixtures/pypi.org/dists/jupyter-1.0.0.tar.gz
0 → 100644
View file @
e61fec7a
File added
tests/repositories/fixtures/pypi.org/json/isort.json
0 → 100644
View file @
e61fec7a
{
"info"
:
{
"author"
:
"Timothy Crosley"
,
"author_email"
:
"timothy.crosley@gmail.com"
,
"bugtrack_url"
:
null
,
"classifiers"
:
[
"Development Status :: 6 - Mature"
,
"Environment :: Console"
,
"Intended Audience :: Developers"
,
"License :: OSI Approved :: MIT License"
,
"Natural Language :: English"
,
"Programming Language :: Python"
,
"Programming Language :: Python :: 2"
,
"Programming Language :: Python :: 2.7"
,
"Programming Language :: Python :: 3"
,
"Programming Language :: Python :: 3.4"
,
"Programming Language :: Python :: 3.5"
,
"Programming Language :: Python :: 3.6"
,
"Programming Language :: Python :: Implementation :: CPython"
,
"Programming Language :: Python :: Implementation :: PyPy"
,
"Topic :: Software Development :: Libraries"
,
"Topic :: Utilities"
],
"description"
:
""
,
"description_content_type"
:
null
,
"docs_url"
:
null
,
"download_url"
:
""
,
"downloads"
:
{
"last_day"
:
-1
,
"last_month"
:
-1
,
"last_week"
:
-1
},
"home_page"
:
"https://github.com/timothycrosley/isort"
,
"keywords"
:
"Refactor"
,
"license"
:
"MIT"
,
"maintainer"
:
""
,
"maintainer_email"
:
""
,
"name"
:
"isort"
,
"package_url"
:
"https://pypi.org/project/isort/"
,
"platform"
:
""
,
"project_url"
:
"https://pypi.org/project/isort/"
,
"project_urls"
:
{
"Homepage"
:
"https://github.com/timothycrosley/isort"
},
"release_url"
:
"https://pypi.org/project/isort/4.3.4/"
,
"requires_dist"
:
null
,
"requires_python"
:
""
,
"summary"
:
"A Python utility / library to sort Python imports."
,
"version"
:
"4.3.4"
},
"last_serial"
:
3575149
,
"releases"
:
{
"4.3.4"
:
[
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"f0ad7704b6dc947073398ba290c3517f"
,
"sha256"
:
"ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4-py2-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"f0ad7704b6dc947073398ba290c3517f"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"2.7"
,
"requires_python"
:
null
,
"size"
:
45393
,
"upload_time"
:
"2018-02-12T15:06:38"
,
"url"
:
"https://files.pythonhosted.org/packages/41/d8/a945da414f2adc1d9e2f7d6e7445b27f2be42766879062a2e63616ad4199/isort-4.3.4-py2-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"fbaac4cd669ac21ea9e21ab1ea3180db"
,
"sha256"
:
"1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4-py3-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"fbaac4cd669ac21ea9e21ab1ea3180db"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"3.6"
,
"requires_python"
:
null
,
"size"
:
45352
,
"upload_time"
:
"2018-02-12T15:06:20"
,
"url"
:
"https://files.pythonhosted.org/packages/1f/2c/22eee714d7199ae0464beda6ad5fedec8fee6a2f7ffd1e8f1840928fe318/isort-4.3.4-py3-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"fb554e9c8f9aa76e333a03d470a5cf52"
,
"sha256"
:
"b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4.tar.gz"
,
"has_sig"
:
false
,
"md5_digest"
:
"fb554e9c8f9aa76e333a03d470a5cf52"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
56070
,
"upload_time"
:
"2018-02-12T15:06:16"
,
"url"
:
"https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz"
}
]
},
"urls"
:
[
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"f0ad7704b6dc947073398ba290c3517f"
,
"sha256"
:
"ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4-py2-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"f0ad7704b6dc947073398ba290c3517f"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"2.7"
,
"requires_python"
:
null
,
"size"
:
45393
,
"upload_time"
:
"2018-02-12T15:06:38"
,
"url"
:
"https://files.pythonhosted.org/packages/41/d8/a945da414f2adc1d9e2f7d6e7445b27f2be42766879062a2e63616ad4199/isort-4.3.4-py2-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"fbaac4cd669ac21ea9e21ab1ea3180db"
,
"sha256"
:
"1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4-py3-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"fbaac4cd669ac21ea9e21ab1ea3180db"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"3.6"
,
"requires_python"
:
null
,
"size"
:
45352
,
"upload_time"
:
"2018-02-12T15:06:20"
,
"url"
:
"https://files.pythonhosted.org/packages/1f/2c/22eee714d7199ae0464beda6ad5fedec8fee6a2f7ffd1e8f1840928fe318/isort-4.3.4-py3-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"fb554e9c8f9aa76e333a03d470a5cf52"
,
"sha256"
:
"b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8"
},
"downloads"
:
-1
,
"filename"
:
"isort-4.3.4.tar.gz"
,
"has_sig"
:
false
,
"md5_digest"
:
"fb554e9c8f9aa76e333a03d470a5cf52"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
56070
,
"upload_time"
:
"2018-02-12T15:06:16"
,
"url"
:
"https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz"
}
]
}
tests/repositories/fixtures/pypi.org/json/jupyter.json
0 → 100644
View file @
e61fec7a
{
"info"
:
{
"author"
:
"Jupyter Development Team"
,
"author_email"
:
"jupyter@googlegroups.org"
,
"bugtrack_url"
:
null
,
"classifiers"
:
[
"Intended Audience :: Developers"
,
"Intended Audience :: Science/Research"
,
"Intended Audience :: System Administrators"
,
"License :: OSI Approved :: BSD License"
,
"Programming Language :: Python"
,
"Programming Language :: Python :: 2"
,
"Programming Language :: Python :: 2.7"
,
"Programming Language :: Python :: 3"
,
"Programming Language :: Python :: 3.3"
,
"Programming Language :: Python :: 3.4"
],
"description"
:
"Install the Jupyter system, including the notebook, qtconsole, and the IPython kernel."
,
"description_content_type"
:
null
,
"docs_url"
:
null
,
"download_url"
:
"UNKNOWN"
,
"downloads"
:
{
"last_day"
:
-1
,
"last_month"
:
-1
,
"last_week"
:
-1
},
"home_page"
:
"http://jupyter.org"
,
"keywords"
:
null
,
"license"
:
"BSD"
,
"maintainer"
:
null
,
"maintainer_email"
:
null
,
"name"
:
"jupyter"
,
"package_url"
:
"https://pypi.org/project/jupyter/"
,
"platform"
:
"UNKNOWN"
,
"project_url"
:
"https://pypi.org/project/jupyter/"
,
"project_urls"
:
{
"Download"
:
"UNKNOWN"
,
"Homepage"
:
"http://jupyter.org"
},
"release_url"
:
"https://pypi.org/project/jupyter/1.0.0/"
,
"requires_dist"
:
null
,
"requires_python"
:
null
,
"summary"
:
"Jupyter metapackage. Install all the Jupyter components in one go."
,
"version"
:
"1.0.0"
},
"last_serial"
:
1673841
,
"releases"
:
{
"0.0.0"
:
[],
"1.0.0"
:
[
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"f81d039e084c2c0c4da9e4a86446b863"
,
"sha256"
:
"5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0-py2.py3-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"f81d039e084c2c0c4da9e4a86446b863"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"3.4"
,
"requires_python"
:
null
,
"size"
:
2736
,
"upload_time"
:
"2015-08-12T00:42:58"
,
"url"
:
"https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"c6030444c7eb6c05a4d7b1768c72aed7"
,
"sha256"
:
"d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0.tar.gz"
,
"has_sig"
:
false
,
"md5_digest"
:
"c6030444c7eb6c05a4d7b1768c72aed7"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
12916
,
"upload_time"
:
"2015-08-12T00:43:08"
,
"url"
:
"https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"25142b08e2ad7142b6f920bc8cc8dfeb"
,
"sha256"
:
"3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0.zip"
,
"has_sig"
:
false
,
"md5_digest"
:
"25142b08e2ad7142b6f920bc8cc8dfeb"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
16690
,
"upload_time"
:
"2015-08-12T00:43:12"
,
"url"
:
"https://files.pythonhosted.org/packages/fc/21/a372b73e3a498b41b92ed915ada7de2ad5e16631546329c03e484c3bf4e9/jupyter-1.0.0.zip"
}
]
},
"urls"
:
[
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"f81d039e084c2c0c4da9e4a86446b863"
,
"sha256"
:
"5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0-py2.py3-none-any.whl"
,
"has_sig"
:
false
,
"md5_digest"
:
"f81d039e084c2c0c4da9e4a86446b863"
,
"packagetype"
:
"bdist_wheel"
,
"python_version"
:
"3.4"
,
"requires_python"
:
null
,
"size"
:
2736
,
"upload_time"
:
"2015-08-12T00:42:58"
,
"url"
:
"https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"c6030444c7eb6c05a4d7b1768c72aed7"
,
"sha256"
:
"d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0.tar.gz"
,
"has_sig"
:
false
,
"md5_digest"
:
"c6030444c7eb6c05a4d7b1768c72aed7"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
12916
,
"upload_time"
:
"2015-08-12T00:43:08"
,
"url"
:
"https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz"
},
{
"comment_text"
:
""
,
"digests"
:
{
"md5"
:
"25142b08e2ad7142b6f920bc8cc8dfeb"
,
"sha256"
:
"3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"
},
"downloads"
:
-1
,
"filename"
:
"jupyter-1.0.0.zip"
,
"has_sig"
:
false
,
"md5_digest"
:
"25142b08e2ad7142b6f920bc8cc8dfeb"
,
"packagetype"
:
"sdist"
,
"python_version"
:
"source"
,
"requires_python"
:
null
,
"size"
:
16690
,
"upload_time"
:
"2015-08-12T00:43:12"
,
"url"
:
"https://files.pythonhosted.org/packages/fc/21/a372b73e3a498b41b92ed915ada7de2ad5e16631546329c03e484c3bf4e9/jupyter-1.0.0.zip"
}
]
}
tests/repositories/test_pypi_repository.py
View file @
e61fec7a
import
json
import
json
import
shutil
from
poetry.repositories.pypi_repository
import
PyPiRepository
from
poetry.repositories.pypi_repository
import
PyPiRepository
from
poetry.utils._compat
import
Path
from
poetry.utils._compat
import
Path
...
@@ -6,11 +7,12 @@ from poetry.utils._compat import Path
...
@@ -6,11 +7,12 @@ from poetry.utils._compat import Path
class
MockRepository
(
PyPiRepository
):
class
MockRepository
(
PyPiRepository
):
FIXTURES
=
Path
(
__file__
)
.
parent
/
"fixtures"
/
"pypi.org"
/
"json"
JSON_FIXTURES
=
Path
(
__file__
)
.
parent
/
"fixtures"
/
"pypi.org"
/
"json"
DIST_FIXTURES
=
Path
(
__file__
)
.
parent
/
"fixtures"
/
"pypi.org"
/
"dists"
def
__init__
(
self
):
def
__init__
(
self
,
fallback
=
False
):
super
(
MockRepository
,
self
)
.
__init__
(
super
(
MockRepository
,
self
)
.
__init__
(
url
=
"http://foo.bar"
,
disable_cache
=
True
,
fallback
=
False
url
=
"http://foo.bar"
,
disable_cache
=
True
,
fallback
=
fallback
)
)
def
_get
(
self
,
url
):
def
_get
(
self
,
url
):
...
@@ -22,15 +24,22 @@ class MockRepository(PyPiRepository):
...
@@ -22,15 +24,22 @@ class MockRepository(PyPiRepository):
version
=
None
version
=
None
if
not
version
:
if
not
version
:
fixture
=
self
.
FIXTURES
/
(
name
+
".json"
)
fixture
=
self
.
JSON_
FIXTURES
/
(
name
+
".json"
)
else
:
else
:
fixture
=
self
.
FIXTURES
/
name
/
(
version
+
".json"
)
fixture
=
self
.
JSON_
FIXTURES
/
name
/
(
version
+
".json"
)
if
not
fixture
.
exists
():
if
not
fixture
.
exists
():
fixture
=
self
.
FIXTURES
/
(
name
+
".json"
)
fixture
=
self
.
JSON_
FIXTURES
/
(
name
+
".json"
)
with
fixture
.
open
()
as
f
:
with
fixture
.
open
()
as
f
:
return
json
.
loads
(
f
.
read
())
return
json
.
loads
(
f
.
read
())
def
_download
(
self
,
url
,
dest
):
filename
=
url
.
split
(
"/"
)[
-
1
]
fixture
=
self
.
DIST_FIXTURES
/
filename
shutil
.
copyfile
(
str
(
fixture
),
dest
)
def
test_find_packages
():
def
test_find_packages
():
repo
=
MockRepository
()
repo
=
MockRepository
()
...
@@ -60,3 +69,35 @@ def test_package():
...
@@ -60,3 +69,35 @@ def test_package():
assert
win_inet
.
name
==
"win-inet-pton"
assert
win_inet
.
name
==
"win-inet-pton"
assert
win_inet
.
python_versions
==
"~2.7 || ~2.6"
assert
win_inet
.
python_versions
==
"~2.7 || ~2.6"
assert
win_inet
.
platform
==
"win32"
assert
win_inet
.
platform
==
"win32"
def
test_fallback_on_downloading_packages
():
repo
=
MockRepository
(
fallback
=
True
)
package
=
repo
.
package
(
"jupyter"
,
"1.0.0"
)
assert
package
.
name
==
"jupyter"
assert
len
(
package
.
requires
)
==
6
dependency_names
=
sorted
([
dep
.
name
for
dep
in
package
.
requires
])
assert
dependency_names
==
[
"ipykernel"
,
"ipywidgets"
,
"jupyter-console"
,
"nbconvert"
,
"notebook"
,
"qtconsole"
,
]
def
test_fallback_inspects_sdist_first_if_no_matching_wheels_can_be_found
():
repo
=
MockRepository
(
fallback
=
True
)
package
=
repo
.
package
(
"isort"
,
"4.3.4"
)
assert
package
.
name
==
"isort"
assert
len
(
package
.
requires
)
==
1
dep
=
package
.
requires
[
0
]
assert
dep
.
name
==
"futures"
assert
dep
.
python_versions
==
"~2.7"
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