csspin-python 6.0.0__py3-none-any.whl → 6.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- csspin_python/pytest.py +2 -0
- csspin_python/pytest_schema.yaml +9 -3
- csspin_python/python.py +87 -23
- csspin_python/python_sbom.py +34 -7
- csspin_python/python_sbom_schema.yaml +3 -0
- csspin_python/python_schema.yaml +9 -2
- csspin_python/uv_provisioner.py +9 -1
- csspin_python/uv_provisioner_schema.yaml +7 -0
- {csspin_python-6.0.0.dist-info → csspin_python-6.1.0.dist-info}/METADATA +1 -1
- csspin_python-6.1.0.dist-info/RECORD +24 -0
- {csspin_python-6.0.0.dist-info → csspin_python-6.1.0.dist-info}/WHEEL +1 -1
- csspin_python-6.0.0.dist-info/RECORD +0 -24
- {csspin_python-6.0.0.dist-info → csspin_python-6.1.0.dist-info}/licenses/LICENSE +0 -0
- {csspin_python-6.0.0.dist-info → csspin_python-6.1.0.dist-info}/top_level.txt +0 -0
csspin_python/pytest.py
CHANGED
|
@@ -55,6 +55,8 @@ defaults = config(
|
|
|
55
55
|
|
|
56
56
|
def _install_playwright_browsers(cfg: ConfigTree) -> None:
|
|
57
57
|
"""Let playwright install the browsers"""
|
|
58
|
+
if cfg.pytest.playwright.mirror:
|
|
59
|
+
setenv(PLAYWRIGHT_DOWNLOAD_HOST=cfg.pytest.playwright.mirror)
|
|
58
60
|
sh(
|
|
59
61
|
f"playwright install {' '.join(cfg.pytest.playwright.browsers)}",
|
|
60
62
|
env={"PLAYWRIGHT_BROWSERS_PATH": cfg.pytest.playwright.browsers_path},
|
csspin_python/pytest_schema.yaml
CHANGED
|
@@ -28,7 +28,7 @@ pytest:
|
|
|
28
28
|
playwright:
|
|
29
29
|
type: object
|
|
30
30
|
help: |
|
|
31
|
-
Settings necessary to also run
|
|
31
|
+
Settings necessary to also run Playwright tests with the pytest
|
|
32
32
|
plugin.
|
|
33
33
|
properties:
|
|
34
34
|
enabled:
|
|
@@ -38,9 +38,15 @@ pytest:
|
|
|
38
38
|
initialized.
|
|
39
39
|
browsers_path:
|
|
40
40
|
type: path
|
|
41
|
-
help: Path for
|
|
41
|
+
help: Path for Playwright to install the browsers.
|
|
42
42
|
browsers:
|
|
43
43
|
type: list
|
|
44
44
|
help: |
|
|
45
45
|
The browsers to install and to use for running the
|
|
46
|
-
|
|
46
|
+
Playwright tests.
|
|
47
|
+
mirror:
|
|
48
|
+
type: str
|
|
49
|
+
help: |
|
|
50
|
+
Host to download the Playwright browsers from. The
|
|
51
|
+
mirror has to hold the files for the Playwright version
|
|
52
|
+
in use.
|
csspin_python/python.py
CHANGED
|
@@ -68,7 +68,9 @@ point to the base installation.
|
|
|
68
68
|
|
|
69
69
|
import abc
|
|
70
70
|
import configparser
|
|
71
|
+
import contextlib
|
|
71
72
|
import hashlib
|
|
73
|
+
import inspect
|
|
72
74
|
import json
|
|
73
75
|
import logging
|
|
74
76
|
import os
|
|
@@ -125,6 +127,9 @@ from csspin import (
|
|
|
125
127
|
)
|
|
126
128
|
from csspin.tree import ConfigTree
|
|
127
129
|
|
|
130
|
+
# csspin's plugin development guide, for warnings pointing to its sections
|
|
131
|
+
_PLUGIN_GUIDE_URL = "https://csspin.readthedocs.io/en/stable/howtoplugins.html"
|
|
132
|
+
|
|
128
133
|
defaults = config(
|
|
129
134
|
build_wheels=["{spin.project_root}"],
|
|
130
135
|
pyenv=config(
|
|
@@ -256,6 +261,8 @@ def pyenv_install(cfg: ConfigTree) -> None:
|
|
|
256
261
|
sh("git", "pull")
|
|
257
262
|
# we should set
|
|
258
263
|
setenv(PYTHON_BUILD_CACHE_PATH=mkdir(cfg.python.pyenv.cache))
|
|
264
|
+
if cfg.python.pyenv.mirror:
|
|
265
|
+
setenv(PYTHON_BUILD_MIRROR_URL=cfg.python.pyenv.mirror)
|
|
259
266
|
setenv(PYTHON_CFLAGS="-DOPENSSL_NO_COMP")
|
|
260
267
|
try:
|
|
261
268
|
sh(
|
|
@@ -293,6 +300,8 @@ def nuget_install(cfg: ConfigTree) -> None:
|
|
|
293
300
|
"-mpip",
|
|
294
301
|
None if cfg.verbosity > Verbosity.NORMAL else "-q",
|
|
295
302
|
"install",
|
|
303
|
+
f"--index-url={cfg.python.index_url}",
|
|
304
|
+
*[f"--extra-index-url={url}" for url in cfg.python.extra_index_urls],
|
|
296
305
|
"-U",
|
|
297
306
|
"pip",
|
|
298
307
|
"wheel",
|
|
@@ -414,14 +423,13 @@ def configure(cfg: ConfigTree) -> None:
|
|
|
414
423
|
if cfg.python.aws_auth.enabled:
|
|
415
424
|
_check_aws_token_validity(cfg)
|
|
416
425
|
|
|
417
|
-
# Provide spin's subprocess environment (see python_env). Registered here
|
|
418
|
-
# rather than in init so it is also available to the provision and
|
|
419
|
-
# finalize_provision hooks of plugins depending on this one.
|
|
420
|
-
cfg.spin.subprocess_environment = lambda: python_env(cfg)
|
|
421
|
-
|
|
422
426
|
|
|
423
427
|
def init(cfg: ConfigTree) -> None:
|
|
424
|
-
"""Initialize the python plugin
|
|
428
|
+
"""Initialize the python plugin and activate the virtual environment.
|
|
429
|
+
|
|
430
|
+
Runs before spin executes tasks, and during 'spin provision' as soon as the
|
|
431
|
+
virtual environment has been created (see venv_provision).
|
|
432
|
+
"""
|
|
425
433
|
if not cfg.python.use:
|
|
426
434
|
logging.debug("Checking for %s", cfg.python.interpreter)
|
|
427
435
|
if not exists(cfg.python.interpreter):
|
|
@@ -430,6 +438,36 @@ def init(cfg: ConfigTree) -> None:
|
|
|
430
438
|
" project. You might want to run spin with the 'provision'"
|
|
431
439
|
" task."
|
|
432
440
|
)
|
|
441
|
+
activate(cfg)
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def activate(cfg: ConfigTree) -> None:
|
|
445
|
+
"""Activate the virtual environment for the processes spin starts, like its
|
|
446
|
+
'activate' script does in a shell.
|
|
447
|
+
|
|
448
|
+
This only sets environment variables. It must never change spin's own
|
|
449
|
+
sys.path or sys.prefix (e.g. by executing 'activate_this.py'): plugin code
|
|
450
|
+
must not import from the project's virtual environment, which may use
|
|
451
|
+
another Python version (see "Outer and inner interpreter" in csspin's plugin
|
|
452
|
+
development guide).
|
|
453
|
+
"""
|
|
454
|
+
venv = str(cfg.python.venv)
|
|
455
|
+
if os.environ.get("VIRTUAL_ENV") == venv:
|
|
456
|
+
return
|
|
457
|
+
if not exists(cfg.python.scriptdir):
|
|
458
|
+
die(
|
|
459
|
+
f"{cfg.python.venv} does not exist. You may want to provision"
|
|
460
|
+
" it using 'spin provision'"
|
|
461
|
+
)
|
|
462
|
+
if sys.platform == "win32":
|
|
463
|
+
echo(f"{cfg.python.scriptdir}\\activate.ps1")
|
|
464
|
+
else:
|
|
465
|
+
echo(f". {cfg.python.scriptdir}/activate")
|
|
466
|
+
os.environ["PATH"] = os.pathsep.join(
|
|
467
|
+
(str(cfg.python.scriptdir), os.environ.get("PATH", ""))
|
|
468
|
+
)
|
|
469
|
+
os.environ["VIRTUAL_ENV"] = venv
|
|
470
|
+
os.environ.pop("PYTHONHOME", None)
|
|
433
471
|
|
|
434
472
|
|
|
435
473
|
def venv_init(cfg: ConfigTree) -> None:
|
|
@@ -450,25 +488,46 @@ def venv_init(cfg: ConfigTree) -> None:
|
|
|
450
488
|
)
|
|
451
489
|
|
|
452
490
|
|
|
491
|
+
def _caller_location() -> str:
|
|
492
|
+
"""Return 'file:line' of the innermost caller outside this module and
|
|
493
|
+
contextlib, i.e. the plugin code using one of our functions."""
|
|
494
|
+
skip = {os.path.normcase(__file__), os.path.normcase(contextlib.__file__)}
|
|
495
|
+
frame = inspect.currentframe()
|
|
496
|
+
try:
|
|
497
|
+
while frame is not None:
|
|
498
|
+
filename = frame.f_code.co_filename
|
|
499
|
+
if os.path.normcase(filename) not in skip:
|
|
500
|
+
return f"{filename}:{frame.f_lineno}"
|
|
501
|
+
frame = frame.f_back
|
|
502
|
+
return "<unknown>"
|
|
503
|
+
finally:
|
|
504
|
+
del frame
|
|
505
|
+
|
|
506
|
+
|
|
453
507
|
@contextmanager
|
|
454
508
|
def python_env(cfg: ConfigTree) -> Generator:
|
|
455
509
|
"""
|
|
456
|
-
Context manager
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
guide for the general concept.
|
|
510
|
+
Context manager activating the virtual environment *in spin's process*,
|
|
511
|
+
including its sys.path, and deactivating it once done.
|
|
512
|
+
|
|
513
|
+
.. deprecated::
|
|
514
|
+
Plugin code must not import from the project's virtual environment,
|
|
515
|
+
which may use another Python version than spin (see "Outer and inner
|
|
516
|
+
interpreter" in csspin's plugin development guide). The virtual
|
|
517
|
+
environment is activated for the processes spin starts by
|
|
518
|
+
:py:func:`activate` already. Make modules a plugin imports dependencies
|
|
519
|
+
of its plugin package, or run the tools from the virtual environment as
|
|
520
|
+
subprocesses. This function will be removed in a future release.
|
|
521
|
+
|
|
522
|
+
Saving and restoring ``os.environ``, ``sys.path`` and the ``sys`` prefix
|
|
523
|
+
attributes makes nesting safe.
|
|
471
524
|
"""
|
|
525
|
+
warn(
|
|
526
|
+
f"{_caller_location()} uses csspin_python.python.python_env(), which is"
|
|
527
|
+
" deprecated and will be removed: plugin code must not import from the"
|
|
528
|
+
" project's virtual environment."
|
|
529
|
+
f" See {_PLUGIN_GUIDE_URL}#outer-and-inner-interpreter."
|
|
530
|
+
)
|
|
472
531
|
if not exists(cfg.python.scriptdir / "activate_this.py"):
|
|
473
532
|
# The virtual environment has not been provisioned (yet); run the command
|
|
474
533
|
# in spin's in-process environment instead of activating.
|
|
@@ -891,12 +950,17 @@ class ProvisionerProtocol:
|
|
|
891
950
|
]
|
|
892
951
|
virtualenv = Command(*cmd)
|
|
893
952
|
# do not download seeds, since we update pip later anyway
|
|
894
|
-
# add the
|
|
953
|
+
# add the plugin packages to the PYTHONPATH so that virtualenv will be
|
|
954
|
+
# found; csspin versions without spin.plugin_site_packages install
|
|
955
|
+
# them into the plugins directory itself
|
|
956
|
+
plugin_site_packages = cfg.spin.get("plugin_site_packages") or (
|
|
957
|
+
cfg.spin.spin_dir / "plugins"
|
|
958
|
+
)
|
|
895
959
|
virtualenv(
|
|
896
960
|
"-p",
|
|
897
961
|
cfg.python.interpreter,
|
|
898
962
|
cfg.python.venv,
|
|
899
|
-
env={"PYTHONPATH":
|
|
963
|
+
env={"PYTHONPATH": plugin_site_packages},
|
|
900
964
|
)
|
|
901
965
|
|
|
902
966
|
def prerequisites(self: Self, cfg: ConfigTree) -> None:
|
csspin_python/python_sbom.py
CHANGED
|
@@ -42,12 +42,14 @@ from csspin import (
|
|
|
42
42
|
from csspin.tree import ConfigTree
|
|
43
43
|
from packaging.requirements import Requirement
|
|
44
44
|
from packaging.utils import canonicalize_name
|
|
45
|
+
from packaging.version import Version
|
|
45
46
|
from path import Path
|
|
46
47
|
|
|
47
48
|
defaults = config(
|
|
48
|
-
cyclonedx_bom_version="7.
|
|
49
|
+
cyclonedx_bom_version="7.5.0",
|
|
49
50
|
project_paths=["{spin.project_root}"],
|
|
50
51
|
repository_url="{python.index_url}",
|
|
52
|
+
spec_version="1.7",
|
|
51
53
|
requires=config(spin=["csspin_python.python"], python=["setuptools"]),
|
|
52
54
|
)
|
|
53
55
|
|
|
@@ -90,6 +92,7 @@ def sbom(cfg: ConfigTree) -> None:
|
|
|
90
92
|
cfg.python_sbom.repository_url,
|
|
91
93
|
file_name,
|
|
92
94
|
)
|
|
95
|
+
_mark_components_external(sbom_json)
|
|
93
96
|
_write_sbom(cfg, sbom_json, project_name)
|
|
94
97
|
|
|
95
98
|
|
|
@@ -130,7 +133,7 @@ def _ensure_cyclonedx_venv(cfg: ConfigTree, binary_dir: str, quiet: str | None)
|
|
|
130
133
|
)
|
|
131
134
|
rmtree(venv_cdx)
|
|
132
135
|
|
|
133
|
-
sh(cfg.python.interpreter, "-m", "venv", venv_cdx
|
|
136
|
+
sh(cfg.python.interpreter, "-m", "venv", venv_cdx)
|
|
134
137
|
sh(
|
|
135
138
|
interpreter_cdx,
|
|
136
139
|
"-m",
|
|
@@ -142,7 +145,6 @@ def _ensure_cyclonedx_venv(cfg: ConfigTree, binary_dir: str, quiet: str | None)
|
|
|
142
145
|
cfg.python.index_url,
|
|
143
146
|
*[f"--extra-index-url={url}" for url in cfg.python.extra_index_urls],
|
|
144
147
|
"cyclonedx-bom==" + requested_version,
|
|
145
|
-
use_subprocess_environment=False,
|
|
146
148
|
)
|
|
147
149
|
with memoizer(memo_file) as memo:
|
|
148
150
|
memo.add(memo_key)
|
|
@@ -161,7 +163,23 @@ def _run_cyclonedx(cfg: ConfigTree, third_party_deps: set[str], stderr: int) ->
|
|
|
161
163
|
with TemporaryDirectory() as tmp_dir:
|
|
162
164
|
venv = Path(tmp_dir) / "venv"
|
|
163
165
|
interpreter = venv / binary_dir / "python" + cfg.platform.exe
|
|
164
|
-
|
|
166
|
+
# Run --upgrade-deps and set PIP_CONSTRAINT to force pip and setuptools
|
|
167
|
+
# to have the version from the constraint files, if they are present.
|
|
168
|
+
# Necessary as python3.11 still has setuptools in the env created by
|
|
169
|
+
# venv. PIP_INDEX_URL and PIP_EXTRA_INDEX_URL point the upgrade at the
|
|
170
|
+
# configured indexes, because venv has no index option.
|
|
171
|
+
sh(
|
|
172
|
+
cfg.python.interpreter,
|
|
173
|
+
"-m",
|
|
174
|
+
"venv",
|
|
175
|
+
"--upgrade-deps",
|
|
176
|
+
venv,
|
|
177
|
+
env={
|
|
178
|
+
"PIP_CONSTRAINT": " ".join(cfg.python.constraints),
|
|
179
|
+
"PIP_INDEX_URL": cfg.python.index_url,
|
|
180
|
+
"PIP_EXTRA_INDEX_URL": " ".join(cfg.python.extra_index_urls),
|
|
181
|
+
},
|
|
182
|
+
)
|
|
165
183
|
if third_party_deps:
|
|
166
184
|
sh(
|
|
167
185
|
interpreter,
|
|
@@ -177,7 +195,6 @@ def _run_cyclonedx(cfg: ConfigTree, third_party_deps: set[str], stderr: int) ->
|
|
|
177
195
|
for constraint in cfg.python.constraints
|
|
178
196
|
],
|
|
179
197
|
*third_party_deps,
|
|
180
|
-
use_subprocess_environment=False,
|
|
181
198
|
stderr=stderr,
|
|
182
199
|
)
|
|
183
200
|
sh(
|
|
@@ -188,15 +205,15 @@ def _run_cyclonedx(cfg: ConfigTree, third_party_deps: set[str], stderr: int) ->
|
|
|
188
205
|
"uninstall",
|
|
189
206
|
"-y",
|
|
190
207
|
"pip",
|
|
191
|
-
use_subprocess_environment=False,
|
|
192
208
|
)
|
|
193
209
|
return backtick( # type: ignore[no-any-return]
|
|
194
210
|
interpreter_cdx,
|
|
195
211
|
"-m",
|
|
196
212
|
"cyclonedx_py",
|
|
197
213
|
"environment",
|
|
214
|
+
"--spec-version",
|
|
215
|
+
cfg.python_sbom.spec_version,
|
|
198
216
|
venv,
|
|
199
|
-
use_subprocess_environment=False,
|
|
200
217
|
stderr=stderr,
|
|
201
218
|
)
|
|
202
219
|
|
|
@@ -364,6 +381,16 @@ def _enrich_sbom(
|
|
|
364
381
|
sbom_json["dependencies"] = dependencies
|
|
365
382
|
|
|
366
383
|
|
|
384
|
+
def _mark_components_external(sbom_json: dict) -> None:
|
|
385
|
+
"""
|
|
386
|
+
Flag the third-party components as external, for CycloneDX 1.7 and newer.
|
|
387
|
+
"""
|
|
388
|
+
if Version(sbom_json["specVersion"]) < Version("1.7"):
|
|
389
|
+
return
|
|
390
|
+
for component in sbom_json.get("components", []):
|
|
391
|
+
component["isExternal"] = True
|
|
392
|
+
|
|
393
|
+
|
|
367
394
|
def _collect_thirdparty_deps(requires_dist: list, python_version: str) -> set[str]:
|
|
368
395
|
"""Extract 'thirdparty' dependency specifiers from project metadata."""
|
|
369
396
|
|
csspin_python/python_schema.yaml
CHANGED
|
@@ -19,6 +19,12 @@ python:
|
|
|
19
19
|
cache:
|
|
20
20
|
type: path
|
|
21
21
|
help: Path to cache the Python sources downloaded by pyenv
|
|
22
|
+
mirror:
|
|
23
|
+
type: str
|
|
24
|
+
help: |
|
|
25
|
+
Base URL of a mirror for the Python sources downloaded
|
|
26
|
+
by pyenv. Ignored on Windows and when 'python.use' or
|
|
27
|
+
'python.user_pyenv' is set.
|
|
22
28
|
python_build:
|
|
23
29
|
type: path
|
|
24
30
|
help: Path to the python-build builtin plugin of pyenv
|
|
@@ -114,8 +120,9 @@ python:
|
|
|
114
120
|
type: str
|
|
115
121
|
help: |
|
|
116
122
|
The index url from where packages should get installed into the
|
|
117
|
-
|
|
118
|
-
|
|
123
|
+
project's subprocess environment (i.e., 'python.venv'). This
|
|
124
|
+
value will also be put into 'python.pipconf', if not already
|
|
125
|
+
mentioned there.
|
|
119
126
|
extra_index_urls:
|
|
120
127
|
type: list
|
|
121
128
|
help: |
|
csspin_python/uv_provisioner.py
CHANGED
|
@@ -145,6 +145,11 @@ class SimpleUvProvisioner(SimpleProvisioner):
|
|
|
145
145
|
cfg.python.version,
|
|
146
146
|
"--no-bin",
|
|
147
147
|
"--no-registry",
|
|
148
|
+
(
|
|
149
|
+
f"--mirror={cfg.uv_provisioner.python_mirror}"
|
|
150
|
+
if cfg.uv_provisioner.python_mirror
|
|
151
|
+
else None
|
|
152
|
+
),
|
|
148
153
|
)
|
|
149
154
|
cfg.python.interpreter = _get_uv_python(cfg)
|
|
150
155
|
info(f"Using '{cfg.python.interpreter}' as interpreter")
|
|
@@ -158,7 +163,10 @@ class SimpleUvProvisioner(SimpleProvisioner):
|
|
|
158
163
|
)
|
|
159
164
|
|
|
160
165
|
def prerequisites(self, cfg: ConfigTree) -> None:
|
|
161
|
-
|
|
166
|
+
# venv_provision runs the venv_hook only after the prerequisites, but
|
|
167
|
+
# installing pip already needs the uv.toml.
|
|
168
|
+
_configure_uv_toml(cfg)
|
|
169
|
+
self._install_command(f"--config-file={cfg.uv_provisioner.uv_toml_path}", "pip")
|
|
162
170
|
|
|
163
171
|
|
|
164
172
|
def _set_extra_index_url(toml_content: dict, extra_index_urls: list[str]) -> None:
|
|
@@ -22,3 +22,10 @@ uv_provisioner:
|
|
|
22
22
|
uv_toml:
|
|
23
23
|
type: str
|
|
24
24
|
help: Content for uv's config file
|
|
25
|
+
python_mirror:
|
|
26
|
+
type: str
|
|
27
|
+
help: |
|
|
28
|
+
Passed to 'uv python install' as '--mirror' when uv provisions
|
|
29
|
+
the Python interpreter. The mirror has to hold the files for
|
|
30
|
+
the uv version in use. Ignored when 'python.use' is set.
|
|
31
|
+
default: ''
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csspin-python
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.1.0
|
|
4
4
|
Summary: Plugin-package for csspin providing Python related plugins
|
|
5
5
|
Author-email: CONTACT Software GmbH <info@contact-software.com>
|
|
6
6
|
Maintainer-email: Waleri Enns <waleri.enns@contact-software.com>, Benjamin Thomas Schwertfeger <benjaminthomas.schwertfeger@contact-software.com>, Fabian Hafer <fabian.hafer@contact-software.com>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
csspin_python/_predict_wheel_filename.py,sha256=sz09QpDOPQesG-QAANjH607QSkS3PFo0qxPifG1y85o,2399
|
|
2
|
+
csspin_python/behave.py,sha256=iJZeyIqB7V_NzTdLTZldNY9W_GGwCWkXe6WY69wpDqs,4997
|
|
3
|
+
csspin_python/behave_schema.yaml,sha256=8qoOCK-uTmwgRRW29urgK0X_kgn0zO0X34v89bvii2w,1241
|
|
4
|
+
csspin_python/debugpy.py,sha256=v0ZZopv5TNoSaFf2kiePsw9OmhBpjfOBFh0u71jTcnQ,962
|
|
5
|
+
csspin_python/debugpy_schema.yaml,sha256=BeH30nSirDYctkdhS9xMXUG5htj3PED_ZjmxPG5WRUc,364
|
|
6
|
+
csspin_python/devpi.py,sha256=o7O06Dw-xt47y-M74TShcl9MUMaW78aFmw6i6ISYwoU,2351
|
|
7
|
+
csspin_python/devpi_schema.yaml,sha256=2gPATWjVcfvCTrGZX2FK6wH8hh9KS0XzZ35JvZeJGEU,487
|
|
8
|
+
csspin_python/playwright.py,sha256=oFfphLqa4AB6K9vasCUFHN0kFXu63n3ocrsqVuRp4-0,5102
|
|
9
|
+
csspin_python/playwright_schema.yaml,sha256=TSeR16YHa7m7bfO59F2eMV-jXcglluTJdEpUeL16saY,1178
|
|
10
|
+
csspin_python/pytest.py,sha256=wnQLHz5kmZKwv0acPt3d3gx91xVxI2qHCOOivl1Oq-Y,4651
|
|
11
|
+
csspin_python/pytest_schema.yaml,sha256=YsJ_O6wjaZARhfx0AU-Ska55qNpfkHtShrKUxgh3UiI,1804
|
|
12
|
+
csspin_python/python.py,sha256=XDl2c5dyu0IU8qAoRAvBRVPFMgb6RVjnuGCyTpJlf5E,44456
|
|
13
|
+
csspin_python/python_sbom.py,sha256=_DyH3dd9jdBxdP74RFb2L5hNPjNLWnRvFlotL4DFUqA,14550
|
|
14
|
+
csspin_python/python_sbom_schema.yaml,sha256=kxz5TJdUmUkDwG6ZD9ORi7xj-yF_BjeMhjmsj6labgM,856
|
|
15
|
+
csspin_python/python_schema.yaml,sha256=jAo2pX5ZqyUol-rn0x4ctIJAVU-Ni1jnn44TJmZVe_0,6803
|
|
16
|
+
csspin_python/radon.py,sha256=uFqm6FEi5oWj-_XVaAm3s9cam0cUmr1_FwRf40K6xWs,1876
|
|
17
|
+
csspin_python/radon_schema.yaml,sha256=rlRzXw5z4XbjOVznRiUxWGP4E9hx1Jm-gGw1iQiYzE0,548
|
|
18
|
+
csspin_python/uv_provisioner.py,sha256=jMdhoJDnpxALXliHNIDdrYFXOxlLJY1YMsssJlVhR_0,7132
|
|
19
|
+
csspin_python/uv_provisioner_schema.yaml,sha256=uvrkC1Ct4NDMzGSpwC2fmX_6MvoQtk59hIeRtAmcsKg,1045
|
|
20
|
+
csspin_python-6.1.0.dist-info/licenses/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
|
|
21
|
+
csspin_python-6.1.0.dist-info/METADATA,sha256=JweD4VDTWLzmH4iHtr2WwSmQvvYoqPF9b_raU1K1_60,5254
|
|
22
|
+
csspin_python-6.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
|
|
23
|
+
csspin_python-6.1.0.dist-info/top_level.txt,sha256=QSeglMEGbFu1z4L6MCQYwo01NgL0KojWvC4rzgMQ8gU,14
|
|
24
|
+
csspin_python-6.1.0.dist-info/RECORD,,
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
csspin_python/_predict_wheel_filename.py,sha256=sz09QpDOPQesG-QAANjH607QSkS3PFo0qxPifG1y85o,2399
|
|
2
|
-
csspin_python/behave.py,sha256=iJZeyIqB7V_NzTdLTZldNY9W_GGwCWkXe6WY69wpDqs,4997
|
|
3
|
-
csspin_python/behave_schema.yaml,sha256=8qoOCK-uTmwgRRW29urgK0X_kgn0zO0X34v89bvii2w,1241
|
|
4
|
-
csspin_python/debugpy.py,sha256=v0ZZopv5TNoSaFf2kiePsw9OmhBpjfOBFh0u71jTcnQ,962
|
|
5
|
-
csspin_python/debugpy_schema.yaml,sha256=BeH30nSirDYctkdhS9xMXUG5htj3PED_ZjmxPG5WRUc,364
|
|
6
|
-
csspin_python/devpi.py,sha256=o7O06Dw-xt47y-M74TShcl9MUMaW78aFmw6i6ISYwoU,2351
|
|
7
|
-
csspin_python/devpi_schema.yaml,sha256=2gPATWjVcfvCTrGZX2FK6wH8hh9KS0XzZ35JvZeJGEU,487
|
|
8
|
-
csspin_python/playwright.py,sha256=oFfphLqa4AB6K9vasCUFHN0kFXu63n3ocrsqVuRp4-0,5102
|
|
9
|
-
csspin_python/playwright_schema.yaml,sha256=TSeR16YHa7m7bfO59F2eMV-jXcglluTJdEpUeL16saY,1178
|
|
10
|
-
csspin_python/pytest.py,sha256=vSLtmS-kNO0NPo_tszfEm5zGwJb6Yb5IGS-hA7CNguo,4544
|
|
11
|
-
csspin_python/pytest_schema.yaml,sha256=tzXtdF6MvGC9v59EVRJFfLeMMHqPsXcFXy2zJtRECBI,1535
|
|
12
|
-
csspin_python/python.py,sha256=uoWCm_X2_yGaOdnxAb_h2Mr8RjLd5MjuVL4cPF15E2E,41973
|
|
13
|
-
csspin_python/python_sbom.py,sha256=AT_dFEKoghZTVkkTECz0cOo-w3AZAYAgROx4prhAHKw,13603
|
|
14
|
-
csspin_python/python_sbom_schema.yaml,sha256=QysysjGJ6n1WEoLBqYHcdbojuEomUvL8QG4ZSWQW2_8,739
|
|
15
|
-
csspin_python/python_schema.yaml,sha256=RwJgbyIRenj18-s60HmqkwWCGtd6G1acpJ9TDI9QjBQ,6448
|
|
16
|
-
csspin_python/radon.py,sha256=uFqm6FEi5oWj-_XVaAm3s9cam0cUmr1_FwRf40K6xWs,1876
|
|
17
|
-
csspin_python/radon_schema.yaml,sha256=rlRzXw5z4XbjOVznRiUxWGP4E9hx1Jm-gGw1iQiYzE0,548
|
|
18
|
-
csspin_python/uv_provisioner.py,sha256=2M1I8PqWTCUxqaOeJI5rchmly6t-MnOPQfIx-kKzdQU,6757
|
|
19
|
-
csspin_python/uv_provisioner_schema.yaml,sha256=Y8ZNC2OMnhR8Us3WUXAXK9hMjqGWAKFJB2puX4X5XNQ,727
|
|
20
|
-
csspin_python-6.0.0.dist-info/licenses/LICENSE,sha256=4MAecetnRTQw5DlHtiikDSzKWO1xVLwzM5_DsPMYlnE,10172
|
|
21
|
-
csspin_python-6.0.0.dist-info/METADATA,sha256=a-NIDfoER1W6_3YNyaxS_RKPKLXmWp6tk-uApcS6Lr4,5254
|
|
22
|
-
csspin_python-6.0.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
23
|
-
csspin_python-6.0.0.dist-info/top_level.txt,sha256=QSeglMEGbFu1z4L6MCQYwo01NgL0KojWvC4rzgMQ8gU,14
|
|
24
|
-
csspin_python-6.0.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|