This commit is contained in:
2026-01-13 20:15:18 -06:00
parent c58cccd31c
commit 2464a57a42
14 changed files with 139 additions and 69 deletions

3
.gitignore vendored
View File

@@ -8,3 +8,6 @@ wheels/
# Virtual environments # Virtual environments
.venv .venv
# Logs
logs/

View File

@@ -1,7 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyInconsistentReturnsInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="PyTypeCheckerInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

6
.idea/misc.xml generated
View File

@@ -4,4 +4,10 @@
<option name="sdkName" value="uv (compose_gen)" /> <option name="sdkName" value="uv (compose_gen)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="uv (compose_gen)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="uv (compose_gen)" project-jdk-type="Python SDK" />
<component name="PyrightConfiguration">
<option name="enabled" value="true" />
</component>
<component name="RuffConfiguration">
<option name="enabled" value="true" />
</component>
</project> </project>

89
.idea/workspace.xml generated
View File

@@ -1,65 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="05d408a8-5231-4663-b888-27493ff1596d" name="Changes" comment=""> <list default="true" id="0e000b98-45cd-46e2-a251-61e1b2cb3449" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/data.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/dest_paths.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/src_paths.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/env/data.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/env/main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/org/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/org/data.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/render/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/render/main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/docker_compose/util/replace.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/codeStyles/codeStyleConfig.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/compose_gen.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dictionaries/project.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/__main__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/__init__.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/__init__.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/__main__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/__main__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/cfg_paths.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/compose_data/data.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/data.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/compose_paths.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/compose_data/dest_paths.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/dest_paths.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/dest_path.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/env/data.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/env/data.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/env.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/env/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/env/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/org.py" beforeDir="false" /> <change beforePath="$PROJECT_DIR$/src/docker_compose/org/data.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/org/data.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/org_yaml.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/org/org_yaml.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/uv.lock" beforeDir="false" afterPath="$PROJECT_DIR$/uv.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/replace.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/cfg/src_path.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/compose.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/compose_yaml.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/compose_yaml.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/net.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/net.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/net_yaml.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/net_yaml.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/rendered.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/services.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/services_yaml.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/services_yaml.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/volume_yaml.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/compose_data/volume_yaml.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/compose/volumes.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/env/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/util/Ts.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/util/Ts.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/docker_compose/util/yaml_util.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/docker_compose/util/yaml_util.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="FormatOnSaveOptions">
<option name="myRunOnSave" value="true" />
</component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="OptimizeOnSaveOptions">
<option name="myRunOnSave" value="true" />
</component>
<component name="ProblemsViewState"> <component name="ProblemsViewState">
<option name="selectedTabId" value="ProjectErrors" /> <option name="selectedTabId" value="ProjectErrors" />
</component> </component>
<component name="ProjectColorInfo"><![CDATA[{ <component name="ProjectColorInfo"><![CDATA[{
"customColor": "",
"associatedIndex": 1 "associatedIndex": 1
}]]></component> }]]></component>
<component name="ProjectId" id="38Bbj81fMWB2dc2XPXcErk6xWjp" /> <component name="ProjectId" id="38E5WemR1iIcI5oJ4g3eGxiweao" />
<component name="ProjectViewState"> <component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
@@ -68,10 +47,11 @@
"keyToString": { "keyToString": {
"ModuleVcsDetector.initialDetectionPerformed": "true", "ModuleVcsDetector.initialDetectionPerformed": "true",
"RunOnceActivity.ShowReadmeOnStart": "true", "RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true", "RunOnceActivity.git.unshallow": "true",
"git-widget-placeholder": "main", "git-widget-placeholder": "main",
"last_opened_file_path": "/data/git/compose_gen", "run.code.analysis.last.selected.profile": "aDefault",
"run.code.analysis.last.selected.profile": "pProject Default" "settings.editor.selected.configurable": "actions.on.save"
} }
}]]></component> }]]></component>
<component name="SharedIndexes"> <component name="SharedIndexes">
@@ -83,13 +63,24 @@
</component> </component>
<component name="TaskManager"> <component name="TaskManager">
<task active="true" id="Default" summary="Default task"> <task active="true" id="Default" summary="Default task">
<changelist id="05d408a8-5231-4663-b888-27493ff1596d" name="Changes" comment="" /> <changelist id="0e000b98-45cd-46e2-a251-61e1b2cb3449" name="Changes" comment="" />
<created>1768276046955</created> <created>1768351925652</created>
<option name="number" value="Default" /> <option name="number" value="Default" />
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1768276046955</updated> <updated>1768351925652</updated>
<workItem from="1768276048173" duration="1016000" /> <workItem from="1768351927641" duration="4548000" />
</task> </task>
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project> </project>

