gendisjawi
commited on
Commit
•
359264c
1
Parent(s):
9bb4bf3
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +24 -0
- README.md +1 -0
- bore +3 -0
- docker-compose.yaml +21 -0
- domain-ngrok.txt +1 -0
- share/readme.txt +18 -0
- try-on/.env +3 -0
- try-on/README.md +110 -0
- try-on/app.py +199 -0
- try-on/env/bin/Activate.ps1 +241 -0
- try-on/env/bin/activate +76 -0
- try-on/env/bin/activate.csh +37 -0
- try-on/env/bin/activate.fish +75 -0
- try-on/env/bin/dotenv +8 -0
- try-on/env/bin/easy_install +8 -0
- try-on/env/bin/easy_install-3.8 +8 -0
- try-on/env/bin/f2py +8 -0
- try-on/env/bin/f2py3 +8 -0
- try-on/env/bin/f2py3.8 +8 -0
- try-on/env/bin/flask +8 -0
- try-on/env/bin/httpx +8 -0
- try-on/env/bin/huggingface-cli +8 -0
- try-on/env/bin/normalizer +8 -0
- try-on/env/bin/pip +8 -0
- try-on/env/bin/pip3 +8 -0
- try-on/env/bin/pip3.8 +8 -0
- try-on/env/bin/python +3 -0
- try-on/env/bin/python3 +3 -0
- try-on/env/bin/python3.8 +3 -0
- try-on/env/bin/tqdm +8 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER +1 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst +28 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/METADATA +93 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/RECORD +14 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL +6 -0
- try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt +1 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst +7 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/INSTALLER +1 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/LICENSE +21 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/METADATA +97 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/RECORD +32 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/WHEEL +5 -0
- try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/top_level.txt +1 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/INSTALLER +1 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/LICENSE +20 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/METADATA +46 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/RECORD +43 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/WHEEL +6 -0
- try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/top_level.txt +2 -0
- try-on/env/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc +0 -0
.gitattributes
CHANGED
@@ -33,3 +33,27 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
bore filter=lfs diff=lfs merge=lfs -text
|
37 |
+
try-on/env/bin/python filter=lfs diff=lfs merge=lfs -text
|
38 |
+
try-on/env/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
39 |
+
try-on/env/bin/python3.8 filter=lfs diff=lfs merge=lfs -text
|
40 |
+
try-on/env/lib/python3.8/site-packages/aiohttp/_http_parser.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
41 |
+
try-on/env/lib/python3.8/site-packages/cv2/cv2.abi3.so filter=lfs diff=lfs merge=lfs -text
|
42 |
+
try-on/env/lib/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
43 |
+
try-on/env/lib/python3.8/site-packages/numpy/core/_simd.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
44 |
+
try-on/env/lib/python3.8/site-packages/numpy.libs/libgfortran-040039e1.so.5.0.0 filter=lfs diff=lfs merge=lfs -text
|
45 |
+
try-on/env/lib/python3.8/site-packages/numpy.libs/libopenblas64_p-r0-15028c96.3.21.so filter=lfs diff=lfs merge=lfs -text
|
46 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Core-e6d3f451.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
|
47 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Gui-5dea4132.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
|
48 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Widgets-e392eaf8.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
|
49 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5XcbQpa-3bf8a55a.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
|
50 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libavcodec-9aae324f.so.59.37.100 filter=lfs diff=lfs merge=lfs -text
|
51 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libavformat-3ff1be5b.so.59.27.100 filter=lfs diff=lfs merge=lfs -text
|
52 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libcrypto-337dac8b.so.1.1 filter=lfs diff=lfs merge=lfs -text
|
53 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libgfortran-91cc3cb1.so.3.0.0 filter=lfs diff=lfs merge=lfs -text
|
54 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libopenblas-r0-f650aae0.3.3.so filter=lfs diff=lfs merge=lfs -text
|
55 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libpng16-1bde1c40.so.16.43.0 filter=lfs diff=lfs merge=lfs -text
|
56 |
+
try-on/env/lib/python3.8/site-packages/opencv_python.libs/libvpx-c3a7933e.so.9.0.0 filter=lfs diff=lfs merge=lfs -text
|
57 |
+
try-on/env/lib/python3.8/site-packages/yaml/_yaml.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
58 |
+
win/data.img filter=lfs diff=lfs merge=lfs -text
|
59 |
+
win/windows.rom filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
# ruang-rindu
|
bore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f44936a327daf82ebe609359d9fccc6d77039fc61e0054de0344b1a5aeb85c9c
|
3 |
+
size 6298496
|
docker-compose.yaml
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
services:
|
2 |
+
windows:
|
3 |
+
image: dockurr/windows
|
4 |
+
container_name: windows
|
5 |
+
environment:
|
6 |
+
RAM_SIZE: "10G"
|
7 |
+
CPU_CORES: "2"
|
8 |
+
DISK_SIZE: "20G"
|
9 |
+
VERSION: "11"
|
10 |
+
devices:
|
11 |
+
- /dev/kvm
|
12 |
+
cap_add:
|
13 |
+
- NET_ADMIN
|
14 |
+
ports:
|
15 |
+
- 8006:8006
|
16 |
+
- 3389:3389/tcp
|
17 |
+
- 3389:3389/udp
|
18 |
+
stop_grace_period: 2m
|
19 |
+
volumes:
|
20 |
+
- /workspaces/ruang-rindu/win:/storage
|
21 |
+
- /workspaces/ruang-rindu/share:/data
|
domain-ngrok.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
ngrok http --url=26499a1c4bfb-550921446110692386.ngrok-free.app 80
|
share/readme.txt
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
--------------------------------------------------------
|
2 |
+
Windows for Docker v4.05...
|
3 |
+
For support visit https://github.com/dockur/windows
|
4 |
+
--------------------------------------------------------
|
5 |
+
|
6 |
+
Using this folder you can share files with the host machine.
|
7 |
+
|
8 |
+
To change its location, include the following bind mount in your compose file:
|
9 |
+
|
10 |
+
volumes:
|
11 |
+
- "/home/example:/data"
|
12 |
+
|
13 |
+
Or in your run command:
|
14 |
+
|
15 |
+
-v "/home/example:/data"
|
16 |
+
|
17 |
+
Replace the example path /home/example with the desired shared folder.
|
18 |
+
|
try-on/.env
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
TWILIO_ACCOUNT_SID=AC0241772166fa5b2d70bf06a693ec1aac
|
2 |
+
TWILIO_AUTH_TOKEN=6e60bca9c0f656f18082fb90b76d9ed0
|
3 |
+
TWILIO_WHATSAPP_NUMBER='whatsapp:+14155238886'
|
try-on/README.md
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
![4179993](https://github.com/user-attachments/assets/9057edbb-6d9f-4aba-8bce-1ff120f7b970)
|
2 |
+
# Virtual Try-On Prototype with Flask, Twilio, and Hugging Face's Gradio API !
|
3 |
+
|
4 |
+
This repository contains the code for a virtual try-on application built using Flask, Twilio's WhatsApp API, and Gradio's virtual try-on model. Users can send images via WhatsApp to Twilio to try on garments virtually, and the results are sent back to them.
|
5 |
+
|
6 |
+
## Features
|
7 |
+
- Receive images of a person and a garment via WhatsApp.
|
8 |
+
- Use Gradio’s API to generate virtual try-on results.
|
9 |
+
- Return the result image to the user via WhatsApp.
|
10 |
+
- Uses Twilio Sandbox for WhatsApp for easy prototyping and testing.
|
11 |
+
|
12 |
+
## Technologies Used
|
13 |
+
- **Flask**: Backend server to handle requests and interact with Twilio and Gradio.
|
14 |
+
- **Twilio API**: To send and receive WhatsApp messages and media.
|
15 |
+
- **Gradio**: For interacting with the virtual try-on model.
|
16 |
+
- **Ngrok**: For exposing the local server to the internet for WhatsApp interaction.
|
17 |
+
- **OpenCV**: For handling images.
|
18 |
+
|
19 |
+
## Prerequisites
|
20 |
+
Before running this project, ensure you have the following:
|
21 |
+
- Twilio account with WhatsApp sandbox setup.
|
22 |
+
- Hugging Face account to use the Gradio API.
|
23 |
+
- Python 3.6+ installed on your machine.
|
24 |
+
|
25 |
+
## Twilio Setup
|
26 |
+
1. Create a [Twilio account](https://www.twilio.com/try-twilio).
|
27 |
+
2. Activate the [Twilio Sandbox for WhatsApp](https://www.twilio.com/console/sms/whatsapp/sandbox):
|
28 |
+
- In the Twilio console, navigate to the **Messaging** section and select **Try it Out** under the **WhatsApp** sandbox.
|
29 |
+
- Follow the instructions to join the sandbox by sending a WhatsApp message to the provided Twilio number.
|
30 |
+
3. Get your **Twilio Account SID** and **Auth Token** from your Twilio console:
|
31 |
+
- Go to **Settings** in the Twilio console to find these credentials.
|
32 |
+
4. Take note of the **Twilio Sandbox number** for sending and receiving WhatsApp messages.
|
33 |
+
|
34 |
+
Once the sandbox is set up, you can start receiving and sending messages to the WhatsApp sandbox number for testing your virtual try-on application.
|
35 |
+
|
36 |
+
## Hugging Face Setup
|
37 |
+
1. Create a [Hugging Face account](https://huggingface.co/join).
|
38 |
+
2. Use the **Nymbo Virtual Try-On** model as API available on Hugging Face Spaces: [Nymbo Virtual Try-On](https://huggingface.co/spaces/Nymbo/Virtual-Try-On).
|
39 |
+
|
40 |
+
## Installation
|
41 |
+
Clone the repository:
|
42 |
+
```bash
|
43 |
+
git clone https://github.com/adarshb3/Virtual-Try-On-Application-using-Flask-Twilio-and-Gradio.git
|
44 |
+
cd Virtual-Try-On-Application-using-Flask-Twilio-and-Gradio
|
45 |
+
```
|
46 |
+
Install the required Python packages:
|
47 |
+
```
|
48 |
+
pip install -r requirements.txt
|
49 |
+
```
|
50 |
+
Set up your environment variables:
|
51 |
+
```
|
52 |
+
TWILIO_ACCOUNT_SID=your_account_sid
|
53 |
+
TWILIO_AUTH_TOKEN=your_auth_token
|
54 |
+
```
|
55 |
+
|
56 |
+
## Running the Application
|
57 |
+
Start the Flask server:
|
58 |
+
```
|
59 |
+
python app.py
|
60 |
+
```
|
61 |
+
## Ngrok Setup for Local Development
|
62 |
+
Since the Flask server runs locally, we use **ngrok** to expose the server to the internet so that Twilio's WhatsApp Sandbox can communicate with it.
|
63 |
+
|
64 |
+
1. Download and install ngrok from [here](https://ngrok.com/download).
|
65 |
+
2. Once installed, authenticate ngrok by running:
|
66 |
+
```
|
67 |
+
ngrok authtoken your_ngrok_auth_token
|
68 |
+
```
|
69 |
+
(Get your authentication token from the ngrok dashboard after signing up).
|
70 |
+
3. Start ngrok to expose your local Flask server:
|
71 |
+
```
|
72 |
+
.\ngrok http 8080
|
73 |
+
```
|
74 |
+
Copy the ngrok forwarding URL (e.g., https://e3e3-xxxx.ngrok-free.app) and set this as your Twilio webhook under the WhatsApp Sandbox Settings:
|
75 |
+
```
|
76 |
+
https://your-ngrok-url/webhook
|
77 |
+
```
|
78 |
+
Use WhatsApp to send a message or an image to the Twilio Sandbox number, and the application will respond with the virtual try-on result.
|
79 |
+
|
80 |
+
## Code Explanation
|
81 |
+
- **app.py**: The main Flask application that handles incoming WhatsApp messages, downloads the images from Twilio, and interacts with Gradio's virtual try-on model.
|
82 |
+
- **static**: This folder stores the images temporarily that are sent by users.
|
83 |
+
- **requirements.txt**: List of dependencies required for the project.
|
84 |
+
|
85 |
+
## Key Functions
|
86 |
+
- **webhook()**: Handles incoming POST requests from Twilio, manages the session, and interacts with the Gradio API.
|
87 |
+
- **send_to_gradio()**: Sends the person and garment images to Gradio's model for processing.
|
88 |
+
- **download_image()**: Downloads media files from Twilio's API and stores them locally.
|
89 |
+
|
90 |
+
## Usage
|
91 |
+
1. Send a photo of yourself via WhatsApp to the Twilio Sandbox number.
|
92 |
+
2. You'll receive a prompt asking you to send a photo of the garment.
|
93 |
+
3. After sending the garment photo, the system will process the images and send you the result with the garment virtually applied to your photo.
|
94 |
+
|
95 |
+
![WhatsApp Image 2024-10-19 at 2 32 06 PM](https://github.com/user-attachments/assets/2ecb7ccb-5637-4785-8a30-55170ae8bcb8)
|
96 |
+
|
97 |
+
|
98 |
+
## Future Enhancements
|
99 |
+
- Integrate more detailed error handling for the Gradio API.
|
100 |
+
- Add functionality to handle multiple garments or different garment categories (e.g. bottoms, shoes).
|
101 |
+
- Deploy on a production-grade WSGI server like Gunicorn instead of the Flask development server.
|
102 |
+
|
103 |
+
## License
|
104 |
+
This project is licensed under the MIT License.
|
105 |
+
|
106 |
+
|
107 |
+
|
108 |
+
|
109 |
+
|
110 |
+
|
try-on/app.py
ADDED
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import requests
|
3 |
+
import base64
|
4 |
+
import cv2
|
5 |
+
import numpy as np
|
6 |
+
from flask import Flask, request, send_from_directory
|
7 |
+
from twilio.twiml.messaging_response import MessagingResponse
|
8 |
+
from twilio.rest import Client
|
9 |
+
from gradio_client import Client as GradioClient, file
|
10 |
+
import shutil
|
11 |
+
from dotenv import load_dotenv
|
12 |
+
|
13 |
+
# Load environment variables from .env file
|
14 |
+
load_dotenv()
|
15 |
+
|
16 |
+
app = Flask(__name__)
|
17 |
+
|
18 |
+
@app.route('/', methods=['GET'])
|
19 |
+
def index():
|
20 |
+
return "This is the virtual try-on chatbot API.", 200
|
21 |
+
|
22 |
+
# In-memory storage for tracking sessions
|
23 |
+
user_sessions = {}
|
24 |
+
|
25 |
+
# Twilio credentials loaded from .env file
|
26 |
+
TWILIO_ACCOUNT_SID = os.getenv("TWILIO_ACCOUNT_SID")
|
27 |
+
TWILIO_AUTH_TOKEN = os.getenv("TWILIO_AUTH_TOKEN")
|
28 |
+
client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
|
29 |
+
|
30 |
+
# Gradio Client for Nymbo Virtual Try-On API
|
31 |
+
gradio_client = GradioClient("Nymbo/Virtual-Try-On")
|
32 |
+
|
33 |
+
# Ngrok URL loaded from .env file
|
34 |
+
NGROK_URL = os.getenv("NGROK_URL")
|
35 |
+
|
36 |
+
# Webhook route to handle POST requests from Twilio
|
37 |
+
@app.route('/webhook', methods=['POST'])
|
38 |
+
def webhook():
|
39 |
+
sender_number = request.form.get('From') # User's WhatsApp number
|
40 |
+
media_url = request.form.get('MediaUrl0') # URL of the media if image is sent
|
41 |
+
|
42 |
+
# Log the media URL
|
43 |
+
print(f"Received media URL: {media_url}")
|
44 |
+
|
45 |
+
# Create a response object for Twilio
|
46 |
+
resp = MessagingResponse()
|
47 |
+
|
48 |
+
# If no image is received, inform the user
|
49 |
+
if media_url is None:
|
50 |
+
resp.message("We didn't receive an image. Please try sending your image again.")
|
51 |
+
return str(resp)
|
52 |
+
|
53 |
+
# Step 1: Check if person image is uploaded
|
54 |
+
if sender_number not in user_sessions:
|
55 |
+
user_sessions[sender_number] = {}
|
56 |
+
if media_url:
|
57 |
+
user_sessions[sender_number]['person_image'] = media_url
|
58 |
+
resp.message("Great! Now please send the image of the garment you want to try on.")
|
59 |
+
else:
|
60 |
+
resp.message("Please send your image to begin the virtual try-on process.")
|
61 |
+
# Step 2: Check if garment image is uploaded
|
62 |
+
elif 'person_image' in user_sessions[sender_number] and 'garment_image' not in user_sessions[sender_number]:
|
63 |
+
if media_url:
|
64 |
+
user_sessions[sender_number]['garment_image'] = media_url
|
65 |
+
# Now both images are collected, send them to the Gradio API for virtual try-on
|
66 |
+
try_on_image_url = send_to_gradio(user_sessions[sender_number]['person_image'], media_url)
|
67 |
+
if try_on_image_url:
|
68 |
+
# Send the image as a WhatsApp media message
|
69 |
+
send_media_message(sender_number, try_on_image_url)
|
70 |
+
resp.message("Here is your virtual try-on result!")
|
71 |
+
else:
|
72 |
+
resp.message("Sorry, something went wrong with the try-on process.")
|
73 |
+
# Clear session after completion
|
74 |
+
del user_sessions[sender_number]
|
75 |
+
else:
|
76 |
+
resp.message("Please send the garment image to complete the process.")
|
77 |
+
else:
|
78 |
+
# If both images have already been received, start the process again
|
79 |
+
resp.message("Please send your image to begin the virtual try-on process.")
|
80 |
+
|
81 |
+
return str(resp)
|
82 |
+
|
83 |
+
# Function to interact with the Gradio API
|
84 |
+
def send_to_gradio(person_image_url, garment_image_url):
|
85 |
+
# Download both images from Twilio
|
86 |
+
person_image_path = download_image(person_image_url, 'person_image.jpg')
|
87 |
+
garment_image_path = download_image(garment_image_url, 'garment_image.jpg')
|
88 |
+
|
89 |
+
if person_image_path is None or garment_image_path is None:
|
90 |
+
print("Error: One of the images could not be downloaded.")
|
91 |
+
return None
|
92 |
+
|
93 |
+
try:
|
94 |
+
# Interact with the Gradio API using the client
|
95 |
+
result = gradio_client.predict(
|
96 |
+
dict={"background": file(person_image_path), "layers": [], "composite": None},
|
97 |
+
garm_img=file(garment_image_path),
|
98 |
+
garment_des="A cool description of the garment",
|
99 |
+
is_checked=True,
|
100 |
+
is_checked_crop=False,
|
101 |
+
denoise_steps=30,
|
102 |
+
seed=42,
|
103 |
+
api_name="/tryon"
|
104 |
+
)
|
105 |
+
|
106 |
+
# Log the result for debugging
|
107 |
+
print(f"API result: {result}")
|
108 |
+
|
109 |
+
# Check if the result is returned correctly
|
110 |
+
if result and len(result) > 0:
|
111 |
+
try_on_image_path = result[0] # First item in result is the output image path
|
112 |
+
print(f"Generated try-on image path: {try_on_image_path}")
|
113 |
+
|
114 |
+
# Ensure the static directory exists
|
115 |
+
static_dir = 'static'
|
116 |
+
if not os.path.exists(static_dir):
|
117 |
+
os.makedirs(static_dir)
|
118 |
+
print(f"Created directory: {static_dir}")
|
119 |
+
|
120 |
+
# Make sure the path exists
|
121 |
+
if os.path.exists(try_on_image_path):
|
122 |
+
# Convert the image to PNG format and save it
|
123 |
+
img = cv2.imread(try_on_image_path)
|
124 |
+
target_path_png = os.path.join(static_dir, 'result.png')
|
125 |
+
cv2.imwrite(target_path_png, img)
|
126 |
+
print(f"Image saved to: {target_path_png}")
|
127 |
+
|
128 |
+
# Return the public URL for the image as PNG
|
129 |
+
return f"{NGROK_URL}/static/result.png"
|
130 |
+
else:
|
131 |
+
print(f"Image not found at: {try_on_image_path}")
|
132 |
+
return None
|
133 |
+
|
134 |
+
print("No image returned from the API.")
|
135 |
+
return None
|
136 |
+
|
137 |
+
except Exception as e:
|
138 |
+
print(f"Error interacting with Gradio API: {e}")
|
139 |
+
return None
|
140 |
+
|
141 |
+
# Helper function to send media message via Twilio
|
142 |
+
def send_media_message(to_number, media_url):
|
143 |
+
message = client.messages.create(
|
144 |
+
from_='whatsapp:+14155238886', # Twilio sandbox number
|
145 |
+
body="Here is your virtual try-on result:",
|
146 |
+
media_url=[media_url], # Public URL of the media
|
147 |
+
to=to_number
|
148 |
+
)
|
149 |
+
print(f"Sent media message to {to_number}. Message SID: {message.sid}")
|
150 |
+
|
151 |
+
# Helper function to download an image from Twilio using the Twilio API
|
152 |
+
def download_image(media_url, filename):
|
153 |
+
try:
|
154 |
+
# Extract Message SID and Media SID from the URL
|
155 |
+
message_sid = media_url.split('/')[-3]
|
156 |
+
media_sid = media_url.split('/')[-1]
|
157 |
+
|
158 |
+
# Log the message and media SIDs
|
159 |
+
print(f"Message SID: {message_sid}, Media SID: {media_sid}")
|
160 |
+
|
161 |
+
# Use Twilio client to fetch the media resource
|
162 |
+
media = client.api.accounts(TWILIO_ACCOUNT_SID).messages(message_sid).media(media_sid).fetch()
|
163 |
+
|
164 |
+
# Construct the actual media URL
|
165 |
+
media_uri = media.uri.replace('.json', '')
|
166 |
+
image_url = f"https://api.twilio.com{media_uri}"
|
167 |
+
|
168 |
+
# Log the full URL being used for the image download
|
169 |
+
print(f"Downloading image from: {image_url}")
|
170 |
+
|
171 |
+
# Download the image with proper authorization (using Basic Auth)
|
172 |
+
response = requests.get(image_url, auth=(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN))
|
173 |
+
|
174 |
+
if response.status_code == 200:
|
175 |
+
# Save the image locally
|
176 |
+
with open(filename, 'wb') as f:
|
177 |
+
f.write(response.content)
|
178 |
+
print(f"Image downloaded successfully as {filename}.")
|
179 |
+
return filename
|
180 |
+
else:
|
181 |
+
print(f"Failed to download image: {response.status_code}")
|
182 |
+
return None
|
183 |
+
except Exception as err:
|
184 |
+
print(f"Error downloading image from Twilio: {err}")
|
185 |
+
return None
|
186 |
+
|
187 |
+
# Ensure Flask serves static files properly
|
188 |
+
@app.route('/static/<path:filename>')
|
189 |
+
def serve_static_file(filename):
|
190 |
+
file_path = os.path.join('static', filename)
|
191 |
+
# Check if the file exists and serve with the correct Content-Type
|
192 |
+
if os.path.exists(file_path):
|
193 |
+
return send_from_directory('static', filename, mimetype='image/png')
|
194 |
+
else:
|
195 |
+
print(f"File not found: {filename}")
|
196 |
+
return "File not found", 404
|
197 |
+
|
198 |
+
if __name__ == '__main__':
|
199 |
+
app.run(port=8080)
|
try-on/env/bin/Activate.ps1
ADDED
@@ -0,0 +1,241 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<#
|
2 |
+
.Synopsis
|
3 |
+
Activate a Python virtual environment for the current PowerShell session.
|
4 |
+
|
5 |
+
.Description
|
6 |
+
Pushes the python executable for a virtual environment to the front of the
|
7 |
+
$Env:PATH environment variable and sets the prompt to signify that you are
|
8 |
+
in a Python virtual environment. Makes use of the command line switches as
|
9 |
+
well as the `pyvenv.cfg` file values present in the virtual environment.
|
10 |
+
|
11 |
+
.Parameter VenvDir
|
12 |
+
Path to the directory that contains the virtual environment to activate. The
|
13 |
+
default value for this is the parent of the directory that the Activate.ps1
|
14 |
+
script is located within.
|
15 |
+
|
16 |
+
.Parameter Prompt
|
17 |
+
The prompt prefix to display when this virtual environment is activated. By
|
18 |
+
default, this prompt is the name of the virtual environment folder (VenvDir)
|
19 |
+
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
20 |
+
|
21 |
+
.Example
|
22 |
+
Activate.ps1
|
23 |
+
Activates the Python virtual environment that contains the Activate.ps1 script.
|
24 |
+
|
25 |
+
.Example
|
26 |
+
Activate.ps1 -Verbose
|
27 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
28 |
+
and shows extra information about the activation as it executes.
|
29 |
+
|
30 |
+
.Example
|
31 |
+
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
32 |
+
Activates the Python virtual environment located in the specified location.
|
33 |
+
|
34 |
+
.Example
|
35 |
+
Activate.ps1 -Prompt "MyPython"
|
36 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
37 |
+
and prefixes the current prompt with the specified string (surrounded in
|
38 |
+
parentheses) while the virtual environment is active.
|
39 |
+
|
40 |
+
.Notes
|
41 |
+
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
42 |
+
execution policy for the user. You can do this by issuing the following PowerShell
|
43 |
+
command:
|
44 |
+
|
45 |
+
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
46 |
+
|
47 |
+
For more information on Execution Policies:
|
48 |
+
https://go.microsoft.com/fwlink/?LinkID=135170
|
49 |
+
|
50 |
+
#>
|
51 |
+
Param(
|
52 |
+
[Parameter(Mandatory = $false)]
|
53 |
+
[String]
|
54 |
+
$VenvDir,
|
55 |
+
[Parameter(Mandatory = $false)]
|
56 |
+
[String]
|
57 |
+
$Prompt
|
58 |
+
)
|
59 |
+
|
60 |
+
<# Function declarations --------------------------------------------------- #>
|
61 |
+
|
62 |
+
<#
|
63 |
+
.Synopsis
|
64 |
+
Remove all shell session elements added by the Activate script, including the
|
65 |
+
addition of the virtual environment's Python executable from the beginning of
|
66 |
+
the PATH variable.
|
67 |
+
|
68 |
+
.Parameter NonDestructive
|
69 |
+
If present, do not remove this function from the global namespace for the
|
70 |
+
session.
|
71 |
+
|
72 |
+
#>
|
73 |
+
function global:deactivate ([switch]$NonDestructive) {
|
74 |
+
# Revert to original values
|
75 |
+
|
76 |
+
# The prior prompt:
|
77 |
+
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
78 |
+
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
79 |
+
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
80 |
+
}
|
81 |
+
|
82 |
+
# The prior PYTHONHOME:
|
83 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
84 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
85 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
86 |
+
}
|
87 |
+
|
88 |
+
# The prior PATH:
|
89 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
90 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
91 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
92 |
+
}
|
93 |
+
|
94 |
+
# Just remove the VIRTUAL_ENV altogether:
|
95 |
+
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
96 |
+
Remove-Item -Path env:VIRTUAL_ENV
|
97 |
+
}
|
98 |
+
|
99 |
+
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
100 |
+
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
101 |
+
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
102 |
+
}
|
103 |
+
|
104 |
+
# Leave deactivate function in the global namespace if requested:
|
105 |
+
if (-not $NonDestructive) {
|
106 |
+
Remove-Item -Path function:deactivate
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
<#
|
111 |
+
.Description
|
112 |
+
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
113 |
+
given folder, and returns them in a map.
|
114 |
+
|
115 |
+
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
116 |
+
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
117 |
+
then it is considered a `key = value` line. The left hand string is the key,
|
118 |
+
the right hand is the value.
|
119 |
+
|
120 |
+
If the value starts with a `'` or a `"` then the first and last character is
|
121 |
+
stripped from the value before being captured.
|
122 |
+
|
123 |
+
.Parameter ConfigDir
|
124 |
+
Path to the directory that contains the `pyvenv.cfg` file.
|
125 |
+
#>
|
126 |
+
function Get-PyVenvConfig(
|
127 |
+
[String]
|
128 |
+
$ConfigDir
|
129 |
+
) {
|
130 |
+
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
131 |
+
|
132 |
+
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
133 |
+
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
134 |
+
|
135 |
+
# An empty map will be returned if no config file is found.
|
136 |
+
$pyvenvConfig = @{ }
|
137 |
+
|
138 |
+
if ($pyvenvConfigPath) {
|
139 |
+
|
140 |
+
Write-Verbose "File exists, parse `key = value` lines"
|
141 |
+
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
142 |
+
|
143 |
+
$pyvenvConfigContent | ForEach-Object {
|
144 |
+
$keyval = $PSItem -split "\s*=\s*", 2
|
145 |
+
if ($keyval[0] -and $keyval[1]) {
|
146 |
+
$val = $keyval[1]
|
147 |
+
|
148 |
+
# Remove extraneous quotations around a string value.
|
149 |
+
if ("'""".Contains($val.Substring(0, 1))) {
|
150 |
+
$val = $val.Substring(1, $val.Length - 2)
|
151 |
+
}
|
152 |
+
|
153 |
+
$pyvenvConfig[$keyval[0]] = $val
|
154 |
+
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
return $pyvenvConfig
|
159 |
+
}
|
160 |
+
|
161 |
+
|
162 |
+
<# Begin Activate script --------------------------------------------------- #>
|
163 |
+
|
164 |
+
# Determine the containing directory of this script
|
165 |
+
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
166 |
+
$VenvExecDir = Get-Item -Path $VenvExecPath
|
167 |
+
|
168 |
+
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
169 |
+
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
170 |
+
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
171 |
+
|
172 |
+
# Set values required in priority: CmdLine, ConfigFile, Default
|
173 |
+
# First, get the location of the virtual environment, it might not be
|
174 |
+
# VenvExecDir if specified on the command line.
|
175 |
+
if ($VenvDir) {
|
176 |
+
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
177 |
+
}
|
178 |
+
else {
|
179 |
+
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
180 |
+
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
181 |
+
Write-Verbose "VenvDir=$VenvDir"
|
182 |
+
}
|
183 |
+
|
184 |
+
# Next, read the `pyvenv.cfg` file to determine any required value such
|
185 |
+
# as `prompt`.
|
186 |
+
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
187 |
+
|
188 |
+
# Next, set the prompt from the command line, or the config file, or
|
189 |
+
# just use the name of the virtual environment folder.
|
190 |
+
if ($Prompt) {
|
191 |
+
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
192 |
+
}
|
193 |
+
else {
|
194 |
+
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
195 |
+
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
196 |
+
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
197 |
+
$Prompt = $pyvenvCfg['prompt'];
|
198 |
+
}
|
199 |
+
else {
|
200 |
+
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
|
201 |
+
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
202 |
+
$Prompt = Split-Path -Path $venvDir -Leaf
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
Write-Verbose "Prompt = '$Prompt'"
|
207 |
+
Write-Verbose "VenvDir='$VenvDir'"
|
208 |
+
|
209 |
+
# Deactivate any currently active virtual environment, but leave the
|
210 |
+
# deactivate function in place.
|
211 |
+
deactivate -nondestructive
|
212 |
+
|
213 |
+
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
214 |
+
# that there is an activated venv.
|
215 |
+
$env:VIRTUAL_ENV = $VenvDir
|
216 |
+
|
217 |
+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
218 |
+
|
219 |
+
Write-Verbose "Setting prompt to '$Prompt'"
|
220 |
+
|
221 |
+
# Set the prompt to include the env name
|
222 |
+
# Make sure _OLD_VIRTUAL_PROMPT is global
|
223 |
+
function global:_OLD_VIRTUAL_PROMPT { "" }
|
224 |
+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
225 |
+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
226 |
+
|
227 |
+
function global:prompt {
|
228 |
+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
229 |
+
_OLD_VIRTUAL_PROMPT
|
230 |
+
}
|
231 |
+
}
|
232 |
+
|
233 |
+
# Clear PYTHONHOME
|
234 |
+
if (Test-Path -Path Env:PYTHONHOME) {
|
235 |
+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
236 |
+
Remove-Item -Path Env:PYTHONHOME
|
237 |
+
}
|
238 |
+
|
239 |
+
# Add the venv to the PATH
|
240 |
+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
241 |
+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
try-on/env/bin/activate
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source bin/activate" *from bash*
|
2 |
+
# you cannot run it directly
|
3 |
+
|
4 |
+
deactivate () {
|
5 |
+
# reset old environment variables
|
6 |
+
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
7 |
+
PATH="${_OLD_VIRTUAL_PATH:-}"
|
8 |
+
export PATH
|
9 |
+
unset _OLD_VIRTUAL_PATH
|
10 |
+
fi
|
11 |
+
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
12 |
+
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
13 |
+
export PYTHONHOME
|
14 |
+
unset _OLD_VIRTUAL_PYTHONHOME
|
15 |
+
fi
|
16 |
+
|
17 |
+
# This should detect bash and zsh, which have a hash command that must
|
18 |
+
# be called to get it to forget past commands. Without forgetting
|
19 |
+
# past commands the $PATH changes we made may not be respected
|
20 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
21 |
+
hash -r
|
22 |
+
fi
|
23 |
+
|
24 |
+
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
25 |
+
PS1="${_OLD_VIRTUAL_PS1:-}"
|
26 |
+
export PS1
|
27 |
+
unset _OLD_VIRTUAL_PS1
|
28 |
+
fi
|
29 |
+
|
30 |
+
unset VIRTUAL_ENV
|
31 |
+
if [ ! "${1:-}" = "nondestructive" ] ; then
|
32 |
+
# Self destruct!
|
33 |
+
unset -f deactivate
|
34 |
+
fi
|
35 |
+
}
|
36 |
+
|
37 |
+
# unset irrelevant variables
|
38 |
+
deactivate nondestructive
|
39 |
+
|
40 |
+
VIRTUAL_ENV=/workspaces/ruang-rindu/try-on/env
|
41 |
+
export VIRTUAL_ENV
|
42 |
+
|
43 |
+
_OLD_VIRTUAL_PATH="$PATH"
|
44 |
+
PATH="$VIRTUAL_ENV/"bin":$PATH"
|
45 |
+
export PATH
|
46 |
+
|
47 |
+
# unset PYTHONHOME if set
|
48 |
+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
49 |
+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
50 |
+
if [ -n "${PYTHONHOME:-}" ] ; then
|
51 |
+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
52 |
+
unset PYTHONHOME
|
53 |
+
fi
|
54 |
+
|
55 |
+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
56 |
+
_OLD_VIRTUAL_PS1="${PS1:-}"
|
57 |
+
if [ "x'(env) '" != x ] ; then
|
58 |
+
PS1='(env) '"${PS1:-}"
|
59 |
+
else
|
60 |
+
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
|
61 |
+
# special case for Aspen magic directories
|
62 |
+
# see https://aspen.io/
|
63 |
+
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
|
64 |
+
else
|
65 |
+
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
|
66 |
+
fi
|
67 |
+
fi
|
68 |
+
export PS1
|
69 |
+
fi
|
70 |
+
|
71 |
+
# This should detect bash and zsh, which have a hash command that must
|
72 |
+
# be called to get it to forget past commands. Without forgetting
|
73 |
+
# past commands the $PATH changes we made may not be respected
|
74 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
75 |
+
hash -r
|
76 |
+
fi
|
try-on/env/bin/activate.csh
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source bin/activate.csh" *from csh*.
|
2 |
+
# You cannot run it directly.
|
3 |
+
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
4 |
+
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
|
5 |
+
|
6 |
+
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
|
7 |
+
|
8 |
+
# Unset irrelevant variables.
|
9 |
+
deactivate nondestructive
|
10 |
+
|
11 |
+
setenv VIRTUAL_ENV /workspaces/ruang-rindu/try-on/env
|
12 |
+
|
13 |
+
set _OLD_VIRTUAL_PATH="$PATH"
|
14 |
+
setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
|
15 |
+
|
16 |
+
|
17 |
+
set _OLD_VIRTUAL_PROMPT="$prompt"
|
18 |
+
|
19 |
+
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
|
20 |
+
if ("env" != "") then
|
21 |
+
set env_name = env
|
22 |
+
else
|
23 |
+
if (`basename "VIRTUAL_ENV"` == "__") then
|
24 |
+
# special case for Aspen magic directories
|
25 |
+
# see https://aspen.io/
|
26 |
+
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
|
27 |
+
else
|
28 |
+
set env_name = `basename "$VIRTUAL_ENV"`
|
29 |
+
endif
|
30 |
+
endif
|
31 |
+
set prompt = "[$env_name] $prompt"
|
32 |
+
unset env_name
|
33 |
+
endif
|
34 |
+
|
35 |
+
alias pydoc python -m pydoc
|
36 |
+
|
37 |
+
rehash
|
try-on/env/bin/activate.fish
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
|
2 |
+
# you cannot run it directly
|
3 |
+
|
4 |
+
function deactivate -d "Exit virtualenv and return to normal shell environment"
|
5 |
+
# reset old environment variables
|
6 |
+
if test -n "$_OLD_VIRTUAL_PATH"
|
7 |
+
set -gx PATH $_OLD_VIRTUAL_PATH
|
8 |
+
set -e _OLD_VIRTUAL_PATH
|
9 |
+
end
|
10 |
+
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
11 |
+
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
12 |
+
set -e _OLD_VIRTUAL_PYTHONHOME
|
13 |
+
end
|
14 |
+
|
15 |
+
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
16 |
+
functions -e fish_prompt
|
17 |
+
set -e _OLD_FISH_PROMPT_OVERRIDE
|
18 |
+
functions -c _old_fish_prompt fish_prompt
|
19 |
+
functions -e _old_fish_prompt
|
20 |
+
end
|
21 |
+
|
22 |
+
set -e VIRTUAL_ENV
|
23 |
+
if test "$argv[1]" != "nondestructive"
|
24 |
+
# Self destruct!
|
25 |
+
functions -e deactivate
|
26 |
+
end
|
27 |
+
end
|
28 |
+
|
29 |
+
# unset irrelevant variables
|
30 |
+
deactivate nondestructive
|
31 |
+
|
32 |
+
set -gx VIRTUAL_ENV /workspaces/ruang-rindu/try-on/env
|
33 |
+
|
34 |
+
set -gx _OLD_VIRTUAL_PATH $PATH
|
35 |
+
set -gx PATH "$VIRTUAL_ENV/"bin $PATH
|
36 |
+
|
37 |
+
# unset PYTHONHOME if set
|
38 |
+
if set -q PYTHONHOME
|
39 |
+
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
40 |
+
set -e PYTHONHOME
|
41 |
+
end
|
42 |
+
|
43 |
+
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
44 |
+
# fish uses a function instead of an env var to generate the prompt.
|
45 |
+
|
46 |
+
# save the current fish_prompt function as the function _old_fish_prompt
|
47 |
+
functions -c fish_prompt _old_fish_prompt
|
48 |
+
|
49 |
+
# with the original prompt function renamed, we can override with our own.
|
50 |
+
function fish_prompt
|
51 |
+
# Save the return status of the last command
|
52 |
+
set -l old_status $status
|
53 |
+
|
54 |
+
# Prompt override?
|
55 |
+
if test -n "'(env) '"
|
56 |
+
printf "%s%s" '(env) ' (set_color normal)
|
57 |
+
else
|
58 |
+
# ...Otherwise, prepend env
|
59 |
+
set -l _checkbase (basename "$VIRTUAL_ENV")
|
60 |
+
if test $_checkbase = "__"
|
61 |
+
# special case for Aspen magic directories
|
62 |
+
# see https://aspen.io/
|
63 |
+
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
|
64 |
+
else
|
65 |
+
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
|
66 |
+
end
|
67 |
+
end
|
68 |
+
|
69 |
+
# Restore the return status of the previous command.
|
70 |
+
echo "exit $old_status" | .
|
71 |
+
_old_fish_prompt
|
72 |
+
end
|
73 |
+
|
74 |
+
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
75 |
+
end
|
try-on/env/bin/dotenv
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from dotenv.__main__ import cli
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(cli())
|
try-on/env/bin/easy_install
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from setuptools.command.easy_install import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/easy_install-3.8
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from setuptools.command.easy_install import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/f2py
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from numpy.f2py.f2py2e import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/f2py3
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from numpy.f2py.f2py2e import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/f2py3.8
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from numpy.f2py.f2py2e import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/flask
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from flask.cli import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/httpx
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from httpx import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/huggingface-cli
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from huggingface_hub.commands.huggingface_cli import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/normalizer
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from charset_normalizer.cli import cli_detect
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(cli_detect())
|
try-on/env/bin/pip
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/pip3
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/pip3.8
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/bin/python
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
|
3 |
+
size 5490488
|
try-on/env/bin/python3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
|
3 |
+
size 5490488
|
try-on/env/bin/python3.8
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
|
3 |
+
size 5490488
|
try-on/env/bin/tqdm
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/workspaces/ruang-rindu/try-on/env/bin/python3.8
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from tqdm.cli import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
pip
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright 2010 Pallets
|
2 |
+
|
3 |
+
Redistribution and use in source and binary forms, with or without
|
4 |
+
modification, are permitted provided that the following conditions are
|
5 |
+
met:
|
6 |
+
|
7 |
+
1. Redistributions of source code must retain the above copyright
|
8 |
+
notice, this list of conditions and the following disclaimer.
|
9 |
+
|
10 |
+
2. Redistributions in binary form must reproduce the above copyright
|
11 |
+
notice, this list of conditions and the following disclaimer in the
|
12 |
+
documentation and/or other materials provided with the distribution.
|
13 |
+
|
14 |
+
3. Neither the name of the copyright holder nor the names of its
|
15 |
+
contributors may be used to endorse or promote products derived from
|
16 |
+
this software without specific prior written permission.
|
17 |
+
|
18 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
21 |
+
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22 |
+
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
24 |
+
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
25 |
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
26 |
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
27 |
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28 |
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/METADATA
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Metadata-Version: 2.1
|
2 |
+
Name: MarkupSafe
|
3 |
+
Version: 2.1.5
|
4 |
+
Summary: Safely add untrusted strings to HTML/XML markup.
|
5 |
+
Home-page: https://palletsprojects.com/p/markupsafe/
|
6 |
+
Maintainer: Pallets
|
7 |
+
Maintainer-email: contact@palletsprojects.com
|
8 |
+
License: BSD-3-Clause
|
9 |
+
Project-URL: Donate, https://palletsprojects.com/donate
|
10 |
+
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
|
11 |
+
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
|
12 |
+
Project-URL: Source Code, https://github.com/pallets/markupsafe/
|
13 |
+
Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
|
14 |
+
Project-URL: Chat, https://discord.gg/pallets
|
15 |
+
Classifier: Development Status :: 5 - Production/Stable
|
16 |
+
Classifier: Environment :: Web Environment
|
17 |
+
Classifier: Intended Audience :: Developers
|
18 |
+
Classifier: License :: OSI Approved :: BSD License
|
19 |
+
Classifier: Operating System :: OS Independent
|
20 |
+
Classifier: Programming Language :: Python
|
21 |
+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
22 |
+
Classifier: Topic :: Text Processing :: Markup :: HTML
|
23 |
+
Requires-Python: >=3.7
|
24 |
+
Description-Content-Type: text/x-rst
|
25 |
+
License-File: LICENSE.rst
|
26 |
+
|
27 |
+
MarkupSafe
|
28 |
+
==========
|
29 |
+
|
30 |
+
MarkupSafe implements a text object that escapes characters so it is
|
31 |
+
safe to use in HTML and XML. Characters that have special meanings are
|
32 |
+
replaced so that they display as the actual characters. This mitigates
|
33 |
+
injection attacks, meaning untrusted user input can safely be displayed
|
34 |
+
on a page.
|
35 |
+
|
36 |
+
|
37 |
+
Installing
|
38 |
+
----------
|
39 |
+
|
40 |
+
Install and update using `pip`_:
|
41 |
+
|
42 |
+
.. code-block:: text
|
43 |
+
|
44 |
+
pip install -U MarkupSafe
|
45 |
+
|
46 |
+
.. _pip: https://pip.pypa.io/en/stable/getting-started/
|
47 |
+
|
48 |
+
|
49 |
+
Examples
|
50 |
+
--------
|
51 |
+
|
52 |
+
.. code-block:: pycon
|
53 |
+
|
54 |
+
>>> from markupsafe import Markup, escape
|
55 |
+
|
56 |
+
>>> # escape replaces special characters and wraps in Markup
|
57 |
+
>>> escape("<script>alert(document.cookie);</script>")
|
58 |
+
Markup('<script>alert(document.cookie);</script>')
|
59 |
+
|
60 |
+
>>> # wrap in Markup to mark text "safe" and prevent escaping
|
61 |
+
>>> Markup("<strong>Hello</strong>")
|
62 |
+
Markup('<strong>hello</strong>')
|
63 |
+
|
64 |
+
>>> escape(Markup("<strong>Hello</strong>"))
|
65 |
+
Markup('<strong>hello</strong>')
|
66 |
+
|
67 |
+
>>> # Markup is a str subclass
|
68 |
+
>>> # methods and operators escape their arguments
|
69 |
+
>>> template = Markup("Hello <em>{name}</em>")
|
70 |
+
>>> template.format(name='"World"')
|
71 |
+
Markup('Hello <em>"World"</em>')
|
72 |
+
|
73 |
+
|
74 |
+
Donate
|
75 |
+
------
|
76 |
+
|
77 |
+
The Pallets organization develops and supports MarkupSafe and other
|
78 |
+
popular packages. In order to grow the community of contributors and
|
79 |
+
users, and allow the maintainers to devote more time to the projects,
|
80 |
+
`please donate today`_.
|
81 |
+
|
82 |
+
.. _please donate today: https://palletsprojects.com/donate
|
83 |
+
|
84 |
+
|
85 |
+
Links
|
86 |
+
-----
|
87 |
+
|
88 |
+
- Documentation: https://markupsafe.palletsprojects.com/
|
89 |
+
- Changes: https://markupsafe.palletsprojects.com/changes/
|
90 |
+
- PyPI Releases: https://pypi.org/project/MarkupSafe/
|
91 |
+
- Source Code: https://github.com/pallets/markupsafe/
|
92 |
+
- Issue Tracker: https://github.com/pallets/markupsafe/issues/
|
93 |
+
- Chat: https://discord.gg/pallets
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/RECORD
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MarkupSafe-2.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
2 |
+
MarkupSafe-2.1.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
|
3 |
+
MarkupSafe-2.1.5.dist-info/METADATA,sha256=2dRDPam6OZLfpX0wg1JN5P3u9arqACxVSfdGmsJU7o8,3003
|
4 |
+
MarkupSafe-2.1.5.dist-info/RECORD,,
|
5 |
+
MarkupSafe-2.1.5.dist-info/WHEEL,sha256=zTDqV7OR0em6fvysya0bwC-51Mb7EQ0x5PBJySRF2iQ,148
|
6 |
+
MarkupSafe-2.1.5.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
|
7 |
+
markupsafe/__init__.py,sha256=r7VOTjUq7EMQ4v3p4R1LoVOGJg6ysfYRncLr34laRBs,10958
|
8 |
+
markupsafe/__pycache__/__init__.cpython-38.pyc,,
|
9 |
+
markupsafe/__pycache__/_native.cpython-38.pyc,,
|
10 |
+
markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713
|
11 |
+
markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083
|
12 |
+
markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so,sha256=dR4WFvrcpISjeacwjKYJrqkz-0j0ZXF4oAHtTK0cKpw,45024
|
13 |
+
markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229
|
14 |
+
markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Wheel-Version: 1.0
|
2 |
+
Generator: bdist_wheel (0.42.0)
|
3 |
+
Root-Is-Purelib: false
|
4 |
+
Tag: cp38-cp38-manylinux_2_17_x86_64
|
5 |
+
Tag: cp38-cp38-manylinux2014_x86_64
|
6 |
+
|
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
markupsafe
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Authors
|
2 |
+
=======
|
3 |
+
|
4 |
+
``pyjwt`` is currently written and maintained by `Jose Padilla <https://github.com/jpadilla>`_.
|
5 |
+
Originally written and maintained by `Jeff Lindsay <https://github.com/progrium>`_.
|
6 |
+
|
7 |
+
A full list of contributors can be found on GitHub’s `overview <https://github.com/jpadilla/pyjwt/graphs/contributors>`_.
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/INSTALLER
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
pip
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The MIT License (MIT)
|
2 |
+
|
3 |
+
Copyright (c) 2015-2022 José Padilla
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 |
+
of this software and associated documentation files (the "Software"), to deal
|
7 |
+
in the Software without restriction, including without limitation the rights
|
8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9 |
+
copies of the Software, and to permit persons to whom the Software is
|
10 |
+
furnished to do so, subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21 |
+
SOFTWARE.
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/METADATA
ADDED
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Metadata-Version: 2.1
|
2 |
+
Name: PyJWT
|
3 |
+
Version: 2.9.0
|
4 |
+
Summary: JSON Web Token implementation in Python
|
5 |
+
Home-page: https://github.com/jpadilla/pyjwt
|
6 |
+
Author: Jose Padilla
|
7 |
+
Author-email: hello@jpadilla.com
|
8 |
+
License: MIT
|
9 |
+
Keywords: json,jwt,security,signing,token,web
|
10 |
+
Classifier: Development Status :: 5 - Production/Stable
|
11 |
+
Classifier: Intended Audience :: Developers
|
12 |
+
Classifier: Natural Language :: English
|
13 |
+
Classifier: License :: OSI Approved :: MIT License
|
14 |
+
Classifier: Programming Language :: Python
|
15 |
+
Classifier: Programming Language :: Python :: 3
|
16 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
17 |
+
Classifier: Programming Language :: Python :: 3.8
|
18 |
+
Classifier: Programming Language :: Python :: 3.9
|
19 |
+
Classifier: Programming Language :: Python :: 3.10
|
20 |
+
Classifier: Programming Language :: Python :: 3.11
|
21 |
+
Classifier: Programming Language :: Python :: 3.12
|
22 |
+
Classifier: Topic :: Utilities
|
23 |
+
Requires-Python: >=3.8
|
24 |
+
Description-Content-Type: text/x-rst
|
25 |
+
License-File: LICENSE
|
26 |
+
License-File: AUTHORS.rst
|
27 |
+
Provides-Extra: crypto
|
28 |
+
Requires-Dist: cryptography >=3.4.0 ; extra == 'crypto'
|
29 |
+
Provides-Extra: dev
|
30 |
+
Requires-Dist: sphinx ; extra == 'dev'
|
31 |
+
Requires-Dist: sphinx-rtd-theme ; extra == 'dev'
|
32 |
+
Requires-Dist: zope.interface ; extra == 'dev'
|
33 |
+
Requires-Dist: cryptography >=3.4.0 ; extra == 'dev'
|
34 |
+
Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'dev'
|
35 |
+
Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'dev'
|
36 |
+
Requires-Dist: pre-commit ; extra == 'dev'
|
37 |
+
Provides-Extra: docs
|
38 |
+
Requires-Dist: sphinx ; extra == 'docs'
|
39 |
+
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
|
40 |
+
Requires-Dist: zope.interface ; extra == 'docs'
|
41 |
+
Provides-Extra: tests
|
42 |
+
Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'tests'
|
43 |
+
Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'tests'
|
44 |
+
|
45 |
+
PyJWT
|
46 |
+
=====
|
47 |
+
|
48 |
+
.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg
|
49 |
+
:target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI
|
50 |
+
|
51 |
+
.. image:: https://img.shields.io/pypi/v/pyjwt.svg
|
52 |
+
:target: https://pypi.python.org/pypi/pyjwt
|
53 |
+
|
54 |
+
.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg
|
55 |
+
:target: https://codecov.io/gh/jpadilla/pyjwt
|
56 |
+
|
57 |
+
.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable
|
58 |
+
:target: https://pyjwt.readthedocs.io/en/stable/
|
59 |
+
|
60 |
+
A Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.
|
61 |
+
|
62 |
+
Installing
|
63 |
+
----------
|
64 |
+
|
65 |
+
Install with **pip**:
|
66 |
+
|
67 |
+
.. code-block:: console
|
68 |
+
|
69 |
+
$ pip install PyJWT
|
70 |
+
|
71 |
+
|
72 |
+
Usage
|
73 |
+
-----
|
74 |
+
|
75 |
+
.. code-block:: pycon
|
76 |
+
|
77 |
+
>>> import jwt
|
78 |
+
>>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
|
79 |
+
>>> print(encoded)
|
80 |
+
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg
|
81 |
+
>>> jwt.decode(encoded, "secret", algorithms=["HS256"])
|
82 |
+
{'some': 'payload'}
|
83 |
+
|
84 |
+
Documentation
|
85 |
+
-------------
|
86 |
+
|
87 |
+
View the full docs online at https://pyjwt.readthedocs.io/en/stable/
|
88 |
+
|
89 |
+
|
90 |
+
Tests
|
91 |
+
-----
|
92 |
+
|
93 |
+
You can run tests from the project root after cloning with:
|
94 |
+
|
95 |
+
.. code-block:: console
|
96 |
+
|
97 |
+
$ tox
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/RECORD
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
PyJWT-2.9.0.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322
|
2 |
+
PyJWT-2.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
3 |
+
PyJWT-2.9.0.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085
|
4 |
+
PyJWT-2.9.0.dist-info/METADATA,sha256=YRmm4Pcq065Rja5Gzuh80YA2groQSgOR8I1Cx0MF8EM,3048
|
5 |
+
PyJWT-2.9.0.dist-info/RECORD,,
|
6 |
+
PyJWT-2.9.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
7 |
+
PyJWT-2.9.0.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4
|
8 |
+
jwt/__init__.py,sha256=TlvdnR8JPnAKjXE3Yt4qSA4AApcb0_9fh4RppJfnMcU,1670
|
9 |
+
jwt/__pycache__/__init__.cpython-38.pyc,,
|
10 |
+
jwt/__pycache__/algorithms.cpython-38.pyc,,
|
11 |
+
jwt/__pycache__/api_jwk.cpython-38.pyc,,
|
12 |
+
jwt/__pycache__/api_jws.cpython-38.pyc,,
|
13 |
+
jwt/__pycache__/api_jwt.cpython-38.pyc,,
|
14 |
+
jwt/__pycache__/exceptions.cpython-38.pyc,,
|
15 |
+
jwt/__pycache__/help.cpython-38.pyc,,
|
16 |
+
jwt/__pycache__/jwk_set_cache.cpython-38.pyc,,
|
17 |
+
jwt/__pycache__/jwks_client.cpython-38.pyc,,
|
18 |
+
jwt/__pycache__/types.cpython-38.pyc,,
|
19 |
+
jwt/__pycache__/utils.cpython-38.pyc,,
|
20 |
+
jwt/__pycache__/warnings.cpython-38.pyc,,
|
21 |
+
jwt/algorithms.py,sha256=5MLQ2WIhHPiN--67afLk4yXOLsYfx2OiNeLVORZT3G8,29851
|
22 |
+
jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451
|
23 |
+
jwt/api_jws.py,sha256=1cBVJuYxo6UrDU6UH4VTA2EqctBj1x7mNlnNb-Ocn4g,11425
|
24 |
+
jwt/api_jwt.py,sha256=gsmF7wVxKFfsDBjrMq-M2UiyUBzl6U6YwaEqNdN1zkM,12875
|
25 |
+
jwt/exceptions.py,sha256=xaWnosa-cREyXMyb7PYmLfQv9weZ7Q9XUYMiLJvN0hA,1101
|
26 |
+
jwt/help.py,sha256=Jrp84fG43sCwmSIaDtY08I6ZR2VE7NhrTff89tYSE40,1749
|
27 |
+
jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959
|
28 |
+
jwt/jwks_client.py,sha256=9W8JVyGByQgoLbBN1u5iY1_jlgfnnukeOBTpqaM_9SE,4222
|
29 |
+
jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30 |
+
jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99
|
31 |
+
jwt/utils.py,sha256=efS6RKCALEBeBw-uZj8VtzfZFFcECTd28q9ndNn9huw,3544
|
32 |
+
jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/WHEEL
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Wheel-Version: 1.0
|
2 |
+
Generator: setuptools (72.1.0)
|
3 |
+
Root-Is-Purelib: true
|
4 |
+
Tag: py3-none-any
|
5 |
+
|
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/top_level.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
jwt
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/INSTALLER
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
pip
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2017-2021 Ingy döt Net
|
2 |
+
Copyright (c) 2006-2016 Kirill Simonov
|
3 |
+
|
4 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5 |
+
this software and associated documentation files (the "Software"), to deal in
|
6 |
+
the Software without restriction, including without limitation the rights to
|
7 |
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
8 |
+
of the Software, and to permit persons to whom the Software is furnished to do
|
9 |
+
so, subject to the following conditions:
|
10 |
+
|
11 |
+
The above copyright notice and this permission notice shall be included in all
|
12 |
+
copies or substantial portions of the Software.
|
13 |
+
|
14 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20 |
+
SOFTWARE.
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/METADATA
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Metadata-Version: 2.1
|
2 |
+
Name: PyYAML
|
3 |
+
Version: 6.0.2
|
4 |
+
Summary: YAML parser and emitter for Python
|
5 |
+
Home-page: https://pyyaml.org/
|
6 |
+
Download-URL: https://pypi.org/project/PyYAML/
|
7 |
+
Author: Kirill Simonov
|
8 |
+
Author-email: xi@resolvent.net
|
9 |
+
License: MIT
|
10 |
+
Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues
|
11 |
+
Project-URL: CI, https://github.com/yaml/pyyaml/actions
|
12 |
+
Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation
|
13 |
+
Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core
|
14 |
+
Project-URL: Source Code, https://github.com/yaml/pyyaml
|
15 |
+
Platform: Any
|
16 |
+
Classifier: Development Status :: 5 - Production/Stable
|
17 |
+
Classifier: Intended Audience :: Developers
|
18 |
+
Classifier: License :: OSI Approved :: MIT License
|
19 |
+
Classifier: Operating System :: OS Independent
|
20 |
+
Classifier: Programming Language :: Cython
|
21 |
+
Classifier: Programming Language :: Python
|
22 |
+
Classifier: Programming Language :: Python :: 3
|
23 |
+
Classifier: Programming Language :: Python :: 3.8
|
24 |
+
Classifier: Programming Language :: Python :: 3.9
|
25 |
+
Classifier: Programming Language :: Python :: 3.10
|
26 |
+
Classifier: Programming Language :: Python :: 3.11
|
27 |
+
Classifier: Programming Language :: Python :: 3.12
|
28 |
+
Classifier: Programming Language :: Python :: 3.13
|
29 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
30 |
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
31 |
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
32 |
+
Classifier: Topic :: Text Processing :: Markup
|
33 |
+
Requires-Python: >=3.8
|
34 |
+
License-File: LICENSE
|
35 |
+
|
36 |
+
YAML is a data serialization format designed for human readability
|
37 |
+
and interaction with scripting languages. PyYAML is a YAML parser
|
38 |
+
and emitter for Python.
|
39 |
+
|
40 |
+
PyYAML features a complete YAML 1.1 parser, Unicode support, pickle
|
41 |
+
support, capable extension API, and sensible error messages. PyYAML
|
42 |
+
supports standard YAML tags and provides Python-specific tags that
|
43 |
+
allow to represent an arbitrary Python object.
|
44 |
+
|
45 |
+
PyYAML is applicable for a broad range of tasks from complex
|
46 |
+
configuration files to object serialization and persistence.
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/RECORD
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
2 |
+
PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101
|
3 |
+
PyYAML-6.0.2.dist-info/METADATA,sha256=9-odFB5seu4pGPcEv7E8iyxNF51_uKnaNGjLAhz2lto,2060
|
4 |
+
PyYAML-6.0.2.dist-info/RECORD,,
|
5 |
+
PyYAML-6.0.2.dist-info/WHEEL,sha256=BNLU9SWje0ru8009ZyWPG7zS_e_-YS0KxJU6xSwvdrU,148
|
6 |
+
PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11
|
7 |
+
_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402
|
8 |
+
_yaml/__pycache__/__init__.cpython-38.pyc,,
|
9 |
+
yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311
|
10 |
+
yaml/__pycache__/__init__.cpython-38.pyc,,
|
11 |
+
yaml/__pycache__/composer.cpython-38.pyc,,
|
12 |
+
yaml/__pycache__/constructor.cpython-38.pyc,,
|
13 |
+
yaml/__pycache__/cyaml.cpython-38.pyc,,
|
14 |
+
yaml/__pycache__/dumper.cpython-38.pyc,,
|
15 |
+
yaml/__pycache__/emitter.cpython-38.pyc,,
|
16 |
+
yaml/__pycache__/error.cpython-38.pyc,,
|
17 |
+
yaml/__pycache__/events.cpython-38.pyc,,
|
18 |
+
yaml/__pycache__/loader.cpython-38.pyc,,
|
19 |
+
yaml/__pycache__/nodes.cpython-38.pyc,,
|
20 |
+
yaml/__pycache__/parser.cpython-38.pyc,,
|
21 |
+
yaml/__pycache__/reader.cpython-38.pyc,,
|
22 |
+
yaml/__pycache__/representer.cpython-38.pyc,,
|
23 |
+
yaml/__pycache__/resolver.cpython-38.pyc,,
|
24 |
+
yaml/__pycache__/scanner.cpython-38.pyc,,
|
25 |
+
yaml/__pycache__/serializer.cpython-38.pyc,,
|
26 |
+
yaml/__pycache__/tokens.cpython-38.pyc,,
|
27 |
+
yaml/_yaml.cpython-38-x86_64-linux-gnu.so,sha256=_3oKdUU-cDdJ8ZRrTSE72_cSPNW2wottYUd4Iw2VVmA,2425936
|
28 |
+
yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883
|
29 |
+
yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639
|
30 |
+
yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851
|
31 |
+
yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837
|
32 |
+
yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006
|
33 |
+
yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533
|
34 |
+
yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445
|
35 |
+
yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061
|
36 |
+
yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440
|
37 |
+
yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495
|
38 |
+
yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794
|
39 |
+
yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190
|
40 |
+
yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004
|
41 |
+
yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279
|
42 |
+
yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165
|
43 |
+
yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/WHEEL
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Wheel-Version: 1.0
|
2 |
+
Generator: bdist_wheel (0.44.0)
|
3 |
+
Root-Is-Purelib: false
|
4 |
+
Tag: cp38-cp38-manylinux_2_17_x86_64
|
5 |
+
Tag: cp38-cp38-manylinux2014_x86_64
|
6 |
+
|
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/top_level.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
_yaml
|
2 |
+
yaml
|
try-on/env/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc
ADDED
Binary file (281 Bytes). View file
|
|