Skip to content

Commit c4e409e

Browse files
committed
Add support for pypi in the url2purl module
Signed-off-by: Thomas Druez <tdruez@nexb.com>
1 parent 3bef05b commit c4e409e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/packageurl/contrib/url2purl.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
from urllib.parse import urlparse # Python 3
3939
from urllib.parse import unquote_plus
4040

41+
from pip._internal.wheel import Wheel
42+
from pip._internal.exceptions import InvalidWheelFilename
43+
4144
from packageurl import PackageURL
4245
from packageurl.contrib.route import Router
4346
from packageurl.contrib.route import NoRouteAvailable
@@ -184,3 +187,26 @@ def build_maven_purl(uri):
184187
@purl_router.route(rubygems_pattern)
185188
def build_rubygems_purl(uri):
186189
return purl_from_pattern('rubygems', rubygems_pattern, uri)
190+
191+
192+
# https://pypi.python.org/packages/source/p/python-openid/python-openid-2.2.5.zip
193+
pypi_pattern = (
194+
r"(?P<name>.+-?)-(?P<version>.*?)"
195+
r"\.(zip|tar.gz|tar.bz2)$"
196+
)
197+
198+
199+
@purl_router.route('https?://pypi.python.org/packages/.*')
200+
def build_pypi_purl(uri):
201+
path = unquote_plus(urlparse(uri).path)
202+
last_segment = path.split('/')[-1]
203+
204+
# https://pypi.python.org/packages/py2.py3/w/wheel/wheel-0.29.0-py2.py3-none-any.whl
205+
if last_segment.endswith('.whl'):
206+
try:
207+
wheel = Wheel(last_segment)
208+
except InvalidWheelFilename:
209+
return
210+
return PackageURL('pypi', name=wheel.name, version=wheel.version)
211+
212+
return purl_from_pattern('pypi', pypi_pattern, last_segment)

tests/contrib/data/url2purl.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,15 @@
9494
"https://rubygems.org/downloads/ref-1.0.5.gem": "pkg:rubygems/ref@1.0.5",
9595
"https://rubygems.org/downloads/talentbox-delayed_job_sequel-4.0.0.gem": "pkg:rubygems/talentbox-delayed_job_sequel@4.0.0",
9696
"https://rubygems.org/downloads/unf-0.1.3.gem": "pkg:rubygems/unf@0.1.3",
97-
"https://rubygems.org/downloads/yajl-ruby-1.2.0.gem": "pkg:rubygems/yajl-ruby@1.2.0"
97+
"https://rubygems.org/downloads/yajl-ruby-1.2.0.gem": "pkg:rubygems/yajl-ruby@1.2.0",
98+
99+
"https://pypi.python.org/packages/source/z/zc.recipe.egg/zc.recipe.egg-2.0.0.tar.gz": "pkg:pypi/zc.recipe.egg@2.0.0",
100+
"https://pypi.python.org/packages/source/p/python-openid/python-openid-2.2.5.zip": "pkg:pypi/python-openid@2.2.5",
101+
"https://pypi.python.org/packages/38/e2/b23434f4030bbb1af3bcdbb2ecff6b11cf2e467622446ce66a08e99f2ea9/pluggy-0.4.0.zip#md5=447a92368175965d2fbacaef9f3df842": "pkg:pypi/pluggy@0.4.0",
102+
"https://pypi.python.org/packages/py2.py3/w/wheel/bad-wheel-name-any.whl": null,
103+
"https://pypi.python.org/packages/py2.py3/w/wheel/wheel-0.29.0-py2.py3-none-any.whl": "pkg:pypi/wheel@0.29.0",
104+
"https://pypi.python.org/packages/py2.py3/w/wheel/wheel-0.29.0-py2.py3-none-any.whl#md5=d7db45db5c131af262b8ffccde46a88a": "pkg:pypi/wheel@0.29.0",
105+
"https://pypi.python.org/packages/f6/ae/bbc6a204f33d9d57c798fb3857a072cd14b836792244eea4b446fdb674c6/pycryptodome-3.4.7-cp27-cp27m-win32.whl#md5=78b341de1cd686077745cd9e3a93d8d3": "pkg:pypi/pycryptodome@3.4.7",
106+
"https://pypi.python.org/packages/bd/e8/ea44ba5357a0b4fd16e5fb60c355fc8722eae31b93d7597eec50f7c35a52/pycryptodome-3.4.7-cp27-cp27m-win_amd64.whl#md5=f20bb847322baf7ae24700e5cbb15e07": "pkg:pypi/pycryptodome@3.4.7",
107+
"https://pypi.python.org/packages/1e/75/8005d086cac4cc41d3b320d338972c5e5c6a21f88472f21ac9d0e031d300/pyahocorasick-1.1.4.tar.bz2#md5=ad445b6648dc06e9040705ce1ccb4384": "pkg:pypi/pyahocorasick@1.1.4"
98108
}

0 commit comments

Comments
 (0)