0
README.md Normal file
View File

View File

@@ -7,6 +7,7 @@ authors = [{ name = "Christian Camper", email = "ccamper7@gmail.com" }]
requires-python = ">=3.13" requires-python = ">=3.13"
dependencies = [ dependencies = [
"basedpyright>=1.37.1", "basedpyright>=1.37.1",
"loguru>=0.7.3",
"pyyaml>=6.0.3", "pyyaml>=6.0.3",
"ruff>=0.14.11", "ruff>=0.14.11",
] ]

View File

@@ -1,6 +1,25 @@
from inspect import isclass
from itertools import chain
from pathlib import Path from pathlib import Path
from loguru import logger
ROOT = Path("/nas") ROOT = Path("/nas")
TEMPLATE_ROOT = ROOT.joinpath("docker_templates") TEMPLATE_ROOT = ROOT.joinpath("docker_templates")
APP_ROOT = ROOT.joinpath("apps") APP_ROOT = ROOT.joinpath("apps")
TRAEFIK_PATH = TEMPLATE_ROOT.joinpath("traefik") TRAEFIK_PATH = TEMPLATE_ROOT.joinpath("traefik")
_ = logger.add("logs/app.log", level="DEBUG", rotation="1 second", retention="10")
def log_cls(obj: type | object, **kwargs: str | int | bool):
logger.debug(
"\n\t".join(
chain(
(
f"created\n\tcls: {obj.__name__ if isclass(obj) else type(obj).__name__}",
),
(f"{k}: {v}" for k, v in kwargs.items()),
)
)
)

View File

@@ -1,11 +1,13 @@
from collections.abc import Iterator from collections.abc import Iterator
from typing import cast
from docker_compose import TRAEFIK_PATH # from typing import cast
from docker_compose.compose_data.net_yaml import NetArgsYaml #
from docker_compose.render.main import RenderByApp, RenderByOrg # from docker_compose import TRAEFIK_PATH
from docker_compose.util.Ts import TypeYamlCompatibleDict # from docker_compose.compose_data.net_yaml import NetArgsYaml
from docker_compose.util.yaml_util import to_yaml from docker_compose.render.main import RenderByApp # , RenderByOrg
# from docker_compose.util.Ts import TypeYamlCompatibleDict
# from docker_compose.util.yaml_util import to_yaml
def render_all() -> Iterator[str]: def render_all() -> Iterator[str]:

View File

@@ -3,6 +3,7 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Self, cast, final, override from typing import Self, cast, final, override
from docker_compose import log_cls
from docker_compose.compose_data import DN from docker_compose.compose_data import DN
from docker_compose.compose_data.compose_yaml import ComposeYaml from docker_compose.compose_data.compose_yaml import ComposeYaml
from docker_compose.compose_data.net import Net from docker_compose.compose_data.net import Net
@@ -21,6 +22,9 @@ class ComposeData:
networks: Net networks: Net
volumes: dict[str, VolYaml] volumes: dict[str, VolYaml]
def __post_init__(self):
log_cls(ComposeData, name=self.name)
@override @override
def __str__(self) -> str: def __str__(self) -> str:
rep = Replace.format_src("name", self.name) rep = Replace.format_src("name", self.name)
@@ -39,6 +43,7 @@ class ComposeData:
@classmethod @classmethod
def from_path(cls, path: Path) -> Self: def from_path(cls, path: Path) -> Self:
log_cls(ComposeData, path=str(path))
return cls.from_src_paths(SrcPaths.from_path(path)) return cls.from_src_paths(SrcPaths.from_path(path))
@classmethod @classmethod

