Compare commits
3 Commits
04dfc9e8e0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
876d148f1e
|
|||
|
6db14bff7e
|
|||
|
a154c98c0e
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,3 +8,4 @@ wheels/
|
|||||||
|
|
||||||
# Virtual environments
|
# Virtual environments
|
||||||
.venv
|
.venv
|
||||||
|
.vscode
|
||||||
7
LICENSE
Normal file
7
LICENSE
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Copyright 2026 SidneyZhang
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
@@ -36,7 +36,7 @@ pptopic export presentation.pptx
|
|||||||
pptopic export presentation.pptx --output result.png
|
pptopic export presentation.pptx --output result.png
|
||||||
|
|
||||||
# 优化导出的图片
|
# 优化导出的图片
|
||||||
pptopic export presentation.pptx --optimize
|
pptopic export presentation.pptx --optimize -o result.png
|
||||||
|
|
||||||
# 自定义宽度和最大高度
|
# 自定义宽度和最大高度
|
||||||
pptopic export presentation.pptx --width 1080 --optimize --max-height 20000
|
pptopic export presentation.pptx --width 1080 --optimize --max-height 20000
|
||||||
@@ -64,6 +64,7 @@ pptopic optimize image.png --max-height 20000 --engine pngquant
|
|||||||
## 图片优化
|
## 图片优化
|
||||||
|
|
||||||
推荐使用 [pngquant](https://pngquant.org/) 进行图片压缩。
|
推荐使用 [pngquant](https://pngquant.org/) 进行图片压缩。
|
||||||
|
当然,使用自己熟悉的图片优化压缩引擎是一样的。
|
||||||
|
|
||||||
### 自动安装脚本
|
### 自动安装脚本
|
||||||
|
|
||||||
@@ -84,3 +85,7 @@ pptopic optimize image.png --max-height 20000 --engine pngquant
|
|||||||
```bash
|
```bash
|
||||||
scoop install pngquant
|
scoop install pngquant
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License
|
||||||
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "pptopic"
|
name = "pptopic"
|
||||||
version = "0.1.0"
|
version = "0.3.0"
|
||||||
description = "导出长图"
|
description = "导出长图"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
from pptopic.main import main
|
from pptopic.main import main
|
||||||
|
|
||||||
|
__version__ = "0.3.0"
|
||||||
|
|
||||||
|
__author__ = "Sidney Zhang <zly@lyzhang.me>"
|
||||||
|
|
||||||
|
__all__ = ["main"]
|
||||||
|
|||||||
@@ -1,29 +1,27 @@
|
|||||||
from typing import Self
|
|
||||||
from pathlib import Path
|
|
||||||
import cv2
|
|
||||||
from PIL import Image
|
|
||||||
from tempfile import TemporaryDirectory
|
|
||||||
import win32com.client as wcc
|
|
||||||
import shutil
|
import shutil
|
||||||
import numpy as np
|
|
||||||
from simtoolsz.utils import lastFile
|
|
||||||
import sys
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
|
from typing import Self
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import win32com.client as wcc
|
||||||
|
from PIL import Image
|
||||||
|
from simtoolsz.utils import lastFile
|
||||||
|
|
||||||
__all__ = ["convertPPT", "PPT_longPic", "imageOptimization"]
|
__all__ = ["convertPPT", "PPT_longPic", "imageOptimization"]
|
||||||
|
|
||||||
class convertPPT(object):
|
|
||||||
|
class convertPPT:
|
||||||
"""
|
"""
|
||||||
win32com使用VBA的API,可从官方教程中看到:
|
win32com使用VBA的API,可从官方教程中看到:
|
||||||
https://learn.microsoft.com/en-us/office/vba/api/PowerPoint.Presentation.SaveAs
|
https://learn.microsoft.com/en-us/office/vba/api/PowerPoint.Presentation.SaveAs
|
||||||
编码来源:https://my.oschina.net/zxcholmes/blog/484789
|
编码来源:https://my.oschina.net/zxcholmes/blog/484789
|
||||||
"""
|
"""
|
||||||
TTYPES = {
|
|
||||||
"JPG" : 17,
|
TTYPES = {"JPG": 17, "PNG": 18, "PDF": 32, "XPS": 33}
|
||||||
"PNG" : 18,
|
|
||||||
"PDF" : 32,
|
|
||||||
"XPS" : 33
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self, file: str | Path, trans: str = "JPG") -> None:
|
def __init__(self, file: str | Path, trans: str = "JPG") -> None:
|
||||||
if sys.platform != "win32":
|
if sys.platform != "win32":
|
||||||
@@ -35,7 +33,7 @@ class convertPPT(object):
|
|||||||
if trans_upper not in convertPPT.TTYPES:
|
if trans_upper not in convertPPT.TTYPES:
|
||||||
raise ValueError("Save type is not supported.")
|
raise ValueError("Save type is not supported.")
|
||||||
self.__saveType = (convertPPT.TTYPES[trans_upper], trans_upper)
|
self.__saveType = (convertPPT.TTYPES[trans_upper], trans_upper)
|
||||||
self.__inUsing = wcc.Dispatch('PowerPoint.Application')
|
self.__inUsing = wcc.Dispatch("PowerPoint.Application")
|
||||||
|
|
||||||
def __enter__(self) -> Self:
|
def __enter__(self) -> Self:
|
||||||
return self
|
return self
|
||||||
@@ -77,8 +75,9 @@ class convertPPT(object):
|
|||||||
print("File converted successfully.")
|
print("File converted successfully.")
|
||||||
|
|
||||||
|
|
||||||
def PPT_longPic(pptFile: str | Path, saveName: str | None = None, width: int | str | None = None,
|
def PPT_longPic(
|
||||||
saveto: str | Path = ".") -> None:
|
pptFile: str | Path, saveName: str | None = None, width: int | str | None = None, saveto: str | Path = "."
|
||||||
|
) -> None:
|
||||||
"""
|
"""
|
||||||
width : 画幅宽度,可以直接指定宽度像素,也可以使用字符串数据输入百分比。
|
width : 画幅宽度,可以直接指定宽度像素,也可以使用字符串数据输入百分比。
|
||||||
(700; "22.1%")
|
(700; "22.1%")
|
||||||
@@ -88,20 +87,20 @@ def PPT_longPic(pptFile: str | Path, saveName: str | None = None, width: int | s
|
|||||||
if saveName:
|
if saveName:
|
||||||
sType = Path(saveName).suffix[1:].upper() if Path(saveName).suffix else "JPG"
|
sType = Path(saveName).suffix[1:].upper() if Path(saveName).suffix else "JPG"
|
||||||
if sType not in ["JPG", "PNG"]:
|
if sType not in ["JPG", "PNG"]:
|
||||||
raise ValueError("Unable to save this type `{}` of image.".format(sType))
|
raise ValueError(f"Unable to save this type `{sType}` of image.")
|
||||||
else:
|
else:
|
||||||
sType = "JPG"
|
sType = "JPG"
|
||||||
|
|
||||||
with TemporaryDirectory() as tmpdirname:
|
with TemporaryDirectory() as tmpdirname:
|
||||||
with convertPPT(pptFile, trans=sType) as ppt:
|
with convertPPT(pptFile, trans=sType) as ppt:
|
||||||
ppt.trans(saveto=tmpdirname)
|
ppt.trans(saveto=tmpdirname)
|
||||||
picList = sorted(Path(tmpdirname).glob("*.{}".format(sType)))
|
picList = sorted(Path(tmpdirname).glob(f"*.{sType}"))
|
||||||
if not picList:
|
if not picList:
|
||||||
raise ValueError("No images generated from PPT conversion.")
|
raise ValueError("No images generated from PPT conversion.")
|
||||||
|
|
||||||
with Image.open(picList[0]) as img:
|
with Image.open(picList[0]) as img:
|
||||||
if isinstance(width, str):
|
if isinstance(width, str):
|
||||||
qw = float(width.rstrip('%')) / 100.0
|
qw = float(width.rstrip("%")) / 100.0
|
||||||
nwidth, nheight = (int(img.width * qw), int(img.height * qw))
|
nwidth, nheight = (int(img.width * qw), int(img.height * qw))
|
||||||
elif width is None:
|
elif width is None:
|
||||||
nwidth, nheight = img.size
|
nwidth, nheight = img.size
|
||||||
@@ -114,7 +113,7 @@ def PPT_longPic(pptFile: str | Path, saveName: str | None = None, width: int | s
|
|||||||
new_img = img.resize((nwidth, nheight), resample=Image.Resampling.LANCZOS)
|
new_img = img.resize((nwidth, nheight), resample=Image.Resampling.LANCZOS)
|
||||||
canvas.paste(new_img, box=(0, (i - 1) * nheight))
|
canvas.paste(new_img, box=(0, (i - 1) * nheight))
|
||||||
|
|
||||||
filepath = pptFile.parent if Path(saveto) == Path('.') else Path(saveto)
|
filepath = pptFile.parent if Path(saveto) == Path(".") else Path(saveto)
|
||||||
if saveName:
|
if saveName:
|
||||||
if Path(saveName).suffix:
|
if Path(saveName).suffix:
|
||||||
canvas.save(filepath / saveName)
|
canvas.save(filepath / saveName)
|
||||||
@@ -123,22 +122,27 @@ def PPT_longPic(pptFile: str | Path, saveName: str | None = None, width: int | s
|
|||||||
else:
|
else:
|
||||||
canvas.save(filepath / pptFile.name, format=sType)
|
canvas.save(filepath / pptFile.name, format=sType)
|
||||||
|
|
||||||
def imageOptimization(imageFile: str | Path | Image.Image, saveFile: str | Path | None = None,
|
|
||||||
max_width: int = None, max_height: int = None,
|
def imageOptimization(
|
||||||
engine: str | None = "pngquant",
|
imageFile: str | Path | Image.Image,
|
||||||
engine_conf: str | None = None) -> Image.Image | None:
|
saveFile: str | Path | None = None,
|
||||||
|
max_width: int = None,
|
||||||
|
max_height: int = None,
|
||||||
|
engine: str | None = "pngquant",
|
||||||
|
engine_conf: str | None = None,
|
||||||
|
) -> Image.Image | None:
|
||||||
"""图片优化、无损压缩
|
"""图片优化、无损压缩
|
||||||
默认建议使用pngquant进行无损压缩,也可以设置为其他图片无损压缩引擎,
|
默认建议使用pngquant进行无损压缩,也可以设置为其他图片无损压缩引擎,
|
||||||
不需要针对性压缩,可设定engine为None。
|
不需要针对性压缩,可设定engine为None。
|
||||||
"""
|
"""
|
||||||
if isinstance(imageFile, (str, Path)):
|
if isinstance(imageFile, str | Path):
|
||||||
imageFile = Image.open(imageFile)
|
imageFile = Image.open(imageFile)
|
||||||
img = cv2.cvtColor(np.array(imageFile), cv2.COLOR_RGB2BGR)
|
img = cv2.cvtColor(np.array(imageFile), cv2.COLOR_RGB2BGR)
|
||||||
|
|
||||||
if max_width or max_height:
|
if max_width or max_height:
|
||||||
height, width, _ = img.shape
|
height, width, _ = img.shape
|
||||||
new_width, new_height = width, height
|
new_width, new_height = width, height
|
||||||
|
|
||||||
if max_width:
|
if max_width:
|
||||||
if max_width < 1:
|
if max_width < 1:
|
||||||
new_width = int(width * max_width)
|
new_width = int(width * max_width)
|
||||||
@@ -146,7 +150,7 @@ def imageOptimization(imageFile: str | Path | Image.Image, saveFile: str | Path
|
|||||||
elif width > max_width:
|
elif width > max_width:
|
||||||
new_width = max_width
|
new_width = max_width
|
||||||
new_height = int(height * max_width / width)
|
new_height = int(height * max_width / width)
|
||||||
|
|
||||||
if max_height:
|
if max_height:
|
||||||
if max_height < 1:
|
if max_height < 1:
|
||||||
if new_width < width:
|
if new_width < width:
|
||||||
@@ -159,14 +163,14 @@ def imageOptimization(imageFile: str | Path | Image.Image, saveFile: str | Path
|
|||||||
elif new_height > max_height:
|
elif new_height > max_height:
|
||||||
new_width = int(new_width * max_height / new_height)
|
new_width = int(new_width * max_height / new_height)
|
||||||
new_height = max_height
|
new_height = max_height
|
||||||
|
|
||||||
img = cv2.resize(img, (new_width, new_height))
|
img = cv2.resize(img, (new_width, new_height))
|
||||||
|
|
||||||
res = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
|
res = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
|
||||||
with TemporaryDirectory(prefix="pytoolsz") as tmpFolder:
|
with TemporaryDirectory(prefix="pytoolsz") as tmpFolder:
|
||||||
tmpPath = Path(tmpFolder) / "tmp.png"
|
tmpPath = Path(tmpFolder) / "tmp.png"
|
||||||
res.save(tmpPath, compress_level=2, quality=100)
|
res.save(tmpPath, compress_level=2, quality=100)
|
||||||
|
|
||||||
if engine:
|
if engine:
|
||||||
try:
|
try:
|
||||||
subprocess.run([engine, engine_conf, tmpPath], shell=True, check=True)
|
subprocess.run([engine, engine_conf, tmpPath], shell=True, check=True)
|
||||||
@@ -175,9 +179,9 @@ def imageOptimization(imageFile: str | Path | Image.Image, saveFile: str | Path
|
|||||||
raise e
|
raise e
|
||||||
else:
|
else:
|
||||||
res.save(tmpPath, compress_level=7, quality=95)
|
res.save(tmpPath, compress_level=7, quality=95)
|
||||||
|
|
||||||
if saveFile is None:
|
if saveFile is None:
|
||||||
res = Image.open(lastFile(Path(tmpFolder), "*.*"))
|
res = Image.open(lastFile(Path(tmpFolder), "*.*"))
|
||||||
return res
|
return res
|
||||||
else:
|
else:
|
||||||
shutil.copyfile(lastFile(Path(tmpFolder), "*.*"), saveFile)
|
shutil.copyfile(lastFile(Path(tmpFolder), "*.*"), saveFile)
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from simtoolsz.utils import today
|
|
||||||
|
|
||||||
import typer
|
import typer
|
||||||
|
from simtoolsz.utils import today
|
||||||
|
|
||||||
from pptopic.lib import PPT_longPic, imageOptimization
|
from pptopic.lib import PPT_longPic, imageOptimization
|
||||||
|
|
||||||
app = typer.Typer()
|
app = typer.Typer()
|
||||||
|
|
||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def export(
|
def export(
|
||||||
input_file: Path = typer.Argument(..., help="输入的PPTX文件路径", exists=True),
|
input_file: Path = typer.Argument(..., help="输入的PPTX文件路径", exists=True),
|
||||||
@@ -16,12 +17,14 @@ def export(
|
|||||||
optimize: bool = typer.Option(False, "--optimize", help="是否优化导出的图片"),
|
optimize: bool = typer.Option(False, "--optimize", help="是否优化导出的图片"),
|
||||||
max_height: int = typer.Option(29999, "--max-height", help="优化图片的最大高度(默认29999)"),
|
max_height: int = typer.Option(29999, "--max-height", help="优化图片的最大高度(默认29999)"),
|
||||||
engine: str = typer.Option("pngquant", "--engine", help="图片优化引擎(默认pngquant)"),
|
engine: str = typer.Option("pngquant", "--engine", help="图片优化引擎(默认pngquant)"),
|
||||||
engine_conf: str = typer.Option("--skip-if-larger", "--engine-conf", help="图片优化引擎配置参数(默认--skip-if-larger)"),
|
engine_conf: str = typer.Option(
|
||||||
format: str = typer.Option("PNG", "--format", "-f", help="输出格式(JPG或PNG,默认PNG)")
|
"--skip-if-larger", "--engine-conf", help="图片优化引擎配置参数(默认--skip-if-larger)"
|
||||||
|
),
|
||||||
|
format: str = typer.Option("PNG", "--format", "-f", help="输出格式(JPG或PNG,默认PNG)"),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
将PPTX文件导出为长图
|
将PPTX文件导出为长图
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
pptopic export presentation.pptx
|
pptopic export presentation.pptx
|
||||||
pptopic export presentation.pptx --optimize
|
pptopic export presentation.pptx --optimize
|
||||||
@@ -31,42 +34,40 @@ def export(
|
|||||||
if output_name:
|
if output_name:
|
||||||
save_name = f"{output_name}.{format.lower()}" if "." not in output_name else output_name
|
save_name = f"{output_name}.{format.lower()}" if "." not in output_name else output_name
|
||||||
else:
|
else:
|
||||||
save_name = f"{input_file.stem}_{today(fmt="YYYYMMDDHHmm",addtime=True)}.{format.lower()}"
|
save_name = f"{input_file.stem}_{today(fmt='YYYYMMDDHHmm', addtime=True)}.{format.lower()}"
|
||||||
|
|
||||||
PPT_longPic(
|
PPT_longPic(pptFile=input_file, saveName=save_name, width=width, saveto=output_dir)
|
||||||
pptFile=input_file,
|
|
||||||
saveName=save_name,
|
|
||||||
width=width,
|
|
||||||
saveto=output_dir
|
|
||||||
)
|
|
||||||
|
|
||||||
if optimize:
|
if optimize:
|
||||||
output_path = output_dir / save_name
|
output_path = output_dir / save_name
|
||||||
|
|
||||||
imageOptimization(
|
imageOptimization(
|
||||||
imageFile=output_path,
|
imageFile=output_path,
|
||||||
saveFile=output_path,
|
saveFile=output_path,
|
||||||
max_height=max_height,
|
max_height=max_height,
|
||||||
engine=engine,
|
engine=engine,
|
||||||
engine_conf=engine_conf
|
engine_conf=engine_conf,
|
||||||
)
|
)
|
||||||
|
|
||||||
typer.echo(f"成功导出长图: {output_dir / save_name}")
|
typer.echo(f"成功导出长图: {output_dir / save_name}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
typer.echo(f"导出失败: {e}", err=True)
|
typer.echo(f"导出失败: {e}", err=True)
|
||||||
raise typer.Exit(code=1)
|
raise typer.Exit(code=1)
|
||||||
|
|
||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def optimize(
|
def optimize(
|
||||||
input_file: Path = typer.Argument(..., help="输入的图片文件路径", exists=True),
|
input_file: Path = typer.Argument(..., help="输入的图片文件路径", exists=True),
|
||||||
output_file: Path = typer.Option(None, "--output", "-o", help="输出图片文件路径,默认覆盖原文件"),
|
output_file: Path = typer.Option(None, "--output", "-o", help="输出图片文件路径,默认覆盖原文件"),
|
||||||
max_height: int = typer.Option(29999, "--max-height", help="优化图片的最大高度(默认29999)"),
|
max_height: int = typer.Option(29999, "--max-height", help="优化图片的最大高度(默认29999)"),
|
||||||
engine: str = typer.Option("pngquant", "--engine", help="图片优化引擎(默认pngquant)"),
|
engine: str = typer.Option("pngquant", "--engine", help="图片优化引擎(默认pngquant)"),
|
||||||
engine_conf: str = typer.Option("--skip-if-larger", "--engine-conf", help="图片优化引擎配置参数(默认--skip-if-larger)")
|
engine_conf: str = typer.Option(
|
||||||
|
"--skip-if-larger", "--engine-conf", help="图片优化引擎配置参数(默认--skip-if-larger)"
|
||||||
|
),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
单独优化图片
|
单独优化图片
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
pptopic optimize image.png
|
pptopic optimize image.png
|
||||||
pptopic optimize image.png --output optimized.png --max-height 20000
|
pptopic optimize image.png --output optimized.png --max-height 20000
|
||||||
@@ -74,19 +75,25 @@ def optimize(
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
save_file = output_file if output_file else input_file
|
save_file = output_file if output_file else input_file
|
||||||
|
|
||||||
imageOptimization(
|
imageOptimization(
|
||||||
imageFile=input_file,
|
imageFile=input_file, saveFile=save_file, max_height=max_height, engine=engine, engine_conf=engine_conf
|
||||||
saveFile=save_file,
|
|
||||||
max_height=max_height,
|
|
||||||
engine=engine,
|
|
||||||
engine_conf=engine_conf
|
|
||||||
)
|
)
|
||||||
|
|
||||||
typer.echo(f"成功优化图片: {save_file}")
|
typer.echo(f"成功优化图片: {save_file}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
typer.echo(f"优化失败: {e}", err=True)
|
typer.echo(f"优化失败: {e}", err=True)
|
||||||
raise typer.Exit(code=1)
|
raise typer.Exit(code=1)
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def version():
|
||||||
|
"""显示版本信息"""
|
||||||
|
from pptopic import __version__
|
||||||
|
|
||||||
|
typer.echo(f"pptopic version: {__version__}")
|
||||||
|
typer.echo("Under the MIT License.")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app()
|
app()
|
||||||
|
|||||||
108
uv.lock
generated
108
uv.lock
generated
@@ -32,6 +32,75 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "coverage"
|
||||||
|
version = "7.13.5"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "duckdb"
|
name = "duckdb"
|
||||||
version = "1.4.4"
|
version = "1.4.4"
|
||||||
@@ -291,7 +360,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pptopic"
|
name = "pptopic"
|
||||||
version = "0.1.0"
|
version = "0.3.0"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "numpy" },
|
{ name = "numpy" },
|
||||||
@@ -302,15 +371,26 @@ dependencies = [
|
|||||||
{ name = "typer" },
|
{ name = "typer" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[package.optional-dependencies]
|
||||||
|
dev = [
|
||||||
|
{ name = "pytest" },
|
||||||
|
{ name = "pytest-cov" },
|
||||||
|
{ name = "pytest-mock" },
|
||||||
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "numpy", specifier = ">=2.4.2" },
|
{ name = "numpy", specifier = ">=2.4.2" },
|
||||||
{ name = "opencv-python", specifier = ">=4.13.0.92" },
|
{ name = "opencv-python", specifier = ">=4.13.0.92" },
|
||||||
{ name = "pillow", specifier = ">=12.1.1" },
|
{ name = "pillow", specifier = ">=12.1.1" },
|
||||||
|
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" },
|
||||||
|
{ name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" },
|
||||||
|
{ name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.10.0" },
|
||||||
{ name = "pywin32", specifier = ">=311" },
|
{ name = "pywin32", specifier = ">=311" },
|
||||||
{ name = "simtoolsz", specifier = ">=0.2.12.3" },
|
{ name = "simtoolsz", specifier = ">=0.2.12.3" },
|
||||||
{ name = "typer", specifier = ">=0.21.2" },
|
{ name = "typer", specifier = ">=0.21.2" },
|
||||||
]
|
]
|
||||||
|
provides-extras = ["dev"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyarrow"
|
name = "pyarrow"
|
||||||
@@ -373,6 +453,32 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest-cov"
|
||||||
|
version = "7.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "coverage" },
|
||||||
|
{ name = "pluggy" },
|
||||||
|
{ name = "pytest" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest-mock"
|
||||||
|
version = "3.15.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "pytest" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "python-dateutil"
|
name = "python-dateutil"
|
||||||
version = "2.9.0.post0"
|
version = "2.9.0.post0"
|
||||||
|
|||||||
Reference in New Issue
Block a user