Name | primp JSON |
Version |
0.7.0
JSON |
| download |
home_page | None |
Summary | HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints |
upload_time | 2024-11-03 20:40:32 |
maintainer | None |
docs_url | None |
author | deedy5 |
requires_python | >=3.8 |
license | MIT License |
keywords |
python
request
impersonate
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
![Python >= 3.8](https://img.shields.io/badge/python->=3.8-red.svg) [![](https://badgen.net/github/release/deedy5/pyreqwest-impersonate)](https://github.com/deedy5/pyreqwest-impersonate/releases) [![](https://badge.fury.io/py/primp.svg)](https://pypi.org/project/primp) [![Downloads](https://static.pepy.tech/badge/primp/week)](https://pepy.tech/project/primp) [![CI](https://github.com/deedy5/pyreqwest-impersonate/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/deedy5/pyreqwest-impersonate/actions/workflows/CI.yml)
# 🪞PRIMP
**🪞PRIMP** = **P**ython **R**equests **IMP**ersonate
The fastest python HTTP client that can impersonate web browsers.</br>
Provides precompiled wheels:</br>
* 🐧 linux|musl: `amd64`, `aarch64` (⚠️warning: linux `aarch64` build is `manylinux_2_34` compatible - `ubuntu>=22.04`, `debian>=12`);</br>
* 🪟 windows: `amd64`;</br>
* 🍏 macos: `amd64`, `aarch64`.</br>
## Table of Contents
- [Installation](#installation)
- [Benchmark](#benchmark)
- [Usage](#usage)
- [I. Client](#i-client)
- [Client methods](#client-methods)
- [Response object](#response-object)
- [Examples](#examples)
- [II. AsyncClient](#ii-asyncclient)
## Installation
```python
pip install -U primp
```
## Benchmark
![](https://github.com/deedy5/primp/blob/main/benchmark.jpg?raw=true)
## Usage
### I. Client
HTTP client that can impersonate web browsers.
```python
class Client:
"""Initializes an HTTP client that can impersonate web browsers.
Args:
auth (tuple, optional): A tuple containing the username and password for basic authentication. Default is None.
auth_bearer (str, optional): Bearer token for authentication. Default is None.
params (dict, optional): Default query parameters to include in all requests. Default is None.
headers (dict, optional): Default headers to send with requests. If `impersonate` is set, this will be ignored.
cookies (dict, optional): - An optional map of cookies to send with requests as the `Cookie` header.
timeout (float, optional): HTTP request timeout in seconds. Default is 30.
cookie_store (bool, optional): Enable a persistent cookie store. Received cookies will be preserved and included
in additional requests. Default is True.
referer (bool, optional): Enable or disable automatic setting of the `Referer` header. Default is True.
proxy (str, optional): Proxy URL for HTTP requests. Example: "socks5://127.0.0.1:9150". Default is None.
impersonate (str, optional): Entity to impersonate. Example: "chrome_124". Default is None.
Chrome: "chrome_100","chrome_101","chrome_104","chrome_105","chrome_106","chrome_107","chrome_108",
"chrome_109","chrome_114","chrome_116","chrome_117","chrome_118","chrome_119","chrome_120",
"chrome_123","chrome_124","chrome_126","chrome_127","chrome_128","chrome_129","chrome_130"
Safari: "safari_ios_16.5","safari_ios_17.2","safari_ios_17.4.1","safari_15.3","safari_15.5","safari_15.6.1",
"safari_16","safari_16.5","safari_17.0","safari_17.2.1","safari_17.4.1","safari_17.5","safari_18",
"safari_ipad_18"
OkHttp: "okhttp_3.9","okhttp_3.11","okhttp_3.13","okhttp_3.14","okhttp_4.9","okhttp_4.10","okhttp_5"
Edge: "edge_101","edge_122","edge_127"
follow_redirects (bool, optional): Whether to follow redirects. Default is True.
max_redirects (int, optional): Maximum redirects to follow. Default 20. Applies if `follow_redirects` is True.
verify (bool, optional): Verify SSL certificates. Default is True.
ca_cert_file (str, optional): Path to CA certificate store. Default is None.
http1 (bool, optional): Use only HTTP/1.1. Default is None.
http2 (bool, optional): Use only HTTP/2. Default is None.
"""
```
#### Client methods
The `Client` class provides a set of methods for making HTTP requests: `get`, `head`, `options`, `delete`, `post`, `put`, `patch`, each of which internally utilizes the `request()` method for execution. The parameters for these methods closely resemble those in `httpx`.
```python
def get(
url: str,
params: Optional[Dict[str, str]] = None,
headers: Optional[Dict[str, str]] = None,
cookies: Optional[Dict[str, str]] = None,
auth: Optional[Tuple[str, Optional[str]]] = None,
auth_bearer: Optional[str] = None,
timeout: Optional[float] = 30,
):
"""Performs a GET request to the specified URL.
Args:
url (str): The URL to which the request will be made.
params (Optional[Dict[str, str]]): A map of query parameters to append to the URL. Default is None.
headers (Optional[Dict[str, str]]): A map of HTTP headers to send with the request. Default is None.
cookies (Optional[Dict[str, str]]): - An optional map of cookies to send with requests as the `Cookie` header.
auth (Optional[Tuple[str, Optional[str]]]): A tuple containing the username and an optional password
for basic authentication. Default is None.
auth_bearer (Optional[str]): A string representing the bearer token for bearer token authentication. Default is None.
timeout (Optional[float]): The timeout for the request in seconds. Default is 30.
"""
```
```python
def post(
url: str,
params: Optional[Dict[str, str]] = None,
headers: Optional[Dict[str, str]] = None,
cookies: Optional[Dict[str, str]] = None,
content: Optional[bytes] = None,
data: Optional[Dict[str, str]] = None,
json: Any = None,
files: Optional[Dict[str, bytes]] = None,
auth: Optional[Tuple[str, Optional[str]]] = None,
auth_bearer: Optional[str] = None,
timeout: Optional[float] = 30,
):
"""Performs a POST request to the specified URL.
Args:
url (str): The URL to which the request will be made.
params (Optional[Dict[str, str]]): A map of query parameters to append to the URL. Default is None.
headers (Optional[Dict[str, str]]): A map of HTTP headers to send with the request. Default is None.
cookies (Optional[Dict[str, str]]): - An optional map of cookies to send with requests as the `Cookie` header.
content (Optional[bytes]): The content to send in the request body as bytes. Default is None.
data (Optional[Dict[str, str]]): The form data to send in the request body. Default is None.
json (Any): A JSON serializable object to send in the request body. Default is None.
files (Optional[Dict[str, bytes]]): A map of file fields to file contents to be sent as multipart/form-data. Default is None.
auth (Optional[Tuple[str, Optional[str]]]): A tuple containing the username and an optional password
for basic authentication. Default is None.
auth_bearer (Optional[str]): A string representing the bearer token for bearer token authentication. Default is None.
timeout (Optional[float]): The timeout for the request in seconds. Default is 30.
"""
```
#### Response object
```python
resp.content
resp.cookies
resp.encoding
resp.headers
resp.json()
resp.status_code
resp.text
resp.text_markdown # html is converted to markdown text
resp.text_plain # html is converted to plain text
resp.text_rich # html is converted to rich text
resp.url
```
#### Examples
```python
import primp
client = primp.Client(impersonate="chrome_130")
# GET request
resp = client.get("https://tls.peet.ws/api/all")
print(resp.json())
# GET request with passing params and setting timeout
params = {"param1": "value1", "param2": "value2"}
resp = client.post(url="https://httpbin.org/anything", params=params, timeout=10)
print(r.text)
# POST Binary Request Data
content = b"some_data"
resp = client.post(url="https://httpbin.org/anything", content=content)
print(r.text)
# POST Form Encoded Data
data = {"key1": "value1", "key2": "value2"}
resp = client.post(url="https://httpbin.org/anything", data=data)
print(r.text)
# POST JSON Encoded Data
json = {"key1": "value1", "key2": "value2"}
resp = client.post(url="https://httpbin.org/anything", json=json)
print(r.text)
# POST Multipart-Encoded Files
files = {'file1': open('file1.txt', 'rb').read(), 'file2': open('file2.txt', 'rb').read()}
r = client.post("https://httpbin.org/post", files=files)
print(r.text)
# Authentication using user/password
auth = ("user", "password")
resp = client.post(url="https://httpbin.org/anything", auth=auth)
print(r.text)
# Authentication using auth bearer
auth_bearer = "bearerXXXXXXXXXXXXXXXXXXXX"
resp = client.post(url="https://httpbin.org/anything", auth_bearer=auth_bearer)
print(r.text)
# Using proxy
resp = primp.Client(proxy="http://127.0.0.1:8080").get("https://tls.peet.ws/api/all")
print(resp.json())
# Using custom CA certificate store: file or certifi.where()
resp = primp.Client(ca_cert_file="/cert/cacert.pem").get("https://tls.peet.ws/api/all")
print(resp.json())
resp = primp.Client(ca_cert_file=certifi.where()).get("https://tls.peet.ws/api/all")
print(resp.json())
# You can also use convenience functions that use a default Client instance under the hood:
# primp.get() | primp.head() | primp.options() | primp.delete() | primp.post() | primp.patch() | primp.put()
# These functions can accept the `impersonate` parameter:
resp = primp.get("https://httpbin.org/anything", impersonate="chrome_130")
print(r.text)
```
### II. AsyncClient
TODO
Raw data
{
"_id": null,
"home_page": null,
"name": "primp",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "python, request, impersonate",
"author": "deedy5",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/1b/d6/8cab1dbd8a18bb0c4d040462e817c8404dadd34401890d6f55690561285c/primp-0.7.0.tar.gz",
"platform": null,
"description": "![Python >= 3.8](https://img.shields.io/badge/python->=3.8-red.svg) [![](https://badgen.net/github/release/deedy5/pyreqwest-impersonate)](https://github.com/deedy5/pyreqwest-impersonate/releases) [![](https://badge.fury.io/py/primp.svg)](https://pypi.org/project/primp) [![Downloads](https://static.pepy.tech/badge/primp/week)](https://pepy.tech/project/primp) [![CI](https://github.com/deedy5/pyreqwest-impersonate/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/deedy5/pyreqwest-impersonate/actions/workflows/CI.yml)\n# \ud83e\ude9ePRIMP\n**\ud83e\ude9ePRIMP** = **P**ython **R**equests **IMP**ersonate\n\nThe fastest python HTTP client that can impersonate web browsers.</br>\nProvides precompiled wheels:</br>\n * \ud83d\udc27 linux|musl: `amd64`, `aarch64` (\u26a0\ufe0fwarning: linux `aarch64` build is `manylinux_2_34` compatible - `ubuntu>=22.04`, `debian>=12`);</br> \n * \ud83e\ude9f windows: `amd64`;</br>\n * \ud83c\udf4f macos: `amd64`, `aarch64`.</br>\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Benchmark](#benchmark)\n- [Usage](#usage)\n - [I. Client](#i-client)\n - [Client methods](#client-methods)\n - [Response object](#response-object)\n - [Examples](#examples)\n - [II. AsyncClient](#ii-asyncclient)\n\n## Installation\n\n```python\npip install -U primp\n```\n\n## Benchmark\n\n![](https://github.com/deedy5/primp/blob/main/benchmark.jpg?raw=true)\n\n## Usage\n### I. Client\n\nHTTP client that can impersonate web browsers.\n```python\nclass Client:\n \"\"\"Initializes an HTTP client that can impersonate web browsers.\n \n Args:\n auth (tuple, optional): A tuple containing the username and password for basic authentication. Default is None.\n auth_bearer (str, optional): Bearer token for authentication. Default is None.\n params (dict, optional): Default query parameters to include in all requests. Default is None.\n headers (dict, optional): Default headers to send with requests. If `impersonate` is set, this will be ignored.\n cookies (dict, optional): - An optional map of cookies to send with requests as the `Cookie` header.\n timeout (float, optional): HTTP request timeout in seconds. Default is 30.\n cookie_store (bool, optional): Enable a persistent cookie store. Received cookies will be preserved and included \n in additional requests. Default is True.\n referer (bool, optional): Enable or disable automatic setting of the `Referer` header. Default is True.\n proxy (str, optional): Proxy URL for HTTP requests. Example: \"socks5://127.0.0.1:9150\". Default is None.\n impersonate (str, optional): Entity to impersonate. Example: \"chrome_124\". Default is None.\n Chrome: \"chrome_100\",\"chrome_101\",\"chrome_104\",\"chrome_105\",\"chrome_106\",\"chrome_107\",\"chrome_108\",\n \"chrome_109\",\"chrome_114\",\"chrome_116\",\"chrome_117\",\"chrome_118\",\"chrome_119\",\"chrome_120\",\n \"chrome_123\",\"chrome_124\",\"chrome_126\",\"chrome_127\",\"chrome_128\",\"chrome_129\",\"chrome_130\"\n Safari: \"safari_ios_16.5\",\"safari_ios_17.2\",\"safari_ios_17.4.1\",\"safari_15.3\",\"safari_15.5\",\"safari_15.6.1\",\n \"safari_16\",\"safari_16.5\",\"safari_17.0\",\"safari_17.2.1\",\"safari_17.4.1\",\"safari_17.5\",\"safari_18\", \n \"safari_ipad_18\"\n OkHttp: \"okhttp_3.9\",\"okhttp_3.11\",\"okhttp_3.13\",\"okhttp_3.14\",\"okhttp_4.9\",\"okhttp_4.10\",\"okhttp_5\"\n Edge: \"edge_101\",\"edge_122\",\"edge_127\"\n follow_redirects (bool, optional): Whether to follow redirects. Default is True.\n max_redirects (int, optional): Maximum redirects to follow. Default 20. Applies if `follow_redirects` is True.\n verify (bool, optional): Verify SSL certificates. Default is True.\n ca_cert_file (str, optional): Path to CA certificate store. Default is None.\n http1 (bool, optional): Use only HTTP/1.1. Default is None.\n http2 (bool, optional): Use only HTTP/2. Default is None.\n \n \"\"\"\n```\n\n#### Client methods\n\nThe `Client` class provides a set of methods for making HTTP requests: `get`, `head`, `options`, `delete`, `post`, `put`, `patch`, each of which internally utilizes the `request()` method for execution. The parameters for these methods closely resemble those in `httpx`.\n```python\ndef get(\n url: str, \n params: Optional[Dict[str, str]] = None, \n headers: Optional[Dict[str, str]] = None, \n cookies: Optional[Dict[str, str]] = None, \n auth: Optional[Tuple[str, Optional[str]]] = None, \n auth_bearer: Optional[str] = None, \n timeout: Optional[float] = 30,\n):\n \"\"\"Performs a GET request to the specified URL.\n\n Args:\n url (str): The URL to which the request will be made.\n params (Optional[Dict[str, str]]): A map of query parameters to append to the URL. Default is None.\n headers (Optional[Dict[str, str]]): A map of HTTP headers to send with the request. Default is None.\n cookies (Optional[Dict[str, str]]): - An optional map of cookies to send with requests as the `Cookie` header.\n auth (Optional[Tuple[str, Optional[str]]]): A tuple containing the username and an optional password \n for basic authentication. Default is None.\n auth_bearer (Optional[str]): A string representing the bearer token for bearer token authentication. Default is None.\n timeout (Optional[float]): The timeout for the request in seconds. Default is 30.\n\n \"\"\"\n```\n```python\ndef post(\n url: str, \n params: Optional[Dict[str, str]] = None, \n headers: Optional[Dict[str, str]] = None, \n cookies: Optional[Dict[str, str]] = None, \n content: Optional[bytes] = None, \n data: Optional[Dict[str, str]] = None, \n json: Any = None, \n files: Optional[Dict[str, bytes]] = None, \n auth: Optional[Tuple[str, Optional[str]]] = None, \n auth_bearer: Optional[str] = None, \n timeout: Optional[float] = 30,\n):\n \"\"\"Performs a POST request to the specified URL.\n\n Args:\n url (str): The URL to which the request will be made.\n params (Optional[Dict[str, str]]): A map of query parameters to append to the URL. Default is None.\n headers (Optional[Dict[str, str]]): A map of HTTP headers to send with the request. Default is None.\n cookies (Optional[Dict[str, str]]): - An optional map of cookies to send with requests as the `Cookie` header.\n content (Optional[bytes]): The content to send in the request body as bytes. Default is None.\n data (Optional[Dict[str, str]]): The form data to send in the request body. Default is None.\n json (Any): A JSON serializable object to send in the request body. Default is None.\n files (Optional[Dict[str, bytes]]): A map of file fields to file contents to be sent as multipart/form-data. Default is None.\n auth (Optional[Tuple[str, Optional[str]]]): A tuple containing the username and an optional password \n for basic authentication. Default is None.\n auth_bearer (Optional[str]): A string representing the bearer token for bearer token authentication. Default is None.\n timeout (Optional[float]): The timeout for the request in seconds. Default is 30.\n\n \"\"\"\n```\n#### Response object\n```python\nresp.content\nresp.cookies\nresp.encoding\nresp.headers\nresp.json()\nresp.status_code\nresp.text\nresp.text_markdown # html is converted to markdown text\nresp.text_plain # html is converted to plain text\nresp.text_rich # html is converted to rich text\nresp.url\n```\n\n#### Examples\n\n```python\nimport primp\n\nclient = primp.Client(impersonate=\"chrome_130\")\n\n# GET request\nresp = client.get(\"https://tls.peet.ws/api/all\")\nprint(resp.json())\n\n# GET request with passing params and setting timeout\nparams = {\"param1\": \"value1\", \"param2\": \"value2\"}\nresp = client.post(url=\"https://httpbin.org/anything\", params=params, timeout=10)\nprint(r.text)\n\n# POST Binary Request Data\ncontent = b\"some_data\"\nresp = client.post(url=\"https://httpbin.org/anything\", content=content)\nprint(r.text)\n\n# POST Form Encoded Data\ndata = {\"key1\": \"value1\", \"key2\": \"value2\"}\nresp = client.post(url=\"https://httpbin.org/anything\", data=data)\nprint(r.text)\n\n# POST JSON Encoded Data\njson = {\"key1\": \"value1\", \"key2\": \"value2\"}\nresp = client.post(url=\"https://httpbin.org/anything\", json=json)\nprint(r.text)\n\n# POST Multipart-Encoded Files\nfiles = {'file1': open('file1.txt', 'rb').read(), 'file2': open('file2.txt', 'rb').read()}\nr = client.post(\"https://httpbin.org/post\", files=files)\nprint(r.text)\n\n# Authentication using user/password\nauth = (\"user\", \"password\")\nresp = client.post(url=\"https://httpbin.org/anything\", auth=auth)\nprint(r.text)\n\n# Authentication using auth bearer\nauth_bearer = \"bearerXXXXXXXXXXXXXXXXXXXX\"\nresp = client.post(url=\"https://httpbin.org/anything\", auth_bearer=auth_bearer)\nprint(r.text)\n\n# Using proxy\nresp = primp.Client(proxy=\"http://127.0.0.1:8080\").get(\"https://tls.peet.ws/api/all\")\nprint(resp.json())\n\n# Using custom CA certificate store: file or certifi.where()\nresp = primp.Client(ca_cert_file=\"/cert/cacert.pem\").get(\"https://tls.peet.ws/api/all\")\nprint(resp.json())\nresp = primp.Client(ca_cert_file=certifi.where()).get(\"https://tls.peet.ws/api/all\")\nprint(resp.json())\n\n# You can also use convenience functions that use a default Client instance under the hood:\n# primp.get() | primp.head() | primp.options() | primp.delete() | primp.post() | primp.patch() | primp.put()\n# These functions can accept the `impersonate` parameter:\nresp = primp.get(\"https://httpbin.org/anything\", impersonate=\"chrome_130\")\nprint(r.text)\n```\n\n### II. AsyncClient\n\nTODO\n\n\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints",
"version": "0.7.0",
"project_urls": null,
"split_keywords": [
"python",
" request",
" impersonate"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "fda7f58d70d5aa194052dd32371e9101ce8dd7399b1fcd62f7feada79ddc9922",
"md5": "7b054b5248025a405e343faa4f2fa9c4",
"sha256": "8bb32497584610ca3082969ddc4c789d8e816f5a2f3f4aa0f194ed20047f5e16"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "7b054b5248025a405e343faa4f2fa9c4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 2911501,
"upload_time": "2024-11-03T20:40:27",
"upload_time_iso_8601": "2024-11-03T20:40:27.137388Z",
"url": "https://files.pythonhosted.org/packages/fd/a7/f58d70d5aa194052dd32371e9101ce8dd7399b1fcd62f7feada79ddc9922/primp-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4841926045899d5895ec35a847c1932aee609232915f3d55bc1cec72322c0891",
"md5": "e9efd5806e76bbb9fc8b468bd734504e",
"sha256": "cca885c33171b3191fed91ae588031e79508a32799e15224f5143154769b27d7"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e9efd5806e76bbb9fc8b468bd734504e",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 2706134,
"upload_time": "2024-11-03T20:40:24",
"upload_time_iso_8601": "2024-11-03T20:40:24.627149Z",
"url": "https://files.pythonhosted.org/packages/48/41/926045899d5895ec35a847c1932aee609232915f3d55bc1cec72322c0891/primp-0.7.0-cp38-abi3-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e7a22e3b1adda43a424fb625995147301aaaf930575da15decf1ec564c401167",
"md5": "9aad977704928a862ea86c6dbedf046b",
"sha256": "56b71ed550d393ca6cf28c04032dbd7ce8689b5b268f32ce569466f54a4212b3"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9aad977704928a862ea86c6dbedf046b",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 3016597,
"upload_time": "2024-11-03T20:40:22",
"upload_time_iso_8601": "2024-11-03T20:40:22.648301Z",
"url": "https://files.pythonhosted.org/packages/e7/a2/2e3b1adda43a424fb625995147301aaaf930575da15decf1ec564c401167/primp-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cd8434d73179f87ce387afb6d605bb98e09fd88ed470950bd17df1ded4961691",
"md5": "192708e46a63a08419621349e8b1312f",
"sha256": "3dcc4b0ded6bbaeec3dfe68406caf1aa8a090a6d4a0f1584268b77fb460874e8"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "192708e46a63a08419621349e8b1312f",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 2926718,
"upload_time": "2024-11-03T20:40:20",
"upload_time_iso_8601": "2024-11-03T20:40:20.519650Z",
"url": "https://files.pythonhosted.org/packages/cd/84/34d73179f87ce387afb6d605bb98e09fd88ed470950bd17df1ded4961691/primp-0.7.0-cp38-abi3-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a1d3d7264904c60ae443d6172444085fe7fa592011aa3193b2f8906737e7d7ba",
"md5": "a90d6da1ddddfc07c3c0284b0bbe1a4f",
"sha256": "5fd2b78ef31c8492efff96ea9faebf1ae6635439454168138ee40b647fd5e97d"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "a90d6da1ddddfc07c3c0284b0bbe1a4f",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 3086551,
"upload_time": "2024-11-03T20:40:29",
"upload_time_iso_8601": "2024-11-03T20:40:29.075096Z",
"url": "https://files.pythonhosted.org/packages/a1/d3/d7264904c60ae443d6172444085fe7fa592011aa3193b2f8906737e7d7ba/primp-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "31b264663f050340d17eb517f49442483bab5193f9e304dd53e3923e2d21d3fe",
"md5": "22de70ddbab5bfe52a88005bf2d2194a",
"sha256": "f8fdb7432fc28c71918964b3d8e4d204a8b06a1394813571e4cac4c1aab684b9"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "22de70ddbab5bfe52a88005bf2d2194a",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 3247920,
"upload_time": "2024-11-03T20:40:30",
"upload_time_iso_8601": "2024-11-03T20:40:30.950124Z",
"url": "https://files.pythonhosted.org/packages/31/b2/64663f050340d17eb517f49442483bab5193f9e304dd53e3923e2d21d3fe/primp-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ddc6d56c87a668909b7bb86736f36a1b482ec5ce7aaedd612e1fae393d095e0d",
"md5": "f5ae95bb8f699dff8f93ff7ec1cb5f5c",
"sha256": "5d0523d457b6b2b40c525bc9dff641e00b01f1402492d1a98e77152e77f3ddad"
},
"downloads": -1,
"filename": "primp-0.7.0-cp38-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "f5ae95bb8f699dff8f93ff7ec1cb5f5c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 2961353,
"upload_time": "2024-11-03T20:40:34",
"upload_time_iso_8601": "2024-11-03T20:40:34.109703Z",
"url": "https://files.pythonhosted.org/packages/dd/c6/d56c87a668909b7bb86736f36a1b482ec5ce7aaedd612e1fae393d095e0d/primp-0.7.0-cp38-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1bd68cab1dbd8a18bb0c4d040462e817c8404dadd34401890d6f55690561285c",
"md5": "50c654eaed6de6b81798c63315c669a0",
"sha256": "bef2c1f2e6386c4cc430758a5ddbaee7c5f730cea79e0c4fe69fd9b6a29d35d4"
},
"downloads": -1,
"filename": "primp-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "50c654eaed6de6b81798c63315c669a0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 78411,
"upload_time": "2024-11-03T20:40:32",
"upload_time_iso_8601": "2024-11-03T20:40:32.668697Z",
"url": "https://files.pythonhosted.org/packages/1b/d6/8cab1dbd8a18bb0c4d040462e817c8404dadd34401890d6f55690561285c/primp-0.7.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-03 20:40:32",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "primp"
}