View File

@@ -9,6 +9,13 @@ class DestPaths:
compose_file: Path compose_file: Path
bind_vol_path: Path bind_vol_path: Path
# def __post_init__(self):
# log_cls(
# self,
# compose_file=str(self.compose_file),
# bind_vol_path=str(self.bind_vol_path),
# )
@classmethod @classmethod
def from_path(cls, src: Path) -> Self: def from_path(cls, src: Path) -> Self:
return cls( return cls(

View File

@@ -6,6 +6,7 @@ from functools import partial
from pathlib import Path from pathlib import Path
from typing import Self, final, override from typing import Self, final, override
from docker_compose import log_cls
from docker_compose.util.replace import Replace from docker_compose.util.replace import Replace
@@ -31,6 +32,7 @@ class EnvData:
@classmethod @classmethod
def from_path(cls, path: Path) -> Self: def from_path(cls, path: Path) -> Self:
log_cls(cls, path=str(path))
return cls({k: v for k, v in cls.get_lines(path)}) return cls({k: v for k, v in cls.get_lines(path)})
@property @property
@@ -41,4 +43,3 @@ class EnvData:
yield k, v yield k, v
continue continue
yield k, p(v) yield k, p(v)

View File

@@ -57,7 +57,7 @@ class EnvByOrg:
def from_path(cls, path: Path) -> Self: def from_path(cls, path: Path) -> Self:
return cls( return cls(
dict(cls._from_path_sub(path)), dict(cls._from_path_sub(path)),
OrgData.get_app(path), path.stem,
) )
# #

View File

@@ -3,7 +3,7 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Callable, Self, cast, final from typing import Callable, Self, cast, final
from docker_compose import APP_ROOT from docker_compose import APP_ROOT, log_cls
from docker_compose.org.org_yaml import OrgDataYaml, OrgYaml from docker_compose.org.org_yaml import OrgDataYaml, OrgYaml
from docker_compose.util.replace import Replace from docker_compose.util.replace import Replace
from docker_compose.util.yaml_util import read_yaml from docker_compose.util.yaml_util import read_yaml
@@ -17,6 +17,14 @@ class OrgData:
url: Replace url: Replace
dest: Path dest: Path
def __post_init__(self):
log_cls(
self,
app=self.app.dest,
org=self.org.dest,
url=self.url.dest,
)
@classmethod @classmethod
def from_dict(cls, app: str, org: str, data: OrgDataYaml) -> Self: def from_dict(cls, app: str, org: str, data: OrgDataYaml) -> Self:
url = data.get("url") url = data.get("url")
@@ -29,13 +37,14 @@ class OrgData:
APP_ROOT.joinpath(org, app), APP_ROOT.joinpath(org, app),
) )
@classmethod # @classmethod
def get_app(cls, path: Path) -> str: # def get_app(cls, path: Path) -> str:
return path.stem # return path.stem
@classmethod @classmethod
def from_path(cls, path: Path) -> Iterator[Self]: def from_path(cls, path: Path) -> Iterator[Self]:
app = cls.get_app(path) log_cls(cls, path=str(path))
app = path.stem
for org, data in cast(OrgYaml, cast(object, read_yaml(path))).items(): for org, data in cast(OrgYaml, cast(object, read_yaml(path))).items():
yield cls.from_dict(app, org, data) yield cls.from_dict(app, org, data)

