Spaces:
Running
Running
scipher.alpha
commited on
Commit
·
c16ccf2
1
Parent(s):
47b2311
Improved UI
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitignore +6 -0
- venv/bin/Activate.ps1 +0 -247
- venv/bin/activate +0 -63
- venv/bin/activate.csh +0 -26
- venv/bin/activate.fish +0 -69
- venv/bin/flask +0 -8
- venv/bin/normalizer +0 -8
- venv/bin/pip +0 -8
- venv/bin/pip3 +0 -8
- venv/bin/pip3.11 +0 -8
- venv/bin/python +0 -1
- venv/bin/python3 +0 -1
- venv/bin/python3.11 +0 -1
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER +0 -1
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt +0 -28
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA +0 -92
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD +0 -14
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL +0 -6
- venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt +0 -1
- venv/lib/python3.11/site-packages/_distutils_hack/__init__.py +0 -222
- venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/_distutils_hack/override.py +0 -1
- venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER +0 -1
- venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt +0 -20
- venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA +0 -60
- venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD +0 -12
- venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL +0 -4
- venv/lib/python3.11/site-packages/blinker/__init__.py +0 -17
- venv/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/blinker/_utilities.py +0 -64
- venv/lib/python3.11/site-packages/blinker/base.py +0 -512
- venv/lib/python3.11/site-packages/blinker/py.typed +0 -0
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/INSTALLER +0 -1
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/LICENSE +0 -20
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/METADATA +0 -68
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/RECORD +0 -14
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/WHEEL +0 -5
- venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/top_level.txt +0 -1
- venv/lib/python3.11/site-packages/certifi/__init__.py +0 -4
- venv/lib/python3.11/site-packages/certifi/__main__.py +0 -12
- venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc +0 -0
- venv/lib/python3.11/site-packages/certifi/cacert.pem +0 -0
- venv/lib/python3.11/site-packages/certifi/core.py +0 -114
- venv/lib/python3.11/site-packages/certifi/py.typed +0 -0
- venv/lib/python3.11/site-packages/charset_normalizer-3.4.1.dist-info/INSTALLER +0 -1
.gitignore
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.pyc
|
2 |
+
*.pyo
|
3 |
+
__pycache__/
|
4 |
+
venv/
|
5 |
+
.idx
|
6 |
+
.idx/
|
venv/bin/Activate.ps1
DELETED
@@ -1,247 +0,0 @@
|
|
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 VIRTUAL_ENV_PROMPT altogether.
|
100 |
-
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
101 |
-
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
102 |
-
}
|
103 |
-
|
104 |
-
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
105 |
-
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
106 |
-
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
107 |
-
}
|
108 |
-
|
109 |
-
# Leave deactivate function in the global namespace if requested:
|
110 |
-
if (-not $NonDestructive) {
|
111 |
-
Remove-Item -Path function:deactivate
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
<#
|
116 |
-
.Description
|
117 |
-
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
118 |
-
given folder, and returns them in a map.
|
119 |
-
|
120 |
-
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
121 |
-
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
122 |
-
then it is considered a `key = value` line. The left hand string is the key,
|
123 |
-
the right hand is the value.
|
124 |
-
|
125 |
-
If the value starts with a `'` or a `"` then the first and last character is
|
126 |
-
stripped from the value before being captured.
|
127 |
-
|
128 |
-
.Parameter ConfigDir
|
129 |
-
Path to the directory that contains the `pyvenv.cfg` file.
|
130 |
-
#>
|
131 |
-
function Get-PyVenvConfig(
|
132 |
-
[String]
|
133 |
-
$ConfigDir
|
134 |
-
) {
|
135 |
-
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
136 |
-
|
137 |
-
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
138 |
-
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
139 |
-
|
140 |
-
# An empty map will be returned if no config file is found.
|
141 |
-
$pyvenvConfig = @{ }
|
142 |
-
|
143 |
-
if ($pyvenvConfigPath) {
|
144 |
-
|
145 |
-
Write-Verbose "File exists, parse `key = value` lines"
|
146 |
-
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
147 |
-
|
148 |
-
$pyvenvConfigContent | ForEach-Object {
|
149 |
-
$keyval = $PSItem -split "\s*=\s*", 2
|
150 |
-
if ($keyval[0] -and $keyval[1]) {
|
151 |
-
$val = $keyval[1]
|
152 |
-
|
153 |
-
# Remove extraneous quotations around a string value.
|
154 |
-
if ("'""".Contains($val.Substring(0, 1))) {
|
155 |
-
$val = $val.Substring(1, $val.Length - 2)
|
156 |
-
}
|
157 |
-
|
158 |
-
$pyvenvConfig[$keyval[0]] = $val
|
159 |
-
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
160 |
-
}
|
161 |
-
}
|
162 |
-
}
|
163 |
-
return $pyvenvConfig
|
164 |
-
}
|
165 |
-
|
166 |
-
|
167 |
-
<# Begin Activate script --------------------------------------------------- #>
|
168 |
-
|
169 |
-
# Determine the containing directory of this script
|
170 |
-
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
171 |
-
$VenvExecDir = Get-Item -Path $VenvExecPath
|
172 |
-
|
173 |
-
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
174 |
-
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
175 |
-
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
176 |
-
|
177 |
-
# Set values required in priority: CmdLine, ConfigFile, Default
|
178 |
-
# First, get the location of the virtual environment, it might not be
|
179 |
-
# VenvExecDir if specified on the command line.
|
180 |
-
if ($VenvDir) {
|
181 |
-
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
182 |
-
}
|
183 |
-
else {
|
184 |
-
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
185 |
-
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
186 |
-
Write-Verbose "VenvDir=$VenvDir"
|
187 |
-
}
|
188 |
-
|
189 |
-
# Next, read the `pyvenv.cfg` file to determine any required value such
|
190 |
-
# as `prompt`.
|
191 |
-
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
192 |
-
|
193 |
-
# Next, set the prompt from the command line, or the config file, or
|
194 |
-
# just use the name of the virtual environment folder.
|
195 |
-
if ($Prompt) {
|
196 |
-
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
197 |
-
}
|
198 |
-
else {
|
199 |
-
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
200 |
-
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
201 |
-
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
202 |
-
$Prompt = $pyvenvCfg['prompt'];
|
203 |
-
}
|
204 |
-
else {
|
205 |
-
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
206 |
-
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
207 |
-
$Prompt = Split-Path -Path $venvDir -Leaf
|
208 |
-
}
|
209 |
-
}
|
210 |
-
|
211 |
-
Write-Verbose "Prompt = '$Prompt'"
|
212 |
-
Write-Verbose "VenvDir='$VenvDir'"
|
213 |
-
|
214 |
-
# Deactivate any currently active virtual environment, but leave the
|
215 |
-
# deactivate function in place.
|
216 |
-
deactivate -nondestructive
|
217 |
-
|
218 |
-
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
219 |
-
# that there is an activated venv.
|
220 |
-
$env:VIRTUAL_ENV = $VenvDir
|
221 |
-
|
222 |
-
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
223 |
-
|
224 |
-
Write-Verbose "Setting prompt to '$Prompt'"
|
225 |
-
|
226 |
-
# Set the prompt to include the env name
|
227 |
-
# Make sure _OLD_VIRTUAL_PROMPT is global
|
228 |
-
function global:_OLD_VIRTUAL_PROMPT { "" }
|
229 |
-
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
230 |
-
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
231 |
-
|
232 |
-
function global:prompt {
|
233 |
-
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
234 |
-
_OLD_VIRTUAL_PROMPT
|
235 |
-
}
|
236 |
-
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
237 |
-
}
|
238 |
-
|
239 |
-
# Clear PYTHONHOME
|
240 |
-
if (Test-Path -Path Env:PYTHONHOME) {
|
241 |
-
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
242 |
-
Remove-Item -Path Env:PYTHONHOME
|
243 |
-
}
|
244 |
-
|
245 |
-
# Add the venv to the PATH
|
246 |
-
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
247 |
-
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/activate
DELETED
@@ -1,63 +0,0 @@
|
|
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 |
-
# Call hash to forget past commands. Without forgetting
|
18 |
-
# past commands the $PATH changes we made may not be respected
|
19 |
-
hash -r 2> /dev/null
|
20 |
-
|
21 |
-
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
22 |
-
PS1="${_OLD_VIRTUAL_PS1:-}"
|
23 |
-
export PS1
|
24 |
-
unset _OLD_VIRTUAL_PS1
|
25 |
-
fi
|
26 |
-
|
27 |
-
unset VIRTUAL_ENV
|
28 |
-
unset VIRTUAL_ENV_PROMPT
|
29 |
-
if [ ! "${1:-}" = "nondestructive" ] ; then
|
30 |
-
# Self destruct!
|
31 |
-
unset -f deactivate
|
32 |
-
fi
|
33 |
-
}
|
34 |
-
|
35 |
-
# unset irrelevant variables
|
36 |
-
deactivate nondestructive
|
37 |
-
|
38 |
-
VIRTUAL_ENV="/home/user/AI-Chat-UI/venv"
|
39 |
-
export VIRTUAL_ENV
|
40 |
-
|
41 |
-
_OLD_VIRTUAL_PATH="$PATH"
|
42 |
-
PATH="$VIRTUAL_ENV/bin:$PATH"
|
43 |
-
export PATH
|
44 |
-
|
45 |
-
# unset PYTHONHOME if set
|
46 |
-
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
47 |
-
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
48 |
-
if [ -n "${PYTHONHOME:-}" ] ; then
|
49 |
-
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
50 |
-
unset PYTHONHOME
|
51 |
-
fi
|
52 |
-
|
53 |
-
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
54 |
-
_OLD_VIRTUAL_PS1="${PS1:-}"
|
55 |
-
PS1="(venv) ${PS1:-}"
|
56 |
-
export PS1
|
57 |
-
VIRTUAL_ENV_PROMPT="(venv) "
|
58 |
-
export VIRTUAL_ENV_PROMPT
|
59 |
-
fi
|
60 |
-
|
61 |
-
# Call hash to forget past commands. Without forgetting
|
62 |
-
# past commands the $PATH changes we made may not be respected
|
63 |
-
hash -r 2> /dev/null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/activate.csh
DELETED
@@ -1,26 +0,0 @@
|
|
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 <[email protected]>.
|
4 |
-
# Ported to Python 3.3 venv by Andrew Svetlov <[email protected]>
|
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; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
|
7 |
-
|
8 |
-
# Unset irrelevant variables.
|
9 |
-
deactivate nondestructive
|
10 |
-
|
11 |
-
setenv VIRTUAL_ENV "/home/user/AI-Chat-UI/venv"
|
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 |
-
set prompt = "(venv) $prompt"
|
21 |
-
setenv VIRTUAL_ENV_PROMPT "(venv) "
|
22 |
-
endif
|
23 |
-
|
24 |
-
alias pydoc python -m pydoc
|
25 |
-
|
26 |
-
rehash
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/activate.fish
DELETED
@@ -1,69 +0,0 @@
|
|
1 |
-
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
|
2 |
-
# (https://fishshell.com/); you cannot run it directly.
|
3 |
-
|
4 |
-
function deactivate -d "Exit virtual environment 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 |
-
set -e _OLD_FISH_PROMPT_OVERRIDE
|
17 |
-
# prevents error when using nested fish instances (Issue #93858)
|
18 |
-
if functions -q _old_fish_prompt
|
19 |
-
functions -e fish_prompt
|
20 |
-
functions -c _old_fish_prompt fish_prompt
|
21 |
-
functions -e _old_fish_prompt
|
22 |
-
end
|
23 |
-
end
|
24 |
-
|
25 |
-
set -e VIRTUAL_ENV
|
26 |
-
set -e VIRTUAL_ENV_PROMPT
|
27 |
-
if test "$argv[1]" != "nondestructive"
|
28 |
-
# Self-destruct!
|
29 |
-
functions -e deactivate
|
30 |
-
end
|
31 |
-
end
|
32 |
-
|
33 |
-
# Unset irrelevant variables.
|
34 |
-
deactivate nondestructive
|
35 |
-
|
36 |
-
set -gx VIRTUAL_ENV "/home/user/AI-Chat-UI/venv"
|
37 |
-
|
38 |
-
set -gx _OLD_VIRTUAL_PATH $PATH
|
39 |
-
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
|
40 |
-
|
41 |
-
# Unset PYTHONHOME if set.
|
42 |
-
if set -q PYTHONHOME
|
43 |
-
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
44 |
-
set -e PYTHONHOME
|
45 |
-
end
|
46 |
-
|
47 |
-
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
48 |
-
# fish uses a function instead of an env var to generate the prompt.
|
49 |
-
|
50 |
-
# Save the current fish_prompt function as the function _old_fish_prompt.
|
51 |
-
functions -c fish_prompt _old_fish_prompt
|
52 |
-
|
53 |
-
# With the original prompt function renamed, we can override with our own.
|
54 |
-
function fish_prompt
|
55 |
-
# Save the return status of the last command.
|
56 |
-
set -l old_status $status
|
57 |
-
|
58 |
-
# Output the venv prompt; color taken from the blue of the Python logo.
|
59 |
-
printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal)
|
60 |
-
|
61 |
-
# Restore the return status of the previous command.
|
62 |
-
echo "exit $old_status" | .
|
63 |
-
# Output the original/"old" prompt.
|
64 |
-
_old_fish_prompt
|
65 |
-
end
|
66 |
-
|
67 |
-
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
68 |
-
set -gx VIRTUAL_ENV_PROMPT "(venv) "
|
69 |
-
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/flask
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
#!/home/user/AI-Chat-UI/venv/bin/python
|
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())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/normalizer
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
#!/home/user/AI-Chat-UI/venv/bin/python
|
2 |
-
# -*- coding: utf-8 -*-
|
3 |
-
import re
|
4 |
-
import sys
|
5 |
-
from charset_normalizer import cli
|
6 |
-
if __name__ == '__main__':
|
7 |
-
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
-
sys.exit(cli.cli_detect())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/pip
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
#!/home/user/AI-Chat-UI/venv/bin/python
|
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())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/pip3
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
#!/home/user/AI-Chat-UI/venv/bin/python
|
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())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/pip3.11
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
#!/home/user/AI-Chat-UI/venv/bin/python
|
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())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/bin/python
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
/usr/bin/python
|
|
|
|
venv/bin/python3
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
python
|
|
|
|
venv/bin/python3.11
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
python
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
pip
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt
DELETED
@@ -1,28 +0,0 @@
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA
DELETED
@@ -1,92 +0,0 @@
|
|
1 |
-
Metadata-Version: 2.1
|
2 |
-
Name: MarkupSafe
|
3 |
-
Version: 3.0.2
|
4 |
-
Summary: Safely add untrusted strings to HTML/XML markup.
|
5 |
-
Maintainer-email: Pallets <[email protected]>
|
6 |
-
License: Copyright 2010 Pallets
|
7 |
-
|
8 |
-
Redistribution and use in source and binary forms, with or without
|
9 |
-
modification, are permitted provided that the following conditions are
|
10 |
-
met:
|
11 |
-
|
12 |
-
1. Redistributions of source code must retain the above copyright
|
13 |
-
notice, this list of conditions and the following disclaimer.
|
14 |
-
|
15 |
-
2. Redistributions in binary form must reproduce the above copyright
|
16 |
-
notice, this list of conditions and the following disclaimer in the
|
17 |
-
documentation and/or other materials provided with the distribution.
|
18 |
-
|
19 |
-
3. Neither the name of the copyright holder nor the names of its
|
20 |
-
contributors may be used to endorse or promote products derived from
|
21 |
-
this software without specific prior written permission.
|
22 |
-
|
23 |
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
24 |
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
25 |
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
26 |
-
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
27 |
-
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
28 |
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
29 |
-
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
30 |
-
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
31 |
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32 |
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
33 |
-
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34 |
-
|
35 |
-
Project-URL: Donate, https://palletsprojects.com/donate
|
36 |
-
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
|
37 |
-
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
|
38 |
-
Project-URL: Source, https://github.com/pallets/markupsafe/
|
39 |
-
Project-URL: Chat, https://discord.gg/pallets
|
40 |
-
Classifier: Development Status :: 5 - Production/Stable
|
41 |
-
Classifier: Environment :: Web Environment
|
42 |
-
Classifier: Intended Audience :: Developers
|
43 |
-
Classifier: License :: OSI Approved :: BSD License
|
44 |
-
Classifier: Operating System :: OS Independent
|
45 |
-
Classifier: Programming Language :: Python
|
46 |
-
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
47 |
-
Classifier: Topic :: Text Processing :: Markup :: HTML
|
48 |
-
Classifier: Typing :: Typed
|
49 |
-
Requires-Python: >=3.9
|
50 |
-
Description-Content-Type: text/markdown
|
51 |
-
License-File: LICENSE.txt
|
52 |
-
|
53 |
-
# MarkupSafe
|
54 |
-
|
55 |
-
MarkupSafe implements a text object that escapes characters so it is
|
56 |
-
safe to use in HTML and XML. Characters that have special meanings are
|
57 |
-
replaced so that they display as the actual characters. This mitigates
|
58 |
-
injection attacks, meaning untrusted user input can safely be displayed
|
59 |
-
on a page.
|
60 |
-
|
61 |
-
|
62 |
-
## Examples
|
63 |
-
|
64 |
-
```pycon
|
65 |
-
>>> from markupsafe import Markup, escape
|
66 |
-
|
67 |
-
>>> # escape replaces special characters and wraps in Markup
|
68 |
-
>>> escape("<script>alert(document.cookie);</script>")
|
69 |
-
Markup('<script>alert(document.cookie);</script>')
|
70 |
-
|
71 |
-
>>> # wrap in Markup to mark text "safe" and prevent escaping
|
72 |
-
>>> Markup("<strong>Hello</strong>")
|
73 |
-
Markup('<strong>hello</strong>')
|
74 |
-
|
75 |
-
>>> escape(Markup("<strong>Hello</strong>"))
|
76 |
-
Markup('<strong>hello</strong>')
|
77 |
-
|
78 |
-
>>> # Markup is a str subclass
|
79 |
-
>>> # methods and operators escape their arguments
|
80 |
-
>>> template = Markup("Hello <em>{name}</em>")
|
81 |
-
>>> template.format(name='"World"')
|
82 |
-
Markup('Hello <em>"World"</em>')
|
83 |
-
```
|
84 |
-
|
85 |
-
## Donate
|
86 |
-
|
87 |
-
The Pallets organization develops and supports MarkupSafe and other
|
88 |
-
popular packages. In order to grow the community of contributors and
|
89 |
-
users, and allow the maintainers to devote more time to the projects,
|
90 |
-
[please donate today][].
|
91 |
-
|
92 |
-
[please donate today]: https://palletsprojects.com/donate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
2 |
-
MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
|
3 |
-
MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975
|
4 |
-
MarkupSafe-3.0.2.dist-info/RECORD,,
|
5 |
-
MarkupSafe-3.0.2.dist-info/WHEEL,sha256=OhaudQk1f3YCu0uQO5v6u-i01XPoX70c0R3T_XY-jOo,151
|
6 |
-
MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
|
7 |
-
markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214
|
8 |
-
markupsafe/__pycache__/__init__.cpython-311.pyc,,
|
9 |
-
markupsafe/__pycache__/_native.cpython-311.pyc,,
|
10 |
-
markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210
|
11 |
-
markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149
|
12 |
-
markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so,sha256=6IDH6Z1ajjClhfGerTB8WLb81uXUpLD8e-e1WzCirVY,43456
|
13 |
-
markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41
|
14 |
-
markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
Wheel-Version: 1.0
|
2 |
-
Generator: setuptools (75.2.0)
|
3 |
-
Root-Is-Purelib: false
|
4 |
-
Tag: cp311-cp311-manylinux_2_17_x86_64
|
5 |
-
Tag: cp311-cp311-manylinux2014_x86_64
|
6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
markupsafe
|
|
|
|
venv/lib/python3.11/site-packages/_distutils_hack/__init__.py
DELETED
@@ -1,222 +0,0 @@
|
|
1 |
-
# don't import any costly modules
|
2 |
-
import sys
|
3 |
-
import os
|
4 |
-
|
5 |
-
|
6 |
-
is_pypy = '__pypy__' in sys.builtin_module_names
|
7 |
-
|
8 |
-
|
9 |
-
def warn_distutils_present():
|
10 |
-
if 'distutils' not in sys.modules:
|
11 |
-
return
|
12 |
-
if is_pypy and sys.version_info < (3, 7):
|
13 |
-
# PyPy for 3.6 unconditionally imports distutils, so bypass the warning
|
14 |
-
# https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
|
15 |
-
return
|
16 |
-
import warnings
|
17 |
-
|
18 |
-
warnings.warn(
|
19 |
-
"Distutils was imported before Setuptools, but importing Setuptools "
|
20 |
-
"also replaces the `distutils` module in `sys.modules`. This may lead "
|
21 |
-
"to undesirable behaviors or errors. To avoid these issues, avoid "
|
22 |
-
"using distutils directly, ensure that setuptools is installed in the "
|
23 |
-
"traditional way (e.g. not an editable install), and/or make sure "
|
24 |
-
"that setuptools is always imported before distutils."
|
25 |
-
)
|
26 |
-
|
27 |
-
|
28 |
-
def clear_distutils():
|
29 |
-
if 'distutils' not in sys.modules:
|
30 |
-
return
|
31 |
-
import warnings
|
32 |
-
|
33 |
-
warnings.warn("Setuptools is replacing distutils.")
|
34 |
-
mods = [
|
35 |
-
name
|
36 |
-
for name in sys.modules
|
37 |
-
if name == "distutils" or name.startswith("distutils.")
|
38 |
-
]
|
39 |
-
for name in mods:
|
40 |
-
del sys.modules[name]
|
41 |
-
|
42 |
-
|
43 |
-
def enabled():
|
44 |
-
"""
|
45 |
-
Allow selection of distutils by environment variable.
|
46 |
-
"""
|
47 |
-
which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
|
48 |
-
return which == 'local'
|
49 |
-
|
50 |
-
|
51 |
-
def ensure_local_distutils():
|
52 |
-
import importlib
|
53 |
-
|
54 |
-
clear_distutils()
|
55 |
-
|
56 |
-
# With the DistutilsMetaFinder in place,
|
57 |
-
# perform an import to cause distutils to be
|
58 |
-
# loaded from setuptools._distutils. Ref #2906.
|
59 |
-
with shim():
|
60 |
-
importlib.import_module('distutils')
|
61 |
-
|
62 |
-
# check that submodules load as expected
|
63 |
-
core = importlib.import_module('distutils.core')
|
64 |
-
assert '_distutils' in core.__file__, core.__file__
|
65 |
-
assert 'setuptools._distutils.log' not in sys.modules
|
66 |
-
|
67 |
-
|
68 |
-
def do_override():
|
69 |
-
"""
|
70 |
-
Ensure that the local copy of distutils is preferred over stdlib.
|
71 |
-
|
72 |
-
See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
|
73 |
-
for more motivation.
|
74 |
-
"""
|
75 |
-
if enabled():
|
76 |
-
warn_distutils_present()
|
77 |
-
ensure_local_distutils()
|
78 |
-
|
79 |
-
|
80 |
-
class _TrivialRe:
|
81 |
-
def __init__(self, *patterns):
|
82 |
-
self._patterns = patterns
|
83 |
-
|
84 |
-
def match(self, string):
|
85 |
-
return all(pat in string for pat in self._patterns)
|
86 |
-
|
87 |
-
|
88 |
-
class DistutilsMetaFinder:
|
89 |
-
def find_spec(self, fullname, path, target=None):
|
90 |
-
# optimization: only consider top level modules and those
|
91 |
-
# found in the CPython test suite.
|
92 |
-
if path is not None and not fullname.startswith('test.'):
|
93 |
-
return
|
94 |
-
|
95 |
-
method_name = 'spec_for_{fullname}'.format(**locals())
|
96 |
-
method = getattr(self, method_name, lambda: None)
|
97 |
-
return method()
|
98 |
-
|
99 |
-
def spec_for_distutils(self):
|
100 |
-
if self.is_cpython():
|
101 |
-
return
|
102 |
-
|
103 |
-
import importlib
|
104 |
-
import importlib.abc
|
105 |
-
import importlib.util
|
106 |
-
|
107 |
-
try:
|
108 |
-
mod = importlib.import_module('setuptools._distutils')
|
109 |
-
except Exception:
|
110 |
-
# There are a couple of cases where setuptools._distutils
|
111 |
-
# may not be present:
|
112 |
-
# - An older Setuptools without a local distutils is
|
113 |
-
# taking precedence. Ref #2957.
|
114 |
-
# - Path manipulation during sitecustomize removes
|
115 |
-
# setuptools from the path but only after the hook
|
116 |
-
# has been loaded. Ref #2980.
|
117 |
-
# In either case, fall back to stdlib behavior.
|
118 |
-
return
|
119 |
-
|
120 |
-
class DistutilsLoader(importlib.abc.Loader):
|
121 |
-
def create_module(self, spec):
|
122 |
-
mod.__name__ = 'distutils'
|
123 |
-
return mod
|
124 |
-
|
125 |
-
def exec_module(self, module):
|
126 |
-
pass
|
127 |
-
|
128 |
-
return importlib.util.spec_from_loader(
|
129 |
-
'distutils', DistutilsLoader(), origin=mod.__file__
|
130 |
-
)
|
131 |
-
|
132 |
-
@staticmethod
|
133 |
-
def is_cpython():
|
134 |
-
"""
|
135 |
-
Suppress supplying distutils for CPython (build and tests).
|
136 |
-
Ref #2965 and #3007.
|
137 |
-
"""
|
138 |
-
return os.path.isfile('pybuilddir.txt')
|
139 |
-
|
140 |
-
def spec_for_pip(self):
|
141 |
-
"""
|
142 |
-
Ensure stdlib distutils when running under pip.
|
143 |
-
See pypa/pip#8761 for rationale.
|
144 |
-
"""
|
145 |
-
if self.pip_imported_during_build():
|
146 |
-
return
|
147 |
-
clear_distutils()
|
148 |
-
self.spec_for_distutils = lambda: None
|
149 |
-
|
150 |
-
@classmethod
|
151 |
-
def pip_imported_during_build(cls):
|
152 |
-
"""
|
153 |
-
Detect if pip is being imported in a build script. Ref #2355.
|
154 |
-
"""
|
155 |
-
import traceback
|
156 |
-
|
157 |
-
return any(
|
158 |
-
cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
|
159 |
-
)
|
160 |
-
|
161 |
-
@staticmethod
|
162 |
-
def frame_file_is_setup(frame):
|
163 |
-
"""
|
164 |
-
Return True if the indicated frame suggests a setup.py file.
|
165 |
-
"""
|
166 |
-
# some frames may not have __file__ (#2940)
|
167 |
-
return frame.f_globals.get('__file__', '').endswith('setup.py')
|
168 |
-
|
169 |
-
def spec_for_sensitive_tests(self):
|
170 |
-
"""
|
171 |
-
Ensure stdlib distutils when running select tests under CPython.
|
172 |
-
|
173 |
-
python/cpython#91169
|
174 |
-
"""
|
175 |
-
clear_distutils()
|
176 |
-
self.spec_for_distutils = lambda: None
|
177 |
-
|
178 |
-
sensitive_tests = (
|
179 |
-
[
|
180 |
-
'test.test_distutils',
|
181 |
-
'test.test_peg_generator',
|
182 |
-
'test.test_importlib',
|
183 |
-
]
|
184 |
-
if sys.version_info < (3, 10)
|
185 |
-
else [
|
186 |
-
'test.test_distutils',
|
187 |
-
]
|
188 |
-
)
|
189 |
-
|
190 |
-
|
191 |
-
for name in DistutilsMetaFinder.sensitive_tests:
|
192 |
-
setattr(
|
193 |
-
DistutilsMetaFinder,
|
194 |
-
f'spec_for_{name}',
|
195 |
-
DistutilsMetaFinder.spec_for_sensitive_tests,
|
196 |
-
)
|
197 |
-
|
198 |
-
|
199 |
-
DISTUTILS_FINDER = DistutilsMetaFinder()
|
200 |
-
|
201 |
-
|
202 |
-
def add_shim():
|
203 |
-
DISTUTILS_FINDER in sys.meta_path or insert_shim()
|
204 |
-
|
205 |
-
|
206 |
-
class shim:
|
207 |
-
def __enter__(self):
|
208 |
-
insert_shim()
|
209 |
-
|
210 |
-
def __exit__(self, exc, value, tb):
|
211 |
-
remove_shim()
|
212 |
-
|
213 |
-
|
214 |
-
def insert_shim():
|
215 |
-
sys.meta_path.insert(0, DISTUTILS_FINDER)
|
216 |
-
|
217 |
-
|
218 |
-
def remove_shim():
|
219 |
-
try:
|
220 |
-
sys.meta_path.remove(DISTUTILS_FINDER)
|
221 |
-
except ValueError:
|
222 |
-
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc
DELETED
Binary file (11.2 kB)
|
|
venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc
DELETED
Binary file (314 Bytes)
|
|
venv/lib/python3.11/site-packages/_distutils_hack/override.py
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
__import__('_distutils_hack').do_override()
|
|
|
|
venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
pip
|
|
|
|
venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt
DELETED
@@ -1,20 +0,0 @@
|
|
1 |
-
Copyright 2010 Jason Kirtland
|
2 |
-
|
3 |
-
Permission is hereby granted, free of charge, to any person obtaining a
|
4 |
-
copy of this software and associated documentation files (the
|
5 |
-
"Software"), to deal in the Software without restriction, including
|
6 |
-
without limitation the rights to use, copy, modify, merge, publish,
|
7 |
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8 |
-
permit persons to whom the Software is furnished to do so, subject to
|
9 |
-
the following conditions:
|
10 |
-
|
11 |
-
The above copyright notice and this permission notice shall be included
|
12 |
-
in all copies or substantial portions of the Software.
|
13 |
-
|
14 |
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
15 |
-
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16 |
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
17 |
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
18 |
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
19 |
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
20 |
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA
DELETED
@@ -1,60 +0,0 @@
|
|
1 |
-
Metadata-Version: 2.3
|
2 |
-
Name: blinker
|
3 |
-
Version: 1.9.0
|
4 |
-
Summary: Fast, simple object-to-object and broadcast signaling
|
5 |
-
Author: Jason Kirtland
|
6 |
-
Maintainer-email: Pallets Ecosystem <[email protected]>
|
7 |
-
Requires-Python: >=3.9
|
8 |
-
Description-Content-Type: text/markdown
|
9 |
-
Classifier: Development Status :: 5 - Production/Stable
|
10 |
-
Classifier: License :: OSI Approved :: MIT License
|
11 |
-
Classifier: Programming Language :: Python
|
12 |
-
Classifier: Typing :: Typed
|
13 |
-
Project-URL: Chat, https://discord.gg/pallets
|
14 |
-
Project-URL: Documentation, https://blinker.readthedocs.io
|
15 |
-
Project-URL: Source, https://github.com/pallets-eco/blinker/
|
16 |
-
|
17 |
-
# Blinker
|
18 |
-
|
19 |
-
Blinker provides a fast dispatching system that allows any number of
|
20 |
-
interested parties to subscribe to events, or "signals".
|
21 |
-
|
22 |
-
|
23 |
-
## Pallets Community Ecosystem
|
24 |
-
|
25 |
-
> [!IMPORTANT]\
|
26 |
-
> This project is part of the Pallets Community Ecosystem. Pallets is the open
|
27 |
-
> source organization that maintains Flask; Pallets-Eco enables community
|
28 |
-
> maintenance of related projects. If you are interested in helping maintain
|
29 |
-
> this project, please reach out on [the Pallets Discord server][discord].
|
30 |
-
>
|
31 |
-
> [discord]: https://discord.gg/pallets
|
32 |
-
|
33 |
-
|
34 |
-
## Example
|
35 |
-
|
36 |
-
Signal receivers can subscribe to specific senders or receive signals
|
37 |
-
sent by any sender.
|
38 |
-
|
39 |
-
```pycon
|
40 |
-
>>> from blinker import signal
|
41 |
-
>>> started = signal('round-started')
|
42 |
-
>>> def each(round):
|
43 |
-
... print(f"Round {round}")
|
44 |
-
...
|
45 |
-
>>> started.connect(each)
|
46 |
-
|
47 |
-
>>> def round_two(round):
|
48 |
-
... print("This is round two.")
|
49 |
-
...
|
50 |
-
>>> started.connect(round_two, sender=2)
|
51 |
-
|
52 |
-
>>> for round in range(1, 4):
|
53 |
-
... started.send(round)
|
54 |
-
...
|
55 |
-
Round 1!
|
56 |
-
Round 2!
|
57 |
-
This is round two.
|
58 |
-
Round 3!
|
59 |
-
```
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
blinker-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
2 |
-
blinker-1.9.0.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054
|
3 |
-
blinker-1.9.0.dist-info/METADATA,sha256=uIRiM8wjjbHkCtbCyTvctU37IAZk0kEe5kxAld1dvzA,1633
|
4 |
-
blinker-1.9.0.dist-info/RECORD,,
|
5 |
-
blinker-1.9.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
6 |
-
blinker/__init__.py,sha256=I2EdZqpy4LyjX17Hn1yzJGWCjeLaVaPzsMgHkLfj_cQ,317
|
7 |
-
blinker/__pycache__/__init__.cpython-311.pyc,,
|
8 |
-
blinker/__pycache__/_utilities.cpython-311.pyc,,
|
9 |
-
blinker/__pycache__/base.cpython-311.pyc,,
|
10 |
-
blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675
|
11 |
-
blinker/base.py,sha256=QpDuvXXcwJF49lUBcH5BiST46Rz9wSG7VW_p7N_027M,19132
|
12 |
-
blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL
DELETED
@@ -1,4 +0,0 @@
|
|
1 |
-
Wheel-Version: 1.0
|
2 |
-
Generator: flit 3.10.1
|
3 |
-
Root-Is-Purelib: true
|
4 |
-
Tag: py3-none-any
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker/__init__.py
DELETED
@@ -1,17 +0,0 @@
|
|
1 |
-
from __future__ import annotations
|
2 |
-
|
3 |
-
from .base import ANY
|
4 |
-
from .base import default_namespace
|
5 |
-
from .base import NamedSignal
|
6 |
-
from .base import Namespace
|
7 |
-
from .base import Signal
|
8 |
-
from .base import signal
|
9 |
-
|
10 |
-
__all__ = [
|
11 |
-
"ANY",
|
12 |
-
"default_namespace",
|
13 |
-
"NamedSignal",
|
14 |
-
"Namespace",
|
15 |
-
"Signal",
|
16 |
-
"signal",
|
17 |
-
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc
DELETED
Binary file (605 Bytes)
|
|
venv/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc
DELETED
Binary file (3.09 kB)
|
|
venv/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc
DELETED
Binary file (23.6 kB)
|
|
venv/lib/python3.11/site-packages/blinker/_utilities.py
DELETED
@@ -1,64 +0,0 @@
|
|
1 |
-
from __future__ import annotations
|
2 |
-
|
3 |
-
import collections.abc as c
|
4 |
-
import inspect
|
5 |
-
import typing as t
|
6 |
-
from weakref import ref
|
7 |
-
from weakref import WeakMethod
|
8 |
-
|
9 |
-
T = t.TypeVar("T")
|
10 |
-
|
11 |
-
|
12 |
-
class Symbol:
|
13 |
-
"""A constant symbol, nicer than ``object()``. Repeated calls return the
|
14 |
-
same instance.
|
15 |
-
|
16 |
-
>>> Symbol('foo') is Symbol('foo')
|
17 |
-
True
|
18 |
-
>>> Symbol('foo')
|
19 |
-
foo
|
20 |
-
"""
|
21 |
-
|
22 |
-
symbols: t.ClassVar[dict[str, Symbol]] = {}
|
23 |
-
|
24 |
-
def __new__(cls, name: str) -> Symbol:
|
25 |
-
if name in cls.symbols:
|
26 |
-
return cls.symbols[name]
|
27 |
-
|
28 |
-
obj = super().__new__(cls)
|
29 |
-
cls.symbols[name] = obj
|
30 |
-
return obj
|
31 |
-
|
32 |
-
def __init__(self, name: str) -> None:
|
33 |
-
self.name = name
|
34 |
-
|
35 |
-
def __repr__(self) -> str:
|
36 |
-
return self.name
|
37 |
-
|
38 |
-
def __getnewargs__(self) -> tuple[t.Any, ...]:
|
39 |
-
return (self.name,)
|
40 |
-
|
41 |
-
|
42 |
-
def make_id(obj: object) -> c.Hashable:
|
43 |
-
"""Get a stable identifier for a receiver or sender, to be used as a dict
|
44 |
-
key or in a set.
|
45 |
-
"""
|
46 |
-
if inspect.ismethod(obj):
|
47 |
-
# The id of a bound method is not stable, but the id of the unbound
|
48 |
-
# function and instance are.
|
49 |
-
return id(obj.__func__), id(obj.__self__)
|
50 |
-
|
51 |
-
if isinstance(obj, (str, int)):
|
52 |
-
# Instances with the same value always compare equal and have the same
|
53 |
-
# hash, even if the id may change.
|
54 |
-
return obj
|
55 |
-
|
56 |
-
# Assume other types are not hashable but will always be the same instance.
|
57 |
-
return id(obj)
|
58 |
-
|
59 |
-
|
60 |
-
def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]:
|
61 |
-
if inspect.ismethod(obj):
|
62 |
-
return WeakMethod(obj, callback) # type: ignore[arg-type, return-value]
|
63 |
-
|
64 |
-
return ref(obj, callback)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker/base.py
DELETED
@@ -1,512 +0,0 @@
|
|
1 |
-
from __future__ import annotations
|
2 |
-
|
3 |
-
import collections.abc as c
|
4 |
-
import sys
|
5 |
-
import typing as t
|
6 |
-
import weakref
|
7 |
-
from collections import defaultdict
|
8 |
-
from contextlib import contextmanager
|
9 |
-
from functools import cached_property
|
10 |
-
from inspect import iscoroutinefunction
|
11 |
-
|
12 |
-
from ._utilities import make_id
|
13 |
-
from ._utilities import make_ref
|
14 |
-
from ._utilities import Symbol
|
15 |
-
|
16 |
-
F = t.TypeVar("F", bound=c.Callable[..., t.Any])
|
17 |
-
|
18 |
-
ANY = Symbol("ANY")
|
19 |
-
"""Symbol for "any sender"."""
|
20 |
-
|
21 |
-
ANY_ID = 0
|
22 |
-
|
23 |
-
|
24 |
-
class Signal:
|
25 |
-
"""A notification emitter.
|
26 |
-
|
27 |
-
:param doc: The docstring for the signal.
|
28 |
-
"""
|
29 |
-
|
30 |
-
ANY = ANY
|
31 |
-
"""An alias for the :data:`~blinker.ANY` sender symbol."""
|
32 |
-
|
33 |
-
set_class: type[set[t.Any]] = set
|
34 |
-
"""The set class to use for tracking connected receivers and senders.
|
35 |
-
Python's ``set`` is unordered. If receivers must be dispatched in the order
|
36 |
-
they were connected, an ordered set implementation can be used.
|
37 |
-
|
38 |
-
.. versionadded:: 1.7
|
39 |
-
"""
|
40 |
-
|
41 |
-
@cached_property
|
42 |
-
def receiver_connected(self) -> Signal:
|
43 |
-
"""Emitted at the end of each :meth:`connect` call.
|
44 |
-
|
45 |
-
The signal sender is the signal instance, and the :meth:`connect`
|
46 |
-
arguments are passed through: ``receiver``, ``sender``, and ``weak``.
|
47 |
-
|
48 |
-
.. versionadded:: 1.2
|
49 |
-
"""
|
50 |
-
return Signal(doc="Emitted after a receiver connects.")
|
51 |
-
|
52 |
-
@cached_property
|
53 |
-
def receiver_disconnected(self) -> Signal:
|
54 |
-
"""Emitted at the end of each :meth:`disconnect` call.
|
55 |
-
|
56 |
-
The sender is the signal instance, and the :meth:`disconnect` arguments
|
57 |
-
are passed through: ``receiver`` and ``sender``.
|
58 |
-
|
59 |
-
This signal is emitted **only** when :meth:`disconnect` is called
|
60 |
-
explicitly. This signal cannot be emitted by an automatic disconnect
|
61 |
-
when a weakly referenced receiver or sender goes out of scope, as the
|
62 |
-
instance is no longer be available to be used as the sender for this
|
63 |
-
signal.
|
64 |
-
|
65 |
-
An alternative approach is available by subscribing to
|
66 |
-
:attr:`receiver_connected` and setting up a custom weakref cleanup
|
67 |
-
callback on weak receivers and senders.
|
68 |
-
|
69 |
-
.. versionadded:: 1.2
|
70 |
-
"""
|
71 |
-
return Signal(doc="Emitted after a receiver disconnects.")
|
72 |
-
|
73 |
-
def __init__(self, doc: str | None = None) -> None:
|
74 |
-
if doc:
|
75 |
-
self.__doc__ = doc
|
76 |
-
|
77 |
-
self.receivers: dict[
|
78 |
-
t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any]
|
79 |
-
] = {}
|
80 |
-
"""The map of connected receivers. Useful to quickly check if any
|
81 |
-
receivers are connected to the signal: ``if s.receivers:``. The
|
82 |
-
structure and data is not part of the public API, but checking its
|
83 |
-
boolean value is.
|
84 |
-
"""
|
85 |
-
|
86 |
-
self.is_muted: bool = False
|
87 |
-
self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class)
|
88 |
-
self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class)
|
89 |
-
self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {}
|
90 |
-
|
91 |
-
def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F:
|
92 |
-
"""Connect ``receiver`` to be called when the signal is sent by
|
93 |
-
``sender``.
|
94 |
-
|
95 |
-
:param receiver: The callable to call when :meth:`send` is called with
|
96 |
-
the given ``sender``, passing ``sender`` as a positional argument
|
97 |
-
along with any extra keyword arguments.
|
98 |
-
:param sender: Any object or :data:`ANY`. ``receiver`` will only be
|
99 |
-
called when :meth:`send` is called with this sender. If ``ANY``, the
|
100 |
-
receiver will be called for any sender. A receiver may be connected
|
101 |
-
to multiple senders by calling :meth:`connect` multiple times.
|
102 |
-
:param weak: Track the receiver with a :mod:`weakref`. The receiver will
|
103 |
-
be automatically disconnected when it is garbage collected. When
|
104 |
-
connecting a receiver defined within a function, set to ``False``,
|
105 |
-
otherwise it will be disconnected when the function scope ends.
|
106 |
-
"""
|
107 |
-
receiver_id = make_id(receiver)
|
108 |
-
sender_id = ANY_ID if sender is ANY else make_id(sender)
|
109 |
-
|
110 |
-
if weak:
|
111 |
-
self.receivers[receiver_id] = make_ref(
|
112 |
-
receiver, self._make_cleanup_receiver(receiver_id)
|
113 |
-
)
|
114 |
-
else:
|
115 |
-
self.receivers[receiver_id] = receiver
|
116 |
-
|
117 |
-
self._by_sender[sender_id].add(receiver_id)
|
118 |
-
self._by_receiver[receiver_id].add(sender_id)
|
119 |
-
|
120 |
-
if sender is not ANY and sender_id not in self._weak_senders:
|
121 |
-
# store a cleanup for weakref-able senders
|
122 |
-
try:
|
123 |
-
self._weak_senders[sender_id] = make_ref(
|
124 |
-
sender, self._make_cleanup_sender(sender_id)
|
125 |
-
)
|
126 |
-
except TypeError:
|
127 |
-
pass
|
128 |
-
|
129 |
-
if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers:
|
130 |
-
try:
|
131 |
-
self.receiver_connected.send(
|
132 |
-
self, receiver=receiver, sender=sender, weak=weak
|
133 |
-
)
|
134 |
-
except TypeError:
|
135 |
-
# TODO no explanation or test for this
|
136 |
-
self.disconnect(receiver, sender)
|
137 |
-
raise
|
138 |
-
|
139 |
-
return receiver
|
140 |
-
|
141 |
-
def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]:
|
142 |
-
"""Connect the decorated function to be called when the signal is sent
|
143 |
-
by ``sender``.
|
144 |
-
|
145 |
-
The decorated function will be called when :meth:`send` is called with
|
146 |
-
the given ``sender``, passing ``sender`` as a positional argument along
|
147 |
-
with any extra keyword arguments.
|
148 |
-
|
149 |
-
:param sender: Any object or :data:`ANY`. ``receiver`` will only be
|
150 |
-
called when :meth:`send` is called with this sender. If ``ANY``, the
|
151 |
-
receiver will be called for any sender. A receiver may be connected
|
152 |
-
to multiple senders by calling :meth:`connect` multiple times.
|
153 |
-
:param weak: Track the receiver with a :mod:`weakref`. The receiver will
|
154 |
-
be automatically disconnected when it is garbage collected. When
|
155 |
-
connecting a receiver defined within a function, set to ``False``,
|
156 |
-
otherwise it will be disconnected when the function scope ends.=
|
157 |
-
|
158 |
-
.. versionadded:: 1.1
|
159 |
-
"""
|
160 |
-
|
161 |
-
def decorator(fn: F) -> F:
|
162 |
-
self.connect(fn, sender, weak)
|
163 |
-
return fn
|
164 |
-
|
165 |
-
return decorator
|
166 |
-
|
167 |
-
@contextmanager
|
168 |
-
def connected_to(
|
169 |
-
self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY
|
170 |
-
) -> c.Generator[None, None, None]:
|
171 |
-
"""A context manager that temporarily connects ``receiver`` to the
|
172 |
-
signal while a ``with`` block executes. When the block exits, the
|
173 |
-
receiver is disconnected. Useful for tests.
|
174 |
-
|
175 |
-
:param receiver: The callable to call when :meth:`send` is called with
|
176 |
-
the given ``sender``, passing ``sender`` as a positional argument
|
177 |
-
along with any extra keyword arguments.
|
178 |
-
:param sender: Any object or :data:`ANY`. ``receiver`` will only be
|
179 |
-
called when :meth:`send` is called with this sender. If ``ANY``, the
|
180 |
-
receiver will be called for any sender.
|
181 |
-
|
182 |
-
.. versionadded:: 1.1
|
183 |
-
"""
|
184 |
-
self.connect(receiver, sender=sender, weak=False)
|
185 |
-
|
186 |
-
try:
|
187 |
-
yield None
|
188 |
-
finally:
|
189 |
-
self.disconnect(receiver)
|
190 |
-
|
191 |
-
@contextmanager
|
192 |
-
def muted(self) -> c.Generator[None, None, None]:
|
193 |
-
"""A context manager that temporarily disables the signal. No receivers
|
194 |
-
will be called if the signal is sent, until the ``with`` block exits.
|
195 |
-
Useful for tests.
|
196 |
-
"""
|
197 |
-
self.is_muted = True
|
198 |
-
|
199 |
-
try:
|
200 |
-
yield None
|
201 |
-
finally:
|
202 |
-
self.is_muted = False
|
203 |
-
|
204 |
-
def send(
|
205 |
-
self,
|
206 |
-
sender: t.Any | None = None,
|
207 |
-
/,
|
208 |
-
*,
|
209 |
-
_async_wrapper: c.Callable[
|
210 |
-
[c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any]
|
211 |
-
]
|
212 |
-
| None = None,
|
213 |
-
**kwargs: t.Any,
|
214 |
-
) -> list[tuple[c.Callable[..., t.Any], t.Any]]:
|
215 |
-
"""Call all receivers that are connected to the given ``sender``
|
216 |
-
or :data:`ANY`. Each receiver is called with ``sender`` as a positional
|
217 |
-
argument along with any extra keyword arguments. Return a list of
|
218 |
-
``(receiver, return value)`` tuples.
|
219 |
-
|
220 |
-
The order receivers are called is undefined, but can be influenced by
|
221 |
-
setting :attr:`set_class`.
|
222 |
-
|
223 |
-
If a receiver raises an exception, that exception will propagate up.
|
224 |
-
This makes debugging straightforward, with an assumption that correctly
|
225 |
-
implemented receivers will not raise.
|
226 |
-
|
227 |
-
:param sender: Call receivers connected to this sender, in addition to
|
228 |
-
those connected to :data:`ANY`.
|
229 |
-
:param _async_wrapper: Will be called on any receivers that are async
|
230 |
-
coroutines to turn them into sync callables. For example, could run
|
231 |
-
the receiver with an event loop.
|
232 |
-
:param kwargs: Extra keyword arguments to pass to each receiver.
|
233 |
-
|
234 |
-
.. versionchanged:: 1.7
|
235 |
-
Added the ``_async_wrapper`` argument.
|
236 |
-
"""
|
237 |
-
if self.is_muted:
|
238 |
-
return []
|
239 |
-
|
240 |
-
results = []
|
241 |
-
|
242 |
-
for receiver in self.receivers_for(sender):
|
243 |
-
if iscoroutinefunction(receiver):
|
244 |
-
if _async_wrapper is None:
|
245 |
-
raise RuntimeError("Cannot send to a coroutine function.")
|
246 |
-
|
247 |
-
result = _async_wrapper(receiver)(sender, **kwargs)
|
248 |
-
else:
|
249 |
-
result = receiver(sender, **kwargs)
|
250 |
-
|
251 |
-
results.append((receiver, result))
|
252 |
-
|
253 |
-
return results
|
254 |
-
|
255 |
-
async def send_async(
|
256 |
-
self,
|
257 |
-
sender: t.Any | None = None,
|
258 |
-
/,
|
259 |
-
*,
|
260 |
-
_sync_wrapper: c.Callable[
|
261 |
-
[c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]
|
262 |
-
]
|
263 |
-
| None = None,
|
264 |
-
**kwargs: t.Any,
|
265 |
-
) -> list[tuple[c.Callable[..., t.Any], t.Any]]:
|
266 |
-
"""Await all receivers that are connected to the given ``sender``
|
267 |
-
or :data:`ANY`. Each receiver is called with ``sender`` as a positional
|
268 |
-
argument along with any extra keyword arguments. Return a list of
|
269 |
-
``(receiver, return value)`` tuples.
|
270 |
-
|
271 |
-
The order receivers are called is undefined, but can be influenced by
|
272 |
-
setting :attr:`set_class`.
|
273 |
-
|
274 |
-
If a receiver raises an exception, that exception will propagate up.
|
275 |
-
This makes debugging straightforward, with an assumption that correctly
|
276 |
-
implemented receivers will not raise.
|
277 |
-
|
278 |
-
:param sender: Call receivers connected to this sender, in addition to
|
279 |
-
those connected to :data:`ANY`.
|
280 |
-
:param _sync_wrapper: Will be called on any receivers that are sync
|
281 |
-
callables to turn them into async coroutines. For example,
|
282 |
-
could call the receiver in a thread.
|
283 |
-
:param kwargs: Extra keyword arguments to pass to each receiver.
|
284 |
-
|
285 |
-
.. versionadded:: 1.7
|
286 |
-
"""
|
287 |
-
if self.is_muted:
|
288 |
-
return []
|
289 |
-
|
290 |
-
results = []
|
291 |
-
|
292 |
-
for receiver in self.receivers_for(sender):
|
293 |
-
if not iscoroutinefunction(receiver):
|
294 |
-
if _sync_wrapper is None:
|
295 |
-
raise RuntimeError("Cannot send to a non-coroutine function.")
|
296 |
-
|
297 |
-
result = await _sync_wrapper(receiver)(sender, **kwargs)
|
298 |
-
else:
|
299 |
-
result = await receiver(sender, **kwargs)
|
300 |
-
|
301 |
-
results.append((receiver, result))
|
302 |
-
|
303 |
-
return results
|
304 |
-
|
305 |
-
def has_receivers_for(self, sender: t.Any) -> bool:
|
306 |
-
"""Check if there is at least one receiver that will be called with the
|
307 |
-
given ``sender``. A receiver connected to :data:`ANY` will always be
|
308 |
-
called, regardless of sender. Does not check if weakly referenced
|
309 |
-
receivers are still live. See :meth:`receivers_for` for a stronger
|
310 |
-
search.
|
311 |
-
|
312 |
-
:param sender: Check for receivers connected to this sender, in addition
|
313 |
-
to those connected to :data:`ANY`.
|
314 |
-
"""
|
315 |
-
if not self.receivers:
|
316 |
-
return False
|
317 |
-
|
318 |
-
if self._by_sender[ANY_ID]:
|
319 |
-
return True
|
320 |
-
|
321 |
-
if sender is ANY:
|
322 |
-
return False
|
323 |
-
|
324 |
-
return make_id(sender) in self._by_sender
|
325 |
-
|
326 |
-
def receivers_for(
|
327 |
-
self, sender: t.Any
|
328 |
-
) -> c.Generator[c.Callable[..., t.Any], None, None]:
|
329 |
-
"""Yield each receiver to be called for ``sender``, in addition to those
|
330 |
-
to be called for :data:`ANY`. Weakly referenced receivers that are not
|
331 |
-
live will be disconnected and skipped.
|
332 |
-
|
333 |
-
:param sender: Yield receivers connected to this sender, in addition
|
334 |
-
to those connected to :data:`ANY`.
|
335 |
-
"""
|
336 |
-
# TODO: test receivers_for(ANY)
|
337 |
-
if not self.receivers:
|
338 |
-
return
|
339 |
-
|
340 |
-
sender_id = make_id(sender)
|
341 |
-
|
342 |
-
if sender_id in self._by_sender:
|
343 |
-
ids = self._by_sender[ANY_ID] | self._by_sender[sender_id]
|
344 |
-
else:
|
345 |
-
ids = self._by_sender[ANY_ID].copy()
|
346 |
-
|
347 |
-
for receiver_id in ids:
|
348 |
-
receiver = self.receivers.get(receiver_id)
|
349 |
-
|
350 |
-
if receiver is None:
|
351 |
-
continue
|
352 |
-
|
353 |
-
if isinstance(receiver, weakref.ref):
|
354 |
-
strong = receiver()
|
355 |
-
|
356 |
-
if strong is None:
|
357 |
-
self._disconnect(receiver_id, ANY_ID)
|
358 |
-
continue
|
359 |
-
|
360 |
-
yield strong
|
361 |
-
else:
|
362 |
-
yield receiver
|
363 |
-
|
364 |
-
def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None:
|
365 |
-
"""Disconnect ``receiver`` from being called when the signal is sent by
|
366 |
-
``sender``.
|
367 |
-
|
368 |
-
:param receiver: A connected receiver callable.
|
369 |
-
:param sender: Disconnect from only this sender. By default, disconnect
|
370 |
-
from all senders.
|
371 |
-
"""
|
372 |
-
sender_id: c.Hashable
|
373 |
-
|
374 |
-
if sender is ANY:
|
375 |
-
sender_id = ANY_ID
|
376 |
-
else:
|
377 |
-
sender_id = make_id(sender)
|
378 |
-
|
379 |
-
receiver_id = make_id(receiver)
|
380 |
-
self._disconnect(receiver_id, sender_id)
|
381 |
-
|
382 |
-
if (
|
383 |
-
"receiver_disconnected" in self.__dict__
|
384 |
-
and self.receiver_disconnected.receivers
|
385 |
-
):
|
386 |
-
self.receiver_disconnected.send(self, receiver=receiver, sender=sender)
|
387 |
-
|
388 |
-
def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None:
|
389 |
-
if sender_id == ANY_ID:
|
390 |
-
if self._by_receiver.pop(receiver_id, None) is not None:
|
391 |
-
for bucket in self._by_sender.values():
|
392 |
-
bucket.discard(receiver_id)
|
393 |
-
|
394 |
-
self.receivers.pop(receiver_id, None)
|
395 |
-
else:
|
396 |
-
self._by_sender[sender_id].discard(receiver_id)
|
397 |
-
self._by_receiver[receiver_id].discard(sender_id)
|
398 |
-
|
399 |
-
def _make_cleanup_receiver(
|
400 |
-
self, receiver_id: c.Hashable
|
401 |
-
) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]:
|
402 |
-
"""Create a callback function to disconnect a weakly referenced
|
403 |
-
receiver when it is garbage collected.
|
404 |
-
"""
|
405 |
-
|
406 |
-
def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None:
|
407 |
-
# If the interpreter is shutting down, disconnecting can result in a
|
408 |
-
# weird ignored exception. Don't call it in that case.
|
409 |
-
if not sys.is_finalizing():
|
410 |
-
self._disconnect(receiver_id, ANY_ID)
|
411 |
-
|
412 |
-
return cleanup
|
413 |
-
|
414 |
-
def _make_cleanup_sender(
|
415 |
-
self, sender_id: c.Hashable
|
416 |
-
) -> c.Callable[[weakref.ref[t.Any]], None]:
|
417 |
-
"""Create a callback function to disconnect all receivers for a weakly
|
418 |
-
referenced sender when it is garbage collected.
|
419 |
-
"""
|
420 |
-
assert sender_id != ANY_ID
|
421 |
-
|
422 |
-
def cleanup(ref: weakref.ref[t.Any]) -> None:
|
423 |
-
self._weak_senders.pop(sender_id, None)
|
424 |
-
|
425 |
-
for receiver_id in self._by_sender.pop(sender_id, ()):
|
426 |
-
self._by_receiver[receiver_id].discard(sender_id)
|
427 |
-
|
428 |
-
return cleanup
|
429 |
-
|
430 |
-
def _cleanup_bookkeeping(self) -> None:
|
431 |
-
"""Prune unused sender/receiver bookkeeping. Not threadsafe.
|
432 |
-
|
433 |
-
Connecting & disconnecting leaves behind a small amount of bookkeeping
|
434 |
-
data. Typical workloads using Blinker, for example in most web apps,
|
435 |
-
Flask, CLI scripts, etc., are not adversely affected by this
|
436 |
-
bookkeeping.
|
437 |
-
|
438 |
-
With a long-running process performing dynamic signal routing with high
|
439 |
-
volume, e.g. connecting to function closures, senders are all unique
|
440 |
-
object instances. Doing all of this over and over may cause memory usage
|
441 |
-
to grow due to extraneous bookkeeping. (An empty ``set`` for each stale
|
442 |
-
sender/receiver pair.)
|
443 |
-
|
444 |
-
This method will prune that bookkeeping away, with the caveat that such
|
445 |
-
pruning is not threadsafe. The risk is that cleanup of a fully
|
446 |
-
disconnected receiver/sender pair occurs while another thread is
|
447 |
-
connecting that same pair. If you are in the highly dynamic, unique
|
448 |
-
receiver/sender situation that has lead you to this method, that failure
|
449 |
-
mode is perhaps not a big deal for you.
|
450 |
-
"""
|
451 |
-
for mapping in (self._by_sender, self._by_receiver):
|
452 |
-
for ident, bucket in list(mapping.items()):
|
453 |
-
if not bucket:
|
454 |
-
mapping.pop(ident, None)
|
455 |
-
|
456 |
-
def _clear_state(self) -> None:
|
457 |
-
"""Disconnect all receivers and senders. Useful for tests."""
|
458 |
-
self._weak_senders.clear()
|
459 |
-
self.receivers.clear()
|
460 |
-
self._by_sender.clear()
|
461 |
-
self._by_receiver.clear()
|
462 |
-
|
463 |
-
|
464 |
-
class NamedSignal(Signal):
|
465 |
-
"""A named generic notification emitter. The name is not used by the signal
|
466 |
-
itself, but matches the key in the :class:`Namespace` that it belongs to.
|
467 |
-
|
468 |
-
:param name: The name of the signal within the namespace.
|
469 |
-
:param doc: The docstring for the signal.
|
470 |
-
"""
|
471 |
-
|
472 |
-
def __init__(self, name: str, doc: str | None = None) -> None:
|
473 |
-
super().__init__(doc)
|
474 |
-
|
475 |
-
#: The name of this signal.
|
476 |
-
self.name: str = name
|
477 |
-
|
478 |
-
def __repr__(self) -> str:
|
479 |
-
base = super().__repr__()
|
480 |
-
return f"{base[:-1]}; {self.name!r}>" # noqa: E702
|
481 |
-
|
482 |
-
|
483 |
-
class Namespace(dict[str, NamedSignal]):
|
484 |
-
"""A dict mapping names to signals."""
|
485 |
-
|
486 |
-
def signal(self, name: str, doc: str | None = None) -> NamedSignal:
|
487 |
-
"""Return the :class:`NamedSignal` for the given ``name``, creating it
|
488 |
-
if required. Repeated calls with the same name return the same signal.
|
489 |
-
|
490 |
-
:param name: The name of the signal.
|
491 |
-
:param doc: The docstring of the signal.
|
492 |
-
"""
|
493 |
-
if name not in self:
|
494 |
-
self[name] = NamedSignal(name, doc)
|
495 |
-
|
496 |
-
return self[name]
|
497 |
-
|
498 |
-
|
499 |
-
class _PNamespaceSignal(t.Protocol):
|
500 |
-
def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ...
|
501 |
-
|
502 |
-
|
503 |
-
default_namespace: Namespace = Namespace()
|
504 |
-
"""A default :class:`Namespace` for creating named signals. :func:`signal`
|
505 |
-
creates a :class:`NamedSignal` in this namespace.
|
506 |
-
"""
|
507 |
-
|
508 |
-
signal: _PNamespaceSignal = default_namespace.signal
|
509 |
-
"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given
|
510 |
-
``name``, creating it if required. Repeated calls with the same name return the
|
511 |
-
same signal.
|
512 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/blinker/py.typed
DELETED
File without changes
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/INSTALLER
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
pip
|
|
|
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1 |
-
This package contains a modified version of ca-bundle.crt:
|
2 |
-
|
3 |
-
ca-bundle.crt -- Bundle of CA Root Certificates
|
4 |
-
|
5 |
-
This is a bundle of X.509 certificates of public Certificate Authorities
|
6 |
-
(CA). These were automatically extracted from Mozilla's root certificates
|
7 |
-
file (certdata.txt). This file can be found in the mozilla source tree:
|
8 |
-
https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
|
9 |
-
It contains the certificates in PEM format and therefore
|
10 |
-
can be directly used with curl / libcurl / php_curl, or with
|
11 |
-
an Apache+mod_ssl webserver for SSL client authentication.
|
12 |
-
Just configure this file as the SSLCACertificateFile.#
|
13 |
-
|
14 |
-
***** BEGIN LICENSE BLOCK *****
|
15 |
-
This Source Code Form is subject to the terms of the Mozilla Public License,
|
16 |
-
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
|
17 |
-
one at http://mozilla.org/MPL/2.0/.
|
18 |
-
|
19 |
-
***** END LICENSE BLOCK *****
|
20 |
-
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/METADATA
DELETED
@@ -1,68 +0,0 @@
|
|
1 |
-
Metadata-Version: 2.1
|
2 |
-
Name: certifi
|
3 |
-
Version: 2024.12.14
|
4 |
-
Summary: Python package for providing Mozilla's CA Bundle.
|
5 |
-
Home-page: https://github.com/certifi/python-certifi
|
6 |
-
Author: Kenneth Reitz
|
7 |
-
Author-email: [email protected]
|
8 |
-
License: MPL-2.0
|
9 |
-
Project-URL: Source, https://github.com/certifi/python-certifi
|
10 |
-
Classifier: Development Status :: 5 - Production/Stable
|
11 |
-
Classifier: Intended Audience :: Developers
|
12 |
-
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
|
13 |
-
Classifier: Natural Language :: English
|
14 |
-
Classifier: Programming Language :: Python
|
15 |
-
Classifier: Programming Language :: Python :: 3
|
16 |
-
Classifier: Programming Language :: Python :: 3 :: Only
|
17 |
-
Classifier: Programming Language :: Python :: 3.6
|
18 |
-
Classifier: Programming Language :: Python :: 3.7
|
19 |
-
Classifier: Programming Language :: Python :: 3.8
|
20 |
-
Classifier: Programming Language :: Python :: 3.9
|
21 |
-
Classifier: Programming Language :: Python :: 3.10
|
22 |
-
Classifier: Programming Language :: Python :: 3.11
|
23 |
-
Classifier: Programming Language :: Python :: 3.12
|
24 |
-
Classifier: Programming Language :: Python :: 3.13
|
25 |
-
Requires-Python: >=3.6
|
26 |
-
License-File: LICENSE
|
27 |
-
|
28 |
-
Certifi: Python SSL Certificates
|
29 |
-
================================
|
30 |
-
|
31 |
-
Certifi provides Mozilla's carefully curated collection of Root Certificates for
|
32 |
-
validating the trustworthiness of SSL certificates while verifying the identity
|
33 |
-
of TLS hosts. It has been extracted from the `Requests`_ project.
|
34 |
-
|
35 |
-
Installation
|
36 |
-
------------
|
37 |
-
|
38 |
-
``certifi`` is available on PyPI. Simply install it with ``pip``::
|
39 |
-
|
40 |
-
$ pip install certifi
|
41 |
-
|
42 |
-
Usage
|
43 |
-
-----
|
44 |
-
|
45 |
-
To reference the installed certificate authority (CA) bundle, you can use the
|
46 |
-
built-in function::
|
47 |
-
|
48 |
-
>>> import certifi
|
49 |
-
|
50 |
-
>>> certifi.where()
|
51 |
-
'/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'
|
52 |
-
|
53 |
-
Or from the command line::
|
54 |
-
|
55 |
-
$ python -m certifi
|
56 |
-
/usr/local/lib/python3.7/site-packages/certifi/cacert.pem
|
57 |
-
|
58 |
-
Enjoy!
|
59 |
-
|
60 |
-
.. _`Requests`: https://requests.readthedocs.io/en/master/
|
61 |
-
|
62 |
-
Addition/Removal of Certificates
|
63 |
-
--------------------------------
|
64 |
-
|
65 |
-
Certifi does not support any addition/removal or other modification of the
|
66 |
-
CA trust store content. This project is intended to provide a reliable and
|
67 |
-
highly portable root of trust to python deployments. Look to upstream projects
|
68 |
-
for methods to use alternate trust.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/RECORD
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
certifi-2024.12.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
2 |
-
certifi-2024.12.14.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989
|
3 |
-
certifi-2024.12.14.dist-info/METADATA,sha256=z71eRGTFszr4qsHenZ_vG2Fd5bV9PBWmJgShthc8IkY,2274
|
4 |
-
certifi-2024.12.14.dist-info/RECORD,,
|
5 |
-
certifi-2024.12.14.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
6 |
-
certifi-2024.12.14.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8
|
7 |
-
certifi/__init__.py,sha256=LqjNcwt1sYSS3uhPXrf6jJzVCuHtNVpuirg5rb7mVm8,94
|
8 |
-
certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243
|
9 |
-
certifi/__pycache__/__init__.cpython-311.pyc,,
|
10 |
-
certifi/__pycache__/__main__.cpython-311.pyc,,
|
11 |
-
certifi/__pycache__/core.cpython-311.pyc,,
|
12 |
-
certifi/cacert.pem,sha256=gHiXJU84Oif0XkT0llbzeKurIUHt5DpK08JCCll90j8,294769
|
13 |
-
certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426
|
14 |
-
certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/WHEEL
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
Wheel-Version: 1.0
|
2 |
-
Generator: setuptools (75.6.0)
|
3 |
-
Root-Is-Purelib: true
|
4 |
-
Tag: py3-none-any
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi-2024.12.14.dist-info/top_level.txt
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
certifi
|
|
|
|
venv/lib/python3.11/site-packages/certifi/__init__.py
DELETED
@@ -1,4 +0,0 @@
|
|
1 |
-
from .core import contents, where
|
2 |
-
|
3 |
-
__all__ = ["contents", "where"]
|
4 |
-
__version__ = "2024.12.14"
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi/__main__.py
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
import argparse
|
2 |
-
|
3 |
-
from certifi import contents, where
|
4 |
-
|
5 |
-
parser = argparse.ArgumentParser()
|
6 |
-
parser.add_argument("-c", "--contents", action="store_true")
|
7 |
-
args = parser.parse_args()
|
8 |
-
|
9 |
-
if args.contents:
|
10 |
-
print(contents())
|
11 |
-
else:
|
12 |
-
print(where())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc
DELETED
Binary file (326 Bytes)
|
|
venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc
DELETED
Binary file (715 Bytes)
|
|
venv/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc
DELETED
Binary file (3.76 kB)
|
|
venv/lib/python3.11/site-packages/certifi/cacert.pem
DELETED
The diff for this file is too large to render.
See raw diff
|
|
venv/lib/python3.11/site-packages/certifi/core.py
DELETED
@@ -1,114 +0,0 @@
|
|
1 |
-
"""
|
2 |
-
certifi.py
|
3 |
-
~~~~~~~~~~
|
4 |
-
|
5 |
-
This module returns the installation location of cacert.pem or its contents.
|
6 |
-
"""
|
7 |
-
import sys
|
8 |
-
import atexit
|
9 |
-
|
10 |
-
def exit_cacert_ctx() -> None:
|
11 |
-
_CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr]
|
12 |
-
|
13 |
-
|
14 |
-
if sys.version_info >= (3, 11):
|
15 |
-
|
16 |
-
from importlib.resources import as_file, files
|
17 |
-
|
18 |
-
_CACERT_CTX = None
|
19 |
-
_CACERT_PATH = None
|
20 |
-
|
21 |
-
def where() -> str:
|
22 |
-
# This is slightly terrible, but we want to delay extracting the file
|
23 |
-
# in cases where we're inside of a zipimport situation until someone
|
24 |
-
# actually calls where(), but we don't want to re-extract the file
|
25 |
-
# on every call of where(), so we'll do it once then store it in a
|
26 |
-
# global variable.
|
27 |
-
global _CACERT_CTX
|
28 |
-
global _CACERT_PATH
|
29 |
-
if _CACERT_PATH is None:
|
30 |
-
# This is slightly janky, the importlib.resources API wants you to
|
31 |
-
# manage the cleanup of this file, so it doesn't actually return a
|
32 |
-
# path, it returns a context manager that will give you the path
|
33 |
-
# when you enter it and will do any cleanup when you leave it. In
|
34 |
-
# the common case of not needing a temporary file, it will just
|
35 |
-
# return the file system location and the __exit__() is a no-op.
|
36 |
-
#
|
37 |
-
# We also have to hold onto the actual context manager, because
|
38 |
-
# it will do the cleanup whenever it gets garbage collected, so
|
39 |
-
# we will also store that at the global level as well.
|
40 |
-
_CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem"))
|
41 |
-
_CACERT_PATH = str(_CACERT_CTX.__enter__())
|
42 |
-
atexit.register(exit_cacert_ctx)
|
43 |
-
|
44 |
-
return _CACERT_PATH
|
45 |
-
|
46 |
-
def contents() -> str:
|
47 |
-
return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii")
|
48 |
-
|
49 |
-
elif sys.version_info >= (3, 7):
|
50 |
-
|
51 |
-
from importlib.resources import path as get_path, read_text
|
52 |
-
|
53 |
-
_CACERT_CTX = None
|
54 |
-
_CACERT_PATH = None
|
55 |
-
|
56 |
-
def where() -> str:
|
57 |
-
# This is slightly terrible, but we want to delay extracting the
|
58 |
-
# file in cases where we're inside of a zipimport situation until
|
59 |
-
# someone actually calls where(), but we don't want to re-extract
|
60 |
-
# the file on every call of where(), so we'll do it once then store
|
61 |
-
# it in a global variable.
|
62 |
-
global _CACERT_CTX
|
63 |
-
global _CACERT_PATH
|
64 |
-
if _CACERT_PATH is None:
|
65 |
-
# This is slightly janky, the importlib.resources API wants you
|
66 |
-
# to manage the cleanup of this file, so it doesn't actually
|
67 |
-
# return a path, it returns a context manager that will give
|
68 |
-
# you the path when you enter it and will do any cleanup when
|
69 |
-
# you leave it. In the common case of not needing a temporary
|
70 |
-
# file, it will just return the file system location and the
|
71 |
-
# __exit__() is a no-op.
|
72 |
-
#
|
73 |
-
# We also have to hold onto the actual context manager, because
|
74 |
-
# it will do the cleanup whenever it gets garbage collected, so
|
75 |
-
# we will also store that at the global level as well.
|
76 |
-
_CACERT_CTX = get_path("certifi", "cacert.pem")
|
77 |
-
_CACERT_PATH = str(_CACERT_CTX.__enter__())
|
78 |
-
atexit.register(exit_cacert_ctx)
|
79 |
-
|
80 |
-
return _CACERT_PATH
|
81 |
-
|
82 |
-
def contents() -> str:
|
83 |
-
return read_text("certifi", "cacert.pem", encoding="ascii")
|
84 |
-
|
85 |
-
else:
|
86 |
-
import os
|
87 |
-
import types
|
88 |
-
from typing import Union
|
89 |
-
|
90 |
-
Package = Union[types.ModuleType, str]
|
91 |
-
Resource = Union[str, "os.PathLike"]
|
92 |
-
|
93 |
-
# This fallback will work for Python versions prior to 3.7 that lack the
|
94 |
-
# importlib.resources module but relies on the existing `where` function
|
95 |
-
# so won't address issues with environments like PyOxidizer that don't set
|
96 |
-
# __file__ on modules.
|
97 |
-
def read_text(
|
98 |
-
package: Package,
|
99 |
-
resource: Resource,
|
100 |
-
encoding: str = 'utf-8',
|
101 |
-
errors: str = 'strict'
|
102 |
-
) -> str:
|
103 |
-
with open(where(), encoding=encoding) as data:
|
104 |
-
return data.read()
|
105 |
-
|
106 |
-
# If we don't have importlib.resources, then we will just do the old logic
|
107 |
-
# of assuming we're on the filesystem and munge the path directly.
|
108 |
-
def where() -> str:
|
109 |
-
f = os.path.dirname(__file__)
|
110 |
-
|
111 |
-
return os.path.join(f, "cacert.pem")
|
112 |
-
|
113 |
-
def contents() -> str:
|
114 |
-
return read_text("certifi", "cacert.pem", encoding="ascii")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
venv/lib/python3.11/site-packages/certifi/py.typed
DELETED
File without changes
|
venv/lib/python3.11/site-packages/charset_normalizer-3.4.1.dist-info/INSTALLER
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
pip
|
|
|
|