effectual 0.3.5__tar.gz → 0.5.0__tar.gz
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.
- {effectual-0.3.5 → effectual-0.5.0}/PKG-INFO +2 -1
- {effectual-0.3.5 → effectual-0.5.0}/pyproject.toml +4 -1
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/build.py +11 -10
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/developer.py +5 -5
- effectual-0.5.0/src/effectual/fileHash.py +34 -0
- {effectual-0.3.5 → effectual-0.5.0}/taskfile.yml +27 -27
- {effectual-0.3.5 → effectual-0.5.0}/uv.lock +38 -1
- effectual-0.3.5/src/effectual/fileHash.py +0 -32
- {effectual-0.3.5 → effectual-0.5.0}/.gitignore +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/.python-version +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/LICENSE +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/README.md +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/__init__.py +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/colors.py +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/config.py +0 -0
- {effectual-0.3.5 → effectual-0.5.0}/src/effectual/minifier.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: effectual
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.5.0
|
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>
|
@@ -18,6 +18,7 @@ Requires-Dist: python-minifier>=2.11.3
|
|
18
18
|
Requires-Dist: rtoml>=0.11.0
|
19
19
|
Requires-Dist: ruff>=0.8.0
|
20
20
|
Requires-Dist: termcolor>=2.4.0
|
21
|
+
Requires-Dist: watch-lite>=0.1.1
|
21
22
|
Description-Content-Type: text/markdown
|
22
23
|
|
23
24
|
# effectual
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "effectual"
|
3
|
-
version = "0.
|
3
|
+
version = "0.5.0"
|
4
4
|
description = "A python package/script bundler"
|
5
5
|
readme = "README.md"
|
6
6
|
license = "MIT"
|
@@ -28,6 +28,7 @@ dependencies = [
|
|
28
28
|
"rtoml>=0.11.0",
|
29
29
|
"ruff>=0.8.0",
|
30
30
|
"termcolor>=2.4.0",
|
31
|
+
"watch-lite>=0.1.1",
|
31
32
|
]
|
32
33
|
|
33
34
|
[project.urls]
|
@@ -137,6 +138,8 @@ docstring-code-line-length = "dynamic"
|
|
137
138
|
|
138
139
|
[tool.mypy]
|
139
140
|
|
141
|
+
disable_error_code = "name-defined"
|
142
|
+
|
140
143
|
warn_unused_configs = true
|
141
144
|
warn_redundant_casts = true
|
142
145
|
warn_unused_ignores = true
|
@@ -5,12 +5,12 @@ import zipfile
|
|
5
5
|
from pathlib import Path
|
6
6
|
from time import perf_counter
|
7
7
|
from typing import Any
|
8
|
+
from watch_lite import getHash
|
8
9
|
|
9
10
|
import rtoml
|
10
11
|
|
11
12
|
from .colors import completeColor, fileColor, folderColor, tagColor
|
12
13
|
from .config import loadConfig
|
13
|
-
from .fileHash import getFilehash
|
14
14
|
from .minifier import minifyFile, minifyToString
|
15
15
|
|
16
16
|
|
@@ -21,14 +21,14 @@ def bundleFiles(
|
|
21
21
|
compressionLevel: int,
|
22
22
|
minification: bool,
|
23
23
|
) -> None:
|
24
|
-
"""Bundles dependencies and scripts into a single .
|
24
|
+
"""Bundles dependencies and scripts into a single .pyz archive
|
25
25
|
|
26
26
|
Args:
|
27
27
|
sourceDirectory (Path): Source directory which must contain a __main__.py script
|
28
28
|
outputDirectory (Path): Output directory for the bundle
|
29
29
|
outputFileName (str): Name of the output bundle
|
30
30
|
compressionLevel (int): Compression level for the bundle from 0-9
|
31
|
-
minification (bool): If the
|
31
|
+
minification (bool): If the scripts should be minified
|
32
32
|
"""
|
33
33
|
outputDirectory.mkdir(parents=True, exist_ok=True)
|
34
34
|
outputPath: Path = outputDirectory / outputFileName
|
@@ -90,11 +90,12 @@ def dependencies(minify: bool) -> None:
|
|
90
90
|
|
91
91
|
|
92
92
|
def optimizeDependencies(file: Path) -> None:
|
93
|
+
stringFile: str = str(file)
|
93
94
|
if (
|
94
95
|
file.suffix in (".pyc", ".pyd", ".exe", ".typed")
|
95
|
-
or "__pycache__" in
|
96
|
-
or ".dist-info" in
|
97
|
-
or ".lock" in
|
96
|
+
or "__pycache__" in stringFile
|
97
|
+
or ".dist-info" in stringFile
|
98
|
+
or ".lock" in stringFile
|
98
99
|
):
|
99
100
|
try:
|
100
101
|
file.unlink()
|
@@ -128,18 +129,18 @@ def main() -> None:
|
|
128
129
|
)
|
129
130
|
|
130
131
|
uvHashPath: Path = Path("./.effectual_cache/pyprojectHash.toml")
|
131
|
-
currentHash: dict[str, dict] = dict()
|
132
|
+
currentHash: dict[str, dict[str, str]] = dict()
|
132
133
|
|
133
134
|
startTime = perf_counter()
|
134
135
|
|
135
136
|
Path("./.effectual_cache/").mkdir(parents=True, exist_ok=True)
|
136
137
|
currentHash["hashes"] = dict()
|
137
|
-
currentHash["hashes"]["pyproject"] =
|
138
|
-
currentHash["hashes"]["lock"] =
|
138
|
+
currentHash["hashes"]["pyproject"] = getHash("./pyproject.toml")
|
139
|
+
currentHash["hashes"]["lock"] = getHash("./uv.lock")
|
139
140
|
|
140
141
|
if uvHashPath.exists():
|
141
142
|
with open(uvHashPath, "r") as file:
|
142
|
-
lastHash: dict = dict(rtoml.load(file)).get("hashes")
|
143
|
+
lastHash: dict[Any, Any] = dict(rtoml.load(file)).get("hashes")
|
143
144
|
if currentHash["hashes"] != lastHash:
|
144
145
|
with open(uvHashPath, "w") as file:
|
145
146
|
rtoml.dump(currentHash, file)
|
@@ -3,10 +3,10 @@ import time
|
|
3
3
|
import zipfile
|
4
4
|
from pathlib import Path
|
5
5
|
from typing import Any
|
6
|
+
from watch_lite import getAllHashes
|
6
7
|
|
7
8
|
from .colors import completeColor, fileColor, tagColor
|
8
9
|
from .config import loadConfig
|
9
|
-
from .fileHash import getAllHashes
|
10
10
|
|
11
11
|
|
12
12
|
def bundle(sourceDirectory: Path, outputFile: Path) -> None:
|
@@ -40,12 +40,12 @@ def main() -> None:
|
|
40
40
|
|
41
41
|
runCommand = subprocess.Popen(["uv", "run", outputFile], shell=True)
|
42
42
|
|
43
|
-
|
43
|
+
lastHashSet: set[str] = getAllHashes(sourceDirectory, ".py")
|
44
44
|
|
45
45
|
while True:
|
46
|
-
|
47
|
-
if
|
48
|
-
|
46
|
+
currentHashSet: set[str] = getAllHashes(sourceDirectory, ".py")
|
47
|
+
if currentHashSet != lastHashSet:
|
48
|
+
lastHashSet = currentHashSet
|
49
49
|
runCommand.kill()
|
50
50
|
runCommand.wait()
|
51
51
|
outputFile.unlink()
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import hashlib
|
2
|
+
from multiprocessing import Pool
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
|
6
|
+
def getFilehash(filePath: Path) -> str:
|
7
|
+
"""Gets the file hash of a single python script
|
8
|
+
|
9
|
+
Args:
|
10
|
+
filePath (Path): Path to a file
|
11
|
+
|
12
|
+
Returns:
|
13
|
+
str: Hash of the file
|
14
|
+
"""
|
15
|
+
with open(filePath, "rb") as file:
|
16
|
+
fileHash = hashlib.sha1(file.read()).hexdigest()
|
17
|
+
return fileHash
|
18
|
+
|
19
|
+
|
20
|
+
def getAllHashes(sourceDirectory: Path, fileExtension: str) -> set[str]:
|
21
|
+
"""Gets all hashes in directory
|
22
|
+
|
23
|
+
Args:
|
24
|
+
sourceDirectory (Path): Path to a folder containing files
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
set[str]: Set containing paths and hashes
|
28
|
+
"""
|
29
|
+
|
30
|
+
with Pool() as pool:
|
31
|
+
hashList: set[str] = set(
|
32
|
+
pool.map(getFilehash, sourceDirectory.glob(f"*.{fileExtension}"))
|
33
|
+
)
|
34
|
+
return hashList
|
@@ -1,27 +1,27 @@
|
|
1
|
-
version: "3.17"
|
2
|
-
|
3
|
-
tasks:
|
4
|
-
|
5
|
-
dist:
|
6
|
-
cmds:
|
7
|
-
- uv sync
|
8
|
-
- uv lock
|
9
|
-
- task: check
|
10
|
-
- uv build
|
11
|
-
- uv publish
|
12
|
-
|
13
|
-
check:
|
14
|
-
deps: [lint, format]
|
15
|
-
|
16
|
-
format:
|
17
|
-
cmds:
|
18
|
-
- uv run ruff format --config pyproject.toml
|
19
|
-
|
20
|
-
lint:
|
21
|
-
cmds:
|
22
|
-
- uv run ruff check --config pyproject.toml
|
23
|
-
|
24
|
-
|
25
|
-
type:
|
26
|
-
cmds:
|
27
|
-
- uv run mypy src/effectual/*.py
|
1
|
+
version: "3.17"
|
2
|
+
|
3
|
+
tasks:
|
4
|
+
|
5
|
+
dist:
|
6
|
+
cmds:
|
7
|
+
- uv sync
|
8
|
+
- uv lock
|
9
|
+
- task: check
|
10
|
+
- uv build
|
11
|
+
- uv publish
|
12
|
+
|
13
|
+
check:
|
14
|
+
deps: [lint, format]
|
15
|
+
|
16
|
+
format:
|
17
|
+
cmds:
|
18
|
+
- uv run ruff format --config pyproject.toml
|
19
|
+
|
20
|
+
lint:
|
21
|
+
cmds:
|
22
|
+
- uv run ruff check --config pyproject.toml
|
23
|
+
|
24
|
+
|
25
|
+
type:
|
26
|
+
cmds:
|
27
|
+
- uv run mypy src/effectual/*.py
|
@@ -24,7 +24,7 @@ wheels = [
|
|
24
24
|
|
25
25
|
[[package]]
|
26
26
|
name = "effectual"
|
27
|
-
version = "0.
|
27
|
+
version = "0.4.0"
|
28
28
|
source = { editable = "." }
|
29
29
|
dependencies = [
|
30
30
|
{ name = "click" },
|
@@ -32,6 +32,7 @@ dependencies = [
|
|
32
32
|
{ name = "rtoml" },
|
33
33
|
{ name = "ruff" },
|
34
34
|
{ name = "termcolor" },
|
35
|
+
{ name = "watch-lite" },
|
35
36
|
]
|
36
37
|
|
37
38
|
[package.dev-dependencies]
|
@@ -47,6 +48,7 @@ requires-dist = [
|
|
47
48
|
{ name = "rtoml", specifier = ">=0.11.0" },
|
48
49
|
{ name = "ruff", specifier = ">=0.8.0" },
|
49
50
|
{ name = "termcolor", specifier = ">=2.4.0" },
|
51
|
+
{ name = "watch-lite", specifier = ">=0.1.1" },
|
50
52
|
]
|
51
53
|
|
52
54
|
[package.metadata.requires-dev]
|
@@ -55,6 +57,29 @@ dev = [
|
|
55
57
|
{ name = "ruff", specifier = ">=0.8.1" },
|
56
58
|
]
|
57
59
|
|
60
|
+
[[package]]
|
61
|
+
name = "maturin"
|
62
|
+
version = "1.7.8"
|
63
|
+
source = { registry = "https://pypi.org/simple" }
|
64
|
+
dependencies = [
|
65
|
+
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
66
|
+
]
|
67
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ab/1e/085ddc0e5b08ae7af7a743a0dd6ed06b22a1332288488f1a333137885150/maturin-1.7.8.tar.gz", hash = "sha256:649c6ef3f0fa4c5f596140d761dc5a4d577c485cc32fb5b9b344a8280352880d", size = 195704 }
|
68
|
+
wheels = [
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/7e/ed/c8bb26e91c879e418ae1b01630722ed20b6fe0e6755be8d538d83666f136/maturin-1.7.8-py3-none-linux_armv6l.whl", hash = "sha256:c6950fd2790acd93265e1501cea66f9249cff19724654424ca75a3b17ebb315b", size = 7515691 },
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/38/7a/573f969315f0b92a09a0a565d45e98812c87796e2e19a7856159ab234faf/maturin-1.7.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f98288d5c382bacf0c076871dfd50c38f1eb2248f417551e98dd6f47f6ee8afa", size = 14434454 },
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/a6/17/46834841fbf19231487f185e68b95ca348cc05cce49be8787e0bc7e9dc47/maturin-1.7.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b2d4e0f674ca29864e6b86c2eb9fee8236d1c7496c25f7300e34229272468f4c", size = 7509122 },
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/c1/8f/bf8b4871eb390a4baef2e0bb5016852c7c0311a9772e2945534cfa2ee40e/maturin-1.7.8-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:6cafb17bf57822bdc04423d9e3e766d42918d474848fe9833e397267514ba891", size = 7598870 },
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/dc/43/c842be67a7c59568082345249b956138ae93d0b2474fb41c186ce26d05e1/maturin-1.7.8-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:2b2bdee0c3a84696b3a809054c43ead1a04b7b3321cbd5b8f5676e4ba4691d0f", size = 7932310 },
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/12/12/42435d05f2d6c75eb621751e6f021d29eb34d18e3b9c5c94d828744c2d54/maturin-1.7.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b8188b71259fc2bc568d9c8acc186fcfed96f42539bcb55b8e6f4ec26e411f37", size = 7321964 },
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/b4/26/f3272ee985ebf9b3e8c4cd4f4efb022af1e12c9f53aed0dcc9a255399f4e/maturin-1.7.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:a4f58c2a53c2958a1bf090960b08b28e676136cd88ac2f5dfdcf1b14ea54ec06", size = 7408613 },
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/36/7d/be27bcc7d3ac6e6c2136a8ec0cc56f227a292d6cfdde55e095b6c0aa24a9/maturin-1.7.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:c5d6c0c631d1fc646cd3834795e6cfd72ab4271d289df7e0f911261a02bec75f", size = 9496974 },
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/e1/e8/0d7323e9a31c11edf69c4473d73eca74803ce3e2390abf8ae3ac7eb10b04/maturin-1.7.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c23664d19dadcbf800ef70f26afb2e0485a985c62889930934f019c565534c23", size = 10828401 },
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/7e/82/5080e052c0d8c9872f6d4b94cae84c17ed7f2ea270d709210ea6445b655f/maturin-1.7.8-py3-none-win32.whl", hash = "sha256:403eebf1afa6f19b49425f089e39c53b8e597bc86a47f3a76e828dc78d27fa80", size = 6845240 },
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/6d/c9/9b162361ded893f36038c2f8ac6a972ec441c11df8d17c440997eb28090f/maturin-1.7.8-py3-none-win_amd64.whl", hash = "sha256:1ce48d007438b895f8665314b6748ac0dab31e4f32049a60b52281dd2dccbdde", size = 7762332 },
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/fa/40/46d4742db742f69a7fe0054cd7c82bc79b2d70cb8c91f7e737e75c28a5f3/maturin-1.7.8-py3-none-win_arm64.whl", hash = "sha256:cc92a62953205e8945b6cfe6943d6a8576a4442d30d9c67141f944f4f4640e62", size = 6501353 },
|
81
|
+
]
|
82
|
+
|
58
83
|
[[package]]
|
59
84
|
name = "mypy"
|
60
85
|
version = "1.13.0"
|
@@ -268,3 +293,15 @@ sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec3
|
|
268
293
|
wheels = [
|
269
294
|
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
|
270
295
|
]
|
296
|
+
|
297
|
+
[[package]]
|
298
|
+
name = "watch-lite"
|
299
|
+
version = "0.1.1"
|
300
|
+
source = { registry = "https://pypi.org/simple" }
|
301
|
+
dependencies = [
|
302
|
+
{ name = "maturin" },
|
303
|
+
]
|
304
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f4/a0/bea3567de1c30c029c62fd024492f2ac7dd61634fdde2134462a7a75bad1/watch_lite-0.1.1.tar.gz", hash = "sha256:5b6c1dd4750609e389d5eb8356f48d244376735ee99421ade7672889752cead4", size = 11152 }
|
305
|
+
wheels = [
|
306
|
+
{ url = "https://files.pythonhosted.org/packages/c7/1e/17b02b821d22ae0e9850fbbfd2edf7b59e2df3e9d94c1079c795678d846d/watch_lite-0.1.1-cp39-abi3-win_amd64.whl", hash = "sha256:e7fb78ee6426a19c7da31869d3e8efca65236d6f5b0533b53032f28d25b87c95", size = 117841 },
|
307
|
+
]
|
@@ -1,32 +0,0 @@
|
|
1
|
-
import hashlib
|
2
|
-
from multiprocessing import Pool
|
3
|
-
from pathlib import Path
|
4
|
-
|
5
|
-
|
6
|
-
def getFilehash(filePath: Path) -> str:
|
7
|
-
"""Gets the file hash of a single python script
|
8
|
-
|
9
|
-
Args:
|
10
|
-
filePath (Path): Path to the python script
|
11
|
-
|
12
|
-
Returns:
|
13
|
-
str: Hash of the python script
|
14
|
-
"""
|
15
|
-
with open(filePath, "rb") as file:
|
16
|
-
fileHash = hashlib.sha256(file.read()).hexdigest()
|
17
|
-
return fileHash
|
18
|
-
|
19
|
-
|
20
|
-
def getAllHashes(sourceDirectory: Path) -> list[str]:
|
21
|
-
"""Gets all hashes in directory
|
22
|
-
|
23
|
-
Args:
|
24
|
-
sourceDirectory (Path): Path to the python scripts
|
25
|
-
|
26
|
-
Returns:
|
27
|
-
dict[str]: Dictionary containing paths and hashes
|
28
|
-
"""
|
29
|
-
|
30
|
-
with Pool() as pool:
|
31
|
-
hashList: list[str] = pool.map(getFilehash, sourceDirectory.glob("*.py"))
|
32
|
-
return hashList
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|