effectual 0.5.4__tar.gz → 0.5.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: effectual
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: A python package/script bundler
5
5
  Project-URL: Homepage, https://github.com/effectualpy/effectual
6
6
  Author-email: jake <jakewdr@proton.me>
@@ -79,7 +79,8 @@ This is like what what [Rollup](https://rollupjs.org/) does for vite
79
79
  # To be added
80
80
 
81
81
  - [Treeshaking](https://webpack.js.org/guides/tree-shaking/)
82
- - [Pre-bundling](https://vite.dev/guide/dep-pre-bundling)
82
+ - Rewriting some time critical parts in Rust 🚀🦀
83
+ - Cross platform compatibility
83
84
  - Plugin and loader system
84
85
 
85
86
  # Contributions
@@ -56,7 +56,8 @@ This is like what what [Rollup](https://rollupjs.org/) does for vite
56
56
  # To be added
57
57
 
58
58
  - [Treeshaking](https://webpack.js.org/guides/tree-shaking/)
59
- - [Pre-bundling](https://vite.dev/guide/dep-pre-bundling)
59
+ - Rewriting some time critical parts in Rust 🚀🦀
60
+ - Cross platform compatibility
60
61
  - Plugin and loader system
61
62
 
62
63
  # Contributions
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "effectual"
3
- version = "0.5.4"
3
+ version = "0.5.6"
4
4
  description = "A python package/script bundler"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -8,7 +8,10 @@ def main() -> None:
8
8
 
9
9
  @click.command("dist")
10
10
  def dist() -> None:
11
- """Bundles your source directory."""
11
+ """
12
+ Bundles your source directory
13
+ into a production bundle
14
+ """
12
15
  from . import build
13
16
 
14
17
  build.main()
@@ -16,7 +19,10 @@ def dist() -> None:
16
19
 
17
20
  @click.command("dev")
18
21
  def dev() -> None:
19
- """Bundles your source directory."""
22
+ """
23
+ Bundles your source directory
24
+ into a developer bundle
25
+ """
20
26
  from . import developer
21
27
 
22
28
  developer.main()
@@ -10,15 +10,16 @@ from watch_lite import getHash
10
10
 
11
11
  from .colors import completeColor, fileColor, folderColor, tagColor
12
12
  from .config import dumpHashes, loadConfig, loadToml
13
- from .minifier import minifyFile, minifyToString
13
+ from .transformations import minifyToString
14
+ from .treeshake import cleanPackages
14
15
 
15
16
 
16
17
  def bundleFiles(
17
- sourceDirectory: Path,
18
- outputDirectory: Path,
19
- outputFileName: str,
20
- compressionLevel: int,
21
- minification: bool,
18
+ sourceDirectory: Path = Path("./src/"),
19
+ outputDirectory: Path = Path("./out"),
20
+ outputFileName: str = "bundle.pyz",
21
+ compressionLevel: int = 5,
22
+ minification: bool = True,
22
23
  ) -> None:
23
24
  """Bundles dependencies and scripts into a single .pyz archive
24
25
 
@@ -42,16 +43,19 @@ def bundleFiles(
42
43
  compression=zipfile.ZIP_DEFLATED,
43
44
  ) as bundler:
44
45
  cachePath: Path = Path("./.effectual_cache/cachedPackages")
45
-
46
- totalSize: int = int(0)
47
- for cachedFile in cachePath.rglob("*"):
48
- if cachedFile.is_dir() and not any(cachedFile.iterdir()):
49
- continue
50
- totalSize += cachedFile.stat().st_size
51
- arcName = cachedFile.relative_to(cachePath)
52
- bundler.write(cachedFile, arcname=arcName)
53
-
54
- print(f"{tagColor('bundling')} || uv dependencies {folderColor(totalSize)}")
46
+ if cachePath.exists():
47
+ if os.listdir(cachePath):
48
+ totalSize: int = int(0)
49
+ for cachedFile in cachePath.rglob("*"):
50
+ if cachedFile.is_dir() and not any(cachedFile.iterdir()):
51
+ continue
52
+ totalSize += cachedFile.stat().st_size
53
+ arcName = cachedFile.relative_to(cachePath)
54
+ bundler.write(cachedFile, arcname=arcName)
55
+
56
+ print(
57
+ f"{tagColor('bundling')} || uv dependencies {folderColor(totalSize)}" # noqa: E501
58
+ )
55
59
 
56
60
  for pyFile in sourceDirectory.rglob("*.py"):
57
61
  print(f"{tagColor('bundling')} || {pyFile.name} {fileColor(pyFile)}")
@@ -67,42 +71,29 @@ def bundleFiles(
67
71
  def dependencies(minify: bool) -> None:
68
72
  packages: list[str] = (
69
73
  loadToml("./pyproject.toml").get("project").get("dependencies")
70
- ) # type: ignore
71
-
72
- arguments: list[str] = ["--no-compile", "--quiet", "--no-binary=none", "--no-cache"]
73
-
74
- pathToInstallTo: str = "./.effectual_cache/cachedPackages"
75
- argumentString: str = " ".join(arguments)
74
+ )
76
75
 
77
- if Path(pathToInstallTo).exists():
78
- shutil.rmtree(pathToInstallTo)
76
+ if len(packages) != 0:
77
+ arguments: list[str] = ["--no-compile", "--quiet", "--no-binary=none"]
79
78
 
80
- for key in packages:
81
- print(f"{tagColor('installing')} || {key}")
82
- os.system(f'uv pip install "{key}" {argumentString} --target {pathToInstallTo}')
79
+ pathToInstallTo: str = "./.effectual_cache/cachedPackages"
80
+ argumentString: str = " ".join(arguments)
83
81
 
84
- print(f"{tagColor('optimizing')} || {', '.join(packages)}")
82
+ if Path(pathToInstallTo).exists():
83
+ shutil.rmtree(pathToInstallTo)
85
84
 
86
- multiprocessing = importlib.import_module("multiprocessing")
85
+ for key in packages:
86
+ print(f"{tagColor('installing')} || {key}")
87
+ os.system(
88
+ f'uv pip install "{key}" {argumentString} --target {pathToInstallTo}'
89
+ )
87
90
 
88
- with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
89
- pool.map(optimizeDependencies, Path(pathToInstallTo).rglob("*"))
91
+ print(f"{tagColor('optimizing')} || {', '.join(packages)}")
90
92
 
93
+ multiprocessing = importlib.import_module("multiprocessing")
91
94
 
92
- def optimizeDependencies(file: Path) -> None:
93
- stringFile: str = str(file)
94
- if (
95
- file.suffix in (".pyc", ".pyd", ".exe", ".typed")
96
- or "__pycache__" in stringFile
97
- or ".dist-info" in stringFile
98
- or ".lock" in stringFile
99
- ):
100
- try:
101
- file.unlink()
102
- except PermissionError:
103
- pass
104
- elif file.suffix == ".py":
105
- minifyFile(file)
95
+ with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
96
+ pool.map(cleanPackages, Path(pathToInstallTo).rglob("*"))
106
97
 
107
98
 
108
99
  def main() -> None:
@@ -120,8 +111,7 @@ def main() -> None:
120
111
  compressionLevel: int = max(
121
112
  0, min(9, configData.get("compressionLevel", 5))
122
113
  ) # Default level if not set
123
- global minification
124
- minification = configData.get("minification", True)
114
+ minification: bool = configData.get("minification", True)
125
115
 
126
116
  if not sourceDirectory.is_dir():
127
117
  raise RuntimeError(
@@ -1,10 +1,11 @@
1
1
  import io
2
+ from pathlib import Path
2
3
  from typing import Any
3
4
 
4
5
  import rtoml
5
6
 
6
7
 
7
- def loadToml(tomlFile: str) -> dict[str, Any]:
8
+ def loadToml(tomlFile: str | Path) -> dict[str, Any]:
8
9
  """Loads a toml file from a specific path to a dictionary
9
10
 
10
11
  Args:
@@ -19,14 +20,14 @@ def loadToml(tomlFile: str) -> dict[str, Any]:
19
20
  """
20
21
  try:
21
22
  with open(tomlFile, "r", encoding="utf-8") as file:
22
- return dict(rtoml.load(file)) # type: ignore
23
+ return dict(rtoml.load(file))
23
24
  except ValueError as e:
24
25
  raise RuntimeError(f"Invalid TOML in {tomlFile}: {e}")
25
26
  except FileNotFoundError:
26
27
  raise RuntimeError(f"TOML file {tomlFile} not found.")
27
28
 
28
29
 
29
- def loadConfig(configPath: str) -> dict[Any, Any]:
30
+ def loadConfig(configPath: str = "./pyproject.toml") -> dict[Any, Any]:
30
31
  """Loads effectual config from a file
31
32
 
32
33
  Args:
@@ -57,4 +58,4 @@ def dumpHashes(hashesToDump: dict[str, dict[str, str]], file: io.TextIOWrapper)
57
58
  hashesToDump (dict[str, dict[str, str]]): Dictionary of hashes to dump as toml
58
59
  file (_type_): File object
59
60
  """
60
- return rtoml.dump(hashesToDump, file, pretty=False)
61
+ rtoml.dump(hashesToDump, file, pretty=False)
@@ -46,10 +46,10 @@ def main() -> None:
46
46
  while True:
47
47
  currentHashSet: set[str] = getAllHashes(str(sourceDirectory))
48
48
  if currentHashSet != lastHashSet:
49
- lastHashSet = currentHashSet
50
49
  runCommand.kill()
51
50
  runCommand.wait()
52
51
  outputFile.unlink()
52
+ lastHashSet = currentHashSet
53
53
  print(f"{tagColor('reloaded')} || file change detected")
54
54
  bundle(sourceDirectory, outputFile)
55
55
  runCommand = subprocess.Popen(["uv", "run", outputFile], shell=True)
@@ -0,0 +1,19 @@
1
+ from pathlib import Path
2
+
3
+ from transformations import minifyFile
4
+
5
+
6
+ def cleanPackages(file: Path) -> None:
7
+ stringFile: str = str(file)
8
+ if (
9
+ file.suffix in (".pyc", ".pyd", ".exe", ".typed")
10
+ or "__pycache__" in stringFile
11
+ or ".dist-info" in stringFile
12
+ or ".lock" in stringFile
13
+ ):
14
+ try:
15
+ file.unlink()
16
+ except PermissionError:
17
+ pass
18
+ elif file.suffix == ".py":
19
+ minifyFile(file)
@@ -24,7 +24,7 @@ wheels = [
24
24
 
25
25
  [[package]]
26
26
  name = "effectual"
27
- version = "0.5.4"
27
+ version = "0.5.6"
28
28
  source = { editable = "." }
29
29
  dependencies = [
30
30
  { name = "click" },
@@ -214,27 +214,27 @@ wheels = [
214
214
 
215
215
  [[package]]
216
216
  name = "ruff"
217
- version = "0.8.1"
217
+ version = "0.8.2"
218
218
  source = { registry = "https://pypi.org/simple" }
219
- sdist = { url = "https://files.pythonhosted.org/packages/95/d0/8ff5b189d125f4260f2255d143bf2fa413b69c2610c405ace7a0a8ec81ec/ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f", size = 3313222 }
219
+ sdist = { url = "https://files.pythonhosted.org/packages/5e/2b/01245f4f3a727d60bebeacd7ee6d22586c7f62380a2597ddb22c2f45d018/ruff-0.8.2.tar.gz", hash = "sha256:b84f4f414dda8ac7f75075c1fa0b905ac0ff25361f42e6d5da681a465e0f78e5", size = 3349020 }
220
220
  wheels = [
221
- { url = "https://files.pythonhosted.org/packages/a2/d6/1a6314e568db88acdbb5121ed53e2c52cebf3720d3437a76f82f923bf171/ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5", size = 10532605 },
222
- { url = "https://files.pythonhosted.org/packages/89/a8/a957a8812e31facffb6a26a30be0b5b4af000a6e30c7d43a22a5232a3398/ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087", size = 10278243 },
223
- { url = "https://files.pythonhosted.org/packages/a8/23/9db40fa19c453fabf94f7a35c61c58f20e8200b4734a20839515a19da790/ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209", size = 9917739 },
224
- { url = "https://files.pythonhosted.org/packages/e2/a0/6ee2d949835d5701d832fc5acd05c0bfdad5e89cfdd074a171411f5ccad5/ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871", size = 10779153 },
225
- { url = "https://files.pythonhosted.org/packages/7a/25/9c11dca9404ef1eb24833f780146236131a3c7941de394bc356912ef1041/ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1", size = 10304387 },
226
- { url = "https://files.pythonhosted.org/packages/c8/b9/84c323780db1b06feae603a707d82dbbd85955c8c917738571c65d7d5aff/ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5", size = 11360351 },
227
- { url = "https://files.pythonhosted.org/packages/6b/e1/9d4bbb2ace7aad14ded20e4674a48cda5b902aed7a1b14e6b028067060c4/ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d", size = 12022879 },
228
- { url = "https://files.pythonhosted.org/packages/75/28/752ff6120c0e7f9981bc4bc275d540c7f36db1379ba9db9142f69c88db21/ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26", size = 11610354 },
229
- { url = "https://files.pythonhosted.org/packages/ba/8c/967b61c2cc8ebd1df877607fbe462bc1e1220b4a30ae3352648aec8c24bd/ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1", size = 12813976 },
230
- { url = "https://files.pythonhosted.org/packages/7f/29/e059f945d6bd2d90213387b8c360187f2fefc989ddcee6bbf3c241329b92/ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c", size = 11154564 },
231
- { url = "https://files.pythonhosted.org/packages/55/47/cbd05e5a62f3fb4c072bc65c1e8fd709924cad1c7ec60a1000d1e4ee8307/ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa", size = 10760604 },
232
- { url = "https://files.pythonhosted.org/packages/bb/ee/4c3981c47147c72647a198a94202633130cfda0fc95cd863a553b6f65c6a/ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540", size = 10391071 },
233
- { url = "https://files.pythonhosted.org/packages/6b/e6/083eb61300214590b188616a8ac6ae1ef5730a0974240fb4bec9c17de78b/ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9", size = 10896657 },
234
- { url = "https://files.pythonhosted.org/packages/77/bd/aacdb8285d10f1b943dbeb818968efca35459afc29f66ae3bd4596fbf954/ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5", size = 11228362 },
235
- { url = "https://files.pythonhosted.org/packages/39/72/fcb7ad41947f38b4eaa702aca0a361af0e9c2bf671d7fd964480670c297e/ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790", size = 8803476 },
236
- { url = "https://files.pythonhosted.org/packages/e4/ea/cae9aeb0f4822c44651c8407baacdb2e5b4dcd7b31a84e1c5df33aa2cc20/ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6", size = 9614463 },
237
- { url = "https://files.pythonhosted.org/packages/eb/76/fbb4bd23dfb48fa7758d35b744413b650a9fd2ddd93bca77e30376864414/ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737", size = 8959621 },
221
+ { url = "https://files.pythonhosted.org/packages/91/29/366be70216dba1731a00a41f2f030822b0c96c7c4f3b2c0cdce15cbace74/ruff-0.8.2-py3-none-linux_armv6l.whl", hash = "sha256:c49ab4da37e7c457105aadfd2725e24305ff9bc908487a9bf8d548c6dad8bb3d", size = 10530649 },
222
+ { url = "https://files.pythonhosted.org/packages/63/82/a733956540bb388f00df5a3e6a02467b16c0e529132625fe44ce4c5fb9c7/ruff-0.8.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec016beb69ac16be416c435828be702ee694c0d722505f9c1f35e1b9c0cc1bf5", size = 10274069 },
223
+ { url = "https://files.pythonhosted.org/packages/3d/12/0b3aa14d1d71546c988a28e1b412981c1b80c8a1072e977a2f30c595cc4a/ruff-0.8.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f05cdf8d050b30e2ba55c9b09330b51f9f97d36d4673213679b965d25a785f3c", size = 9909400 },
224
+ { url = "https://files.pythonhosted.org/packages/23/08/f9f08cefb7921784c891c4151cce6ed357ff49e84b84978440cffbc87408/ruff-0.8.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60f578c11feb1d3d257b2fb043ddb47501ab4816e7e221fbb0077f0d5d4e7b6f", size = 10766782 },
225
+ { url = "https://files.pythonhosted.org/packages/e4/71/bf50c321ec179aa420c8ec40adac5ae9cc408d4d37283a485b19a2331ceb/ruff-0.8.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbd5cf9b0ae8f30eebc7b360171bd50f59ab29d39f06a670b3e4501a36ba5897", size = 10286316 },
226
+ { url = "https://files.pythonhosted.org/packages/f2/83/c82688a2a6117539aea0ce63fdf6c08e60fe0202779361223bcd7f40bd74/ruff-0.8.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b402ddee3d777683de60ff76da801fa7e5e8a71038f57ee53e903afbcefdaa58", size = 11338270 },
227
+ { url = "https://files.pythonhosted.org/packages/7f/d7/bc6a45e5a22e627640388e703160afb1d77c572b1d0fda8b4349f334fc66/ruff-0.8.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:705832cd7d85605cb7858d8a13d75993c8f3ef1397b0831289109e953d833d29", size = 12058579 },
228
+ { url = "https://files.pythonhosted.org/packages/da/3b/64150c93946ec851e6f1707ff586bb460ca671581380c919698d6a9267dc/ruff-0.8.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32096b41aaf7a5cc095fa45b4167b890e4c8d3fd217603f3634c92a541de7248", size = 11615172 },
229
+ { url = "https://files.pythonhosted.org/packages/e4/9e/cf12b697ea83cfe92ec4509ae414dc4c9b38179cc681a497031f0d0d9a8e/ruff-0.8.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e769083da9439508833cfc7c23e351e1809e67f47c50248250ce1ac52c21fb93", size = 12882398 },
230
+ { url = "https://files.pythonhosted.org/packages/a9/27/96d10863accf76a9c97baceac30b0a52d917eb985a8ac058bd4636aeede0/ruff-0.8.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe716592ae8a376c2673fdfc1f5c0c193a6d0411f90a496863c99cd9e2ae25d", size = 11176094 },
231
+ { url = "https://files.pythonhosted.org/packages/eb/10/cd2fd77d4a4e7f03c29351be0f53278a393186b540b99df68beb5304fddd/ruff-0.8.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:81c148825277e737493242b44c5388a300584d73d5774defa9245aaef55448b0", size = 10771884 },
232
+ { url = "https://files.pythonhosted.org/packages/71/5d/beabb2ff18870fc4add05fa3a69a4cb1b1d2d6f83f3cf3ae5ab0d52f455d/ruff-0.8.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d261d7850c8367704874847d95febc698a950bf061c9475d4a8b7689adc4f7fa", size = 10382535 },
233
+ { url = "https://files.pythonhosted.org/packages/ae/29/6b3fdf3ad3e35b28d87c25a9ff4c8222ad72485ab783936b2b267250d7a7/ruff-0.8.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1ca4e3a87496dc07d2427b7dd7ffa88a1e597c28dad65ae6433ecb9f2e4f022f", size = 10886995 },
234
+ { url = "https://files.pythonhosted.org/packages/e9/dc/859d889b4d9356a1a2cdbc1e4a0dda94052bc5b5300098647e51a58c430b/ruff-0.8.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:729850feed82ef2440aa27946ab39c18cb4a8889c1128a6d589ffa028ddcfc22", size = 11220750 },
235
+ { url = "https://files.pythonhosted.org/packages/0b/08/e8f519f61f1d624264bfd6b8829e4c5f31c3c61193bc3cff1f19dbe7626a/ruff-0.8.2-py3-none-win32.whl", hash = "sha256:ac42caaa0411d6a7d9594363294416e0e48fc1279e1b0e948391695db2b3d5b1", size = 8729396 },
236
+ { url = "https://files.pythonhosted.org/packages/f8/d4/ba1c7ab72aba37a2b71fe48ab95b80546dbad7a7f35ea28cf66fc5cea5f6/ruff-0.8.2-py3-none-win_amd64.whl", hash = "sha256:2aae99ec70abf43372612a838d97bfe77d45146254568d94926e8ed5bbb409ea", size = 9594729 },
237
+ { url = "https://files.pythonhosted.org/packages/23/34/db20e12d3db11b8a2a8874258f0f6d96a9a4d631659d54575840557164c8/ruff-0.8.2-py3-none-win_arm64.whl", hash = "sha256:fb88e2a506b70cfbc2de6fae6681c4f944f7dd5f2fe87233a7233d888bad73e8", size = 9035131 },
238
238
  ]
239
239
 
240
240
  [[package]]
File without changes
File without changes
File without changes
File without changes