PyProd 0.1.0__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- pyprod-0.1.0/.github/workflows/test.yml +22 -0
- pyprod-0.1.0/.gitignore +174 -0
- pyprod-0.1.0/.python-version +1 -0
- pyprod-0.1.0/.readthedocs.yaml +20 -0
- pyprod-0.1.0/.vscode/settings.json +5 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/.gitignore +2 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/Activate.ps1 +248 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/activate +75 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/activate.csh +27 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/activate.fish +69 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/jp.py +54 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/pip +8 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/pip3 +8 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/pip3.13 +8 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/python +1 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/python3 +1 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/bin/python3.13 +1 -0
- pyprod-0.1.0/.xxx/.Prodfile.py.pyprod/pyvenv.cfg +5 -0
- pyprod-0.1.0/.xxx/Prodfile.py +11 -0
- pyprod-0.1.0/.xxx/data.txt +1 -0
- pyprod-0.1.0/.xxx/output/hello.txt +1 -0
- pyprod-0.1.0/LICENSE +21 -0
- pyprod-0.1.0/PKG-INFO +76 -0
- pyprod-0.1.0/README.rst +60 -0
- pyprod-0.1.0/docs/Makefile +20 -0
- pyprod-0.1.0/docs/commandline.rst +20 -0
- pyprod-0.1.0/docs/conf.py +35 -0
- pyprod-0.1.0/docs/index.rst +40 -0
- pyprod-0.1.0/docs/make.bat +35 -0
- pyprod-0.1.0/docs/prodfile.rst +307 -0
- pyprod-0.1.0/docs/pyprod2.png +0 -0
- pyprod-0.1.0/docs/quickstart.rst +78 -0
- pyprod-0.1.0/docs/requirements.txt +1 -0
- pyprod-0.1.0/pyprod.webp +0 -0
- pyprod-0.1.0/pyprod2.png +0 -0
- pyprod-0.1.0/pyproject.toml +43 -0
- pyprod-0.1.0/sample/build-c/.gitignore +2 -0
- pyprod-0.1.0/sample/build-c/Makefile +15 -0
- pyprod-0.1.0/sample/build-c/Prodfile.py +26 -0
- pyprod-0.1.0/sample/build-c/hello.c +7 -0
- pyprod-0.1.0/sample/build-c/hello.h +3 -0
- pyprod-0.1.0/sample/build-c/main.c +7 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/Activate.ps1 +247 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/activate +70 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/activate.csh +27 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/activate.fish +69 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/normalizer +8 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/pip +8 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/pip3 +8 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/pip3.12 +8 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/python +1 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/python3 +1 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/bin/python3.12 +1 -0
- pyprod-0.1.0/sample/generate-doc/.PRODFILE.py.pyprod/pyvenv.cfg +5 -0
- pyprod-0.1.0/sample/generate-doc/.gitignore +2 -0
- pyprod-0.1.0/sample/generate-doc/Prodfile.py +30 -0
- pyprod-0.1.0/sample/generate-doc/a.txt +1 -0
- pyprod-0.1.0/sample/generate-doc/b.txt +1 -0
- pyprod-0.1.0/sample/generate-doc/c.txt +1 -0
- pyprod-0.1.0/sample/generate-doc/inc1.txt +0 -0
- pyprod-0.1.0/sample/generate-doc/inc2.txt +0 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/.gitignore +2 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/Activate.ps1 +248 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/activate +75 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/activate.csh +27 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/activate.fish +69 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/pip +8 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/pip3 +8 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/pip3.13 +8 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/pygmentize +8 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/python +1 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/python3 +1 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/bin/python3.13 +1 -0
- pyprod-0.1.0/sample/md-to-pdf/.Prodfile.py.pyprod/pyvenv.cfg +5 -0
- pyprod-0.1.0/sample/md-to-pdf/.build/doc.html +28 -0
- pyprod-0.1.0/sample/md-to-pdf/.gitignore +1 -0
- pyprod-0.1.0/sample/md-to-pdf/Prodfile.py +48 -0
- pyprod-0.1.0/sample/md-to-pdf/doc.md +24 -0
- pyprod-0.1.0/sample/md-to-pdf/doc.pdf +0 -0
- pyprod-0.1.0/sample/md-to-pdf/md_to_html.py +24 -0
- pyprod-0.1.0/sample/md-to-pdf/template.html +12 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/.gitignore +2 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/Activate.ps1 +248 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/activate +75 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/activate.csh +27 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/activate.fish +69 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/jp.py +54 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/pip +8 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/pip3 +8 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/pip3.13 +8 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/python +1 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/python3 +1 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/bin/python3.13 +1 -0
- pyprod-0.1.0/sample/s3files/.PRODFILE.py.pyprod/pyvenv.cfg +5 -0
- pyprod-0.1.0/sample/s3files/Prodfile.py +50 -0
- pyprod-0.1.0/sample/s3files/S3TEST.txt +1 -0
- pyprod-0.1.0/src/pyprod/__init__.py +0 -0
- pyprod-0.1.0/src/pyprod/__main__.py +4 -0
- pyprod-0.1.0/src/pyprod/main.py +118 -0
- pyprod-0.1.0/src/pyprod/prod.py +532 -0
- pyprod-0.1.0/src/pyprod/utils.py +17 -0
- pyprod-0.1.0/src/pyprod/venv.py +47 -0
- pyprod-0.1.0/tests/__init__.py +0 -0
- pyprod-0.1.0/tests/conftest.py +3 -0
- pyprod-0.1.0/tests/test_prod.py +217 -0
- pyprod-0.1.0/tests/test_prodfuncs.py +49 -0
- pyprod-0.1.0/tests/test_rule.py +110 -0
- pyprod-0.1.0/uv.lock +723 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
name: Python application
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: ["main"]
|
6
|
+
pull_request:
|
7
|
+
branches: ["main"]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- name: Checkout repository
|
15
|
+
uses: actions/checkout@v4
|
16
|
+
|
17
|
+
- name: Install uv
|
18
|
+
uses: astral-sh/setup-uv@v5
|
19
|
+
|
20
|
+
- name: Run tests
|
21
|
+
run: |
|
22
|
+
uv run pytest tests
|
pyprod-0.1.0/.gitignore
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
2
|
+
__pycache__/
|
3
|
+
*.py[cod]
|
4
|
+
*$py.class
|
5
|
+
|
6
|
+
# C extensions
|
7
|
+
*.so
|
8
|
+
|
9
|
+
# Distribution / packaging
|
10
|
+
.Python
|
11
|
+
build/
|
12
|
+
develop-eggs/
|
13
|
+
dist/
|
14
|
+
downloads/
|
15
|
+
eggs/
|
16
|
+
.eggs/
|
17
|
+
lib/
|
18
|
+
lib64/
|
19
|
+
parts/
|
20
|
+
sdist/
|
21
|
+
var/
|
22
|
+
wheels/
|
23
|
+
share/python-wheels/
|
24
|
+
*.egg-info/
|
25
|
+
.installed.cfg
|
26
|
+
*.egg
|
27
|
+
MANIFEST
|
28
|
+
|
29
|
+
# PyInstaller
|
30
|
+
# Usually these files are written by a python script from a template
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32
|
+
*.manifest
|
33
|
+
*.spec
|
34
|
+
|
35
|
+
# Installer logs
|
36
|
+
pip-log.txt
|
37
|
+
pip-delete-this-directory.txt
|
38
|
+
|
39
|
+
# Unit test / coverage reports
|
40
|
+
htmlcov/
|
41
|
+
.tox/
|
42
|
+
.nox/
|
43
|
+
.coverage
|
44
|
+
.coverage.*
|
45
|
+
.cache
|
46
|
+
nosetests.xml
|
47
|
+
coverage.xml
|
48
|
+
*.cover
|
49
|
+
*.py,cover
|
50
|
+
.hypothesis/
|
51
|
+
.pytest_cache/
|
52
|
+
cover/
|
53
|
+
|
54
|
+
# Translations
|
55
|
+
*.mo
|
56
|
+
*.pot
|
57
|
+
|
58
|
+
# Django stuff:
|
59
|
+
*.log
|
60
|
+
local_settings.py
|
61
|
+
db.sqlite3
|
62
|
+
db.sqlite3-journal
|
63
|
+
|
64
|
+
# Flask stuff:
|
65
|
+
instance/
|
66
|
+
.webassets-cache
|
67
|
+
|
68
|
+
# Scrapy stuff:
|
69
|
+
.scrapy
|
70
|
+
|
71
|
+
# Sphinx documentation
|
72
|
+
docs/_build/
|
73
|
+
|
74
|
+
# PyBuilder
|
75
|
+
.pybuilder/
|
76
|
+
target/
|
77
|
+
|
78
|
+
# Jupyter Notebook
|
79
|
+
.ipynb_checkpoints
|
80
|
+
|
81
|
+
# IPython
|
82
|
+
profile_default/
|
83
|
+
ipython_config.py
|
84
|
+
|
85
|
+
# pyenv
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
88
|
+
# .python-version
|
89
|
+
|
90
|
+
# pipenv
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94
|
+
# install all needed dependencies.
|
95
|
+
#Pipfile.lock
|
96
|
+
|
97
|
+
# UV
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100
|
+
# commonly ignored for libraries.
|
101
|
+
#uv.lock
|
102
|
+
|
103
|
+
# poetry
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
106
|
+
# commonly ignored for libraries.
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
108
|
+
#poetry.lock
|
109
|
+
|
110
|
+
# pdm
|
111
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
112
|
+
#pdm.lock
|
113
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
114
|
+
# in version control.
|
115
|
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
116
|
+
.pdm.toml
|
117
|
+
.pdm-python
|
118
|
+
.pdm-build/
|
119
|
+
|
120
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
121
|
+
__pypackages__/
|
122
|
+
|
123
|
+
# Celery stuff
|
124
|
+
celerybeat-schedule
|
125
|
+
celerybeat.pid
|
126
|
+
|
127
|
+
# SageMath parsed files
|
128
|
+
*.sage.py
|
129
|
+
|
130
|
+
# Environments
|
131
|
+
.env
|
132
|
+
.venv
|
133
|
+
env/
|
134
|
+
venv/
|
135
|
+
ENV/
|
136
|
+
env.bak/
|
137
|
+
venv.bak/
|
138
|
+
|
139
|
+
# Spyder project settings
|
140
|
+
.spyderproject
|
141
|
+
.spyproject
|
142
|
+
|
143
|
+
# Rope project settings
|
144
|
+
.ropeproject
|
145
|
+
|
146
|
+
# mkdocs documentation
|
147
|
+
/site
|
148
|
+
|
149
|
+
# mypy
|
150
|
+
.mypy_cache/
|
151
|
+
.dmypy.json
|
152
|
+
dmypy.json
|
153
|
+
|
154
|
+
# Pyre type checker
|
155
|
+
.pyre/
|
156
|
+
|
157
|
+
# pytype static type analyzer
|
158
|
+
.pytype/
|
159
|
+
|
160
|
+
# Cython debug symbols
|
161
|
+
cython_debug/
|
162
|
+
|
163
|
+
# PyCharm
|
164
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
165
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
166
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
167
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
168
|
+
#.idea/
|
169
|
+
|
170
|
+
# PyPI configuration file
|
171
|
+
.pypirc
|
172
|
+
|
173
|
+
*.o
|
174
|
+
*.exe
|
@@ -0,0 +1 @@
|
|
1
|
+
3.13
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Read the Docs configuration file
|
2
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
3
|
+
|
4
|
+
# Required
|
5
|
+
version: 2
|
6
|
+
|
7
|
+
# Set the OS, Python version, and other tools you might need
|
8
|
+
build:
|
9
|
+
os: ubuntu-24.04
|
10
|
+
tools:
|
11
|
+
python: "3.13"
|
12
|
+
|
13
|
+
# Build documentation in the "docs/" directory with Sphinx
|
14
|
+
sphinx:
|
15
|
+
configuration: docs/conf.py
|
16
|
+
|
17
|
+
python:
|
18
|
+
install:
|
19
|
+
- requirements: docs/requirements.txt
|
20
|
+
|
@@ -0,0 +1,248 @@
|
|
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
|
+
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
223
|
+
|
224
|
+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
225
|
+
|
226
|
+
Write-Verbose "Setting prompt to '$Prompt'"
|
227
|
+
|
228
|
+
# Set the prompt to include the env name
|
229
|
+
# Make sure _OLD_VIRTUAL_PROMPT is global
|
230
|
+
function global:_OLD_VIRTUAL_PROMPT { "" }
|
231
|
+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
232
|
+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
233
|
+
|
234
|
+
function global:prompt {
|
235
|
+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
236
|
+
_OLD_VIRTUAL_PROMPT
|
237
|
+
}
|
238
|
+
}
|
239
|
+
|
240
|
+
# Clear PYTHONHOME
|
241
|
+
if (Test-Path -Path Env:PYTHONHOME) {
|
242
|
+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
243
|
+
Remove-Item -Path Env:PYTHONHOME
|
244
|
+
}
|
245
|
+
|
246
|
+
# Add the venv to the PATH
|
247
|
+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
248
|
+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
@@ -0,0 +1,75 @@
|
|
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
|
+
# on Windows, a path can contain colons and backslashes and has to be converted:
|
39
|
+
case "$(uname)" in
|
40
|
+
CYGWIN*|MSYS*)
|
41
|
+
# transform D:\path\to\venv to /d/path/to/venv on MSYS
|
42
|
+
# and to /cygdrive/d/path/to/venv on Cygwin
|
43
|
+
VIRTUAL_ENV=$(cygpath "/Users/ishimoto/src/pyprod/.xxx/.Prodfile.py.pyprod")
|
44
|
+
export VIRTUAL_ENV
|
45
|
+
;;
|
46
|
+
*)
|
47
|
+
# use the path as-is
|
48
|
+
export VIRTUAL_ENV="/Users/ishimoto/src/pyprod/.xxx/.Prodfile.py.pyprod"
|
49
|
+
;;
|
50
|
+
esac
|
51
|
+
|
52
|
+
_OLD_VIRTUAL_PATH="$PATH"
|
53
|
+
PATH="$VIRTUAL_ENV/bin:$PATH"
|
54
|
+
export PATH
|
55
|
+
|
56
|
+
VIRTUAL_ENV_PROMPT=".Prodfile.py.pyprod"
|
57
|
+
export VIRTUAL_ENV_PROMPT
|
58
|
+
|
59
|
+
# unset PYTHONHOME if set
|
60
|
+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
61
|
+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
62
|
+
if [ -n "${PYTHONHOME:-}" ] ; then
|
63
|
+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
64
|
+
unset PYTHONHOME
|
65
|
+
fi
|
66
|
+
|
67
|
+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
68
|
+
_OLD_VIRTUAL_PS1="${PS1:-}"
|
69
|
+
PS1="(.Prodfile.py.pyprod) ${PS1:-}"
|
70
|
+
export PS1
|
71
|
+
fi
|
72
|
+
|
73
|
+
# Call hash to forget past commands. Without forgetting
|
74
|
+
# past commands the $PATH changes we made may not be respected
|
75
|
+
hash -r 2> /dev/null
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# This file must be used with "source bin/activate.csh" *from csh*.
|
2
|
+
# You cannot run it directly.
|
3
|
+
|
4
|
+
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
5
|
+
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
|
6
|
+
|
7
|
+
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'
|
8
|
+
|
9
|
+
# Unset irrelevant variables.
|
10
|
+
deactivate nondestructive
|
11
|
+
|
12
|
+
setenv VIRTUAL_ENV "/Users/ishimoto/src/pyprod/.xxx/.Prodfile.py.pyprod"
|
13
|
+
|
14
|
+
set _OLD_VIRTUAL_PATH="$PATH"
|
15
|
+
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
|
16
|
+
setenv VIRTUAL_ENV_PROMPT ".Prodfile.py.pyprod"
|
17
|
+
|
18
|
+
|
19
|
+
set _OLD_VIRTUAL_PROMPT="$prompt"
|
20
|
+
|
21
|
+
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
|
22
|
+
set prompt = "(.Prodfile.py.pyprod) $prompt"
|
23
|
+
endif
|
24
|
+
|
25
|
+
alias pydoc python -m pydoc
|
26
|
+
|
27
|
+
rehash
|
@@ -0,0 +1,69 @@
|
|
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 "/Users/ishimoto/src/pyprod/.xxx/.Prodfile.py.pyprod"
|
37
|
+
|
38
|
+
set -gx _OLD_VIRTUAL_PATH $PATH
|
39
|
+
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
|
40
|
+
set -gx VIRTUAL_ENV_PROMPT ".Prodfile.py.pyprod"
|
41
|
+
|
42
|
+
# Unset PYTHONHOME if set.
|
43
|
+
if set -q PYTHONHOME
|
44
|
+
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
45
|
+
set -e PYTHONHOME
|
46
|
+
end
|
47
|
+
|
48
|
+
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
49
|
+
# fish uses a function instead of an env var to generate the prompt.
|
50
|
+
|
51
|
+
# Save the current fish_prompt function as the function _old_fish_prompt.
|
52
|
+
functions -c fish_prompt _old_fish_prompt
|
53
|
+
|
54
|
+
# With the original prompt function renamed, we can override with our own.
|
55
|
+
function fish_prompt
|
56
|
+
# Save the return status of the last command.
|
57
|
+
set -l old_status $status
|
58
|
+
|
59
|
+
# Output the venv prompt; color taken from the blue of the Python logo.
|
60
|
+
printf "%s(%s)%s " (set_color 4B8BBE) ".Prodfile.py.pyprod" (set_color normal)
|
61
|
+
|
62
|
+
# Restore the return status of the previous command.
|
63
|
+
echo "exit $old_status" | .
|
64
|
+
# Output the original/"old" prompt.
|
65
|
+
_old_fish_prompt
|
66
|
+
end
|
67
|
+
|
68
|
+
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
69
|
+
end
|