calkit-python 0.41.21__py3-none-any.whl → 0.41.22__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.
- calkit/cli/main/core.py +53 -6
- calkit/tests/cli/main/test_core.py +79 -0
- {calkit_python-0.41.21.dist-info → calkit_python-0.41.22.dist-info}/METADATA +1 -1
- {calkit_python-0.41.21.dist-info → calkit_python-0.41.22.dist-info}/RECORD +21 -21
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/etc/jupyter/jupyter_server_config.d/calkit.json +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/package.json +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/style.js +0 -0
- {calkit_python-0.41.21.data → calkit_python-0.41.22.data}/data/share/jupyter/labextensions/calkit/static/third-party-licenses.json +0 -0
- {calkit_python-0.41.21.dist-info → calkit_python-0.41.22.dist-info}/WHEEL +0 -0
- {calkit_python-0.41.21.dist-info → calkit_python-0.41.22.dist-info}/entry_points.txt +0 -0
- {calkit_python-0.41.21.dist-info → calkit_python-0.41.22.dist-info}/licenses/LICENSE +0 -0
calkit/cli/main/core.py
CHANGED
|
@@ -1419,6 +1419,39 @@ def _stage_run_info_from_log_content(log_content: str) -> dict:
|
|
|
1419
1419
|
return res
|
|
1420
1420
|
|
|
1421
1421
|
|
|
1422
|
+
def _run_dvc_repro(argv: list[str]) -> int | None:
|
|
1423
|
+
"""Run ``dvc repro`` via the DVC CLI, tolerating teardown failures.
|
|
1424
|
+
|
|
1425
|
+
Returns DVC's exit code, or ``None`` if the command ran but DVC's
|
|
1426
|
+
post-command teardown failed to import a module. After ``do_run`` finishes,
|
|
1427
|
+
``dvc.cli.main`` reports anonymous analytics and cleans up cached repos,
|
|
1428
|
+
importing ``dvc.daemon`` and ``dvc.repo.open_repo`` only at that point. In
|
|
1429
|
+
some broken or mixed installs those submodules can't be imported, so the
|
|
1430
|
+
teardown raises a ``ModuleNotFoundError`` that escapes DVC entirely and
|
|
1431
|
+
crashes the run with a confusing traceback once the pipeline has already
|
|
1432
|
+
finished (see issue #1018). That doesn't affect the pipeline result, so
|
|
1433
|
+
swallow it and signal ``None`` so the caller derives success/failure from
|
|
1434
|
+
the run log instead of a lost exit code.
|
|
1435
|
+
|
|
1436
|
+
Only those two modules are tolerated, and deliberately so. ``dvc.cli.main``
|
|
1437
|
+
runs the command inside a broad ``except Exception`` that turns any failure
|
|
1438
|
+
into an exit code, so nothing from the command itself reaches here; but it
|
|
1439
|
+
also imports ``dvc._debug``/``dvc.config``/``dvc.logger`` *before* that
|
|
1440
|
+
block, and a broken install can fail there too. Swallowing those would leave
|
|
1441
|
+
an empty run log and report a pipeline that never ran as successful, so
|
|
1442
|
+
anything but a teardown module must propagate and fail loudly.
|
|
1443
|
+
"""
|
|
1444
|
+
from dvc.cli import main as dvc_cli_main
|
|
1445
|
+
|
|
1446
|
+
try:
|
|
1447
|
+
return int(dvc_cli_main(argv))
|
|
1448
|
+
except ModuleNotFoundError as e:
|
|
1449
|
+
if e.name not in ("dvc.daemon", "dvc.repo.open_repo"):
|
|
1450
|
+
raise
|
|
1451
|
+
warn(f"DVC post-run teardown failed and was ignored ({e})")
|
|
1452
|
+
return None
|
|
1453
|
+
|
|
1454
|
+
|
|
1422
1455
|
def _prune_run_logs(
|
|
1423
1456
|
logs_dir: str, keep: int = 10, protect: str | None = None
|
|
1424
1457
|
) -> None:
|
|
@@ -1828,7 +1861,6 @@ def run(
|
|
|
1828
1861
|
import dvc.repo
|
|
1829
1862
|
import dvc.repo.reproduce
|
|
1830
1863
|
import dvc.ui
|
|
1831
|
-
from dvc.cli import main as dvc_cli_main
|
|
1832
1864
|
from git.exc import InvalidGitRepositoryError
|
|
1833
1865
|
|
|
1834
1866
|
import calkit.dvc.zip
|
|
@@ -2080,13 +2112,21 @@ def run(
|
|
|
2080
2112
|
with calkit.dvc.dvc_lock_timeout(
|
|
2081
2113
|
calkit.dvc.DEFAULT_RUN_LOCK_TIMEOUT
|
|
2082
2114
|
):
|
|
2083
|
-
sp_res =
|
|
2115
|
+
sp_res = _run_dvc_repro(["repro"] + sp_args)
|
|
2084
2116
|
finally:
|
|
2085
2117
|
os.chdir(original_dir)
|
|
2086
|
-
|
|
2118
|
+
# ``None`` means the stage ran but DVC's teardown failed; treat that
|
|
2119
|
+
# as success since the exit code is unrecoverable here.
|
|
2120
|
+
if sp_res is not None and sp_res != 0:
|
|
2087
2121
|
failed = True
|
|
2088
2122
|
if not args or all(a.startswith("--") for a in args):
|
|
2089
|
-
# Only isolated subproject stage targets were given; skip parent
|
|
2123
|
+
# Only isolated subproject stage targets were given; skip the parent
|
|
2124
|
+
# run, but still report failure the way the parent path does below,
|
|
2125
|
+
# else a failing subproject stage would exit zero.
|
|
2126
|
+
os.environ.pop("CALKIT_PIPELINE_RUNNING", None)
|
|
2127
|
+
if failed:
|
|
2128
|
+
raise_error("Pipeline failed")
|
|
2129
|
+
calkit.echo("Pipeline completed successfully ✅")
|
|
2090
2130
|
return {}
|
|
2091
2131
|
if pipeline is not None:
|
|
2092
2132
|
args += ["--pipeline", pipeline]
|
|
@@ -2157,14 +2197,21 @@ def run(
|
|
|
2157
2197
|
# the instant it finishes) can all hold it momentarily. Without this,
|
|
2158
2198
|
# such a collision aborts the whole run with "Unable to acquire lock".
|
|
2159
2199
|
with calkit.dvc.dvc_lock_timeout(calkit.dvc.DEFAULT_RUN_LOCK_TIMEOUT):
|
|
2160
|
-
res =
|
|
2200
|
+
res = _run_dvc_repro(["repro"] + args)
|
|
2161
2201
|
finally:
|
|
2162
2202
|
os.environ.pop("CALKIT_FORCE", None)
|
|
2163
|
-
failed = failed or res != 0
|
|
2164
2203
|
# Parse log to get timing and which stages ran
|
|
2165
2204
|
with open(log_fpath, "r") as f:
|
|
2166
2205
|
log_content = f.read()
|
|
2167
2206
|
stage_run_info = _stage_run_info_from_log_content(log_content)
|
|
2207
|
+
if res is None:
|
|
2208
|
+
# DVC's exit code was lost to a teardown failure; fall back to the log,
|
|
2209
|
+
# which records any stage that failed to reproduce.
|
|
2210
|
+
failed = failed or any(
|
|
2211
|
+
info.get("status") == "failed" for info in stage_run_info.values()
|
|
2212
|
+
)
|
|
2213
|
+
else:
|
|
2214
|
+
failed = failed or res != 0
|
|
2168
2215
|
# Zip dvc-zip outputs for stages that actually ran
|
|
2169
2216
|
if stage_run_info:
|
|
2170
2217
|
from calkit.models.io import PathOutput
|
|
@@ -8,6 +8,7 @@ import sys
|
|
|
8
8
|
from datetime import datetime
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from pprint import pprint
|
|
11
|
+
from unittest.mock import Mock
|
|
11
12
|
|
|
12
13
|
import dvc.repo
|
|
13
14
|
import git
|
|
@@ -22,6 +23,7 @@ from calkit.cli.core import complete_stage_names
|
|
|
22
23
|
from calkit.cli.main.core import (
|
|
23
24
|
_get_running_pipeline_status,
|
|
24
25
|
_prune_run_logs,
|
|
26
|
+
_run_dvc_repro,
|
|
25
27
|
_stage_run_info_from_log_content,
|
|
26
28
|
_stage_target_from_cmd,
|
|
27
29
|
_to_shell_cmd,
|
|
@@ -915,6 +917,83 @@ def test_run(tmp_dir):
|
|
|
915
917
|
assert "stage_run_info" in res
|
|
916
918
|
|
|
917
919
|
|
|
920
|
+
def test_run_dvc_repro_tolerates_teardown_failure(monkeypatch, capsys):
|
|
921
|
+
import dvc.cli
|
|
922
|
+
|
|
923
|
+
# Normal invocation returns DVC's exit code unchanged
|
|
924
|
+
monkeypatch.setattr(dvc.cli, "main", Mock(return_value=7))
|
|
925
|
+
assert _run_dvc_repro(["repro", "my-stage"]) == 7
|
|
926
|
+
# DVC lazily imports ``dvc.daemon`` and ``dvc.repo.open_repo`` for
|
|
927
|
+
# analytics/cleanup only after the command has already run. On a broken
|
|
928
|
+
# install those imports fail (issue #1018), crashing the run once the
|
|
929
|
+
# pipeline has finished, so tolerate them and report ``None`` instead.
|
|
930
|
+
for missing in ["dvc.daemon", "dvc.repo.open_repo"]:
|
|
931
|
+
monkeypatch.setattr(
|
|
932
|
+
dvc.cli,
|
|
933
|
+
"main",
|
|
934
|
+
Mock(
|
|
935
|
+
side_effect=ModuleNotFoundError(
|
|
936
|
+
f"No module named {missing!r}", name=missing
|
|
937
|
+
)
|
|
938
|
+
),
|
|
939
|
+
)
|
|
940
|
+
assert _run_dvc_repro(["repro"]) is None
|
|
941
|
+
assert "teardown failed" in capsys.readouterr().out
|
|
942
|
+
# A module DVC imports *before* running the command (dvc._debug, dvc.config,
|
|
943
|
+
# dvc.logger) failing means the pipeline never ran at all. Swallowing that
|
|
944
|
+
# would leave an empty log and report success, so it must propagate.
|
|
945
|
+
monkeypatch.setattr(
|
|
946
|
+
dvc.cli,
|
|
947
|
+
"main",
|
|
948
|
+
Mock(
|
|
949
|
+
side_effect=ModuleNotFoundError(
|
|
950
|
+
"No module named 'dvc._debug'", name="dvc._debug"
|
|
951
|
+
)
|
|
952
|
+
),
|
|
953
|
+
)
|
|
954
|
+
with pytest.raises(ModuleNotFoundError, match="dvc._debug"):
|
|
955
|
+
_run_dvc_repro(["repro"])
|
|
956
|
+
# Non-import errors are unexpected too -- DVC turns real command failures
|
|
957
|
+
# into an exit code -- so they must propagate rather than be masked.
|
|
958
|
+
monkeypatch.setattr(
|
|
959
|
+
dvc.cli, "main", Mock(side_effect=RuntimeError("boom"))
|
|
960
|
+
)
|
|
961
|
+
with pytest.raises(RuntimeError, match="boom"):
|
|
962
|
+
_run_dvc_repro(["repro"])
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def test_run_isolated_subproject_stage_exit_code(tmp_dir):
|
|
966
|
+
subprocess.check_call(["calkit", "init"])
|
|
967
|
+
# An isolated subproject is its own Git/DVC repo, so its stage targets run
|
|
968
|
+
# directly inside it rather than through the parent pipeline
|
|
969
|
+
os.makedirs("isolated-sp", exist_ok=True)
|
|
970
|
+
subprocess.check_call(["git", "init"], cwd="isolated-sp")
|
|
971
|
+
subprocess.check_call(["calkit", "init"], cwd="isolated-sp")
|
|
972
|
+
ck_info = calkit.load_calkit_info()
|
|
973
|
+
ck_info["subprojects"] = [{"path": "isolated-sp"}]
|
|
974
|
+
with open("calkit.yaml", "w") as f:
|
|
975
|
+
calkit.ryaml.dump(ck_info, f)
|
|
976
|
+
# A failing subproject stage must exit nonzero; the isolated-target path
|
|
977
|
+
# returns before the parent pipeline runs, and used to skip raising
|
|
978
|
+
with open("isolated-sp/dvc.yaml", "w") as f:
|
|
979
|
+
yaml.dump(
|
|
980
|
+
{
|
|
981
|
+
"stages": {
|
|
982
|
+
"stage-b": {"cmd": 'python -c "import sys; sys.exit(1)"'}
|
|
983
|
+
}
|
|
984
|
+
},
|
|
985
|
+
f,
|
|
986
|
+
)
|
|
987
|
+
result = subprocess.run(["calkit", "run", "isolated-sp:stage-b"])
|
|
988
|
+
assert result.returncode != 0
|
|
989
|
+
# A passing one still exits zero
|
|
990
|
+
with open("isolated-sp/dvc.yaml", "w") as f:
|
|
991
|
+
yaml.dump(
|
|
992
|
+
{"stages": {"stage-b": {"cmd": "python -c \"print('ok')\""}}}, f
|
|
993
|
+
)
|
|
994
|
+
subprocess.check_call(["calkit", "run", "isolated-sp:stage-b"])
|
|
995
|
+
|
|
996
|
+
|
|
918
997
|
def test_run_ignore_errors(tmp_dir):
|
|
919
998
|
subprocess.check_call(["calkit", "init"])
|
|
920
999
|
# Create a pipeline with a failing stage and an independent stage
|
|
@@ -47,7 +47,7 @@ calkit/cli/overleaf.py,sha256=xgcONFdyItlUHUfSD_iF-bhjddKO_-ObtHz_Khiz-xE,25384
|
|
|
47
47
|
calkit/cli/scheduler.py,sha256=OWJpW57G6Ebs5FTZ_nf2PpEG9QNd6WPe0mb3TmbVTyE,42402
|
|
48
48
|
calkit/cli/update.py,sha256=5Jjo-5uRTxd5UWHvOETPYFWtJJRr81qmKmsibthkLPk,43501
|
|
49
49
|
calkit/cli/main/__init__.py,sha256=qu1POZPyqs33ZKfasOxv_Wc-EzVcEgK3Dt_vwFL8Bi8,65
|
|
50
|
-
calkit/cli/main/core.py,sha256=
|
|
50
|
+
calkit/cli/main/core.py,sha256=OE2HrKSiY9BoxSz14h8_l0pbopvpe-QaljMJbebATcM,127668
|
|
51
51
|
calkit/cli/main/xr.py,sha256=Bug5qJuiIq0tusmdu30t-ZdyaT_Sy5RwPSTiHvCtIqE,25600
|
|
52
52
|
calkit/dvc/__init__.py,sha256=-B6tilCb_jw7QFmJ2srILez24wDhNKUzIBhZUMt01dE,381
|
|
53
53
|
calkit/dvc/core.py,sha256=p42i_uCzgZD6ClGnLOn88zaiGTwrdSG09quL8Hb8Aas,30908
|
|
@@ -106,7 +106,7 @@ calkit/tests/cli/test_overleaf.py,sha256=tgGCuOpic0owtOPD_CtZDnffPkknC_73CSDpOT9
|
|
|
106
106
|
calkit/tests/cli/test_scheduler.py,sha256=mE0KLwcb9gozOnylTLsaL_xYGAptlD9hB8ZiKpPhmcc,17934
|
|
107
107
|
calkit/tests/cli/test_update.py,sha256=bwRF0kpqbCVxNvGH777LHFX3oUP2DyN3XXUBDCEKNoc,6356
|
|
108
108
|
calkit/tests/cli/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
109
|
-
calkit/tests/cli/main/test_core.py,sha256=
|
|
109
|
+
calkit/tests/cli/main/test_core.py,sha256=_AX3xSmovVAL1lXB4NAPICZMl_kkmZKg-mMAzs5B0Ns,72681
|
|
110
110
|
calkit/tests/cli/main/test_lock.py,sha256=1iX8iSbGtr4O9OkaAi4d3gP3_QzNl6Rr6HLtbEpS6iU,9847
|
|
111
111
|
calkit/tests/cli/main/test_subprojects.py,sha256=ZR2ZQvZ4XZOi-iW8nlZEYu_2CUyUWoc0MABmnFrF9DQ,12730
|
|
112
112
|
calkit/tests/cli/main/test_xr.py,sha256=shk8LHS33bZpr_iAW5eA5sMD3nQDKm8fIwXlE6dA2uI,22527
|
|
@@ -123,22 +123,22 @@ calkit/tests/models/test_pipeline.py,sha256=9F0g6ij7vc8c2hIRIVTHpT0I-JHXC6i2NRB2
|
|
|
123
123
|
calkit/agent_skills/add-pipeline-stage/SKILL.md,sha256=kpYYb-rJsS4B9p1Ub3gL21irCG5ZZ4DvWZpdJeEwPZk,3772
|
|
124
124
|
calkit/agent_skills/conventions/SKILL.md,sha256=nAM2FjSMk6ED56Dr5zh2bL_dhfzDra-h2ZgzHU7ruS4,9524
|
|
125
125
|
calkit/agent_skills/create-pipeline/SKILL.md,sha256=2FGw1iDQVRk5FUq79GP3lPdgvgof2Wi1O9O-abGGtgs,5422
|
|
126
|
-
calkit_python-0.41.
|
|
127
|
-
calkit_python-0.41.
|
|
128
|
-
calkit_python-0.41.
|
|
129
|
-
calkit_python-0.41.
|
|
130
|
-
calkit_python-0.41.
|
|
131
|
-
calkit_python-0.41.
|
|
132
|
-
calkit_python-0.41.
|
|
133
|
-
calkit_python-0.41.
|
|
134
|
-
calkit_python-0.41.
|
|
135
|
-
calkit_python-0.41.
|
|
136
|
-
calkit_python-0.41.
|
|
137
|
-
calkit_python-0.41.
|
|
138
|
-
calkit_python-0.41.
|
|
139
|
-
calkit_python-0.41.
|
|
140
|
-
calkit_python-0.41.
|
|
141
|
-
calkit_python-0.41.
|
|
142
|
-
calkit_python-0.41.
|
|
143
|
-
calkit_python-0.41.
|
|
144
|
-
calkit_python-0.41.
|
|
126
|
+
calkit_python-0.41.22.data/data/etc/jupyter/jupyter_server_config.d/calkit.json,sha256=CWrZP--JDGz8fsvbAlKr_duTL1vDriGT48SL1YCtkY0,81
|
|
127
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/package.json,sha256=39PQEWOzw0qtqD7Kep3OPbUR113vI7CG5TeD84v7clM,6224
|
|
128
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/schemas/calkit/package.json.orig,sha256=NBG3t7gFYb6_2J-yPU29qS7Ck9pYgm8-wC5Q1LrzQeI,6082
|
|
129
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/schemas/calkit/plugin.json,sha256=YSpIrwpwB-lQBk9Mwv-npedWTOOZreO6nlWZhqlWyGI,840
|
|
130
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/502.9a2c5772a15466e923ef.js,sha256=mixXcqFUZukj7_jQVxHTavsYl7cdZv83sEe4phJgkh0,59893
|
|
131
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/695.2c41003a452d43d2b358.js,sha256=LEEAOkUtQ9KzWEHn-QFv5yGi70B-sBOnrvztzHr0Shw,223
|
|
132
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/867.a42a046aa5108f54f8fb.js,sha256=pCoEaqUQj1T4-zAc9SUd__9ZGm7uL2wHQve2xwL89NI,8156
|
|
133
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/909.e3f9cc3408834a7fdcc3.js,sha256=4_nMNAiDSn_cw7UjIHEwone4fizrvqrqSgbwUWvjmoU,114571
|
|
134
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js,sha256=n_a0yu_gE7l6fauyoXXv9BZ7ZEYt2387mTfs7CbLcs4,51939
|
|
135
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt,sha256=eNJ8gc9n9IF8nW1d9sI9niuHstYzjNz5vqXx9UgWSPc,249
|
|
136
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/b2f1c3efe70cb539d121.png,sha256=svHD7-cMtTnRITFwugwsVaB9nZ-h8A61ose8z32HiRE,24850
|
|
137
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/remoteEntry.ac9035764d5b2adbb542.js,sha256=rJA1dk1bKtu1QkURrp5HEC2WCxzZppPV1SCYz-35GTc,8737
|
|
138
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/style.js,sha256=r89Jlk5v1drcwhCpv9FnC3Jig_JH4k24kZNIvxh6Htk,149
|
|
139
|
+
calkit_python-0.41.22.data/data/share/jupyter/labextensions/calkit/static/third-party-licenses.json,sha256=2BGdItLJwO3fAopLl4eJvp26TEwuscYC0-yFaF-LaLU,13683
|
|
140
|
+
calkit_python-0.41.22.dist-info/METADATA,sha256=wDI3s5hGdJ4c1GBqKw-8I96N408xQVW_z2m-UsWqRIU,12567
|
|
141
|
+
calkit_python-0.41.22.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
142
|
+
calkit_python-0.41.22.dist-info/entry_points.txt,sha256=2iQBBzjTAOdk66CwS-f3ecXXW5DjUqkG1KBRj8mHI1I,133
|
|
143
|
+
calkit_python-0.41.22.dist-info/licenses/LICENSE,sha256=9ZamCaSUTZk9rcrnf-sWFKLOHr3ws-S_dgKMegW4nw8,1056
|
|
144
|
+
calkit_python-0.41.22.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|