33
uv.lock generated
View File

@@ -14,12 +14,22 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ad/d6/6b33bb49f08d761d7c958a1e3cecfb3ffbdcf4ba6bbed65b23ab47516b75/basedpyright-1.37.1-py3-none-any.whl", hash = "sha256:caf3adfe54f51623241712f8b4367adb51ef8a8c2288e3e1ec4118319661340d", size = 12297397, upload-time = "2026-01-08T14:42:50.306Z" }, { url = "https://files.pythonhosted.org/packages/ad/d6/6b33bb49f08d761d7c958a1e3cecfb3ffbdcf4ba6bbed65b23ab47516b75/basedpyright-1.37.1-py3-none-any.whl", hash = "sha256:caf3adfe54f51623241712f8b4367adb51ef8a8c2288e3e1ec4118319661340d", size = 12297397, upload-time = "2026-01-08T14:42:50.306Z" },
] ]
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
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" },
]
[[package]] [[package]]
name = "docker-compose" name = "docker-compose"
version = "0.1.0" version = "0.1.0"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "basedpyright" }, { name = "basedpyright" },
{ name = "loguru" },
{ name = "pyyaml" }, { name = "pyyaml" },
{ name = "ruff" }, { name = "ruff" },
] ]
@@ -27,10 +37,24 @@ dependencies = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "basedpyright", specifier = ">=1.37.1" }, { name = "basedpyright", specifier = ">=1.37.1" },
{ name = "loguru", specifier = ">=0.7.3" },
{ name = "pyyaml", specifier = ">=6.0.3" }, { name = "pyyaml", specifier = ">=6.0.3" },
{ name = "ruff", specifier = ">=0.14.11" }, { name = "ruff", specifier = ">=0.14.11" },
] ]
[[package]]
name = "loguru"
version = "0.7.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "win32-setctime", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" },
]
[[package]] [[package]]
name = "nodejs-wheel-binaries" name = "nodejs-wheel-binaries"
version = "24.12.0" version = "24.12.0"
@@ -108,3 +132,12 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/58/f1/90ddc533918d3a2ad628bc3044cdfc094949e6d4b929220c3f0eb8a1c998/ruff-0.14.11-py3-none-win_amd64.whl", hash = "sha256:f981cea63d08456b2c070e64b79cb62f951aa1305282974d4d5216e6e0178ae6", size = 14001379, upload-time = "2026-01-08T19:11:52.591Z" }, { url = "https://files.pythonhosted.org/packages/58/f1/90ddc533918d3a2ad628bc3044cdfc094949e6d4b929220c3f0eb8a1c998/ruff-0.14.11-py3-none-win_amd64.whl", hash = "sha256:f981cea63d08456b2c070e64b79cb62f951aa1305282974d4d5216e6e0178ae6", size = 14001379, upload-time = "2026-01-08T19:11:52.591Z" },
{ url = "https://files.pythonhosted.org/packages/c4/1c/1dbe51782c0e1e9cfce1d1004752672d2d4629ea46945d19d731ad772b3b/ruff-0.14.11-py3-none-win_arm64.whl", hash = "sha256:649fb6c9edd7f751db276ef42df1f3df41c38d67d199570ae2a7bd6cbc3590f0", size = 12938644, upload-time = "2026-01-08T19:11:50.027Z" }, { url = "https://files.pythonhosted.org/packages/c4/1c/1dbe51782c0e1e9cfce1d1004752672d2d4629ea46945d19d731ad772b3b/ruff-0.14.11-py3-none-win_arm64.whl", hash = "sha256:649fb6c9edd7f751db276ef42df1f3df41c38d67d199570ae2a7bd6cbc3590f0", size = 12938644, upload-time = "2026-01-08T19:11:50.027Z" },
] ]
[[package]]
name = "win32-setctime"
version = "1.2.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" },
]