Remove PEP503 parser and egg downloader from setup.py

This commit is contained in:
Orip
2022-09-03 00:32:38 +03:00
committed by Ole André Vadla Ravnås
parent 85e7cb9b94
commit 2c805431bd
2 changed files with 5 additions and 462 deletions
+5 -245
View File
@@ -1,265 +1,25 @@
import codecs
import hashlib
import os
import platform
import re
import shutil
import struct
import subprocess
import sys
import zipfile
from collections import namedtuple
from functools import partial
from html.parser import HTMLParser
from io import BytesIO
from urllib.parse import urljoin, urlparse, urlunparse
from urllib.request import urlopen
from setuptools import setup
from setuptools.command.build_ext import build_ext
from setuptools.extension import Extension
DEFAULT_INDEX_URL = "https://pypi.org/simple/"
python_version = sys.version_info[0:2]
package_dir = os.path.dirname(os.path.realpath(__file__))
pkg_info = os.path.join(package_dir, "PKG-INFO")
in_source_package = os.path.isfile(pkg_info)
if in_source_package:
with codecs.open(pkg_info, "r", "utf-8") as f:
version_line = [line.rstrip("\r") for line in f.read().split("\n") if line.startswith("Version: ")][0]
frida_version = version_line[9:]
long_description = None
else:
frida_version = os.environ.get("FRIDA_VERSION", None)
long_description = codecs.open(os.path.join(package_dir, "README.md"), "r", "utf-8").read()
frida_extension = os.environ.get("FRIDA_EXTENSION", None)
index_url_pip_configs = ("global.index-url", "global.extra-index-url")
Tag = namedtuple("Tag", ["tagname", "attrs"])
ParsedUrlInfo = namedtuple("ParsedUrlInfo", ["url", "filename", "major", "minor", "micro"])
frida_version = os.environ.get("FRIDA_VERSION", None)
long_description = codecs.open(os.path.join(package_dir, "README.md"), "r", "utf-8").read()
frida_extension = os.environ.get("FRIDA_EXTENSION", None)
class FridaPrebuiltExt(build_ext):
def build_extension(self, ext):
target = self.get_ext_fullpath(ext.name)
target_extension = os.path.splitext(target)[1]
target_dir = os.path.dirname(target)
try:
os.makedirs(target_dir)
except:
pass
os.makedirs(target_dir, exist_ok=True)
if in_source_package:
system = platform.system()
arch = struct.calcsize("P") * 8
if system == "Windows":
os_version = "win-amd64" if arch == 64 else "win32"
elif system == "Darwin":
if platform.machine() == "x86_64":
os_version = "macosx-10.9-x86_64"
else:
os_version = "macosx-11.0-arm64"
elif system == "Linux":
os_name = (
"android"
if subprocess.check_output(["uname", "-o"]).decode("utf-8").rstrip() == "Android"
else "linux"
)
machine = platform.machine()
if machine == "" or "86" in machine:
arch_name = "x86_64" if arch == 64 else "i686"
elif os_name == "android" and machine.startswith("armv"):
arch_name = "armv7l"
else:
arch_name = machine
os_version = f"{os_name}-{arch_name}"
elif system == "FreeBSD":
os_version = "freebsd-" + platform.machine()
else:
raise NotImplementedError("unsupported OS")
egg_path = os.path.expanduser(
f"~{os.sep}frida-{frida_version}-py{python_version[0]}.{python_version[1]}-{os_version}.egg"
)
print("looking for prebuilt extension in home directory, i.e.", egg_path)
try:
with open(egg_path, "rb") as cache:
egg_data = cache.read()
except:
egg_data = None
if egg_data is None:
print("prebuilt extension not found in home directory, will try downloading it")
print("querying pypi for available prebuilds")
# index_url is a url compatible with PEP 503
index_url = get_index_url().strip()
index_url = normalize_url(index_url)
frida_url = urljoin(index_url, "frida/") # slash is necessary here
timeout = 20
errmsg = "unable to download it within {} seconds; " f"please download it manually to {egg_path}"
print("downloading package list from", frida_url)
try:
links_html = urlopen(frida_url, timeout=timeout).read().decode("utf-8")
except Exception:
print(errmsg.format(timeout))
raise
parser = PEP503PageParser("frida", frida_version, os_version)
parser.feed(links_html)
if len(parser.urls) == 0:
raise NotImplementedError(
"could not find prebuilt Frida extension; " "prebuilds only provided for Python 3.4+"
)
url = parser.urls[0]
egg_url = urljoin(frida_url, url.url)
try:
print("downloading prebuilt extension from", egg_url)
timeout = 120 # We'll assume the user has at least 200 kB/s transfer speed.
egg_data = urlopen(egg_url, timeout=timeout).read()
except Exception:
print(errmsg.format(timeout))
raise
else:
egg_url = None
egg_file = BytesIO(egg_data)
if egg_url is not None:
print("checking hash")
check_pep503_hash(egg_file, egg_url)
print("extracting prebuilt extension")
egg_zip = zipfile.ZipFile(egg_file)
extension_member = [info for info in egg_zip.infolist() if info.filename.endswith(target_extension)][0]
extension_data = egg_zip.read(extension_member)
if system == "Windows":
trailer = b"\x00" if python_version[1] >= 10 else b"\x00\x00"
extension_data = re.sub(
b"python[3-9][0-9][0-9]\\.dll\x00",
"python{}{}.dll".format(*python_version).encode("utf-8") + trailer,
extension_data,
)
with open(target, "wb") as f:
f.write(extension_data)
else:
shutil.copyfile(frida_extension, target)
def get_index_url():
"""get `index-url` from environment or pip
Use FRIDA_INDEX_URL environment variable to customize index-url compatible
with PEP 503.
"""
index_url = os.environ.get("FRIDA_INDEX_URL", None)
if index_url is not None:
return index_url
for config_name in index_url_pip_configs:
try:
index_url = get_index_url_from_pip(config_name)
except (subprocess.CalledProcessError, OSError):
pass
else:
return index_url
print(f"using default index URL: {DEFAULT_INDEX_URL}")
return DEFAULT_INDEX_URL
def get_index_url_from_pip(config_name):
assert config_name in index_url_pip_configs
return subprocess.check_output(
[sys.executable, "-m", "pip", "config", "get", config_name], stderr=subprocess.PIPE
).decode("utf-8")
def normalize_url(url):
parse_result = urlparse(url)
path = parse_result.path
if not path.endswith("/"):
path += "/"
return urlunparse(
(
parse_result.scheme,
parse_result.netloc,
path,
parse_result.params,
parse_result.query,
parse_result.fragment,
)
)
class PEP503PageParser(HTMLParser):
def __init__(self, name, version, os_version):
HTMLParser.__init__(self)
filename_pattern = (r"^{}\-{}\-py(?P<major>\d+)\.(?P<minor>\d+)(\.(?P<micro>\d+))?-{}.egg$").format(
*map(re.escape, [name, version, os_version])
)
self._filename_pattern = re.compile(filename_pattern)
def reset(self):
HTMLParser.reset(self)
self._path = []
self.urls = []
def handle_starttag(self, tag, attrs):
self._path.append(Tag(tag, dict(attrs)))
def handle_endtag(self, tag):
if tag == "a":
while True:
if self._path.pop().tagname == tag:
break
else:
if len(self._path) > 0 and self._path[-1].tagname == tag:
self._path.pop()
def handle_data(self, data):
if not (len(self._path) > 0 and self._path[-1].tagname == "a" and self._path[-1].attrs.get("href")):
return
match = self._filename_pattern.match(data)
if match is not None:
self.urls.append(
ParsedUrlInfo(
self._path[-1].attrs["href"],
data,
*map(lambda g: int(g) if g else None, map(match.group, ["major", "minor", "micro"])),
)
)
def check_pep503_hash(bytes_io, url):
parse_result = urlparse(url)
fragment = parse_result.fragment
if fragment == "":
return
hashname, hashvalue = fragment.split("=")
if hashname not in {"md5", "sha1", "sha224", "sha256", "sha348", "sha512"}:
raise ValueError(f"Unsupported hash algorithm: {hashname}, hashvalue={hashvalue}")
h = hashlib.new(hashname)
for block in iter(partial(bytes_io.read, 4096), b""): # iterate until EOF
h.update(block)
digest = h.hexdigest()
bytes_io.seek(0) # reset offset
if digest == hashvalue:
return
else:
raise ValueError(f"`{hashname}` hash checking failed! Expected: {hashvalue}, but got: {digest}")
shutil.copyfile(frida_extension, target)
if __name__ == "__main__":
-217
View File
@@ -1,217 +0,0 @@
import sys
import unittest
import setup
py_major_version = sys.version_info[0]
htmls = []
cases = []
html = (
"<!DOCTYPE html>\n<html>\n <head>\n <title>Links for frida</title>\n "
' </head>\n <body>\n <h1>Links for frida</h1>\n <a href="../../pac'
"kages/5d/80/3b140c5998df9d81e40169f188a2347b6c705156a2b556ff308e2f8b7e0a"
"/frida-1.4.1-py2.6-macosx-10.9-intel.egg#sha256=eef92210084ef083b34f8972"
'078550c6ef45255e444905f95495792c7f709546">frida-1.4.1-py2.6-macosx-10.9-'
'intel.egg</a><br/>\n<a href="../../packages/4e/ca/ee40ef1d5013300a77152f'
"f0687caedc3b5ea1f786bf3e0b778de5fc0b8a/frida-9.1.9.tar.gz#sha256=d215884"
'4cc20cd3e2f8d2cd95f90449f0c27d051d9868706c1eda5d357eb86d7">frida-9.1.9.t'
"ar.gz</a><br/>\n </body>\n</html>\n<!--SERIAL 11362971-->"
)
htmls.append(html)
cases.extend(
[
(setup.PEP503PageParser("frida", "15.1.1", "win-amd64"), html, []),
(
setup.PEP503PageParser("frida", "1.4.1", "macosx-10.9-intel"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/5d/80/3b140c5998df9d81e40169f188a2347b6c705156a2b556ff308e2f8b7e0a/frida-1.4.1-py2.6-macosx-10.9-intel.egg#sha256=eef92210084ef083b34f8972078550c6ef45255e444905f95495792c7f709546",
filename="frida-1.4.1-py2.6-macosx-10.9-intel.egg",
major=2,
minor=6,
micro=None,
)
],
),
(setup.PEP503PageParser("frida", "1.4.1", "macosx-11.0-arm64"), html, []),
]
)
html = (
'<a href="../../packages/e3/21/da75f6207f76750799d68938707a74d46512e666293eb550247bf5314613/frida-15.0.7-py2.7-linux-i686.egg#sha256=444246bad3b2222efec301e96c2d6ac5da039d41acd655f6d5b6e548637cae09">frida-15.0.7-py2.7-linux-i686.egg</a><br/>'
'<a href="../../packages/27/98/751c293b3f246692f3f70ee33c8699ff19f9ded770ae2557ac5641b3456c/frida-15.0.7-py2.7-linux-x86_64.egg#sha256=85547f36d30520b4ecc21bdabd6d6f458367558c5eae12af201bab41451b79c1">frida-15.0.7-py2.7-linux-x86_64.egg</a><br/>'
'<a href="../../packages/e2/51/8eb9b60736ca600ee466263e1fe6339a1440225d58cb028eae523b30ceac/frida-15.0.7-py2.7-macosx-10.9-x86_64.egg#sha256=123e6ba62f240bb58831196c6d3191cdfc0d76fc12a53c9129805609d595ae3a">frida-15.0.7-py2.7-macosx-10.9-x86_64.egg</a><br/>'
'<a href="../../packages/9c/c1/692e3a554b3e5929e4a5084fbfc99d64533500f73cbb23b329c283801456/frida-15.0.7-py2.7-macosx-11.0-fat64.egg#sha256=a6bff86e4907a3d5587ca370c7650ba55d4d20f35a6f7884573b129de4f0cc81">frida-15.0.7-py2.7-macosx-11.0-fat64.egg</a><br/>'
'<a href="../../packages/e0/5c/b45c8f27482d81179eb640726b703f95c624cc4f32ae3ed3f8bc858ae5d9/frida-15.0.7-py2.7-win-amd64.egg#sha256=eb696528b9c19f1895123e731b094363a87a4412d7ea4fcb54ef71841f7b3c1e">frida-15.0.7-py2.7-win-amd64.egg</a><br/>'
'<a href="../../packages/bb/81/57ff40027efa9309de1a49d64a185637c2151892120d70b90cdb31ae33f0/frida-15.0.7-py2.7-win32.egg#sha256=3110d5400e8cd422540f47fcceccce070d208852cadca9597167166d274e11fa">frida-15.0.7-py2.7-win32.egg</a><br/>'
'<a href="../../packages/53/c2/f9b94fff26fc2e71af2b92d8295df1e1360895e9fb6f23b82282f38532f9/frida-15.0.7-py3.8-android-aarch64.egg#sha256=a434ed65ea0e2076e67d08528be426532365515b0a051a053833f2b45264151b">frida-15.0.7-py3.8-android-aarch64.egg</a><br/>'
'<a href="../../packages/19/d3/a4a1980005e232399575aeb2ae973d2087a94ec7dbaf6d7a481612979fc7/frida-15.0.7-py3.8-linux-i686.egg#sha256=ed922ec0258e95f39b4004066b72fb48546041d28602e55d44ca12effa80e8bf">frida-15.0.7-py3.8-linux-i686.egg</a><br/>'
'<a href="../../packages/9f/cb/496679b506e821bf87ae57f60fd5e4955745b01b2546249f3f00c1fa4678/frida-15.0.7-py3.8-linux-x86_64.egg#sha256=f3419dbf0db069b457d45fd423ccbd0746b184fe39e3d9dd589608db02ca18ab">frida-15.0.7-py3.8-linux-x86_64.egg</a><br/>'
'<a href="../../packages/6e/80/4d458e4fedcc05b882f0c4bd957d7c2f36b042872f21c6338ef7f9630c89/frida-15.0.7-py3.8-macosx-10.9-x86_64.egg#sha256=695e3e0e914f15e8158b76f59489d983b756d50f22105cc042b1aa232d91568b">frida-15.0.7-py3.8-macosx-10.9-x86_64.egg</a><br/>'
'<a href="../../packages/15/96/414675d6e7da98b32187995aff8efce06294f3f469b52c97527528fb9eb3/frida-15.0.7-py3.8-macosx-11.0-arm64.egg#sha256=9b0e2bb694c11dab52268a400c7e812b8c53e66147eb05d705d0261c5afc3d52">frida-15.0.7-py3.8-macosx-11.0-arm64.egg</a><br/>'
'<a href="../../packages/77/34/6ebaea697f3df72818e60c6494a716c51f7f13b3da323598c1711d21779c/frida-15.0.7-py3.8-win-amd64.egg#sha256=a9964cc6dd4e3ea71c42b1800c79571c670905dc82cd769302b066499fff7bf4">frida-15.0.7-py3.8-win-amd64.egg</a><br/>'
'<a href="../../packages/d2/50/6cf690272c6a2c65f8ebd8fb059d0194d4ffac231fe4e31a0da2456b69a1/frida-15.0.7-py3.8-win32.egg#sha256=99e4b9f06b483c7728eca58bffd07b909733d45311c55ce92c0061d9ea477b69">frida-15.0.7-py3.8-win32.egg</a><br/>'
'<a href="../../packages/fd/3b/b0285b19ec5b5f3dc3f3d8b5de6a1f4c1c611c47a96f630f0df11da9207b/frida-15.0.7.tar.gz#sha256=1848e4b951cf5fcd5ccb22b9b5ca4a21f121e6b24ac2fba8b91ceec09addd40b">frida-15.0.7.tar.gz</a><br/>'
'<a href="../../packages/b3/a4/61156ee1b30fae228f1d202a4b8d08aeb31352985da4b33b225f41ec3932/frida-15.0.8-py2.7-linux-aarch64.egg#sha256=6e4e02e61f7a4acc8f372985a86a35f5a5bc2f9b327f063371472fd764d20c92">frida-15.0.8-py2.7-linux-aarch64.egg</a><br/>'
'<a href="../../packages/fa/c6/4a61609a44ec861986b89c8b6163f27515ef88a4e5876a45c8796457ed7d/frida-15.0.8-py2.7-linux-armv7l.egg#sha256=cac41b6072026f195cd7f3bb4280228e1740a87a5bbccdd5d4054a30f673ac01">frida-15.0.8-py2.7-linux-armv7l.egg</a><br/>'
'<a href="../../packages/0e/09/0759a0582adba88b29a64599fec3e9f4f8949e62158e72a1ac87af1e92c6/frida-15.0.8-py2.7-linux-i686.egg#sha256=1d8dee7bb788a4cfacb664c6a47107ec4cd651b0b6707abaa2e3f1143eb092d9">frida-15.0.8-py2.7-linux-i686.egg</a><br/>'
'<a href="../../packages/64/4a/1e1735a8c2f606c953cccfb9d7086c15d19b5151ebd6e0cbcab2e817d6e2/frida-15.0.8-py2.7-linux-x86_64.egg#sha256=e5b29da8394ef5643fc42877856859d544cd2aba0a874a4a700f2ce4521d9780">frida-15.0.8-py2.7-linux-x86_64.egg</a><br/>'
'<a href="../../packages/d5/05/640d0544779eb011dfc5cea9216eaa617ec2436f31e949f33cad9e5de349/frida-15.0.8-py2.7-macosx-10.9-x86_64.egg#sha256=3ab213b7ae45e45fcb3fbb0d7618568914417400a4248b347f3815c322268232">frida-15.0.8-py2.7-macosx-10.9-x86_64.egg</a><br/>'
'<a href="../../packages/d1/20/a65170d6a898541839acb03a16d1dd26499928c937350078765fe1e4beb3/frida-15.0.8-py2.7-macosx-11.0-fat64.egg#sha256=f9e58ff7f6d53640a991d3e77711b0095927103d7bdfef55268b58091938f72e">frida-15.0.8-py2.7-macosx-11.0-fat64.egg</a><br/>'
'<a href="../../packages/5b/50/28a9b1c65ca88f2e5570814db22bdf0fa819f6015fefc97d05878b796fda/frida-15.0.8-py2.7-win-amd64.egg#sha256=2efb63e548773029745e3e057ae4c7647c156af2ed479c5cc31c0167d4c0d9b1">frida-15.0.8-py2.7-win-amd64.egg</a><br/>'
'<a href="../../packages/72/18/3e36e66989828a7e4e8c4936287f5ba5aa1e2d5a7729e613c22171fdc939/frida-15.0.8-py2.7-win32.egg#sha256=cf0b5ac48f100c73b4eb33533f22eb4e4e2968a3b617c3e3a9671e2f1f7187d2">frida-15.0.8-py2.7-win32.egg</a><br/>'
'<a href="../../packages/3f/54/bc43a1cb31e5ca7974e38d9eec022d110233baa576b61446036fcfbd652d/frida-15.0.8-py3.6-linux-aarch64.egg#sha256=091f7e5b340f554064a8a675dcdb45f450c8c302f1543f92ccd61b6379ded37c">frida-15.0.8-py3.6-linux-aarch64.egg</a><br/>'
'<a href="../../packages/21/68/c23ad9197d39f8c953f72b8673ce3832842cbbfea32482712f9b3890c336/frida-15.0.8-py3.6-linux-armv7l.egg#sha256=1a43484f43a86e1adff050b87dedecd3f2a93f0d90d41b13b70427737613f53a">frida-15.0.8-py3.6-linux-armv7l.egg</a><br/>'
'<a href="../../packages/42/b0/58993429bb518a2c387d8cdb056a1f298fed627658e026a4f625c2e0d2be/frida-15.0.8-py3.8-android-aarch64.egg#sha256=a23853e0f81ce27da5e6cc07082849a673b2c8c148e40f7eaf79392e7181c1e7">frida-15.0.8-py3.8-android-aarch64.egg</a><br/>'
'<a href="../../packages/f3/5c/1132414e96543b68e0ee986e5d4f5c96ee2be80faf9662862db2a081e065/frida-15.0.8-py3.8-linux-i686.egg#sha256=2dcd57cd6ba60e0ea78edd7a1c1e68ac0c1c34ea8079fa30512a0021d5e7cd1f">frida-15.0.8-py3.8-linux-i686.egg</a><br/>'
'<a href="../../packages/0b/20/11101c2cc053bbe3695c8778ffb239e49c0bc24066257bc3246ef67770d9/frida-15.0.8-py3.8-linux-x86_64.egg#sha256=6b3f42225c22a1f149107f963abe9f7b5f32eb4915fe8fa8286e5657a7b6c789">frida-15.0.8-py3.8-linux-x86_64.egg</a><br/>'
'<a href="../../packages/f3/40/6cd6ebfe475c13ef2204f0163233f47611bbcc8b2abc8b38c8a6a34a1040/frida-15.0.8-py3.8-macosx-10.9-x86_64.egg#sha256=861e0463089e3f7c92f1a91e3518c4d3e820cde270c78b76c46f68db859e9022">frida-15.0.8-py3.8-macosx-10.9-x86_64.egg</a><br/>'
'<a href="../../packages/3d/35/26f4baf9e6916707fd19d6e8df28d87111e782e10b3f0fb369d470212581/frida-15.0.8-py3.8-macosx-11.0-arm64.egg#sha256=ee93a3fe432bf5b877a138d591e7bcd7794b235811967de7e60cef6d76342480">frida-15.0.8-py3.8-macosx-11.0-arm64.egg</a><br/>'
'<a href="../../packages/6c/1a/d5fc597bd5e09604aa97964d59017591847cb8b9026ee44a1ecf098820b1/frida-15.0.8-py3.8-win-amd64.egg#sha256=f21855d2539f8b82cb579a2cd6683c8443337365ab17b1d0c220fc3ceb6f4c92">frida-15.0.8-py3.8-win-amd64.egg</a><br/>'
'<a href="../../packages/63/54/35a70eb9212a11fbcf3de83ca89d776733768f7ddada85b69853e5bce2fe/frida-15.0.8-py3.8-win32.egg#sha256=ebc2ba7f0808690c52051f361ef05594107373700b00841e8325129efef0cec2">frida-15.0.8-py3.8-win32.egg</a><br/>'
'<a href="../../packages/e4/0f/9954d94b174ba703b7018ae01c5e37189715a7b1616a2341794ccbefe834/frida-15.0.8.tar.gz#sha256=de2df2924770601ce39cdc992fa3690b4a0891d614a515cad03bc1b94e762ff1">frida-15.0.8.tar.gz</a><br/>'
)
htmls.append(html)
cases.extend(
[
(setup.PEP503PageParser("frida", "15.1.0", "win-amd64"), html, []),
(
setup.PEP503PageParser("frida", "15.0.7", "win-amd64"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/e0/5c/b45c8f27482d81179eb640726b703f95c624cc4f32ae3ed3f8bc858ae5d9/frida-15.0.7-py2.7-win-amd64.egg#sha256=eb696528b9c19f1895123e731b094363a87a4412d7ea4fcb54ef71841f7b3c1e",
filename="frida-15.0.7-py2.7-win-amd64.egg",
major=2,
minor=7,
micro=None,
),
setup.ParsedUrlInfo(
url="../../packages/77/34/6ebaea697f3df72818e60c6494a716c51f7f13b3da323598c1711d21779c/frida-15.0.7-py3.8-win-amd64.egg#sha256=a9964cc6dd4e3ea71c42b1800c79571c670905dc82cd769302b066499fff7bf4",
filename="frida-15.0.7-py3.8-win-amd64.egg",
major=3,
minor=8,
micro=None,
),
],
),
(
setup.PEP503PageParser("frida", "15.0.7", "linux-i686"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/e3/21/da75f6207f76750799d68938707a74d46512e666293eb550247bf5314613/frida-15.0.7-py2.7-linux-i686.egg#sha256=444246bad3b2222efec301e96c2d6ac5da039d41acd655f6d5b6e548637cae09",
filename="frida-15.0.7-py2.7-linux-i686.egg",
major=2,
minor=7,
micro=None,
),
setup.ParsedUrlInfo(
url="../../packages/19/d3/a4a1980005e232399575aeb2ae973d2087a94ec7dbaf6d7a481612979fc7/frida-15.0.7-py3.8-linux-i686.egg#sha256=ed922ec0258e95f39b4004066b72fb48546041d28602e55d44ca12effa80e8bf",
filename="frida-15.0.7-py3.8-linux-i686.egg",
major=3,
minor=8,
micro=None,
),
],
),
(
setup.PEP503PageParser("frida", "15.0.8", "linux-x86_64"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/64/4a/1e1735a8c2f606c953cccfb9d7086c15d19b5151ebd6e0cbcab2e817d6e2/frida-15.0.8-py2.7-linux-x86_64.egg#sha256=e5b29da8394ef5643fc42877856859d544cd2aba0a874a4a700f2ce4521d9780",
filename="frida-15.0.8-py2.7-linux-x86_64.egg",
major=2,
minor=7,
micro=None,
),
setup.ParsedUrlInfo(
url="../../packages/0b/20/11101c2cc053bbe3695c8778ffb239e49c0bc24066257bc3246ef67770d9/frida-15.0.8-py3.8-linux-x86_64.egg#sha256=6b3f42225c22a1f149107f963abe9f7b5f32eb4915fe8fa8286e5657a7b6c789",
filename="frida-15.0.8-py3.8-linux-x86_64.egg",
major=3,
minor=8,
micro=None,
),
],
),
(setup.PEP503PageParser("frida", "15.0.7", "linux-amd64"), html, []),
(
setup.PEP503PageParser("frida", "15.0.8", "macosx-11.0-fat64"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/d1/20/a65170d6a898541839acb03a16d1dd26499928c937350078765fe1e4beb3/frida-15.0.8-py2.7-macosx-11.0-fat64.egg#sha256=f9e58ff7f6d53640a991d3e77711b0095927103d7bdfef55268b58091938f72e",
filename="frida-15.0.8-py2.7-macosx-11.0-fat64.egg",
major=2,
minor=7,
micro=None,
),
],
),
]
)
html = (
"<h3>frida-15.1.1-py3.8-linux-x86_64.egg</h3>"
'<a href="../../packages/e4/c1/82e361bbaa535b334f5b1b432b4573a7871fa973ede'
"b3aab9dbb6b3b4cdc/frida-15.1.1-py3.8-linux-x86_64.egg#sha256=505f4ffa34cc"
'7d68664fcd00d469f5d832e6778800d112aadb8a13692f984b40">frida-15.1.1-py3.8-'
"linux-x86_64.egg</a><br/>"
)
htmls.append(html)
cases.extend(
[
(
setup.PEP503PageParser("frida", "15.1.1", "linux-x86_64"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/e4/c1/82e361bbaa535b334f5b1b432b4573a7871fa973edeb3aab9dbb6b3b4cdc/frida-15.1.1-py3.8-linux-x86_64.egg#sha256=505f4ffa34cc7d68664fcd00d469f5d832e6778800d112aadb8a13692f984b40",
filename="frida-15.1.1-py3.8-linux-x86_64.egg",
major=3,
minor=8,
micro=None,
),
],
),
]
)
html = (
'<a role="button" tabindex="0">frida-15.0.1-py3.8-android-aarch64.egg</a>'
'<a href="../../packages/3e/80/78fa3ed5fd636b606dc06157069b37eb677652cd985'
"739cde35a86d7a362/frida-15.0.1-py3.8-android-aarch64.egg#sha256=d44bc3415"
'90dd8cf2623089b54aa16d697536fb016fde0ecd6df5262723c652b">frida-15.0.1-py3'
".8-android-aarch64.egg</a><br/>"
)
htmls.append(html)
cases.extend(
[
(
setup.PEP503PageParser("frida", "15.0.1", "android-aarch64"),
html,
[
setup.ParsedUrlInfo(
url="../../packages/3e/80/78fa3ed5fd636b606dc06157069b37eb677652cd985739cde35a86d7a362/frida-15.0.1-py3.8-android-aarch64.egg#sha256=d44bc341590dd8cf2623089b54aa16d697536fb016fde0ecd6df5262723c652b",
filename="frida-15.0.1-py3.8-android-aarch64.egg",
major=3,
minor=8,
micro=None,
),
],
),
]
)
class TestPEP503PageParser(unittest.TestCase):
def test_parse_html(self):
for parser, html, result in cases:
for _ in range(2):
parser.reset()
parser.feed(html)
assert parser.urls == result, (parser.urls, result)